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

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 CHANGED
@@ -29,7 +29,6 @@ declare class CoinbaseWalletProvider implements WalletProvider {
29
29
  private getWalletAddress;
30
30
  private extractPublicKey;
31
31
  private getAccount;
32
- private formatTransactionForCoinbase;
33
32
  }
34
33
 
35
34
  declare const createCoinbaseWalletProvider: (coinbaseConfig: CoinbaseProviderConfig) => WalletProviderFactory;
package/dist/index.d.ts CHANGED
@@ -29,7 +29,6 @@ declare class CoinbaseWalletProvider implements WalletProvider {
29
29
  private getWalletAddress;
30
30
  private extractPublicKey;
31
31
  private getAccount;
32
- private formatTransactionForCoinbase;
33
32
  }
34
33
 
35
34
  declare const createCoinbaseWalletProvider: (coinbaseConfig: CoinbaseProviderConfig) => WalletProviderFactory;
package/dist/index.js CHANGED
@@ -28,6 +28,81 @@ module.exports = __toCommonJS(index_exports);
28
28
  // src/CoinbaseWalletProvider.ts
29
29
  var import_cdp_sdk = require("@coinbase/cdp-sdk");
30
30
  var import_warps = require("@vleap/warps");
31
+
32
+ // src/helpers/evm.ts
33
+ var formatBigInt = (value) => {
34
+ if (value === void 0 || value === null) return void 0;
35
+ if (typeof value === "bigint") {
36
+ const hex = value.toString(16);
37
+ return `0x${hex}`;
38
+ }
39
+ if (typeof value === "string" && value.startsWith("0x")) {
40
+ const parsed2 = BigInt(value);
41
+ return `0x${parsed2.toString(16)}`;
42
+ }
43
+ const parsed = BigInt(value);
44
+ return `0x${parsed.toString(16)}`;
45
+ };
46
+ var parseBigInt = (value) => {
47
+ if (value === void 0 || value === null) return void 0;
48
+ if (typeof value === "bigint") return value;
49
+ return BigInt(value);
50
+ };
51
+ var normalizePriorityFee = (maxFee, maxPriorityFee) => {
52
+ if (maxFee <= 0n) return 1n;
53
+ if (maxPriorityFee <= maxFee) return maxPriorityFee;
54
+ const safeFee = maxFee / 10n;
55
+ return safeFee < 1n ? 1n : safeFee;
56
+ };
57
+ var formatTransactionForCoinbase = (tx, chainId) => {
58
+ const MIN_FEE = 1000000000n;
59
+ let maxFee;
60
+ let maxPriorityFee;
61
+ if (tx.maxFeePerGas !== void 0 && tx.maxPriorityFeePerGas !== void 0) {
62
+ maxFee = parseBigInt(tx.maxFeePerGas);
63
+ maxPriorityFee = parseBigInt(tx.maxPriorityFeePerGas);
64
+ if (maxFee < MIN_FEE) maxFee = MIN_FEE;
65
+ maxPriorityFee = normalizePriorityFee(maxFee, maxPriorityFee);
66
+ } else if (tx.gasPrice !== void 0) {
67
+ const gasPrice = parseBigInt(tx.gasPrice);
68
+ maxFee = gasPrice < MIN_FEE ? MIN_FEE : gasPrice;
69
+ maxPriorityFee = normalizePriorityFee(maxFee, maxFee * 9n / 10n);
70
+ } else {
71
+ maxFee = MIN_FEE;
72
+ maxPriorityFee = MIN_FEE / 10n;
73
+ }
74
+ if (maxPriorityFee >= maxFee) maxPriorityFee = maxFee / 10n;
75
+ if (maxPriorityFee < 1n) maxPriorityFee = 1n;
76
+ const finalMaxFee = maxFee;
77
+ let finalMaxPriorityFee = maxPriorityFee;
78
+ const MIN_PRIORITY_FEE = 100000000n;
79
+ if (finalMaxFee >= MIN_PRIORITY_FEE * 10n && finalMaxPriorityFee < MIN_PRIORITY_FEE) {
80
+ finalMaxPriorityFee = MIN_PRIORITY_FEE;
81
+ }
82
+ if (finalMaxPriorityFee >= finalMaxFee) {
83
+ finalMaxPriorityFee = finalMaxFee / 10n;
84
+ }
85
+ if (finalMaxPriorityFee < 1n) {
86
+ finalMaxPriorityFee = 1n;
87
+ }
88
+ const formatted = {
89
+ to: tx.to,
90
+ value: formatBigInt(tx.value) || "0x0",
91
+ data: tx.data || "0x",
92
+ chainId: typeof tx.chainId === "number" ? tx.chainId : parseInt(String(tx.chainId || chainId)),
93
+ maxFeePerGas: formatBigInt(finalMaxFee),
94
+ maxPriorityFeePerGas: formatBigInt(finalMaxPriorityFee)
95
+ };
96
+ if (tx.from) formatted.from = tx.from;
97
+ if (tx.gasLimit) formatted.gas = formatBigInt(tx.gasLimit);
98
+ if (tx.nonce !== void 0) formatted.nonce = typeof tx.nonce === "number" ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce);
99
+ if (tx.type) formatted.type = tx.type;
100
+ if (tx.accessList) formatted.accessList = tx.accessList;
101
+ delete formatted.gasPrice;
102
+ return formatted;
103
+ };
104
+
105
+ // src/CoinbaseWalletProvider.ts
31
106
  var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
