@hypurrquant/defi-cli 0.2.5 → 0.3.1
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/config/protocols/dex/hybra.toml +91 -0
- package/config/protocols/dex/kittenswap.toml +21 -0
- package/config/protocols/dex/nest.toml +97 -0
- package/config/protocols/dex/ramses_cl.toml +56 -0
- package/config/protocols/dex/ramses_hl.toml +40 -0
- package/dist/index.js +3173 -683
- package/dist/index.js.map +1 -1
- package/dist/main.js +3160 -672
- package/dist/main.js.map +1 -1
- package/dist/mcp-server.js +2796 -581
- package/dist/mcp-server.js.map +1 -1
- package/package.json +1 -1
- package/config/protocols/dex/balancer.toml +0 -14
- package/config/protocols/dex/curve.toml +0 -12
- package/config/protocols/dex/hyperswap.toml +0 -14
- package/config/protocols/dex/hyperswap_v2.toml +0 -14
- package/config/protocols/dex/ring_few.toml +0 -14
- package/config/protocols/dex/woofi.toml +0 -12
- package/config/protocols/liquid_staking/kinetiq.toml +0 -12
- package/config/protocols/liquid_staking/sthype.toml +0 -13
package/dist/mcp-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/error.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/util.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/date.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/primitive.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/extract.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/struct.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/parse.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/stringify.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/index.js","../../defi-core/src/types.ts","../../defi-core/src/error.ts","../../defi-core/src/json.ts","../../defi-core/src/erc20.ts","../../defi-core/src/provider.ts","../../defi-core/src/multicall.ts","../../defi-core/src/registry/chain.ts","../../defi-core/src/registry/protocol.ts","../../defi-core/src/registry/registry.ts","../../defi-protocols/src/factory.ts","../../defi-protocols/src/dex/uniswap_v3.ts","../../defi-protocols/src/dex/uniswap_v2.ts","../../defi-protocols/src/dex/algebra_v3.ts","../../defi-protocols/src/dex/balancer_v3.ts","../../defi-protocols/src/dex/curve.ts","../../defi-protocols/src/dex/solidly.ts","../../defi-protocols/src/dex/woofi.ts","../../defi-protocols/src/dex/solidly_gauge.ts","../../defi-protocols/src/dex/masterchef.ts","../../defi-protocols/src/lending/aave_v3.ts","../../defi-protocols/src/lending/aave_v2.ts","../../defi-protocols/src/lending/aave_oracle.ts","../../defi-protocols/src/lending/compound_v2.ts","../../defi-protocols/src/lending/compound_v3.ts","../../defi-protocols/src/lending/euler_v2.ts","../../defi-protocols/src/lending/morpho.ts","../../defi-protocols/src/cdp/felix.ts","../../defi-protocols/src/cdp/felix_oracle.ts","../../defi-protocols/src/vault/erc4626.ts","../../defi-protocols/src/liquid_staking/generic_lst.ts","../../defi-protocols/src/liquid_staking/sthype.ts","../../defi-protocols/src/liquid_staking/kinetiq.ts","../../defi-protocols/src/yield_source/pendle.ts","../../defi-protocols/src/yield_source/generic_yield.ts","../../defi-protocols/src/derivatives/hlp.ts","../../defi-protocols/src/derivatives/generic_derivatives.ts","../../defi-protocols/src/options/rysk.ts","../../defi-protocols/src/options/generic_options.ts","../../defi-protocols/src/nft/erc721.ts","../../defi-protocols/src/dex/dex_price.ts","../src/mcp-server.ts","../src/executor.ts"],"sourcesContent":["/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nfunction getLineColFromPtr(string, ptr) {\n let lines = string.slice(0, ptr).split(/\\r\\n|\\n|\\r/g);\n return [lines.length, lines.pop().length + 1];\n}\nfunction makeCodeBlock(string, line, column) {\n let lines = string.split(/\\r\\n|\\n|\\r/g);\n let codeblock = '';\n let numberLen = (Math.log10(line + 1) | 0) + 1;\n for (let i = line - 1; i <= line + 1; i++) {\n let l = lines[i - 1];\n if (!l)\n continue;\n codeblock += i.toString().padEnd(numberLen, ' ');\n codeblock += ': ';\n codeblock += l;\n codeblock += '\\n';\n if (i === line) {\n codeblock += ' '.repeat(numberLen + column + 2);\n codeblock += '^\\n';\n }\n }\n return codeblock;\n}\nexport class TomlError extends Error {\n line;\n column;\n codeblock;\n constructor(message, options) {\n const [line, column] = getLineColFromPtr(options.toml, options.ptr);\n const codeblock = makeCodeBlock(options.toml, line, column);\n super(`Invalid TOML document: ${message}\\n\\n${codeblock}`, options);\n this.line = line;\n this.column = column;\n this.codeblock = codeblock;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { TomlError } from './error.js';\nfunction isEscaped(str, ptr) {\n let i = 0;\n while (str[ptr - ++i] === '\\\\')\n ;\n return --i && (i % 2);\n}\nexport function indexOfNewline(str, start = 0, end = str.length) {\n let idx = str.indexOf('\\n', start);\n if (str[idx - 1] === '\\r')\n idx--;\n return idx <= end ? idx : -1;\n}\nexport function skipComment(str, ptr) {\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '\\n')\n return i;\n if (c === '\\r' && str[i + 1] === '\\n')\n return i + 1;\n if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in comments', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n return str.length;\n}\nexport function skipVoid(str, ptr, banNewLines, banComments) {\n let c;\n while ((c = str[ptr]) === ' ' || c === '\\t' || (!banNewLines && (c === '\\n' || c === '\\r' && str[ptr + 1] === '\\n')))\n ptr++;\n return banComments || c !== '#'\n ? ptr\n : skipVoid(str, skipComment(str, ptr), banNewLines);\n}\nexport function skipUntil(str, ptr, sep, end, banNewLines = false) {\n if (!end) {\n ptr = indexOfNewline(str, ptr);\n return ptr < 0 ? str.length : ptr;\n }\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '#') {\n i = indexOfNewline(str, i);\n }\n else if (c === sep) {\n return i + 1;\n }\n else if (c === end || (banNewLines && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n')))) {\n return i;\n }\n }\n throw new TomlError('cannot find end of structure', {\n toml: str,\n ptr: ptr\n });\n}\nexport function getStringEnd(str, seek) {\n let first = str[seek];\n let target = first === str[seek + 1] && str[seek + 1] === str[seek + 2]\n ? str.slice(seek, seek + 3)\n : first;\n seek += target.length - 1;\n do\n seek = str.indexOf(target, ++seek);\n while (seek > -1 && first !== \"'\" && isEscaped(str, seek));\n if (seek > -1) {\n seek += target.length;\n if (target.length > 1) {\n if (str[seek] === first)\n seek++;\n if (str[seek] === first)\n seek++;\n }\n }\n return seek;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet DATE_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})?[T ]?(?:(\\d{2}):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?(Z|[-+]\\d{2}:\\d{2})?$/i;\nexport class TomlDate extends Date {\n #hasDate = false;\n #hasTime = false;\n #offset = null;\n constructor(date) {\n let hasDate = true;\n let hasTime = true;\n let offset = 'Z';\n if (typeof date === 'string') {\n let match = date.match(DATE_TIME_RE);\n if (match) {\n if (!match[1]) {\n hasDate = false;\n date = `0000-01-01T${date}`;\n }\n hasTime = !!match[2];\n // Make sure to use T instead of a space. Breaks in case of extreme values otherwise.\n hasTime && date[10] === ' ' && (date = date.replace(' ', 'T'));\n // Do not allow rollover hours.\n if (match[2] && +match[2] > 23) {\n date = '';\n }\n else {\n offset = match[3] || null;\n date = date.toUpperCase();\n if (!offset && hasTime)\n date += 'Z';\n }\n }\n else {\n date = '';\n }\n }\n super(date);\n if (!isNaN(this.getTime())) {\n this.#hasDate = hasDate;\n this.#hasTime = hasTime;\n this.#offset = offset;\n }\n }\n isDateTime() {\n return this.#hasDate && this.#hasTime;\n }\n isLocal() {\n return !this.#hasDate || !this.#hasTime || !this.#offset;\n }\n isDate() {\n return this.#hasDate && !this.#hasTime;\n }\n isTime() {\n return this.#hasTime && !this.#hasDate;\n }\n isValid() {\n return this.#hasDate || this.#hasTime;\n }\n toISOString() {\n let iso = super.toISOString();\n // Local Date\n if (this.isDate())\n return iso.slice(0, 10);\n // Local Time\n if (this.isTime())\n return iso.slice(11, 23);\n // Local DateTime\n if (this.#offset === null)\n return iso.slice(0, -1);\n // Offset DateTime\n if (this.#offset === 'Z')\n return iso;\n // This part is quite annoying: JS strips the original timezone from the ISO string representation\n // Instead of using a \"modified\" date and \"Z\", we restore the representation \"as authored\"\n let offset = (+(this.#offset.slice(1, 3)) * 60) + +(this.#offset.slice(4, 6));\n offset = this.#offset[0] === '-' ? offset : -offset;\n let offsetDate = new Date(this.getTime() - (offset * 60e3));\n return offsetDate.toISOString().slice(0, -1) + this.#offset;\n }\n static wrapAsOffsetDateTime(jsDate, offset = 'Z') {\n let date = new TomlDate(jsDate);\n date.#offset = offset;\n return date;\n }\n static wrapAsLocalDateTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#offset = null;\n return date;\n }\n static wrapAsLocalDate(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasTime = false;\n date.#offset = null;\n return date;\n }\n static wrapAsLocalTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasDate = false;\n date.#offset = null;\n return date;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { skipVoid } from './util.js';\nimport { TomlDate } from './date.js';\nimport { TomlError } from './error.js';\nlet INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\\d(_?\\d)*))$/;\nlet FLOAT_REGEX = /^[+-]?\\d(_?\\d)*(\\.\\d(_?\\d)*)?([eE][+-]?\\d(_?\\d)*)?$/;\nlet LEADING_ZERO = /^[+-]?0[0-9_]/;\nlet ESCAPE_REGEX = /^[0-9a-f]{2,8}$/i;\nlet ESC_MAP = {\n b: '\\b',\n t: '\\t',\n n: '\\n',\n f: '\\f',\n r: '\\r',\n e: '\\x1b',\n '\"': '\"',\n '\\\\': '\\\\',\n};\nexport function parseString(str, ptr = 0, endPtr = str.length) {\n let isLiteral = str[ptr] === '\\'';\n let isMultiline = str[ptr++] === str[ptr] && str[ptr] === str[ptr + 1];\n if (isMultiline) {\n endPtr -= 2;\n if (str[ptr += 2] === '\\r')\n ptr++;\n if (str[ptr] === '\\n')\n ptr++;\n }\n let tmp = 0;\n let isEscape;\n let parsed = '';\n let sliceStart = ptr;\n while (ptr < endPtr - 1) {\n let c = str[ptr++];\n if (c === '\\n' || (c === '\\r' && str[ptr] === '\\n')) {\n if (!isMultiline) {\n throw new TomlError('newlines are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n }\n else if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n if (isEscape) {\n isEscape = false;\n if (c === 'x' || c === 'u' || c === 'U') {\n // Unicode escape\n let code = str.slice(ptr, (ptr += (c === 'x' ? 2 : c === 'u' ? 4 : 8)));\n if (!ESCAPE_REGEX.test(code)) {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n try {\n parsed += String.fromCodePoint(parseInt(code, 16));\n }\n catch {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n }\n else if (isMultiline && (c === '\\n' || c === ' ' || c === '\\t' || c === '\\r')) {\n // Multiline escape\n ptr = skipVoid(str, ptr - 1, true);\n if (str[ptr] !== '\\n' && str[ptr] !== '\\r') {\n throw new TomlError('invalid escape: only line-ending whitespace may be escaped', {\n toml: str,\n ptr: tmp,\n });\n }\n ptr = skipVoid(str, ptr);\n }\n else if (c in ESC_MAP) {\n // Classic escape\n parsed += ESC_MAP[c];\n }\n else {\n throw new TomlError('unrecognized escape sequence', {\n toml: str,\n ptr: tmp,\n });\n }\n sliceStart = ptr;\n }\n else if (!isLiteral && c === '\\\\') {\n tmp = ptr - 1;\n isEscape = true;\n parsed += str.slice(sliceStart, tmp);\n }\n }\n return parsed + str.slice(sliceStart, endPtr - 1);\n}\nexport function parseValue(value, toml, ptr, integersAsBigInt) {\n // Constant values\n if (value === 'true')\n return true;\n if (value === 'false')\n return false;\n if (value === '-inf')\n return -Infinity;\n if (value === 'inf' || value === '+inf')\n return Infinity;\n if (value === 'nan' || value === '+nan' || value === '-nan')\n return NaN;\n // Avoid FP representation of -0\n if (value === '-0')\n return integersAsBigInt ? 0n : 0;\n // Numbers\n let isInt = INT_REGEX.test(value);\n if (isInt || FLOAT_REGEX.test(value)) {\n if (LEADING_ZERO.test(value)) {\n throw new TomlError('leading zeroes are not allowed', {\n toml: toml,\n ptr: ptr,\n });\n }\n value = value.replace(/_/g, '');\n let numeric = +value;\n if (isNaN(numeric)) {\n throw new TomlError('invalid number', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt) {\n if ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {\n throw new TomlError('integer value cannot be represented losslessly', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt || integersAsBigInt === true)\n numeric = BigInt(value);\n }\n return numeric;\n }\n const date = new TomlDate(value);\n if (!date.isValid()) {\n throw new TomlError('invalid value', {\n toml: toml,\n ptr: ptr,\n });\n }\n return date;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString, parseValue } from './primitive.js';\nimport { parseArray, parseInlineTable } from './struct.js';\nimport { skipVoid, skipUntil, skipComment, getStringEnd } from './util.js';\nimport { TomlError } from './error.js';\nfunction sliceAndTrimEndOf(str, startPtr, endPtr) {\n let value = str.slice(startPtr, endPtr);\n let commentIdx = value.indexOf('#');\n if (commentIdx > -1) {\n // The call to skipComment allows to \"validate\" the comment\n // (absence of control characters)\n skipComment(str, commentIdx);\n value = value.slice(0, commentIdx);\n }\n return [value.trimEnd(), commentIdx];\n}\nexport function extractValue(str, ptr, end, depth, integersAsBigInt) {\n if (depth === 0) {\n throw new TomlError('document contains excessively nested structures. aborting.', {\n toml: str,\n ptr: ptr\n });\n }\n let c = str[ptr];\n if (c === '[' || c === '{') {\n let [value, endPtr] = c === '['\n ? parseArray(str, ptr, depth, integersAsBigInt)\n : parseInlineTable(str, ptr, depth, integersAsBigInt);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] === ',')\n endPtr++;\n else if (str[endPtr] !== end) {\n throw new TomlError('expected comma or end of structure', {\n toml: str,\n ptr: endPtr,\n });\n }\n }\n return [value, endPtr];\n }\n let endPtr;\n if (c === '\"' || c === \"'\") {\n endPtr = getStringEnd(str, ptr);\n let parsed = parseString(str, ptr, endPtr);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] && str[endPtr] !== ',' && str[endPtr] !== end && str[endPtr] !== '\\n' && str[endPtr] !== '\\r') {\n throw new TomlError('unexpected character encountered', {\n toml: str,\n ptr: endPtr,\n });\n }\n endPtr += (+(str[endPtr] === ','));\n }\n return [parsed, endPtr];\n }\n endPtr = skipUntil(str, ptr, ',', end);\n let slice = sliceAndTrimEndOf(str, ptr, endPtr - (+(str[endPtr - 1] === ',')));\n if (!slice[0]) {\n throw new TomlError('incomplete key-value declaration: no value specified', {\n toml: str,\n ptr: ptr\n });\n }\n if (end && slice[1] > -1) {\n endPtr = skipVoid(str, ptr + slice[1]);\n endPtr += +(str[endPtr] === ',');\n }\n return [\n parseValue(slice[0], str, ptr, integersAsBigInt),\n endPtr,\n ];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString } from './primitive.js';\nimport { extractValue } from './extract.js';\nimport { getStringEnd, indexOfNewline, skipComment, skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nlet KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \\t]*$/;\nexport function parseKey(str, ptr, end = '=') {\n let dot = ptr - 1;\n let parsed = [];\n let endPtr = str.indexOf(end, ptr);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n do {\n let c = str[ptr = ++dot];\n // If it's whitespace, ignore\n if (c !== ' ' && c !== '\\t') {\n // If it's a string\n if (c === '\"' || c === '\\'') {\n if (c === str[ptr + 1] && c === str[ptr + 2]) {\n throw new TomlError('multiline strings are not allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n let eos = getStringEnd(str, ptr);\n if (eos < 0) {\n throw new TomlError('unfinished string encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n dot = str.indexOf('.', eos);\n let strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot);\n let newLine = indexOfNewline(strEnd);\n if (newLine > -1) {\n throw new TomlError('newlines are not allowed in keys', {\n toml: str,\n ptr: ptr + dot + newLine,\n });\n }\n if (strEnd.trimStart()) {\n throw new TomlError('found extra tokens after the string part', {\n toml: str,\n ptr: eos,\n });\n }\n if (endPtr < eos) {\n endPtr = str.indexOf(end, eos);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n parsed.push(parseString(str, ptr, eos));\n }\n else {\n // Normal raw key part consumption and validation\n dot = str.indexOf('.', ptr);\n let part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot);\n if (!KEY_PART_RE.test(part)) {\n throw new TomlError('only letter, numbers, dashes and underscores are allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n parsed.push(part.trimEnd());\n }\n }\n // Until there's no more dot\n } while (dot + 1 && dot < endPtr);\n return [parsed, skipVoid(str, endPtr + 1, true, true)];\n}\nexport function parseInlineTable(str, ptr, depth, integersAsBigInt) {\n let res = {};\n let seen = new Set();\n let c;\n ptr++;\n while ((c = str[ptr++]) !== '}' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let k;\n let t = res;\n let hasOwn = false;\n let [key, keyEndPtr] = parseKey(str, ptr - 1);\n for (let i = 0; i < key.length; i++) {\n if (i)\n t = hasOwn ? t[k] : (t[k] = {});\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== 'object' || seen.has(t[k]))) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n if (!hasOwn && k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n }\n }\n if (hasOwn) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n let [value, valueEndPtr] = extractValue(str, keyEndPtr, '}', depth - 1, integersAsBigInt);\n seen.add(value);\n t[k] = value;\n ptr = valueEndPtr;\n }\n }\n if (!c) {\n throw new TomlError('unfinished table encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\nexport function parseArray(str, ptr, depth, integersAsBigInt) {\n let res = [];\n let c;\n ptr++;\n while ((c = str[ptr++]) !== ']' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let e = extractValue(str, ptr - 1, ']', depth - 1, integersAsBigInt);\n res.push(e[0]);\n ptr = e[1];\n }\n }\n if (!c) {\n throw new TomlError('unfinished array encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseKey } from './struct.js';\nimport { extractValue } from './extract.js';\nimport { skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nfunction peekTable(key, table, meta, type) {\n let t = table;\n let m = meta;\n let k;\n let hasOwn = false;\n let state;\n for (let i = 0; i < key.length; i++) {\n if (i) {\n t = hasOwn ? t[k] : (t[k] = {});\n m = (state = m[k]).c;\n if (type === 0 /* Type.DOTTED */ && (state.t === 1 /* Type.EXPLICIT */ || state.t === 2 /* Type.ARRAY */)) {\n return null;\n }\n if (state.t === 2 /* Type.ARRAY */) {\n let l = t.length - 1;\n t = t[l];\n m = m[l].c;\n }\n }\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 /* Type.DOTTED */ && m[k]?.d) {\n return null;\n }\n if (!hasOwn) {\n if (k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true });\n }\n m[k] = {\n t: i < key.length - 1 && type === 2 /* Type.ARRAY */\n ? 3 /* Type.ARRAY_DOTTED */\n : type,\n d: false,\n i: 0,\n c: {},\n };\n }\n }\n state = m[k];\n if (state.t !== type && !(type === 1 /* Type.EXPLICIT */ && state.t === 3 /* Type.ARRAY_DOTTED */)) {\n // Bad key type!\n return null;\n }\n if (type === 2 /* Type.ARRAY */) {\n if (!state.d) {\n state.d = true;\n t[k] = [];\n }\n t[k].push(t = {});\n state.c[state.i++] = (state = { t: 1 /* Type.EXPLICIT */, d: false, i: 0, c: {} });\n }\n if (state.d) {\n // Redefining a table!\n return null;\n }\n state.d = true;\n if (type === 1 /* Type.EXPLICIT */) {\n t = hasOwn ? t[k] : (t[k] = {});\n }\n else if (type === 0 /* Type.DOTTED */ && hasOwn) {\n return null;\n }\n return [k, t, state.c];\n}\nexport function parse(toml, { maxDepth = 1000, integersAsBigInt } = {}) {\n let res = {};\n let meta = {};\n let tbl = res;\n let m = meta;\n for (let ptr = skipVoid(toml, 0); ptr < toml.length;) {\n if (toml[ptr] === '[') {\n let isTableArray = toml[++ptr] === '[';\n let k = parseKey(toml, ptr += +isTableArray, ']');\n if (isTableArray) {\n if (toml[k[1] - 1] !== ']') {\n throw new TomlError('expected end of table declaration', {\n toml: toml,\n ptr: k[1] - 1,\n });\n }\n k[1]++;\n }\n let p = peekTable(k[0], res, meta, isTableArray ? 2 /* Type.ARRAY */ : 1 /* Type.EXPLICIT */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n m = p[2];\n tbl = p[1];\n ptr = k[1];\n }\n else {\n let k = parseKey(toml, ptr);\n let p = peekTable(k[0], tbl, m, 0 /* Type.DOTTED */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n let v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt);\n p[1][p[0]] = v[0];\n ptr = v[1];\n }\n ptr = skipVoid(toml, ptr, true);\n if (toml[ptr] && toml[ptr] !== '\\n' && toml[ptr] !== '\\r') {\n throw new TomlError('each key-value declaration must be followed by an end-of-line', {\n toml: toml,\n ptr: ptr\n });\n }\n ptr = skipVoid(toml, ptr);\n }\n return res;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet BARE_KEY = /^[a-z0-9-_]+$/i;\nfunction extendedTypeOf(obj) {\n let type = typeof obj;\n if (type === 'object') {\n if (Array.isArray(obj))\n return 'array';\n if (obj instanceof Date)\n return 'date';\n }\n return type;\n}\nfunction isArrayOfTables(obj) {\n for (let i = 0; i < obj.length; i++) {\n if (extendedTypeOf(obj[i]) !== 'object')\n return false;\n }\n return obj.length != 0;\n}\nfunction formatString(s) {\n return JSON.stringify(s).replace(/\\x7f/g, '\\\\u007f');\n}\nfunction stringifyValue(val, type, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n if (type === 'number') {\n if (isNaN(val))\n return 'nan';\n if (val === Infinity)\n return 'inf';\n if (val === -Infinity)\n return '-inf';\n if (numberAsFloat && Number.isInteger(val))\n return val.toFixed(1);\n return val.toString();\n }\n if (type === 'bigint' || type === 'boolean') {\n return val.toString();\n }\n if (type === 'string') {\n return formatString(val);\n }\n if (type === 'date') {\n if (isNaN(val.getTime())) {\n throw new TypeError('cannot serialize invalid date');\n }\n return val.toISOString();\n }\n if (type === 'object') {\n return stringifyInlineTable(val, depth, numberAsFloat);\n }\n if (type === 'array') {\n return stringifyArray(val, depth, numberAsFloat);\n }\n}\nfunction stringifyInlineTable(obj, depth, numberAsFloat) {\n let keys = Object.keys(obj);\n if (keys.length === 0)\n return '{}';\n let res = '{ ';\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (i)\n res += ', ';\n res += BARE_KEY.test(k) ? k : formatString(k);\n res += ' = ';\n res += stringifyValue(obj[k], extendedTypeOf(obj[k]), depth - 1, numberAsFloat);\n }\n return res + ' }';\n}\nfunction stringifyArray(array, depth, numberAsFloat) {\n if (array.length === 0)\n return '[]';\n let res = '[ ';\n for (let i = 0; i < array.length; i++) {\n if (i)\n res += ', ';\n if (array[i] === null || array[i] === void 0) {\n throw new TypeError('arrays cannot contain null or undefined values');\n }\n res += stringifyValue(array[i], extendedTypeOf(array[i]), depth - 1, numberAsFloat);\n }\n return res + ' ]';\n}\nfunction stringifyArrayTable(array, key, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let res = '';\n for (let i = 0; i < array.length; i++) {\n res += `${res && '\\n'}[[${key}]]\\n`;\n res += stringifyTable(0, array[i], key, depth, numberAsFloat);\n }\n return res;\n}\nfunction stringifyTable(tableKey, obj, prefix, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let preamble = '';\n let tables = '';\n let keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (obj[k] !== null && obj[k] !== void 0) {\n let type = extendedTypeOf(obj[k]);\n if (type === 'symbol' || type === 'function') {\n throw new TypeError(`cannot serialize values of type '${type}'`);\n }\n let key = BARE_KEY.test(k) ? k : formatString(k);\n if (type === 'array' && isArrayOfTables(obj[k])) {\n tables += (tables && '\\n') + stringifyArrayTable(obj[k], prefix ? `${prefix}.${key}` : key, depth - 1, numberAsFloat);\n }\n else if (type === 'object') {\n let tblKey = prefix ? `${prefix}.${key}` : key;\n tables += (tables && '\\n') + stringifyTable(tblKey, obj[k], tblKey, depth - 1, numberAsFloat);\n }\n else {\n preamble += key;\n preamble += ' = ';\n preamble += stringifyValue(obj[k], type, depth, numberAsFloat);\n preamble += '\\n';\n }\n }\n }\n if (tableKey && (preamble || !tables)) // Create table only if necessary\n preamble = preamble ? `[${tableKey}]\\n${preamble}` : `[${tableKey}]`;\n return preamble && tables\n ? `${preamble}\\n${tables}`\n : preamble || tables;\n}\nexport function stringify(obj, { maxDepth = 1000, numbersAsFloat = false } = {}) {\n if (extendedTypeOf(obj) !== 'object') {\n throw new TypeError('stringify can only be called with an object');\n }\n let str = stringifyTable(0, obj, '', maxDepth, numbersAsFloat);\n if (str[str.length - 1] !== '\\n')\n return str + '\\n';\n return str;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parse } from './parse.js';\nimport { stringify } from './stringify.js';\nimport { TomlDate } from './date.js';\nimport { TomlError } from './error.js';\nexport default { parse, stringify, TomlDate, TomlError };\nexport { parse, stringify, TomlDate, TomlError };\n","import type { Address, Hex } from \"viem\";\n\n// === Transaction Types ===\n\n/** A built DeFi transaction ready for simulation or broadcast */\nexport interface DeFiTx {\n description: string;\n to: Address;\n data: Hex;\n value: bigint;\n gas_estimate?: number;\n /** ERC20 approvals to check and send before broadcasting this tx */\n approvals?: Array<{\n token: Address;\n spender: Address;\n amount: bigint;\n }>;\n}\n\n/** Result of executing or simulating a transaction */\nexport interface ActionResult {\n tx_hash?: string;\n status: TxStatus;\n gas_used?: number;\n description: string;\n details: Record<string, unknown>;\n}\n\n/** Transaction status (serde: snake_case) */\nexport enum TxStatus {\n DryRun = \"dry_run\",\n Simulated = \"simulated\",\n SimulationFailed = \"simulation_failed\",\n Pending = \"pending\",\n Confirmed = \"confirmed\",\n Failed = \"failed\",\n}\n\n// === Token Types ===\n\n/** Token amount with decimals-aware formatting */\nexport interface TokenAmount {\n token: Address;\n symbol: string;\n amount: bigint;\n decimals: number;\n}\n\nexport function formatHuman(t: TokenAmount): string {\n const divisor = 10n ** BigInt(t.decimals);\n const whole = t.amount / divisor;\n const frac = t.amount % divisor;\n return `${whole}.${frac.toString().padStart(t.decimals, \"0\")} ${t.symbol}`;\n}\n\n/** Slippage tolerance in basis points */\nexport interface Slippage {\n bps: number;\n}\n\nexport function newSlippage(bps: number): Slippage {\n return { bps };\n}\n\nexport function defaultSwapSlippage(): Slippage {\n return { bps: 50 };\n}\n\nexport function applyMinSlippage(slippage: Slippage, amount: bigint): bigint {\n return (amount * BigInt(10000 - slippage.bps)) / 10000n;\n}\n\n// === Oracle / Price Types ===\n\nexport interface PriceData {\n source: string;\n source_type: string;\n asset: Address;\n price_usd: bigint;\n price_f64: number;\n block_number?: number;\n timestamp?: number;\n}\n\n// === DEX Types ===\n\nexport interface SwapParams {\n protocol: string;\n token_in: Address;\n token_out: Address;\n amount_in: bigint;\n slippage: Slippage;\n recipient: Address;\n deadline?: number;\n}\n\nexport interface QuoteParams {\n protocol: string;\n token_in: Address;\n token_out: Address;\n amount_in: bigint;\n}\n\nexport interface QuoteResult {\n protocol: string;\n amount_out: bigint;\n price_impact_bps?: number;\n fee_bps?: number;\n route: string[];\n}\n\nexport interface AddLiquidityParams {\n protocol: string;\n token_a: Address;\n token_b: Address;\n amount_a: bigint;\n amount_b: bigint;\n recipient: Address;\n}\n\nexport interface RemoveLiquidityParams {\n protocol: string;\n token_a: Address;\n token_b: Address;\n liquidity: bigint;\n recipient: Address;\n}\n\n// === Lending Types ===\n\nexport interface SupplyParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n on_behalf_of: Address;\n}\n\nexport interface BorrowParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n interest_rate_mode: InterestRateMode;\n on_behalf_of: Address;\n}\n\n/** Interest rate mode (serde: snake_case) */\nexport enum InterestRateMode {\n Variable = \"variable\",\n Stable = \"stable\",\n}\n\nexport interface RepayParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n interest_rate_mode: InterestRateMode;\n on_behalf_of: Address;\n}\n\nexport interface WithdrawParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n to: Address;\n}\n\nexport interface LendingRates {\n protocol: string;\n asset: Address;\n supply_apy: number;\n borrow_variable_apy: number;\n borrow_stable_apy?: number;\n utilization: number;\n total_supply: bigint;\n total_borrow: bigint;\n /** Reward token addresses for supply-side incentives */\n supply_reward_tokens?: string[];\n /** Reward token addresses for borrow-side incentives */\n borrow_reward_tokens?: string[];\n /** Emissions per second per supply reward token (raw uint256 as string) */\n supply_emissions_per_second?: string[];\n /** Emissions per second per borrow reward token (raw uint256 as string) */\n borrow_emissions_per_second?: string[];\n /** Supply-side incentive APY (%) from reward token emissions */\n supply_incentive_apy?: number;\n /** Borrow-side incentive APY (%) from reward token emissions (negative = subsidized) */\n borrow_incentive_apy?: number;\n}\n\nexport interface UserPosition {\n protocol: string;\n user: Address;\n supplies: PositionAsset[];\n borrows: PositionAsset[];\n health_factor?: number;\n net_apy?: number;\n}\n\nexport interface PositionAsset {\n asset: Address;\n symbol: string;\n amount: bigint;\n value_usd?: number;\n}\n\n// === CDP Types ===\n\nexport interface OpenCdpParams {\n protocol: string;\n collateral: Address;\n collateral_amount: bigint;\n debt_amount: bigint;\n recipient: Address;\n}\n\nexport interface AdjustCdpParams {\n protocol: string;\n cdp_id: bigint;\n collateral_delta?: bigint;\n debt_delta?: bigint;\n add_collateral: boolean;\n add_debt: boolean;\n}\n\nexport interface CloseCdpParams {\n protocol: string;\n cdp_id: bigint;\n}\n\nexport interface CdpInfo {\n protocol: string;\n cdp_id: bigint;\n collateral: TokenAmount;\n debt: TokenAmount;\n collateral_ratio: number;\n liquidation_price?: number;\n}\n\n// === Liquid Staking Types ===\n\nexport interface StakeParams {\n protocol: string;\n amount: bigint;\n recipient: Address;\n}\n\nexport interface UnstakeParams {\n protocol: string;\n amount: bigint;\n recipient: Address;\n}\n\nexport interface StakingInfo {\n protocol: string;\n staked_token: Address;\n liquid_token: Address;\n exchange_rate: number;\n apy?: number;\n total_staked: bigint;\n}\n\n// === Vault Types (ERC-4626) ===\n\nexport interface VaultInfo {\n protocol: string;\n vault_address: Address;\n asset: Address;\n total_assets: bigint;\n total_supply: bigint;\n apy?: number;\n}\n\n// === Derivatives Types ===\n\nexport interface DerivativesPositionParams {\n protocol: string;\n market: string;\n size: bigint;\n collateral: bigint;\n is_long: boolean;\n}\n\n// === Options Types ===\n\nexport interface OptionParams {\n protocol: string;\n underlying: Address;\n strike_price: bigint;\n expiry: number;\n is_call: boolean;\n amount: bigint;\n}\n\n// === ve(3,3) Types ===\n\nexport interface RewardInfo {\n token: Address;\n symbol: string;\n amount: bigint;\n value_usd?: number;\n}\n\nexport interface GaugeInfo {\n gauge: Address;\n pool: Address;\n total_staked: bigint;\n reward_rate: bigint;\n rewards: RewardInfo[];\n}\n\nexport interface VeNftInfo {\n token_id: bigint;\n amount: bigint;\n unlock_time: number;\n voting_power: bigint;\n}\n\n// === Yield Types ===\n\nexport interface YieldInfo {\n protocol: string;\n pool: string;\n apy: number;\n tvl: bigint;\n tokens: Address[];\n}\n\n// === Portfolio Tracker Types ===\nexport interface PortfolioSnapshot {\n timestamp: number;\n chain: string;\n wallet: string;\n tokens: TokenBalance[];\n defi_positions: DefiPosition[];\n total_value_usd: number;\n}\n\nexport interface TokenBalance {\n token: string;\n symbol: string;\n balance: bigint;\n value_usd: number;\n price_usd: number;\n}\n\nexport interface DefiPosition {\n protocol: string;\n type: \"lending_supply\" | \"lending_borrow\" | \"lp\" | \"staking\" | \"vault\";\n asset: string;\n amount: bigint;\n value_usd: number;\n}\n\nexport interface PortfolioPnL {\n period: string;\n start_value_usd: number;\n end_value_usd: number;\n pnl_usd: number;\n pnl_pct: number;\n token_changes: TokenChange[];\n}\n\nexport interface TokenChange {\n symbol: string;\n balance_change: bigint;\n value_change_usd: number;\n}\n","import type { Address } from \"viem\";\n\nexport type DefiErrorCode =\n | \"PROTOCOL_NOT_FOUND\"\n | \"TOKEN_NOT_FOUND\"\n | \"CHAIN_NOT_FOUND\"\n | \"INSUFFICIENT_BALANCE\"\n | \"INSUFFICIENT_ALLOWANCE\"\n | \"SLIPPAGE_EXCEEDED\"\n | \"SIMULATION_FAILED\"\n | \"ABI_ERROR\"\n | \"REGISTRY_ERROR\"\n | \"RPC_ERROR\"\n | \"PROVIDER_ERROR\"\n | \"CONTRACT_ERROR\"\n | \"INVALID_PARAM\"\n | \"UNSUPPORTED\"\n | \"INTERNAL\";\n\nexport class DefiError extends Error {\n readonly code: DefiErrorCode;\n\n constructor(code: DefiErrorCode, message: string) {\n super(message);\n this.name = \"DefiError\";\n this.code = code;\n }\n\n static protocolNotFound(name: string): DefiError {\n return new DefiError(\"PROTOCOL_NOT_FOUND\", `Protocol not found: ${name}`);\n }\n\n static tokenNotFound(name: string): DefiError {\n return new DefiError(\"TOKEN_NOT_FOUND\", `Token not found: ${name}`);\n }\n\n static chainNotFound(name: string): DefiError {\n return new DefiError(\"CHAIN_NOT_FOUND\", `Chain not found: ${name}`);\n }\n\n static insufficientBalance(needed: string, available: string): DefiError {\n return new DefiError(\n \"INSUFFICIENT_BALANCE\",\n `Insufficient balance: need ${needed}, have ${available}`,\n );\n }\n\n static insufficientAllowance(spender: Address): DefiError {\n return new DefiError(\n \"INSUFFICIENT_ALLOWANCE\",\n `Insufficient allowance for spender ${spender}`,\n );\n }\n\n static slippageExceeded(expected: string, actual: string): DefiError {\n return new DefiError(\n \"SLIPPAGE_EXCEEDED\",\n `Slippage exceeded: expected ${expected}, got ${actual}`,\n );\n }\n\n static simulationFailed(reason: string): DefiError {\n return new DefiError(\n \"SIMULATION_FAILED\",\n `Transaction simulation failed: ${reason}`,\n );\n }\n\n static abiError(reason: string): DefiError {\n return new DefiError(\"ABI_ERROR\", `ABI encoding error: ${reason}`);\n }\n\n static registryError(reason: string): DefiError {\n return new DefiError(\"REGISTRY_ERROR\", `Registry error: ${reason}`);\n }\n\n static rpcError(reason: string): DefiError {\n return new DefiError(\"RPC_ERROR\", `RPC error: ${reason}`);\n }\n\n static providerError(reason: string): DefiError {\n return new DefiError(\"PROVIDER_ERROR\", `Provider error: ${reason}`);\n }\n\n static contractError(reason: string): DefiError {\n return new DefiError(\"CONTRACT_ERROR\", `Contract error: ${reason}`);\n }\n\n static invalidParam(reason: string): DefiError {\n return new DefiError(\"INVALID_PARAM\", `Invalid parameter: ${reason}`);\n }\n\n static unsupported(operation: string): DefiError {\n return new DefiError(\n \"UNSUPPORTED\",\n `Unsupported operation: ${operation}`,\n );\n }\n\n static internal(reason: string): DefiError {\n return new DefiError(\"INTERNAL\", `Internal error: ${reason}`);\n }\n\n toJSON() {\n return { error: this.message };\n }\n}\n\nexport type Result<T> = T;\n","/**\n * BigInt JSON serialization utilities.\n *\n * Rust's alloy U256 (backed by ruint) serializes to JSON as 0x-prefixed\n * lowercase hex strings (e.g., \"0x75bcd15\"). We must match this exactly\n * for behavioral parity.\n */\n\n/** JSON replacer for Rust parity — bigint becomes 0x-hex string */\nexport function jsonReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return \"0x\" + value.toString(16);\n }\n return value;\n}\n\n/** JSON replacer for SDK consumers — bigint becomes decimal string */\nexport function jsonReplacerDecimal(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n\n/** Stringify with decimal bigint handling */\nexport function jsonStringify(data: unknown, pretty = true): string {\n return pretty\n ? JSON.stringify(data, jsonReplacerDecimal, 2)\n : JSON.stringify(data, jsonReplacerDecimal);\n}\n\n/** Parse a 0x-hex or decimal string to bigint */\nexport function parseBigInt(value: string): bigint {\n if (value.startsWith(\"0x\") || value.startsWith(\"0X\")) {\n return BigInt(value);\n }\n return BigInt(value);\n}\n","import type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, parseAbi } from \"viem\";\nimport type { DeFiTx } from \"./types.js\";\n\nconst erc20Abi = parseAbi([\n \"function name() view returns (string)\",\n \"function symbol() view returns (string)\",\n \"function decimals() view returns (uint8)\",\n \"function totalSupply() view returns (uint256)\",\n \"function balanceOf(address account) view returns (uint256)\",\n \"function transfer(address to, uint256 amount) returns (bool)\",\n \"function allowance(address owner, address spender) view returns (uint256)\",\n \"function approve(address spender, uint256 amount) returns (bool)\",\n \"function transferFrom(address from, address to, uint256 amount) returns (bool)\",\n]);\n\nexport { erc20Abi };\n\nexport function buildApprove(\n token: Address,\n spender: Address,\n amount: bigint,\n): DeFiTx {\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spender, amount],\n });\n return {\n description: `Approve ${spender} to spend ${amount} of token ${token}`,\n to: token,\n data,\n value: 0n,\n gas_estimate: 60_000,\n };\n}\n\nexport function buildTransfer(\n token: Address,\n to: Address,\n amount: bigint,\n): DeFiTx {\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"transfer\",\n args: [to, amount],\n });\n return {\n description: `Transfer ${amount} of token ${token} to ${to}`,\n to: token,\n data,\n value: 0n,\n gas_estimate: 65_000,\n };\n}\n","import { createPublicClient, http, type PublicClient } from \"viem\";\n\nconst providerCache = new Map<string, PublicClient>();\n\nexport function getProvider(rpcUrl: string): PublicClient {\n const cached = providerCache.get(rpcUrl);\n if (cached) return cached;\n\n const client = createPublicClient({ transport: http(rpcUrl) });\n providerCache.set(rpcUrl, client);\n return client;\n}\n\nexport function clearProviderCache(): void {\n providerCache.clear();\n}\n","import type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, decodeFunctionResult, parseAbi } from \"viem\";\nimport type { DeFiTx } from \"./types.js\";\nimport { getProvider } from \"./provider.js\";\n\nexport const MULTICALL3_ADDRESS: Address =\n \"0xcA11bde05977b3631167028862bE2a173976CA11\";\n\nconst multicall3Abi = parseAbi([\n \"struct Call3 { address target; bool allowFailure; bytes callData; }\",\n \"struct Result { bool success; bytes returnData; }\",\n \"function aggregate3(Call3[] calls) returns (Result[] returnData)\",\n]);\n\nexport function buildMulticall(calls: Array<[Address, Hex]>): DeFiTx {\n const mcCalls = calls.map(([target, callData]) => ({\n target,\n allowFailure: true,\n callData,\n }));\n\n const data = encodeFunctionData({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n args: [mcCalls],\n });\n\n return {\n description: `Multicall3 batch (${calls.length} calls)`,\n to: MULTICALL3_ADDRESS,\n data,\n value: 0n,\n };\n}\n\nexport async function multicallRead(\n rpcUrl: string,\n calls: Array<[Address, Hex]>,\n): Promise<(Hex | null)[]> {\n const client = getProvider(rpcUrl);\n\n const mcCalls = calls.map(([target, callData]) => ({\n target,\n allowFailure: true,\n callData,\n }));\n\n const result = await client.call({\n to: MULTICALL3_ADDRESS,\n data: encodeFunctionData({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n args: [mcCalls],\n }),\n });\n\n if (!result.data) return calls.map(() => null);\n\n const decoded = decodeFunctionResult({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n data: result.data,\n }) as Array<{ success: boolean; returnData: Hex }>;\n\n return decoded.map((r) => (r.success ? r.returnData : null));\n}\n\nexport function decodeU256(data: Hex | null): bigint {\n if (!data || data.length < 66) return 0n;\n return BigInt(data.slice(0, 66));\n}\n\nexport function decodeU128(data: Hex | null): bigint {\n if (!data || data.length < 66) return 0n;\n const val = BigInt(data.slice(0, 66));\n return val & ((1n << 128n) - 1n);\n}\n","export class ChainConfig {\n name!: string;\n chain_id!: number;\n rpc_url!: string;\n explorer_url?: string;\n native_token!: string;\n wrapped_native?: string;\n multicall3?: string;\n\n effectiveRpcUrl(): string {\n const chainEnv = this.name.toUpperCase().replace(/ /g, \"_\") + \"_RPC_URL\";\n return (\n process.env[chainEnv] ??\n process.env[\"HYPEREVM_RPC_URL\"] ??\n this.rpc_url\n );\n }\n}\n","import type { Address } from \"viem\";\n\nexport enum ProtocolCategory {\n Dex = \"dex\",\n Lending = \"lending\",\n Cdp = \"cdp\",\n Bridge = \"bridge\",\n LiquidStaking = \"liquid_staking\",\n YieldSource = \"yield_source\",\n YieldAggregator = \"yield_aggregator\",\n Vault = \"vault\",\n Derivatives = \"derivatives\",\n Options = \"options\",\n LiquidityManager = \"liquidity_manager\",\n Nft = \"nft\",\n Other = \"other\",\n}\n\nexport function protocolCategoryLabel(category: ProtocolCategory): string {\n switch (category) {\n case ProtocolCategory.Dex:\n return \"DEX\";\n case ProtocolCategory.Lending:\n return \"Lending\";\n case ProtocolCategory.Cdp:\n return \"CDP\";\n case ProtocolCategory.Bridge:\n return \"Bridge\";\n case ProtocolCategory.LiquidStaking:\n return \"Liquid Staking\";\n case ProtocolCategory.YieldSource:\n return \"Yield Source\";\n case ProtocolCategory.YieldAggregator:\n return \"Yield Aggregator\";\n case ProtocolCategory.Vault:\n return \"Vault\";\n case ProtocolCategory.Derivatives:\n return \"Derivatives\";\n case ProtocolCategory.Options:\n return \"Options\";\n case ProtocolCategory.LiquidityManager:\n return \"Liquidity Manager\";\n case ProtocolCategory.Nft:\n return \"NFT\";\n case ProtocolCategory.Other:\n return \"Other\";\n }\n}\n\nexport interface ProtocolEntry {\n name: string;\n slug: string;\n category: ProtocolCategory;\n interface: string;\n chain: string;\n native?: boolean;\n contracts?: Record<string, Address>;\n description?: string;\n}\n","import { readFileSync, readdirSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { parse } from \"smol-toml\";\nimport { ChainConfig } from \"./chain.js\";\nimport type { TokenEntry } from \"./token.js\";\nimport { type ProtocolEntry, ProtocolCategory } from \"./protocol.js\";\n\nimport { existsSync } from \"fs\";\n\nconst __dirname = fileURLToPath(new URL(\".\", import.meta.url));\n\n// Resolve config dir: works from src/ (vitest), dist/ (built), and npm bundle (npx)\nfunction findConfigDir(): string {\n const candidates = [\n resolve(__dirname, \"../../../config\"), // from dist/registry/ (monorepo build)\n resolve(__dirname, \"../../../../config\"), // from src/registry/ (vitest)\n resolve(__dirname, \"../config\"), // from dist/ (npm bundle — config at package root)\n resolve(__dirname, \"../../config\"), // from dist/subdir (npm bundle variant)\n ];\n for (const dir of candidates) {\n if (existsSync(resolve(dir, \"chains.toml\"))) return dir;\n }\n throw new Error(`Config directory not found. Searched: ${candidates.join(\", \")}`);\n}\n\nconst CONFIG_DIR = findConfigDir();\n\nfunction readToml(relPath: string): string {\n return readFileSync(resolve(CONFIG_DIR, relPath), \"utf-8\");\n}\n\ninterface ChainConfigWrapper {\n chain: Record<string, ChainConfig>;\n}\n\ninterface TokensWrapper {\n token: TokenEntry[];\n}\n\ninterface ProtocolWrapper {\n protocol: ProtocolEntry;\n}\n\nexport class Registry {\n chains: Map<string, ChainConfig>;\n tokens: Map<string, TokenEntry[]>;\n protocols: ProtocolEntry[];\n\n private constructor(\n chains: Map<string, ChainConfig>,\n tokens: Map<string, TokenEntry[]>,\n protocols: ProtocolEntry[],\n ) {\n this.chains = chains;\n this.tokens = tokens;\n this.protocols = protocols;\n }\n\n static loadEmbedded(): Registry {\n const chains = Registry.loadChains();\n const tokens = Registry.loadTokens();\n const protocols = Registry.loadProtocols();\n return new Registry(chains, tokens, protocols);\n }\n\n private static loadChains(): Map<string, ChainConfig> {\n const raw = parse(readToml(\"chains.toml\")) as unknown as ChainConfigWrapper;\n const map = new Map<string, ChainConfig>();\n for (const [key, data] of Object.entries(raw.chain)) {\n const cfg = Object.assign(new ChainConfig(), data);\n map.set(key, cfg);\n }\n return map;\n }\n\n private static loadTokens(): Map<string, TokenEntry[]> {\n // Dynamically discover all token files in config/tokens/\n const map = new Map<string, TokenEntry[]>();\n const tokensDir = resolve(CONFIG_DIR, \"tokens\");\n try {\n const files = readdirSync(tokensDir).filter(f => f.endsWith(\".toml\"));\n for (const file of files) {\n const chain = file.replace(\".toml\", \"\");\n try {\n const raw = parse(readToml(`tokens/${file}`)) as unknown as TokensWrapper;\n map.set(chain, raw.token);\n } catch { /* skip invalid token files */ }\n }\n } catch { /* tokens dir may not exist */ }\n return map;\n }\n\n private static loadProtocols(): ProtocolEntry[] {\n // Dynamically discover all protocol TOML files across all categories\n const protocols: ProtocolEntry[] = [];\n const protocolsDir = resolve(CONFIG_DIR, \"protocols\");\n const categories = [\"dex\", \"lending\", \"cdp\", \"vault\", \"liquid_staking\", \"yield_aggregator\", \"yield_source\", \"derivatives\", \"options\", \"nft\", \"bridge\"];\n\n for (const category of categories) {\n const catDir = resolve(protocolsDir, category);\n try {\n if (!existsSync(catDir)) continue;\n const files = readdirSync(catDir).filter(f => f.endsWith(\".toml\"));\n for (const file of files) {\n try {\n const raw = parse(readToml(`protocols/${category}/${file}`)) as unknown as ProtocolWrapper;\n protocols.push(raw.protocol);\n } catch { /* skip invalid protocol files */ }\n }\n } catch { /* category dir may not exist */ }\n }\n return protocols;\n }\n\n getChain(name: string): ChainConfig {\n const chain = this.chains.get(name);\n if (!chain) throw new Error(`Chain not found: ${name}`);\n return chain;\n }\n\n getProtocol(name: string): ProtocolEntry {\n const protocol = this.protocols.find(\n (p) =>\n p.name.toLowerCase() === name.toLowerCase() ||\n p.slug.toLowerCase() === name.toLowerCase(),\n );\n if (!protocol) throw new Error(`Protocol not found: ${name}`);\n return protocol;\n }\n\n getProtocolsByCategory(category: ProtocolCategory): ProtocolEntry[] {\n return this.protocols.filter((p) => p.category === category);\n }\n\n getProtocolsForChain(chain: string): ProtocolEntry[] {\n return this.protocols.filter(\n (p) => p.chain.toLowerCase() === chain.toLowerCase(),\n );\n }\n\n resolveToken(chain: string, symbol: string): TokenEntry {\n const tokens = this.tokens.get(chain);\n if (!tokens) throw new Error(`Chain not found: ${chain}`);\n const token = tokens.find(\n (t) => t.symbol.toLowerCase() === symbol.toLowerCase(),\n );\n if (!token) throw new Error(`Token not found: ${symbol}`);\n return token;\n }\n}\n","import { DefiError } from \"@hypurrquant/defi-core\";\nimport type { ProtocolEntry } from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\n\n// DEX adapters\nimport { UniswapV3Adapter } from \"./dex/uniswap_v3.js\";\nimport { UniswapV2Adapter } from \"./dex/uniswap_v2.js\";\nimport { AlgebraV3Adapter } from \"./dex/algebra_v3.js\";\nimport { BalancerV3Adapter } from \"./dex/balancer_v3.js\";\nimport { CurveStableSwapAdapter } from \"./dex/curve.js\";\nimport { SolidlyAdapter } from \"./dex/solidly.js\";\nimport { WooFiAdapter } from \"./dex/woofi.js\";\nimport { SolidlyGaugeAdapter } from \"./dex/solidly_gauge.js\";\nimport { MasterChefAdapter } from \"./dex/masterchef.js\";\n\n// Trait interfaces\nimport type { IDex } from \"@hypurrquant/defi-core\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport type { ICdp } from \"@hypurrquant/defi-core\";\nimport type { IVault } from \"@hypurrquant/defi-core\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport type { IGaugeSystem } from \"@hypurrquant/defi-core\";\nimport type { IGauge } from \"@hypurrquant/defi-core\";\nimport type { IYieldSource } from \"@hypurrquant/defi-core\";\nimport type { IDerivatives } from \"@hypurrquant/defi-core\";\nimport type { IOptions } from \"@hypurrquant/defi-core\";\nimport type { IOracle } from \"@hypurrquant/defi-core\";\nimport type { INft } from \"@hypurrquant/defi-core\";\n\n// Lending adapters\nimport { AaveV3Adapter } from \"./lending/aave_v3.js\";\nimport { AaveV2Adapter } from \"./lending/aave_v2.js\";\nimport { AaveOracleAdapter } from \"./lending/aave_oracle.js\";\nimport { CompoundV2Adapter } from \"./lending/compound_v2.js\";\nimport { CompoundV3Adapter } from \"./lending/compound_v3.js\";\nimport { EulerV2Adapter } from \"./lending/euler_v2.js\";\nimport { MorphoBlueAdapter } from \"./lending/morpho.js\";\n\n// CDP adapters\nimport { FelixCdpAdapter } from \"./cdp/felix.js\";\nimport { FelixOracleAdapter } from \"./cdp/felix_oracle.js\";\n\n// Vault adapters\nimport { ERC4626VaultAdapter } from \"./vault/erc4626.js\";\n\n// Liquid staking adapters\nimport { GenericLstAdapter } from \"./liquid_staking/generic_lst.js\";\nimport { StHypeAdapter } from \"./liquid_staking/sthype.js\";\nimport { KinetiqAdapter } from \"./liquid_staking/kinetiq.js\";\n\n// Yield source adapters\nimport { PendleAdapter } from \"./yield_source/pendle.js\";\nimport { GenericYieldAdapter } from \"./yield_source/generic_yield.js\";\n\n// Derivatives adapters\nimport { HlpVaultAdapter } from \"./derivatives/hlp.js\";\nimport { GenericDerivativesAdapter } from \"./derivatives/generic_derivatives.js\";\n\n// Options adapters\nimport { RyskAdapter } from \"./options/rysk.js\";\nimport { GenericOptionsAdapter } from \"./options/generic_options.js\";\n\n// NFT adapters\nimport { ERC721Adapter } from \"./nft/erc721.js\";\n\n// ============================================================\n// DEX\n// ============================================================\n\n/** Create a Dex implementation from a protocol registry entry */\nexport function createDex(entry: ProtocolEntry, rpcUrl?: string): IDex {\n switch (entry.interface) {\n case \"uniswap_v3\":\n return new UniswapV3Adapter(entry, rpcUrl);\n case \"uniswap_v4\":\n throw DefiError.unsupported(\n `[${entry.name}] Uniswap V4 (singleton PoolManager) is not yet supported — use HyperSwap V3 or another V3-compatible DEX for quotes`,\n );\n case \"algebra_v3\":\n return new AlgebraV3Adapter(entry, rpcUrl);\n case \"uniswap_v2\":\n return new UniswapV2Adapter(entry, rpcUrl);\n case \"solidly_v2\":\n case \"solidly_cl\":\n return new SolidlyAdapter(entry, rpcUrl);\n case \"curve_stableswap\":\n return new CurveStableSwapAdapter(entry);\n case \"balancer_v3\":\n return new BalancerV3Adapter(entry);\n case \"woofi\":\n return new WooFiAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`DEX interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// Lending\n// ============================================================\n\n/** Create a Lending implementation from a protocol registry entry */\nexport function createLending(entry: ProtocolEntry, rpcUrl?: string): ILending {\n switch (entry.interface) {\n case \"aave_v3\":\n case \"aave_v3_isolated\":\n return new AaveV3Adapter(entry, rpcUrl);\n case \"aave_v2\":\n return new AaveV2Adapter(entry, rpcUrl);\n case \"morpho_blue\":\n return new MorphoBlueAdapter(entry, rpcUrl);\n case \"euler_v2\":\n return new EulerV2Adapter(entry, rpcUrl);\n case \"compound_v2\":\n return new CompoundV2Adapter(entry, rpcUrl);\n case \"compound_v3\":\n return new CompoundV3Adapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Lending interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// CDP\n// ============================================================\n\n/** Create a CDP implementation from a protocol registry entry */\nexport function createCdp(entry: ProtocolEntry, rpcUrl?: string): ICdp {\n switch (entry.interface) {\n case \"liquity_v2\":\n return new FelixCdpAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`CDP interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// Vault\n// ============================================================\n\n/** Create a Vault implementation from a protocol registry entry */\nexport function createVault(entry: ProtocolEntry, rpcUrl?: string): IVault {\n switch (entry.interface) {\n case \"erc4626\":\n case \"beefy_vault\":\n return new ERC4626VaultAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Vault interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// Liquid Staking\n// ============================================================\n\n/** Create a LiquidStaking implementation from a protocol registry entry */\nexport function createLiquidStaking(entry: ProtocolEntry, rpcUrl?: string): ILiquidStaking {\n switch (entry.interface) {\n case \"kinetiq_staking\":\n return new KinetiqAdapter(entry, rpcUrl);\n case \"sthype_staking\":\n return new StHypeAdapter(entry, rpcUrl);\n case \"hyperbeat_lst\":\n case \"kintsu\":\n return new GenericLstAdapter(entry, rpcUrl);\n default:\n return new GenericLstAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// Gauge\n// ============================================================\n\n/** Create a GaugeSystem implementation from a protocol registry entry */\nexport function createGauge(entry: ProtocolEntry, rpcUrl?: string): IGaugeSystem {\n switch (entry.interface) {\n case \"solidly_v2\":\n case \"solidly_cl\":\n case \"algebra_v3\":\n case \"hybra\":\n return new SolidlyGaugeAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Gauge interface '${entry.interface}' not supported`);\n }\n}\n\n/** Create a MasterChef IGauge implementation from a protocol registry entry */\nexport function createMasterChef(entry: ProtocolEntry, rpcUrl?: string): IGauge {\n return new MasterChefAdapter(entry, rpcUrl);\n}\n\n// ============================================================\n// Yield Source (fallback to GenericYield)\n// ============================================================\n\n/** Create a YieldSource implementation — falls back to GenericYield for unknown interfaces */\nexport function createYieldSource(entry: ProtocolEntry, rpcUrl?: string): IYieldSource {\n switch (entry.interface) {\n case \"pendle_v2\":\n return new PendleAdapter(entry, rpcUrl);\n default:\n return new GenericYieldAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// Derivatives (fallback to GenericDerivatives)\n// ============================================================\n\n/** Create a Derivatives implementation — falls back to GenericDerivatives for unknown interfaces */\nexport function createDerivatives(entry: ProtocolEntry, rpcUrl?: string): IDerivatives {\n switch (entry.interface) {\n case \"hlp_vault\":\n return new HlpVaultAdapter(entry, rpcUrl);\n default:\n return new GenericDerivativesAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// Options (fallback to GenericOptions)\n// ============================================================\n\n/** Create an Options implementation — falls back to GenericOptions for unknown interfaces */\nexport function createOptions(entry: ProtocolEntry, rpcUrl?: string): IOptions {\n switch (entry.interface) {\n case \"rysk\":\n return new RyskAdapter(entry, rpcUrl);\n default:\n return new GenericOptionsAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// NFT\n// ============================================================\n\n/** Create an NFT implementation from a protocol registry entry */\nexport function createNft(entry: ProtocolEntry, rpcUrl?: string): INft {\n switch (entry.interface) {\n case \"erc721\":\n return new ERC721Adapter(entry, rpcUrl);\n case \"marketplace\":\n throw DefiError.unsupported(`NFT marketplace '${entry.name}' is not queryable as ERC-721. Use a specific collection address.`);\n default:\n throw DefiError.unsupported(`NFT interface '${entry.interface}' not supported`);\n }\n}\n\n// ============================================================\n// Oracle from Lending\n// ============================================================\n\n/** Create an Oracle from a lending protocol entry (Aave V3 forks have an oracle contract) */\nexport function createOracleFromLending(entry: ProtocolEntry, rpcUrl: string): IOracle {\n switch (entry.interface) {\n case \"aave_v3\":\n case \"aave_v3_isolated\":\n return new AaveOracleAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Oracle not available for lending interface '${entry.interface}'`);\n }\n}\n\n// ============================================================\n// Oracle from CDP\n// ============================================================\n\n/** Create an Oracle from a CDP protocol entry (Felix has its own PriceFeed contract) */\nexport function createOracleFromCdp(entry: ProtocolEntry, _asset: Address, rpcUrl: string): IOracle {\n switch (entry.interface) {\n case \"liquity_v2\":\n return new FelixOracleAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Oracle not available for CDP interface '${entry.interface}'`);\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, decodeAbiParameters } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst DEFAULT_FEE = 3000;\n\nconst swapRouterAbi = parseAbi([\n \"struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; }\",\n \"function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut)\",\n]);\n\nconst quoterAbi = parseAbi([\n \"struct QuoteExactInputSingleParams { address tokenIn; address tokenOut; uint256 amountIn; uint24 fee; uint160 sqrtPriceLimitX96; }\",\n \"function quoteExactInputSingle(QuoteExactInputSingleParams memory params) external returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)\",\n]);\n\n// Ramses CL uses tickSpacing instead of fee in the quoter struct\nconst ramsesQuoterAbi = parseAbi([\n \"struct QuoteExactInputSingleParams { address tokenIn; address tokenOut; uint256 amountIn; int24 tickSpacing; uint160 sqrtPriceLimitX96; }\",\n \"function quoteExactInputSingle(QuoteExactInputSingleParams memory params) external returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)\",\n]);\n\nconst positionManagerAbi = parseAbi([\n \"struct MintParams { address token0; address token1; uint24 fee; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; }\",\n \"function mint(MintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n]);\n\nexport class UniswapV3Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly quoter: Address | undefined;\n private readonly positionManager: Address | undefined;\n private readonly factory: Address | undefined;\n private readonly fee: number;\n private readonly rpcUrl: string | undefined;\n private readonly useTickSpacingQuoter: boolean;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.quoter = entry.contracts?.[\"quoter\"];\n this.positionManager = entry.contracts?.[\"position_manager\"];\n this.factory = entry.contracts?.[\"factory\"];\n this.fee = DEFAULT_FEE;\n this.rpcUrl = rpcUrl;\n // Ramses CL and similar forks use tickSpacing-based pool identification\n this.useTickSpacingQuoter = entry.contracts?.[\"pool_deployer\"] !== undefined\n || entry.contracts?.[\"gauge_factory\"] !== undefined;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n const amountOutMinimum = 0n;\n\n const data = encodeFunctionData({\n abi: swapRouterAbi,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n fee: this.fee,\n recipient: params.recipient,\n deadline,\n amountIn: params.amount_in,\n amountOutMinimum,\n sqrtPriceLimitX96: 0n,\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokenIn for tokenOut`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured\");\n }\n\n if (this.quoter) {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // Try tickSpacing-based quoter first for Ramses CL and similar forks\n if (this.useTickSpacingQuoter) {\n const tickSpacings = [1, 10, 50, 100, 200];\n const tsResults = await Promise.allSettled(\n tickSpacings.map(async (ts) => {\n const result = await client.call({\n to: this.quoter!,\n data: encodeFunctionData({\n abi: ramsesQuoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n amountIn: params.amount_in,\n tickSpacing: ts,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n });\n if (!result.data) return { amountOut: 0n, tickSpacing: ts };\n const [amountOut] = decodeAbiParameters(\n [{ name: \"amountOut\", type: \"uint256\" }],\n result.data,\n );\n return { amountOut, tickSpacing: ts };\n }),\n );\n\n let best = { amountOut: 0n, tickSpacing: 50 };\n for (const r of tsResults) {\n if (r.status === \"fulfilled\" && r.value.amountOut > best.amountOut) {\n best = r.value;\n }\n }\n\n if (best.amountOut > 0n) {\n return {\n protocol: this.protocolName,\n amount_out: best.amountOut,\n price_impact_bps: undefined,\n fee_bps: undefined,\n route: [`${params.token_in} -> ${params.token_out} (tickSpacing: ${best.tickSpacing})`],\n };\n }\n\n // tickSpacing-based protocol (Ramses CL): quoter returned no result.\n // Pool exists but has no liquidity in this fork snapshot.\n throw DefiError.rpcError(\n `[${this.protocolName}] No quote available — pool exists but has zero liquidity for this pair`,\n );\n }\n\n // Standard Uniswap V3 fee-based quoter\n const feeTiers = [500, 3000, 10000, 100];\n const results = await Promise.allSettled(\n feeTiers.map(async (fee) => {\n const result = await client.call({\n to: this.quoter!,\n data: encodeFunctionData({\n abi: quoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n amountIn: params.amount_in,\n fee,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n });\n if (!result.data) return { amountOut: 0n, fee };\n const [amountOut] = decodeAbiParameters(\n [{ name: \"amountOut\", type: \"uint256\" }],\n result.data,\n );\n return { amountOut, fee };\n }),\n );\n\n let best = { amountOut: 0n, fee: 3000 };\n for (const r of results) {\n if (r.status === \"fulfilled\" && r.value.amountOut > best.amountOut) {\n best = r.value;\n }\n }\n\n if (best.amountOut > 0n) {\n return {\n protocol: this.protocolName,\n amount_out: best.amountOut,\n price_impact_bps: undefined,\n fee_bps: Math.floor(best.fee / 10),\n route: [`${params.token_in} -> ${params.token_out} (fee: ${best.fee})`],\n };\n }\n }\n\n // Fallback: simulate swap via eth_call on the router\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const callData = encodeFunctionData({\n abi: swapRouterAbi,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n fee: this.fee,\n recipient: \"0x0000000000000000000000000000000000000001\",\n deadline: BigInt(\"18446744073709551615\"),\n amountIn: params.amount_in,\n amountOutMinimum: 0n,\n sqrtPriceLimitX96: 0n,\n },\n ],\n });\n\n let output: `0x${string}` | undefined;\n try {\n const result = await client.call({ to: this.router, data: callData });\n output = result.data;\n } catch (e: unknown) {\n const errMsg = String(e);\n if (errMsg.includes(\"STF\") || errMsg.includes(\"insufficient\")) {\n throw DefiError.unsupported(\n `[${this.protocolName}] quote unavailable — no quoter contract configured. Swap simulation requires token balance. Add a quoter address to the protocol config.`,\n );\n }\n throw DefiError.rpcError(`[${this.protocolName}] swap simulation for quote failed: ${errMsg}`);\n }\n\n const amountOut =\n output && output.length >= 66\n ? BigInt(output.slice(0, 66))\n : 0n;\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut,\n price_impact_bps: undefined,\n fee_bps: Math.floor(this.fee / 10),\n route: [`${params.token_in} -> ${params.token_out} (simulated)`],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Position manager address not configured\");\n }\n\n // Sort tokens (Uniswap V3 requires token0 < token1)\n const [token0, token1, rawAmount0, rawAmount1] =\n params.token_a.toLowerCase() < params.token_b.toLowerCase()\n ? [params.token_a, params.token_b, params.amount_a, params.amount_b]\n : [params.token_b, params.token_a, params.amount_b, params.amount_a];\n\n // V3 NPM mint: getLiquidityForAmounts uses min(L0, L1), so if either is 0\n // then liquidity=0 → revert. Use 1 wei minimum for single-side LP.\n const amount0 = rawAmount0 === 0n && rawAmount1 > 0n ? 1n : rawAmount0;\n const amount1 = rawAmount1 === 0n && rawAmount0 > 0n ? 1n : rawAmount1;\n\n const data = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"mint\",\n args: [\n {\n token0,\n token1,\n fee: this.fee,\n tickLower: -887220,\n tickUpper: 887220,\n amount0Desired: amount0,\n amount1Desired: amount1,\n amount0Min: 0n,\n amount1Min: 0n,\n recipient: params.recipient,\n deadline: BigInt(\"18446744073709551615\"),\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] Add liquidity`,\n to: pm,\n data,\n value: 0n,\n gas_estimate: 500_000,\n approvals: [\n { token: token0, spender: pm, amount: amount0 },\n { token: token1, spender: pm, amount: amount1 },\n ],\n };\n }\n\n async buildRemoveLiquidity(_params: RemoveLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] remove_liquidity requires tokenId — use NFT position manager directly`,\n );\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, decodeFunctionResult, decodeAbiParameters } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts)\",\n \"function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB, uint256 liquidity)\",\n \"function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB)\",\n \"function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts)\",\n]);\n\nconst lbQuoterAbi = parseAbi([\n \"function findBestPathFromAmountIn(address[] calldata route, uint128 amountIn) external view returns ((address[] route, address[] pairs, uint256[] binSteps, uint256[] versions, uint128[] amounts, uint128[] virtualAmountsWithoutSlippage, uint128[] fees))\",\n]);\n\nexport class UniswapV2Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly rpcUrl: string | undefined;\n private readonly lbQuoter: Address | undefined;\n private readonly lbIntermediaries: Address[];\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.lbQuoter = entry.contracts?.[\"lb_quoter\"];\n this.rpcUrl = rpcUrl;\n\n // Collect LB intermediary tokens from contracts with \"lb_mid_\" prefix\n this.lbIntermediaries = [];\n if (entry.contracts) {\n for (const [key, addr] of Object.entries(entry.contracts)) {\n if (key.startsWith(\"lb_mid_\")) {\n this.lbIntermediaries.push(addr);\n }\n }\n }\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const amountOutMin = 0n;\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n const path: Address[] = [params.token_in, params.token_out];\n\n const data = encodeFunctionData({\n abi,\n functionName: \"swapExactTokensForTokens\",\n args: [params.amount_in, amountOutMin, path, params.recipient, deadline],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokens via V2`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 150_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured\");\n }\n\n // Try LB (Liquidity Book) quote first if lb_quoter is configured\n if (this.lbQuoter) {\n try {\n return await this.lbQuote(params);\n } catch {\n // Fall through to V2 quote\n }\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const path: Address[] = [params.token_in, params.token_out];\n\n const result = await client.call({\n to: this.router,\n data: encodeFunctionData({\n abi,\n functionName: \"getAmountsOut\",\n args: [params.amount_in, path],\n }),\n });\n\n if (!result.data) {\n throw DefiError.rpcError(`[${this.protocolName}] getAmountsOut returned no data`);\n }\n\n const decoded = decodeFunctionResult({\n abi,\n functionName: \"getAmountsOut\",\n data: result.data,\n }) as unknown as bigint[];\n\n const amountOut = decoded[decoded.length - 1];\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut,\n price_impact_bps: undefined,\n fee_bps: 30,\n route: [`${params.token_in} -> ${params.token_out}`],\n };\n }\n\n private async lbQuote(params: QuoteParams): Promise<QuoteResult> {\n const client = createPublicClient({ transport: http(this.rpcUrl!) });\n\n // Build candidate routes: direct + multi-hop through each intermediary\n const routes: Address[][] = [[params.token_in, params.token_out]];\n const tokenInLower = params.token_in.toLowerCase();\n const tokenOutLower = params.token_out.toLowerCase();\n for (const mid of this.lbIntermediaries) {\n if (mid.toLowerCase() !== tokenInLower && mid.toLowerCase() !== tokenOutLower) {\n routes.push([params.token_in, mid, params.token_out]);\n }\n }\n\n const lbResultParams = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"route\", type: \"address[]\" as const },\n { name: \"pairs\", type: \"address[]\" as const },\n { name: \"binSteps\", type: \"uint256[]\" as const },\n { name: \"versions\", type: \"uint256[]\" as const },\n { name: \"amounts\", type: \"uint128[]\" as const },\n { name: \"virtualAmountsWithoutSlippage\", type: \"uint128[]\" as const },\n { name: \"fees\", type: \"uint128[]\" as const },\n ],\n },\n ] as const;\n\n let bestOut = 0n;\n let bestRoute: Address[] = [];\n\n const results = await Promise.allSettled(\n routes.map(async (route) => {\n const result = await client.call({\n to: this.lbQuoter!,\n data: encodeFunctionData({\n abi: lbQuoterAbi,\n functionName: \"findBestPathFromAmountIn\",\n args: [route, params.amount_in],\n }),\n });\n if (!result.data) return { amountOut: 0n, route };\n const [quote] = decodeAbiParameters(lbResultParams, result.data);\n const amounts = quote.amounts;\n return { amountOut: amounts[amounts.length - 1], route };\n }),\n );\n\n for (const r of results) {\n if (r.status === \"fulfilled\" && r.value.amountOut > bestOut) {\n bestOut = r.value.amountOut;\n bestRoute = r.value.route;\n }\n }\n\n if (bestOut === 0n) {\n throw DefiError.rpcError(`[${this.protocolName}] LB quote returned zero for all routes`);\n }\n\n return {\n protocol: this.protocolName,\n amount_out: bestOut,\n price_impact_bps: undefined,\n fee_bps: undefined,\n route: [bestRoute.map((a) => a.slice(0, 10)).join(\" -> \") + \" (LB)\"],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"addLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n params.amount_a,\n params.amount_b,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Add liquidity V2`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [\n { token: params.token_a, spender: this.router, amount: params.amount_a },\n { token: params.token_b, spender: this.router, amount: params.amount_b },\n ],\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"removeLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n params.liquidity,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Remove liquidity V2`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, decodeAbiParameters, concatHex, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"struct ExactInputSingleParams { address tokenIn; address tokenOut; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 limitSqrtPrice; }\",\n \"function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut)\",\n]);\n\n// Algebra Integral quoter: path = tokenIn(20) + deployer(20) + tokenOut(20) per hop\n// Returns arrays for multi-hop results\nconst algebraQuoterAbi = parseAbi([\n \"function quoteExactInput(bytes memory path, uint256 amountIn) external returns (uint256[] memory amountOutList, uint256[] memory amountInList, uint160[] memory sqrtPriceX96AfterList, uint32[] memory initializedTicksCrossedList, uint256 gasEstimate, uint16[] memory feeList)\",\n]);\n\n// Algebra V2 / NEST-style quoter: single-hop struct\n// selector: 0x5e5e6e0f quoteExactInputSingle((address,address,uint256,uint160))\n// returns: (uint256 amountOut, uint256 amountIn, uint160 sqrtPriceX96After)\nconst algebraSingleQuoterAbi = parseAbi([\n \"function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint160 limitSqrtPrice) params) external returns (uint256 amountOut, uint256 amountIn, uint160 sqrtPriceX96After)\",\n]);\n\n// Algebra NonfungiblePositionManager (no fee field, uses plugin instead)\nconst algebraPositionManagerAbi = parseAbi([\n \"struct MintParams { address token0; address token1; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; }\",\n \"function mint(MintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n]);\n\nexport class AlgebraV3Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly quoter: Address | undefined;\n private readonly positionManager: Address | undefined;\n private readonly rpcUrl: string | undefined;\n // NEST and similar forks expose quoteExactInputSingle((address,address,uint256,uint160))\n // instead of path-based quoteExactInput. Detected by presence of pool_deployer in config.\n private readonly useSingleQuoter: boolean;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.quoter = entry.contracts?.[\"quoter\"];\n this.positionManager = entry.contracts?.[\"position_manager\"];\n this.rpcUrl = rpcUrl;\n // pool_deployer present → NEST-style single-hop struct quoter\n this.useSingleQuoter = entry.contracts?.[\"pool_deployer\"] !== undefined;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n const amountOutMinimum = 0n;\n\n const data = encodeFunctionData({\n abi,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n recipient: params.recipient,\n deadline,\n amountIn: params.amount_in,\n amountOutMinimum,\n limitSqrtPrice: 0n,\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokenIn for tokenOut`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 250_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured\");\n }\n if (!this.quoter) {\n throw DefiError.unsupported(\n `[${this.protocolName}] No quoter contract configured`,\n );\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // NEST and similar forks: use single-hop struct quoter\n if (this.useSingleQuoter) {\n const result = await client.call({\n to: this.quoter,\n data: encodeFunctionData({\n abi: algebraSingleQuoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n amountIn: params.amount_in,\n limitSqrtPrice: 0n,\n },\n ],\n }),\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] quoteExactInputSingle failed: ${e}`);\n });\n\n if (!result.data || result.data.length < 66) {\n throw DefiError.rpcError(`[${this.protocolName}] quoter returned empty data`);\n }\n\n const [amountOut] = decodeAbiParameters(\n [\n { name: \"amountOut\", type: \"uint256\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"sqrtPriceX96After\", type: \"uint160\" },\n ],\n result.data,\n );\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut as bigint,\n price_impact_bps: undefined,\n fee_bps: undefined,\n route: [`${params.token_in} -> ${params.token_out}`],\n };\n }\n\n // KittenSwap and standard Algebra Integral path: tokenIn(20) + deployer(20) + tokenOut(20) = 60 bytes\n // Standard pools use deployer=address(0) in path (CREATE2 salt without deployer prefix)\n const path = concatHex([params.token_in, zeroAddress as Address, params.token_out]);\n\n const result = await client.call({\n to: this.quoter,\n data: encodeFunctionData({\n abi: algebraQuoterAbi,\n functionName: \"quoteExactInput\",\n args: [path, params.amount_in],\n }),\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] quoteExactInput failed: ${e}`);\n });\n\n if (!result.data || result.data.length < 66) {\n throw DefiError.rpcError(`[${this.protocolName}] quoter returned empty data`);\n }\n\n // Decode first element: amountOutList is an array, take the last element\n const decoded = decodeAbiParameters(\n [\n { name: \"amountOutList\", type: \"uint256[]\" },\n { name: \"amountInList\", type: \"uint256[]\" },\n { name: \"sqrtPriceX96AfterList\", type: \"uint160[]\" },\n { name: \"initializedTicksCrossedList\", type: \"uint32[]\" },\n { name: \"gasEstimate\", type: \"uint256\" },\n { name: \"feeList\", type: \"uint16[]\" },\n ],\n result.data,\n );\n\n const amountOutList = decoded[0] as readonly bigint[];\n const feeList = decoded[5] as readonly number[];\n const amountOut = amountOutList[amountOutList.length - 1];\n const fee = feeList.length > 0 ? feeList[0] : undefined;\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut,\n price_impact_bps: undefined,\n fee_bps: fee !== undefined ? Math.floor(fee / 10) : undefined,\n route: [`${params.token_in} -> ${params.token_out}`],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Position manager address not configured\");\n }\n\n // Sort tokens (Algebra requires token0 < token1)\n const [token0, token1, rawAmount0, rawAmount1] =\n params.token_a.toLowerCase() < params.token_b.toLowerCase()\n ? [params.token_a, params.token_b, params.amount_a, params.amount_b]\n : [params.token_b, params.token_a, params.amount_b, params.amount_a];\n\n // Prevent liquidity=0 revert for single-side LP (same as V3)\n const amount0 = rawAmount0 === 0n && rawAmount1 > 0n ? 1n : rawAmount0;\n const amount1 = rawAmount1 === 0n && rawAmount0 > 0n ? 1n : rawAmount1;\n\n const data = encodeFunctionData({\n abi: algebraPositionManagerAbi,\n functionName: \"mint\",\n args: [\n {\n token0,\n token1,\n tickLower: -887220,\n tickUpper: 887220,\n amount0Desired: amount0,\n amount1Desired: amount1,\n amount0Min: 0n,\n amount1Min: 0n,\n recipient: params.recipient,\n deadline: BigInt(\"18446744073709551615\"),\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] Add liquidity`,\n to: pm,\n data,\n value: 0n,\n gas_estimate: 500_000,\n approvals: [\n { token: token0, spender: pm, amount: amount0 },\n { token: token1, spender: pm, amount: amount1 },\n ],\n };\n }\n\n async buildRemoveLiquidity(_params: RemoveLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] remove_liquidity requires tokenId — use NFT position manager directly`,\n );\n }\n}\n","import { encodeFunctionData, parseAbi, zeroAddress } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"function swapSingleTokenExactIn(address pool, address tokenIn, address tokenOut, uint256 exactAmountIn, uint256 minAmountOut, uint256 deadline, bool wethIsEth, bytes calldata userData) external returns (uint256 amountOut)\",\n]);\n\nexport class BalancerV3Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract\");\n }\n this.router = router;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const minAmountOut = 0n;\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n\n // Balancer V3 requires a pool address. For now use a simplified single-pool swap.\n // In production, the pool would be resolved from the registry or an on-chain query.\n const data = encodeFunctionData({\n abi,\n functionName: \"swapSingleTokenExactIn\",\n args: [\n zeroAddress, // TODO: resolve pool from registry\n params.token_in,\n params.token_out,\n params.amount_in,\n minAmountOut,\n deadline,\n false,\n \"0x\",\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} via Balancer V3`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote requires RPC`);\n }\n\n async buildAddLiquidity(_params: AddLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] add_liquidity requires pool-specific params`);\n }\n\n async buildRemoveLiquidity(_params: RemoveLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] remove_liquidity requires pool-specific params`);\n }\n}\n","import { encodeFunctionData, parseAbi } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst poolAbi = parseAbi([\n \"function exchange(int128 i, int128 j, uint256 dx, uint256 min_dy) external returns (uint256)\",\n \"function get_dy(int128 i, int128 j, uint256 dx) external view returns (uint256)\",\n \"function add_liquidity(uint256[2] amounts, uint256 min_mint_amount) external returns (uint256)\",\n \"function remove_liquidity(uint256 amount, uint256[2] min_amounts) external returns (uint256[2])\",\n]);\n\nexport class CurveStableSwapAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n // Direct pool exchange: swap token at index 0 for token at index 1.\n // The `router` address is treated as the pool address for direct swaps.\n // Callers should set the pool address as the \"router\" contract in the registry\n // when targeting a specific Curve pool.\n // Without prior quote, set min output to 0. Use quote() first for slippage protection.\n const minDy = 0n;\n\n const data = encodeFunctionData({\n abi: poolAbi,\n functionName: \"exchange\",\n args: [0n, 1n, params.amount_in, minDy],\n });\n\n return {\n description: `[${this.protocolName}] Curve pool exchange ${params.amount_in} tokens (index 0 -> 1)`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote requires RPC connection`);\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n // Add liquidity to a 2-token Curve pool\n const data = encodeFunctionData({\n abi: poolAbi,\n functionName: \"add_liquidity\",\n args: [[params.amount_a, params.amount_b], 0n],\n });\n\n return {\n description: `[${this.protocolName}] Curve add liquidity`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n // Remove liquidity from a 2-token Curve pool\n const data = encodeFunctionData({\n abi: poolAbi,\n functionName: \"remove_liquidity\",\n args: [params.liquidity, [0n, 0n]],\n });\n\n return {\n description: `[${this.protocolName}] Curve remove liquidity`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, decodeAbiParameters } from \"viem\";\nimport type { Address, PublicClient } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"struct Route { address from; address to; bool stable; }\",\n \"function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, (address from, address to, bool stable)[] calldata routes, address to, uint256 deadline) external returns (uint256[] memory amounts)\",\n \"function getAmountsOut(uint256 amountIn, (address from, address to, bool stable)[] calldata routes) external view returns (uint256[] memory amounts)\",\n \"function addLiquidity(address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB, uint256 liquidity)\",\n \"function removeLiquidity(address tokenA, address tokenB, bool stable, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB)\",\n]);\n\n// Velodrome V2 / Aerodrome style: Route includes factory address\nconst abiV2 = parseAbi([\n \"function getAmountsOut(uint256 amountIn, (address from, address to, bool stable, address factory)[] calldata routes) external view returns (uint256[] memory amounts)\",\n]);\n\nexport class SolidlyAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n /** Default to volatile (false). True for stablecoin pairs. */\n private readonly defaultStable: boolean;\n private readonly rpcUrl: string | undefined;\n /** Factory address — present on Velodrome V2 / Aerodrome forks */\n private readonly factory: Address | undefined;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.defaultStable = false;\n this.rpcUrl = rpcUrl;\n this.factory = entry.contracts?.[\"factory\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const amountOutMin = 0n;\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n\n const routes = [\n { from: params.token_in, to: params.token_out, stable: this.defaultStable },\n ];\n\n const data = encodeFunctionData({\n abi,\n functionName: \"swapExactTokensForTokens\",\n args: [params.amount_in, amountOutMin, routes, params.recipient, deadline],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokens via Solidly`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n private async callGetAmountsOut(\n client: PublicClient,\n callData: `0x${string}`,\n ): Promise<bigint> {\n const result = await client.call({ to: this.router, data: callData });\n if (!result.data) return 0n;\n const [amounts] = decodeAbiParameters(\n [{ name: \"amounts\", type: \"uint256[]\" }],\n result.data,\n );\n return amounts.length >= 2 ? amounts[amounts.length - 1] : 0n;\n }\n\n private encodeV1(params: QuoteParams, stable: boolean): `0x${string}` {\n return encodeFunctionData({\n abi,\n functionName: \"getAmountsOut\",\n args: [params.amount_in, [{ from: params.token_in, to: params.token_out, stable }]],\n });\n }\n\n private encodeV2(params: QuoteParams, stable: boolean): `0x${string}` {\n return encodeFunctionData({\n abi: abiV2,\n functionName: \"getAmountsOut\",\n args: [params.amount_in, [{ from: params.token_in, to: params.token_out, stable, factory: this.factory! }]],\n });\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // Try all combinations: [volatile, stable] x [V1 ABI, V2 ABI (if factory present)]\n // Pick the best (highest amountOut)\n const candidates: Array<{ callData: `0x${string}`; stable: boolean }> = [\n { callData: this.encodeV1(params, false), stable: false },\n { callData: this.encodeV1(params, true), stable: true },\n ];\n if (this.factory) {\n candidates.unshift(\n { callData: this.encodeV2(params, false), stable: false },\n { callData: this.encodeV2(params, true), stable: true },\n );\n }\n\n const results = await Promise.allSettled(\n candidates.map((c) => this.callGetAmountsOut(client, c.callData)),\n );\n\n let bestOut = 0n;\n let bestStable = false;\n for (let i = 0; i < results.length; i++) {\n const r = results[i];\n if (r.status === \"fulfilled\" && r.value > bestOut) {\n bestOut = r.value;\n bestStable = candidates[i].stable;\n }\n }\n\n if (bestOut === 0n) {\n throw DefiError.rpcError(`[${this.protocolName}] getAmountsOut returned zero for all routes`);\n }\n\n return {\n protocol: this.protocolName,\n amount_out: bestOut,\n price_impact_bps: undefined,\n fee_bps: bestStable ? 4 : 20,\n route: [`${params.token_in} -> ${params.token_out} (stable: ${bestStable})`],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"addLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n this.defaultStable,\n params.amount_a,\n params.amount_b,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Add liquidity (Solidly)`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 350_000,\n approvals: [\n { token: params.token_a, spender: this.router, amount: params.amount_a },\n { token: params.token_b, spender: this.router, amount: params.amount_b },\n ],\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"removeLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n this.defaultStable,\n params.liquidity,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Remove liquidity (Solidly)`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, zeroAddress } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"function swap(address fromToken, address toToken, uint256 fromAmount, uint256 minToAmount, address to, address rebateTo) external payable returns (uint256 realToAmount)\",\n]);\n\nexport class WooFiAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract\");\n }\n this.router = router;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const minToAmount = 0n;\n\n const data = encodeFunctionData({\n abi,\n functionName: \"swap\",\n args: [\n params.token_in,\n params.token_out,\n params.amount_in,\n minToAmount,\n params.recipient,\n zeroAddress,\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} via WOOFi`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote requires RPC`);\n }\n\n async buildAddLiquidity(_params: AddLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] WOOFi does not support LP positions via router`);\n }\n\n async buildRemoveLiquidity(_params: RemoveLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] WOOFi does not support LP positions via router`);\n }\n}\n","import { createPublicClient, encodeFunctionData, http, parseAbi, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IGaugeSystem,\n ProtocolEntry,\n RewardInfo,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst gaugeAbi = parseAbi([\n \"function deposit(uint256 amount) external\",\n \"function depositFor(uint256 amount, uint256 tokenId) external\",\n \"function withdraw(uint256 amount) external\",\n \"function getReward(address account) external\",\n \"function getReward(address account, address[] tokens) external\",\n \"function earned(address account) external view returns (uint256)\",\n \"function earned(address token, address account) external view returns (uint256)\",\n \"function rewardRate() external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function rewardsListLength() external view returns (uint256)\",\n \"function isReward(address token) external view returns (bool)\",\n]);\n\nconst veAbi = parseAbi([\n \"function create_lock(uint256 value, uint256 lock_duration) external returns (uint256)\",\n \"function increase_amount(uint256 tokenId, uint256 value) external\",\n \"function increase_unlock_time(uint256 tokenId, uint256 lock_duration) external\",\n \"function withdraw(uint256 tokenId) external\",\n \"function balanceOfNFT(uint256 tokenId) external view returns (uint256)\",\n \"function locked(uint256 tokenId) external view returns (uint256 amount, uint256 end)\",\n]);\n\nconst voterAbi = parseAbi([\n \"function vote(uint256 tokenId, address[] calldata pools, uint256[] calldata weights) external\",\n \"function claimBribes(address[] calldata bribes, address[][] calldata tokens, uint256 tokenId) external\",\n \"function claimFees(address[] calldata fees, address[][] calldata tokens, uint256 tokenId) external\",\n \"function gauges(address pool) external view returns (address)\",\n]);\n\nexport class SolidlyGaugeAdapter implements IGaugeSystem {\n private readonly protocolName: string;\n private readonly voter: Address;\n private readonly veToken: Address;\n private readonly rpcUrl: string | undefined;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const voter = entry.contracts?.[\"voter\"];\n if (!voter) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'voter' contract\");\n }\n const veToken = entry.contracts?.[\"ve_token\"];\n if (!veToken) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 've_token' contract\");\n }\n this.voter = voter;\n this.veToken = veToken;\n this.rpcUrl = rpcUrl;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n // IGauge\n\n async buildDeposit(gauge: Address, amount: bigint, tokenId?: bigint, lpToken?: Address): Promise<DeFiTx> {\n if (tokenId !== undefined) {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"depositFor\",\n args: [amount, tokenId],\n });\n return {\n description: `[${this.protocolName}] Deposit ${amount} LP to gauge (boost veNFT #${tokenId})`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: lpToken ? [{ token: lpToken, spender: gauge, amount }] : undefined,\n };\n }\n\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"deposit\",\n args: [amount],\n });\n return {\n description: `[${this.protocolName}] Deposit ${amount} LP to gauge`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: lpToken ? [{ token: lpToken, spender: gauge, amount }] : undefined,\n };\n }\n\n async buildWithdraw(gauge: Address, amount: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"withdraw\",\n args: [amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${amount} LP from gauge`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildClaimRewards(gauge: Address, account?: Address): Promise<DeFiTx> {\n // Ramses V2 gauges use getReward(address account, address[] tokens)\n // where account must equal msg.sender. Try to discover reward tokens via RPC.\n if (account && this.rpcUrl) {\n try {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const listLen = await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"rewardsListLength\",\n }) as bigint;\n if (listLen > 0n) {\n // Discover reward tokens by checking isReward against known tokens\n // For Ramses V2, use the voter to find reward tokens\n // Alternatively, scan storage: the gauge exposes earned(token, account)\n // We'll pass empty tokens array and let the gauge figure it out,\n // or pass a placeholder. Since we know RAM is the reward token\n // from the gauge context, we need to enumerate them.\n // Fallback: use getReward(account, []) — some implementations accept empty array\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [account, [] as Address[]],\n });\n return {\n description: `[${this.protocolName}] Claim gauge rewards`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n } catch {\n // fall through to default\n }\n }\n\n // Standard Solidly V2 gauge: getReward(address account)\n // account param will be overridden by msg.sender in most gauge implementations\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [account ?? zeroAddress],\n });\n return {\n description: `[${this.protocolName}] Claim gauge rewards`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async getPendingRewards(_gauge: Address, _user: Address): Promise<RewardInfo[]> {\n throw DefiError.unsupported(`[${this.protocolName}] get_pending_rewards requires RPC`);\n }\n\n // IVoteEscrow\n\n async buildCreateLock(amount: bigint, lockDuration: number): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"create_lock\",\n args: [amount, BigInt(lockDuration)],\n });\n return {\n description: `[${this.protocolName}] Create veNFT lock: ${amount} tokens for ${lockDuration}s`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildIncreaseAmount(tokenId: bigint, amount: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"increase_amount\",\n args: [tokenId, amount],\n });\n return {\n description: `[${this.protocolName}] Increase veNFT #${tokenId} by ${amount}`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildIncreaseUnlockTime(tokenId: bigint, lockDuration: number): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"increase_unlock_time\",\n args: [tokenId, BigInt(lockDuration)],\n });\n return {\n description: `[${this.protocolName}] Extend veNFT #${tokenId} lock by ${lockDuration}s`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildWithdrawExpired(tokenId: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"withdraw\",\n args: [tokenId],\n });\n return {\n description: `[${this.protocolName}] Withdraw expired veNFT #${tokenId}`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n // IVoter\n\n async buildVote(tokenId: bigint, pools: Address[], weights: bigint[]): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: voterAbi,\n functionName: \"vote\",\n args: [tokenId, pools, weights],\n });\n return {\n description: `[${this.protocolName}] Vote with veNFT #${tokenId}`,\n to: this.voter,\n data,\n value: 0n,\n gas_estimate: 500_000,\n };\n }\n\n async buildClaimBribes(bribes: Address[], tokenId: bigint): Promise<DeFiTx> {\n // claimBribes needs token arrays per bribe contract — simplified version\n const tokensPerBribe: Address[][] = bribes.map(() => []);\n const data = encodeFunctionData({\n abi: voterAbi,\n functionName: \"claimBribes\",\n args: [bribes, tokensPerBribe, tokenId],\n });\n return {\n description: `[${this.protocolName}] Claim bribes for veNFT #${tokenId}`,\n to: this.voter,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildClaimFees(fees: Address[], tokenId: bigint): Promise<DeFiTx> {\n const tokensPerFee: Address[][] = fees.map(() => []);\n const data = encodeFunctionData({\n abi: voterAbi,\n functionName: \"claimFees\",\n args: [fees, tokensPerFee, tokenId],\n });\n return {\n description: `[${this.protocolName}] Claim trading fees for veNFT #${tokenId}`,\n to: this.voter,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IGauge,\n ProtocolEntry,\n RewardInfo,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst masterchefAbi = parseAbi([\n \"function deposit(uint256 pid, uint256 amount) external\",\n \"function withdraw(uint256 pid, uint256 amount) external\",\n \"function claim(uint256[] calldata pids) external\",\n \"function pendingRewards(address account, uint256[] calldata pids) view returns (uint256[] memory moeRewards)\",\n \"function getNumberOfFarms() view returns (uint256)\",\n \"function getPidByPool(address pool) view returns (uint256)\",\n]);\n\nexport class MasterChefAdapter implements IGauge {\n private readonly protocolName: string;\n private readonly masterchef: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const masterchef = entry.contracts?.[\"masterchef\"];\n if (!masterchef) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'masterchef' contract\");\n }\n this.masterchef = masterchef;\n this.rpcUrl = rpcUrl;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n /**\n * Deposit LP tokens into a MasterChef farm.\n * `gauge` is the pool address (unused for calldata — MasterChef is the target).\n * `tokenId` carries the farm pid.\n */\n async buildDeposit(gauge: Address, amount: bigint, tokenId?: bigint): Promise<DeFiTx> {\n const pid = tokenId ?? 0n;\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"deposit\",\n args: [pid, amount],\n });\n return {\n description: `[${this.protocolName}] Deposit ${amount} LP to farm pid=${pid} (pool ${gauge})`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /**\n * Withdraw LP tokens from a MasterChef farm.\n * `gauge` is used to look up the pid description only; call site should pass pid via tokenId\n * on the deposit flow. Here pid defaults to 0 — callers should encode the pid in the gauge\n * address slot or wrap this adapter with a pid-aware helper.\n */\n async buildWithdraw(gauge: Address, amount: bigint): Promise<DeFiTx> {\n // IGauge interface does not carry tokenId on withdraw; default pid=0.\n // Callers that need a specific pid should call buildWithdrawPid directly.\n const pid = 0n;\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"withdraw\",\n args: [pid, amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${amount} LP from farm pid=${pid} (pool ${gauge})`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Withdraw LP tokens specifying a pid explicitly (MasterChef extension beyond IGauge). */\n async buildWithdrawPid(pid: bigint, amount: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"withdraw\",\n args: [pid, amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${amount} LP from farm pid=${pid}`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Claim pending MOE rewards. IGauge interface provides no pid — defaults to pid=0. */\n async buildClaimRewards(gauge: Address): Promise<DeFiTx> {\n const pid = 0n;\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"claim\",\n args: [[pid]],\n });\n return {\n description: `[${this.protocolName}] Claim MOE rewards for farm pid=${pid} (pool ${gauge})`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Claim pending MOE rewards for a specific pid (MasterChef extension beyond IGauge). */\n async buildClaimRewardsPid(pid: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"claim\",\n args: [[pid]],\n });\n return {\n description: `[${this.protocolName}] Claim MOE rewards for farm pid=${pid}`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Get pending MOE rewards for a user. Requires rpcUrl. */\n async getPendingRewards(_gauge: Address, user: Address): Promise<RewardInfo[]> {\n if (!this.rpcUrl) {\n throw DefiError.unsupported(`[${this.protocolName}] getPendingRewards requires RPC`);\n }\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const rewards = await client.readContract({\n address: this.masterchef,\n abi: masterchefAbi,\n functionName: \"pendingRewards\",\n args: [user, [0n]],\n });\n return (rewards as bigint[]).map((amount) => ({\n token: this.masterchef,\n symbol: \"MOE\",\n amount,\n }));\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n InterestRateMode,\n} from \"@hypurrquant/defi-core\";\n\nconst POOL_ABI = parseAbi([\n \"function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external\",\n \"function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf) external\",\n \"function repay(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf) external returns (uint256)\",\n \"function withdraw(address asset, uint256 amount, address to) external returns (uint256)\",\n \"function getUserAccountData(address user) external view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)\",\n \"function getReserveData(address asset) external view returns (uint256 configuration, uint128 liquidityIndex, uint128 currentLiquidityRate, uint128 variableBorrowIndex, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, uint16 id, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint128 accruedToTreasury, uint128 unbacked, uint128 isolationModeTotalDebt)\",\n]);\n\nconst ERC20_ABI = parseAbi([\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nconst INCENTIVES_ABI = parseAbi([\n \"function getIncentivesController() external view returns (address)\",\n]);\n\nconst REWARDS_CONTROLLER_ABI = parseAbi([\n \"function getRewardsByAsset(address asset) external view returns (address[])\",\n \"function getRewardsData(address asset, address reward) external view returns (uint256 index, uint256 emissionsPerSecond, uint256 lastUpdateTimestamp, uint256 distributionEnd)\",\n]);\n\nconst POOL_PROVIDER_ABI = parseAbi([\n \"function ADDRESSES_PROVIDER() external view returns (address)\",\n]);\n\nconst ADDRESSES_PROVIDER_ABI = parseAbi([\n \"function getPriceOracle() external view returns (address)\",\n]);\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n \"function BASE_CURRENCY_UNIT() external view returns (uint256)\",\n]);\n\nconst ERC20_DECIMALS_ABI = parseAbi([\n \"function decimals() external view returns (uint8)\",\n]);\n\nfunction u256ToF64(v: bigint): number {\n const MAX_U128 = (1n << 128n) - 1n;\n if (v > MAX_U128) return Infinity;\n return Number(v);\n}\n\nexport class AaveV3Adapter implements ILending {\n private readonly protocolName: string;\n private readonly pool: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const pool = entry.contracts?.[\"pool\"];\n if (!pool) throw DefiError.contractError(`[${entry.name}] Missing 'pool' contract address`);\n this.pool = pool;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"supply\",\n args: [params.asset, params.amount, params.on_behalf_of, 0],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"borrow\",\n args: [params.asset, params.amount, rateMode, 0, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"repay\",\n args: [params.asset, params.amount, rateMode, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const result = await client.readContract({\n address: this.pool,\n abi: POOL_ABI,\n functionName: \"getReserveData\",\n args: [asset],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getReserveData failed: ${e}`);\n });\n\n const RAY = 1e27;\n const SECONDS_PER_YEAR = 31536000;\n\n // Convert ray rate to APY: ((1 + rate/SECONDS_PER_YEAR)^SECONDS_PER_YEAR - 1) * 100\n const toApy = (rayRate: bigint): number => {\n const rate = Number(rayRate) / RAY;\n return (Math.pow(1 + rate / SECONDS_PER_YEAR, SECONDS_PER_YEAR) - 1) * 100;\n };\n\n const supplyRate = toApy(result[2]);\n const variableRate = toApy(result[4]);\n const stableRate = toApy(result[5]);\n\n const aTokenAddress = result[8] as Address;\n const variableDebtTokenAddress = result[10] as Address;\n\n const [totalSupply, totalBorrow] = await Promise.all([\n client.readContract({\n address: aTokenAddress,\n abi: ERC20_ABI,\n functionName: \"totalSupply\",\n }).catch(() => 0n),\n client.readContract({\n address: variableDebtTokenAddress,\n abi: ERC20_ABI,\n functionName: \"totalSupply\",\n }).catch(() => 0n),\n ]);\n\n const utilization = totalSupply > 0n\n ? Number((totalBorrow * 10000n) / totalSupply) / 100\n : 0;\n\n // Fetch incentive/reward data (best-effort, never breaks base rates)\n const supplyRewardTokens: string[] = [];\n const borrowRewardTokens: string[] = [];\n const supplyEmissions: string[] = [];\n const borrowEmissions: string[] = [];\n\n try {\n const controllerAddr = await client.readContract({\n address: aTokenAddress,\n abi: INCENTIVES_ABI,\n functionName: \"getIncentivesController\",\n });\n\n if (controllerAddr && controllerAddr !== zeroAddress) {\n const [supplyRewards, borrowRewards] = await Promise.all([\n client.readContract({\n address: controllerAddr,\n abi: REWARDS_CONTROLLER_ABI,\n functionName: \"getRewardsByAsset\",\n args: [aTokenAddress],\n }).catch(() => [] as Address[]),\n client.readContract({\n address: controllerAddr,\n abi: REWARDS_CONTROLLER_ABI,\n functionName: \"getRewardsByAsset\",\n args: [variableDebtTokenAddress],\n }).catch(() => [] as Address[]),\n ]);\n\n // Fetch emissions data for supply rewards\n const supplyDataPromises = supplyRewards.map((reward) =>\n client.readContract({\n address: controllerAddr,\n abi: REWARDS_CONTROLLER_ABI,\n functionName: \"getRewardsData\",\n args: [aTokenAddress, reward],\n }).catch(() => null),\n );\n const supplyData = await Promise.all(supplyDataPromises);\n for (let i = 0; i < supplyRewards.length; i++) {\n const data = supplyData[i];\n if (data && data[1] > 0n) {\n supplyRewardTokens.push(supplyRewards[i]);\n supplyEmissions.push(data[1].toString());\n }\n }\n\n // Fetch emissions data for borrow rewards\n const borrowDataPromises = borrowRewards.map((reward) =>\n client.readContract({\n address: controllerAddr,\n abi: REWARDS_CONTROLLER_ABI,\n functionName: \"getRewardsData\",\n args: [variableDebtTokenAddress, reward],\n }).catch(() => null),\n );\n const borrowData = await Promise.all(borrowDataPromises);\n for (let i = 0; i < borrowRewards.length; i++) {\n const data = borrowData[i];\n if (data && data[1] > 0n) {\n borrowRewardTokens.push(borrowRewards[i]);\n borrowEmissions.push(data[1].toString());\n }\n }\n }\n } catch {\n // Incentives not supported by this deployment — silently ignore\n }\n\n // Calculate incentive APY from emissions using oracle prices\n let supplyIncentiveApy: number | undefined;\n let borrowIncentiveApy: number | undefined;\n\n const hasSupplyRewards = supplyRewardTokens.length > 0;\n const hasBorrowRewards = borrowRewardTokens.length > 0;\n\n if ((hasSupplyRewards || hasBorrowRewards) && totalSupply > 0n) {\n try {\n // Pool → AddressesProvider → Oracle\n const providerAddr = await client.readContract({\n address: this.pool,\n abi: POOL_PROVIDER_ABI,\n functionName: \"ADDRESSES_PROVIDER\",\n });\n const oracleAddr = await client.readContract({\n address: providerAddr,\n abi: ADDRESSES_PROVIDER_ABI,\n functionName: \"getPriceOracle\",\n });\n const [assetPrice, baseCurrencyUnit, assetDecimals] = await Promise.all([\n client.readContract({\n address: oracleAddr,\n abi: ORACLE_ABI,\n functionName: \"getAssetPrice\",\n args: [asset],\n }),\n client.readContract({\n address: oracleAddr,\n abi: ORACLE_ABI,\n functionName: \"BASE_CURRENCY_UNIT\",\n }),\n client.readContract({\n address: asset,\n abi: ERC20_DECIMALS_ABI,\n functionName: \"decimals\",\n }).catch(() => 18),\n ]);\n\n const priceUnit = Number(baseCurrencyUnit);\n const assetPriceF = Number(assetPrice) / priceUnit;\n const assetDecimalsDivisor = 10 ** assetDecimals;\n\n // Supply-side incentive APY\n if (hasSupplyRewards) {\n let totalSupplyIncentiveUsdPerYear = 0;\n const totalSupplyUsd = (Number(totalSupply) / assetDecimalsDivisor) * assetPriceF;\n\n for (let i = 0; i < supplyRewardTokens.length; i++) {\n const emissionPerSec = BigInt(supplyEmissions[i]);\n const [rewardPrice, rewardDecimals] = await Promise.all([\n client.readContract({\n address: oracleAddr,\n abi: ORACLE_ABI,\n functionName: \"getAssetPrice\",\n args: [supplyRewardTokens[i] as Address],\n }).catch(() => 0n),\n client.readContract({\n address: supplyRewardTokens[i] as Address,\n abi: ERC20_DECIMALS_ABI,\n functionName: \"decimals\",\n }).catch(() => 18),\n ]);\n if (rewardPrice > 0n) {\n const rewardPriceF = Number(rewardPrice) / priceUnit;\n const emissionPerYear = (Number(emissionPerSec) / (10 ** rewardDecimals)) * SECONDS_PER_YEAR;\n totalSupplyIncentiveUsdPerYear += emissionPerYear * rewardPriceF;\n }\n }\n if (totalSupplyUsd > 0) {\n supplyIncentiveApy = (totalSupplyIncentiveUsdPerYear / totalSupplyUsd) * 100;\n }\n }\n\n // Borrow-side incentive APY\n if (hasBorrowRewards && totalBorrow > 0n) {\n let totalBorrowIncentiveUsdPerYear = 0;\n const totalBorrowUsd = (Number(totalBorrow) / assetDecimalsDivisor) * assetPriceF;\n\n for (let i = 0; i < borrowRewardTokens.length; i++) {\n const emissionPerSec = BigInt(borrowEmissions[i]);\n const [rewardPrice, rewardDecimals] = await Promise.all([\n client.readContract({\n address: oracleAddr,\n abi: ORACLE_ABI,\n functionName: \"getAssetPrice\",\n args: [borrowRewardTokens[i] as Address],\n }).catch(() => 0n),\n client.readContract({\n address: borrowRewardTokens[i] as Address,\n abi: ERC20_DECIMALS_ABI,\n functionName: \"decimals\",\n }).catch(() => 18),\n ]);\n if (rewardPrice > 0n) {\n const rewardPriceF = Number(rewardPrice) / priceUnit;\n const emissionPerYear = (Number(emissionPerSec) / (10 ** rewardDecimals)) * SECONDS_PER_YEAR;\n totalBorrowIncentiveUsdPerYear += emissionPerYear * rewardPriceF;\n }\n }\n if (totalBorrowUsd > 0) {\n borrowIncentiveApy = (totalBorrowIncentiveUsdPerYear / totalBorrowUsd) * 100;\n }\n }\n } catch {\n // Oracle not available — skip incentive APY calculation\n }\n }\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyRate,\n borrow_variable_apy: variableRate,\n borrow_stable_apy: stableRate,\n utilization,\n total_supply: totalSupply,\n total_borrow: totalBorrow,\n ...(hasSupplyRewards && {\n supply_reward_tokens: supplyRewardTokens,\n supply_emissions_per_second: supplyEmissions,\n }),\n ...(hasBorrowRewards && {\n borrow_reward_tokens: borrowRewardTokens,\n borrow_emissions_per_second: borrowEmissions,\n }),\n ...(supplyIncentiveApy !== undefined && { supply_incentive_apy: supplyIncentiveApy }),\n ...(borrowIncentiveApy !== undefined && { borrow_incentive_apy: borrowIncentiveApy }),\n };\n }\n\n async getUserPosition(user: Address): Promise<UserPosition> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const result = await client.readContract({\n address: this.pool,\n abi: POOL_ABI,\n functionName: \"getUserAccountData\",\n args: [user],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getUserAccountData failed: ${e}`);\n });\n\n const [totalCollateralBase, totalDebtBase, , , ltv, healthFactor] = result;\n const MAX_UINT256 = 2n ** 256n - 1n;\n const hf = healthFactor >= MAX_UINT256 ? Infinity : Number(healthFactor) / 1e18;\n const collateralUsd = u256ToF64(totalCollateralBase) / 1e8;\n const debtUsd = u256ToF64(totalDebtBase) / 1e8;\n const ltvBps = u256ToF64(ltv);\n\n const supplies = collateralUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Collateral\", amount: totalCollateralBase, value_usd: collateralUsd }]\n : [];\n const borrows = debtUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Debt\", amount: totalDebtBase, value_usd: debtUsd }]\n : [];\n\n return {\n protocol: this.protocolName,\n user,\n supplies,\n borrows,\n health_factor: hf,\n net_apy: ltvBps / 100,\n };\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n InterestRateMode,\n} from \"@hypurrquant/defi-core\";\n\n// V2 uses deposit/borrow/repay/withdraw (same as V3 for borrow/repay/withdraw)\nconst POOL_ABI = parseAbi([\n \"function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external\",\n \"function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf) external\",\n \"function repay(address asset, uint256 amount, uint256 rateMode, address onBehalfOf) external returns (uint256)\",\n \"function withdraw(address asset, uint256 amount, address to) external returns (uint256)\",\n \"function getUserAccountData(address user) external view returns (uint256 totalCollateralETH, uint256 totalDebtETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)\",\n // V2 getReserveData: 12 fields (no accruedToTreasury/unbacked/isolationModeTotalDebt)\n // positions: [0]=configuration, [1]=liquidityIndex, [2]=variableBorrowIndex,\n // [3]=currentLiquidityRate, [4]=currentVariableBorrowRate, [5]=currentStableBorrowRate,\n // [6]=lastUpdateTimestamp, [7]=aTokenAddress, [8]=stableDebtTokenAddress,\n // [9]=variableDebtTokenAddress, [10]=interestRateStrategyAddress, [11]=id\n \"function getReserveData(address asset) external view returns (uint256 configuration, uint128 liquidityIndex, uint128 variableBorrowIndex, uint128 currentLiquidityRate, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint8 id)\",\n]);\n\nconst ERC20_ABI = parseAbi([\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nfunction u256ToF64(v: bigint): number {\n const MAX_U128 = (1n << 128n) - 1n;\n if (v > MAX_U128) return Infinity;\n return Number(v);\n}\n\nexport class AaveV2Adapter implements ILending {\n private readonly protocolName: string;\n private readonly pool: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const pool = entry.contracts?.[\"pool\"];\n if (!pool) throw DefiError.contractError(`[${entry.name}] Missing 'pool' contract address`);\n this.pool = pool;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"deposit\",\n args: [params.asset, params.amount, params.on_behalf_of, 0],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"borrow\",\n args: [params.asset, params.amount, rateMode, 0, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"repay\",\n args: [params.asset, params.amount, rateMode, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const result = await client.readContract({\n address: this.pool,\n abi: POOL_ABI,\n functionName: \"getReserveData\",\n args: [asset],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getReserveData failed: ${e}`);\n });\n\n const RAY = 1e27;\n const SECONDS_PER_YEAR = 31536000;\n\n // Convert ray rate to APY: ((1 + rate/SECONDS_PER_YEAR)^SECONDS_PER_YEAR - 1) * 100\n const toApy = (rayRate: bigint): number => {\n const rate = Number(rayRate) / RAY;\n return (Math.pow(1 + rate / SECONDS_PER_YEAR, SECONDS_PER_YEAR) - 1) * 100;\n };\n\n // V2 field positions:\n // [3] = currentLiquidityRate, [4] = currentVariableBorrowRate, [5] = currentStableBorrowRate\n // [7] = aTokenAddress, [9] = variableDebtTokenAddress\n const supplyRate = toApy(result[3]);\n const variableRate = toApy(result[4]);\n const stableRate = toApy(result[5]);\n\n const aTokenAddress = result[7] as Address;\n const variableDebtTokenAddress = result[9] as Address;\n\n const [totalSupply, totalBorrow] = await Promise.all([\n client.readContract({\n address: aTokenAddress,\n abi: ERC20_ABI,\n functionName: \"totalSupply\",\n }).catch(() => 0n),\n client.readContract({\n address: variableDebtTokenAddress,\n abi: ERC20_ABI,\n functionName: \"totalSupply\",\n }).catch(() => 0n),\n ]);\n\n const utilization = totalSupply > 0n\n ? Number((totalBorrow * 10000n) / totalSupply) / 100\n : 0;\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyRate,\n borrow_variable_apy: variableRate,\n borrow_stable_apy: stableRate,\n utilization,\n total_supply: totalSupply,\n total_borrow: totalBorrow,\n };\n }\n\n async getUserPosition(user: Address): Promise<UserPosition> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const result = await client.readContract({\n address: this.pool,\n abi: POOL_ABI,\n functionName: \"getUserAccountData\",\n args: [user],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getUserAccountData failed: ${e}`);\n });\n\n const [totalCollateralBase, totalDebtBase, , , ltv, healthFactor] = result;\n const MAX_UINT256 = 2n ** 256n - 1n;\n const hf = healthFactor >= MAX_UINT256 ? Infinity : Number(healthFactor) / 1e18;\n // V2 returns values in ETH (18 decimals) vs V3's base currency (8 decimals)\n const collateralUsd = u256ToF64(totalCollateralBase) / 1e18;\n const debtUsd = u256ToF64(totalDebtBase) / 1e18;\n const ltvBps = u256ToF64(ltv);\n\n const supplies = collateralUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Collateral\", amount: totalCollateralBase, value_usd: collateralUsd }]\n : [];\n const borrows = debtUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Debt\", amount: totalDebtBase, value_usd: debtUsd }]\n : [];\n\n return {\n protocol: this.protocolName,\n user,\n supplies,\n borrows,\n health_factor: hf,\n net_apy: ltvBps / 100,\n };\n }\n}\n","import { createPublicClient, http, parseAbi } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IOracle } from \"@hypurrquant/defi-core\";\nimport { DefiError, type ProtocolEntry, type PriceData } from \"@hypurrquant/defi-core\";\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n \"function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory)\",\n \"function BASE_CURRENCY_UNIT() external view returns (uint256)\",\n]);\n\nexport class AaveOracleAdapter implements IOracle {\n private readonly protocolName: string;\n private readonly oracle: Address;\n private readonly rpcUrl: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n if (!rpcUrl) throw DefiError.rpcError(`[${entry.name}] RPC URL required for oracle`);\n this.rpcUrl = rpcUrl;\n const oracle = entry.contracts?.[\"oracle\"];\n if (!oracle) throw DefiError.contractError(`[${entry.name}] Missing 'oracle' contract address`);\n this.oracle = oracle;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getPrice(asset: Address): Promise<PriceData> {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const baseUnit = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"BASE_CURRENCY_UNIT\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] BASE_CURRENCY_UNIT failed: ${e}`);\n });\n\n const priceVal = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"getAssetPrice\",\n args: [asset],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getAssetPrice failed: ${e}`);\n });\n\n const priceF64 = baseUnit > 0n ? Number(priceVal) / Number(baseUnit) : 0;\n const priceUsd = baseUnit > 0n\n ? (priceVal * (10n ** 18n)) / baseUnit\n : 0n;\n\n return {\n source: `${this.protocolName} Oracle`,\n source_type: \"oracle\",\n asset,\n price_usd: priceUsd,\n price_f64: priceF64,\n };\n }\n\n async getPrices(assets: Address[]): Promise<PriceData[]> {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const baseUnit = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"BASE_CURRENCY_UNIT\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] BASE_CURRENCY_UNIT failed: ${e}`);\n });\n\n const rawPrices = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"getAssetsPrices\",\n args: [assets],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getAssetsPrices failed: ${e}`);\n });\n\n return (rawPrices as bigint[]).map((priceVal, i) => {\n const priceF64 = baseUnit > 0n ? Number(priceVal) / Number(baseUnit) : 0;\n const priceUsd = baseUnit > 0n ? (priceVal * (10n ** 18n)) / baseUnit : 0n;\n return {\n source: `${this.protocolName} Oracle`,\n source_type: \"oracle\",\n asset: assets[i]!,\n price_usd: priceUsd,\n price_f64: priceF64,\n };\n });\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst CTOKEN_ABI = parseAbi([\n \"function supplyRatePerBlock() external view returns (uint256)\",\n \"function borrowRatePerBlock() external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function totalBorrows() external view returns (uint256)\",\n \"function mint(uint256 mintAmount) external returns (uint256)\",\n \"function redeem(uint256 redeemTokens) external returns (uint256)\",\n \"function borrow(uint256 borrowAmount) external returns (uint256)\",\n \"function repayBorrow(uint256 repayAmount) external returns (uint256)\",\n]);\n\n// ~3s blocks on BSC\nconst BSC_BLOCKS_PER_YEAR = 10_512_000;\n\nexport class CompoundV2Adapter implements ILending {\n private readonly protocolName: string;\n private readonly defaultVtoken: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const vtoken =\n contracts[\"vusdt\"] ??\n contracts[\"vusdc\"] ??\n contracts[\"vbnb\"] ??\n contracts[\"comptroller\"];\n if (!vtoken) throw DefiError.contractError(\"Missing vToken or comptroller address\");\n this.defaultVtoken = vtoken;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"mint\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"borrow\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"repayBorrow\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"redeem\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw from Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [supplyRate, borrowRate, totalSupply, totalBorrows] = await Promise.all([\n client.readContract({ address: this.defaultVtoken, abi: CTOKEN_ABI, functionName: \"supplyRatePerBlock\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] supplyRatePerBlock failed: ${e}`); }),\n client.readContract({ address: this.defaultVtoken, abi: CTOKEN_ABI, functionName: \"borrowRatePerBlock\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] borrowRatePerBlock failed: ${e}`); }),\n client.readContract({ address: this.defaultVtoken, abi: CTOKEN_ABI, functionName: \"totalSupply\" }).catch(() => 0n),\n client.readContract({ address: this.defaultVtoken, abi: CTOKEN_ABI, functionName: \"totalBorrows\" }).catch(() => 0n),\n ]);\n\n const supplyPerBlock = Number(supplyRate) / 1e18;\n const borrowPerBlock = Number(borrowRate) / 1e18;\n const supplyApy = supplyPerBlock * BSC_BLOCKS_PER_YEAR * 100;\n const borrowApy = borrowPerBlock * BSC_BLOCKS_PER_YEAR * 100;\n\n const supplyF = Number(totalSupply);\n const borrowF = Number(totalBorrows);\n const utilization = supplyF > 0 ? (borrowF / supplyF) * 100 : 0;\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization,\n total_supply: totalSupply as bigint,\n total_borrow: totalBorrows as bigint,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] User position requires querying individual vToken balances`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst COMET_ABI = parseAbi([\n \"function getUtilization() external view returns (uint256)\",\n \"function getSupplyRate(uint256 utilization) external view returns (uint64)\",\n \"function getBorrowRate(uint256 utilization) external view returns (uint64)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function totalBorrow() external view returns (uint256)\",\n \"function supply(address asset, uint256 amount) external\",\n \"function withdraw(address asset, uint256 amount) external\",\n]);\n\nconst SECONDS_PER_YEAR = 365.25 * 24 * 3600;\n\nexport class CompoundV3Adapter implements ILending {\n private readonly protocolName: string;\n private readonly comet: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const comet = contracts[\"comet_usdc\"] ?? contracts[\"comet\"] ?? contracts[\"comet_weth\"];\n if (!comet) throw DefiError.contractError(\"Missing 'comet_usdc' or 'comet' address\");\n this.comet = comet;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"supply\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n // In Compound V3, borrow = withdraw base asset\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n // In Compound V3, repay = supply base asset\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"supply\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw from Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const utilization = await client.readContract({\n address: this.comet,\n abi: COMET_ABI,\n functionName: \"getUtilization\",\n }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] getUtilization failed: ${e}`); });\n\n const [supplyRate, borrowRate, totalSupply, totalBorrow] = await Promise.all([\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"getSupplyRate\", args: [utilization as bigint] }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] getSupplyRate failed: ${e}`); }),\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"getBorrowRate\", args: [utilization as bigint] }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] getBorrowRate failed: ${e}`); }),\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"totalSupply\" }).catch(() => 0n),\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"totalBorrow\" }).catch(() => 0n),\n ]);\n\n // Comet rates are per-second scaled by 1e18\n const supplyPerSec = Number(supplyRate) / 1e18;\n const borrowPerSec = Number(borrowRate) / 1e18;\n const supplyApy = supplyPerSec * SECONDS_PER_YEAR * 100;\n const borrowApy = borrowPerSec * SECONDS_PER_YEAR * 100;\n const utilPct = Number(utilization as bigint) / 1e18 * 100;\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization: utilPct,\n total_supply: totalSupply as bigint,\n total_borrow: totalBorrow as bigint,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] User position requires querying Comet balanceOf + borrowBalanceOf`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst EULER_VAULT_ABI = parseAbi([\n \"function deposit(uint256 amount, address receiver) external returns (uint256)\",\n \"function withdraw(uint256 amount, address receiver, address owner) external returns (uint256)\",\n \"function borrow(uint256 amount, address receiver) external returns (uint256)\",\n \"function repay(uint256 amount, address receiver) external returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function totalBorrows() external view returns (uint256)\",\n \"function interestRate() external view returns (uint256)\",\n]);\n\nconst SECONDS_PER_YEAR = 365.25 * 24 * 3600;\n\nexport class EulerV2Adapter implements ILending {\n private readonly protocolName: string;\n private readonly euler: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const euler = contracts[\"evk_vault\"] ?? contracts[\"euler\"] ?? contracts[\"markets\"];\n if (!euler) throw DefiError.contractError(\"Missing 'evk_vault' or 'euler' contract address\");\n this.euler = euler;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"deposit\",\n args: [params.amount, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Deposit ${params.amount} into Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"borrow\",\n args: [params.amount, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"repay\",\n args: [params.amount, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"withdraw\",\n args: [params.amount, params.to, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [totalSupply, totalBorrows, interestRate] = await Promise.all([\n client.readContract({ address: this.euler, abi: EULER_VAULT_ABI, functionName: \"totalSupply\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalSupply failed: ${e}`); }),\n client.readContract({ address: this.euler, abi: EULER_VAULT_ABI, functionName: \"totalBorrows\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalBorrows failed: ${e}`); }),\n client.readContract({ address: this.euler, abi: EULER_VAULT_ABI, functionName: \"interestRate\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] interestRate failed: ${e}`); }),\n ]);\n\n // Euler V2 interest rates per-second scaled by 1e27\n const rateF64 = Number(interestRate) / 1e27;\n const borrowApy = rateF64 * SECONDS_PER_YEAR * 100;\n\n const supplyF = Number(totalSupply);\n const borrowF = Number(totalBorrows);\n const utilization = supplyF > 0 ? (borrowF / supplyF) * 100 : 0;\n const supplyApy = borrowApy * (borrowF / Math.max(supplyF, 1));\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization,\n total_supply: totalSupply as bigint,\n total_borrow: totalBorrows as bigint,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Euler V2 user positions require querying individual vault balances. Use the vault address directly to check balanceOf(user) for supply positions.`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst MORPHO_ABI = parseAbi([\n \"function market(bytes32 id) external view returns (uint128 totalSupplyAssets, uint128 totalSupplyShares, uint128 totalBorrowAssets, uint128 totalBorrowShares, uint128 lastUpdate, uint128 fee)\",\n \"function idToMarketParams(bytes32 id) external view returns (address loanToken, address collateralToken, address oracle, address irm, uint256 lltv)\",\n \"function supply((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, bytes data) external returns (uint256 assetsSupplied, uint256 sharesSupplied)\",\n \"function borrow((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, address receiver) external returns (uint256 assetsBorrowed, uint256 sharesBorrowed)\",\n \"function repay((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, bytes data) external returns (uint256 assetsRepaid, uint256 sharesRepaid)\",\n \"function withdraw((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, address receiver) external returns (uint256 assetsWithdrawn, uint256 sharesWithdrawn)\",\n]);\n\nconst META_MORPHO_ABI = parseAbi([\n \"function supplyQueueLength() external view returns (uint256)\",\n \"function supplyQueue(uint256 index) external view returns (bytes32)\",\n \"function totalAssets() external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nconst IRM_ABI = parseAbi([\n \"function borrowRateView((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, (uint128 totalSupplyAssets, uint128 totalSupplyShares, uint128 totalBorrowAssets, uint128 totalBorrowShares, uint128 lastUpdate, uint128 fee) market) external view returns (uint256)\",\n]);\n\nconst SECONDS_PER_YEAR = 365.25 * 24 * 3600;\n\ntype MarketParams = {\n loanToken: Address;\n collateralToken: Address;\n oracle: Address;\n irm: Address;\n lltv: bigint;\n};\n\nfunction defaultMarketParams(loanToken: Address = zeroAddress as Address): MarketParams {\n return {\n loanToken,\n collateralToken: zeroAddress as Address,\n oracle: zeroAddress as Address,\n irm: zeroAddress as Address,\n lltv: 0n,\n };\n}\n\nexport class MorphoBlueAdapter implements ILending {\n private readonly protocolName: string;\n private readonly morpho: Address;\n private readonly defaultVault?: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const morpho = contracts[\"morpho_blue\"];\n if (!morpho) throw DefiError.contractError(\"Missing 'morpho_blue' contract address\");\n this.morpho = morpho;\n this.defaultVault =\n contracts[\"fehype\"] ?? contracts[\"vault\"] ?? contracts[\"feusdc\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"supply\",\n args: [market, params.amount, 0n, params.on_behalf_of, \"0x\"],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"borrow\",\n args: [market, params.amount, 0n, params.on_behalf_of, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"repay\",\n args: [market, params.amount, 0n, params.on_behalf_of, \"0x\"],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"withdraw\",\n args: [market, params.amount, 0n, params.to, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n if (!this.defaultVault) {\n throw DefiError.contractError(`[${this.protocolName}] No MetaMorpho vault configured for rate query`);\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const queueLen = await client.readContract({\n address: this.defaultVault,\n abi: META_MORPHO_ABI,\n functionName: \"supplyQueueLength\",\n }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] supplyQueueLength failed: ${e}`); });\n\n if ((queueLen as bigint) === 0n) {\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: 0,\n borrow_variable_apy: 0,\n utilization: 0,\n total_supply: 0n,\n total_borrow: 0n,\n };\n }\n\n const marketId = await client.readContract({\n address: this.defaultVault,\n abi: META_MORPHO_ABI,\n functionName: \"supplyQueue\",\n args: [0n],\n }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] supplyQueue(0) failed: ${e}`); }) as `0x${string}`;\n\n const mkt = await client.readContract({\n address: this.morpho,\n abi: MORPHO_ABI,\n functionName: \"market\",\n args: [marketId],\n }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] market() failed: ${e}`); });\n\n const [totalSupplyAssets, totalSupplyShares, totalBorrowAssets, totalBorrowShares, lastUpdate, fee] = mkt as [bigint, bigint, bigint, bigint, bigint, bigint];\n\n const supplyF = Number(totalSupplyAssets);\n const borrowF = Number(totalBorrowAssets);\n const util = supplyF > 0 ? borrowF / supplyF : 0;\n\n const params2 = await client.readContract({\n address: this.morpho,\n abi: MORPHO_ABI,\n functionName: \"idToMarketParams\",\n args: [marketId],\n }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] idToMarketParams failed: ${e}`); });\n\n const [loanToken, collateralToken, oracle, irm, lltv] = params2 as [Address, Address, Address, Address, bigint];\n\n const irmMarketParams: MarketParams = { loanToken, collateralToken, oracle, irm, lltv };\n const irmMarket = { totalSupplyAssets, totalSupplyShares, totalBorrowAssets, totalBorrowShares, lastUpdate, fee };\n\n const borrowRatePerSec = await client.readContract({\n address: irm,\n abi: IRM_ABI,\n functionName: \"borrowRateView\",\n args: [irmMarketParams, irmMarket],\n }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] borrowRateView failed: ${e}`); }) as bigint;\n\n const ratePerSec = Number(borrowRatePerSec) / 1e18;\n const borrowApy = ratePerSec * SECONDS_PER_YEAR * 100;\n const feePct = Number(fee) / 1e18;\n const supplyApy = borrowApy * util * (1 - feePct);\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization: util * 100,\n total_supply: totalSupplyAssets,\n total_borrow: totalBorrowAssets,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Morpho Blue user positions are per-market — use vault deposit/withdraw instead`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ICdp } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type OpenCdpParams,\n type AdjustCdpParams,\n type CloseCdpParams,\n type CdpInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst BORROWER_OPS_ABI = parseAbi([\n \"function openTrove(address _owner, uint256 _ownerIndex, uint256 _collAmount, uint256 _boldAmount, uint256 _upperHint, uint256 _lowerHint, uint256 _annualInterestRate, uint256 _maxUpfrontFee, address _addManager, address _removeManager, address _receiver) external returns (uint256)\",\n \"function adjustTrove(uint256 _troveId, uint256 _collChange, bool _isCollIncrease, uint256 _debtChange, bool _isDebtIncrease, uint256 _upperHint, uint256 _lowerHint, uint256 _maxUpfrontFee) external\",\n \"function closeTrove(uint256 _troveId) external\",\n]);\n\nconst TROVE_MANAGER_ABI = parseAbi([\n \"function getLatestTroveData(uint256 _troveId) external view returns (uint256 entireDebt, uint256 entireColl, uint256 redistDebtGain, uint256 redistCollGain, uint256 accruedInterest, uint256 recordedDebt, uint256 annualInterestRate, uint256 accruedBatchManagementFee, uint256 weightedRecordedDebt, uint256 lastInterestRateAdjTime)\",\n]);\n\nconst HINT_HELPERS_ABI = parseAbi([\n \"function getApproxHint(uint256 _collIndex, uint256 _interestRate, uint256 _numTrials, uint256 _inputRandomSeed) external view returns (uint256 hintId, uint256 diff, uint256 latestRandomSeed)\",\n]);\n\nconst SORTED_TROVES_ABI = parseAbi([\n \"function findInsertPosition(uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) external view returns (uint256 prevId, uint256 nextId)\",\n]);\n\nexport class FelixCdpAdapter implements ICdp {\n private readonly protocolName: string;\n private readonly borrowerOperations: Address;\n private readonly troveManager?: Address;\n private readonly hintHelpers?: Address;\n private readonly sortedTroves?: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const bo = contracts[\"borrower_operations\"];\n if (!bo) throw DefiError.contractError(\"Missing 'borrower_operations' contract\");\n this.borrowerOperations = bo;\n this.troveManager = contracts[\"trove_manager\"];\n this.hintHelpers = contracts[\"hint_helpers\"];\n this.sortedTroves = contracts[\"sorted_troves\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n private async getHints(interestRate: bigint): Promise<[bigint, bigint]> {\n if (!this.hintHelpers || !this.sortedTroves || !this.rpcUrl) {\n return [0n, 0n];\n }\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const approxResult = await client.readContract({\n address: this.hintHelpers,\n abi: HINT_HELPERS_ABI,\n functionName: \"getApproxHint\",\n args: [0n, interestRate, 15n, 42n],\n }).catch(() => null);\n\n if (!approxResult) return [0n, 0n];\n const [hintId] = approxResult as [bigint, bigint, bigint];\n\n const insertResult = await client.readContract({\n address: this.sortedTroves,\n abi: SORTED_TROVES_ABI,\n functionName: \"findInsertPosition\",\n args: [interestRate, hintId, hintId],\n }).catch(() => null);\n\n if (!insertResult) return [0n, 0n];\n const [prevId, nextId] = insertResult as [bigint, bigint];\n return [prevId, nextId];\n }\n\n async buildOpen(params: OpenCdpParams): Promise<DeFiTx> {\n const interestRate = 50000000000000000n; // 5% default\n const [upperHint, lowerHint] = await this.getHints(interestRate);\n const hasHints = upperHint !== 0n || lowerHint !== 0n;\n\n const data = encodeFunctionData({\n abi: BORROWER_OPS_ABI,\n functionName: \"openTrove\",\n args: [\n params.recipient,\n 0n,\n params.collateral_amount,\n params.debt_amount,\n upperHint,\n lowerHint,\n interestRate,\n BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"), // U256::MAX\n params.recipient,\n params.recipient,\n params.recipient,\n ],\n });\n\n return {\n description: `[${this.protocolName}] Open trove: collateral=${params.collateral_amount}, debt=${params.debt_amount} (hints=${hasHints ? \"optimized\" : \"none\"})`,\n to: this.borrowerOperations,\n data,\n value: 0n,\n gas_estimate: hasHints ? 500_000 : 5_000_000,\n };\n }\n\n async buildAdjust(params: AdjustCdpParams): Promise<DeFiTx> {\n const collChange = params.collateral_delta ?? 0n;\n const debtChange = params.debt_delta ?? 0n;\n\n const data = encodeFunctionData({\n abi: BORROWER_OPS_ABI,\n functionName: \"adjustTrove\",\n args: [\n params.cdp_id,\n collChange,\n params.add_collateral,\n debtChange,\n params.add_debt,\n 0n,\n 0n,\n BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Adjust trove ${params.cdp_id}`,\n to: this.borrowerOperations,\n data,\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n async buildClose(params: CloseCdpParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: BORROWER_OPS_ABI,\n functionName: \"closeTrove\",\n args: [params.cdp_id],\n });\n\n return {\n description: `[${this.protocolName}] Close trove ${params.cdp_id}`,\n to: this.borrowerOperations,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async getCdpInfo(cdpId: bigint): Promise<CdpInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(`[${this.protocolName}] getCdpInfo requires RPC — set HYPEREVM_RPC_URL`);\n if (!this.troveManager) throw DefiError.contractError(`[${this.protocolName}] trove_manager contract not configured`);\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const data = await client.readContract({\n address: this.troveManager,\n abi: TROVE_MANAGER_ABI,\n functionName: \"getLatestTroveData\",\n args: [cdpId],\n }).catch((e: unknown) => {\n throw DefiError.invalidParam(`[${this.protocolName}] Trove ${cdpId} not found: ${e}`);\n });\n\n const [entireDebt, entireColl] = data as [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint];\n\n if (entireDebt === 0n && entireColl === 0n) {\n throw DefiError.invalidParam(`[${this.protocolName}] Trove ${cdpId} does not exist`);\n }\n\n const collRatio = entireDebt > 0n ? Number(entireColl) / Number(entireDebt) : 0;\n\n return {\n protocol: this.protocolName,\n cdp_id: cdpId,\n collateral: {\n token: zeroAddress as Address,\n symbol: \"WHYPE\",\n amount: entireColl,\n decimals: 18,\n },\n debt: {\n token: zeroAddress as Address,\n symbol: \"feUSD\",\n amount: entireDebt,\n decimals: 18,\n },\n collateral_ratio: collRatio,\n };\n }\n}\n","import { createPublicClient, http, parseAbi } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IOracle } from \"@hypurrquant/defi-core\";\nimport { DefiError, type ProtocolEntry, type PriceData } from \"@hypurrquant/defi-core\";\n\nconst PRICE_FEED_ABI = parseAbi([\n \"function fetchPrice() external view returns (uint256 price, bool isNewOracleFailureDetected)\",\n \"function lastGoodPrice() external view returns (uint256)\",\n]);\n\nexport class FelixOracleAdapter implements IOracle {\n private readonly protocolName: string;\n private readonly priceFeed: Address;\n private readonly asset: Address;\n private readonly rpcUrl: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n if (!rpcUrl) throw DefiError.rpcError(`[${entry.name}] RPC URL required for oracle`);\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const feed = contracts[\"price_feed\"];\n if (!feed) throw DefiError.contractError(`[${entry.name}] Missing 'price_feed' contract address`);\n this.priceFeed = feed;\n // The asset address is stored under \"asset\" or falls back to zero (WHYPE native)\n this.asset = contracts[\"asset\"] ?? (\"0x0000000000000000000000000000000000000000\" as Address);\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getPrice(asset: Address): Promise<PriceData> {\n if (asset !== this.asset && this.asset !== \"0x0000000000000000000000000000000000000000\") {\n throw DefiError.unsupported(`[${this.protocolName}] Felix PriceFeed only supports asset ${this.asset}`);\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n let priceVal: bigint;\n try {\n const result = await client.readContract({\n address: this.priceFeed,\n abi: PRICE_FEED_ABI,\n functionName: \"fetchPrice\",\n });\n const [price] = result as [bigint, boolean];\n priceVal = price;\n } catch {\n // Fall back to lastGoodPrice\n priceVal = await client.readContract({\n address: this.priceFeed,\n abi: PRICE_FEED_ABI,\n functionName: \"lastGoodPrice\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] lastGoodPrice failed: ${e}`);\n }) as bigint;\n }\n\n // Felix prices are already in 18-decimal USD\n const priceF64 = Number(priceVal) / 1e18;\n\n return {\n source: \"Felix PriceFeed\",\n source_type: \"oracle\",\n asset,\n price_usd: priceVal,\n price_f64: priceF64,\n };\n }\n\n async getPrices(assets: Address[]): Promise<PriceData[]> {\n const results: PriceData[] = [];\n for (const asset of assets) {\n try {\n results.push(await this.getPrice(asset));\n } catch {\n // Skip unsupported assets\n }\n }\n return results;\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IVault } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type VaultInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst ERC4626_ABI = parseAbi([\n \"function asset() external view returns (address)\",\n \"function totalAssets() external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function convertToShares(uint256 assets) external view returns (uint256)\",\n \"function convertToAssets(uint256 shares) external view returns (uint256)\",\n \"function deposit(uint256 assets, address receiver) external returns (uint256 shares)\",\n \"function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares)\",\n]);\n\nexport class ERC4626VaultAdapter implements IVault {\n private readonly protocolName: string;\n private readonly vaultAddress: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const vault = entry.contracts?.[\"vault\"];\n if (!vault) throw DefiError.contractError(\"Missing 'vault' contract address\");\n this.vaultAddress = vault;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildDeposit(assets: bigint, receiver: Address): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: ERC4626_ABI,\n functionName: \"deposit\",\n args: [assets, receiver],\n });\n return {\n description: `[${this.protocolName}] Deposit ${assets} assets into vault`,\n to: this.vaultAddress,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildWithdraw(assets: bigint, receiver: Address, owner: Address): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: ERC4626_ABI,\n functionName: \"withdraw\",\n args: [assets, receiver, owner],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${assets} assets from vault`,\n to: this.vaultAddress,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async totalAssets(): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return client.readContract({\n address: this.vaultAddress,\n abi: ERC4626_ABI,\n functionName: \"totalAssets\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] totalAssets failed: ${e}`);\n }) as Promise<bigint>;\n }\n\n async convertToShares(assets: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return client.readContract({\n address: this.vaultAddress,\n abi: ERC4626_ABI,\n functionName: \"convertToShares\",\n args: [assets],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] convertToShares failed: ${e}`);\n }) as Promise<bigint>;\n }\n\n async convertToAssets(shares: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return client.readContract({\n address: this.vaultAddress,\n abi: ERC4626_ABI,\n functionName: \"convertToAssets\",\n args: [shares],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] convertToAssets failed: ${e}`);\n }) as Promise<bigint>;\n }\n\n async getVaultInfo(): Promise<VaultInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [totalAssets, totalSupply, asset] = await Promise.all([\n client.readContract({ address: this.vaultAddress, abi: ERC4626_ABI, functionName: \"totalAssets\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalAssets failed: ${e}`); }),\n client.readContract({ address: this.vaultAddress, abi: ERC4626_ABI, functionName: \"totalSupply\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalSupply failed: ${e}`); }),\n client.readContract({ address: this.vaultAddress, abi: ERC4626_ABI, functionName: \"asset\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] asset failed: ${e}`); }),\n ]);\n\n return {\n protocol: this.protocolName,\n vault_address: this.vaultAddress,\n asset: asset as Address,\n total_assets: totalAssets as bigint,\n total_supply: totalSupply as bigint,\n };\n }\n}\n","import { parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type StakeParams,\n type UnstakeParams,\n type StakingInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst GENERIC_LST_ABI = parseAbi([\n \"function stake() external payable returns (uint256)\",\n \"function unstake(uint256 amount) external returns (uint256)\",\n]);\n\nexport class GenericLstAdapter implements ILiquidStaking {\n private readonly protocolName: string;\n private readonly staking: Address;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const staking = entry.contracts?.[\"staking\"];\n if (!staking) throw DefiError.contractError(\"Missing 'staking' contract\");\n this.staking = staking;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildStake(params: StakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({ abi: GENERIC_LST_ABI, functionName: \"stake\" });\n return {\n description: `[${this.protocolName}] Stake ${params.amount} HYPE`,\n to: this.staking,\n data,\n value: params.amount,\n gas_estimate: 200_000,\n };\n }\n\n async buildUnstake(params: UnstakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: GENERIC_LST_ABI,\n functionName: \"unstake\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Unstake ${params.amount}`,\n to: this.staking,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async getInfo(): Promise<StakingInfo> {\n throw DefiError.unsupported(`[${this.protocolName}] getInfo requires RPC`);\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type StakeParams,\n type UnstakeParams,\n type StakingInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst STHYPE_ABI = parseAbi([\n \"function submit(address referral) external payable returns (uint256)\",\n \"function requestWithdrawals(uint256[] amounts, address owner) external returns (uint256[] requestIds)\",\n]);\n\nconst ERC20_ABI = parseAbi([\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nexport class StHypeAdapter implements ILiquidStaking {\n private readonly protocolName: string;\n private readonly staking: Address;\n private readonly sthypeToken?: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const staking = entry.contracts?.[\"staking\"];\n if (!staking) throw DefiError.contractError(\"Missing 'staking' contract\");\n this.staking = staking;\n this.sthypeToken = entry.contracts?.[\"sthype_token\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildStake(params: StakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: STHYPE_ABI,\n functionName: \"submit\",\n args: [zeroAddress as Address],\n });\n return {\n description: `[${this.protocolName}] Stake ${params.amount} HYPE for stHYPE`,\n to: this.staking,\n data,\n value: params.amount,\n gas_estimate: 200_000,\n };\n }\n\n async buildUnstake(params: UnstakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: STHYPE_ABI,\n functionName: \"requestWithdrawals\",\n args: [[params.amount], params.recipient],\n });\n return {\n description: `[${this.protocolName}] Request unstake ${params.amount} stHYPE`,\n to: this.staking,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async getInfo(): Promise<StakingInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const tokenAddr = this.sthypeToken ?? this.staking;\n\n const totalSupply = await client.readContract({\n address: tokenAddr,\n abi: ERC20_ABI,\n functionName: \"totalSupply\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] totalSupply failed: ${e}`);\n }) as bigint;\n\n return {\n protocol: this.protocolName,\n staked_token: zeroAddress as Address,\n liquid_token: tokenAddr,\n exchange_rate: 1.0,\n total_staked: totalSupply,\n };\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type StakeParams,\n type UnstakeParams,\n type StakingInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst KINETIQ_ABI = parseAbi([\n \"function stake() external payable returns (uint256)\",\n \"function requestUnstake(uint256 amount) external returns (uint256)\",\n \"function totalStaked() external view returns (uint256)\",\n]);\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n]);\n\n// WHYPE address on HyperEVM\nconst WHYPE: Address = \"0x5555555555555555555555555555555555555555\";\n// HyperLend oracle address (Aave V3 compatible)\nconst HYPERLEND_ORACLE: Address = \"0xc9fb4fbe842d57ea1df3e641a281827493a63030\";\n\nexport class KinetiqAdapter implements ILiquidStaking {\n private readonly protocolName: string;\n private readonly staking: Address;\n private readonly liquidToken: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const staking = entry.contracts?.[\"staking\"];\n if (!staking) throw DefiError.contractError(\"Missing 'staking' contract address\");\n this.staking = staking;\n this.liquidToken = entry.contracts?.[\"khype_token\"] ?? staking;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildStake(params: StakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({ abi: KINETIQ_ABI, functionName: \"stake\" });\n return {\n description: `[${this.protocolName}] Stake ${params.amount} HYPE for kHYPE`,\n to: this.staking,\n data,\n value: params.amount,\n gas_estimate: 300_000,\n };\n }\n\n async buildUnstake(params: UnstakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: KINETIQ_ABI,\n functionName: \"requestUnstake\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Request unstake ${params.amount} kHYPE`,\n to: this.staking,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async getInfo(): Promise<StakingInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const totalStaked = await client.readContract({\n address: this.staking,\n abi: KINETIQ_ABI,\n functionName: \"totalStaked\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] totalStaked failed: ${e}`);\n }) as bigint;\n\n const [khypePrice, hypePrice] = await Promise.all([\n client.readContract({ address: HYPERLEND_ORACLE, abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [this.liquidToken] }).catch(() => 0n),\n client.readContract({ address: HYPERLEND_ORACLE, abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [WHYPE] }).catch(() => 0n),\n ]);\n\n const rateF64 =\n (hypePrice as bigint) > 0n && (khypePrice as bigint) > 0n\n ? Number((khypePrice as bigint) * 10n ** 18n / (hypePrice as bigint)) / 1e18\n : 1.0;\n\n return {\n protocol: this.protocolName,\n staked_token: zeroAddress as Address,\n liquid_token: this.liquidToken,\n exchange_rate: rateF64,\n total_staked: totalStaked,\n };\n }\n}\n","import type { Address } from \"viem\";\nimport type { IYieldSource } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type YieldInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class PendleAdapter implements IYieldSource {\n private readonly protocolName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n if (!entry.contracts?.[\"router\"]) {\n throw DefiError.contractError(\"Missing 'router' contract\");\n }\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getYields(): Promise<YieldInfo[]> {\n throw DefiError.unsupported(`[${this.protocolName}] getYields requires RPC`);\n }\n\n async buildDeposit(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Pendle deposit requires market address and token routing params. Use Pendle-specific CLI.`,\n );\n }\n\n async buildWithdraw(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Pendle withdraw requires market-specific params`,\n );\n }\n}\n","import type { Address } from \"viem\";\nimport type { IYieldSource } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type YieldInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class GenericYieldAdapter implements IYieldSource {\n private readonly protocolName: string;\n private readonly interfaceName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n this.interfaceName = entry.interface;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getYields(): Promise<YieldInfo[]> {\n throw DefiError.unsupported(`[${this.protocolName}] getYields requires RPC`);\n }\n\n async buildDeposit(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Yield interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'pendle_v2' (Pendle). Protocols like Steer (managed liquidity), ` +\n `Liminal (yield optimization), and Altura (gaming yield) need custom deposit logic.`,\n );\n }\n\n async buildWithdraw(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Yield interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'pendle_v2' (Pendle). Protocols like Steer (managed liquidity), ` +\n `Liminal (yield optimization), and Altura (gaming yield) need custom withdraw logic.`,\n );\n }\n}\n","import { parseAbi, encodeFunctionData } from \"viem\";\nimport type { IDerivatives } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type DerivativesPositionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\n\nconst HLP_ABI = parseAbi([\n \"function deposit(uint256 amount) external returns (uint256)\",\n \"function withdraw(uint256 shares) external returns (uint256)\",\n]);\n\nexport class HlpVaultAdapter implements IDerivatives {\n private readonly protocolName: string;\n private readonly vault: Address;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const vault = entry.contracts?.[\"vault\"];\n if (!vault) throw DefiError.contractError(\"Missing 'vault' contract\");\n this.vault = vault;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildOpenPosition(params: DerivativesPositionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: HLP_ABI,\n functionName: \"deposit\",\n args: [params.collateral],\n });\n return {\n description: `[${this.protocolName}] Deposit ${params.collateral} into HLP vault`,\n to: this.vault,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildClosePosition(params: DerivativesPositionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: HLP_ABI,\n functionName: \"withdraw\",\n args: [params.size],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.size} from HLP vault`,\n to: this.vault,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n}\n","import type { IDerivatives } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type DerivativesPositionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class GenericDerivativesAdapter implements IDerivatives {\n private readonly protocolName: string;\n private readonly interfaceName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n this.interfaceName = entry.interface;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildOpenPosition(_params: DerivativesPositionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Derivatives interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'hlp_vault' (HLP Vault). Protocols like Rumpel need custom position management logic.`,\n );\n }\n\n async buildClosePosition(_params: DerivativesPositionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Derivatives interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'hlp_vault' (HLP Vault). Protocols like Rumpel need custom position management logic.`,\n );\n }\n}\n","import { parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IOptions } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type OptionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst RYSK_ABI = parseAbi([\n \"function openOption(address underlying, uint256 strikePrice, uint256 expiry, bool isCall, uint256 amount) external returns (uint256 premium)\",\n \"function closeOption(address underlying, uint256 strikePrice, uint256 expiry, bool isCall, uint256 amount) external returns (uint256 payout)\",\n]);\n\nexport class RyskAdapter implements IOptions {\n private readonly protocolName: string;\n private readonly controller: Address;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const controller = entry.contracts?.[\"controller\"];\n if (!controller) throw DefiError.contractError(\"Missing 'controller' contract\");\n this.controller = controller;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildBuy(params: OptionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: RYSK_ABI,\n functionName: \"openOption\",\n args: [\n params.underlying,\n params.strike_price,\n BigInt(params.expiry),\n params.is_call,\n params.amount,\n ],\n });\n return {\n description: `[${this.protocolName}] Buy ${params.is_call ? \"call\" : \"put\"} ${params.amount} option, strike=${params.strike_price}, expiry=${params.expiry}`,\n to: this.controller,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildSell(params: OptionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: RYSK_ABI,\n functionName: \"closeOption\",\n args: [\n params.underlying,\n params.strike_price,\n BigInt(params.expiry),\n params.is_call,\n params.amount,\n ],\n });\n return {\n description: `[${this.protocolName}] Sell/close ${params.is_call ? \"call\" : \"put\"} ${params.amount} option`,\n to: this.controller,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n}\n","import type { IOptions } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type OptionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class GenericOptionsAdapter implements IOptions {\n private readonly protocolName: string;\n private readonly interfaceName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n this.interfaceName = entry.interface;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildBuy(_params: OptionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Options interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'rysk' (Rysk Finance). Other options protocols need custom strike/expiry handling.`,\n );\n }\n\n async buildSell(_params: OptionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Options interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'rysk' (Rysk Finance). Other options protocols need custom strike/expiry handling.`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { INft, NftCollectionInfo, NftTokenInfo } from \"@hypurrquant/defi-core\";\nimport { DefiError, type ProtocolEntry } from \"@hypurrquant/defi-core\";\n\nconst ERC721_ABI = parseAbi([\n \"function name() returns (string)\",\n \"function symbol() returns (string)\",\n \"function totalSupply() returns (uint256)\",\n \"function ownerOf(uint256 tokenId) returns (address)\",\n \"function balanceOf(address owner) returns (uint256)\",\n \"function tokenURI(uint256 tokenId) returns (string)\",\n]);\n\nexport class ERC721Adapter implements INft {\n private readonly protocolName: string;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getCollectionInfo(collection: Address): Promise<NftCollectionInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [collectionName, symbol, totalSupply] = await Promise.all([\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"name\" })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] name failed: ${e}`);\n }),\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"symbol\" })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] symbol failed: ${e}`);\n }),\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"totalSupply\" })\n .catch(() => undefined),\n ]);\n\n return {\n address: collection,\n name: collectionName as string,\n symbol: symbol as string,\n total_supply: totalSupply as bigint | undefined,\n };\n }\n\n async getTokenInfo(collection: Address, tokenId: bigint): Promise<NftTokenInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [owner, tokenUri] = await Promise.all([\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"ownerOf\", args: [tokenId] })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] ownerOf failed: ${e}`);\n }),\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"tokenURI\", args: [tokenId] })\n .catch(() => undefined),\n ]);\n\n return {\n collection,\n token_id: tokenId,\n owner: owner as Address,\n token_uri: tokenUri as string | undefined,\n };\n }\n\n async getBalance(owner: Address, collection: Address): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n return client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"balanceOf\", args: [owner] })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] balanceOf failed: ${e}`);\n }) as Promise<bigint>;\n }\n}\n","import type { Address } from \"viem\";\n\nimport type { IDex, PriceData, QuoteParams } from \"@hypurrquant/defi-core\";\n\n/**\n * Utility for deriving spot prices from DEX quoters.\n * Quotes 1 unit of the token against a quote token (e.g. USDC) to derive price.\n */\nexport class DexSpotPrice {\n /**\n * Get the spot price for `token` denominated in `quoteToken` (e.g. USDC).\n *\n * `tokenDecimals` — decimals of the input token (to know how much \"1 unit\" is)\n * `quoteDecimals` — decimals of the quote token (to convert the output to number)\n */\n static async getPrice(\n dex: IDex,\n token: Address,\n tokenDecimals: number,\n quoteToken: Address,\n quoteDecimals: number,\n ): Promise<PriceData> {\n const amountIn = 10n ** BigInt(tokenDecimals); // 1 token\n\n const quoteParams: QuoteParams = {\n protocol: \"\",\n token_in: token,\n token_out: quoteToken,\n amount_in: amountIn,\n };\n\n const quote = await dex.quote(quoteParams);\n\n // Convert to USD price (assuming quoteToken is a USD stablecoin)\n const priceF64 = Number(quote.amount_out) / 10 ** quoteDecimals;\n\n // Normalize to 18-decimal representation\n let priceUsd: bigint;\n if (quoteDecimals < 18) {\n priceUsd = quote.amount_out * 10n ** BigInt(18 - quoteDecimals);\n } else if (quoteDecimals > 18) {\n priceUsd = quote.amount_out / 10n ** BigInt(quoteDecimals - 18);\n } else {\n priceUsd = quote.amount_out;\n }\n\n return {\n source: `dex:${dex.name()}`,\n source_type: \"dex_spot\",\n asset: token,\n price_usd: priceUsd,\n price_f64: priceF64,\n block_number: undefined,\n timestamp: undefined,\n };\n }\n}\n","#!/usr/bin/env node\n/**\n * MCP (Model Context Protocol) server for defi-cli.\n *\n * Exposes DeFi operations as MCP tools: lending, DEX, bridge, vault, staking,\n * price queries, exploit detection, and portfolio overview.\n * Transactions default to dry-run mode unless DEFI_PRIVATE_KEY is set and\n * broadcast is explicitly requested via the `broadcast` parameter.\n */\n\nimport \"dotenv/config\";\nimport { createRequire } from \"node:module\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport { Registry, InterestRateMode } from \"@hypurrquant/defi-core\";\nimport { createLending, createDex, createVault, createLiquidStaking } from \"@hypurrquant/defi-protocols\";\nimport { Executor } from \"./executor.js\";\nimport type { Address } from \"viem\";\n\n// ── JSON envelope helpers ──\n\nfunction ok(data: unknown, meta?: Record<string, unknown>) {\n return JSON.stringify({ ok: true, data, meta }, null, 2);\n}\n\nfunction err(error: string, meta?: Record<string, unknown>) {\n return JSON.stringify({ ok: false, error, meta }, null, 2);\n}\n\n// ── Registry helper ──\n\nfunction getRegistry() {\n return Registry.loadEmbedded();\n}\n\nfunction resolveToken(registry: Registry, chainName: string, token: string): Address {\n if (token.startsWith(\"0x\")) return token as Address;\n return registry.resolveToken(chainName, token).address as Address;\n}\n\nfunction makeExecutor(broadcast: boolean, rpcUrl: string, explorerUrl?: string): Executor {\n return new Executor(broadcast, rpcUrl, explorerUrl);\n}\n\n// ── MCP Server ──\n\nconst _require = createRequire(import.meta.url);\nconst _pkg = _require(\"../package.json\") as { version: string };\n\nconst server = new McpServer(\n { name: \"defi-cli\", version: _pkg.version },\n { capabilities: { tools: {}, resources: {}, prompts: {} } },\n);\n\n// ============================================================\n// defi_status — chain and protocol status\n// ============================================================\n\nserver.tool(\n \"defi_status\",\n \"Show chain and protocol status: lists all protocols deployed on a chain with contract addresses and categories\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm). E.g. hyperevm, ethereum, arbitrum, base\"),\n },\n async ({ chain }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocols = registry.getProtocolsForChain(chainName);\n\n const data = {\n chain: chainName,\n chain_id: chainConfig.chain_id,\n rpc_url: chainConfig.effectiveRpcUrl(),\n protocols: protocols.map(p => ({\n slug: p.slug,\n name: p.name,\n category: p.category,\n interface: p.interface,\n contracts: p.contracts ?? {},\n })),\n summary: {\n total_protocols: protocols.length,\n },\n };\n\n return { content: [{ type: \"text\", text: ok(data, { chain: chainName }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e)) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_lending_rates — get lending rates for a protocol\n// ============================================================\n\nserver.tool(\n \"defi_lending_rates\",\n \"Get current supply and borrow rates for an asset on a lending protocol (e.g. Aave V3)\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug, e.g. aave-v3, felix\"),\n asset: z.string().describe(\"Token symbol (e.g. USDC) or address (0x...)\"),\n },\n async ({ chain, protocol, asset }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createLending(protocolConfig, chainConfig.effectiveRpcUrl());\n const assetAddr = resolveToken(registry, chainName, asset);\n const rates = await adapter.getRates(assetAddr);\n return { content: [{ type: \"text\", text: ok(rates, { chain: chainName, protocol, asset }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol, asset }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_lending_supply — supply to lending protocol\n// ============================================================\n\nserver.tool(\n \"defi_lending_supply\",\n \"Supply an asset to a lending protocol. Defaults to dry-run (no broadcast). Set broadcast=true to send transaction (requires DEFI_PRIVATE_KEY env var)\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug, e.g. aave-v3\"),\n asset: z.string().describe(\"Token symbol or address\"),\n amount: z.string().describe(\"Amount in wei (as string to avoid precision loss)\"),\n on_behalf_of: z.string().optional().describe(\"Supply on behalf of this address (default: DEFI_WALLET_ADDRESS env var)\"),\n broadcast: z.boolean().optional().describe(\"Set true to broadcast the transaction (default: false = dry run)\"),\n },\n async ({ chain, protocol, asset, amount, on_behalf_of, broadcast }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createLending(protocolConfig, chainConfig.effectiveRpcUrl());\n const assetAddr = resolveToken(registry, chainName, asset);\n const onBehalfOf = (on_behalf_of ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n const tx = await adapter.buildSupply({ protocol: protocolConfig.name, asset: assetAddr, amount: BigInt(amount), on_behalf_of: onBehalfOf });\n const executor = makeExecutor(broadcast ?? false, chainConfig.effectiveRpcUrl(), chainConfig.explorer_url);\n const result = await executor.execute(tx);\n return { content: [{ type: \"text\", text: ok(result, { chain: chainName, protocol, asset, broadcast: broadcast ?? false }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol, asset }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_lending_withdraw — withdraw from lending protocol\n// ============================================================\n\nserver.tool(\n \"defi_lending_withdraw\",\n \"Withdraw a supplied asset from a lending protocol. Defaults to dry-run. Set broadcast=true to send transaction\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug, e.g. aave-v3\"),\n asset: z.string().describe(\"Token symbol or address\"),\n amount: z.string().describe(\"Amount in wei to withdraw\"),\n to: z.string().optional().describe(\"Recipient address (default: DEFI_WALLET_ADDRESS)\"),\n broadcast: z.boolean().optional().describe(\"Set true to broadcast (default: false)\"),\n },\n async ({ chain, protocol, asset, amount, to, broadcast }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createLending(protocolConfig, chainConfig.effectiveRpcUrl());\n const assetAddr = resolveToken(registry, chainName, asset);\n const toAddr = (to ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n const tx = await adapter.buildWithdraw({ protocol: protocolConfig.name, asset: assetAddr, amount: BigInt(amount), to: toAddr });\n const executor = makeExecutor(broadcast ?? false, chainConfig.effectiveRpcUrl(), chainConfig.explorer_url);\n const result = await executor.execute(tx);\n return { content: [{ type: \"text\", text: ok(result, { chain: chainName, protocol, asset, broadcast: broadcast ?? false }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol, asset }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_dex_quote — get swap quote\n// ============================================================\n\nserver.tool(\n \"defi_dex_quote\",\n \"Get a DEX swap quote without executing. Returns expected output amount and price impact\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug, e.g. uniswap-v3, algebra-v3\"),\n token_in: z.string().describe(\"Input token symbol or address\"),\n token_out: z.string().describe(\"Output token symbol or address\"),\n amount_in: z.string().describe(\"Amount of input token in wei\"),\n },\n async ({ chain, protocol, token_in, token_out, amount_in }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createDex(protocolConfig, chainConfig.effectiveRpcUrl());\n const tokenIn = resolveToken(registry, chainName, token_in);\n const tokenOut = resolveToken(registry, chainName, token_out);\n const result = await adapter.quote({ protocol: protocolConfig.name, token_in: tokenIn, token_out: tokenOut, amount_in: BigInt(amount_in) });\n return { content: [{ type: \"text\", text: ok(result, { chain: chainName, protocol, token_in, token_out }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol, token_in, token_out }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_dex_swap — execute swap\n// ============================================================\n\nserver.tool(\n \"defi_dex_swap\",\n \"Execute a token swap on a DEX. Defaults to dry-run. Set broadcast=true to send transaction\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug, e.g. uniswap-v3\"),\n token_in: z.string().describe(\"Input token symbol or address\"),\n token_out: z.string().describe(\"Output token symbol or address\"),\n amount_in: z.string().describe(\"Amount of input token in wei\"),\n slippage_bps: z.number().optional().describe(\"Slippage tolerance in basis points (default: 50 = 0.5%)\"),\n recipient: z.string().optional().describe(\"Recipient address (default: DEFI_WALLET_ADDRESS)\"),\n broadcast: z.boolean().optional().describe(\"Set true to broadcast (default: false)\"),\n },\n async ({ chain, protocol, token_in, token_out, amount_in, slippage_bps, recipient, broadcast }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createDex(protocolConfig, chainConfig.effectiveRpcUrl());\n const tokenIn = resolveToken(registry, chainName, token_in);\n const tokenOut = resolveToken(registry, chainName, token_out);\n const recipientAddr = (recipient ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n const tx = await adapter.buildSwap({\n protocol: protocolConfig.name,\n token_in: tokenIn,\n token_out: tokenOut,\n amount_in: BigInt(amount_in),\n slippage: { bps: slippage_bps ?? 50 },\n recipient: recipientAddr,\n });\n const executor = makeExecutor(broadcast ?? false, chainConfig.effectiveRpcUrl(), chainConfig.explorer_url);\n const result = await executor.execute(tx);\n return { content: [{ type: \"text\", text: ok(result, { chain: chainName, protocol, token_in, token_out, broadcast: broadcast ?? false }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol, token_in, token_out }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_dex_lp_add — add liquidity\n// ============================================================\n\nserver.tool(\n \"defi_dex_lp_add\",\n \"Add liquidity to a DEX pool. Defaults to dry-run. Set broadcast=true to send transaction\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug, e.g. uniswap-v3\"),\n token_a: z.string().describe(\"First token symbol or address\"),\n token_b: z.string().describe(\"Second token symbol or address\"),\n amount_a: z.string().describe(\"Amount of token A in wei\"),\n amount_b: z.string().describe(\"Amount of token B in wei\"),\n recipient: z.string().optional().describe(\"Recipient address for LP tokens\"),\n broadcast: z.boolean().optional().describe(\"Set true to broadcast (default: false)\"),\n },\n async ({ chain, protocol, token_a, token_b, amount_a, amount_b, recipient, broadcast }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createDex(protocolConfig, chainConfig.effectiveRpcUrl());\n const tokenA = resolveToken(registry, chainName, token_a);\n const tokenB = resolveToken(registry, chainName, token_b);\n const recipientAddr = (recipient ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n const tx = await adapter.buildAddLiquidity({\n protocol: protocolConfig.name,\n token_a: tokenA,\n token_b: tokenB,\n amount_a: BigInt(amount_a),\n amount_b: BigInt(amount_b),\n recipient: recipientAddr,\n });\n const executor = makeExecutor(broadcast ?? false, chainConfig.effectiveRpcUrl(), chainConfig.explorer_url);\n const result = await executor.execute(tx);\n return { content: [{ type: \"text\", text: ok(result, { chain: chainName, protocol, token_a, token_b, broadcast: broadcast ?? false }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_dex_lp_remove — remove liquidity\n// ============================================================\n\nserver.tool(\n \"defi_dex_lp_remove\",\n \"Remove liquidity from a DEX pool. Defaults to dry-run. Set broadcast=true to send transaction\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug, e.g. uniswap-v3\"),\n token_a: z.string().describe(\"First token symbol or address\"),\n token_b: z.string().describe(\"Second token symbol or address\"),\n liquidity: z.string().describe(\"Liquidity amount to remove in wei\"),\n recipient: z.string().optional().describe(\"Recipient address for returned tokens\"),\n broadcast: z.boolean().optional().describe(\"Set true to broadcast (default: false)\"),\n },\n async ({ chain, protocol, token_a, token_b, liquidity, recipient, broadcast }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createDex(protocolConfig, chainConfig.effectiveRpcUrl());\n const tokenA = resolveToken(registry, chainName, token_a);\n const tokenB = resolveToken(registry, chainName, token_b);\n const recipientAddr = (recipient ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n const tx = await adapter.buildRemoveLiquidity({\n protocol: protocolConfig.name,\n token_a: tokenA,\n token_b: tokenB,\n liquidity: BigInt(liquidity),\n recipient: recipientAddr,\n });\n const executor = makeExecutor(broadcast ?? false, chainConfig.effectiveRpcUrl(), chainConfig.explorer_url);\n const result = await executor.execute(tx);\n return { content: [{ type: \"text\", text: ok(result, { chain: chainName, protocol, token_a, token_b, broadcast: broadcast ?? false }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_bridge — cross-chain bridge quote\n// ============================================================\n\nserver.tool(\n \"defi_bridge\",\n \"Get a cross-chain bridge quote via LI.FI, deBridge DLN, or Circle CCTP. Returns estimated output amount and fees\",\n {\n from_chain: z.string().describe(\"Source chain name, e.g. ethereum, arbitrum, base\"),\n to_chain: z.string().describe(\"Destination chain name, e.g. hyperevm, arbitrum\"),\n token: z.string().optional().describe(\"Token symbol to bridge (default: USDC). Use native for native token\"),\n amount: z.string().describe(\"Amount in human-readable units, e.g. '100' for 100 USDC\"),\n recipient: z.string().optional().describe(\"Recipient address on destination chain\"),\n },\n async ({ from_chain, to_chain, token, amount, recipient }) => {\n try {\n const tokenSymbol = token ?? \"USDC\";\n const recipientAddr = recipient ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\";\n\n // Use LI.FI API for a quote\n const LIFI_API = \"https://li.quest/v1\";\n const registry = getRegistry();\n\n let fromChainId: number | undefined;\n let toChainId: number | undefined;\n try {\n fromChainId = registry.getChain(from_chain).chain_id;\n } catch { /* use name */ }\n try {\n toChainId = registry.getChain(to_chain).chain_id;\n } catch { /* use name */ }\n\n const params = new URLSearchParams({\n fromChain: fromChainId ? String(fromChainId) : from_chain,\n toChain: toChainId ? String(toChainId) : to_chain,\n fromToken: tokenSymbol,\n toToken: tokenSymbol,\n fromAmount: String(Math.round(parseFloat(amount) * 1e6)), // USDC decimals\n toAddress: recipientAddr,\n });\n\n const res = await fetch(`${LIFI_API}/quote?${params}`, {\n headers: { Accept: \"application/json\" },\n });\n\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`LI.FI quote failed (${res.status}): ${text.slice(0, 200)}`);\n }\n\n const data = await res.json() as Record<string, unknown>;\n const estimate = data.estimate as Record<string, unknown> | undefined;\n\n const quote = {\n from_chain,\n to_chain,\n token: tokenSymbol,\n amount_in: amount,\n amount_out: estimate?.toAmount ? String(Number(estimate.toAmount as string) / 1e6) : \"unknown\",\n fee_costs: estimate?.feeCosts ?? [],\n gas_costs: estimate?.gasCosts ?? [],\n execution_duration_seconds: estimate?.executionDuration ?? \"unknown\",\n tool: (data.tool as string) ?? \"unknown\",\n raw: data,\n };\n\n return { content: [{ type: \"text\", text: ok(quote, { from_chain, to_chain, token: tokenSymbol }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { from_chain, to_chain }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_vault_info — vault information\n// ============================================================\n\nserver.tool(\n \"defi_vault_info\",\n \"Get vault information: TVL, APY, total shares, and underlying asset details\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug for the vault\"),\n },\n async ({ chain, protocol }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createVault(protocolConfig, chainConfig.effectiveRpcUrl());\n const info = await adapter.getVaultInfo();\n return { content: [{ type: \"text\", text: ok(info, { chain: chainName, protocol }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_staking_info — staking information\n// ============================================================\n\nserver.tool(\n \"defi_staking_info\",\n \"Get liquid staking protocol info: exchange rate, APY, total staked\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug for the staking protocol\"),\n },\n async ({ chain, protocol }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createLiquidStaking(protocolConfig, chainConfig.effectiveRpcUrl());\n const info = await adapter.getInfo();\n return { content: [{ type: \"text\", text: ok(info, { chain: chainName, protocol }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_price — asset price query\n// ============================================================\n\nserver.tool(\n \"defi_price\",\n \"Query asset price from on-chain oracles (Aave V3) and/or DEX spot prices\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n asset: z.string().describe(\"Token symbol (e.g. WBTC) or address (0x...)\"),\n source: z.enum([\"oracle\", \"dex\", \"all\"]).optional().describe(\"Price source: oracle, dex, or all (default: all)\"),\n },\n async ({ chain, asset, source }) => {\n try {\n const chainName = (chain ?? \"hyperevm\").toLowerCase();\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const rpcUrl = chainConfig.effectiveRpcUrl();\n const srcMode = source ?? \"all\";\n\n let assetAddr: Address;\n let assetSymbol: string;\n try {\n if (/^0x[0-9a-fA-F]{40}$/.test(asset)) {\n assetAddr = asset as Address;\n assetSymbol = asset;\n } else {\n const token = registry.resolveToken(chainName, asset);\n assetAddr = token.address as Address;\n assetSymbol = token.symbol;\n }\n } catch (e) {\n return { content: [{ type: \"text\", text: err(`Could not resolve asset: ${asset}`) }], isError: true };\n }\n\n const { ProtocolCategory } = await import(\"@hypurrquant/defi-core\");\n const { createOracleFromLending } = await import(\"@hypurrquant/defi-protocols\");\n\n const prices: Array<{ source: string; source_type: string; price: number }> = [];\n\n if (srcMode === \"all\" || srcMode === \"oracle\") {\n const lendingProtos = registry.getProtocolsForChain(chainName)\n .filter(p => p.category === ProtocolCategory.Lending);\n await Promise.all(lendingProtos.map(async (p) => {\n try {\n const oracle = createOracleFromLending(p, rpcUrl);\n const price = await oracle.getPrice(assetAddr);\n if (price.price_f64 > 0) prices.push({ source: p.slug, source_type: \"oracle\", price: price.price_f64 });\n } catch { /* skip */ }\n }));\n }\n\n if (srcMode === \"all\" || srcMode === \"dex\") {\n const { DexSpotPrice } = await import(\"@hypurrquant/defi-protocols\");\n const USDC_SYMBOL = \"USDC\";\n let usdcAddr: Address | undefined;\n let usdcDecimals = 6;\n try {\n const usdcToken = registry.resolveToken(chainName, USDC_SYMBOL);\n usdcAddr = usdcToken.address as Address;\n usdcDecimals = usdcToken.decimals;\n } catch { /* no USDC on chain */ }\n\n // Determine asset decimals from registry if resolved by symbol, else default 18\n let assetDecimals = 18;\n if (!/^0x[0-9a-fA-F]{40}$/.test(asset)) {\n try { assetDecimals = registry.resolveToken(chainName, asset).decimals; } catch { /* default 18 */ }\n }\n\n if (usdcAddr && assetAddr.toLowerCase() !== usdcAddr.toLowerCase()) {\n const dexProtos = registry.getProtocolsForChain(chainName)\n .filter(p => p.category === ProtocolCategory.Dex);\n await Promise.all(dexProtos.map(async (p) => {\n try {\n const dex = createDex(p, rpcUrl);\n const priceData = await DexSpotPrice.getPrice(dex, assetAddr, assetDecimals, usdcAddr!, usdcDecimals);\n if (priceData.price_f64 > 0) prices.push({ source: p.slug, source_type: \"dex\", price: priceData.price_f64 });\n } catch { /* skip */ }\n }));\n }\n }\n\n if (prices.length === 0) {\n return { content: [{ type: \"text\", text: err(`No price data found for ${assetSymbol} on ${chainName}`) }], isError: true };\n }\n\n const priceValues = prices.map(p => p.price);\n const avg = priceValues.reduce((a, b) => a + b, 0) / priceValues.length;\n const min = Math.min(...priceValues);\n const max = Math.max(...priceValues);\n const spread = max > 0 ? ((max - min) / max) * 100 : 0;\n\n const report = {\n asset: assetSymbol,\n asset_address: assetAddr,\n prices,\n average_price: Math.round(avg * 100) / 100,\n max_spread_pct: Math.round(spread * 100) / 100,\n };\n\n return { content: [{ type: \"text\", text: ok(report, { chain: chainName, asset: assetSymbol, source: srcMode }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { asset }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_scan — exploit / price manipulation detection\n// ============================================================\n\nserver.tool(\n \"defi_scan\",\n \"Scan for potential price manipulation or exploit opportunities by comparing oracle prices vs DEX spot prices across lending protocols\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n min_spread_pct: z.number().optional().describe(\"Minimum oracle-vs-dex spread % to flag (default: 5)\"),\n },\n async ({ chain, min_spread_pct }) => {\n try {\n const chainName = (chain ?? \"hyperevm\").toLowerCase();\n const minSpread = min_spread_pct ?? 5;\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const rpcUrl = chainConfig.effectiveRpcUrl();\n\n const { ProtocolCategory } = await import(\"@hypurrquant/defi-core\");\n const { createOracleFromLending, DexSpotPrice } = await import(\"@hypurrquant/defi-protocols\");\n\n const tokens = registry.tokens.get(chainName) ?? [];\n const lendingProtos = registry.getProtocolsForChain(chainName)\n .filter(p => p.category === ProtocolCategory.Lending);\n const dexProtos = registry.getProtocolsForChain(chainName)\n .filter(p => p.category === ProtocolCategory.Dex);\n\n let usdcAddr: Address | undefined;\n try {\n usdcAddr = registry.resolveToken(chainName, \"USDC\").address as Address;\n } catch { /* no USDC */ }\n\n const findings: Array<{\n token: string;\n address: string;\n oracle_price: number;\n dex_price: number;\n spread_pct: number;\n verdict: string;\n }> = [];\n\n for (const token of tokens.slice(0, 20)) {\n const addr = token.address as Address;\n if (!usdcAddr || addr.toLowerCase() === usdcAddr.toLowerCase()) continue;\n\n let oraclePrice = 0;\n let dexPrice = 0;\n\n for (const p of lendingProtos) {\n try {\n const oracle = createOracleFromLending(p, rpcUrl);\n const priceData = await oracle.getPrice(addr);\n if (priceData.price_f64 > 0) { oraclePrice = priceData.price_f64; break; }\n } catch { /* skip */ }\n }\n\n for (const p of dexProtos) {\n try {\n const dex = createDex(p, rpcUrl);\n const priceData = await DexSpotPrice.getPrice(dex, addr, token.decimals, usdcAddr!, 6);\n if (priceData.price_f64 > 0) { dexPrice = priceData.price_f64; break; }\n } catch { /* skip */ }\n }\n\n if (oraclePrice > 0 && dexPrice > 0) {\n const spread = Math.abs(oraclePrice - dexPrice) / Math.max(oraclePrice, dexPrice) * 100;\n if (spread >= minSpread) {\n findings.push({\n token: token.symbol,\n address: addr,\n oracle_price: Math.round(oraclePrice * 10000) / 10000,\n dex_price: Math.round(dexPrice * 10000) / 10000,\n spread_pct: Math.round(spread * 100) / 100,\n verdict: spread >= 20 ? \"HIGH_RISK\" : spread >= 10 ? \"MEDIUM_RISK\" : \"LOW_RISK\",\n });\n }\n }\n }\n\n findings.sort((a, b) => b.spread_pct - a.spread_pct);\n\n return {\n content: [{\n type: \"text\",\n text: ok(\n { chain: chainName, findings, scanned_tokens: Math.min(tokens.length, 20), min_spread_pct: minSpread },\n { finding_count: findings.length },\n ),\n }],\n };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e)) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_portfolio — portfolio overview\n// ============================================================\n\nserver.tool(\n \"defi_portfolio\",\n \"Get a portfolio overview for a wallet address: lending positions, token balances, and health factors across all protocols on a chain\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n address: z.string().describe(\"Wallet address to query (0x...)\"),\n },\n async ({ chain, address }) => {\n try {\n const chainName = (chain ?? \"hyperevm\").toLowerCase();\n\n if (!/^0x[0-9a-fA-F]{40}$/.test(address)) {\n return { content: [{ type: \"text\", text: err(`Invalid address: ${address}`) }], isError: true };\n }\n\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const rpcUrl = chainConfig.effectiveRpcUrl();\n const user = address as Address;\n\n const { ProtocolCategory, multicallRead } = await import(\"@hypurrquant/defi-core\");\n const { createLending: _createLending } = await import(\"@hypurrquant/defi-protocols\");\n const { encodeFunctionData, parseAbi } = await import(\"viem\");\n\n const POOL_ABI = parseAbi([\n \"function getUserAccountData(address user) external view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)\",\n ]);\n\n const lendingProtos = registry.getProtocolsForChain(chainName)\n .filter(p => p.category === ProtocolCategory.Lending);\n\n const lendingPositions: Array<{\n protocol: string;\n total_collateral_usd: number;\n total_debt_usd: number;\n available_borrows_usd: number;\n health_factor: number;\n ltv: number;\n }> = [];\n\n for (const p of lendingProtos) {\n const poolAddr = (p.contracts as Record<string, string> | undefined)?.pool;\n if (!poolAddr) continue;\n try {\n const callData = encodeFunctionData({ abi: POOL_ABI, functionName: \"getUserAccountData\", args: [user] });\n const results = await multicallRead(rpcUrl, [[poolAddr as Address, callData as `0x${string}`]]);\n const raw = results[0];\n if (!raw || raw.length < 2 + 6 * 64) continue;\n const hex = raw.slice(2);\n const decodeU256 = (offset: number) => BigInt(\"0x\" + hex.slice(offset * 64, offset * 64 + 64));\n const totalCollateral = Number(decodeU256(0)) / 1e8;\n const totalDebt = Number(decodeU256(1)) / 1e8;\n const availableBorrows = Number(decodeU256(2)) / 1e8;\n const ltv = Number(decodeU256(4)) / 100;\n const hfRaw = decodeU256(5);\n const healthFactor = hfRaw >= BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\") / 2n\n ? 999999\n : Math.round(Number(hfRaw) / 1e16) / 100;\n\n if (totalCollateral > 0 || totalDebt > 0) {\n lendingPositions.push({\n protocol: p.slug,\n total_collateral_usd: Math.round(totalCollateral * 100) / 100,\n total_debt_usd: Math.round(totalDebt * 100) / 100,\n available_borrows_usd: Math.round(availableBorrows * 100) / 100,\n health_factor: healthFactor,\n ltv,\n });\n }\n } catch { /* skip */ }\n }\n\n const totalCollateralUsd = lendingPositions.reduce((s, p) => s + p.total_collateral_usd, 0);\n const totalDebtUsd = lendingPositions.reduce((s, p) => s + p.total_debt_usd, 0);\n\n const portfolio = {\n address,\n chain: chainName,\n lending_positions: lendingPositions,\n summary: {\n total_collateral_usd: Math.round(totalCollateralUsd * 100) / 100,\n total_debt_usd: Math.round(totalDebtUsd * 100) / 100,\n net_position_usd: Math.round((totalCollateralUsd - totalDebtUsd) * 100) / 100,\n active_protocols: lendingPositions.length,\n },\n };\n\n return { content: [{ type: \"text\", text: ok(portfolio, { chain: chainName, address }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { address }) }], isError: true };\n }\n },\n);\n\n// ── Start server ──\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n","import { createPublicClient, createWalletClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type { ActionResult, DeFiTx, TxStatus } from \"@hypurrquant/defi-core\";\n\nconst ERC20_ABI = parseAbi([\n \"function allowance(address owner, address spender) external view returns (uint256)\",\n \"function approve(address spender, uint256 amount) external returns (bool)\",\n]);\n\n/** Gas buffer multiplier: 120% over estimated gas (20% headroom) */\nconst GAS_BUFFER_BPS = 12000n;\n\n/** Default max priority fee (tip) in wei — 20 gwei (safe for Mantle + EVM chains) */\nconst DEFAULT_PRIORITY_FEE_WEI = 20_000_000_000n;\n\n/** Max gas limit cap — Mantle uses high gas units (up to 5B for complex txs) */\nconst MAX_GAS_LIMIT = 5_000_000_000n; // 5B\n\nexport class Executor {\n readonly dryRun: boolean;\n readonly rpcUrl: string | undefined;\n readonly explorerUrl: string | undefined;\n\n constructor(broadcast: boolean, rpcUrl?: string, explorerUrl?: string) {\n this.dryRun = !broadcast;\n this.rpcUrl = rpcUrl;\n this.explorerUrl = explorerUrl;\n }\n\n /** Apply 20% buffer to a gas estimate */\n private static applyGasBuffer(gas: bigint): bigint {\n return (gas * GAS_BUFFER_BPS) / 10000n;\n }\n\n /**\n * Check allowance for a single token/spender pair and send an approve tx if needed.\n * Only called in broadcast mode (not dry-run).\n */\n private async checkAndApprove(\n token: Address,\n spender: Address,\n amount: bigint,\n owner: Address,\n publicClient: ReturnType<typeof createPublicClient>,\n walletClient: ReturnType<typeof createWalletClient>,\n ): Promise<void> {\n const allowance = await publicClient.readContract({\n address: token,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [owner, spender],\n });\n\n if (allowance >= amount) return;\n\n process.stderr.write(\n ` Approving ${amount} of ${token} for ${spender}...\\n`,\n );\n\n const approveData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [spender, amount],\n });\n\n const rpcUrl = this.rpcUrl!;\n const gasLimit = await (async () => {\n try {\n const estimated = await publicClient.estimateGas({\n to: token,\n data: approveData,\n account: owner,\n });\n const buffered = Executor.applyGasBuffer(estimated);\n return buffered > MAX_GAS_LIMIT ? MAX_GAS_LIMIT : buffered;\n } catch {\n return 80_000n;\n }\n })();\n\n const [maxFeePerGas, maxPriorityFeePerGas] = await this.fetchEip1559Fees(rpcUrl);\n\n const approveTxHash = await walletClient.sendTransaction({\n chain: null,\n account: walletClient.account!,\n to: token,\n data: approveData,\n gas: gasLimit > 0n ? gasLimit : undefined,\n maxFeePerGas: maxFeePerGas > 0n ? maxFeePerGas : undefined,\n maxPriorityFeePerGas: maxPriorityFeePerGas > 0n ? maxPriorityFeePerGas : undefined,\n });\n\n const approveTxUrl = this.explorerUrl\n ? `${this.explorerUrl}/tx/${approveTxHash}`\n : undefined;\n process.stderr.write(` Approve tx: ${approveTxHash}\\n`);\n if (approveTxUrl) process.stderr.write(` Explorer: ${approveTxUrl}\\n`);\n\n await publicClient.waitForTransactionReceipt({ hash: approveTxHash });\n process.stderr.write(\n ` Approved ${amount} of ${token} for ${spender}\\n`,\n );\n }\n\n /** Fetch EIP-1559 fee params from the network. Returns [maxFeePerGas, maxPriorityFeePerGas]. */\n private async fetchEip1559Fees(rpcUrl: string): Promise<[bigint, bigint]> {\n try {\n const client = createPublicClient({ transport: http(rpcUrl) });\n const gasPrice = await client.getGasPrice();\n let priorityFee = DEFAULT_PRIORITY_FEE_WEI;\n try {\n priorityFee = await client.estimateMaxPriorityFeePerGas();\n } catch {\n // fallback to default\n }\n const maxFee = gasPrice * 2n + priorityFee;\n return [maxFee, priorityFee];\n } catch {\n return [0n, 0n];\n }\n }\n\n /** Estimate gas dynamically with buffer, falling back to a hardcoded estimate */\n private async estimateGasWithBuffer(\n rpcUrl: string,\n tx: DeFiTx,\n from: `0x${string}`,\n ): Promise<bigint> {\n try {\n const client = createPublicClient({ transport: http(rpcUrl) });\n const estimated = await client.estimateGas({\n to: tx.to,\n data: tx.data,\n value: tx.value,\n account: from,\n });\n if (estimated > 0n) {\n const buffered = Executor.applyGasBuffer(estimated);\n return buffered > MAX_GAS_LIMIT ? MAX_GAS_LIMIT : buffered;\n }\n } catch {\n // fallback\n }\n return tx.gas_estimate ? BigInt(tx.gas_estimate) : 0n;\n }\n\n /** Simulate a transaction via eth_call + eth_estimateGas */\n private async simulate(tx: DeFiTx): Promise<ActionResult> {\n const rpcUrl = this.rpcUrl;\n if (!rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL — cannot simulate. Set HYPEREVM_RPC_URL.\");\n }\n\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const privateKey = process.env[\"DEFI_PRIVATE_KEY\"];\n const from: `0x${string}` = privateKey\n ? privateKeyToAccount(privateKey as `0x${string}`).address\n : \"0x0000000000000000000000000000000000000001\";\n\n try {\n await client.call({ to: tx.to, data: tx.data, value: tx.value, account: from });\n\n const gasEstimate = await this.estimateGasWithBuffer(rpcUrl, tx, from);\n const [maxFee, priorityFee] = await this.fetchEip1559Fees(rpcUrl);\n\n return {\n tx_hash: undefined,\n status: \"simulated\" as TxStatus,\n gas_used: gasEstimate > 0n ? Number(gasEstimate) : undefined,\n description: tx.description,\n details: {\n to: tx.to,\n from,\n data: tx.data,\n value: tx.value.toString(),\n gas_estimate: gasEstimate.toString(),\n max_fee_per_gas_gwei: (Number(maxFee) / 1e9).toFixed(4),\n max_priority_fee_gwei: (Number(priorityFee) / 1e9).toFixed(4),\n mode: \"simulated\",\n result: \"success\",\n },\n };\n } catch (e: unknown) {\n const errMsg = String(e);\n const revertReason = extractRevertReason(errMsg);\n\n return {\n tx_hash: undefined,\n status: \"simulation_failed\" as TxStatus,\n gas_used: tx.gas_estimate,\n description: tx.description,\n details: {\n to: tx.to,\n from,\n data: tx.data,\n value: tx.value.toString(),\n mode: \"simulated\",\n result: \"revert\",\n revert_reason: revertReason,\n },\n };\n }\n }\n\n async execute(tx: DeFiTx): Promise<ActionResult> {\n if (this.dryRun) {\n if (this.rpcUrl) {\n return this.simulate(tx);\n }\n\n return {\n tx_hash: undefined,\n status: \"dry_run\" as TxStatus,\n gas_used: tx.gas_estimate,\n description: tx.description,\n details: {\n to: tx.to,\n data: tx.data,\n value: tx.value.toString(),\n mode: \"dry_run\",\n },\n };\n }\n\n // === Broadcast mode ===\n const privateKey = process.env[\"DEFI_PRIVATE_KEY\"];\n if (!privateKey) {\n throw DefiError.invalidParam(\n \"DEFI_PRIVATE_KEY environment variable not set. Required for --broadcast.\",\n );\n }\n\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n\n const rpcUrl = this.rpcUrl;\n if (!rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured for broadcasting\");\n }\n\n const publicClient = createPublicClient({ transport: http(rpcUrl) });\n const walletClient = createWalletClient({ account, transport: http(rpcUrl) });\n\n // Auto-approve ERC20 tokens if needed\n if (tx.approvals && tx.approvals.length > 0) {\n for (const approval of tx.approvals) {\n await this.checkAndApprove(\n approval.token,\n approval.spender,\n approval.amount,\n account.address,\n publicClient,\n walletClient,\n );\n }\n }\n\n // Dynamic gas estimation with buffer\n const gasLimit = await this.estimateGasWithBuffer(rpcUrl, tx, account.address);\n\n // EIP-1559 gas pricing\n const [maxFeePerGas, maxPriorityFeePerGas] = await this.fetchEip1559Fees(rpcUrl);\n\n process.stderr.write(`Broadcasting transaction to ${rpcUrl}...\\n`);\n if (gasLimit > 0n) {\n process.stderr.write(` Gas limit: ${gasLimit} (with 20% buffer)\\n`);\n }\n\n const txHash = await walletClient.sendTransaction({\n chain: null,\n to: tx.to,\n data: tx.data,\n value: tx.value,\n gas: gasLimit > 0n ? gasLimit : undefined,\n maxFeePerGas: maxFeePerGas > 0n ? maxFeePerGas : undefined,\n maxPriorityFeePerGas: maxPriorityFeePerGas > 0n ? maxPriorityFeePerGas : undefined,\n });\n\n const txUrl = this.explorerUrl ? `${this.explorerUrl}/tx/${txHash}` : undefined;\n process.stderr.write(`Transaction sent: ${txHash}\\n`);\n if (txUrl) process.stderr.write(`Explorer: ${txUrl}\\n`);\n process.stderr.write(\"Waiting for confirmation...\\n\");\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n const status = receipt.status === \"success\" ? \"confirmed\" : \"failed\";\n\n return {\n tx_hash: txHash,\n status: status as TxStatus,\n gas_used: receipt.gasUsed ? Number(receipt.gasUsed) : undefined,\n description: tx.description,\n details: {\n to: tx.to,\n from: account.address,\n block_number: receipt.blockNumber?.toString(),\n gas_limit: gasLimit.toString(),\n gas_used: receipt.gasUsed?.toString(),\n explorer_url: txUrl,\n mode: \"broadcast\",\n },\n };\n }\n}\n\n/** Extract a human-readable revert reason from an RPC error message */\nfunction extractRevertReason(err: string): string {\n for (const marker of [\"execution reverted:\", \"revert:\", \"Error(\"]) {\n const pos = err.indexOf(marker);\n if (pos !== -1) return err.slice(pos);\n }\n return err.length > 200 ? err.slice(0, 200) + \"...\" : err;\n}\n"],"mappings":"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","names":["endPtr","encodeFunctionData","parseAbi","TxStatus","InterestRateMode","ProtocolCategory","encodeFunctionData","parseAbi","createPublicClient","http","decodeFunctionResult","decodeAbiParameters","zeroAddress","u256ToF64","DefiError","abi","POOL_ABI","ERC20_ABI","ORACLE_ABI","SECONDS_PER_YEAR","init_dist","client","amountOut","best","result","data","InterestRateMode","init_dist","init_dist","createPublicClient","http","parseAbi","encodeFunctionData","ERC20_ABI","err","ProtocolCategory","createOracleFromLending","DexSpotPrice","multicallRead","encodeFunctionData","parseAbi","POOL_ABI","decodeU256"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/error.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/util.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/date.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/primitive.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/extract.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/struct.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/parse.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/stringify.js","../../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/index.js","../../defi-core/src/types.ts","../../defi-core/src/error.ts","../../defi-core/src/json.ts","../../defi-core/src/erc20.ts","../../defi-core/src/provider.ts","../../defi-core/src/multicall.ts","../../defi-core/src/registry/chain.ts","../../defi-core/src/registry/protocol.ts","../../defi-core/src/registry/registry.ts","../../defi-protocols/src/factory.ts","../../defi-protocols/src/dex/uniswap_v3.ts","../../defi-protocols/src/dex/uniswap_v2.ts","../../defi-protocols/src/dex/algebra_v3.ts","../../defi-protocols/src/dex/tick_math.ts","../../defi-protocols/src/dex/balancer_v3.ts","../../defi-protocols/src/dex/curve.ts","../../defi-protocols/src/dex/solidly.ts","../../defi-protocols/src/dex/thena_cl.ts","../../defi-protocols/src/dex/hybra_gauge.ts","../../defi-protocols/src/dex/woofi.ts","../../defi-protocols/src/dex/solidly_gauge.ts","../../defi-protocols/src/dex/masterchef.ts","../../defi-protocols/src/dex/merchant_moe_lb.ts","../../defi-protocols/src/dex/kittenswap_farming.ts","../../defi-protocols/src/lending/aave_v3.ts","../../defi-protocols/src/lending/aave_v2.ts","../../defi-protocols/src/lending/aave_oracle.ts","../../defi-protocols/src/lending/compound_v2.ts","../../defi-protocols/src/lending/compound_v3.ts","../../defi-protocols/src/lending/euler_v2.ts","../../defi-protocols/src/lending/morpho.ts","../../defi-protocols/src/cdp/felix.ts","../../defi-protocols/src/cdp/felix_oracle.ts","../../defi-protocols/src/vault/erc4626.ts","../../defi-protocols/src/liquid_staking/generic_lst.ts","../../defi-protocols/src/liquid_staking/sthype.ts","../../defi-protocols/src/liquid_staking/kinetiq.ts","../../defi-protocols/src/yield_source/pendle.ts","../../defi-protocols/src/yield_source/generic_yield.ts","../../defi-protocols/src/derivatives/hlp.ts","../../defi-protocols/src/derivatives/generic_derivatives.ts","../../defi-protocols/src/options/rysk.ts","../../defi-protocols/src/options/generic_options.ts","../../defi-protocols/src/nft/erc721.ts","../../defi-protocols/src/dex/dex_price.ts","../src/mcp-server.ts","../src/executor.ts"],"sourcesContent":["/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nfunction getLineColFromPtr(string, ptr) {\n let lines = string.slice(0, ptr).split(/\\r\\n|\\n|\\r/g);\n return [lines.length, lines.pop().length + 1];\n}\nfunction makeCodeBlock(string, line, column) {\n let lines = string.split(/\\r\\n|\\n|\\r/g);\n let codeblock = '';\n let numberLen = (Math.log10(line + 1) | 0) + 1;\n for (let i = line - 1; i <= line + 1; i++) {\n let l = lines[i - 1];\n if (!l)\n continue;\n codeblock += i.toString().padEnd(numberLen, ' ');\n codeblock += ': ';\n codeblock += l;\n codeblock += '\\n';\n if (i === line) {\n codeblock += ' '.repeat(numberLen + column + 2);\n codeblock += '^\\n';\n }\n }\n return codeblock;\n}\nexport class TomlError extends Error {\n line;\n column;\n codeblock;\n constructor(message, options) {\n const [line, column] = getLineColFromPtr(options.toml, options.ptr);\n const codeblock = makeCodeBlock(options.toml, line, column);\n super(`Invalid TOML document: ${message}\\n\\n${codeblock}`, options);\n this.line = line;\n this.column = column;\n this.codeblock = codeblock;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { TomlError } from './error.js';\nfunction isEscaped(str, ptr) {\n let i = 0;\n while (str[ptr - ++i] === '\\\\')\n ;\n return --i && (i % 2);\n}\nexport function indexOfNewline(str, start = 0, end = str.length) {\n let idx = str.indexOf('\\n', start);\n if (str[idx - 1] === '\\r')\n idx--;\n return idx <= end ? idx : -1;\n}\nexport function skipComment(str, ptr) {\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '\\n')\n return i;\n if (c === '\\r' && str[i + 1] === '\\n')\n return i + 1;\n if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in comments', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n return str.length;\n}\nexport function skipVoid(str, ptr, banNewLines, banComments) {\n let c;\n while ((c = str[ptr]) === ' ' || c === '\\t' || (!banNewLines && (c === '\\n' || c === '\\r' && str[ptr + 1] === '\\n')))\n ptr++;\n return banComments || c !== '#'\n ? ptr\n : skipVoid(str, skipComment(str, ptr), banNewLines);\n}\nexport function skipUntil(str, ptr, sep, end, banNewLines = false) {\n if (!end) {\n ptr = indexOfNewline(str, ptr);\n return ptr < 0 ? str.length : ptr;\n }\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '#') {\n i = indexOfNewline(str, i);\n }\n else if (c === sep) {\n return i + 1;\n }\n else if (c === end || (banNewLines && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n')))) {\n return i;\n }\n }\n throw new TomlError('cannot find end of structure', {\n toml: str,\n ptr: ptr\n });\n}\nexport function getStringEnd(str, seek) {\n let first = str[seek];\n let target = first === str[seek + 1] && str[seek + 1] === str[seek + 2]\n ? str.slice(seek, seek + 3)\n : first;\n seek += target.length - 1;\n do\n seek = str.indexOf(target, ++seek);\n while (seek > -1 && first !== \"'\" && isEscaped(str, seek));\n if (seek > -1) {\n seek += target.length;\n if (target.length > 1) {\n if (str[seek] === first)\n seek++;\n if (str[seek] === first)\n seek++;\n }\n }\n return seek;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet DATE_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})?[T ]?(?:(\\d{2}):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?(Z|[-+]\\d{2}:\\d{2})?$/i;\nexport class TomlDate extends Date {\n #hasDate = false;\n #hasTime = false;\n #offset = null;\n constructor(date) {\n let hasDate = true;\n let hasTime = true;\n let offset = 'Z';\n if (typeof date === 'string') {\n let match = date.match(DATE_TIME_RE);\n if (match) {\n if (!match[1]) {\n hasDate = false;\n date = `0000-01-01T${date}`;\n }\n hasTime = !!match[2];\n // Make sure to use T instead of a space. Breaks in case of extreme values otherwise.\n hasTime && date[10] === ' ' && (date = date.replace(' ', 'T'));\n // Do not allow rollover hours.\n if (match[2] && +match[2] > 23) {\n date = '';\n }\n else {\n offset = match[3] || null;\n date = date.toUpperCase();\n if (!offset && hasTime)\n date += 'Z';\n }\n }\n else {\n date = '';\n }\n }\n super(date);\n if (!isNaN(this.getTime())) {\n this.#hasDate = hasDate;\n this.#hasTime = hasTime;\n this.#offset = offset;\n }\n }\n isDateTime() {\n return this.#hasDate && this.#hasTime;\n }\n isLocal() {\n return !this.#hasDate || !this.#hasTime || !this.#offset;\n }\n isDate() {\n return this.#hasDate && !this.#hasTime;\n }\n isTime() {\n return this.#hasTime && !this.#hasDate;\n }\n isValid() {\n return this.#hasDate || this.#hasTime;\n }\n toISOString() {\n let iso = super.toISOString();\n // Local Date\n if (this.isDate())\n return iso.slice(0, 10);\n // Local Time\n if (this.isTime())\n return iso.slice(11, 23);\n // Local DateTime\n if (this.#offset === null)\n return iso.slice(0, -1);\n // Offset DateTime\n if (this.#offset === 'Z')\n return iso;\n // This part is quite annoying: JS strips the original timezone from the ISO string representation\n // Instead of using a \"modified\" date and \"Z\", we restore the representation \"as authored\"\n let offset = (+(this.#offset.slice(1, 3)) * 60) + +(this.#offset.slice(4, 6));\n offset = this.#offset[0] === '-' ? offset : -offset;\n let offsetDate = new Date(this.getTime() - (offset * 60e3));\n return offsetDate.toISOString().slice(0, -1) + this.#offset;\n }\n static wrapAsOffsetDateTime(jsDate, offset = 'Z') {\n let date = new TomlDate(jsDate);\n date.#offset = offset;\n return date;\n }\n static wrapAsLocalDateTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#offset = null;\n return date;\n }\n static wrapAsLocalDate(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasTime = false;\n date.#offset = null;\n return date;\n }\n static wrapAsLocalTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasDate = false;\n date.#offset = null;\n return date;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { skipVoid } from './util.js';\nimport { TomlDate } from './date.js';\nimport { TomlError } from './error.js';\nlet INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\\d(_?\\d)*))$/;\nlet FLOAT_REGEX = /^[+-]?\\d(_?\\d)*(\\.\\d(_?\\d)*)?([eE][+-]?\\d(_?\\d)*)?$/;\nlet LEADING_ZERO = /^[+-]?0[0-9_]/;\nlet ESCAPE_REGEX = /^[0-9a-f]{2,8}$/i;\nlet ESC_MAP = {\n b: '\\b',\n t: '\\t',\n n: '\\n',\n f: '\\f',\n r: '\\r',\n e: '\\x1b',\n '\"': '\"',\n '\\\\': '\\\\',\n};\nexport function parseString(str, ptr = 0, endPtr = str.length) {\n let isLiteral = str[ptr] === '\\'';\n let isMultiline = str[ptr++] === str[ptr] && str[ptr] === str[ptr + 1];\n if (isMultiline) {\n endPtr -= 2;\n if (str[ptr += 2] === '\\r')\n ptr++;\n if (str[ptr] === '\\n')\n ptr++;\n }\n let tmp = 0;\n let isEscape;\n let parsed = '';\n let sliceStart = ptr;\n while (ptr < endPtr - 1) {\n let c = str[ptr++];\n if (c === '\\n' || (c === '\\r' && str[ptr] === '\\n')) {\n if (!isMultiline) {\n throw new TomlError('newlines are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n }\n else if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n if (isEscape) {\n isEscape = false;\n if (c === 'x' || c === 'u' || c === 'U') {\n // Unicode escape\n let code = str.slice(ptr, (ptr += (c === 'x' ? 2 : c === 'u' ? 4 : 8)));\n if (!ESCAPE_REGEX.test(code)) {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n try {\n parsed += String.fromCodePoint(parseInt(code, 16));\n }\n catch {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n }\n else if (isMultiline && (c === '\\n' || c === ' ' || c === '\\t' || c === '\\r')) {\n // Multiline escape\n ptr = skipVoid(str, ptr - 1, true);\n if (str[ptr] !== '\\n' && str[ptr] !== '\\r') {\n throw new TomlError('invalid escape: only line-ending whitespace may be escaped', {\n toml: str,\n ptr: tmp,\n });\n }\n ptr = skipVoid(str, ptr);\n }\n else if (c in ESC_MAP) {\n // Classic escape\n parsed += ESC_MAP[c];\n }\n else {\n throw new TomlError('unrecognized escape sequence', {\n toml: str,\n ptr: tmp,\n });\n }\n sliceStart = ptr;\n }\n else if (!isLiteral && c === '\\\\') {\n tmp = ptr - 1;\n isEscape = true;\n parsed += str.slice(sliceStart, tmp);\n }\n }\n return parsed + str.slice(sliceStart, endPtr - 1);\n}\nexport function parseValue(value, toml, ptr, integersAsBigInt) {\n // Constant values\n if (value === 'true')\n return true;\n if (value === 'false')\n return false;\n if (value === '-inf')\n return -Infinity;\n if (value === 'inf' || value === '+inf')\n return Infinity;\n if (value === 'nan' || value === '+nan' || value === '-nan')\n return NaN;\n // Avoid FP representation of -0\n if (value === '-0')\n return integersAsBigInt ? 0n : 0;\n // Numbers\n let isInt = INT_REGEX.test(value);\n if (isInt || FLOAT_REGEX.test(value)) {\n if (LEADING_ZERO.test(value)) {\n throw new TomlError('leading zeroes are not allowed', {\n toml: toml,\n ptr: ptr,\n });\n }\n value = value.replace(/_/g, '');\n let numeric = +value;\n if (isNaN(numeric)) {\n throw new TomlError('invalid number', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt) {\n if ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {\n throw new TomlError('integer value cannot be represented losslessly', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt || integersAsBigInt === true)\n numeric = BigInt(value);\n }\n return numeric;\n }\n const date = new TomlDate(value);\n if (!date.isValid()) {\n throw new TomlError('invalid value', {\n toml: toml,\n ptr: ptr,\n });\n }\n return date;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString, parseValue } from './primitive.js';\nimport { parseArray, parseInlineTable } from './struct.js';\nimport { skipVoid, skipUntil, skipComment, getStringEnd } from './util.js';\nimport { TomlError } from './error.js';\nfunction sliceAndTrimEndOf(str, startPtr, endPtr) {\n let value = str.slice(startPtr, endPtr);\n let commentIdx = value.indexOf('#');\n if (commentIdx > -1) {\n // The call to skipComment allows to \"validate\" the comment\n // (absence of control characters)\n skipComment(str, commentIdx);\n value = value.slice(0, commentIdx);\n }\n return [value.trimEnd(), commentIdx];\n}\nexport function extractValue(str, ptr, end, depth, integersAsBigInt) {\n if (depth === 0) {\n throw new TomlError('document contains excessively nested structures. aborting.', {\n toml: str,\n ptr: ptr\n });\n }\n let c = str[ptr];\n if (c === '[' || c === '{') {\n let [value, endPtr] = c === '['\n ? parseArray(str, ptr, depth, integersAsBigInt)\n : parseInlineTable(str, ptr, depth, integersAsBigInt);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] === ',')\n endPtr++;\n else if (str[endPtr] !== end) {\n throw new TomlError('expected comma or end of structure', {\n toml: str,\n ptr: endPtr,\n });\n }\n }\n return [value, endPtr];\n }\n let endPtr;\n if (c === '\"' || c === \"'\") {\n endPtr = getStringEnd(str, ptr);\n let parsed = parseString(str, ptr, endPtr);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] && str[endPtr] !== ',' && str[endPtr] !== end && str[endPtr] !== '\\n' && str[endPtr] !== '\\r') {\n throw new TomlError('unexpected character encountered', {\n toml: str,\n ptr: endPtr,\n });\n }\n endPtr += (+(str[endPtr] === ','));\n }\n return [parsed, endPtr];\n }\n endPtr = skipUntil(str, ptr, ',', end);\n let slice = sliceAndTrimEndOf(str, ptr, endPtr - (+(str[endPtr - 1] === ',')));\n if (!slice[0]) {\n throw new TomlError('incomplete key-value declaration: no value specified', {\n toml: str,\n ptr: ptr\n });\n }\n if (end && slice[1] > -1) {\n endPtr = skipVoid(str, ptr + slice[1]);\n endPtr += +(str[endPtr] === ',');\n }\n return [\n parseValue(slice[0], str, ptr, integersAsBigInt),\n endPtr,\n ];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString } from './primitive.js';\nimport { extractValue } from './extract.js';\nimport { getStringEnd, indexOfNewline, skipComment, skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nlet KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \\t]*$/;\nexport function parseKey(str, ptr, end = '=') {\n let dot = ptr - 1;\n let parsed = [];\n let endPtr = str.indexOf(end, ptr);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n do {\n let c = str[ptr = ++dot];\n // If it's whitespace, ignore\n if (c !== ' ' && c !== '\\t') {\n // If it's a string\n if (c === '\"' || c === '\\'') {\n if (c === str[ptr + 1] && c === str[ptr + 2]) {\n throw new TomlError('multiline strings are not allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n let eos = getStringEnd(str, ptr);\n if (eos < 0) {\n throw new TomlError('unfinished string encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n dot = str.indexOf('.', eos);\n let strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot);\n let newLine = indexOfNewline(strEnd);\n if (newLine > -1) {\n throw new TomlError('newlines are not allowed in keys', {\n toml: str,\n ptr: ptr + dot + newLine,\n });\n }\n if (strEnd.trimStart()) {\n throw new TomlError('found extra tokens after the string part', {\n toml: str,\n ptr: eos,\n });\n }\n if (endPtr < eos) {\n endPtr = str.indexOf(end, eos);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n parsed.push(parseString(str, ptr, eos));\n }\n else {\n // Normal raw key part consumption and validation\n dot = str.indexOf('.', ptr);\n let part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot);\n if (!KEY_PART_RE.test(part)) {\n throw new TomlError('only letter, numbers, dashes and underscores are allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n parsed.push(part.trimEnd());\n }\n }\n // Until there's no more dot\n } while (dot + 1 && dot < endPtr);\n return [parsed, skipVoid(str, endPtr + 1, true, true)];\n}\nexport function parseInlineTable(str, ptr, depth, integersAsBigInt) {\n let res = {};\n let seen = new Set();\n let c;\n ptr++;\n while ((c = str[ptr++]) !== '}' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let k;\n let t = res;\n let hasOwn = false;\n let [key, keyEndPtr] = parseKey(str, ptr - 1);\n for (let i = 0; i < key.length; i++) {\n if (i)\n t = hasOwn ? t[k] : (t[k] = {});\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== 'object' || seen.has(t[k]))) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n if (!hasOwn && k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n }\n }\n if (hasOwn) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n let [value, valueEndPtr] = extractValue(str, keyEndPtr, '}', depth - 1, integersAsBigInt);\n seen.add(value);\n t[k] = value;\n ptr = valueEndPtr;\n }\n }\n if (!c) {\n throw new TomlError('unfinished table encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\nexport function parseArray(str, ptr, depth, integersAsBigInt) {\n let res = [];\n let c;\n ptr++;\n while ((c = str[ptr++]) !== ']' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let e = extractValue(str, ptr - 1, ']', depth - 1, integersAsBigInt);\n res.push(e[0]);\n ptr = e[1];\n }\n }\n if (!c) {\n throw new TomlError('unfinished array encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseKey } from './struct.js';\nimport { extractValue } from './extract.js';\nimport { skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nfunction peekTable(key, table, meta, type) {\n let t = table;\n let m = meta;\n let k;\n let hasOwn = false;\n let state;\n for (let i = 0; i < key.length; i++) {\n if (i) {\n t = hasOwn ? t[k] : (t[k] = {});\n m = (state = m[k]).c;\n if (type === 0 /* Type.DOTTED */ && (state.t === 1 /* Type.EXPLICIT */ || state.t === 2 /* Type.ARRAY */)) {\n return null;\n }\n if (state.t === 2 /* Type.ARRAY */) {\n let l = t.length - 1;\n t = t[l];\n m = m[l].c;\n }\n }\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 /* Type.DOTTED */ && m[k]?.d) {\n return null;\n }\n if (!hasOwn) {\n if (k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true });\n }\n m[k] = {\n t: i < key.length - 1 && type === 2 /* Type.ARRAY */\n ? 3 /* Type.ARRAY_DOTTED */\n : type,\n d: false,\n i: 0,\n c: {},\n };\n }\n }\n state = m[k];\n if (state.t !== type && !(type === 1 /* Type.EXPLICIT */ && state.t === 3 /* Type.ARRAY_DOTTED */)) {\n // Bad key type!\n return null;\n }\n if (type === 2 /* Type.ARRAY */) {\n if (!state.d) {\n state.d = true;\n t[k] = [];\n }\n t[k].push(t = {});\n state.c[state.i++] = (state = { t: 1 /* Type.EXPLICIT */, d: false, i: 0, c: {} });\n }\n if (state.d) {\n // Redefining a table!\n return null;\n }\n state.d = true;\n if (type === 1 /* Type.EXPLICIT */) {\n t = hasOwn ? t[k] : (t[k] = {});\n }\n else if (type === 0 /* Type.DOTTED */ && hasOwn) {\n return null;\n }\n return [k, t, state.c];\n}\nexport function parse(toml, { maxDepth = 1000, integersAsBigInt } = {}) {\n let res = {};\n let meta = {};\n let tbl = res;\n let m = meta;\n for (let ptr = skipVoid(toml, 0); ptr < toml.length;) {\n if (toml[ptr] === '[') {\n let isTableArray = toml[++ptr] === '[';\n let k = parseKey(toml, ptr += +isTableArray, ']');\n if (isTableArray) {\n if (toml[k[1] - 1] !== ']') {\n throw new TomlError('expected end of table declaration', {\n toml: toml,\n ptr: k[1] - 1,\n });\n }\n k[1]++;\n }\n let p = peekTable(k[0], res, meta, isTableArray ? 2 /* Type.ARRAY */ : 1 /* Type.EXPLICIT */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n m = p[2];\n tbl = p[1];\n ptr = k[1];\n }\n else {\n let k = parseKey(toml, ptr);\n let p = peekTable(k[0], tbl, m, 0 /* Type.DOTTED */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n let v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt);\n p[1][p[0]] = v[0];\n ptr = v[1];\n }\n ptr = skipVoid(toml, ptr, true);\n if (toml[ptr] && toml[ptr] !== '\\n' && toml[ptr] !== '\\r') {\n throw new TomlError('each key-value declaration must be followed by an end-of-line', {\n toml: toml,\n ptr: ptr\n });\n }\n ptr = skipVoid(toml, ptr);\n }\n return res;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet BARE_KEY = /^[a-z0-9-_]+$/i;\nfunction extendedTypeOf(obj) {\n let type = typeof obj;\n if (type === 'object') {\n if (Array.isArray(obj))\n return 'array';\n if (obj instanceof Date)\n return 'date';\n }\n return type;\n}\nfunction isArrayOfTables(obj) {\n for (let i = 0; i < obj.length; i++) {\n if (extendedTypeOf(obj[i]) !== 'object')\n return false;\n }\n return obj.length != 0;\n}\nfunction formatString(s) {\n return JSON.stringify(s).replace(/\\x7f/g, '\\\\u007f');\n}\nfunction stringifyValue(val, type, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n if (type === 'number') {\n if (isNaN(val))\n return 'nan';\n if (val === Infinity)\n return 'inf';\n if (val === -Infinity)\n return '-inf';\n if (numberAsFloat && Number.isInteger(val))\n return val.toFixed(1);\n return val.toString();\n }\n if (type === 'bigint' || type === 'boolean') {\n return val.toString();\n }\n if (type === 'string') {\n return formatString(val);\n }\n if (type === 'date') {\n if (isNaN(val.getTime())) {\n throw new TypeError('cannot serialize invalid date');\n }\n return val.toISOString();\n }\n if (type === 'object') {\n return stringifyInlineTable(val, depth, numberAsFloat);\n }\n if (type === 'array') {\n return stringifyArray(val, depth, numberAsFloat);\n }\n}\nfunction stringifyInlineTable(obj, depth, numberAsFloat) {\n let keys = Object.keys(obj);\n if (keys.length === 0)\n return '{}';\n let res = '{ ';\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (i)\n res += ', ';\n res += BARE_KEY.test(k) ? k : formatString(k);\n res += ' = ';\n res += stringifyValue(obj[k], extendedTypeOf(obj[k]), depth - 1, numberAsFloat);\n }\n return res + ' }';\n}\nfunction stringifyArray(array, depth, numberAsFloat) {\n if (array.length === 0)\n return '[]';\n let res = '[ ';\n for (let i = 0; i < array.length; i++) {\n if (i)\n res += ', ';\n if (array[i] === null || array[i] === void 0) {\n throw new TypeError('arrays cannot contain null or undefined values');\n }\n res += stringifyValue(array[i], extendedTypeOf(array[i]), depth - 1, numberAsFloat);\n }\n return res + ' ]';\n}\nfunction stringifyArrayTable(array, key, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let res = '';\n for (let i = 0; i < array.length; i++) {\n res += `${res && '\\n'}[[${key}]]\\n`;\n res += stringifyTable(0, array[i], key, depth, numberAsFloat);\n }\n return res;\n}\nfunction stringifyTable(tableKey, obj, prefix, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let preamble = '';\n let tables = '';\n let keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (obj[k] !== null && obj[k] !== void 0) {\n let type = extendedTypeOf(obj[k]);\n if (type === 'symbol' || type === 'function') {\n throw new TypeError(`cannot serialize values of type '${type}'`);\n }\n let key = BARE_KEY.test(k) ? k : formatString(k);\n if (type === 'array' && isArrayOfTables(obj[k])) {\n tables += (tables && '\\n') + stringifyArrayTable(obj[k], prefix ? `${prefix}.${key}` : key, depth - 1, numberAsFloat);\n }\n else if (type === 'object') {\n let tblKey = prefix ? `${prefix}.${key}` : key;\n tables += (tables && '\\n') + stringifyTable(tblKey, obj[k], tblKey, depth - 1, numberAsFloat);\n }\n else {\n preamble += key;\n preamble += ' = ';\n preamble += stringifyValue(obj[k], type, depth, numberAsFloat);\n preamble += '\\n';\n }\n }\n }\n if (tableKey && (preamble || !tables)) // Create table only if necessary\n preamble = preamble ? `[${tableKey}]\\n${preamble}` : `[${tableKey}]`;\n return preamble && tables\n ? `${preamble}\\n${tables}`\n : preamble || tables;\n}\nexport function stringify(obj, { maxDepth = 1000, numbersAsFloat = false } = {}) {\n if (extendedTypeOf(obj) !== 'object') {\n throw new TypeError('stringify can only be called with an object');\n }\n let str = stringifyTable(0, obj, '', maxDepth, numbersAsFloat);\n if (str[str.length - 1] !== '\\n')\n return str + '\\n';\n return str;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parse } from './parse.js';\nimport { stringify } from './stringify.js';\nimport { TomlDate } from './date.js';\nimport { TomlError } from './error.js';\nexport default { parse, stringify, TomlDate, TomlError };\nexport { parse, stringify, TomlDate, TomlError };\n","import type { Address, Hex } from \"viem\";\n\n// === Transaction Types ===\n\n/** A built DeFi transaction ready for simulation or broadcast */\nexport interface DeFiTx {\n description: string;\n to: Address;\n data: Hex;\n value: bigint;\n gas_estimate?: number;\n /** ERC20 approvals to check and send before broadcasting this tx */\n approvals?: Array<{\n token: Address;\n spender: Address;\n amount: bigint;\n }>;\n /** Pre-transactions to execute before the main tx (e.g. farming approval) */\n pre_txs?: DeFiTx[];\n}\n\n/** Result of executing or simulating a transaction */\nexport interface ActionResult {\n tx_hash?: string;\n status: TxStatus;\n gas_used?: number;\n description: string;\n details: Record<string, unknown>;\n}\n\n/** Transaction status (serde: snake_case) */\nexport enum TxStatus {\n DryRun = \"dry_run\",\n Simulated = \"simulated\",\n SimulationFailed = \"simulation_failed\",\n NeedsApproval = \"needs_approval\",\n Pending = \"pending\",\n Confirmed = \"confirmed\",\n Failed = \"failed\",\n}\n\n// === Token Types ===\n\n/** Token amount with decimals-aware formatting */\nexport interface TokenAmount {\n token: Address;\n symbol: string;\n amount: bigint;\n decimals: number;\n}\n\nexport function formatHuman(t: TokenAmount): string {\n const divisor = 10n ** BigInt(t.decimals);\n const whole = t.amount / divisor;\n const frac = t.amount % divisor;\n return `${whole}.${frac.toString().padStart(t.decimals, \"0\")} ${t.symbol}`;\n}\n\n/** Slippage tolerance in basis points */\nexport interface Slippage {\n bps: number;\n}\n\nexport function newSlippage(bps: number): Slippage {\n return { bps };\n}\n\nexport function defaultSwapSlippage(): Slippage {\n return { bps: 50 };\n}\n\nexport function applyMinSlippage(slippage: Slippage, amount: bigint): bigint {\n return (amount * BigInt(10000 - slippage.bps)) / 10000n;\n}\n\n// === Oracle / Price Types ===\n\nexport interface PriceData {\n source: string;\n source_type: string;\n asset: Address;\n price_usd: bigint;\n price_f64: number;\n block_number?: number;\n timestamp?: number;\n}\n\n// === DEX Types ===\n\nexport interface SwapParams {\n protocol: string;\n token_in: Address;\n token_out: Address;\n amount_in: bigint;\n slippage: Slippage;\n recipient: Address;\n deadline?: number;\n}\n\nexport interface QuoteParams {\n protocol: string;\n token_in: Address;\n token_out: Address;\n amount_in: bigint;\n}\n\nexport interface QuoteResult {\n protocol: string;\n amount_out: bigint;\n price_impact_bps?: number;\n fee_bps?: number;\n route: string[];\n}\n\nexport interface AddLiquidityParams {\n protocol: string;\n token_a: Address;\n token_b: Address;\n amount_a: bigint;\n amount_b: bigint;\n recipient: Address;\n /** Optional lower tick for concentrated LP (defaults to full range) */\n tick_lower?: number;\n /** Optional upper tick for concentrated LP (defaults to full range) */\n tick_upper?: number;\n /** ±N% concentrated range around current price (e.g. 2 for ±2%) */\n range_pct?: number;\n /** Optional pool address for tick detection / single-side LP */\n pool?: Address;\n}\n\nexport interface RemoveLiquidityParams {\n protocol: string;\n token_a: Address;\n token_b: Address;\n liquidity: bigint;\n recipient: Address;\n}\n\n// === Lending Types ===\n\nexport interface SupplyParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n on_behalf_of: Address;\n}\n\nexport interface BorrowParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n interest_rate_mode: InterestRateMode;\n on_behalf_of: Address;\n}\n\n/** Interest rate mode (serde: snake_case) */\nexport enum InterestRateMode {\n Variable = \"variable\",\n Stable = \"stable\",\n}\n\nexport interface RepayParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n interest_rate_mode: InterestRateMode;\n on_behalf_of: Address;\n}\n\nexport interface WithdrawParams {\n protocol: string;\n asset: Address;\n amount: bigint;\n to: Address;\n}\n\nexport interface LendingRates {\n protocol: string;\n asset: Address;\n supply_apy: number;\n borrow_variable_apy: number;\n borrow_stable_apy?: number;\n utilization: number;\n total_supply: bigint;\n total_borrow: bigint;\n /** Reward token addresses for supply-side incentives */\n supply_reward_tokens?: string[];\n /** Reward token addresses for borrow-side incentives */\n borrow_reward_tokens?: string[];\n /** Emissions per second per supply reward token (raw uint256 as string) */\n supply_emissions_per_second?: string[];\n /** Emissions per second per borrow reward token (raw uint256 as string) */\n borrow_emissions_per_second?: string[];\n /** Supply-side incentive APY (%) from reward token emissions */\n supply_incentive_apy?: number;\n /** Borrow-side incentive APY (%) from reward token emissions (negative = subsidized) */\n borrow_incentive_apy?: number;\n}\n\nexport interface UserPosition {\n protocol: string;\n user: Address;\n supplies: PositionAsset[];\n borrows: PositionAsset[];\n health_factor?: number;\n net_apy?: number;\n}\n\nexport interface PositionAsset {\n asset: Address;\n symbol: string;\n amount: bigint;\n value_usd?: number;\n}\n\n// === CDP Types ===\n\nexport interface OpenCdpParams {\n protocol: string;\n collateral: Address;\n collateral_amount: bigint;\n debt_amount: bigint;\n recipient: Address;\n}\n\nexport interface AdjustCdpParams {\n protocol: string;\n cdp_id: bigint;\n collateral_delta?: bigint;\n debt_delta?: bigint;\n add_collateral: boolean;\n add_debt: boolean;\n}\n\nexport interface CloseCdpParams {\n protocol: string;\n cdp_id: bigint;\n}\n\nexport interface CdpInfo {\n protocol: string;\n cdp_id: bigint;\n collateral: TokenAmount;\n debt: TokenAmount;\n collateral_ratio: number;\n liquidation_price?: number;\n}\n\n// === Liquid Staking Types ===\n\nexport interface StakeParams {\n protocol: string;\n amount: bigint;\n recipient: Address;\n}\n\nexport interface UnstakeParams {\n protocol: string;\n amount: bigint;\n recipient: Address;\n}\n\nexport interface StakingInfo {\n protocol: string;\n staked_token: Address;\n liquid_token: Address;\n exchange_rate: number;\n apy?: number;\n total_staked: bigint;\n}\n\n// === Vault Types (ERC-4626) ===\n\nexport interface VaultInfo {\n protocol: string;\n vault_address: Address;\n asset: Address;\n total_assets: bigint;\n total_supply: bigint;\n apy?: number;\n}\n\n// === Derivatives Types ===\n\nexport interface DerivativesPositionParams {\n protocol: string;\n market: string;\n size: bigint;\n collateral: bigint;\n is_long: boolean;\n}\n\n// === Options Types ===\n\nexport interface OptionParams {\n protocol: string;\n underlying: Address;\n strike_price: bigint;\n expiry: number;\n is_call: boolean;\n amount: bigint;\n}\n\n// === ve(3,3) Types ===\n\n/** A pool that has an active emission gauge */\nexport interface GaugedPool {\n pool: Address;\n gauge: Address;\n token0: string; // symbol\n token1: string; // symbol\n type: \"V2\" | \"CL\";\n tickSpacing?: number; // for CL pools\n stable?: boolean; // for V2 pools\n}\n\nexport interface RewardInfo {\n token: Address;\n symbol: string;\n amount: bigint;\n value_usd?: number;\n}\n\nexport interface GaugeInfo {\n gauge: Address;\n pool: Address;\n total_staked: bigint;\n reward_rate: bigint;\n rewards: RewardInfo[];\n}\n\nexport interface VeNftInfo {\n token_id: bigint;\n amount: bigint;\n unlock_time: number;\n voting_power: bigint;\n}\n\n// === Yield Types ===\n\nexport interface YieldInfo {\n protocol: string;\n pool: string;\n apy: number;\n tvl: bigint;\n tokens: Address[];\n}\n\n// === Portfolio Tracker Types ===\nexport interface PortfolioSnapshot {\n timestamp: number;\n chain: string;\n wallet: string;\n tokens: TokenBalance[];\n defi_positions: DefiPosition[];\n total_value_usd: number;\n}\n\nexport interface TokenBalance {\n token: string;\n symbol: string;\n balance: bigint;\n value_usd: number;\n price_usd: number;\n}\n\nexport interface DefiPosition {\n protocol: string;\n type: \"lending_supply\" | \"lending_borrow\" | \"lp\" | \"staking\" | \"vault\";\n asset: string;\n amount: bigint;\n value_usd: number;\n}\n\nexport interface PortfolioPnL {\n period: string;\n start_value_usd: number;\n end_value_usd: number;\n pnl_usd: number;\n pnl_pct: number;\n token_changes: TokenChange[];\n}\n\nexport interface TokenChange {\n symbol: string;\n balance_change: bigint;\n value_change_usd: number;\n}\n","import type { Address } from \"viem\";\n\nexport type DefiErrorCode =\n | \"PROTOCOL_NOT_FOUND\"\n | \"TOKEN_NOT_FOUND\"\n | \"CHAIN_NOT_FOUND\"\n | \"INSUFFICIENT_BALANCE\"\n | \"INSUFFICIENT_ALLOWANCE\"\n | \"SLIPPAGE_EXCEEDED\"\n | \"SIMULATION_FAILED\"\n | \"ABI_ERROR\"\n | \"REGISTRY_ERROR\"\n | \"RPC_ERROR\"\n | \"PROVIDER_ERROR\"\n | \"CONTRACT_ERROR\"\n | \"INVALID_PARAM\"\n | \"UNSUPPORTED\"\n | \"TX_FAILED\"\n | \"INTERNAL\";\n\nexport class DefiError extends Error {\n readonly code: DefiErrorCode;\n\n constructor(code: DefiErrorCode, message: string) {\n super(message);\n this.name = \"DefiError\";\n this.code = code;\n }\n\n static protocolNotFound(name: string): DefiError {\n return new DefiError(\"PROTOCOL_NOT_FOUND\", `Protocol not found: ${name}`);\n }\n\n static tokenNotFound(name: string): DefiError {\n return new DefiError(\"TOKEN_NOT_FOUND\", `Token not found: ${name}`);\n }\n\n static chainNotFound(name: string): DefiError {\n return new DefiError(\"CHAIN_NOT_FOUND\", `Chain not found: ${name}`);\n }\n\n static insufficientBalance(needed: string, available: string): DefiError {\n return new DefiError(\n \"INSUFFICIENT_BALANCE\",\n `Insufficient balance: need ${needed}, have ${available}`,\n );\n }\n\n static insufficientAllowance(spender: Address): DefiError {\n return new DefiError(\n \"INSUFFICIENT_ALLOWANCE\",\n `Insufficient allowance for spender ${spender}`,\n );\n }\n\n static slippageExceeded(expected: string, actual: string): DefiError {\n return new DefiError(\n \"SLIPPAGE_EXCEEDED\",\n `Slippage exceeded: expected ${expected}, got ${actual}`,\n );\n }\n\n static simulationFailed(reason: string): DefiError {\n return new DefiError(\n \"SIMULATION_FAILED\",\n `Transaction simulation failed: ${reason}`,\n );\n }\n\n static abiError(reason: string): DefiError {\n return new DefiError(\"ABI_ERROR\", `ABI encoding error: ${reason}`);\n }\n\n static registryError(reason: string): DefiError {\n return new DefiError(\"REGISTRY_ERROR\", `Registry error: ${reason}`);\n }\n\n static rpcError(reason: string): DefiError {\n return new DefiError(\"RPC_ERROR\", `RPC error: ${reason}`);\n }\n\n static providerError(reason: string): DefiError {\n return new DefiError(\"PROVIDER_ERROR\", `Provider error: ${reason}`);\n }\n\n static contractError(reason: string): DefiError {\n return new DefiError(\"CONTRACT_ERROR\", `Contract error: ${reason}`);\n }\n\n static invalidParam(reason: string): DefiError {\n return new DefiError(\"INVALID_PARAM\", `Invalid parameter: ${reason}`);\n }\n\n static unsupported(operation: string): DefiError {\n return new DefiError(\n \"UNSUPPORTED\",\n `Unsupported operation: ${operation}`,\n );\n }\n\n static internal(reason: string): DefiError {\n return new DefiError(\"INTERNAL\", `Internal error: ${reason}`);\n }\n\n toJSON() {\n return { error: this.message };\n }\n}\n\nexport type Result<T> = T;\n","/**\n * BigInt JSON serialization utilities.\n *\n * Rust's alloy U256 (backed by ruint) serializes to JSON as 0x-prefixed\n * lowercase hex strings (e.g., \"0x75bcd15\"). We must match this exactly\n * for behavioral parity.\n */\n\n/** JSON replacer for Rust parity — bigint becomes 0x-hex string */\nexport function jsonReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return \"0x\" + value.toString(16);\n }\n return value;\n}\n\n/** JSON replacer for SDK consumers — bigint becomes decimal string */\nexport function jsonReplacerDecimal(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n\n/** Stringify with decimal bigint handling */\nexport function jsonStringify(data: unknown, pretty = true): string {\n return pretty\n ? JSON.stringify(data, jsonReplacerDecimal, 2)\n : JSON.stringify(data, jsonReplacerDecimal);\n}\n\n/** Parse a 0x-hex or decimal string to bigint */\nexport function parseBigInt(value: string): bigint {\n if (value.startsWith(\"0x\") || value.startsWith(\"0X\")) {\n return BigInt(value);\n }\n return BigInt(value);\n}\n","import type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, parseAbi } from \"viem\";\nimport type { DeFiTx } from \"./types.js\";\n\nconst erc20Abi = parseAbi([\n \"function name() view returns (string)\",\n \"function symbol() view returns (string)\",\n \"function decimals() view returns (uint8)\",\n \"function totalSupply() view returns (uint256)\",\n \"function balanceOf(address account) view returns (uint256)\",\n \"function transfer(address to, uint256 amount) returns (bool)\",\n \"function allowance(address owner, address spender) view returns (uint256)\",\n \"function approve(address spender, uint256 amount) returns (bool)\",\n \"function transferFrom(address from, address to, uint256 amount) returns (bool)\",\n]);\n\nexport { erc20Abi };\n\nexport function buildApprove(\n token: Address,\n spender: Address,\n amount: bigint,\n): DeFiTx {\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spender, amount],\n });\n return {\n description: `Approve ${spender} to spend ${amount} of token ${token}`,\n to: token,\n data,\n value: 0n,\n gas_estimate: 60_000,\n };\n}\n\nexport function buildTransfer(\n token: Address,\n to: Address,\n amount: bigint,\n): DeFiTx {\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"transfer\",\n args: [to, amount],\n });\n return {\n description: `Transfer ${amount} of token ${token} to ${to}`,\n to: token,\n data,\n value: 0n,\n gas_estimate: 65_000,\n };\n}\n","import { createPublicClient, http, type PublicClient } from \"viem\";\n\nconst providerCache = new Map<string, PublicClient>();\n\nexport function getProvider(rpcUrl: string): PublicClient {\n const cached = providerCache.get(rpcUrl);\n if (cached) return cached;\n\n const client = createPublicClient({ transport: http(rpcUrl) });\n providerCache.set(rpcUrl, client);\n return client;\n}\n\nexport function clearProviderCache(): void {\n providerCache.clear();\n}\n","import type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, decodeFunctionResult, parseAbi } from \"viem\";\nimport type { DeFiTx } from \"./types.js\";\nimport { getProvider } from \"./provider.js\";\n\nexport const MULTICALL3_ADDRESS: Address =\n \"0xcA11bde05977b3631167028862bE2a173976CA11\";\n\nconst multicall3Abi = parseAbi([\n \"struct Call3 { address target; bool allowFailure; bytes callData; }\",\n \"struct Result { bool success; bytes returnData; }\",\n \"function aggregate3(Call3[] calls) returns (Result[] returnData)\",\n]);\n\nexport function buildMulticall(calls: Array<[Address, Hex]>): DeFiTx {\n const mcCalls = calls.map(([target, callData]) => ({\n target,\n allowFailure: true,\n callData,\n }));\n\n const data = encodeFunctionData({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n args: [mcCalls],\n });\n\n return {\n description: `Multicall3 batch (${calls.length} calls)`,\n to: MULTICALL3_ADDRESS,\n data,\n value: 0n,\n };\n}\n\nexport async function multicallRead(\n rpcUrl: string,\n calls: Array<[Address, Hex]>,\n): Promise<(Hex | null)[]> {\n const client = getProvider(rpcUrl);\n\n const mcCalls = calls.map(([target, callData]) => ({\n target,\n allowFailure: true,\n callData,\n }));\n\n const result = await client.call({\n to: MULTICALL3_ADDRESS,\n data: encodeFunctionData({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n args: [mcCalls],\n }),\n });\n\n if (!result.data) return calls.map(() => null);\n\n const decoded = decodeFunctionResult({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n data: result.data,\n }) as Array<{ success: boolean; returnData: Hex }>;\n\n return decoded.map((r) => (r.success ? r.returnData : null));\n}\n\nexport function decodeU256(data: Hex | null): bigint {\n if (!data || data.length < 66) return 0n;\n return BigInt(data.slice(0, 66));\n}\n\nexport function decodeU128(data: Hex | null): bigint {\n if (!data || data.length < 66) return 0n;\n const val = BigInt(data.slice(0, 66));\n return val & ((1n << 128n) - 1n);\n}\n","export class ChainConfig {\n name!: string;\n chain_id!: number;\n rpc_url!: string;\n explorer_url?: string;\n native_token!: string;\n wrapped_native?: string;\n multicall3?: string;\n\n effectiveRpcUrl(): string {\n const chainEnv = this.name.toUpperCase().replace(/ /g, \"_\") + \"_RPC_URL\";\n return (\n process.env[chainEnv] ??\n process.env[\"HYPEREVM_RPC_URL\"] ??\n this.rpc_url\n );\n }\n}\n","import type { Address } from \"viem\";\n\nexport enum ProtocolCategory {\n Dex = \"dex\",\n Lending = \"lending\",\n Cdp = \"cdp\",\n Bridge = \"bridge\",\n LiquidStaking = \"liquid_staking\",\n YieldSource = \"yield_source\",\n YieldAggregator = \"yield_aggregator\",\n Vault = \"vault\",\n Derivatives = \"derivatives\",\n Options = \"options\",\n LiquidityManager = \"liquidity_manager\",\n Nft = \"nft\",\n Other = \"other\",\n}\n\nexport function protocolCategoryLabel(category: ProtocolCategory): string {\n switch (category) {\n case ProtocolCategory.Dex:\n return \"DEX\";\n case ProtocolCategory.Lending:\n return \"Lending\";\n case ProtocolCategory.Cdp:\n return \"CDP\";\n case ProtocolCategory.Bridge:\n return \"Bridge\";\n case ProtocolCategory.LiquidStaking:\n return \"Liquid Staking\";\n case ProtocolCategory.YieldSource:\n return \"Yield Source\";\n case ProtocolCategory.YieldAggregator:\n return \"Yield Aggregator\";\n case ProtocolCategory.Vault:\n return \"Vault\";\n case ProtocolCategory.Derivatives:\n return \"Derivatives\";\n case ProtocolCategory.Options:\n return \"Options\";\n case ProtocolCategory.LiquidityManager:\n return \"Liquidity Manager\";\n case ProtocolCategory.Nft:\n return \"NFT\";\n case ProtocolCategory.Other:\n return \"Other\";\n }\n}\n\nexport interface PoolInfo {\n name: string;\n address: Address;\n token0: string;\n token1: string;\n tick_spacing?: number;\n gauge?: Address;\n stable?: boolean;\n}\n\nexport interface ProtocolEntry {\n name: string;\n slug: string;\n category: ProtocolCategory;\n interface: string;\n chain: string;\n native?: boolean;\n contracts?: Record<string, Address>;\n pools?: PoolInfo[];\n description?: string;\n}\n","import { readFileSync, readdirSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { parse } from \"smol-toml\";\nimport { ChainConfig } from \"./chain.js\";\nimport type { TokenEntry } from \"./token.js\";\nimport { type ProtocolEntry, type PoolInfo, ProtocolCategory } from \"./protocol.js\";\n\nimport { existsSync } from \"fs\";\n\nconst __dirname = fileURLToPath(new URL(\".\", import.meta.url));\n\n// Resolve config dir: works from src/ (vitest), dist/ (built), and npm bundle (npx)\nfunction findConfigDir(): string {\n const candidates = [\n resolve(__dirname, \"../../../config\"), // from dist/registry/ (monorepo build)\n resolve(__dirname, \"../../../../config\"), // from src/registry/ (vitest)\n resolve(__dirname, \"../config\"), // from dist/ (npm bundle — config at package root)\n resolve(__dirname, \"../../config\"), // from dist/subdir (npm bundle variant)\n ];\n for (const dir of candidates) {\n if (existsSync(resolve(dir, \"chains.toml\"))) return dir;\n }\n throw new Error(`Config directory not found. Searched: ${candidates.join(\", \")}`);\n}\n\nconst CONFIG_DIR = findConfigDir();\n\nfunction readToml(relPath: string): string {\n return readFileSync(resolve(CONFIG_DIR, relPath), \"utf-8\");\n}\n\ninterface ChainConfigWrapper {\n chain: Record<string, ChainConfig>;\n}\n\ninterface TokensWrapper {\n token: TokenEntry[];\n}\n\ninterface ProtocolWrapper {\n protocol: ProtocolEntry;\n}\n\nexport class Registry {\n chains: Map<string, ChainConfig>;\n tokens: Map<string, TokenEntry[]>;\n protocols: ProtocolEntry[];\n\n private constructor(\n chains: Map<string, ChainConfig>,\n tokens: Map<string, TokenEntry[]>,\n protocols: ProtocolEntry[],\n ) {\n this.chains = chains;\n this.tokens = tokens;\n this.protocols = protocols;\n }\n\n static loadEmbedded(): Registry {\n const chains = Registry.loadChains();\n const tokens = Registry.loadTokens();\n const protocols = Registry.loadProtocols();\n return new Registry(chains, tokens, protocols);\n }\n\n private static loadChains(): Map<string, ChainConfig> {\n const raw = parse(readToml(\"chains.toml\")) as unknown as ChainConfigWrapper;\n const map = new Map<string, ChainConfig>();\n for (const [key, data] of Object.entries(raw.chain)) {\n const cfg = Object.assign(new ChainConfig(), data);\n map.set(key, cfg);\n }\n return map;\n }\n\n private static loadTokens(): Map<string, TokenEntry[]> {\n // Dynamically discover all token files in config/tokens/\n const map = new Map<string, TokenEntry[]>();\n const tokensDir = resolve(CONFIG_DIR, \"tokens\");\n try {\n const files = readdirSync(tokensDir).filter(f => f.endsWith(\".toml\"));\n for (const file of files) {\n const chain = file.replace(\".toml\", \"\");\n try {\n const raw = parse(readToml(`tokens/${file}`)) as unknown as TokensWrapper;\n map.set(chain, raw.token);\n } catch { /* skip invalid token files */ }\n }\n } catch { /* tokens dir may not exist */ }\n return map;\n }\n\n private static loadProtocols(): ProtocolEntry[] {\n // Dynamically discover all protocol TOML files across all categories\n const protocols: ProtocolEntry[] = [];\n const protocolsDir = resolve(CONFIG_DIR, \"protocols\");\n const categories = [\"dex\", \"lending\", \"cdp\", \"vault\", \"liquid_staking\", \"yield_aggregator\", \"yield_source\", \"derivatives\", \"options\", \"nft\", \"bridge\"];\n\n for (const category of categories) {\n const catDir = resolve(protocolsDir, category);\n try {\n if (!existsSync(catDir)) continue;\n const files = readdirSync(catDir).filter(f => f.endsWith(\".toml\"));\n for (const file of files) {\n try {\n const raw = parse(readToml(`protocols/${category}/${file}`)) as unknown as ProtocolWrapper;\n protocols.push(raw.protocol);\n } catch { /* skip invalid protocol files */ }\n }\n } catch { /* category dir may not exist */ }\n }\n return protocols;\n }\n\n getChain(name: string): ChainConfig {\n const chain = this.chains.get(name);\n if (!chain) throw new Error(`Chain not found: ${name}`);\n return chain;\n }\n\n getProtocol(name: string): ProtocolEntry {\n const protocol = this.protocols.find(\n (p) =>\n p.name.toLowerCase() === name.toLowerCase() ||\n p.slug.toLowerCase() === name.toLowerCase(),\n );\n if (!protocol) throw new Error(`Protocol not found: ${name}`);\n return protocol;\n }\n\n getProtocolsByCategory(category: ProtocolCategory): ProtocolEntry[] {\n return this.protocols.filter((p) => p.category === category);\n }\n\n getProtocolsForChain(chain: string): ProtocolEntry[] {\n return this.protocols.filter(\n (p) => p.chain.toLowerCase() === chain.toLowerCase(),\n );\n }\n\n resolveToken(chain: string, symbol: string): TokenEntry {\n const tokens = this.tokens.get(chain);\n if (!tokens) throw new Error(`Chain not found: ${chain}`);\n const token = tokens.find(\n (t) => t.symbol.toLowerCase() === symbol.toLowerCase(),\n );\n if (!token) throw new Error(`Token not found: ${symbol}`);\n return token;\n }\n\n /**\n * Resolve a pool by name (e.g. \"WHYPE/USDC\") from a protocol's pool list.\n * Returns the pool info or throws if not found.\n */\n resolvePool(protocolSlug: string, poolName: string): PoolInfo {\n const protocol = this.getProtocol(protocolSlug);\n if (!protocol.pools || protocol.pools.length === 0) {\n throw new Error(`Protocol ${protocol.name} has no pools configured`);\n }\n const pool = protocol.pools.find(\n (p) => p.name.toLowerCase() === poolName.toLowerCase(),\n );\n if (!pool) {\n const available = protocol.pools.map(p => p.name).join(\", \");\n throw new Error(`Pool '${poolName}' not found in ${protocol.name}. Available: ${available}`);\n }\n return pool;\n }\n}\n","import { DefiError } from \"@hypurrquant/defi-core\";\nimport type { ProtocolEntry } from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\n\n// DEX adapters\nimport { UniswapV3Adapter } from \"./dex/uniswap_v3.js\";\nimport { UniswapV2Adapter } from \"./dex/uniswap_v2.js\";\nimport { AlgebraV3Adapter } from \"./dex/algebra_v3.js\";\nimport { BalancerV3Adapter } from \"./dex/balancer_v3.js\";\nimport { CurveStableSwapAdapter } from \"./dex/curve.js\";\nimport { SolidlyAdapter } from \"./dex/solidly.js\";\nimport { ThenaCLAdapter } from \"./dex/thena_cl.js\";\nimport { HybraGaugeAdapter } from \"./dex/hybra_gauge.js\";\nimport { WooFiAdapter } from \"./dex/woofi.js\";\nimport { SolidlyGaugeAdapter } from \"./dex/solidly_gauge.js\";\nimport { MasterChefAdapter } from \"./dex/masterchef.js\";\nimport { MerchantMoeLBAdapter } from \"./dex/merchant_moe_lb.js\";\nimport { KittenSwapFarmingAdapter } from \"./dex/kittenswap_farming.js\";\n\n// Trait interfaces\nimport type { IDex } from \"@hypurrquant/defi-core\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport type { ICdp } from \"@hypurrquant/defi-core\";\nimport type { IVault } from \"@hypurrquant/defi-core\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport type { IGaugeSystem } from \"@hypurrquant/defi-core\";\nimport type { IGauge } from \"@hypurrquant/defi-core\";\nimport type { IYieldSource } from \"@hypurrquant/defi-core\";\nimport type { IDerivatives } from \"@hypurrquant/defi-core\";\nimport type { IOptions } from \"@hypurrquant/defi-core\";\nimport type { IOracle } from \"@hypurrquant/defi-core\";\nimport type { INft } from \"@hypurrquant/defi-core\";\n\n// Lending adapters\nimport { AaveV3Adapter } from \"./lending/aave_v3.js\";\nimport { AaveV2Adapter } from \"./lending/aave_v2.js\";\nimport { AaveOracleAdapter } from \"./lending/aave_oracle.js\";\nimport { CompoundV2Adapter } from \"./lending/compound_v2.js\";\nimport { CompoundV3Adapter } from \"./lending/compound_v3.js\";\nimport { EulerV2Adapter } from \"./lending/euler_v2.js\";\nimport { MorphoBlueAdapter } from \"./lending/morpho.js\";\n\n// CDP adapters\nimport { FelixCdpAdapter } from \"./cdp/felix.js\";\nimport { FelixOracleAdapter } from \"./cdp/felix_oracle.js\";\n\n// Vault adapters\nimport { ERC4626VaultAdapter } from \"./vault/erc4626.js\";\n\n// Liquid staking adapters\nimport { GenericLstAdapter } from \"./liquid_staking/generic_lst.js\";\nimport { StHypeAdapter } from \"./liquid_staking/sthype.js\";\nimport { KinetiqAdapter } from \"./liquid_staking/kinetiq.js\";\n\n// Yield source adapters\nimport { PendleAdapter } from \"./yield_source/pendle.js\";\nimport { GenericYieldAdapter } from \"./yield_source/generic_yield.js\";\n\n// Derivatives adapters\nimport { HlpVaultAdapter } from \"./derivatives/hlp.js\";\nimport { GenericDerivativesAdapter } from \"./derivatives/generic_derivatives.js\";\n\n// Options adapters\nimport { RyskAdapter } from \"./options/rysk.js\";\nimport { GenericOptionsAdapter } from \"./options/generic_options.js\";\n\n// NFT adapters\nimport { ERC721Adapter } from \"./nft/erc721.js\";\n\n// ============================================================\n// DEX\n// ============================================================\n\n/** Create a Dex implementation from a protocol registry entry */\nexport function createDex(entry: ProtocolEntry, rpcUrl?: string): IDex {\n switch (entry.interface) {\n case \"uniswap_v3\":\n return new UniswapV3Adapter(entry, rpcUrl);\n case \"uniswap_v4\":\n throw DefiError.unsupported(\n `[${entry.name}] Uniswap V4 (singleton PoolManager) is not yet supported — use HyperSwap V3 or another V3-compatible DEX for quotes`,\n );\n case \"algebra_v3\":\n return new AlgebraV3Adapter(entry, rpcUrl);\n case \"uniswap_v2\":\n return new UniswapV2Adapter(entry, rpcUrl);\n case \"solidly_v2\":\n case \"solidly_cl\":\n return new SolidlyAdapter(entry, rpcUrl);\n case \"hybra\":\n return new ThenaCLAdapter(entry, rpcUrl);\n case \"curve_stableswap\":\n return new CurveStableSwapAdapter(entry);\n case \"balancer_v3\":\n return new BalancerV3Adapter(entry);\n case \"woofi\":\n return new WooFiAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`DEX interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// Lending\n// ============================================================\n\n/** Create a Lending implementation from a protocol registry entry */\nexport function createLending(entry: ProtocolEntry, rpcUrl?: string): ILending {\n switch (entry.interface) {\n case \"aave_v3\":\n case \"aave_v3_isolated\":\n return new AaveV3Adapter(entry, rpcUrl);\n case \"aave_v2\":\n return new AaveV2Adapter(entry, rpcUrl);\n case \"morpho_blue\":\n return new MorphoBlueAdapter(entry, rpcUrl);\n case \"euler_v2\":\n return new EulerV2Adapter(entry, rpcUrl);\n case \"compound_v2\":\n return new CompoundV2Adapter(entry, rpcUrl);\n case \"compound_v3\":\n return new CompoundV3Adapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Lending interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// CDP\n// ============================================================\n\n/** Create a CDP implementation from a protocol registry entry */\nexport function createCdp(entry: ProtocolEntry, rpcUrl?: string): ICdp {\n switch (entry.interface) {\n case \"liquity_v2\":\n return new FelixCdpAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`CDP interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// Vault\n// ============================================================\n\n/** Create a Vault implementation from a protocol registry entry */\nexport function createVault(entry: ProtocolEntry, rpcUrl?: string): IVault {\n switch (entry.interface) {\n case \"erc4626\":\n case \"beefy_vault\":\n return new ERC4626VaultAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Vault interface '${entry.interface}' not yet implemented`);\n }\n}\n\n// ============================================================\n// Liquid Staking\n// ============================================================\n\n/** Create a LiquidStaking implementation from a protocol registry entry */\nexport function createLiquidStaking(entry: ProtocolEntry, rpcUrl?: string): ILiquidStaking {\n switch (entry.interface) {\n case \"kinetiq_staking\":\n return new KinetiqAdapter(entry, rpcUrl);\n case \"sthype_staking\":\n return new StHypeAdapter(entry, rpcUrl);\n case \"hyperbeat_lst\":\n case \"kintsu\":\n return new GenericLstAdapter(entry, rpcUrl);\n default:\n return new GenericLstAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// Gauge\n// ============================================================\n\n/** Create a GaugeSystem implementation from a protocol registry entry */\nexport function createGauge(entry: ProtocolEntry, rpcUrl?: string): IGaugeSystem {\n // Hybra has its own GaugeManager system\n if (entry.interface === \"hybra\" || entry.contracts?.[\"gauge_manager\"]) {\n return new HybraGaugeAdapter(entry, rpcUrl);\n }\n switch (entry.interface) {\n case \"solidly_v2\":\n case \"solidly_cl\":\n case \"algebra_v3\":\n return new SolidlyGaugeAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Gauge interface '${entry.interface}' not supported`);\n }\n}\n\n/** Create a MasterChef IGauge implementation from a protocol registry entry */\nexport function createMasterChef(entry: ProtocolEntry, rpcUrl?: string): IGauge {\n return new MasterChefAdapter(entry, rpcUrl);\n}\n\n// ============================================================\n// Yield Source (fallback to GenericYield)\n// ============================================================\n\n/** Create a YieldSource implementation — falls back to GenericYield for unknown interfaces */\nexport function createYieldSource(entry: ProtocolEntry, rpcUrl?: string): IYieldSource {\n switch (entry.interface) {\n case \"pendle_v2\":\n return new PendleAdapter(entry, rpcUrl);\n default:\n return new GenericYieldAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// Derivatives (fallback to GenericDerivatives)\n// ============================================================\n\n/** Create a Derivatives implementation — falls back to GenericDerivatives for unknown interfaces */\nexport function createDerivatives(entry: ProtocolEntry, rpcUrl?: string): IDerivatives {\n switch (entry.interface) {\n case \"hlp_vault\":\n return new HlpVaultAdapter(entry, rpcUrl);\n default:\n return new GenericDerivativesAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// Options (fallback to GenericOptions)\n// ============================================================\n\n/** Create an Options implementation — falls back to GenericOptions for unknown interfaces */\nexport function createOptions(entry: ProtocolEntry, rpcUrl?: string): IOptions {\n switch (entry.interface) {\n case \"rysk\":\n return new RyskAdapter(entry, rpcUrl);\n default:\n return new GenericOptionsAdapter(entry, rpcUrl);\n }\n}\n\n// ============================================================\n// NFT\n// ============================================================\n\n/** Create an NFT implementation from a protocol registry entry */\nexport function createNft(entry: ProtocolEntry, rpcUrl?: string): INft {\n switch (entry.interface) {\n case \"erc721\":\n return new ERC721Adapter(entry, rpcUrl);\n case \"marketplace\":\n throw DefiError.unsupported(`NFT marketplace '${entry.name}' is not queryable as ERC-721. Use a specific collection address.`);\n default:\n throw DefiError.unsupported(`NFT interface '${entry.interface}' not supported`);\n }\n}\n\n// ============================================================\n// Oracle from Lending\n// ============================================================\n\n/** Create an Oracle from a lending protocol entry (Aave V3 forks have an oracle contract) */\nexport function createOracleFromLending(entry: ProtocolEntry, rpcUrl: string): IOracle {\n switch (entry.interface) {\n case \"aave_v3\":\n case \"aave_v3_isolated\":\n return new AaveOracleAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Oracle not available for lending interface '${entry.interface}'`);\n }\n}\n\n// ============================================================\n// Oracle from CDP\n// ============================================================\n\n/** Create an Oracle from a CDP protocol entry (Felix has its own PriceFeed contract) */\nexport function createOracleFromCdp(entry: ProtocolEntry, _asset: Address, rpcUrl: string): IOracle {\n switch (entry.interface) {\n case \"liquity_v2\":\n return new FelixOracleAdapter(entry, rpcUrl);\n default:\n throw DefiError.unsupported(`Oracle not available for CDP interface '${entry.interface}'`);\n }\n}\n\n// ============================================================\n// Merchant Moe LB\n// ============================================================\n\n/** Create a MerchantMoeLBAdapter for Liquidity Book operations */\nexport function createMerchantMoeLB(entry: ProtocolEntry, rpcUrl?: string): MerchantMoeLBAdapter {\n return new MerchantMoeLBAdapter(entry, rpcUrl);\n}\n\n// ============================================================\n// KittenSwap Algebra Farming\n// ============================================================\n\n/** Create a KittenSwapFarmingAdapter for Algebra eternal farming operations */\nexport function createKittenSwapFarming(entry: ProtocolEntry, rpcUrl: string): KittenSwapFarmingAdapter {\n const farmingCenter = entry.contracts?.[\"farming_center\"];\n if (!farmingCenter) {\n throw new DefiError(\"CONTRACT_ERROR\", `[${entry.name}] Missing 'farming_center' contract address`);\n }\n const eternalFarming = entry.contracts?.[\"eternal_farming\"];\n if (!eternalFarming) {\n throw new DefiError(\"CONTRACT_ERROR\", `[${entry.name}] Missing 'eternal_farming' contract address`);\n }\n const positionManager = entry.contracts?.[\"position_manager\"];\n if (!positionManager) {\n throw new DefiError(\"CONTRACT_ERROR\", `[${entry.name}] Missing 'position_manager' contract address`);\n }\n const factory = entry.contracts?.[\"factory\"] as Address | undefined;\n return new KittenSwapFarmingAdapter(entry.name, farmingCenter, eternalFarming, positionManager, rpcUrl, factory);\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, decodeAbiParameters } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst DEFAULT_FEE = 3000;\n\nconst swapRouterAbi = parseAbi([\n \"struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; }\",\n \"function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut)\",\n]);\n\nconst quoterAbi = parseAbi([\n \"struct QuoteExactInputSingleParams { address tokenIn; address tokenOut; uint256 amountIn; uint24 fee; uint160 sqrtPriceLimitX96; }\",\n \"function quoteExactInputSingle(QuoteExactInputSingleParams memory params) external returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)\",\n]);\n\n// Ramses CL uses tickSpacing instead of fee in the quoter struct\nconst ramsesQuoterAbi = parseAbi([\n \"struct QuoteExactInputSingleParams { address tokenIn; address tokenOut; uint256 amountIn; int24 tickSpacing; uint160 sqrtPriceLimitX96; }\",\n \"function quoteExactInputSingle(QuoteExactInputSingleParams memory params) external returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)\",\n]);\n\nconst positionManagerAbi = parseAbi([\n \"struct MintParams { address token0; address token1; uint24 fee; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; }\",\n \"function mint(MintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n]);\n\nexport class UniswapV3Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly quoter: Address | undefined;\n private readonly positionManager: Address | undefined;\n private readonly factory: Address | undefined;\n private readonly fee: number;\n private readonly rpcUrl: string | undefined;\n private readonly useTickSpacingQuoter: boolean;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.quoter = entry.contracts?.[\"quoter\"];\n this.positionManager = entry.contracts?.[\"position_manager\"];\n this.factory = entry.contracts?.[\"factory\"];\n this.fee = DEFAULT_FEE;\n this.rpcUrl = rpcUrl;\n // Ramses CL and similar forks use tickSpacing-based pool identification\n this.useTickSpacingQuoter = entry.contracts?.[\"pool_deployer\"] !== undefined\n || entry.contracts?.[\"gauge_factory\"] !== undefined;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n const amountOutMinimum = 0n;\n\n const data = encodeFunctionData({\n abi: swapRouterAbi,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n fee: this.fee,\n recipient: params.recipient,\n deadline,\n amountIn: params.amount_in,\n amountOutMinimum,\n sqrtPriceLimitX96: 0n,\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokenIn for tokenOut`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured\");\n }\n\n if (this.quoter) {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // Try tickSpacing-based quoter first for Ramses CL and similar forks\n if (this.useTickSpacingQuoter) {\n const tickSpacings = [1, 10, 50, 100, 200];\n const tsResults = await Promise.allSettled(\n tickSpacings.map(async (ts) => {\n const result = await client.call({\n to: this.quoter!,\n data: encodeFunctionData({\n abi: ramsesQuoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n amountIn: params.amount_in,\n tickSpacing: ts,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n });\n if (!result.data) return { amountOut: 0n, tickSpacing: ts };\n const [amountOut] = decodeAbiParameters(\n [{ name: \"amountOut\", type: \"uint256\" }],\n result.data,\n );\n return { amountOut, tickSpacing: ts };\n }),\n );\n\n let best = { amountOut: 0n, tickSpacing: 50 };\n for (const r of tsResults) {\n if (r.status === \"fulfilled\" && r.value.amountOut > best.amountOut) {\n best = r.value;\n }\n }\n\n if (best.amountOut > 0n) {\n return {\n protocol: this.protocolName,\n amount_out: best.amountOut,\n price_impact_bps: undefined,\n fee_bps: undefined,\n route: [`${params.token_in} -> ${params.token_out} (tickSpacing: ${best.tickSpacing})`],\n };\n }\n\n // tickSpacing-based protocol (Ramses CL): quoter returned no result.\n // Pool exists but has no liquidity in this fork snapshot.\n throw DefiError.rpcError(\n `[${this.protocolName}] No quote available — pool exists but has zero liquidity for this pair`,\n );\n }\n\n // Standard Uniswap V3 fee-based quoter\n const feeTiers = [500, 3000, 10000, 100];\n const results = await Promise.allSettled(\n feeTiers.map(async (fee) => {\n const result = await client.call({\n to: this.quoter!,\n data: encodeFunctionData({\n abi: quoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n amountIn: params.amount_in,\n fee,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n });\n if (!result.data) return { amountOut: 0n, fee };\n const [amountOut] = decodeAbiParameters(\n [{ name: \"amountOut\", type: \"uint256\" }],\n result.data,\n );\n return { amountOut, fee };\n }),\n );\n\n let best = { amountOut: 0n, fee: 3000 };\n for (const r of results) {\n if (r.status === \"fulfilled\" && r.value.amountOut > best.amountOut) {\n best = r.value;\n }\n }\n\n if (best.amountOut > 0n) {\n return {\n protocol: this.protocolName,\n amount_out: best.amountOut,\n price_impact_bps: undefined,\n fee_bps: Math.floor(best.fee / 10),\n route: [`${params.token_in} -> ${params.token_out} (fee: ${best.fee})`],\n };\n }\n }\n\n // Fallback: simulate swap via eth_call on the router\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const callData = encodeFunctionData({\n abi: swapRouterAbi,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n fee: this.fee,\n recipient: \"0x0000000000000000000000000000000000000001\",\n deadline: BigInt(\"18446744073709551615\"),\n amountIn: params.amount_in,\n amountOutMinimum: 0n,\n sqrtPriceLimitX96: 0n,\n },\n ],\n });\n\n let output: `0x${string}` | undefined;\n try {\n const result = await client.call({ to: this.router, data: callData });\n output = result.data;\n } catch (e: unknown) {\n const errMsg = String(e);\n if (errMsg.includes(\"STF\") || errMsg.includes(\"insufficient\")) {\n throw DefiError.unsupported(\n `[${this.protocolName}] quote unavailable — no quoter contract configured. Swap simulation requires token balance. Add a quoter address to the protocol config.`,\n );\n }\n throw DefiError.rpcError(`[${this.protocolName}] swap simulation for quote failed: ${errMsg}`);\n }\n\n const amountOut =\n output && output.length >= 66\n ? BigInt(output.slice(0, 66))\n : 0n;\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut,\n price_impact_bps: undefined,\n fee_bps: Math.floor(this.fee / 10),\n route: [`${params.token_in} -> ${params.token_out} (simulated)`],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Position manager address not configured\");\n }\n\n // Sort tokens (Uniswap V3 requires token0 < token1)\n const [token0, token1, rawAmount0, rawAmount1] =\n params.token_a.toLowerCase() < params.token_b.toLowerCase()\n ? [params.token_a, params.token_b, params.amount_a, params.amount_b]\n : [params.token_b, params.token_a, params.amount_b, params.amount_a];\n\n // V3 NPM mint: getLiquidityForAmounts uses min(L0, L1), so if either is 0\n // then liquidity=0 → revert. Use 1 wei minimum for single-side LP.\n const amount0 = rawAmount0 === 0n && rawAmount1 > 0n ? 1n : rawAmount0;\n const amount1 = rawAmount1 === 0n && rawAmount0 > 0n ? 1n : rawAmount1;\n\n const data = encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"mint\",\n args: [\n {\n token0,\n token1,\n fee: this.fee,\n tickLower: -887220,\n tickUpper: 887220,\n amount0Desired: amount0,\n amount1Desired: amount1,\n amount0Min: 0n,\n amount1Min: 0n,\n recipient: params.recipient,\n deadline: BigInt(\"18446744073709551615\"),\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] Add liquidity`,\n to: pm,\n data,\n value: 0n,\n gas_estimate: 500_000,\n approvals: [\n { token: token0, spender: pm, amount: amount0 },\n { token: token1, spender: pm, amount: amount1 },\n ],\n };\n }\n\n async buildRemoveLiquidity(_params: RemoveLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] remove_liquidity requires tokenId — use NFT position manager directly`,\n );\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, decodeFunctionResult, decodeAbiParameters } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts)\",\n \"function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB, uint256 liquidity)\",\n \"function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB)\",\n \"function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts)\",\n]);\n\nconst lbQuoterAbi = parseAbi([\n \"function findBestPathFromAmountIn(address[] calldata route, uint128 amountIn) external view returns ((address[] route, address[] pairs, uint256[] binSteps, uint256[] versions, uint128[] amounts, uint128[] virtualAmountsWithoutSlippage, uint128[] fees))\",\n]);\n\nexport class UniswapV2Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly rpcUrl: string | undefined;\n private readonly lbQuoter: Address | undefined;\n private readonly lbIntermediaries: Address[];\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.lbQuoter = entry.contracts?.[\"lb_quoter\"];\n this.rpcUrl = rpcUrl;\n\n // Collect LB intermediary tokens from contracts with \"lb_mid_\" prefix\n this.lbIntermediaries = [];\n if (entry.contracts) {\n for (const [key, addr] of Object.entries(entry.contracts)) {\n if (key.startsWith(\"lb_mid_\")) {\n this.lbIntermediaries.push(addr);\n }\n }\n }\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const amountOutMin = 0n;\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n const path: Address[] = [params.token_in, params.token_out];\n\n const data = encodeFunctionData({\n abi,\n functionName: \"swapExactTokensForTokens\",\n args: [params.amount_in, amountOutMin, path, params.recipient, deadline],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokens via V2`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 150_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured\");\n }\n\n // Try LB (Liquidity Book) quote first if lb_quoter is configured\n if (this.lbQuoter) {\n try {\n return await this.lbQuote(params);\n } catch {\n // Fall through to V2 quote\n }\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const path: Address[] = [params.token_in, params.token_out];\n\n const result = await client.call({\n to: this.router,\n data: encodeFunctionData({\n abi,\n functionName: \"getAmountsOut\",\n args: [params.amount_in, path],\n }),\n });\n\n if (!result.data) {\n throw DefiError.rpcError(`[${this.protocolName}] getAmountsOut returned no data`);\n }\n\n const decoded = decodeFunctionResult({\n abi,\n functionName: \"getAmountsOut\",\n data: result.data,\n }) as unknown as bigint[];\n\n const amountOut = decoded[decoded.length - 1];\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut,\n price_impact_bps: undefined,\n fee_bps: 30,\n route: [`${params.token_in} -> ${params.token_out}`],\n };\n }\n\n private async lbQuote(params: QuoteParams): Promise<QuoteResult> {\n const client = createPublicClient({ transport: http(this.rpcUrl!) });\n\n // Build candidate routes: direct + multi-hop through each intermediary\n const routes: Address[][] = [[params.token_in, params.token_out]];\n const tokenInLower = params.token_in.toLowerCase();\n const tokenOutLower = params.token_out.toLowerCase();\n for (const mid of this.lbIntermediaries) {\n if (mid.toLowerCase() !== tokenInLower && mid.toLowerCase() !== tokenOutLower) {\n routes.push([params.token_in, mid, params.token_out]);\n }\n }\n\n const lbResultParams = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"route\", type: \"address[]\" as const },\n { name: \"pairs\", type: \"address[]\" as const },\n { name: \"binSteps\", type: \"uint256[]\" as const },\n { name: \"versions\", type: \"uint256[]\" as const },\n { name: \"amounts\", type: \"uint128[]\" as const },\n { name: \"virtualAmountsWithoutSlippage\", type: \"uint128[]\" as const },\n { name: \"fees\", type: \"uint128[]\" as const },\n ],\n },\n ] as const;\n\n let bestOut = 0n;\n let bestRoute: Address[] = [];\n\n const results = await Promise.allSettled(\n routes.map(async (route) => {\n const result = await client.call({\n to: this.lbQuoter!,\n data: encodeFunctionData({\n abi: lbQuoterAbi,\n functionName: \"findBestPathFromAmountIn\",\n args: [route, params.amount_in],\n }),\n });\n if (!result.data) return { amountOut: 0n, route };\n const [quote] = decodeAbiParameters(lbResultParams, result.data);\n const amounts = quote.amounts;\n return { amountOut: amounts[amounts.length - 1], route };\n }),\n );\n\n for (const r of results) {\n if (r.status === \"fulfilled\" && r.value.amountOut > bestOut) {\n bestOut = r.value.amountOut;\n bestRoute = r.value.route;\n }\n }\n\n if (bestOut === 0n) {\n throw DefiError.rpcError(`[${this.protocolName}] LB quote returned zero for all routes`);\n }\n\n return {\n protocol: this.protocolName,\n amount_out: bestOut,\n price_impact_bps: undefined,\n fee_bps: undefined,\n route: [bestRoute.map((a) => a.slice(0, 10)).join(\" -> \") + \" (LB)\"],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"addLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n params.amount_a,\n params.amount_b,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Add liquidity V2`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [\n { token: params.token_a, spender: this.router, amount: params.amount_a },\n { token: params.token_b, spender: this.router, amount: params.amount_b },\n ],\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"removeLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n params.liquidity,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Remove liquidity V2`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, decodeAbiParameters, concatHex, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport { rangeToTicks, alignTickUp, alignTickDown } from \"./tick_math.js\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"struct ExactInputSingleParams { address tokenIn; address tokenOut; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 limitSqrtPrice; }\",\n \"function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut)\",\n]);\n\n// Algebra Integral quoter: path = tokenIn(20) + deployer(20) + tokenOut(20) per hop\n// Returns arrays for multi-hop results\nconst algebraQuoterAbi = parseAbi([\n \"function quoteExactInput(bytes memory path, uint256 amountIn) external returns (uint256[] memory amountOutList, uint256[] memory amountInList, uint160[] memory sqrtPriceX96AfterList, uint32[] memory initializedTicksCrossedList, uint256 gasEstimate, uint16[] memory feeList)\",\n]);\n\n// Algebra V2 / NEST-style quoter: single-hop struct\n// selector: 0x5e5e6e0f quoteExactInputSingle((address,address,uint256,uint160))\n// returns: (uint256 amountOut, uint256 amountIn, uint160 sqrtPriceX96After)\nconst algebraSingleQuoterAbi = parseAbi([\n \"function quoteExactInputSingle((address tokenIn, address tokenOut, uint256 amountIn, uint160 limitSqrtPrice) params) external returns (uint256 amountOut, uint256 amountIn, uint160 sqrtPriceX96After)\",\n]);\n\n// Algebra Integral NonfungiblePositionManager (includes deployer field for pool identification)\nconst algebraIntegralPmAbi = parseAbi([\n \"struct MintParams { address token0; address token1; address deployer; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; }\",\n \"function mint(MintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n]);\n\n// Algebra V2 / NEST-style NonfungiblePositionManager (no deployer field)\nconst algebraV2PmAbi = parseAbi([\n \"struct MintParams { address token0; address token1; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; }\",\n \"function mint(MintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n]);\n\nexport class AlgebraV3Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly quoter: Address | undefined;\n private readonly positionManager: Address | undefined;\n private readonly rpcUrl: string | undefined;\n // NEST and similar forks expose quoteExactInputSingle((address,address,uint256,uint160))\n // instead of path-based quoteExactInput. Detected by presence of pool_deployer in config.\n private readonly useSingleQuoter: boolean;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.quoter = entry.contracts?.[\"quoter\"];\n this.positionManager = entry.contracts?.[\"position_manager\"];\n this.rpcUrl = rpcUrl;\n // pool_deployer present → NEST-style single-hop struct quoter\n this.useSingleQuoter = entry.contracts?.[\"pool_deployer\"] !== undefined;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n const amountOutMinimum = 0n;\n\n const data = encodeFunctionData({\n abi,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n recipient: params.recipient,\n deadline,\n amountIn: params.amount_in,\n amountOutMinimum,\n limitSqrtPrice: 0n,\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokenIn for tokenOut`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 250_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured\");\n }\n if (!this.quoter) {\n throw DefiError.unsupported(\n `[${this.protocolName}] No quoter contract configured`,\n );\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // NEST and similar forks: use single-hop struct quoter\n if (this.useSingleQuoter) {\n const result = await client.call({\n to: this.quoter,\n data: encodeFunctionData({\n abi: algebraSingleQuoterAbi,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n amountIn: params.amount_in,\n limitSqrtPrice: 0n,\n },\n ],\n }),\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] quoteExactInputSingle failed: ${e}`);\n });\n\n if (!result.data || result.data.length < 66) {\n throw DefiError.rpcError(`[${this.protocolName}] quoter returned empty data`);\n }\n\n const [amountOut] = decodeAbiParameters(\n [\n { name: \"amountOut\", type: \"uint256\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"sqrtPriceX96After\", type: \"uint160\" },\n ],\n result.data,\n );\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut as bigint,\n price_impact_bps: undefined,\n fee_bps: undefined,\n route: [`${params.token_in} -> ${params.token_out}`],\n };\n }\n\n // KittenSwap and standard Algebra Integral path: tokenIn(20) + deployer(20) + tokenOut(20) = 60 bytes\n // Standard pools use deployer=address(0) in path (CREATE2 salt without deployer prefix)\n const path = concatHex([params.token_in, zeroAddress as Address, params.token_out]);\n\n const result = await client.call({\n to: this.quoter,\n data: encodeFunctionData({\n abi: algebraQuoterAbi,\n functionName: \"quoteExactInput\",\n args: [path, params.amount_in],\n }),\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] quoteExactInput failed: ${e}`);\n });\n\n if (!result.data || result.data.length < 66) {\n throw DefiError.rpcError(`[${this.protocolName}] quoter returned empty data`);\n }\n\n // Decode first element: amountOutList is an array, take the last element\n const decoded = decodeAbiParameters(\n [\n { name: \"amountOutList\", type: \"uint256[]\" },\n { name: \"amountInList\", type: \"uint256[]\" },\n { name: \"sqrtPriceX96AfterList\", type: \"uint160[]\" },\n { name: \"initializedTicksCrossedList\", type: \"uint32[]\" },\n { name: \"gasEstimate\", type: \"uint256\" },\n { name: \"feeList\", type: \"uint16[]\" },\n ],\n result.data,\n );\n\n const amountOutList = decoded[0] as readonly bigint[];\n const feeList = decoded[5] as readonly number[];\n const amountOut = amountOutList[amountOutList.length - 1];\n const fee = feeList.length > 0 ? feeList[0] : undefined;\n\n return {\n protocol: this.protocolName,\n amount_out: amountOut,\n price_impact_bps: undefined,\n fee_bps: fee !== undefined ? Math.floor(fee / 10) : undefined,\n route: [`${params.token_in} -> ${params.token_out}`],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Position manager address not configured\");\n }\n\n // Sort tokens (Algebra requires token0 < token1)\n const [token0, token1, rawAmount0, rawAmount1] =\n params.token_a.toLowerCase() < params.token_b.toLowerCase()\n ? [params.token_a, params.token_b, params.amount_a, params.amount_b]\n : [params.token_b, params.token_a, params.amount_b, params.amount_a];\n\n let tickLower = params.tick_lower ?? -887220;\n let tickUpper = params.tick_upper ?? 887220;\n\n // Auto tick detection: --range N% or single-side\n const isSingleSide = rawAmount0 === 0n || rawAmount1 === 0n;\n const needsAutoTick = (params.range_pct !== undefined) || (isSingleSide && !params.tick_lower && !params.tick_upper);\n\n if (needsAutoTick) {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required for auto tick detection\");\n const poolAddr = params.pool as Address | undefined;\n if (!poolAddr) throw new DefiError(\"CONTRACT_ERROR\", \"Pool address required (use --pool)\");\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const algebraPoolAbi = parseAbi([\n \"function globalState() view returns (uint160 price, int24 tick, uint16 lastFee, uint8 pluginConfig, uint16 communityFee, bool unlocked)\",\n \"function tickSpacing() view returns (int24)\",\n ]);\n const [globalState, spacing] = await Promise.all([\n client.readContract({ address: poolAddr, abi: algebraPoolAbi, functionName: \"globalState\" }),\n client.readContract({ address: poolAddr, abi: algebraPoolAbi, functionName: \"tickSpacing\" }),\n ]);\n const currentTick = Number(globalState[1]);\n const tickSpace = Number(spacing);\n\n if (params.range_pct !== undefined) {\n // ±N% concentrated range\n const range = rangeToTicks(currentTick, params.range_pct, tickSpace);\n tickLower = range.tickLower;\n tickUpper = range.tickUpper;\n } else if (rawAmount0 > 0n && rawAmount1 === 0n) {\n tickLower = alignTickUp(currentTick + tickSpace, tickSpace);\n tickUpper = 887220;\n } else {\n tickLower = -887220;\n tickUpper = alignTickDown(currentTick - tickSpace, tickSpace);\n }\n }\n\n const amount0 = rawAmount0;\n const amount1 = rawAmount1;\n\n // Algebra V2 (NEST-style, has pool_deployer) uses no deployer field in MintParams\n // Algebra Integral (KittenSwap) includes deployer field\n const data = this.useSingleQuoter\n ? encodeFunctionData({\n abi: algebraV2PmAbi,\n functionName: \"mint\",\n args: [{ token0, token1, tickLower, tickUpper, amount0Desired: amount0, amount1Desired: amount1, amount0Min: 0n, amount1Min: 0n, recipient: params.recipient, deadline: BigInt(\"18446744073709551615\") }],\n })\n : encodeFunctionData({\n abi: algebraIntegralPmAbi,\n functionName: \"mint\",\n args: [{ token0, token1, deployer: zeroAddress as Address, tickLower, tickUpper, amount0Desired: amount0, amount1Desired: amount1, amount0Min: 0n, amount1Min: 0n, recipient: params.recipient, deadline: BigInt(\"18446744073709551615\") }],\n });\n\n // Only add approvals for non-zero amounts\n const approvals: { token: Address; spender: Address; amount: bigint }[] = [];\n if (amount0 > 0n) approvals.push({ token: token0, spender: pm, amount: amount0 });\n if (amount1 > 0n) approvals.push({ token: token1, spender: pm, amount: amount1 });\n\n return {\n description: `[${this.protocolName}] Add liquidity [${tickLower}, ${tickUpper}]`,\n to: pm,\n data,\n value: 0n,\n gas_estimate: 500_000,\n approvals,\n };\n }\n\n async buildRemoveLiquidity(_params: RemoveLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] remove_liquidity requires tokenId — use NFT position manager directly`,\n );\n }\n}\n","/**\n * Convert a ±percentage to tick delta.\n * tickDelta = ln(1 + pct/100) / ln(1.0001)\n */\nexport function pctToTickDelta(pct: number): number {\n return Math.round(Math.log(1 + pct / 100) / Math.log(1.0001));\n}\n\n/**\n * Align a tick down to the nearest multiple of tickSpacing.\n */\nexport function alignTickDown(tick: number, tickSpacing: number): number {\n return Math.floor(tick / tickSpacing) * tickSpacing;\n}\n\n/**\n * Align a tick up to the nearest multiple of tickSpacing.\n */\nexport function alignTickUp(tick: number, tickSpacing: number): number {\n return Math.ceil(tick / tickSpacing) * tickSpacing;\n}\n\n/**\n * Calculate ±pct% tick range centered on currentTick, aligned to tickSpacing.\n */\nexport function rangeToTicks(\n currentTick: number,\n rangePct: number,\n tickSpacing: number,\n): { tickLower: number; tickUpper: number } {\n const delta = pctToTickDelta(rangePct);\n return {\n tickLower: alignTickDown(currentTick - delta, tickSpacing),\n tickUpper: alignTickUp(currentTick + delta, tickSpacing),\n };\n}\n","import { encodeFunctionData, parseAbi, zeroAddress } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"function swapSingleTokenExactIn(address pool, address tokenIn, address tokenOut, uint256 exactAmountIn, uint256 minAmountOut, uint256 deadline, bool wethIsEth, bytes calldata userData) external returns (uint256 amountOut)\",\n]);\n\nexport class BalancerV3Adapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract\");\n }\n this.router = router;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const minAmountOut = 0n;\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n\n // Balancer V3 requires a pool address. For now use a simplified single-pool swap.\n // In production, the pool would be resolved from the registry or an on-chain query.\n const data = encodeFunctionData({\n abi,\n functionName: \"swapSingleTokenExactIn\",\n args: [\n zeroAddress, // TODO: resolve pool from registry\n params.token_in,\n params.token_out,\n params.amount_in,\n minAmountOut,\n deadline,\n false,\n \"0x\",\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} via Balancer V3`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote requires RPC`);\n }\n\n async buildAddLiquidity(_params: AddLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] add_liquidity requires pool-specific params`);\n }\n\n async buildRemoveLiquidity(_params: RemoveLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] remove_liquidity requires pool-specific params`);\n }\n}\n","import { encodeFunctionData, parseAbi } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst poolAbi = parseAbi([\n \"function exchange(int128 i, int128 j, uint256 dx, uint256 min_dy) external returns (uint256)\",\n \"function get_dy(int128 i, int128 j, uint256 dx) external view returns (uint256)\",\n \"function add_liquidity(uint256[2] amounts, uint256 min_mint_amount) external returns (uint256)\",\n \"function remove_liquidity(uint256 amount, uint256[2] min_amounts) external returns (uint256[2])\",\n]);\n\nexport class CurveStableSwapAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n // Direct pool exchange: swap token at index 0 for token at index 1.\n // The `router` address is treated as the pool address for direct swaps.\n // Callers should set the pool address as the \"router\" contract in the registry\n // when targeting a specific Curve pool.\n // Without prior quote, set min output to 0. Use quote() first for slippage protection.\n const minDy = 0n;\n\n const data = encodeFunctionData({\n abi: poolAbi,\n functionName: \"exchange\",\n args: [0n, 1n, params.amount_in, minDy],\n });\n\n return {\n description: `[${this.protocolName}] Curve pool exchange ${params.amount_in} tokens (index 0 -> 1)`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote requires RPC connection`);\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n // Add liquidity to a 2-token Curve pool\n const data = encodeFunctionData({\n abi: poolAbi,\n functionName: \"add_liquidity\",\n args: [[params.amount_a, params.amount_b], 0n],\n });\n\n return {\n description: `[${this.protocolName}] Curve add liquidity`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n // Remove liquidity from a 2-token Curve pool\n const data = encodeFunctionData({\n abi: poolAbi,\n functionName: \"remove_liquidity\",\n args: [params.liquidity, [0n, 0n]],\n });\n\n return {\n description: `[${this.protocolName}] Curve remove liquidity`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, decodeAbiParameters } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"struct Route { address from; address to; bool stable; }\",\n \"function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, (address from, address to, bool stable)[] calldata routes, address to, uint256 deadline) external returns (uint256[] memory amounts)\",\n \"function getAmountsOut(uint256 amountIn, (address from, address to, bool stable)[] calldata routes) external view returns (uint256[] memory amounts)\",\n \"function addLiquidity(address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB, uint256 liquidity)\",\n \"function removeLiquidity(address tokenA, address tokenB, bool stable, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) external returns (uint256 amountA, uint256 amountB)\",\n]);\n\n// Velodrome V2 / Aerodrome style: Route includes factory address\nconst abiV2 = parseAbi([\n \"function getAmountsOut(uint256 amountIn, (address from, address to, bool stable, address factory)[] calldata routes) external view returns (uint256[] memory amounts)\",\n]);\n\nexport class SolidlyAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n /** Default to volatile (false). True for stablecoin pairs. */\n private readonly defaultStable: boolean;\n private readonly rpcUrl: string | undefined;\n /** Factory address — present on Velodrome V2 / Aerodrome forks */\n private readonly factory: Address | undefined;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n }\n this.router = router;\n this.defaultStable = false;\n this.rpcUrl = rpcUrl;\n this.factory = entry.contracts?.[\"factory\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const amountOutMin = 0n;\n const deadline = BigInt(params.deadline ?? 18446744073709551615n);\n\n const routes = [\n { from: params.token_in, to: params.token_out, stable: this.defaultStable },\n ];\n\n const data = encodeFunctionData({\n abi,\n functionName: \"swapExactTokensForTokens\",\n args: [params.amount_in, amountOutMin, routes, params.recipient, deadline],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} tokens via Solidly`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n private encodeV1(params: QuoteParams, stable: boolean): `0x${string}` {\n return encodeFunctionData({\n abi,\n functionName: \"getAmountsOut\",\n args: [params.amount_in, [{ from: params.token_in, to: params.token_out, stable }]],\n });\n }\n\n private encodeV2(params: QuoteParams, stable: boolean): `0x${string}` {\n return encodeFunctionData({\n abi: abiV2,\n functionName: \"getAmountsOut\",\n args: [params.amount_in, [{ from: params.token_in, to: params.token_out, stable, factory: this.factory! }]],\n });\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n\n // Build all route variant candidates in one multicall batch.\n // Order: V2 variants first (if factory present), then V1 volatile + stable.\n const candidates: Array<{ callData: `0x${string}`; stable: boolean }> = [\n { callData: this.encodeV1(params, false), stable: false },\n { callData: this.encodeV1(params, true), stable: true },\n ];\n if (this.factory) {\n candidates.unshift(\n { callData: this.encodeV2(params, false), stable: false },\n { callData: this.encodeV2(params, true), stable: true },\n );\n }\n\n const rawResults = await multicallRead(\n this.rpcUrl,\n candidates.map((c) => [this.router, c.callData]),\n );\n\n let bestOut = 0n;\n let bestStable = false;\n for (let i = 0; i < rawResults.length; i++) {\n const raw = rawResults[i];\n if (!raw) continue;\n try {\n const [amounts] = decodeAbiParameters(\n [{ name: \"amounts\", type: \"uint256[]\" }],\n raw,\n );\n const out = amounts.length >= 2 ? amounts[amounts.length - 1] : 0n;\n if (out > bestOut) {\n bestOut = out;\n bestStable = candidates[i].stable;\n }\n } catch {\n // Route failed — skip\n }\n }\n\n if (bestOut === 0n) {\n throw DefiError.rpcError(`[${this.protocolName}] getAmountsOut returned zero for all routes`);\n }\n\n return {\n protocol: this.protocolName,\n amount_out: bestOut,\n price_impact_bps: undefined,\n fee_bps: bestStable ? 4 : 20,\n route: [`${params.token_in} -> ${params.token_out} (stable: ${bestStable})`],\n };\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"addLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n this.defaultStable,\n params.amount_a,\n params.amount_b,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Add liquidity (Solidly)`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 350_000,\n approvals: [\n { token: params.token_a, spender: this.router, amount: params.amount_a },\n { token: params.token_b, spender: this.router, amount: params.amount_b },\n ],\n };\n }\n\n async buildRemoveLiquidity(params: RemoveLiquidityParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi,\n functionName: \"removeLiquidity\",\n args: [\n params.token_a,\n params.token_b,\n this.defaultStable,\n params.liquidity,\n 0n,\n 0n,\n params.recipient,\n BigInt(\"18446744073709551615\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Remove liquidity (Solidly)`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport { rangeToTicks, alignTickUp, alignTickDown } from \"./tick_math.js\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\n// Thena V3 CL NonfungiblePositionManager (includes tickSpacing + sqrtPriceX96 in MintParams)\nconst thenaPmAbi = parseAbi([\n \"struct MintParams { address token0; address token1; int24 tickSpacing; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; uint160 sqrtPriceX96; }\",\n \"function mint(MintParams calldata params) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)\",\n]);\n\nconst thenaRouterAbi = parseAbi([\n \"struct ExactInputSingleParams { address tokenIn; address tokenOut; int24 tickSpacing; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; }\",\n \"function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut)\",\n]);\n\nconst thenaPoolAbi = parseAbi([\n \"function slot0() view returns (uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, bool unlocked)\",\n \"function tickSpacing() view returns (int24)\",\n \"function token0() view returns (address)\",\n \"function token1() view returns (address)\",\n]);\n\nconst thenaFactoryAbi = parseAbi([\n \"function getPool(address tokenA, address tokenB, int24 tickSpacing) view returns (address)\",\n]);\n\nexport class ThenaCLAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: Address;\n private readonly positionManager: Address | undefined;\n private readonly factory: Address | undefined;\n private readonly rpcUrl: string | undefined;\n private readonly defaultTickSpacing: number;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract address\");\n this.router = router;\n this.positionManager = entry.contracts?.[\"position_manager\"];\n this.factory = entry.contracts?.[\"pool_factory\"];\n this.rpcUrl = rpcUrl;\n this.defaultTickSpacing = 50;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: thenaRouterAbi,\n functionName: \"exactInputSingle\",\n args: [{\n tokenIn: params.token_in,\n tokenOut: params.token_out,\n tickSpacing: this.defaultTickSpacing,\n recipient: params.recipient,\n deadline: BigInt(params.deadline ?? 18446744073709551615n),\n amountIn: params.amount_in,\n amountOutMinimum: 0n,\n sqrtPriceLimitX96: 0n,\n }],\n });\n return {\n description: `[${this.protocolName}] Swap`,\n to: this.router, data, value: 0n, gas_estimate: 300_000,\n approvals: [{ token: params.token_in, spender: this.router, amount: params.amount_in }],\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote not yet implemented — use swap router`);\n }\n\n async buildAddLiquidity(params: AddLiquidityParams): Promise<DeFiTx> {\n const pm = this.positionManager;\n if (!pm) throw new DefiError(\"CONTRACT_ERROR\", \"Position manager not configured\");\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required\");\n\n // Sort tokens\n const [token0, token1, rawAmount0, rawAmount1] =\n params.token_a.toLowerCase() < params.token_b.toLowerCase()\n ? [params.token_a, params.token_b, params.amount_a, params.amount_b]\n : [params.token_b, params.token_a, params.amount_b, params.amount_a];\n\n // Resolve pool and tick range\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const poolAddr = params.pool as Address | undefined;\n let tickSpacing = this.defaultTickSpacing;\n let tickLower = params.tick_lower ?? 0;\n let tickUpper = params.tick_upper ?? 0;\n\n // If pool provided or we need to auto-detect ticks\n if (poolAddr || !params.tick_lower || !params.tick_upper) {\n let pool = poolAddr;\n if (!pool && this.factory) {\n pool = await client.readContract({\n address: this.factory, abi: thenaFactoryAbi, functionName: \"getPool\",\n args: [token0, token1, tickSpacing],\n }) as Address;\n if (pool === zeroAddress) throw new DefiError(\"CONTRACT_ERROR\", \"Pool not found\");\n }\n if (pool) {\n const [slot0, ts] = await Promise.all([\n client.readContract({ address: pool, abi: thenaPoolAbi, functionName: \"slot0\" }),\n client.readContract({ address: pool, abi: thenaPoolAbi, functionName: \"tickSpacing\" }),\n ]);\n const currentTick = Number((slot0 as readonly [bigint, number, ...unknown[]])[1]);\n tickSpacing = Number(ts);\n\n if (params.range_pct !== undefined) {\n // ±N% concentrated range\n const range = rangeToTicks(currentTick, params.range_pct, tickSpacing);\n tickLower = range.tickLower;\n tickUpper = range.tickUpper;\n } else if (!params.tick_lower && !params.tick_upper) {\n const isSingleSide = rawAmount0 === 0n || rawAmount1 === 0n;\n if (isSingleSide) {\n if (rawAmount0 > 0n) {\n tickLower = alignTickUp(currentTick + tickSpacing, tickSpacing);\n tickUpper = Math.floor(887272 / tickSpacing) * tickSpacing;\n } else {\n tickLower = Math.ceil(-887272 / tickSpacing) * tickSpacing;\n tickUpper = alignTickDown(currentTick - tickSpacing, tickSpacing);\n }\n } else {\n tickLower = Math.ceil(-887272 / tickSpacing) * tickSpacing;\n tickUpper = Math.floor(887272 / tickSpacing) * tickSpacing;\n }\n }\n }\n }\n\n // Apply explicit tick params (override auto-detected)\n if (params.tick_lower !== undefined) tickLower = params.tick_lower;\n if (params.tick_upper !== undefined) tickUpper = params.tick_upper;\n\n const data = encodeFunctionData({\n abi: thenaPmAbi,\n functionName: \"mint\",\n args: [{\n token0, token1,\n tickSpacing,\n tickLower, tickUpper,\n amount0Desired: rawAmount0,\n amount1Desired: rawAmount1,\n amount0Min: 0n, amount1Min: 0n,\n recipient: params.recipient,\n deadline: BigInt(\"18446744073709551615\"),\n sqrtPriceX96: 0n,\n }],\n });\n\n const approvals: { token: Address; spender: Address; amount: bigint }[] = [];\n if (rawAmount0 > 0n) approvals.push({ token: token0, spender: pm, amount: rawAmount0 });\n if (rawAmount1 > 0n) approvals.push({ token: token1, spender: pm, amount: rawAmount1 });\n\n return {\n description: `[${this.protocolName}] Add liquidity [${tickLower}, ${tickUpper}]`,\n to: pm, data, value: 0n, gas_estimate: 700_000, approvals,\n };\n }\n\n async buildRemoveLiquidity(_params: RemoveLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] remove_liquidity requires tokenId`);\n }\n}\n","import { createPublicClient, decodeFunctionResult, encodeFunctionData, http, parseAbi, zeroAddress } from \"viem\";\nimport type { Address, Hex } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type {\n IGaugeSystem,\n GaugedPool,\n ProtocolEntry,\n RewardInfo,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\n// Multicall decode helpers\nconst _addressDecodeAbi = parseAbi([\"function f() external view returns (address)\"]);\nfunction decodeAddress(data: Hex | null): Address | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _addressDecodeAbi, functionName: \"f\", data }) as Address;\n } catch {\n return null;\n }\n}\n\nconst _symbolDecodeAbi = parseAbi([\"function symbol() external view returns (string)\"]);\nfunction decodeSymbol(data: Hex | null): string {\n if (!data) return \"?\";\n try {\n return decodeFunctionResult({ abi: _symbolDecodeAbi, functionName: \"symbol\", data }) as string;\n } catch {\n return \"?\";\n }\n}\n\nconst gaugeManagerAbi = parseAbi([\n \"function gauges(address pool) view returns (address gauge)\",\n \"function isGauge(address gauge) view returns (bool)\",\n \"function isAlive(address gauge) view returns (bool)\",\n \"function claimRewards(address gauge, uint256[] tokenIds, uint8 redeemType) external\",\n]);\n\nconst gaugeCLAbi = parseAbi([\n \"function deposit(uint256 tokenId) external\",\n \"function withdraw(uint256 tokenId, uint8 redeemType) external\",\n \"function earned(uint256 tokenId) view returns (uint256)\",\n \"function balanceOf(uint256 tokenId) view returns (uint256)\",\n \"function rewardToken() view returns (address)\",\n]);\n\nconst nfpmAbi = parseAbi([\n \"function approve(address to, uint256 tokenId) external\",\n \"function getApproved(uint256 tokenId) view returns (address)\",\n]);\n\nconst veAbi = parseAbi([\n \"function create_lock(uint256 value, uint256 lock_duration) external returns (uint256)\",\n \"function increase_amount(uint256 tokenId, uint256 value) external\",\n \"function increase_unlock_time(uint256 tokenId, uint256 lock_duration) external\",\n \"function withdraw(uint256 tokenId) external\",\n]);\n\nconst voterAbi = parseAbi([\n \"function vote(uint256 tokenId, address[] pools, uint256[] weights) external\",\n \"function claimBribes(address[] bribes, address[][] tokens, uint256 tokenId) external\",\n \"function claimFees(address[] fees, address[][] tokens, uint256 tokenId) external\",\n]);\n\n/**\n * Hybra ve(3,3) Gauge adapter using GaugeManager pattern.\n * CL gauges require NFT deposit and claim goes through GaugeManager (not directly to gauge).\n */\nexport class HybraGaugeAdapter implements IGaugeSystem {\n private readonly protocolName: string;\n private readonly gaugeManager: Address;\n private readonly veToken: Address;\n private readonly voter: Address;\n private readonly positionManager: Address;\n private readonly poolFactory: Address | undefined;\n private readonly rpcUrl: string | undefined;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const gm = entry.contracts?.[\"gauge_manager\"];\n if (!gm) throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'gauge_manager' contract\");\n this.gaugeManager = gm;\n const ve = entry.contracts?.[\"ve_token\"];\n if (!ve) throw new DefiError(\"CONTRACT_ERROR\", \"Missing 've_token' contract\");\n this.veToken = ve;\n this.voter = entry.contracts?.[\"voter\"] ?? zeroAddress as Address;\n this.positionManager = entry.contracts?.[\"position_manager\"] ?? zeroAddress as Address;\n this.poolFactory = entry.contracts?.[\"pool_factory\"];\n this.rpcUrl = rpcUrl;\n }\n\n name(): string { return this.protocolName; }\n\n // ─── Gauge Discovery ──────────────────────────────────────\n\n async discoverGaugedPools(): Promise<GaugedPool[]> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required for gauge discovery\");\n if (!this.poolFactory) throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'pool_factory' contract\");\n\n const factoryAbi = parseAbi([\n \"function allPoolsLength() external view returns (uint256)\",\n \"function allPools(uint256) external view returns (address)\",\n ]);\n const poolAbi = parseAbi([\n \"function token0() external view returns (address)\",\n \"function token1() external view returns (address)\",\n ]);\n const erc20SymbolAbi = parseAbi([\"function symbol() external view returns (string)\"]);\n const gaugesAbi = parseAbi([\"function gauges(address pool) view returns (address gauge)\"]);\n\n // Step 1: get total pool count\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n let poolCount: bigint;\n try {\n poolCount = await client.readContract({\n address: this.poolFactory,\n abi: factoryAbi,\n functionName: \"allPoolsLength\",\n }) as bigint;\n } catch {\n return [];\n }\n\n const count = Number(poolCount);\n if (count === 0) return [];\n\n // Step 2: batch-fetch all pool addresses\n const poolAddressCalls: Array<[Address, Hex]> = [];\n for (let i = 0; i < count; i++) {\n poolAddressCalls.push([\n this.poolFactory,\n encodeFunctionData({ abi: factoryAbi, functionName: \"allPools\", args: [BigInt(i)] }),\n ]);\n }\n const poolAddressResults = await multicallRead(this.rpcUrl, poolAddressCalls);\n const pools: Address[] = poolAddressResults\n .map((r) => decodeAddress(r))\n .filter((a): a is Address => a !== null && a !== zeroAddress);\n\n if (pools.length === 0) return [];\n\n // Step 3: batch GaugeManager.gauges(pool) for all pools\n const gaugeCalls: Array<[Address, Hex]> = pools.map((pool) => [\n this.gaugeManager,\n encodeFunctionData({ abi: gaugesAbi, functionName: \"gauges\", args: [pool] }),\n ]);\n const gaugeResults = await multicallRead(this.rpcUrl, gaugeCalls);\n\n // Filter pools that have an active gauge\n const gaugedPools: Array<{ pool: Address; gauge: Address }> = [];\n for (let i = 0; i < pools.length; i++) {\n const gauge = decodeAddress(gaugeResults[i] ?? null);\n if (gauge && gauge !== zeroAddress) {\n gaugedPools.push({ pool: pools[i]!, gauge });\n }\n }\n\n if (gaugedPools.length === 0) return [];\n\n // Step 4: batch token0() and token1() for gauged pools\n const tokenCalls: Array<[Address, Hex]> = [];\n for (const { pool } of gaugedPools) {\n tokenCalls.push([pool, encodeFunctionData({ abi: poolAbi, functionName: \"token0\" })]);\n tokenCalls.push([pool, encodeFunctionData({ abi: poolAbi, functionName: \"token1\" })]);\n }\n const tokenResults = await multicallRead(this.rpcUrl, tokenCalls);\n\n // Step 5: collect unique token addresses and fetch symbols\n const tokenAddrs = new Set<Address>();\n for (let i = 0; i < gaugedPools.length; i++) {\n const t0 = decodeAddress(tokenResults[i * 2] ?? null);\n const t1 = decodeAddress(tokenResults[i * 2 + 1] ?? null);\n if (t0 && t0 !== zeroAddress) tokenAddrs.add(t0);\n if (t1 && t1 !== zeroAddress) tokenAddrs.add(t1);\n }\n\n const uniqueTokens = Array.from(tokenAddrs);\n const symbolCalls: Array<[Address, Hex]> = uniqueTokens.map((t) => [\n t,\n encodeFunctionData({ abi: erc20SymbolAbi, functionName: \"symbol\" }),\n ]);\n const symbolResults = await multicallRead(this.rpcUrl, symbolCalls);\n const symbolMap = new Map<Address, string>();\n for (let i = 0; i < uniqueTokens.length; i++) {\n symbolMap.set(uniqueTokens[i]!, decodeSymbol(symbolResults[i] ?? null));\n }\n\n // Step 6: assemble results\n const out: GaugedPool[] = [];\n for (let i = 0; i < gaugedPools.length; i++) {\n const { pool, gauge } = gaugedPools[i]!;\n const t0 = decodeAddress(tokenResults[i * 2] ?? null);\n const t1 = decodeAddress(tokenResults[i * 2 + 1] ?? null);\n out.push({\n pool,\n gauge,\n token0: t0 ? (symbolMap.get(t0) ?? t0.slice(0, 10)) : \"?\",\n token1: t1 ? (symbolMap.get(t1) ?? t1.slice(0, 10)) : \"?\",\n type: \"CL\",\n });\n }\n\n return out;\n }\n\n // ─── Gauge Lookup ──────────────────────────────────────────\n\n async resolveGauge(pool: Address): Promise<Address> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const gauge = await client.readContract({\n address: this.gaugeManager, abi: gaugeManagerAbi,\n functionName: \"gauges\", args: [pool],\n }) as Address;\n if (gauge === zeroAddress) throw new DefiError(\"CONTRACT_ERROR\", `No gauge for pool ${pool}`);\n return gauge;\n }\n\n // ─── CL Gauge: NFT Deposit/Withdraw ──────────────────────────\n\n async buildDeposit(gauge: Address, _amount: bigint, tokenId?: bigint): Promise<DeFiTx> {\n if (tokenId === undefined) throw new DefiError(\"CONTRACT_ERROR\", \"tokenId required for CL gauge deposit\");\n\n // Pre-tx: approve NFT to gauge\n const approveTx: DeFiTx = {\n description: `[${this.protocolName}] Approve NFT #${tokenId} to gauge`,\n to: this.positionManager,\n data: encodeFunctionData({ abi: nfpmAbi, functionName: \"approve\", args: [gauge, tokenId] }),\n value: 0n, gas_estimate: 80_000,\n };\n\n return {\n description: `[${this.protocolName}] Deposit NFT #${tokenId} to gauge`,\n to: gauge,\n data: encodeFunctionData({ abi: gaugeCLAbi, functionName: \"deposit\", args: [tokenId] }),\n value: 0n, gas_estimate: 500_000,\n pre_txs: [approveTx],\n };\n }\n\n async buildWithdraw(gauge: Address, _amount: bigint, tokenId?: bigint): Promise<DeFiTx> {\n if (tokenId === undefined) throw new DefiError(\"CONTRACT_ERROR\", \"tokenId required for CL gauge withdraw\");\n return {\n description: `[${this.protocolName}] Withdraw NFT #${tokenId} from gauge`,\n to: gauge,\n data: encodeFunctionData({ abi: gaugeCLAbi, functionName: \"withdraw\", args: [tokenId, 1] }),\n value: 0n, gas_estimate: 1_000_000,\n };\n }\n\n // ─── Claim: via GaugeManager ──────────────────────────────────\n\n async buildClaimRewards(gauge: Address, _account?: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] Use buildClaimRewardsByTokenId for CL gauges`);\n }\n\n async buildClaimRewardsByTokenId(gauge: Address, tokenId: bigint): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Claim rewards for NFT #${tokenId}`,\n to: this.gaugeManager,\n data: encodeFunctionData({\n abi: gaugeManagerAbi, functionName: \"claimRewards\",\n args: [gauge, [tokenId], 1], // redeemType=1\n }),\n value: 0n, gas_estimate: 1_000_000,\n };\n }\n\n // ─── Pending Rewards ──────────────────────────────────────────\n\n async getPendingRewards(gauge: Address, _user: Address): Promise<RewardInfo[]> {\n throw DefiError.unsupported(`[${this.protocolName}] Use getPendingRewardsByTokenId for CL gauges`);\n }\n\n async getPendingRewardsByTokenId(gauge: Address, tokenId: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return await client.readContract({\n address: gauge, abi: gaugeCLAbi,\n functionName: \"earned\", args: [tokenId],\n }) as bigint;\n }\n\n // ─── VoteEscrow ──────────────────────────────────────────────\n\n async buildCreateLock(amount: bigint, lockDuration: number): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Create veNFT lock`,\n to: this.veToken,\n data: encodeFunctionData({ abi: veAbi, functionName: \"create_lock\", args: [amount, BigInt(lockDuration)] }),\n value: 0n, gas_estimate: 300_000,\n };\n }\n\n async buildIncreaseAmount(tokenId: bigint, amount: bigint): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Increase veNFT #${tokenId}`,\n to: this.veToken,\n data: encodeFunctionData({ abi: veAbi, functionName: \"increase_amount\", args: [tokenId, amount] }),\n value: 0n, gas_estimate: 200_000,\n };\n }\n\n async buildIncreaseUnlockTime(tokenId: bigint, lockDuration: number): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Extend veNFT #${tokenId} lock`,\n to: this.veToken,\n data: encodeFunctionData({ abi: veAbi, functionName: \"increase_unlock_time\", args: [tokenId, BigInt(lockDuration)] }),\n value: 0n, gas_estimate: 200_000,\n };\n }\n\n async buildWithdrawExpired(tokenId: bigint): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Withdraw expired veNFT #${tokenId}`,\n to: this.veToken,\n data: encodeFunctionData({ abi: veAbi, functionName: \"withdraw\", args: [tokenId] }),\n value: 0n, gas_estimate: 200_000,\n };\n }\n\n // ─── Voter ──────────────────────────────────────────────────\n\n async buildVote(tokenId: bigint, pools: Address[], weights: bigint[]): Promise<DeFiTx> {\n return {\n description: `[${this.protocolName}] Vote with veNFT #${tokenId}`,\n to: this.voter,\n data: encodeFunctionData({ abi: voterAbi, functionName: \"vote\", args: [tokenId, pools, weights] }),\n value: 0n, gas_estimate: 500_000,\n };\n }\n\n async buildClaimBribes(bribes: Address[], tokenId: bigint): Promise<DeFiTx> {\n const tokensPerBribe: Address[][] = bribes.map(() => []);\n return {\n description: `[${this.protocolName}] Claim bribes for veNFT #${tokenId}`,\n to: this.voter,\n data: encodeFunctionData({ abi: voterAbi, functionName: \"claimBribes\", args: [bribes, tokensPerBribe, tokenId] }),\n value: 0n, gas_estimate: 300_000,\n };\n }\n\n async buildClaimFees(fees: Address[], tokenId: bigint): Promise<DeFiTx> {\n const tokensPerFee: Address[][] = fees.map(() => []);\n return {\n description: `[${this.protocolName}] Claim fees for veNFT #${tokenId}`,\n to: this.voter,\n data: encodeFunctionData({ abi: voterAbi, functionName: \"claimFees\", args: [fees, tokensPerFee, tokenId] }),\n value: 0n, gas_estimate: 300_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, zeroAddress } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IDex,\n ProtocolEntry,\n SwapParams,\n QuoteParams,\n QuoteResult,\n AddLiquidityParams,\n RemoveLiquidityParams,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst abi = parseAbi([\n \"function swap(address fromToken, address toToken, uint256 fromAmount, uint256 minToAmount, address to, address rebateTo) external payable returns (uint256 realToAmount)\",\n]);\n\nexport class WooFiAdapter implements IDex {\n private readonly protocolName: string;\n private readonly router: `0x${string}`;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const router = entry.contracts?.[\"router\"];\n if (!router) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'router' contract\");\n }\n this.router = router;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSwap(params: SwapParams): Promise<DeFiTx> {\n const minToAmount = 0n;\n\n const data = encodeFunctionData({\n abi,\n functionName: \"swap\",\n args: [\n params.token_in,\n params.token_out,\n params.amount_in,\n minToAmount,\n params.recipient,\n zeroAddress,\n ],\n });\n\n return {\n description: `[${this.protocolName}] Swap ${params.amount_in} via WOOFi`,\n to: this.router,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async quote(_params: QuoteParams): Promise<QuoteResult> {\n throw DefiError.unsupported(`[${this.protocolName}] quote requires RPC`);\n }\n\n async buildAddLiquidity(_params: AddLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] WOOFi does not support LP positions via router`);\n }\n\n async buildRemoveLiquidity(_params: RemoveLiquidityParams): Promise<DeFiTx> {\n throw DefiError.unsupported(`[${this.protocolName}] WOOFi does not support LP positions via router`);\n }\n}\n","import { createPublicClient, decodeFunctionResult, encodeFunctionData, http, parseAbi, zeroAddress } from \"viem\";\nimport type { Address, Hex } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type {\n IGaugeSystem,\n GaugedPool,\n ProtocolEntry,\n RewardInfo,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst gaugeAbi = parseAbi([\n \"function deposit(uint256 amount) external\",\n \"function depositFor(uint256 amount, uint256 tokenId) external\",\n \"function withdraw(uint256 amount) external\",\n \"function getReward() external\",\n \"function getReward(address account) external\",\n \"function getReward(address account, address[] tokens) external\",\n \"function getReward(uint256 tokenId) external\",\n \"function earned(address account) external view returns (uint256)\",\n \"function earned(address token, address account) external view returns (uint256)\",\n \"function earned(uint256 tokenId) external view returns (uint256)\",\n \"function rewardRate() external view returns (uint256)\",\n \"function rewardToken() external view returns (address)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function rewardsListLength() external view returns (uint256)\",\n \"function rewardData(address token) external view returns (uint256 periodFinish, uint256 rewardRate, uint256 lastUpdateTime, uint256 rewardPerTokenStored)\",\n \"function nonfungiblePositionManager() external view returns (address)\",\n]);\n\nconst veAbi = parseAbi([\n \"function create_lock(uint256 value, uint256 lock_duration) external returns (uint256)\",\n \"function increase_amount(uint256 tokenId, uint256 value) external\",\n \"function increase_unlock_time(uint256 tokenId, uint256 lock_duration) external\",\n \"function withdraw(uint256 tokenId) external\",\n \"function balanceOfNFT(uint256 tokenId) external view returns (uint256)\",\n \"function locked(uint256 tokenId) external view returns (uint256 amount, uint256 end)\",\n]);\n\nconst voterAbi = parseAbi([\n \"function vote(uint256 tokenId, address[] calldata pools, uint256[] calldata weights) external\",\n \"function claimBribes(address[] calldata bribes, address[][] calldata tokens, uint256 tokenId) external\",\n \"function claimFees(address[] calldata fees, address[][] calldata tokens, uint256 tokenId) external\",\n \"function gauges(address pool) external view returns (address)\",\n \"function gaugeForPool(address pool) external view returns (address)\",\n \"function poolToGauge(address pool) external view returns (address)\",\n]);\n\n// Multicall decode helpers\nconst _addressDecodeAbi = parseAbi([\"function f() external view returns (address)\"]);\nfunction decodeAddress(data: Hex | null): Address | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _addressDecodeAbi, functionName: \"f\", data }) as Address;\n } catch {\n return null;\n }\n}\n\nconst _symbolDecodeAbi = parseAbi([\"function symbol() external view returns (string)\"]);\nfunction decodeSymbol(data: Hex | null): string {\n if (!data) return \"?\";\n try {\n return decodeFunctionResult({ abi: _symbolDecodeAbi, functionName: \"symbol\", data }) as string;\n } catch {\n return \"?\";\n }\n}\n\nconst _boolDecodeAbi = parseAbi([\"function f() external view returns (bool)\"]);\nfunction decodeBoolean(data: Hex): boolean {\n try {\n return decodeFunctionResult({ abi: _boolDecodeAbi, functionName: \"f\", data }) as boolean;\n } catch {\n return false;\n }\n}\n\n// HyperEVM well-known token addresses for CL pool discovery\nconst HYPEREVM_TOKENS: Record<string, Address> = {\n WHYPE: \"0x5555555555555555555555555555555555555555\",\n USDC: \"0xb88339CB7199b77E23DB6E890353E22632Ba630f\",\n USDT0: \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\",\n UETH: \"0xBe6727B535545C67d5cAa73dEa54865B92CF7907\",\n UBTC: \"0x9FDBdA0A5e284c32744D2f17Ee5c74B284993463\",\n USDH: \"0x111111a1a0667d36bD57c0A9f569b98057111111\",\n USDe: \"0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34\",\n sUSDe: \"0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2\",\n XAUt0: \"0xf4D9235269a96aaDaFc9aDAe454a0618eBE37949\",\n kHYPE: \"0xfD739d4e423301CE9385c1fb8850539D657C296D\",\n RAM: \"0x555570a286F15EbDFE42B66eDE2f724Aa1AB5555\",\n hyperRAM: \"0xAAAE8378809bb8815c08D3C59Eb0c7D1529aD769\",\n};\n\nconst CL_TICK_SPACINGS = [1, 5, 10, 50, 100, 200];\n\nexport class SolidlyGaugeAdapter implements IGaugeSystem {\n private readonly protocolName: string;\n private readonly voter: Address;\n private readonly veToken: Address;\n private readonly rpcUrl: string | undefined;\n private readonly clFactory: Address | undefined;\n private readonly v2Factory: Address | undefined;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const voter = entry.contracts?.[\"voter\"];\n if (!voter) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'voter' contract\");\n }\n const veToken = entry.contracts?.[\"ve_token\"];\n if (!veToken) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 've_token' contract\");\n }\n this.voter = voter;\n this.veToken = veToken;\n this.rpcUrl = rpcUrl;\n this.clFactory = entry.contracts?.[\"cl_factory\"] ?? entry.contracts?.[\"factory\"];\n this.v2Factory = entry.contracts?.[\"pair_factory\"] ?? entry.contracts?.[\"factory\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n /** Scan V2 and CL factories for pools that have active emission gauges. */\n async discoverGaugedPools(): Promise<GaugedPool[]> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required for gauge discovery\");\n\n const results: GaugedPool[] = [];\n\n await Promise.all([\n this._discoverV2GaugedPools(results),\n this._discoverCLGaugedPools(results),\n ]);\n\n return results;\n }\n\n private async _discoverV2GaugedPools(out: GaugedPool[]): Promise<void> {\n if (!this.rpcUrl || !this.v2Factory) return;\n\n const v2FactoryAbi = parseAbi([\n \"function allPairsLength() external view returns (uint256)\",\n \"function allPairs(uint256) external view returns (address)\",\n ]);\n const pairAbi = parseAbi([\n \"function token0() external view returns (address)\",\n \"function token1() external view returns (address)\",\n \"function stable() external view returns (bool)\",\n ]);\n const erc20SymbolAbi = parseAbi([\"function symbol() external view returns (string)\"]);\n\n // Step 1: get total pairs count\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n let pairCount: bigint;\n try {\n pairCount = await client.readContract({\n address: this.v2Factory,\n abi: v2FactoryAbi,\n functionName: \"allPairsLength\",\n }) as bigint;\n } catch {\n return;\n }\n\n const count = Number(pairCount);\n if (count === 0) return;\n\n // Step 2: batch-fetch all pair addresses\n const pairAddressCalls: Array<[Address, Hex]> = [];\n for (let i = 0; i < count; i++) {\n pairAddressCalls.push([\n this.v2Factory,\n encodeFunctionData({ abi: v2FactoryAbi, functionName: \"allPairs\", args: [BigInt(i)] }),\n ]);\n }\n const pairAddressResults = await multicallRead(this.rpcUrl, pairAddressCalls);\n const pairs: Address[] = pairAddressResults.map((r) => decodeAddress(r)).filter((a): a is Address => a !== null && a !== zeroAddress);\n\n if (pairs.length === 0) return;\n\n // Step 3: for each pair, call gaugeForPool on voter (fallback to poolToGauge)\n const gaugeForPoolAbi = parseAbi([\"function gaugeForPool(address) external view returns (address)\"]);\n const poolToGaugeAbi = parseAbi([\"function poolToGauge(address) external view returns (address)\"]);\n const gaugeCalls: Array<[Address, Hex]> = pairs.map((pair) => [\n this.voter,\n encodeFunctionData({ abi: gaugeForPoolAbi, functionName: \"gaugeForPool\", args: [pair] }),\n ]);\n let gaugeResults = await multicallRead(this.rpcUrl, gaugeCalls);\n\n // If all results are null (gaugeForPool not supported), try poolToGauge\n const allNullV2 = gaugeResults.every(r => !r || decodeAddress(r) === zeroAddress || decodeAddress(r) === null);\n if (allNullV2) {\n const fallbackCalls: Array<[Address, Hex]> = pairs.map((pair) => [\n this.voter,\n encodeFunctionData({ abi: poolToGaugeAbi, functionName: \"poolToGauge\", args: [pair] }),\n ]);\n gaugeResults = await multicallRead(this.rpcUrl, fallbackCalls);\n }\n\n // Filter only pairs that have a gauge\n const gaugedPairs: Array<{ pair: Address; gauge: Address }> = [];\n for (let i = 0; i < pairs.length; i++) {\n const gauge = decodeAddress(gaugeResults[i] ?? null);\n if (gauge && gauge !== zeroAddress) {\n gaugedPairs.push({ pair: pairs[i]!, gauge });\n }\n }\n\n if (gaugedPairs.length === 0) return;\n\n // Step 4: fetch token0, token1, stable for each gauged pair\n const metaCalls: Array<[Address, Hex]> = [];\n for (const { pair } of gaugedPairs) {\n metaCalls.push([pair, encodeFunctionData({ abi: pairAbi, functionName: \"token0\" })]);\n metaCalls.push([pair, encodeFunctionData({ abi: pairAbi, functionName: \"token1\" })]);\n metaCalls.push([pair, encodeFunctionData({ abi: pairAbi, functionName: \"stable\" })]);\n }\n const metaResults = await multicallRead(this.rpcUrl, metaCalls);\n\n // Step 5: collect unique token addresses and fetch symbols\n const tokenAddrs = new Set<Address>();\n for (let i = 0; i < gaugedPairs.length; i++) {\n const t0 = decodeAddress(metaResults[i * 3] ?? null);\n const t1 = decodeAddress(metaResults[i * 3 + 1] ?? null);\n if (t0 && t0 !== zeroAddress) tokenAddrs.add(t0);\n if (t1 && t1 !== zeroAddress) tokenAddrs.add(t1);\n }\n\n const uniqueTokens = Array.from(tokenAddrs);\n const symbolCalls: Array<[Address, Hex]> = uniqueTokens.map((t) => [\n t,\n encodeFunctionData({ abi: erc20SymbolAbi, functionName: \"symbol\" }),\n ]);\n const symbolResults = await multicallRead(this.rpcUrl, symbolCalls);\n const symbolMap = new Map<Address, string>();\n for (let i = 0; i < uniqueTokens.length; i++) {\n symbolMap.set(uniqueTokens[i]!, decodeSymbol(symbolResults[i] ?? null));\n }\n\n // Step 6: assemble results\n for (let i = 0; i < gaugedPairs.length; i++) {\n const { pair, gauge } = gaugedPairs[i]!;\n const t0 = decodeAddress(metaResults[i * 3] ?? null);\n const t1 = decodeAddress(metaResults[i * 3 + 1] ?? null);\n const stableRaw = metaResults[i * 3 + 2];\n const stable = stableRaw ? decodeBoolean(stableRaw) : false;\n out.push({\n pool: pair,\n gauge,\n token0: t0 ? (symbolMap.get(t0) ?? t0.slice(0, 10)) : \"?\",\n token1: t1 ? (symbolMap.get(t1) ?? t1.slice(0, 10)) : \"?\",\n type: \"V2\",\n stable,\n });\n }\n }\n\n private async _discoverCLGaugedPools(out: GaugedPool[]): Promise<void> {\n if (!this.rpcUrl || !this.clFactory) return;\n\n const clFactoryAbi = parseAbi([\n \"function getPool(address tokenA, address tokenB, int24 tickSpacing) external view returns (address pool)\",\n ]);\n const algebraFactoryAbi = parseAbi([\n \"function poolByPair(address tokenA, address tokenB) external view returns (address pool)\",\n ]);\n const poolAbi = parseAbi([\n \"function token0() external view returns (address)\",\n \"function token1() external view returns (address)\",\n ]);\n const erc20SymbolAbi = parseAbi([\"function symbol() external view returns (string)\"]);\n const gaugeForPoolAbi = parseAbi([\"function gaugeForPool(address) external view returns (address)\"]);\n const poolToGaugeAbi = parseAbi([\"function poolToGauge(address) external view returns (address)\"]);\n\n const tokenEntries = Object.entries(HYPEREVM_TOKENS);\n const tokenAddresses = tokenEntries.map(([, addr]) => addr);\n\n // Generate all unique token pairs\n const pairs: Array<[Address, Address]> = [];\n for (let i = 0; i < tokenAddresses.length; i++) {\n for (let j = i + 1; j < tokenAddresses.length; j++) {\n pairs.push([tokenAddresses[i]!, tokenAddresses[j]!]);\n }\n }\n\n // Detect factory type: try poolByPair (Algebra) — if it returns non-null, it's Algebra\n const isAlgebra = await (async () => {\n try {\n const [result] = await multicallRead(this.rpcUrl!, [[\n this.clFactory!,\n encodeFunctionData({ abi: algebraFactoryAbi, functionName: \"poolByPair\", args: [tokenAddresses[0]!, tokenAddresses[1]!] }),\n ]]);\n // If poolByPair returns any data (even zero address), it's Algebra\n return result !== null && result.length >= 66;\n } catch {\n return false;\n }\n })();\n\n // Build pool lookup calls\n const getPoolCalls: Array<[Address, Hex]> = [];\n const callMeta: Array<{ pairIdx: number; tickSpacing: number }> = [];\n\n if (isAlgebra) {\n // Algebra: one pool per pair (no tickSpacing)\n for (let p = 0; p < pairs.length; p++) {\n const [tokenA, tokenB] = pairs[p]!;\n getPoolCalls.push([\n this.clFactory!,\n encodeFunctionData({ abi: algebraFactoryAbi, functionName: \"poolByPair\", args: [tokenA!, tokenB!] }),\n ]);\n callMeta.push({ pairIdx: p, tickSpacing: 0 });\n }\n } else {\n // Uniswap-style: multiple tick spacings per pair\n for (let p = 0; p < pairs.length; p++) {\n const [tokenA, tokenB] = pairs[p]!;\n for (const ts of CL_TICK_SPACINGS) {\n getPoolCalls.push([\n this.clFactory!,\n encodeFunctionData({ abi: clFactoryAbi, functionName: \"getPool\", args: [tokenA!, tokenB!, ts] }),\n ]);\n callMeta.push({ pairIdx: p, tickSpacing: ts });\n }\n }\n }\n\n const getPoolResults = await multicallRead(this.rpcUrl, getPoolCalls);\n\n // Collect non-zero pool addresses\n const candidatePools: Array<{ pool: Address; tokenA: Address; tokenB: Address; tickSpacing: number }> = [];\n for (let i = 0; i < getPoolCalls.length; i++) {\n const pool = decodeAddress(getPoolResults[i] ?? null);\n if (pool && pool !== zeroAddress) {\n const { pairIdx, tickSpacing } = callMeta[i]!;\n const [tokenA, tokenB] = pairs[pairIdx]!;\n candidatePools.push({ pool, tokenA: tokenA!, tokenB: tokenB!, tickSpacing });\n }\n }\n\n if (candidatePools.length === 0) return;\n\n // Batch gauge lookup — try gaugeForPool first, fallback to poolToGauge\n const gaugeCalls: Array<[Address, Hex]> = candidatePools.map(({ pool }) => [\n this.voter,\n encodeFunctionData({ abi: gaugeForPoolAbi, functionName: \"gaugeForPool\", args: [pool] }),\n ]);\n let gaugeResults = await multicallRead(this.rpcUrl, gaugeCalls);\n\n // If all results are null (gaugeForPool not supported), try poolToGauge\n const allNull = gaugeResults.every(r => !r || decodeAddress(r) === zeroAddress || decodeAddress(r) === null);\n if (allNull) {\n const fallbackCalls: Array<[Address, Hex]> = candidatePools.map(({ pool }) => [\n this.voter,\n encodeFunctionData({ abi: poolToGaugeAbi, functionName: \"poolToGauge\", args: [pool] }),\n ]);\n gaugeResults = await multicallRead(this.rpcUrl, fallbackCalls);\n }\n\n // Filter to pools that have a gauge\n const gaugedCL: Array<{ pool: Address; gauge: Address; tokenA: Address; tokenB: Address; tickSpacing: number }> = [];\n for (let i = 0; i < candidatePools.length; i++) {\n const gauge = decodeAddress(gaugeResults[i] ?? null);\n if (gauge && gauge !== zeroAddress) {\n gaugedCL.push({ ...candidatePools[i]!, gauge });\n }\n }\n\n if (gaugedCL.length === 0) return;\n\n // Fetch token0/token1 from pool to get correct ordering, then symbols\n const tokenAddrsInPools = new Set<Address>();\n for (const { tokenA, tokenB } of gaugedCL) {\n tokenAddrsInPools.add(tokenA);\n tokenAddrsInPools.add(tokenB);\n }\n const uniqueTokens = Array.from(tokenAddrsInPools);\n const symbolCalls: Array<[Address, Hex]> = uniqueTokens.map((t) => [\n t,\n encodeFunctionData({ abi: erc20SymbolAbi, functionName: \"symbol\" }),\n ]);\n const symbolResults = await multicallRead(this.rpcUrl, symbolCalls);\n const symbolMap = new Map<Address, string>();\n for (let i = 0; i < uniqueTokens.length; i++) {\n symbolMap.set(uniqueTokens[i]!, decodeSymbol(symbolResults[i] ?? null));\n }\n\n // Also try to read actual token0/token1 ordering from the pool contract\n const poolTokenCalls: Array<[Address, Hex]> = [];\n for (const { pool } of gaugedCL) {\n poolTokenCalls.push([pool, encodeFunctionData({ abi: poolAbi, functionName: \"token0\" })]);\n poolTokenCalls.push([pool, encodeFunctionData({ abi: poolAbi, functionName: \"token1\" })]);\n }\n const poolTokenResults = await multicallRead(this.rpcUrl, poolTokenCalls);\n\n for (let i = 0; i < gaugedCL.length; i++) {\n const { pool, gauge, tokenA, tokenB, tickSpacing } = gaugedCL[i]!;\n const rawT0 = decodeAddress(poolTokenResults[i * 2] ?? null);\n const rawT1 = decodeAddress(poolTokenResults[i * 2 + 1] ?? null);\n const t0 = rawT0 && rawT0 !== zeroAddress ? rawT0 : tokenA;\n const t1 = rawT1 && rawT1 !== zeroAddress ? rawT1 : tokenB;\n out.push({\n pool,\n gauge,\n token0: symbolMap.get(t0) ?? t0.slice(0, 10),\n token1: symbolMap.get(t1) ?? t1.slice(0, 10),\n type: \"CL\",\n tickSpacing,\n });\n }\n }\n\n // IGauge\n\n async buildDeposit(gauge: Address, amount: bigint, tokenId?: bigint, lpToken?: Address): Promise<DeFiTx> {\n if (tokenId !== undefined) {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"depositFor\",\n args: [amount, tokenId],\n });\n return {\n description: `[${this.protocolName}] Deposit ${amount} LP to gauge (boost veNFT #${tokenId})`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: lpToken ? [{ token: lpToken, spender: gauge, amount }] : undefined,\n };\n }\n\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"deposit\",\n args: [amount],\n });\n return {\n description: `[${this.protocolName}] Deposit ${amount} LP to gauge`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 200_000,\n approvals: lpToken ? [{ token: lpToken, spender: gauge, amount }] : undefined,\n };\n }\n\n async buildWithdraw(gauge: Address, amount: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"withdraw\",\n args: [amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${amount} LP from gauge`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /**\n * Resolve gauge address from a pool address via voter contract.\n * Tries gaugeForPool (Ramses), poolToGauge (NEST), gauges (classic Solidly).\n */\n async resolveGauge(pool: Address): Promise<Address> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required for gauge lookup\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n for (const fn of [\"gaugeForPool\", \"poolToGauge\", \"gauges\"] as const) {\n try {\n const gauge = await client.readContract({\n address: this.voter,\n abi: voterAbi,\n functionName: fn,\n args: [pool],\n }) as Address;\n if (gauge !== zeroAddress) return gauge;\n } catch {\n // try next\n }\n }\n throw new DefiError(\"CONTRACT_ERROR\", `[${this.protocolName}] No gauge found for pool ${pool}`);\n }\n\n /**\n * Discover reward tokens for a gauge.\n * Returns { tokens, multiToken } where multiToken indicates getReward(account, tokens[]) support.\n */\n private async discoverRewardTokens(gauge: Address): Promise<{ tokens: Address[]; multiToken: boolean }> {\n if (!this.rpcUrl) return { tokens: [], multiToken: false };\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n // 1. Try rewardsListLength — multi-token gauges (Ramses style)\n try {\n const len = await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"rewardsListLength\",\n }) as bigint;\n\n if (Number(len) > 0) {\n // Discover via rewardData for known HyperEVM tokens\n const candidates: Address[] = [\n \"0x5555555555555555555555555555555555555555\", // WHYPE\n \"0x555570a286F15EbDFE42B66eDE2f724Aa1AB5555\", // xRAM\n \"0x067b0C72aa4C6Bd3BFEFfF443c536DCd6a25a9C8\", // HYBR\n \"0x07c57E32a3C29D5659bda1d3EFC2E7BF004E3035\", // NEST token\n ];\n const found: Address[] = [];\n for (const token of candidates) {\n try {\n const rd = await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"rewardData\",\n args: [token],\n }) as readonly [bigint, bigint, bigint, bigint];\n if (rd[0] > 0n || rd[1] > 0n) found.push(token);\n } catch { /* not a reward */ }\n }\n if (found.length > 0) return { tokens: found, multiToken: true };\n return { tokens: [], multiToken: true }; // has rewards but couldn't enumerate\n }\n } catch {\n // no rewardsListLength\n }\n\n // 2. Fallback: rewardToken() — single-reward gauges (NEST / Hybra style)\n try {\n const rt = await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"rewardToken\",\n }) as Address;\n if (rt !== zeroAddress) return { tokens: [rt], multiToken: false };\n } catch { /* no rewardToken */ }\n\n return { tokens: [], multiToken: false };\n }\n\n async buildClaimRewards(gauge: Address, account?: Address): Promise<DeFiTx> {\n if (!this.rpcUrl || !account) {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [account ?? zeroAddress],\n });\n return { description: `[${this.protocolName}] Claim gauge rewards`, to: gauge, data, value: 0n, gas_estimate: 200_000 };\n }\n\n const { tokens, multiToken } = await this.discoverRewardTokens(gauge);\n\n // Multi-token gauge (Ramses): getReward(account, tokens[])\n if (multiToken && tokens.length > 0) {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [account, tokens],\n });\n return {\n description: `[${this.protocolName}] Claim gauge rewards (${tokens.length} tokens)`,\n to: gauge, data, value: 0n, gas_estimate: 300_000,\n };\n }\n\n // Single-token gauge (NEST / standard): getReward() with no args\n // Some gauges use getReward(account), but NEST-style uses getReward()\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [],\n });\n return {\n description: `[${this.protocolName}] Claim gauge rewards`,\n to: gauge, data, value: 0n, gas_estimate: 200_000,\n };\n }\n\n /**\n * Claim rewards for a CL gauge by NFT tokenId (Hybra V4 style).\n */\n async buildClaimRewardsByTokenId(gauge: Address, tokenId: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: gaugeAbi,\n functionName: \"getReward\",\n args: [tokenId],\n });\n return {\n description: `[${this.protocolName}] Claim gauge rewards for NFT #${tokenId}`,\n to: gauge,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async getPendingRewards(gauge: Address, user: Address): Promise<RewardInfo[]> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const results: RewardInfo[] = [];\n\n const { tokens, multiToken } = await this.discoverRewardTokens(gauge);\n\n if (multiToken && tokens.length > 0) {\n for (const token of tokens) {\n try {\n const earned = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"earned\", args: [token, user],\n }) as bigint;\n results.push({ token, symbol: token.slice(0, 10), amount: earned });\n } catch { /* skip */ }\n }\n } else if (tokens.length > 0) {\n // Single-token gauge: earned(account)\n try {\n const earned = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"earned\", args: [user],\n }) as bigint;\n results.push({ token: tokens[0]!, symbol: tokens[0]!.slice(0, 10), amount: earned });\n } catch { /* skip */ }\n } else {\n try {\n const earned = await client.readContract({\n address: gauge, abi: gaugeAbi, functionName: \"earned\", args: [user],\n }) as bigint;\n results.push({ token: zeroAddress as Address, symbol: \"unknown\", amount: earned });\n } catch { /* skip */ }\n }\n\n return results;\n }\n\n /**\n * Get pending rewards for a CL gauge NFT position (Hybra V4 style).\n */\n async getPendingRewardsByTokenId(gauge: Address, tokenId: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"RPC URL required\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return await client.readContract({\n address: gauge,\n abi: gaugeAbi,\n functionName: \"earned\",\n args: [tokenId],\n }) as bigint;\n }\n\n // IVoteEscrow\n\n async buildCreateLock(amount: bigint, lockDuration: number): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"create_lock\",\n args: [amount, BigInt(lockDuration)],\n });\n return {\n description: `[${this.protocolName}] Create veNFT lock: ${amount} tokens for ${lockDuration}s`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildIncreaseAmount(tokenId: bigint, amount: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"increase_amount\",\n args: [tokenId, amount],\n });\n return {\n description: `[${this.protocolName}] Increase veNFT #${tokenId} by ${amount}`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildIncreaseUnlockTime(tokenId: bigint, lockDuration: number): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"increase_unlock_time\",\n args: [tokenId, BigInt(lockDuration)],\n });\n return {\n description: `[${this.protocolName}] Extend veNFT #${tokenId} lock by ${lockDuration}s`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildWithdrawExpired(tokenId: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: veAbi,\n functionName: \"withdraw\",\n args: [tokenId],\n });\n return {\n description: `[${this.protocolName}] Withdraw expired veNFT #${tokenId}`,\n to: this.veToken,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n // IVoter\n\n async buildVote(tokenId: bigint, pools: Address[], weights: bigint[]): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: voterAbi,\n functionName: \"vote\",\n args: [tokenId, pools, weights],\n });\n return {\n description: `[${this.protocolName}] Vote with veNFT #${tokenId}`,\n to: this.voter,\n data,\n value: 0n,\n gas_estimate: 500_000,\n };\n }\n\n async buildClaimBribes(bribes: Address[], tokenId: bigint): Promise<DeFiTx> {\n // claimBribes needs token arrays per bribe contract — simplified version\n const tokensPerBribe: Address[][] = bribes.map(() => []);\n const data = encodeFunctionData({\n abi: voterAbi,\n functionName: \"claimBribes\",\n args: [bribes, tokensPerBribe, tokenId],\n });\n return {\n description: `[${this.protocolName}] Claim bribes for veNFT #${tokenId}`,\n to: this.voter,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildClaimFees(fees: Address[], tokenId: bigint): Promise<DeFiTx> {\n const tokensPerFee: Address[][] = fees.map(() => []);\n const data = encodeFunctionData({\n abi: voterAbi,\n functionName: \"claimFees\",\n args: [fees, tokensPerFee, tokenId],\n });\n return {\n description: `[${this.protocolName}] Claim trading fees for veNFT #${tokenId}`,\n to: this.voter,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n}\n","import { encodeFunctionData, parseAbi, createPublicClient, http } from \"viem\";\nimport type { Address } from \"viem\";\n\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport type {\n IGauge,\n ProtocolEntry,\n RewardInfo,\n DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst masterchefAbi = parseAbi([\n \"function deposit(uint256 pid, uint256 amount) external\",\n \"function withdraw(uint256 pid, uint256 amount) external\",\n \"function claim(uint256[] calldata pids) external\",\n \"function pendingRewards(address account, uint256[] calldata pids) view returns (uint256[] memory moeRewards)\",\n \"function getNumberOfFarms() view returns (uint256)\",\n \"function getPidByPool(address pool) view returns (uint256)\",\n]);\n\nexport class MasterChefAdapter implements IGauge {\n private readonly protocolName: string;\n private readonly masterchef: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const masterchef = entry.contracts?.[\"masterchef\"];\n if (!masterchef) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'masterchef' contract\");\n }\n this.masterchef = masterchef;\n this.rpcUrl = rpcUrl;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n /**\n * Deposit LP tokens into a MasterChef farm.\n * `gauge` is the pool address (unused for calldata — MasterChef is the target).\n * `tokenId` carries the farm pid.\n */\n async buildDeposit(gauge: Address, amount: bigint, tokenId?: bigint): Promise<DeFiTx> {\n const pid = tokenId ?? 0n;\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"deposit\",\n args: [pid, amount],\n });\n return {\n description: `[${this.protocolName}] Deposit ${amount} LP to farm pid=${pid} (pool ${gauge})`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /**\n * Withdraw LP tokens from a MasterChef farm.\n * `gauge` is used to look up the pid description only; call site should pass pid via tokenId\n * on the deposit flow. Here pid defaults to 0 — callers should encode the pid in the gauge\n * address slot or wrap this adapter with a pid-aware helper.\n */\n async buildWithdraw(gauge: Address, amount: bigint): Promise<DeFiTx> {\n // IGauge interface does not carry tokenId on withdraw; default pid=0.\n // Callers that need a specific pid should call buildWithdrawPid directly.\n const pid = 0n;\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"withdraw\",\n args: [pid, amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${amount} LP from farm pid=${pid} (pool ${gauge})`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Withdraw LP tokens specifying a pid explicitly (MasterChef extension beyond IGauge). */\n async buildWithdrawPid(pid: bigint, amount: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"withdraw\",\n args: [pid, amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${amount} LP from farm pid=${pid}`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Claim pending MOE rewards. IGauge interface provides no pid — defaults to pid=0. */\n async buildClaimRewards(gauge: Address): Promise<DeFiTx> {\n const pid = 0n;\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"claim\",\n args: [[pid]],\n });\n return {\n description: `[${this.protocolName}] Claim MOE rewards for farm pid=${pid} (pool ${gauge})`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Claim pending MOE rewards for a specific pid (MasterChef extension beyond IGauge). */\n async buildClaimRewardsPid(pid: bigint): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: masterchefAbi,\n functionName: \"claim\",\n args: [[pid]],\n });\n return {\n description: `[${this.protocolName}] Claim MOE rewards for farm pid=${pid}`,\n to: this.masterchef,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /** Get pending MOE rewards for a user. Requires rpcUrl. */\n async getPendingRewards(_gauge: Address, user: Address): Promise<RewardInfo[]> {\n if (!this.rpcUrl) {\n throw DefiError.unsupported(`[${this.protocolName}] getPendingRewards requires RPC`);\n }\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const rewards = await client.readContract({\n address: this.masterchef,\n abi: masterchefAbi,\n functionName: \"pendingRewards\",\n args: [user, [0n]],\n });\n return (rewards as bigint[]).map((amount) => ({\n token: this.masterchef,\n symbol: \"MOE\",\n amount,\n }));\n }\n}\n","import {\n encodeFunctionData,\n decodeFunctionResult,\n parseAbi,\n createPublicClient,\n http,\n} from \"viem\";\nimport type { Address, Hex } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type { ProtocolEntry, DeFiTx, RewardInfo } from \"@hypurrquant/defi-core\";\n\n// ============================================================\n// ABIs\n// ============================================================\n\nconst lbRouterAbi = parseAbi([\n \"struct LiquidityParameters { address tokenX; address tokenY; uint256 binStep; uint256 amountX; uint256 amountY; uint256 amountXMin; uint256 amountYMin; uint256 activeIdDesired; uint256 idSlippage; int256[] deltaIds; uint256[] distributionX; uint256[] distributionY; address to; address refundTo; uint256 deadline; }\",\n \"function addLiquidity(LiquidityParameters calldata liquidityParameters) external returns (uint256 amountXAdded, uint256 amountYAdded, uint256 amountXLeft, uint256 amountYLeft, uint256[] memory depositIds, uint256[] memory liquidityMinted)\",\n \"function removeLiquidity(address tokenX, address tokenY, uint16 binStep, uint256 amountXMin, uint256 amountYMin, uint256[] memory ids, uint256[] memory amounts, address to, uint256 deadline) external returns (uint256 amountX, uint256 amountY)\",\n]);\n\nconst lbFactoryAbi = parseAbi([\n \"function getNumberOfLBPairs() external view returns (uint256)\",\n \"function getLBPairAtIndex(uint256 index) external view returns (address)\",\n]);\n\nconst lbPairAbi = parseAbi([\n \"function getLBHooksParameters() external view returns (bytes32)\",\n \"function getActiveId() external view returns (uint24)\",\n \"function getBinStep() external view returns (uint16)\",\n \"function getTokenX() external view returns (address)\",\n \"function getTokenY() external view returns (address)\",\n \"function balanceOf(address account, uint256 id) external view returns (uint256)\",\n \"function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory)\",\n]);\n\nconst lbRewarderAbi = parseAbi([\n \"function getRewardToken() external view returns (address)\",\n \"function getRewardedRange() external view returns (uint256 minBinId, uint256 maxBinId)\",\n \"function getPendingRewards(address user, uint256[] calldata ids) external view returns (uint256 pendingRewards)\",\n \"function claim(address user, uint256[] calldata ids) external\",\n \"function getPid() external view returns (uint256)\",\n \"function isStopped() external view returns (bool)\",\n \"function getLBPair() external view returns (address)\",\n \"function getMasterChef() external view returns (address)\",\n]);\n\nconst masterChefAbi = parseAbi([\n \"function getMoePerSecond() external view returns (uint256)\",\n \"function getTreasuryShare() external view returns (uint256)\",\n \"function getStaticShare() external view returns (uint256)\",\n \"function getVeMoe() external view returns (address)\",\n]);\n\nconst veMoeAbi = parseAbi([\n \"function getWeight(uint256 pid) external view returns (uint256)\",\n \"function getTotalWeight() external view returns (uint256)\",\n \"function getTopPoolIds() external view returns (uint256[] memory)\",\n]);\n\nconst lbPairBinAbi = parseAbi([\n \"function getBin(uint24 id) external view returns (uint128 reserveX, uint128 reserveY)\",\n \"function getActiveId() external view returns (uint24)\",\n]);\n\nconst lbQuoterAbi = parseAbi([\n \"function findBestPathFromAmountIn(address[] calldata route, uint128 amountIn) external view returns ((address[] route, address[] pairs, uint256[] binSteps, uint256[] versions, uint128[] amounts, uint128[] virtualAmountsWithoutSlippage, uint128[] fees))\",\n]);\n\nconst erc20Abi = parseAbi([\n \"function symbol() external view returns (string)\",\n]);\n\n// ============================================================\n// Types\n// ============================================================\n\nexport interface LBAddLiquidityParams {\n pool: Address;\n tokenX: Address;\n tokenY: Address;\n binStep: number;\n amountX: bigint;\n amountY: bigint;\n /** Number of bins on each side of active bin to distribute across (default: 5) */\n numBins?: number;\n /** Active bin id desired (defaults to on-chain query if rpcUrl provided) */\n activeIdDesired?: number;\n recipient: Address;\n deadline?: bigint;\n}\n\nexport interface LBRemoveLiquidityParams {\n tokenX: Address;\n tokenY: Address;\n binStep: number;\n binIds: number[];\n /** Amount of LB tokens to remove per bin (in order matching binIds) */\n amounts: bigint[];\n amountXMin?: bigint;\n amountYMin?: bigint;\n recipient: Address;\n deadline?: bigint;\n}\n\nexport interface LBPosition {\n binId: number;\n balance: bigint;\n}\n\nexport interface RewardedPool {\n pool: Address;\n rewarder: Address;\n rewardToken: Address;\n minBinId: number;\n maxBinId: number;\n pid: number;\n stopped: boolean;\n tokenX: Address;\n tokenY: Address;\n symbolX: string;\n symbolY: string;\n isTopPool: boolean;\n moePerDay: number;\n rangeTvlUsd: number;\n aprPercent: number;\n rewardedBins: number;\n}\n\n// ============================================================\n// Helpers\n// ============================================================\n\n/** Decode address using a generic address ABI */\nconst _addressAbi = parseAbi([\"function f() external view returns (address)\"]);\nfunction decodeAddressResult(data: Hex | null): Address | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _addressAbi, functionName: \"f\", data }) as Address;\n } catch {\n return null;\n }\n}\n\n/** Decode uint256 from multicall returnData */\nconst _uint256Abi = parseAbi([\"function f() external view returns (uint256)\"]);\nfunction decodeUint256Result(data: Hex | null): bigint | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _uint256Abi, functionName: \"f\", data }) as bigint;\n } catch {\n return null;\n }\n}\n\n/** Decode bool from multicall returnData */\nconst _boolAbi = parseAbi([\"function f() external view returns (bool)\"]);\nfunction decodeBoolResult(data: Hex | null): boolean | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _boolAbi, functionName: \"f\", data }) as boolean;\n } catch {\n return null;\n }\n}\n\n/** Decode string from multicall returnData */\nfunction decodeStringResult(data: Hex | null): string {\n if (!data) return \"?\";\n try {\n return decodeFunctionResult({ abi: erc20Abi, functionName: \"symbol\", data }) as string;\n } catch {\n return \"?\";\n }\n}\n\n/** Decode getRewardedRange (returns (uint256, uint256)) */\nconst _rangeAbi = parseAbi([\"function f() external view returns (uint256 minBinId, uint256 maxBinId)\"]);\nfunction decodeRangeResult(data: Hex | null): [bigint, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _rangeAbi, functionName: \"f\", data }) as [bigint, bigint];\n } catch {\n return null;\n }\n}\n\n/** Decode getBin result (uint128, uint128) */\nconst _binAbi = parseAbi([\"function f() external view returns (uint128 reserveX, uint128 reserveY)\"]);\nfunction decodeBinResult(data: Hex | null): [bigint, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _binAbi, functionName: \"f\", data }) as [bigint, bigint];\n } catch {\n return null;\n }\n}\n\n/** Decode uint256[] (e.g. getTopPoolIds) */\nconst _uint256ArrayAbi = parseAbi([\"function f() external view returns (uint256[] memory)\"]);\nfunction decodeUint256ArrayResult(data: Hex | null): bigint[] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _uint256ArrayAbi, functionName: \"f\", data }) as bigint[];\n } catch {\n return null;\n }\n}\n\n/** Extract rewarder address from LB hooks params (lower 20 bytes of bytes32) */\nfunction extractRewarderAddress(hooksParams: Hex): Address | null {\n // hooksParams is a 32-byte hex string (0x + 64 hex chars)\n if (!hooksParams || hooksParams === \"0x0000000000000000000000000000000000000000000000000000000000000000\") {\n return null;\n }\n // Lower 20 bytes = last 40 hex characters of the 64-char data portion\n const hex = hooksParams.slice(2); // strip 0x\n if (hex.length < 64) return null;\n const addrHex = hex.slice(24, 64); // bytes 12..31 = lower 20 bytes\n if (addrHex === \"0000000000000000000000000000000000000000\") return null;\n return `0x${addrHex}` as Address;\n}\n\n/** Build uniform distribution arrays for LB add liquidity.\n *\n * Distribution rules:\n * - Bins strictly below active: only tokenY (distributionX[i]=0, distributionY[i]=share)\n * - Bin at active: tokenX and tokenY split 50/50\n * - Bins strictly above active: only tokenX (distributionX[i]=share, distributionY[i]=0)\n *\n * distributionX / distributionY sum to 1e18 respectively.\n */\nfunction buildUniformDistribution(\n deltaIds: number[],\n): { distributionX: bigint[]; distributionY: bigint[] } {\n const PRECISION = 10n ** 18n;\n const n = deltaIds.length;\n\n // Count how many bins receive X and Y\n const xBins = deltaIds.filter((d) => d >= 0).length; // active + above\n const yBins = deltaIds.filter((d) => d <= 0).length; // active + below\n\n const distributionX: bigint[] = [];\n const distributionY: bigint[] = [];\n\n for (const delta of deltaIds) {\n // X share: bins at or above active\n const xShare = delta >= 0 && xBins > 0 ? PRECISION / BigInt(xBins) : 0n;\n // Y share: bins at or below active\n const yShare = delta <= 0 && yBins > 0 ? PRECISION / BigInt(yBins) : 0n;\n distributionX.push(xShare);\n distributionY.push(yShare);\n }\n\n // Correct rounding on the active bin (index where delta === 0)\n // The sum must be exactly PRECISION; adjust the first qualifying element\n const xSum = distributionX.reduce((a, b) => a + b, 0n);\n const ySum = distributionY.reduce((a, b) => a + b, 0n);\n if (xSum > 0n && xSum !== PRECISION) {\n const firstX = distributionX.findIndex((v) => v > 0n);\n if (firstX !== -1) distributionX[firstX] += PRECISION - xSum;\n }\n if (ySum > 0n && ySum !== PRECISION) {\n const firstY = distributionY.findIndex((v) => v > 0n);\n if (firstY !== -1) distributionY[firstY] += PRECISION - ySum;\n }\n\n return { distributionX, distributionY };\n}\n\n// ============================================================\n// Adapter\n// ============================================================\n\nexport class MerchantMoeLBAdapter {\n private readonly protocolName: string;\n private readonly lbRouter: Address;\n private readonly lbFactory: Address;\n private readonly lbQuoter?: Address;\n private readonly rpcUrl?: string;\n /** WMNT address (lb_mid_wmnt in config) used for MOE price routing */\n private readonly wmnt?: Address;\n /** USDT address (lb_mid_usdt in config) used for MNT/USD price routing */\n private readonly usdt?: Address;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n const lbRouter = entry.contracts?.[\"lb_router\"];\n if (!lbRouter) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'lb_router' contract address\");\n }\n const lbFactory = entry.contracts?.[\"lb_factory\"];\n if (!lbFactory) {\n throw new DefiError(\"CONTRACT_ERROR\", \"Missing 'lb_factory' contract address\");\n }\n this.lbRouter = lbRouter;\n this.lbFactory = lbFactory;\n this.lbQuoter = entry.contracts?.[\"lb_quoter\"];\n this.wmnt = entry.contracts?.[\"lb_mid_wmnt\"];\n this.usdt = entry.contracts?.[\"lb_mid_usdt\"];\n this.rpcUrl = rpcUrl;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n private requireRpc(): string {\n if (!this.rpcUrl) {\n throw DefiError.rpcError(`[${this.protocolName}] RPC URL required`);\n }\n return this.rpcUrl;\n }\n\n /**\n * Build an addLiquidity transaction for a Liquidity Book pair.\n * Distributes tokenX/tokenY uniformly across active bin ± numBins.\n */\n async buildAddLiquidity(params: LBAddLiquidityParams): Promise<DeFiTx> {\n const numBins = params.numBins ?? 5;\n const deadline = params.deadline ?? BigInt(\"18446744073709551615\");\n\n // Resolve active bin id\n let activeIdDesired = params.activeIdDesired;\n if (activeIdDesired === undefined) {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n const activeId = await client.readContract({\n address: params.pool,\n abi: lbPairAbi,\n functionName: \"getActiveId\",\n });\n activeIdDesired = activeId as number;\n }\n\n // Build delta IDs: [-numBins, ..., -1, 0, 1, ..., numBins]\n const deltaIds: number[] = [];\n for (let d = -numBins; d <= numBins; d++) {\n deltaIds.push(d);\n }\n\n const { distributionX, distributionY } = buildUniformDistribution(deltaIds);\n\n const data = encodeFunctionData({\n abi: lbRouterAbi,\n functionName: \"addLiquidity\",\n args: [\n {\n tokenX: params.tokenX,\n tokenY: params.tokenY,\n binStep: BigInt(params.binStep),\n amountX: params.amountX,\n amountY: params.amountY,\n amountXMin: 0n,\n amountYMin: 0n,\n activeIdDesired: BigInt(activeIdDesired),\n idSlippage: BigInt(numBins + 2),\n deltaIds: deltaIds.map(BigInt),\n distributionX,\n distributionY,\n to: params.recipient,\n refundTo: params.recipient,\n deadline,\n },\n ],\n });\n\n return {\n description: `[${this.protocolName}] LB addLiquidity ${params.amountX} tokenX + ${params.amountY} tokenY across ${deltaIds.length} bins`,\n to: this.lbRouter,\n data,\n value: 0n,\n gas_estimate: 800_000,\n approvals: [\n { token: params.tokenX, spender: this.lbRouter, amount: params.amountX },\n { token: params.tokenY, spender: this.lbRouter, amount: params.amountY },\n ],\n };\n }\n\n /**\n * Build a removeLiquidity transaction for specific LB bins.\n */\n async buildRemoveLiquidity(params: LBRemoveLiquidityParams): Promise<DeFiTx> {\n const deadline = params.deadline ?? BigInt(\"18446744073709551615\");\n\n const data = encodeFunctionData({\n abi: lbRouterAbi,\n functionName: \"removeLiquidity\",\n args: [\n params.tokenX,\n params.tokenY,\n params.binStep,\n params.amountXMin ?? 0n,\n params.amountYMin ?? 0n,\n params.binIds.map(BigInt),\n params.amounts,\n params.recipient,\n deadline,\n ],\n });\n\n return {\n description: `[${this.protocolName}] LB removeLiquidity from ${params.binIds.length} bins`,\n to: this.lbRouter,\n data,\n value: 0n,\n gas_estimate: 600_000,\n };\n }\n\n /**\n * Auto-detect bin IDs for a pool from the rewarder's rewarded range.\n * Falls back to active bin ± 50 scan if no rewarder exists.\n */\n private async autoDetectBins(pool: Address): Promise<number[]> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const hooksParams = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"getLBHooksParameters\",\n }) as Hex;\n\n const rewarder = extractRewarderAddress(hooksParams);\n if (rewarder) {\n const range = await client.readContract({\n address: rewarder,\n abi: lbRewarderAbi,\n functionName: \"getRewardedRange\",\n }) as [bigint, bigint];\n const min = Number(range[0]);\n const max = Number(range[1]);\n const ids: number[] = [];\n for (let b = min; b <= max; b++) ids.push(b);\n return ids;\n }\n\n // No rewarder: scan active bin ± 50\n const activeId = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"getActiveId\",\n }) as number;\n const ids: number[] = [];\n for (let b = activeId - 50; b <= activeId + 50; b++) ids.push(b);\n return ids;\n }\n\n /**\n * Get pending MOE rewards for a user across specified bin IDs.\n * If binIds is omitted, auto-detects from the rewarder's rewarded range.\n * Reads the rewarder address from the pool's hooks parameters.\n */\n async getPendingRewards(user: Address, pool: Address, binIds?: number[]): Promise<RewardInfo[]> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const hooksParams = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"getLBHooksParameters\",\n }) as Hex;\n\n const rewarder = extractRewarderAddress(hooksParams);\n if (!rewarder) {\n return [];\n }\n\n // Auto-detect bins from rewarder range if not provided\n let resolvedBinIds = binIds;\n if (!resolvedBinIds || resolvedBinIds.length === 0) {\n const range = await client.readContract({\n address: rewarder,\n abi: lbRewarderAbi,\n functionName: \"getRewardedRange\",\n }) as [bigint, bigint];\n const min = Number(range[0]);\n const max = Number(range[1]);\n resolvedBinIds = [];\n for (let b = min; b <= max; b++) resolvedBinIds.push(b);\n }\n\n const [pending, rewardToken] = await Promise.all([\n client.readContract({\n address: rewarder,\n abi: lbRewarderAbi,\n functionName: \"getPendingRewards\",\n args: [user, resolvedBinIds.map(BigInt)],\n }),\n client.readContract({\n address: rewarder,\n abi: lbRewarderAbi,\n functionName: \"getRewardToken\",\n }),\n ]);\n\n return [\n {\n token: rewardToken as Address,\n symbol: \"MOE\",\n amount: pending as bigint,\n },\n ];\n }\n\n /**\n * Build a claim rewards transaction for specific LB bins.\n * If binIds is omitted, auto-detects from the rewarder's rewarded range.\n */\n async buildClaimRewards(user: Address, pool: Address, binIds?: number[]): Promise<DeFiTx> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const hooksParams = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"getLBHooksParameters\",\n }) as Hex;\n\n const rewarder = extractRewarderAddress(hooksParams);\n if (!rewarder) {\n throw new DefiError(\"CONTRACT_ERROR\", `[${this.protocolName}] Pool ${pool} has no active rewarder`);\n }\n\n // Auto-detect bins from rewarder range if not provided\n let resolvedBinIds = binIds;\n if (!resolvedBinIds || resolvedBinIds.length === 0) {\n const range = await client.readContract({\n address: rewarder,\n abi: lbRewarderAbi,\n functionName: \"getRewardedRange\",\n }) as [bigint, bigint];\n const min = Number(range[0]);\n const max = Number(range[1]);\n resolvedBinIds = [];\n for (let b = min; b <= max; b++) resolvedBinIds.push(b);\n }\n\n const data = encodeFunctionData({\n abi: lbRewarderAbi,\n functionName: \"claim\",\n args: [user, resolvedBinIds.map(BigInt)],\n });\n\n return {\n description: `[${this.protocolName}] LB claim rewards for ${resolvedBinIds.length} bins`,\n to: rewarder,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n /**\n * Discover all active rewarded LB pools by iterating the factory.\n * Uses 7 multicall batches to minimise RPC round-trips and avoid 429s.\n *\n * Batch 1: getNumberOfLBPairs(), then getLBPairAtIndex(i) for all i\n * Batch 2: getLBHooksParameters() for all pairs → extract rewarder addresses\n * Batch 3: isStopped/getRewardedRange/getRewardToken/getPid/getMasterChef for each rewarder\n * Batch 4: getTokenX/getTokenY for each rewarded pair, then symbol() for unique tokens\n * Batch 5: Bootstrap MasterChef→VeMoe, then getMoePerSecond/getTreasuryShare/getStaticShare/getTotalWeight/getTopPoolIds\n * Batch 6: VeMoe.getWeight(pid) for each rewarded pool\n * Batch 7: Pool.getBin(binId) for all bins in rewarded range of each pool\n * Price: LB Quoter findBestPathFromAmountIn for MOE/WMNT and WMNT/USDT prices\n */\n async discoverRewardedPools(): Promise<RewardedPool[]> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n // --- Batch 1a: get pair count ---\n const pairCount = await client.readContract({\n address: this.lbFactory,\n abi: lbFactoryAbi,\n functionName: \"getNumberOfLBPairs\",\n }) as bigint;\n\n const count = Number(pairCount);\n if (count === 0) return [];\n\n // --- Batch 1b: getLBPairAtIndex for all indices ---\n const batch1Calls: Array<[Address, Hex]> = Array.from({ length: count }, (_, i) => [\n this.lbFactory,\n encodeFunctionData({ abi: lbFactoryAbi, functionName: \"getLBPairAtIndex\", args: [BigInt(i)] }),\n ]);\n const batch1Results = await multicallRead(rpcUrl, batch1Calls);\n\n const pairAddresses: Address[] = batch1Results\n .map((r) => decodeAddressResult(r))\n .filter((a): a is Address => a !== null);\n\n if (pairAddresses.length === 0) return [];\n\n // --- Batch 2: getLBHooksParameters for all pairs ---\n const batch2Calls: Array<[Address, Hex]> = pairAddresses.map((pair) => [\n pair,\n encodeFunctionData({ abi: lbPairAbi, functionName: \"getLBHooksParameters\" }),\n ]);\n const batch2Results = await multicallRead(rpcUrl, batch2Calls);\n\n // Filter pairs with a rewarder\n const rewardedPairs: Array<{ pool: Address; rewarder: Address }> = [];\n for (let i = 0; i < pairAddresses.length; i++) {\n const raw = batch2Results[i];\n if (!raw) continue;\n // getLBHooksParameters returns bytes32 — decode as raw bytes32 value\n let hooksBytes: Hex;\n try {\n const _bytes32Abi = parseAbi([\"function f() external view returns (bytes32)\"]);\n hooksBytes = decodeFunctionResult({ abi: _bytes32Abi, functionName: \"f\", data: raw }) as Hex;\n } catch {\n continue;\n }\n const rewarder = extractRewarderAddress(hooksBytes);\n if (rewarder) {\n rewardedPairs.push({ pool: pairAddresses[i]!, rewarder });\n }\n }\n\n if (rewardedPairs.length === 0) return [];\n\n // --- Batch 3: rewarder details (5 calls per rewarder, interleaved) ---\n const batch3Calls: Array<[Address, Hex]> = [];\n for (const { rewarder } of rewardedPairs) {\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"isStopped\" })]);\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"getRewardedRange\" })]);\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"getRewardToken\" })]);\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"getPid\" })]);\n batch3Calls.push([rewarder, encodeFunctionData({ abi: lbRewarderAbi, functionName: \"getMasterChef\" })]);\n }\n const batch3Results = await multicallRead(rpcUrl, batch3Calls);\n\n // --- Batch 4a: getTokenX / getTokenY for rewarded pairs ---\n const batch4aCalls: Array<[Address, Hex]> = [];\n for (const { pool } of rewardedPairs) {\n batch4aCalls.push([pool, encodeFunctionData({ abi: lbPairAbi, functionName: \"getTokenX\" })]);\n batch4aCalls.push([pool, encodeFunctionData({ abi: lbPairAbi, functionName: \"getTokenY\" })]);\n }\n const batch4aResults = await multicallRead(rpcUrl, batch4aCalls);\n\n // Collect unique token addresses for symbol lookup\n const tokenXAddresses: Array<Address | null> = [];\n const tokenYAddresses: Array<Address | null> = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n tokenXAddresses.push(decodeAddressResult(batch4aResults[i * 2] ?? null));\n tokenYAddresses.push(decodeAddressResult(batch4aResults[i * 2 + 1] ?? null));\n }\n\n const uniqueTokens = Array.from(\n new Set([...tokenXAddresses, ...tokenYAddresses].filter((a): a is Address => a !== null)),\n );\n\n // --- Batch 4b: symbol() for each unique token ---\n const batch4bCalls: Array<[Address, Hex]> = uniqueTokens.map((token) => [\n token,\n encodeFunctionData({ abi: erc20Abi, functionName: \"symbol\" }),\n ]);\n const batch4bResults = await multicallRead(rpcUrl, batch4bCalls);\n const symbolMap = new Map<Address, string>();\n for (let i = 0; i < uniqueTokens.length; i++) {\n symbolMap.set(uniqueTokens[i]!, decodeStringResult(batch4bResults[i] ?? null));\n }\n\n // Extract per-pool data from batch 3 (5 calls per rewarder)\n const STRIDE3 = 5;\n const poolData: Array<{\n stopped: boolean;\n range: [bigint, bigint] | null;\n rewardToken: Address | null;\n pid: number;\n masterChef: Address | null;\n }> = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n const base = i * STRIDE3;\n poolData.push({\n stopped: decodeBoolResult(batch3Results[base] ?? null) ?? false,\n range: decodeRangeResult(batch3Results[base + 1] ?? null),\n rewardToken: decodeAddressResult(batch3Results[base + 2] ?? null),\n pid: Number(decodeUint256Result(batch3Results[base + 3] ?? null) ?? 0n),\n masterChef: decodeAddressResult(batch3Results[base + 4] ?? null),\n });\n }\n\n // --- Batch 5: Bootstrap MasterChef/VeMoe, then fetch global emission params ---\n // Find the first valid MasterChef address from the rewarders\n const masterChefAddr = poolData.map((d) => d.masterChef).find((a): a is Address => a !== null) ?? null;\n\n let moePerDay = 0;\n let topPoolIds = new Set<number>();\n let totalWeightRaw = 0n;\n let veMoeAddr: Address | null = null;\n\n if (masterChefAddr) {\n // First get VeMoe address from MasterChef\n veMoeAddr = await client.readContract({\n address: masterChefAddr,\n abi: masterChefAbi,\n functionName: \"getVeMoe\",\n }) as Address;\n\n // Batch 5: MasterChef global data + VeMoe global data\n const batch5Calls: Array<[Address, Hex]> = [\n [masterChefAddr, encodeFunctionData({ abi: masterChefAbi, functionName: \"getMoePerSecond\" })],\n [masterChefAddr, encodeFunctionData({ abi: masterChefAbi, functionName: \"getTreasuryShare\" })],\n [masterChefAddr, encodeFunctionData({ abi: masterChefAbi, functionName: \"getStaticShare\" })],\n [veMoeAddr, encodeFunctionData({ abi: veMoeAbi, functionName: \"getTotalWeight\" })],\n [veMoeAddr, encodeFunctionData({ abi: veMoeAbi, functionName: \"getTopPoolIds\" })],\n ];\n const batch5Results = await multicallRead(rpcUrl, batch5Calls);\n\n const moePerSecRaw = decodeUint256Result(batch5Results[0] ?? null) ?? 0n;\n const treasuryShareRaw = decodeUint256Result(batch5Results[1] ?? null) ?? 0n;\n const staticShareRaw = decodeUint256Result(batch5Results[2] ?? null) ?? 0n;\n totalWeightRaw = decodeUint256Result(batch5Results[3] ?? null) ?? 0n;\n const topPoolIdsRaw = decodeUint256ArrayResult(batch5Results[4] ?? null) ?? [];\n\n topPoolIds = new Set(topPoolIdsRaw.map(Number));\n\n // Shares are fixed-point 1e18 fractions\n const PRECISION = 10n ** 18n;\n // net_moe_per_sec = total × (1 - treasury) × (1 - static)\n // expressed in bigint arithmetic to avoid float truncation\n const netPerSec =\n (moePerSecRaw * (PRECISION - treasuryShareRaw) / PRECISION) *\n (PRECISION - staticShareRaw) / PRECISION;\n\n // Convert to human-readable MOE/day (MOE has 18 decimals)\n // This is the total net MOE/day that flows to dynamic (VeMoe) pools\n moePerDay = Number(netPerSec * 86400n) / 1e18;\n }\n\n // --- Batch 6: VeMoe.getWeight(pid) for each rewarded pool ---\n const weightByPid = new Map<number, bigint>();\n if (veMoeAddr && rewardedPairs.length > 0) {\n const batch6Calls: Array<[Address, Hex]> = poolData.map((d) => [\n veMoeAddr!,\n encodeFunctionData({ abi: veMoeAbi, functionName: \"getWeight\", args: [BigInt(d.pid)] }),\n ]);\n const batch6Results = await multicallRead(rpcUrl, batch6Calls);\n for (let i = 0; i < poolData.length; i++) {\n weightByPid.set(poolData[i]!.pid, decodeUint256Result(batch6Results[i] ?? null) ?? 0n);\n }\n }\n\n // --- Price: MOE and WMNT prices in USD via LB Quoter ---\n // Route: MOE → WMNT → USDT (MOE has 18 decimals, WMNT has 18, USDT has 6)\n let moePriceUsd = 0;\n let wmntPriceUsd = 0;\n const MOE_ADDR = \"0x4515A45337F461A11Ff0FE8aBF3c606AE5dC00c9\" as Address;\n if (this.lbQuoter && this.wmnt && this.usdt) {\n try {\n const [moeWmntQuote, wmntUsdtQuote] = await Promise.all([\n client.readContract({\n address: this.lbQuoter,\n abi: lbQuoterAbi,\n functionName: \"findBestPathFromAmountIn\",\n args: [[MOE_ADDR, this.wmnt], 10n ** 18n],\n }),\n client.readContract({\n address: this.lbQuoter,\n abi: lbQuoterAbi,\n functionName: \"findBestPathFromAmountIn\",\n args: [[this.wmnt, this.usdt], 10n ** 18n],\n }),\n ]);\n // amounts[last] is the output amount (USDT has 6 decimals, WMNT has 18)\n const moeInWmnt = Number((moeWmntQuote as unknown as { amounts: bigint[] }).amounts.at(-1) ?? 0n) / 1e18;\n wmntPriceUsd = Number((wmntUsdtQuote as unknown as { amounts: bigint[] }).amounts.at(-1) ?? 0n) / 1e6;\n moePriceUsd = moeInWmnt * wmntPriceUsd;\n } catch {\n // Price fetch failed — APR will be 0\n }\n }\n\n // --- Batch 7: Pool.getBin(binId) for all bins in rewarded range ---\n // Build flat list of (poolIndex, binId) for all rewarded bins\n type BinRequest = { poolIdx: number; binId: number };\n const binRequests: BinRequest[] = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n const range = poolData[i]!.range;\n if (!range) continue;\n const minBin = Number(range[0]);\n const maxBin = Number(range[1]);\n for (let b = minBin; b <= maxBin; b++) {\n binRequests.push({ poolIdx: i, binId: b });\n }\n }\n\n // Bin reserves keyed by pool index\n // reserveX[poolIdx][binId] and reserveY[poolIdx][binId]\n const binReservesX = new Map<number, Map<number, bigint>>();\n const binReservesY = new Map<number, Map<number, bigint>>();\n\n if (binRequests.length > 0) {\n const batch7Calls: Array<[Address, Hex]> = binRequests.map(({ poolIdx, binId }) => [\n rewardedPairs[poolIdx]!.pool,\n encodeFunctionData({ abi: lbPairBinAbi, functionName: \"getBin\", args: [binId] }),\n ]);\n const batch7Results = await multicallRead(rpcUrl, batch7Calls);\n\n for (let j = 0; j < binRequests.length; j++) {\n const { poolIdx, binId } = binRequests[j]!;\n const decoded = decodeBinResult(batch7Results[j] ?? null);\n if (!decoded) continue;\n if (!binReservesX.has(poolIdx)) {\n binReservesX.set(poolIdx, new Map());\n binReservesY.set(poolIdx, new Map());\n }\n binReservesX.get(poolIdx)!.set(binId, decoded[0]);\n binReservesY.get(poolIdx)!.set(binId, decoded[1]);\n }\n }\n\n // --- Assemble results ---\n // Token price classification by symbol (USD)\n // Stablecoins → $1; WMNT/MNT → wmntPriceUsd; MOE → moePriceUsd; unknown → 0\n const stableSymbols = new Set([\"USDT\", \"USDC\", \"MUSD\", \"AUSD\", \"USDY\", \"FDUSD\"]);\n const mntSymbols = new Set([\"WMNT\", \"MNT\"]);\n const moeSymbols = new Set([\"MOE\"]);\n // USDT/USDC on Mantle have 6 decimals; other stable tokens have 18\n const sixDecimalStables = new Set([\"USDT\", \"USDC\", \"FDUSD\"]);\n\n const getTokenPriceUsd = (sym: string): number => {\n if (stableSymbols.has(sym)) return 1;\n if (mntSymbols.has(sym)) return wmntPriceUsd;\n if (moeSymbols.has(sym)) return moePriceUsd;\n return 0;\n };\n\n const getTokenDecimals = (sym: string): number => {\n return sixDecimalStables.has(sym) ? 6 : 18;\n };\n\n const results: RewardedPool[] = [];\n for (let i = 0; i < rewardedPairs.length; i++) {\n const { pool, rewarder } = rewardedPairs[i]!;\n const data = poolData[i]!;\n\n const tokenX = tokenXAddresses[i] ?? (\"0x0000000000000000000000000000000000000000\" as Address);\n const tokenY = tokenYAddresses[i] ?? (\"0x0000000000000000000000000000000000000000\" as Address);\n const symX = symbolMap.get(tokenX) ?? \"?\";\n const symY = symbolMap.get(tokenY) ?? \"?\";\n\n const isTopPool = topPoolIds.has(data.pid);\n const weight = weightByPid.get(data.pid) ?? 0n;\n\n // Pool's MOE/day = total_net_moe_per_day × weight / total_weight\n // Only top pools (in VeMoe top list) receive dynamic emissions\n let poolMoePerDay = 0;\n if (isTopPool && totalWeightRaw > 0n && weight > 0n) {\n poolMoePerDay = moePerDay * (Number(weight) / Number(totalWeightRaw));\n }\n\n // Range TVL: sum bin reserves × token prices\n const rxMap = binReservesX.get(i);\n const ryMap = binReservesY.get(i);\n const range = data.range;\n let rangeTvlUsd = 0;\n let rewardedBins = 0;\n\n if (range) {\n const minBin = Number(range[0]);\n const maxBin = Number(range[1]);\n rewardedBins = maxBin - minBin + 1;\n if (rxMap && ryMap) {\n const priceX = getTokenPriceUsd(symX);\n const priceY = getTokenPriceUsd(symY);\n const decX = getTokenDecimals(symX);\n const decY = getTokenDecimals(symY);\n for (let b = minBin; b <= maxBin; b++) {\n const rx = rxMap.get(b) ?? 0n;\n const ry = ryMap.get(b) ?? 0n;\n rangeTvlUsd += (Number(rx) / 10 ** decX) * priceX;\n rangeTvlUsd += (Number(ry) / 10 ** decY) * priceY;\n }\n }\n }\n\n // APR = (poolMoePerDay * moePriceUsd * 365) / rangeTvlUsd * 100\n const aprPercent =\n rangeTvlUsd > 0 && moePriceUsd > 0\n ? (poolMoePerDay * moePriceUsd * 365 / rangeTvlUsd) * 100\n : 0;\n\n results.push({\n pool,\n rewarder,\n rewardToken: data.rewardToken ?? (\"0x0000000000000000000000000000000000000000\" as Address),\n minBinId: range ? Number(range[0]) : 0,\n maxBinId: range ? Number(range[1]) : 0,\n pid: data.pid,\n stopped: data.stopped,\n tokenX,\n tokenY,\n symbolX: symX,\n symbolY: symY,\n isTopPool,\n moePerDay: poolMoePerDay,\n rangeTvlUsd,\n aprPercent,\n rewardedBins,\n });\n }\n\n return results;\n }\n\n /**\n * Get a user's LB positions (bin balances) across a range of bin IDs.\n * If binIds is omitted, auto-detects from the rewarder's rewarded range (or active ± 50).\n */\n async getUserPositions(user: Address, pool: Address, binIds?: number[]): Promise<LBPosition[]> {\n const rpcUrl = this.requireRpc();\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const resolvedBinIds = (binIds && binIds.length > 0) ? binIds : await this.autoDetectBins(pool);\n\n const accounts = resolvedBinIds.map(() => user);\n const ids = resolvedBinIds.map(BigInt);\n\n const balances = await client.readContract({\n address: pool,\n abi: lbPairAbi,\n functionName: \"balanceOfBatch\",\n args: [accounts, ids],\n }) as bigint[];\n\n return resolvedBinIds\n .map((binId, i) => ({ binId, balance: balances[i] ?? 0n }))\n .filter((p) => p.balance > 0n);\n }\n}\n","import {\n decodeAbiParameters,\n encodeFunctionData,\n encodeAbiParameters,\n http,\n createPublicClient,\n keccak256,\n parseAbi,\n decodeFunctionResult,\n zeroAddress,\n} from \"viem\";\nimport type { Address, Hex } from \"viem\";\n\nimport { DefiError, multicallRead } from \"@hypurrquant/defi-core\";\nimport type { DeFiTx } from \"@hypurrquant/defi-core\";\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\n/** KITTEN reward token on Hyper EVM */\nconst KITTEN_TOKEN: Address = \"0x618275f8efe54c2afa87bfb9f210a52f0ff89364\";\n\n/** WHYPE bonus reward token */\nconst WHYPE_TOKEN: Address = \"0x5555555555555555555555555555555555555555\";\n\n/** Max nonce to scan when discovering incentive keys */\nconst MAX_NONCE_SCAN = 60;\n\n/** HyperEVM well-known token addresses for pool discovery (matches solidly_gauge.ts) */\nconst HYPEREVM_TOKENS: Address[] = [\n \"0x5555555555555555555555555555555555555555\", // WHYPE\n \"0xb88339CB7199b77E23DB6E890353E22632Ba630f\", // USDC\n \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", // USDT0\n \"0xBe6727B535545C67d5cAa73dEa54865B92CF7907\", // UETH\n \"0x9FDBdA0A5e284c32744D2f17Ee5c74B284993463\", // UBTC\n \"0x111111a1a0667d36bD57c0A9f569b98057111111\", // USDH\n \"0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34\", // USDe\n \"0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2\", // sUSDe\n \"0xf4D9235269a96aaDaFc9aDAe454a0618eBE37949\", // XAUt0\n \"0xfD739d4e423301CE9385c1fb8850539D657C296D\", // kHYPE\n KITTEN_TOKEN, // KITTEN\n];\n\n// ─── ABIs ─────────────────────────────────────────────────────────────────────\n\nconst farmingCenterAbi = parseAbi([\n \"function multicall(bytes[] calldata data) external payable returns (bytes[] memory results)\",\n \"function enterFarming((address rewardToken, address bonusRewardToken, address pool, uint256 nonce) key, uint256 tokenId) external\",\n \"function exitFarming((address rewardToken, address bonusRewardToken, address pool, uint256 nonce) key, uint256 tokenId) external\",\n \"function collectRewards((address rewardToken, address bonusRewardToken, address pool, uint256 nonce) key, uint256 tokenId) external\",\n \"function claimReward(address rewardToken, address to, uint128 amountRequested) external returns (uint256 reward)\",\n]);\n\nconst positionManagerAbi = parseAbi([\n \"function approveForFarming(uint256 tokenId, bool approve, address farmingAddress) external\",\n \"function farmingApprovals(uint256 tokenId) external view returns (address)\",\n]);\n\nconst eternalFarmingAbi = parseAbi([\n \"function incentives(bytes32 incentiveId) external view returns (uint256 totalReward, uint256 bonusReward, address virtualPoolAddress, uint24 minimalPositionWidth, bool deactivated, address pluginAddress)\",\n \"function getRewardInfo((address rewardToken, address bonusRewardToken, address pool, uint256 nonce) key, uint256 tokenId) external view returns (uint256 reward, uint256 bonusReward)\",\n]);\n\nconst algebraFactoryAbi = parseAbi([\n \"function poolByPair(address tokenA, address tokenB) external view returns (address pool)\",\n]);\n\n// Decode helpers\nconst _addressDecodeAbi = parseAbi([\"function f() external view returns (address)\"]);\nfunction decodeAddress(data: Hex | null): Address | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({ abi: _addressDecodeAbi, functionName: \"f\", data }) as Address;\n } catch {\n return null;\n }\n}\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface IncentiveKey {\n rewardToken: Address;\n bonusRewardToken: Address;\n pool: Address;\n nonce: bigint;\n}\n\nexport interface FarmingPool {\n pool: Address;\n key: IncentiveKey;\n totalReward: bigint;\n bonusReward: bigint;\n active: boolean;\n}\n\n// ─── Helper ───────────────────────────────────────────────────────────────────\n\n/** Compute the incentiveId hash for an IncentiveKey (keccak256(abi.encode(key))) */\nfunction incentiveId(key: IncentiveKey): Hex {\n return keccak256(\n encodeAbiParameters(\n [\n { name: \"rewardToken\", type: \"address\" },\n { name: \"bonusRewardToken\", type: \"address\" },\n { name: \"pool\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n ],\n [key.rewardToken, key.bonusRewardToken, key.pool, key.nonce],\n ),\n );\n}\n\n/** Build the enterFarming calldata (without selector overhead — for use inside multicall) */\nfunction encodeEnterFarming(key: IncentiveKey, tokenId: bigint): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"enterFarming\",\n args: [key, tokenId],\n });\n}\n\n/** Build the exitFarming calldata */\nfunction encodeExitFarming(key: IncentiveKey, tokenId: bigint): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"exitFarming\",\n args: [key, tokenId],\n });\n}\n\n/** Build the collectRewards calldata */\nfunction encodeCollectRewards(key: IncentiveKey, tokenId: bigint): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"collectRewards\",\n args: [key, tokenId],\n });\n}\n\n/** Build the claimReward calldata */\nfunction encodeClaimReward(rewardToken: Address, to: Address): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"claimReward\",\n args: [rewardToken, to, 2n ** 128n - 1n], // max uint128\n });\n}\n\n/** Encode the top-level multicall wrapping an array of calldatas */\nfunction encodeMulticall(calls: Hex[]): Hex {\n return encodeFunctionData({\n abi: farmingCenterAbi,\n functionName: \"multicall\",\n args: [calls],\n });\n}\n\n// ─── Runtime cache ───────────────────────────────────────────────────────────\n\n/** Runtime cache: pool (lowercased) → discovered nonce. Avoids repeated scans within a session. */\nconst nonceCache = new Map<string, bigint>();\n\n// ─── Adapter ──────────────────────────────────────────────────────────────────\n\nexport class KittenSwapFarmingAdapter {\n private readonly protocolName: string;\n private readonly farmingCenter: Address;\n private readonly eternalFarming: Address;\n private readonly positionManager: Address;\n private readonly rpcUrl: string;\n private readonly factory: Address | undefined;\n\n constructor(\n protocolName: string,\n farmingCenter: Address,\n eternalFarming: Address,\n positionManager: Address,\n rpcUrl: string,\n factory?: Address,\n ) {\n this.protocolName = protocolName;\n this.farmingCenter = farmingCenter;\n this.eternalFarming = eternalFarming;\n this.positionManager = positionManager;\n this.rpcUrl = rpcUrl;\n this.factory = factory;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n /**\n * Discover the active IncentiveKey for a given pool.\n * 1. Check runtime cache\n * 2. Batch-query nonces 0-60 via single multicall (61 calls)\n * 3. Return first non-zero incentive (totalReward > 0 and not deactivated)\n */\n async discoverIncentiveKey(pool: Address): Promise<IncentiveKey | null> {\n const poolLc = pool.toLowerCase();\n\n // Fast path: runtime cache\n if (nonceCache.has(poolLc)) {\n return {\n rewardToken: KITTEN_TOKEN,\n bonusRewardToken: WHYPE_TOKEN,\n pool,\n nonce: nonceCache.get(poolLc)!,\n };\n }\n\n // Build 61 multicall calls for nonces 0-60\n const calls: Array<[Address, Hex]> = [];\n const nonces: bigint[] = [];\n for (let n = 0; n <= MAX_NONCE_SCAN; n++) {\n const nonce = BigInt(n);\n nonces.push(nonce);\n const key: IncentiveKey = {\n rewardToken: KITTEN_TOKEN,\n bonusRewardToken: WHYPE_TOKEN,\n pool,\n nonce,\n };\n calls.push([\n this.eternalFarming,\n encodeFunctionData({\n abi: eternalFarmingAbi,\n functionName: \"incentives\",\n args: [incentiveId(key)],\n }),\n ]);\n }\n\n const results = await multicallRead(this.rpcUrl, calls);\n\n for (let i = 0; i < results.length; i++) {\n const data = results[i];\n if (!data || data.length < 66) continue;\n\n try {\n const decoded = decodeAbiParameters(\n [\n { name: \"totalReward\", type: \"uint256\" },\n { name: \"bonusReward\", type: \"uint256\" },\n { name: \"virtualPoolAddress\", type: \"address\" },\n { name: \"minimalPositionWidth\", type: \"uint24\" },\n { name: \"deactivated\", type: \"bool\" },\n { name: \"pluginAddress\", type: \"address\" },\n ],\n data,\n );\n\n const totalReward = decoded[0] as bigint;\n const deactivated = decoded[4] as boolean;\n\n if (totalReward > 0n && !deactivated) {\n const nonce = nonces[i]!;\n nonceCache.set(poolLc, nonce);\n return {\n rewardToken: KITTEN_TOKEN,\n bonusRewardToken: WHYPE_TOKEN,\n pool,\n nonce,\n };\n }\n } catch {\n // skip decode errors\n }\n }\n\n return null;\n }\n\n /**\n * Build approveForFarming tx on the PositionManager.\n * Required before enterFarming if not already approved.\n */\n async buildApproveForFarming(tokenId: bigint): Promise<DeFiTx | null> {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const currentApproval = await client.readContract({\n address: this.positionManager,\n abi: positionManagerAbi,\n functionName: \"farmingApprovals\",\n args: [tokenId],\n }) as Address;\n\n if (currentApproval.toLowerCase() === this.farmingCenter.toLowerCase()) {\n return null; // Already approved\n }\n\n return {\n description: `[${this.protocolName}] Approve NFT #${tokenId} for farming`,\n to: this.positionManager,\n data: encodeFunctionData({\n abi: positionManagerAbi,\n functionName: \"approveForFarming\",\n args: [tokenId, true, this.farmingCenter],\n }),\n value: 0n,\n gas_estimate: 60_000,\n };\n }\n\n /**\n * Build enterFarming tx for a position NFT.\n * Checks farming approval first and returns pre_txs if needed.\n */\n async buildEnterFarming(\n tokenId: bigint,\n pool: Address,\n _owner: Address,\n ): Promise<DeFiTx> {\n const key = await this.discoverIncentiveKey(pool);\n if (!key) {\n throw new DefiError(\n \"CONTRACT_ERROR\",\n `[${this.protocolName}] No active incentive found for pool ${pool}`,\n );\n }\n\n const approveTx = await this.buildApproveForFarming(tokenId);\n\n return {\n description: `[${this.protocolName}] Enter farming for NFT #${tokenId} in pool ${pool}`,\n to: this.farmingCenter,\n data: encodeEnterFarming(key, tokenId),\n value: 0n,\n gas_estimate: 400_000,\n pre_txs: approveTx ? [approveTx] : undefined,\n };\n }\n\n /**\n * Build a tx that exits farming for a position NFT (unstakes).\n */\n async buildExitFarming(tokenId: bigint, pool: Address): Promise<DeFiTx> {\n const key = await this.discoverIncentiveKey(pool);\n if (!key) {\n throw new DefiError(\n \"CONTRACT_ERROR\",\n `[${this.protocolName}] No active incentive found for pool ${pool}`,\n );\n }\n\n return {\n description: `[${this.protocolName}] Exit farming for NFT #${tokenId} in pool ${pool}`,\n to: this.farmingCenter,\n data: encodeExitFarming(key, tokenId),\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n /**\n * Build a multicall tx that collects rewards for a staked position and claims them.\n * Pattern: multicall([collectRewards(key, tokenId), claimReward(KITTEN, owner, max), claimReward(WHYPE, owner, max)])\n */\n async buildCollectRewards(\n tokenId: bigint,\n pool: Address,\n owner: Address,\n ): Promise<DeFiTx> {\n const key = await this.discoverIncentiveKey(pool);\n if (!key) {\n throw new DefiError(\n \"CONTRACT_ERROR\",\n `[${this.protocolName}] No active incentive found for pool ${pool}`,\n );\n }\n\n const calls: Hex[] = [\n encodeCollectRewards(key, tokenId),\n encodeClaimReward(KITTEN_TOKEN, owner),\n encodeClaimReward(WHYPE_TOKEN, owner),\n ];\n\n return {\n description: `[${this.protocolName}] Collect + claim rewards for NFT #${tokenId} in pool ${pool}`,\n to: this.farmingCenter,\n data: encodeMulticall(calls),\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n /**\n * Build a tx that only claims already-accumulated rewards (no position change needed).\n */\n async buildClaimReward(owner: Address): Promise<DeFiTx> {\n const calls: Hex[] = [\n encodeClaimReward(KITTEN_TOKEN, owner),\n encodeClaimReward(WHYPE_TOKEN, owner),\n ];\n\n return {\n description: `[${this.protocolName}] Claim KITTEN + WHYPE farming rewards to ${owner}`,\n to: this.farmingCenter,\n data: encodeMulticall(calls),\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n /**\n * Query pending rewards for a staked position NFT.\n */\n async getPendingRewards(\n tokenId: bigint,\n pool: Address,\n ): Promise<{ reward: bigint; bonusReward: bigint }> {\n const key = await this.discoverIncentiveKey(pool);\n if (!key) {\n return { reward: 0n, bonusReward: 0n };\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const result = await client.readContract({\n address: this.eternalFarming,\n abi: eternalFarmingAbi,\n functionName: \"getRewardInfo\",\n args: [key, tokenId],\n }) as readonly [bigint, bigint];\n\n return { reward: result[0], bonusReward: result[1] };\n }\n\n /**\n * Discover all KittenSwap pools with active farming incentives.\n *\n * Steps:\n * 1. Generate all unique token pair combos from HYPEREVM_TOKENS (includes KITTEN)\n * 2. Batch poolByPair calls via multicall against the Algebra factory\n * 3. For each found pool, batch-scan nonces 0-60 via multicall\n * 4. Return enriched FarmingPool[] for pools with active incentives\n */\n async discoverFarmingPools(): Promise<FarmingPool[]> {\n if (!this.factory) {\n return [];\n }\n\n // Step 1: generate all unique token pairs\n const pairs: Array<[Address, Address]> = [];\n for (let i = 0; i < HYPEREVM_TOKENS.length; i++) {\n for (let j = i + 1; j < HYPEREVM_TOKENS.length; j++) {\n pairs.push([HYPEREVM_TOKENS[i]!, HYPEREVM_TOKENS[j]!]);\n }\n }\n\n // Step 2: batch poolByPair calls\n const poolByPairCalls: Array<[Address, Hex]> = pairs.map(([tokenA, tokenB]) => [\n this.factory!,\n encodeFunctionData({\n abi: algebraFactoryAbi,\n functionName: \"poolByPair\",\n args: [tokenA, tokenB],\n }),\n ]);\n\n const poolResults = await multicallRead(this.rpcUrl, poolByPairCalls);\n\n // Collect unique non-zero pool addresses\n const poolSet = new Set<string>();\n for (const data of poolResults) {\n const addr = decodeAddress(data);\n if (addr && addr !== zeroAddress) {\n poolSet.add(addr.toLowerCase());\n }\n }\n\n if (poolSet.size === 0) return [];\n\n const pools = Array.from(poolSet) as Address[];\n\n // Step 3: for each pool, batch-scan nonces 0-60 via a single multicall per pool.\n // We build all nonce calls for all pools in one big multicall to minimize RPC round-trips.\n const NONCE_COUNT = MAX_NONCE_SCAN + 1; // 61\n const allNonceCalls: Array<[Address, Hex]> = [];\n for (const pool of pools) {\n for (let n = 0; n <= MAX_NONCE_SCAN; n++) {\n const key: IncentiveKey = {\n rewardToken: KITTEN_TOKEN,\n bonusRewardToken: WHYPE_TOKEN,\n pool: pool as Address,\n nonce: BigInt(n),\n };\n allNonceCalls.push([\n this.eternalFarming,\n encodeFunctionData({\n abi: eternalFarmingAbi,\n functionName: \"incentives\",\n args: [incentiveId(key)],\n }),\n ]);\n }\n }\n\n const allNonceResults = await multicallRead(this.rpcUrl, allNonceCalls);\n\n // Step 4: find best active incentive per pool and build result\n const results: FarmingPool[] = [];\n\n for (let pi = 0; pi < pools.length; pi++) {\n const pool = pools[pi]! as Address;\n const poolLc = pool.toLowerCase();\n const base = pi * NONCE_COUNT;\n\n let bestKey: IncentiveKey | null = null;\n let bestTotalReward = 0n;\n let bestBonusReward = 0n;\n let bestActive = false;\n\n for (let n = 0; n <= MAX_NONCE_SCAN; n++) {\n const data = allNonceResults[base + n];\n if (!data || data.length < 66) continue;\n\n try {\n const decoded = decodeAbiParameters(\n [\n { name: \"totalReward\", type: \"uint256\" },\n { name: \"bonusReward\", type: \"uint256\" },\n { name: \"virtualPoolAddress\", type: \"address\" },\n { name: \"minimalPositionWidth\", type: \"uint24\" },\n { name: \"deactivated\", type: \"bool\" },\n { name: \"pluginAddress\", type: \"address\" },\n ],\n data,\n );\n\n const totalReward = decoded[0] as bigint;\n const bonusReward = decoded[1] as bigint;\n const deactivated = decoded[4] as boolean;\n\n if (totalReward > 0n) {\n const nonce = BigInt(n);\n const isActive = !deactivated;\n\n // Prefer active incentives; among active ones, prefer higher nonce (newer)\n if (!bestKey || (isActive && !bestActive) || (isActive === bestActive && nonce > bestKey.nonce)) {\n bestKey = {\n rewardToken: KITTEN_TOKEN,\n bonusRewardToken: WHYPE_TOKEN,\n pool,\n nonce,\n };\n bestTotalReward = totalReward;\n bestBonusReward = bonusReward;\n bestActive = isActive;\n }\n }\n } catch {\n // skip decode errors\n }\n }\n\n if (bestKey) {\n // Cache the discovered nonce\n nonceCache.set(poolLc, bestKey.nonce);\n results.push({\n pool,\n key: bestKey,\n totalReward: bestTotalReward,\n bonusReward: bestBonusReward,\n active: bestActive,\n });\n }\n }\n\n return results;\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, decodeFunctionResult, zeroAddress } from \"viem\";\nimport type { Address, Hex } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n multicallRead,\n decodeU256,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n InterestRateMode,\n} from \"@hypurrquant/defi-core\";\n\nconst POOL_ABI = parseAbi([\n \"function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external\",\n \"function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf) external\",\n \"function repay(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf) external returns (uint256)\",\n \"function withdraw(address asset, uint256 amount, address to) external returns (uint256)\",\n \"function getUserAccountData(address user) external view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)\",\n \"function getReserveData(address asset) external view returns (uint256 configuration, uint128 liquidityIndex, uint128 currentLiquidityRate, uint128 variableBorrowIndex, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, uint16 id, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint128 accruedToTreasury, uint128 unbacked, uint128 isolationModeTotalDebt)\",\n]);\n\nconst ERC20_ABI = parseAbi([\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nconst INCENTIVES_ABI = parseAbi([\n \"function getIncentivesController() external view returns (address)\",\n]);\n\nconst REWARDS_CONTROLLER_ABI = parseAbi([\n \"function getRewardsByAsset(address asset) external view returns (address[])\",\n \"function getRewardsData(address asset, address reward) external view returns (uint256 index, uint256 emissionsPerSecond, uint256 lastUpdateTimestamp, uint256 distributionEnd)\",\n]);\n\nconst POOL_PROVIDER_ABI = parseAbi([\n \"function ADDRESSES_PROVIDER() external view returns (address)\",\n]);\n\nconst ADDRESSES_PROVIDER_ABI = parseAbi([\n \"function getPriceOracle() external view returns (address)\",\n]);\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n \"function BASE_CURRENCY_UNIT() external view returns (uint256)\",\n]);\n\nconst ERC20_DECIMALS_ABI = parseAbi([\n \"function decimals() external view returns (uint8)\",\n]);\n\nfunction u256ToF64(v: bigint): number {\n const MAX_U128 = (1n << 128n) - 1n;\n if (v > MAX_U128) return Infinity;\n return Number(v);\n}\n\nfunction decodeAddress(data: Hex | null): Address | null {\n if (!data || data.length < 66) return null;\n // ABI-encoded address: 12 bytes padding + 20 bytes address (total 32 bytes = 64 hex chars + 0x)\n return `0x${data.slice(26, 66)}` as Address;\n}\n\nfunction decodeAddressArray(data: Hex | null): Address[] {\n if (!data) return [];\n try {\n return decodeFunctionResult({\n abi: REWARDS_CONTROLLER_ABI,\n functionName: \"getRewardsByAsset\",\n data,\n }) as Address[];\n } catch {\n return [];\n }\n}\n\nfunction decodeReserveData(data: Hex | null): ReturnType<typeof decodeFunctionResult> | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({\n abi: POOL_ABI,\n functionName: \"getReserveData\",\n data,\n });\n } catch {\n return null;\n }\n}\n\nfunction decodeRewardsData(data: Hex | null): [bigint, bigint, bigint, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({\n abi: REWARDS_CONTROLLER_ABI,\n functionName: \"getRewardsData\",\n data,\n }) as [bigint, bigint, bigint, bigint];\n } catch {\n return null;\n }\n}\n\nexport class AaveV3Adapter implements ILending {\n private readonly protocolName: string;\n private readonly pool: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const pool = entry.contracts?.[\"pool\"];\n if (!pool) throw DefiError.contractError(`[${entry.name}] Missing 'pool' contract address`);\n this.pool = pool;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"supply\",\n args: [params.asset, params.amount, params.on_behalf_of, 0],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"borrow\",\n args: [params.asset, params.amount, rateMode, 0, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"repay\",\n args: [params.asset, params.amount, rateMode, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n\n // Batch 1: getReserveData\n const reserveCallData = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"getReserveData\",\n args: [asset],\n });\n const [reserveRaw] = await multicallRead(this.rpcUrl, [\n [this.pool, reserveCallData],\n ]).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getReserveData failed: ${e}`);\n });\n\n const reserveDecoded = decodeReserveData(reserveRaw ?? null);\n if (!reserveDecoded) {\n throw DefiError.rpcError(`[${this.protocolName}] getReserveData returned no data`);\n }\n const result = reserveDecoded as [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, Address, Address, Address, Address, bigint, bigint, bigint];\n\n const RAY = 1e27;\n const SECONDS_PER_YEAR = 31536000;\n\n // Convert ray rate to APY: ((1 + rate/SECONDS_PER_YEAR)^SECONDS_PER_YEAR - 1) * 100\n const toApy = (rayRate: bigint): number => {\n const rate = Number(rayRate) / RAY;\n return (Math.pow(1 + rate / SECONDS_PER_YEAR, SECONDS_PER_YEAR) - 1) * 100;\n };\n\n const supplyRate = toApy(result[2]);\n const variableRate = toApy(result[4]);\n const stableRate = toApy(result[5]);\n\n const aTokenAddress = result[8] as Address;\n const variableDebtTokenAddress = result[10] as Address;\n\n // Batch 2: totalSupply for aToken + variableDebtToken\n const [supplyRaw, borrowRaw] = await multicallRead(this.rpcUrl, [\n [aTokenAddress, encodeFunctionData({ abi: ERC20_ABI, functionName: \"totalSupply\" })],\n [variableDebtTokenAddress, encodeFunctionData({ abi: ERC20_ABI, functionName: \"totalSupply\" })],\n ]);\n const totalSupply = decodeU256(supplyRaw ?? null);\n const totalBorrow = decodeU256(borrowRaw ?? null);\n\n const utilization = totalSupply > 0n\n ? Number((totalBorrow * 10000n) / totalSupply) / 100\n : 0;\n\n // Fetch incentive/reward data (best-effort, never breaks base rates)\n const supplyRewardTokens: string[] = [];\n const borrowRewardTokens: string[] = [];\n const supplyEmissions: string[] = [];\n const borrowEmissions: string[] = [];\n\n try {\n // Batch 3: getIncentivesController (single call)\n const [controllerRaw] = await multicallRead(this.rpcUrl, [\n [aTokenAddress, encodeFunctionData({ abi: INCENTIVES_ABI, functionName: \"getIncentivesController\" })],\n ]);\n const controllerAddr = decodeAddress(controllerRaw ?? null);\n\n if (controllerAddr && controllerAddr !== zeroAddress) {\n // Batch 4: getRewardsByAsset for aToken + variableDebtToken\n const [supplyRewardsRaw, borrowRewardsRaw] = await multicallRead(this.rpcUrl, [\n [controllerAddr, encodeFunctionData({ abi: REWARDS_CONTROLLER_ABI, functionName: \"getRewardsByAsset\", args: [aTokenAddress] })],\n [controllerAddr, encodeFunctionData({ abi: REWARDS_CONTROLLER_ABI, functionName: \"getRewardsByAsset\", args: [variableDebtTokenAddress] })],\n ]);\n const supplyRewards = decodeAddressArray(supplyRewardsRaw ?? null);\n const borrowRewards = decodeAddressArray(borrowRewardsRaw ?? null);\n\n // Batch 5: all getRewardsData calls for supply + borrow combined\n const rewardsDataCalls: Array<[Address, Hex]> = [\n ...supplyRewards.map((reward): [Address, Hex] => [\n controllerAddr,\n encodeFunctionData({ abi: REWARDS_CONTROLLER_ABI, functionName: \"getRewardsData\", args: [aTokenAddress, reward] }),\n ]),\n ...borrowRewards.map((reward): [Address, Hex] => [\n controllerAddr,\n encodeFunctionData({ abi: REWARDS_CONTROLLER_ABI, functionName: \"getRewardsData\", args: [variableDebtTokenAddress, reward] }),\n ]),\n ];\n\n if (rewardsDataCalls.length > 0) {\n const rewardsDataResults = await multicallRead(this.rpcUrl, rewardsDataCalls);\n\n const supplyDataResults = rewardsDataResults.slice(0, supplyRewards.length);\n const borrowDataResults = rewardsDataResults.slice(supplyRewards.length);\n\n for (let i = 0; i < supplyRewards.length; i++) {\n const data = decodeRewardsData(supplyDataResults[i] ?? null);\n if (data && data[1] > 0n) {\n supplyRewardTokens.push(supplyRewards[i]);\n supplyEmissions.push(data[1].toString());\n }\n }\n for (let i = 0; i < borrowRewards.length; i++) {\n const data = decodeRewardsData(borrowDataResults[i] ?? null);\n if (data && data[1] > 0n) {\n borrowRewardTokens.push(borrowRewards[i]);\n borrowEmissions.push(data[1].toString());\n }\n }\n }\n }\n } catch {\n // Incentives not supported by this deployment — silently ignore\n }\n\n // Calculate incentive APY from emissions using oracle prices\n let supplyIncentiveApy: number | undefined;\n let borrowIncentiveApy: number | undefined;\n\n const hasSupplyRewards = supplyRewardTokens.length > 0;\n const hasBorrowRewards = borrowRewardTokens.length > 0;\n\n if ((hasSupplyRewards || hasBorrowRewards) && totalSupply > 0n) {\n try {\n // Pool → AddressesProvider → Oracle (sequential, each depends on previous)\n const [providerRaw] = await multicallRead(this.rpcUrl, [\n [this.pool, encodeFunctionData({ abi: POOL_PROVIDER_ABI, functionName: \"ADDRESSES_PROVIDER\" })],\n ]);\n const providerAddr = decodeAddress(providerRaw ?? null);\n if (!providerAddr) throw new Error(\"No provider address\");\n\n const [oracleRaw] = await multicallRead(this.rpcUrl, [\n [providerAddr, encodeFunctionData({ abi: ADDRESSES_PROVIDER_ABI, functionName: \"getPriceOracle\" })],\n ]);\n const oracleAddr = decodeAddress(oracleRaw ?? null);\n if (!oracleAddr) throw new Error(\"No oracle address\");\n\n // Batch 6: assetPrice + BASE_CURRENCY_UNIT + asset decimals\n const [assetPriceRaw, baseCurrencyUnitRaw, assetDecimalsRaw] = await multicallRead(this.rpcUrl, [\n [oracleAddr, encodeFunctionData({ abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [asset] })],\n [oracleAddr, encodeFunctionData({ abi: ORACLE_ABI, functionName: \"BASE_CURRENCY_UNIT\" })],\n [asset, encodeFunctionData({ abi: ERC20_DECIMALS_ABI, functionName: \"decimals\" })],\n ]);\n\n const assetPrice = decodeU256(assetPriceRaw ?? null);\n const baseCurrencyUnit = decodeU256(baseCurrencyUnitRaw ?? null);\n // decimals() returns uint8, fits in lower bits of U256 slot\n const assetDecimals = assetDecimalsRaw ? Number(decodeU256(assetDecimalsRaw)) : 18;\n\n const priceUnit = Number(baseCurrencyUnit) || 1e8;\n const assetPriceF = Number(assetPrice) / priceUnit;\n const assetDecimalsDivisor = 10 ** assetDecimals;\n\n // Collect all unique reward tokens across supply + borrow\n const allRewardTokens = Array.from(new Set([...supplyRewardTokens, ...borrowRewardTokens])) as Address[];\n\n // Batch 7: price + decimals for all reward tokens combined\n const rewardPriceCalls: Array<[Address, Hex]> = allRewardTokens.flatMap((token): Array<[Address, Hex]> => [\n [oracleAddr, encodeFunctionData({ abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [token] })],\n [token, encodeFunctionData({ abi: ERC20_DECIMALS_ABI, functionName: \"decimals\" })],\n ]);\n\n const rewardPriceResults = rewardPriceCalls.length > 0\n ? await multicallRead(this.rpcUrl, rewardPriceCalls)\n : [];\n\n const rewardPriceMap = new Map<string, { price: bigint; decimals: number }>();\n for (let i = 0; i < allRewardTokens.length; i++) {\n const priceRaw = rewardPriceResults[i * 2] ?? null;\n const decimalsRaw = rewardPriceResults[i * 2 + 1] ?? null;\n const price = decodeU256(priceRaw);\n const decimals = decimalsRaw ? Number(decodeU256(decimalsRaw)) : 18;\n rewardPriceMap.set(allRewardTokens[i].toLowerCase(), { price, decimals });\n }\n\n // Supply-side incentive APY\n if (hasSupplyRewards) {\n let totalSupplyIncentiveUsdPerYear = 0;\n const totalSupplyUsd = (Number(totalSupply) / assetDecimalsDivisor) * assetPriceF;\n\n for (let i = 0; i < supplyRewardTokens.length; i++) {\n const emissionPerSec = BigInt(supplyEmissions[i]);\n const entry = rewardPriceMap.get(supplyRewardTokens[i].toLowerCase());\n const rewardPrice = entry?.price ?? 0n;\n const rewardDecimals = entry?.decimals ?? 18;\n if (rewardPrice > 0n) {\n const rewardPriceF = Number(rewardPrice) / priceUnit;\n const emissionPerYear = (Number(emissionPerSec) / (10 ** rewardDecimals)) * SECONDS_PER_YEAR;\n totalSupplyIncentiveUsdPerYear += emissionPerYear * rewardPriceF;\n }\n }\n if (totalSupplyUsd > 0) {\n supplyIncentiveApy = (totalSupplyIncentiveUsdPerYear / totalSupplyUsd) * 100;\n }\n }\n\n // Borrow-side incentive APY\n if (hasBorrowRewards && totalBorrow > 0n) {\n let totalBorrowIncentiveUsdPerYear = 0;\n const totalBorrowUsd = (Number(totalBorrow) / assetDecimalsDivisor) * assetPriceF;\n\n for (let i = 0; i < borrowRewardTokens.length; i++) {\n const emissionPerSec = BigInt(borrowEmissions[i]);\n const entry = rewardPriceMap.get(borrowRewardTokens[i].toLowerCase());\n const rewardPrice = entry?.price ?? 0n;\n const rewardDecimals = entry?.decimals ?? 18;\n if (rewardPrice > 0n) {\n const rewardPriceF = Number(rewardPrice) / priceUnit;\n const emissionPerYear = (Number(emissionPerSec) / (10 ** rewardDecimals)) * SECONDS_PER_YEAR;\n totalBorrowIncentiveUsdPerYear += emissionPerYear * rewardPriceF;\n }\n }\n if (totalBorrowUsd > 0) {\n borrowIncentiveApy = (totalBorrowIncentiveUsdPerYear / totalBorrowUsd) * 100;\n }\n }\n } catch {\n // Oracle not available — skip incentive APY calculation\n }\n }\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyRate,\n borrow_variable_apy: variableRate,\n borrow_stable_apy: stableRate,\n utilization,\n total_supply: totalSupply,\n total_borrow: totalBorrow,\n ...(hasSupplyRewards && {\n supply_reward_tokens: supplyRewardTokens,\n supply_emissions_per_second: supplyEmissions,\n }),\n ...(hasBorrowRewards && {\n borrow_reward_tokens: borrowRewardTokens,\n borrow_emissions_per_second: borrowEmissions,\n }),\n ...(supplyIncentiveApy !== undefined && { supply_incentive_apy: supplyIncentiveApy }),\n ...(borrowIncentiveApy !== undefined && { borrow_incentive_apy: borrowIncentiveApy }),\n };\n }\n\n async getUserPosition(user: Address): Promise<UserPosition> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const result = await client.readContract({\n address: this.pool,\n abi: POOL_ABI,\n functionName: \"getUserAccountData\",\n args: [user],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getUserAccountData failed: ${e}`);\n });\n\n const [totalCollateralBase, totalDebtBase, , , ltv, healthFactor] = result;\n const MAX_UINT256 = 2n ** 256n - 1n;\n const hf = healthFactor >= MAX_UINT256 ? Infinity : Number(healthFactor) / 1e18;\n const collateralUsd = u256ToF64(totalCollateralBase) / 1e8;\n const debtUsd = u256ToF64(totalDebtBase) / 1e8;\n const ltvBps = u256ToF64(ltv);\n\n const supplies = collateralUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Collateral\", amount: totalCollateralBase, value_usd: collateralUsd }]\n : [];\n const borrows = debtUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Debt\", amount: totalDebtBase, value_usd: debtUsd }]\n : [];\n\n return {\n protocol: this.protocolName,\n user,\n supplies,\n borrows,\n health_factor: hf,\n net_apy: ltvBps / 100,\n };\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n InterestRateMode,\n} from \"@hypurrquant/defi-core\";\n\n// V2 uses deposit/borrow/repay/withdraw (same as V3 for borrow/repay/withdraw)\nconst POOL_ABI = parseAbi([\n \"function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external\",\n \"function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf) external\",\n \"function repay(address asset, uint256 amount, uint256 rateMode, address onBehalfOf) external returns (uint256)\",\n \"function withdraw(address asset, uint256 amount, address to) external returns (uint256)\",\n \"function getUserAccountData(address user) external view returns (uint256 totalCollateralETH, uint256 totalDebtETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)\",\n // V2 getReserveData: 12 fields (no accruedToTreasury/unbacked/isolationModeTotalDebt)\n // positions: [0]=configuration, [1]=liquidityIndex, [2]=variableBorrowIndex,\n // [3]=currentLiquidityRate, [4]=currentVariableBorrowRate, [5]=currentStableBorrowRate,\n // [6]=lastUpdateTimestamp, [7]=aTokenAddress, [8]=stableDebtTokenAddress,\n // [9]=variableDebtTokenAddress, [10]=interestRateStrategyAddress, [11]=id\n \"function getReserveData(address asset) external view returns (uint256 configuration, uint128 liquidityIndex, uint128 variableBorrowIndex, uint128 currentLiquidityRate, uint128 currentVariableBorrowRate, uint128 currentStableBorrowRate, uint40 lastUpdateTimestamp, address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress, address interestRateStrategyAddress, uint8 id)\",\n]);\n\nconst ERC20_ABI = parseAbi([\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nfunction u256ToF64(v: bigint): number {\n const MAX_U128 = (1n << 128n) - 1n;\n if (v > MAX_U128) return Infinity;\n return Number(v);\n}\n\nexport class AaveV2Adapter implements ILending {\n private readonly protocolName: string;\n private readonly pool: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const pool = entry.contracts?.[\"pool\"];\n if (!pool) throw DefiError.contractError(`[${entry.name}] Missing 'pool' contract address`);\n this.pool = pool;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"deposit\",\n args: [params.asset, params.amount, params.on_behalf_of, 0],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"borrow\",\n args: [params.asset, params.amount, rateMode, 0, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const rateMode = params.interest_rate_mode === InterestRateMode.Stable ? 1n : 2n;\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"repay\",\n args: [params.asset, params.amount, rateMode, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 300_000,\n approvals: [{ token: params.asset, spender: this.pool, amount: params.amount }],\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: POOL_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from pool`,\n to: this.pool,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const result = await client.readContract({\n address: this.pool,\n abi: POOL_ABI,\n functionName: \"getReserveData\",\n args: [asset],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getReserveData failed: ${e}`);\n });\n\n const RAY = 1e27;\n const SECONDS_PER_YEAR = 31536000;\n\n // Convert ray rate to APY: ((1 + rate/SECONDS_PER_YEAR)^SECONDS_PER_YEAR - 1) * 100\n const toApy = (rayRate: bigint): number => {\n const rate = Number(rayRate) / RAY;\n return (Math.pow(1 + rate / SECONDS_PER_YEAR, SECONDS_PER_YEAR) - 1) * 100;\n };\n\n // V2 field positions:\n // [3] = currentLiquidityRate, [4] = currentVariableBorrowRate, [5] = currentStableBorrowRate\n // [7] = aTokenAddress, [9] = variableDebtTokenAddress\n const supplyRate = toApy(result[3]);\n const variableRate = toApy(result[4]);\n const stableRate = toApy(result[5]);\n\n const aTokenAddress = result[7] as Address;\n const variableDebtTokenAddress = result[9] as Address;\n\n const [totalSupply, totalBorrow] = await Promise.all([\n client.readContract({\n address: aTokenAddress,\n abi: ERC20_ABI,\n functionName: \"totalSupply\",\n }).catch(() => 0n),\n client.readContract({\n address: variableDebtTokenAddress,\n abi: ERC20_ABI,\n functionName: \"totalSupply\",\n }).catch(() => 0n),\n ]);\n\n const utilization = totalSupply > 0n\n ? Number((totalBorrow * 10000n) / totalSupply) / 100\n : 0;\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyRate,\n borrow_variable_apy: variableRate,\n borrow_stable_apy: stableRate,\n utilization,\n total_supply: totalSupply,\n total_borrow: totalBorrow,\n };\n }\n\n async getUserPosition(user: Address): Promise<UserPosition> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const result = await client.readContract({\n address: this.pool,\n abi: POOL_ABI,\n functionName: \"getUserAccountData\",\n args: [user],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getUserAccountData failed: ${e}`);\n });\n\n const [totalCollateralBase, totalDebtBase, , , ltv, healthFactor] = result;\n const MAX_UINT256 = 2n ** 256n - 1n;\n const hf = healthFactor >= MAX_UINT256 ? Infinity : Number(healthFactor) / 1e18;\n // V2 returns values in ETH (18 decimals) vs V3's base currency (8 decimals)\n const collateralUsd = u256ToF64(totalCollateralBase) / 1e18;\n const debtUsd = u256ToF64(totalDebtBase) / 1e18;\n const ltvBps = u256ToF64(ltv);\n\n const supplies = collateralUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Collateral\", amount: totalCollateralBase, value_usd: collateralUsd }]\n : [];\n const borrows = debtUsd > 0\n ? [{ asset: zeroAddress as Address, symbol: \"Total Debt\", amount: totalDebtBase, value_usd: debtUsd }]\n : [];\n\n return {\n protocol: this.protocolName,\n user,\n supplies,\n borrows,\n health_factor: hf,\n net_apy: ltvBps / 100,\n };\n }\n}\n","import { createPublicClient, http, parseAbi } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IOracle } from \"@hypurrquant/defi-core\";\nimport { DefiError, type ProtocolEntry, type PriceData } from \"@hypurrquant/defi-core\";\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n \"function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory)\",\n \"function BASE_CURRENCY_UNIT() external view returns (uint256)\",\n]);\n\nexport class AaveOracleAdapter implements IOracle {\n private readonly protocolName: string;\n private readonly oracle: Address;\n private readonly rpcUrl: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n if (!rpcUrl) throw DefiError.rpcError(`[${entry.name}] RPC URL required for oracle`);\n this.rpcUrl = rpcUrl;\n const oracle = entry.contracts?.[\"oracle\"];\n if (!oracle) throw DefiError.contractError(`[${entry.name}] Missing 'oracle' contract address`);\n this.oracle = oracle;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getPrice(asset: Address): Promise<PriceData> {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const baseUnit = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"BASE_CURRENCY_UNIT\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] BASE_CURRENCY_UNIT failed: ${e}`);\n });\n\n const priceVal = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"getAssetPrice\",\n args: [asset],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getAssetPrice failed: ${e}`);\n });\n\n const priceF64 = baseUnit > 0n ? Number(priceVal) / Number(baseUnit) : 0;\n const priceUsd = baseUnit > 0n\n ? (priceVal * (10n ** 18n)) / baseUnit\n : 0n;\n\n return {\n source: `${this.protocolName} Oracle`,\n source_type: \"oracle\",\n asset,\n price_usd: priceUsd,\n price_f64: priceF64,\n };\n }\n\n async getPrices(assets: Address[]): Promise<PriceData[]> {\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const baseUnit = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"BASE_CURRENCY_UNIT\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] BASE_CURRENCY_UNIT failed: ${e}`);\n });\n\n const rawPrices = await client.readContract({\n address: this.oracle,\n abi: ORACLE_ABI,\n functionName: \"getAssetsPrices\",\n args: [assets],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] getAssetsPrices failed: ${e}`);\n });\n\n return (rawPrices as bigint[]).map((priceVal, i) => {\n const priceF64 = baseUnit > 0n ? Number(priceVal) / Number(baseUnit) : 0;\n const priceUsd = baseUnit > 0n ? (priceVal * (10n ** 18n)) / baseUnit : 0n;\n return {\n source: `${this.protocolName} Oracle`,\n source_type: \"oracle\",\n asset: assets[i]!,\n price_usd: priceUsd,\n price_f64: priceF64,\n };\n });\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst CTOKEN_ABI = parseAbi([\n \"function supplyRatePerBlock() external view returns (uint256)\",\n \"function borrowRatePerBlock() external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function totalBorrows() external view returns (uint256)\",\n \"function mint(uint256 mintAmount) external returns (uint256)\",\n \"function redeem(uint256 redeemTokens) external returns (uint256)\",\n \"function borrow(uint256 borrowAmount) external returns (uint256)\",\n \"function repayBorrow(uint256 repayAmount) external returns (uint256)\",\n]);\n\n// ~3s blocks on BSC\nconst BSC_BLOCKS_PER_YEAR = 10_512_000;\n\nexport class CompoundV2Adapter implements ILending {\n private readonly protocolName: string;\n private readonly defaultVtoken: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const vtoken =\n contracts[\"vusdt\"] ??\n contracts[\"vusdc\"] ??\n contracts[\"vbnb\"] ??\n contracts[\"comptroller\"];\n if (!vtoken) throw DefiError.contractError(\"Missing vToken or comptroller address\");\n this.defaultVtoken = vtoken;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"mint\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"borrow\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"repayBorrow\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: CTOKEN_ABI,\n functionName: \"redeem\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw from Venus`,\n to: this.defaultVtoken,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [supplyRate, borrowRate, totalSupply, totalBorrows] = await Promise.all([\n client.readContract({ address: this.defaultVtoken, abi: CTOKEN_ABI, functionName: \"supplyRatePerBlock\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] supplyRatePerBlock failed: ${e}`); }),\n client.readContract({ address: this.defaultVtoken, abi: CTOKEN_ABI, functionName: \"borrowRatePerBlock\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] borrowRatePerBlock failed: ${e}`); }),\n client.readContract({ address: this.defaultVtoken, abi: CTOKEN_ABI, functionName: \"totalSupply\" }).catch(() => 0n),\n client.readContract({ address: this.defaultVtoken, abi: CTOKEN_ABI, functionName: \"totalBorrows\" }).catch(() => 0n),\n ]);\n\n const supplyPerBlock = Number(supplyRate) / 1e18;\n const borrowPerBlock = Number(borrowRate) / 1e18;\n const supplyApy = supplyPerBlock * BSC_BLOCKS_PER_YEAR * 100;\n const borrowApy = borrowPerBlock * BSC_BLOCKS_PER_YEAR * 100;\n\n const supplyF = Number(totalSupply);\n const borrowF = Number(totalBorrows);\n const utilization = supplyF > 0 ? (borrowF / supplyF) * 100 : 0;\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization,\n total_supply: totalSupply as bigint,\n total_borrow: totalBorrows as bigint,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] User position requires querying individual vToken balances`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst COMET_ABI = parseAbi([\n \"function getUtilization() external view returns (uint256)\",\n \"function getSupplyRate(uint256 utilization) external view returns (uint64)\",\n \"function getBorrowRate(uint256 utilization) external view returns (uint64)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function totalBorrow() external view returns (uint256)\",\n \"function supply(address asset, uint256 amount) external\",\n \"function withdraw(address asset, uint256 amount) external\",\n]);\n\nconst SECONDS_PER_YEAR = 365.25 * 24 * 3600;\n\nexport class CompoundV3Adapter implements ILending {\n private readonly protocolName: string;\n private readonly comet: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const comet = contracts[\"comet_usdc\"] ?? contracts[\"comet\"] ?? contracts[\"comet_weth\"];\n if (!comet) throw DefiError.contractError(\"Missing 'comet_usdc' or 'comet' address\");\n this.comet = comet;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"supply\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n // In Compound V3, borrow = withdraw base asset\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n // In Compound V3, repay = supply base asset\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"supply\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: COMET_ABI,\n functionName: \"withdraw\",\n args: [params.asset, params.amount],\n });\n return {\n description: `[${this.protocolName}] Withdraw from Comet`,\n to: this.comet,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const utilization = await client.readContract({\n address: this.comet,\n abi: COMET_ABI,\n functionName: \"getUtilization\",\n }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] getUtilization failed: ${e}`); });\n\n const [supplyRate, borrowRate, totalSupply, totalBorrow] = await Promise.all([\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"getSupplyRate\", args: [utilization as bigint] }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] getSupplyRate failed: ${e}`); }),\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"getBorrowRate\", args: [utilization as bigint] }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] getBorrowRate failed: ${e}`); }),\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"totalSupply\" }).catch(() => 0n),\n client.readContract({ address: this.comet, abi: COMET_ABI, functionName: \"totalBorrow\" }).catch(() => 0n),\n ]);\n\n // Comet rates are per-second scaled by 1e18\n const supplyPerSec = Number(supplyRate) / 1e18;\n const borrowPerSec = Number(borrowRate) / 1e18;\n const supplyApy = supplyPerSec * SECONDS_PER_YEAR * 100;\n const borrowApy = borrowPerSec * SECONDS_PER_YEAR * 100;\n const utilPct = Number(utilization as bigint) / 1e18 * 100;\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization: utilPct,\n total_supply: totalSupply as bigint,\n total_borrow: totalBorrow as bigint,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] User position requires querying Comet balanceOf + borrowBalanceOf`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst EULER_VAULT_ABI = parseAbi([\n \"function deposit(uint256 amount, address receiver) external returns (uint256)\",\n \"function withdraw(uint256 amount, address receiver, address owner) external returns (uint256)\",\n \"function borrow(uint256 amount, address receiver) external returns (uint256)\",\n \"function repay(uint256 amount, address receiver) external returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function totalBorrows() external view returns (uint256)\",\n \"function interestRate() external view returns (uint256)\",\n]);\n\nconst SECONDS_PER_YEAR = 365.25 * 24 * 3600;\n\nexport class EulerV2Adapter implements ILending {\n private readonly protocolName: string;\n private readonly euler: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const euler = contracts[\"evk_vault\"] ?? contracts[\"euler\"] ?? contracts[\"markets\"];\n if (!euler) throw DefiError.contractError(\"Missing 'evk_vault' or 'euler' contract address\");\n this.euler = euler;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"deposit\",\n args: [params.amount, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Deposit ${params.amount} into Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"borrow\",\n args: [params.amount, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"repay\",\n args: [params.amount, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: EULER_VAULT_ABI,\n functionName: \"withdraw\",\n args: [params.amount, params.to, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from Euler vault`,\n to: this.euler,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [totalSupply, totalBorrows, interestRate] = await Promise.all([\n client.readContract({ address: this.euler, abi: EULER_VAULT_ABI, functionName: \"totalSupply\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalSupply failed: ${e}`); }),\n client.readContract({ address: this.euler, abi: EULER_VAULT_ABI, functionName: \"totalBorrows\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalBorrows failed: ${e}`); }),\n client.readContract({ address: this.euler, abi: EULER_VAULT_ABI, functionName: \"interestRate\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] interestRate failed: ${e}`); }),\n ]);\n\n // Euler V2 interest rates per-second scaled by 1e27\n const rateF64 = Number(interestRate) / 1e27;\n const borrowApy = rateF64 * SECONDS_PER_YEAR * 100;\n\n const supplyF = Number(totalSupply);\n const borrowF = Number(totalBorrows);\n const utilization = supplyF > 0 ? (borrowF / supplyF) * 100 : 0;\n const supplyApy = borrowApy * (borrowF / Math.max(supplyF, 1));\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization,\n total_supply: totalSupply as bigint,\n total_borrow: totalBorrows as bigint,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Euler V2 user positions require querying individual vault balances. Use the vault address directly to check balanceOf(user) for supply positions.`,\n );\n }\n}\n","import { parseAbi, encodeFunctionData, decodeFunctionResult, zeroAddress } from \"viem\";\nimport type { Address, Hex } from \"viem\";\nimport type { ILending } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n multicallRead,\n decodeU256,\n type ProtocolEntry,\n type SupplyParams,\n type BorrowParams,\n type RepayParams,\n type WithdrawParams,\n type LendingRates,\n type UserPosition,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst MORPHO_ABI = parseAbi([\n \"function market(bytes32 id) external view returns (uint128 totalSupplyAssets, uint128 totalSupplyShares, uint128 totalBorrowAssets, uint128 totalBorrowShares, uint128 lastUpdate, uint128 fee)\",\n \"function idToMarketParams(bytes32 id) external view returns (address loanToken, address collateralToken, address oracle, address irm, uint256 lltv)\",\n \"function supply((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, bytes data) external returns (uint256 assetsSupplied, uint256 sharesSupplied)\",\n \"function borrow((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, address receiver) external returns (uint256 assetsBorrowed, uint256 sharesBorrowed)\",\n \"function repay((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, bytes data) external returns (uint256 assetsRepaid, uint256 sharesRepaid)\",\n \"function withdraw((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, uint256 assets, uint256 shares, address onBehalf, address receiver) external returns (uint256 assetsWithdrawn, uint256 sharesWithdrawn)\",\n]);\n\nconst META_MORPHO_ABI = parseAbi([\n \"function supplyQueueLength() external view returns (uint256)\",\n \"function supplyQueue(uint256 index) external view returns (bytes32)\",\n \"function totalAssets() external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nconst IRM_ABI = parseAbi([\n \"function borrowRateView((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv) marketParams, (uint128 totalSupplyAssets, uint128 totalSupplyShares, uint128 totalBorrowAssets, uint128 totalBorrowShares, uint128 lastUpdate, uint128 fee) market) external view returns (uint256)\",\n]);\n\nconst SECONDS_PER_YEAR = 365.25 * 24 * 3600;\n\ntype MarketParams = {\n loanToken: Address;\n collateralToken: Address;\n oracle: Address;\n irm: Address;\n lltv: bigint;\n};\n\nfunction defaultMarketParams(loanToken: Address = zeroAddress as Address): MarketParams {\n return {\n loanToken,\n collateralToken: zeroAddress as Address,\n oracle: zeroAddress as Address,\n irm: zeroAddress as Address,\n lltv: 0n,\n };\n}\n\nfunction decodeMarket(data: Hex | null): [bigint, bigint, bigint, bigint, bigint, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({\n abi: MORPHO_ABI,\n functionName: \"market\",\n data,\n }) as [bigint, bigint, bigint, bigint, bigint, bigint];\n } catch {\n return null;\n }\n}\n\nfunction decodeMarketParams(data: Hex | null): [Address, Address, Address, Address, bigint] | null {\n if (!data) return null;\n try {\n return decodeFunctionResult({\n abi: MORPHO_ABI,\n functionName: \"idToMarketParams\",\n data,\n }) as [Address, Address, Address, Address, bigint];\n } catch {\n return null;\n }\n}\n\nexport class MorphoBlueAdapter implements ILending {\n private readonly protocolName: string;\n private readonly morpho: Address;\n private readonly defaultVault?: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const morpho = contracts[\"morpho_blue\"];\n if (!morpho) throw DefiError.contractError(\"Missing 'morpho_blue' contract address\");\n this.morpho = morpho;\n this.defaultVault =\n contracts[\"fehype\"] ?? contracts[\"vault\"] ?? contracts[\"feusdc\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildSupply(params: SupplyParams): Promise<DeFiTx> {\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"supply\",\n args: [market, params.amount, 0n, params.on_behalf_of, \"0x\"],\n });\n return {\n description: `[${this.protocolName}] Supply ${params.amount} to Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildBorrow(params: BorrowParams): Promise<DeFiTx> {\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"borrow\",\n args: [market, params.amount, 0n, params.on_behalf_of, params.on_behalf_of],\n });\n return {\n description: `[${this.protocolName}] Borrow ${params.amount} from Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async buildRepay(params: RepayParams): Promise<DeFiTx> {\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"repay\",\n args: [market, params.amount, 0n, params.on_behalf_of, \"0x\"],\n });\n return {\n description: `[${this.protocolName}] Repay ${params.amount} to Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildWithdraw(params: WithdrawParams): Promise<DeFiTx> {\n const market = defaultMarketParams(params.asset);\n const data = encodeFunctionData({\n abi: MORPHO_ABI,\n functionName: \"withdraw\",\n args: [market, params.amount, 0n, params.to, params.to],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.amount} from Morpho market`,\n to: this.morpho,\n data,\n value: 0n,\n gas_estimate: 250_000,\n };\n }\n\n async getRates(asset: Address): Promise<LendingRates> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n if (!this.defaultVault) {\n throw DefiError.contractError(`[${this.protocolName}] No MetaMorpho vault configured for rate query`);\n }\n\n // Batch 1: supplyQueueLength (gate check)\n const [queueLenRaw] = await multicallRead(this.rpcUrl, [\n [this.defaultVault, encodeFunctionData({ abi: META_MORPHO_ABI, functionName: \"supplyQueueLength\" })],\n ]).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] supplyQueueLength failed: ${e}`); });\n\n const queueLen = decodeU256(queueLenRaw ?? null);\n\n if (queueLen === 0n) {\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: 0,\n borrow_variable_apy: 0,\n utilization: 0,\n total_supply: 0n,\n total_borrow: 0n,\n };\n }\n\n // supplyQueue(0) — single call, depends on queueLen > 0\n const [marketIdRaw] = await multicallRead(this.rpcUrl, [\n [this.defaultVault, encodeFunctionData({ abi: META_MORPHO_ABI, functionName: \"supplyQueue\", args: [0n] })],\n ]).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] supplyQueue(0) failed: ${e}`); });\n\n if (!marketIdRaw || marketIdRaw.length < 66) {\n throw DefiError.rpcError(`[${this.protocolName}] supplyQueue(0) returned no data`);\n }\n const marketId = marketIdRaw.slice(0, 66) as `0x${string}`;\n\n // Batch 2: market + idToMarketParams (both depend on marketId, independent of each other)\n const [marketRaw, paramsRaw] = await multicallRead(this.rpcUrl, [\n [this.morpho, encodeFunctionData({ abi: MORPHO_ABI, functionName: \"market\", args: [marketId] })],\n [this.morpho, encodeFunctionData({ abi: MORPHO_ABI, functionName: \"idToMarketParams\", args: [marketId] })],\n ]).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] market/idToMarketParams failed: ${e}`); });\n\n const mktDecoded = decodeMarket(marketRaw ?? null);\n if (!mktDecoded) throw DefiError.rpcError(`[${this.protocolName}] market() returned no data`);\n const [totalSupplyAssets, totalSupplyShares, totalBorrowAssets, totalBorrowShares, lastUpdate, fee] = mktDecoded;\n\n const paramsDecoded = decodeMarketParams(paramsRaw ?? null);\n if (!paramsDecoded) throw DefiError.rpcError(`[${this.protocolName}] idToMarketParams returned no data`);\n const [loanToken, collateralToken, oracle, irm, lltv] = paramsDecoded;\n\n const supplyF = Number(totalSupplyAssets);\n const borrowF = Number(totalBorrowAssets);\n const util = supplyF > 0 ? borrowF / supplyF : 0;\n\n const irmMarketParams: MarketParams = { loanToken, collateralToken, oracle, irm, lltv };\n const irmMarket = { totalSupplyAssets, totalSupplyShares, totalBorrowAssets, totalBorrowShares, lastUpdate, fee };\n\n // borrowRateView depends on both market + idToMarketParams results — keep separate\n const borrowRatePerSec = await (async () => {\n const [borrowRateRaw] = await multicallRead(this.rpcUrl!, [\n [irm, encodeFunctionData({ abi: IRM_ABI, functionName: \"borrowRateView\", args: [irmMarketParams, irmMarket] })],\n ]).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] borrowRateView failed: ${e}`); });\n return decodeU256(borrowRateRaw ?? null);\n })();\n\n const ratePerSec = Number(borrowRatePerSec) / 1e18;\n const borrowApy = ratePerSec * SECONDS_PER_YEAR * 100;\n const feePct = Number(fee) / 1e18;\n const supplyApy = borrowApy * util * (1 - feePct);\n\n return {\n protocol: this.protocolName,\n asset,\n supply_apy: supplyApy,\n borrow_variable_apy: borrowApy,\n utilization: util * 100,\n total_supply: totalSupplyAssets,\n total_borrow: totalBorrowAssets,\n };\n }\n\n async getUserPosition(_user: Address): Promise<UserPosition> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Morpho Blue user positions are per-market — use vault deposit/withdraw instead`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ICdp } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type OpenCdpParams,\n type AdjustCdpParams,\n type CloseCdpParams,\n type CdpInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst BORROWER_OPS_ABI = parseAbi([\n \"function openTrove(address _owner, uint256 _ownerIndex, uint256 _collAmount, uint256 _boldAmount, uint256 _upperHint, uint256 _lowerHint, uint256 _annualInterestRate, uint256 _maxUpfrontFee, address _addManager, address _removeManager, address _receiver) external returns (uint256)\",\n \"function adjustTrove(uint256 _troveId, uint256 _collChange, bool _isCollIncrease, uint256 _debtChange, bool _isDebtIncrease, uint256 _upperHint, uint256 _lowerHint, uint256 _maxUpfrontFee) external\",\n \"function closeTrove(uint256 _troveId) external\",\n]);\n\nconst TROVE_MANAGER_ABI = parseAbi([\n \"function getLatestTroveData(uint256 _troveId) external view returns (uint256 entireDebt, uint256 entireColl, uint256 redistDebtGain, uint256 redistCollGain, uint256 accruedInterest, uint256 recordedDebt, uint256 annualInterestRate, uint256 accruedBatchManagementFee, uint256 weightedRecordedDebt, uint256 lastInterestRateAdjTime)\",\n]);\n\nconst HINT_HELPERS_ABI = parseAbi([\n \"function getApproxHint(uint256 _collIndex, uint256 _interestRate, uint256 _numTrials, uint256 _inputRandomSeed) external view returns (uint256 hintId, uint256 diff, uint256 latestRandomSeed)\",\n]);\n\nconst SORTED_TROVES_ABI = parseAbi([\n \"function findInsertPosition(uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) external view returns (uint256 prevId, uint256 nextId)\",\n]);\n\nexport class FelixCdpAdapter implements ICdp {\n private readonly protocolName: string;\n private readonly borrowerOperations: Address;\n private readonly troveManager?: Address;\n private readonly hintHelpers?: Address;\n private readonly sortedTroves?: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const bo = contracts[\"borrower_operations\"];\n if (!bo) throw DefiError.contractError(\"Missing 'borrower_operations' contract\");\n this.borrowerOperations = bo;\n this.troveManager = contracts[\"trove_manager\"];\n this.hintHelpers = contracts[\"hint_helpers\"];\n this.sortedTroves = contracts[\"sorted_troves\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n private async getHints(interestRate: bigint): Promise<[bigint, bigint]> {\n if (!this.hintHelpers || !this.sortedTroves || !this.rpcUrl) {\n return [0n, 0n];\n }\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const approxResult = await client.readContract({\n address: this.hintHelpers,\n abi: HINT_HELPERS_ABI,\n functionName: \"getApproxHint\",\n args: [0n, interestRate, 15n, 42n],\n }).catch(() => null);\n\n if (!approxResult) return [0n, 0n];\n const [hintId] = approxResult as [bigint, bigint, bigint];\n\n const insertResult = await client.readContract({\n address: this.sortedTroves,\n abi: SORTED_TROVES_ABI,\n functionName: \"findInsertPosition\",\n args: [interestRate, hintId, hintId],\n }).catch(() => null);\n\n if (!insertResult) return [0n, 0n];\n const [prevId, nextId] = insertResult as [bigint, bigint];\n return [prevId, nextId];\n }\n\n async buildOpen(params: OpenCdpParams): Promise<DeFiTx> {\n const interestRate = 50000000000000000n; // 5% default\n const [upperHint, lowerHint] = await this.getHints(interestRate);\n const hasHints = upperHint !== 0n || lowerHint !== 0n;\n\n const data = encodeFunctionData({\n abi: BORROWER_OPS_ABI,\n functionName: \"openTrove\",\n args: [\n params.recipient,\n 0n,\n params.collateral_amount,\n params.debt_amount,\n upperHint,\n lowerHint,\n interestRate,\n BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"), // U256::MAX\n params.recipient,\n params.recipient,\n params.recipient,\n ],\n });\n\n return {\n description: `[${this.protocolName}] Open trove: collateral=${params.collateral_amount}, debt=${params.debt_amount} (hints=${hasHints ? \"optimized\" : \"none\"})`,\n to: this.borrowerOperations,\n data,\n value: 0n,\n gas_estimate: hasHints ? 500_000 : 5_000_000,\n };\n }\n\n async buildAdjust(params: AdjustCdpParams): Promise<DeFiTx> {\n const collChange = params.collateral_delta ?? 0n;\n const debtChange = params.debt_delta ?? 0n;\n\n const data = encodeFunctionData({\n abi: BORROWER_OPS_ABI,\n functionName: \"adjustTrove\",\n args: [\n params.cdp_id,\n collChange,\n params.add_collateral,\n debtChange,\n params.add_debt,\n 0n,\n 0n,\n BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"),\n ],\n });\n\n return {\n description: `[${this.protocolName}] Adjust trove ${params.cdp_id}`,\n to: this.borrowerOperations,\n data,\n value: 0n,\n gas_estimate: 400_000,\n };\n }\n\n async buildClose(params: CloseCdpParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: BORROWER_OPS_ABI,\n functionName: \"closeTrove\",\n args: [params.cdp_id],\n });\n\n return {\n description: `[${this.protocolName}] Close trove ${params.cdp_id}`,\n to: this.borrowerOperations,\n data,\n value: 0n,\n gas_estimate: 350_000,\n };\n }\n\n async getCdpInfo(cdpId: bigint): Promise<CdpInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(`[${this.protocolName}] getCdpInfo requires RPC — set HYPEREVM_RPC_URL`);\n if (!this.troveManager) throw DefiError.contractError(`[${this.protocolName}] trove_manager contract not configured`);\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const data = await client.readContract({\n address: this.troveManager,\n abi: TROVE_MANAGER_ABI,\n functionName: \"getLatestTroveData\",\n args: [cdpId],\n }).catch((e: unknown) => {\n throw DefiError.invalidParam(`[${this.protocolName}] Trove ${cdpId} not found: ${e}`);\n });\n\n const [entireDebt, entireColl] = data as [bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint];\n\n if (entireDebt === 0n && entireColl === 0n) {\n throw DefiError.invalidParam(`[${this.protocolName}] Trove ${cdpId} does not exist`);\n }\n\n const collRatio = entireDebt > 0n ? Number(entireColl) / Number(entireDebt) : 0;\n\n return {\n protocol: this.protocolName,\n cdp_id: cdpId,\n collateral: {\n token: zeroAddress as Address,\n symbol: \"WHYPE\",\n amount: entireColl,\n decimals: 18,\n },\n debt: {\n token: zeroAddress as Address,\n symbol: \"feUSD\",\n amount: entireDebt,\n decimals: 18,\n },\n collateral_ratio: collRatio,\n };\n }\n}\n","import { createPublicClient, http, parseAbi } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IOracle } from \"@hypurrquant/defi-core\";\nimport { DefiError, type ProtocolEntry, type PriceData } from \"@hypurrquant/defi-core\";\n\nconst PRICE_FEED_ABI = parseAbi([\n \"function fetchPrice() external view returns (uint256 price, bool isNewOracleFailureDetected)\",\n \"function lastGoodPrice() external view returns (uint256)\",\n]);\n\nexport class FelixOracleAdapter implements IOracle {\n private readonly protocolName: string;\n private readonly priceFeed: Address;\n private readonly asset: Address;\n private readonly rpcUrl: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n if (!rpcUrl) throw DefiError.rpcError(`[${entry.name}] RPC URL required for oracle`);\n this.rpcUrl = rpcUrl;\n const contracts = entry.contracts ?? {};\n const feed = contracts[\"price_feed\"];\n if (!feed) throw DefiError.contractError(`[${entry.name}] Missing 'price_feed' contract address`);\n this.priceFeed = feed;\n // The asset address is stored under \"asset\" or falls back to zero (WHYPE native)\n this.asset = contracts[\"asset\"] ?? (\"0x0000000000000000000000000000000000000000\" as Address);\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getPrice(asset: Address): Promise<PriceData> {\n if (asset !== this.asset && this.asset !== \"0x0000000000000000000000000000000000000000\") {\n throw DefiError.unsupported(`[${this.protocolName}] Felix PriceFeed only supports asset ${this.asset}`);\n }\n\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n let priceVal: bigint;\n try {\n const result = await client.readContract({\n address: this.priceFeed,\n abi: PRICE_FEED_ABI,\n functionName: \"fetchPrice\",\n });\n const [price] = result as [bigint, boolean];\n priceVal = price;\n } catch {\n // Fall back to lastGoodPrice\n priceVal = await client.readContract({\n address: this.priceFeed,\n abi: PRICE_FEED_ABI,\n functionName: \"lastGoodPrice\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] lastGoodPrice failed: ${e}`);\n }) as bigint;\n }\n\n // Felix prices are already in 18-decimal USD\n const priceF64 = Number(priceVal) / 1e18;\n\n return {\n source: \"Felix PriceFeed\",\n source_type: \"oracle\",\n asset,\n price_usd: priceVal,\n price_f64: priceF64,\n };\n }\n\n async getPrices(assets: Address[]): Promise<PriceData[]> {\n const results: PriceData[] = [];\n for (const asset of assets) {\n try {\n results.push(await this.getPrice(asset));\n } catch {\n // Skip unsupported assets\n }\n }\n return results;\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IVault } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type VaultInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst ERC4626_ABI = parseAbi([\n \"function asset() external view returns (address)\",\n \"function totalAssets() external view returns (uint256)\",\n \"function totalSupply() external view returns (uint256)\",\n \"function convertToShares(uint256 assets) external view returns (uint256)\",\n \"function convertToAssets(uint256 shares) external view returns (uint256)\",\n \"function deposit(uint256 assets, address receiver) external returns (uint256 shares)\",\n \"function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares)\",\n]);\n\nexport class ERC4626VaultAdapter implements IVault {\n private readonly protocolName: string;\n private readonly vaultAddress: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const vault = entry.contracts?.[\"vault\"];\n if (!vault) throw DefiError.contractError(\"Missing 'vault' contract address\");\n this.vaultAddress = vault;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildDeposit(assets: bigint, receiver: Address): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: ERC4626_ABI,\n functionName: \"deposit\",\n args: [assets, receiver],\n });\n return {\n description: `[${this.protocolName}] Deposit ${assets} assets into vault`,\n to: this.vaultAddress,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildWithdraw(assets: bigint, receiver: Address, owner: Address): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: ERC4626_ABI,\n functionName: \"withdraw\",\n args: [assets, receiver, owner],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${assets} assets from vault`,\n to: this.vaultAddress,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async totalAssets(): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return client.readContract({\n address: this.vaultAddress,\n abi: ERC4626_ABI,\n functionName: \"totalAssets\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] totalAssets failed: ${e}`);\n }) as Promise<bigint>;\n }\n\n async convertToShares(assets: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return client.readContract({\n address: this.vaultAddress,\n abi: ERC4626_ABI,\n functionName: \"convertToShares\",\n args: [assets],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] convertToShares failed: ${e}`);\n }) as Promise<bigint>;\n }\n\n async convertToAssets(shares: bigint): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n return client.readContract({\n address: this.vaultAddress,\n abi: ERC4626_ABI,\n functionName: \"convertToAssets\",\n args: [shares],\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] convertToAssets failed: ${e}`);\n }) as Promise<bigint>;\n }\n\n async getVaultInfo(): Promise<VaultInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [totalAssets, totalSupply, asset] = await Promise.all([\n client.readContract({ address: this.vaultAddress, abi: ERC4626_ABI, functionName: \"totalAssets\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalAssets failed: ${e}`); }),\n client.readContract({ address: this.vaultAddress, abi: ERC4626_ABI, functionName: \"totalSupply\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] totalSupply failed: ${e}`); }),\n client.readContract({ address: this.vaultAddress, abi: ERC4626_ABI, functionName: \"asset\" }).catch((e: unknown) => { throw DefiError.rpcError(`[${this.protocolName}] asset failed: ${e}`); }),\n ]);\n\n return {\n protocol: this.protocolName,\n vault_address: this.vaultAddress,\n asset: asset as Address,\n total_assets: totalAssets as bigint,\n total_supply: totalSupply as bigint,\n };\n }\n}\n","import { parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type StakeParams,\n type UnstakeParams,\n type StakingInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst GENERIC_LST_ABI = parseAbi([\n \"function stake() external payable returns (uint256)\",\n \"function unstake(uint256 amount) external returns (uint256)\",\n]);\n\nexport class GenericLstAdapter implements ILiquidStaking {\n private readonly protocolName: string;\n private readonly staking: Address;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const staking = entry.contracts?.[\"staking\"];\n if (!staking) throw DefiError.contractError(\"Missing 'staking' contract\");\n this.staking = staking;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildStake(params: StakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({ abi: GENERIC_LST_ABI, functionName: \"stake\" });\n return {\n description: `[${this.protocolName}] Stake ${params.amount} HYPE`,\n to: this.staking,\n data,\n value: params.amount,\n gas_estimate: 200_000,\n };\n }\n\n async buildUnstake(params: UnstakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: GENERIC_LST_ABI,\n functionName: \"unstake\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Unstake ${params.amount}`,\n to: this.staking,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async getInfo(): Promise<StakingInfo> {\n throw DefiError.unsupported(`[${this.protocolName}] getInfo requires RPC`);\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type StakeParams,\n type UnstakeParams,\n type StakingInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst STHYPE_ABI = parseAbi([\n \"function submit(address referral) external payable returns (uint256)\",\n \"function requestWithdrawals(uint256[] amounts, address owner) external returns (uint256[] requestIds)\",\n]);\n\nconst ERC20_ABI = parseAbi([\n \"function totalSupply() external view returns (uint256)\",\n]);\n\nexport class StHypeAdapter implements ILiquidStaking {\n private readonly protocolName: string;\n private readonly staking: Address;\n private readonly sthypeToken?: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const staking = entry.contracts?.[\"staking\"];\n if (!staking) throw DefiError.contractError(\"Missing 'staking' contract\");\n this.staking = staking;\n this.sthypeToken = entry.contracts?.[\"sthype_token\"];\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildStake(params: StakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: STHYPE_ABI,\n functionName: \"submit\",\n args: [zeroAddress as Address],\n });\n return {\n description: `[${this.protocolName}] Stake ${params.amount} HYPE for stHYPE`,\n to: this.staking,\n data,\n value: params.amount,\n gas_estimate: 200_000,\n };\n }\n\n async buildUnstake(params: UnstakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: STHYPE_ABI,\n functionName: \"requestWithdrawals\",\n args: [[params.amount], params.recipient],\n });\n return {\n description: `[${this.protocolName}] Request unstake ${params.amount} stHYPE`,\n to: this.staking,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async getInfo(): Promise<StakingInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n const tokenAddr = this.sthypeToken ?? this.staking;\n\n const totalSupply = await client.readContract({\n address: tokenAddr,\n abi: ERC20_ABI,\n functionName: \"totalSupply\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] totalSupply failed: ${e}`);\n }) as bigint;\n\n return {\n protocol: this.protocolName,\n staked_token: zeroAddress as Address,\n liquid_token: tokenAddr,\n exchange_rate: 1.0,\n total_staked: totalSupply,\n };\n }\n}\n","import { createPublicClient, http, parseAbi, encodeFunctionData, zeroAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { ILiquidStaking } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type StakeParams,\n type UnstakeParams,\n type StakingInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst KINETIQ_ABI = parseAbi([\n \"function stake() external payable returns (uint256)\",\n \"function requestUnstake(uint256 amount) external returns (uint256)\",\n \"function totalStaked() external view returns (uint256)\",\n]);\n\nconst ORACLE_ABI = parseAbi([\n \"function getAssetPrice(address asset) external view returns (uint256)\",\n]);\n\n// WHYPE address on HyperEVM\nconst WHYPE: Address = \"0x5555555555555555555555555555555555555555\";\n// HyperLend oracle address (Aave V3 compatible)\nconst HYPERLEND_ORACLE: Address = \"0xc9fb4fbe842d57ea1df3e641a281827493a63030\";\n\nexport class KinetiqAdapter implements ILiquidStaking {\n private readonly protocolName: string;\n private readonly staking: Address;\n private readonly liquidToken: Address;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n const staking = entry.contracts?.[\"staking\"];\n if (!staking) throw DefiError.contractError(\"Missing 'staking' contract address\");\n this.staking = staking;\n this.liquidToken = entry.contracts?.[\"khype_token\"] ?? staking;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildStake(params: StakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({ abi: KINETIQ_ABI, functionName: \"stake\" });\n return {\n description: `[${this.protocolName}] Stake ${params.amount} HYPE for kHYPE`,\n to: this.staking,\n data,\n value: params.amount,\n gas_estimate: 300_000,\n };\n }\n\n async buildUnstake(params: UnstakeParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: KINETIQ_ABI,\n functionName: \"requestUnstake\",\n args: [params.amount],\n });\n return {\n description: `[${this.protocolName}] Request unstake ${params.amount} kHYPE`,\n to: this.staking,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async getInfo(): Promise<StakingInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const totalStaked = await client.readContract({\n address: this.staking,\n abi: KINETIQ_ABI,\n functionName: \"totalStaked\",\n }).catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] totalStaked failed: ${e}`);\n }) as bigint;\n\n const [khypePrice, hypePrice] = await Promise.all([\n client.readContract({ address: HYPERLEND_ORACLE, abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [this.liquidToken] }).catch(() => 0n),\n client.readContract({ address: HYPERLEND_ORACLE, abi: ORACLE_ABI, functionName: \"getAssetPrice\", args: [WHYPE] }).catch(() => 0n),\n ]);\n\n const rateF64 =\n (hypePrice as bigint) > 0n && (khypePrice as bigint) > 0n\n ? Number((khypePrice as bigint) * 10n ** 18n / (hypePrice as bigint)) / 1e18\n : 1.0;\n\n return {\n protocol: this.protocolName,\n staked_token: zeroAddress as Address,\n liquid_token: this.liquidToken,\n exchange_rate: rateF64,\n total_staked: totalStaked,\n };\n }\n}\n","import type { Address } from \"viem\";\nimport type { IYieldSource } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type YieldInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class PendleAdapter implements IYieldSource {\n private readonly protocolName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n if (!entry.contracts?.[\"router\"]) {\n throw DefiError.contractError(\"Missing 'router' contract\");\n }\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getYields(): Promise<YieldInfo[]> {\n throw DefiError.unsupported(`[${this.protocolName}] getYields requires RPC`);\n }\n\n async buildDeposit(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Pendle deposit requires market address and token routing params. Use Pendle-specific CLI.`,\n );\n }\n\n async buildWithdraw(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Pendle withdraw requires market-specific params`,\n );\n }\n}\n","import type { Address } from \"viem\";\nimport type { IYieldSource } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type YieldInfo,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class GenericYieldAdapter implements IYieldSource {\n private readonly protocolName: string;\n private readonly interfaceName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n this.interfaceName = entry.interface;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getYields(): Promise<YieldInfo[]> {\n throw DefiError.unsupported(`[${this.protocolName}] getYields requires RPC`);\n }\n\n async buildDeposit(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Yield interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'pendle_v2' (Pendle). Protocols like Steer (managed liquidity), ` +\n `Liminal (yield optimization), and Altura (gaming yield) need custom deposit logic.`,\n );\n }\n\n async buildWithdraw(_pool: string, _amount: bigint, _recipient: Address): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Yield interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'pendle_v2' (Pendle). Protocols like Steer (managed liquidity), ` +\n `Liminal (yield optimization), and Altura (gaming yield) need custom withdraw logic.`,\n );\n }\n}\n","import { parseAbi, encodeFunctionData } from \"viem\";\nimport type { IDerivatives } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type DerivativesPositionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\nimport type { Address } from \"viem\";\n\nconst HLP_ABI = parseAbi([\n \"function deposit(uint256 amount) external returns (uint256)\",\n \"function withdraw(uint256 shares) external returns (uint256)\",\n]);\n\nexport class HlpVaultAdapter implements IDerivatives {\n private readonly protocolName: string;\n private readonly vault: Address;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const vault = entry.contracts?.[\"vault\"];\n if (!vault) throw DefiError.contractError(\"Missing 'vault' contract\");\n this.vault = vault;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildOpenPosition(params: DerivativesPositionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: HLP_ABI,\n functionName: \"deposit\",\n args: [params.collateral],\n });\n return {\n description: `[${this.protocolName}] Deposit ${params.collateral} into HLP vault`,\n to: this.vault,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n\n async buildClosePosition(params: DerivativesPositionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: HLP_ABI,\n functionName: \"withdraw\",\n args: [params.size],\n });\n return {\n description: `[${this.protocolName}] Withdraw ${params.size} from HLP vault`,\n to: this.vault,\n data,\n value: 0n,\n gas_estimate: 200_000,\n };\n }\n}\n","import type { IDerivatives } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type DerivativesPositionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class GenericDerivativesAdapter implements IDerivatives {\n private readonly protocolName: string;\n private readonly interfaceName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n this.interfaceName = entry.interface;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildOpenPosition(_params: DerivativesPositionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Derivatives interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'hlp_vault' (HLP Vault). Protocols like Rumpel need custom position management logic.`,\n );\n }\n\n async buildClosePosition(_params: DerivativesPositionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Derivatives interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'hlp_vault' (HLP Vault). Protocols like Rumpel need custom position management logic.`,\n );\n }\n}\n","import { parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { IOptions } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type OptionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nconst RYSK_ABI = parseAbi([\n \"function openOption(address underlying, uint256 strikePrice, uint256 expiry, bool isCall, uint256 amount) external returns (uint256 premium)\",\n \"function closeOption(address underlying, uint256 strikePrice, uint256 expiry, bool isCall, uint256 amount) external returns (uint256 payout)\",\n]);\n\nexport class RyskAdapter implements IOptions {\n private readonly protocolName: string;\n private readonly controller: Address;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n const controller = entry.contracts?.[\"controller\"];\n if (!controller) throw DefiError.contractError(\"Missing 'controller' contract\");\n this.controller = controller;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildBuy(params: OptionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: RYSK_ABI,\n functionName: \"openOption\",\n args: [\n params.underlying,\n params.strike_price,\n BigInt(params.expiry),\n params.is_call,\n params.amount,\n ],\n });\n return {\n description: `[${this.protocolName}] Buy ${params.is_call ? \"call\" : \"put\"} ${params.amount} option, strike=${params.strike_price}, expiry=${params.expiry}`,\n to: this.controller,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n\n async buildSell(params: OptionParams): Promise<DeFiTx> {\n const data = encodeFunctionData({\n abi: RYSK_ABI,\n functionName: \"closeOption\",\n args: [\n params.underlying,\n params.strike_price,\n BigInt(params.expiry),\n params.is_call,\n params.amount,\n ],\n });\n return {\n description: `[${this.protocolName}] Sell/close ${params.is_call ? \"call\" : \"put\"} ${params.amount} option`,\n to: this.controller,\n data,\n value: 0n,\n gas_estimate: 300_000,\n };\n }\n}\n","import type { IOptions } from \"@hypurrquant/defi-core\";\nimport {\n DefiError,\n type ProtocolEntry,\n type OptionParams,\n type DeFiTx,\n} from \"@hypurrquant/defi-core\";\n\nexport class GenericOptionsAdapter implements IOptions {\n private readonly protocolName: string;\n private readonly interfaceName: string;\n\n constructor(entry: ProtocolEntry, _rpcUrl?: string) {\n this.protocolName = entry.name;\n this.interfaceName = entry.interface;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async buildBuy(_params: OptionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Options interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'rysk' (Rysk Finance). Other options protocols need custom strike/expiry handling.`,\n );\n }\n\n async buildSell(_params: OptionParams): Promise<DeFiTx> {\n throw DefiError.unsupported(\n `[${this.protocolName}] Options interface '${this.interfaceName}' requires a protocol-specific adapter. ` +\n `Supported: 'rysk' (Rysk Finance). Other options protocols need custom strike/expiry handling.`,\n );\n }\n}\n","import { createPublicClient, http, parseAbi } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { INft, NftCollectionInfo, NftTokenInfo } from \"@hypurrquant/defi-core\";\nimport { DefiError, type ProtocolEntry } from \"@hypurrquant/defi-core\";\n\nconst ERC721_ABI = parseAbi([\n \"function name() returns (string)\",\n \"function symbol() returns (string)\",\n \"function totalSupply() returns (uint256)\",\n \"function ownerOf(uint256 tokenId) returns (address)\",\n \"function balanceOf(address owner) returns (uint256)\",\n \"function tokenURI(uint256 tokenId) returns (string)\",\n]);\n\nexport class ERC721Adapter implements INft {\n private readonly protocolName: string;\n private readonly rpcUrl?: string;\n\n constructor(entry: ProtocolEntry, rpcUrl?: string) {\n this.protocolName = entry.name;\n this.rpcUrl = rpcUrl;\n }\n\n name(): string {\n return this.protocolName;\n }\n\n async getCollectionInfo(collection: Address): Promise<NftCollectionInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [collectionName, symbol, totalSupply] = await Promise.all([\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"name\" })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] name failed: ${e}`);\n }),\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"symbol\" })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] symbol failed: ${e}`);\n }),\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"totalSupply\" })\n .catch(() => undefined),\n ]);\n\n return {\n address: collection,\n name: collectionName as string,\n symbol: symbol as string,\n total_supply: totalSupply as bigint | undefined,\n };\n }\n\n async getTokenInfo(collection: Address, tokenId: bigint): Promise<NftTokenInfo> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n const [owner, tokenUri] = await Promise.all([\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"ownerOf\", args: [tokenId] })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] ownerOf failed: ${e}`);\n }),\n client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"tokenURI\", args: [tokenId] })\n .catch(() => undefined),\n ]);\n\n return {\n collection,\n token_id: tokenId,\n owner: owner as Address,\n token_uri: tokenUri as string | undefined,\n };\n }\n\n async getBalance(owner: Address, collection: Address): Promise<bigint> {\n if (!this.rpcUrl) throw DefiError.rpcError(\"No RPC URL configured\");\n const client = createPublicClient({ transport: http(this.rpcUrl) });\n\n return client\n .readContract({ address: collection, abi: ERC721_ABI, functionName: \"balanceOf\", args: [owner] })\n .catch((e: unknown) => {\n throw DefiError.rpcError(`[${this.protocolName}] balanceOf failed: ${e}`);\n }) as Promise<bigint>;\n }\n}\n","import type { Address } from \"viem\";\n\nimport type { IDex, PriceData, QuoteParams } from \"@hypurrquant/defi-core\";\n\n/**\n * Utility for deriving spot prices from DEX quoters.\n * Quotes 1 unit of the token against a quote token (e.g. USDC) to derive price.\n */\nexport class DexSpotPrice {\n /**\n * Get the spot price for `token` denominated in `quoteToken` (e.g. USDC).\n *\n * `tokenDecimals` — decimals of the input token (to know how much \"1 unit\" is)\n * `quoteDecimals` — decimals of the quote token (to convert the output to number)\n */\n static async getPrice(\n dex: IDex,\n token: Address,\n tokenDecimals: number,\n quoteToken: Address,\n quoteDecimals: number,\n ): Promise<PriceData> {\n const amountIn = 10n ** BigInt(tokenDecimals); // 1 token\n\n const quoteParams: QuoteParams = {\n protocol: \"\",\n token_in: token,\n token_out: quoteToken,\n amount_in: amountIn,\n };\n\n const quote = await dex.quote(quoteParams);\n\n // Convert to USD price (assuming quoteToken is a USD stablecoin)\n const priceF64 = Number(quote.amount_out) / 10 ** quoteDecimals;\n\n // Normalize to 18-decimal representation\n let priceUsd: bigint;\n if (quoteDecimals < 18) {\n priceUsd = quote.amount_out * 10n ** BigInt(18 - quoteDecimals);\n } else if (quoteDecimals > 18) {\n priceUsd = quote.amount_out / 10n ** BigInt(quoteDecimals - 18);\n } else {\n priceUsd = quote.amount_out;\n }\n\n return {\n source: `dex:${dex.name()}`,\n source_type: \"dex_spot\",\n asset: token,\n price_usd: priceUsd,\n price_f64: priceF64,\n block_number: undefined,\n timestamp: undefined,\n };\n }\n}\n","#!/usr/bin/env node\n/**\n * MCP (Model Context Protocol) server for defi-cli.\n *\n * Exposes DeFi operations as MCP tools: lending, DEX, bridge, vault, staking,\n * price queries, exploit detection, and portfolio overview.\n * Transactions default to dry-run mode unless DEFI_PRIVATE_KEY is set and\n * broadcast is explicitly requested via the `broadcast` parameter.\n */\n\nimport \"dotenv/config\";\nimport { createRequire } from \"node:module\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport { Registry, InterestRateMode } from \"@hypurrquant/defi-core\";\nimport { createLending, createDex, createVault, createLiquidStaking } from \"@hypurrquant/defi-protocols\";\nimport { Executor } from \"./executor.js\";\nimport type { Address } from \"viem\";\n\n// ── JSON envelope helpers ──\n\nfunction ok(data: unknown, meta?: Record<string, unknown>) {\n return JSON.stringify({ ok: true, data, meta }, null, 2);\n}\n\nfunction err(error: string, meta?: Record<string, unknown>) {\n return JSON.stringify({ ok: false, error, meta }, null, 2);\n}\n\n// ── Registry helper ──\n\nfunction getRegistry() {\n return Registry.loadEmbedded();\n}\n\nfunction resolveToken(registry: Registry, chainName: string, token: string): Address {\n if (token.startsWith(\"0x\")) return token as Address;\n return registry.resolveToken(chainName, token).address as Address;\n}\n\nfunction makeExecutor(broadcast: boolean, rpcUrl: string, explorerUrl?: string): Executor {\n return new Executor(broadcast, rpcUrl, explorerUrl);\n}\n\n// ── MCP Server ──\n\nconst _require = createRequire(import.meta.url);\nconst _pkg = _require(\"../package.json\") as { version: string };\n\nconst server = new McpServer(\n { name: \"defi-cli\", version: _pkg.version },\n { capabilities: { tools: {}, resources: {}, prompts: {} } },\n);\n\n// ============================================================\n// defi_status — chain and protocol status\n// ============================================================\n\nserver.tool(\n \"defi_status\",\n \"Show chain and protocol status: lists all protocols deployed on a chain with contract addresses and categories\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm). E.g. hyperevm, ethereum, arbitrum, base\"),\n },\n async ({ chain }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocols = registry.getProtocolsForChain(chainName);\n\n const data = {\n chain: chainName,\n chain_id: chainConfig.chain_id,\n rpc_url: chainConfig.effectiveRpcUrl(),\n protocols: protocols.map(p => ({\n slug: p.slug,\n name: p.name,\n category: p.category,\n interface: p.interface,\n contracts: p.contracts ?? {},\n })),\n summary: {\n total_protocols: protocols.length,\n },\n };\n\n return { content: [{ type: \"text\", text: ok(data, { chain: chainName }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e)) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_lending_rates — get lending rates for a protocol\n// ============================================================\n\nserver.tool(\n \"defi_lending_rates\",\n \"Get current supply and borrow rates for an asset on a lending protocol (e.g. Aave V3)\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug, e.g. aave-v3, felix\"),\n asset: z.string().describe(\"Token symbol (e.g. USDC) or address (0x...)\"),\n },\n async ({ chain, protocol, asset }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createLending(protocolConfig, chainConfig.effectiveRpcUrl());\n const assetAddr = resolveToken(registry, chainName, asset);\n const rates = await adapter.getRates(assetAddr);\n return { content: [{ type: \"text\", text: ok(rates, { chain: chainName, protocol, asset }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol, asset }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_lending_supply — supply to lending protocol\n// ============================================================\n\nserver.tool(\n \"defi_lending_supply\",\n \"Supply an asset to a lending protocol. Defaults to dry-run (no broadcast). Set broadcast=true to send transaction (requires DEFI_PRIVATE_KEY env var)\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug, e.g. aave-v3\"),\n asset: z.string().describe(\"Token symbol or address\"),\n amount: z.string().describe(\"Amount in wei (as string to avoid precision loss)\"),\n on_behalf_of: z.string().optional().describe(\"Supply on behalf of this address (default: DEFI_WALLET_ADDRESS env var)\"),\n broadcast: z.boolean().optional().describe(\"Set true to broadcast the transaction (default: false = dry run)\"),\n },\n async ({ chain, protocol, asset, amount, on_behalf_of, broadcast }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createLending(protocolConfig, chainConfig.effectiveRpcUrl());\n const assetAddr = resolveToken(registry, chainName, asset);\n const onBehalfOf = (on_behalf_of ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n const tx = await adapter.buildSupply({ protocol: protocolConfig.name, asset: assetAddr, amount: BigInt(amount), on_behalf_of: onBehalfOf });\n const executor = makeExecutor(broadcast ?? false, chainConfig.effectiveRpcUrl(), chainConfig.explorer_url);\n const result = await executor.execute(tx);\n return { content: [{ type: \"text\", text: ok(result, { chain: chainName, protocol, asset, broadcast: broadcast ?? false }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol, asset }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_lending_withdraw — withdraw from lending protocol\n// ============================================================\n\nserver.tool(\n \"defi_lending_withdraw\",\n \"Withdraw a supplied asset from a lending protocol. Defaults to dry-run. Set broadcast=true to send transaction\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug, e.g. aave-v3\"),\n asset: z.string().describe(\"Token symbol or address\"),\n amount: z.string().describe(\"Amount in wei to withdraw\"),\n to: z.string().optional().describe(\"Recipient address (default: DEFI_WALLET_ADDRESS)\"),\n broadcast: z.boolean().optional().describe(\"Set true to broadcast (default: false)\"),\n },\n async ({ chain, protocol, asset, amount, to, broadcast }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createLending(protocolConfig, chainConfig.effectiveRpcUrl());\n const assetAddr = resolveToken(registry, chainName, asset);\n const toAddr = (to ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n const tx = await adapter.buildWithdraw({ protocol: protocolConfig.name, asset: assetAddr, amount: BigInt(amount), to: toAddr });\n const executor = makeExecutor(broadcast ?? false, chainConfig.effectiveRpcUrl(), chainConfig.explorer_url);\n const result = await executor.execute(tx);\n return { content: [{ type: \"text\", text: ok(result, { chain: chainName, protocol, asset, broadcast: broadcast ?? false }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol, asset }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_dex_quote — get swap quote\n// ============================================================\n\nserver.tool(\n \"defi_dex_quote\",\n \"Get a DEX swap quote without executing. Returns expected output amount and price impact\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug, e.g. uniswap-v3, algebra-v3\"),\n token_in: z.string().describe(\"Input token symbol or address\"),\n token_out: z.string().describe(\"Output token symbol or address\"),\n amount_in: z.string().describe(\"Amount of input token in wei\"),\n },\n async ({ chain, protocol, token_in, token_out, amount_in }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createDex(protocolConfig, chainConfig.effectiveRpcUrl());\n const tokenIn = resolveToken(registry, chainName, token_in);\n const tokenOut = resolveToken(registry, chainName, token_out);\n const result = await adapter.quote({ protocol: protocolConfig.name, token_in: tokenIn, token_out: tokenOut, amount_in: BigInt(amount_in) });\n return { content: [{ type: \"text\", text: ok(result, { chain: chainName, protocol, token_in, token_out }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol, token_in, token_out }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_dex_swap — execute swap\n// ============================================================\n\nserver.tool(\n \"defi_dex_swap\",\n \"Execute a token swap on a DEX. Defaults to dry-run. Set broadcast=true to send transaction\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug, e.g. uniswap-v3\"),\n token_in: z.string().describe(\"Input token symbol or address\"),\n token_out: z.string().describe(\"Output token symbol or address\"),\n amount_in: z.string().describe(\"Amount of input token in wei\"),\n slippage_bps: z.number().optional().describe(\"Slippage tolerance in basis points (default: 50 = 0.5%)\"),\n recipient: z.string().optional().describe(\"Recipient address (default: DEFI_WALLET_ADDRESS)\"),\n broadcast: z.boolean().optional().describe(\"Set true to broadcast (default: false)\"),\n },\n async ({ chain, protocol, token_in, token_out, amount_in, slippage_bps, recipient, broadcast }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createDex(protocolConfig, chainConfig.effectiveRpcUrl());\n const tokenIn = resolveToken(registry, chainName, token_in);\n const tokenOut = resolveToken(registry, chainName, token_out);\n const recipientAddr = (recipient ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n const tx = await adapter.buildSwap({\n protocol: protocolConfig.name,\n token_in: tokenIn,\n token_out: tokenOut,\n amount_in: BigInt(amount_in),\n slippage: { bps: slippage_bps ?? 50 },\n recipient: recipientAddr,\n });\n const executor = makeExecutor(broadcast ?? false, chainConfig.effectiveRpcUrl(), chainConfig.explorer_url);\n const result = await executor.execute(tx);\n return { content: [{ type: \"text\", text: ok(result, { chain: chainName, protocol, token_in, token_out, broadcast: broadcast ?? false }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol, token_in, token_out }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_dex_lp_add — add liquidity\n// ============================================================\n\nserver.tool(\n \"defi_dex_lp_add\",\n \"Add liquidity to a DEX pool. Defaults to dry-run. Set broadcast=true to send transaction\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug, e.g. uniswap-v3\"),\n token_a: z.string().describe(\"First token symbol or address\"),\n token_b: z.string().describe(\"Second token symbol or address\"),\n amount_a: z.string().describe(\"Amount of token A in wei\"),\n amount_b: z.string().describe(\"Amount of token B in wei\"),\n recipient: z.string().optional().describe(\"Recipient address for LP tokens\"),\n broadcast: z.boolean().optional().describe(\"Set true to broadcast (default: false)\"),\n },\n async ({ chain, protocol, token_a, token_b, amount_a, amount_b, recipient, broadcast }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createDex(protocolConfig, chainConfig.effectiveRpcUrl());\n const tokenA = resolveToken(registry, chainName, token_a);\n const tokenB = resolveToken(registry, chainName, token_b);\n const recipientAddr = (recipient ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n const tx = await adapter.buildAddLiquidity({\n protocol: protocolConfig.name,\n token_a: tokenA,\n token_b: tokenB,\n amount_a: BigInt(amount_a),\n amount_b: BigInt(amount_b),\n recipient: recipientAddr,\n });\n const executor = makeExecutor(broadcast ?? false, chainConfig.effectiveRpcUrl(), chainConfig.explorer_url);\n const result = await executor.execute(tx);\n return { content: [{ type: \"text\", text: ok(result, { chain: chainName, protocol, token_a, token_b, broadcast: broadcast ?? false }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_dex_lp_remove — remove liquidity\n// ============================================================\n\nserver.tool(\n \"defi_dex_lp_remove\",\n \"Remove liquidity from a DEX pool. Defaults to dry-run. Set broadcast=true to send transaction\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug, e.g. uniswap-v3\"),\n token_a: z.string().describe(\"First token symbol or address\"),\n token_b: z.string().describe(\"Second token symbol or address\"),\n liquidity: z.string().describe(\"Liquidity amount to remove in wei\"),\n recipient: z.string().optional().describe(\"Recipient address for returned tokens\"),\n broadcast: z.boolean().optional().describe(\"Set true to broadcast (default: false)\"),\n },\n async ({ chain, protocol, token_a, token_b, liquidity, recipient, broadcast }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createDex(protocolConfig, chainConfig.effectiveRpcUrl());\n const tokenA = resolveToken(registry, chainName, token_a);\n const tokenB = resolveToken(registry, chainName, token_b);\n const recipientAddr = (recipient ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\") as Address;\n const tx = await adapter.buildRemoveLiquidity({\n protocol: protocolConfig.name,\n token_a: tokenA,\n token_b: tokenB,\n liquidity: BigInt(liquidity),\n recipient: recipientAddr,\n });\n const executor = makeExecutor(broadcast ?? false, chainConfig.effectiveRpcUrl(), chainConfig.explorer_url);\n const result = await executor.execute(tx);\n return { content: [{ type: \"text\", text: ok(result, { chain: chainName, protocol, token_a, token_b, broadcast: broadcast ?? false }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_bridge — cross-chain bridge quote\n// ============================================================\n\nserver.tool(\n \"defi_bridge\",\n \"Get a cross-chain bridge quote via LI.FI, deBridge DLN, or Circle CCTP. Returns estimated output amount and fees\",\n {\n from_chain: z.string().describe(\"Source chain name, e.g. ethereum, arbitrum, base\"),\n to_chain: z.string().describe(\"Destination chain name, e.g. hyperevm, arbitrum\"),\n token: z.string().optional().describe(\"Token symbol to bridge (default: USDC). Use native for native token\"),\n amount: z.string().describe(\"Amount in human-readable units, e.g. '100' for 100 USDC\"),\n recipient: z.string().optional().describe(\"Recipient address on destination chain\"),\n },\n async ({ from_chain, to_chain, token, amount, recipient }) => {\n try {\n const tokenSymbol = token ?? \"USDC\";\n const recipientAddr = recipient ?? process.env[\"DEFI_WALLET_ADDRESS\"] ?? \"0x0000000000000000000000000000000000000001\";\n\n // Use LI.FI API for a quote\n const LIFI_API = \"https://li.quest/v1\";\n const registry = getRegistry();\n\n let fromChainId: number | undefined;\n let toChainId: number | undefined;\n try {\n fromChainId = registry.getChain(from_chain).chain_id;\n } catch { /* use name */ }\n try {\n toChainId = registry.getChain(to_chain).chain_id;\n } catch { /* use name */ }\n\n const params = new URLSearchParams({\n fromChain: fromChainId ? String(fromChainId) : from_chain,\n toChain: toChainId ? String(toChainId) : to_chain,\n fromToken: tokenSymbol,\n toToken: tokenSymbol,\n fromAmount: String(Math.round(parseFloat(amount) * 1e6)), // USDC decimals\n toAddress: recipientAddr,\n });\n\n const res = await fetch(`${LIFI_API}/quote?${params}`, {\n headers: { Accept: \"application/json\" },\n });\n\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`LI.FI quote failed (${res.status}): ${text.slice(0, 200)}`);\n }\n\n const data = await res.json() as Record<string, unknown>;\n const estimate = data.estimate as Record<string, unknown> | undefined;\n\n const quote = {\n from_chain,\n to_chain,\n token: tokenSymbol,\n amount_in: amount,\n amount_out: estimate?.toAmount ? String(Number(estimate.toAmount as string) / 1e6) : \"unknown\",\n fee_costs: estimate?.feeCosts ?? [],\n gas_costs: estimate?.gasCosts ?? [],\n execution_duration_seconds: estimate?.executionDuration ?? \"unknown\",\n tool: (data.tool as string) ?? \"unknown\",\n raw: data,\n };\n\n return { content: [{ type: \"text\", text: ok(quote, { from_chain, to_chain, token: tokenSymbol }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { from_chain, to_chain }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_vault_info — vault information\n// ============================================================\n\nserver.tool(\n \"defi_vault_info\",\n \"Get vault information: TVL, APY, total shares, and underlying asset details\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug for the vault\"),\n },\n async ({ chain, protocol }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createVault(protocolConfig, chainConfig.effectiveRpcUrl());\n const info = await adapter.getVaultInfo();\n return { content: [{ type: \"text\", text: ok(info, { chain: chainName, protocol }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_staking_info — staking information\n// ============================================================\n\nserver.tool(\n \"defi_staking_info\",\n \"Get liquid staking protocol info: exchange rate, APY, total staked\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n protocol: z.string().describe(\"Protocol slug for the staking protocol\"),\n },\n async ({ chain, protocol }) => {\n try {\n const chainName = chain ?? \"hyperevm\";\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const protocolConfig = registry.getProtocol(protocol);\n const adapter = createLiquidStaking(protocolConfig, chainConfig.effectiveRpcUrl());\n const info = await adapter.getInfo();\n return { content: [{ type: \"text\", text: ok(info, { chain: chainName, protocol }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { protocol }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_price — asset price query\n// ============================================================\n\nserver.tool(\n \"defi_price\",\n \"Query asset price from on-chain oracles (Aave V3) and/or DEX spot prices\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n asset: z.string().describe(\"Token symbol (e.g. WBTC) or address (0x...)\"),\n source: z.enum([\"oracle\", \"dex\", \"all\"]).optional().describe(\"Price source: oracle, dex, or all (default: all)\"),\n },\n async ({ chain, asset, source }) => {\n try {\n const chainName = (chain ?? \"hyperevm\").toLowerCase();\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const rpcUrl = chainConfig.effectiveRpcUrl();\n const srcMode = source ?? \"all\";\n\n let assetAddr: Address;\n let assetSymbol: string;\n try {\n if (/^0x[0-9a-fA-F]{40}$/.test(asset)) {\n assetAddr = asset as Address;\n assetSymbol = asset;\n } else {\n const token = registry.resolveToken(chainName, asset);\n assetAddr = token.address as Address;\n assetSymbol = token.symbol;\n }\n } catch (e) {\n return { content: [{ type: \"text\", text: err(`Could not resolve asset: ${asset}`) }], isError: true };\n }\n\n const { ProtocolCategory } = await import(\"@hypurrquant/defi-core\");\n const { createOracleFromLending } = await import(\"@hypurrquant/defi-protocols\");\n\n const prices: Array<{ source: string; source_type: string; price: number }> = [];\n\n if (srcMode === \"all\" || srcMode === \"oracle\") {\n const lendingProtos = registry.getProtocolsForChain(chainName)\n .filter(p => p.category === ProtocolCategory.Lending);\n await Promise.all(lendingProtos.map(async (p) => {\n try {\n const oracle = createOracleFromLending(p, rpcUrl);\n const price = await oracle.getPrice(assetAddr);\n if (price.price_f64 > 0) prices.push({ source: p.slug, source_type: \"oracle\", price: price.price_f64 });\n } catch { /* skip */ }\n }));\n }\n\n if (srcMode === \"all\" || srcMode === \"dex\") {\n const { DexSpotPrice } = await import(\"@hypurrquant/defi-protocols\");\n const USDC_SYMBOL = \"USDC\";\n let usdcAddr: Address | undefined;\n let usdcDecimals = 6;\n try {\n const usdcToken = registry.resolveToken(chainName, USDC_SYMBOL);\n usdcAddr = usdcToken.address as Address;\n usdcDecimals = usdcToken.decimals;\n } catch { /* no USDC on chain */ }\n\n // Determine asset decimals from registry if resolved by symbol, else default 18\n let assetDecimals = 18;\n if (!/^0x[0-9a-fA-F]{40}$/.test(asset)) {\n try { assetDecimals = registry.resolveToken(chainName, asset).decimals; } catch { /* default 18 */ }\n }\n\n if (usdcAddr && assetAddr.toLowerCase() !== usdcAddr.toLowerCase()) {\n const dexProtos = registry.getProtocolsForChain(chainName)\n .filter(p => p.category === ProtocolCategory.Dex);\n await Promise.all(dexProtos.map(async (p) => {\n try {\n const dex = createDex(p, rpcUrl);\n const priceData = await DexSpotPrice.getPrice(dex, assetAddr, assetDecimals, usdcAddr!, usdcDecimals);\n if (priceData.price_f64 > 0) prices.push({ source: p.slug, source_type: \"dex\", price: priceData.price_f64 });\n } catch { /* skip */ }\n }));\n }\n }\n\n if (prices.length === 0) {\n return { content: [{ type: \"text\", text: err(`No price data found for ${assetSymbol} on ${chainName}`) }], isError: true };\n }\n\n const priceValues = prices.map(p => p.price);\n const avg = priceValues.reduce((a, b) => a + b, 0) / priceValues.length;\n const min = Math.min(...priceValues);\n const max = Math.max(...priceValues);\n const spread = max > 0 ? ((max - min) / max) * 100 : 0;\n\n const report = {\n asset: assetSymbol,\n asset_address: assetAddr,\n prices,\n average_price: Math.round(avg * 100) / 100,\n max_spread_pct: Math.round(spread * 100) / 100,\n };\n\n return { content: [{ type: \"text\", text: ok(report, { chain: chainName, asset: assetSymbol, source: srcMode }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { asset }) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_scan — exploit / price manipulation detection\n// ============================================================\n\nserver.tool(\n \"defi_scan\",\n \"Scan for potential price manipulation or exploit opportunities by comparing oracle prices vs DEX spot prices across lending protocols\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n min_spread_pct: z.number().optional().describe(\"Minimum oracle-vs-dex spread % to flag (default: 5)\"),\n },\n async ({ chain, min_spread_pct }) => {\n try {\n const chainName = (chain ?? \"hyperevm\").toLowerCase();\n const minSpread = min_spread_pct ?? 5;\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const rpcUrl = chainConfig.effectiveRpcUrl();\n\n const { ProtocolCategory } = await import(\"@hypurrquant/defi-core\");\n const { createOracleFromLending, DexSpotPrice } = await import(\"@hypurrquant/defi-protocols\");\n\n const tokens = registry.tokens.get(chainName) ?? [];\n const lendingProtos = registry.getProtocolsForChain(chainName)\n .filter(p => p.category === ProtocolCategory.Lending);\n const dexProtos = registry.getProtocolsForChain(chainName)\n .filter(p => p.category === ProtocolCategory.Dex);\n\n let usdcAddr: Address | undefined;\n try {\n usdcAddr = registry.resolveToken(chainName, \"USDC\").address as Address;\n } catch { /* no USDC */ }\n\n const findings: Array<{\n token: string;\n address: string;\n oracle_price: number;\n dex_price: number;\n spread_pct: number;\n verdict: string;\n }> = [];\n\n for (const token of tokens.slice(0, 20)) {\n const addr = token.address as Address;\n if (!usdcAddr || addr.toLowerCase() === usdcAddr.toLowerCase()) continue;\n\n let oraclePrice = 0;\n let dexPrice = 0;\n\n for (const p of lendingProtos) {\n try {\n const oracle = createOracleFromLending(p, rpcUrl);\n const priceData = await oracle.getPrice(addr);\n if (priceData.price_f64 > 0) { oraclePrice = priceData.price_f64; break; }\n } catch { /* skip */ }\n }\n\n for (const p of dexProtos) {\n try {\n const dex = createDex(p, rpcUrl);\n const priceData = await DexSpotPrice.getPrice(dex, addr, token.decimals, usdcAddr!, 6);\n if (priceData.price_f64 > 0) { dexPrice = priceData.price_f64; break; }\n } catch { /* skip */ }\n }\n\n if (oraclePrice > 0 && dexPrice > 0) {\n const spread = Math.abs(oraclePrice - dexPrice) / Math.max(oraclePrice, dexPrice) * 100;\n if (spread >= minSpread) {\n findings.push({\n token: token.symbol,\n address: addr,\n oracle_price: Math.round(oraclePrice * 10000) / 10000,\n dex_price: Math.round(dexPrice * 10000) / 10000,\n spread_pct: Math.round(spread * 100) / 100,\n verdict: spread >= 20 ? \"HIGH_RISK\" : spread >= 10 ? \"MEDIUM_RISK\" : \"LOW_RISK\",\n });\n }\n }\n }\n\n findings.sort((a, b) => b.spread_pct - a.spread_pct);\n\n return {\n content: [{\n type: \"text\",\n text: ok(\n { chain: chainName, findings, scanned_tokens: Math.min(tokens.length, 20), min_spread_pct: minSpread },\n { finding_count: findings.length },\n ),\n }],\n };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e)) }], isError: true };\n }\n },\n);\n\n// ============================================================\n// defi_portfolio — portfolio overview\n// ============================================================\n\nserver.tool(\n \"defi_portfolio\",\n \"Get a portfolio overview for a wallet address: lending positions, token balances, and health factors across all protocols on a chain\",\n {\n chain: z.string().optional().describe(\"Chain name (default: hyperevm)\"),\n address: z.string().describe(\"Wallet address to query (0x...)\"),\n },\n async ({ chain, address }) => {\n try {\n const chainName = (chain ?? \"hyperevm\").toLowerCase();\n\n if (!/^0x[0-9a-fA-F]{40}$/.test(address)) {\n return { content: [{ type: \"text\", text: err(`Invalid address: ${address}`) }], isError: true };\n }\n\n const registry = getRegistry();\n const chainConfig = registry.getChain(chainName);\n const rpcUrl = chainConfig.effectiveRpcUrl();\n const user = address as Address;\n\n const { ProtocolCategory, multicallRead } = await import(\"@hypurrquant/defi-core\");\n const { createLending: _createLending } = await import(\"@hypurrquant/defi-protocols\");\n const { encodeFunctionData, parseAbi } = await import(\"viem\");\n\n const POOL_ABI = parseAbi([\n \"function getUserAccountData(address user) external view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)\",\n ]);\n\n const lendingProtos = registry.getProtocolsForChain(chainName)\n .filter(p => p.category === ProtocolCategory.Lending);\n\n const lendingPositions: Array<{\n protocol: string;\n total_collateral_usd: number;\n total_debt_usd: number;\n available_borrows_usd: number;\n health_factor: number;\n ltv: number;\n }> = [];\n\n for (const p of lendingProtos) {\n const poolAddr = (p.contracts as Record<string, string> | undefined)?.pool;\n if (!poolAddr) continue;\n try {\n const callData = encodeFunctionData({ abi: POOL_ABI, functionName: \"getUserAccountData\", args: [user] });\n const results = await multicallRead(rpcUrl, [[poolAddr as Address, callData as `0x${string}`]]);\n const raw = results[0];\n if (!raw || raw.length < 2 + 6 * 64) continue;\n const hex = raw.slice(2);\n const decodeU256 = (offset: number) => BigInt(\"0x\" + hex.slice(offset * 64, offset * 64 + 64));\n const totalCollateral = Number(decodeU256(0)) / 1e8;\n const totalDebt = Number(decodeU256(1)) / 1e8;\n const availableBorrows = Number(decodeU256(2)) / 1e8;\n const ltv = Number(decodeU256(4)) / 100;\n const hfRaw = decodeU256(5);\n const healthFactor = hfRaw >= BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\") / 2n\n ? 999999\n : Math.round(Number(hfRaw) / 1e16) / 100;\n\n if (totalCollateral > 0 || totalDebt > 0) {\n lendingPositions.push({\n protocol: p.slug,\n total_collateral_usd: Math.round(totalCollateral * 100) / 100,\n total_debt_usd: Math.round(totalDebt * 100) / 100,\n available_borrows_usd: Math.round(availableBorrows * 100) / 100,\n health_factor: healthFactor,\n ltv,\n });\n }\n } catch { /* skip */ }\n }\n\n const totalCollateralUsd = lendingPositions.reduce((s, p) => s + p.total_collateral_usd, 0);\n const totalDebtUsd = lendingPositions.reduce((s, p) => s + p.total_debt_usd, 0);\n\n const portfolio = {\n address,\n chain: chainName,\n lending_positions: lendingPositions,\n summary: {\n total_collateral_usd: Math.round(totalCollateralUsd * 100) / 100,\n total_debt_usd: Math.round(totalDebtUsd * 100) / 100,\n net_position_usd: Math.round((totalCollateralUsd - totalDebtUsd) * 100) / 100,\n active_protocols: lendingPositions.length,\n },\n };\n\n return { content: [{ type: \"text\", text: ok(portfolio, { chain: chainName, address }) }] };\n } catch (e) {\n return { content: [{ type: \"text\", text: err(e instanceof Error ? e.message : String(e), { address }) }], isError: true };\n }\n },\n);\n\n// ── Start server ──\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n","import { createPublicClient, createWalletClient, http, parseAbi, encodeFunctionData } from \"viem\";\nimport type { Address } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { DefiError } from \"@hypurrquant/defi-core\";\nimport { TxStatus } from \"@hypurrquant/defi-core\";\nimport type { ActionResult, DeFiTx } from \"@hypurrquant/defi-core\";\n\nconst ERC20_ABI = parseAbi([\n \"function allowance(address owner, address spender) external view returns (uint256)\",\n \"function approve(address spender, uint256 amount) external returns (bool)\",\n]);\n\n/** Gas buffer multiplier: 120% over estimated gas (20% headroom) */\nconst GAS_BUFFER_BPS = 12000n;\n\n/** Default max priority fee (tip) in wei — 20 gwei (safe for Mantle + EVM chains) */\nconst DEFAULT_PRIORITY_FEE_WEI = 20_000_000_000n;\n\n/** Max gas limit cap — Mantle uses high gas units (up to 5B for complex txs) */\nconst MAX_GAS_LIMIT = 5_000_000_000n; // 5B\n\nexport class Executor {\n readonly dryRun: boolean;\n readonly rpcUrl: string | undefined;\n readonly explorerUrl: string | undefined;\n\n constructor(broadcast: boolean, rpcUrl?: string, explorerUrl?: string) {\n this.dryRun = !broadcast;\n this.rpcUrl = rpcUrl;\n this.explorerUrl = explorerUrl;\n }\n\n /** Apply 20% buffer to a gas estimate */\n private static applyGasBuffer(gas: bigint): bigint {\n return (gas * GAS_BUFFER_BPS) / 10000n;\n }\n\n /**\n * Check allowance for a single token/spender pair and send an approve tx if needed.\n * Only called in broadcast mode (not dry-run).\n */\n private async checkAndApprove(\n token: Address,\n spender: Address,\n amount: bigint,\n owner: Address,\n publicClient: ReturnType<typeof createPublicClient>,\n walletClient: ReturnType<typeof createWalletClient>,\n ): Promise<void> {\n const allowance = await publicClient.readContract({\n address: token,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [owner, spender],\n });\n\n if (allowance >= amount) return;\n\n process.stderr.write(\n ` Approving ${amount} of ${token} for ${spender}...\\n`,\n );\n\n const approveData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [spender, amount],\n });\n\n const rpcUrl = this.rpcUrl!;\n const gasLimit = await (async () => {\n try {\n const estimated = await publicClient.estimateGas({\n to: token,\n data: approveData,\n account: owner,\n });\n const buffered = Executor.applyGasBuffer(estimated);\n return buffered > MAX_GAS_LIMIT ? MAX_GAS_LIMIT : buffered;\n } catch {\n return 80_000n;\n }\n })();\n\n const [maxFeePerGas, maxPriorityFeePerGas] = await this.fetchEip1559Fees(rpcUrl);\n\n const approveTxHash = await walletClient.sendTransaction({\n chain: null,\n account: walletClient.account!,\n to: token,\n data: approveData,\n gas: gasLimit > 0n ? gasLimit : undefined,\n maxFeePerGas: maxFeePerGas > 0n ? maxFeePerGas : undefined,\n maxPriorityFeePerGas: maxPriorityFeePerGas > 0n ? maxPriorityFeePerGas : undefined,\n });\n\n const approveTxUrl = this.explorerUrl\n ? `${this.explorerUrl}/tx/${approveTxHash}`\n : undefined;\n process.stderr.write(` Approve tx: ${approveTxHash}\\n`);\n if (approveTxUrl) process.stderr.write(` Explorer: ${approveTxUrl}\\n`);\n\n await publicClient.waitForTransactionReceipt({ hash: approveTxHash });\n process.stderr.write(\n ` Approved ${amount} of ${token} for ${spender}\\n`,\n );\n }\n\n /** Fetch EIP-1559 fee params from the network. Returns [maxFeePerGas, maxPriorityFeePerGas]. */\n private async fetchEip1559Fees(rpcUrl: string): Promise<[bigint, bigint]> {\n try {\n const client = createPublicClient({ transport: http(rpcUrl) });\n const gasPrice = await client.getGasPrice();\n let priorityFee = DEFAULT_PRIORITY_FEE_WEI;\n try {\n priorityFee = await client.estimateMaxPriorityFeePerGas();\n } catch {\n // fallback to default\n }\n const maxFee = gasPrice * 2n + priorityFee;\n return [maxFee, priorityFee];\n } catch {\n return [0n, 0n];\n }\n }\n\n /** Estimate gas dynamically with buffer, falling back to a hardcoded estimate */\n private async estimateGasWithBuffer(\n rpcUrl: string,\n tx: DeFiTx,\n from: `0x${string}`,\n ): Promise<bigint> {\n try {\n const client = createPublicClient({ transport: http(rpcUrl) });\n const estimated = await client.estimateGas({\n to: tx.to,\n data: tx.data,\n value: tx.value,\n account: from,\n });\n if (estimated > 0n) {\n const buffered = Executor.applyGasBuffer(estimated);\n return buffered > MAX_GAS_LIMIT ? MAX_GAS_LIMIT : buffered;\n }\n } catch {\n // fallback: apply buffer to the hint too\n if (tx.gas_estimate) {\n return Executor.applyGasBuffer(BigInt(tx.gas_estimate));\n }\n }\n return 0n;\n }\n\n /** Simulate a transaction via eth_call + eth_estimateGas */\n private async simulate(tx: DeFiTx): Promise<ActionResult> {\n const rpcUrl = this.rpcUrl;\n if (!rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL — cannot simulate. Set HYPEREVM_RPC_URL.\");\n }\n\n const client = createPublicClient({ transport: http(rpcUrl) });\n\n const privateKey = process.env[\"DEFI_PRIVATE_KEY\"];\n const from: `0x${string}` = privateKey\n ? privateKeyToAccount(privateKey as `0x${string}`).address\n : \"0x0000000000000000000000000000000000000001\";\n\n // Check approvals before simulation\n if (tx.approvals && tx.approvals.length > 0) {\n const pendingApprovals: Array<{ token: string; spender: string; needed: string; current: string }> = [];\n for (const approval of tx.approvals) {\n try {\n const allowance = await client.readContract({\n address: approval.token,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [from as `0x${string}`, approval.spender],\n });\n if (allowance < approval.amount) {\n pendingApprovals.push({\n token: approval.token,\n spender: approval.spender,\n needed: approval.amount.toString(),\n current: allowance.toString(),\n });\n }\n } catch { /* skip check on error */ }\n }\n if (pendingApprovals.length > 0) {\n return {\n tx_hash: undefined,\n status: TxStatus.NeedsApproval,\n gas_used: tx.gas_estimate,\n description: tx.description,\n details: {\n to: tx.to,\n from,\n data: tx.data,\n value: tx.value.toString(),\n mode: \"simulated\",\n result: \"needs_approval\",\n pending_approvals: pendingApprovals,\n hint: \"Use --broadcast to auto-approve and execute\",\n },\n };\n }\n }\n\n try {\n await client.call({ to: tx.to, data: tx.data, value: tx.value, account: from });\n\n const gasEstimate = await this.estimateGasWithBuffer(rpcUrl, tx, from);\n const [maxFee, priorityFee] = await this.fetchEip1559Fees(rpcUrl);\n\n return {\n tx_hash: undefined,\n status: \"simulated\" as TxStatus,\n gas_used: gasEstimate > 0n ? Number(gasEstimate) : undefined,\n description: tx.description,\n details: {\n to: tx.to,\n from,\n data: tx.data,\n value: tx.value.toString(),\n gas_estimate: gasEstimate.toString(),\n max_fee_per_gas_gwei: (Number(maxFee) / 1e9).toFixed(4),\n max_priority_fee_gwei: (Number(priorityFee) / 1e9).toFixed(4),\n mode: \"simulated\",\n result: \"success\",\n },\n };\n } catch (e: unknown) {\n const errMsg = String(e);\n const revertReason = extractRevertReason(errMsg);\n\n return {\n tx_hash: undefined,\n status: \"simulation_failed\" as TxStatus,\n gas_used: tx.gas_estimate,\n description: tx.description,\n details: {\n to: tx.to,\n from,\n data: tx.data,\n value: tx.value.toString(),\n mode: \"simulated\",\n result: \"revert\",\n revert_reason: revertReason,\n },\n };\n }\n }\n\n async execute(tx: DeFiTx): Promise<ActionResult> {\n if (this.dryRun) {\n if (this.rpcUrl) {\n return this.simulate(tx);\n }\n\n return {\n tx_hash: undefined,\n status: \"dry_run\" as TxStatus,\n gas_used: tx.gas_estimate,\n description: tx.description,\n details: {\n to: tx.to,\n data: tx.data,\n value: tx.value.toString(),\n mode: \"dry_run\",\n },\n };\n }\n\n // === Broadcast mode ===\n const privateKey = process.env[\"DEFI_PRIVATE_KEY\"];\n if (!privateKey) {\n throw DefiError.invalidParam(\n \"DEFI_PRIVATE_KEY environment variable not set. Required for --broadcast.\",\n );\n }\n\n const account = privateKeyToAccount(privateKey as `0x${string}`);\n\n const rpcUrl = this.rpcUrl;\n if (!rpcUrl) {\n throw DefiError.rpcError(\"No RPC URL configured for broadcasting\");\n }\n\n const publicClient = createPublicClient({ transport: http(rpcUrl) });\n const walletClient = createWalletClient({ account, transport: http(rpcUrl) });\n\n // Execute pre-transactions (e.g. farming approval)\n if (tx.pre_txs && tx.pre_txs.length > 0) {\n for (const preTx of tx.pre_txs) {\n process.stderr.write(` Pre-tx: ${preTx.description}...\\n`);\n const preGas = await this.estimateGasWithBuffer(rpcUrl, preTx, account.address);\n const preTxHash = await walletClient.sendTransaction({\n chain: null,\n to: preTx.to,\n data: preTx.data,\n value: preTx.value,\n gas: preGas > 0n ? preGas : undefined,\n });\n const preTxUrl = this.explorerUrl ? `${this.explorerUrl}/tx/${preTxHash}` : undefined;\n process.stderr.write(` Pre-tx sent: ${preTxHash}\\n`);\n if (preTxUrl) process.stderr.write(` Explorer: ${preTxUrl}\\n`);\n const preReceipt = await publicClient.waitForTransactionReceipt({ hash: preTxHash });\n if (preReceipt.status !== \"success\") {\n throw new DefiError(\"TX_FAILED\", `Pre-transaction failed: ${preTx.description}`);\n }\n process.stderr.write(` Pre-tx confirmed\\n`);\n }\n }\n\n // Auto-approve ERC20 tokens if needed\n if (tx.approvals && tx.approvals.length > 0) {\n for (const approval of tx.approvals) {\n await this.checkAndApprove(\n approval.token,\n approval.spender,\n approval.amount,\n account.address,\n publicClient,\n walletClient,\n );\n }\n }\n\n // Dynamic gas estimation with buffer\n const gasLimit = await this.estimateGasWithBuffer(rpcUrl, tx, account.address);\n\n // EIP-1559 gas pricing\n const [maxFeePerGas, maxPriorityFeePerGas] = await this.fetchEip1559Fees(rpcUrl);\n\n process.stderr.write(`Broadcasting transaction to ${rpcUrl}...\\n`);\n if (gasLimit > 0n) {\n process.stderr.write(` Gas limit: ${gasLimit} (with 20% buffer)\\n`);\n }\n\n const txHash = await walletClient.sendTransaction({\n chain: null,\n to: tx.to,\n data: tx.data,\n value: tx.value,\n gas: gasLimit > 0n ? gasLimit : undefined,\n maxFeePerGas: maxFeePerGas > 0n ? maxFeePerGas : undefined,\n maxPriorityFeePerGas: maxPriorityFeePerGas > 0n ? maxPriorityFeePerGas : undefined,\n });\n\n const txUrl = this.explorerUrl ? `${this.explorerUrl}/tx/${txHash}` : undefined;\n process.stderr.write(`Transaction sent: ${txHash}\\n`);\n if (txUrl) process.stderr.write(`Explorer: ${txUrl}\\n`);\n process.stderr.write(\"Waiting for confirmation...\\n\");\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n const status = receipt.status === \"success\" ? \"confirmed\" : \"failed\";\n\n // Extract minted NFT tokenId from Transfer(from=0x0) events\n let mintedTokenId: string | undefined;\n if (receipt.status === \"success\" && receipt.logs) {\n const TRANSFER_TOPIC = \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\";\n const ZERO_TOPIC = \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n for (const log of receipt.logs) {\n if (\n log.topics.length >= 4 &&\n log.topics[0] === TRANSFER_TOPIC &&\n log.topics[1] === ZERO_TOPIC // from = address(0) → mint\n ) {\n mintedTokenId = BigInt(log.topics[3]!).toString();\n break;\n }\n }\n }\n\n const details: Record<string, string | undefined> = {\n to: tx.to,\n from: account.address,\n block_number: receipt.blockNumber?.toString(),\n gas_limit: gasLimit.toString(),\n gas_used: receipt.gasUsed?.toString(),\n explorer_url: txUrl,\n mode: \"broadcast\",\n };\n if (mintedTokenId) {\n details.minted_token_id = mintedTokenId;\n process.stderr.write(` Minted NFT tokenId: ${mintedTokenId}\\n`);\n }\n\n return {\n tx_hash: txHash,\n status: status as TxStatus,\n gas_used: receipt.gasUsed ? Number(receipt.gasUsed) : undefined,\n description: tx.description,\n details,\n };\n }\n}\n\n/** Extract a human-readable revert reason from an RPC error message */\nfunction extractRevertReason(err: string): string {\n for (const marker of [\"execution reverted:\", \"revert:\", \"Error(\"]) {\n const pos = err.indexOf(marker);\n if (pos !== -1) return err.slice(pos);\n }\n return err.length > 200 ? err.slice(0, 200) + \"...\" : err;\n}\n"],"mappings":"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","names":["endPtr","encodeFunctionData","parseAbi","TxStatus","InterestRateMode","ProtocolCategory","encodeFunctionData","parseAbi","createPublicClient","http","decodeFunctionResult","decodeAbiParameters","zeroAddress","decodeAddress","_addressDecodeAbi","decodeSymbol","_symbolDecodeAbi","erc20Abi","u256ToF64","DefiError","abi","veAbi","voterAbi","lbQuoterAbi","HYPEREVM_TOKENS","positionManagerAbi","POOL_ABI","ERC20_ABI","ORACLE_ABI","SECONDS_PER_YEAR","init_dist","client","amountOut","best","result","poolAbi","multicallRead","algebraFactoryAbi","data","ids","InterestRateMode","decodeU256","init_dist","init_dist","createPublicClient","http","parseAbi","encodeFunctionData","ERC20_ABI","err","ProtocolCategory","createOracleFromLending","DexSpotPrice","multicallRead","encodeFunctionData","parseAbi","POOL_ABI","decodeU256"]}
|