@reptilianhq/uniswap-sdk 0.5.0 → 0.6.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/official-sdk.cjs +4 -1
- package/dist/official-sdk.cjs.map +1 -1
- package/dist/official-sdk.d.cts +1 -0
- package/dist/official-sdk.d.cts.map +1 -1
- package/dist/permit2.d.ts +62 -0
- package/dist/permit2.d.ts.map +1 -0
- package/dist/permit2.js +81 -0
- package/dist/permit2.js.map +1 -0
- package/dist/v4.d.ts +2 -0
- package/dist/v4.d.ts.map +1 -1
- package/dist/v4.js +1 -0
- package/dist/v4.js.map +1 -1
- package/package.json +9 -3
package/dist/official-sdk.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Percent = exports.V4PositionManager = exports.Position = exports.Hook = exports.Pool = void 0;
|
|
3
|
+
exports.permit2Address = exports.AllowanceTransfer = exports.Percent = exports.V4PositionManager = exports.Position = exports.Hook = exports.Pool = void 0;
|
|
4
4
|
// Upstream 2.3.3's ESM export contains extensionless directory imports that
|
|
5
5
|
// native Node cannot resolve. Its public require export works in Node and
|
|
6
6
|
// bundlers. Keep this compatibility seam local instead of forking the SDK.
|
|
@@ -11,4 +11,7 @@ Object.defineProperty(exports, "Position", { enumerable: true, get: function ()
|
|
|
11
11
|
Object.defineProperty(exports, "V4PositionManager", { enumerable: true, get: function () { return v4_sdk_1.V4PositionManager; } });
|
|
12
12
|
var sdk_core_1 = require("@uniswap/sdk-core");
|
|
13
13
|
Object.defineProperty(exports, "Percent", { enumerable: true, get: function () { return sdk_core_1.Percent; } });
|
|
14
|
+
var permit2_sdk_1 = require("@uniswap/permit2-sdk");
|
|
15
|
+
Object.defineProperty(exports, "AllowanceTransfer", { enumerable: true, get: function () { return permit2_sdk_1.AllowanceTransfer; } });
|
|
16
|
+
Object.defineProperty(exports, "permit2Address", { enumerable: true, get: function () { return permit2_sdk_1.permit2Address; } });
|
|
14
17
|
//# sourceMappingURL=official-sdk.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"official-sdk.cjs","sourceRoot":"","sources":["../src/official-sdk.cts"],"names":[],"mappings":";;;AAAA,4EAA4E;AAC5E,0EAA0E;AAC1E,2EAA2E;AAC3E,0CAA0E;AAAjE,8FAAA,IAAI,OAAA;AAAE,8FAAA,IAAI,OAAA;AAAE,kGAAA,QAAQ,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AAChD,8CAA4C;AAAnC,mGAAA,OAAO,OAAA","sourcesContent":["// Upstream 2.3.3's ESM export contains extensionless directory imports that\n// native Node cannot resolve. Its public require export works in Node and\n// bundlers. Keep this compatibility seam local instead of forking the SDK.\nexport { Pool, Hook, Position, V4PositionManager } from '@uniswap/v4-sdk';\nexport { Percent } from '@uniswap/sdk-core';\n"]}
|
|
1
|
+
{"version":3,"file":"official-sdk.cjs","sourceRoot":"","sources":["../src/official-sdk.cts"],"names":[],"mappings":";;;AAAA,4EAA4E;AAC5E,0EAA0E;AAC1E,2EAA2E;AAC3E,0CAA0E;AAAjE,8FAAA,IAAI,OAAA;AAAE,8FAAA,IAAI,OAAA;AAAE,kGAAA,QAAQ,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AAChD,8CAA4C;AAAnC,mGAAA,OAAO,OAAA;AAChB,oDAAyE;AAAhE,gHAAA,iBAAiB,OAAA;AAAE,6GAAA,cAAc,OAAA","sourcesContent":["// Upstream 2.3.3's ESM export contains extensionless directory imports that\n// native Node cannot resolve. Its public require export works in Node and\n// bundlers. Keep this compatibility seam local instead of forking the SDK.\nexport { Pool, Hook, Position, V4PositionManager } from '@uniswap/v4-sdk';\nexport { Percent } from '@uniswap/sdk-core';\nexport { AllowanceTransfer, permit2Address } from '@uniswap/permit2-sdk';\n"]}
|
package/dist/official-sdk.d.cts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"official-sdk.d.cts","sourceRoot":"","sources":["../src/official-sdk.cts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"official-sdk.d.cts","sourceRoot":"","sources":["../src/official-sdk.cts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { Address } from 'viem';
|
|
2
|
+
export type V4PermitBatchDetailInput = {
|
|
3
|
+
token: Address;
|
|
4
|
+
amount: bigint;
|
|
5
|
+
expiration: bigint;
|
|
6
|
+
nonce: bigint;
|
|
7
|
+
};
|
|
8
|
+
export type V4PermitBatchTypedData = {
|
|
9
|
+
domain: {
|
|
10
|
+
name: 'Permit2';
|
|
11
|
+
chainId: number;
|
|
12
|
+
verifyingContract: Address;
|
|
13
|
+
};
|
|
14
|
+
types: {
|
|
15
|
+
PermitBatch: readonly {
|
|
16
|
+
name: string;
|
|
17
|
+
type: string;
|
|
18
|
+
}[];
|
|
19
|
+
PermitDetails: readonly {
|
|
20
|
+
name: string;
|
|
21
|
+
type: string;
|
|
22
|
+
}[];
|
|
23
|
+
};
|
|
24
|
+
primaryType: 'PermitBatch';
|
|
25
|
+
message: {
|
|
26
|
+
details: readonly {
|
|
27
|
+
token: Address;
|
|
28
|
+
amount: bigint;
|
|
29
|
+
expiration: bigint;
|
|
30
|
+
nonce: bigint;
|
|
31
|
+
}[];
|
|
32
|
+
spender: Address;
|
|
33
|
+
sigDeadline: bigint;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Builds the EIP-712 typed data for a caller's wallet to sign, authorizing PositionManager
|
|
38
|
+
* to pull the tokens a v4 mint needs via Permit2's `AllowanceTransfer.permitBatch`, instead
|
|
39
|
+
* of a prior plain ERC20 `approve`. This SDK never holds a signer — the caller signs this
|
|
40
|
+
* with their own wallet (`eth_signTypedData_v4`) and passes the resulting signature on to
|
|
41
|
+
* whatever assembles the mint's `batchPermit` option; encoding that consumption side is a
|
|
42
|
+
* separate, later piece.
|
|
43
|
+
*
|
|
44
|
+
* Delegates the domain and EIP-712 type definitions to `@uniswap/permit2-sdk`'s
|
|
45
|
+
* `AllowanceTransfer.getPermitData` rather than hand-authoring them: Permit2's typed-data
|
|
46
|
+
* schema lives only in its deployed contract, and no vendored Uniswap SDK re-derives it —
|
|
47
|
+
* getting it wrong produces a signature that fails silently on-chain, not a caught error.
|
|
48
|
+
*
|
|
49
|
+
* `spender` is trusted as given — this function does not know what contract the caller
|
|
50
|
+
* intends to grant to. Callers must pass PositionManager's own address, not a value taken
|
|
51
|
+
* from unreviewed input; a wrong `spender` here authorizes an arbitrary contract to pull
|
|
52
|
+
* the caller's tokens, and this SDK has no way to detect that from the typed data alone.
|
|
53
|
+
*/
|
|
54
|
+
export declare function buildV4MintPermitBatchTypedData(input: {
|
|
55
|
+
chainId: number;
|
|
56
|
+
spender: Address;
|
|
57
|
+
details: readonly V4PermitBatchDetailInput[];
|
|
58
|
+
sigDeadline: bigint;
|
|
59
|
+
/** Overrides the canonical per-chain Permit2 deployment; only for a non-standard deployment. */
|
|
60
|
+
permit2Address?: Address;
|
|
61
|
+
}): V4PermitBatchTypedData;
|
|
62
|
+
//# sourceMappingURL=permit2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permit2.d.ts","sourceRoot":"","sources":["../src/permit2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAMpC,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,OAAO,CAAA;KAAE,CAAC;IACzE,KAAK,EAAE;QACL,WAAW,EAAE,SAAS;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACvD,aAAa,EAAE,SAAS;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAC1D,CAAC;IACF,WAAW,EAAE,aAAa,CAAC;IAC3B,OAAO,EAAE;QACP,OAAO,EAAE,SAAS;YAAE,KAAK,EAAE,OAAO,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAC1F,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAYF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,sBAAsB,CA+CzB"}
|
package/dist/permit2.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { zeroAddress } from 'viem';
|
|
2
|
+
import { AllowanceTransfer, permit2Address } from './official-sdk.cjs';
|
|
3
|
+
import { checkedAddress } from './pool.js';
|
|
4
|
+
import { invalid, UniswapSdkError } from './errors.js';
|
|
5
|
+
function nonNegative(value, label) {
|
|
6
|
+
if (value < 0n)
|
|
7
|
+
invalid(`${label} must not be negative`);
|
|
8
|
+
}
|
|
9
|
+
function nonZeroAddress(value, label) {
|
|
10
|
+
const checked = checkedAddress(value);
|
|
11
|
+
if (checked === zeroAddress)
|
|
12
|
+
invalid(`${label} cannot be the zero address`);
|
|
13
|
+
return checked;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Builds the EIP-712 typed data for a caller's wallet to sign, authorizing PositionManager
|
|
17
|
+
* to pull the tokens a v4 mint needs via Permit2's `AllowanceTransfer.permitBatch`, instead
|
|
18
|
+
* of a prior plain ERC20 `approve`. This SDK never holds a signer — the caller signs this
|
|
19
|
+
* with their own wallet (`eth_signTypedData_v4`) and passes the resulting signature on to
|
|
20
|
+
* whatever assembles the mint's `batchPermit` option; encoding that consumption side is a
|
|
21
|
+
* separate, later piece.
|
|
22
|
+
*
|
|
23
|
+
* Delegates the domain and EIP-712 type definitions to `@uniswap/permit2-sdk`'s
|
|
24
|
+
* `AllowanceTransfer.getPermitData` rather than hand-authoring them: Permit2's typed-data
|
|
25
|
+
* schema lives only in its deployed contract, and no vendored Uniswap SDK re-derives it —
|
|
26
|
+
* getting it wrong produces a signature that fails silently on-chain, not a caught error.
|
|
27
|
+
*
|
|
28
|
+
* `spender` is trusted as given — this function does not know what contract the caller
|
|
29
|
+
* intends to grant to. Callers must pass PositionManager's own address, not a value taken
|
|
30
|
+
* from unreviewed input; a wrong `spender` here authorizes an arbitrary contract to pull
|
|
31
|
+
* the caller's tokens, and this SDK has no way to detect that from the typed data alone.
|
|
32
|
+
*/
|
|
33
|
+
export function buildV4MintPermitBatchTypedData(input) {
|
|
34
|
+
if (!Number.isSafeInteger(input.chainId) || input.chainId <= 0)
|
|
35
|
+
invalid('chainId must be a positive safe integer');
|
|
36
|
+
if (!input.details.length)
|
|
37
|
+
invalid('Permit batch must include at least one token detail');
|
|
38
|
+
nonNegative(input.sigDeadline, 'sigDeadline');
|
|
39
|
+
const spender = nonZeroAddress(input.spender, 'spender');
|
|
40
|
+
const resolvedPermit2Address = nonZeroAddress(input.permit2Address ?? permit2Address(input.chainId), 'permit2Address');
|
|
41
|
+
try {
|
|
42
|
+
const details = input.details.map(detail => {
|
|
43
|
+
nonNegative(detail.amount, 'amount');
|
|
44
|
+
nonNegative(detail.expiration, 'expiration');
|
|
45
|
+
nonNegative(detail.nonce, 'nonce');
|
|
46
|
+
return {
|
|
47
|
+
token: checkedAddress(detail.token),
|
|
48
|
+
amount: detail.amount.toString(),
|
|
49
|
+
expiration: detail.expiration.toString(),
|
|
50
|
+
nonce: detail.nonce.toString(),
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
const { domain, types, values } = AllowanceTransfer.getPermitData({ details, spender, sigDeadline: input.sigDeadline.toString() }, resolvedPermit2Address, input.chainId);
|
|
54
|
+
const batch = values;
|
|
55
|
+
if (domain.name !== 'Permit2')
|
|
56
|
+
invalid(`Official Permit2 SDK returned an unexpected domain name: ${String(domain.name)}`);
|
|
57
|
+
return {
|
|
58
|
+
domain: { name: 'Permit2', chainId: domain.chainId, verifyingContract: checkedAddress(domain.verifyingContract) },
|
|
59
|
+
// Deep-copied: `types` is the dependency's own module-level object: mutating the
|
|
60
|
+
// returned value would otherwise corrupt every future call in this process.
|
|
61
|
+
types: structuredClone(types),
|
|
62
|
+
primaryType: 'PermitBatch',
|
|
63
|
+
message: {
|
|
64
|
+
details: batch.details.map(detail => ({
|
|
65
|
+
token: checkedAddress(detail.token),
|
|
66
|
+
amount: BigInt(detail.amount),
|
|
67
|
+
expiration: BigInt(detail.expiration),
|
|
68
|
+
nonce: BigInt(detail.nonce),
|
|
69
|
+
})),
|
|
70
|
+
spender: checkedAddress(batch.spender),
|
|
71
|
+
sigDeadline: BigInt(batch.sigDeadline),
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (cause) {
|
|
76
|
+
if (cause instanceof UniswapSdkError)
|
|
77
|
+
throw cause;
|
|
78
|
+
throw new UniswapSdkError('INVALID_ARGUMENT', 'Official Permit2 SDK rejected the permit batch parameters', { cause });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=permit2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permit2.js","sourceRoot":"","sources":["../src/permit2.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Address } from 'viem';\nimport { zeroAddress } from 'viem';\nimport { AllowanceTransfer, permit2Address } from './official-sdk.cjs';\nimport { checkedAddress } from './pool.js';\nimport { invalid, UniswapSdkError } from './errors.js';\n\nexport type V4PermitBatchDetailInput = {\n token: Address;\n amount: bigint;\n expiration: bigint;\n nonce: bigint;\n};\n\nexport type V4PermitBatchTypedData = {\n domain: { name: 'Permit2'; chainId: number; verifyingContract: Address };\n types: {\n PermitBatch: readonly { name: string; type: string }[];\n PermitDetails: readonly { name: string; type: string }[];\n };\n primaryType: 'PermitBatch';\n message: {\n details: readonly { token: Address; amount: bigint; expiration: bigint; nonce: bigint }[];\n spender: Address;\n sigDeadline: bigint;\n };\n};\n\nfunction nonNegative(value: bigint, label: string): void {\n if (value < 0n) invalid(`${label} must not be negative`);\n}\n\nfunction nonZeroAddress(value: Address, label: string): Address {\n const checked = checkedAddress(value);\n if (checked === zeroAddress) invalid(`${label} cannot be the zero address`);\n return checked;\n}\n\n/**\n * Builds the EIP-712 typed data for a caller's wallet to sign, authorizing PositionManager\n * to pull the tokens a v4 mint needs via Permit2's `AllowanceTransfer.permitBatch`, instead\n * of a prior plain ERC20 `approve`. This SDK never holds a signer — the caller signs this\n * with their own wallet (`eth_signTypedData_v4`) and passes the resulting signature on to\n * whatever assembles the mint's `batchPermit` option; encoding that consumption side is a\n * separate, later piece.\n *\n * Delegates the domain and EIP-712 type definitions to `@uniswap/permit2-sdk`'s\n * `AllowanceTransfer.getPermitData` rather than hand-authoring them: Permit2's typed-data\n * schema lives only in its deployed contract, and no vendored Uniswap SDK re-derives it —\n * getting it wrong produces a signature that fails silently on-chain, not a caught error.\n *\n * `spender` is trusted as given — this function does not know what contract the caller\n * intends to grant to. Callers must pass PositionManager's own address, not a value taken\n * from unreviewed input; a wrong `spender` here authorizes an arbitrary contract to pull\n * the caller's tokens, and this SDK has no way to detect that from the typed data alone.\n */\nexport function buildV4MintPermitBatchTypedData(input: {\n chainId: number;\n spender: Address;\n details: readonly V4PermitBatchDetailInput[];\n sigDeadline: bigint;\n /** Overrides the canonical per-chain Permit2 deployment; only for a non-standard deployment. */\n permit2Address?: Address;\n}): V4PermitBatchTypedData {\n if (!Number.isSafeInteger(input.chainId) || input.chainId <= 0) invalid('chainId must be a positive safe integer');\n if (!input.details.length) invalid('Permit batch must include at least one token detail');\n nonNegative(input.sigDeadline, 'sigDeadline');\n const spender = nonZeroAddress(input.spender, 'spender');\n const resolvedPermit2Address = nonZeroAddress(input.permit2Address ?? (permit2Address(input.chainId) as Address), 'permit2Address');\n\n try {\n const details = input.details.map(detail => {\n nonNegative(detail.amount, 'amount');\n nonNegative(detail.expiration, 'expiration');\n nonNegative(detail.nonce, 'nonce');\n return {\n token: checkedAddress(detail.token),\n amount: detail.amount.toString(),\n expiration: detail.expiration.toString(),\n nonce: detail.nonce.toString(),\n };\n });\n const { domain, types, values } = AllowanceTransfer.getPermitData(\n { details, spender, sigDeadline: input.sigDeadline.toString() },\n resolvedPermit2Address,\n input.chainId,\n );\n const batch = values as { details: { token: string; amount: string; expiration: string; nonce: string }[]; spender: string; sigDeadline: string };\n if (domain.name !== 'Permit2') invalid(`Official Permit2 SDK returned an unexpected domain name: ${String(domain.name)}`);\n return {\n domain: { name: 'Permit2', chainId: domain.chainId as number, verifyingContract: checkedAddress(domain.verifyingContract as Address) },\n // Deep-copied: `types` is the dependency's own module-level object: mutating the\n // returned value would otherwise corrupt every future call in this process.\n types: structuredClone(types) as unknown as V4PermitBatchTypedData['types'],\n primaryType: 'PermitBatch',\n message: {\n details: batch.details.map(detail => ({\n token: checkedAddress(detail.token as Address),\n amount: BigInt(detail.amount),\n expiration: BigInt(detail.expiration),\n nonce: BigInt(detail.nonce),\n })),\n spender: checkedAddress(batch.spender as Address),\n sigDeadline: BigInt(batch.sigDeadline),\n },\n };\n } catch (cause) {\n if (cause instanceof UniswapSdkError) throw cause;\n throw new UniswapSdkError('INVALID_ARGUMENT', 'Official Permit2 SDK rejected the permit batch parameters', { cause });\n }\n}\n"]}
|
package/dist/v4.d.ts
CHANGED
|
@@ -9,4 +9,6 @@ export { decodeV4HookPermissions, unmodelledV4HookPermissions } from './hooks.js
|
|
|
9
9
|
export type { V4HookPermissions } from './hooks.js';
|
|
10
10
|
export { buildV4MintPositionTransaction, reviewV4MintPositionCalldata } from './v4-transactions.js';
|
|
11
11
|
export type { V4ExpectedMint, V4MintActionParams, V4MintPositionParams, V4PoolKeyMaterial, V4PoolState, V4TransactionMaterial } from './v4-transactions.js';
|
|
12
|
+
export { buildV4MintPermitBatchTypedData } from './permit2.js';
|
|
13
|
+
export type { V4PermitBatchDetailInput, V4PermitBatchTypedData } from './permit2.js';
|
|
12
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,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC5J,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAC/D,YAAY,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/v4.js
CHANGED
|
@@ -4,4 +4,5 @@ export { readV4TickWindow, ticksInWord } from './depth.js';
|
|
|
4
4
|
export { decodeV4PoolInitialization } from './events.js';
|
|
5
5
|
export { decodeV4HookPermissions, unmodelledV4HookPermissions } from './hooks.js';
|
|
6
6
|
export { buildV4MintPositionTransaction, reviewV4MintPositionCalldata } from './v4-transactions.js';
|
|
7
|
+
export { buildV4MintPermitBatchTypedData } from './permit2.js';
|
|
7
8
|
//# sourceMappingURL=v4.js.map
|
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","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';\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 { 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.6.0",
|
|
4
4
|
"description": "Deployment-explicit Uniswap observations and reviewed transaction material.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -68,6 +68,10 @@
|
|
|
68
68
|
"types": "./dist/providers.d.ts",
|
|
69
69
|
"import": "./dist/providers.js"
|
|
70
70
|
},
|
|
71
|
+
"./permit2": {
|
|
72
|
+
"types": "./dist/permit2.d.ts",
|
|
73
|
+
"import": "./dist/permit2.js"
|
|
74
|
+
},
|
|
71
75
|
"./provenance/mainnet.json": "./provenance/mainnet.json",
|
|
72
76
|
"./provenance/testnet.json": "./provenance/testnet.json"
|
|
73
77
|
},
|
|
@@ -88,8 +92,10 @@
|
|
|
88
92
|
"prepack": "npm run build"
|
|
89
93
|
},
|
|
90
94
|
"dependencies": {
|
|
95
|
+
"@uniswap/permit2-sdk": "1.4.0",
|
|
91
96
|
"@uniswap/sdk-core": "7.19.2",
|
|
92
|
-
"@uniswap/v4-sdk": "2.3.3"
|
|
97
|
+
"@uniswap/v4-sdk": "2.3.3",
|
|
98
|
+
"tslib": "2.8.1"
|
|
93
99
|
},
|
|
94
100
|
"peerDependencies": {
|
|
95
101
|
"viem": ">=2.55.0 <3"
|
|
@@ -119,6 +125,6 @@
|
|
|
119
125
|
"reptilianRelease": {
|
|
120
126
|
"schemaVersion": 1,
|
|
121
127
|
"group": "uniswap-sdk",
|
|
122
|
-
"sourceSha": "
|
|
128
|
+
"sourceSha": "d35608758d0aaad7f72819147bc9dd39ad612a2c"
|
|
123
129
|
}
|
|
124
130
|
}
|