32
107
  constructor(config, chain, coinbaseConfig) {
33
108
  this.config = config;
@@ -59,46 +134,6 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
59
134
  }
60
135
  }
61
136
  async signTransaction(tx) {
62
- const formatBigInt = (value) => {
63
- if (value === void 0 || value === null) return void 0;
64
- if (typeof value === "bigint") return `0x${value.toString(16)}`;
65
- if (typeof value === "string" && value.startsWith("0x")) return value;
66
- if (typeof value === "string") return `0x${BigInt(value).toString(16)}`;
67
- return `0x${BigInt(value).toString(16)}`;
68
- };
69
- const hasEip1559Fields = tx.maxFeePerGas !== void 0 && tx.maxPriorityFeePerGas !== void 0;
70
- const hasLegacyFields = tx.gasPrice !== void 0 && !hasEip1559Fields;
71
- const formatted = {
72
- to: tx.to,
73
- value: formatBigInt(tx.value) || "0x0",
74
- data: tx.data || "0x",
75
- chainId: typeof tx.chainId === "number" ? tx.chainId : parseInt(String(tx.chainId || this.chain.chainId))
76
- };
77
- if (tx.gasLimit) {
78
- formatted.gas = formatBigInt(tx.gasLimit);
79
- }
80
- if (hasEip1559Fields) {
81
- const maxFee = typeof tx.maxFeePerGas === "bigint" ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas));
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;
86
- formatted.maxFeePerGas = formatBigInt(maxFee);
87
- formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee);
88
- } else if (hasLegacyFields) {
89
- const gasPriceHex = formatBigInt(tx.gasPrice);
90
- const gasPrice = typeof tx.gasPrice === "bigint" ? tx.gasPrice : BigInt(gasPriceHex);
91
- formatted.maxFeePerGas = gasPriceHex;
92
- const priorityFee = gasPrice * 9n / 10n;
93
- formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n);
94
- } else {
95
- const defaultMaxFee = BigInt("1000000000");
96
- formatted.maxFeePerGas = formatBigInt(defaultMaxFee);
97
- formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n);
98
- }
99
- if (tx.nonce !== void 0) {
100
- formatted.nonce = typeof tx.nonce === "number" ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce);
101
- }
102
137
  try {
103
138
  const account = await this.getAccount();
104
139
  if (this.chain.name === "solana") {
@@ -114,12 +149,11 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
114
149
  if (!this.cachedEvmAccount) {
115
150
  const address = this.getWalletAddress();
116
151
  const evmAccount = await this.client.evm.getAccount({ address });
117
- if (!("signTransaction" in evmAccount)) {
152
+ if (!("signTransaction" in evmAccount))
118
153
  throw new Error("CoinbaseWalletProvider: Account object missing signTransaction method. This may be a SDK version issue.");
119
- }
120
154
  this.cachedEvmAccount = { signTransaction: evmAccount.signTransaction };
121
155
  }
122
- const formattedTx = this.formatTransactionForCoinbase(tx);
156
+ const formattedTx = formatTransactionForCoinbase(tx, this.chain.chainId);
123
157
  const signedTx = await this.cachedEvmAccount.signTransaction(formattedTx);
124
158
  return { ...tx, signature: signedTx };
125
159
  } catch (error) {
@@ -150,7 +184,10 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
150
184
  async importFromPrivateKey(privateKey) {
151
185
  try {
152
186
  const name = this.getAccountName();
153
- const account = this.chain.name === "solana" ? await this.client.solana.importAccount({ privateKey, ...name && { name } }) : await this.client.evm.importAccount({ privateKey, ...name && { name } });
187
+ const account = this.chain.name === "solana" ? await this.client.solana.importAccount({ privateKey, ...name && { name } }) : await this.client.evm.importAccount({
188
+ privateKey: privateKey.startsWith("0x") ? privateKey : `0x${privateKey}`,
189
+ ...name && { name }
190
+ });
154
191
  const walletDetails = {
155
192
  provider: _CoinbaseWalletProvider.PROVIDER_NAME,
156
193
  address: account.address,
@@ -215,49 +252,6 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
215
252
  }
216
253
  return this.cachedAccount;
217
254
  }
218
- formatTransactionForCoinbase(tx) {
219
- const formatBigInt = (value) => {
220
- if (value === void 0 || value === null) return void 0;
221
- if (typeof value === "bigint") return `0x${value.toString(16)}`;
222
- if (typeof value === "string" && value.startsWith("0x")) return value;
223
- if (typeof value === "string") return `0x${BigInt(value).toString(16)}`;
224
- return `0x${BigInt(value).toString(16)}`;
225
- };
226
- const hasEip1559Fields = tx.maxFeePerGas !== void 0 && tx.maxPriorityFeePerGas !== void 0;
227
- const hasLegacyFields = tx.gasPrice !== void 0 && !hasEip1559Fields;
228
- const formatted = {
229
- to: tx.to,
230
- value: formatBigInt(tx.value) || "0x0",
231
- data: tx.data || "0x",
232
- chainId: typeof tx.chainId === "number" ? tx.chainId : parseInt(String(tx.chainId || this.chain.chainId))
233
- };
234
- if (tx.gasLimit) {
235
- formatted.gas = formatBigInt(tx.gasLimit);
236
- }
237
- if (hasEip1559Fields) {
238
- const maxFee = typeof tx.maxFeePerGas === "bigint" ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas));
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;
243
- formatted.maxFeePerGas = formatBigInt(maxFee);
244
- formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee);
245
- } else if (hasLegacyFields) {
246
- const gasPriceHex = formatBigInt(tx.gasPrice);
247
- const gasPrice = typeof tx.gasPrice === "bigint" ? tx.gasPrice : BigInt(gasPriceHex);
248
- formatted.maxFeePerGas = gasPriceHex;
249
- const priorityFee = gasPrice * 9n / 10n;
250
- formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n);
251
- } else {
252
- const defaultMaxFee = BigInt("1000000000");
253
- formatted.maxFeePerGas = formatBigInt(defaultMaxFee);
254
- formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n);
255
- }
256
- if (tx.nonce !== void 0) {
257
- formatted.nonce = typeof tx.nonce === "number" ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce);
258
- }
259
- return formatted;
260
- }
261
255
  };
