@vleap/warps-wallet-coinbase 1.0.0-beta.2 → 1.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -44,11 +44,15 @@ const config = {
44
44
  walletProviders: {
45
45
  ethereum: {
46
46
  coinbase: createCoinbaseWalletProvider({
47
+ apiKeyId: process.env.COINBASE_API_KEY_ID,
48
+ apiKeySecret: process.env.COINBASE_API_KEY_SECRET,
47
49
  walletSecret: process.env.COINBASE_WALLET_SECRET,
48
50
  }),
49
51
  },
50
52
  base: {
51
53
  coinbase: createCoinbaseWalletProvider({
54
+ apiKeyId: process.env.COINBASE_API_KEY_ID,
55
+ apiKeySecret: process.env.COINBASE_API_KEY_SECRET,
52
56
  walletSecret: process.env.COINBASE_WALLET_SECRET,
53
57
  }),
54
58
  },
package/dist/index.d.cts CHANGED
@@ -25,6 +25,7 @@ declare class CoinbaseWalletProvider implements WalletProvider {
25
25
  importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails>;
26
26
  export(): Promise<WarpWalletDetails>;
27
27
  generate(): Promise<WarpWalletDetails>;
28
+ private getAccountName;
28
29
  private getWalletAddress;
29
30
  private extractPublicKey;
30
31
  private getAccount;
package/dist/index.d.ts CHANGED
@@ -25,6 +25,7 @@ declare class CoinbaseWalletProvider implements WalletProvider {
25
25
  importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails>;
26
26
  export(): Promise<WarpWalletDetails>;
27
27
  generate(): Promise<WarpWalletDetails>;
28
+ private getAccountName;
28
29
  private getWalletAddress;
29
30
  private extractPublicKey;
30
31
  private getAccount;
package/dist/index.js CHANGED
@@ -80,8 +80,10 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
80
80
  if (hasEip1559Fields) {
81
81
  const maxFee = typeof tx.maxFeePerGas === "bigint" ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas));
82
82
  const maxPriorityFee = typeof tx.maxPriorityFeePerGas === "bigint" ? tx.maxPriorityFeePerGas : BigInt(formatBigInt(tx.maxPriorityFeePerGas));
83
+ let safePriorityFee = maxPriorityFee <= maxFee ? maxPriorityFee : maxFee / 10n;
84
+ if (safePriorityFee > maxFee) safePriorityFee = maxFee;
85
+ if (safePriorityFee < 1n) safePriorityFee = 1n;
83
86
  formatted.maxFeePerGas = formatBigInt(maxFee);
84
- const safePriorityFee = maxPriorityFee < maxFee ? maxPriorityFee : maxFee / 10n;
85
87
  formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee);
86
88
  } else if (hasLegacyFields) {
87
89
  const gasPriceHex = formatBigInt(tx.gasPrice);
@@ -147,7 +149,7 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
147
149
  }
148
150
  async importFromPrivateKey(privateKey) {
149
151
  try {
150
- const name = this.config.user?.id ? `${this.config.user.id}-${this.chain.name}` : void 0;
152
+ const name = this.getAccountName();
151
153
  const account = this.chain.name === "solana" ? await this.client.solana.importAccount({ privateKey, ...name && { name } }) : await this.client.evm.importAccount({ privateKey, ...name && { name } });
152
154
  const walletDetails = {
153
155
  provider: _CoinbaseWalletProvider.PROVIDER_NAME,
@@ -175,7 +177,8 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
175
177
  }
176
178
  async generate() {
177
179
  try {
178
- const account = this.chain.name === "solana" ? await this.client.solana.createAccount() : await this.client.evm.createAccount();
180
+ const name = this.getAccountName();
181
+ const account = this.chain.name === "solana" ? await this.client.solana.createAccount({ name }) : await this.client.evm.createAccount({ name });
179
182
  const walletDetails = {
180
183
  provider: _CoinbaseWalletProvider.PROVIDER_NAME,
181
184
  address: account.address
@@ -186,6 +189,9 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
186
189
  throw new Error(`CoinbaseWalletProvider: Failed to generate account: ${error}`);
187
190
  }
188
191
  }
192
+ getAccountName() {
193
+ return this.config.user?.id ? `${this.config.user.id}-${this.chain.name}` : void 0;
194
+ }
189
195
  getWalletAddress() {
190
196
  const address = (0, import_warps.getWarpWalletAddressFromConfig)(this.config, this.chain.name);
191
197
  if (!address) throw new Error(`CoinbaseWalletProvider: Wallet address not found in config for chain ${this.chain.name}`);
@@ -231,8 +237,10 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
231
237
  if (hasEip1559Fields) {
232
238
  const maxFee = typeof tx.maxFeePerGas === "bigint" ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas));
233
239
  const maxPriorityFee = typeof tx.maxPriorityFeePerGas === "bigint" ? tx.maxPriorityFeePerGas : BigInt(formatBigInt(tx.maxPriorityFeePerGas));
240
+ let safePriorityFee = maxPriorityFee <= maxFee ? maxPriorityFee : maxFee / 10n;
241
+ if (safePriorityFee > maxFee) safePriorityFee = maxFee;
242
+ if (safePriorityFee < 1n) safePriorityFee = 1n;
234
243
  formatted.maxFeePerGas = formatBigInt(maxFee);
235
- const safePriorityFee = maxPriorityFee < maxFee ? maxPriorityFee : maxFee / 10n;
236
244
  formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee);
237
245
  } else if (hasLegacyFields) {
238
246
  const gasPriceHex = formatBigInt(tx.gasPrice);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/CoinbaseWalletProvider.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 WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@vleap/warps'\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 const formatBigInt = (value: bigint | string | number | undefined): string | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') return `0x${value.toString(16)}`\n if (typeof value === 'string' && value.startsWith('0x')) return value\n if (typeof value === 'string') return `0x${BigInt(value).toString(16)}`\n return `0x${BigInt(value).toString(16)}`\n }\n\n const hasEip1559Fields = tx.maxFeePerGas !== undefined && tx.maxPriorityFeePerGas !== undefined\n const hasLegacyFields = tx.gasPrice !== undefined && !hasEip1559Fields\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 || this.chain.chainId)),\n }\n\n if (tx.gasLimit) {\n formatted.gas = formatBigInt(tx.gasLimit)\n }\n\n if (hasEip1559Fields) {\n const maxFee = typeof tx.maxFeePerGas === 'bigint' ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas)!)\n const maxPriorityFee =\n typeof tx.maxPriorityFeePerGas === 'bigint' ? tx.maxPriorityFeePerGas : BigInt(formatBigInt(tx.maxPriorityFeePerGas)!)\n formatted.maxFeePerGas = formatBigInt(maxFee)!\n const safePriorityFee = maxPriorityFee < maxFee ? maxPriorityFee : maxFee / 10n\n formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee)!\n } else if (hasLegacyFields) {\n const gasPriceHex = formatBigInt(tx.gasPrice)!\n const gasPrice = typeof tx.gasPrice === 'bigint' ? tx.gasPrice : BigInt(gasPriceHex)\n formatted.maxFeePerGas = gasPriceHex\n const priorityFee = (gasPrice * 9n) / 10n\n formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n)!\n } else {\n const defaultMaxFee = BigInt('1000000000')\n formatted.maxFeePerGas = formatBigInt(defaultMaxFee)!\n formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n)!\n }\n\n if (tx.nonce !== undefined) {\n formatted.nonce = typeof tx.nonce === 'number' ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce)\n }\n\n try {\n const account = await this.getAccount()\n\n if (this.chain.name === '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 }\n this.cachedEvmAccount = { signTransaction: evmAccount.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n const formattedTx = this.formatTransactionForCoinbase(tx)\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 === '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.config.user?.id ? `${this.config.user.id}-${this.chain.name}` : undefined\n const account =\n this.chain.name === 'solana'\n ? await this.client.solana.importAccount({ privateKey, ...(name && { name }) })\n : await this.client.evm.importAccount({ privateKey: privateKey as `0x${string}`, ...(name && { name }) })\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 === '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 account = this.chain.name === 'solana' ? await this.client.solana.createAccount() : await this.client.evm.createAccount()\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 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 === '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 !== 'solana' && 'signTransaction' in account) {\n this.cachedEvmAccount = { signTransaction: account.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n return this.cachedAccount\n }\n\n private formatTransactionForCoinbase(tx: any): any {\n const formatBigInt = (value: bigint | string | number | undefined): string | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') return `0x${value.toString(16)}`\n if (typeof value === 'string' && value.startsWith('0x')) return value\n if (typeof value === 'string') return `0x${BigInt(value).toString(16)}`\n return `0x${BigInt(value).toString(16)}`\n }\n\n const hasEip1559Fields = tx.maxFeePerGas !== undefined && tx.maxPriorityFeePerGas !== undefined\n const hasLegacyFields = tx.gasPrice !== undefined && !hasEip1559Fields\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 || this.chain.chainId)),\n }\n\n if (tx.gasLimit) {\n formatted.gas = formatBigInt(tx.gasLimit)\n }\n\n if (hasEip1559Fields) {\n const maxFee = typeof tx.maxFeePerGas === 'bigint' ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas)!)\n const maxPriorityFee =\n typeof tx.maxPriorityFeePerGas === 'bigint' ? tx.maxPriorityFeePerGas : BigInt(formatBigInt(tx.maxPriorityFeePerGas)!)\n formatted.maxFeePerGas = formatBigInt(maxFee)!\n const safePriorityFee = maxPriorityFee < maxFee ? maxPriorityFee : maxFee / 10n\n formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee)!\n } else if (hasLegacyFields) {\n const gasPriceHex = formatBigInt(tx.gasPrice)!\n const gasPrice = typeof tx.gasPrice === 'bigint' ? tx.gasPrice : BigInt(gasPriceHex)\n formatted.maxFeePerGas = gasPriceHex\n const priorityFee = (gasPrice * 9n) / 10n\n formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n)!\n } else {\n const defaultMaxFee = BigInt('1000000000')\n formatted.maxFeePerGas = formatBigInt(defaultMaxFee)!\n formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n)!\n }\n\n if (tx.nonce !== undefined) {\n formatted.nonce = typeof tx.nonce === 'number' ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce)\n }\n\n return formatted\n }\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig } from '@vleap/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":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/CoinbaseWalletProvider.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 WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@vleap/warps'\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 const formatBigInt = (value: bigint | string | number | undefined): string | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') return `0x${value.toString(16)}`\n if (typeof value === 'string' && value.startsWith('0x')) return value\n if (typeof value === 'string') return `0x${BigInt(value).toString(16)}`\n return `0x${BigInt(value).toString(16)}`\n }\n\n const hasEip1559Fields = tx.maxFeePerGas !== undefined && tx.maxPriorityFeePerGas !== undefined\n const hasLegacyFields = tx.gasPrice !== undefined && !hasEip1559Fields\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 || this.chain.chainId)),\n }\n\n if (tx.gasLimit) {\n formatted.gas = formatBigInt(tx.gasLimit)\n }\n\n if (hasEip1559Fields) {\n const maxFee = typeof tx.maxFeePerGas === 'bigint' ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas)!)\n const maxPriorityFee =\n typeof tx.maxPriorityFeePerGas === 'bigint' ? tx.maxPriorityFeePerGas : BigInt(formatBigInt(tx.maxPriorityFeePerGas)!)\n let safePriorityFee = maxPriorityFee <= maxFee ? maxPriorityFee : maxFee / 10n\n if (safePriorityFee > maxFee) safePriorityFee = maxFee\n if (safePriorityFee < 1n) safePriorityFee = 1n\n formatted.maxFeePerGas = formatBigInt(maxFee)!\n formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee)!\n } else if (hasLegacyFields) {\n const gasPriceHex = formatBigInt(tx.gasPrice)!\n const gasPrice = typeof tx.gasPrice === 'bigint' ? tx.gasPrice : BigInt(gasPriceHex)\n formatted.maxFeePerGas = gasPriceHex\n const priorityFee = (gasPrice * 9n) / 10n\n formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n)!\n } else {\n const defaultMaxFee = BigInt('1000000000')\n formatted.maxFeePerGas = formatBigInt(defaultMaxFee)!\n formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n)!\n }\n\n if (tx.nonce !== undefined) {\n formatted.nonce = typeof tx.nonce === 'number' ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce)\n }\n\n try {\n const account = await this.getAccount()\n\n if (this.chain.name === '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 }\n this.cachedEvmAccount = { signTransaction: evmAccount.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n const formattedTx = this.formatTransactionForCoinbase(tx)\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 === '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({ privateKey: privateKey as `0x${string}`, ...(name && { name }) })\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 === '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 === 'solana' ? await this.client.solana.createAccount({ name }) : 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 === '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 !== 'solana' && 'signTransaction' in account) {\n this.cachedEvmAccount = { signTransaction: account.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n return this.cachedAccount\n }\n\n private formatTransactionForCoinbase(tx: any): any {\n const formatBigInt = (value: bigint | string | number | undefined): string | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') return `0x${value.toString(16)}`\n if (typeof value === 'string' && value.startsWith('0x')) return value\n if (typeof value === 'string') return `0x${BigInt(value).toString(16)}`\n return `0x${BigInt(value).toString(16)}`\n }\n\n const hasEip1559Fields = tx.maxFeePerGas !== undefined && tx.maxPriorityFeePerGas !== undefined\n const hasLegacyFields = tx.gasPrice !== undefined && !hasEip1559Fields\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 || this.chain.chainId)),\n }\n\n if (tx.gasLimit) {\n formatted.gas = formatBigInt(tx.gasLimit)\n }\n\n if (hasEip1559Fields) {\n const maxFee = typeof tx.maxFeePerGas === 'bigint' ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas)!)\n const maxPriorityFee =\n typeof tx.maxPriorityFeePerGas === 'bigint' ? tx.maxPriorityFeePerGas : BigInt(formatBigInt(tx.maxPriorityFeePerGas)!)\n let safePriorityFee = maxPriorityFee <= maxFee ? maxPriorityFee : maxFee / 10n\n if (safePriorityFee > maxFee) safePriorityFee = maxFee\n if (safePriorityFee < 1n) safePriorityFee = 1n\n formatted.maxFeePerGas = formatBigInt(maxFee)!\n formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee)!\n } else if (hasLegacyFields) {\n const gasPriceHex = formatBigInt(tx.gasPrice)!\n const gasPrice = typeof tx.gasPrice === 'bigint' ? tx.gasPrice : BigInt(gasPriceHex)\n formatted.maxFeePerGas = gasPriceHex\n const priorityFee = (gasPrice * 9n) / 10n\n formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n)!\n } else {\n const defaultMaxFee = BigInt('1000000000')\n formatted.maxFeePerGas = formatBigInt(defaultMaxFee)!\n formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n)!\n }\n\n if (tx.nonce !== undefined) {\n formatted.nonce = typeof tx.nonce === 'number' ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce)\n }\n\n return formatted\n }\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig } from '@vleap/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":[]}
package/dist/index.mjs CHANGED
@@ -56,8 +56,10 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
56
56
  if (hasEip1559Fields) {
57
57
  const maxFee = typeof tx.maxFeePerGas === "bigint" ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas));
58
58
  const maxPriorityFee = typeof tx.maxPriorityFeePerGas === "bigint" ? tx.maxPriorityFeePerGas : BigInt(formatBigInt(tx.maxPriorityFeePerGas));
59
+ let safePriorityFee = maxPriorityFee <= maxFee ? maxPriorityFee : maxFee / 10n;
60
+ if (safePriorityFee > maxFee) safePriorityFee = maxFee;
61
+ if (safePriorityFee < 1n) safePriorityFee = 1n;
59
62
  formatted.maxFeePerGas = formatBigInt(maxFee);
60
- const safePriorityFee = maxPriorityFee < maxFee ? maxPriorityFee : maxFee / 10n;
61
63
  formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee);
