@dhedge/v2-sdk 1.3.0 → 1.4.2
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/entities/dhedge.d.ts +0 -6
- package/dist/entities/pool.d.ts +42 -13
- package/dist/entities/utils.d.ts +1 -1
- package/dist/test/constants.d.ts +3 -11
- package/dist/test/txOptions.d.ts +2 -1
- package/dist/types.d.ts +7 -9
- package/dist/v2-sdk.cjs.development.js +1059 -347
- package/dist/v2-sdk.cjs.development.js.map +1 -1
- package/dist/v2-sdk.cjs.production.min.js +1 -1
- package/dist/v2-sdk.cjs.production.min.js.map +1 -1
- package/dist/v2-sdk.esm.js +1057 -345
- package/dist/v2-sdk.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/abi/IArrakisV1RouterStaking.json +107 -0
- package/src/abi/IBalancerRewardsGauge.json +239 -0
- package/src/abi/ILiquidityGaugeV4.json +153 -0
- package/src/config.ts +6 -2
- package/src/entities/dhedge.ts +0 -11
- package/src/entities/pool.ts +193 -60
- package/src/entities/utils.ts +13 -9
- package/src/test/1inch.test.ts +54 -0
- package/src/test/aave.test.ts +53 -25
- package/src/test/arrakis.test.ts +89 -0
- package/src/test/balancer.test.ts +115 -10
- package/src/test/constants.ts +20 -14
- package/src/test/oneInch.test.ts +13 -20
- package/src/test/pool.test.ts +1 -1
- package/src/test/txOptions.ts +16 -10
- package/src/test/uniswap.test.ts +35 -37
- package/src/test/wallet.ts +5 -5
- package/src/types.ts +7 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v2-sdk.cjs.production.min.js","sources":["../src/types.ts","../node_modules/regenerator-runtime/runtime.js","../src/config.ts","../src/utils/contract.ts","../src/utils/merkle.ts","../src/utils/index.ts","../src/services/claim-balancer/ipfs.service.ts","../src/services/claim-balancer/claim.service.ts","../src/services/uniswap/V3Liquidity.ts","../src/services/uniswap/V3Trade.ts","../src/entities/pool.ts","../src/entities/utils.ts","../src/entities/dhedge.ts"],"sourcesContent":["import { BigNumber } from \"ethers\";\n\nexport enum Network {\n POLYGON = \"polygon\",\n OPTIMISM = \"optimism\"\n}\n\nexport enum Dapp {\n SUSHISWAP = \"sushiswap\",\n AAVE = \"aave\",\n ONEINCH = \"1inch\",\n QUICKSWAP = \"quickswap\",\n BALANCER = \"balancer\",\n UNISWAPV3 = \"uniswapV3\",\n SYNTHETIX = \"synthetix\"\n}\n\nexport enum Transaction {\n SWAP = \"swapExactTokensForTokens\",\n ADD_LIQUIDITY = \"addLiquidity\",\n DEPOSIT = \"deposit\",\n HARVEST = \"harvest\",\n CLAIM_DISTRIBIUTIONS = \"claimDistributions\",\n CLAIM_REWARDS = \"claimRewards\",\n REMOVE_LIQUIDITY = \"removeLiquidity\",\n DECREASE_LIQUIDITY = \"decreaseLiquidity\",\n INCREASE_LIQUIDITY = \"increaseLiquidity\",\n COLLECT = \"collect\",\n MULTI_CALL = \"multicall\",\n BORROW = \"borrow\",\n REPAY = \"repay\",\n WITHDRAW = \"withdraw\",\n MINT = \"mint\",\n BURN = \"burn\",\n SWAP_SYNTHS = \"exchangeWithTracking\"\n}\n\nexport type AddressNetworkMap = Readonly<Record<Network, string>>;\n\nexport type AddressDappMap = {\n [Dapp.SUSHISWAP]?: string;\n [Dapp.AAVE]?: string;\n [Dapp.ONEINCH]?: string;\n [Dapp.QUICKSWAP]?: string;\n [Dapp.BALANCER]?: string;\n [Dapp.UNISWAPV3]?: string;\n [Dapp.SYNTHETIX]?: string;\n};\n\nexport type AddressDappNetworkMap = Readonly<Record<Network, AddressDappMap>>;\n\nexport type SupportedAsset = [string, boolean];\n\nexport type AssetEnabled = {\n asset: string;\n isDeposit: boolean;\n};\n\nexport type FundComposition = {\n asset: string;\n isDeposit: boolean;\n balance: BigNumber;\n rate: BigNumber;\n};\n\nexport type Reserves = {\n assetA: BigNumber;\n assetB: BigNumber;\n};\n\nexport type NetworkChainIdMap = Readonly<Record<Network, number>>;\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = GeneratorFunctionPrototype;\n define(Gp, \"constructor\", GeneratorFunctionPrototype);\n define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction);\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","import {\n Dapp,\n AddressNetworkMap,\n Network,\n AddressDappNetworkMap\n} from \"./types\";\nimport { NetworkChainIdMap } from \".\";\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nrequire(\"dotenv\").config();\n\nexport const factoryAddress: AddressNetworkMap = {\n [Network.POLYGON]: process.env.STAGING_CONTRACTS\n ? \"0xDd87eCdB10cFF7004276AAbAbd30e7a08F69bb53\"\n : \"0xfdc7b8bFe0DD3513Cc669bB8d601Cb83e2F69cB0\",\n [Network.OPTIMISM]: \"0x5e61a079A178f0E5784107a4963baAe0c5a680c6\"\n};\n\nexport const routerAddress: AddressDappNetworkMap = {\n [Network.POLYGON]: {\n [Dapp.SUSHISWAP]: \"0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506\",\n [Dapp.AAVE]: \"0x8dFf5E27EA6b7AC08EbFdf9eB090F32ee9a30fcf\",\n [Dapp.ONEINCH]: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n [Dapp.QUICKSWAP]: \"0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff\",\n [Dapp.BALANCER]: \"0xBA12222222228d8Ba445958a75a0704d566BF2C8\",\n [Dapp.UNISWAPV3]: \"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45\"\n },\n [Network.OPTIMISM]: {\n [Dapp.UNISWAPV3]: \"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45\",\n [Dapp.SYNTHETIX]: \"0x8700dAec35aF8Ff88c16BdF0418774CB3D7599B4\"\n }\n};\n\nexport const dappFactoryAddress: AddressDappNetworkMap = {\n [Network.POLYGON]: {\n [Dapp.SUSHISWAP]: \"0xc35DADB65012eC5796536bD9864eD8773aBc74C4\",\n [Dapp.QUICKSWAP]: \"0x5757371414417b8C6CAad45bAeF941aBc7d3Ab32\"\n },\n [Network.OPTIMISM]: {}\n};\n\nexport const stakingAddress: AddressDappNetworkMap = {\n [Network.POLYGON]: {\n [Dapp.SUSHISWAP]: \"0x0769fd68dFb93167989C6f7254cd0D766Fb2841F\",\n [Dapp.BALANCER]: \"0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e\",\n [Dapp.AAVE]: \"0x357D51124f59836DeD84c8a1730D72B749d8BC23\"\n },\n [Network.OPTIMISM]: {}\n};\n\nexport const nonfungiblePositionManagerAddress: AddressNetworkMap = {\n [Network.POLYGON]: \"0xC36442b4a4522E871399CD717aBDD847Ab11FE88\",\n [Network.OPTIMISM]: \"0xC36442b4a4522E871399CD717aBDD847Ab11FE88\"\n};\n\nexport const networkChainIdMap: NetworkChainIdMap = {\n [Network.POLYGON]: 137,\n [Network.OPTIMISM]: 10\n};\n\nexport const balancerSubgraph: AddressNetworkMap = {\n [Network.POLYGON]:\n \"https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-polygon-v2\",\n [Network.OPTIMISM]: \"\"\n};\n\nexport const multiCallAddress: AddressNetworkMap = {\n [Network.POLYGON]: \"0x275617327c958bD06b5D6b871E7f491D76113dd8\",\n [Network.OPTIMISM]: \"\"\n};\n\nexport const deadline = Math.floor(Date.now() / 1000) + 60 * 20;\nexport const MaxUint128 = \"0xffffffffffffffffffffffffffffffff\";\nexport const UNISWAPV3_QUOTER_ADDRESS =\n \"0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6\";\n\nexport const SYNTHETIX_TRACKING_CODE =\n \"0x4448454447450000000000000000000000000000000000000000000000000000\";\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport set from \"lodash/set\";\nimport { Interface } from \"@ethersproject/abi\";\nimport { multiCallAddress } from \"../config\";\nimport { ethers, Network } from \"..\";\n\nexport async function call(\n provider: ethers.Signer,\n abi: any[],\n call: any[],\n options?: any\n) {\n const contract = new ethers.Contract(call[0], abi, provider);\n try {\n const params = call[2] || [];\n return await contract[call[1]](...params, options || {});\n } catch (e) {\n return Promise.reject(e);\n }\n}\n\nexport async function multicall<T>(\n network: Network,\n provider: ethers.Signer,\n abi: any[],\n calls: any[],\n options: any = {},\n requireSuccess = false\n): Promise<(T | null)[]> {\n const multi = new ethers.Contract(\n multiCallAddress[network],\n [\n \"function tryAggregate(bool requireSuccess, tuple(address, bytes)[] memory calls) public view returns (tuple(bool, bytes)[] memory returnData)\"\n ],\n provider\n );\n const itf = new Interface(abi);\n try {\n const res: [boolean, string][] = await multi.tryAggregate(\n // if false, allows individual calls to fail without causing entire multicall to fail\n requireSuccess,\n calls.map(call => [\n call[0].toLowerCase(),\n itf.encodeFunctionData(call[1], call[2])\n ]),\n options\n );\n\n return res.map(([success, returnData], i) => {\n if (!success) return null;\n const decodedResult = itf.decodeFunctionResult(calls[i][1], returnData);\n // Automatically unwrap any simple return values\n return decodedResult.length > 1 ? decodedResult : decodedResult[0];\n });\n } catch (e) {\n return Promise.reject(e);\n }\n}\n\nexport class Multicaller {\n public network: Network;\n public provider: ethers.Signer;\n public abi: any[];\n public options: any = {};\n public calls: any[] = [];\n public paths: any[] = [];\n\n constructor(network: Network, provider: ethers.Signer, abi: any[]) {\n this.network = network;\n this.provider = provider;\n this.abi = abi;\n }\n\n call(path: any, address: any, fn: any, params?: any): Multicaller {\n this.calls.push([address, fn, params]);\n this.paths.push(path);\n return this;\n }\n\n async execute(from?: any): Promise<any> {\n const obj = from || {};\n const result = await multicall(\n this.network,\n this.provider,\n this.abi,\n this.calls,\n this.options\n );\n result.forEach((r, i) => set(obj, this.paths[i], r));\n this.calls = [];\n this.paths = [];\n return obj;\n }\n}\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n// Shamelessly adapted from OpenZeppelin-contracts test utils\nimport BigNumber from \"bignumber.js\";\nimport { keccak256, keccakFromString, bufferToHex } from \"ethereumjs-util\";\nimport { hexToBytes, soliditySha3 } from \"web3-utils\";\nimport { scale } from \"./index\";\n\n// Merkle tree called with 32 byte hex values\nexport class MerkleTree {\n public elements: any;\n public layers: any;\n\n constructor(elements: any[]) {\n this.elements = elements\n .filter((el: any) => el)\n .map(el => Buffer.from(hexToBytes(el)));\n\n // Sort elements\n this.elements.sort(Buffer.compare);\n // Deduplicate elements\n this.elements = this.bufDedup(this.elements);\n\n // Create layers\n this.layers = this.getLayers(this.elements);\n }\n\n getLayers(elements: string | any[]) {\n if (elements.length === 0) {\n return [[\"\"]];\n }\n\n const layers = [];\n layers.push(elements);\n\n // Get next layer until we reach the root=\n while (layers[layers.length - 1].length > 1) {\n // @ts-ignore\n layers.push(this.getNextLayer(layers[layers.length - 1]));\n }\n\n return layers;\n }\n\n getNextLayer(elements: any[]) {\n return elements.reduce(\n (layer: any[], el: any, idx: number, arr: { [x: string]: any }) => {\n if (idx % 2 === 0) {\n // Hash the current element with its pair element\n layer.push(this.combinedHash(el, arr[idx + 1]));\n }\n\n return layer;\n },\n []\n );\n }\n\n combinedHash(first: any, second: any) {\n if (!first) {\n return second;\n }\n if (!second) {\n return first;\n }\n\n return keccak256(this.sortAndConcat(first, second));\n }\n\n getRoot() {\n return this.layers[this.layers.length - 1][0];\n }\n\n getHexRoot() {\n return bufferToHex(this.getRoot());\n }\n\n getProof(el: any) {\n let idx = this.bufIndexOf(el, this.elements);\n\n if (idx === -1) {\n throw new Error(\"Element does not exist in Merkle tree\");\n }\n\n return this.layers.reduce((proof: any[], layer: any) => {\n const pairElement = this.getPairElement(idx, layer);\n\n if (pairElement) {\n proof.push(pairElement);\n }\n\n idx = Math.floor(idx / 2);\n\n return proof;\n }, []);\n }\n\n // external call - convert to buffer\n getHexProof(_el: any) {\n const el = Buffer.from(hexToBytes(_el));\n\n const proof = this.getProof(el);\n\n return this.bufArrToHexArr(proof);\n }\n\n getPairElement(idx: number, layer: string | any[]) {\n const pairIdx = idx % 2 === 0 ? idx + 1 : idx - 1;\n\n if (pairIdx < layer.length) {\n return layer[pairIdx];\n } else {\n return null;\n }\n }\n\n bufIndexOf(el: string | any[], arr: string | any[]) {\n let hash;\n\n // Convert element to 32 byte hash if it is not one already\n if (el.length !== 32 || !Buffer.isBuffer(el)) {\n hash = keccakFromString(el as string);\n } else {\n hash = el;\n }\n\n for (let i = 0; i < arr.length; i++) {\n if (hash.equals(arr[i])) {\n return i;\n }\n }\n\n return -1;\n }\n\n bufDedup(elements: any[]) {\n return elements.filter((el: any, idx: number) => {\n return idx === 0 || !elements[idx - 1].equals(el);\n });\n }\n\n bufArrToHexArr(arr: any[]) {\n if (arr.some((el: any) => !Buffer.isBuffer(el))) {\n throw new Error(\"Array is not an array of buffers\");\n }\n\n return arr.map(\n (el: { toString: (arg0: string) => string }) => \"0x\" + el.toString(\"hex\")\n );\n }\n\n sortAndConcat(...args: any[]) {\n return Buffer.concat([...args].sort(Buffer.compare));\n }\n}\n\nexport function loadTree(\n balances: { [x: string]: string | BigNumber },\n decimals = 18\n) {\n const elements: (string | null)[] = [];\n Object.keys(balances).forEach(address => {\n const balance: string = scale(balances[address], decimals).toString(10);\n const leaf = soliditySha3(\n { t: \"address\", v: address },\n { t: \"uint\", v: balance }\n );\n elements.push(leaf);\n });\n return new MerkleTree(elements);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport BigNumber from \"bignumber.js\";\nimport { soliditySha3 } from \"web3-utils\";\nimport { MerkleTree } from \"./merkle\";\n\nexport function scale(\n input: BigNumber | string,\n decimalPlaces: number\n): BigNumber {\n const unscaled = typeof input === \"string\" ? new BigNumber(input) : input;\n const scalePow = new BigNumber(decimalPlaces.toString());\n const scaleMul = new BigNumber(10).pow(scalePow);\n return unscaled.times(scaleMul);\n}\n\nexport function loadTree(\n balances: { [x: string]: string | BigNumber },\n decimals = 18\n) {\n const elements: any[] = [];\n Object.keys(balances).forEach(address => {\n const balance: string = scale(balances[address], decimals).toString(10);\n const leaf = soliditySha3(\n { t: \"address\", v: address },\n { t: \"uint\", v: balance }\n );\n // @ts-ignore\n elements.push(leaf);\n });\n return new MerkleTree(elements);\n}\n\nexport function bnum(val: string | number | BigNumber): BigNumber {\n const number = typeof val === \"string\" ? val : val ? val.toString() : \"0\";\n return new BigNumber(number);\n}\n","import axios from \"axios\";\n\nexport default class IpfsService {\n async get<T>(hash: string, protocol = \"ipfs\"): Promise<T> {\n const { data } = await axios.get(\n `https://cloudflare-ipfs.com/${protocol}/${hash}`\n );\n return data;\n }\n}\n\nexport const ipfsService = new IpfsService();\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport axios from \"axios\";\nimport { chunk, flatten } from \"lodash\";\nimport merkleOrchardAbi from \"../../abi/IBalancerMerkleOrchard.json\";\nimport { ethers, Wallet } from \"ethers\";\n\nimport { getAddress } from \"@ethersproject/address\";\n\nimport { multicall } from \"../../utils/contract\";\nimport { bnum, loadTree, scale } from \"../../utils\";\n\nimport { ipfsService } from \"./ipfs.service\";\n\nimport {\n ClaimProofTuple,\n ClaimStatus,\n ComputeClaimProofPayload,\n MultiTokenPendingClaims,\n Report,\n Snapshot,\n TokenClaimInfo\n} from \"./types\";\n\nimport { Network } from \"../../types\";\nimport { networkChainIdMap, stakingAddress } from \"../../config\";\nimport { soliditySha3 } from \"web3-utils\";\nimport { Dapp } from \"../..\";\n\nexport class ClaimService {\n network: Network;\n signer: ethers.Wallet;\n public constructor(network: Network, signer: Wallet) {\n this.network = network;\n this.signer = signer;\n }\n public async getMultiTokensPendingClaims(\n account: string\n ): Promise<MultiTokenPendingClaims[]> {\n const tokenClaimsInfo = await this.getTokenClaimsInfo();\n if (tokenClaimsInfo != null) {\n const multiTokenPendingClaims = await Promise.all(\n tokenClaimsInfo.map(tokenClaimInfo =>\n this.getTokenPendingClaims(tokenClaimInfo, getAddress(account))\n )\n );\n\n const multiTokenPendingClaimsWithRewards = multiTokenPendingClaims.filter(\n pendingClaim => Number(pendingClaim.availableToClaim) > 0\n );\n\n return multiTokenPendingClaimsWithRewards;\n }\n return [];\n }\n\n public async getTokenPendingClaims(\n tokenClaimInfo: TokenClaimInfo,\n account: string\n ): Promise<MultiTokenPendingClaims> {\n const snapshot = await this.getSnapshot(tokenClaimInfo.manifest);\n const weekStart = tokenClaimInfo.weekStart;\n const claimStatus = await this.getClaimStatus(\n Object.keys(snapshot).length,\n account,\n tokenClaimInfo\n );\n\n const pendingWeeks = claimStatus\n .map((status, i) => [i + weekStart, status])\n .filter(([, status]) => !status)\n .map(([i]) => i) as number[];\n\n const reports = await this.getReports(snapshot, pendingWeeks);\n\n const claims = Object.entries(reports)\n .filter((report: Report) => report[1][account])\n .map((report: Report) => {\n return {\n id: report[0],\n amount: report[1][account]\n };\n });\n\n //console.log(\"claims\", claims);\n\n const availableToClaim = claims\n .map(claim => parseFloat(claim.amount))\n .reduce((total, amount) => total.plus(amount), bnum(0))\n .toString();\n\n return {\n claims,\n reports,\n tokenClaimInfo,\n availableToClaim\n };\n }\n\n public async multiTokenClaimRewards(\n account: string,\n multiTokenPendingClaims: MultiTokenPendingClaims[]\n ): Promise<any> {\n try {\n const multiTokenClaims = await Promise.all(\n multiTokenPendingClaims.map((tokenPendingClaims, tokenIndex) =>\n this.computeClaimProofs(\n tokenPendingClaims,\n getAddress(account),\n tokenIndex\n )\n )\n );\n\n return flatten(multiTokenClaims);\n } catch (e) {\n console.log(\"[Claim] Claim Rewards Error:\", e);\n return Promise.reject(e);\n }\n }\n\n private async computeClaimProofs(\n tokenPendingClaims: MultiTokenPendingClaims,\n account: string,\n tokenIndex: number\n ): Promise<Promise<ClaimProofTuple[]>> {\n return Promise.all(\n tokenPendingClaims.claims.map(claim => {\n const payload: ComputeClaimProofPayload = {\n account,\n distributor: tokenPendingClaims.tokenClaimInfo.distributor,\n tokenIndex,\n decimals: tokenPendingClaims.tokenClaimInfo.decimals,\n // objects must be cloned\n report: { ...tokenPendingClaims.reports[claim.id] },\n claim: { ...claim }\n };\n\n return this.computeClaimProof(payload);\n })\n );\n }\n\n private computeClaimProof(\n payload: ComputeClaimProofPayload\n ): ClaimProofTuple {\n const {\n report,\n account,\n claim,\n distributor,\n tokenIndex,\n decimals\n } = payload;\n\n const claimAmount = claim.amount;\n const merkleTree = loadTree(report, decimals);\n\n const scaledBalance = scale(claimAmount, decimals).toString(10);\n\n const proof = merkleTree.getHexProof(\n soliditySha3(\n { t: \"address\", v: account },\n { t: \"uint\", v: scaledBalance }\n )\n );\n return [\n parseInt(claim.id),\n scaledBalance,\n distributor,\n tokenIndex,\n proof\n ] as ClaimProofTuple;\n }\n\n private async getTokenClaimsInfo() {\n let tokenClaims;\n try {\n const multiTokenClaim = await axios.get(\n \"https://raw.githubusercontent.com/balancer-labs/frontend-v2/develop/src/services/claim/MultiTokenClaim.json\"\n );\n const chainId = networkChainIdMap[this.network];\n tokenClaims = multiTokenClaim.data[chainId];\n } catch (e) {\n console.log(\"balancer multi token info error\", e);\n }\n\n if (tokenClaims != null) {\n return (tokenClaims as TokenClaimInfo[]).map(tokenClaim => ({\n ...tokenClaim,\n token: getAddress(tokenClaim.token),\n decimals: 18\n }));\n }\n\n return null;\n }\n\n private async getSnapshot(manifest: string) {\n try {\n const response = await axios.get<Snapshot>(manifest);\n return response.data || {};\n } catch (error) {\n return {};\n }\n }\n\n private async getClaimStatus(\n totalWeeks: number,\n account: string,\n tokenClaimInfo: TokenClaimInfo\n ): Promise<ClaimStatus[]> {\n const { token, distributor, weekStart } = tokenClaimInfo;\n\n const claimStatusCalls = Array.from({ length: totalWeeks }).map((_, i) => [\n stakingAddress[this.network][Dapp.BALANCER],\n \"isClaimed\",\n [token, distributor, weekStart + i, account]\n ]);\n\n const rootCalls = Array.from({ length: totalWeeks }).map((_, i) => [\n stakingAddress[this.network][Dapp.BALANCER],\n \"getDistributionRoot\",\n [token, distributor, weekStart + i]\n ]);\n\n try {\n const result = (await multicall<boolean | string>(\n this.network,\n this.signer,\n merkleOrchardAbi.abi,\n [...claimStatusCalls, ...rootCalls],\n {},\n true\n )) as (boolean | string)[];\n\n if (result.length > 0) {\n const chunks = chunk(flatten(result), totalWeeks);\n\n const claimedResult = chunks[0] as boolean[];\n const distributionRootResult = chunks[1] as string[];\n\n return claimedResult.filter(\n (_, index) =>\n distributionRootResult[index] !== ethers.constants.HashZero\n );\n }\n } catch (e) {\n console.log(\"[Claim] Claim Status Error:\", e);\n }\n\n return [];\n }\n\n private async getReports(snapshot: Snapshot, weeks: number[]) {\n const reports = await Promise.all<Report>(\n weeks\n .filter(week => snapshot[week] != null)\n .map(week => ipfsService.get(snapshot[week]))\n );\n return Object.fromEntries(reports.map((report, i) => [weeks[i], report]));\n }\n}\n","import { Price, Token } from \"@uniswap/sdk-core\";\nimport {\n encodeSqrtRatioX96,\n FeeAmount,\n nearestUsableTick,\n priceToClosestTick,\n TICK_SPACINGS,\n TickMath\n} from \"@uniswap/v3-sdk\";\nimport { ethers } from \"ethers\";\nimport JSBI from \"jsbi\";\nimport { Pool } from \"../..\";\nimport {\n networkChainIdMap,\n nonfungiblePositionManagerAddress\n} from \"../../config\";\nimport { UniswapV3MintParams } from \"./types\";\nimport INonfungiblePositionManager from \"../../abi/INonfungiblePositionManager.json\";\n\nexport function tryParsePrice(\n baseToken: Token,\n quoteToken: Token,\n value: string\n): Price<Token, Token> {\n const [whole, fraction] = value.split(\".\");\n\n const decimals = fraction?.length ?? 0;\n const withoutDecimals = JSBI.BigInt((whole ?? \"\") + (fraction ?? \"\"));\n\n return new Price(\n baseToken,\n quoteToken,\n JSBI.multiply(\n JSBI.BigInt(10 ** decimals),\n JSBI.BigInt(10 ** baseToken.decimals)\n ),\n JSBI.multiply(withoutDecimals, JSBI.BigInt(10 ** quoteToken.decimals))\n );\n}\n\nexport function tryParseTick(\n baseToken: Token,\n quoteToken: Token,\n feeAmount: FeeAmount,\n value: string\n): number {\n const price = tryParsePrice(baseToken, quoteToken, value);\n\n let tick: number;\n\n // check price is within min/max bounds, if outside return min/max\n const sqrtRatioX96 = encodeSqrtRatioX96(price.numerator, price.denominator);\n\n if (JSBI.greaterThanOrEqual(sqrtRatioX96, TickMath.MAX_SQRT_RATIO)) {\n tick = TickMath.MAX_TICK;\n } else if (JSBI.lessThanOrEqual(sqrtRatioX96, TickMath.MIN_SQRT_RATIO)) {\n tick = TickMath.MIN_TICK;\n } else {\n // this function is agnostic to the base, will always return the correct tick\n tick = priceToClosestTick(price);\n }\n\n return nearestUsableTick(tick, TICK_SPACINGS[feeAmount]);\n}\n\nexport async function getUniswapV3MintParams(\n pool: Pool,\n assetA: string,\n assetB: string,\n amountA: string | ethers.BigNumber,\n amountB: string | ethers.BigNumber,\n minPrice: number | null,\n maxPrice: number | null,\n minTick: number | null,\n maxTick: number | null,\n feeAmount: FeeAmount\n): Promise<UniswapV3MintParams> {\n let tickLower = 0;\n let tickUpper = 0;\n const chainId = networkChainIdMap[pool.network];\n const decimals = await Promise.all(\n [assetA, assetB].map(asset => pool.utils.getDecimals(asset))\n );\n const tokenA = new Token(chainId, assetA, decimals[0]);\n const tokenB = new Token(chainId, assetB, decimals[1]);\n const [token0, token1] = tokenA.sortsBefore(tokenB)\n ? [tokenA, tokenB]\n : [tokenB, tokenA];\n const invertPrice = !tokenA.equals(token0);\n\n if (minPrice && maxPrice) {\n tickLower = invertPrice\n ? tryParseTick(token1, token0, feeAmount, maxPrice.toString())\n : tryParseTick(token0, token1, feeAmount, minPrice.toString());\n tickUpper = invertPrice\n ? tryParseTick(token1, token0, feeAmount, minPrice.toString())\n : tryParseTick(token0, token1, feeAmount, maxPrice.toString());\n } else if (minTick && maxTick) {\n tickLower = minTick;\n tickUpper = maxTick;\n }\n const [amount0, amount1] = invertPrice\n ? [amountB, amountA]\n : [amountA, amountB];\n\n const deadline = Math.floor(Date.now() / 1000) + 60 * 20;\n\n return [\n token0.address,\n token1.address,\n feeAmount,\n tickLower,\n tickUpper,\n amount0,\n amount1,\n \"0\",\n \"0\",\n pool.address,\n deadline\n ];\n}\n\nexport async function getUniswapV3Liquidity(\n tokenId: string,\n pool: Pool\n): Promise<ethers.BigNumber> {\n const iNonfungiblePositionManager = new ethers.Contract(\n nonfungiblePositionManagerAddress[pool.network],\n INonfungiblePositionManager.abi,\n pool.signer\n );\n const result = await iNonfungiblePositionManager.positions(tokenId);\n return result.liquidity;\n}\n","import { FeeAmount } from \"@uniswap/v3-sdk\";\nimport { ethers } from \"ethers\";\nimport { Pool } from \"../..\";\n\nimport IUniswapV3Router from \"../../abi/IUniswapV3Router.json\";\nimport IUniswapV3Quoter from \"../../abi/IUniswapV3Quoter.json\";\nimport { UNISWAPV3_QUOTER_ADDRESS } from \"../../config\";\n\nexport async function getUniswapV3SwapTxData(\n pool: Pool,\n assetA: string,\n assetB: string,\n amountIn: string | ethers.BigNumber,\n slippage: number,\n feeAmount: FeeAmount\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Promise<any> {\n const quoterContract = new ethers.Contract(\n UNISWAPV3_QUOTER_ADDRESS,\n IUniswapV3Quoter.abi,\n pool.signer\n );\n\n const quotedAmountOut: ethers.BigNumber = await quoterContract.callStatic.quoteExactInputSingle(\n assetA,\n assetB,\n feeAmount,\n amountIn.toString(),\n 0\n );\n\n const minAmountOut = quotedAmountOut.mul((100 - slippage) * 100).div(10000);\n\n const iUniswapV3Router = new ethers.utils.Interface(IUniswapV3Router.abi);\n const swapTx = iUniswapV3Router.encodeFunctionData(\"exactInputSingle\", [\n [\n assetA,\n assetB,\n feeAmount,\n pool.address,\n amountIn.toString(),\n minAmountOut.toString(),\n 0\n ]\n ]);\n return swapTx;\n}\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport axios from \"axios\";\nimport { Contract, ethers, Wallet, BigNumber } from \"ethers\";\n\nimport IERC20 from \"../abi/IERC20.json\";\nimport IMiniChefV2 from \"../abi/IMiniChefV2.json\";\nimport ILendingPool from \"../abi/ILendingPool.json\";\nimport ISynthetix from \"../abi/ISynthetix.json\";\nimport IUniswapV2Router from \"../abi/IUniswapV2Router.json\";\nimport INonfungiblePositionManager from \"../abi/INonfungiblePositionManager.json\";\nimport IBalancerMerkleOrchard from \"../abi/IBalancerMerkleOrchard.json\";\nimport IAaveIncentivesController from \"../abi/IAaveIncentivesController.json\";\nimport {\n deadline,\n MaxUint128,\n nonfungiblePositionManagerAddress,\n routerAddress,\n stakingAddress,\n SYNTHETIX_TRACKING_CODE\n} from \"../config\";\nimport {\n Dapp,\n Transaction,\n FundComposition,\n AssetEnabled,\n Network\n} from \"../types\";\n\nimport { Utils } from \"./utils\";\nimport { ClaimService } from \"../services/claim-balancer/claim.service\";\nimport {\n getUniswapV3Liquidity,\n getUniswapV3MintParams\n} from \"../services/uniswap/V3Liquidity\";\nimport { FeeAmount } from \"@uniswap/v3-sdk\";\nimport { getUniswapV3SwapTxData } from \"../services/uniswap/V3Trade\";\n\nexport class Pool {\n public readonly poolLogic: Contract;\n public readonly managerLogic: Contract;\n public readonly factory: Contract;\n public readonly signer: Wallet;\n public readonly address: string;\n public readonly utils: Utils;\n public readonly network: Network;\n\n public constructor(\n network: Network,\n signer: Wallet,\n poolLogic: Contract,\n mangerLogic: Contract,\n utils: Utils,\n factory: Contract\n ) {\n this.network = network;\n this.poolLogic = poolLogic;\n this.address = poolLogic.address;\n this.managerLogic = mangerLogic;\n this.signer = signer;\n this.utils = utils;\n this.factory = factory;\n }\n\n /**\n * Return the assets with balances and deposit info of a pool\n * @returns {Promise<FundComposition[]>} Composition of assets with balance, deposit info\n */\n async getComposition(): Promise<FundComposition[]> {\n const result = await this.managerLogic.getFundComposition();\n\n const fundComposition: FundComposition[] = result[0].map(\n (item: AssetEnabled, index: string | number) => {\n const { asset, isDeposit } = item;\n return {\n asset: asset,\n isDeposit: isDeposit,\n balance: result[1][index],\n rate: result[2][index]\n };\n }\n );\n return fundComposition;\n }\n\n //Invest functions\n\n /**\n * Approve the asset that can be deposited into a pool\n * @param {string} nasset Address of deposit asset\n * @param {BigNumber | string} amount Amount to be approved\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async approveDeposit(\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iERC20 = new ethers.Contract(asset, IERC20.abi, this.signer);\n const tx = await iERC20.approve(this.address, amount, options);\n return tx;\n }\n\n /**\n * Deposit asset into a pool\n * @param {string} asset Address of asset\n * @param {BigNumber | string} amount Amount to be deposited\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async deposit(\n asset: string,\n amount: string | BigNumber,\n options: any = null\n ): Promise<any> {\n const tx = await this.poolLogic.deposit(asset, amount, options);\n return tx;\n }\n\n /**\n * Withdraw assets from a pool\n * @param fundTokenAmount Amount of pool tokens to be withdrawn\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async withdraw(\n fundTokenAmount: string | BigNumber,\n options: any = null\n ): Promise<any> {\n const tx = await this.poolLogic.withdraw(fundTokenAmount, options);\n return tx;\n }\n\n //Manager functions\n\n /**\n * Approve the asset for trading and providing liquidity\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} asset Address of asset\n * @param @param {BigNumber | string} Amount to be approved\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async approve(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iERC20 = new ethers.utils.Interface(IERC20.abi);\n const approveTxData = iERC20.encodeFunctionData(\"approve\", [\n routerAddress[this.network][dapp],\n amount\n ]);\n const tx = await this.poolLogic.execTransaction(\n asset,\n approveTxData,\n options\n );\n return tx;\n }\n\n /**\n * Approve the liquidity pool token for staking\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} asset Address of liquidity pool token\n * @param {BigNumber | string} amount Aamount to be approved\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async approveStaking(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iERC20 = new ethers.utils.Interface(IERC20.abi);\n const approveTxData = iERC20.encodeFunctionData(\"approve\", [\n stakingAddress[this.network][dapp],\n amount\n ]);\n const tx = await this.poolLogic.execTransaction(\n asset,\n approveTxData,\n options\n );\n return tx;\n }\n\n /**\n * Approve the liquidity pool token for staking\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} asset Address of liquidity pool token\n * @param {BigNumber | string} amount Aamount to be approved\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async approveUniswapV3Liquidity(\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iERC20 = new ethers.utils.Interface(IERC20.abi);\n const approveTxData = iERC20.encodeFunctionData(\"approve\", [\n nonfungiblePositionManagerAddress[this.network],\n amount\n ]);\n const tx = await this.poolLogic.execTransaction(\n asset,\n approveTxData,\n options\n );\n return tx;\n }\n\n /**\n * Trade an asset into another asset\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} assetFrom Asset to trade from\n * @param {string} assetTo Asset to trade into\n * @param {BigNumber | string} amountIn Amount\n * @param {number} slippage Slippage tolerance in %\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async trade(\n dapp: Dapp,\n assetFrom: string,\n assetTo: string,\n amountIn: BigNumber | string,\n slippage = 0.5,\n options: any = null\n ): Promise<any> {\n let swapTxData: string;\n if (dapp === Dapp.ONEINCH) {\n const apiUrl = `https://api.1inch.exchange/v4.0/137/swap?fromTokenAddress=${assetFrom}&toTokenAddress=${assetTo}&amount=${amountIn.toString()}&fromAddress=${\n this.address\n }&destReceiver=${\n this.address\n }&slippage=${slippage.toString()}&disableEstimate=true`;\n const response = await axios.get(apiUrl);\n swapTxData = response.data.tx.data;\n } else if (dapp === Dapp.BALANCER) {\n swapTxData = await this.utils.getBalancerSwapTx(\n this,\n assetFrom,\n assetTo,\n amountIn,\n slippage\n );\n } else if (dapp === Dapp.SYNTHETIX) {\n const iSynthetix = new ethers.utils.Interface(ISynthetix.abi);\n const assets = [assetFrom, assetTo].map(asset =>\n ethers.utils.formatBytes32String(asset)\n );\n const daoAddress = await this.factory.owner();\n swapTxData = iSynthetix.encodeFunctionData(Transaction.SWAP_SYNTHS, [\n assets[0],\n amountIn,\n assets[1],\n daoAddress,\n SYNTHETIX_TRACKING_CODE\n ]);\n } else {\n const iUniswapV2Router = new ethers.utils.Interface(IUniswapV2Router.abi);\n const minAmountOut = await this.utils.getMinAmountOut(\n dapp,\n assetFrom,\n assetTo,\n amountIn,\n slippage\n );\n swapTxData = iUniswapV2Router.encodeFunctionData(Transaction.SWAP, [\n amountIn,\n minAmountOut,\n [assetFrom, assetTo],\n this.address,\n deadline\n ]);\n }\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][dapp],\n swapTxData,\n options\n );\n return tx;\n }\n\n /**\n * Add liquidity to a liquidity pool\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} assetA First asset\n * @param {string} assetB Second asset\n * @param {BigNumber | string} amountA Amount first asset\n * @param {BigNumber | string} amountB Amount second asset\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async addLiquidity(\n dapp: Dapp,\n assetA: string,\n assetB: string,\n amountA: BigNumber | string,\n amountB: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iUniswapV2Router = new ethers.utils.Interface(IUniswapV2Router.abi);\n const addLiquidityTxData = iUniswapV2Router.encodeFunctionData(\n Transaction.ADD_LIQUIDITY,\n [assetA, assetB, amountA, amountB, 0, 0, this.address, deadline]\n );\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][dapp],\n addLiquidityTxData,\n options\n );\n return tx;\n }\n\n /**\n * Remove liquidity from a liquidity pool\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} assetA First asset\n * @param {string} assetB Second asset\n * @param {BigNumber | string} amount Amount of liquidity pool tokens\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async removeLiquidity(\n dapp: Dapp,\n assetA: string,\n assetB: string,\n amount: string | BigNumber,\n options: any = null\n ): Promise<any> {\n const iUniswapV2Router = new ethers.utils.Interface(IUniswapV2Router.abi);\n const removeLiquidityTxData = iUniswapV2Router.encodeFunctionData(\n Transaction.REMOVE_LIQUIDITY,\n [assetA, assetB, amount, 0, 0, this.address, deadline]\n );\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][dapp],\n removeLiquidityTxData,\n options\n );\n return tx;\n }\n\n /**\n * Stake liquidity pool tokens in a yield farm\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} asset Liquidity pool token\n * @param {BigNumber | string} amount Amount of liquidity pool tokens\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async stake(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iMiniChefV2 = new ethers.utils.Interface(IMiniChefV2.abi);\n const poolId = await this.utils.getLpPoolId(dapp, asset);\n const stakeTxData = iMiniChefV2.encodeFunctionData(Transaction.DEPOSIT, [\n poolId,\n amount,\n this.address\n ]);\n const tx = await this.poolLogic.execTransaction(\n stakingAddress[this.network][dapp],\n stakeTxData,\n options\n );\n\n return tx;\n }\n\n /**\n * Unstake liquidity pool tokens from a yield farm\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} asset Liquidity pool token\n * @param {BigNumber | string} amount Amount of liquidity pool tokens\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async unStake(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iMiniChefV2 = new ethers.utils.Interface(IMiniChefV2.abi);\n const poolId = await this.utils.getLpPoolId(dapp, asset);\n const unStakeTxData = iMiniChefV2.encodeFunctionData(Transaction.WITHDRAW, [\n poolId,\n amount,\n this.address\n ]);\n const tx = await this.poolLogic.execTransaction(\n stakingAddress[this.network][dapp],\n unStakeTxData,\n options\n );\n return tx;\n }\n\n /**\n * Lend asset to a lending pool\n * @param {Dapp} dapp Platform like Aave\n * @param {string} asset Asset\n * @param {BigNumber | string} amount Amount of asset to lend\n * @param {number} referrralCode Code from Aave referral program\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async lend(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n referrralCode = 0,\n options: any = null\n ): Promise<any> {\n const iLendingPool = new ethers.utils.Interface(ILendingPool.abi);\n const depositTxData = iLendingPool.encodeFunctionData(Transaction.DEPOSIT, [\n asset,\n amount,\n this.address,\n referrralCode\n ]);\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][dapp],\n depositTxData,\n options\n );\n return tx;\n }\n\n /**\n * Witdraw asset from a lending pool\n * @param {Dapp} dapp Platform like Aave\n * @param {string} asset Asset\n * @param {BigNumber | string} amount Amount of asset to lend\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async withdrawDeposit(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iLendingPool = new ethers.utils.Interface(ILendingPool.abi);\n const withdrawTxData = iLendingPool.encodeFunctionData(\n Transaction.WITHDRAW,\n [asset, amount, this.address]\n );\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][dapp],\n withdrawTxData,\n options\n );\n return tx;\n }\n\n /**\n * Borrow asset from a lending pool\n * @param {Dapp} dapp Platform like Aave\n * @param {string} asset Asset\n * @param {BigNumber | string} amount Amount of asset to lend\n * @param {number} referrralCode Code from Aave referral program\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async borrow(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n referrralCode = 0,\n options: any = null\n ): Promise<any> {\n const iLendingPool = new ethers.utils.Interface(ILendingPool.abi);\n const borrowTxData = iLendingPool.encodeFunctionData(Transaction.BORROW, [\n asset,\n amount,\n 2,\n referrralCode,\n this.address\n ]);\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][dapp],\n borrowTxData,\n options\n );\n return tx;\n }\n\n /**\n * Repays borrowed asset to a lending pool\n * @param {Dapp} dapp Platform like Aave\n * @param {string} asset Asset\n * @param {BigNumber | string} amount Amount of asset to lend\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async repay(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iLendingPool = new ethers.utils.Interface(ILendingPool.abi);\n const repayTxData = iLendingPool.encodeFunctionData(Transaction.REPAY, [\n asset,\n amount,\n 2,\n this.address\n ]);\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][dapp],\n repayTxData,\n options\n );\n return tx;\n }\n\n /**\n * Claim rewards of staked liquidity pool tokens\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} asset Liquidity pool token\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async harvestRewards(\n dapp: Dapp,\n asset: string,\n options: any = null\n ): Promise<any> {\n const iMiniChefV2 = new ethers.utils.Interface(IMiniChefV2.abi);\n const poolId = await this.utils.getLpPoolId(dapp, asset);\n const harvestTxData = iMiniChefV2.encodeFunctionData(Transaction.HARVEST, [\n poolId,\n this.address\n ]);\n const tx = await this.poolLogic.execTransaction(\n stakingAddress[this.network][dapp],\n harvestTxData,\n options\n );\n return tx;\n }\n\n /**\n * Change enabled pool assets\n * @param {AssetEnabled[]} assets New pool assets\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n public async changeAssets(\n assets: AssetEnabled[],\n options: any = null\n ): Promise<any> {\n const currentAssetsEnabled = await this.getComposition();\n const currentAssets = currentAssetsEnabled.map(e =>\n e.asset.toLocaleLowerCase()\n );\n const newAssets = assets.map(e => e.asset.toLocaleLowerCase());\n const removedAssets = currentAssets.filter(e => !newAssets.includes(e));\n const changedAssets = assets.map(e => [e.asset, e.isDeposit]);\n const tx = await this.managerLogic.changeAssets(\n changedAssets,\n removedAssets,\n options\n );\n return tx;\n }\n\n /**\n * Set a new trader with trading permissions\n * @param {string} trader Address trader account\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async setTrader(trader: string, options: any = null): Promise<any> {\n const tx = await this.managerLogic.setTrader(trader, options);\n return tx;\n }\n\n /**\n * Invest into a Balancer pool\n * @param {string} poolId Balancer pool id\n * @param {string[] | } assetsIn Array of balancer pool assets\n * @param {BigNumber[] | string[]} amountsIn Array of maximum amounts to provide to pool\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async joinBalancerPool(\n poolId: string,\n assets: string[],\n amountsIn: string[] | BigNumber[],\n options: any = null\n ): Promise<any> {\n const joinPoolTxData = this.utils.getBalancerJoinPoolTx(\n this,\n poolId,\n assets,\n amountsIn\n );\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][Dapp.BALANCER],\n joinPoolTxData,\n options\n );\n return tx;\n }\n\n /**\n * Invest into a Balancer pool\n * @param {string} poolId Balancer pool id\n * @param {string[] | } assets Array of balancer pool assets\n * @param {BigNumber | string } amount Amount of pool tokens to withdraw\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async exitBalancerPool(\n poolId: string,\n assets: string[],\n amount: string | BigNumber,\n options: any = null\n ): Promise<any> {\n const exitPoolTxData = this.utils.getBalancerExitPoolTx(\n this,\n poolId,\n assets,\n amount\n );\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][Dapp.BALANCER],\n exitPoolTxData,\n options\n );\n return tx;\n }\n\n /**\n * Claim rewards from Balancer pools\n * @param {string[]} assets Array of tokens being claimed\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async harvestBalancerRewards(options: any = null): Promise<any> {\n const claimService = new ClaimService(this.network, this.signer);\n const multiTokenPendingClaims = await claimService.getMultiTokensPendingClaims(\n this.address\n );\n const tokens = multiTokenPendingClaims.map(\n tokenPendingClaims => tokenPendingClaims.tokenClaimInfo.token\n );\n const claims = await claimService.multiTokenClaimRewards(\n this.address,\n multiTokenPendingClaims\n );\n const iBalancerMerkleOrchard = new ethers.utils.Interface(\n IBalancerMerkleOrchard.abi\n );\n const harvestTxData = iBalancerMerkleOrchard.encodeFunctionData(\n Transaction.CLAIM_DISTRIBIUTIONS,\n [this.address, claims, tokens]\n );\n const tx = await this.poolLogic.execTransaction(\n stakingAddress[this.network][Dapp.BALANCER],\n harvestTxData,\n options\n );\n return tx;\n }\n\n /**\n * Claim rewards from Aave platform\n * @param {string[]} assets Aave tokens (deposit/debt) hold by pool\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async harvestAaveRewards(\n assets: string[],\n options: any = null\n ): Promise<any> {\n const aaveIncentivesAddress = stakingAddress[this.network][\n Dapp.AAVE\n ] as string;\n const iAaveIncentivesController = new ethers.utils.Interface(\n IAaveIncentivesController.abi\n );\n const aaveIncentivesController = new ethers.Contract(\n aaveIncentivesAddress,\n iAaveIncentivesController,\n this.signer\n );\n const amount = await aaveIncentivesController.getUserUnclaimedRewards(\n this.address\n );\n const claimTxData = iAaveIncentivesController.encodeFunctionData(\n Transaction.CLAIM_REWARDS,\n [assets, amount, this.address]\n );\n const tx = await this.poolLogic.execTransaction(\n aaveIncentivesAddress,\n claimTxData,\n options\n );\n return tx;\n }\n\n /**\n * Create UniswapV3 liquidity pool\n * @param {string} assetA First asset\n * @param {string} assetB Second asset\n * @param {BigNumber | string} amountA Amount first asset\n * @param {BigNumber | string} amountB Amount second asset\n * @param { number } minPrice Lower price range (assetB per assetA)\n * @param { number } maxPrice Upper price range (assetB per assetA)\n * @param { number } minTick Lower tick range\n * @param { number } maxTick Upper tick range\n * @param { FeeAmount } feeAmount Fee tier (Low 0.05%, Medium 0.3%, High 1%)\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async addLiquidityUniswapV3(\n assetA: string,\n assetB: string,\n amountA: BigNumber | string,\n amountB: BigNumber | string,\n minPrice: number | null,\n maxPrice: number | null,\n minTick: number | null,\n maxTick: number | null,\n feeAmount: FeeAmount,\n options: any = null\n ): Promise<any> {\n if ((!minPrice || !maxPrice) && (!minTick || !maxTick))\n throw new Error(\"Need to provide price or tick range\");\n\n const iNonfungiblePositionManager = new ethers.utils.Interface(\n INonfungiblePositionManager.abi\n );\n\n const mintTxParams = await getUniswapV3MintParams(\n this,\n assetA,\n assetB,\n amountA,\n amountB,\n minPrice,\n maxPrice,\n minTick,\n maxTick,\n feeAmount\n );\n const mintTxData = iNonfungiblePositionManager.encodeFunctionData(\n Transaction.MINT,\n [mintTxParams]\n );\n const tx = await this.poolLogic.execTransaction(\n nonfungiblePositionManagerAddress[this.network],\n mintTxData,\n options\n );\n return tx;\n }\n\n /**\n * Remove liquidity from an UniswapV3 liquidity pool\n * @param {string} tokenId Token Id of UniswapV3 position\n * @param {number} amount Amount in percent of assets to be removed\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async removeLiquidityUniswapV3(\n tokenId: string,\n amount = 100,\n options: any = null\n ): Promise<any> {\n const iNonfungiblePositionManager = new ethers.utils.Interface(\n INonfungiblePositionManager.abi\n );\n const liquidity = (await getUniswapV3Liquidity(tokenId, this))\n .mul(amount)\n .div(100);\n const decreaseLiquidityTxData = iNonfungiblePositionManager.encodeFunctionData(\n Transaction.DECREASE_LIQUIDITY,\n [[tokenId, liquidity, 0, 0, deadline]]\n );\n const collectTxData = iNonfungiblePositionManager.encodeFunctionData(\n Transaction.COLLECT,\n [[tokenId, this.address, MaxUint128, MaxUint128]]\n );\n\n const multicallParams = [decreaseLiquidityTxData, collectTxData];\n\n if (amount === 100) {\n const burnTxData = iNonfungiblePositionManager.encodeFunctionData(\n Transaction.BURN,\n [tokenId]\n );\n multicallParams.push(burnTxData);\n }\n const multicallTxData = iNonfungiblePositionManager.encodeFunctionData(\n Transaction.MULTI_CALL,\n [multicallParams]\n );\n const tx = await this.poolLogic.execTransaction(\n nonfungiblePositionManagerAddress[this.network],\n multicallTxData,\n options\n );\n return tx;\n }\n\n /**\n * Increase liquidity of an UniswapV3 liquidity pool\n * @param {string} tokenId Token Id of UniswapV3 position\n * @param {BigNumber | string} amountA Amount first asset\n * @param {BigNumber | string} amountB Amount second asset\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async increaseLiquidityUniswapV3(\n tokenId: string,\n amountA: BigNumber | string,\n amountB: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iNonfungiblePositionManager = new ethers.utils.Interface(\n INonfungiblePositionManager.abi\n );\n const increaseLiquidityTxData = iNonfungiblePositionManager.encodeFunctionData(\n Transaction.INCREASE_LIQUIDITY,\n [[tokenId, amountA, amountB, 0, 0, deadline]]\n );\n const tx = await this.poolLogic.execTransaction(\n nonfungiblePositionManagerAddress[this.network],\n increaseLiquidityTxData,\n options\n );\n return tx;\n }\n\n /**\n * Claim fees of an UniswapV3 liquidity pool\n * @param {string} tokenId Token Id of UniswapV3 position\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async claimFeesUniswapV3(tokenId: string, options: any = null): Promise<any> {\n const iNonfungiblePositionManager = new ethers.utils.Interface(\n INonfungiblePositionManager.abi\n );\n const collectTxData = iNonfungiblePositionManager.encodeFunctionData(\n Transaction.COLLECT,\n [[tokenId, this.address, MaxUint128, MaxUint128]]\n );\n const tx = await this.poolLogic.execTransaction(\n nonfungiblePositionManagerAddress[this.network],\n collectTxData,\n options\n );\n return tx;\n }\n\n /**\n * Trade an asset into another asset\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} assetFrom Asset to trade from\n * @param {string} assetTo Asset to trade into\n * @param {BigNumber | string} amountIn Amount\n * @param { FeeAmount } feeAmount Fee tier (Low 0.05%, Medium 0.3%, High 1%)\n * @param {number} slippage Slippage tolerance in %\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async tradeUniswapV3(\n assetFrom: string,\n assetTo: string,\n amountIn: BigNumber | string,\n feeAmount: FeeAmount,\n slippage = 0.5,\n options: any = null\n ): Promise<any> {\n const swapxData = await getUniswapV3SwapTxData(\n this,\n assetFrom,\n assetTo,\n amountIn,\n slippage,\n feeAmount\n );\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][Dapp.UNISWAPV3],\n swapxData,\n options\n );\n return tx;\n }\n}\n","import { Contract, ethers, Wallet } from \"ethers\";\nimport {\n Token,\n TokenAmount,\n Pair,\n TradeType,\n Route,\n Trade,\n Percent\n} from \"@sushiswap/sdk\";\nimport { SOR, SwapTypes } from \"@balancer-labs/sor\";\nimport { BaseProvider } from \"@ethersproject/providers\";\n\nimport IERC20 from \"../abi/IERC20.json\";\nimport IMiniChefV2 from \"../abi/IMiniChefV2.json\";\nimport UniswapV2Factory from \"../abi/IUniswapV2Factory.json\";\nimport UniswapV2Pair from \"../abi/IUniswapV2Pair.json\";\nimport IBalancerV2Vault from \"../abi/IBalancertV2Vault.json\";\nimport {\n balancerSubgraph,\n dappFactoryAddress,\n networkChainIdMap,\n stakingAddress\n} from \"../config\";\nimport { Dapp, Network, Reserves } from \"../types\";\nimport { Pool } from \".\";\n\nexport class Utils {\n network: Network;\n signer: Wallet;\n\n public constructor(network: Network, signer: Wallet) {\n this.network = network;\n this.signer = signer;\n }\n\n /**\n * Return the reserves of the two assets of a liquidity pool\n * This is the price of one token in the other\n * @param {Dapp} dApp DApp like Uniswap or Sushiswap\n * @param {string} tokenA First token of the pool pair\n * @param {string} tokenB Second token of the pool pair\n * @returns {Promise<Reserves>} Reserves of the assets in BigNumber\n * @throws If the dapp is not supported on the network\n */\n async getLpReserves(\n dapp: Dapp,\n assetA: string,\n assetB: string\n ): Promise<Reserves> {\n if (dappFactoryAddress[this.network][dapp]) {\n const uniswapV2Factory = new Contract(\n dappFactoryAddress[this.network][dapp] as string,\n UniswapV2Factory.abi,\n this.signer\n );\n\n const uniswapV2PairAddress = await uniswapV2Factory.getPair(\n assetA,\n assetB\n );\n\n const uniswapV2Pair = new Contract(\n uniswapV2PairAddress,\n UniswapV2Pair.abi,\n this.signer\n );\n\n const result = await uniswapV2Pair.getReserves();\n const [reserve0, reserve1] = result;\n return assetA.toLowerCase() < assetB.toLowerCase()\n ? { assetA: reserve0, assetB: reserve1 }\n : { assetA: reserve1, assetB: reserve0 };\n } else {\n throw new Error(\"Dapp not supported on this network\");\n }\n }\n\n /**\n * Returns the pool id of a liquidity pool\n * @param {Dapp} dApp DApp like uniswap or sushiswap\n * @param {string} lpPoolAddress token address of the pool pair\n * @returns {number} Pool Id\n * @throws if the dapp is not supported on the network\n */\n\n async getLpPoolId(dapp: Dapp, poolAsset: string): Promise<number> {\n if (stakingAddress[this.network][dapp]) {\n const masterChefV2 = new Contract(\n stakingAddress[this.network][dapp] as string,\n IMiniChefV2.abi,\n this.signer\n );\n\n const poolLength = await masterChefV2.poolLength();\n const idArray = Array.from(\n { length: poolLength.toNumber() },\n (_, v) => v\n );\n const lpPoolAddresses = await Promise.all(\n idArray.map(e => masterChefV2.lpToken(e))\n );\n const poolId = lpPoolAddresses\n .map(e => e.toLowerCase())\n .indexOf(poolAsset.toLocaleLowerCase());\n if (poolId === -1) {\n throw new Error(\"Staking not supported for asset\");\n }\n return poolId;\n } else {\n throw new Error(\"Dapp not supported on this network\");\n }\n }\n\n /**\n * Returns the balance of an asset (ERC20) token\n * @param {string} asset string token address\n * @param {string} owner address of the owner\n * @returns { BigNumber } Balance of asset\n */\n\n async getBalance(asset: string, owner: string): Promise<ethers.BigNumber> {\n const iERC20 = new ethers.Contract(asset, IERC20.abi, this.signer);\n const balance = await iERC20.balanceOf(owner);\n return balance;\n }\n\n /**\n * Returns the decimals of an asset (ERC20) token\n * @param {string} asset string token address\n * @returns { number } Balance of asset\n */\n\n async getDecimals(asset: string): Promise<number> {\n const iERC20 = new ethers.Contract(asset, IERC20.abi, this.signer);\n const decimals = await iERC20.decimals();\n return decimals;\n }\n\n /**\n * Return the minimum amount out for a trade between two assets\n * given the trade amount and slippage\n * @param {Dapp} dApp DApp like Uniswap or Sushiswap\n * @param {string} assetFrom Asset to trade from\n * @param {string} assetTo Asset to trade into\n * @param {string | ethers.BigNumber} amountIn Trade amount\n * @param { number} slippage Maximum slippage allowed\n * @returns {Promise<ethers.BigNumber>} Reserves of the assets in BigNumber\n */\n async getMinAmountOut(\n dapp: Dapp,\n assetFrom: string,\n assetTo: string,\n amountIn: string | ethers.BigNumber,\n slippage: number\n ): Promise<ethers.BigNumber> {\n const assetFromChecked = ethers.utils.getAddress(assetFrom);\n const assetToChecked = ethers.utils.getAddress(assetTo);\n const reserves = await this.getLpReserves(\n dapp,\n assetFromChecked,\n assetToChecked\n );\n const tokenA = new Token(\n networkChainIdMap[this.network],\n assetFromChecked,\n 18\n );\n const tokenB = new Token(\n networkChainIdMap[this.network],\n assetToChecked,\n 18\n );\n const pair = new Pair(\n new TokenAmount(tokenA, reserves.assetA.toString()),\n new TokenAmount(tokenB, reserves.assetB.toString())\n );\n const route = new Route([pair], tokenA, tokenB);\n\n const trade = new Trade(\n route,\n new TokenAmount(tokenA, amountIn.toString()),\n TradeType.EXACT_INPUT\n );\n return ethers.BigNumber.from(\n trade\n .minimumAmountOut(new Percent((slippage * 100).toFixed(), \"10000\"))\n .raw.toString()\n );\n }\n\n async getBalancerSwapTx(\n pool: Pool,\n assetFrom: string,\n assetTo: string,\n amountIn: ethers.BigNumber | string,\n slippage: number\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n const sor = new SOR(\n this.signer.provider as BaseProvider,\n networkChainIdMap[this.network],\n balancerSubgraph[this.network]\n );\n // isFetched will be true on success\n const isFetched = await sor.fetchPools();\n\n if (!isFetched) throw new Error(\"Error fetching balancer pools\");\n\n const swapType = SwapTypes.SwapExactIn;\n const { swaps, tokenAddresses, returnAmount } = await sor.getSwaps(\n assetFrom,\n assetTo,\n swapType,\n ethers.BigNumber.from(amountIn)\n );\n\n const minimumAmountOut = returnAmount\n .mul(10000 - slippage * 100)\n .div(10000);\n\n const iBalancerV2Vault = new ethers.utils.Interface(IBalancerV2Vault.abi);\n\n if (swaps.length === 1) {\n const swap = swaps[0];\n //do single swap\n const swapTx = iBalancerV2Vault.encodeFunctionData(\"swap\", [\n [\n swap.poolId,\n SwapTypes.SwapExactIn,\n tokenAddresses[swap.assetInIndex],\n tokenAddresses[swap.assetOutIndex],\n swap.amount,\n swap.userData\n ],\n [pool.address, false, pool.address, false],\n minimumAmountOut,\n Math.floor(Date.now() / 1000) + 60 * 20 // 20 minutes from the current Unix time\n ]);\n return swapTx;\n } else {\n // Limits:\n // +ve means max to send\n // -ve mean min to receive\n // For a multihop the intermediate tokens should be 0\n const limits: string[] = [];\n tokenAddresses.forEach((token, i) => {\n if (token.toLowerCase() === assetFrom.toLowerCase()) {\n limits[i] = amountIn.toString();\n } else if (token.toLowerCase() === assetTo.toLowerCase()) {\n limits[i] = minimumAmountOut.mul(-1).toString();\n } else {\n limits[i] = \"0\";\n }\n });\n const swapTx = iBalancerV2Vault.encodeFunctionData(\"batchSwap\", [\n SwapTypes.SwapExactIn,\n swaps,\n tokenAddresses,\n [pool.address, false, pool.address, false],\n limits,\n Math.floor(Date.now() / 1000) + 60 * 20 // 20 minutes from the current Unix time\n ]);\n return swapTx;\n }\n }\n\n async getBalancerJoinPoolTx(\n pool: Pool,\n balancerPoolId: string,\n assets: string[],\n amountsIn: string[] | ethers.BigNumber[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n const iBalancerV2Vault = new ethers.utils.Interface(IBalancerV2Vault.abi);\n const txData = [\n balancerPoolId,\n pool.address,\n pool.address,\n [\n assets,\n amountsIn,\n ethers.utils.defaultAbiCoder.encode(\n [\"uint256\", \"uint256[]\", \"uint256\"],\n [1, amountsIn, 0]\n ),\n false\n ]\n ];\n const joinPoolTx = iBalancerV2Vault.encodeFunctionData(\"joinPool\", txData);\n return joinPoolTx;\n }\n\n async getBalancerExitPoolTx(\n pool: Pool,\n balancerPoolId: string,\n assets: string[],\n amount: string | ethers.BigNumber\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n const minimumAmountOut = new Array(assets.length).fill(0);\n const iBalancerV2Vault = new ethers.utils.Interface(IBalancerV2Vault.abi);\n const txData = [\n balancerPoolId,\n pool.address,\n pool.address,\n [\n assets,\n minimumAmountOut,\n ethers.utils.defaultAbiCoder.encode(\n [\"uint256\", \"uint256\"],\n [1, amount]\n ),\n false\n ]\n ];\n const exitPoolTx = iBalancerV2Vault.encodeFunctionData(\"exitPool\", txData);\n return exitPoolTx;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Contract, Wallet } from \"ethers\";\n\nimport PoolFactory from \"../abi/PoolFactory.json\";\nimport PoolLogic from \"../abi/PoolLogic.json\";\nimport ManagerLogic from \"../abi/PoolManagerLogic.json\";\nimport { factoryAddress } from \"../config\";\nimport { Network, SupportedAsset } from \"../types\";\n\nimport { Pool } from \"./pool\";\nimport { Utils } from \"./utils\";\n\nexport class Dhedge {\n public network: Network;\n public signer: Wallet;\n public factory: Contract;\n public utils: Utils;\n public constructor(wallet: Wallet, network: Network) {\n this.network = network;\n this.signer = wallet;\n this.factory = new Contract(\n factoryAddress[network],\n PoolFactory.abi,\n this.signer\n );\n\n this.utils = new Utils(this.network, this.signer);\n }\n\n /**\n * Create a new pool.\n *\n * @param {string} managerName Name of manager\n * @param {string} poolName Pool name\n * @param {string} symbol Token symbol\n * @param {tuple[]} supportedAssets Enabled assets to trade\n * @param {number|BigNumber} managerFeeNumerator Manger fee in percent\n * @param {any} options Transaction options\n * @returns {Pool} Created Pool\n */\n public async createPool(\n managerName: string,\n poolName: string,\n symbol: string,\n supportedAssets: SupportedAsset[],\n managerFeeNumerator = 20,\n options: any = null\n ): Promise<Pool> {\n const pool = await this.factory.createFund(\n false,\n this.signer.getAddress(),\n managerName,\n poolName,\n symbol,\n managerFeeNumerator * 100,\n supportedAssets,\n options\n );\n const receipt = await pool.wait(1);\n\n const creationEvent = receipt.events.find(\n (item: { event: string }) => item.event === \"FundCreated\"\n );\n if (!creationEvent) throw new Error(\"Fund not created\");\n\n const poolAddress = creationEvent.args.fundAddress;\n const poolLogic = new Contract(poolAddress, PoolLogic.abi, this.signer);\n const managerLogicAddress = await poolLogic.poolManagerLogic();\n const managerLogic = new Contract(\n managerLogicAddress,\n ManagerLogic.abi,\n this.signer\n );\n\n return new Pool(\n this.network,\n this.signer,\n poolLogic,\n managerLogic,\n this.utils,\n this.factory\n );\n }\n\n /**\n * Load a pool based on the provided address\n * @param {string} address Pool address\n * @returns {Pool} Loaded Pool\n */\n public async loadPool(address: string): Promise<Pool> {\n this.validatePool(address);\n const poolLogic = new Contract(address, PoolLogic.abi, this.signer);\n const managerLogicAddress = await poolLogic.poolManagerLogic();\n const managerLogic = new Contract(\n managerLogicAddress,\n ManagerLogic.abi,\n this.signer\n );\n\n return new Pool(\n this.network,\n this.signer,\n poolLogic,\n managerLogic,\n this.utils,\n this.factory\n );\n }\n\n /**\n * Check if pool address is valid\n * @param {string} address Pool address\n * @returns {boolean} Is valid pool address\n */\n private async validatePool(address: string): Promise<void> {\n const isPool = await this.factory.isPool(address);\n if (!isPool) throw new Error(\"Given address not a pool\");\n }\n}\n"],"names":["Network","Dapp","Transaction","runtime","exports","Op","Object","prototype","hasOwn","hasOwnProperty","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","obj","key","value","defineProperty","enumerable","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","generator","create","Generator","context","Context","_invoke","state","method","arg","Error","undefined","done","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","type","makeInvokeMethod","fn","call","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","this","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","AsyncIterator","PromiseImpl","previousPromise","callInvokeWithMethodAndArg","resolve","reject","invoke","result","__await","then","unwrapped","error","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","length","i","doneResult","displayName","isGeneratorFunction","genFun","ctor","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","iter","keys","object","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","module","regeneratorRuntime","accidentalStrictMode","globalThis","Function","require","config","factoryAddress","POLYGON","process","env","STAGING_CONTRACTS","OPTIMISM","routerAddress","SUSHISWAP","AAVE","ONEINCH","QUICKSWAP","BALANCER","UNISWAPV3","SYNTHETIX","dappFactoryAddress","stakingAddress","nonfungiblePositionManagerAddress","networkChainIdMap","balancerSubgraph","multiCallAddress","deadline","Math","floor","Date","now","MaxUint128","multicall","network","provider","abi","calls","options","requireSuccess","multi","ethers","Contract","itf","Interface","tryAggregate","map","toLowerCase","encodeFunctionData","decodedResult","decodeFunctionResult","MerkleTree","elements","filter","el","Buffer","from","hexToBytes","sort","compare","bufDedup","layers","getLayers","getNextLayer","reduce","layer","idx","arr","_this","combinedHash","first","second","keccak256","sortAndConcat","getRoot","getHexRoot","bufferToHex","getProof","bufIndexOf","proof","pairElement","_this2","getPairElement","getHexProof","_el","bufArrToHexArr","pairIdx","hash","isBuffer","keccakFromString","equals","some","toString","args","concat","scale","input","decimalPlaces","unscaled","BigNumber","scalePow","scaleMul","pow","times","ipfsService","get","protocol","axios","data","ClaimService","signer","getMultiTokensPendingClaims","account","getTokenClaimsInfo","tokenClaimsInfo","all","tokenClaimInfo","getTokenPendingClaims","getAddress","multiTokenPendingClaimsWithRewards","pendingClaim","Number","availableToClaim","getSnapshot","manifest","snapshot","weekStart","getClaimStatus","pendingWeeks","status","getReports","reports","claims","entries","report","id","amount","claim","parseFloat","total","plus","multiTokenClaimRewards","multiTokenPendingClaims","tokenPendingClaims","tokenIndex","computeClaimProofs","flatten","console","log","payload","distributor","decimals","_this3","computeClaimProof","claimAmount","merkleTree","balances","address","balance","leaf","soliditySha3","t","v","loadTree","scaledBalance","parseInt","tokenClaims","tokenClaim","token","totalWeeks","claimStatusCalls","Array","_","_this4","rootCalls","merkleOrchardAbi","chunks","chunk","distributionRootResult","index","constants","HashZero","weeks","week","fromEntries","tryParseTick","baseToken","quoteToken","feeAmount","tick","price","split","whole","fraction","withoutDecimals","JSBI","BigInt","Price","multiply","tryParsePrice","sqrtRatioX96","encodeSqrtRatioX96","numerator","denominator","greaterThanOrEqual","TickMath","MAX_SQRT_RATIO","MAX_TICK","lessThanOrEqual","MIN_SQRT_RATIO","MIN_TICK","priceToClosestTick","nearestUsableTick","TICK_SPACINGS","getUniswapV3MintParams","pool","assetA","assetB","amountA","amountB","minPrice","maxPrice","minTick","maxTick","tickLower","tickUpper","chainId","asset","utils","getDecimals","tokenA","Token","tokenB","sortsBefore","token1","invertPrice","token0","amount0","amount1","getUniswapV3Liquidity","tokenId","iNonfungiblePositionManager","INonfungiblePositionManager","positions","liquidity","getUniswapV3SwapTxData","amountIn","slippage","quoterContract","IUniswapV3Quoter","callStatic","quoteExactInputSingle","minAmountOut","mul","div","iUniswapV3Router","IUniswapV3Router","swapTx","Pool","poolLogic","mangerLogic","factory","managerLogic","getComposition","getFundComposition","fundComposition","item","isDeposit","rate","approveDeposit","iERC20","IERC20","approve","deposit","withdraw","fundTokenAmount","dapp","approveTxData","execTransaction","approveStaking","approveUniswapV3Liquidity","trade","assetFrom","assetTo","apiUrl","swapTxData","tx","getBalancerSwapTx","iSynthetix","ISynthetix","assets","formatBytes32String","owner","SWAP_SYNTHS","iUniswapV2Router","IUniswapV2Router","getMinAmountOut","SWAP","addLiquidity","addLiquidityTxData","ADD_LIQUIDITY","removeLiquidity","removeLiquidityTxData","REMOVE_LIQUIDITY","stake","iMiniChefV2","IMiniChefV2","getLpPoolId","stakeTxData","DEPOSIT","unStake","unStakeTxData","WITHDRAW","lend","referrralCode","iLendingPool","ILendingPool","depositTxData","withdrawDeposit","withdrawTxData","borrow","borrowTxData","BORROW","repay","repayTxData","REPAY","harvestRewards","harvestTxData","HARVEST","changeAssets","currentAssets","e","toLocaleLowerCase","newAssets","removedAssets","includes","changedAssets","setTrader","trader","joinBalancerPool","poolId","amountsIn","joinPoolTxData","getBalancerJoinPoolTx","exitBalancerPool","exitPoolTxData","getBalancerExitPoolTx","harvestBalancerRewards","claimService","tokens","iBalancerMerkleOrchard","IBalancerMerkleOrchard","CLAIM_DISTRIBIUTIONS","harvestAaveRewards","aaveIncentivesAddress","iAaveIncentivesController","IAaveIncentivesController","aaveIncentivesController","getUserUnclaimedRewards","claimTxData","CLAIM_REWARDS","addLiquidityUniswapV3","mintTxData","MINT","removeLiquidityUniswapV3","decreaseLiquidityTxData","DECREASE_LIQUIDITY","collectTxData","COLLECT","multicallParams","burnTxData","BURN","multicallTxData","MULTI_CALL","increaseLiquidityUniswapV3","increaseLiquidityTxData","INCREASE_LIQUIDITY","claimFeesUniswapV3","tradeUniswapV3","swapxData","Utils","getLpReserves","uniswapV2Factory","UniswapV2Factory","getPair","uniswapV2Pair","UniswapV2Pair","getReserves","reserve0","reserve1","poolAsset","masterChefV2","poolLength","idArray","toNumber","lpToken","indexOf","getBalance","balanceOf","assetFromChecked","assetToChecked","reserves","pair","Pair","TokenAmount","route","Route","Trade","TradeType","EXACT_INPUT","minimumAmountOut","Percent","toFixed","raw","sor","SOR","fetchPools","swapType","SwapTypes","SwapExactIn","getSwaps","swaps","tokenAddresses","returnAmount","iBalancerV2Vault","IBalancerV2Vault","swap","assetInIndex","assetOutIndex","userData","limits","balancerPoolId","txData","defaultAbiCoder","encode","joinPoolTx","fill","exitPoolTx","Dhedge","wallet","PoolFactory","createPool","managerName","poolName","symbol","supportedAssets","managerFeeNumerator","createFund","wait","creationEvent","events","find","event","fundAddress","PoolLogic","poolManagerLogic","ManagerLogic","loadPool","validatePool","isPool"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"v2-sdk.cjs.production.min.js","sources":["../src/types.ts","../node_modules/regenerator-runtime/runtime.js","../src/config.ts","../src/utils/contract.ts","../src/utils/merkle.ts","../src/utils/index.ts","../src/services/claim-balancer/ipfs.service.ts","../src/services/claim-balancer/claim.service.ts","../src/services/uniswap/V3Liquidity.ts","../src/services/uniswap/V3Trade.ts","../src/entities/pool.ts","../src/entities/utils.ts","../src/entities/dhedge.ts"],"sourcesContent":["import { BigNumber } from \"ethers\";\n\nexport enum Network {\n POLYGON = \"polygon\",\n OPTIMISM = \"optimism\"\n}\n\nexport enum Dapp {\n SUSHISWAP = \"sushiswap\",\n AAVE = \"aave\",\n ONEINCH = \"1inch\",\n QUICKSWAP = \"quickswap\",\n BALANCER = \"balancer\",\n UNISWAPV3 = \"uniswapV3\",\n SYNTHETIX = \"synthetix\",\n AAVEV3 = \"aavev3\",\n ARRAKIS = \"arrakis\"\n}\n\nexport enum Transaction {\n SWAP = \"swapExactTokensForTokens\",\n ADD_LIQUIDITY = \"addLiquidity\",\n DEPOSIT = \"deposit\",\n HARVEST = \"harvest\",\n CLAIM_DISTRIBIUTIONS = \"claimDistributions\",\n CLAIM_REWARDS = \"claimRewards\",\n REMOVE_LIQUIDITY = \"removeLiquidity\",\n DECREASE_LIQUIDITY = \"decreaseLiquidity\",\n INCREASE_LIQUIDITY = \"increaseLiquidity\",\n COLLECT = \"collect\",\n MULTI_CALL = \"multicall\",\n BORROW = \"borrow\",\n REPAY = \"repay\",\n WITHDRAW = \"withdraw\",\n MINT = \"mint\",\n BURN = \"burn\",\n SWAP_SYNTHS = \"exchangeWithTracking\",\n ADD_LIQUIDITY_STAKE = \"addLiquidityAndStake\",\n REMOVE_LIQUIDITY_UNSTAKE = \"removeLiquidityAndUnstake\"\n}\n\nexport type AddressNetworkMap = Readonly<Record<Network, string>>;\n\nexport type AddressDappMap = {\n [key in Dapp]?: string;\n};\n\nexport type AddressDappNetworkMap = Readonly<Record<Network, AddressDappMap>>;\n\nexport type SupportedAsset = [string, boolean];\n\nexport type AssetEnabled = {\n asset: string;\n isDeposit: boolean;\n};\n\nexport type FundComposition = {\n asset: string;\n isDeposit: boolean;\n balance: BigNumber;\n rate: BigNumber;\n};\n\nexport type Reserves = {\n assetA: BigNumber;\n assetB: BigNumber;\n};\n\nexport type NetworkChainIdMap = Readonly<Record<Network, number>>;\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = GeneratorFunctionPrototype;\n define(Gp, \"constructor\", GeneratorFunctionPrototype);\n define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction);\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","import {\n Dapp,\n AddressNetworkMap,\n Network,\n AddressDappNetworkMap\n} from \"./types\";\nimport { NetworkChainIdMap } from \".\";\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nrequire(\"dotenv\").config();\n\nexport const factoryAddress: AddressNetworkMap = {\n [Network.POLYGON]: process.env.STAGING_CONTRACTS\n ? \"0xDd87eCdB10cFF7004276AAbAbd30e7a08F69bb53\"\n : \"0xfdc7b8bFe0DD3513Cc669bB8d601Cb83e2F69cB0\",\n [Network.OPTIMISM]: \"0x5e61a079A178f0E5784107a4963baAe0c5a680c6\"\n};\n\nexport const routerAddress: AddressDappNetworkMap = {\n [Network.POLYGON]: {\n [Dapp.SUSHISWAP]: \"0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506\",\n [Dapp.AAVE]: \"0x8dFf5E27EA6b7AC08EbFdf9eB090F32ee9a30fcf\",\n [Dapp.AAVEV3]: \"0x794a61358D6845594F94dc1DB02A252b5b4814aD\",\n [Dapp.ONEINCH]: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n [Dapp.QUICKSWAP]: \"0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff\",\n [Dapp.BALANCER]: \"0xBA12222222228d8Ba445958a75a0704d566BF2C8\",\n [Dapp.UNISWAPV3]: \"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45\",\n [Dapp.ARRAKIS]: \"0xbc91a120cCD8F80b819EAF32F0996daC3Fa76a6C\"\n },\n [Network.OPTIMISM]: {\n [Dapp.UNISWAPV3]: \"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45\",\n [Dapp.SYNTHETIX]: \"0x8700dAec35aF8Ff88c16BdF0418774CB3D7599B4\",\n [Dapp.AAVEV3]: \"0x794a61358D6845594F94dc1DB02A252b5b4814aD\",\n [Dapp.ONEINCH]: \"0x1111111254760F7ab3F16433eea9304126DCd199\"\n }\n};\n\nexport const dappFactoryAddress: AddressDappNetworkMap = {\n [Network.POLYGON]: {\n [Dapp.SUSHISWAP]: \"0xc35DADB65012eC5796536bD9864eD8773aBc74C4\",\n [Dapp.QUICKSWAP]: \"0x5757371414417b8C6CAad45bAeF941aBc7d3Ab32\"\n },\n [Network.OPTIMISM]: {}\n};\n\nexport const stakingAddress: AddressDappNetworkMap = {\n [Network.POLYGON]: {\n [Dapp.SUSHISWAP]: \"0x0769fd68dFb93167989C6f7254cd0D766Fb2841F\",\n [Dapp.BALANCER]: \"0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e\",\n [Dapp.AAVE]: \"0x357D51124f59836DeD84c8a1730D72B749d8BC23\"\n },\n [Network.OPTIMISM]: {}\n};\n\nexport const nonfungiblePositionManagerAddress: AddressNetworkMap = {\n [Network.POLYGON]: \"0xC36442b4a4522E871399CD717aBDD847Ab11FE88\",\n [Network.OPTIMISM]: \"0xC36442b4a4522E871399CD717aBDD847Ab11FE88\"\n};\n\nexport const networkChainIdMap: NetworkChainIdMap = {\n [Network.POLYGON]: 137,\n [Network.OPTIMISM]: 10\n};\n\nexport const balancerSubgraph: AddressNetworkMap = {\n [Network.POLYGON]:\n \"https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-polygon-v2\",\n [Network.OPTIMISM]: \"\"\n};\n\nexport const multiCallAddress: AddressNetworkMap = {\n [Network.POLYGON]: \"0x275617327c958bD06b5D6b871E7f491D76113dd8\",\n [Network.OPTIMISM]: \"\"\n};\n\nexport const deadline = Math.floor(Date.now() / 1000) + 60 * 20;\nexport const MaxUint128 = \"0xffffffffffffffffffffffffffffffff\";\nexport const UNISWAPV3_QUOTER_ADDRESS =\n \"0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6\";\n\nexport const SYNTHETIX_TRACKING_CODE =\n \"0x4448454447450000000000000000000000000000000000000000000000000000\";\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport set from \"lodash/set\";\nimport { Interface } from \"@ethersproject/abi\";\nimport { multiCallAddress } from \"../config\";\nimport { ethers, Network } from \"..\";\n\nexport async function call(\n provider: ethers.Signer,\n abi: any[],\n call: any[],\n options?: any\n) {\n const contract = new ethers.Contract(call[0], abi, provider);\n try {\n const params = call[2] || [];\n return await contract[call[1]](...params, options || {});\n } catch (e) {\n return Promise.reject(e);\n }\n}\n\nexport async function multicall<T>(\n network: Network,\n provider: ethers.Signer,\n abi: any[],\n calls: any[],\n options: any = {},\n requireSuccess = false\n): Promise<(T | null)[]> {\n const multi = new ethers.Contract(\n multiCallAddress[network],\n [\n \"function tryAggregate(bool requireSuccess, tuple(address, bytes)[] memory calls) public view returns (tuple(bool, bytes)[] memory returnData)\"\n ],\n provider\n );\n const itf = new Interface(abi);\n try {\n const res: [boolean, string][] = await multi.tryAggregate(\n // if false, allows individual calls to fail without causing entire multicall to fail\n requireSuccess,\n calls.map(call => [\n call[0].toLowerCase(),\n itf.encodeFunctionData(call[1], call[2])\n ]),\n options\n );\n\n return res.map(([success, returnData], i) => {\n if (!success) return null;\n const decodedResult = itf.decodeFunctionResult(calls[i][1], returnData);\n // Automatically unwrap any simple return values\n return decodedResult.length > 1 ? decodedResult : decodedResult[0];\n });\n } catch (e) {\n return Promise.reject(e);\n }\n}\n\nexport class Multicaller {\n public network: Network;\n public provider: ethers.Signer;\n public abi: any[];\n public options: any = {};\n public calls: any[] = [];\n public paths: any[] = [];\n\n constructor(network: Network, provider: ethers.Signer, abi: any[]) {\n this.network = network;\n this.provider = provider;\n this.abi = abi;\n }\n\n call(path: any, address: any, fn: any, params?: any): Multicaller {\n this.calls.push([address, fn, params]);\n this.paths.push(path);\n return this;\n }\n\n async execute(from?: any): Promise<any> {\n const obj = from || {};\n const result = await multicall(\n this.network,\n this.provider,\n this.abi,\n this.calls,\n this.options\n );\n result.forEach((r, i) => set(obj, this.paths[i], r));\n this.calls = [];\n this.paths = [];\n return obj;\n }\n}\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n// Shamelessly adapted from OpenZeppelin-contracts test utils\nimport BigNumber from \"bignumber.js\";\nimport { keccak256, keccakFromString, bufferToHex } from \"ethereumjs-util\";\nimport { hexToBytes, soliditySha3 } from \"web3-utils\";\nimport { scale } from \"./index\";\n\n// Merkle tree called with 32 byte hex values\nexport class MerkleTree {\n public elements: any;\n public layers: any;\n\n constructor(elements: any[]) {\n this.elements = elements\n .filter((el: any) => el)\n .map(el => Buffer.from(hexToBytes(el)));\n\n // Sort elements\n this.elements.sort(Buffer.compare);\n // Deduplicate elements\n this.elements = this.bufDedup(this.elements);\n\n // Create layers\n this.layers = this.getLayers(this.elements);\n }\n\n getLayers(elements: string | any[]) {\n if (elements.length === 0) {\n return [[\"\"]];\n }\n\n const layers = [];\n layers.push(elements);\n\n // Get next layer until we reach the root=\n while (layers[layers.length - 1].length > 1) {\n // @ts-ignore\n layers.push(this.getNextLayer(layers[layers.length - 1]));\n }\n\n return layers;\n }\n\n getNextLayer(elements: any[]) {\n return elements.reduce(\n (layer: any[], el: any, idx: number, arr: { [x: string]: any }) => {\n if (idx % 2 === 0) {\n // Hash the current element with its pair element\n layer.push(this.combinedHash(el, arr[idx + 1]));\n }\n\n return layer;\n },\n []\n );\n }\n\n combinedHash(first: any, second: any) {\n if (!first) {\n return second;\n }\n if (!second) {\n return first;\n }\n\n return keccak256(this.sortAndConcat(first, second));\n }\n\n getRoot() {\n return this.layers[this.layers.length - 1][0];\n }\n\n getHexRoot() {\n return bufferToHex(this.getRoot());\n }\n\n getProof(el: any) {\n let idx = this.bufIndexOf(el, this.elements);\n\n if (idx === -1) {\n throw new Error(\"Element does not exist in Merkle tree\");\n }\n\n return this.layers.reduce((proof: any[], layer: any) => {\n const pairElement = this.getPairElement(idx, layer);\n\n if (pairElement) {\n proof.push(pairElement);\n }\n\n idx = Math.floor(idx / 2);\n\n return proof;\n }, []);\n }\n\n // external call - convert to buffer\n getHexProof(_el: any) {\n const el = Buffer.from(hexToBytes(_el));\n\n const proof = this.getProof(el);\n\n return this.bufArrToHexArr(proof);\n }\n\n getPairElement(idx: number, layer: string | any[]) {\n const pairIdx = idx % 2 === 0 ? idx + 1 : idx - 1;\n\n if (pairIdx < layer.length) {\n return layer[pairIdx];\n } else {\n return null;\n }\n }\n\n bufIndexOf(el: string | any[], arr: string | any[]) {\n let hash;\n\n // Convert element to 32 byte hash if it is not one already\n if (el.length !== 32 || !Buffer.isBuffer(el)) {\n hash = keccakFromString(el as string);\n } else {\n hash = el;\n }\n\n for (let i = 0; i < arr.length; i++) {\n if (hash.equals(arr[i])) {\n return i;\n }\n }\n\n return -1;\n }\n\n bufDedup(elements: any[]) {\n return elements.filter((el: any, idx: number) => {\n return idx === 0 || !elements[idx - 1].equals(el);\n });\n }\n\n bufArrToHexArr(arr: any[]) {\n if (arr.some((el: any) => !Buffer.isBuffer(el))) {\n throw new Error(\"Array is not an array of buffers\");\n }\n\n return arr.map(\n (el: { toString: (arg0: string) => string }) => \"0x\" + el.toString(\"hex\")\n );\n }\n\n sortAndConcat(...args: any[]) {\n return Buffer.concat([...args].sort(Buffer.compare));\n }\n}\n\nexport function loadTree(\n balances: { [x: string]: string | BigNumber },\n decimals = 18\n) {\n const elements: (string | null)[] = [];\n Object.keys(balances).forEach(address => {\n const balance: string = scale(balances[address], decimals).toString(10);\n const leaf = soliditySha3(\n { t: \"address\", v: address },\n { t: \"uint\", v: balance }\n );\n elements.push(leaf);\n });\n return new MerkleTree(elements);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport BigNumber from \"bignumber.js\";\nimport { soliditySha3 } from \"web3-utils\";\nimport { MerkleTree } from \"./merkle\";\n\nexport function scale(\n input: BigNumber | string,\n decimalPlaces: number\n): BigNumber {\n const unscaled = typeof input === \"string\" ? new BigNumber(input) : input;\n const scalePow = new BigNumber(decimalPlaces.toString());\n const scaleMul = new BigNumber(10).pow(scalePow);\n return unscaled.times(scaleMul);\n}\n\nexport function loadTree(\n balances: { [x: string]: string | BigNumber },\n decimals = 18\n) {\n const elements: any[] = [];\n Object.keys(balances).forEach(address => {\n const balance: string = scale(balances[address], decimals).toString(10);\n const leaf = soliditySha3(\n { t: \"address\", v: address },\n { t: \"uint\", v: balance }\n );\n // @ts-ignore\n elements.push(leaf);\n });\n return new MerkleTree(elements);\n}\n\nexport function bnum(val: string | number | BigNumber): BigNumber {\n const number = typeof val === \"string\" ? val : val ? val.toString() : \"0\";\n return new BigNumber(number);\n}\n","import axios from \"axios\";\n\nexport default class IpfsService {\n async get<T>(hash: string, protocol = \"ipfs\"): Promise<T> {\n const { data } = await axios.get(\n `https://cloudflare-ipfs.com/${protocol}/${hash}`\n );\n return data;\n }\n}\n\nexport const ipfsService = new IpfsService();\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport axios from \"axios\";\nimport { chunk, flatten } from \"lodash\";\nimport merkleOrchardAbi from \"../../abi/IBalancerMerkleOrchard.json\";\nimport { ethers, Wallet } from \"ethers\";\n\nimport { getAddress } from \"@ethersproject/address\";\n\nimport { multicall } from \"../../utils/contract\";\nimport { bnum, loadTree, scale } from \"../../utils\";\n\nimport { ipfsService } from \"./ipfs.service\";\n\nimport {\n ClaimProofTuple,\n ClaimStatus,\n ComputeClaimProofPayload,\n MultiTokenPendingClaims,\n Report,\n Snapshot,\n TokenClaimInfo\n} from \"./types\";\n\nimport { Network } from \"../../types\";\nimport { networkChainIdMap, stakingAddress } from \"../../config\";\nimport { soliditySha3 } from \"web3-utils\";\nimport { Dapp } from \"../..\";\n\nexport class ClaimService {\n network: Network;\n signer: ethers.Wallet;\n public constructor(network: Network, signer: Wallet) {\n this.network = network;\n this.signer = signer;\n }\n public async getMultiTokensPendingClaims(\n account: string\n ): Promise<MultiTokenPendingClaims[]> {\n const tokenClaimsInfo = await this.getTokenClaimsInfo();\n if (tokenClaimsInfo != null) {\n const multiTokenPendingClaims = await Promise.all(\n tokenClaimsInfo.map(tokenClaimInfo =>\n this.getTokenPendingClaims(tokenClaimInfo, getAddress(account))\n )\n );\n\n const multiTokenPendingClaimsWithRewards = multiTokenPendingClaims.filter(\n pendingClaim => Number(pendingClaim.availableToClaim) > 0\n );\n\n return multiTokenPendingClaimsWithRewards;\n }\n return [];\n }\n\n public async getTokenPendingClaims(\n tokenClaimInfo: TokenClaimInfo,\n account: string\n ): Promise<MultiTokenPendingClaims> {\n const snapshot = await this.getSnapshot(tokenClaimInfo.manifest);\n const weekStart = tokenClaimInfo.weekStart;\n const claimStatus = await this.getClaimStatus(\n Object.keys(snapshot).length,\n account,\n tokenClaimInfo\n );\n\n const pendingWeeks = claimStatus\n .map((status, i) => [i + weekStart, status])\n .filter(([, status]) => !status)\n .map(([i]) => i) as number[];\n\n const reports = await this.getReports(snapshot, pendingWeeks);\n\n const claims = Object.entries(reports)\n .filter((report: Report) => report[1][account])\n .map((report: Report) => {\n return {\n id: report[0],\n amount: report[1][account]\n };\n });\n\n //console.log(\"claims\", claims);\n\n const availableToClaim = claims\n .map(claim => parseFloat(claim.amount))\n .reduce((total, amount) => total.plus(amount), bnum(0))\n .toString();\n\n return {\n claims,\n reports,\n tokenClaimInfo,\n availableToClaim\n };\n }\n\n public async multiTokenClaimRewards(\n account: string,\n multiTokenPendingClaims: MultiTokenPendingClaims[]\n ): Promise<any> {\n try {\n const multiTokenClaims = await Promise.all(\n multiTokenPendingClaims.map((tokenPendingClaims, tokenIndex) =>\n this.computeClaimProofs(\n tokenPendingClaims,\n getAddress(account),\n tokenIndex\n )\n )\n );\n\n return flatten(multiTokenClaims);\n } catch (e) {\n console.log(\"[Claim] Claim Rewards Error:\", e);\n return Promise.reject(e);\n }\n }\n\n private async computeClaimProofs(\n tokenPendingClaims: MultiTokenPendingClaims,\n account: string,\n tokenIndex: number\n ): Promise<Promise<ClaimProofTuple[]>> {\n return Promise.all(\n tokenPendingClaims.claims.map(claim => {\n const payload: ComputeClaimProofPayload = {\n account,\n distributor: tokenPendingClaims.tokenClaimInfo.distributor,\n tokenIndex,\n decimals: tokenPendingClaims.tokenClaimInfo.decimals,\n // objects must be cloned\n report: { ...tokenPendingClaims.reports[claim.id] },\n claim: { ...claim }\n };\n\n return this.computeClaimProof(payload);\n })\n );\n }\n\n private computeClaimProof(\n payload: ComputeClaimProofPayload\n ): ClaimProofTuple {\n const {\n report,\n account,\n claim,\n distributor,\n tokenIndex,\n decimals\n } = payload;\n\n const claimAmount = claim.amount;\n const merkleTree = loadTree(report, decimals);\n\n const scaledBalance = scale(claimAmount, decimals).toString(10);\n\n const proof = merkleTree.getHexProof(\n soliditySha3(\n { t: \"address\", v: account },\n { t: \"uint\", v: scaledBalance }\n )\n );\n return [\n parseInt(claim.id),\n scaledBalance,\n distributor,\n tokenIndex,\n proof\n ] as ClaimProofTuple;\n }\n\n private async getTokenClaimsInfo() {\n let tokenClaims;\n try {\n const multiTokenClaim = await axios.get(\n \"https://raw.githubusercontent.com/balancer-labs/frontend-v2/develop/src/services/claim/MultiTokenClaim.json\"\n );\n const chainId = networkChainIdMap[this.network];\n tokenClaims = multiTokenClaim.data[chainId];\n } catch (e) {\n console.log(\"balancer multi token info error\", e);\n }\n\n if (tokenClaims != null) {\n return (tokenClaims as TokenClaimInfo[]).map(tokenClaim => ({\n ...tokenClaim,\n token: getAddress(tokenClaim.token),\n decimals: 18\n }));\n }\n\n return null;\n }\n\n private async getSnapshot(manifest: string) {\n try {\n const response = await axios.get<Snapshot>(manifest);\n return response.data || {};\n } catch (error) {\n return {};\n }\n }\n\n private async getClaimStatus(\n totalWeeks: number,\n account: string,\n tokenClaimInfo: TokenClaimInfo\n ): Promise<ClaimStatus[]> {\n const { token, distributor, weekStart } = tokenClaimInfo;\n\n const claimStatusCalls = Array.from({ length: totalWeeks }).map((_, i) => [\n stakingAddress[this.network][Dapp.BALANCER],\n \"isClaimed\",\n [token, distributor, weekStart + i, account]\n ]);\n\n const rootCalls = Array.from({ length: totalWeeks }).map((_, i) => [\n stakingAddress[this.network][Dapp.BALANCER],\n \"getDistributionRoot\",\n [token, distributor, weekStart + i]\n ]);\n\n try {\n const result = (await multicall<boolean | string>(\n this.network,\n this.signer,\n merkleOrchardAbi.abi,\n [...claimStatusCalls, ...rootCalls],\n {},\n true\n )) as (boolean | string)[];\n\n if (result.length > 0) {\n const chunks = chunk(flatten(result), totalWeeks);\n\n const claimedResult = chunks[0] as boolean[];\n const distributionRootResult = chunks[1] as string[];\n\n return claimedResult.filter(\n (_, index) =>\n distributionRootResult[index] !== ethers.constants.HashZero\n );\n }\n } catch (e) {\n console.log(\"[Claim] Claim Status Error:\", e);\n }\n\n return [];\n }\n\n private async getReports(snapshot: Snapshot, weeks: number[]) {\n const reports = await Promise.all<Report>(\n weeks\n .filter(week => snapshot[week] != null)\n .map(week => ipfsService.get(snapshot[week]))\n );\n return Object.fromEntries(reports.map((report, i) => [weeks[i], report]));\n }\n}\n","import { Price, Token } from \"@uniswap/sdk-core\";\nimport {\n encodeSqrtRatioX96,\n FeeAmount,\n nearestUsableTick,\n priceToClosestTick,\n TICK_SPACINGS,\n TickMath\n} from \"@uniswap/v3-sdk\";\nimport { ethers } from \"ethers\";\nimport JSBI from \"jsbi\";\nimport { Pool } from \"../..\";\nimport {\n networkChainIdMap,\n nonfungiblePositionManagerAddress\n} from \"../../config\";\nimport { UniswapV3MintParams } from \"./types\";\nimport INonfungiblePositionManager from \"../../abi/INonfungiblePositionManager.json\";\n\nexport function tryParsePrice(\n baseToken: Token,\n quoteToken: Token,\n value: string\n): Price<Token, Token> {\n const [whole, fraction] = value.split(\".\");\n\n const decimals = fraction?.length ?? 0;\n const withoutDecimals = JSBI.BigInt((whole ?? \"\") + (fraction ?? \"\"));\n\n return new Price(\n baseToken,\n quoteToken,\n JSBI.multiply(\n JSBI.BigInt(10 ** decimals),\n JSBI.BigInt(10 ** baseToken.decimals)\n ),\n JSBI.multiply(withoutDecimals, JSBI.BigInt(10 ** quoteToken.decimals))\n );\n}\n\nexport function tryParseTick(\n baseToken: Token,\n quoteToken: Token,\n feeAmount: FeeAmount,\n value: string\n): number {\n const price = tryParsePrice(baseToken, quoteToken, value);\n\n let tick: number;\n\n // check price is within min/max bounds, if outside return min/max\n const sqrtRatioX96 = encodeSqrtRatioX96(price.numerator, price.denominator);\n\n if (JSBI.greaterThanOrEqual(sqrtRatioX96, TickMath.MAX_SQRT_RATIO)) {\n tick = TickMath.MAX_TICK;\n } else if (JSBI.lessThanOrEqual(sqrtRatioX96, TickMath.MIN_SQRT_RATIO)) {\n tick = TickMath.MIN_TICK;\n } else {\n // this function is agnostic to the base, will always return the correct tick\n tick = priceToClosestTick(price);\n }\n\n return nearestUsableTick(tick, TICK_SPACINGS[feeAmount]);\n}\n\nexport async function getUniswapV3MintParams(\n pool: Pool,\n assetA: string,\n assetB: string,\n amountA: string | ethers.BigNumber,\n amountB: string | ethers.BigNumber,\n minPrice: number | null,\n maxPrice: number | null,\n minTick: number | null,\n maxTick: number | null,\n feeAmount: FeeAmount\n): Promise<UniswapV3MintParams> {\n let tickLower = 0;\n let tickUpper = 0;\n const chainId = networkChainIdMap[pool.network];\n const decimals = await Promise.all(\n [assetA, assetB].map(asset => pool.utils.getDecimals(asset))\n );\n const tokenA = new Token(chainId, assetA, decimals[0]);\n const tokenB = new Token(chainId, assetB, decimals[1]);\n const [token0, token1] = tokenA.sortsBefore(tokenB)\n ? [tokenA, tokenB]\n : [tokenB, tokenA];\n const invertPrice = !tokenA.equals(token0);\n\n if (minPrice && maxPrice) {\n tickLower = invertPrice\n ? tryParseTick(token1, token0, feeAmount, maxPrice.toString())\n : tryParseTick(token0, token1, feeAmount, minPrice.toString());\n tickUpper = invertPrice\n ? tryParseTick(token1, token0, feeAmount, minPrice.toString())\n : tryParseTick(token0, token1, feeAmount, maxPrice.toString());\n } else if (minTick && maxTick) {\n tickLower = minTick;\n tickUpper = maxTick;\n }\n const [amount0, amount1] = invertPrice\n ? [amountB, amountA]\n : [amountA, amountB];\n\n const deadline = Math.floor(Date.now() / 1000) + 60 * 20;\n\n return [\n token0.address,\n token1.address,\n feeAmount,\n tickLower,\n tickUpper,\n amount0,\n amount1,\n \"0\",\n \"0\",\n pool.address,\n deadline\n ];\n}\n\nexport async function getUniswapV3Liquidity(\n tokenId: string,\n pool: Pool\n): Promise<ethers.BigNumber> {\n const iNonfungiblePositionManager = new ethers.Contract(\n nonfungiblePositionManagerAddress[pool.network],\n INonfungiblePositionManager.abi,\n pool.signer\n );\n const result = await iNonfungiblePositionManager.positions(tokenId);\n return result.liquidity;\n}\n","import { FeeAmount } from \"@uniswap/v3-sdk\";\nimport { ethers } from \"ethers\";\nimport { Pool } from \"../..\";\n\nimport IUniswapV3Router from \"../../abi/IUniswapV3Router.json\";\nimport IUniswapV3Quoter from \"../../abi/IUniswapV3Quoter.json\";\nimport { UNISWAPV3_QUOTER_ADDRESS } from \"../../config\";\n\nexport async function getUniswapV3SwapTxData(\n pool: Pool,\n assetA: string,\n assetB: string,\n amountIn: string | ethers.BigNumber,\n slippage: number,\n feeAmount: FeeAmount\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Promise<any> {\n const quoterContract = new ethers.Contract(\n UNISWAPV3_QUOTER_ADDRESS,\n IUniswapV3Quoter.abi,\n pool.signer\n );\n\n const quotedAmountOut: ethers.BigNumber = await quoterContract.callStatic.quoteExactInputSingle(\n assetA,\n assetB,\n feeAmount,\n amountIn.toString(),\n 0\n );\n\n const minAmountOut = quotedAmountOut.mul((100 - slippage) * 100).div(10000);\n\n const iUniswapV3Router = new ethers.utils.Interface(IUniswapV3Router.abi);\n const swapTx = iUniswapV3Router.encodeFunctionData(\"exactInputSingle\", [\n [\n assetA,\n assetB,\n feeAmount,\n pool.address,\n amountIn.toString(),\n minAmountOut.toString(),\n 0\n ]\n ]);\n return swapTx;\n}\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport axios from \"axios\";\nimport { Contract, ethers, Wallet, BigNumber } from \"ethers\";\n\nimport IERC20 from \"../abi/IERC20.json\";\nimport IMiniChefV2 from \"../abi/IMiniChefV2.json\";\nimport ILendingPool from \"../abi/ILendingPool.json\";\nimport ISynthetix from \"../abi/ISynthetix.json\";\nimport IUniswapV2Router from \"../abi/IUniswapV2Router.json\";\nimport INonfungiblePositionManager from \"../abi/INonfungiblePositionManager.json\";\nimport IBalancerMerkleOrchard from \"../abi/IBalancerMerkleOrchard.json\";\nimport IAaveIncentivesController from \"../abi/IAaveIncentivesController.json\";\nimport IArrakisV1RouterStaking from \"../abi/IArrakisV1RouterStaking.json\";\nimport ILiquidityGaugeV4 from \"../abi/ILiquidityGaugeV4.json\";\nimport IBalancerRewardsGauge from \"../abi/IBalancerRewardsGauge.json\";\n\nimport {\n deadline,\n MaxUint128,\n networkChainIdMap,\n nonfungiblePositionManagerAddress,\n routerAddress,\n stakingAddress,\n SYNTHETIX_TRACKING_CODE\n} from \"../config\";\nimport {\n Dapp,\n Transaction,\n FundComposition,\n AssetEnabled,\n Network\n} from \"../types\";\n\nimport { Utils } from \"./utils\";\nimport { ClaimService } from \"../services/claim-balancer/claim.service\";\nimport {\n getUniswapV3Liquidity,\n getUniswapV3MintParams\n} from \"../services/uniswap/V3Liquidity\";\nimport { FeeAmount } from \"@uniswap/v3-sdk\";\nimport { getUniswapV3SwapTxData } from \"../services/uniswap/V3Trade\";\n\nexport class Pool {\n public readonly poolLogic: Contract;\n public readonly managerLogic: Contract;\n public readonly factory: Contract;\n public readonly signer: Wallet;\n public readonly address: string;\n public readonly utils: Utils;\n public readonly network: Network;\n\n public constructor(\n network: Network,\n signer: Wallet,\n poolLogic: Contract,\n mangerLogic: Contract,\n utils: Utils,\n factory: Contract\n ) {\n this.network = network;\n this.poolLogic = poolLogic;\n this.address = poolLogic.address;\n this.managerLogic = mangerLogic;\n this.signer = signer;\n this.utils = utils;\n this.factory = factory;\n }\n\n /**\n * Return the assets with balances and deposit info of a pool\n * @returns {Promise<FundComposition[]>} Composition of assets with balance, deposit info\n */\n async getComposition(): Promise<FundComposition[]> {\n const result = await this.managerLogic.getFundComposition();\n\n const fundComposition: FundComposition[] = result[0].map(\n (item: AssetEnabled, index: string | number) => {\n const { asset, isDeposit } = item;\n return {\n asset: asset,\n isDeposit: isDeposit,\n balance: result[1][index],\n rate: result[2][index]\n };\n }\n );\n return fundComposition;\n }\n\n //Invest functions\n\n /**\n * Approve the asset that can be deposited into a pool\n * @param {string} nasset Address of deposit asset\n * @param {BigNumber | string} amount Amount to be approved\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async approveDeposit(\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iERC20 = new ethers.Contract(asset, IERC20.abi, this.signer);\n const tx = await iERC20.approve(this.address, amount, options);\n return tx;\n }\n\n /**\n * Deposit asset into a pool\n * @param {string} asset Address of asset\n * @param {BigNumber | string} amount Amount to be deposited\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async deposit(\n asset: string,\n amount: string | BigNumber,\n options: any = null\n ): Promise<any> {\n const tx = await this.poolLogic.deposit(asset, amount, options);\n return tx;\n }\n\n /**\n * Withdraw assets from a pool\n * @param fundTokenAmount Amount of pool tokens to be withdrawn\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async withdraw(\n fundTokenAmount: string | BigNumber,\n options: any = null\n ): Promise<any> {\n const tx = await this.poolLogic.withdraw(fundTokenAmount, options);\n return tx;\n }\n\n //Manager functions\n\n /**\n * Approve the asset for trading and providing liquidity\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} asset Address of asset\n * @param @param {BigNumber | string} Amount to be approved\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async approve(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iERC20 = new ethers.utils.Interface(IERC20.abi);\n const approveTxData = iERC20.encodeFunctionData(\"approve\", [\n routerAddress[this.network][dapp],\n amount\n ]);\n const tx = await this.poolLogic.execTransaction(\n asset,\n approveTxData,\n options\n );\n return tx;\n }\n\n /**\n * Approve the liquidity pool token for staking\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} asset Address of liquidity pool token\n * @param {BigNumber | string} amount Aamount to be approved\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async approveStaking(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iERC20 = new ethers.utils.Interface(IERC20.abi);\n const approveTxData = iERC20.encodeFunctionData(\"approve\", [\n stakingAddress[this.network][dapp],\n amount\n ]);\n const tx = await this.poolLogic.execTransaction(\n asset,\n approveTxData,\n options\n );\n return tx;\n }\n\n /**\n * Approve the liquidity pool token for staking\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} asset Address of liquidity pool token\n * @param {BigNumber | string} amount Aamount to be approved\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async approveUniswapV3Liquidity(\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iERC20 = new ethers.utils.Interface(IERC20.abi);\n const approveTxData = iERC20.encodeFunctionData(\"approve\", [\n nonfungiblePositionManagerAddress[this.network],\n amount\n ]);\n const tx = await this.poolLogic.execTransaction(\n asset,\n approveTxData,\n options\n );\n return tx;\n }\n\n /**\n * Approve the asset for provided spender address\n * @param {string} spender Spender address\n * @param {string} asset Address of asset\n * @param {BigNumber | string} amount to be approved\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async approveSpender(\n spender: string,\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iERC20 = new ethers.utils.Interface(IERC20.abi);\n const approveTxData = iERC20.encodeFunctionData(\"approve\", [\n spender,\n amount\n ]);\n const tx = await this.poolLogic.execTransaction(\n asset,\n approveTxData,\n options\n );\n return tx;\n }\n\n /**\n * Trade an asset into another asset\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} assetFrom Asset to trade from\n * @param {string} assetTo Asset to trade into\n * @param {BigNumber | string} amountIn Amount\n * @param {number} slippage Slippage tolerance in %\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async trade(\n dapp: Dapp,\n assetFrom: string,\n assetTo: string,\n amountIn: BigNumber | string,\n slippage = 0.5,\n options: any = null\n ): Promise<any> {\n let swapTxData: string;\n if (dapp === Dapp.ONEINCH) {\n const chainId = networkChainIdMap[this.network];\n const apiUrl = `https://api.1inch.exchange/v4.0/${chainId}/swap?fromTokenAddress=${assetFrom}&toTokenAddress=${assetTo}&amount=${amountIn.toString()}&fromAddress=${\n this.address\n }&destReceiver=${\n this.address\n }&slippage=${slippage.toString()}&disableEstimate=true`;\n const response = await axios.get(apiUrl);\n swapTxData = response.data.tx.data;\n } else if (dapp === Dapp.BALANCER) {\n swapTxData = await this.utils.getBalancerSwapTx(\n this,\n assetFrom,\n assetTo,\n amountIn,\n slippage\n );\n } else if (dapp === Dapp.SYNTHETIX) {\n const iSynthetix = new ethers.utils.Interface(ISynthetix.abi);\n const assets = [assetFrom, assetTo].map(asset =>\n ethers.utils.formatBytes32String(asset)\n );\n const daoAddress = await this.factory.owner();\n swapTxData = iSynthetix.encodeFunctionData(Transaction.SWAP_SYNTHS, [\n assets[0],\n amountIn,\n assets[1],\n daoAddress,\n SYNTHETIX_TRACKING_CODE\n ]);\n } else {\n const iUniswapV2Router = new ethers.utils.Interface(IUniswapV2Router.abi);\n const minAmountOut = await this.utils.getMinAmountOut(\n dapp,\n assetFrom,\n assetTo,\n amountIn,\n slippage\n );\n swapTxData = iUniswapV2Router.encodeFunctionData(Transaction.SWAP, [\n amountIn,\n minAmountOut,\n [assetFrom, assetTo],\n this.address,\n deadline\n ]);\n }\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][dapp],\n swapTxData,\n options\n );\n return tx;\n }\n\n /**\n * Add liquidity to a liquidity pool\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} assetA First asset\n * @param {string} assetB Second asset\n * @param {BigNumber | string} amountA Amount first asset\n * @param {BigNumber | string} amountB Amount second asset\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async addLiquidity(\n dapp: Dapp,\n assetA: string,\n assetB: string,\n amountA: BigNumber | string,\n amountB: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iUniswapV2Router = new ethers.utils.Interface(IUniswapV2Router.abi);\n const addLiquidityTxData = iUniswapV2Router.encodeFunctionData(\n Transaction.ADD_LIQUIDITY,\n [assetA, assetB, amountA, amountB, 0, 0, this.address, deadline]\n );\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][dapp],\n addLiquidityTxData,\n options\n );\n return tx;\n }\n\n /**\n * Remove liquidity from a liquidity pool\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} assetA First asset\n * @param {string} assetB Second asset\n * @param {BigNumber | string} amount Amount of liquidity pool tokens\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async removeLiquidity(\n dapp: Dapp,\n assetA: string,\n assetB: string,\n amount: string | BigNumber,\n options: any = null\n ): Promise<any> {\n const iUniswapV2Router = new ethers.utils.Interface(IUniswapV2Router.abi);\n const removeLiquidityTxData = iUniswapV2Router.encodeFunctionData(\n Transaction.REMOVE_LIQUIDITY,\n [assetA, assetB, amount, 0, 0, this.address, deadline]\n );\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][dapp],\n removeLiquidityTxData,\n options\n );\n return tx;\n }\n\n /**\n * Stake liquidity pool tokens in a yield farm\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} asset Liquidity pool token\n * @param {BigNumber | string} amount Amount of liquidity pool tokens\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async stake(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iMiniChefV2 = new ethers.utils.Interface(IMiniChefV2.abi);\n const poolId = await this.utils.getLpPoolId(dapp, asset);\n const stakeTxData = iMiniChefV2.encodeFunctionData(Transaction.DEPOSIT, [\n poolId,\n amount,\n this.address\n ]);\n const tx = await this.poolLogic.execTransaction(\n stakingAddress[this.network][dapp],\n stakeTxData,\n options\n );\n return tx;\n }\n\n /**\n * Stake liquidity pool tokens in gauge contract\n * @param {string} gauge Gauge contract address\n * @param {BigNumber | string} amount Amount of liquidity pool tokens\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async stakeInGauge(\n gauge: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const rewardsGauge = new ethers.utils.Interface(IBalancerRewardsGauge.abi);\n const stakeTxData = rewardsGauge.encodeFunctionData(\"deposit(uint256)\", [\n amount\n ]);\n const tx = await this.poolLogic.execTransaction(\n gauge,\n stakeTxData,\n options\n );\n return tx;\n }\n\n /**\n * Unstake liquidity pool tokens from a yield farm\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} asset Liquidity pool token\n * @param {BigNumber | string} amount Amount of liquidity pool tokens\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async unStake(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iMiniChefV2 = new ethers.utils.Interface(IMiniChefV2.abi);\n const poolId = await this.utils.getLpPoolId(dapp, asset);\n const unStakeTxData = iMiniChefV2.encodeFunctionData(Transaction.WITHDRAW, [\n poolId,\n amount,\n this.address\n ]);\n const tx = await this.poolLogic.execTransaction(\n stakingAddress[this.network][dapp],\n unStakeTxData,\n options\n );\n return tx;\n }\n\n /**\n * Unstake liquidity pool tokens from gauge contract\n * @param {string} gauge Gauge contract address\n * @param {BigNumber | string} amount Amount of liquidity pool tokens\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async unstakeFromGauge(\n gauge: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const rewardsGauge = new ethers.utils.Interface(IBalancerRewardsGauge.abi);\n const unstakeTxData = rewardsGauge.encodeFunctionData(\"withdraw(uint256)\", [\n amount\n ]);\n const tx = await this.poolLogic.execTransaction(\n gauge,\n unstakeTxData,\n options\n );\n return tx;\n }\n\n /**\n * Lend asset to a lending pool\n * @param {Dapp} dapp Platform like Aave\n * @param {string} asset Asset\n * @param {BigNumber | string} amount Amount of asset to lend\n * @param {number} referralCode Code from Aave referral program\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async lend(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n referralCode = 0,\n options: any = null\n ): Promise<any> {\n const iLendingPool = new ethers.utils.Interface(ILendingPool.abi);\n const depositTxData = iLendingPool.encodeFunctionData(Transaction.DEPOSIT, [\n asset,\n amount,\n this.address,\n referralCode\n ]);\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][dapp],\n depositTxData,\n options\n );\n return tx;\n }\n\n /**\n * Witdraw asset from a lending pool\n * @param {Dapp} dapp Platform like Aave\n * @param {string} asset Asset\n * @param {BigNumber | string} amount Amount of asset to lend\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async withdrawDeposit(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iLendingPool = new ethers.utils.Interface(ILendingPool.abi);\n const withdrawTxData = iLendingPool.encodeFunctionData(\n Transaction.WITHDRAW,\n [asset, amount, this.address]\n );\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][dapp],\n withdrawTxData,\n options\n );\n return tx;\n }\n\n /**\n * Borrow asset from a lending pool\n * @param {Dapp} dapp Platform like Aave\n * @param {string} asset Asset\n * @param {BigNumber | string} amount Amount of asset to lend\n * @param {number} referralCode Code from Aave referral program\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async borrow(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n referralCode = 0,\n options: any = null\n ): Promise<any> {\n const iLendingPool = new ethers.utils.Interface(ILendingPool.abi);\n const borrowTxData = iLendingPool.encodeFunctionData(Transaction.BORROW, [\n asset,\n amount,\n 2,\n referralCode,\n this.address\n ]);\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][dapp],\n borrowTxData,\n options\n );\n return tx;\n }\n\n /**\n * Repays borrowed asset to a lending pool\n * @param {Dapp} dapp Platform like Aave\n * @param {string} asset Asset\n * @param {BigNumber | string} amount Amount of asset to lend\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async repay(\n dapp: Dapp,\n asset: string,\n amount: BigNumber | string,\n options: any = null\n ): Promise<any> {\n const iLendingPool = new ethers.utils.Interface(ILendingPool.abi);\n const repayTxData = iLendingPool.encodeFunctionData(Transaction.REPAY, [\n asset,\n amount,\n 2,\n this.address\n ]);\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][dapp],\n repayTxData,\n options\n );\n return tx;\n }\n\n /**\n * Claim rewards of staked liquidity pool tokens\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} asset Liquidity pool token\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async harvestRewards(\n dapp: Dapp,\n asset: string,\n options: any = null\n ): Promise<any> {\n const iMiniChefV2 = new ethers.utils.Interface(IMiniChefV2.abi);\n const poolId = await this.utils.getLpPoolId(dapp, asset);\n const harvestTxData = iMiniChefV2.encodeFunctionData(Transaction.HARVEST, [\n poolId,\n this.address\n ]);\n const tx = await this.poolLogic.execTransaction(\n stakingAddress[this.network][dapp],\n harvestTxData,\n options\n );\n return tx;\n }\n\n /**\n * Change enabled pool assets\n * @param {AssetEnabled[]} assets New pool assets\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n public async changeAssets(\n assets: AssetEnabled[],\n options: any = null\n ): Promise<any> {\n const currentAssetsEnabled = await this.getComposition();\n const currentAssets = currentAssetsEnabled.map(e =>\n e.asset.toLocaleLowerCase()\n );\n const newAssets = assets.map(e => e.asset.toLocaleLowerCase());\n const removedAssets = currentAssets.filter(e => !newAssets.includes(e));\n const changedAssets = assets.map(e => [e.asset, e.isDeposit]);\n const tx = await this.managerLogic.changeAssets(\n changedAssets,\n removedAssets,\n options\n );\n return tx;\n }\n\n /**\n * Set a new trader with trading permissions\n * @param {string} trader Address trader account\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async setTrader(trader: string, options: any = null): Promise<any> {\n const tx = await this.managerLogic.setTrader(trader, options);\n return tx;\n }\n\n /**\n * Invest into a Balancer pool\n * @param {string} poolId Balancer pool id\n * @param {string[] | } assetsIn Array of balancer pool assets\n * @param {BigNumber[] | string[]} amountsIn Array of maximum amounts to provide to pool\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async joinBalancerPool(\n poolId: string,\n assets: string[],\n amountsIn: string[] | BigNumber[],\n options: any = null\n ): Promise<any> {\n const joinPoolTxData = this.utils.getBalancerJoinPoolTx(\n this,\n poolId,\n assets,\n amountsIn\n );\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][Dapp.BALANCER],\n joinPoolTxData,\n options\n );\n return tx;\n }\n\n /**\n * Invest into a Balancer pool\n * @param {string} poolId Balancer pool id\n * @param {string[] | } assets Array of balancer pool assets\n * @param {BigNumber | string } amount Amount of pool tokens to withdraw\n * @param { null | number } singleExitAssetIndex Index of asset to withdraw to\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async exitBalancerPool(\n poolId: string,\n assets: string[],\n amount: string | BigNumber,\n singleExitAssetIndex: number | null = null,\n options: any = null\n ): Promise<any> {\n const exitPoolTxData = this.utils.getBalancerExitPoolTx(\n this,\n poolId,\n assets,\n singleExitAssetIndex,\n amount\n );\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][Dapp.BALANCER],\n exitPoolTxData,\n options\n );\n return tx;\n }\n\n /**\n * Claim rewards from Balancer pools\n * @param {string[]} assets Array of tokens being claimed\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async harvestBalancerRewards(options: any = null): Promise<any> {\n const claimService = new ClaimService(this.network, this.signer);\n const multiTokenPendingClaims = await claimService.getMultiTokensPendingClaims(\n this.address\n );\n const tokens = multiTokenPendingClaims.map(\n tokenPendingClaims => tokenPendingClaims.tokenClaimInfo.token\n );\n const claims = await claimService.multiTokenClaimRewards(\n this.address,\n multiTokenPendingClaims\n );\n const iBalancerMerkleOrchard = new ethers.utils.Interface(\n IBalancerMerkleOrchard.abi\n );\n const harvestTxData = iBalancerMerkleOrchard.encodeFunctionData(\n Transaction.CLAIM_DISTRIBIUTIONS,\n [this.address, claims, tokens]\n );\n const tx = await this.poolLogic.execTransaction(\n stakingAddress[this.network][Dapp.BALANCER],\n harvestTxData,\n options\n );\n return tx;\n }\n\n /**\n * Claim rewards from Aave platform\n * @param {string[]} assets Aave tokens (deposit/debt) hold by pool\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async harvestAaveRewards(\n assets: string[],\n options: any = null\n ): Promise<any> {\n const aaveIncentivesAddress = stakingAddress[this.network][\n Dapp.AAVE\n ] as string;\n const iAaveIncentivesController = new ethers.utils.Interface(\n IAaveIncentivesController.abi\n );\n const aaveIncentivesController = new ethers.Contract(\n aaveIncentivesAddress,\n iAaveIncentivesController,\n this.signer\n );\n const amount = await aaveIncentivesController.getUserUnclaimedRewards(\n this.address\n );\n const claimTxData = iAaveIncentivesController.encodeFunctionData(\n Transaction.CLAIM_REWARDS,\n [assets, amount, this.address]\n );\n const tx = await this.poolLogic.execTransaction(\n aaveIncentivesAddress,\n claimTxData,\n options\n );\n return tx;\n }\n\n /**\n * Create UniswapV3 liquidity pool\n * @param {string} assetA First asset\n * @param {string} assetB Second asset\n * @param {BigNumber | string} amountA Amount first asset\n * @param {BigNumber | string} amountB Amount second asset\n * @param { number } minPrice Lower price range (assetB per assetA)\n * @param { number } maxPrice Upper price range (assetB per assetA)\n * @param { number } minTick Lower tick range\n * @param { number } maxTick Upper tick range\n * @param { FeeAmount } feeAmount Fee tier (Low 0.05%, Medium 0.3%, High 1%)\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async addLiquidityUniswapV3(\n assetA: string,\n assetB: string,\n amountA: BigNumber | string,\n amountB: BigNumber | string,\n minPrice: number | null,\n maxPrice: number | null,\n minTick: number | null,\n maxTick: number | null,\n feeAmount: FeeAmount,\n options: any = null\n ): Promise<any> {\n if ((!minPrice || !maxPrice) && (!minTick || !maxTick))\n throw new Error(\"Need to provide price or tick range\");\n\n const iNonfungiblePositionManager = new ethers.utils.Interface(\n INonfungiblePositionManager.abi\n );\n\n const mintTxParams = await getUniswapV3MintParams(\n this,\n assetA,\n assetB,\n amountA,\n amountB,\n minPrice,\n maxPrice,\n minTick,\n maxTick,\n feeAmount\n );\n const mintTxData = iNonfungiblePositionManager.encodeFunctionData(\n Transaction.MINT,\n [mintTxParams]\n );\n const tx = await this.poolLogic.execTransaction(\n nonfungiblePositionManagerAddress[this.network],\n mintTxData,\n options\n );\n return tx;\n }\n\n /**\n * Remove liquidity from an UniswapV3 or Arrakis liquidity pool\n * @param {Dapp} dapp Platform either UniswapV3 or Arrakis\n * @param {string} tokenId Token Id of UniswapV3 position\n * @param {number} amount Amount in percent of assets to be removed\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async decreaseLiquidity(\n dapp: Dapp,\n tokenId: string,\n amount = 100,\n options: any = null\n ): Promise<any> {\n let txData;\n let dappAddress;\n if (dapp === Dapp.UNISWAPV3) {\n dappAddress = nonfungiblePositionManagerAddress[this.network];\n const abi = new ethers.utils.Interface(INonfungiblePositionManager.abi);\n const liquidity = (await getUniswapV3Liquidity(tokenId, this))\n .mul(amount)\n .div(100);\n const decreaseLiquidityTxData = abi.encodeFunctionData(\n Transaction.DECREASE_LIQUIDITY,\n [[tokenId, liquidity, 0, 0, deadline]]\n );\n const collectTxData = abi.encodeFunctionData(Transaction.COLLECT, [\n [tokenId, this.address, MaxUint128, MaxUint128]\n ]);\n\n const multicallParams = [decreaseLiquidityTxData, collectTxData];\n\n if (amount === 100) {\n const burnTxData = abi.encodeFunctionData(Transaction.BURN, [tokenId]);\n multicallParams.push(burnTxData);\n }\n txData = abi.encodeFunctionData(Transaction.MULTI_CALL, [\n multicallParams\n ]);\n } else if (dapp === Dapp.ARRAKIS) {\n dappAddress = routerAddress[this.network][dapp];\n const abi = new ethers.utils.Interface(IArrakisV1RouterStaking.abi);\n const liquidity = (await this.utils.getBalance(tokenId, this.address))\n .mul(amount)\n .div(100);\n txData = abi.encodeFunctionData(Transaction.REMOVE_LIQUIDITY_UNSTAKE, [\n tokenId,\n liquidity,\n 0,\n 0,\n this.address\n ]);\n } else {\n throw new Error(\"dapp not supported\");\n }\n\n const tx = await this.poolLogic.execTransaction(\n dappAddress,\n txData,\n options\n );\n return tx;\n }\n\n /**\n * Increase liquidity of an UniswapV3 or Arrakis liquidity pool\n * @param {Dapp} dapp Platform either UniswapV3 or Arrakis\n * @param {string} tokenId Token Id of UniswapV3 position\n * @param {BigNumber | string} amountA Amount first asset\n * @param {BigNumber | string} amountB Amount second asset\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async increaseLiquidity(\n dapp: Dapp,\n tokenId: string,\n amountA: BigNumber | string,\n amountB: BigNumber | string,\n options: any = null\n ): Promise<any> {\n let txData;\n let dappAddress;\n if (dapp === Dapp.UNISWAPV3) {\n dappAddress = nonfungiblePositionManagerAddress[this.network];\n const abi = new ethers.utils.Interface(INonfungiblePositionManager.abi);\n txData = abi.encodeFunctionData(Transaction.INCREASE_LIQUIDITY, [\n [tokenId, amountA, amountB, 0, 0, deadline]\n ]);\n } else if (dapp === Dapp.ARRAKIS) {\n dappAddress = routerAddress[this.network][dapp];\n const abi = new ethers.utils.Interface(IArrakisV1RouterStaking.abi);\n txData = abi.encodeFunctionData(Transaction.ADD_LIQUIDITY_STAKE, [\n tokenId,\n amountA,\n amountB,\n 0,\n 0,\n this.address\n ]);\n } else {\n throw new Error(\"dapp not supported\");\n }\n\n const tx = await this.poolLogic.execTransaction(\n dappAddress,\n txData,\n options\n );\n return tx;\n }\n\n /**\n * Claim fees of an UniswapV3 liquidity or Arrakis pool\n * @param {Dapp} dapp Platform either UniswapV3 or Arrakis\n * @param {string} tokenId Token Id of UniswapV3 or Gauge address\n * @param {any} options Transaction option\n * @returns {Promise<any>} Transaction\n */\n async claimFees(\n dapp: Dapp,\n tokenId: string,\n options: any = null\n ): Promise<any> {\n let txData;\n let contractAddress;\n if (dapp === Dapp.UNISWAPV3) {\n contractAddress = nonfungiblePositionManagerAddress[this.network];\n const iNonfungiblePositionManager = new ethers.utils.Interface(\n INonfungiblePositionManager.abi\n );\n txData = iNonfungiblePositionManager.encodeFunctionData(\n Transaction.COLLECT,\n [[tokenId, this.address, MaxUint128, MaxUint128]]\n );\n } else if (dapp === Dapp.ARRAKIS || dapp === Dapp.BALANCER) {\n contractAddress = tokenId;\n const abi = new ethers.utils.Interface(ILiquidityGaugeV4.abi);\n txData = abi.encodeFunctionData(\"claim_rewards()\", []);\n } else {\n throw new Error(\"dapp not supported\");\n }\n const tx = await this.poolLogic.execTransaction(\n contractAddress,\n txData,\n options\n );\n return tx;\n }\n\n /**\n * Trade an asset into another asset\n * @param {Dapp} dapp Platform like Sushiswap or Uniswap\n * @param {string} assetFrom Asset to trade from\n * @param {string} assetTo Asset to trade into\n * @param {BigNumber | string} amountIn Amount\n * @param { FeeAmount } feeAmount Fee tier (Low 0.05%, Medium 0.3%, High 1%)\n * @param {number} slippage Slippage tolerance in %\n * @param {any} options Transaction options\n * @returns {Promise<any>} Transaction\n */\n async tradeUniswapV3(\n assetFrom: string,\n assetTo: string,\n amountIn: BigNumber | string,\n feeAmount: FeeAmount,\n slippage = 0.5,\n options: any = null\n ): Promise<any> {\n const swapxData = await getUniswapV3SwapTxData(\n this,\n assetFrom,\n assetTo,\n amountIn,\n slippage,\n feeAmount\n );\n const tx = await this.poolLogic.execTransaction(\n routerAddress[this.network][Dapp.UNISWAPV3],\n swapxData,\n options\n );\n return tx;\n }\n}\n","import { Contract, ethers, Wallet } from \"ethers\";\nimport {\n Token,\n TokenAmount,\n Pair,\n TradeType,\n Route,\n Trade,\n Percent\n} from \"@sushiswap/sdk\";\nimport { SOR, SwapTypes } from \"@balancer-labs/sor\";\nimport { BaseProvider } from \"@ethersproject/providers\";\n\nimport IERC20 from \"../abi/IERC20.json\";\nimport IMiniChefV2 from \"../abi/IMiniChefV2.json\";\nimport UniswapV2Factory from \"../abi/IUniswapV2Factory.json\";\nimport UniswapV2Pair from \"../abi/IUniswapV2Pair.json\";\nimport IBalancerV2Vault from \"../abi/IBalancertV2Vault.json\";\nimport {\n balancerSubgraph,\n dappFactoryAddress,\n networkChainIdMap,\n stakingAddress\n} from \"../config\";\nimport { Dapp, Network, Reserves } from \"../types\";\nimport { Pool } from \".\";\n\nexport class Utils {\n network: Network;\n signer: Wallet;\n\n public constructor(network: Network, signer: Wallet) {\n this.network = network;\n this.signer = signer;\n }\n\n /**\n * Return the reserves of the two assets of a liquidity pool\n * This is the price of one token in the other\n * @param {Dapp} dApp DApp like Uniswap or Sushiswap\n * @param {string} tokenA First token of the pool pair\n * @param {string} tokenB Second token of the pool pair\n * @returns {Promise<Reserves>} Reserves of the assets in BigNumber\n * @throws If the dapp is not supported on the network\n */\n async getLpReserves(\n dapp: Dapp,\n assetA: string,\n assetB: string\n ): Promise<Reserves> {\n if (dappFactoryAddress[this.network][dapp]) {\n const uniswapV2Factory = new Contract(\n dappFactoryAddress[this.network][dapp] as string,\n UniswapV2Factory.abi,\n this.signer\n );\n\n const uniswapV2PairAddress = await uniswapV2Factory.getPair(\n assetA,\n assetB\n );\n\n const uniswapV2Pair = new Contract(\n uniswapV2PairAddress,\n UniswapV2Pair.abi,\n this.signer\n );\n\n const result = await uniswapV2Pair.getReserves();\n const [reserve0, reserve1] = result;\n return assetA.toLowerCase() < assetB.toLowerCase()\n ? { assetA: reserve0, assetB: reserve1 }\n : { assetA: reserve1, assetB: reserve0 };\n } else {\n throw new Error(\"Dapp not supported on this network\");\n }\n }\n\n /**\n * Returns the pool id of a liquidity pool\n * @param {Dapp} dApp DApp like uniswap or sushiswap\n * @param {string} lpPoolAddress token address of the pool pair\n * @returns {number} Pool Id\n * @throws if the dapp is not supported on the network\n */\n\n async getLpPoolId(dapp: Dapp, poolAsset: string): Promise<number> {\n if (stakingAddress[this.network][dapp]) {\n const masterChefV2 = new Contract(\n stakingAddress[this.network][dapp] as string,\n IMiniChefV2.abi,\n this.signer\n );\n\n const poolLength = await masterChefV2.poolLength();\n const idArray = Array.from(\n { length: poolLength.toNumber() },\n (_, v) => v\n );\n const lpPoolAddresses = await Promise.all(\n idArray.map(e => masterChefV2.lpToken(e))\n );\n const poolId = lpPoolAddresses\n .map(e => e.toLowerCase())\n .indexOf(poolAsset.toLocaleLowerCase());\n if (poolId === -1) {\n throw new Error(\"Staking not supported for asset\");\n }\n return poolId;\n } else {\n throw new Error(\"Dapp not supported on this network\");\n }\n }\n\n /**\n * Returns the balance of an asset (ERC20) token\n * @param {string} asset string token address\n * @param {string} owner address of the owner\n * @returns { BigNumber } Balance of asset\n */\n\n async getBalance(asset: string, owner: string): Promise<ethers.BigNumber> {\n const iERC20 = new ethers.Contract(asset, IERC20.abi, this.signer);\n const balance = await iERC20.balanceOf(owner);\n return balance;\n }\n\n /**\n * Returns the decimals of an asset (ERC20) token\n * @param {string} asset string token address\n * @returns { number } Balance of asset\n */\n\n async getDecimals(asset: string): Promise<number> {\n const iERC20 = new ethers.Contract(asset, IERC20.abi, this.signer);\n const decimals = await iERC20.decimals();\n return decimals;\n }\n\n /**\n * Return the minimum amount out for a trade between two assets\n * given the trade amount and slippage\n * @param {Dapp} dApp DApp like Uniswap or Sushiswap\n * @param {string} assetFrom Asset to trade from\n * @param {string} assetTo Asset to trade into\n * @param {string | ethers.BigNumber} amountIn Trade amount\n * @param { number} slippage Maximum slippage allowed\n * @returns {Promise<ethers.BigNumber>} Reserves of the assets in BigNumber\n */\n async getMinAmountOut(\n dapp: Dapp,\n assetFrom: string,\n assetTo: string,\n amountIn: string | ethers.BigNumber,\n slippage: number\n ): Promise<ethers.BigNumber> {\n const assetFromChecked = ethers.utils.getAddress(assetFrom);\n const assetToChecked = ethers.utils.getAddress(assetTo);\n const reserves = await this.getLpReserves(\n dapp,\n assetFromChecked,\n assetToChecked\n );\n const tokenA = new Token(\n networkChainIdMap[this.network],\n assetFromChecked,\n 18\n );\n const tokenB = new Token(\n networkChainIdMap[this.network],\n assetToChecked,\n 18\n );\n const pair = new Pair(\n new TokenAmount(tokenA, reserves.assetA.toString()),\n new TokenAmount(tokenB, reserves.assetB.toString())\n );\n const route = new Route([pair], tokenA, tokenB);\n\n const trade = new Trade(\n route,\n new TokenAmount(tokenA, amountIn.toString()),\n TradeType.EXACT_INPUT\n );\n return ethers.BigNumber.from(\n trade\n .minimumAmountOut(new Percent((slippage * 100).toFixed(), \"10000\"))\n .raw.toString()\n );\n }\n\n async getBalancerSwapTx(\n pool: Pool,\n assetFrom: string,\n assetTo: string,\n amountIn: ethers.BigNumber | string,\n slippage: number\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n const sor = new SOR(\n this.signer.provider as BaseProvider,\n networkChainIdMap[this.network],\n balancerSubgraph[this.network]\n );\n // isFetched will be true on success\n const isFetched = await sor.fetchPools();\n\n if (!isFetched) throw new Error(\"Error fetching balancer pools\");\n\n const swapType = SwapTypes.SwapExactIn;\n const { swaps, tokenAddresses, returnAmount } = await sor.getSwaps(\n assetFrom,\n assetTo,\n swapType,\n ethers.BigNumber.from(amountIn)\n );\n\n const minimumAmountOut = returnAmount\n .mul(10000 - slippage * 100)\n .div(10000);\n\n const iBalancerV2Vault = new ethers.utils.Interface(IBalancerV2Vault.abi);\n\n if (swaps.length === 1) {\n const swap = swaps[0];\n //do single swap\n const swapTx = iBalancerV2Vault.encodeFunctionData(\"swap\", [\n [\n swap.poolId,\n SwapTypes.SwapExactIn,\n tokenAddresses[swap.assetInIndex],\n tokenAddresses[swap.assetOutIndex],\n swap.amount,\n swap.userData\n ],\n [pool.address, false, pool.address, false],\n minimumAmountOut,\n Math.floor(Date.now() / 1000) + 60 * 20 // 20 minutes from the current Unix time\n ]);\n return swapTx;\n } else {\n // Limits:\n // +ve means max to send\n // -ve mean min to receive\n // For a multihop the intermediate tokens should be 0\n const limits: string[] = [];\n tokenAddresses.forEach((token, i) => {\n if (token.toLowerCase() === assetFrom.toLowerCase()) {\n limits[i] = amountIn.toString();\n } else if (token.toLowerCase() === assetTo.toLowerCase()) {\n limits[i] = minimumAmountOut.mul(-1).toString();\n } else {\n limits[i] = \"0\";\n }\n });\n const swapTx = iBalancerV2Vault.encodeFunctionData(\"batchSwap\", [\n SwapTypes.SwapExactIn,\n swaps,\n tokenAddresses,\n [pool.address, false, pool.address, false],\n limits,\n Math.floor(Date.now() / 1000) + 60 * 20 // 20 minutes from the current Unix time\n ]);\n return swapTx;\n }\n }\n\n async getBalancerJoinPoolTx(\n pool: Pool,\n balancerPoolId: string,\n assets: string[],\n amountsIn: string[] | ethers.BigNumber[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n const iBalancerV2Vault = new ethers.utils.Interface(IBalancerV2Vault.abi);\n const txData = [\n balancerPoolId,\n pool.address,\n pool.address,\n [\n assets,\n amountsIn,\n ethers.utils.defaultAbiCoder.encode(\n [\"uint256\", \"uint256[]\", \"uint256\"],\n [1, amountsIn, 0]\n ),\n false\n ]\n ];\n const joinPoolTx = iBalancerV2Vault.encodeFunctionData(\"joinPool\", txData);\n return joinPoolTx;\n }\n\n async getBalancerExitPoolTx(\n pool: Pool,\n balancerPoolId: string,\n assets: string[],\n singleExitAssetIndex: null | number,\n amount: string | ethers.BigNumber\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n const minimumAmountOut = new Array(assets.length).fill(0);\n const iBalancerV2Vault = new ethers.utils.Interface(IBalancerV2Vault.abi);\n const userTxData =\n singleExitAssetIndex === null\n ? ethers.utils.defaultAbiCoder.encode(\n [\"uint256\", \"uint256\"],\n [1, amount]\n )\n : ethers.utils.defaultAbiCoder.encode(\n [\"uint256\", \"uint256\", \"uint256\"],\n [0, amount, singleExitAssetIndex]\n );\n\n const txData = [\n balancerPoolId,\n pool.address,\n pool.address,\n [assets, minimumAmountOut, userTxData, false]\n ];\n const exitPoolTx = iBalancerV2Vault.encodeFunctionData(\"exitPool\", txData);\n return exitPoolTx;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Contract, Wallet } from \"ethers\";\n\nimport PoolFactory from \"../abi/PoolFactory.json\";\nimport PoolLogic from \"../abi/PoolLogic.json\";\nimport ManagerLogic from \"../abi/PoolManagerLogic.json\";\nimport { factoryAddress } from \"../config\";\nimport { Network, SupportedAsset } from \"../types\";\n\nimport { Pool } from \"./pool\";\nimport { Utils } from \"./utils\";\n\nexport class Dhedge {\n public network: Network;\n public signer: Wallet;\n public factory: Contract;\n public utils: Utils;\n public constructor(wallet: Wallet, network: Network) {\n this.network = network;\n this.signer = wallet;\n this.factory = new Contract(\n factoryAddress[network],\n PoolFactory.abi,\n this.signer\n );\n\n this.utils = new Utils(this.network, this.signer);\n }\n\n /**\n * Create a new pool.\n *\n * @param {string} managerName Name of manager\n * @param {string} poolName Pool name\n * @param {string} symbol Token symbol\n * @param {tuple[]} supportedAssets Enabled assets to trade\n * @param {number|BigNumber} managerFeeNumerator Manger fee in percent\n * @param {any} options Transaction options\n * @returns {Pool} Created Pool\n */\n public async createPool(\n managerName: string,\n poolName: string,\n symbol: string,\n supportedAssets: SupportedAsset[],\n managerFeeNumerator = 20,\n options: any = null\n ): Promise<Pool> {\n const pool = await this.factory.createFund(\n false,\n this.signer.getAddress(),\n managerName,\n poolName,\n symbol,\n managerFeeNumerator * 100,\n supportedAssets,\n options\n );\n const receipt = await pool.wait(1);\n\n const creationEvent = receipt.events.find(\n (item: { event: string }) => item.event === \"FundCreated\"\n );\n if (!creationEvent) throw new Error(\"Fund not created\");\n\n const poolAddress = creationEvent.args.fundAddress;\n const poolLogic = new Contract(poolAddress, PoolLogic.abi, this.signer);\n const managerLogicAddress = await poolLogic.poolManagerLogic();\n const managerLogic = new Contract(\n managerLogicAddress,\n ManagerLogic.abi,\n this.signer\n );\n\n return new Pool(\n this.network,\n this.signer,\n poolLogic,\n managerLogic,\n this.utils,\n this.factory\n );\n }\n\n /**\n * Load a pool based on the provided address\n * @param {string} address Pool address\n * @returns {Pool} Loaded Pool\n */\n public async loadPool(address: string): Promise<Pool> {\n const poolLogic = new Contract(address, PoolLogic.abi, this.signer);\n const managerLogicAddress = await poolLogic.poolManagerLogic();\n const managerLogic = new Contract(\n managerLogicAddress,\n ManagerLogic.abi,\n this.signer\n );\n\n return new Pool(\n this.network,\n this.signer,\n poolLogic,\n managerLogic,\n this.utils,\n this.factory\n );\n }\n}\n"],"names":["Network","Dapp","Transaction","runtime","exports","Op","Object","prototype","hasOwn","hasOwnProperty","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","obj","key","value","defineProperty","enumerable","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","generator","create","Generator","context","Context","_invoke","state","method","arg","Error","undefined","done","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","type","makeInvokeMethod","fn","call","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","this","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","AsyncIterator","PromiseImpl","previousPromise","callInvokeWithMethodAndArg","resolve","reject","invoke","result","__await","then","unwrapped","error","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","length","i","doneResult","displayName","isGeneratorFunction","genFun","ctor","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","iter","keys","object","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","module","regeneratorRuntime","accidentalStrictMode","globalThis","Function","require","config","factoryAddress","POLYGON","process","env","STAGING_CONTRACTS","OPTIMISM","routerAddress","SUSHISWAP","AAVE","AAVEV3","ONEINCH","QUICKSWAP","BALANCER","UNISWAPV3","ARRAKIS","SYNTHETIX","dappFactoryAddress","stakingAddress","nonfungiblePositionManagerAddress","networkChainIdMap","balancerSubgraph","multiCallAddress","deadline","Math","floor","Date","now","MaxUint128","multicall","network","provider","abi","calls","options","requireSuccess","multi","ethers","Contract","itf","Interface","tryAggregate","map","toLowerCase","encodeFunctionData","decodedResult","decodeFunctionResult","MerkleTree","elements","filter","el","Buffer","from","hexToBytes","sort","compare","bufDedup","layers","getLayers","getNextLayer","reduce","layer","idx","arr","_this","combinedHash","first","second","keccak256","sortAndConcat","getRoot","getHexRoot","bufferToHex","getProof","bufIndexOf","proof","pairElement","_this2","getPairElement","getHexProof","_el","bufArrToHexArr","pairIdx","hash","isBuffer","keccakFromString","equals","some","toString","args","concat","scale","input","decimalPlaces","unscaled","BigNumber","scalePow","scaleMul","pow","times","ipfsService","get","protocol","axios","data","ClaimService","signer","getMultiTokensPendingClaims","account","getTokenClaimsInfo","tokenClaimsInfo","all","tokenClaimInfo","getTokenPendingClaims","getAddress","multiTokenPendingClaimsWithRewards","pendingClaim","Number","availableToClaim","getSnapshot","manifest","snapshot","weekStart","getClaimStatus","pendingWeeks","status","getReports","reports","claims","entries","report","id","amount","claim","parseFloat","total","plus","multiTokenClaimRewards","multiTokenPendingClaims","tokenPendingClaims","tokenIndex","computeClaimProofs","flatten","console","log","payload","distributor","decimals","_this3","computeClaimProof","claimAmount","merkleTree","balances","address","balance","leaf","soliditySha3","t","v","loadTree","scaledBalance","parseInt","tokenClaims","tokenClaim","token","totalWeeks","claimStatusCalls","Array","_","_this4","rootCalls","merkleOrchardAbi","chunks","chunk","distributionRootResult","index","constants","HashZero","weeks","week","fromEntries","tryParseTick","baseToken","quoteToken","feeAmount","tick","price","split","whole","fraction","withoutDecimals","JSBI","BigInt","Price","multiply","tryParsePrice","sqrtRatioX96","encodeSqrtRatioX96","numerator","denominator","greaterThanOrEqual","TickMath","MAX_SQRT_RATIO","MAX_TICK","lessThanOrEqual","MIN_SQRT_RATIO","MIN_TICK","priceToClosestTick","nearestUsableTick","TICK_SPACINGS","getUniswapV3MintParams","pool","assetA","assetB","amountA","amountB","minPrice","maxPrice","minTick","maxTick","tickLower","tickUpper","chainId","asset","utils","getDecimals","tokenA","Token","tokenB","sortsBefore","token1","invertPrice","token0","amount0","amount1","getUniswapV3Liquidity","tokenId","iNonfungiblePositionManager","INonfungiblePositionManager","positions","liquidity","getUniswapV3SwapTxData","amountIn","slippage","quoterContract","IUniswapV3Quoter","callStatic","quoteExactInputSingle","minAmountOut","mul","div","iUniswapV3Router","IUniswapV3Router","swapTx","Pool","poolLogic","mangerLogic","factory","managerLogic","getComposition","getFundComposition","fundComposition","item","isDeposit","rate","approveDeposit","iERC20","IERC20","approve","deposit","withdraw","fundTokenAmount","dapp","approveTxData","execTransaction","approveStaking","approveUniswapV3Liquidity","approveSpender","spender","trade","assetFrom","assetTo","apiUrl","swapTxData","tx","getBalancerSwapTx","iSynthetix","ISynthetix","assets","formatBytes32String","owner","SWAP_SYNTHS","iUniswapV2Router","IUniswapV2Router","getMinAmountOut","SWAP","addLiquidity","addLiquidityTxData","ADD_LIQUIDITY","removeLiquidity","removeLiquidityTxData","REMOVE_LIQUIDITY","stake","iMiniChefV2","IMiniChefV2","getLpPoolId","stakeTxData","DEPOSIT","stakeInGauge","gauge","rewardsGauge","IBalancerRewardsGauge","unStake","unStakeTxData","WITHDRAW","unstakeFromGauge","unstakeTxData","lend","referralCode","iLendingPool","ILendingPool","depositTxData","withdrawDeposit","withdrawTxData","borrow","borrowTxData","BORROW","repay","repayTxData","REPAY","harvestRewards","harvestTxData","HARVEST","changeAssets","currentAssets","e","toLocaleLowerCase","newAssets","removedAssets","includes","changedAssets","setTrader","trader","joinBalancerPool","poolId","amountsIn","joinPoolTxData","getBalancerJoinPoolTx","exitBalancerPool","singleExitAssetIndex","exitPoolTxData","getBalancerExitPoolTx","harvestBalancerRewards","claimService","tokens","iBalancerMerkleOrchard","IBalancerMerkleOrchard","CLAIM_DISTRIBIUTIONS","harvestAaveRewards","aaveIncentivesAddress","iAaveIncentivesController","IAaveIncentivesController","aaveIncentivesController","getUserUnclaimedRewards","claimTxData","CLAIM_REWARDS","addLiquidityUniswapV3","mintTxData","MINT","decreaseLiquidity","dappAddress","decreaseLiquidityTxData","DECREASE_LIQUIDITY","collectTxData","COLLECT","multicallParams","burnTxData","BURN","txData","MULTI_CALL","IArrakisV1RouterStaking","getBalance","REMOVE_LIQUIDITY_UNSTAKE","increaseLiquidity","INCREASE_LIQUIDITY","ADD_LIQUIDITY_STAKE","claimFees","contractAddress","ILiquidityGaugeV4","tradeUniswapV3","swapxData","Utils","getLpReserves","uniswapV2Factory","UniswapV2Factory","getPair","uniswapV2Pair","UniswapV2Pair","getReserves","reserve0","reserve1","poolAsset","masterChefV2","poolLength","idArray","toNumber","lpToken","indexOf","balanceOf","assetFromChecked","assetToChecked","reserves","pair","Pair","TokenAmount","route","Route","Trade","TradeType","EXACT_INPUT","minimumAmountOut","Percent","toFixed","raw","sor","SOR","fetchPools","swapType","SwapTypes","SwapExactIn","getSwaps","swaps","tokenAddresses","returnAmount","iBalancerV2Vault","IBalancerV2Vault","swap","assetInIndex","assetOutIndex","userData","limits","balancerPoolId","defaultAbiCoder","encode","joinPoolTx","fill","userTxData","exitPoolTx","Dhedge","wallet","PoolFactory","createPool","managerName","poolName","symbol","supportedAssets","managerFeeNumerator","createFund","wait","creationEvent","events","find","event","fundAddress","PoolLogic","poolManagerLogic","ManagerLogic","loadPool"],"mappings":"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"}
|