262
256
  _CoinbaseWalletProvider.PROVIDER_NAME = "coinbase";
263
257
  var CoinbaseWalletProvider = _CoinbaseWalletProvider;
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 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":[]}
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 WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@vleap/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 === '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 === '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 === '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","import { WarpAdapterGenericTransaction } from '@vleap/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 '@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":["parsed"]}
package/dist/index.mjs CHANGED
@@ -4,6 +4,81 @@ import {
4
4
  getWarpWalletAddressFromConfig,
5
5
  setWarpWalletInConfig
6
6
  } from "@vleap/warps";
7
+
8
+ // src/helpers/evm.ts
9
+ var formatBigInt = (value) => {
10
+ if (value === void 0 || value === null) return void 0;
11
+ if (typeof value === "bigint") {
12
+ const hex = value.toString(16);
13
+ return `0x${hex}`;
14
+ }
15
+ if (typeof value === "string" && value.startsWith("0x")) {
16
+ const parsed2 = BigInt(value);
17
+ return `0x${parsed2.toString(16)}`;
18
+ }
19
+ const parsed = BigInt(value);
20
+ return `0x${parsed.toString(16)}`;
21
+ };
22
+ var parseBigInt = (value) => {
23
+ if (value === void 0 || value === null) return void 0;
24
+ if (typeof value === "bigint") return value;
25
+ return BigInt(value);
26
+ };
27
+ var normalizePriorityFee = (maxFee, maxPriorityFee) => {
28
+ if (maxFee <= 0n) return 1n;
29
+ if (maxPriorityFee <= maxFee) return maxPriorityFee;
30
+ const safeFee = maxFee / 10n;
31
+ return safeFee < 1n ? 1n : safeFee;
32
+ };
33
+ var formatTransactionForCoinbase = (tx, chainId) => {
34
+ const MIN_FEE = 1000000000n;
35
+ let maxFee;
36
+ let maxPriorityFee;
37
+ if (tx.maxFeePerGas !== void 0 && tx.maxPriorityFeePerGas !== void 0) {
38
+ maxFee = parseBigInt(tx.maxFeePerGas);
39
+ maxPriorityFee = parseBigInt(tx.maxPriorityFeePerGas);
40
+ if (maxFee < MIN_FEE) maxFee = MIN_FEE;
41
+ maxPriorityFee = normalizePriorityFee(maxFee, maxPriorityFee);
42
+ } else if (tx.gasPrice !== void 0) {
43
+ const gasPrice = parseBigInt(tx.gasPrice);
44
+ maxFee = gasPrice < MIN_FEE ? MIN_FEE : gasPrice;
45
+ maxPriorityFee = normalizePriorityFee(maxFee, maxFee * 9n / 10n);
46
+ } else {
47
+ maxFee = MIN_FEE;
48
+ maxPriorityFee = MIN_FEE / 10n;
49
+ }
50
+ if (maxPriorityFee >= maxFee) maxPriorityFee = maxFee / 10n;
51
+ if (maxPriorityFee < 1n) maxPriorityFee = 1n;
52
+ const finalMaxFee = maxFee;
53
+ let finalMaxPriorityFee = maxPriorityFee;
54
+ const MIN_PRIORITY_FEE = 100000000n;
55
+ if (finalMaxFee >= MIN_PRIORITY_FEE * 10n && finalMaxPriorityFee < MIN_PRIORITY_FEE) {
56
+ finalMaxPriorityFee = MIN_PRIORITY_FEE;
57
+ }
58
+ if (finalMaxPriorityFee >= finalMaxFee) {
59
+ finalMaxPriorityFee = finalMaxFee / 10n;
60
+ }
61
+ if (finalMaxPriorityFee < 1n) {
62
+ finalMaxPriorityFee = 1n;
63
+ }
64
+ const formatted = {
65
+ to: tx.to,
66
+ value: formatBigInt(tx.value) || "0x0",
67
+ data: tx.data || "0x",
68
+ chainId: typeof tx.chainId === "number" ? tx.chainId : parseInt(String(tx.chainId || chainId)),
69
+ maxFeePerGas: formatBigInt(finalMaxFee),
70
+ maxPriorityFeePerGas: formatBigInt(finalMaxPriorityFee)
71
+ };
72
+ if (tx.from) formatted.from = tx.from;
73
+ if (tx.gasLimit) formatted.gas = formatBigInt(tx.gasLimit);
74
+ if (tx.nonce !== void 0) formatted.nonce = typeof tx.nonce === "number" ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce);
75
+ if (tx.type) formatted.type = tx.type;
76
+ if (tx.accessList) formatted.accessList = tx.accessList;
77
+ delete formatted.gasPrice;
78
+ return formatted;
79
+ };
80
+
81
+ // src/CoinbaseWalletProvider.ts
7
82
  var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
