From 0c12a999a2f2193e0b393a95c2c31ad1da39c33d Mon Sep 17 00:00:00 2001 From: Corey Rice Date: Wed, 31 Jan 2024 17:23:04 -0300 Subject: [PATCH] feat: integrate pancake swap sdk --- .gitignore | 3 + .prettierrc | 2 +- package.json | 4 +- src/config/addresses.ts | 198 +++++++----- src/converter-bot/index.ts | 56 ++-- src/converter-bot/tokenConverterBot.ts | 187 ++++++++++-- src/module.d.ts | 10 + tsconfig.json | 5 +- wagmi.config.ts | 5 - yarn.lock | 397 ++++++++++++++++++++++--- 10 files changed, 670 insertions(+), 197 deletions(-) create mode 100644 src/module.d.ts diff --git a/.gitignore b/.gitignore index 3014371e..8647ff40 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,6 @@ artifacts # Generated files src/config/abis/generated.ts subgraph-client/.graphclient + +# Build +dist diff --git a/.prettierrc b/.prettierrc index e794b58c..2ea5bfb3 100644 --- a/.prettierrc +++ b/.prettierrc @@ -2,7 +2,7 @@ "arrowParens": avoid, "bracketSpacing": true, "endOfLine": "auto", - "importOrder": ["module-alias/register", "", "^[./]"], + "importOrder": ["dotenv/config", "module-alias/register", "", "^[./]"], "importOrderParserPlugins": ["typescript", "importAssertions"], "importOrderSeparation": true, "importOrderSortSpecifiers": true, diff --git a/package.json b/package.json index 5970f8cb..897a6c94 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "@types/node": "^20.10.0", "@typescript-eslint/eslint-plugin": "^6.13.1", "@typescript-eslint/parser": "^6.13.1", - "@venusprotocol/oracle": "^1.7.3", + "@venusprotocol/oracle": "^1.9.0", "@venusprotocol/solidity-utilities": "^1.1.0", "@wagmi/cli": "^2.0.4", "chai": "^4.3.10", @@ -93,6 +93,8 @@ "dependencies": { "@graphprotocol/client-cli": "^3.0.0", "@openzeppelin/contracts-upgradeable": "4.9.3", + "@pancakeswap/smart-router": "^4.14.1", + "@pancakeswap/v3-sdk": "^3.7.6", "@venusprotocol/governance-contracts": "^1.4.0", "@venusprotocol/isolated-pools": "^2.3.0", "@venusprotocol/protocol-reserve": "^1.4.0", diff --git a/src/config/addresses.ts b/src/config/addresses.ts index bfc99302..e0d3ea2a 100644 --- a/src/config/addresses.ts +++ b/src/config/addresses.ts @@ -6,6 +6,7 @@ import bscmainnetProtocolReserve from "@venusprotocol/protocol-reserve/deploymen import bsctestnetProtocolReserve from "@venusprotocol/protocol-reserve/deployments/bsctestnet_addresses.json"; import bscmainnetCore from "@venusprotocol/venus-protocol/deployments/bscmainnet_addresses.json"; import bsctestnetCore from "@venusprotocol/venus-protocol/deployments/bsctestnet_addresses.json"; +import { Address } from "viem"; import { SUPPORTED_CHAINS } from "./chains"; @@ -67,197 +68,232 @@ export type SupportedConverters = const network = process.env.FORKED_NETWORK as SUPPORTED_CHAINS; -export const underlyingToVTokens = { +export const underlyingToVTokens: Record< + Address, + { core: Address | undefined; isolated: Array<[Address, Address]> | undefined } +> = { bsctestnet: { // usdc - "0x16227d60f7a0e586c66b005219dfc887d13c9531": { - core: "0xD5C4C2e2facBEB59D0216D0595d63FcDc6F9A1a7", + ["0x16227d60f7a0e586c66b005219dfc887d13c9531" as const]: { + core: "0xD5C4C2e2facBEB59D0216D0595d63FcDc6F9A1a7" as const, isolated: undefined, }, // ankrBNB - "0x167f1f9ef531b3576201aa3146b13c57dbeda514": { - core: "0xe507B30C41E9e375BCe05197c1e09fc9ee40c0f6", + ["0x167f1f9ef531b3576201aa3146b13c57dbeda514" as const]: { + core: "0xe507B30C41E9e375BCe05197c1e09fc9ee40c0f6" as const, isolated: undefined, }, // trx old - "0x19e7215abf8b2716ee807c9f4b83af0e7f92653f": { - core: "0x369Fea97f6fB7510755DCA389088d9E2e2819278", + ["0x19e7215abf8b2716ee807c9f4b83af0e7f92653f" as const]: { + core: "0x369Fea97f6fB7510755DCA389088d9E2e2819278" as const, isolated: undefined, }, // stkBNB - "0x2999c176ebf66ecda3a646e70ceb5ff4d5fcfb8c": { + ["0x2999c176ebf66ecda3a646e70ceb5ff4d5fcfb8c" as const]: { core: undefined, - isolated: [["0x596B11acAACF03217287939f88d63b51d3771704", "0x75aa42c832a8911B77219DbeBABBB40040d16987"]], + isolated: [ + ["0x596B11acAACF03217287939f88d63b51d3771704" as const, "0x75aa42c832a8911B77219DbeBABBB40040d16987" as const], + ] as [Address, Address][], }, // usdd - "0x2e2466e22fcbe0732be385ee2fbb9c59a1098382": { + ["0x2e2466e22fcbe0732be385ee2fbb9c59a1098382" as const]: { core: undefined, isolated: [ - ["0x11537D023f489E4EF0C7157cc729C7B69CbE0c97", "0xD804F74fe21290d213c46610ab171f7c2EeEBDE7"], - ["0x1F4f0989C51f12DAcacD4025018176711f3Bf289", "0xdeDf3B2bcF25d0023115fd71a0F8221C91C92B1a"], - ["0x10b57706AD2345e590c2eA4DC02faef0d9f5b08B", "0x899dDf81DfbbF5889a16D075c352F2b959Dd24A4"], - ["0x23a73971A6B9f6580c048B9CB188869B2A2aA2aD ", "0xa109DE0abaeefC521Ec29D89eA42E64F37A6882E"], - ["0x596B11acAACF03217287939f88d63b51d3771704", "0xD5b20708d8f0FcA52cb609938D0594C4e32E5DaD"], - ], + ["0x11537D023f489E4EF0C7157cc729C7B69CbE0c97" as const, "0xD804F74fe21290d213c46610ab171f7c2EeEBDE7" as const], + ["0x1F4f0989C51f12DAcacD4025018176711f3Bf289" as const, "0xdeDf3B2bcF25d0023115fd71a0F8221C91C92B1a" as const], + ["0x10b57706AD2345e590c2eA4DC02faef0d9f5b08B" as const, "0x899dDf81DfbbF5889a16D075c352F2b959Dd24A4" as const], + ["0x23a73971A6B9f6580c048B9CB188869B2A2aA2aD " as const, "0xa109DE0abaeefC521Ec29D89eA42E64F37A6882E" as const], + ["0x596B11acAACF03217287939f88d63b51d3771704" as const, "0xD5b20708d8f0FcA52cb609938D0594C4e32E5DaD" as const], + ] as [Address, Address][], }, // win - "0x2e6af3f3f059f43d764060968658c9f3c8f9479d": { + ["0x2e6af3f3f059f43d764060968658c9f3c8f9479d" as const]: { core: undefined, - isolated: [["0x11537D023f489E4EF0C7157cc729C7B69CbE0c97", "0xEe543D5de2Dbb5b07675Fc72831A2f1812428393"]], + isolated: [ + ["0x11537D023f489E4EF0C7157cc729C7B69CbE0c97" as const, "0xEe543D5de2Dbb5b07675Fc72831A2f1812428393" as const], + ] as [Address, Address][], }, // XRP - "0x3022a32fdadb4f02281e8fab33e0a6811237aab0": { - core: "0x488aB2826a154da01CC4CC16A8C83d4720D3cA2C", + ["0x3022a32fdadb4f02281e8fab33e0a6811237aab0" as const]: { + core: "0x488aB2826a154da01CC4CC16A8C83d4720D3cA2C" as const, isolated: undefined, }, // bnbx - "0x327d6e6fac0228070884e913263cff9efed4a2c8": { + ["0x327d6e6fac0228070884e913263cff9efed4a2c8" as const]: { core: undefined, - isolated: [["0x596B11acAACF03217287939f88d63b51d3771704 ", "0x644A149853E5507AdF3e682218b8AC86cdD62951"]], + isolated: [ + ["0x596B11acAACF03217287939f88d63b51d3771704" as const, "0x644A149853E5507AdF3e682218b8AC86cdD62951" as const], + ] as [Address, Address][], }, // aave - "0x4b7268fc7c727b88c5fc127d41b491bfae63e144": { - core: "0x714db6c38A17883964B68a07d56cE331501d9eb6", + ["0x4b7268fc7c727b88c5fc127d41b491bfae63e144" as const]: { + core: "0x714db6c38A17883964B68a07d56cE331501d9eb6" as const, isolated: undefined, }, // planet - "0x52b4e1a2ba407813f829b4b3943a1e57768669a9": { + ["0x52b4e1a2ba407813f829b4b3943a1e57768669a9" as const]: { core: undefined, - isolated: [["0x23a73971A6B9f6580c048B9CB188869B2A2aA2aD ", "0xe237aA131E7B004aC88CB808Fa56AF3dc4C408f1"]], + isolated: [ + ["0x23a73971A6B9f6580c048B9CB188869B2A2aA2aD" as const, "0xe237aA131E7B004aC88CB808Fa56AF3dc4C408f1" as const], + ] as [Address, Address][], }, // ageur - "0x63061de4a25f24279aaab80400040684f92ee319": { + ["0x63061de4a25f24279aaab80400040684f92ee319" as const]: { core: undefined, - isolated: [["0x10b57706AD2345e590c2eA4DC02faef0d9f5b08B ", "0x4E1D35166776825402d50AfE4286c500027211D1"]], + isolated: [ + ["0x10b57706AD2345e590c2eA4DC02faef0d9f5b08B" as const, "0x4E1D35166776825402d50AfE4286c500027211D1" as const], + ] as [Address, Address][], }, // doge - "0x67d262ce2b8b846d9b94060bc04dc40a83f0e25b": { - core: "0xF912d3001CAf6DC4ADD366A62Cc9115B4303c9A9", + ["0x67d262ce2b8b846d9b94060bc04dc40a83f0e25b" as const]: { + core: "0xF912d3001CAf6DC4ADD366A62Cc9115B4303c9A9" as const, isolated: undefined, }, // alpaca - "0x6923189d91fdf62dbae623a55273f1d20306d9f2": { + ["0x6923189d91fdf62dbae623a55273f1d20306d9f2" as const]: { core: undefined, - isolated: [["0x23a73971A6B9f6580c048B9CB188869B2A2aA2aD", "0xb7caC5Ef82cb7f9197ee184779bdc52c5490C02a"]], + isolated: [ + ["0x23a73971A6B9f6580c048B9CB188869B2A2aA2aD" as const, "0xb7caC5Ef82cb7f9197ee184779bdc52c5490C02a" as const], + ] as [Address, Address][], }, // sxp - "0x75107940cf1121232c0559c747a986defbc69da9": { - core: "0x74469281310195A04840Daf6EdF576F559a3dE80", + ["0x75107940cf1121232c0559c747a986defbc69da9" as const]: { + core: "0x74469281310195A04840Daf6EdF576F559a3dE80" as const, isolated: undefined, }, // trx - "0x7d21841dc10ba1c5797951efc62fadbbdd06704b": { - core: "0x6AF3Fdb3282c5bb6926269Db10837fa8Aec67C04", - isolated: [["0x11537D023f489E4EF0C7157cc729C7B69CbE0c97", "0x410286c43a525E1DCC7468a9B091C111C8324cd1"]], + ["0x7d21841dc10ba1c5797951efc62fadbbdd06704b" as const]: { + core: "0x6AF3Fdb3282c5bb6926269Db10837fa8Aec67C04" as const, + isolated: [ + ["0x11537D023f489E4EF0C7157cc729C7B69CbE0c97" as const, "0x410286c43a525E1DCC7468a9B091C111C8324cd1" as const], + ] as [Address, Address][], }, // bsw - "0x7fcc76fc1f573d8eb445c236cc282246bc562bce": { + ["0x7fcc76fc1f573d8eb445c236cc282246bc562bce" as const]: { core: undefined, - isolated: [["0x23a73971A6B9f6580c048B9CB188869B2A2aA2aD", "0x5e68913fbbfb91af30366ab1B21324410b49a308"]], + isolated: [ + ["0x23a73971A6B9f6580c048B9CB188869B2A2aA2aD" as const, "0x5e68913fbbfb91af30366ab1B21324410b49a308" as const], + ] as [Address, Address][], }, // busd - "0x8301f2213c0eed49a7e28ae4c3e91722919b8b47": { - core: "0x08e0A5575De71037aE36AbfAfb516595fE68e5e4", + ["0x8301f2213c0eed49a7e28ae4c3e91722919b8b47" as const]: { + core: "0x08e0A5575De71037aE36AbfAfb516595fE68e5e4" as const, isolated: undefined, }, // uni - "0x8d2f061c75780d8d91c10a7230b907411acbc8fc": { - core: "0x171B468b52d7027F12cEF90cd065d6776a25E24e", + ["0x8d2f061c75780d8d91c10a7230b907411acbc8fc" as const]: { + core: "0x171B468b52d7027F12cEF90cd065d6776a25E24e" as const, isolated: undefined, }, // ltc - "0x969f147b6b8d81f86175de33206a4fd43df17913": { - core: "0xAfc13BC065ABeE838540823431055D2ea52eBA52", + ["0x969f147b6b8d81f86175de33206a4fd43df17913" as const]: { + core: "0xAfc13BC065ABeE838540823431055D2ea52eBA52" as const, isolated: undefined, }, // eth - "0x98f7a83361f7ac8765ccebab1425da6b341958a7": { - core: "0x162D005F0Fff510E54958Cfc5CF32A3180A84aab", + ["0x98f7a83361f7ac8765ccebab1425da6b341958a7" as const]: { + core: "0x162D005F0Fff510E54958Cfc5CF32A3180A84aab" as const, isolated: undefined, }, // btcb - "0xa808e341e8e723dc6ba0bb5204bafc2330d7b8e4": { - core: "0xb6e9322C49FD75a367Fcb17B0Fcd62C5070EbCBe", + ["0xa808e341e8e723dc6ba0bb5204bafc2330d7b8e4" as const]: { + core: "0xb6e9322C49FD75a367Fcb17B0Fcd62C5070EbCBe" as const, isolated: undefined, }, // wbnb - "0xae13d989dac2f0debff460ac112a837c89baa7cd": { + ["0xae13d989dac2f0debff460ac112a837c89baa7cd" as const]: { core: undefined, - isolated: [["0x596B11acAACF03217287939f88d63b51d3771704", "0x231dED0Dfc99634e52EE1a1329586bc970d773b3"]], + isolated: [ + ["0x596B11acAACF03217287939f88d63b51d3771704" as const, "0x231dED0Dfc99634e52EE1a1329586bc970d773b3" as const], + ] as [Address, Address][], }, // floki - "0xb22cf15fbc089d470f8e532aead2bab76be87c88": { + ["0xb22cf15fbc089d470f8e532aead2bab76be87c88" as const]: { core: undefined, - isolated: [["0x1F4f0989C51f12DAcacD4025018176711f3Bf289", "0xef470AbC365F88e4582D8027172a392C473A5B53"]], + isolated: [ + ["0x1F4f0989C51f12DAcacD4025018176711f3Bf289" as const, "0xef470AbC365F88e4582D8027172a392C473A5B53" as const], + ] as [Address, Address][], }, // tusd - "0xb32171ecd878607ffc4f8fc0bcce6852bb3149e0": { - core: "0xEFAACF73CE2D38ED40991f29E72B12C74bd4cf23", + ["0xb32171ecd878607ffc4f8fc0bcce6852bb3149e0" as const]: { + core: "0xEFAACF73CE2D38ED40991f29E72B12C74bd4cf23" as const, isolated: undefined, }, // twt - "0xb99c6b26fdf3678c6e2aff8466e3625a0e7182f8": { + ["0xb99c6b26fdf3678c6e2aff8466e3625a0e7182f8" as const]: { core: undefined, - isolated: [["0x23a73971A6B9f6580c048B9CB188869B2A2aA2aD", "0x4C94e67d239aD585275Fdd3246Ab82c8a2668564"]], + isolated: [ + ["0x23a73971A6B9f6580c048B9CB188869B2A2aA2aD" as const, "0x4C94e67d239aD585275Fdd3246Ab82c8a2668564" as const], + ] as [Address, Address][], }, // ada - "0xcd34bc54106bd45a04ed99ebcc2a6a3e70d7210f": { - core: "0xcd34bc54106bd45a04ed99ebcc2a6a3e70d7210f", + ["0xcd34bc54106bd45a04ed99ebcc2a6a3e70d7210f" as const]: { + core: "0xcd34bc54106bd45a04ed99ebcc2a6a3e70d7210f" as const, isolated: undefined, }, // fdusd - "0xcf27439fa231af9931ee40c4f27bb77b83826f3c": { - core: "0xF06e662a00796c122AaAE935EC4F0Be3F74f5636", + ["0xcf27439fa231af9931ee40c4f27bb77b83826f3c" as const]: { + core: "0xF06e662a00796c122AaAE935EC4F0Be3F74f5636" as const, isolated: undefined, }, // matic - "0xcfeb0103d4befa041ea4c2dacce7b3e83e1ae7e3": { - core: "0xcfeb0103d4befa041ea4c2dacce7b3e83e1ae7e3", + ["0xcfeb0103d4befa041ea4c2dacce7b3e83e1ae7e3" as const]: { + core: "0xcfeb0103d4befa041ea4c2dacce7b3e83e1ae7e3" as const, isolated: undefined, }, // snBNB - "0xd2af6a916bc77764dc63742bc30f71af4cf423f4": { + ["0xd2af6a916bc77764dc63742bc30f71af4cf423f4" as const]: { core: undefined, - isolated: [["0x596B11acAACF03217287939f88d63b51d3771704", "0xeffE7874C345aE877c1D893cd5160DDD359b24dA"]], + isolated: [ + ["0x596B11acAACF03217287939f88d63b51d3771704" as const, "0xeffE7874C345aE877c1D893cd5160DDD359b24dA" as const], + ] as [Address, Address][], }, // raca - "0xd60cc803d888a3e743f21d0bde4bf2cafdea1f26": { + ["0xd60cc803d888a3e743f21d0bde4bf2cafdea1f26" as const]: { core: undefined, - isolated: [["0x1F4f0989C51f12DAcacD4025018176711f3Bf289", "0x1958035231E125830bA5d17D168cEa07Bb42184a"]], + isolated: [ + ["0x1F4f0989C51f12DAcacD4025018176711f3Bf289" as const, "0x1958035231E125830bA5d17D168cEa07Bb42184a" as const], + ] as [Address, Address][], }, // ankr - "0xe4a90eb942cf2da7238e8f6cc9ef510c49fc8b4b": { + ["0xe4a90eb942cf2da7238e8f6cc9ef510c49fc8b4b" as const]: { core: undefined, - isolated: [["0x23a73971A6B9f6580c048B9CB188869B2A2aA2aD", "0xb677e080148368EeeE70fA3865d07E92c6500174"]], + isolated: [ + ["0x23a73971A6B9f6580c048B9CB188869B2A2aA2aD" as const, "0xb677e080148368EeeE70fA3865d07E92c6500174" as const], + ] as [Address, Address][], }, // hay - "0xe73774dfcd551bf75650772dc2cc56a2b6323453": { + ["0xe73774dfcd551bf75650772dc2cc56a2b6323453" as const]: { core: undefined, - isolated: [["0x10b57706AD2345e590c2eA4DC02faef0d9f5b08B", "0x170d3b2da05cc2124334240fB34ad1359e34C562"]], + isolated: [ + ["0x10b57706AD2345e590c2eA4DC02faef0d9f5b08B" as const, "0x170d3b2da05cc2124334240fB34ad1359e34C562" as const], + ] as [Address, Address][], }, // cake - "0xe8bd7ccc165faeb9b81569b05424771b9a20cbef": { - core: "0xeDaC03D29ff74b5fDc0CC936F6288312e1459BC6", + ["0xe8bd7ccc165faeb9b81569b05424771b9a20cbef" as const]: { + core: "0xeDaC03D29ff74b5fDc0CC936F6288312e1459BC6" as const, isolated: undefined, }, // btt - "0xe98344a7c691b200ef47c9b8829110087d832c64": { + ["0xe98344a7c691b200ef47c9b8829110087d832c64" as const]: { core: undefined, - isolated: [["0x11537D023f489E4EF0C7157cc729C7B69CbE0c97", "0x47793540757c6E6D84155B33cd8D9535CFdb9334"]], + isolated: [ + ["0x11537D023f489E4EF0C7157cc729C7B69CbE0c97" as const, "0x47793540757c6E6D84155B33cd8D9535CFdb9334" as const], + ] as [Address, Address][], }, // wbeth - "0xf9f98365566f4d55234f24b99caa1afbe6428d44": { - core: "0x35566ED3AF9E537Be487C98b1811cDf95ad0C32b", + ["0xf9f98365566f4d55234f24b99caa1afbe6428d44" as const]: { + core: "0x35566ED3AF9E537Be487C98b1811cDf95ad0C32b" as const, isolated: undefined, }, // tusdold - "0xfec3a63401eb9c1476200d7c32c4009be0154169": { - core: "0xfec3a63401eb9c1476200d7c32c4009be0154169", + ["0xfec3a63401eb9c1476200d7c32c4009be0154169" as const]: { + core: "0xfec3a63401eb9c1476200d7c32c4009be0154169" as const, isolated: undefined, }, // xvs - "0xb9e0e753630434d7863528cc73cb7ac638a7c8ff": { - core: "0x6d6F697e34145Bb95c54E77482d97cc261Dc237E", + ["0xb9e0e753630434d7863528cc73cb7ac638a7c8ff" as const]: { + core: "0x6d6F697e34145Bb95c54E77482d97cc261Dc237E" as const, isolated: undefined, }, }, diff --git a/src/converter-bot/index.ts b/src/converter-bot/index.ts index 4a82b843..580b2d57 100644 --- a/src/converter-bot/index.ts +++ b/src/converter-bot/index.ts @@ -1,5 +1,6 @@ -import * as dotenv from "dotenv"; -import { Abi, Address, parseUnits } from "viem"; +import "dotenv/config"; + +import { Abi, Address } from "viem"; import subgraphClient from "../../subgraph-client"; import { @@ -7,17 +8,20 @@ import { coreVTokenAbi, protocolShareReserveAbi, tokenConverterAbi, - vBnbAbi, vBnbAdminAbi, } from "../config/abis/generated"; import addresses, { underlyingToVTokens } from "../config/addresses"; import { SUPPORTED_CHAINS } from "../config/chains"; import { getPublicClient, getWalletClient } from "../config/clients"; +import TokenConverterBot from "./TokenConverterBot"; import formatTokenConverterConfigs from "./formatTokenConverterConfigs"; import { parsePath } from "./path"; -import TokenConverterBot from "./tokenConverterBot"; -dotenv.config(); +interface BalanceResult { + tokenConverter: Address; + assetIn: { address: Address; balance: bigint }; + assetOut: { address: Address; balance: bigint }; +} const network = process.env.FORKED_NETWORK as SUPPORTED_CHAINS; @@ -71,11 +75,8 @@ const getBalances = async (assetIn: Address, assetOut: Address, tokenConverters: contracts: [ { address: addresses.ProtocolShareReserve as Address, - // @ts-ignore abi: protocolShareReserveAbi, - // @ts-ignore functionName: "releaseFunds", - // @ts-ignore args: [addresses.Unitroller, corePoolMarkets], }, ...tokenConverters.reduce((acc, curr) => { @@ -103,40 +104,32 @@ const getBalances = async (assetIn: Address, assetOut: Address, tokenConverters: return formattedResults; }; -// @todo -const checkForTrade = async (values: any[]) => { +const checkForTrade = async (values: { value: BalanceResult }[]) => { const trades = values.filter(v => { return v.value.assetOut.balance > 0; }); return trades; }; -// @todo -const executeTrade = async (t: any) => { - // @todo - const bot = new TokenConverterBot("bsctestnet"); - // @ts-ignore +const executeTrade = async (t: BalanceResult) => { + const bot = new TokenConverterBot(network); + const vTokens = underlyingToVTokens[t.assetOut.address]; - // @ts-ignore + if (vTokens.core) { await wallet.writeContract({ address: addresses.ProtocolShareReserve as Address, - // @ts-ignore abi: protocolShareReserveAbi, - // @ts-ignore functionName: "releaseFunds", - // @ts-ignore args: [addresses.Unitroller, [vTokens.core]], }); } + if (vTokens.isolated) { await wallet.writeContract({ address: addresses.ProtocolShareReserve as Address, - // @ts-ignore abi: protocolShareReserveAbi, - // @ts-ignore functionName: "releaseFunds", - // @ts-ignore args: [vTokens.isolated[0], [vTokens.isolated[1]]], }); } @@ -150,12 +143,13 @@ const executeTrade = async (t: any) => { await bot.sanityCheck(); - await bot.arbitrage( - t.tokenConverter, - parsePath([t.assetIn.address as Address, 500n, t.assetOut.address as Address]), - amountIn[1], - parseUnits("-0.1", 18), // @todo - ); + const trade = await bot.getBestTrade(t.assetIn.address, t.assetOut.address, amountIn[1]); + + const fee = BigInt(trade.routes[0].pools[0].fee); + const flashPayment = trade.inputAmount.numerator * (fee / 100000n + 1n); + const minIncome = t.assetOut.balance - flashPayment; + const path = parsePath([t.assetIn.address, fee, t.assetOut.address]); + await bot.arbitrage(t.tokenConverter, path, amountIn[1], minIncome); }; const main = async () => { @@ -175,13 +169,13 @@ const main = async () => { const totalReserves = await client.readContract({ address: addresses.vBNB as Address, - abi: vBnbAbi, + abi: coreVTokenAbi, functionName: "totalReserves", }); const cash = await client.readContract({ address: addresses.vBNB as Address, - abi: vBnbAbi, + abi: coreVTokenAbi, functionName: "getCash", }); @@ -193,7 +187,7 @@ const main = async () => { args: [totalReserves < cash ? totalReserves : cash], }); } else { - console.error("Unable to reduce reservers vBnb Admin is out of cash"); + console.error("Unable to reduce reservers vBNB Admin is out of cash."); } const tokenConverterConfigs = formatTokenConverterConfigs(tokenConverters); diff --git a/src/converter-bot/tokenConverterBot.ts b/src/converter-bot/tokenConverterBot.ts index ad11e4fb..2aac7943 100644 --- a/src/converter-bot/tokenConverterBot.ts +++ b/src/converter-bot/tokenConverterBot.ts @@ -1,4 +1,8 @@ +import { Currency, CurrencyAmount, Token, TradeType } from "@pancakeswap/sdk"; +import { BaseRoute, Pool, QuoteProvider, SmartRouter, SmartRouterTrade, V3Pool } from "@pancakeswap/smart-router/evm"; +import { Client as UrqlClient, createClient } from "urql/core"; import { Address, parseAbi } from "viem"; +import { Hex, encodePacked } from "viem"; import { tokenConverterOperatorAbi } from "../config/abis/generated"; import addresses from "../config/addresses"; @@ -7,30 +11,42 @@ import { chains } from "../config/chains"; import { getPublicClient, getWalletClient } from "../config/clients"; import { Path } from "./path"; -type SupportedConverters = - | "BTCBPrimeConverter" - | "ETHPrimeConverter" - | "RiskFundConverter" - | "USDCPrimeConverter" - | "USDTPrimeConverter" - | "XVSVaultConverter"; - const REVERT_IF_NOT_MINED_AFTER = 60n; // seconds -class Bot { +export const NETWORK_IDS: Record = { + bsctestnet: 97, + bscmainnet: 56, +}; + +export const getOutputCurrency = (pool: V3Pool, inputToken: Token): Currency => { + const { token0, token1 } = pool; + return token0.equals(inputToken) ? token1 : token0; +}; + +export class TokenConverterBot { private chainName: SUPPORTED_CHAINS; private operator: { address: Address; abi: typeof tokenConverterOperatorAbi }; private addresses: typeof addresses; private _walletClient?: ReturnType; private _publicClient?: ReturnType; + private v3SubgraphClient: UrqlClient; + private quoteProvider: QuoteProvider; + private tokens: Map; constructor(chainName: SUPPORTED_CHAINS) { this.chainName = chainName; - this.addresses = addresses[chainName]; + // @ts-ignore + this.addresses = addresses; this.operator = { address: addresses.TokenConverterOperator, abi: tokenConverterOperatorAbi, }; + this.v3SubgraphClient = createClient({ + url: "https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc", + requestPolicy: "network-only", + }); + this.quoteProvider = SmartRouter.createQuoteProvider({ onChainProvider: () => this.publicClient }); + this.tokens = new Map(); } get publicClient() { @@ -41,6 +57,32 @@ class Bot { return (this._walletClient ||= getWalletClient(this.chainName)); } + getToken = async (address: Address): Promise => { + if (this.tokens.has(address)) { + return this.tokens.get(address) as Currency; + } + const [{ result: decimals }, { result: symbol }] = await this.publicClient.multicall({ + contracts: [ + { + address, + abi: parseAbi(["function decimals() external pure returns (uint8)"]), + functionName: "decimals", + }, + { + address, + abi: parseAbi(["function symbol() external pure returns (string memory)"]), + functionName: "symbol", + }, + ], + }); + if (decimals && symbol) { + const token = new Token(NETWORK_IDS[this.chainName], address, decimals, symbol); + this.tokens.set(address, token); + return token; + } + throw new Error(`Unable to fetch token details for ${address}`); + }; + async sanityCheck() { const expected = this.addresses.PancakeSwapRouter; const actual = await this.publicClient.readContract({ @@ -52,40 +94,119 @@ class Bot { } } - async arbitrage(converter: SupportedConverters, path: Path, amount: bigint, minIncome: bigint) { - const converterAddress = this.addresses[converter]; + async getBestTrade( + swapFrom: Address, + swapTo: Address, + amount: bigint, + ): Promise> { + const swapFromToken = await this.getToken(swapFrom); + const swapToToken = await this.getToken(swapTo); + const candidatePools = await SmartRouter.getV3CandidatePools({ + onChainProvider: () => this.publicClient, + subgraphProvider: () => this.v3SubgraphClient, + currencyA: swapFromToken, + currencyB: swapToToken, + }); + + const trade = await SmartRouter.getBestTrade( + CurrencyAmount.fromRawAmount(swapToToken, amount), + swapFromToken, + TradeType.EXACT_OUTPUT, + { + gasPriceWei: () => this.publicClient.getGasPrice(), + maxHops: 1, + + maxSplits: 0, + poolProvider: SmartRouter.createStaticPoolProvider(candidatePools), + quoteProvider: this.quoteProvider, + quoterOptimization: true, + }, + ); + + if (!trade) { + throw new Error("No trade found"); + } + + return trade as SmartRouterTrade; + } + + encodeExactOutputPath(route: BaseRoute): Hex { + const firstInputToken: Token = route.input.wrapped; + + const { path, types } = route.pools.reduce( + ( + // eslint-disable-next-line @typescript-eslint/no-shadow + { inputToken, path, types }: { inputToken: Token; path: (string | number)[]; types: string[] }, + pool_: Pool, + index: number, + ): { inputToken: Token; path: (string | number)[]; types: string[] } => { + if (!("fee" in pool_)) { + throw new Error("Undefined fee"); + } + const pool = pool_ as V3Pool; + const outputToken = getOutputCurrency(pool, inputToken).wrapped; + if (index === 0) { + return { + inputToken: outputToken, + types: ["address", "uint24", "address"], + path: [inputToken.address, pool.fee, outputToken.address], + }; + } + return { + inputToken: outputToken, + types: [...types, "uint24", "address"], + path: [...path, pool.fee, outputToken.address], + }; + }, + { inputToken: firstInputToken, path: [], types: [] }, + ); + + return encodePacked(types.reverse(), path.reverse()); + } + + async arbitrage(converterAddress: Address, path: Path, amount: bigint, minIncome: bigint) { const beneficiary = this.walletClient.account.address; const chain = chains[this.chainName]; + const block = await this.publicClient.getBlock(); + if (minIncome < 0n) { await this.walletClient.writeContract({ address: path.end, chain, abi: parseAbi(["function approve(address,uint256)"]), functionName: "approve", - args: [this.operator.address, -minIncome], + args: [this.operator.address, -minIncome], // + amount + }); + } + try { + await this.walletClient.writeContract({ + ...this.operator, + chain, + functionName: "convert", + args: [ + { + beneficiary, + tokenToReceiveFromConverter: path.end, + amount, + minIncome, + tokenToSendToConverter: path.start, + converter: converterAddress, + path: path.hex, + deadline: block.timestamp + REVERT_IF_NOT_MINED_AFTER, + }, + ], + }); + } catch (e) { + console.error("Conversion failed", { + converterAddress, + assetIn: path.start, + assetOut: path.end, + amount, + minIncome, }); } - - const block = await this.publicClient.getBlock(); - await this.walletClient.writeContract({ - ...this.operator, - chain, - functionName: "convert", - args: [ - { - beneficiary, - tokenToReceiveFromConverter: path.end, - amount, - minIncome, - tokenToSendToConverter: path.start, - converter: converterAddress, - path: path.hex, - deadline: block.timestamp + REVERT_IF_NOT_MINED_AFTER, - }, - ], - }); } } -export default Bot; +export default TokenConverterBot; diff --git a/src/module.d.ts b/src/module.d.ts new file mode 100644 index 00000000..c08d1934 --- /dev/null +++ b/src/module.d.ts @@ -0,0 +1,10 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-unused-vars */ +declare module "@pancakeswap/smart-router/evm" { + export type BaseRoute = any; + export type Pool = any; + export type QuoteProvider = any; + export const SmartRouter: any; + export type SmartRouterTrade = any; + export type V3Pool = any; +} diff --git a/tsconfig.json b/tsconfig.json index 3624dc9c..d0e9d3c0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,10 +7,11 @@ "outDir": "dist", "declaration": true, "resolveJsonModule": true, + "skipLibCheck": true, "paths": { "@nomiclabs/hardhat-ethers": ["./node_modules/hardhat-deploy-ethers"] } }, - "include": ["./typechain"], - "files": ["./hardhat.config.ts"] + "include": ["src", "./typechain", "./src/module.d.ts"], + "files": ["./hardhat.config.ts", "./src/module.d.ts"] } diff --git a/wagmi.config.ts b/wagmi.config.ts index 7b29b8e1..f06eae40 100644 --- a/wagmi.config.ts +++ b/wagmi.config.ts @@ -3,7 +3,6 @@ import poolLensArtifact from "@venusprotocol/isolated-pools/artifacts/contracts/ import protocolShareReserveArtifact from "@venusprotocol/protocol-reserve/artifacts/contracts/ProtocolReserve/ProtocolShareReserve.sol/ProtocolShareReserve.json" assert { type: "json" }; import tokenConverterArtifact from "@venusprotocol/protocol-reserve/artifacts/contracts/TokenConverter/AbstractTokenConverter.sol/AbstractTokenConverter.json" assert { type: "json" }; import vBnbAdminArtifact from "@venusprotocol/venus-protocol/artifacts/contracts/Admin/VBNBAdmin.sol/VBNBAdmin.json" assert { type: "json" }; -import vBNB from "@venusprotocol/venus-protocol/artifacts/contracts/Admin/VBNBAdminStorage.sol/VTokenInterface.json" assert { type: "json" }; import diamondComptrollerArtifact from "@venusprotocol/venus-protocol/artifacts/contracts/Comptroller/Diamond/DiamondConsolidated.sol/DiamondConsolidated.json" assert { type: "json" }; import coreVTokenArtifact from "@venusprotocol/venus-protocol/artifacts/contracts/Tokens/VTokens/VBep20Delegate.sol/VBep20Delegate.json" assert { type: "json" }; import { defineConfig } from "@wagmi/cli"; @@ -35,10 +34,6 @@ const getExternalContracts = async (): Promise<{ name: string; abi: Abi }[]> => abi: vBnbAdminArtifact.abi as Abi, name: "VBnbAdmin", }, - { - abi: vBNB.abi as Abi, - name: "vBNB", - }, { abi: tokenConverterArtifact.abi as Abi, name: "TokenConverter", diff --git a/yarn.lock b/yarn.lock index 6a8e3c14..f3f9f693 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3996,6 +3996,13 @@ __metadata: languageName: node linkType: hard +"@openzeppelin/contracts@npm:3.4.1-solc-0.7-2": + version: 3.4.1-solc-0.7-2 + resolution: "@openzeppelin/contracts@npm:3.4.1-solc-0.7-2" + checksum: 3608a4065f65946117caa543ef72477ce637bd5cc4f4853303b5f5b6c26516f8b50898ea3a8486e2877689cae81453ce22c72c8624c77c363c63f019b4086ffa + languageName: node + linkType: hard + "@openzeppelin/contracts@npm:3.4.2-solc-0.7": version: 3.4.2-solc-0.7 resolution: "@openzeppelin/contracts@npm:3.4.2-solc-0.7" @@ -4085,6 +4092,114 @@ __metadata: languageName: node linkType: hard +"@pancakeswap/chains@npm:0.4.0, @pancakeswap/chains@npm:^0.4.0": + version: 0.4.0 + resolution: "@pancakeswap/chains@npm:0.4.0" + checksum: c9f2a7023b850fadcaa46b54d15fba3172795a5b2f9f03c323fbe647fe990fdeb88a413b1775a503c5e93d6290634f5b2fb1046dec8ce5f4039e8e4769e56e68 + languageName: node + linkType: hard + +"@pancakeswap/multicall@npm:3.4.0": + version: 3.4.0 + resolution: "@pancakeswap/multicall@npm:3.4.0" + dependencies: + "@pancakeswap/chains": 0.4.0 + "@pancakeswap/sdk": 5.7.5 + viem: 1.19.11 + checksum: 3a7b2c6f448573fb535b19847178630fb9ace1b50c71e33ed3a60ef9170b46e8b726d0a3b9595e3b12c25f14dde50db4a74a83cea5dd70356b011c9b76c36b0a + languageName: node + linkType: hard + +"@pancakeswap/sdk@npm:5.7.5": + version: 5.7.5 + resolution: "@pancakeswap/sdk@npm:5.7.5" + dependencies: + "@pancakeswap/chains": ^0.4.0 + "@pancakeswap/swap-sdk-core": 1.0.0 + big.js: ^5.2.2 + decimal.js-light: ^2.5.0 + tiny-invariant: ^1.3.0 + tiny-warning: ^1.0.3 + toformat: ^2.0.0 + viem: 1.19.11 + checksum: dab0c4526753b1325da2c3d4ac56ce0269f5520a37fe0335040a92e11988f9608cb0627c7d73eec8b0c812524c77d980b2c8416c630d5105e491a6252c72f8a5 + languageName: node + linkType: hard + +"@pancakeswap/smart-router@npm:^4.14.1": + version: 4.14.1 + resolution: "@pancakeswap/smart-router@npm:4.14.1" + dependencies: + "@pancakeswap/chains": 0.4.0 + "@pancakeswap/multicall": 3.4.0 + "@pancakeswap/sdk": 5.7.5 + "@pancakeswap/swap-sdk-core": 1.0.0 + "@pancakeswap/token-lists": 0.0.9 + "@pancakeswap/tokens": 0.6.1 + "@pancakeswap/v3-sdk": 3.7.6 + async-retry: ^1.3.1 + debug: ^4.3.4 + graphql: ^16.8.1 + graphql-request: 5.0.0 + lodash: ^4.17.21 + mnemonist: ^0.38.3 + stats-lite: ^2.2.0 + tiny-invariant: ^1.3.0 + viem: 1.19.11 + zod: ^3.22.3 + checksum: 57a9dfb60a43ac773cbb3e1e603ab9c828418cb0a38355aa6cf8fbb35b38502e7217c37aacb414b719646735d1ed257a229ad666c45f0b939675f6916fbcbf75 + languageName: node + linkType: hard + +"@pancakeswap/swap-sdk-core@npm:1.0.0": + version: 1.0.0 + resolution: "@pancakeswap/swap-sdk-core@npm:1.0.0" + dependencies: + big.js: ^5.2.2 + decimal.js-light: ^2.5.0 + tiny-invariant: ^1.1.0 + tiny-warning: ^1.0.3 + toformat: ^2.0.0 + checksum: 522d52e5ba283214a17a4412a4b7f58e56c11d0eb81b7decac2459ac8a795a339d372f0bc4ae8e2aed30d60c1d30dadfd898f4f09b1b15b3d128b24bd1d26307 + languageName: node + linkType: hard + +"@pancakeswap/token-lists@npm:0.0.9": + version: 0.0.9 + resolution: "@pancakeswap/token-lists@npm:0.0.9" + dependencies: + "@pancakeswap/swap-sdk-core": 1.0.0 + ajv: ^6.12.3 + lodash: ^4.17.21 + peerDependencies: + "@reduxjs/toolkit": ^1.9.1 + jotai: ^2.4.3 + localforage: ^1.10.0 + react: ^18.2.0 + peerDependenciesMeta: + "@reduxjs/toolkit": + optional: true + jotai: + optional: true + localforage: + optional: true + react: + optional: true + checksum: a0709ee78bac16bf85e5764128ba2f410d6cbd0c82d4f6dbddde9cf8ab5e32075614003cded29593307ef352d4182d710e546db36053ac83449adb87d20a930a + languageName: node + linkType: hard + +"@pancakeswap/tokens@npm:0.6.1": + version: 0.6.1 + resolution: "@pancakeswap/tokens@npm:0.6.1" + dependencies: + "@pancakeswap/chains": 0.4.0 + "@pancakeswap/sdk": 5.7.5 + "@pancakeswap/token-lists": 0.0.9 + checksum: bfa5dfa1eba3c27c11e99e0616357e31008cf1f016e149c24b3ee1b79680d1384d611cd25a4c06bd7a41fe3d6080a7b1bc6fd4e09eed738c55c642a8e49cd988 + languageName: node + linkType: hard + "@pancakeswap/v3-core@npm:^1.0.2": version: 1.0.2 resolution: "@pancakeswap/v3-core@npm:1.0.2" @@ -4092,6 +4207,25 @@ __metadata: languageName: node linkType: hard +"@pancakeswap/v3-sdk@npm:3.7.6, @pancakeswap/v3-sdk@npm:^3.7.6": + version: 3.7.6 + resolution: "@pancakeswap/v3-sdk@npm:3.7.6" + dependencies: + "@pancakeswap/chains": 0.4.0 + "@pancakeswap/sdk": 5.7.5 + "@pancakeswap/swap-sdk-core": 1.0.0 + "@pancakeswap/tokens": 0.6.1 + "@uniswap/v3-staker": 1.0.0 + big.js: ^5.2.2 + decimal.js-light: ^2.5.0 + tiny-invariant: ^1.3.0 + tiny-warning: ^1.0.3 + toformat: ^2.0.0 + viem: 1.19.11 + checksum: 988e77686f191713f0952899de4112276723e8bc680eb150a69a4cebd67642a7d15060622dde8541a89c3dc732b8e7ae21e4bbe1c0de2b2a511f5d899935e174 + languageName: node + linkType: hard + "@peculiar/asn1-schema@npm:^2.3.8": version: 2.3.8 resolution: "@peculiar/asn1-schema@npm:2.3.8" @@ -4996,6 +5130,58 @@ __metadata: languageName: node linkType: hard +"@uniswap/lib@npm:^4.0.1-alpha": + version: 4.0.1-alpha + resolution: "@uniswap/lib@npm:4.0.1-alpha" + checksum: d7bbacccef40966af16c7e215ab085f575686d316b2802c9e1cfd03f7ad351970e547535670a28b2279c3cfcc4fb02888614c46f94efe2987af2309f3ec86127 + languageName: node + linkType: hard + +"@uniswap/v2-core@npm:^1.0.1": + version: 1.0.1 + resolution: "@uniswap/v2-core@npm:1.0.1" + checksum: eaa118fe45eac2e80b7468547ce2cde12bd3c8157555d2e40e0462a788c9506c6295247b511382da85e44a89ad92aff7bb3433b23bfbd2eeea23942ecd46e979 + languageName: node + linkType: hard + +"@uniswap/v3-core@npm:1.0.0": + version: 1.0.0 + resolution: "@uniswap/v3-core@npm:1.0.0" + checksum: 0e7654cfbf9885f1ca94446c3b220aeddb039af7892bc4ae94669512570ceefdf1ce6c2b0703396927d5a203d7c6c5ccaf8bd61426e52372aafb6ada64141055 + languageName: node + linkType: hard + +"@uniswap/v3-core@npm:^1.0.0": + version: 1.0.1 + resolution: "@uniswap/v3-core@npm:1.0.1" + checksum: 4bfd8b218391a3d9efde44e0f984cfec3bc25889cd4d1386766828521006e71b210a3583ee32b52f3c81d384af9e8c39f471f2229e9af4d50da6801446ecb3e4 + languageName: node + linkType: hard + +"@uniswap/v3-periphery@npm:^1.0.1": + version: 1.4.4 + resolution: "@uniswap/v3-periphery@npm:1.4.4" + dependencies: + "@openzeppelin/contracts": 3.4.2-solc-0.7 + "@uniswap/lib": ^4.0.1-alpha + "@uniswap/v2-core": ^1.0.1 + "@uniswap/v3-core": ^1.0.0 + base64-sol: 1.0.1 + checksum: 48b57f1f648cb002935421ac1770666ab3c0263885a03c769985b06501b88d513a435c8edc439b41ac5aef7ad40a11038a3561f7e828cce5ae6ec2c77742f1af + languageName: node + linkType: hard + +"@uniswap/v3-staker@npm:1.0.0": + version: 1.0.0 + resolution: "@uniswap/v3-staker@npm:1.0.0" + dependencies: + "@openzeppelin/contracts": 3.4.1-solc-0.7-2 + "@uniswap/v3-core": 1.0.0 + "@uniswap/v3-periphery": ^1.0.1 + checksum: 5a68e59f33d4761956ad735c8ce5ea6e566076bd260ea0a0bb4b3a0db237719e39f21a22eb0a5a231141efdf0154bfe03f690612d632898f33192b4442c888b3 + languageName: node + linkType: hard + "@urql/core@npm:^3.2.0": version: 3.2.2 resolution: "@urql/core@npm:3.2.2" @@ -5007,14 +5193,7 @@ __metadata: languageName: node linkType: hard -"@venusprotocol/governance-contracts@npm:^1.3.0": - version: 1.3.0 - resolution: "@venusprotocol/governance-contracts@npm:1.3.0" - checksum: 9cbc44e5fffd2f33e273c96e3f77b2d9afe254b3f8c22533eecb96f79011715afafd72f2a716bab5509164fa4f3e0629b94450f16619bba221d8d5a9e632b610 - languageName: node - linkType: hard - -"@venusprotocol/governance-contracts@npm:^1.4.0": +"@venusprotocol/governance-contracts@npm:^1.4.0, @venusprotocol/governance-contracts@npm:^1.4.0-dev.1": version: 1.4.0 resolution: "@venusprotocol/governance-contracts@npm:1.4.0" dependencies: @@ -5056,7 +5235,9 @@ __metadata: "@nomiclabs/hardhat-ethers": ^2.0.0 "@nomiclabs/hardhat-etherscan": ^3.0.3 "@openzeppelin/contracts-upgradeable": 4.9.3 + "@pancakeswap/smart-router": ^4.14.1 "@pancakeswap/v3-core": ^1.0.2 + "@pancakeswap/v3-sdk": ^3.7.6 "@semantic-release/changelog": ^6.0.3 "@semantic-release/git": ^10.0.1 "@semantic-release/npm": ^11.0.1 @@ -5070,7 +5251,7 @@ __metadata: "@typescript-eslint/parser": ^6.13.1 "@venusprotocol/governance-contracts": ^1.4.0 "@venusprotocol/isolated-pools": ^2.3.0 - "@venusprotocol/oracle": ^1.7.3 + "@venusprotocol/oracle": ^1.9.0 "@venusprotocol/protocol-reserve": ^1.4.0 "@venusprotocol/solidity-utilities": ^1.1.0 "@venusprotocol/venus-protocol": ^7.1.0 @@ -5104,58 +5285,66 @@ __metadata: languageName: unknown linkType: soft -"@venusprotocol/oracle@npm:^1.7.3": - version: 1.7.3 - resolution: "@venusprotocol/oracle@npm:1.7.3" +"@venusprotocol/oracle@npm:^1.9.0": + version: 1.9.0 + resolution: "@venusprotocol/oracle@npm:1.9.0" dependencies: "@chainlink/contracts": ^0.5.1 "@defi-wonderland/smock": ^2.3.4 "@nomicfoundation/hardhat-network-helpers": ^1.0.8 "@openzeppelin/contracts": ^4.6.0 "@openzeppelin/contracts-upgradeable": ^4.7.3 - "@venusprotocol/governance-contracts": ^1.3.0 - "@venusprotocol/venus-protocol": 0.7.0 + "@venusprotocol/governance-contracts": ^1.4.0 + "@venusprotocol/solidity-utilities": 1.3.0 + "@venusprotocol/venus-protocol": ^6.0.0 ethers: ^5.6.8 hardhat: ^2.16.1 hardhat-deploy: ^0.11.14 module-alias: ^2.2.2 solidity-docgen: ^0.6.0-beta.29 - checksum: 4187974f762fe1082db449acf2edd2d9d94feec76fab88a50d0eb5de44d12baf80381e365e71b2784c12a0e0941630c37b81d23cea01ec4b4a6f549a90457803 + checksum: 60995054e5cb3e970e940afa04e49cc06a8150584be5b777dc559766fef5e4e9ab1acbff1b9158c8e4241f45080dc576050373d1de57768868d1d16710f7469a languageName: node linkType: hard -"@venusprotocol/protocol-reserve@npm:^1.2.0": - version: 1.3.0 - resolution: "@venusprotocol/protocol-reserve@npm:1.3.0" +"@venusprotocol/protocol-reserve@npm:^1.1.0, @venusprotocol/protocol-reserve@npm:^1.4.0": + version: 1.4.0 + resolution: "@venusprotocol/protocol-reserve@npm:1.4.0" dependencies: "@nomiclabs/hardhat-ethers": ^2.2.3 "@openzeppelin/contracts": ^4.8.3 "@openzeppelin/contracts-upgradeable": ^4.8.3 "@openzeppelin/hardhat-upgrades": ^1.21.0 "@solidity-parser/parser": ^0.13.2 - "@venusprotocol/solidity-utilities": ^1.0.1 + "@venusprotocol/isolated-pools": ^2.3.0 + "@venusprotocol/solidity-utilities": ^1.3.0 ethers: ^5.7.0 hardhat-deploy: ^0.11.14 module-alias: ^2.2.2 - checksum: 6ada3414a988a5308590fedaf1ad13bd7f58fed3db68170ab0f07910607fe3aa6a1e954939fb68c022e847c2729e94253b1da36c32b6753d1752cc3f7c036560 + checksum: 6b9bc35ac7cdb2d828312c9ebcba1c55e3b63d6d8d237affa7b5baf94b5c2a86e296552c153a5c077f9b6178cc73c7fd20804126509a8a8670c5b50eeae41d2d languageName: node linkType: hard -"@venusprotocol/protocol-reserve@npm:^1.4.0": - version: 1.4.0 - resolution: "@venusprotocol/protocol-reserve@npm:1.4.0" +"@venusprotocol/protocol-reserve@npm:^1.2.0": + version: 1.3.0 + resolution: "@venusprotocol/protocol-reserve@npm:1.3.0" dependencies: "@nomiclabs/hardhat-ethers": ^2.2.3 "@openzeppelin/contracts": ^4.8.3 "@openzeppelin/contracts-upgradeable": ^4.8.3 "@openzeppelin/hardhat-upgrades": ^1.21.0 "@solidity-parser/parser": ^0.13.2 - "@venusprotocol/isolated-pools": ^2.3.0 - "@venusprotocol/solidity-utilities": ^1.3.0 + "@venusprotocol/solidity-utilities": ^1.0.1 ethers: ^5.7.0 hardhat-deploy: ^0.11.14 module-alias: ^2.2.2 - checksum: 6b9bc35ac7cdb2d828312c9ebcba1c55e3b63d6d8d237affa7b5baf94b5c2a86e296552c153a5c077f9b6178cc73c7fd20804126509a8a8670c5b50eeae41d2d + checksum: 6ada3414a988a5308590fedaf1ad13bd7f58fed3db68170ab0f07910607fe3aa6a1e954939fb68c022e847c2729e94253b1da36c32b6753d1752cc3f7c036560 + languageName: node + linkType: hard + +"@venusprotocol/solidity-utilities@npm:1.3.0, @venusprotocol/solidity-utilities@npm:^1.2.0, @venusprotocol/solidity-utilities@npm:^1.3.0": + version: 1.3.0 + resolution: "@venusprotocol/solidity-utilities@npm:1.3.0" + checksum: d1109365a5e01959c47b25fb129373db93792e60bf1bc0ed324b63c2a64f6e4a7878ebf016cfade94bc41a2c1245d3e861fdc6b8c5844ac210ed1d73e7307e72 languageName: node linkType: hard @@ -5166,13 +5355,6 @@ __metadata: languageName: node linkType: hard -"@venusprotocol/solidity-utilities@npm:^1.2.0, @venusprotocol/solidity-utilities@npm:^1.3.0": - version: 1.3.0 - resolution: "@venusprotocol/solidity-utilities@npm:1.3.0" - checksum: d1109365a5e01959c47b25fb129373db93792e60bf1bc0ed324b63c2a64f6e4a7878ebf016cfade94bc41a2c1245d3e861fdc6b8c5844ac210ed1d73e7307e72 - languageName: node - linkType: hard - "@venusprotocol/token-bridge@npm:1.0.0": version: 1.0.0 resolution: "@venusprotocol/token-bridge@npm:1.0.0" @@ -5188,15 +5370,18 @@ __metadata: languageName: node linkType: hard -"@venusprotocol/venus-protocol@npm:0.7.0": - version: 0.7.0 - resolution: "@venusprotocol/venus-protocol@npm:0.7.0" +"@venusprotocol/venus-protocol@npm:^6.0.0": + version: 6.0.0 + resolution: "@venusprotocol/venus-protocol@npm:6.0.0" dependencies: + "@openzeppelin/contracts": 4.9.3 "@openzeppelin/contracts-upgradeable": ^4.8.0 + "@venusprotocol/governance-contracts": ^1.4.0-dev.1 + "@venusprotocol/protocol-reserve": ^1.1.0 + bignumber.js: ^9.1.2 dotenv: ^16.0.1 - peerDependencies: - hardhat: ^2.10.1 - checksum: 9b3c4403799dd41ea282daf0333c46bc2e5ec6221a3616026eef3c715075ad013318624dae72f4bc6c635c954b1b0225eaf2b1cf066109d94ddb585f98e9f4aa + module-alias: ^2.2.2 + checksum: 2e819a464626233c24e566be21438f120378b617289e9646024b47859dc6fc7cb785c3af5e6b04fc1fe9a78aac73b98cb51014c48910db93ba6e4b9ff397c17e languageName: node linkType: hard @@ -5430,6 +5615,21 @@ __metadata: languageName: node linkType: hard +"abitype@npm:0.9.8": + version: 0.9.8 + resolution: "abitype@npm:0.9.8" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3 >=3.19.1 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: d7d887f29d6821e3f7a400de9620511b80ead3f85c5c87308aaec97965d3493e6687ed816e88722b4f512249bd66dee9e69231b49af0e1db8f69400a62c87cf6 + languageName: node + linkType: hard + "abitype@npm:^0.9.8": version: 0.9.10 resolution: "abitype@npm:0.9.10" @@ -5586,7 +5786,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.10.0, ajv@npm:^6.12.4, ajv@npm:^6.12.6": +"ajv@npm:^6.10.0, ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.6": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -5973,7 +6173,7 @@ __metadata: languageName: node linkType: hard -"async-retry@npm:^1.3.3": +"async-retry@npm:^1.3.1, async-retry@npm:^1.3.3": version: 1.3.3 resolution: "async-retry@npm:1.3.3" dependencies: @@ -6120,6 +6320,13 @@ __metadata: languageName: node linkType: hard +"base64-sol@npm:1.0.1": + version: 1.0.1 + resolution: "base64-sol@npm:1.0.1" + checksum: be0f9e8cf3c744256913223fbae8187773f530cc096e98a77f49ef0bd6cedeb294d15a784e439419f7cb99f07bf85b08999169feafafa1a9e29c3affc0bc6d0a + languageName: node + linkType: hard + "bech32@npm:1.1.4": version: 1.1.4 resolution: "bech32@npm:1.1.4" @@ -6134,6 +6341,13 @@ __metadata: languageName: node linkType: hard +"big.js@npm:^5.2.2": + version: 5.2.2 + resolution: "big.js@npm:5.2.2" + checksum: b89b6e8419b097a8fb4ed2399a1931a68c612bce3cfd5ca8c214b2d017531191070f990598de2fc6f3f993d91c0f08aa82697717f6b3b8732c9731866d233c9e + languageName: node + linkType: hard + "bigint-crypto-utils@npm:^3.0.23": version: 3.3.0 resolution: "bigint-crypto-utils@npm:3.3.0" @@ -7420,6 +7634,13 @@ __metadata: languageName: node linkType: hard +"decimal.js-light@npm:^2.5.0": + version: 2.5.1 + resolution: "decimal.js-light@npm:2.5.1" + checksum: f5a2c7eac1c4541c8ab8a5c8abea64fc1761cefc7794bd5f8afd57a8a78d1b51785e0c4e4f85f4895a043eaa90ddca1edc3981d1263eb6ddce60f32bf5fe66c9 + languageName: node + linkType: hard + "decompress-response@npm:^6.0.0": version: 6.0.0 resolution: "decompress-response@npm:6.0.0" @@ -8558,6 +8779,13 @@ __metadata: languageName: node linkType: hard +"extract-files@npm:^9.0.0": + version: 9.0.0 + resolution: "extract-files@npm:9.0.0" + checksum: c31781d090f8d8f62cc541f1023b39ea863f24bd6fb3d4011922d71cbded70cef8191f2b70b43ec6cb5c5907cdad1dc5e9f29f78228936c10adc239091d8ab64 + languageName: node + linkType: hard + "fast-base64-decode@npm:^1.0.0": version: 1.0.0 resolution: "fast-base64-decode@npm:1.0.0" @@ -8888,6 +9116,17 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^3.0.0": + version: 3.0.1 + resolution: "form-data@npm:3.0.1" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: b019e8d35c8afc14a2bd8a7a92fa4f525a4726b6d5a9740e8d2623c30e308fbb58dc8469f90415a856698933c8479b01646a9dff33c87cc4e76d72aedbbf860d + languageName: node + linkType: hard + "form-data@npm:^4.0.0": version: 4.0.0 resolution: "form-data@npm:4.0.0" @@ -9465,6 +9704,20 @@ __metadata: languageName: node linkType: hard +"graphql-request@npm:5.0.0": + version: 5.0.0 + resolution: "graphql-request@npm:5.0.0" + dependencies: + "@graphql-typed-document-node/core": ^3.1.1 + cross-fetch: ^3.1.5 + extract-files: ^9.0.0 + form-data: ^3.0.0 + peerDependencies: + graphql: 14 - 16 + checksum: 2e8900d10cded401b253a05650719321123e3b0ad5bc57523288892e0226dccf43668ec937753420084f649fb4e3f998f2547c884b746a3e91fa0a43f93e62d4 + languageName: node + linkType: hard + "graphql-tag@npm:^2.11.0": version: 2.12.6 resolution: "graphql-tag@npm:2.12.6" @@ -10705,6 +10958,13 @@ __metadata: languageName: node linkType: hard +"isnumber@npm:~1.0.0": + version: 1.0.0 + resolution: "isnumber@npm:1.0.0" + checksum: 245dba1670bc5b0e0e0788ca0231f05eaa2425586b22d5acc44add14ac8f025b12e1a346b3a069e0c194cd93c0c2bfe55820dba5582500a3f45f4212a667b7f3 + languageName: node + linkType: hard + "isomorphic-unfetch@npm:^3.0.0": version: 3.1.0 resolution: "isomorphic-unfetch@npm:3.1.0" @@ -12029,7 +12289,7 @@ __metadata: languageName: node linkType: hard -"mnemonist@npm:^0.38.0": +"mnemonist@npm:^0.38.0, mnemonist@npm:^0.38.3": version: 0.38.5 resolution: "mnemonist@npm:0.38.5" dependencies: @@ -14730,6 +14990,15 @@ __metadata: languageName: node linkType: hard +"stats-lite@npm:^2.2.0": + version: 2.2.0 + resolution: "stats-lite@npm:2.2.0" + dependencies: + isnumber: ~1.0.0 + checksum: ea153c195c48692b00bfbb04fd8760d30c161edf62be31dc3475554da1f22f362461fa953ca5465c6e7977a1b927bf8cb4b1df8230c43f6a8f48fe2c125c98eb + languageName: node + linkType: hard + "statuses@npm:2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" @@ -15146,6 +15415,13 @@ __metadata: languageName: node linkType: hard +"tiny-invariant@npm:^1.1.0, tiny-invariant@npm:^1.3.0": + version: 1.3.1 + resolution: "tiny-invariant@npm:1.3.1" + checksum: 872dbd1ff20a21303a2fd20ce3a15602cfa7fcf9b228bd694a52e2938224313b5385a1078cb667ed7375d1612194feaca81c4ecbe93121ca1baebe344de4f84c + languageName: node + linkType: hard + "tiny-lru@npm:^8.0.2": version: 8.0.2 resolution: "tiny-lru@npm:8.0.2" @@ -15160,6 +15436,13 @@ __metadata: languageName: node linkType: hard +"tiny-warning@npm:^1.0.3": + version: 1.0.3 + resolution: "tiny-warning@npm:1.0.3" + checksum: da62c4acac565902f0624b123eed6dd3509bc9a8d30c06e017104bedcf5d35810da8ff72864400ad19c5c7806fc0a8323c68baf3e326af7cb7d969f846100d71 + languageName: node + linkType: hard + "title-case@npm:^3.0.3": version: 3.0.3 resolution: "title-case@npm:3.0.3" @@ -15194,6 +15477,13 @@ __metadata: languageName: node linkType: hard +"toformat@npm:^2.0.0": + version: 2.0.0 + resolution: "toformat@npm:2.0.0" + checksum: c75341911a811a85c309e2c3eb8e9c7b60f26e2c629170179fc92ed339a2faf44433ebde75d4ac6dbe6f55a2aa044e1d4cd5242dbdd5e4c047babbe6defd8387 + languageName: node + linkType: hard + "toidentifier@npm:1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" @@ -15881,6 +16171,27 @@ __metadata: languageName: node linkType: hard +"viem@npm:1.19.11": + version: 1.19.11 + resolution: "viem@npm:1.19.11" + dependencies: + "@adraffy/ens-normalize": 1.10.0 + "@noble/curves": 1.2.0 + "@noble/hashes": 1.3.2 + "@scure/bip32": 1.3.2 + "@scure/bip39": 1.2.1 + abitype: 0.9.8 + isows: 1.0.3 + ws: 8.13.0 + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: 33a26f361bb2597fe0b02dc98382eb66b83473c3a9765833969a45ac7b4017fa62d7ddc42f9d4d0f3473bec7096eb081651851473b4d0ff4ab56f71a2f6378a2 + languageName: node + linkType: hard + "viem@npm:2.0.0": version: 2.0.0 resolution: "viem@npm:2.0.0" @@ -16381,7 +16692,7 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.21.4, zod@npm:^3.22.2": +"zod@npm:^3.21.4, zod@npm:^3.22.2, zod@npm:^3.22.3": version: 3.22.4 resolution: "zod@npm:3.22.4" checksum: 80bfd7f8039b24fddeb0718a2ec7c02aa9856e4838d6aa4864335a047b6b37a3273b191ef335bf0b2002e5c514ef261ffcda5a589fb084a48c336ffc4cdbab7f