62
64
  } else if (hasLegacyFields) {
63
65
  const gasPriceHex = formatBigInt(tx.gasPrice);
@@ -123,7 +125,7 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
123
125
  }
124
126
  async importFromPrivateKey(privateKey) {
125
127
  try {
126
- const name = this.config.user?.id ? `${this.config.user.id}-${this.chain.name}` : void 0;
128
+ const name = this.getAccountName();
127
129
  const account = this.chain.name === "solana" ? await this.client.solana.importAccount({ privateKey, ...name && { name } }) : await this.client.evm.importAccount({ privateKey, ...name && { name } });
128
130
  const walletDetails = {
129
131
  provider: _CoinbaseWalletProvider.PROVIDER_NAME,
@@ -151,7 +153,8 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
151
153
  }
152
154
  async generate() {
153
155
  try {
154
- const account = this.chain.name === "solana" ? await this.client.solana.createAccount() : await this.client.evm.createAccount();
156
+ const name = this.getAccountName();
157
+ const account = this.chain.name === "solana" ? await this.client.solana.createAccount({ name }) : await this.client.evm.createAccount({ name });
155
158
  const walletDetails = {
156
159
  provider: _CoinbaseWalletProvider.PROVIDER_NAME,
157
160
  address: account.address
@@ -162,6 +165,9 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
162
165
  throw new Error(`CoinbaseWalletProvider: Failed to generate account: ${error}`);
163
166
  }
164
167
  }
168
+ getAccountName() {
169
+ return this.config.user?.id ? `${this.config.user.id}-${this.chain.name}` : void 0;
170
+ }
165
171
  getWalletAddress() {
166
172
  const address = getWarpWalletAddressFromConfig(this.config, this.chain.name);
167
173
  if (!address) throw new Error(`CoinbaseWalletProvider: Wallet address not found in config for chain ${this.chain.name}`);
@@ -207,8 +213,10 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
207
213
  if (hasEip1559Fields) {
208
214
  const maxFee = typeof tx.maxFeePerGas === "bigint" ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas));
209
215
  const maxPriorityFee = typeof tx.maxPriorityFeePerGas === "bigint" ? tx.maxPriorityFeePerGas : BigInt(formatBigInt(tx.maxPriorityFeePerGas));
216
+ let safePriorityFee = maxPriorityFee <= maxFee ? maxPriorityFee : maxFee / 10n;
217
+ if (safePriorityFee > maxFee) safePriorityFee = maxFee;
218
+ if (safePriorityFee < 1n) safePriorityFee = 1n;
210
219
  formatted.maxFeePerGas = formatBigInt(maxFee);
211
- const safePriorityFee = maxPriorityFee < maxFee ? maxPriorityFee : maxFee / 10n;
212
220
  formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee);
213
221
  } else if (hasLegacyFields) {
214
222
  const gasPriceHex = formatBigInt(tx.gasPrice);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/CoinbaseWalletProvider.ts","../src/helpers.ts"],"sourcesContent":["import { CdpClient } from '@coinbase/cdp-sdk'\nimport {\n getWarpWalletAddressFromConfig,\n setWarpWalletInConfig,\n WalletProvider,\n WarpAdapterGenericTransaction,\n WarpChainInfo,\n WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@vleap/warps'\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 const formatBigInt = (value: bigint | string | number | undefined): string | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') return `0x${value.toString(16)}`\n if (typeof value === 'string' && value.startsWith('0x')) return value\n if (typeof value === 'string') return `0x${BigInt(value).toString(16)}`\n return `0x${BigInt(value).toString(16)}`\n }\n\n const hasEip1559Fields = tx.maxFeePerGas !== undefined && tx.maxPriorityFeePerGas !== undefined\n const hasLegacyFields = tx.gasPrice !== undefined && !hasEip1559Fields\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 || this.chain.chainId)),\n }\n\n if (tx.gasLimit) {\n formatted.gas = formatBigInt(tx.gasLimit)\n }\n\n if (hasEip1559Fields) {\n const maxFee = typeof tx.maxFeePerGas === 'bigint' ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas)!)\n const maxPriorityFee =\n typeof tx.maxPriorityFeePerGas === 'bigint' ? tx.maxPriorityFeePerGas : BigInt(formatBigInt(tx.maxPriorityFeePerGas)!)\n formatted.maxFeePerGas = formatBigInt(maxFee)!\n const safePriorityFee = maxPriorityFee < maxFee ? maxPriorityFee : maxFee / 10n\n formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee)!\n } else if (hasLegacyFields) {\n const gasPriceHex = formatBigInt(tx.gasPrice)!\n const gasPrice = typeof tx.gasPrice === 'bigint' ? tx.gasPrice : BigInt(gasPriceHex)\n formatted.maxFeePerGas = gasPriceHex\n const priorityFee = (gasPrice * 9n) / 10n\n formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n)!\n } else {\n const defaultMaxFee = BigInt('1000000000')\n formatted.maxFeePerGas = formatBigInt(defaultMaxFee)!\n formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n)!\n }\n\n if (tx.nonce !== undefined) {\n formatted.nonce = typeof tx.nonce === 'number' ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce)\n }\n\n try {\n const account = await this.getAccount()\n\n if (this.chain.name === '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 }\n this.cachedEvmAccount = { signTransaction: evmAccount.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n const formattedTx = this.formatTransactionForCoinbase(tx)\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 === '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.config.user?.id ? `${this.config.user.id}-${this.chain.name}` : undefined\n const account =\n this.chain.name === 'solana'\n ? await this.client.solana.importAccount({ privateKey, ...(name && { name }) })\n : await this.client.evm.importAccount({ privateKey: privateKey as `0x${string}`, ...(name && { name }) })\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 === '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 account = this.chain.name === 'solana' ? await this.client.solana.createAccount() : await this.client.evm.createAccount()\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 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 === '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 !== 'solana' && 'signTransaction' in account) {\n this.cachedEvmAccount = { signTransaction: account.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n return this.cachedAccount\n }\n\n private formatTransactionForCoinbase(tx: any): any {\n const formatBigInt = (value: bigint | string | number | undefined): string | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') return `0x${value.toString(16)}`\n if (typeof value === 'string' && value.startsWith('0x')) return value\n if (typeof value === 'string') return `0x${BigInt(value).toString(16)}`\n return `0x${BigInt(value).toString(16)}`\n }\n\n const hasEip1559Fields = tx.maxFeePerGas !== undefined && tx.maxPriorityFeePerGas !== undefined\n const hasLegacyFields = tx.gasPrice !== undefined && !hasEip1559Fields\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 || this.chain.chainId)),\n }\n\n if (tx.gasLimit) {\n formatted.gas = formatBigInt(tx.gasLimit)\n }\n\n if (hasEip1559Fields) {\n const maxFee = typeof tx.maxFeePerGas === 'bigint' ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas)!)\n const maxPriorityFee =\n typeof tx.maxPriorityFeePerGas === 'bigint' ? tx.maxPriorityFeePerGas : BigInt(formatBigInt(tx.maxPriorityFeePerGas)!)\n formatted.maxFeePerGas = formatBigInt(maxFee)!\n const safePriorityFee = maxPriorityFee < maxFee ? maxPriorityFee : maxFee / 10n\n formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee)!\n } else if (hasLegacyFields) {\n const gasPriceHex = formatBigInt(tx.gasPrice)!\n const gasPrice = typeof tx.gasPrice === 'bigint' ? tx.gasPrice : BigInt(gasPriceHex)\n formatted.maxFeePerGas = gasPriceHex\n const priorityFee = (gasPrice * 9n) / 10n\n formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n)!\n } else {\n const defaultMaxFee = BigInt('1000000000')\n formatted.maxFeePerGas = formatBigInt(defaultMaxFee)!\n formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n)!\n }\n\n if (tx.nonce !== undefined) {\n formatted.nonce = typeof tx.nonce === 'number' ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce)\n }\n\n return formatted\n }\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig } from '@vleap/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":[]}
1
+ {"version":3,"sources":["../src/CoinbaseWalletProvider.ts","../src/helpers.ts"],"sourcesContent":["import { CdpClient } from '@coinbase/cdp-sdk'\nimport {\n getWarpWalletAddressFromConfig,\n setWarpWalletInConfig,\n WalletProvider,\n WarpAdapterGenericTransaction,\n WarpChainInfo,\n WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@vleap/warps'\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 const formatBigInt = (value: bigint | string | number | undefined): string | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') return `0x${value.toString(16)}`\n if (typeof value === 'string' && value.startsWith('0x')) return value\n if (typeof value === 'string') return `0x${BigInt(value).toString(16)}`\n return `0x${BigInt(value).toString(16)}`\n }\n\n const hasEip1559Fields = tx.maxFeePerGas !== undefined && tx.maxPriorityFeePerGas !== undefined\n const hasLegacyFields = tx.gasPrice !== undefined && !hasEip1559Fields\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 || this.chain.chainId)),\n }\n\n if (tx.gasLimit) {\n formatted.gas = formatBigInt(tx.gasLimit)\n }\n\n if (hasEip1559Fields) {\n const maxFee = typeof tx.maxFeePerGas === 'bigint' ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas)!)\n const maxPriorityFee =\n typeof tx.maxPriorityFeePerGas === 'bigint' ? tx.maxPriorityFeePerGas : BigInt(formatBigInt(tx.maxPriorityFeePerGas)!)\n let safePriorityFee = maxPriorityFee <= maxFee ? maxPriorityFee : maxFee / 10n\n if (safePriorityFee > maxFee) safePriorityFee = maxFee\n if (safePriorityFee < 1n) safePriorityFee = 1n\n formatted.maxFeePerGas = formatBigInt(maxFee)!\n formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee)!\n } else if (hasLegacyFields) {\n const gasPriceHex = formatBigInt(tx.gasPrice)!\n const gasPrice = typeof tx.gasPrice === 'bigint' ? tx.gasPrice : BigInt(gasPriceHex)\n formatted.maxFeePerGas = gasPriceHex\n const priorityFee = (gasPrice * 9n) / 10n\n formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n)!\n } else {\n const defaultMaxFee = BigInt('1000000000')\n formatted.maxFeePerGas = formatBigInt(defaultMaxFee)!\n formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n)!\n }\n\n if (tx.nonce !== undefined) {\n formatted.nonce = typeof tx.nonce === 'number' ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce)\n }\n\n try {\n const account = await this.getAccount()\n\n if (this.chain.name === '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 }\n this.cachedEvmAccount = { signTransaction: evmAccount.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n const formattedTx = this.formatTransactionForCoinbase(tx)\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 === '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({ privateKey: privateKey as `0x${string}`, ...(name && { name }) })\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 === '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 === 'solana' ? await this.client.solana.createAccount({ name }) : 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 === '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 !== 'solana' && 'signTransaction' in account) {\n this.cachedEvmAccount = { signTransaction: account.signTransaction as (tx: unknown) => Promise<unknown> }\n }\n\n return this.cachedAccount\n }\n\n private formatTransactionForCoinbase(tx: any): any {\n const formatBigInt = (value: bigint | string | number | undefined): string | undefined => {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'bigint') return `0x${value.toString(16)}`\n if (typeof value === 'string' && value.startsWith('0x')) return value\n if (typeof value === 'string') return `0x${BigInt(value).toString(16)}`\n return `0x${BigInt(value).toString(16)}`\n }\n\n const hasEip1559Fields = tx.maxFeePerGas !== undefined && tx.maxPriorityFeePerGas !== undefined\n const hasLegacyFields = tx.gasPrice !== undefined && !hasEip1559Fields\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 || this.chain.chainId)),\n }\n\n if (tx.gasLimit) {\n formatted.gas = formatBigInt(tx.gasLimit)\n }\n\n if (hasEip1559Fields) {\n const maxFee = typeof tx.maxFeePerGas === 'bigint' ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas)!)\n const maxPriorityFee =\n typeof tx.maxPriorityFeePerGas === 'bigint' ? tx.maxPriorityFeePerGas : BigInt(formatBigInt(tx.maxPriorityFeePerGas)!)\n let safePriorityFee = maxPriorityFee <= maxFee ? maxPriorityFee : maxFee / 10n\n if (safePriorityFee > maxFee) safePriorityFee = maxFee\n if (safePriorityFee < 1n) safePriorityFee = 1n\n formatted.maxFeePerGas = formatBigInt(maxFee)!\n formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee)!\n } else if (hasLegacyFields) {\n const gasPriceHex = formatBigInt(tx.gasPrice)!\n const gasPrice = typeof tx.gasPrice === 'bigint' ? tx.gasPrice : BigInt(gasPriceHex)\n formatted.maxFeePerGas = gasPriceHex\n const priorityFee = (gasPrice * 9n) / 10n\n formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n)!\n } else {\n const defaultMaxFee = BigInt('1000000000')\n formatted.maxFeePerGas = formatBigInt(defaultMaxFee)!\n formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n)!\n }\n\n if (tx.nonce !== undefined) {\n formatted.nonce = typeof tx.nonce === 'number' ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce)\n }\n\n return formatted\n }\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig } from '@vleap/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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vleap/warps-wallet-coinbase",
3
- "version": "1.0.0-beta.2",
3
+ "version": "1.0.0-beta.4",
4
4
  "description": "Coinbase Server Wallet v2 provider for multiple chains",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",