8
83
  constructor(config, chain, coinbaseConfig) {
9
84
  this.config = config;
@@ -35,46 +110,6 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
35
110
  }
36
111
  }
37
112
  async signTransaction(tx) {
38
- const formatBigInt = (value) => {
39
- if (value === void 0 || value === null) return void 0;
40
- if (typeof value === "bigint") return `0x${value.toString(16)}`;
41
- if (typeof value === "string" && value.startsWith("0x")) return value;
42
- if (typeof value === "string") return `0x${BigInt(value).toString(16)}`;
43
- return `0x${BigInt(value).toString(16)}`;
44
- };
45
- const hasEip1559Fields = tx.maxFeePerGas !== void 0 && tx.maxPriorityFeePerGas !== void 0;
46
- const hasLegacyFields = tx.gasPrice !== void 0 && !hasEip1559Fields;
47
- const formatted = {
48
- to: tx.to,
49
- value: formatBigInt(tx.value) || "0x0",
50
- data: tx.data || "0x",
51
- chainId: typeof tx.chainId === "number" ? tx.chainId : parseInt(String(tx.chainId || this.chain.chainId))
52
- };
53
- if (tx.gasLimit) {
54
- formatted.gas = formatBigInt(tx.gasLimit);
55
- }
56
- if (hasEip1559Fields) {
57
- const maxFee = typeof tx.maxFeePerGas === "bigint" ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas));
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;
62
- formatted.maxFeePerGas = formatBigInt(maxFee);
63
- formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee);
64
- } else if (hasLegacyFields) {
65
- const gasPriceHex = formatBigInt(tx.gasPrice);
66
- const gasPrice = typeof tx.gasPrice === "bigint" ? tx.gasPrice : BigInt(gasPriceHex);
67
- formatted.maxFeePerGas = gasPriceHex;
68
- const priorityFee = gasPrice * 9n / 10n;
69
- formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n);
70
- } else {
71
- const defaultMaxFee = BigInt("1000000000");
72
- formatted.maxFeePerGas = formatBigInt(defaultMaxFee);
73
- formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n);
74
- }
75
- if (tx.nonce !== void 0) {
76
- formatted.nonce = typeof tx.nonce === "number" ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce);
77
- }
78
113
  try {
79
114
  const account = await this.getAccount();
80
115
  if (this.chain.name === "solana") {
@@ -90,12 +125,11 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
90
125
  if (!this.cachedEvmAccount) {
91
126
  const address = this.getWalletAddress();
92
127
  const evmAccount = await this.client.evm.getAccount({ address });
93
- if (!("signTransaction" in evmAccount)) {
128
+ if (!("signTransaction" in evmAccount))
94
129
  throw new Error("CoinbaseWalletProvider: Account object missing signTransaction method. This may be a SDK version issue.");
95
- }
96
130
  this.cachedEvmAccount = { signTransaction: evmAccount.signTransaction };
97
131
  }
98
- const formattedTx = this.formatTransactionForCoinbase(tx);
132
+ const formattedTx = formatTransactionForCoinbase(tx, this.chain.chainId);
99
133
  const signedTx = await this.cachedEvmAccount.signTransaction(formattedTx);
100
134
  return { ...tx, signature: signedTx };
101
135
  } catch (error) {
@@ -126,7 +160,10 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
126
160
  async importFromPrivateKey(privateKey) {
127
161
  try {
128
162
  const name = this.getAccountName();
129
- const account = this.chain.name === "solana" ? await this.client.solana.importAccount({ privateKey, ...name && { name } }) : await this.client.evm.importAccount({ privateKey, ...name && { name } });
163
+ const account = this.chain.name === "solana" ? await this.client.solana.importAccount({ privateKey, ...name && { name } }) : await this.client.evm.importAccount({
164
+ privateKey: privateKey.startsWith("0x") ? privateKey : `0x${privateKey}`,
165
+ ...name && { name }
166
+ });
130
167
  const walletDetails = {
131
168
  provider: _CoinbaseWalletProvider.PROVIDER_NAME,
132
169
  address: account.address,
@@ -191,49 +228,6 @@ var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
191
228
  }
192
229
  return this.cachedAccount;
193
230
  }
194
- formatTransactionForCoinbase(tx) {
195
- const formatBigInt = (value) => {
196
- if (value === void 0 || value === null) return void 0;
197
- if (typeof value === "bigint") return `0x${value.toString(16)}`;
198
- if (typeof value === "string" && value.startsWith("0x")) return value;
199
- if (typeof value === "string") return `0x${BigInt(value).toString(16)}`;
200
- return `0x${BigInt(value).toString(16)}`;
201
- };
202
- const hasEip1559Fields = tx.maxFeePerGas !== void 0 && tx.maxPriorityFeePerGas !== void 0;
203
- const hasLegacyFields = tx.gasPrice !== void 0 && !hasEip1559Fields;
204
- const formatted = {
205
- to: tx.to,
206
- value: formatBigInt(tx.value) || "0x0",
207
- data: tx.data || "0x",
208
- chainId: typeof tx.chainId === "number" ? tx.chainId : parseInt(String(tx.chainId || this.chain.chainId))
209
- };
210
- if (tx.gasLimit) {
211
- formatted.gas = formatBigInt(tx.gasLimit);
212
- }
213
- if (hasEip1559Fields) {
214
- const maxFee = typeof tx.maxFeePerGas === "bigint" ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas));
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;
219
- formatted.maxFeePerGas = formatBigInt(maxFee);
220
- formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee);
221
- } else if (hasLegacyFields) {
222
- const gasPriceHex = formatBigInt(tx.gasPrice);
223
- const gasPrice = typeof tx.gasPrice === "bigint" ? tx.gasPrice : BigInt(gasPriceHex);
224
- formatted.maxFeePerGas = gasPriceHex;
225
- const priorityFee = gasPrice * 9n / 10n;
226
- formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n);
227
- } else {
228
- const defaultMaxFee = BigInt("1000000000");
229
- formatted.maxFeePerGas = formatBigInt(defaultMaxFee);
230
- formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n);
231
- }
232
- if (tx.nonce !== void 0) {
233
- formatted.nonce = typeof tx.nonce === "number" ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce);
234
- }
235
- return formatted;
236
- }
237
231
  };
238
232
  _CoinbaseWalletProvider.PROVIDER_NAME = "coinbase";
239
233
  var CoinbaseWalletProvider = _CoinbaseWalletProvider;
@@ -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 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":[]}
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 WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@vleap/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 === '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 === '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 === '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","import { WarpAdapterGenericTransaction } from '@vleap/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 '@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":["parsed"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vleap/warps-wallet-coinbase",
3
- "version": "1.0.0-beta.4",
3
+ "version": "1.0.0-beta.6",
4
4
  "description": "Coinbase Server Wallet v2 provider for multiple chains",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -36,9 +36,9 @@
36
36
  },
37
37
  "dependencies": {
38
38
  "@coinbase/cdp-sdk": "^1.0.0",
39
- "@vleap/warps": "^3.0.0-beta.184"
39
+ "@vleap/warps": "^3.0.0-beta.187"
40
40
  },
41
41
  "peerDependencies": {
42
- "@vleap/warps": "^3.0.0-beta.184"
42
+ "@vleap/warps": "^3.0.0-beta.187"
43
43
  }
44
44
  }