@vleap/warps-wallet-coinbase 1.0.0-beta.2
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 +178 -0
- package/dist/index.d.cts +36 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.js +266 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +241 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# @vleap/warps-wallet-coinbase
|
|
2
|
+
|
|
3
|
+
Coinbase Server Wallet v2 provider for Warps SDK. This package enables you to use Coinbase Server Wallet v2 with the Warps SDK for EVM and Solana blockchains.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @vleap/warps-wallet-coinbase
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Prerequisites
|
|
12
|
+
|
|
13
|
+
- `@vleap/warps` core package installed
|
|
14
|
+
- Coinbase Developer Platform account with Server Wallet v2 access
|
|
15
|
+
- Wallet Secret from Coinbase CDP Portal
|
|
16
|
+
|
|
17
|
+
## Features
|
|
18
|
+
|
|
19
|
+
- **Secure Key Management**: Private keys are secured in Coinbase's Trusted Execution Environment (TEE)
|
|
20
|
+
- **Multi-Network Support**: Supports multiple EVM networks (Ethereum, Base, Polygon, Arbitrum, Optimism) and Solana
|
|
21
|
+
- **Account Management**: Create and manage accounts via Coinbase API
|
|
22
|
+
- **Transaction Signing**: Sign transactions securely using Coinbase Server Wallet API
|
|
23
|
+
- **Message Signing**: Sign messages for authentication and verification
|
|
24
|
+
|
|
25
|
+
## Usage
|
|
26
|
+
|
|
27
|
+
### Basic Setup
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { WarpClient } from '@vleap/warps'
|
|
31
|
+
import { getAllEvmAdapters } from '@vleap/warps-adapter-evm'
|
|
32
|
+
import { createCoinbaseWalletProvider } from '@vleap/warps-wallet-coinbase'
|
|
33
|
+
|
|
34
|
+
const config = {
|
|
35
|
+
env: 'testnet',
|
|
36
|
+
user: {
|
|
37
|
+
wallets: {
|
|
38
|
+
ethereum: {
|
|
39
|
+
provider: 'coinbase',
|
|
40
|
+
address: '0x...', // Your Coinbase account address
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
walletProviders: {
|
|
45
|
+
ethereum: {
|
|
46
|
+
coinbase: createCoinbaseWalletProvider({
|
|
47
|
+
walletSecret: process.env.COINBASE_WALLET_SECRET,
|
|
48
|
+
}),
|
|
49
|
+
},
|
|
50
|
+
base: {
|
|
51
|
+
coinbase: createCoinbaseWalletProvider({
|
|
52
|
+
walletSecret: process.env.COINBASE_WALLET_SECRET,
|
|
53
|
+
}),
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const client = new WarpClient(config, {
|
|
59
|
+
chains: getAllEvmAdapters(),
|
|
60
|
+
})
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Creating a Coinbase Account
|
|
64
|
+
|
|
65
|
+
Accounts must be created via the Coinbase API first. You can use the Coinbase CDP SDK or REST API:
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
// Example using Coinbase API (outside of this package)
|
|
69
|
+
const account = await coinbaseApi.createAccount({
|
|
70
|
+
networkId: 'ethereum-sepolia',
|
|
71
|
+
})
|
|
72
|
+
// Then use account.id as externalId in wallet config
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Configuration Options
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
type CoinbaseProviderConfig = {
|
|
79
|
+
walletSecret: string // Required: Your Coinbase Wallet Secret
|
|
80
|
+
apiUrl?: string // Optional: Custom API URL (default: https://api.cdp.coinbase.com)
|
|
81
|
+
networkId?: string // Optional: Override network ID mapping
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Supported Networks
|
|
86
|
+
|
|
87
|
+
The provider automatically maps chain names and environments to Coinbase network IDs:
|
|
88
|
+
|
|
89
|
+
- **Ethereum**: `ethereum-mainnet`, `ethereum-sepolia`
|
|
90
|
+
- **Base**: `base-mainnet`, `base-sepolia`
|
|
91
|
+
- **Polygon**: `polygon-mainnet`, `polygon-amoy`
|
|
92
|
+
- **Arbitrum**: `arbitrum-mainnet`, `arbitrum-sepolia`
|
|
93
|
+
- **Optimism**: `optimism-mainnet`, `optimism-sepolia`
|
|
94
|
+
- **Solana**: `solana-mainnet`, `solana-devnet`
|
|
95
|
+
|
|
96
|
+
You can override the network ID by providing it in the config.
|
|
97
|
+
|
|
98
|
+
## API
|
|
99
|
+
|
|
100
|
+
### `CoinbaseWalletProvider`
|
|
101
|
+
|
|
102
|
+
Implements the `WalletProvider` interface from `@vleap/warps`.
|
|
103
|
+
|
|
104
|
+
**Methods:**
|
|
105
|
+
|
|
106
|
+
- `getAddress(): Promise<string | null>` - Get the wallet address from Coinbase account
|
|
107
|
+
- `getPublicKey(): Promise<string | null>` - Get the public key from Coinbase account
|
|
108
|
+
- `signTransaction(tx: any): Promise<any>` - Sign a transaction using Coinbase API
|
|
109
|
+
- `signMessage(message: string): Promise<string>` - Sign a message using Coinbase API
|
|
110
|
+
- `create(mnemonic: string): Promise<WarpWalletDetails>` - Not supported (throws error)
|
|
111
|
+
- `generate(): Promise<WarpWalletDetails>` - Create a new Coinbase account asynchronously
|
|
112
|
+
|
|
113
|
+
### `createCoinbaseWalletProvider`
|
|
114
|
+
|
|
115
|
+
Factory function to create a Coinbase wallet provider factory.
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
const providerFactory = createCoinbaseWalletProvider({
|
|
119
|
+
walletSecret: 'your-wallet-secret',
|
|
120
|
+
})
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Security
|
|
124
|
+
|
|
125
|
+
- **Wallet Secret**: Never commit your Wallet Secret to version control. Use environment variables or secure secret management.
|
|
126
|
+
- **Private Keys**: Private keys are never exposed - they remain secure in Coinbase's TEE.
|
|
127
|
+
- **API Authentication**: All API calls are authenticated using the Wallet Secret in the Authorization header.
|
|
128
|
+
|
|
129
|
+
## Error Handling
|
|
130
|
+
|
|
131
|
+
The provider includes comprehensive error handling:
|
|
132
|
+
|
|
133
|
+
- Missing Wallet Secret
|
|
134
|
+
- Invalid account IDs
|
|
135
|
+
- API request failures
|
|
136
|
+
- Network errors
|
|
137
|
+
- Transaction signing failures
|
|
138
|
+
|
|
139
|
+
All errors include descriptive messages to help with debugging.
|
|
140
|
+
|
|
141
|
+
## Limitations
|
|
142
|
+
|
|
143
|
+
- `create()` and `generate()` methods are not supported as account creation must be done via Coinbase API first
|
|
144
|
+
- Accounts must be created before use - the account ID (externalId) must be provided in wallet config
|
|
145
|
+
- Network ID mapping may not cover all chains - use explicit `networkId` in config for unsupported chains
|
|
146
|
+
|
|
147
|
+
## Examples
|
|
148
|
+
|
|
149
|
+
### Signing a Transaction
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
const wallet = client.getWallet('ethereum')
|
|
153
|
+
const tx = {
|
|
154
|
+
to: '0x...',
|
|
155
|
+
value: '1000000000000000000',
|
|
156
|
+
data: '0x',
|
|
157
|
+
gasLimit: 21000,
|
|
158
|
+
maxFeePerGas: 20000000000n,
|
|
159
|
+
maxPriorityFeePerGas: 1000000000n,
|
|
160
|
+
nonce: 0,
|
|
161
|
+
chainId: 11155111,
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const signedTx = await wallet.signTransaction(tx)
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Signing a Message
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
const wallet = client.getWallet('ethereum')
|
|
171
|
+
const message = 'Hello, World!'
|
|
172
|
+
const signature = await wallet.signMessage(message)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Resources
|
|
176
|
+
|
|
177
|
+
- [Coinbase Server Wallet v2 Documentation](https://docs.cdp.coinbase.com/server-wallets/v2/introduction/welcome)
|
|
178
|
+
- [Coinbase Developer Platform](https://portal.cdp.coinbase.com/)
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { WalletProvider, WarpWalletProvider, WarpClientConfig, WarpChainInfo, WarpAdapterGenericTransaction, WarpWalletDetails, WalletProviderFactory } from '@vleap/warps';
|
|
2
|
+
|
|
3
|
+
type CoinbaseProviderConfig = {
|
|
4
|
+
apiKeyId: string;
|
|
5
|
+
apiKeySecret: string;
|
|
6
|
+
walletSecret: string;
|
|
7
|
+
apiUrl?: string;
|
|
8
|
+
networkId?: string;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
declare class CoinbaseWalletProvider implements WalletProvider {
|
|
12
|
+
private readonly config;
|
|
13
|
+
private readonly chain;
|
|
14
|
+
private readonly coinbaseConfig;
|
|
15
|
+
static readonly PROVIDER_NAME: WarpWalletProvider;
|
|
16
|
+
private readonly client;
|
|
17
|
+
private cachedAccount;
|
|
18
|
+
private cachedEvmAccount;
|
|
19
|
+
constructor(config: WarpClientConfig, chain: WarpChainInfo, coinbaseConfig: CoinbaseProviderConfig);
|
|
20
|
+
getAddress(): Promise<string | null>;
|
|
21
|
+
getPublicKey(): Promise<string | null>;
|
|
22
|
+
signTransaction(tx: WarpAdapterGenericTransaction): Promise<WarpAdapterGenericTransaction>;
|
|
23
|
+
signMessage(message: string): Promise<string>;
|
|
24
|
+
importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails>;
|
|
25
|
+
importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails>;
|
|
26
|
+
export(): Promise<WarpWalletDetails>;
|
|
27
|
+
generate(): Promise<WarpWalletDetails>;
|
|
28
|
+
private getWalletAddress;
|
|
29
|
+
private extractPublicKey;
|
|
30
|
+
private getAccount;
|
|
31
|
+
private formatTransactionForCoinbase;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
declare const createCoinbaseWalletProvider: (coinbaseConfig: CoinbaseProviderConfig) => WalletProviderFactory;
|
|
35
|
+
|
|
36
|
+
export { type CoinbaseProviderConfig, CoinbaseWalletProvider, createCoinbaseWalletProvider };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { WalletProvider, WarpWalletProvider, WarpClientConfig, WarpChainInfo, WarpAdapterGenericTransaction, WarpWalletDetails, WalletProviderFactory } from '@vleap/warps';
|
|
2
|
+
|
|
3
|
+
type CoinbaseProviderConfig = {
|
|
4
|
+
apiKeyId: string;
|
|
5
|
+
apiKeySecret: string;
|
|
6
|
+
walletSecret: string;
|
|
7
|
+
apiUrl?: string;
|
|
8
|
+
networkId?: string;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
declare class CoinbaseWalletProvider implements WalletProvider {
|
|
12
|
+
private readonly config;
|
|
13
|
+
private readonly chain;
|
|
14
|
+
private readonly coinbaseConfig;
|
|
15
|
+
static readonly PROVIDER_NAME: WarpWalletProvider;
|
|
16
|
+
private readonly client;
|
|
17
|
+
private cachedAccount;
|
|
18
|
+
private cachedEvmAccount;
|
|
19
|
+
constructor(config: WarpClientConfig, chain: WarpChainInfo, coinbaseConfig: CoinbaseProviderConfig);
|
|
20
|
+
getAddress(): Promise<string | null>;
|
|
21
|
+
getPublicKey(): Promise<string | null>;
|
|
22
|
+
signTransaction(tx: WarpAdapterGenericTransaction): Promise<WarpAdapterGenericTransaction>;
|
|
23
|
+
signMessage(message: string): Promise<string>;
|
|
24
|
+
importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails>;
|
|
25
|
+
importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails>;
|
|
26
|
+
export(): Promise<WarpWalletDetails>;
|
|
27
|
+
generate(): Promise<WarpWalletDetails>;
|
|
28
|
+
private getWalletAddress;
|
|
29
|
+
private extractPublicKey;
|
|
30
|
+
private getAccount;
|
|
31
|
+
private formatTransactionForCoinbase;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
declare const createCoinbaseWalletProvider: (coinbaseConfig: CoinbaseProviderConfig) => WalletProviderFactory;
|
|
35
|
+
|
|
36
|
+
export { type CoinbaseProviderConfig, CoinbaseWalletProvider, createCoinbaseWalletProvider };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
CoinbaseWalletProvider: () => CoinbaseWalletProvider,
|
|
24
|
+
createCoinbaseWalletProvider: () => createCoinbaseWalletProvider
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(index_exports);
|
|
27
|
+
|
|
28
|
+
// src/CoinbaseWalletProvider.ts
|
|
29
|
+
var import_cdp_sdk = require("@coinbase/cdp-sdk");
|
|
30
|
+
var import_warps = require("@vleap/warps");
|
|
31
|
+
var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
|
|
32
|
+
constructor(config, chain, coinbaseConfig) {
|
|
33
|
+
this.config = config;
|
|
34
|
+
this.chain = chain;
|
|
35
|
+
this.coinbaseConfig = coinbaseConfig;
|
|
36
|
+
this.cachedAccount = null;
|
|
37
|
+
this.cachedEvmAccount = null;
|
|
38
|
+
this.client = new import_cdp_sdk.CdpClient({
|
|
39
|
+
apiKeyId: coinbaseConfig.apiKeyId,
|
|
40
|
+
apiKeySecret: coinbaseConfig.apiKeySecret,
|
|
41
|
+
walletSecret: coinbaseConfig.walletSecret,
|
|
42
|
+
...coinbaseConfig.apiUrl && { apiUrl: coinbaseConfig.apiUrl }
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async getAddress() {
|
|
46
|
+
try {
|
|
47
|
+
return (await this.getAccount()).address;
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.error("CoinbaseWalletProvider: Failed to get address", error);
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async getPublicKey() {
|
|
54
|
+
try {
|
|
55
|
+
return (await this.getAccount()).publicKey ?? null;
|
|
56
|
+
} catch (error) {
|
|
57
|
+
console.error("CoinbaseWalletProvider: Failed to get public key", error);
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
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
|
+
formatted.maxFeePerGas = formatBigInt(maxFee);
|
|
84
|
+
const safePriorityFee = maxPriorityFee < maxFee ? maxPriorityFee : maxFee / 10n;
|
|
85
|
+
formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee);
|
|
86
|
+
} else if (hasLegacyFields) {
|
|
87
|
+
const gasPriceHex = formatBigInt(tx.gasPrice);
|
|
88
|
+
const gasPrice = typeof tx.gasPrice === "bigint" ? tx.gasPrice : BigInt(gasPriceHex);
|
|
89
|
+
formatted.maxFeePerGas = gasPriceHex;
|
|
90
|
+
const priorityFee = gasPrice * 9n / 10n;
|
|
91
|
+
formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n);
|
|
92
|
+
} else {
|
|
93
|
+
const defaultMaxFee = BigInt("1000000000");
|
|
94
|
+
formatted.maxFeePerGas = formatBigInt(defaultMaxFee);
|
|
95
|
+
formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n);
|
|
96
|
+
}
|
|
97
|
+
if (tx.nonce !== void 0) {
|
|
98
|
+
formatted.nonce = typeof tx.nonce === "number" ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce);
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
const account = await this.getAccount();
|
|
102
|
+
if (this.chain.name === "solana") {
|
|
103
|
+
const result = await this.client.solana.signTransaction({
|
|
104
|
+
address: account.id,
|
|
105
|
+
transaction: tx
|
|
106
|
+
});
|
|
107
|
+
if ("signedTransaction" in result && result.signedTransaction) {
|
|
108
|
+
return { ...tx, signature: String(result.signedTransaction) };
|
|
109
|
+
}
|
|
110
|
+
throw new Error("Coinbase API did not return signed transaction");
|
|
111
|
+
}
|
|
112
|
+
if (!this.cachedEvmAccount) {
|
|
113
|
+
const address = this.getWalletAddress();
|
|
114
|
+
const evmAccount = await this.client.evm.getAccount({ address });
|
|
115
|
+
if (!("signTransaction" in evmAccount)) {
|
|
116
|
+
throw new Error("CoinbaseWalletProvider: Account object missing signTransaction method. This may be a SDK version issue.");
|
|
117
|
+
}
|
|
118
|
+
this.cachedEvmAccount = { signTransaction: evmAccount.signTransaction };
|
|
119
|
+
}
|
|
120
|
+
const formattedTx = this.formatTransactionForCoinbase(tx);
|
|
121
|
+
const signedTx = await this.cachedEvmAccount.signTransaction(formattedTx);
|
|
122
|
+
return { ...tx, signature: signedTx };
|
|
123
|
+
} catch (error) {
|
|
124
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
125
|
+
if (errorMessage.includes("signTransaction is not a function")) {
|
|
126
|
+
throw new Error("CoinbaseWalletProvider: Account object missing signTransaction method. This may be a SDK version issue.");
|
|
127
|
+
}
|
|
128
|
+
throw new Error(`CoinbaseWalletProvider: Failed to sign transaction: ${error}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async signMessage(message) {
|
|
132
|
+
try {
|
|
133
|
+
const account = await this.getAccount();
|
|
134
|
+
const result = this.chain.name === "solana" ? await this.client.solana.signMessage({ address: account.id, message }) : await this.client.evm.signMessage({ address: account.id, message });
|
|
135
|
+
if ("signedMessage" in result && result.signedMessage) {
|
|
136
|
+
return String(result.signedMessage);
|
|
137
|
+
}
|
|
138
|
+
throw new Error("Coinbase API did not return signed message");
|
|
139
|
+
} catch (error) {
|
|
140
|
+
throw new Error(`CoinbaseWalletProvider: Failed to sign message: ${error}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async importFromMnemonic(mnemonic) {
|
|
144
|
+
throw new Error(
|
|
145
|
+
"CoinbaseWalletProvider: importFromMnemonic() is not supported. Use generate() to create a new account via Coinbase API."
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
async importFromPrivateKey(privateKey) {
|
|
149
|
+
try {
|
|
150
|
+
const name = this.config.user?.id ? `${this.config.user.id}-${this.chain.name}` : void 0;
|
|
151
|
+
const account = this.chain.name === "solana" ? await this.client.solana.importAccount({ privateKey, ...name && { name } }) : await this.client.evm.importAccount({ privateKey, ...name && { name } });
|
|
152
|
+
const walletDetails = {
|
|
153
|
+
provider: _CoinbaseWalletProvider.PROVIDER_NAME,
|
|
154
|
+
address: account.address,
|
|
155
|
+
privateKey
|
|
156
|
+
};
|
|
157
|
+
(0, import_warps.setWarpWalletInConfig)(this.config, this.chain.name, walletDetails);
|
|
158
|
+
return walletDetails;
|
|
159
|
+
} catch (error) {
|
|
160
|
+
throw new Error(`CoinbaseWalletProvider: Failed to import account from private key: ${error}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async export() {
|
|
164
|
+
try {
|
|
165
|
+
const address = this.getWalletAddress();
|
|
166
|
+
const privateKey = this.chain.name === "solana" ? await this.client.solana.exportAccount({ address }) : await this.client.evm.exportAccount({ address });
|
|
167
|
+
return {
|
|
168
|
+
provider: _CoinbaseWalletProvider.PROVIDER_NAME,
|
|
169
|
+
address,
|
|
170
|
+
privateKey
|
|
171
|
+
};
|
|
172
|
+
} catch (error) {
|
|
173
|
+
throw new Error(`CoinbaseWalletProvider: Failed to export account: ${error}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async generate() {
|
|
177
|
+
try {
|
|
178
|
+
const account = this.chain.name === "solana" ? await this.client.solana.createAccount() : await this.client.evm.createAccount();
|
|
179
|
+
const walletDetails = {
|
|
180
|
+
provider: _CoinbaseWalletProvider.PROVIDER_NAME,
|
|
181
|
+
address: account.address
|
|
182
|
+
};
|
|
183
|
+
(0, import_warps.setWarpWalletInConfig)(this.config, this.chain.name, walletDetails);
|
|
184
|
+
return walletDetails;
|
|
185
|
+
} catch (error) {
|
|
186
|
+
throw new Error(`CoinbaseWalletProvider: Failed to generate account: ${error}`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
getWalletAddress() {
|
|
190
|
+
const address = (0, import_warps.getWarpWalletAddressFromConfig)(this.config, this.chain.name);
|
|
191
|
+
if (!address) throw new Error(`CoinbaseWalletProvider: Wallet address not found in config for chain ${this.chain.name}`);
|
|
192
|
+
return address;
|
|
193
|
+
}
|
|
194
|
+
extractPublicKey(account) {
|
|
195
|
+
return account.publicKey;
|
|
196
|
+
}
|
|
197
|
+
async getAccount() {
|
|
198
|
+
if (this.cachedAccount) return this.cachedAccount;
|
|
199
|
+
const address = this.getWalletAddress();
|
|
200
|
+
const account = this.chain.name === "solana" ? await this.client.solana.getAccount({ address }) : await this.client.evm.getAccount({ address });
|
|
201
|
+
const publicKey = this.extractPublicKey(account);
|
|
202
|
+
this.cachedAccount = {
|
|
203
|
+
id: account.address,
|
|
204
|
+
address: account.address,
|
|
205
|
+
...publicKey && { publicKey }
|
|
206
|
+
};
|
|
207
|
+
if (this.chain.name !== "solana" && "signTransaction" in account) {
|
|
208
|
+
this.cachedEvmAccount = { signTransaction: account.signTransaction };
|
|
209
|
+
}
|
|
210
|
+
return this.cachedAccount;
|
|
211
|
+
}
|
|
212
|
+
formatTransactionForCoinbase(tx) {
|
|
213
|
+
const formatBigInt = (value) => {
|
|
214
|
+
if (value === void 0 || value === null) return void 0;
|
|
215
|
+
if (typeof value === "bigint") return `0x${value.toString(16)}`;
|
|
216
|
+
if (typeof value === "string" && value.startsWith("0x")) return value;
|
|
217
|
+
if (typeof value === "string") return `0x${BigInt(value).toString(16)}`;
|
|
218
|
+
return `0x${BigInt(value).toString(16)}`;
|
|
219
|
+
};
|
|
220
|
+
const hasEip1559Fields = tx.maxFeePerGas !== void 0 && tx.maxPriorityFeePerGas !== void 0;
|
|
221
|
+
const hasLegacyFields = tx.gasPrice !== void 0 && !hasEip1559Fields;
|
|
222
|
+
const formatted = {
|
|
223
|
+
to: tx.to,
|
|
224
|
+
value: formatBigInt(tx.value) || "0x0",
|
|
225
|
+
data: tx.data || "0x",
|
|
226
|
+
chainId: typeof tx.chainId === "number" ? tx.chainId : parseInt(String(tx.chainId || this.chain.chainId))
|
|
227
|
+
};
|
|
228
|
+
if (tx.gasLimit) {
|
|
229
|
+
formatted.gas = formatBigInt(tx.gasLimit);
|
|
230
|
+
}
|
|
231
|
+
if (hasEip1559Fields) {
|
|
232
|
+
const maxFee = typeof tx.maxFeePerGas === "bigint" ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas));
|
|
233
|
+
const maxPriorityFee = typeof tx.maxPriorityFeePerGas === "bigint" ? tx.maxPriorityFeePerGas : BigInt(formatBigInt(tx.maxPriorityFeePerGas));
|
|
234
|
+
formatted.maxFeePerGas = formatBigInt(maxFee);
|
|
235
|
+
const safePriorityFee = maxPriorityFee < maxFee ? maxPriorityFee : maxFee / 10n;
|
|
236
|
+
formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee);
|
|
237
|
+
} else if (hasLegacyFields) {
|
|
238
|
+
const gasPriceHex = formatBigInt(tx.gasPrice);
|
|
239
|
+
const gasPrice = typeof tx.gasPrice === "bigint" ? tx.gasPrice : BigInt(gasPriceHex);
|
|
240
|
+
formatted.maxFeePerGas = gasPriceHex;
|
|
241
|
+
const priorityFee = gasPrice * 9n / 10n;
|
|
242
|
+
formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n);
|
|
243
|
+
} else {
|
|
244
|
+
const defaultMaxFee = BigInt("1000000000");
|
|
245
|
+
formatted.maxFeePerGas = formatBigInt(defaultMaxFee);
|
|
246
|
+
formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n);
|
|
247
|
+
}
|
|
248
|
+
if (tx.nonce !== void 0) {
|
|
249
|
+
formatted.nonce = typeof tx.nonce === "number" ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce);
|
|
250
|
+
}
|
|
251
|
+
return formatted;
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
_CoinbaseWalletProvider.PROVIDER_NAME = "coinbase";
|
|
255
|
+
var CoinbaseWalletProvider = _CoinbaseWalletProvider;
|
|
256
|
+
|
|
257
|
+
// src/helpers.ts
|
|
258
|
+
var createCoinbaseWalletProvider = (coinbaseConfig) => {
|
|
259
|
+
return (config, chain) => new CoinbaseWalletProvider(config, chain, coinbaseConfig);
|
|
260
|
+
};
|
|
261
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
262
|
+
0 && (module.exports = {
|
|
263
|
+
CoinbaseWalletProvider,
|
|
264
|
+
createCoinbaseWalletProvider
|
|
265
|
+
});
|
|
266
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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":[]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
// src/CoinbaseWalletProvider.ts
|
|
2
|
+
import { CdpClient } from "@coinbase/cdp-sdk";
|
|
3
|
+
import {
|
|
4
|
+
getWarpWalletAddressFromConfig,
|
|
5
|
+
setWarpWalletInConfig
|
|
6
|
+
} from "@vleap/warps";
|
|
7
|
+
var _CoinbaseWalletProvider = class _CoinbaseWalletProvider {
|
|
8
|
+
constructor(config, chain, coinbaseConfig) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
this.chain = chain;
|
|
11
|
+
this.coinbaseConfig = coinbaseConfig;
|
|
12
|
+
this.cachedAccount = null;
|
|
13
|
+
this.cachedEvmAccount = null;
|
|
14
|
+
this.client = new CdpClient({
|
|
15
|
+
apiKeyId: coinbaseConfig.apiKeyId,
|
|
16
|
+
apiKeySecret: coinbaseConfig.apiKeySecret,
|
|
17
|
+
walletSecret: coinbaseConfig.walletSecret,
|
|
18
|
+
...coinbaseConfig.apiUrl && { apiUrl: coinbaseConfig.apiUrl }
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async getAddress() {
|
|
22
|
+
try {
|
|
23
|
+
return (await this.getAccount()).address;
|
|
24
|
+
} catch (error) {
|
|
25
|
+
console.error("CoinbaseWalletProvider: Failed to get address", error);
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async getPublicKey() {
|
|
30
|
+
try {
|
|
31
|
+
return (await this.getAccount()).publicKey ?? null;
|
|
32
|
+
} catch (error) {
|
|
33
|
+
console.error("CoinbaseWalletProvider: Failed to get public key", error);
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
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
|
+
formatted.maxFeePerGas = formatBigInt(maxFee);
|
|
60
|
+
const safePriorityFee = maxPriorityFee < maxFee ? maxPriorityFee : maxFee / 10n;
|
|
61
|
+
formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee);
|
|
62
|
+
} else if (hasLegacyFields) {
|
|
63
|
+
const gasPriceHex = formatBigInt(tx.gasPrice);
|
|
64
|
+
const gasPrice = typeof tx.gasPrice === "bigint" ? tx.gasPrice : BigInt(gasPriceHex);
|
|
65
|
+
formatted.maxFeePerGas = gasPriceHex;
|
|
66
|
+
const priorityFee = gasPrice * 9n / 10n;
|
|
67
|
+
formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n);
|
|
68
|
+
} else {
|
|
69
|
+
const defaultMaxFee = BigInt("1000000000");
|
|
70
|
+
formatted.maxFeePerGas = formatBigInt(defaultMaxFee);
|
|
71
|
+
formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n);
|
|
72
|
+
}
|
|
73
|
+
if (tx.nonce !== void 0) {
|
|
74
|
+
formatted.nonce = typeof tx.nonce === "number" ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce);
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const account = await this.getAccount();
|
|
78
|
+
if (this.chain.name === "solana") {
|
|
79
|
+
const result = await this.client.solana.signTransaction({
|
|
80
|
+
address: account.id,
|
|
81
|
+
transaction: tx
|
|
82
|
+
});
|
|
83
|
+
if ("signedTransaction" in result && result.signedTransaction) {
|
|
84
|
+
return { ...tx, signature: String(result.signedTransaction) };
|
|
85
|
+
}
|
|
86
|
+
throw new Error("Coinbase API did not return signed transaction");
|
|
87
|
+
}
|
|
88
|
+
if (!this.cachedEvmAccount) {
|
|
89
|
+
const address = this.getWalletAddress();
|
|
90
|
+
const evmAccount = await this.client.evm.getAccount({ address });
|
|
91
|
+
if (!("signTransaction" in evmAccount)) {
|
|
92
|
+
throw new Error("CoinbaseWalletProvider: Account object missing signTransaction method. This may be a SDK version issue.");
|
|
93
|
+
}
|
|
94
|
+
this.cachedEvmAccount = { signTransaction: evmAccount.signTransaction };
|
|
95
|
+
}
|
|
96
|
+
const formattedTx = this.formatTransactionForCoinbase(tx);
|
|
97
|
+
const signedTx = await this.cachedEvmAccount.signTransaction(formattedTx);
|
|
98
|
+
return { ...tx, signature: signedTx };
|
|
99
|
+
} catch (error) {
|
|
100
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
101
|
+
if (errorMessage.includes("signTransaction is not a function")) {
|
|
102
|
+
throw new Error("CoinbaseWalletProvider: Account object missing signTransaction method. This may be a SDK version issue.");
|
|
103
|
+
}
|
|
104
|
+
throw new Error(`CoinbaseWalletProvider: Failed to sign transaction: ${error}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async signMessage(message) {
|
|
108
|
+
try {
|
|
109
|
+
const account = await this.getAccount();
|
|
110
|
+
const result = this.chain.name === "solana" ? await this.client.solana.signMessage({ address: account.id, message }) : await this.client.evm.signMessage({ address: account.id, message });
|
|
111
|
+
if ("signedMessage" in result && result.signedMessage) {
|
|
112
|
+
return String(result.signedMessage);
|
|
113
|
+
}
|
|
114
|
+
throw new Error("Coinbase API did not return signed message");
|
|
115
|
+
} catch (error) {
|
|
116
|
+
throw new Error(`CoinbaseWalletProvider: Failed to sign message: ${error}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async importFromMnemonic(mnemonic) {
|
|
120
|
+
throw new Error(
|
|
121
|
+
"CoinbaseWalletProvider: importFromMnemonic() is not supported. Use generate() to create a new account via Coinbase API."
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
async importFromPrivateKey(privateKey) {
|
|
125
|
+
try {
|
|
126
|
+
const name = this.config.user?.id ? `${this.config.user.id}-${this.chain.name}` : void 0;
|
|
127
|
+
const account = this.chain.name === "solana" ? await this.client.solana.importAccount({ privateKey, ...name && { name } }) : await this.client.evm.importAccount({ privateKey, ...name && { name } });
|
|
128
|
+
const walletDetails = {
|
|
129
|
+
provider: _CoinbaseWalletProvider.PROVIDER_NAME,
|
|
130
|
+
address: account.address,
|
|
131
|
+
privateKey
|
|
132
|
+
};
|
|
133
|
+
setWarpWalletInConfig(this.config, this.chain.name, walletDetails);
|
|
134
|
+
return walletDetails;
|
|
135
|
+
} catch (error) {
|
|
136
|
+
throw new Error(`CoinbaseWalletProvider: Failed to import account from private key: ${error}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async export() {
|
|
140
|
+
try {
|
|
141
|
+
const address = this.getWalletAddress();
|
|
142
|
+
const privateKey = this.chain.name === "solana" ? await this.client.solana.exportAccount({ address }) : await this.client.evm.exportAccount({ address });
|
|
143
|
+
return {
|
|
144
|
+
provider: _CoinbaseWalletProvider.PROVIDER_NAME,
|
|
145
|
+
address,
|
|
146
|
+
privateKey
|
|
147
|
+
};
|
|
148
|
+
} catch (error) {
|
|
149
|
+
throw new Error(`CoinbaseWalletProvider: Failed to export account: ${error}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async generate() {
|
|
153
|
+
try {
|
|
154
|
+
const account = this.chain.name === "solana" ? await this.client.solana.createAccount() : await this.client.evm.createAccount();
|
|
155
|
+
const walletDetails = {
|
|
156
|
+
provider: _CoinbaseWalletProvider.PROVIDER_NAME,
|
|
157
|
+
address: account.address
|
|
158
|
+
};
|
|
159
|
+
setWarpWalletInConfig(this.config, this.chain.name, walletDetails);
|
|
160
|
+
return walletDetails;
|
|
161
|
+
} catch (error) {
|
|
162
|
+
throw new Error(`CoinbaseWalletProvider: Failed to generate account: ${error}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
getWalletAddress() {
|
|
166
|
+
const address = getWarpWalletAddressFromConfig(this.config, this.chain.name);
|
|
167
|
+
if (!address) throw new Error(`CoinbaseWalletProvider: Wallet address not found in config for chain ${this.chain.name}`);
|
|
168
|
+
return address;
|
|
169
|
+
}
|
|
170
|
+
extractPublicKey(account) {
|
|
171
|
+
return account.publicKey;
|
|
172
|
+
}
|
|
173
|
+
async getAccount() {
|
|
174
|
+
if (this.cachedAccount) return this.cachedAccount;
|
|
175
|
+
const address = this.getWalletAddress();
|
|
176
|
+
const account = this.chain.name === "solana" ? await this.client.solana.getAccount({ address }) : await this.client.evm.getAccount({ address });
|
|
177
|
+
const publicKey = this.extractPublicKey(account);
|
|
178
|
+
this.cachedAccount = {
|
|
179
|
+
id: account.address,
|
|
180
|
+
address: account.address,
|
|
181
|
+
...publicKey && { publicKey }
|
|
182
|
+
};
|
|
183
|
+
if (this.chain.name !== "solana" && "signTransaction" in account) {
|
|
184
|
+
this.cachedEvmAccount = { signTransaction: account.signTransaction };
|
|
185
|
+
}
|
|
186
|
+
return this.cachedAccount;
|
|
187
|
+
}
|
|
188
|
+
formatTransactionForCoinbase(tx) {
|
|
189
|
+
const formatBigInt = (value) => {
|
|
190
|
+
if (value === void 0 || value === null) return void 0;
|
|
191
|
+
if (typeof value === "bigint") return `0x${value.toString(16)}`;
|
|
192
|
+
if (typeof value === "string" && value.startsWith("0x")) return value;
|
|
193
|
+
if (typeof value === "string") return `0x${BigInt(value).toString(16)}`;
|
|
194
|
+
return `0x${BigInt(value).toString(16)}`;
|
|
195
|
+
};
|
|
196
|
+
const hasEip1559Fields = tx.maxFeePerGas !== void 0 && tx.maxPriorityFeePerGas !== void 0;
|
|
197
|
+
const hasLegacyFields = tx.gasPrice !== void 0 && !hasEip1559Fields;
|
|
198
|
+
const formatted = {
|
|
199
|
+
to: tx.to,
|
|
200
|
+
value: formatBigInt(tx.value) || "0x0",
|
|
201
|
+
data: tx.data || "0x",
|
|
202
|
+
chainId: typeof tx.chainId === "number" ? tx.chainId : parseInt(String(tx.chainId || this.chain.chainId))
|
|
203
|
+
};
|
|
204
|
+
if (tx.gasLimit) {
|
|
205
|
+
formatted.gas = formatBigInt(tx.gasLimit);
|
|
206
|
+
}
|
|
207
|
+
if (hasEip1559Fields) {
|
|
208
|
+
const maxFee = typeof tx.maxFeePerGas === "bigint" ? tx.maxFeePerGas : BigInt(formatBigInt(tx.maxFeePerGas));
|
|
209
|
+
const maxPriorityFee = typeof tx.maxPriorityFeePerGas === "bigint" ? tx.maxPriorityFeePerGas : BigInt(formatBigInt(tx.maxPriorityFeePerGas));
|
|
210
|
+
formatted.maxFeePerGas = formatBigInt(maxFee);
|
|
211
|
+
const safePriorityFee = maxPriorityFee < maxFee ? maxPriorityFee : maxFee / 10n;
|
|
212
|
+
formatted.maxPriorityFeePerGas = formatBigInt(safePriorityFee);
|
|
213
|
+
} else if (hasLegacyFields) {
|
|
214
|
+
const gasPriceHex = formatBigInt(tx.gasPrice);
|
|
215
|
+
const gasPrice = typeof tx.gasPrice === "bigint" ? tx.gasPrice : BigInt(gasPriceHex);
|
|
216
|
+
formatted.maxFeePerGas = gasPriceHex;
|
|
217
|
+
const priorityFee = gasPrice * 9n / 10n;
|
|
218
|
+
formatted.maxPriorityFeePerGas = formatBigInt(priorityFee > 0n ? priorityFee : 1n);
|
|
219
|
+
} else {
|
|
220
|
+
const defaultMaxFee = BigInt("1000000000");
|
|
221
|
+
formatted.maxFeePerGas = formatBigInt(defaultMaxFee);
|
|
222
|
+
formatted.maxPriorityFeePerGas = formatBigInt(defaultMaxFee / 10n);
|
|
223
|
+
}
|
|
224
|
+
if (tx.nonce !== void 0) {
|
|
225
|
+
formatted.nonce = typeof tx.nonce === "number" ? `0x${tx.nonce.toString(16)}` : formatBigInt(tx.nonce);
|
|
226
|
+
}
|
|
227
|
+
return formatted;
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
_CoinbaseWalletProvider.PROVIDER_NAME = "coinbase";
|
|
231
|
+
var CoinbaseWalletProvider = _CoinbaseWalletProvider;
|
|
232
|
+
|
|
233
|
+
// src/helpers.ts
|
|
234
|
+
var createCoinbaseWalletProvider = (coinbaseConfig) => {
|
|
235
|
+
return (config, chain) => new CoinbaseWalletProvider(config, chain, coinbaseConfig);
|
|
236
|
+
};
|
|
237
|
+
export {
|
|
238
|
+
CoinbaseWalletProvider,
|
|
239
|
+
createCoinbaseWalletProvider
|
|
240
|
+
};
|
|
241
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +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":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vleap/warps-wallet-coinbase",
|
|
3
|
+
"version": "1.0.0-beta.2",
|
|
4
|
+
"description": "Coinbase Server Wallet v2 provider for multiple chains",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.mjs",
|
|
11
|
+
"require": "./dist/index.js",
|
|
12
|
+
"default": "./dist/index.mjs"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsup",
|
|
17
|
+
"test": "jest --config jest.config.mjs",
|
|
18
|
+
"lint": "tsc --noEmit",
|
|
19
|
+
"prepare": "npm run build",
|
|
20
|
+
"preversion": "npm run lint && npm run build"
|
|
21
|
+
},
|
|
22
|
+
"author": "",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/jest": "^30.0.0",
|
|
29
|
+
"jest": "^30.2.0",
|
|
30
|
+
"ts-jest": "^29.4.6",
|
|
31
|
+
"tsup": "^8.5.1",
|
|
32
|
+
"typescript": "^5.9.3"
|
|
33
|
+
},
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@coinbase/cdp-sdk": "^1.0.0",
|
|
39
|
+
"@vleap/warps": "^3.0.0-beta.184"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@vleap/warps": "^3.0.0-beta.184"
|
|
43
|
+
}
|
|
44
|
+
}
|