@reptilianhq/uniswap-sdk 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abis.d.ts +41 -0
- package/dist/abis.d.ts.map +1 -1
- package/dist/abis.js +3 -0
- package/dist/abis.js.map +1 -1
- package/dist/v4-transactions.d.ts +46 -9
- package/dist/v4-transactions.d.ts.map +1 -1
- package/dist/v4-transactions.js +127 -16
- package/dist/v4-transactions.js.map +1 -1
- package/dist/v4.d.ts +1 -1
- package/dist/v4.d.ts.map +1 -1
- package/dist/v4.js.map +1 -1
- package/package.json +2 -2
package/dist/abis.d.ts
CHANGED
|
@@ -211,6 +211,47 @@ export declare const v4PositionManagerAbi: readonly [{
|
|
|
211
211
|
readonly type: "bytes[]";
|
|
212
212
|
readonly name: "results";
|
|
213
213
|
}];
|
|
214
|
+
}, {
|
|
215
|
+
readonly name: "permitBatch";
|
|
216
|
+
readonly type: "function";
|
|
217
|
+
readonly stateMutability: "payable";
|
|
218
|
+
readonly inputs: readonly [{
|
|
219
|
+
readonly type: "address";
|
|
220
|
+
readonly name: "owner";
|
|
221
|
+
}, {
|
|
222
|
+
readonly type: "tuple";
|
|
223
|
+
readonly components: readonly [{
|
|
224
|
+
readonly name: "details";
|
|
225
|
+
readonly type: "tuple[]";
|
|
226
|
+
readonly components: readonly [{
|
|
227
|
+
readonly type: "address";
|
|
228
|
+
readonly name: "token";
|
|
229
|
+
}, {
|
|
230
|
+
readonly type: "uint160";
|
|
231
|
+
readonly name: "amount";
|
|
232
|
+
}, {
|
|
233
|
+
readonly type: "uint48";
|
|
234
|
+
readonly name: "expiration";
|
|
235
|
+
}, {
|
|
236
|
+
readonly type: "uint48";
|
|
237
|
+
readonly name: "nonce";
|
|
238
|
+
}];
|
|
239
|
+
}, {
|
|
240
|
+
readonly type: "address";
|
|
241
|
+
readonly name: "spender";
|
|
242
|
+
}, {
|
|
243
|
+
readonly type: "uint256";
|
|
244
|
+
readonly name: "sigDeadline";
|
|
245
|
+
}];
|
|
246
|
+
readonly name: "permitBatch";
|
|
247
|
+
}, {
|
|
248
|
+
readonly type: "bytes";
|
|
249
|
+
readonly name: "signature";
|
|
250
|
+
}];
|
|
251
|
+
readonly outputs: readonly [{
|
|
252
|
+
readonly type: "bytes";
|
|
253
|
+
readonly name: "err";
|
|
254
|
+
}];
|
|
214
255
|
}];
|
|
215
256
|
export * from './v3-abis.js';
|
|
216
257
|
//# sourceMappingURL=abis.d.ts.map
|
package/dist/abis.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abis.d.ts","sourceRoot":"","sources":["../src/abis.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMzB,CAAC;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKtB,CAAC;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAE3B,CAAC;AACH,eAAO,MAAM,oBAAoB
|
|
1
|
+
{"version":3,"file":"abis.d.ts","sourceRoot":"","sources":["../src/abis.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMzB,CAAC;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKtB,CAAC;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAE3B,CAAC;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQ/B,CAAC;AAEH,cAAc,cAAc,CAAC"}
|
package/dist/abis.js
CHANGED
|
@@ -19,9 +19,12 @@ export const v4PoolManagerAbi = parseAbi([
|
|
|
19
19
|
]);
|
|
20
20
|
export const v4PositionManagerAbi = parseAbi([
|
|
21
21
|
'struct PoolKey { address currency0; address currency1; uint24 fee; int24 tickSpacing; address hooks; }',
|
|
22
|
+
'struct AllowanceTransferDetails { address token; uint160 amount; uint48 expiration; uint48 nonce; }',
|
|
23
|
+
'struct AllowanceTransferPermitBatch { AllowanceTransferDetails[] details; address spender; uint256 sigDeadline; }',
|
|
22
24
|
'function initializePool(PoolKey key, uint160 sqrtPriceX96) payable returns (int24)',
|
|
23
25
|
'function modifyLiquidities(bytes unlockData, uint256 deadline) payable',
|
|
24
26
|
'function multicall(bytes[] data) payable returns (bytes[] results)',
|
|
27
|
+
'function permitBatch(address owner, AllowanceTransferPermitBatch permitBatch, bytes signature) payable returns (bytes err)',
|
|
25
28
|
]);
|
|
26
29
|
export * from './v3-abis.js';
|
|
27
30
|
//# sourceMappingURL=abis.js.map
|
package/dist/abis.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abis.js","sourceRoot":"","sources":["../src/abis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,+EAA+E;AAC/E,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC;IACrC,+CAA+C;IAC/C,qHAAqH;IACrH,wEAAwE;IACxE,2EAA2E;IAC3E,kHAAkH;CACnH,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;IAClC,+CAA+C;IAC/C,wGAAwG;IACxG,0GAA0G;IAC1G,gHAAgH;CACjH,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACvC,4KAA4K;CAC7K,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC3C,wGAAwG;IACxG,oFAAoF;IACpF,wEAAwE;IACxE,oEAAoE;
|
|
1
|
+
{"version":3,"file":"abis.js","sourceRoot":"","sources":["../src/abis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,+EAA+E;AAC/E,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC;IACrC,+CAA+C;IAC/C,qHAAqH;IACrH,wEAAwE;IACxE,2EAA2E;IAC3E,kHAAkH;CACnH,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;IAClC,+CAA+C;IAC/C,wGAAwG;IACxG,0GAA0G;IAC1G,gHAAgH;CACjH,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACvC,4KAA4K;CAC7K,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC3C,wGAAwG;IACxG,qGAAqG;IACrG,mHAAmH;IACnH,oFAAoF;IACpF,wEAAwE;IACxE,oEAAoE;IACpE,4HAA4H;CAC7H,CAAC,CAAC;AAEH,cAAc,cAAc,CAAC","sourcesContent":["import { parseAbi } from 'viem';\n\n// Standard v4-core/periphery selectors; extracted from the bot's read surface.\n// They do not attest compatibility of a supplied custom deployment.\nexport const v4StateViewAbi = parseAbi([\n 'function poolManager() view returns (address)',\n 'function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee)',\n 'function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)',\n 'function getTickBitmap(bytes32 poolId, int16 word) view returns (uint256)',\n 'function getTickLiquidity(bytes32 poolId, int24 tick) view returns (uint128 liquidityGross, int128 liquidityNet)',\n]);\nexport const v4QuoterAbi = parseAbi([\n 'function poolManager() view returns (address)',\n 'struct PoolKey { address currency0; address currency1; uint24 fee; int24 tickSpacing; address hooks; }',\n 'struct QuoteExactSingleParams { PoolKey poolKey; bool zeroForOne; uint128 exactAmount; bytes hookData; }',\n 'function quoteExactInputSingle(QuoteExactSingleParams params) returns (uint256 amountOut, uint256 gasEstimate)',\n]);\nexport const v4PoolManagerAbi = parseAbi([\n 'event Initialize(bytes32 indexed id, address indexed currency0, address indexed currency1, uint24 fee, int24 tickSpacing, address hooks, uint160 sqrtPriceX96, int24 tick)',\n]);\nexport const v4PositionManagerAbi = parseAbi([\n 'struct PoolKey { address currency0; address currency1; uint24 fee; int24 tickSpacing; address hooks; }',\n 'struct AllowanceTransferDetails { address token; uint160 amount; uint48 expiration; uint48 nonce; }',\n 'struct AllowanceTransferPermitBatch { AllowanceTransferDetails[] details; address spender; uint256 sigDeadline; }',\n 'function initializePool(PoolKey key, uint160 sqrtPriceX96) payable returns (int24)',\n 'function modifyLiquidities(bytes unlockData, uint256 deadline) payable',\n 'function multicall(bytes[] data) payable returns (bytes[] results)',\n 'function permitBatch(address owner, AllowanceTransferPermitBatch permitBatch, bytes signature) payable returns (bytes err)',\n]);\n\nexport * from './v3-abis.js';\n"]}
|
|
@@ -31,6 +31,23 @@ export type V4MintPositionParams = {
|
|
|
31
31
|
hookData?: Hex;
|
|
32
32
|
/** Atomically initializes the pool before minting. Requires `pool.sqrtPriceX96` to be the intended starting price. */
|
|
33
33
|
createPool?: boolean;
|
|
34
|
+
/** A Permit2 batch approval signed by the caller's own wallet; see `buildV4MintPermitBatchTypedData`. */
|
|
35
|
+
batchPermit?: V4BatchPermit;
|
|
36
|
+
};
|
|
37
|
+
export type V4BatchPermitDetail = {
|
|
38
|
+
token: Address;
|
|
39
|
+
amount: bigint;
|
|
40
|
+
expiration: bigint;
|
|
41
|
+
nonce: bigint;
|
|
42
|
+
};
|
|
43
|
+
export type V4BatchPermit = {
|
|
44
|
+
owner: Address;
|
|
45
|
+
permitBatch: {
|
|
46
|
+
details: readonly V4BatchPermitDetail[];
|
|
47
|
+
spender: Address;
|
|
48
|
+
sigDeadline: bigint;
|
|
49
|
+
};
|
|
50
|
+
signature: Hex;
|
|
34
51
|
};
|
|
35
52
|
/**
|
|
36
53
|
* Builds unsigned calldata for `PositionManager.modifyLiquidities` minting a new v4 position.
|
|
@@ -38,10 +55,12 @@ export type V4MintPositionParams = {
|
|
|
38
55
|
* Actions/multicall encoding Uniswap's own SDK uses) rather than hand-rolling it, since v4's
|
|
39
56
|
* calldata is a sequence of packed actions, not a single ABI-encoded function call like v3's.
|
|
40
57
|
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
58
|
+
* Pass `batchPermit` (built via `buildV4MintPermitBatchTypedData` and signed by the caller's own
|
|
59
|
+
* wallet) to fold a Permit2 approval into this same transaction instead of requiring a prior,
|
|
60
|
+
* separate ERC20 `approve`. Without it, callers must already hold a plain ERC20 approval or the
|
|
61
|
+
* built transaction will revert on-chain. Hook-permission gating (refusing a pool whose hook
|
|
62
|
+
* implements more than the caller has modelled) is the caller's responsibility either way; this
|
|
63
|
+
* function only encodes what it is given.
|
|
45
64
|
*/
|
|
46
65
|
export declare function buildV4MintPositionTransaction(input: V4MintPositionParams): V4TransactionMaterial;
|
|
47
66
|
export type V4PoolKeyMaterial = {
|
|
@@ -63,6 +82,8 @@ export type V4MintActionParams = {
|
|
|
63
82
|
deadline: bigint;
|
|
64
83
|
/** Present only if this mint atomically initializes the pool; the price it initializes at. */
|
|
65
84
|
createdAtSqrtPriceX96?: bigint;
|
|
85
|
+
/** Present only if this mint folds in a Permit2 batch approval; the address that signed it. */
|
|
86
|
+
batchPermitOwner?: Address;
|
|
66
87
|
};
|
|
67
88
|
export type V4ExpectedMint = V4PoolKeyMaterial & {
|
|
68
89
|
recipient: Address;
|
|
@@ -74,14 +95,27 @@ export type V4ExpectedMint = V4PoolKeyMaterial & {
|
|
|
74
95
|
* pool-creating mint by `createdAtSqrtPriceX96` being absent from the result.
|
|
75
96
|
*/
|
|
76
97
|
sqrtPriceX96?: bigint;
|
|
98
|
+
/**
|
|
99
|
+
* Required if this mint folds in a Permit2 batch approval; the only owner/spender/
|
|
100
|
+
* sigDeadline/token-detail set that approval may authorize. Checked only in that
|
|
101
|
+
* direction, the same as `sqrtPriceX96` — omitting it fails closed if the calldata
|
|
102
|
+
* does include a permit, rather than trusting whatever it authorizes.
|
|
103
|
+
*/
|
|
104
|
+
batchPermit?: {
|
|
105
|
+
owner: Address;
|
|
106
|
+
spender: Address;
|
|
107
|
+
sigDeadline: bigint;
|
|
108
|
+
details: readonly V4BatchPermitDetail[];
|
|
109
|
+
};
|
|
77
110
|
};
|
|
78
111
|
/**
|
|
79
112
|
* Decodes and verifies calldata built by `buildV4MintPositionTransaction`: a
|
|
80
113
|
* `modifyLiquidities` call — optionally wrapped in a `multicall` alongside pool
|
|
81
|
-
* initialization — encoding exactly a MINT_POSITION
|
|
82
|
-
* for a native-currency0 mint, a trailing SWEEP. This is
|
|
83
|
-
* that function produces; any other sequence is calldata this
|
|
84
|
-
* recognise as its own and refuses, rather than guessing at its
|
|
114
|
+
* initialization and/or a Permit2 batch approval — encoding exactly a MINT_POSITION
|
|
115
|
+
* action, a SETTLE_PAIR, and, for a native-currency0 mint, a trailing SWEEP. This is
|
|
116
|
+
* the only action shape that function produces; any other sequence is calldata this
|
|
117
|
+
* decoder does not recognise as its own and refuses, rather than guessing at its
|
|
118
|
+
* meaning.
|
|
85
119
|
*
|
|
86
120
|
* `expected` must name the full pool (including `hooks`), not just the token
|
|
87
121
|
* pair — a mint into the same pair through a different, unreviewed hook is a
|
|
@@ -91,7 +125,10 @@ export type V4ExpectedMint = V4PoolKeyMaterial & {
|
|
|
91
125
|
* `V4PoolKey`/`Pool` represent it elsewhere in this SDK — this function does
|
|
92
126
|
* not reorder or reinterpret them. Pass `sqrtPriceX96` when the mint might
|
|
93
127
|
* atomically create the pool; omitting it fails closed rather than silently
|
|
94
|
-
* accepting whatever starting price the calldata sets.
|
|
128
|
+
* accepting whatever starting price the calldata sets. Pass `batchPermit` when
|
|
129
|
+
* the mint might fold in a Permit2 approval, for the same reason — a decoded
|
|
130
|
+
* permit's token/owner/spender are also self-checked against the pool regardless
|
|
131
|
+
* of what `expected` claims.
|
|
95
132
|
*/
|
|
96
133
|
export declare function reviewV4MintPositionCalldata(data: Hex, expected: V4ExpectedMint): V4MintActionParams;
|
|
97
134
|
//# sourceMappingURL=v4-transactions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v4-transactions.d.ts","sourceRoot":"","sources":["../src/v4-transactions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAA4E,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAMxH,MAAM,MAAM,qBAAqB,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9E,oGAAoG;AACpG,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,QAAQ,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,eAAe,EAAE,OAAO,CAAC;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,sHAAsH;IACtH,UAAU,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"v4-transactions.d.ts","sourceRoot":"","sources":["../src/v4-transactions.ts"],"names":[],"mappings":"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"}
|
package/dist/v4-transactions.js
CHANGED
|
@@ -9,16 +9,21 @@ function slippagePercent(bps) {
|
|
|
9
9
|
}
|
|
10
10
|
return new Percent(bps, 10_000);
|
|
11
11
|
}
|
|
12
|
+
function same(a, b) {
|
|
13
|
+
return a.toLowerCase() === b.toLowerCase();
|
|
14
|
+
}
|
|
12
15
|
/**
|
|
13
16
|
* Builds unsigned calldata for `PositionManager.modifyLiquidities` minting a new v4 position.
|
|
14
17
|
* Delegates encoding to `@uniswap/v4-sdk`'s `V4PositionManager`/`V4PositionPlanner` (the same
|
|
15
18
|
* Actions/multicall encoding Uniswap's own SDK uses) rather than hand-rolling it, since v4's
|
|
16
19
|
* calldata is a sequence of packed actions, not a single ABI-encoded function call like v3's.
|
|
17
20
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
21
|
+
* Pass `batchPermit` (built via `buildV4MintPermitBatchTypedData` and signed by the caller's own
|
|
22
|
+
* wallet) to fold a Permit2 approval into this same transaction instead of requiring a prior,
|
|
23
|
+
* separate ERC20 `approve`. Without it, callers must already hold a plain ERC20 approval or the
|
|
24
|
+
* built transaction will revert on-chain. Hook-permission gating (refusing a pool whose hook
|
|
25
|
+
* implements more than the caller has modelled) is the caller's responsibility either way; this
|
|
26
|
+
* function only encodes what it is given.
|
|
22
27
|
*/
|
|
23
28
|
export function buildV4MintPositionTransaction(input) {
|
|
24
29
|
if (input.liquidity <= 0n)
|
|
@@ -31,6 +36,26 @@ export function buildV4MintPositionTransaction(input) {
|
|
|
31
36
|
const positionManager = checkedAddress(input.positionManager);
|
|
32
37
|
const recipient = checkedAddress(input.recipient);
|
|
33
38
|
const slippageTolerance = slippagePercent(input.slippageToleranceBps);
|
|
39
|
+
if (input.batchPermit) {
|
|
40
|
+
if (!same(input.batchPermit.permitBatch.spender, positionManager)) {
|
|
41
|
+
invalid('batchPermit.permitBatch.spender must be the position manager this transaction submits to');
|
|
42
|
+
}
|
|
43
|
+
if (!input.batchPermit.permitBatch.details.length)
|
|
44
|
+
invalid('batchPermit.permitBatch.details must include at least one token');
|
|
45
|
+
const poolTokens = [input.pool.currency0, input.pool.currency1]
|
|
46
|
+
.filter(currency => !currency.isNative)
|
|
47
|
+
.map(currency => checkedAddress(currency.wrapped.address));
|
|
48
|
+
const seen = new Set();
|
|
49
|
+
for (const detail of input.batchPermit.permitBatch.details) {
|
|
50
|
+
const token = checkedAddress(detail.token);
|
|
51
|
+
if (!poolTokens.some(poolToken => same(poolToken, token))) {
|
|
52
|
+
invalid('batchPermit.permitBatch.details references a token that is not part of this mint\'s pool');
|
|
53
|
+
}
|
|
54
|
+
if (seen.has(token.toLowerCase()))
|
|
55
|
+
invalid('batchPermit.permitBatch.details lists the same token more than once');
|
|
56
|
+
seen.add(token.toLowerCase());
|
|
57
|
+
}
|
|
58
|
+
}
|
|
34
59
|
try {
|
|
35
60
|
const pool = new Pool(input.pool.currency0, input.pool.currency1, input.pool.fee, input.pool.tickSpacing, checkedAddress(input.pool.hooks), input.pool.sqrtPriceX96.toString(), input.pool.liquidity.toString(), input.pool.tickCurrent);
|
|
36
61
|
const position = new Position({
|
|
@@ -47,6 +72,22 @@ export function buildV4MintPositionTransaction(input) {
|
|
|
47
72
|
slippageTolerance,
|
|
48
73
|
hookData: input.hookData,
|
|
49
74
|
deadline: input.deadlineSeconds.toString(),
|
|
75
|
+
...(input.batchPermit ? {
|
|
76
|
+
batchPermit: {
|
|
77
|
+
owner: checkedAddress(input.batchPermit.owner),
|
|
78
|
+
permitBatch: {
|
|
79
|
+
details: input.batchPermit.permitBatch.details.map(detail => ({
|
|
80
|
+
token: checkedAddress(detail.token),
|
|
81
|
+
amount: detail.amount.toString(),
|
|
82
|
+
expiration: detail.expiration.toString(),
|
|
83
|
+
nonce: detail.nonce.toString(),
|
|
84
|
+
})),
|
|
85
|
+
spender: checkedAddress(input.batchPermit.permitBatch.spender),
|
|
86
|
+
sigDeadline: input.batchPermit.permitBatch.sigDeadline.toString(),
|
|
87
|
+
},
|
|
88
|
+
signature: input.batchPermit.signature,
|
|
89
|
+
},
|
|
90
|
+
} : {}),
|
|
50
91
|
});
|
|
51
92
|
return { to: positionManager, data: params.calldata, value: BigInt(params.value) };
|
|
52
93
|
}
|
|
@@ -66,9 +107,6 @@ const poolKeyStruct = '(address currency0, address currency1, uint24 fee, int24
|
|
|
66
107
|
const mintPositionParams = parseAbiParameters(`${poolKeyStruct} poolKey, int24 tickLower, int24 tickUpper, uint256 liquidity, uint128 amount0Max, uint128 amount1Max, address owner, bytes hookData`);
|
|
67
108
|
const settlePairParams = parseAbiParameters('address currency0, address currency1');
|
|
68
109
|
const sweepParams = parseAbiParameters('address currency, address to');
|
|
69
|
-
function same(a, b) {
|
|
70
|
-
return a.toLowerCase() === b.toLowerCase();
|
|
71
|
-
}
|
|
72
110
|
function mismatch(message) {
|
|
73
111
|
throw new UniswapSdkError('CALLDATA_MISMATCH', message);
|
|
74
112
|
}
|
|
@@ -86,13 +124,32 @@ function samePoolKey(a, b) {
|
|
|
86
124
|
return same(a.currency0, b.currency0) && same(a.currency1, b.currency1)
|
|
87
125
|
&& a.fee === b.fee && a.tickSpacing === b.tickSpacing && same(a.hooks, b.hooks);
|
|
88
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* A 1:1 pairing, not "every actual detail matches some expected detail" — that weaker check
|
|
129
|
+
* would let `[A, A]` pass against `expected = [A, B]` (both actual entries match A; lengths
|
|
130
|
+
* happen to agree), silently ignoring that B was never actually authorized and A appears twice.
|
|
131
|
+
*/
|
|
132
|
+
function sameBatchPermitDetails(actual, expected) {
|
|
133
|
+
if (actual.length !== expected.length)
|
|
134
|
+
return false;
|
|
135
|
+
const remaining = expected.slice();
|
|
136
|
+
for (const detail of actual) {
|
|
137
|
+
const index = remaining.findIndex(candidate => same(candidate.token, detail.token)
|
|
138
|
+
&& candidate.amount === detail.amount && candidate.expiration === detail.expiration && candidate.nonce === detail.nonce);
|
|
139
|
+
if (index === -1)
|
|
140
|
+
return false;
|
|
141
|
+
remaining.splice(index, 1);
|
|
142
|
+
}
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
89
145
|
/**
|
|
90
146
|
* Decodes and verifies calldata built by `buildV4MintPositionTransaction`: a
|
|
91
147
|
* `modifyLiquidities` call — optionally wrapped in a `multicall` alongside pool
|
|
92
|
-
* initialization — encoding exactly a MINT_POSITION
|
|
93
|
-
* for a native-currency0 mint, a trailing SWEEP. This is
|
|
94
|
-
* that function produces; any other sequence is calldata this
|
|
95
|
-
* recognise as its own and refuses, rather than guessing at its
|
|
148
|
+
* initialization and/or a Permit2 batch approval — encoding exactly a MINT_POSITION
|
|
149
|
+
* action, a SETTLE_PAIR, and, for a native-currency0 mint, a trailing SWEEP. This is
|
|
150
|
+
* the only action shape that function produces; any other sequence is calldata this
|
|
151
|
+
* decoder does not recognise as its own and refuses, rather than guessing at its
|
|
152
|
+
* meaning.
|
|
96
153
|
*
|
|
97
154
|
* `expected` must name the full pool (including `hooks`), not just the token
|
|
98
155
|
* pair — a mint into the same pair through a different, unreviewed hook is a
|
|
@@ -102,7 +159,10 @@ function samePoolKey(a, b) {
|
|
|
102
159
|
* `V4PoolKey`/`Pool` represent it elsewhere in this SDK — this function does
|
|
103
160
|
* not reorder or reinterpret them. Pass `sqrtPriceX96` when the mint might
|
|
104
161
|
* atomically create the pool; omitting it fails closed rather than silently
|
|
105
|
-
* accepting whatever starting price the calldata sets.
|
|
162
|
+
* accepting whatever starting price the calldata sets. Pass `batchPermit` when
|
|
163
|
+
* the mint might fold in a Permit2 approval, for the same reason — a decoded
|
|
164
|
+
* permit's token/owner/spender are also self-checked against the pool regardless
|
|
165
|
+
* of what `expected` claims.
|
|
106
166
|
*/
|
|
107
167
|
export function reviewV4MintPositionCalldata(data, expected) {
|
|
108
168
|
try {
|
|
@@ -110,13 +170,36 @@ export function reviewV4MintPositionCalldata(data, expected) {
|
|
|
110
170
|
let unlockData;
|
|
111
171
|
let deadline;
|
|
112
172
|
let initialization;
|
|
173
|
+
let batchPermit;
|
|
113
174
|
if (decoded.functionName === 'multicall') {
|
|
114
175
|
const calls = decoded.args[0].map(call => decodeFunctionData({ abi: v4PositionManagerAbi, data: call }));
|
|
115
|
-
if (calls.length
|
|
116
|
-
mismatch('Mint calldata multicall
|
|
176
|
+
if (calls.length < 2 || calls.length > 3)
|
|
177
|
+
mismatch('Mint calldata multicall does not have the call count a plain mint produces');
|
|
178
|
+
const mintCall = calls.at(-1);
|
|
179
|
+
if (mintCall.functionName !== 'modifyLiquidities')
|
|
180
|
+
mismatch('Mint calldata multicall must end with the position mint');
|
|
181
|
+
for (const call of calls.slice(0, -1)) {
|
|
182
|
+
if (call.functionName === 'initializePool') {
|
|
183
|
+
if (initialization)
|
|
184
|
+
mismatch('Mint calldata multicall contains more than one pool initialization');
|
|
185
|
+
initialization = { key: call.args[0], sqrtPriceX96: call.args[1] };
|
|
186
|
+
}
|
|
187
|
+
else if (call.functionName === 'permitBatch') {
|
|
188
|
+
if (batchPermit)
|
|
189
|
+
mismatch('Mint calldata multicall contains more than one permit batch');
|
|
190
|
+
const [owner, permitBatch] = call.args;
|
|
191
|
+
batchPermit = {
|
|
192
|
+
owner,
|
|
193
|
+
spender: permitBatch.spender,
|
|
194
|
+
sigDeadline: permitBatch.sigDeadline,
|
|
195
|
+
details: permitBatch.details.map(detail => ({ token: detail.token, amount: detail.amount, expiration: BigInt(detail.expiration), nonce: BigInt(detail.nonce) })),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
mismatch('Mint calldata multicall contains an unreviewed call before the position mint');
|
|
200
|
+
}
|
|
117
201
|
}
|
|
118
|
-
|
|
119
|
-
[unlockData, deadline] = calls[1].args;
|
|
202
|
+
[unlockData, deadline] = mintCall.args;
|
|
120
203
|
}
|
|
121
204
|
else if (decoded.functionName === 'modifyLiquidities') {
|
|
122
205
|
[unlockData, deadline] = decoded.args;
|
|
@@ -166,9 +249,37 @@ export function reviewV4MintPositionCalldata(data, expected) {
|
|
|
166
249
|
mismatch('Mint calldata initializes the pool at a different starting price than expected');
|
|
167
250
|
}
|
|
168
251
|
}
|
|
252
|
+
if (batchPermit) {
|
|
253
|
+
// Self-checked against the decoded poolKey regardless of what `expected` claims, so a
|
|
254
|
+
// caller who fails to scrutinize `expected` still can't be tricked into treating a permit
|
|
255
|
+
// for an unrelated or duplicated token as reviewed.
|
|
256
|
+
const poolTokens = [poolKey.currency0, poolKey.currency1];
|
|
257
|
+
const seenTokens = new Set();
|
|
258
|
+
for (const detail of batchPermit.details) {
|
|
259
|
+
if (same(detail.token, zeroAddress))
|
|
260
|
+
mismatch('Permit2 batch approval cannot cover the native currency');
|
|
261
|
+
if (!poolTokens.some(poolToken => same(poolToken, detail.token))) {
|
|
262
|
+
mismatch('Permit2 batch approval references a token that is not part of the minted pool');
|
|
263
|
+
}
|
|
264
|
+
const key = detail.token.toLowerCase();
|
|
265
|
+
if (seenTokens.has(key))
|
|
266
|
+
mismatch('Permit2 batch approval lists the same token more than once');
|
|
267
|
+
seenTokens.add(key);
|
|
268
|
+
}
|
|
269
|
+
if (!expected.batchPermit) {
|
|
270
|
+
mismatch('Mint calldata includes a Permit2 batch approval but no expected approval was supplied to verify it');
|
|
271
|
+
}
|
|
272
|
+
if (!same(batchPermit.owner, expected.batchPermit.owner)
|
|
273
|
+
|| !same(batchPermit.spender, expected.batchPermit.spender)
|
|
274
|
+
|| batchPermit.sigDeadline !== expected.batchPermit.sigDeadline
|
|
275
|
+
|| !sameBatchPermitDetails(batchPermit.details, expected.batchPermit.details)) {
|
|
276
|
+
mismatch('Mint calldata\'s Permit2 batch approval does not match what was expected');
|
|
277
|
+
}
|
|
278
|
+
}
|
|
169
279
|
return {
|
|
170
280
|
poolKey, tickLower, tickUpper, liquidity, amount0Max, amount1Max, owner, hookData, deadline,
|
|
171
281
|
...(initialization ? { createdAtSqrtPriceX96: initialization.sqrtPriceX96 } : {}),
|
|
282
|
+
...(batchPermit ? { batchPermitOwner: batchPermit.owner } : {}),
|
|
172
283
|
};
|
|
173
284
|
}
|
|
174
285
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v4-transactions.js","sourceRoot":"","sources":["../src/v4-transactions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Currency } from '@uniswap/sdk-core';\nimport { decodeAbiParameters, decodeFunctionData, parseAbiParameters, zeroAddress, type Address, type Hex } from 'viem';\nimport { Percent, Pool, Position, V4PositionManager } from './official-sdk.cjs';\nimport { checkedAddress } from './pool.js';\nimport { invalid, UniswapSdkError } from './errors.js';\nimport { v4PositionManagerAbi } from './abis.js';\n\nexport type V4TransactionMaterial = { to: Address; data: Hex; value: bigint };\n\n/** Pool state as read from PoolManager/StateView (e.g. via `readV4Pool`), not yet a mint target. */\nexport type V4PoolState = {\n currency0: Currency;\n currency1: Currency;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n sqrtPriceX96: bigint;\n liquidity: bigint;\n tickCurrent: number;\n};\n\nexport type V4MintPositionParams = {\n positionManager: Address;\n pool: V4PoolState;\n tickLower: number;\n tickUpper: number;\n /** Liquidity units to mint, not a token amount. */\n liquidity: bigint;\n recipient: Address;\n /** Integer basis points, 0-10000. */\n slippageToleranceBps: number;\n deadlineSeconds: bigint;\n /** Passed to the hook's callbacks verbatim; this SDK does not construct it. */\n hookData?: Hex;\n /** Atomically initializes the pool before minting. Requires `pool.sqrtPriceX96` to be the intended starting price. */\n createPool?: boolean;\n};\n\nfunction slippagePercent(bps: number): Percent {\n if (!Number.isInteger(bps) || bps < 0 || bps > 10_000) {\n invalid('slippageToleranceBps must be an integer between 0 and 10000');\n }\n return new Percent(bps, 10_000);\n}\n\n/**\n * Builds unsigned calldata for `PositionManager.modifyLiquidities` minting a new v4 position.\n * Delegates encoding to `@uniswap/v4-sdk`'s `V4PositionManager`/`V4PositionPlanner` (the same\n * Actions/multicall encoding Uniswap's own SDK uses) rather than hand-rolling it, since v4's\n * calldata is a sequence of packed actions, not a single ABI-encoded function call like v3's.\n *\n * No Permit2 support yet — callers must have already approved the position manager via a plain\n * ERC20 approval, or the built transaction will revert on-chain. Hook-permission gating (refusing\n * a pool whose hook implements more than the caller has modelled) is also the caller's\n * responsibility; this function only encodes what it is given.\n */\nexport function buildV4MintPositionTransaction(input: V4MintPositionParams): V4TransactionMaterial {\n if (input.liquidity <= 0n) invalid('Mint liquidity must be positive');\n if (!Number.isInteger(input.tickLower) || !Number.isInteger(input.tickUpper) || input.tickLower >= input.tickUpper) {\n invalid('tickLower must be an integer less than tickUpper');\n }\n if (input.createPool && input.pool.sqrtPriceX96 <= 0n) invalid('createPool requires a positive initial sqrtPriceX96');\n const positionManager = checkedAddress(input.positionManager);\n const recipient = checkedAddress(input.recipient);\n const slippageTolerance = slippagePercent(input.slippageToleranceBps);\n\n try {\n const pool = new Pool(\n input.pool.currency0,\n input.pool.currency1,\n input.pool.fee,\n input.pool.tickSpacing,\n checkedAddress(input.pool.hooks),\n input.pool.sqrtPriceX96.toString(),\n input.pool.liquidity.toString(),\n input.pool.tickCurrent,\n );\n const position = new Position({\n pool,\n liquidity: input.liquidity.toString(),\n tickLower: input.tickLower,\n tickUpper: input.tickUpper,\n });\n const params = V4PositionManager.addCallParameters(position, {\n recipient,\n createPool: input.createPool ?? false,\n ...(input.createPool ? { sqrtPriceX96: input.pool.sqrtPriceX96.toString() } : {}),\n useNative: pool.currency0.isNative ? pool.currency0 : undefined,\n slippageTolerance,\n hookData: input.hookData,\n deadline: input.deadlineSeconds.toString(),\n });\n return { to: positionManager, data: params.calldata as Hex, value: BigInt(params.value) };\n } catch (cause) {\n if (cause instanceof UniswapSdkError) throw cause;\n throw new UniswapSdkError('INVALID_ARGUMENT', 'Official Uniswap SDK rejected the mint parameters', { cause });\n }\n}\n\nconst MINT_POSITION_ACTION = 2;\nconst SETTLE_PAIR_ACTION = 13;\nconst SWEEP_ACTION = 20;\n/** PositionManager's `msgSender()` sentinel; the only address `SWEEP` may refund to. */\nconst MSG_SENDER: Address = '0x0000000000000000000000000000000000000001';\n\nconst unlockDataParams = parseAbiParameters('bytes actions, bytes[] params');\nconst poolKeyStruct = '(address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks)';\nconst mintPositionParams = parseAbiParameters(\n `${poolKeyStruct} poolKey, int24 tickLower, int24 tickUpper, uint256 liquidity, uint128 amount0Max, uint128 amount1Max, address owner, bytes hookData`,\n);\nconst settlePairParams = parseAbiParameters('address currency0, address currency1');\nconst sweepParams = parseAbiParameters('address currency, address to');\n\nexport type V4PoolKeyMaterial = { currency0: Address; currency1: Address; fee: number; tickSpacing: number; hooks: Address };\nexport type V4MintActionParams = {\n poolKey: V4PoolKeyMaterial;\n tickLower: number;\n tickUpper: number;\n liquidity: bigint;\n amount0Max: bigint;\n amount1Max: bigint;\n owner: Address;\n hookData: Hex;\n deadline: bigint;\n /** Present only if this mint atomically initializes the pool; the price it initializes at. */\n createdAtSqrtPriceX96?: bigint;\n};\n\nfunction same(a: string, b: string): boolean {\n return a.toLowerCase() === b.toLowerCase();\n}\n\nfunction mismatch(message: string): never {\n throw new UniswapSdkError('CALLDATA_MISMATCH', message);\n}\n\n/** `bytes actions` packs one uint8 opcode per action, two hex characters each. */\nfunction decodeActionIds(actions: Hex): number[] {\n const hex = actions.slice(2);\n if (hex.length % 2 !== 0) mismatch('Mint calldata has a malformed action byte string');\n const ids: number[] = [];\n for (let i = 0; i < hex.length; i += 2) ids.push(parseInt(hex.slice(i, i + 2), 16));\n return ids;\n}\n\nfunction samePoolKey(a: V4PoolKeyMaterial, b: V4PoolKeyMaterial): boolean {\n return same(a.currency0, b.currency0) && same(a.currency1, b.currency1)\n && a.fee === b.fee && a.tickSpacing === b.tickSpacing && same(a.hooks, b.hooks);\n}\n\nexport type V4ExpectedMint = V4PoolKeyMaterial & {\n recipient: Address;\n /**\n * Required if this mint might atomically create the pool; the only price that\n * mint may set. Checked only in that direction: supplying it does not require\n * the calldata to actually create the pool — a plain mint into an\n * already-initialized pool is unaffected either way, distinguishable from a\n * pool-creating mint by `createdAtSqrtPriceX96` being absent from the result.\n */\n sqrtPriceX96?: bigint;\n};\n\n/**\n * Decodes and verifies calldata built by `buildV4MintPositionTransaction`: a\n * `modifyLiquidities` call — optionally wrapped in a `multicall` alongside pool\n * initialization — encoding exactly a MINT_POSITION action, a SETTLE_PAIR, and,\n * for a native-currency0 mint, a trailing SWEEP. This is the only action shape\n * that function produces; any other sequence is calldata this decoder does not\n * recognise as its own and refuses, rather than guessing at its meaning.\n *\n * `expected` must name the full pool (including `hooks`), not just the token\n * pair — a mint into the same pair through a different, unreviewed hook is a\n * different pool with different economics, not a cosmetic difference.\n * `currency0`/`currency1` must already be in canonical (sorted) order, and a\n * native-currency pool's `currency0` must be the zero address, matching how\n * `V4PoolKey`/`Pool` represent it elsewhere in this SDK — this function does\n * not reorder or reinterpret them. Pass `sqrtPriceX96` when the mint might\n * atomically create the pool; omitting it fails closed rather than silently\n * accepting whatever starting price the calldata sets.\n */\nexport function reviewV4MintPositionCalldata(data: Hex, expected: V4ExpectedMint): V4MintActionParams {\n try {\n const decoded = decodeFunctionData({ abi: v4PositionManagerAbi, data });\n let unlockData: Hex;\n let deadline: bigint;\n let initialization: { key: V4PoolKeyMaterial; sqrtPriceX96: bigint } | undefined;\n if (decoded.functionName === 'multicall') {\n const calls = decoded.args[0].map(call => decodeFunctionData({ abi: v4PositionManagerAbi, data: call }));\n if (calls.length !== 2 || calls[0]!.functionName !== 'initializePool' || calls[1]!.functionName !== 'modifyLiquidities') {\n mismatch('Mint calldata multicall must contain only pool initialization followed by one mint');\n }\n initialization = { key: calls[0]!.args[0] as V4PoolKeyMaterial, sqrtPriceX96: calls[0]!.args[1] as bigint };\n [unlockData, deadline] = calls[1]!.args as [Hex, bigint];\n } else if (decoded.functionName === 'modifyLiquidities') {\n [unlockData, deadline] = decoded.args;\n } else {\n return mismatch('Mint calldata is not a position-manager modifyLiquidities call');\n }\n\n const [actionsBytes, actionParams] = decodeAbiParameters(unlockDataParams, unlockData) as [Hex, readonly Hex[]];\n const actionIds = decodeActionIds(actionsBytes);\n if (actionIds.length !== actionParams.length) mismatch('Mint calldata has a different number of actions and action parameters');\n if (actionIds.length < 2 || actionIds.length > 3) mismatch('Mint calldata does not have the action count a plain mint produces');\n\n if (actionIds[0] !== MINT_POSITION_ACTION) mismatch('Mint calldata must begin with a MINT_POSITION action');\n const [poolKey, tickLower, tickUpper, liquidity, amount0Max, amount1Max, owner, hookData] = decodeAbiParameters(\n mintPositionParams,\n actionParams[0]!,\n ) as [V4PoolKeyMaterial, number, number, bigint, bigint, bigint, Address, Hex];\n if (liquidity <= 0n) mismatch('Mint calldata mints non-positive liquidity');\n\n if (initialization && !samePoolKey(initialization.key, poolKey)) {\n mismatch('Mint pool initialization targets a different pool than the position mint');\n }\n\n if (actionIds[1] !== SETTLE_PAIR_ACTION) mismatch('MINT_POSITION must be followed by a SETTLE_PAIR');\n const [settleCurrency0, settleCurrency1] = decodeAbiParameters(settlePairParams, actionParams[1]!) as [Address, Address];\n if (!same(settleCurrency0, poolKey.currency0) || !same(settleCurrency1, poolKey.currency1)) {\n mismatch('SETTLE_PAIR settles a different pair than the minted position');\n }\n\n if (actionIds.length === 3) {\n if (actionIds[2] !== SWEEP_ACTION) mismatch('Mint calldata has an unreviewed action after SETTLE_PAIR');\n const [sweepCurrency, sweepTo] = decodeAbiParameters(sweepParams, actionParams[2]!) as [Address, Address];\n if (!same(sweepCurrency, zeroAddress) && !same(sweepCurrency, poolKey.currency0)) {\n mismatch('SWEEP refunds an unexpected currency');\n }\n if (!same(sweepTo, MSG_SENDER)) mismatch('SWEEP sends the refund to an unexpected recipient');\n }\n\n if (!samePoolKey(poolKey, expected)) mismatch('Mint calldata targets a different pool than expected');\n if (!same(owner, expected.recipient)) mismatch('Mint calldata sends the position NFT to a different recipient');\n\n if (initialization) {\n if (expected.sqrtPriceX96 === undefined) {\n mismatch('Mint calldata initializes the pool but no expected starting price was supplied to verify it');\n }\n if (initialization.sqrtPriceX96 !== expected.sqrtPriceX96) {\n mismatch('Mint calldata initializes the pool at a different starting price than expected');\n }\n }\n\n return {\n poolKey, tickLower, tickUpper, liquidity, amount0Max, amount1Max, owner, hookData, deadline,\n ...(initialization ? { createdAtSqrtPriceX96: initialization.sqrtPriceX96 } : {}),\n };\n } catch (error) {\n if (error instanceof UniswapSdkError) throw error;\n throw new UniswapSdkError('CALLDATA_MISMATCH', 'Mint calldata contains undecodable position-manager calls', { cause: error });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"v4-transactions.js","sourceRoot":"","sources":["../src/v4-transactions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Currency } from '@uniswap/sdk-core';\nimport { decodeAbiParameters, decodeFunctionData, parseAbiParameters, zeroAddress, type Address, type Hex } from 'viem';\nimport { Percent, Pool, Position, V4PositionManager } from './official-sdk.cjs';\nimport { checkedAddress } from './pool.js';\nimport { invalid, UniswapSdkError } from './errors.js';\nimport { v4PositionManagerAbi } from './abis.js';\n\nexport type V4TransactionMaterial = { to: Address; data: Hex; value: bigint };\n\n/** Pool state as read from PoolManager/StateView (e.g. via `readV4Pool`), not yet a mint target. */\nexport type V4PoolState = {\n currency0: Currency;\n currency1: Currency;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n sqrtPriceX96: bigint;\n liquidity: bigint;\n tickCurrent: number;\n};\n\nexport type V4MintPositionParams = {\n positionManager: Address;\n pool: V4PoolState;\n tickLower: number;\n tickUpper: number;\n /** Liquidity units to mint, not a token amount. */\n liquidity: bigint;\n recipient: Address;\n /** Integer basis points, 0-10000. */\n slippageToleranceBps: number;\n deadlineSeconds: bigint;\n /** Passed to the hook's callbacks verbatim; this SDK does not construct it. */\n hookData?: Hex;\n /** Atomically initializes the pool before minting. Requires `pool.sqrtPriceX96` to be the intended starting price. */\n createPool?: boolean;\n /** A Permit2 batch approval signed by the caller's own wallet; see `buildV4MintPermitBatchTypedData`. */\n batchPermit?: V4BatchPermit;\n};\n\nfunction slippagePercent(bps: number): Percent {\n if (!Number.isInteger(bps) || bps < 0 || bps > 10_000) {\n invalid('slippageToleranceBps must be an integer between 0 and 10000');\n }\n return new Percent(bps, 10_000);\n}\n\nfunction same(a: string, b: string): boolean {\n return a.toLowerCase() === b.toLowerCase();\n}\n\nexport type V4BatchPermitDetail = { token: Address; amount: bigint; expiration: bigint; nonce: bigint };\nexport type V4BatchPermit = {\n owner: Address;\n permitBatch: { details: readonly V4BatchPermitDetail[]; spender: Address; sigDeadline: bigint };\n signature: Hex;\n};\n\n/**\n * Builds unsigned calldata for `PositionManager.modifyLiquidities` minting a new v4 position.\n * Delegates encoding to `@uniswap/v4-sdk`'s `V4PositionManager`/`V4PositionPlanner` (the same\n * Actions/multicall encoding Uniswap's own SDK uses) rather than hand-rolling it, since v4's\n * calldata is a sequence of packed actions, not a single ABI-encoded function call like v3's.\n *\n * Pass `batchPermit` (built via `buildV4MintPermitBatchTypedData` and signed by the caller's own\n * wallet) to fold a Permit2 approval into this same transaction instead of requiring a prior,\n * separate ERC20 `approve`. Without it, callers must already hold a plain ERC20 approval or the\n * built transaction will revert on-chain. Hook-permission gating (refusing a pool whose hook\n * implements more than the caller has modelled) is the caller's responsibility either way; this\n * function only encodes what it is given.\n */\nexport function buildV4MintPositionTransaction(input: V4MintPositionParams): V4TransactionMaterial {\n if (input.liquidity <= 0n) invalid('Mint liquidity must be positive');\n if (!Number.isInteger(input.tickLower) || !Number.isInteger(input.tickUpper) || input.tickLower >= input.tickUpper) {\n invalid('tickLower must be an integer less than tickUpper');\n }\n if (input.createPool && input.pool.sqrtPriceX96 <= 0n) invalid('createPool requires a positive initial sqrtPriceX96');\n const positionManager = checkedAddress(input.positionManager);\n const recipient = checkedAddress(input.recipient);\n const slippageTolerance = slippagePercent(input.slippageToleranceBps);\n\n if (input.batchPermit) {\n if (!same(input.batchPermit.permitBatch.spender, positionManager)) {\n invalid('batchPermit.permitBatch.spender must be the position manager this transaction submits to');\n }\n if (!input.batchPermit.permitBatch.details.length) invalid('batchPermit.permitBatch.details must include at least one token');\n const poolTokens = [input.pool.currency0, input.pool.currency1]\n .filter(currency => !currency.isNative)\n .map(currency => checkedAddress(currency.wrapped.address as Address));\n const seen = new Set<string>();\n for (const detail of input.batchPermit.permitBatch.details) {\n const token = checkedAddress(detail.token);\n if (!poolTokens.some(poolToken => same(poolToken, token))) {\n invalid('batchPermit.permitBatch.details references a token that is not part of this mint\\'s pool');\n }\n if (seen.has(token.toLowerCase())) invalid('batchPermit.permitBatch.details lists the same token more than once');\n seen.add(token.toLowerCase());\n }\n }\n\n try {\n const pool = new Pool(\n input.pool.currency0,\n input.pool.currency1,\n input.pool.fee,\n input.pool.tickSpacing,\n checkedAddress(input.pool.hooks),\n input.pool.sqrtPriceX96.toString(),\n input.pool.liquidity.toString(),\n input.pool.tickCurrent,\n );\n const position = new Position({\n pool,\n liquidity: input.liquidity.toString(),\n tickLower: input.tickLower,\n tickUpper: input.tickUpper,\n });\n const params = V4PositionManager.addCallParameters(position, {\n recipient,\n createPool: input.createPool ?? false,\n ...(input.createPool ? { sqrtPriceX96: input.pool.sqrtPriceX96.toString() } : {}),\n useNative: pool.currency0.isNative ? pool.currency0 : undefined,\n slippageTolerance,\n hookData: input.hookData,\n deadline: input.deadlineSeconds.toString(),\n ...(input.batchPermit ? {\n batchPermit: {\n owner: checkedAddress(input.batchPermit.owner),\n permitBatch: {\n details: input.batchPermit.permitBatch.details.map(detail => ({\n token: checkedAddress(detail.token),\n amount: detail.amount.toString(),\n expiration: detail.expiration.toString(),\n nonce: detail.nonce.toString(),\n })),\n spender: checkedAddress(input.batchPermit.permitBatch.spender),\n sigDeadline: input.batchPermit.permitBatch.sigDeadline.toString(),\n },\n signature: input.batchPermit.signature,\n },\n } : {}),\n });\n return { to: positionManager, data: params.calldata as Hex, value: BigInt(params.value) };\n } catch (cause) {\n if (cause instanceof UniswapSdkError) throw cause;\n throw new UniswapSdkError('INVALID_ARGUMENT', 'Official Uniswap SDK rejected the mint parameters', { cause });\n }\n}\n\nconst MINT_POSITION_ACTION = 2;\nconst SETTLE_PAIR_ACTION = 13;\nconst SWEEP_ACTION = 20;\n/** PositionManager's `msgSender()` sentinel; the only address `SWEEP` may refund to. */\nconst MSG_SENDER: Address = '0x0000000000000000000000000000000000000001';\n\nconst unlockDataParams = parseAbiParameters('bytes actions, bytes[] params');\nconst poolKeyStruct = '(address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks)';\nconst mintPositionParams = parseAbiParameters(\n `${poolKeyStruct} poolKey, int24 tickLower, int24 tickUpper, uint256 liquidity, uint128 amount0Max, uint128 amount1Max, address owner, bytes hookData`,\n);\nconst settlePairParams = parseAbiParameters('address currency0, address currency1');\nconst sweepParams = parseAbiParameters('address currency, address to');\n\nexport type V4PoolKeyMaterial = { currency0: Address; currency1: Address; fee: number; tickSpacing: number; hooks: Address };\nexport type V4MintActionParams = {\n poolKey: V4PoolKeyMaterial;\n tickLower: number;\n tickUpper: number;\n liquidity: bigint;\n amount0Max: bigint;\n amount1Max: bigint;\n owner: Address;\n hookData: Hex;\n deadline: bigint;\n /** Present only if this mint atomically initializes the pool; the price it initializes at. */\n createdAtSqrtPriceX96?: bigint;\n /** Present only if this mint folds in a Permit2 batch approval; the address that signed it. */\n batchPermitOwner?: Address;\n};\n\nfunction mismatch(message: string): never {\n throw new UniswapSdkError('CALLDATA_MISMATCH', message);\n}\n\n/** `bytes actions` packs one uint8 opcode per action, two hex characters each. */\nfunction decodeActionIds(actions: Hex): number[] {\n const hex = actions.slice(2);\n if (hex.length % 2 !== 0) mismatch('Mint calldata has a malformed action byte string');\n const ids: number[] = [];\n for (let i = 0; i < hex.length; i += 2) ids.push(parseInt(hex.slice(i, i + 2), 16));\n return ids;\n}\n\nfunction samePoolKey(a: V4PoolKeyMaterial, b: V4PoolKeyMaterial): boolean {\n return same(a.currency0, b.currency0) && same(a.currency1, b.currency1)\n && a.fee === b.fee && a.tickSpacing === b.tickSpacing && same(a.hooks, b.hooks);\n}\n\n/**\n * A 1:1 pairing, not \"every actual detail matches some expected detail\" — that weaker check\n * would let `[A, A]` pass against `expected = [A, B]` (both actual entries match A; lengths\n * happen to agree), silently ignoring that B was never actually authorized and A appears twice.\n */\nfunction sameBatchPermitDetails(actual: readonly V4BatchPermitDetail[], expected: readonly V4BatchPermitDetail[]): boolean {\n if (actual.length !== expected.length) return false;\n const remaining = expected.slice();\n for (const detail of actual) {\n const index = remaining.findIndex(candidate => same(candidate.token, detail.token)\n && candidate.amount === detail.amount && candidate.expiration === detail.expiration && candidate.nonce === detail.nonce);\n if (index === -1) return false;\n remaining.splice(index, 1);\n }\n return true;\n}\n\nexport type V4ExpectedMint = V4PoolKeyMaterial & {\n recipient: Address;\n /**\n * Required if this mint might atomically create the pool; the only price that\n * mint may set. Checked only in that direction: supplying it does not require\n * the calldata to actually create the pool — a plain mint into an\n * already-initialized pool is unaffected either way, distinguishable from a\n * pool-creating mint by `createdAtSqrtPriceX96` being absent from the result.\n */\n sqrtPriceX96?: bigint;\n /**\n * Required if this mint folds in a Permit2 batch approval; the only owner/spender/\n * sigDeadline/token-detail set that approval may authorize. Checked only in that\n * direction, the same as `sqrtPriceX96` — omitting it fails closed if the calldata\n * does include a permit, rather than trusting whatever it authorizes.\n */\n batchPermit?: { owner: Address; spender: Address; sigDeadline: bigint; details: readonly V4BatchPermitDetail[] };\n};\n\n/**\n * Decodes and verifies calldata built by `buildV4MintPositionTransaction`: a\n * `modifyLiquidities` call — optionally wrapped in a `multicall` alongside pool\n * initialization and/or a Permit2 batch approval — encoding exactly a MINT_POSITION\n * action, a SETTLE_PAIR, and, for a native-currency0 mint, a trailing SWEEP. This is\n * the only action shape that function produces; any other sequence is calldata this\n * decoder does not recognise as its own and refuses, rather than guessing at its\n * meaning.\n *\n * `expected` must name the full pool (including `hooks`), not just the token\n * pair — a mint into the same pair through a different, unreviewed hook is a\n * different pool with different economics, not a cosmetic difference.\n * `currency0`/`currency1` must already be in canonical (sorted) order, and a\n * native-currency pool's `currency0` must be the zero address, matching how\n * `V4PoolKey`/`Pool` represent it elsewhere in this SDK — this function does\n * not reorder or reinterpret them. Pass `sqrtPriceX96` when the mint might\n * atomically create the pool; omitting it fails closed rather than silently\n * accepting whatever starting price the calldata sets. Pass `batchPermit` when\n * the mint might fold in a Permit2 approval, for the same reason — a decoded\n * permit's token/owner/spender are also self-checked against the pool regardless\n * of what `expected` claims.\n */\nexport function reviewV4MintPositionCalldata(data: Hex, expected: V4ExpectedMint): V4MintActionParams {\n try {\n const decoded = decodeFunctionData({ abi: v4PositionManagerAbi, data });\n let unlockData: Hex;\n let deadline: bigint;\n let initialization: { key: V4PoolKeyMaterial; sqrtPriceX96: bigint } | undefined;\n let batchPermit: { owner: Address; spender: Address; sigDeadline: bigint; details: readonly V4BatchPermitDetail[] } | undefined;\n if (decoded.functionName === 'multicall') {\n const calls = decoded.args[0].map(call => decodeFunctionData({ abi: v4PositionManagerAbi, data: call }));\n if (calls.length < 2 || calls.length > 3) mismatch('Mint calldata multicall does not have the call count a plain mint produces');\n const mintCall = calls.at(-1)!;\n if (mintCall.functionName !== 'modifyLiquidities') mismatch('Mint calldata multicall must end with the position mint');\n for (const call of calls.slice(0, -1)) {\n if (call.functionName === 'initializePool') {\n if (initialization) mismatch('Mint calldata multicall contains more than one pool initialization');\n initialization = { key: call.args[0] as V4PoolKeyMaterial, sqrtPriceX96: call.args[1] as bigint };\n } else if (call.functionName === 'permitBatch') {\n if (batchPermit) mismatch('Mint calldata multicall contains more than one permit batch');\n const [owner, permitBatch] = call.args as readonly [Address, { details: readonly { token: Address; amount: bigint; expiration: number; nonce: number }[]; spender: Address; sigDeadline: bigint }, Hex];\n batchPermit = {\n owner,\n spender: permitBatch.spender,\n sigDeadline: permitBatch.sigDeadline,\n details: permitBatch.details.map(detail => ({ token: detail.token, amount: detail.amount, expiration: BigInt(detail.expiration), nonce: BigInt(detail.nonce) })),\n };\n } else {\n mismatch('Mint calldata multicall contains an unreviewed call before the position mint');\n }\n }\n [unlockData, deadline] = mintCall.args as [Hex, bigint];\n } else if (decoded.functionName === 'modifyLiquidities') {\n [unlockData, deadline] = decoded.args;\n } else {\n return mismatch('Mint calldata is not a position-manager modifyLiquidities call');\n }\n\n const [actionsBytes, actionParams] = decodeAbiParameters(unlockDataParams, unlockData) as [Hex, readonly Hex[]];\n const actionIds = decodeActionIds(actionsBytes);\n if (actionIds.length !== actionParams.length) mismatch('Mint calldata has a different number of actions and action parameters');\n if (actionIds.length < 2 || actionIds.length > 3) mismatch('Mint calldata does not have the action count a plain mint produces');\n\n if (actionIds[0] !== MINT_POSITION_ACTION) mismatch('Mint calldata must begin with a MINT_POSITION action');\n const [poolKey, tickLower, tickUpper, liquidity, amount0Max, amount1Max, owner, hookData] = decodeAbiParameters(\n mintPositionParams,\n actionParams[0]!,\n ) as [V4PoolKeyMaterial, number, number, bigint, bigint, bigint, Address, Hex];\n if (liquidity <= 0n) mismatch('Mint calldata mints non-positive liquidity');\n\n if (initialization && !samePoolKey(initialization.key, poolKey)) {\n mismatch('Mint pool initialization targets a different pool than the position mint');\n }\n\n if (actionIds[1] !== SETTLE_PAIR_ACTION) mismatch('MINT_POSITION must be followed by a SETTLE_PAIR');\n const [settleCurrency0, settleCurrency1] = decodeAbiParameters(settlePairParams, actionParams[1]!) as [Address, Address];\n if (!same(settleCurrency0, poolKey.currency0) || !same(settleCurrency1, poolKey.currency1)) {\n mismatch('SETTLE_PAIR settles a different pair than the minted position');\n }\n\n if (actionIds.length === 3) {\n if (actionIds[2] !== SWEEP_ACTION) mismatch('Mint calldata has an unreviewed action after SETTLE_PAIR');\n const [sweepCurrency, sweepTo] = decodeAbiParameters(sweepParams, actionParams[2]!) as [Address, Address];\n if (!same(sweepCurrency, zeroAddress) && !same(sweepCurrency, poolKey.currency0)) {\n mismatch('SWEEP refunds an unexpected currency');\n }\n if (!same(sweepTo, MSG_SENDER)) mismatch('SWEEP sends the refund to an unexpected recipient');\n }\n\n if (!samePoolKey(poolKey, expected)) mismatch('Mint calldata targets a different pool than expected');\n if (!same(owner, expected.recipient)) mismatch('Mint calldata sends the position NFT to a different recipient');\n\n if (initialization) {\n if (expected.sqrtPriceX96 === undefined) {\n mismatch('Mint calldata initializes the pool but no expected starting price was supplied to verify it');\n }\n if (initialization.sqrtPriceX96 !== expected.sqrtPriceX96) {\n mismatch('Mint calldata initializes the pool at a different starting price than expected');\n }\n }\n\n if (batchPermit) {\n // Self-checked against the decoded poolKey regardless of what `expected` claims, so a\n // caller who fails to scrutinize `expected` still can't be tricked into treating a permit\n // for an unrelated or duplicated token as reviewed.\n const poolTokens = [poolKey.currency0, poolKey.currency1];\n const seenTokens = new Set<string>();\n for (const detail of batchPermit.details) {\n if (same(detail.token, zeroAddress)) mismatch('Permit2 batch approval cannot cover the native currency');\n if (!poolTokens.some(poolToken => same(poolToken, detail.token))) {\n mismatch('Permit2 batch approval references a token that is not part of the minted pool');\n }\n const key = detail.token.toLowerCase();\n if (seenTokens.has(key)) mismatch('Permit2 batch approval lists the same token more than once');\n seenTokens.add(key);\n }\n\n if (!expected.batchPermit) {\n mismatch('Mint calldata includes a Permit2 batch approval but no expected approval was supplied to verify it');\n }\n if (!same(batchPermit.owner, expected.batchPermit.owner)\n || !same(batchPermit.spender, expected.batchPermit.spender)\n || batchPermit.sigDeadline !== expected.batchPermit.sigDeadline\n || !sameBatchPermitDetails(batchPermit.details, expected.batchPermit.details)) {\n mismatch('Mint calldata\\'s Permit2 batch approval does not match what was expected');\n }\n }\n\n return {\n poolKey, tickLower, tickUpper, liquidity, amount0Max, amount1Max, owner, hookData, deadline,\n ...(initialization ? { createdAtSqrtPriceX96: initialization.sqrtPriceX96 } : {}),\n ...(batchPermit ? { batchPermitOwner: batchPermit.owner } : {}),\n };\n } catch (error) {\n if (error instanceof UniswapSdkError) throw error;\n throw new UniswapSdkError('CALLDATA_MISMATCH', 'Mint calldata contains undecodable position-manager calls', { cause: error });\n }\n}\n"]}
|
package/dist/v4.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export { decodeV4PoolInitialization } from './events.js';
|
|
|
8
8
|
export { decodeV4HookPermissions, unmodelledV4HookPermissions } from './hooks.js';
|
|
9
9
|
export type { V4HookPermissions } from './hooks.js';
|
|
10
10
|
export { buildV4MintPositionTransaction, reviewV4MintPositionCalldata } from './v4-transactions.js';
|
|
11
|
-
export type { V4ExpectedMint, V4MintActionParams, V4MintPositionParams, V4PoolKeyMaterial, V4PoolState, V4TransactionMaterial } from './v4-transactions.js';
|
|
11
|
+
export type { V4BatchPermit, V4BatchPermitDetail, V4ExpectedMint, V4MintActionParams, V4MintPositionParams, V4PoolKeyMaterial, V4PoolState, V4TransactionMaterial } from './v4-transactions.js';
|
|
12
12
|
export { buildV4MintPermitBatchTypedData } from './permit2.js';
|
|
13
13
|
export type { V4PermitBatchDetailInput, V4PermitBatchTypedData } from './permit2.js';
|
|
14
14
|
//# sourceMappingURL=v4.d.ts.map
|
package/dist/v4.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v4.d.ts","sourceRoot":"","sources":["../src/v4.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC9E,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACnG,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACpH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC3D,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAClF,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpG,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"v4.d.ts","sourceRoot":"","sources":["../src/v4.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC9E,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACnG,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACpH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC3D,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAClF,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpG,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAChM,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAC/D,YAAY,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/v4.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v4.js","sourceRoot":"","sources":["../src/v4.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE9E,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEnG,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAElF,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAEpG,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC","sourcesContent":["export { poolKeyFromCurrencies, getV4PoolId, poolReference } from './pool.js';\nexport type { V4Deployment, V4PoolKey, V4PoolReference } from './pool.js';\nexport { readV4Pool, quoteV4ExactInput, quoteV4Batch, verifyV4DeploymentWiring } from './reads.js';\nexport type { V4ReadClient, V4Observation, V4PoolSnapshot, V4QuoteInput, V4Quote, V4QuoteResult } from './reads.js';\nexport { readV4TickWindow, ticksInWord } from './depth.js';\nexport type { V4Tick, V4TickWindow } from './depth.js';\nexport { decodeV4PoolInitialization } from './events.js';\nexport { decodeV4HookPermissions, unmodelledV4HookPermissions } from './hooks.js';\nexport type { V4HookPermissions } from './hooks.js';\nexport { buildV4MintPositionTransaction, reviewV4MintPositionCalldata } from './v4-transactions.js';\nexport type { V4ExpectedMint, V4MintActionParams, V4MintPositionParams, V4PoolKeyMaterial, V4PoolState, V4TransactionMaterial } from './v4-transactions.js';\nexport { buildV4MintPermitBatchTypedData } from './permit2.js';\nexport type { V4PermitBatchDetailInput, V4PermitBatchTypedData } from './permit2.js';\n"]}
|
|
1
|
+
{"version":3,"file":"v4.js","sourceRoot":"","sources":["../src/v4.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE9E,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEnG,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAElF,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAEpG,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC","sourcesContent":["export { poolKeyFromCurrencies, getV4PoolId, poolReference } from './pool.js';\nexport type { V4Deployment, V4PoolKey, V4PoolReference } from './pool.js';\nexport { readV4Pool, quoteV4ExactInput, quoteV4Batch, verifyV4DeploymentWiring } from './reads.js';\nexport type { V4ReadClient, V4Observation, V4PoolSnapshot, V4QuoteInput, V4Quote, V4QuoteResult } from './reads.js';\nexport { readV4TickWindow, ticksInWord } from './depth.js';\nexport type { V4Tick, V4TickWindow } from './depth.js';\nexport { decodeV4PoolInitialization } from './events.js';\nexport { decodeV4HookPermissions, unmodelledV4HookPermissions } from './hooks.js';\nexport type { V4HookPermissions } from './hooks.js';\nexport { buildV4MintPositionTransaction, reviewV4MintPositionCalldata } from './v4-transactions.js';\nexport type { V4BatchPermit, V4BatchPermitDetail, V4ExpectedMint, V4MintActionParams, V4MintPositionParams, V4PoolKeyMaterial, V4PoolState, V4TransactionMaterial } from './v4-transactions.js';\nexport { buildV4MintPermitBatchTypedData } from './permit2.js';\nexport type { V4PermitBatchDetailInput, V4PermitBatchTypedData } from './permit2.js';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reptilianhq/uniswap-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Deployment-explicit Uniswap observations and reviewed transaction material.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -125,6 +125,6 @@
|
|
|
125
125
|
"reptilianRelease": {
|
|
126
126
|
"schemaVersion": 1,
|
|
127
127
|
"group": "uniswap-sdk",
|
|
128
|
-
"sourceSha": "
|
|
128
|
+
"sourceSha": "ddc02cb00ad5698c34105c8bd851eab3b97b6409"
|
|
129
129
|
}
|
|
130
130
|
}
|