UNPKG

@uniswap/v4-sdk

Version:

⚒️ An SDK for building applications on top of Uniswap V4

97 lines 5.22 kB
"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