@joai/warps-wallet-coinbase 1.0.0 → 1.1.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.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.d.cts
CHANGED
|
@@ -24,6 +24,7 @@ declare class CoinbaseWalletProvider implements WalletProvider {
|
|
|
24
24
|
importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails>;
|
|
25
25
|
importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails>;
|
|
26
26
|
export(): Promise<WarpWalletDetails>;
|
|
27
|
+
delete(externalId: string): Promise<void>;
|
|
27
28
|
generate(): Promise<WarpWalletDetails>;
|
|
28
29
|
private getAccountName;
|
|
29
30
|
private getWalletAddress;
|
package/dist/index.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ declare class CoinbaseWalletProvider implements WalletProvider {
|
|
|
24
24
|
importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails>;
|
|
25
25
|
importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails>;
|
|
26
26
|
export(): Promise<WarpWalletDetails>;
|
|
27
|
+
delete(externalId: string): Promise<void>;
|
|
27
28
|
generate(): Promise<WarpWalletDetails>;
|
|
28
29
|
private getAccountName;
|
|
29
30
|
private getWalletAddress;
|
package/dist/index.js
CHANGED
|
@@ -212,6 +212,9 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
|
|
|
212
212
|
throw new Error(`CoinbaseWalletProvider: Failed to export account: ${error}`);
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
|
+
async delete(externalId) {
|
|
216
|
+
throw new Error("CoinbaseWalletProvider: delete() is not supported. Use Coinbase dashboard to manage wallets.");
|
|
217
|
+
}
|
|
215
218
|
async generate() {
|
|
216
219
|
try {
|
|
217
220
|
const name = this.getAccountName();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/CoinbaseWalletProvider.ts","../src/helpers/evm.ts","../src/helpers.ts"],"sourcesContent":["export * from './CoinbaseWalletProvider'\nexport * from './helpers'\nexport * from './types'\n","import { CdpClient } from '@coinbase/cdp-sdk'\nimport {\n getWarpWalletAddressFromConfig,\n setWarpWalletInConfig,\n WalletProvider,\n WarpAdapterGenericTransaction,\n WarpChainInfo,\n WarpChainName,\n WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@joai/warps'\nimport { formatTransactionForCoinbase } from './helpers/evm'\nimport { CoinbaseProviderConfig } from './types'\n\nexport class CoinbaseWalletProvider implements WalletProvider {\n static readonly PROVIDER_NAME: WarpWalletProvider = 'coinbase'\n private readonly client: CdpClient\n private cachedAccount: { id: string; address: string; publicKey?: string } | null = null\n private cachedEvmAccount: { signTransaction: (tx: unknown) => Promise<unknown> } | null = null\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo,\n private readonly coinbaseConfig: CoinbaseProviderConfig\n ) {\n this.client = new CdpClient({\n apiKeyId: coinbaseConfig.apiKeyId,\n apiKeySecret: coinbaseConfig.apiKeySecret,\n walletSecret: coinbaseConfig.walletSecret,\n ...(coinbaseConfig.apiUrl && { apiUrl: coinbaseConfig.apiUrl }),\n })\n }\n\n async getAddress(): Promise<string | null> {\n try {\n return (await this.getAccount()).address\n } catch (error) {\n console.error('CoinbaseWalletProvider: Failed to get address', error)\n return null\n }\n }\n\n async getPublicKey(): Promise<string | null> {\n try {\n return (await this.getAccount()).publicKey ?? null\n } catch (error) {\n console.error('CoinbaseWalletProvider: Failed to get public key', error)\n return null\n }\n }\n\n async signTransaction(tx: WarpAdapterGenericTransaction): Promise<WarpAdapterGenericTransaction> {\n try {\n const account = await this.getAccount()\n\n if (this.chain.name === WarpChainName.Solana) {\n const result = await this.client.solana.signTransaction({\n address: account.id,\n transaction: tx as never,\n })\n\n if ('signedTransaction' in result && result.signedTransaction) {\n return { ...(tx as Record<string, unknown>), signature: String(result.signedTransaction) }\n }\n throw new Error('Coinbase API did not return signed transaction')\n }\n\n if (!this.cachedEvmAccount) {\n const address = this.getWalletAddress()\n const evmAccount = await this.client.evm.getAccount({ address: address as `0x${string}` })\n if (!('signTransaction' in evmAccount))\n throw new Error('CoinbaseWalletProvider: Account object missing signTransaction method. This may be a SDK version issue.')\n this.cachedEvmAccount = { signTransaction: evmAccount.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n const formattedTx = formatTransactionForCoinbase(tx, this.chain.chainId)\n const signedTx = await this.cachedEvmAccount.signTransaction(formattedTx)\n return { ...(tx as Record<string, unknown>), signature: signedTx }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n if (errorMessage.includes('signTransaction is not a function')) {\n throw new Error('CoinbaseWalletProvider: Account object missing signTransaction method. This may be a SDK version issue.')\n }\n throw new Error(`CoinbaseWalletProvider: Failed to sign transaction: ${error}`)\n }\n }\n\n async signMessage(message: string): Promise<string> {\n try {\n const account = await this.getAccount()\n const result =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.signMessage({ address: account.id, message })\n : await this.client.evm.signMessage({ address: account.id as `0x${string}`, message })\n\n if ('signedMessage' in result && result.signedMessage) {\n return String(result.signedMessage)\n }\n\n throw new Error('Coinbase API did not return signed message')\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to sign message: ${error}`)\n }\n }\n\n async importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails> {\n throw new Error(\n 'CoinbaseWalletProvider: importFromMnemonic() is not supported. Use generate() to create a new account via Coinbase API.'\n )\n }\n\n async importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails> {\n try {\n const name = this.getAccountName()\n const account =\n this.chain.name === 'solana'\n ? await this.client.solana.importAccount({ privateKey, ...(name && { name }) })\n : await this.client.evm.importAccount({\n privateKey: (privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`) as `0x${string}`,\n ...(name && { name }),\n })\n\n const walletDetails: WarpWalletDetails = {\n provider: CoinbaseWalletProvider.PROVIDER_NAME,\n address: account.address,\n privateKey,\n }\n\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n\n return walletDetails\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to import account from private key: ${error}`)\n }\n }\n\n async export(): Promise<WarpWalletDetails> {\n try {\n const address = this.getWalletAddress()\n const privateKey =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.exportAccount({ address })\n : await this.client.evm.exportAccount({ address: address as `0x${string}` })\n\n return {\n provider: CoinbaseWalletProvider.PROVIDER_NAME,\n address,\n privateKey,\n }\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to export account: ${error}`)\n }\n }\n\n async generate(): Promise<WarpWalletDetails> {\n try {\n const name = this.getAccountName()\n const account =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.createAccount({ name })\n : await this.client.evm.createAccount({ name })\n\n const walletDetails: WarpWalletDetails = {\n provider: CoinbaseWalletProvider.PROVIDER_NAME,\n address: account.address,\n }\n\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n\n return walletDetails\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to generate account: ${error}`)\n }\n }\n\n private getAccountName(): string | undefined {\n return this.config.user?.id ? `${this.config.user.id}-${this.chain.name}` : undefined\n }\n\n private getWalletAddress(): string {\n const address = getWarpWalletAddressFromConfig(this.config, this.chain.name)\n if (!address) throw new Error(`CoinbaseWalletProvider: Wallet address not found in config for chain ${this.chain.name}`)\n return address\n }\n\n private extractPublicKey(account: { address: string; publicKey?: unknown }): string | undefined {\n return account.publicKey as string | undefined\n }\n\n private async getAccount(): Promise<{ id: string; address: string; publicKey?: string }> {\n if (this.cachedAccount) return this.cachedAccount\n\n const address = this.getWalletAddress()\n const account =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.getAccount({ address })\n : await this.client.evm.getAccount({ address: address as `0x${string}` })\n\n const publicKey = this.extractPublicKey(account)\n this.cachedAccount = {\n id: account.address,\n address: account.address,\n ...(publicKey && { publicKey }),\n }\n\n if (this.chain.name !== WarpChainName.Solana && 'signTransaction' in account) {\n this.cachedEvmAccount = { signTransaction: account.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n return this.cachedAccount\n }\n}\n","import { WarpAdapterGenericTransaction } from '@joai/warps'\n\nconst formatBigInt = (value: bigint | string | number | undefined): string | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') {\n const hex = value.toString(16)\n return `0x${hex}`\n }\n if (typeof value === 'string' && value.startsWith('0x')) {\n const parsed = BigInt(value)\n return `0x${parsed.toString(16)}`\n }\n const parsed = BigInt(value)\n return `0x${parsed.toString(16)}`\n}\n\nconst parseBigInt = (value: bigint | string | number | undefined): bigint | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') return value\n return BigInt(value)\n}\n\nconst normalizePriorityFee = (maxFee: bigint, maxPriorityFee: bigint): bigint => {\n if (maxFee <= 0n) return 1n\n if (maxPriorityFee <= maxFee) return maxPriorityFee\n const safeFee = maxFee / 10n\n return safeFee < 1n ? 1n : safeFee\n}\n\nexport const formatTransactionForCoinbase = (tx: WarpAdapterGenericTransaction, chainId: number | string): WarpAdapterGenericTransaction => {\n const MIN_FEE = 1000000000n\n\n let maxFee: bigint\n let maxPriorityFee: bigint\n\n if (tx.maxFeePerGas !== undefined && tx.maxPriorityFeePerGas !== undefined) {\n maxFee = parseBigInt(tx.maxFeePerGas)!\n maxPriorityFee = parseBigInt(tx.maxPriorityFeePerGas)!\n if (maxFee < MIN_FEE) maxFee = MIN_FEE\n maxPriorityFee = normalizePriorityFee(maxFee, maxPriorityFee)\n } else if (tx.gasPrice !== undefined) {\n const gasPrice = parseBigInt(tx.gasPrice)!\n maxFee = gasPrice < MIN_FEE ? MIN_FEE : gasPrice\n maxPriorityFee = normalizePriorityFee(maxFee, (maxFee * 9n) / 10n)\n } else {\n maxFee = MIN_FEE\n maxPriorityFee = MIN_FEE / 10n\n }\n\n if (maxPriorityFee >= maxFee) maxPriorityFee = maxFee / 10n\n if (maxPriorityFee < 1n) maxPriorityFee = 1n\n\n const finalMaxFee = maxFee\n let finalMaxPriorityFee = maxPriorityFee\n\n const MIN_PRIORITY_FEE = 100000000n\n if (finalMaxFee >= MIN_PRIORITY_FEE * 10n && finalMaxPriorityFee < MIN_PRIORITY_FEE) {\n finalMaxPriorityFee = MIN_PRIORITY_FEE\n }\n\n if (finalMaxPriorityFee >= finalMaxFee) {\n finalMaxPriorityFee = finalMaxFee / 10n\n }\n\n if (finalMaxPriorityFee < 1n) {\n finalMaxPriorityFee = 1n\n }\n\n const formatted: any = {\n to: tx.to,\n value: formatBigInt(tx.value) || '0x0',\n data: tx.data || '0x',\n chainId: typeof tx.chainId === 'number' ? tx.chainId : parseInt(String(tx.chainId || chainId)),\n maxFeePerGas: formatBigInt(finalMaxFee)!,\n maxPriorityFeePerGas: formatBigInt(finalMaxPriorityFee)!,\n }\n\n if (tx.from) formatted.from = tx.from\n if (tx.gasLimit) formatted.gas = formatBigInt(tx.gasLimit)\n if (tx.nonce !== undefined) formatted.nonce = typeof tx.nonce === 'number' ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce)\n if (tx.type) formatted.type = tx.type\n if (tx.accessList) formatted.accessList = tx.accessList\n\n delete formatted.gasPrice\n\n return formatted\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig } from '@joai/warps'\nimport { CoinbaseWalletProvider } from './CoinbaseWalletProvider'\nimport { CoinbaseProviderConfig } from './types'\n\nexport const createCoinbaseWalletProvider = (\n coinbaseConfig: CoinbaseProviderConfig\n): WalletProviderFactory => {\n return (config: WarpClientConfig, chain: WarpChainInfo) =>\n new CoinbaseWalletProvider(config, chain, coinbaseConfig)\n}\n"],"mappings":"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","names":["parsed"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/CoinbaseWalletProvider.ts","../src/helpers/evm.ts","../src/helpers.ts"],"sourcesContent":["export * from './CoinbaseWalletProvider'\nexport * from './helpers'\nexport * from './types'\n","import { CdpClient } from '@coinbase/cdp-sdk'\nimport {\n getWarpWalletAddressFromConfig,\n setWarpWalletInConfig,\n WalletProvider,\n WarpAdapterGenericTransaction,\n WarpChainInfo,\n WarpChainName,\n WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@joai/warps'\nimport { formatTransactionForCoinbase } from './helpers/evm'\nimport { CoinbaseProviderConfig } from './types'\n\nexport class CoinbaseWalletProvider implements WalletProvider {\n static readonly PROVIDER_NAME: WarpWalletProvider = 'coinbase'\n private readonly client: CdpClient\n private cachedAccount: { id: string; address: string; publicKey?: string } | null = null\n private cachedEvmAccount: { signTransaction: (tx: unknown) => Promise<unknown> } | null = null\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo,\n private readonly coinbaseConfig: CoinbaseProviderConfig\n ) {\n this.client = new CdpClient({\n apiKeyId: coinbaseConfig.apiKeyId,\n apiKeySecret: coinbaseConfig.apiKeySecret,\n walletSecret: coinbaseConfig.walletSecret,\n ...(coinbaseConfig.apiUrl && { apiUrl: coinbaseConfig.apiUrl }),\n })\n }\n\n async getAddress(): Promise<string | null> {\n try {\n return (await this.getAccount()).address\n } catch (error) {\n console.error('CoinbaseWalletProvider: Failed to get address', error)\n return null\n }\n }\n\n async getPublicKey(): Promise<string | null> {\n try {\n return (await this.getAccount()).publicKey ?? null\n } catch (error) {\n console.error('CoinbaseWalletProvider: Failed to get public key', error)\n return null\n }\n }\n\n async signTransaction(tx: WarpAdapterGenericTransaction): Promise<WarpAdapterGenericTransaction> {\n try {\n const account = await this.getAccount()\n\n if (this.chain.name === WarpChainName.Solana) {\n const result = await this.client.solana.signTransaction({\n address: account.id,\n transaction: tx as never,\n })\n\n if ('signedTransaction' in result && result.signedTransaction) {\n return { ...(tx as Record<string, unknown>), signature: String(result.signedTransaction) }\n }\n throw new Error('Coinbase API did not return signed transaction')\n }\n\n if (!this.cachedEvmAccount) {\n const address = this.getWalletAddress()\n const evmAccount = await this.client.evm.getAccount({ address: address as `0x${string}` })\n if (!('signTransaction' in evmAccount))\n throw new Error('CoinbaseWalletProvider: Account object missing signTransaction method. This may be a SDK version issue.')\n this.cachedEvmAccount = { signTransaction: evmAccount.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n const formattedTx = formatTransactionForCoinbase(tx, this.chain.chainId)\n const signedTx = await this.cachedEvmAccount.signTransaction(formattedTx)\n return { ...(tx as Record<string, unknown>), signature: signedTx }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n if (errorMessage.includes('signTransaction is not a function')) {\n throw new Error('CoinbaseWalletProvider: Account object missing signTransaction method. This may be a SDK version issue.')\n }\n throw new Error(`CoinbaseWalletProvider: Failed to sign transaction: ${error}`)\n }\n }\n\n async signMessage(message: string): Promise<string> {\n try {\n const account = await this.getAccount()\n const result =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.signMessage({ address: account.id, message })\n : await this.client.evm.signMessage({ address: account.id as `0x${string}`, message })\n\n if ('signedMessage' in result && result.signedMessage) {\n return String(result.signedMessage)\n }\n\n throw new Error('Coinbase API did not return signed message')\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to sign message: ${error}`)\n }\n }\n\n async importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails> {\n throw new Error(\n 'CoinbaseWalletProvider: importFromMnemonic() is not supported. Use generate() to create a new account via Coinbase API.'\n )\n }\n\n async importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails> {\n try {\n const name = this.getAccountName()\n const account =\n this.chain.name === 'solana'\n ? await this.client.solana.importAccount({ privateKey, ...(name && { name }) })\n : await this.client.evm.importAccount({\n privateKey: (privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`) as `0x${string}`,\n ...(name && { name }),\n })\n\n const walletDetails: WarpWalletDetails = {\n provider: CoinbaseWalletProvider.PROVIDER_NAME,\n address: account.address,\n privateKey,\n }\n\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n\n return walletDetails\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to import account from private key: ${error}`)\n }\n }\n\n async export(): Promise<WarpWalletDetails> {\n try {\n const address = this.getWalletAddress()\n const privateKey =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.exportAccount({ address })\n : await this.client.evm.exportAccount({ address: address as `0x${string}` })\n\n return {\n provider: CoinbaseWalletProvider.PROVIDER_NAME,\n address,\n privateKey,\n }\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to export account: ${error}`)\n }\n }\n\n async delete(externalId: string): Promise<void> {\n throw new Error('CoinbaseWalletProvider: delete() is not supported. Use Coinbase dashboard to manage wallets.')\n }\n\n async generate(): Promise<WarpWalletDetails> {\n try {\n const name = this.getAccountName()\n const account =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.createAccount({ name })\n : await this.client.evm.createAccount({ name })\n\n const walletDetails: WarpWalletDetails = {\n provider: CoinbaseWalletProvider.PROVIDER_NAME,\n address: account.address,\n }\n\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n\n return walletDetails\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to generate account: ${error}`)\n }\n }\n\n private getAccountName(): string | undefined {\n return this.config.user?.id ? `${this.config.user.id}-${this.chain.name}` : undefined\n }\n\n private getWalletAddress(): string {\n const address = getWarpWalletAddressFromConfig(this.config, this.chain.name)\n if (!address) throw new Error(`CoinbaseWalletProvider: Wallet address not found in config for chain ${this.chain.name}`)\n return address\n }\n\n private extractPublicKey(account: { address: string; publicKey?: unknown }): string | undefined {\n return account.publicKey as string | undefined\n }\n\n private async getAccount(): Promise<{ id: string; address: string; publicKey?: string }> {\n if (this.cachedAccount) return this.cachedAccount\n\n const address = this.getWalletAddress()\n const account =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.getAccount({ address })\n : await this.client.evm.getAccount({ address: address as `0x${string}` })\n\n const publicKey = this.extractPublicKey(account)\n this.cachedAccount = {\n id: account.address,\n address: account.address,\n ...(publicKey && { publicKey }),\n }\n\n if (this.chain.name !== WarpChainName.Solana && 'signTransaction' in account) {\n this.cachedEvmAccount = { signTransaction: account.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n return this.cachedAccount\n }\n}\n","import { WarpAdapterGenericTransaction } from '@joai/warps'\n\nconst formatBigInt = (value: bigint | string | number | undefined): string | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') {\n const hex = value.toString(16)\n return `0x${hex}`\n }\n if (typeof value === 'string' && value.startsWith('0x')) {\n const parsed = BigInt(value)\n return `0x${parsed.toString(16)}`\n }\n const parsed = BigInt(value)\n return `0x${parsed.toString(16)}`\n}\n\nconst parseBigInt = (value: bigint | string | number | undefined): bigint | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') return value\n return BigInt(value)\n}\n\nconst normalizePriorityFee = (maxFee: bigint, maxPriorityFee: bigint): bigint => {\n if (maxFee <= 0n) return 1n\n if (maxPriorityFee <= maxFee) return maxPriorityFee\n const safeFee = maxFee / 10n\n return safeFee < 1n ? 1n : safeFee\n}\n\nexport const formatTransactionForCoinbase = (tx: WarpAdapterGenericTransaction, chainId: number | string): WarpAdapterGenericTransaction => {\n const MIN_FEE = 1000000000n\n\n let maxFee: bigint\n let maxPriorityFee: bigint\n\n if (tx.maxFeePerGas !== undefined && tx.maxPriorityFeePerGas !== undefined) {\n maxFee = parseBigInt(tx.maxFeePerGas)!\n maxPriorityFee = parseBigInt(tx.maxPriorityFeePerGas)!\n if (maxFee < MIN_FEE) maxFee = MIN_FEE\n maxPriorityFee = normalizePriorityFee(maxFee, maxPriorityFee)\n } else if (tx.gasPrice !== undefined) {\n const gasPrice = parseBigInt(tx.gasPrice)!\n maxFee = gasPrice < MIN_FEE ? MIN_FEE : gasPrice\n maxPriorityFee = normalizePriorityFee(maxFee, (maxFee * 9n) / 10n)\n } else {\n maxFee = MIN_FEE\n maxPriorityFee = MIN_FEE / 10n\n }\n\n if (maxPriorityFee >= maxFee) maxPriorityFee = maxFee / 10n\n if (maxPriorityFee < 1n) maxPriorityFee = 1n\n\n const finalMaxFee = maxFee\n let finalMaxPriorityFee = maxPriorityFee\n\n const MIN_PRIORITY_FEE = 100000000n\n if (finalMaxFee >= MIN_PRIORITY_FEE * 10n && finalMaxPriorityFee < MIN_PRIORITY_FEE) {\n finalMaxPriorityFee = MIN_PRIORITY_FEE\n }\n\n if (finalMaxPriorityFee >= finalMaxFee) {\n finalMaxPriorityFee = finalMaxFee / 10n\n }\n\n if (finalMaxPriorityFee < 1n) {\n finalMaxPriorityFee = 1n\n }\n\n const formatted: any = {\n to: tx.to,\n value: formatBigInt(tx.value) || '0x0',\n data: tx.data || '0x',\n chainId: typeof tx.chainId === 'number' ? tx.chainId : parseInt(String(tx.chainId || chainId)),\n maxFeePerGas: formatBigInt(finalMaxFee)!,\n maxPriorityFeePerGas: formatBigInt(finalMaxPriorityFee)!,\n }\n\n if (tx.from) formatted.from = tx.from\n if (tx.gasLimit) formatted.gas = formatBigInt(tx.gasLimit)\n if (tx.nonce !== undefined) formatted.nonce = typeof tx.nonce === 'number' ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce)\n if (tx.type) formatted.type = tx.type\n if (tx.accessList) formatted.accessList = tx.accessList\n\n delete formatted.gasPrice\n\n return formatted\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig } from '@joai/warps'\nimport { CoinbaseWalletProvider } from './CoinbaseWalletProvider'\nimport { CoinbaseProviderConfig } from './types'\n\nexport const createCoinbaseWalletProvider = (\n coinbaseConfig: CoinbaseProviderConfig\n): WalletProviderFactory => {\n return (config: WarpClientConfig, chain: WarpChainInfo) =>\n new CoinbaseWalletProvider(config, chain, coinbaseConfig)\n}\n"],"mappings":"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","names":["parsed"]}
|
package/dist/index.mjs
CHANGED
|
@@ -189,6 +189,9 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
|
|
|
189
189
|
throw new Error(`CoinbaseWalletProvider: Failed to export account: ${error}`);
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
|
+
async delete(externalId) {
|
|
193
|
+
throw new Error("CoinbaseWalletProvider: delete() is not supported. Use Coinbase dashboard to manage wallets.");
|
|
194
|
+
}
|
|
192
195
|
async generate() {
|
|
193
196
|
try {
|
|
194
197
|
const name = this.getAccountName();
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/CoinbaseWalletProvider.ts","../src/helpers/evm.ts","../src/helpers.ts"],"sourcesContent":["import { CdpClient } from '@coinbase/cdp-sdk'\nimport {\n getWarpWalletAddressFromConfig,\n setWarpWalletInConfig,\n WalletProvider,\n WarpAdapterGenericTransaction,\n WarpChainInfo,\n WarpChainName,\n WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@joai/warps'\nimport { formatTransactionForCoinbase } from './helpers/evm'\nimport { CoinbaseProviderConfig } from './types'\n\nexport class CoinbaseWalletProvider implements WalletProvider {\n static readonly PROVIDER_NAME: WarpWalletProvider = 'coinbase'\n private readonly client: CdpClient\n private cachedAccount: { id: string; address: string; publicKey?: string } | null = null\n private cachedEvmAccount: { signTransaction: (tx: unknown) => Promise<unknown> } | null = null\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo,\n private readonly coinbaseConfig: CoinbaseProviderConfig\n ) {\n this.client = new CdpClient({\n apiKeyId: coinbaseConfig.apiKeyId,\n apiKeySecret: coinbaseConfig.apiKeySecret,\n walletSecret: coinbaseConfig.walletSecret,\n ...(coinbaseConfig.apiUrl && { apiUrl: coinbaseConfig.apiUrl }),\n })\n }\n\n async getAddress(): Promise<string | null> {\n try {\n return (await this.getAccount()).address\n } catch (error) {\n console.error('CoinbaseWalletProvider: Failed to get address', error)\n return null\n }\n }\n\n async getPublicKey(): Promise<string | null> {\n try {\n return (await this.getAccount()).publicKey ?? null\n } catch (error) {\n console.error('CoinbaseWalletProvider: Failed to get public key', error)\n return null\n }\n }\n\n async signTransaction(tx: WarpAdapterGenericTransaction): Promise<WarpAdapterGenericTransaction> {\n try {\n const account = await this.getAccount()\n\n if (this.chain.name === WarpChainName.Solana) {\n const result = await this.client.solana.signTransaction({\n address: account.id,\n transaction: tx as never,\n })\n\n if ('signedTransaction' in result && result.signedTransaction) {\n return { ...(tx as Record<string, unknown>), signature: String(result.signedTransaction) }\n }\n throw new Error('Coinbase API did not return signed transaction')\n }\n\n if (!this.cachedEvmAccount) {\n const address = this.getWalletAddress()\n const evmAccount = await this.client.evm.getAccount({ address: address as `0x${string}` })\n if (!('signTransaction' in evmAccount))\n throw new Error('CoinbaseWalletProvider: Account object missing signTransaction method. This may be a SDK version issue.')\n this.cachedEvmAccount = { signTransaction: evmAccount.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n const formattedTx = formatTransactionForCoinbase(tx, this.chain.chainId)\n const signedTx = await this.cachedEvmAccount.signTransaction(formattedTx)\n return { ...(tx as Record<string, unknown>), signature: signedTx }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n if (errorMessage.includes('signTransaction is not a function')) {\n throw new Error('CoinbaseWalletProvider: Account object missing signTransaction method. This may be a SDK version issue.')\n }\n throw new Error(`CoinbaseWalletProvider: Failed to sign transaction: ${error}`)\n }\n }\n\n async signMessage(message: string): Promise<string> {\n try {\n const account = await this.getAccount()\n const result =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.signMessage({ address: account.id, message })\n : await this.client.evm.signMessage({ address: account.id as `0x${string}`, message })\n\n if ('signedMessage' in result && result.signedMessage) {\n return String(result.signedMessage)\n }\n\n throw new Error('Coinbase API did not return signed message')\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to sign message: ${error}`)\n }\n }\n\n async importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails> {\n throw new Error(\n 'CoinbaseWalletProvider: importFromMnemonic() is not supported. Use generate() to create a new account via Coinbase API.'\n )\n }\n\n async importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails> {\n try {\n const name = this.getAccountName()\n const account =\n this.chain.name === 'solana'\n ? await this.client.solana.importAccount({ privateKey, ...(name && { name }) })\n : await this.client.evm.importAccount({\n privateKey: (privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`) as `0x${string}`,\n ...(name && { name }),\n })\n\n const walletDetails: WarpWalletDetails = {\n provider: CoinbaseWalletProvider.PROVIDER_NAME,\n address: account.address,\n privateKey,\n }\n\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n\n return walletDetails\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to import account from private key: ${error}`)\n }\n }\n\n async export(): Promise<WarpWalletDetails> {\n try {\n const address = this.getWalletAddress()\n const privateKey =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.exportAccount({ address })\n : await this.client.evm.exportAccount({ address: address as `0x${string}` })\n\n return {\n provider: CoinbaseWalletProvider.PROVIDER_NAME,\n address,\n privateKey,\n }\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to export account: ${error}`)\n }\n }\n\n async generate(): Promise<WarpWalletDetails> {\n try {\n const name = this.getAccountName()\n const account =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.createAccount({ name })\n : await this.client.evm.createAccount({ name })\n\n const walletDetails: WarpWalletDetails = {\n provider: CoinbaseWalletProvider.PROVIDER_NAME,\n address: account.address,\n }\n\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n\n return walletDetails\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to generate account: ${error}`)\n }\n }\n\n private getAccountName(): string | undefined {\n return this.config.user?.id ? `${this.config.user.id}-${this.chain.name}` : undefined\n }\n\n private getWalletAddress(): string {\n const address = getWarpWalletAddressFromConfig(this.config, this.chain.name)\n if (!address) throw new Error(`CoinbaseWalletProvider: Wallet address not found in config for chain ${this.chain.name}`)\n return address\n }\n\n private extractPublicKey(account: { address: string; publicKey?: unknown }): string | undefined {\n return account.publicKey as string | undefined\n }\n\n private async getAccount(): Promise<{ id: string; address: string; publicKey?: string }> {\n if (this.cachedAccount) return this.cachedAccount\n\n const address = this.getWalletAddress()\n const account =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.getAccount({ address })\n : await this.client.evm.getAccount({ address: address as `0x${string}` })\n\n const publicKey = this.extractPublicKey(account)\n this.cachedAccount = {\n id: account.address,\n address: account.address,\n ...(publicKey && { publicKey }),\n }\n\n if (this.chain.name !== WarpChainName.Solana && 'signTransaction' in account) {\n this.cachedEvmAccount = { signTransaction: account.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n return this.cachedAccount\n }\n}\n","import { WarpAdapterGenericTransaction } from '@joai/warps'\n\nconst formatBigInt = (value: bigint | string | number | undefined): string | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') {\n const hex = value.toString(16)\n return `0x${hex}`\n }\n if (typeof value === 'string' && value.startsWith('0x')) {\n const parsed = BigInt(value)\n return `0x${parsed.toString(16)}`\n }\n const parsed = BigInt(value)\n return `0x${parsed.toString(16)}`\n}\n\nconst parseBigInt = (value: bigint | string | number | undefined): bigint | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') return value\n return BigInt(value)\n}\n\nconst normalizePriorityFee = (maxFee: bigint, maxPriorityFee: bigint): bigint => {\n if (maxFee <= 0n) return 1n\n if (maxPriorityFee <= maxFee) return maxPriorityFee\n const safeFee = maxFee / 10n\n return safeFee < 1n ? 1n : safeFee\n}\n\nexport const formatTransactionForCoinbase = (tx: WarpAdapterGenericTransaction, chainId: number | string): WarpAdapterGenericTransaction => {\n const MIN_FEE = 1000000000n\n\n let maxFee: bigint\n let maxPriorityFee: bigint\n\n if (tx.maxFeePerGas !== undefined && tx.maxPriorityFeePerGas !== undefined) {\n maxFee = parseBigInt(tx.maxFeePerGas)!\n maxPriorityFee = parseBigInt(tx.maxPriorityFeePerGas)!\n if (maxFee < MIN_FEE) maxFee = MIN_FEE\n maxPriorityFee = normalizePriorityFee(maxFee, maxPriorityFee)\n } else if (tx.gasPrice !== undefined) {\n const gasPrice = parseBigInt(tx.gasPrice)!\n maxFee = gasPrice < MIN_FEE ? MIN_FEE : gasPrice\n maxPriorityFee = normalizePriorityFee(maxFee, (maxFee * 9n) / 10n)\n } else {\n maxFee = MIN_FEE\n maxPriorityFee = MIN_FEE / 10n\n }\n\n if (maxPriorityFee >= maxFee) maxPriorityFee = maxFee / 10n\n if (maxPriorityFee < 1n) maxPriorityFee = 1n\n\n const finalMaxFee = maxFee\n let finalMaxPriorityFee = maxPriorityFee\n\n const MIN_PRIORITY_FEE = 100000000n\n if (finalMaxFee >= MIN_PRIORITY_FEE * 10n && finalMaxPriorityFee < MIN_PRIORITY_FEE) {\n finalMaxPriorityFee = MIN_PRIORITY_FEE\n }\n\n if (finalMaxPriorityFee >= finalMaxFee) {\n finalMaxPriorityFee = finalMaxFee / 10n\n }\n\n if (finalMaxPriorityFee < 1n) {\n finalMaxPriorityFee = 1n\n }\n\n const formatted: any = {\n to: tx.to,\n value: formatBigInt(tx.value) || '0x0',\n data: tx.data || '0x',\n chainId: typeof tx.chainId === 'number' ? tx.chainId : parseInt(String(tx.chainId || chainId)),\n maxFeePerGas: formatBigInt(finalMaxFee)!,\n maxPriorityFeePerGas: formatBigInt(finalMaxPriorityFee)!,\n }\n\n if (tx.from) formatted.from = tx.from\n if (tx.gasLimit) formatted.gas = formatBigInt(tx.gasLimit)\n if (tx.nonce !== undefined) formatted.nonce = typeof tx.nonce === 'number' ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce)\n if (tx.type) formatted.type = tx.type\n if (tx.accessList) formatted.accessList = tx.accessList\n\n delete formatted.gasPrice\n\n return formatted\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig } from '@joai/warps'\nimport { CoinbaseWalletProvider } from './CoinbaseWalletProvider'\nimport { CoinbaseProviderConfig } from './types'\n\nexport const createCoinbaseWalletProvider = (\n coinbaseConfig: CoinbaseProviderConfig\n): WalletProviderFactory => {\n return (config: WarpClientConfig, chain: WarpChainInfo) =>\n new CoinbaseWalletProvider(config, chain, coinbaseConfig)\n}\n"],"mappings":"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","names":["parsed"]}
|
|
1
|
+
{"version":3,"sources":["../src/CoinbaseWalletProvider.ts","../src/helpers/evm.ts","../src/helpers.ts"],"sourcesContent":["import { CdpClient } from '@coinbase/cdp-sdk'\nimport {\n getWarpWalletAddressFromConfig,\n setWarpWalletInConfig,\n WalletProvider,\n WarpAdapterGenericTransaction,\n WarpChainInfo,\n WarpChainName,\n WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@joai/warps'\nimport { formatTransactionForCoinbase } from './helpers/evm'\nimport { CoinbaseProviderConfig } from './types'\n\nexport class CoinbaseWalletProvider implements WalletProvider {\n static readonly PROVIDER_NAME: WarpWalletProvider = 'coinbase'\n private readonly client: CdpClient\n private cachedAccount: { id: string; address: string; publicKey?: string } | null = null\n private cachedEvmAccount: { signTransaction: (tx: unknown) => Promise<unknown> } | null = null\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo,\n private readonly coinbaseConfig: CoinbaseProviderConfig\n ) {\n this.client = new CdpClient({\n apiKeyId: coinbaseConfig.apiKeyId,\n apiKeySecret: coinbaseConfig.apiKeySecret,\n walletSecret: coinbaseConfig.walletSecret,\n ...(coinbaseConfig.apiUrl && { apiUrl: coinbaseConfig.apiUrl }),\n })\n }\n\n async getAddress(): Promise<string | null> {\n try {\n return (await this.getAccount()).address\n } catch (error) {\n console.error('CoinbaseWalletProvider: Failed to get address', error)\n return null\n }\n }\n\n async getPublicKey(): Promise<string | null> {\n try {\n return (await this.getAccount()).publicKey ?? null\n } catch (error) {\n console.error('CoinbaseWalletProvider: Failed to get public key', error)\n return null\n }\n }\n\n async signTransaction(tx: WarpAdapterGenericTransaction): Promise<WarpAdapterGenericTransaction> {\n try {\n const account = await this.getAccount()\n\n if (this.chain.name === WarpChainName.Solana) {\n const result = await this.client.solana.signTransaction({\n address: account.id,\n transaction: tx as never,\n })\n\n if ('signedTransaction' in result && result.signedTransaction) {\n return { ...(tx as Record<string, unknown>), signature: String(result.signedTransaction) }\n }\n throw new Error('Coinbase API did not return signed transaction')\n }\n\n if (!this.cachedEvmAccount) {\n const address = this.getWalletAddress()\n const evmAccount = await this.client.evm.getAccount({ address: address as `0x${string}` })\n if (!('signTransaction' in evmAccount))\n throw new Error('CoinbaseWalletProvider: Account object missing signTransaction method. This may be a SDK version issue.')\n this.cachedEvmAccount = { signTransaction: evmAccount.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n const formattedTx = formatTransactionForCoinbase(tx, this.chain.chainId)\n const signedTx = await this.cachedEvmAccount.signTransaction(formattedTx)\n return { ...(tx as Record<string, unknown>), signature: signedTx }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n if (errorMessage.includes('signTransaction is not a function')) {\n throw new Error('CoinbaseWalletProvider: Account object missing signTransaction method. This may be a SDK version issue.')\n }\n throw new Error(`CoinbaseWalletProvider: Failed to sign transaction: ${error}`)\n }\n }\n\n async signMessage(message: string): Promise<string> {\n try {\n const account = await this.getAccount()\n const result =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.signMessage({ address: account.id, message })\n : await this.client.evm.signMessage({ address: account.id as `0x${string}`, message })\n\n if ('signedMessage' in result && result.signedMessage) {\n return String(result.signedMessage)\n }\n\n throw new Error('Coinbase API did not return signed message')\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to sign message: ${error}`)\n }\n }\n\n async importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails> {\n throw new Error(\n 'CoinbaseWalletProvider: importFromMnemonic() is not supported. Use generate() to create a new account via Coinbase API.'\n )\n }\n\n async importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails> {\n try {\n const name = this.getAccountName()\n const account =\n this.chain.name === 'solana'\n ? await this.client.solana.importAccount({ privateKey, ...(name && { name }) })\n : await this.client.evm.importAccount({\n privateKey: (privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`) as `0x${string}`,\n ...(name && { name }),\n })\n\n const walletDetails: WarpWalletDetails = {\n provider: CoinbaseWalletProvider.PROVIDER_NAME,\n address: account.address,\n privateKey,\n }\n\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n\n return walletDetails\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to import account from private key: ${error}`)\n }\n }\n\n async export(): Promise<WarpWalletDetails> {\n try {\n const address = this.getWalletAddress()\n const privateKey =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.exportAccount({ address })\n : await this.client.evm.exportAccount({ address: address as `0x${string}` })\n\n return {\n provider: CoinbaseWalletProvider.PROVIDER_NAME,\n address,\n privateKey,\n }\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to export account: ${error}`)\n }\n }\n\n async delete(externalId: string): Promise<void> {\n throw new Error('CoinbaseWalletProvider: delete() is not supported. Use Coinbase dashboard to manage wallets.')\n }\n\n async generate(): Promise<WarpWalletDetails> {\n try {\n const name = this.getAccountName()\n const account =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.createAccount({ name })\n : await this.client.evm.createAccount({ name })\n\n const walletDetails: WarpWalletDetails = {\n provider: CoinbaseWalletProvider.PROVIDER_NAME,\n address: account.address,\n }\n\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n\n return walletDetails\n } catch (error) {\n throw new Error(`CoinbaseWalletProvider: Failed to generate account: ${error}`)\n }\n }\n\n private getAccountName(): string | undefined {\n return this.config.user?.id ? `${this.config.user.id}-${this.chain.name}` : undefined\n }\n\n private getWalletAddress(): string {\n const address = getWarpWalletAddressFromConfig(this.config, this.chain.name)\n if (!address) throw new Error(`CoinbaseWalletProvider: Wallet address not found in config for chain ${this.chain.name}`)\n return address\n }\n\n private extractPublicKey(account: { address: string; publicKey?: unknown }): string | undefined {\n return account.publicKey as string | undefined\n }\n\n private async getAccount(): Promise<{ id: string; address: string; publicKey?: string }> {\n if (this.cachedAccount) return this.cachedAccount\n\n const address = this.getWalletAddress()\n const account =\n this.chain.name === WarpChainName.Solana\n ? await this.client.solana.getAccount({ address })\n : await this.client.evm.getAccount({ address: address as `0x${string}` })\n\n const publicKey = this.extractPublicKey(account)\n this.cachedAccount = {\n id: account.address,\n address: account.address,\n ...(publicKey && { publicKey }),\n }\n\n if (this.chain.name !== WarpChainName.Solana && 'signTransaction' in account) {\n this.cachedEvmAccount = { signTransaction: account.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n return this.cachedAccount\n }\n}\n","import { WarpAdapterGenericTransaction } from '@joai/warps'\n\nconst formatBigInt = (value: bigint | string | number | undefined): string | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') {\n const hex = value.toString(16)\n return `0x${hex}`\n }\n if (typeof value === 'string' && value.startsWith('0x')) {\n const parsed = BigInt(value)\n return `0x${parsed.toString(16)}`\n }\n const parsed = BigInt(value)\n return `0x${parsed.toString(16)}`\n}\n\nconst parseBigInt = (value: bigint | string | number | undefined): bigint | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') return value\n return BigInt(value)\n}\n\nconst normalizePriorityFee = (maxFee: bigint, maxPriorityFee: bigint): bigint => {\n if (maxFee <= 0n) return 1n\n if (maxPriorityFee <= maxFee) return maxPriorityFee\n const safeFee = maxFee / 10n\n return safeFee < 1n ? 1n : safeFee\n}\n\nexport const formatTransactionForCoinbase = (tx: WarpAdapterGenericTransaction, chainId: number | string): WarpAdapterGenericTransaction => {\n const MIN_FEE = 1000000000n\n\n let maxFee: bigint\n let maxPriorityFee: bigint\n\n if (tx.maxFeePerGas !== undefined && tx.maxPriorityFeePerGas !== undefined) {\n maxFee = parseBigInt(tx.maxFeePerGas)!\n maxPriorityFee = parseBigInt(tx.maxPriorityFeePerGas)!\n if (maxFee < MIN_FEE) maxFee = MIN_FEE\n maxPriorityFee = normalizePriorityFee(maxFee, maxPriorityFee)\n } else if (tx.gasPrice !== undefined) {\n const gasPrice = parseBigInt(tx.gasPrice)!\n maxFee = gasPrice < MIN_FEE ? MIN_FEE : gasPrice\n maxPriorityFee = normalizePriorityFee(maxFee, (maxFee * 9n) / 10n)\n } else {\n maxFee = MIN_FEE\n maxPriorityFee = MIN_FEE / 10n\n }\n\n if (maxPriorityFee >= maxFee) maxPriorityFee = maxFee / 10n\n if (maxPriorityFee < 1n) maxPriorityFee = 1n\n\n const finalMaxFee = maxFee\n let finalMaxPriorityFee = maxPriorityFee\n\n const MIN_PRIORITY_FEE = 100000000n\n if (finalMaxFee >= MIN_PRIORITY_FEE * 10n && finalMaxPriorityFee < MIN_PRIORITY_FEE) {\n finalMaxPriorityFee = MIN_PRIORITY_FEE\n }\n\n if (finalMaxPriorityFee >= finalMaxFee) {\n finalMaxPriorityFee = finalMaxFee / 10n\n }\n\n if (finalMaxPriorityFee < 1n) {\n finalMaxPriorityFee = 1n\n }\n\n const formatted: any = {\n to: tx.to,\n value: formatBigInt(tx.value) || '0x0',\n data: tx.data || '0x',\n chainId: typeof tx.chainId === 'number' ? tx.chainId : parseInt(String(tx.chainId || chainId)),\n maxFeePerGas: formatBigInt(finalMaxFee)!,\n maxPriorityFeePerGas: formatBigInt(finalMaxPriorityFee)!,\n }\n\n if (tx.from) formatted.from = tx.from\n if (tx.gasLimit) formatted.gas = formatBigInt(tx.gasLimit)\n if (tx.nonce !== undefined) formatted.nonce = typeof tx.nonce === 'number' ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce)\n if (tx.type) formatted.type = tx.type\n if (tx.accessList) formatted.accessList = tx.accessList\n\n delete formatted.gasPrice\n\n return formatted\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig } from '@joai/warps'\nimport { CoinbaseWalletProvider } from './CoinbaseWalletProvider'\nimport { CoinbaseProviderConfig } from './types'\n\nexport const createCoinbaseWalletProvider = (\n coinbaseConfig: CoinbaseProviderConfig\n): WalletProviderFactory => {\n return (config: WarpClientConfig, chain: WarpChainInfo) =>\n new CoinbaseWalletProvider(config, chain, coinbaseConfig)\n}\n"],"mappings":"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","names":["parsed"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@joai/warps-wallet-coinbase",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Coinbase Server Wallet v2 provider for multiple chains",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
],
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/jest": "^30.0.0",
|
|
28
|
-
"jest": "^30.
|
|
28
|
+
"jest": "^30.3.0",
|
|
29
29
|
"ts-jest": "^29.4.6",
|
|
30
30
|
"tsup": "^8.5.1",
|
|
31
31
|
"typescript": "^5.9.3"
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"access": "public"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@coinbase/cdp-sdk": "^1.
|
|
38
|
-
"@joai/warps": "^3.0
|
|
37
|
+
"@coinbase/cdp-sdk": "^1.45.0",
|
|
38
|
+
"@joai/warps": "^4.3.0"
|
|
39
39
|
}
|
|
40
40
|
}
|