@uniswap/v4-sdk
Version:
⚒️ An SDK for building applications on top of Uniswap V4
97 lines • 5.22 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Hook = exports.hookFlagIndex = exports.HookOptions = void 0;
const tslib_1 = require("tslib");
const tiny_invariant_1 = tslib_1.__importDefault(require("tiny-invariant"));
const utils_1 = require("ethers/lib/utils");
var HookOptions;
(function (HookOptions) {
HookOptions["AfterRemoveLiquidityReturnsDelta"] = "afterRemoveLiquidityReturnsDelta";
HookOptions["AfterAddLiquidityReturnsDelta"] = "afterAddLiquidityReturnsDelta";
HookOptions["AfterSwapReturnsDelta"] = "afterSwapReturnsDelta";
HookOptions["BeforeSwapReturnsDelta"] = "beforeSwapReturnsDelta";
HookOptions["AfterDonate"] = "afterDonate";
HookOptions["BeforeDonate"] = "beforeDonate";
HookOptions["AfterSwap"] = "afterSwap";
HookOptions["BeforeSwap"] = "beforeSwap";
HookOptions["AfterRemoveLiquidity"] = "afterRemoveLiquidity";
HookOptions["BeforeRemoveLiquidity"] = "beforeRemoveLiquidity";
HookOptions["AfterAddLiquidity"] = "afterAddLiquidity";
HookOptions["BeforeAddLiquidity"] = "beforeAddLiquidity";
HookOptions["AfterInitialize"] = "afterInitialize";
HookOptions["BeforeInitialize"] = "beforeInitialize";
})(HookOptions = exports.HookOptions || (exports.HookOptions = {}));
exports.hookFlagIndex = {
[HookOptions.AfterRemoveLiquidityReturnsDelta]: 0,
[HookOptions.AfterAddLiquidityReturnsDelta]: 1,
[HookOptions.AfterSwapReturnsDelta]: 2,
[HookOptions.BeforeSwapReturnsDelta]: 3,
[HookOptions.AfterDonate]: 4,
[HookOptions.BeforeDonate]: 5,
[HookOptions.AfterSwap]: 6,
[HookOptions.BeforeSwap]: 7,
[HookOptions.AfterRemoveLiquidity]: 8,
[HookOptions.BeforeRemoveLiquidity]: 9,
[HookOptions.AfterAddLiquidity]: 10,
[HookOptions.BeforeAddLiquidity]: 11,
[HookOptions.AfterInitialize]: 12,
[HookOptions.BeforeInitialize]: 13,
};
class Hook {
static permissions(address) {
this._checkAddress(address);
return {
beforeInitialize: this._hasPermission(address, HookOptions.BeforeInitialize),
afterInitialize: this._hasPermission(address, HookOptions.AfterInitialize),
beforeAddLiquidity: this._hasPermission(address, HookOptions.BeforeAddLiquidity),
afterAddLiquidity: this._hasPermission(address, HookOptions.AfterAddLiquidity),
beforeRemoveLiquidity: this._hasPermission(address, HookOptions.BeforeRemoveLiquidity),
afterRemoveLiquidity: this._hasPermission(address, HookOptions.AfterRemoveLiquidity),
beforeSwap: this._hasPermission(address, HookOptions.BeforeSwap),
afterSwap: this._hasPermission(address, HookOptions.AfterSwap),
beforeDonate: this._hasPermission(address, HookOptions.BeforeDonate),
afterDonate: this._hasPermission(address, HookOptions.AfterDonate),
beforeSwapReturnsDelta: this._hasPermission(address, HookOptions.BeforeSwapReturnsDelta),
afterSwapReturnsDelta: this._hasPermission(address, HookOptions.AfterSwapReturnsDelta),
afterAddLiquidityReturnsDelta: this._hasPermission(address, HookOptions.AfterAddLiquidityReturnsDelta),
afterRemoveLiquidityReturnsDelta: this._hasPermission(address, HookOptions.AfterRemoveLiquidityReturnsDelta),
};
}
static hasPermission(address, hookOption) {
this._checkAddress(address);
return this._hasPermission(address, hookOption);
}
static hasInitializePermissions(address) {
this._checkAddress(address);
return (this._hasPermission(address, HookOptions.BeforeInitialize) ||
Hook._hasPermission(address, HookOptions.AfterInitialize));
}
static hasLiquidityPermissions(address) {
this._checkAddress(address);
// this implicitly encapsulates liquidity delta permissions
return (this._hasPermission(address, HookOptions.BeforeAddLiquidity) ||
Hook._hasPermission(address, HookOptions.AfterAddLiquidity) ||
Hook._hasPermission(address, HookOptions.BeforeRemoveLiquidity) ||
Hook._hasPermission(address, HookOptions.AfterRemoveLiquidity));
}
static hasSwapPermissions(address) {
this._checkAddress(address);
// this implicitly encapsulates swap delta permissions
return this._hasPermission(address, HookOptions.BeforeSwap) || Hook._hasPermission(address, HookOptions.AfterSwap);
}
static hasDonatePermissions(address) {
this._checkAddress(address);
return (this._hasPermission(address, HookOptions.BeforeDonate) || Hook._hasPermission(address, HookOptions.AfterDonate));
}
static _hasPermission(address, hookOption) {
// Use only the last 4 bytes (32 bits) to avoid JavaScript precision issues
// All hook flags are in bits 0-13, which fit comfortably in 32 bits
const last4Bytes = '0x' + address.slice(-8);
return !!(parseInt(last4Bytes, 16) & (1 << exports.hookFlagIndex[hookOption]));
}
static _checkAddress(address) {
(0, tiny_invariant_1.default)((0, utils_1.isAddress)(address), 'invalid address');
}
}
exports.Hook = Hook;
//# sourceMappingURL=hook.js.map