@paulstinchcombe/gasless-nft-tx 0.0.1
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 +348 -0
- package/dist/client.d.ts +31 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +104 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/nft-operations.d.ts +37 -0
- package/dist/nft-operations.d.ts.map +1 -0
- package/dist/nft-operations.js +476 -0
- package/dist/nft-operations.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
# 📦 Gasless NFT Transaction Library (EIP-7702/ERC-4337)
|
|
2
|
+
|
|
3
|
+
A robust, production-ready NPM package for Next.js 15 backend environments that allows an **EOA (Externally Owned Account)** to delegate transaction execution to a pre-funded **ERC-4337 Smart Contract Wallet (SCW)** for gas sponsorship, specifically for key NFT operations.
|
|
4
|
+
|
|
5
|
+
## 🎯 Features
|
|
6
|
+
|
|
7
|
+
- **EIP-7702 Delegation**: Seamlessly delegate transaction execution to smart contract wallets
|
|
8
|
+
- **ERC-4337 Gas Sponsorship**: Execute gasless transactions with paymaster support via Pimlico
|
|
9
|
+
- **NFT Operations**: Deploy, mint, and buy NFTs without gas fees
|
|
10
|
+
- **Batch Operations**: Execute multiple operations across different contracts in a single transaction
|
|
11
|
+
- **ERC20 Payments**: Buy NFTs using ERC20 tokens (USDC, etc.) with automatic transfers
|
|
12
|
+
- **Quantity Support**: Batch minting and purchasing with quantity parameters
|
|
13
|
+
- **TypeScript Support**: Full type safety and IntelliSense support
|
|
14
|
+
- **Multiple NFT Standards**: Support for ERC-721, ERC-721A, and ERC-1155
|
|
15
|
+
- **Comprehensive Testing**: Full test suite with 26 passing tests
|
|
16
|
+
|
|
17
|
+
## 🚀 Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install @paulstinchcombe/gasless-nft-tx
|
|
21
|
+
# or
|
|
22
|
+
pnpm add @paulstinchcombe/gasless-nft-tx
|
|
23
|
+
# or
|
|
24
|
+
yarn add @paulstinchcombe/gasless-nft-tx
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 📖 Usage
|
|
28
|
+
|
|
29
|
+
### 1. Initialize the Client
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { initDelegatorClient } from '@paulstinchcombe/gasless-nft-tx';
|
|
33
|
+
|
|
34
|
+
const client = await initDelegatorClient({
|
|
35
|
+
rpcUrl: 'https://sepolia.infura.io/v3/YOUR_KEY',
|
|
36
|
+
bundlerUrl: 'https://api.pimlico.io/v2/sepolia/rpc',
|
|
37
|
+
paymasterUrl: 'https://api.pimlico.io/v2/sepolia/rpc',
|
|
38
|
+
scwImplAddress: '0x1234567890123456789012345678901234567890',
|
|
39
|
+
entryPointAddress: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',
|
|
40
|
+
pimlicoApiKey: 'YOUR_PIMLICO_API_KEY', // Optional for enhanced features
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 2. Deploy NFT Contract
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
import { deployNftContract } from '@paulstinchcombe/gasless-nft-tx';
|
|
48
|
+
|
|
49
|
+
const bytecode = '0x608060405234801561001057600080fd5b50...'; // Your NFT contract bytecode
|
|
50
|
+
const privateKey = '0x1234567890123456789012345678901234567890123456789012345678901234';
|
|
51
|
+
|
|
52
|
+
const userOpHash = await deployNftContract(client, privateKey, bytecode);
|
|
53
|
+
console.log('Deployment UserOperation Hash:', userOpHash);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 3. Mint NFT Token
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { mintNftToken } from '@paulstinchcombe/gasless-nft-tx';
|
|
60
|
+
|
|
61
|
+
const nftAddress = '0x1234567890123456789012345678901234567890';
|
|
62
|
+
|
|
63
|
+
// Single mint (ERC-721)
|
|
64
|
+
const singleMintData = {
|
|
65
|
+
to: '0x1234567890123456789012345678901234567890',
|
|
66
|
+
tokenId: 1n,
|
|
67
|
+
quantity: 1n, // Default for ERC-721
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// Batch mint (ERC-721A/1155)
|
|
71
|
+
const batchMintData = {
|
|
72
|
+
to: '0x1234567890123456789012345678901234567890',
|
|
73
|
+
quantity: 5n, // Mint 5 tokens
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const userOpHash = await mintNftToken(client, privateKey, nftAddress, singleMintData);
|
|
77
|
+
console.log('Mint UserOperation Hash:', userOpHash);
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 4. Buy NFT with ERC20 Tokens
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
import { buyNftToken } from '@paulstinchcombe/gasless-nft-tx';
|
|
84
|
+
|
|
85
|
+
// Single purchase
|
|
86
|
+
const singleBuyData = {
|
|
87
|
+
nftContractAddress: '0x1234567890123456789012345678901234567890',
|
|
88
|
+
tokenId: 1n,
|
|
89
|
+
quantity: 1n, // Single purchase
|
|
90
|
+
erc20TokenAddress: '0xA0b86a33E6441c8C06DDD4C4C4B4F4c4B4F4c4B4F', // USDC
|
|
91
|
+
price: 1000000n, // 1 USDC (6 decimals)
|
|
92
|
+
recipient: '0x1234567890123456789012345678901234567890',
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Batch purchase (ERC-721A/1155)
|
|
96
|
+
const batchBuyData = {
|
|
97
|
+
nftContractAddress: '0x1234567890123456789012345678901234567890',
|
|
98
|
+
tokenId: 1n,
|
|
99
|
+
quantity: 5n, // Buy 5 tokens
|
|
100
|
+
erc20TokenAddress: '0xA0b86a33E6441c8C06DDD4C4C4B4F4c4B4F4c4B4F', // USDC
|
|
101
|
+
price: 5000000n, // 5 USDC total
|
|
102
|
+
recipient: '0x1234567890123456789012345678901234567890',
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const userOpHash = await buyNftToken(client, privateKey, singleBuyData);
|
|
106
|
+
console.log('Buy UserOperation Hash:', userOpHash);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 5. Batch Operations
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
import { executeBatchOperations } from '@paulstinchcombe/gasless-nft-tx';
|
|
113
|
+
|
|
114
|
+
const operations = [
|
|
115
|
+
{
|
|
116
|
+
type: 'deploy',
|
|
117
|
+
data: { bytecode: '0x6080...' },
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'mint',
|
|
121
|
+
data: {
|
|
122
|
+
nftContractAddress: '0x1111...',
|
|
123
|
+
mintData: { to: '0x2222...', quantity: 5n },
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
type: 'buy',
|
|
128
|
+
data: {
|
|
129
|
+
buyData: {
|
|
130
|
+
nftContractAddress: '0x3333...',
|
|
131
|
+
tokenId: 1n,
|
|
132
|
+
quantity: 2n,
|
|
133
|
+
erc20TokenAddress: '0x4444...',
|
|
134
|
+
price: 2000000n,
|
|
135
|
+
recipient: '0x2222...',
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
];
|
|
140
|
+
|
|
141
|
+
const batchHash = await executeBatchOperations(client, privateKey, operations);
|
|
142
|
+
console.log('Batch Operations Hash:', batchHash);
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 📋 Data Structures
|
|
146
|
+
|
|
147
|
+
### MintData
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
interface MintData {
|
|
151
|
+
to: Address; // Recipient address
|
|
152
|
+
quantity?: bigint; // Number of tokens to mint (defaults to 1 for ERC-721)
|
|
153
|
+
tokenId?: bigint; // Starting token ID (for ERC-721/721A)
|
|
154
|
+
amount?: bigint; // Amount for ERC-1155 (deprecated, use quantity)
|
|
155
|
+
data?: Hex; // Additional data for ERC-1155
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### BuyData
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
interface BuyData {
|
|
163
|
+
nftContractAddress: Address; // NFT contract address
|
|
164
|
+
tokenId: bigint; // Token ID to purchase
|
|
165
|
+
quantity?: bigint; // Number of tokens to buy (defaults to 1)
|
|
166
|
+
erc20TokenAddress: Address; // ERC20 token for payment
|
|
167
|
+
price: bigint; // Total price for the quantity
|
|
168
|
+
recipient: Address; // Recipient address
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### BatchOperation
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
interface BatchOperation {
|
|
176
|
+
type: 'deploy' | 'mint' | 'buy';
|
|
177
|
+
data: DeployOperation | MintOperation | BuyOperation;
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## 🏗️ Architecture
|
|
182
|
+
|
|
183
|
+
The library leverages EIP-7702 to temporarily give the EOA the execution context of a smart contract, combined with ERC-4337's infrastructure for sponsoring transaction fees.
|
|
184
|
+
|
|
185
|
+
### Flow:
|
|
186
|
+
|
|
187
|
+
1. **SCW Initialization**: EOA must have a deployed SCW instance compatible with EIP-7702 delegation
|
|
188
|
+
2. **Transaction Construction**: Library constructs calldata for the target NFT action
|
|
189
|
+
3. **EIP-7702 Delegation**: Wraps action calldata into EIP-7702 delegation structure
|
|
190
|
+
4. **ERC-4337 UserOperation**: Delegation payload becomes the `callData` field of a UserOperation
|
|
191
|
+
5. **EOA Signing**: EOA's private key signs the UserOperation hash
|
|
192
|
+
6. **Bundler Submission**: Signed UserOperation is sent to ERC-4337 Bundler
|
|
193
|
+
7. **Execution**: Bundler executes the EIP-7702 delegation with paymaster sponsorship
|
|
194
|
+
|
|
195
|
+
## 📁 Examples
|
|
196
|
+
|
|
197
|
+
Check out the comprehensive examples in the `examples/` directory:
|
|
198
|
+
|
|
199
|
+
- **`basic-usage.ts`**: Simple examples of all operations
|
|
200
|
+
- **`batch-operations.ts`**: Advanced batch operation examples
|
|
201
|
+
|
|
202
|
+
## 🧪 Testing
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
# Run tests
|
|
206
|
+
npm test
|
|
207
|
+
|
|
208
|
+
# Run tests with coverage
|
|
209
|
+
npm run test:coverage
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## 📚 API Reference
|
|
213
|
+
|
|
214
|
+
### `initDelegatorClient(config)`
|
|
215
|
+
|
|
216
|
+
Initialize the delegator client with required configuration.
|
|
217
|
+
|
|
218
|
+
**Parameters:**
|
|
219
|
+
|
|
220
|
+
- `config.rpcUrl` (string): Ethereum RPC endpoint
|
|
221
|
+
- `config.bundlerUrl` (string): Pimlico Bundler service URL
|
|
222
|
+
- `config.paymasterUrl` (string): Pimlico Paymaster service URL for gas sponsorship
|
|
223
|
+
- `config.scwImplAddress` (Address): EIP-7702/ERC-4337 compatible SCW implementation address
|
|
224
|
+
- `config.entryPointAddress` (Address): ERC-4337 Entry Point contract address
|
|
225
|
+
- `config.pimlicoApiKey` (string, optional): Pimlico API key for enhanced features
|
|
226
|
+
|
|
227
|
+
### `deployNftContract(client, eoaPrivateKey, bytecode, salt?)`
|
|
228
|
+
|
|
229
|
+
Deploy a custom NFT contract using gasless transactions.
|
|
230
|
+
|
|
231
|
+
**Parameters:**
|
|
232
|
+
|
|
233
|
+
- `client` (DelegatorClient): Initialized client instance
|
|
234
|
+
- `eoaPrivateKey` (Hex): EOA wallet private key
|
|
235
|
+
- `bytecode` (Hex): Compiled NFT contract bytecode
|
|
236
|
+
- `salt` (Hex, optional): Salt for deterministic deployment
|
|
237
|
+
|
|
238
|
+
**Returns:** `Promise<Hex>` - UserOperation hash
|
|
239
|
+
|
|
240
|
+
### `mintNftToken(client, eoaPrivateKey, nftContractAddress, mintData)`
|
|
241
|
+
|
|
242
|
+
Mint an NFT token using gasless transactions.
|
|
243
|
+
|
|
244
|
+
**Parameters:**
|
|
245
|
+
|
|
246
|
+
- `client` (DelegatorClient): Initialized client instance
|
|
247
|
+
- `eoaPrivateKey` (Hex): EOA wallet private key
|
|
248
|
+
- `nftContractAddress` (Address): NFT contract address
|
|
249
|
+
- `mintData` (MintData): Mint data including recipient and token details
|
|
250
|
+
|
|
251
|
+
**Returns:** `Promise<Hex>` - UserOperation hash
|
|
252
|
+
|
|
253
|
+
### `buyNftToken(client, eoaPrivateKey, buyData)`
|
|
254
|
+
|
|
255
|
+
Buy an NFT using ERC20 tokens with gasless transactions.
|
|
256
|
+
|
|
257
|
+
**Parameters:**
|
|
258
|
+
|
|
259
|
+
- `client` (DelegatorClient): Initialized client instance
|
|
260
|
+
- `eoaPrivateKey` (Hex): EOA wallet private key
|
|
261
|
+
- `buyData` (BuyData): Purchase data including NFT contract, token ID, ERC20 token, and price
|
|
262
|
+
|
|
263
|
+
**Returns:** `Promise<Hex>` - UserOperation hash
|
|
264
|
+
|
|
265
|
+
### `executeBatchOperations(client, eoaPrivateKey, operations)`
|
|
266
|
+
|
|
267
|
+
Execute multiple NFT operations in a single gasless transaction.
|
|
268
|
+
|
|
269
|
+
**Parameters:**
|
|
270
|
+
|
|
271
|
+
- `client` (DelegatorClient): Initialized client instance
|
|
272
|
+
- `eoaPrivateKey` (Hex): EOA wallet private key
|
|
273
|
+
- `operations` (BatchOperation[]): Array of operations to execute
|
|
274
|
+
|
|
275
|
+
**Returns:** `Promise<Hex>` - UserOperation hash
|
|
276
|
+
|
|
277
|
+
**Operation Types:**
|
|
278
|
+
|
|
279
|
+
- `deploy`: Deploy NFT contracts
|
|
280
|
+
- `mint`: Mint tokens from existing contracts
|
|
281
|
+
- `buy`: Purchase NFTs with ERC20 tokens
|
|
282
|
+
|
|
283
|
+
**Example:**
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
286
|
+
const operations: BatchOperation[] = [
|
|
287
|
+
{
|
|
288
|
+
type: 'deploy',
|
|
289
|
+
data: {
|
|
290
|
+
bytecode: '0x608060405234801561001057600080fd5b50...',
|
|
291
|
+
salt: '0x1234...', // Optional
|
|
292
|
+
},
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
type: 'mint',
|
|
296
|
+
data: {
|
|
297
|
+
nftContractAddress: '0x1111...',
|
|
298
|
+
mintData: {
|
|
299
|
+
to: '0x2222...',
|
|
300
|
+
quantity: 5n,
|
|
301
|
+
},
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
type: 'buy',
|
|
306
|
+
data: {
|
|
307
|
+
buyData: {
|
|
308
|
+
nftContractAddress: '0x3333...',
|
|
309
|
+
tokenId: 1n,
|
|
310
|
+
quantity: 2n,
|
|
311
|
+
erc20TokenAddress: '0x4444...',
|
|
312
|
+
price: 2000000n,
|
|
313
|
+
recipient: '0x2222...',
|
|
314
|
+
},
|
|
315
|
+
},
|
|
316
|
+
},
|
|
317
|
+
];
|
|
318
|
+
|
|
319
|
+
const batchHash = await executeBatchOperations(client, privateKey, operations);
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
## 🔧 Development
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
# Install dependencies
|
|
326
|
+
pnpm install
|
|
327
|
+
|
|
328
|
+
# Build the library
|
|
329
|
+
pnpm build
|
|
330
|
+
|
|
331
|
+
# Run in development mode
|
|
332
|
+
pnpm dev
|
|
333
|
+
|
|
334
|
+
# Run tests
|
|
335
|
+
pnpm test
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## 📄 License
|
|
339
|
+
|
|
340
|
+
MIT
|
|
341
|
+
|
|
342
|
+
## 🤝 Contributing
|
|
343
|
+
|
|
344
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
345
|
+
|
|
346
|
+
## 📞 Support
|
|
347
|
+
|
|
348
|
+
For support, please open an issue on GitHub or contact the development team.
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Address, Hex } from 'viem';
|
|
2
|
+
import { DelegatorConfig, DelegatorClient } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Initialize the delegator client with required configuration
|
|
5
|
+
* @param config - Configuration object containing RPC URLs and contract addresses
|
|
6
|
+
* @returns Configured DelegatorClient instance
|
|
7
|
+
*/
|
|
8
|
+
export declare function initDelegatorClient(config: DelegatorConfig): Promise<DelegatorClient>;
|
|
9
|
+
/**
|
|
10
|
+
* Create EIP-7702 delegation payload
|
|
11
|
+
* @param target - Target contract address
|
|
12
|
+
* @param callData - Calldata for the target function
|
|
13
|
+
* @param value - ETH value to send (optional)
|
|
14
|
+
* @returns Delegation payload
|
|
15
|
+
*/
|
|
16
|
+
export declare function createDelegationPayload(target: Address, callData: Hex, value?: bigint): {
|
|
17
|
+
target: `0x${string}`;
|
|
18
|
+
callData: `0x${string}`;
|
|
19
|
+
value: bigint;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Create EIP-7702 delegation calldata for BatchCallAndSponsor.execute
|
|
23
|
+
* @param delegationPayload - The delegation payload
|
|
24
|
+
* @returns Hex-encoded calldata
|
|
25
|
+
*/
|
|
26
|
+
export declare function createDelegationCalldata(delegationPayload: {
|
|
27
|
+
target: Address;
|
|
28
|
+
callData: Hex;
|
|
29
|
+
value?: bigint;
|
|
30
|
+
}): Hex;
|
|
31
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgD,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAGlF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE3D;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAkD3F;AAsBD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM;;;;EAMrF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,iBAAiB,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,CAQnH"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initDelegatorClient = initDelegatorClient;
|
|
4
|
+
exports.createDelegationPayload = createDelegationPayload;
|
|
5
|
+
exports.createDelegationCalldata = createDelegationCalldata;
|
|
6
|
+
const viem_1 = require("viem");
|
|
7
|
+
const chains_1 = require("viem/chains");
|
|
8
|
+
const pimlico_1 = require("permissionless/clients/pimlico");
|
|
9
|
+
/**
|
|
10
|
+
* Initialize the delegator client with required configuration
|
|
11
|
+
* @param config - Configuration object containing RPC URLs and contract addresses
|
|
12
|
+
* @returns Configured DelegatorClient instance
|
|
13
|
+
*/
|
|
14
|
+
async function initDelegatorClient(config) {
|
|
15
|
+
// Validate required configuration
|
|
16
|
+
if (!config.rpcUrl) {
|
|
17
|
+
throw new Error('RPC URL is required');
|
|
18
|
+
}
|
|
19
|
+
if (!config.bundlerUrl) {
|
|
20
|
+
throw new Error('Bundler URL is required');
|
|
21
|
+
}
|
|
22
|
+
if (!config.paymasterUrl) {
|
|
23
|
+
throw new Error('Paymaster URL is required');
|
|
24
|
+
}
|
|
25
|
+
if (!config.scwImplAddress) {
|
|
26
|
+
throw new Error('SCW Implementation Address is required');
|
|
27
|
+
}
|
|
28
|
+
if (!config.entryPointAddress) {
|
|
29
|
+
throw new Error('Entry Point Address is required');
|
|
30
|
+
}
|
|
31
|
+
// Determine chain based on RPC URL
|
|
32
|
+
const chain = getChainFromRpcUrl(config.rpcUrl);
|
|
33
|
+
// Create viem clients
|
|
34
|
+
const publicClient = (0, viem_1.createPublicClient)({
|
|
35
|
+
chain,
|
|
36
|
+
transport: (0, viem_1.http)(config.rpcUrl),
|
|
37
|
+
});
|
|
38
|
+
const walletClient = (0, viem_1.createWalletClient)({
|
|
39
|
+
chain,
|
|
40
|
+
transport: (0, viem_1.http)(config.rpcUrl),
|
|
41
|
+
});
|
|
42
|
+
// Create Pimlico client (includes both bundler and paymaster functionality)
|
|
43
|
+
const pimlicoUrl = config.pimlicoApiKey ? `${config.bundlerUrl}?apikey=${config.pimlicoApiKey}` : config.bundlerUrl;
|
|
44
|
+
const pimlicoClient = (0, pimlico_1.createPimlicoClient)({
|
|
45
|
+
transport: (0, viem_1.http)(pimlicoUrl),
|
|
46
|
+
entryPoint: {
|
|
47
|
+
address: config.entryPointAddress,
|
|
48
|
+
version: '0.7',
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
config,
|
|
53
|
+
publicClient,
|
|
54
|
+
walletClient,
|
|
55
|
+
bundlerClient: pimlicoClient,
|
|
56
|
+
paymasterClient: pimlicoClient,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Determine the chain from RPC URL
|
|
61
|
+
* @param rpcUrl - The RPC URL to analyze
|
|
62
|
+
* @returns The corresponding viem chain
|
|
63
|
+
*/
|
|
64
|
+
function getChainFromRpcUrl(rpcUrl) {
|
|
65
|
+
if (rpcUrl.includes('sepolia') || rpcUrl.includes('11155111')) {
|
|
66
|
+
return chains_1.sepolia;
|
|
67
|
+
}
|
|
68
|
+
if (rpcUrl.includes('goerli') || rpcUrl.includes('5')) {
|
|
69
|
+
return chains_1.goerli;
|
|
70
|
+
}
|
|
71
|
+
if (rpcUrl.includes('mainnet') || rpcUrl.includes('1')) {
|
|
72
|
+
return chains_1.mainnet;
|
|
73
|
+
}
|
|
74
|
+
// Default to mainnet for unknown URLs
|
|
75
|
+
return chains_1.mainnet;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Create EIP-7702 delegation payload
|
|
79
|
+
* @param target - Target contract address
|
|
80
|
+
* @param callData - Calldata for the target function
|
|
81
|
+
* @param value - ETH value to send (optional)
|
|
82
|
+
* @returns Delegation payload
|
|
83
|
+
*/
|
|
84
|
+
function createDelegationPayload(target, callData, value) {
|
|
85
|
+
return {
|
|
86
|
+
target,
|
|
87
|
+
callData,
|
|
88
|
+
value: value || 0n,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create EIP-7702 delegation calldata for BatchCallAndSponsor.execute
|
|
93
|
+
* @param delegationPayload - The delegation payload
|
|
94
|
+
* @returns Hex-encoded calldata
|
|
95
|
+
*/
|
|
96
|
+
function createDelegationCalldata(delegationPayload) {
|
|
97
|
+
// This would typically call BatchCallAndSponsor.execute(target, callData, value)
|
|
98
|
+
// For now, we'll create a simple structure that can be extended
|
|
99
|
+
const { target, callData, value = 0n } = delegationPayload;
|
|
100
|
+
// In a real implementation, this would encode the function call to BatchCallAndSponsor.execute
|
|
101
|
+
// For now, we'll return the raw callData as the delegation payload
|
|
102
|
+
return callData;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { initDelegatorClient, createDelegationPayload, createDelegationCalldata } from './client';
|
|
2
|
+
export { deployNftContract, mintNftToken, buyNftToken, executeBatchOperations } from './nft-operations';
|
|
3
|
+
export type { DelegatorConfig, DelegatorClient, MintData, BuyData, DeployOptions, DelegationPayload, UserOperationResult, BatchOperation, DeployOperation, MintOperation, BuyOperation, } from './types';
|
|
4
|
+
export type { Address, Hex } from 'viem';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAGxG,YAAY,EACX,eAAe,EACf,eAAe,EACf,QAAQ,EACR,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,aAAa,EACb,YAAY,GACZ,MAAM,SAAS,CAAC;AAGjB,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.executeBatchOperations = exports.buyNftToken = exports.mintNftToken = exports.deployNftContract = exports.createDelegationCalldata = exports.createDelegationPayload = exports.initDelegatorClient = void 0;
|
|
4
|
+
// Main exports for the gasless NFT transaction library
|
|
5
|
+
var client_1 = require("./client");
|
|
6
|
+
Object.defineProperty(exports, "initDelegatorClient", { enumerable: true, get: function () { return client_1.initDelegatorClient; } });
|
|
7
|
+
Object.defineProperty(exports, "createDelegationPayload", { enumerable: true, get: function () { return client_1.createDelegationPayload; } });
|
|
8
|
+
Object.defineProperty(exports, "createDelegationCalldata", { enumerable: true, get: function () { return client_1.createDelegationCalldata; } });
|
|
9
|
+
var nft_operations_1 = require("./nft-operations");
|
|
10
|
+
Object.defineProperty(exports, "deployNftContract", { enumerable: true, get: function () { return nft_operations_1.deployNftContract; } });
|
|
11
|
+
Object.defineProperty(exports, "mintNftToken", { enumerable: true, get: function () { return nft_operations_1.mintNftToken; } });
|
|
12
|
+
Object.defineProperty(exports, "buyNftToken", { enumerable: true, get: function () { return nft_operations_1.buyNftToken; } });
|
|
13
|
+
Object.defineProperty(exports, "executeBatchOperations", { enumerable: true, get: function () { return nft_operations_1.executeBatchOperations; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uDAAuD;AACvD,mCAAkG;AAAzF,6GAAA,mBAAmB,OAAA;AAAE,iHAAA,uBAAuB,OAAA;AAAE,kHAAA,wBAAwB,OAAA;AAC/E,mDAAwG;AAA/F,mHAAA,iBAAiB,OAAA;AAAE,8GAAA,YAAY,OAAA;AAAE,6GAAA,WAAW,OAAA;AAAE,wHAAA,sBAAsB,OAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Address, Hex } from 'viem';
|
|
2
|
+
import { DelegatorClient, MintData, BuyData, BatchOperation } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Deploy a custom NFT contract using EIP-7702 delegation and ERC-4337 gas sponsorship
|
|
5
|
+
* @param client - Initialized delegator client
|
|
6
|
+
* @param eoaPrivateKey - EOA private key for signing
|
|
7
|
+
* @param bytecode - Compiled NFT contract bytecode
|
|
8
|
+
* @param salt - Optional salt for deterministic deployment
|
|
9
|
+
* @returns Promise resolving to UserOperation hash
|
|
10
|
+
*/
|
|
11
|
+
export declare function deployNftContract(client: DelegatorClient, eoaPrivateKey: Hex, bytecode: Hex, salt?: Hex): Promise<Hex>;
|
|
12
|
+
/**
|
|
13
|
+
* Mint an NFT token using EIP-7702 delegation and ERC-4337 gas sponsorship
|
|
14
|
+
* @param client - Initialized delegator client
|
|
15
|
+
* @param eoaPrivateKey - EOA private key for signing
|
|
16
|
+
* @param nftContractAddress - Address of the NFT contract
|
|
17
|
+
* @param mintData - Mint data including recipient and token details
|
|
18
|
+
* @returns Promise resolving to UserOperation hash
|
|
19
|
+
*/
|
|
20
|
+
export declare function mintNftToken(client: DelegatorClient, eoaPrivateKey: Hex, nftContractAddress: Address, mintData: MintData): Promise<Hex>;
|
|
21
|
+
/**
|
|
22
|
+
* Buy an NFT using ERC20 tokens with EIP-7702 delegation and ERC-4337 gas sponsorship
|
|
23
|
+
* @param client - Initialized delegator client
|
|
24
|
+
* @param eoaPrivateKey - EOA private key for signing
|
|
25
|
+
* @param buyData - Buy data including NFT contract, token ID, ERC20 token, and price
|
|
26
|
+
* @returns Promise resolving to UserOperation hash
|
|
27
|
+
*/
|
|
28
|
+
export declare function buyNftToken(client: DelegatorClient, eoaPrivateKey: Hex, buyData: BuyData): Promise<Hex>;
|
|
29
|
+
/**
|
|
30
|
+
* Execute multiple NFT operations in a single transaction
|
|
31
|
+
* @param client - Initialized delegator client
|
|
32
|
+
* @param eoaPrivateKey - EOA private key for signing
|
|
33
|
+
* @param operations - Array of operations to execute
|
|
34
|
+
* @returns Promise resolving to UserOperation hash
|
|
35
|
+
*/
|
|
36
|
+
export declare function executeBatchOperations(client: DelegatorClient, eoaPrivateKey: Hex, operations: BatchOperation[]): Promise<Hex>;
|
|
37
|
+
//# sourceMappingURL=nft-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nft-operations.d.ts","sourceRoot":"","sources":["../src/nft-operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAwC,MAAM,MAAM,CAAC;AAC1E,OAAO,EACN,eAAe,EAEf,QAAQ,EACR,OAAO,EAEP,cAAc,EAId,MAAM,SAAS,CAAC;AAGjB;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CA+B5H;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CACjC,MAAM,EAAE,eAAe,EACvB,aAAa,EAAE,GAAG,EAClB,kBAAkB,EAAE,OAAO,EAC3B,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,GAAG,CAAC,CA+Bd;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAwC7G;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,GAAG,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CA+FpI"}
|
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deployNftContract = deployNftContract;
|
|
4
|
+
exports.mintNftToken = mintNftToken;
|
|
5
|
+
exports.buyNftToken = buyNftToken;
|
|
6
|
+
exports.executeBatchOperations = executeBatchOperations;
|
|
7
|
+
const viem_1 = require("viem");
|
|
8
|
+
const client_1 = require("./client");
|
|
9
|
+
/**
|
|
10
|
+
* Deploy a custom NFT contract using EIP-7702 delegation and ERC-4337 gas sponsorship
|
|
11
|
+
* @param client - Initialized delegator client
|
|
12
|
+
* @param eoaPrivateKey - EOA private key for signing
|
|
13
|
+
* @param bytecode - Compiled NFT contract bytecode
|
|
14
|
+
* @param salt - Optional salt for deterministic deployment
|
|
15
|
+
* @returns Promise resolving to UserOperation hash
|
|
16
|
+
*/
|
|
17
|
+
async function deployNftContract(client, eoaPrivateKey, bytecode, salt) {
|
|
18
|
+
try {
|
|
19
|
+
// Get EOA address from private key
|
|
20
|
+
const eoaAddress = await client.walletClient.getAddresses(eoaPrivateKey);
|
|
21
|
+
if (!eoaAddress || eoaAddress.length === 0) {
|
|
22
|
+
throw new Error('Failed to derive EOA address from private key');
|
|
23
|
+
}
|
|
24
|
+
// Create contract deployment calldata
|
|
25
|
+
const deployCalldata = createDeployCalldata(bytecode, salt);
|
|
26
|
+
// Create EIP-7702 delegation payload
|
|
27
|
+
const delegationPayload = {
|
|
28
|
+
target: client.config.scwImplAddress,
|
|
29
|
+
callData: deployCalldata,
|
|
30
|
+
value: 0n,
|
|
31
|
+
};
|
|
32
|
+
// Create delegation calldata for BatchCallAndSponsor.execute
|
|
33
|
+
const delegationCalldata = (0, client_1.createDelegationCalldata)(delegationPayload);
|
|
34
|
+
// Create UserOperation
|
|
35
|
+
const userOp = await createUserOperation(client, eoaAddress[0], delegationCalldata);
|
|
36
|
+
// Submit to bundler
|
|
37
|
+
const userOpHash = await submitUserOperation(client, userOp, eoaPrivateKey);
|
|
38
|
+
return userOpHash;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
throw new Error(`Failed to deploy NFT contract: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Mint an NFT token using EIP-7702 delegation and ERC-4337 gas sponsorship
|
|
46
|
+
* @param client - Initialized delegator client
|
|
47
|
+
* @param eoaPrivateKey - EOA private key for signing
|
|
48
|
+
* @param nftContractAddress - Address of the NFT contract
|
|
49
|
+
* @param mintData - Mint data including recipient and token details
|
|
50
|
+
* @returns Promise resolving to UserOperation hash
|
|
51
|
+
*/
|
|
52
|
+
async function mintNftToken(client, eoaPrivateKey, nftContractAddress, mintData) {
|
|
53
|
+
try {
|
|
54
|
+
// Get EOA address from private key
|
|
55
|
+
const eoaAddress = await client.walletClient.getAddresses(eoaPrivateKey);
|
|
56
|
+
if (!eoaAddress || eoaAddress.length === 0) {
|
|
57
|
+
throw new Error('Failed to derive EOA address from private key');
|
|
58
|
+
}
|
|
59
|
+
// Create mint function calldata
|
|
60
|
+
const mintCalldata = createMintCalldata(mintData);
|
|
61
|
+
// Create EIP-7702 delegation payload
|
|
62
|
+
const delegationPayload = {
|
|
63
|
+
target: nftContractAddress,
|
|
64
|
+
callData: mintCalldata,
|
|
65
|
+
value: 0n,
|
|
66
|
+
};
|
|
67
|
+
// Create delegation calldata for BatchCallAndSponsor.execute
|
|
68
|
+
const delegationCalldata = (0, client_1.createDelegationCalldata)(delegationPayload);
|
|
69
|
+
// Create UserOperation
|
|
70
|
+
const userOp = await createUserOperation(client, eoaAddress[0], delegationCalldata);
|
|
71
|
+
// Submit to bundler
|
|
72
|
+
const userOpHash = await submitUserOperation(client, userOp, eoaPrivateKey);
|
|
73
|
+
return userOpHash;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
throw new Error(`Failed to mint NFT token: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Buy an NFT using ERC20 tokens with EIP-7702 delegation and ERC-4337 gas sponsorship
|
|
81
|
+
* @param client - Initialized delegator client
|
|
82
|
+
* @param eoaPrivateKey - EOA private key for signing
|
|
83
|
+
* @param buyData - Buy data including NFT contract, token ID, ERC20 token, and price
|
|
84
|
+
* @returns Promise resolving to UserOperation hash
|
|
85
|
+
*/
|
|
86
|
+
async function buyNftToken(client, eoaPrivateKey, buyData) {
|
|
87
|
+
try {
|
|
88
|
+
// Get EOA address from private key
|
|
89
|
+
const eoaAddress = await client.walletClient.getAddresses(eoaPrivateKey);
|
|
90
|
+
if (!eoaAddress || eoaAddress.length === 0) {
|
|
91
|
+
throw new Error('Failed to derive EOA address from private key');
|
|
92
|
+
}
|
|
93
|
+
// Create ERC20 transfer calldata for payment
|
|
94
|
+
const erc20TransferCalldata = createERC20TransferCalldata(buyData.erc20TokenAddress, buyData.nftContractAddress, buyData.price);
|
|
95
|
+
// Create NFT purchase calldata (assuming the NFT contract has a buy function)
|
|
96
|
+
const nftBuyCalldata = createNftBuyCalldata(buyData.nftContractAddress, buyData.tokenId, buyData.quantity || 1n, buyData.recipient);
|
|
97
|
+
// Create batch call calldata for both ERC20 transfer and NFT purchase
|
|
98
|
+
const batchCalldata = createBatchCallCalldata([
|
|
99
|
+
{ target: buyData.erc20TokenAddress, callData: erc20TransferCalldata, value: 0n },
|
|
100
|
+
{ target: buyData.nftContractAddress, callData: nftBuyCalldata, value: 0n },
|
|
101
|
+
]);
|
|
102
|
+
// Create EIP-7702 delegation payload
|
|
103
|
+
const delegationPayload = {
|
|
104
|
+
target: client.config.scwImplAddress,
|
|
105
|
+
callData: batchCalldata,
|
|
106
|
+
value: 0n,
|
|
107
|
+
};
|
|
108
|
+
// Create delegation calldata for BatchCallAndSponsor.execute
|
|
109
|
+
const delegationCalldata = (0, client_1.createDelegationCalldata)(delegationPayload);
|
|
110
|
+
// Create UserOperation
|
|
111
|
+
const userOp = await createUserOperation(client, eoaAddress[0], delegationCalldata);
|
|
112
|
+
// Submit to bundler
|
|
113
|
+
const userOpHash = await submitUserOperation(client, userOp, eoaPrivateKey);
|
|
114
|
+
return userOpHash;
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
throw new Error(`Failed to buy NFT token: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Execute multiple NFT operations in a single transaction
|
|
122
|
+
* @param client - Initialized delegator client
|
|
123
|
+
* @param eoaPrivateKey - EOA private key for signing
|
|
124
|
+
* @param operations - Array of operations to execute
|
|
125
|
+
* @returns Promise resolving to UserOperation hash
|
|
126
|
+
*/
|
|
127
|
+
async function executeBatchOperations(client, eoaPrivateKey, operations) {
|
|
128
|
+
try {
|
|
129
|
+
// Get EOA address from private key
|
|
130
|
+
const eoaAddress = await client.walletClient.getAddresses(eoaPrivateKey);
|
|
131
|
+
if (!eoaAddress || eoaAddress.length === 0) {
|
|
132
|
+
throw new Error('Failed to derive EOA address from private key');
|
|
133
|
+
}
|
|
134
|
+
// Process each operation and create calldata
|
|
135
|
+
const batchCalls = [];
|
|
136
|
+
for (const operation of operations) {
|
|
137
|
+
switch (operation.type) {
|
|
138
|
+
case 'deploy': {
|
|
139
|
+
const deployOp = operation.data;
|
|
140
|
+
const deployCalldata = createDeployCalldata(deployOp.bytecode, deployOp.salt);
|
|
141
|
+
batchCalls.push({
|
|
142
|
+
target: client.config.scwImplAddress,
|
|
143
|
+
callData: deployCalldata,
|
|
144
|
+
value: 0n,
|
|
145
|
+
});
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
case 'mint': {
|
|
149
|
+
const mintOp = operation.data;
|
|
150
|
+
const mintCalldata = createMintCalldata(mintOp.mintData);
|
|
151
|
+
batchCalls.push({
|
|
152
|
+
target: mintOp.nftContractAddress,
|
|
153
|
+
callData: mintCalldata,
|
|
154
|
+
value: 0n,
|
|
155
|
+
});
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
case 'buy': {
|
|
159
|
+
const buyOp = operation.data;
|
|
160
|
+
const { buyData } = buyOp;
|
|
161
|
+
// Create ERC20 transfer calldata for payment
|
|
162
|
+
const erc20TransferCalldata = createERC20TransferCalldata(buyData.erc20TokenAddress, buyData.nftContractAddress, buyData.price);
|
|
163
|
+
// Create NFT purchase calldata
|
|
164
|
+
const nftBuyCalldata = createNftBuyCalldata(buyData.nftContractAddress, buyData.tokenId, buyData.quantity || 1n, buyData.recipient);
|
|
165
|
+
// Add both ERC20 transfer and NFT purchase to batch
|
|
166
|
+
batchCalls.push({
|
|
167
|
+
target: buyData.erc20TokenAddress,
|
|
168
|
+
callData: erc20TransferCalldata,
|
|
169
|
+
value: 0n,
|
|
170
|
+
}, {
|
|
171
|
+
target: buyData.nftContractAddress,
|
|
172
|
+
callData: nftBuyCalldata,
|
|
173
|
+
value: 0n,
|
|
174
|
+
});
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
default:
|
|
178
|
+
throw new Error(`Unsupported operation type: ${operation.type}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Create batch call calldata for all operations
|
|
182
|
+
const batchCalldata = createBatchCallCalldata(batchCalls);
|
|
183
|
+
// Create EIP-7702 delegation payload
|
|
184
|
+
const delegationPayload = {
|
|
185
|
+
target: client.config.scwImplAddress,
|
|
186
|
+
callData: batchCalldata,
|
|
187
|
+
value: 0n,
|
|
188
|
+
};
|
|
189
|
+
// Create delegation calldata for BatchCallAndSponsor.execute
|
|
190
|
+
const delegationCalldata = (0, client_1.createDelegationCalldata)(delegationPayload);
|
|
191
|
+
// Create UserOperation
|
|
192
|
+
const userOp = await createUserOperation(client, eoaAddress[0], delegationCalldata);
|
|
193
|
+
// Submit to bundler
|
|
194
|
+
const userOpHash = await submitUserOperation(client, userOp, eoaPrivateKey);
|
|
195
|
+
return userOpHash;
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
throw new Error(`Failed to execute batch operations: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Create contract deployment calldata
|
|
203
|
+
* @param bytecode - Contract bytecode
|
|
204
|
+
* @param salt - Optional salt for CREATE2
|
|
205
|
+
* @returns Hex-encoded deployment calldata
|
|
206
|
+
*/
|
|
207
|
+
function createDeployCalldata(bytecode, salt) {
|
|
208
|
+
if (salt) {
|
|
209
|
+
// CREATE2 deployment
|
|
210
|
+
return (0, viem_1.encodeFunctionData)({
|
|
211
|
+
abi: [
|
|
212
|
+
{
|
|
213
|
+
type: 'function',
|
|
214
|
+
name: 'deploy',
|
|
215
|
+
inputs: [
|
|
216
|
+
{ name: 'bytecode', type: 'bytes' },
|
|
217
|
+
{ name: 'salt', type: 'bytes32' },
|
|
218
|
+
],
|
|
219
|
+
outputs: [{ name: 'address', type: 'address' }],
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
functionName: 'deploy',
|
|
223
|
+
args: [bytecode, salt],
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
// CREATE deployment
|
|
228
|
+
return bytecode;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Create mint function calldata for ERC-721/721A/1155
|
|
233
|
+
* @param mintData - Mint data
|
|
234
|
+
* @returns Hex-encoded mint calldata
|
|
235
|
+
*/
|
|
236
|
+
function createMintCalldata(mintData) {
|
|
237
|
+
const { to, quantity = 1n, tokenId, amount, data } = mintData;
|
|
238
|
+
// Use quantity if provided, otherwise fall back to amount for backward compatibility
|
|
239
|
+
const mintQuantity = quantity !== 1n ? quantity : amount || 1n;
|
|
240
|
+
if (mintQuantity > 1n) {
|
|
241
|
+
// ERC-1155 or ERC-721A batch mint
|
|
242
|
+
if (data !== undefined) {
|
|
243
|
+
// ERC-1155 mint with data
|
|
244
|
+
return (0, viem_1.encodeFunctionData)({
|
|
245
|
+
abi: [
|
|
246
|
+
{
|
|
247
|
+
type: 'function',
|
|
248
|
+
name: 'mint',
|
|
249
|
+
inputs: [
|
|
250
|
+
{ name: 'to', type: 'address' },
|
|
251
|
+
{ name: 'id', type: 'uint256' },
|
|
252
|
+
{ name: 'amount', type: 'uint256' },
|
|
253
|
+
{ name: 'data', type: 'bytes' },
|
|
254
|
+
],
|
|
255
|
+
outputs: [],
|
|
256
|
+
},
|
|
257
|
+
],
|
|
258
|
+
functionName: 'mint',
|
|
259
|
+
args: [to, tokenId || 0n, mintQuantity, data],
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// ERC-721A batch mint
|
|
264
|
+
return (0, viem_1.encodeFunctionData)({
|
|
265
|
+
abi: [
|
|
266
|
+
{
|
|
267
|
+
type: 'function',
|
|
268
|
+
name: 'mint',
|
|
269
|
+
inputs: [
|
|
270
|
+
{ name: 'to', type: 'address' },
|
|
271
|
+
{ name: 'quantity', type: 'uint256' },
|
|
272
|
+
],
|
|
273
|
+
outputs: [],
|
|
274
|
+
},
|
|
275
|
+
],
|
|
276
|
+
functionName: 'mint',
|
|
277
|
+
args: [to, mintQuantity],
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
// ERC-721 single mint
|
|
283
|
+
return (0, viem_1.encodeFunctionData)({
|
|
284
|
+
abi: [
|
|
285
|
+
{
|
|
286
|
+
type: 'function',
|
|
287
|
+
name: 'mint',
|
|
288
|
+
inputs: [
|
|
289
|
+
{ name: 'to', type: 'address' },
|
|
290
|
+
{ name: 'tokenId', type: 'uint256' },
|
|
291
|
+
],
|
|
292
|
+
outputs: [],
|
|
293
|
+
},
|
|
294
|
+
],
|
|
295
|
+
functionName: 'mint',
|
|
296
|
+
args: [to, tokenId || 0n],
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Create ERC20 transfer calldata
|
|
302
|
+
* @param tokenAddress - ERC20 token contract address
|
|
303
|
+
* @param to - Recipient address
|
|
304
|
+
* @param amount - Amount to transfer
|
|
305
|
+
* @returns Hex-encoded transfer calldata
|
|
306
|
+
*/
|
|
307
|
+
function createERC20TransferCalldata(tokenAddress, to, amount) {
|
|
308
|
+
return (0, viem_1.encodeFunctionData)({
|
|
309
|
+
abi: [
|
|
310
|
+
{
|
|
311
|
+
type: 'function',
|
|
312
|
+
name: 'transfer',
|
|
313
|
+
inputs: [
|
|
314
|
+
{ name: 'to', type: 'address' },
|
|
315
|
+
{ name: 'amount', type: 'uint256' },
|
|
316
|
+
],
|
|
317
|
+
outputs: [{ name: 'success', type: 'bool' }],
|
|
318
|
+
},
|
|
319
|
+
],
|
|
320
|
+
functionName: 'transfer',
|
|
321
|
+
args: [to, amount],
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Create NFT buy calldata (assuming NFT contract has a buy function)
|
|
326
|
+
* @param nftAddress - NFT contract address
|
|
327
|
+
* @param tokenId - Token ID to buy
|
|
328
|
+
* @param quantity - Number of tokens to buy
|
|
329
|
+
* @param recipient - Recipient address
|
|
330
|
+
* @returns Hex-encoded buy calldata
|
|
331
|
+
*/
|
|
332
|
+
function createNftBuyCalldata(nftAddress, tokenId, quantity, recipient) {
|
|
333
|
+
if (quantity > 1n) {
|
|
334
|
+
// ERC-721A or ERC-1155 batch buy
|
|
335
|
+
return (0, viem_1.encodeFunctionData)({
|
|
336
|
+
abi: [
|
|
337
|
+
{
|
|
338
|
+
type: 'function',
|
|
339
|
+
name: 'buy',
|
|
340
|
+
inputs: [
|
|
341
|
+
{ name: 'tokenId', type: 'uint256' },
|
|
342
|
+
{ name: 'quantity', type: 'uint256' },
|
|
343
|
+
{ name: 'recipient', type: 'address' },
|
|
344
|
+
],
|
|
345
|
+
outputs: [],
|
|
346
|
+
},
|
|
347
|
+
],
|
|
348
|
+
functionName: 'buy',
|
|
349
|
+
args: [tokenId, quantity, recipient],
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
// ERC-721 single buy
|
|
354
|
+
return (0, viem_1.encodeFunctionData)({
|
|
355
|
+
abi: [
|
|
356
|
+
{
|
|
357
|
+
type: 'function',
|
|
358
|
+
name: 'buy',
|
|
359
|
+
inputs: [
|
|
360
|
+
{ name: 'tokenId', type: 'uint256' },
|
|
361
|
+
{ name: 'recipient', type: 'address' },
|
|
362
|
+
],
|
|
363
|
+
outputs: [],
|
|
364
|
+
},
|
|
365
|
+
],
|
|
366
|
+
functionName: 'buy',
|
|
367
|
+
args: [tokenId, recipient],
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Create batch call calldata for multiple operations
|
|
373
|
+
* @param calls - Array of call objects
|
|
374
|
+
* @returns Hex-encoded batch call calldata
|
|
375
|
+
*/
|
|
376
|
+
function createBatchCallCalldata(calls) {
|
|
377
|
+
return (0, viem_1.encodeFunctionData)({
|
|
378
|
+
abi: [
|
|
379
|
+
{
|
|
380
|
+
type: 'function',
|
|
381
|
+
name: 'execute',
|
|
382
|
+
inputs: [
|
|
383
|
+
{
|
|
384
|
+
name: 'calls',
|
|
385
|
+
type: 'tuple[]',
|
|
386
|
+
components: [
|
|
387
|
+
{ name: 'target', type: 'address' },
|
|
388
|
+
{ name: 'callData', type: 'bytes' },
|
|
389
|
+
{ name: 'value', type: 'uint256' },
|
|
390
|
+
],
|
|
391
|
+
},
|
|
392
|
+
],
|
|
393
|
+
outputs: [],
|
|
394
|
+
},
|
|
395
|
+
],
|
|
396
|
+
functionName: 'execute',
|
|
397
|
+
args: [calls],
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Create UserOperation for ERC-4337 with Pimlico paymaster sponsorship
|
|
402
|
+
* @param client - Delegator client
|
|
403
|
+
* @param sender - Sender address (EOA)
|
|
404
|
+
* @param callData - Calldata for the operation
|
|
405
|
+
* @param value - ETH value (optional)
|
|
406
|
+
* @returns UserOperation object with paymaster sponsorship
|
|
407
|
+
*/
|
|
408
|
+
async function createUserOperation(client, sender, callData, value) {
|
|
409
|
+
// Get nonce
|
|
410
|
+
const nonce = await client.publicClient.getTransactionCount({ address: sender });
|
|
411
|
+
// Get gas estimates
|
|
412
|
+
const gasEstimate = await client.publicClient.estimateGas({
|
|
413
|
+
to: client.config.scwImplAddress,
|
|
414
|
+
data: callData,
|
|
415
|
+
value: value || 0n,
|
|
416
|
+
});
|
|
417
|
+
// Create base UserOperation
|
|
418
|
+
const userOp = {
|
|
419
|
+
sender,
|
|
420
|
+
nonce: (0, viem_1.toHex)(nonce),
|
|
421
|
+
initCode: '0x',
|
|
422
|
+
callData,
|
|
423
|
+
callGasLimit: (0, viem_1.toHex)(gasEstimate),
|
|
424
|
+
verificationGasLimit: (0, viem_1.toHex)(100000n), // Default verification gas
|
|
425
|
+
preVerificationGas: (0, viem_1.toHex)(21000n), // Default pre-verification gas
|
|
426
|
+
maxFeePerGas: (0, viem_1.toHex)(0n), // Will be sponsored by paymaster
|
|
427
|
+
maxPriorityFeePerGas: (0, viem_1.toHex)(0n), // Will be sponsored by paymaster
|
|
428
|
+
paymasterAndData: '0x', // Will be filled by paymaster
|
|
429
|
+
signature: '0x', // Will be filled during signing
|
|
430
|
+
};
|
|
431
|
+
// Get paymaster sponsorship from Pimlico
|
|
432
|
+
try {
|
|
433
|
+
const paymasterResult = await client.paymasterClient.sponsorUserOperation({
|
|
434
|
+
userOperation: userOp,
|
|
435
|
+
});
|
|
436
|
+
// Update UserOperation with paymaster data
|
|
437
|
+
userOp.paymasterAndData = paymasterResult.paymasterAndData;
|
|
438
|
+
userOp.maxFeePerGas = paymasterResult.maxFeePerGas;
|
|
439
|
+
userOp.maxPriorityFeePerGas = paymasterResult.maxPriorityFeePerGas;
|
|
440
|
+
userOp.preVerificationGas = paymasterResult.preVerificationGas;
|
|
441
|
+
userOp.verificationGasLimit = paymasterResult.verificationGasLimit;
|
|
442
|
+
userOp.callGasLimit = paymasterResult.callGasLimit;
|
|
443
|
+
}
|
|
444
|
+
catch (error) {
|
|
445
|
+
throw new Error(`Failed to get paymaster sponsorship: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
446
|
+
}
|
|
447
|
+
return userOp;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Submit UserOperation to Pimlico bundler
|
|
451
|
+
* @param client - Delegator client
|
|
452
|
+
* @param userOp - UserOperation to submit
|
|
453
|
+
* @param privateKey - EOA private key for signing
|
|
454
|
+
* @returns UserOperation hash
|
|
455
|
+
*/
|
|
456
|
+
async function submitUserOperation(client, userOp, privateKey) {
|
|
457
|
+
try {
|
|
458
|
+
// Sign the UserOperation
|
|
459
|
+
const userOpHash = (0, viem_1.keccak256)(JSON.stringify(userOp));
|
|
460
|
+
const signature = await client.walletClient.signMessage({
|
|
461
|
+
account: privateKey,
|
|
462
|
+
message: { raw: userOpHash },
|
|
463
|
+
});
|
|
464
|
+
// Add signature to UserOperation
|
|
465
|
+
userOp.signature = signature;
|
|
466
|
+
// Submit to Pimlico bundler
|
|
467
|
+
const result = await client.bundlerClient.sendUserOperation({
|
|
468
|
+
userOperation: userOp,
|
|
469
|
+
});
|
|
470
|
+
return result.userOpHash;
|
|
471
|
+
}
|
|
472
|
+
catch (error) {
|
|
473
|
+
throw new Error(`Failed to submit UserOperation to Pimlico bundler: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=nft-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nft-operations.js","sourceRoot":"","sources":["../src/nft-operations.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { Address, Hex } from 'viem';
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for the delegator client
|
|
4
|
+
*/
|
|
5
|
+
export interface DelegatorConfig {
|
|
6
|
+
rpcUrl: string;
|
|
7
|
+
bundlerUrl: string;
|
|
8
|
+
paymasterUrl: string;
|
|
9
|
+
scwImplAddress: Address;
|
|
10
|
+
entryPointAddress: Address;
|
|
11
|
+
pimlicoApiKey?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Mint data for NFT minting operations
|
|
15
|
+
*/
|
|
16
|
+
export interface MintData {
|
|
17
|
+
to: Address;
|
|
18
|
+
quantity?: bigint;
|
|
19
|
+
tokenId?: bigint;
|
|
20
|
+
amount?: bigint;
|
|
21
|
+
data?: Hex;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Buy data for NFT purchases with ERC20 tokens
|
|
25
|
+
*/
|
|
26
|
+
export interface BuyData {
|
|
27
|
+
nftContractAddress: Address;
|
|
28
|
+
tokenId: bigint;
|
|
29
|
+
quantity?: bigint;
|
|
30
|
+
erc20TokenAddress: Address;
|
|
31
|
+
price: bigint;
|
|
32
|
+
recipient: Address;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Deployment options for NFT contracts
|
|
36
|
+
*/
|
|
37
|
+
export interface DeployOptions {
|
|
38
|
+
bytecode: Hex;
|
|
39
|
+
salt?: Hex;
|
|
40
|
+
constructorArgs?: Hex;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Client instance for gasless NFT transactions
|
|
44
|
+
*/
|
|
45
|
+
export interface DelegatorClient {
|
|
46
|
+
config: DelegatorConfig;
|
|
47
|
+
publicClient: any;
|
|
48
|
+
walletClient: any;
|
|
49
|
+
bundlerClient: any;
|
|
50
|
+
paymasterClient: any;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* EIP-7702 delegation payload structure
|
|
54
|
+
*/
|
|
55
|
+
export interface DelegationPayload {
|
|
56
|
+
target: Address;
|
|
57
|
+
callData: Hex;
|
|
58
|
+
value?: bigint;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* UserOperation result from bundler submission
|
|
62
|
+
*/
|
|
63
|
+
export interface UserOperationResult {
|
|
64
|
+
userOpHash: Hex;
|
|
65
|
+
success: boolean;
|
|
66
|
+
transactionHash?: Hex;
|
|
67
|
+
error?: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Batch operation for multiple NFT operations
|
|
71
|
+
*/
|
|
72
|
+
export interface BatchOperation {
|
|
73
|
+
type: 'deploy' | 'mint' | 'buy';
|
|
74
|
+
data: DeployOperation | MintOperation | BuyOperation;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Deploy operation data
|
|
78
|
+
*/
|
|
79
|
+
export interface DeployOperation {
|
|
80
|
+
bytecode: Hex;
|
|
81
|
+
salt?: Hex;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Mint operation data
|
|
85
|
+
*/
|
|
86
|
+
export interface MintOperation {
|
|
87
|
+
nftContractAddress: Address;
|
|
88
|
+
mintData: MintData;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Buy operation data
|
|
92
|
+
*/
|
|
93
|
+
export interface BuyOperation {
|
|
94
|
+
buyData: BuyData;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;CACX;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,eAAe,CAAC,EAAE,GAAG,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,eAAe,CAAC;IACxB,YAAY,EAAE,GAAG,CAAC;IAClB,YAAY,EAAE,GAAG,CAAC;IAClB,aAAa,EAAE,GAAG,CAAC;IACnB,eAAe,EAAE,GAAG,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,GAAG,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,UAAU,EAAE,GAAG,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IAChC,IAAI,EAAE,eAAe,GAAG,aAAa,GAAG,YAAY,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;CACX;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,QAAQ,EAAE,QAAQ,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,OAAO,CAAC;CACjB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@paulstinchcombe/gasless-nft-tx",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Library for gasless NFT transactions using EIP-7702 delegation and ERC-4337 gas sponsorship",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"test": "vitest",
|
|
10
|
+
"test:coverage": "vitest --coverage",
|
|
11
|
+
"dev": "tsc --watch",
|
|
12
|
+
"prepublishOnly": "npm run build"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"ethereum",
|
|
16
|
+
"eip-7702",
|
|
17
|
+
"erc-4337",
|
|
18
|
+
"nft",
|
|
19
|
+
"gasless",
|
|
20
|
+
"account-abstraction",
|
|
21
|
+
"delegation"
|
|
22
|
+
],
|
|
23
|
+
"author": "Paul Stinchcombe | KAMI",
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"viem": "^2.21.0",
|
|
27
|
+
"permissionless": "^0.2.0",
|
|
28
|
+
"tslib": "^2.6.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^20.0.0",
|
|
32
|
+
"typescript": "^5.0.0",
|
|
33
|
+
"vitest": "^1.0.0",
|
|
34
|
+
"@vitest/coverage-v8": "^1.0.0",
|
|
35
|
+
"anvil": "^0.0.6"
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist/**/*",
|
|
39
|
+
"README.md"
|
|
40
|
+
],
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=18.0.0"
|
|
43
|
+
}
|
|
44
|
+
}
|