From c47d1ed538b120abb78c991cb290abf4a2b37bf2 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Thu, 7 Sep 2023 11:19:48 +0300 Subject: [PATCH 001/225] update chain names --- package-lock.json | 4 ++-- package.json | 3 +-- src/config/chains.json | 10 +++++----- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb6ad22..51b0f73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.76", + "version": "0.19.80", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.76", + "version": "0.19.80", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 217796d..94c0ad8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.79", + "version": "0.19.80", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -114,4 +114,3 @@ "tsconfig-paths": "^4.0.0" } } - diff --git a/src/config/chains.json b/src/config/chains.json index 7fd6966..5514a3b 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -2,7 +2,7 @@ "1": { "chainId": "1", "explorer": "https://etherscan.io/", - "label": "Ethereum Mainnet", + "label": "Ethereum", "shortName": "ETH", "code": "eth", "rpc": "https://trade.orionprotocol.io/eth-mainnet/rpc", @@ -93,7 +93,7 @@ "250": { "chainId": "250", "explorer": "https://ftmscan.com/", - "label": "Fantom Mainnet", + "label": "Fantom", "shortName": "FTM", "code": "ftm", "rpc": "https://rpcapi.fantom.network/", @@ -105,7 +105,7 @@ }, "137": { "chainId": "137", - "label": "Polygon Mainnet", + "label": "Polygon", "shortName": "Polygon", "code": "polygon", "baseCurrencyName": "MATIC", @@ -132,7 +132,7 @@ "66": { "chainId": "66", "explorer": "https://www.oklink.com/okc/", - "label": "OKC Mainnet", + "label": "OKT Chain", "shortName": "OKC", "code": "okc", "rpc": "https://exchainrpc.okex.org/", @@ -168,4 +168,4 @@ "curveRegistry": "" } } -} \ No newline at end of file +} From 50dbdce57704d1dc6c5ee5c2d32413333ea6c507 Mon Sep 17 00:00:00 2001 From: Dmitriy Pavlov Date: Fri, 8 Sep 2023 11:13:46 +0300 Subject: [PATCH 002/225] add exchanges --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 94c0ad8..c3f1b30 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.80", + "version": "0.19.81-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index e96b992..9f5b83d 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -20,11 +20,18 @@ const exchangeToType: Partial> = { 'CHERRYSWAP': 'UniswapV2', 'OKXSWAP': 'UniswapV2', 'INTERNAL_POOL_V2': 'UniswapV2', - 'INTERNAL_POOL_V3': "OrionV3", - 'INTERNAL_POOL_V3_0_01': "OrionV3", - 'INTERNAL_POOL_V3_0_05': "OrionV3", - 'INTERNAL_POOL_V3_0_3': "OrionV3", - 'INTERNAL_POOL_V3_1_0': "OrionV3", + 'UniswapV3_0_05': 'UniswapV3', + 'UniswapV3_0_3': 'UniswapV3', + 'UniswapV3_1_0': 'UniswapV3', + 'INTERNAL_POOL_V3': 'OrionV3', + 'INTERNAL_POOL_V3_0_01': 'OrionV3', + 'INTERNAL_POOL_V3_0_05': 'OrionV3', + 'INTERNAL_POOL_V3_0_3': 'OrionV3', + 'INTERNAL_POOL_V3_1_0': 'OrionV3', + 'PancakeSwapV3_0_01': 'PancakeSwapV3', + 'PancakeSwapV3_0_05': 'PancakeSwapV3', + 'PancakeSwapV3_0_25': 'PancakeSwapV3', + 'PancakeSwapV3_1_0': 'PancakeSwapV3', 'CURVE': "Curve", 'CURVE_FACTORY': "Curve", } From c202f3523afee8a1912fc81a1b909e74cb1da1c8 Mon Sep 17 00:00:00 2001 From: Dmitriy Pavlov Date: Fri, 8 Sep 2023 11:16:21 +0300 Subject: [PATCH 003/225] add Factory --- src/Unit/Exchange/generateSwapCalldata.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 9f5b83d..9e652b3 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -9,7 +9,7 @@ import type { PromiseOrValue } from '@orionprotocol/contracts/lib/ethers-v5/comm const EXECUTOR_SWAP_FUNCTION = "func_70LYiww" -export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3" +export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3" | "PancakeSwapV3" const exchangeToType: Partial> = { 'SPOOKYSWAP': 'UniswapV2', From 4378286243ff90b613813310c1a37f3667a98320 Mon Sep 17 00:00:00 2001 From: Dmitriy Pavlov Date: Fri, 8 Sep 2023 11:35:06 +0300 Subject: [PATCH 004/225] update exchanges --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c3f1b30..4cd621f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.81-rc0", + "version": "0.19.81-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 9e652b3..b8c9a7b 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -28,10 +28,10 @@ const exchangeToType: Partial> = { 'INTERNAL_POOL_V3_0_05': 'OrionV3', 'INTERNAL_POOL_V3_0_3': 'OrionV3', 'INTERNAL_POOL_V3_1_0': 'OrionV3', - 'PancakeSwapV3_0_01': 'PancakeSwapV3', - 'PancakeSwapV3_0_05': 'PancakeSwapV3', - 'PancakeSwapV3_0_25': 'PancakeSwapV3', - 'PancakeSwapV3_1_0': 'PancakeSwapV3', + 'PANCAKESWAP_V3_0_01': 'PancakeSwapV3', + 'PANCAKESWAP_V3_0_05': 'PancakeSwapV3', + 'PANCAKESWAP_V3_0_25': 'PancakeSwapV3', + 'PANCAKESWAP_V3_1_0': 'PancakeSwapV3', 'CURVE': "Curve", 'CURVE_FACTORY': "Curve", } From 58add34a6c53097b82007accb687d3400e6642c2 Mon Sep 17 00:00:00 2001 From: Dmitriy Pavlov Date: Fri, 8 Sep 2023 12:11:32 +0300 Subject: [PATCH 005/225] add redirect pancake to uni --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 143 +++++++++++----------- 2 files changed, 72 insertions(+), 73 deletions(-) diff --git a/package.json b/package.json index 4cd621f..7c179e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.81-rc1", + "version": "0.19.81-rc2", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index b8c9a7b..1065f59 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -7,54 +7,55 @@ import type Unit from '../index.js'; import { simpleFetch } from 'simple-typed-fetch'; import type { PromiseOrValue } from '@orionprotocol/contracts/lib/ethers-v5/common.js'; -const EXECUTOR_SWAP_FUNCTION = "func_70LYiww" +const EXECUTOR_SWAP_FUNCTION = 'func_70LYiww' -export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3" | "PancakeSwapV3" +export type Factory = 'UniswapV2' | 'UniswapV3' | 'Curve' | 'OrionV2' | 'OrionV3' // | 'PancakeSwapV3' const exchangeToType: Partial> = { - 'SPOOKYSWAP': 'UniswapV2', - 'PANCAKESWAP': 'UniswapV2', - 'UNISWAP': 'UniswapV2', - 'QUICKSWAP': 'UniswapV2', - 'ORION_POOL': 'UniswapV2', - 'CHERRYSWAP': 'UniswapV2', - 'OKXSWAP': 'UniswapV2', - 'INTERNAL_POOL_V2': 'UniswapV2', - 'UniswapV3_0_05': 'UniswapV3', - 'UniswapV3_0_3': 'UniswapV3', - 'UniswapV3_1_0': 'UniswapV3', - 'INTERNAL_POOL_V3': 'OrionV3', - 'INTERNAL_POOL_V3_0_01': 'OrionV3', - 'INTERNAL_POOL_V3_0_05': 'OrionV3', - 'INTERNAL_POOL_V3_0_3': 'OrionV3', - 'INTERNAL_POOL_V3_1_0': 'OrionV3', - 'PANCAKESWAP_V3_0_01': 'PancakeSwapV3', - 'PANCAKESWAP_V3_0_05': 'PancakeSwapV3', - 'PANCAKESWAP_V3_0_25': 'PancakeSwapV3', - 'PANCAKESWAP_V3_1_0': 'PancakeSwapV3', - 'CURVE': "Curve", - 'CURVE_FACTORY': "Curve", + SPOOKYSWAP: 'UniswapV2', + PANCAKESWAP: 'UniswapV2', + UNISWAP: 'UniswapV2', + QUICKSWAP: 'UniswapV2', + ORION_POOL: 'UniswapV2', + CHERRYSWAP: 'UniswapV2', + OKXSWAP: 'UniswapV2', + INTERNAL_POOL_V2: 'UniswapV2', + UniswapV3_0_05: 'UniswapV3', + UniswapV3_0_3: 'UniswapV3', + UniswapV3_1_0: 'UniswapV3', + INTERNAL_POOL_V3: 'OrionV3', + INTERNAL_POOL_V3_0_01: 'OrionV3', + INTERNAL_POOL_V3_0_05: 'OrionV3', + INTERNAL_POOL_V3_0_3: 'OrionV3', + INTERNAL_POOL_V3_1_0: 'OrionV3', + // TODO: add PancakeSwapV3 factory + PANCAKESWAP_V3_0_01: 'UniswapV3', + PANCAKESWAP_V3_0_05: 'UniswapV3', + PANCAKESWAP_V3_0_25: 'UniswapV3', + PANCAKESWAP_V3_1_0: 'UniswapV3', + CURVE: 'Curve', + CURVE_FACTORY: 'Curve', } export type SwapInfo = { - pool: string, - assetIn: string, - assetOut: string, + pool: string + assetIn: string + assetOut: string factory: string } export type CallParams = { - isMandatory?: boolean, - target?: string, - gaslimit?: BigNumber, + isMandatory?: boolean + target?: string + gaslimit?: BigNumber value?: BigNumber } export type GenerateSwapCalldataParams = { - amount: BigNumberish, - minReturnAmount: BigNumberish, - receiverAddress: string, - path: ArrayLike, + amount: BigNumberish + minReturnAmount: BigNumberish + receiverAddress: string + path: ArrayLike unit: Unit } @@ -67,28 +68,28 @@ export default async function generateSwapCalldata({ }: GenerateSwapCalldataParams ): Promise<{ calldata: string, swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct }> { if (path_ == undefined || path_.length == 0) { - throw new Error(`Empty path`); + throw new Error('Empty path'); } - const wethAddress = safeGet(unit.contracts, "WETH") - const curveRegistryAddress = safeGet(unit.contracts, "curveRegistry") + const wethAddress = safeGet(unit.contracts, 'WETH') + const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); let path = SafeArray.from(path_).map((swapInfo) => { swapInfo.assetIn = safeGet(assetToAddress, swapInfo.assetIn); swapInfo.assetOut = safeGet(assetToAddress, swapInfo.assetOut); - return swapInfo; + return swapInfo; }) const factory = path.first().factory if (!path.every(swapInfo => swapInfo.factory === factory)) { - throw new Error(`Supporting only swaps with single factory`); + throw new Error('Supporting only swaps with single factory'); } - + const swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct = { srcToken: path.first().assetIn, dstToken: path.last().assetOut, srcReceiver: swapExecutorContractAddress ?? '', dstReceiver: receiverAddress, - amount: amount, - minReturnAmount: minReturnAmount, + amount, + minReturnAmount, flags: 0 } @@ -108,29 +109,28 @@ export default async function generateSwapCalldata({ if (swapInfo.assetOut == ethers.constants.AddressZero) swapInfo.assetOut = wethAddress return swapInfo; }); - let calldata: string switch (exchangeToType[factory]) { - case "OrionV2": { + case 'OrionV2': { swapDescription.srcReceiver = path.first().pool calldata = await generateUni2Calls(exchangeContractAddress, path); break; } - case "UniswapV2": { + case 'UniswapV2': { swapDescription.srcReceiver = path.first().pool calldata = await generateUni2Calls(exchangeContractAddress, path); break; } - case "UniswapV3": { + case 'UniswapV3': { calldata = await generateUni3Calls(amountNativeDecimals, exchangeContractAddress, path, unit.provider) break; } - case "OrionV3": { + case 'OrionV3': { calldata = await generateOrion3Calls(amountNativeDecimals, exchangeContractAddress, path, unit.provider) break; } - case "Curve": { + case 'Curve': { calldata = await generateCurveStableSwapCalls( amountNativeDecimals, exchangeContractAddress, @@ -159,26 +159,26 @@ export async function generateUni2Calls( const currentSwap = path.get(i) const nextSwap = path.get(i + 1) - const calldata = executorInterface.encodeFunctionData("swapUniV2", [ + const calldata = executorInterface.encodeFunctionData('swapUniV2', [ currentSwap.pool, currentSwap.assetIn, currentSwap.assetOut, - defaultAbiCoder.encode(["uint256"], [concat(["0x03", nextSwap.pool])]), + defaultAbiCoder.encode(['uint256'], [concat(['0x03', nextSwap.pool])]), ] ) calls.push(addCallParams(calldata)) } } const lastSwap = path.last(); - const calldata = executorInterface.encodeFunctionData("swapUniV2", [ + const calldata = executorInterface.encodeFunctionData('swapUniV2', [ lastSwap.pool, lastSwap.assetIn, lastSwap.assetOut, - defaultAbiCoder.encode(["uint256"], [concat(["0x03", exchangeAddress])]), + defaultAbiCoder.encode(['uint256'], [concat(['0x03', exchangeAddress])]), ]) calls.push(addCallParams(calldata)) - return generateCalls(calls) + return await generateCalls(calls) } async function generateUni3Calls( @@ -194,20 +194,20 @@ async function generateUni3Calls( const zeroForOne = token0.toLowerCase() === swap.assetIn.toLowerCase() const unwrapWETH = swap.assetOut === ethers.constants.AddressZero - let encodedPool = ethers.utils.solidityPack(["uint256"], [pool.address]) + let encodedPool = ethers.utils.solidityPack(['uint256'], [pool.address]) encodedPool = ethers.utils.hexDataSlice(encodedPool, 1) let firstByte = 0 if (unwrapWETH) firstByte += 32 if (!zeroForOne) firstByte += 128 - const encodedFirstByte = ethers.utils.solidityPack(["uint8"], [firstByte]) + const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) encodedPool = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, encodedPool])) encodedPools.push(encodedPool) } const executorInterface = SwapExecutor__factory.createInterface() - let calldata = executorInterface.encodeFunctionData("uniswapV3SwapTo", [encodedPools, exchangeContractAddress, amount]) + let calldata = executorInterface.encodeFunctionData('uniswapV3SwapTo', [encodedPools, exchangeContractAddress, amount]) calldata = addCallParams(calldata) - return generateCalls([calldata]) + return await generateCalls([calldata]) } async function generateOrion3Calls( @@ -223,20 +223,20 @@ async function generateOrion3Calls( const zeroForOne = token0.toLowerCase() === swap.assetIn.toLowerCase() const unwrapWETH = swap.assetOut === ethers.constants.AddressZero - let encodedPool = ethers.utils.solidityPack(["uint256"], [pool.address]) + let encodedPool = ethers.utils.solidityPack(['uint256'], [pool.address]) encodedPool = ethers.utils.hexDataSlice(encodedPool, 1) let firstByte = 0 if (unwrapWETH) firstByte += 32 if (!zeroForOne) firstByte += 128 - const encodedFirstByte = ethers.utils.solidityPack(["uint8"], [firstByte]) + const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) encodedPool = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, encodedPool])) encodedPools.push(encodedPool) } const executorInterface = SwapExecutor__factory.createInterface() - let calldata = executorInterface.encodeFunctionData("orionV3SwapTo", [encodedPools, exchangeContractAddress, amount]) + let calldata = executorInterface.encodeFunctionData('orionV3SwapTo', [encodedPools, exchangeContractAddress, amount]) calldata = addCallParams(calldata) - return generateCalls([calldata]) + return await generateCalls([calldata]) } async function generateCurveStableSwapCalls( @@ -248,7 +248,7 @@ async function generateCurveStableSwapCalls( curveRegistry: string ) { if (path.length > 1) { - throw new Error("Supporting only single stable swap on curve") + throw new Error('Supporting only single stable swap on curve') } const executorInterface = SwapExecutor__factory.createInterface() const registry = CurveRegistry__factory.connect(curveRegistry, provider) @@ -262,7 +262,7 @@ async function generateCurveStableSwapCalls( const calls: BytesLike[] = [] if (executorAllowance.lt(amount)) { const calldata = addCallParams( - executorInterface.encodeFunctionData("safeApprove", [ + executorInterface.encodeFunctionData('safeApprove', [ swap.assetIn, swap.pool, ethers.constants.MaxUint256 @@ -270,7 +270,7 @@ async function generateCurveStableSwapCalls( ) calls.push(calldata) } - let calldata = executorInterface.encodeFunctionData("curveSwapStableAmountIn", [ + let calldata = executorInterface.encodeFunctionData('curveSwapStableAmountIn', [ pool, assetOut, i, @@ -282,7 +282,7 @@ async function generateCurveStableSwapCalls( calldata = addCallParams(calldata) calls.push(calldata) - return generateCalls(calls) + return await generateCalls(calls) } // Adds additional byte to single swap with settings @@ -292,31 +292,30 @@ function addCallParams( ) { let firstByte = 0 if (callParams) { - if (callParams.value !== undefined) { + if (callParams.value !== undefined) { firstByte += 16 // 00010000 - const encodedValue = ethers.utils.solidityPack(["uint128"], [callParams.value]) + const encodedValue = ethers.utils.solidityPack(['uint128'], [callParams.value]) calldata = ethers.utils.hexlify(ethers.utils.concat([encodedValue, calldata])) } if (callParams.target !== undefined) { firstByte += 32 // 00100000 - const encodedAddress = ethers.utils.solidityPack(["address"], [callParams.target]) + const encodedAddress = ethers.utils.solidityPack(['address'], [callParams.target]) calldata = ethers.utils.hexlify(ethers.utils.concat([encodedAddress, calldata])) } if (callParams.gaslimit !== undefined) { firstByte += 64 // 01000000 - const encodedGaslimit = ethers.utils.solidityPack(["uint32"], [callParams.gaslimit]) + const encodedGaslimit = ethers.utils.solidityPack(['uint32'], [callParams.gaslimit]) calldata = ethers.utils.hexlify(ethers.utils.concat([encodedGaslimit, calldata])) } if (callParams.isMandatory !== undefined) firstByte += 128 // 10000000 } - const encodedFirstByte = ethers.utils.solidityPack(["uint8"], [firstByte]) + const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) calldata = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, calldata])) return calldata } - async function generateCalls(calls: BytesLike[]) { const executorInterface = SwapExecutor__factory.createInterface() - return "0x" + executorInterface.encodeFunctionData(EXECUTOR_SWAP_FUNCTION, [ethers.constants.AddressZero, calls]).slice(74) + return '0x' + executorInterface.encodeFunctionData(EXECUTOR_SWAP_FUNCTION, [ethers.constants.AddressZero, calls]).slice(74) } From 1538c74c488d066bd9c63e8ae2bbebabbe115d04 Mon Sep 17 00:00:00 2001 From: Dmitriy Pavlov Date: Fri, 8 Sep 2023 12:28:24 +0300 Subject: [PATCH 006/225] mock PancakeSwapV3 generateCall function --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 50 +++++++++++++++++++---- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 7c179e9..8abde0a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.81-rc2", + "version": "0.19.81-rc3", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 1065f59..d306be0 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -9,7 +9,7 @@ import type { PromiseOrValue } from '@orionprotocol/contracts/lib/ethers-v5/comm const EXECUTOR_SWAP_FUNCTION = 'func_70LYiww' -export type Factory = 'UniswapV2' | 'UniswapV3' | 'Curve' | 'OrionV2' | 'OrionV3' // | 'PancakeSwapV3' +export type Factory = 'UniswapV2' | 'UniswapV3' | 'Curve' | 'OrionV2' | 'OrionV3' | 'PancakeSwapV3' const exchangeToType: Partial> = { SPOOKYSWAP: 'UniswapV2', @@ -28,11 +28,10 @@ const exchangeToType: Partial> = { INTERNAL_POOL_V3_0_05: 'OrionV3', INTERNAL_POOL_V3_0_3: 'OrionV3', INTERNAL_POOL_V3_1_0: 'OrionV3', - // TODO: add PancakeSwapV3 factory - PANCAKESWAP_V3_0_01: 'UniswapV3', - PANCAKESWAP_V3_0_05: 'UniswapV3', - PANCAKESWAP_V3_0_25: 'UniswapV3', - PANCAKESWAP_V3_1_0: 'UniswapV3', + PANCAKESWAP_V3_0_01: 'PancakeSwapV3', + PANCAKESWAP_V3_0_05: 'PancakeSwapV3', + PANCAKESWAP_V3_0_25: 'PancakeSwapV3', + PANCAKESWAP_V3_1_0: 'PancakeSwapV3', CURVE: 'Curve', CURVE_FACTORY: 'Curve', } @@ -86,7 +85,7 @@ export default async function generateSwapCalldata({ const swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct = { srcToken: path.first().assetIn, dstToken: path.last().assetOut, - srcReceiver: swapExecutorContractAddress ?? '', + srcReceiver: swapExecutorContractAddress, dstReceiver: receiverAddress, amount, minReturnAmount, @@ -134,13 +133,17 @@ export default async function generateSwapCalldata({ calldata = await generateCurveStableSwapCalls( amountNativeDecimals, exchangeContractAddress, - swapExecutorContractAddress ?? '', + swapExecutorContractAddress, path, unit.provider, curveRegistryAddress ); break; } + case 'PancakeSwapV3': { + calldata = await generatePancake3Calls(amountNativeDecimals, exchangeContractAddress, path, unit.provider) + break; + } default: { throw new Error(`Factory ${factory} is not supported`) } @@ -210,6 +213,37 @@ async function generateUni3Calls( return await generateCalls([calldata]) } +async function generatePancake3Calls( + amount: BigNumberish, + exchangeContractAddress: string, + path: SafeArray, + provider: ethers.providers.JsonRpcProvider +) { + const encodedPools: BytesLike[] = [] + for (const swap of path) { + // TODO: change to PancakeV3Pool__factory + const pool = UniswapV3Pool__factory.connect(swap.pool, provider) + const token0 = await pool.token0() + const zeroForOne = token0.toLowerCase() === swap.assetIn.toLowerCase() + const unwrapWETH = swap.assetOut === ethers.constants.AddressZero + + let encodedPool = ethers.utils.solidityPack(['uint256'], [pool.address]) + encodedPool = ethers.utils.hexDataSlice(encodedPool, 1) + let firstByte = 0 + if (unwrapWETH) firstByte += 32 + if (!zeroForOne) firstByte += 128 + const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) + encodedPool = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, encodedPool])) + encodedPools.push(encodedPool) + } + const executorInterface = SwapExecutor__factory.createInterface() + // TODO: change to pancakeV3SwapTo + let calldata = executorInterface.encodeFunctionData('uniswapV3SwapTo', [encodedPools, exchangeContractAddress, amount]) + calldata = addCallParams(calldata) + + return await generateCalls([calldata]) +} + async function generateOrion3Calls( amount: BigNumberish, exchangeContractAddress: string, From 3a44ea7a62110cdddad5afa211836c40ce8a3b70 Mon Sep 17 00:00:00 2001 From: Dmitriy Pavlov Date: Fri, 8 Sep 2023 12:56:12 +0300 Subject: [PATCH 007/225] add uniswapv3 exchange --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 8abde0a..cc90874 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.81-rc3", + "version": "0.19.81-rc4", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index d306be0..3226f1d 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -20,6 +20,7 @@ const exchangeToType: Partial> = { CHERRYSWAP: 'UniswapV2', OKXSWAP: 'UniswapV2', INTERNAL_POOL_V2: 'UniswapV2', + UniswapV3: 'UniswapV3', UniswapV3_0_05: 'UniswapV3', UniswapV3_0_3: 'UniswapV3', UniswapV3_1_0: 'UniswapV3', @@ -28,10 +29,6 @@ const exchangeToType: Partial> = { INTERNAL_POOL_V3_0_05: 'OrionV3', INTERNAL_POOL_V3_0_3: 'OrionV3', INTERNAL_POOL_V3_1_0: 'OrionV3', - PANCAKESWAP_V3_0_01: 'PancakeSwapV3', - PANCAKESWAP_V3_0_05: 'PancakeSwapV3', - PANCAKESWAP_V3_0_25: 'PancakeSwapV3', - PANCAKESWAP_V3_1_0: 'PancakeSwapV3', CURVE: 'Curve', CURVE_FACTORY: 'Curve', } @@ -140,10 +137,6 @@ export default async function generateSwapCalldata({ ); break; } - case 'PancakeSwapV3': { - calldata = await generatePancake3Calls(amountNativeDecimals, exchangeContractAddress, path, unit.provider) - break; - } default: { throw new Error(`Factory ${factory} is not supported`) } From a30688d4625173a20ff96a07d983da10f1c2bd06 Mon Sep 17 00:00:00 2001 From: Dmitriy Pavlov Date: Fri, 8 Sep 2023 13:24:20 +0300 Subject: [PATCH 008/225] return swapExecutorContractAddress --- src/Unit/Exchange/generateSwapCalldata.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 3226f1d..bea0418 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -82,7 +82,7 @@ export default async function generateSwapCalldata({ const swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct = { srcToken: path.first().assetIn, dstToken: path.last().assetOut, - srcReceiver: swapExecutorContractAddress, + srcReceiver: swapExecutorContractAddress ?? '', dstReceiver: receiverAddress, amount, minReturnAmount, @@ -130,7 +130,7 @@ export default async function generateSwapCalldata({ calldata = await generateCurveStableSwapCalls( amountNativeDecimals, exchangeContractAddress, - swapExecutorContractAddress, + swapExecutorContractAddress ?? '', path, unit.provider, curveRegistryAddress From ebf768b67ebbe1105cf0ba325a082dcaf6357831 Mon Sep 17 00:00:00 2001 From: Dmitriy Pavlov Date: Fri, 8 Sep 2023 13:28:17 +0300 Subject: [PATCH 009/225] remove generatePancake3Calls --- src/Unit/Exchange/generateSwapCalldata.ts | 31 ----------------------- 1 file changed, 31 deletions(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index bea0418..d17a87e 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -206,37 +206,6 @@ async function generateUni3Calls( return await generateCalls([calldata]) } -async function generatePancake3Calls( - amount: BigNumberish, - exchangeContractAddress: string, - path: SafeArray, - provider: ethers.providers.JsonRpcProvider -) { - const encodedPools: BytesLike[] = [] - for (const swap of path) { - // TODO: change to PancakeV3Pool__factory - const pool = UniswapV3Pool__factory.connect(swap.pool, provider) - const token0 = await pool.token0() - const zeroForOne = token0.toLowerCase() === swap.assetIn.toLowerCase() - const unwrapWETH = swap.assetOut === ethers.constants.AddressZero - - let encodedPool = ethers.utils.solidityPack(['uint256'], [pool.address]) - encodedPool = ethers.utils.hexDataSlice(encodedPool, 1) - let firstByte = 0 - if (unwrapWETH) firstByte += 32 - if (!zeroForOne) firstByte += 128 - const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) - encodedPool = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, encodedPool])) - encodedPools.push(encodedPool) - } - const executorInterface = SwapExecutor__factory.createInterface() - // TODO: change to pancakeV3SwapTo - let calldata = executorInterface.encodeFunctionData('uniswapV3SwapTo', [encodedPools, exchangeContractAddress, amount]) - calldata = addCallParams(calldata) - - return await generateCalls([calldata]) -} - async function generateOrion3Calls( amount: BigNumberish, exchangeContractAddress: string, From 1f9838e48d799b0a959258e1854b278dbd5f2c30 Mon Sep 17 00:00:00 2001 From: Dmitriy Pavlov Date: Fri, 8 Sep 2023 13:41:31 +0300 Subject: [PATCH 010/225] remove exchangeToType map --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 208 +++++++++++----------- 2 files changed, 104 insertions(+), 106 deletions(-) diff --git a/package.json b/package.json index cc90874..bf9a863 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.81-rc4", + "version": "0.19.81-rc5", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index d17a87e..be0534e 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -7,67 +7,63 @@ import type Unit from '../index.js'; import { simpleFetch } from 'simple-typed-fetch'; import type { PromiseOrValue } from '@orionprotocol/contracts/lib/ethers-v5/common.js'; -const EXECUTOR_SWAP_FUNCTION = 'func_70LYiww' +const EXECUTOR_SWAP_FUNCTION = "func_70LYiww" -export type Factory = 'UniswapV2' | 'UniswapV3' | 'Curve' | 'OrionV2' | 'OrionV3' | 'PancakeSwapV3' +// export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3" -const exchangeToType: Partial> = { - SPOOKYSWAP: 'UniswapV2', - PANCAKESWAP: 'UniswapV2', - UNISWAP: 'UniswapV2', - QUICKSWAP: 'UniswapV2', - ORION_POOL: 'UniswapV2', - CHERRYSWAP: 'UniswapV2', - OKXSWAP: 'UniswapV2', - INTERNAL_POOL_V2: 'UniswapV2', - UniswapV3: 'UniswapV3', - UniswapV3_0_05: 'UniswapV3', - UniswapV3_0_3: 'UniswapV3', - UniswapV3_1_0: 'UniswapV3', - INTERNAL_POOL_V3: 'OrionV3', - INTERNAL_POOL_V3_0_01: 'OrionV3', - INTERNAL_POOL_V3_0_05: 'OrionV3', - INTERNAL_POOL_V3_0_3: 'OrionV3', - INTERNAL_POOL_V3_1_0: 'OrionV3', - CURVE: 'Curve', - CURVE_FACTORY: 'Curve', -} +/* const exchangeToType: Partial> = { + 'SPOOKYSWAP': 'UniswapV2', + 'PANCAKESWAP': 'UniswapV2', + 'UNISWAP': 'UniswapV2', + 'QUICKSWAP': 'UniswapV2', + 'ORION_POOL': 'UniswapV2', + 'CHERRYSWAP': 'UniswapV2', + 'OKXSWAP': 'UniswapV2', + 'INTERNAL_POOL_V2': 'UniswapV2', + 'INTERNAL_POOL_V3': "OrionV3", + 'INTERNAL_POOL_V3_0_01': "OrionV3", + 'INTERNAL_POOL_V3_0_05': "OrionV3", + 'INTERNAL_POOL_V3_0_3': "OrionV3", + 'INTERNAL_POOL_V3_1_0': "OrionV3", + 'CURVE': "Curve", + 'CURVE_FACTORY': "Curve", +} */ export type SwapInfo = { - pool: string - assetIn: string - assetOut: string + pool: string, + assetIn: string, + assetOut: string, factory: string } export type CallParams = { - isMandatory?: boolean - target?: string - gaslimit?: BigNumber + isMandatory?: boolean, + target?: string, + gaslimit?: BigNumber, value?: BigNumber } export type GenerateSwapCalldataParams = { - amount: BigNumberish - minReturnAmount: BigNumberish - receiverAddress: string - path: ArrayLike + amount: BigNumberish, + minReturnAmount: BigNumberish, + receiverAddress: string, + path: ArrayLike, unit: Unit } export default async function generateSwapCalldata({ - amount, - minReturnAmount, - receiverAddress, - path: path_, - unit -}: GenerateSwapCalldataParams + amount, + minReturnAmount, + receiverAddress, + path: path_, + unit + }: GenerateSwapCalldataParams ): Promise<{ calldata: string, swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct }> { if (path_ == undefined || path_.length == 0) { - throw new Error('Empty path'); + throw new Error(`Empty path`); } - const wethAddress = safeGet(unit.contracts, 'WETH') - const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') + const wethAddress = safeGet(unit.contracts, "WETH") + const curveRegistryAddress = safeGet(unit.contracts, "curveRegistry") const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); let path = SafeArray.from(path_).map((swapInfo) => { swapInfo.assetIn = safeGet(assetToAddress, swapInfo.assetIn); @@ -76,7 +72,7 @@ export default async function generateSwapCalldata({ }) const factory = path.first().factory if (!path.every(swapInfo => swapInfo.factory === factory)) { - throw new Error('Supporting only swaps with single factory'); + throw new Error(`Supporting only swaps with single factory`); } const swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct = { @@ -84,8 +80,8 @@ export default async function generateSwapCalldata({ dstToken: path.last().assetOut, srcReceiver: swapExecutorContractAddress ?? '', dstReceiver: receiverAddress, - amount, - minReturnAmount, + amount: amount, + minReturnAmount: minReturnAmount, flags: 0 } @@ -106,34 +102,35 @@ export default async function generateSwapCalldata({ return swapInfo; }); + let calldata: string - switch (exchangeToType[factory]) { - case 'OrionV2': { + switch (factory) { + case "OrionV2": { swapDescription.srcReceiver = path.first().pool calldata = await generateUni2Calls(exchangeContractAddress, path); break; } - case 'UniswapV2': { + case "UniswapV2": { swapDescription.srcReceiver = path.first().pool calldata = await generateUni2Calls(exchangeContractAddress, path); break; } - case 'UniswapV3': { + case "UniswapV3": { calldata = await generateUni3Calls(amountNativeDecimals, exchangeContractAddress, path, unit.provider) break; } - case 'OrionV3': { + case "OrionV3": { calldata = await generateOrion3Calls(amountNativeDecimals, exchangeContractAddress, path, unit.provider) break; } - case 'Curve': { + case "Curve": { calldata = await generateCurveStableSwapCalls( - amountNativeDecimals, - exchangeContractAddress, - swapExecutorContractAddress ?? '', - path, - unit.provider, - curveRegistryAddress + amountNativeDecimals, + exchangeContractAddress, + swapExecutorContractAddress ?? '', + path, + unit.provider, + curveRegistryAddress ); break; } @@ -145,8 +142,8 @@ export default async function generateSwapCalldata({ } export async function generateUni2Calls( - exchangeAddress: string, - path: SafeArray + exchangeAddress: string, + path: SafeArray ) { const executorInterface = SwapExecutor__factory.createInterface() const calls: BytesLike[] = [] @@ -155,33 +152,33 @@ export async function generateUni2Calls( const currentSwap = path.get(i) const nextSwap = path.get(i + 1) - const calldata = executorInterface.encodeFunctionData('swapUniV2', [ - currentSwap.pool, - currentSwap.assetIn, - currentSwap.assetOut, - defaultAbiCoder.encode(['uint256'], [concat(['0x03', nextSwap.pool])]), - ] + const calldata = executorInterface.encodeFunctionData("swapUniV2", [ + currentSwap.pool, + currentSwap.assetIn, + currentSwap.assetOut, + defaultAbiCoder.encode(["uint256"], [concat(["0x03", nextSwap.pool])]), + ] ) calls.push(addCallParams(calldata)) } } const lastSwap = path.last(); - const calldata = executorInterface.encodeFunctionData('swapUniV2', [ + const calldata = executorInterface.encodeFunctionData("swapUniV2", [ lastSwap.pool, lastSwap.assetIn, lastSwap.assetOut, - defaultAbiCoder.encode(['uint256'], [concat(['0x03', exchangeAddress])]), + defaultAbiCoder.encode(["uint256"], [concat(["0x03", exchangeAddress])]), ]) calls.push(addCallParams(calldata)) - return await generateCalls(calls) + return generateCalls(calls) } async function generateUni3Calls( - amount: BigNumberish, - exchangeContractAddress: string, - path: SafeArray, - provider: ethers.providers.JsonRpcProvider + amount: BigNumberish, + exchangeContractAddress: string, + path: SafeArray, + provider: ethers.providers.JsonRpcProvider ) { const encodedPools: BytesLike[] = [] for (const swap of path) { @@ -190,27 +187,27 @@ async function generateUni3Calls( const zeroForOne = token0.toLowerCase() === swap.assetIn.toLowerCase() const unwrapWETH = swap.assetOut === ethers.constants.AddressZero - let encodedPool = ethers.utils.solidityPack(['uint256'], [pool.address]) + let encodedPool = ethers.utils.solidityPack(["uint256"], [pool.address]) encodedPool = ethers.utils.hexDataSlice(encodedPool, 1) let firstByte = 0 if (unwrapWETH) firstByte += 32 if (!zeroForOne) firstByte += 128 - const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) + const encodedFirstByte = ethers.utils.solidityPack(["uint8"], [firstByte]) encodedPool = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, encodedPool])) encodedPools.push(encodedPool) } const executorInterface = SwapExecutor__factory.createInterface() - let calldata = executorInterface.encodeFunctionData('uniswapV3SwapTo', [encodedPools, exchangeContractAddress, amount]) + let calldata = executorInterface.encodeFunctionData("uniswapV3SwapTo", [encodedPools, exchangeContractAddress, amount]) calldata = addCallParams(calldata) - return await generateCalls([calldata]) + return generateCalls([calldata]) } async function generateOrion3Calls( - amount: BigNumberish, - exchangeContractAddress: string, - path: SafeArray, - provider: ethers.providers.JsonRpcProvider + amount: BigNumberish, + exchangeContractAddress: string, + path: SafeArray, + provider: ethers.providers.JsonRpcProvider ) { const encodedPools: BytesLike[] = [] for (const swap of path) { @@ -219,32 +216,32 @@ async function generateOrion3Calls( const zeroForOne = token0.toLowerCase() === swap.assetIn.toLowerCase() const unwrapWETH = swap.assetOut === ethers.constants.AddressZero - let encodedPool = ethers.utils.solidityPack(['uint256'], [pool.address]) + let encodedPool = ethers.utils.solidityPack(["uint256"], [pool.address]) encodedPool = ethers.utils.hexDataSlice(encodedPool, 1) let firstByte = 0 if (unwrapWETH) firstByte += 32 if (!zeroForOne) firstByte += 128 - const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) + const encodedFirstByte = ethers.utils.solidityPack(["uint8"], [firstByte]) encodedPool = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, encodedPool])) encodedPools.push(encodedPool) } const executorInterface = SwapExecutor__factory.createInterface() - let calldata = executorInterface.encodeFunctionData('orionV3SwapTo', [encodedPools, exchangeContractAddress, amount]) + let calldata = executorInterface.encodeFunctionData("orionV3SwapTo", [encodedPools, exchangeContractAddress, amount]) calldata = addCallParams(calldata) - return await generateCalls([calldata]) + return generateCalls([calldata]) } async function generateCurveStableSwapCalls( - amount: BigNumberish, - exchangeContractAddress: string, - executorAddress: string, - path: SafeArray, - provider: ethers.providers.JsonRpcProvider, - curveRegistry: string + amount: BigNumberish, + exchangeContractAddress: string, + executorAddress: string, + path: SafeArray, + provider: ethers.providers.JsonRpcProvider, + curveRegistry: string ) { if (path.length > 1) { - throw new Error('Supporting only single stable swap on curve') + throw new Error("Supporting only single stable swap on curve") } const executorInterface = SwapExecutor__factory.createInterface() const registry = CurveRegistry__factory.connect(curveRegistry, provider) @@ -258,15 +255,15 @@ async function generateCurveStableSwapCalls( const calls: BytesLike[] = [] if (executorAllowance.lt(amount)) { const calldata = addCallParams( - executorInterface.encodeFunctionData('safeApprove', [ - swap.assetIn, - swap.pool, - ethers.constants.MaxUint256 - ]) + executorInterface.encodeFunctionData("safeApprove", [ + swap.assetIn, + swap.pool, + ethers.constants.MaxUint256 + ]) ) calls.push(calldata) } - let calldata = executorInterface.encodeFunctionData('curveSwapStableAmountIn', [ + let calldata = executorInterface.encodeFunctionData("curveSwapStableAmountIn", [ pool, assetOut, i, @@ -278,40 +275,41 @@ async function generateCurveStableSwapCalls( calldata = addCallParams(calldata) calls.push(calldata) - return await generateCalls(calls) + return generateCalls(calls) } // Adds additional byte to single swap with settings function addCallParams( - calldata: BytesLike, - callParams?: CallParams + calldata: BytesLike, + callParams?: CallParams ) { let firstByte = 0 if (callParams) { if (callParams.value !== undefined) { firstByte += 16 // 00010000 - const encodedValue = ethers.utils.solidityPack(['uint128'], [callParams.value]) + const encodedValue = ethers.utils.solidityPack(["uint128"], [callParams.value]) calldata = ethers.utils.hexlify(ethers.utils.concat([encodedValue, calldata])) } if (callParams.target !== undefined) { firstByte += 32 // 00100000 - const encodedAddress = ethers.utils.solidityPack(['address'], [callParams.target]) + const encodedAddress = ethers.utils.solidityPack(["address"], [callParams.target]) calldata = ethers.utils.hexlify(ethers.utils.concat([encodedAddress, calldata])) } if (callParams.gaslimit !== undefined) { firstByte += 64 // 01000000 - const encodedGaslimit = ethers.utils.solidityPack(['uint32'], [callParams.gaslimit]) + const encodedGaslimit = ethers.utils.solidityPack(["uint32"], [callParams.gaslimit]) calldata = ethers.utils.hexlify(ethers.utils.concat([encodedGaslimit, calldata])) } if (callParams.isMandatory !== undefined) firstByte += 128 // 10000000 } - const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) + const encodedFirstByte = ethers.utils.solidityPack(["uint8"], [firstByte]) calldata = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, calldata])) return calldata } + async function generateCalls(calls: BytesLike[]) { const executorInterface = SwapExecutor__factory.createInterface() - return '0x' + executorInterface.encodeFunctionData(EXECUTOR_SWAP_FUNCTION, [ethers.constants.AddressZero, calls]).slice(74) + return "0x" + executorInterface.encodeFunctionData(EXECUTOR_SWAP_FUNCTION, [ethers.constants.AddressZero, calls]).slice(74) } From e1c30e6a29d2973fb6a02ca026daefe67745b6b8 Mon Sep 17 00:00:00 2001 From: Dmitriy Pavlov Date: Fri, 8 Sep 2023 14:12:25 +0300 Subject: [PATCH 011/225] remove toUpperCase from factory --- src/services/Aggregator/ws/schemas/swapInfoSchema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts index c03ff97..288838b 100644 --- a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts @@ -37,7 +37,7 @@ const swapInfoSchemaBase = baseMessageSchema.extend({ p: z.string(), // pool address ai: z.string().toUpperCase(), // asset in ao: z.string().toUpperCase(), // asset out - f: z.string().toUpperCase(), // factory + f: z.string(), // factory })) }); From 5c8cc5d81557671c37946690e5259f5563b3ee27 Mon Sep 17 00:00:00 2001 From: Dmitriy Pavlov Date: Fri, 8 Sep 2023 14:12:48 +0300 Subject: [PATCH 012/225] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bf9a863..2a7d529 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.81-rc5", + "version": "0.19.81-rc6", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 663b09988221d99005c0010b6cb8902d311d2d07 Mon Sep 17 00:00:00 2001 From: Dmitriy Pavlov Date: Fri, 8 Sep 2023 14:35:04 +0300 Subject: [PATCH 013/225] apply linter --- src/Unit/Exchange/generateSwapCalldata.ts | 166 +++++++++++----------- 1 file changed, 82 insertions(+), 84 deletions(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index be0534e..516a40d 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -7,7 +7,7 @@ import type Unit from '../index.js'; import { simpleFetch } from 'simple-typed-fetch'; import type { PromiseOrValue } from '@orionprotocol/contracts/lib/ethers-v5/common.js'; -const EXECUTOR_SWAP_FUNCTION = "func_70LYiww" +const EXECUTOR_SWAP_FUNCTION = 'func_70LYiww' // export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3" @@ -30,40 +30,40 @@ const EXECUTOR_SWAP_FUNCTION = "func_70LYiww" } */ export type SwapInfo = { - pool: string, - assetIn: string, - assetOut: string, + pool: string + assetIn: string + assetOut: string factory: string } export type CallParams = { - isMandatory?: boolean, - target?: string, - gaslimit?: BigNumber, + isMandatory?: boolean + target?: string + gaslimit?: BigNumber value?: BigNumber } export type GenerateSwapCalldataParams = { - amount: BigNumberish, - minReturnAmount: BigNumberish, - receiverAddress: string, - path: ArrayLike, + amount: BigNumberish + minReturnAmount: BigNumberish + receiverAddress: string + path: ArrayLike unit: Unit } export default async function generateSwapCalldata({ - amount, - minReturnAmount, - receiverAddress, - path: path_, - unit - }: GenerateSwapCalldataParams + amount, + minReturnAmount, + receiverAddress, + path: path_, + unit +}: GenerateSwapCalldataParams ): Promise<{ calldata: string, swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct }> { if (path_ == undefined || path_.length == 0) { - throw new Error(`Empty path`); + throw new Error('Empty path'); } - const wethAddress = safeGet(unit.contracts, "WETH") - const curveRegistryAddress = safeGet(unit.contracts, "curveRegistry") + const wethAddress = safeGet(unit.contracts, 'WETH') + const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); let path = SafeArray.from(path_).map((swapInfo) => { swapInfo.assetIn = safeGet(assetToAddress, swapInfo.assetIn); @@ -72,7 +72,7 @@ export default async function generateSwapCalldata({ }) const factory = path.first().factory if (!path.every(swapInfo => swapInfo.factory === factory)) { - throw new Error(`Supporting only swaps with single factory`); + throw new Error('Supporting only swaps with single factory'); } const swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct = { @@ -80,8 +80,8 @@ export default async function generateSwapCalldata({ dstToken: path.last().assetOut, srcReceiver: swapExecutorContractAddress ?? '', dstReceiver: receiverAddress, - amount: amount, - minReturnAmount: minReturnAmount, + amount, + minReturnAmount, flags: 0 } @@ -102,35 +102,34 @@ export default async function generateSwapCalldata({ return swapInfo; }); - let calldata: string switch (factory) { - case "OrionV2": { + case 'OrionV2': { swapDescription.srcReceiver = path.first().pool calldata = await generateUni2Calls(exchangeContractAddress, path); break; } - case "UniswapV2": { + case 'UniswapV2': { swapDescription.srcReceiver = path.first().pool calldata = await generateUni2Calls(exchangeContractAddress, path); break; } - case "UniswapV3": { + case 'UniswapV3': { calldata = await generateUni3Calls(amountNativeDecimals, exchangeContractAddress, path, unit.provider) break; } - case "OrionV3": { + case 'OrionV3': { calldata = await generateOrion3Calls(amountNativeDecimals, exchangeContractAddress, path, unit.provider) break; } - case "Curve": { + case 'Curve': { calldata = await generateCurveStableSwapCalls( - amountNativeDecimals, - exchangeContractAddress, - swapExecutorContractAddress ?? '', - path, - unit.provider, - curveRegistryAddress + amountNativeDecimals, + exchangeContractAddress, + swapExecutorContractAddress ?? '', + path, + unit.provider, + curveRegistryAddress ); break; } @@ -142,8 +141,8 @@ export default async function generateSwapCalldata({ } export async function generateUni2Calls( - exchangeAddress: string, - path: SafeArray + exchangeAddress: string, + path: SafeArray ) { const executorInterface = SwapExecutor__factory.createInterface() const calls: BytesLike[] = [] @@ -152,33 +151,33 @@ export async function generateUni2Calls( const currentSwap = path.get(i) const nextSwap = path.get(i + 1) - const calldata = executorInterface.encodeFunctionData("swapUniV2", [ - currentSwap.pool, - currentSwap.assetIn, - currentSwap.assetOut, - defaultAbiCoder.encode(["uint256"], [concat(["0x03", nextSwap.pool])]), - ] + const calldata = executorInterface.encodeFunctionData('swapUniV2', [ + currentSwap.pool, + currentSwap.assetIn, + currentSwap.assetOut, + defaultAbiCoder.encode(['uint256'], [concat(['0x03', nextSwap.pool])]), + ] ) calls.push(addCallParams(calldata)) } } const lastSwap = path.last(); - const calldata = executorInterface.encodeFunctionData("swapUniV2", [ + const calldata = executorInterface.encodeFunctionData('swapUniV2', [ lastSwap.pool, lastSwap.assetIn, lastSwap.assetOut, - defaultAbiCoder.encode(["uint256"], [concat(["0x03", exchangeAddress])]), + defaultAbiCoder.encode(['uint256'], [concat(['0x03', exchangeAddress])]), ]) calls.push(addCallParams(calldata)) - return generateCalls(calls) + return await generateCalls(calls) } async function generateUni3Calls( - amount: BigNumberish, - exchangeContractAddress: string, - path: SafeArray, - provider: ethers.providers.JsonRpcProvider + amount: BigNumberish, + exchangeContractAddress: string, + path: SafeArray, + provider: ethers.providers.JsonRpcProvider ) { const encodedPools: BytesLike[] = [] for (const swap of path) { @@ -187,27 +186,27 @@ async function generateUni3Calls( const zeroForOne = token0.toLowerCase() === swap.assetIn.toLowerCase() const unwrapWETH = swap.assetOut === ethers.constants.AddressZero - let encodedPool = ethers.utils.solidityPack(["uint256"], [pool.address]) + let encodedPool = ethers.utils.solidityPack(['uint256'], [pool.address]) encodedPool = ethers.utils.hexDataSlice(encodedPool, 1) let firstByte = 0 if (unwrapWETH) firstByte += 32 if (!zeroForOne) firstByte += 128 - const encodedFirstByte = ethers.utils.solidityPack(["uint8"], [firstByte]) + const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) encodedPool = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, encodedPool])) encodedPools.push(encodedPool) } const executorInterface = SwapExecutor__factory.createInterface() - let calldata = executorInterface.encodeFunctionData("uniswapV3SwapTo", [encodedPools, exchangeContractAddress, amount]) + let calldata = executorInterface.encodeFunctionData('uniswapV3SwapTo', [encodedPools, exchangeContractAddress, amount]) calldata = addCallParams(calldata) - return generateCalls([calldata]) + return await generateCalls([calldata]) } async function generateOrion3Calls( - amount: BigNumberish, - exchangeContractAddress: string, - path: SafeArray, - provider: ethers.providers.JsonRpcProvider + amount: BigNumberish, + exchangeContractAddress: string, + path: SafeArray, + provider: ethers.providers.JsonRpcProvider ) { const encodedPools: BytesLike[] = [] for (const swap of path) { @@ -216,32 +215,32 @@ async function generateOrion3Calls( const zeroForOne = token0.toLowerCase() === swap.assetIn.toLowerCase() const unwrapWETH = swap.assetOut === ethers.constants.AddressZero - let encodedPool = ethers.utils.solidityPack(["uint256"], [pool.address]) + let encodedPool = ethers.utils.solidityPack(['uint256'], [pool.address]) encodedPool = ethers.utils.hexDataSlice(encodedPool, 1) let firstByte = 0 if (unwrapWETH) firstByte += 32 if (!zeroForOne) firstByte += 128 - const encodedFirstByte = ethers.utils.solidityPack(["uint8"], [firstByte]) + const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) encodedPool = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, encodedPool])) encodedPools.push(encodedPool) } const executorInterface = SwapExecutor__factory.createInterface() - let calldata = executorInterface.encodeFunctionData("orionV3SwapTo", [encodedPools, exchangeContractAddress, amount]) + let calldata = executorInterface.encodeFunctionData('orionV3SwapTo', [encodedPools, exchangeContractAddress, amount]) calldata = addCallParams(calldata) - return generateCalls([calldata]) + return await generateCalls([calldata]) } async function generateCurveStableSwapCalls( - amount: BigNumberish, - exchangeContractAddress: string, - executorAddress: string, - path: SafeArray, - provider: ethers.providers.JsonRpcProvider, - curveRegistry: string + amount: BigNumberish, + exchangeContractAddress: string, + executorAddress: string, + path: SafeArray, + provider: ethers.providers.JsonRpcProvider, + curveRegistry: string ) { if (path.length > 1) { - throw new Error("Supporting only single stable swap on curve") + throw new Error('Supporting only single stable swap on curve') } const executorInterface = SwapExecutor__factory.createInterface() const registry = CurveRegistry__factory.connect(curveRegistry, provider) @@ -255,15 +254,15 @@ async function generateCurveStableSwapCalls( const calls: BytesLike[] = [] if (executorAllowance.lt(amount)) { const calldata = addCallParams( - executorInterface.encodeFunctionData("safeApprove", [ - swap.assetIn, - swap.pool, - ethers.constants.MaxUint256 - ]) + executorInterface.encodeFunctionData('safeApprove', [ + swap.assetIn, + swap.pool, + ethers.constants.MaxUint256 + ]) ) calls.push(calldata) } - let calldata = executorInterface.encodeFunctionData("curveSwapStableAmountIn", [ + let calldata = executorInterface.encodeFunctionData('curveSwapStableAmountIn', [ pool, assetOut, i, @@ -275,41 +274,40 @@ async function generateCurveStableSwapCalls( calldata = addCallParams(calldata) calls.push(calldata) - return generateCalls(calls) + return await generateCalls(calls) } // Adds additional byte to single swap with settings function addCallParams( - calldata: BytesLike, - callParams?: CallParams + calldata: BytesLike, + callParams?: CallParams ) { let firstByte = 0 if (callParams) { if (callParams.value !== undefined) { firstByte += 16 // 00010000 - const encodedValue = ethers.utils.solidityPack(["uint128"], [callParams.value]) + const encodedValue = ethers.utils.solidityPack(['uint128'], [callParams.value]) calldata = ethers.utils.hexlify(ethers.utils.concat([encodedValue, calldata])) } if (callParams.target !== undefined) { firstByte += 32 // 00100000 - const encodedAddress = ethers.utils.solidityPack(["address"], [callParams.target]) + const encodedAddress = ethers.utils.solidityPack(['address'], [callParams.target]) calldata = ethers.utils.hexlify(ethers.utils.concat([encodedAddress, calldata])) } if (callParams.gaslimit !== undefined) { firstByte += 64 // 01000000 - const encodedGaslimit = ethers.utils.solidityPack(["uint32"], [callParams.gaslimit]) + const encodedGaslimit = ethers.utils.solidityPack(['uint32'], [callParams.gaslimit]) calldata = ethers.utils.hexlify(ethers.utils.concat([encodedGaslimit, calldata])) } if (callParams.isMandatory !== undefined) firstByte += 128 // 10000000 } - const encodedFirstByte = ethers.utils.solidityPack(["uint8"], [firstByte]) + const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) calldata = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, calldata])) return calldata } - async function generateCalls(calls: BytesLike[]) { const executorInterface = SwapExecutor__factory.createInterface() - return "0x" + executorInterface.encodeFunctionData(EXECUTOR_SWAP_FUNCTION, [ethers.constants.AddressZero, calls]).slice(74) + return '0x' + executorInterface.encodeFunctionData(EXECUTOR_SWAP_FUNCTION, [ethers.constants.AddressZero, calls]).slice(74) } From c8cf608e135952fd85325e5b996a430041a572a5 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Fri, 8 Sep 2023 14:36:33 +0300 Subject: [PATCH 014/225] update exchanges mapping --- package-lock.json | 4 ++-- package.json | 2 +- src/constants/exchangesMap.ts | 10 +++------- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 51b0f73..dbc8d57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.80", + "version": "0.19.81", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.80", + "version": "0.19.81", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 94c0ad8..da9596c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.80", + "version": "0.19.81", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/exchangesMap.ts b/src/constants/exchangesMap.ts index 6b77aac..dc89d8d 100644 --- a/src/constants/exchangesMap.ts +++ b/src/constants/exchangesMap.ts @@ -12,13 +12,9 @@ const mapping: Record = { PANCAKESWAP: 'PancakeSwap', UNISWAP: 'Uniswap', QUICKSWAP: 'QuickSwap', - ORION_POOL: 'Orion Pool', - INTERNAL_POOL_V2: 'Orion Pool V2', - INTERNAL_POOL_V3: 'Orion Pool V3', - INTERNAL_POOL_V3_0_01: 'Orion Pool V3', - INTERNAL_POOL_V3_0_05: 'Orion Pool V3', - INTERNAL_POOL_V3_0_3: 'Orion Pool V3', - INTERNAL_POOL_V3_1_0: 'Orion Pool V3', + ORION_POOL: 'Internal Pool', + INTERNAL_POOL_V2: 'Internal Pool V2', + INTERNAL_POOL_V3: 'Internal Pool V3', CHERRYSWAP: 'CherrySwap', OKXSWAP: 'OKXSwap', CURVE: 'Curve', From dba82f332c575eb56dadffd07b1c562a738861ee Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 12 Sep 2023 10:11:00 +0500 Subject: [PATCH 015/225] rename bsc to bnb chain --- package-lock.json | 4 ++-- package.json | 2 +- src/config/chains.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index dbc8d57..0fff32b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.81", + "version": "0.19.82", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.81", + "version": "0.19.82", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index da9596c..20fef55 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.81", + "version": "0.19.82", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/config/chains.json b/src/config/chains.json index 5514a3b..ea3dd8e 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -15,7 +15,7 @@ "56": { "chainId": "56", "explorer": "https://bscscan.com/", - "label": "Binance Smart Chain", + "label": "BNB Chain", "shortName": "BSC", "code": "bsc", "rpc": "https://bsc-dataseed.binance.org/", @@ -28,7 +28,7 @@ "97": { "chainId": "97", "explorer": "https://testnet.bscscan.com/", - "label": "Binance Smart Chain Testnet", + "label": "BNB Chain Testnet", "shortName": "BSC-Testnet", "code": "bsc", "rpc": "https://data-seed-prebsc-1-s1.bnbchain.org:8545/", From c13e0afa1e5079c8621195136c04b4435a2fd46f Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Fri, 15 Sep 2023 01:09:03 +0400 Subject: [PATCH 016/225] Bump deps --- package-lock.json | 34 ++++++++++++------------ package.json | 10 +++---- tsconfig.json | 66 ++++++++++++++++++++++------------------------- 3 files changed, 53 insertions(+), 57 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0fff32b..d3fcdb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.16.2", + "@orionprotocol/contracts": "1.17.0", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", "buffer": "^6.0.3", @@ -24,13 +24,13 @@ "merge-anything": "^5.1.7", "neverthrow": "^6.0.0", "patch-package": "^8.0.0", - "simple-typed-fetch": "0.2.2", + "simple-typed-fetch": "0.2.3", "stream-browserify": "^3.0.0", "tiny-invariant": "^1.3.1", "ts-is-present": "^1.2.2", "uuid": "^9.0.0", "ws": "^8.13.0", - "zod": "3.21.4" + "zod": "3.22.2" }, "devDependencies": { "@babel/core": "^7.21.4", @@ -61,7 +61,7 @@ "ts-loader": "^9.4.3", "ts-node": "github:TypeStrong/ts-node#main", "tsup": "^7.2.0", - "typescript": "^5.1.6" + "typescript": "^5.2.2" }, "engines": { "node": ">=18.0.0" @@ -2619,9 +2619,9 @@ } }, "node_modules/@orionprotocol/contracts": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.16.2.tgz", - "integrity": "sha512-Jm1OrgneDunX85LhV/V6byb7mAGdwDKzHvtEYAvvg66XXa2mzw/uFNmgYcvaXAIh6q9I7hn5UuXXDOl9Z0D+Yw==" + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.17.0.tgz", + "integrity": "sha512-Ur61rlBXloIDC98nqDUG3vR/Ql1gSPXJb05SBy4kVyHrriVAx7wpHxnKRhz+VJo1R31j/1g8kA4DaDfBdtqRHA==" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -10398,14 +10398,14 @@ "dev": true }, "node_modules/simple-typed-fetch": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-typed-fetch/-/simple-typed-fetch-0.2.2.tgz", - "integrity": "sha512-RVkMptZGpxdx+3FjwRBpnZJ47ngid4tnh2YSTsmLV+OfVpGFuQ1+VdNYVkS1mvYYGvkSUH53YdOYve6uO7Grww==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/simple-typed-fetch/-/simple-typed-fetch-0.2.3.tgz", + "integrity": "sha512-EXP2mVVsVf4A3+5QGevs8789ztnT6FozsYyMrIrUYhfqtX2V+X9xETHeGXffmgv7YQ0p+GrW7N+5x+b+pBW59Q==", "dependencies": { "isomorphic-unfetch": "^4.0.2", "neverthrow": "^6.0.0", "patch-package": "^8.0.0", - "zod": "^3.21.4" + "zod": "^3.22.2" } }, "node_modules/sisteransi": { @@ -11397,9 +11397,9 @@ } }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -11882,9 +11882,9 @@ } }, "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "version": "3.22.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.2.tgz", + "integrity": "sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==", "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 20fef55..edd7c48 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.82", + "version": "0.19.83", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -81,13 +81,13 @@ "ts-loader": "^9.4.3", "ts-node": "github:TypeStrong/ts-node#main", "tsup": "^7.2.0", - "typescript": "^5.1.6" + "typescript": "^5.2.2" }, "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.16.2", + "@orionprotocol/contracts": "1.17.0", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", "buffer": "^6.0.3", @@ -98,13 +98,13 @@ "merge-anything": "^5.1.7", "neverthrow": "^6.0.0", "patch-package": "^8.0.0", - "simple-typed-fetch": "0.2.2", + "simple-typed-fetch": "0.2.3", "stream-browserify": "^3.0.0", "tiny-invariant": "^1.3.1", "ts-is-present": "^1.2.2", "uuid": "^9.0.0", "ws": "^8.13.0", - "zod": "3.21.4" + "zod": "3.22.2" }, "homepage": "https://github.com/orionprotocol/sdk#readme", "files": [ diff --git a/tsconfig.json b/tsconfig.json index fe8cf4b..37764ec 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,36 +1,32 @@ { - "extends": [ - "@tsconfig/strictest/tsconfig.json", - "@tsconfig/esm/tsconfig.json" - ], - "files": [ - "./src/index.ts" - ], - "include": [ - "./src/**/*.ts" - ], - "exclude": [ - "node_modules", - // "**/__tests__/*", - "lib" - ], - "compilerOptions": { - "target": "esnext", - "module": "esnext", - "moduleResolution": "nodenext", - "esModuleInterop": true, - "resolveJsonModule": true, /* Enable importing .json files */ - "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - "outDir": "./lib/esm", /* Specify an output folder for all emitted files. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ - "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ - "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ - "noUncheckedIndexedAccess": true, - "skipLibCheck": true, /* Skip type checking all .d.ts files. */ - }, - "ts-node": { - // Tell ts-node CLI to install the --loader automatically, explained below - "esm": true - } -} \ No newline at end of file + "extends": [ + "@tsconfig/strictest/tsconfig.json", + "@tsconfig/esm/tsconfig.json" + ], + "files": ["./src/index.ts"], + "include": ["./src/**/*.ts"], + "exclude": [ + "node_modules", + // "**/__tests__/*", + "lib" + ], + "compilerOptions": { + "target": "esnext", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "esModuleInterop": true, + "resolveJsonModule": true /* Enable importing .json files */, + "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, + "sourceMap": true /* Create source map files for emitted JavaScript files. */, + "outDir": "./lib/esm" /* Specify an output folder for all emitted files. */, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + "noUnusedLocals": true /* Enable error reporting when a local variables aren't read. */, + "noUnusedParameters": true /* Raise an error when a function parameter isn't read */, + "noUncheckedIndexedAccess": true, + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "ts-node": { + // Tell ts-node CLI to install the --loader automatically, explained below + "esm": true + } +} From 5e15b64f9a6408b6d974371100eae447ba7ba524 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 19 Sep 2023 15:04:50 +0300 Subject: [PATCH 017/225] added cross-chain leaderboard --- package-lock.json | 4 ++-- package.json | 2 +- src/services/ReferralSystem/index.ts | 19 ++++++++++++++++--- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d3fcdb9..89c4f12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.82", + "version": "0.19.84", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.82", + "version": "0.19.84", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index edd7c48..d0a782f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.83", + "version": "0.19.84", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/ReferralSystem/index.ts b/src/services/ReferralSystem/index.ts index a2fc61d..ea51262 100644 --- a/src/services/ReferralSystem/index.ts +++ b/src/services/ReferralSystem/index.ts @@ -69,8 +69,8 @@ class ReferralSystem { this.getMiniStats = this.getMiniStats.bind(this); this.getRewardsMapping = this.getRewardsMapping.bind(this); this.claimRewards = this.claimRewards.bind(this); - this.getRating = this.getRating.bind(this); - this.getRating = this.getRating.bind(this); + this.getLeaderboard = this.getLeaderboard.bind(this); + this.getLeaderboardSingleChain = this.getLeaderboardSingleChain.bind(this); this.getContractsAddresses = this.getContractsAddresses.bind(this); this.getClaimInfo = this.getClaimInfo.bind(this); this.getAggregatedHistory = this.getAggregatedHistory.bind(this); @@ -205,7 +205,20 @@ class ReferralSystem { errorSchema ); - getRating = (refererAddress: string | undefined, chainId: SupportedChainId) => + getLeaderboard = (refererAddress: string | undefined) => + fetchWithValidation( + `${this.apiUrl}/referer/ve/rating-table-leaderboard?tag=aggregated`, + ratingSchema, + { + headers: + refererAddress !== undefined + ? { 'referer-address': refererAddress } + : {}, + }, + errorSchema + ); + + getLeaderboardSingleChain = (refererAddress: string | undefined, chainId: SupportedChainId) => fetchWithValidation( `${this.apiUrl}/referer/ve/rating-table-leaderboard?chain_id=${chainId}`, ratingSchema, From 86944a3273639b193c0be617c446132708bada5c Mon Sep 17 00:00:00 2001 From: kigastu Date: Tue, 19 Sep 2023 15:33:36 +0300 Subject: [PATCH 018/225] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d0a782f..2a7efb9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.84", + "version": "0.19.85", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 0b67ea0b8694b264d29e7be4340a22d842dcb00e Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Wed, 20 Sep 2023 15:43:46 +0400 Subject: [PATCH 019/225] Added debug logs --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8af2ed2..fe24c38 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.81-rc9", + "version": "0.19.81-rc10", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 516a40d..c15ac49 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -62,6 +62,8 @@ export default async function generateSwapCalldata({ if (path_ == undefined || path_.length == 0) { throw new Error('Empty path'); } + console.log("Initial path") + console.log(path_) const wethAddress = safeGet(unit.contracts, 'WETH') const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); @@ -74,7 +76,9 @@ export default async function generateSwapCalldata({ if (!path.every(swapInfo => swapInfo.factory === factory)) { throw new Error('Supporting only swaps with single factory'); } - + console.log("Updated path") + console.log(path) + console.log(factory) const swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct = { srcToken: path.first().assetIn, dstToken: path.last().assetOut, From c0cbbab48d9a399f3cf8de1f95b2c08c97318e36 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Thu, 21 Sep 2023 15:00:56 +0100 Subject: [PATCH 020/225] feature: add new fields to ratingSchema --- package.json | 2 +- src/services/ReferralSystem/schemas/ratingSchema.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 2a7efb9..3458979 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.85", + "version": "0.19.86-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/ReferralSystem/schemas/ratingSchema.ts b/src/services/ReferralSystem/schemas/ratingSchema.ts index c72b70b..fae0a58 100644 --- a/src/services/ReferralSystem/schemas/ratingSchema.ts +++ b/src/services/ReferralSystem/schemas/ratingSchema.ts @@ -33,6 +33,10 @@ const ratingSchema = z.object({ weighted_volume_fmt: z.number(), total_weight: z.string(), total_weight_fmt: z.number(), + total_volume_fmt: z.number(), + total_earnings_fmt: z.number(), + referrals_count_fmt: z.number(), + total_trades_fmt: z.number(), reward: z.string(), reward_fmt: z.number() })), From dc0c67e3f4ccb95e8c10614f4ca390136e4bf098 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Thu, 21 Sep 2023 15:05:31 +0100 Subject: [PATCH 021/225] feature: up version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3458979..4f69cf4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.86-rc0", + "version": "0.19.86-rc100", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From f0e090da9424ca695d2a11a7ee1162910dc318ed Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Thu, 21 Sep 2023 15:14:25 +0100 Subject: [PATCH 022/225] feature: up version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f69cf4..2275ae8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.86-rc100", + "version": "0.19.87-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From e4493e343bdd4bbb6693bdd0f389be700374eb32 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 25 Sep 2023 18:56:33 +0300 Subject: [PATCH 023/225] update schemas --- package-lock.json | 4 ++-- package.json | 2 +- .../ReferralSystem/schemas/distinctAnalyticsSchema.ts | 10 +++++++++- src/services/ReferralSystem/schemas/ratingSchema.ts | 3 +++ 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 89c4f12..c90285d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.84", + "version": "0.19.87-rc1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.84", + "version": "0.19.87-rc1", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 2275ae8..aac9891 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.87-rc0", + "version": "0.19.87-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/ReferralSystem/schemas/distinctAnalyticsSchema.ts b/src/services/ReferralSystem/schemas/distinctAnalyticsSchema.ts index 620aef0..3597bd9 100644 --- a/src/services/ReferralSystem/schemas/distinctAnalyticsSchema.ts +++ b/src/services/ReferralSystem/schemas/distinctAnalyticsSchema.ts @@ -15,8 +15,16 @@ const distinctAnalyticsSchema = z.object({ latest_block: z.number(), }), ), - total_earned: z.number(), total_sent_to_governance: z.number(), + total_earned: z.number(), + total_volume: z.number(), + total_trades: z.number(), + all_time_earnings_boost_only: z.number(), + all_time_earnings_boost_only_usd: z.number(), + all_time_earnings: z.number(), + all_time_earnings_usd: z.number(), + all_weekly_earnings: z.number(), + all_weekly_earnings_usd: z.number(), }); export default distinctAnalyticsSchema; diff --git a/src/services/ReferralSystem/schemas/ratingSchema.ts b/src/services/ReferralSystem/schemas/ratingSchema.ts index fae0a58..57489bb 100644 --- a/src/services/ReferralSystem/schemas/ratingSchema.ts +++ b/src/services/ReferralSystem/schemas/ratingSchema.ts @@ -4,6 +4,8 @@ const ratingSchema = z.object({ info: z.object({ weekly_boost_budget: z.string(), weekly_boost_budget_fmt: z.number(), + monthly_boost_budget: z.string(), + monthly_boost_budget_fmt: z.number(), time_left_for_the_reward: z.number(), time_left_for_the_reward_local: z.string(), time_left_for_the_reward_utc: z.string(), @@ -34,6 +36,7 @@ const ratingSchema = z.object({ total_weight: z.string(), total_weight_fmt: z.number(), total_volume_fmt: z.number(), + weekly_earnings_fmt: z.number(), total_earnings_fmt: z.number(), referrals_count_fmt: z.number(), total_trades_fmt: z.number(), From 276b1beec805906e0241bf7325ec8b1770dac34f Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 26 Sep 2023 14:03:27 +0300 Subject: [PATCH 024/225] multiple exchanges in suborder --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/schemas/orderSchema.ts | 1 + src/services/Aggregator/ws/schemas/addressUpdateSchema.ts | 3 +++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 89c4f12..ebb7752 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.84", + "version": "0.19.88-rc0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.84", + "version": "0.19.88-rc0", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 2a7efb9..345113a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.85", + "version": "0.19.88-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/schemas/orderSchema.ts b/src/services/Aggregator/schemas/orderSchema.ts index 14fc395..0f2accf 100644 --- a/src/services/Aggregator/schemas/orderSchema.ts +++ b/src/services/Aggregator/schemas/orderSchema.ts @@ -87,6 +87,7 @@ const subOrderSchema = baseOrderSchema.extend({ message: `subOrder.parentOrderId must be a hex string, got ${value}`, })), exchange: z.string(), + exchanges: z.string().array().optional(), brokerAddress: brokerAddressSchema, tradesInfo: z.record( z.string().uuid(), diff --git a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts index 0310b0a..7cfeb4b 100644 --- a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts +++ b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts @@ -23,6 +23,7 @@ const subOrderSchema = z.object({ A: z.number(), // settled amount p: z.number(), // avg weighed settlement price e: z.string(), // exchange + es: z.string().array().optional(), // exchanges b: z.string(), // broker address S: z.enum(subOrderStatuses), // status o: z.boolean(), // internal only @@ -52,6 +53,7 @@ export const orderUpdateSchema = z.object({ subOrders: o.c.map((so) => ({ pair: so.P, exchange: so.e, + exchanges: so.es, id: so.i, amount: so.a, settledAmount: so.A, @@ -106,6 +108,7 @@ export const fullOrderSchema = z.object({ subOrders: o.c.map((so) => ({ pair: so.P, exchange: so.e, + exchangs: so.es, id: so.i, amount: so.a, settledAmount: so.A, From bbd8a4522fd566511fb93665d7ce0380192d8854 Mon Sep 17 00:00:00 2001 From: kigastu Date: Tue, 26 Sep 2023 17:45:02 +0300 Subject: [PATCH 025/225] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aac9891..cc5bd85 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.87-rc1", + "version": "0.19.87", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From c40cc93b9422597a967e07480f39814c584346e7 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 27 Sep 2023 14:05:20 +0300 Subject: [PATCH 026/225] remove comments and logs --- package-lock.json | 4 ++-- src/Unit/Exchange/generateSwapCalldata.ts | 25 ----------------------- 2 files changed, 2 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index c90285d..39122eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.87-rc1", + "version": "0.19.81-rc11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.87-rc1", + "version": "0.19.81-rc11", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index c15ac49..c781c28 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -9,26 +9,6 @@ import type { PromiseOrValue } from '@orionprotocol/contracts/lib/ethers-v5/comm const EXECUTOR_SWAP_FUNCTION = 'func_70LYiww' -// export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3" - -/* const exchangeToType: Partial> = { - 'SPOOKYSWAP': 'UniswapV2', - 'PANCAKESWAP': 'UniswapV2', - 'UNISWAP': 'UniswapV2', - 'QUICKSWAP': 'UniswapV2', - 'ORION_POOL': 'UniswapV2', - 'CHERRYSWAP': 'UniswapV2', - 'OKXSWAP': 'UniswapV2', - 'INTERNAL_POOL_V2': 'UniswapV2', - 'INTERNAL_POOL_V3': "OrionV3", - 'INTERNAL_POOL_V3_0_01': "OrionV3", - 'INTERNAL_POOL_V3_0_05': "OrionV3", - 'INTERNAL_POOL_V3_0_3': "OrionV3", - 'INTERNAL_POOL_V3_1_0': "OrionV3", - 'CURVE': "Curve", - 'CURVE_FACTORY': "Curve", -} */ - export type SwapInfo = { pool: string assetIn: string @@ -62,8 +42,6 @@ export default async function generateSwapCalldata({ if (path_ == undefined || path_.length == 0) { throw new Error('Empty path'); } - console.log("Initial path") - console.log(path_) const wethAddress = safeGet(unit.contracts, 'WETH') const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); @@ -76,9 +54,6 @@ export default async function generateSwapCalldata({ if (!path.every(swapInfo => swapInfo.factory === factory)) { throw new Error('Supporting only swaps with single factory'); } - console.log("Updated path") - console.log(path) - console.log(factory) const swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct = { srcToken: path.first().assetIn, dstToken: path.last().assetOut, From dc58eeae9f0eb38e63d31de0a53dae48d65fb4dc Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 27 Sep 2023 14:08:21 +0300 Subject: [PATCH 027/225] bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39122eb..23406c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.81-rc11", + "version": "0.19.88", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.81-rc11", + "version": "0.19.88", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 658441a..da99f7a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.81-rc11", + "version": "0.19.88", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 65c21de2ddcd87d38984a17cbb590f5d138aacc6 Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Wed, 27 Sep 2023 16:08:09 +0400 Subject: [PATCH 028/225] feat!: added `Integrator` service --- src/Orion/index.ts | 3 + src/Unit/index.ts | 9 +- src/__tests__/basic.test.ts | 3 + src/config/schemas/pureEnvSchema.ts | 3 + src/services/Integrator/constants.ts | 1 + src/services/Integrator/index.ts | 121 ++++++++++++++++++ .../schemas/basic-pool-info-schema.ts | 26 ++++ .../schemas/environment-response-schema.ts | 19 +++ .../schemas/get-pool-response-schema.ts | 21 +++ src/services/Integrator/schemas/index.ts | 4 + .../Integrator/schemas/info-schema.ts | 12 ++ .../schemas/list-nft-order-response-schema.ts | 10 ++ .../schemas/list-pool-response-schema.ts | 26 ++++ .../Integrator/schemas/pool-schema.ts | 33 +++++ .../Integrator/schemas/util-schemas.ts | 14 ++ src/types.ts | 6 + 16 files changed, 310 insertions(+), 1 deletion(-) create mode 100644 src/services/Integrator/constants.ts create mode 100644 src/services/Integrator/index.ts create mode 100644 src/services/Integrator/schemas/basic-pool-info-schema.ts create mode 100644 src/services/Integrator/schemas/environment-response-schema.ts create mode 100644 src/services/Integrator/schemas/get-pool-response-schema.ts create mode 100644 src/services/Integrator/schemas/index.ts create mode 100644 src/services/Integrator/schemas/info-schema.ts create mode 100644 src/services/Integrator/schemas/list-nft-order-response-schema.ts create mode 100644 src/services/Integrator/schemas/list-pool-response-schema.ts create mode 100644 src/services/Integrator/schemas/pool-schema.ts create mode 100644 src/services/Integrator/schemas/util-schemas.ts diff --git a/src/Orion/index.ts b/src/Orion/index.ts index 80dbbf1..b2a6b44 100644 --- a/src/Orion/index.ts +++ b/src/Orion/index.ts @@ -58,6 +58,9 @@ export default class Orion { priceFeed: { api: networkConfig.api + networkConfig.services.priceFeed.all, }, + integrator: { + api: networkConfig.api + networkConfig.services.integrator.http, + } }, }; }) diff --git a/src/Unit/index.ts b/src/Unit/index.ts index c8b4462..c9cc0f4 100644 --- a/src/Unit/index.ts +++ b/src/Unit/index.ts @@ -7,6 +7,7 @@ import Exchange from './Exchange/index.js'; import FarmingManager from './FarmingManager/index.js'; import { chains, envs } from '../config/index.js'; import type { networkCodes } from '../constants/index.js'; +import { IntegratorService } from '../services/Integrator/index.js'; type KnownConfig = { env: KnownEnv @@ -22,6 +23,8 @@ export default class Unit { public readonly blockchainService: BlockchainService; + public readonly integrator: IntegratorService; + public readonly aggregator: Aggregator; public readonly priceFeed: PriceFeed; @@ -58,6 +61,9 @@ export default class Unit { priceFeed: { api: networkConfig.api + networkConfig.services.priceFeed.all, }, + integrator: { + api: networkConfig.api + networkConfig.services.integrator.http, + } }, } } else { @@ -65,7 +71,7 @@ export default class Unit { } const chainInfo = chains[config.chainId]; if (!chainInfo) throw new Error('Chain info is required'); - + this.chainId = config.chainId; this.networkCode = chainInfo.code; this.contracts = chainInfo.contracts @@ -75,6 +81,7 @@ export default class Unit { this.provider.pollingInterval = 1000; this.blockchainService = new BlockchainService(this.config.services.blockchainService.http, this.config.basicAuth); + this.integrator = new IntegratorService(this.config.services.integrator.api, intNetwork); this.aggregator = new Aggregator( this.config.services.aggregator.http, this.config.services.aggregator.ws, diff --git a/src/__tests__/basic.test.ts b/src/__tests__/basic.test.ts index 6f8241b..c3c5c8a 100644 --- a/src/__tests__/basic.test.ts +++ b/src/__tests__/basic.test.ts @@ -177,6 +177,9 @@ describe('Orion', () => { priceFeed: { api: orionPriceFeedAPI + '/price-feed', }, + integrator: { + api: '', + } }, } } diff --git a/src/config/schemas/pureEnvSchema.ts b/src/config/schemas/pureEnvSchema.ts index 8838cd5..854e9f4 100644 --- a/src/config/schemas/pureEnvSchema.ts +++ b/src/config/schemas/pureEnvSchema.ts @@ -14,6 +14,9 @@ export const pureEnvNetworksSchema = z.object({ priceFeed: z.object({ all: z.string(), }), + integrator: z.object({ + http: z.string(), + }), }), rpc: z.string().optional(), liquidityMigratorAddress: z.string().optional(), diff --git a/src/services/Integrator/constants.ts b/src/services/Integrator/constants.ts new file mode 100644 index 0000000..00c0d3d --- /dev/null +++ b/src/services/Integrator/constants.ts @@ -0,0 +1 @@ +export const AVAILABLE_POOL_FEE = ['0.01', '0.05', '0.3', '1'] as const; diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts new file mode 100644 index 0000000..ebb36ce --- /dev/null +++ b/src/services/Integrator/index.ts @@ -0,0 +1,121 @@ +import { + environmentResponseSchema, + getPoolResponseSchema, + listNFTOrderResponseSchema, + listPoolResponseSchema, +} from './schemas/index.js'; +import { fetchWithValidation } from 'simple-typed-fetch'; + +type BasePayload = { + chainId: number + jsonrpc: '1.0' +}; + +type GetEnvironmentPayload = BasePayload & { + model: 'Environment' + method: 'getEnvironment' + params: [] +}; + +type ListNFTOrderPayload = BasePayload & { + model: 'OrionV3NFTManager' + method: 'listNFTOrder' + params: [string] +}; + +type GetPoolInfoPayload = BasePayload & { + model: 'OrionV3Factory' + method: 'getPoolInfo' + params: [string, string, string] +}; + +type ListPoolPayload = BasePayload & { + model: 'OrionFarmV3' + method: 'listPool' + params: [string] +}; + +type Payload = + | GetEnvironmentPayload + | ListNFTOrderPayload + | GetPoolInfoPayload + | ListPoolPayload; + +class IntegratorService { + private readonly apiUrl: string; + + private readonly chainId: number; + + get api() { + return this.apiUrl; + } + + constructor(apiUrl: string, chainId: number) { + this.apiUrl = apiUrl; + this.chainId = chainId; + + this.getEnvironment = this.getEnvironment.bind(this); + this.listNFTOrder = this.listNFTOrder.bind(this); + this.getPoolInfo = this.getPoolInfo.bind(this); + this.listPool = this.listPool.bind(this); + } + + makeRPCPayload = (payload: Omit) => { + return JSON.stringify({ + ...payload, + chainId: this.chainId, + jsonrpc: '1.0', + }); + }; + + private readonly getEnvironment = () => { + return fetchWithValidation(this.apiUrl, environmentResponseSchema, { + method: 'POST', + body: this.makeRPCPayload({ + model: 'Environment', + method: 'getEnvironment', + params: [], + }), + }); + }; + + private readonly listNFTOrder = (address: string) => { + return fetchWithValidation(this.apiUrl, listNFTOrderResponseSchema, { + method: 'POST', + body: this.makeRPCPayload({ + model: 'OrionV3NFTManager', + method: 'listNFTOrder', + params: [address], + }), + }); + }; + + private readonly getPoolInfo = ( + token0: string, + token1: string, + poolAddress: string + ) => { + return fetchWithValidation(this.apiUrl, getPoolResponseSchema, { + method: 'POST', + body: this.makeRPCPayload({ + model: 'OrionV3Factory', + method: 'getPoolInfo', + params: [token0, token1, poolAddress], + }), + }); + } + + private readonly listPool = (address: string) => { + return fetchWithValidation(this.apiUrl, listPoolResponseSchema, { + method: 'POST', + body: this.makeRPCPayload({ + model: 'OrionFarmV3', + method: 'listPool', + params: [address], + }), + }); + } +} + +export * as schemas from './schemas/index.js'; +export { IntegratorService }; diff --git a/src/services/Integrator/schemas/basic-pool-info-schema.ts b/src/services/Integrator/schemas/basic-pool-info-schema.ts new file mode 100644 index 0000000..049c92f --- /dev/null +++ b/src/services/Integrator/schemas/basic-pool-info-schema.ts @@ -0,0 +1,26 @@ +import { z } from 'zod'; +import { evmAddressSchema } from './util-schemas.js'; + +const basicPoolInfo = z.object({ + poolAddress: evmAddressSchema, + isInitialized: z.boolean(), + liquidity: z.number().nonnegative(), + liquidityInUsd: z.number().nonnegative(), + liquidityShare: z.number().nonnegative(), + isFarming: z.boolean(), + rewardsTotal: z.number().nonnegative(), + rewardsPerPeriod: z.number().nonnegative(), + rewardsShare: z.number().nonnegative(), + feePerPeriod: z.number().nonnegative(), + feeTotal: z.number().nonnegative(), + feeShare: z.number().nonnegative(), + tickMultiplier: z.number().nonnegative(), + MAX_TICK: z.number().nonnegative().int(), + minAPR: z.number().nonnegative(), + maxAPR: z.number().nonnegative(), + avgAPR: z.number().nonnegative(), + maxBoost: z.number().nonnegative().int(), + feeRate: z.array(z.number().nonnegative()), +}); + +export default basicPoolInfo; diff --git a/src/services/Integrator/schemas/environment-response-schema.ts b/src/services/Integrator/schemas/environment-response-schema.ts new file mode 100644 index 0000000..5da5cd2 --- /dev/null +++ b/src/services/Integrator/schemas/environment-response-schema.ts @@ -0,0 +1,19 @@ +import { z } from 'zod'; +import { evmAddressSchema } from './util-schemas.js'; +import infoSchema from './info-schema.js'; + +const environmentResponseSchema = z.object({ + result: z.object({ + chainId: z.number().int().nonnegative(), + nativeToken: z.string(), + OrionV3Factory: evmAddressSchema, + OrionV3NFTManager: evmAddressSchema, + SwapRouter: evmAddressSchema, + OrionFarmV3: evmAddressSchema, + OrionVoting: evmAddressSchema, + veORN: evmAddressSchema, + }), + info: infoSchema, +}); + +export default environmentResponseSchema; diff --git a/src/services/Integrator/schemas/get-pool-response-schema.ts b/src/services/Integrator/schemas/get-pool-response-schema.ts new file mode 100644 index 0000000..ee49682 --- /dev/null +++ b/src/services/Integrator/schemas/get-pool-response-schema.ts @@ -0,0 +1,21 @@ +import { z } from 'zod'; +import { evmAddressSchema } from './util-schemas.js'; +import { AVAILABLE_POOL_FEE } from '../constants.js'; +import basicPoolInfo from './basic-pool-info-schema.js'; +import infoSchema from './info-schema.js'; + +const getPoolResponseSchema = z.object({ + result: z.object({ + token0: z.string().nonempty(), + token1: z.string().nonempty(), + token0Address: evmAddressSchema, + token1Address: evmAddressSchema, + + totalLiquidity: z.number().nonnegative(), + WETH9: evmAddressSchema, + pools: z.record(z.enum(AVAILABLE_POOL_FEE), basicPoolInfo.nullable()), + }), + info: infoSchema, +}); + +export default getPoolResponseSchema; diff --git a/src/services/Integrator/schemas/index.ts b/src/services/Integrator/schemas/index.ts new file mode 100644 index 0000000..1d09d6e --- /dev/null +++ b/src/services/Integrator/schemas/index.ts @@ -0,0 +1,4 @@ +export { default as environmentResponseSchema } from './environment-response-schema.js'; +export { default as listNFTOrderResponseSchema } from './list-nft-order-response-schema.js'; +export { default as getPoolResponseSchema } from './get-pool-response-schema.js'; +export { default as listPoolResponseSchema } from './list-pool-response-schema.js'; diff --git a/src/services/Integrator/schemas/info-schema.ts b/src/services/Integrator/schemas/info-schema.ts new file mode 100644 index 0000000..949727e --- /dev/null +++ b/src/services/Integrator/schemas/info-schema.ts @@ -0,0 +1,12 @@ +import { z } from 'zod'; +import { hexStringSchema } from './util-schemas.js'; + +const infoSchema = z.object({ + blockNumber: z.number().int().nonnegative(), + blockHash: hexStringSchema, + timeRequest: z.number().int().nonnegative(), + timeAnswer: z.number().int().nonnegative(), + changes: z.number().int().nonnegative(), +}); + +export default infoSchema; diff --git a/src/services/Integrator/schemas/list-nft-order-response-schema.ts b/src/services/Integrator/schemas/list-nft-order-response-schema.ts new file mode 100644 index 0000000..4747ffd --- /dev/null +++ b/src/services/Integrator/schemas/list-nft-order-response-schema.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import poolSchema from './pool-schema.js'; +import infoSchema from './info-schema.js'; + +const listNFTOrderResponseSchema = z.object({ + result: z.array(poolSchema), + info: infoSchema, +}); + +export default listNFTOrderResponseSchema; diff --git a/src/services/Integrator/schemas/list-pool-response-schema.ts b/src/services/Integrator/schemas/list-pool-response-schema.ts new file mode 100644 index 0000000..2e19738 --- /dev/null +++ b/src/services/Integrator/schemas/list-pool-response-schema.ts @@ -0,0 +1,26 @@ +import { z } from 'zod'; +import { evmAddressSchema } from './util-schemas.js'; +import basicPoolInfo from './basic-pool-info-schema.js'; +import infoSchema from './info-schema.js'; + +const poolOfListPoolSchema = z.object({ + token0: z.string().nonempty(), + token1: z.string().nonempty(), + token0Address: evmAddressSchema, + token1Address: evmAddressSchema, + + token0Decimals: z.number().int().nonnegative().max(18), + token1Decimals: z.number().int().nonnegative().max(18), + WETH9: evmAddressSchema, + + ...basicPoolInfo.shape, + + type: z.string().nonempty(), +}); + +const listPoolResponseSchema = z.object({ + result: z.array(poolOfListPoolSchema), + info: infoSchema, +}); + +export default listPoolResponseSchema; diff --git a/src/services/Integrator/schemas/pool-schema.ts b/src/services/Integrator/schemas/pool-schema.ts new file mode 100644 index 0000000..3053734 --- /dev/null +++ b/src/services/Integrator/schemas/pool-schema.ts @@ -0,0 +1,33 @@ +import { z } from 'zod'; +import { evmAddressSchema } from './util-schemas.js'; + +const poolSchema = z.object({ + tokenId: evmAddressSchema, + + token0: z.string().nonempty(), + token1: z.string().nonempty(), + token0Address: evmAddressSchema, + token1Address: evmAddressSchema, + token0Decimals: z.number().int().nonnegative().max(18), + token1Decimals: z.number().int().nonnegative().max(18), + + amount: z.number().nonnegative(), + amount0: z.number().nonnegative(), + amount1: z.number().nonnegative(), + from: z.number().nonnegative(), + to: z.number().nonnegative(), + fee: z.number().nonnegative(), + collectFee: z.number().nonnegative(), + reward: z.number().nonnegative(), + apr: z.number().nonnegative(), + boost: z.number().int().nonnegative(), + isStaked: z.boolean(), + poolFee: z.number().nonnegative(), + poolAddress: evmAddressSchema, + veOrnForMaxBoost: z.number().nonnegative(), + veOrnMaxBoost: z.number().nonnegative(), + veORNCurrent: z.number().nonnegative(), + time: z.number().int().nonnegative(), // tim +}); + +export default poolSchema; diff --git a/src/services/Integrator/schemas/util-schemas.ts b/src/services/Integrator/schemas/util-schemas.ts new file mode 100644 index 0000000..0d58a75 --- /dev/null +++ b/src/services/Integrator/schemas/util-schemas.ts @@ -0,0 +1,14 @@ +import { ethers } from 'ethers'; +import { z } from 'zod'; + +export const evmAddressSchema = z + .string() + .refine(ethers.utils.isAddress, (v) => ({ + message: `${v} is not a valid address`, + })); + +export const hexStringSchema = z + .string() + .refine(ethers.utils.isAddress, (v) => ({ + message: `${v} is not a valid hex string`, + })); diff --git a/src/types.ts b/src/types.ts index 64449e8..88d32ac 100644 --- a/src/types.ts +++ b/src/types.ts @@ -252,6 +252,12 @@ export type VerboseUnitConfig = { // http://10.23.5.11:3003/, // https://price-feed:3003/ } + integrator: { + api: string + // For example: + // http://localhost:3004/, + // http:// + } } basicAuth?: BasicAuthCredentials } From 716762ce118bdccbb4313a161eaf78add5b038b0 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 27 Sep 2023 15:46:07 +0300 Subject: [PATCH 029/225] create rc --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 23406c1..8f4d0e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.88", + "version": "0.19.89-rc0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.88", + "version": "0.19.89-rc0", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index da99f7a..27749e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.88", + "version": "0.19.89-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 7d1177d01c9c235abc164801652b0b6b715a801b Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Wed, 27 Sep 2023 16:55:08 +0400 Subject: [PATCH 030/225] Added cross dex swap support --- package-lock.json | 12 +- package.json | 4 +- src/Unit/Exchange/callGenerators/curve.ts | 27 ++ src/Unit/Exchange/callGenerators/erc20.ts | 35 ++ src/Unit/Exchange/callGenerators/uniswapV2.ts | 56 +++ src/Unit/Exchange/callGenerators/uniswapV3.ts | 92 +++++ src/Unit/Exchange/callGenerators/utils.ts | 101 +++++ src/Unit/Exchange/generateSwapCalldata.ts | 368 ++++++++---------- .../BlockchainService/schemas/infoSchema.ts | 2 +- 9 files changed, 475 insertions(+), 222 deletions(-) create mode 100644 src/Unit/Exchange/callGenerators/curve.ts create mode 100644 src/Unit/Exchange/callGenerators/erc20.ts create mode 100644 src/Unit/Exchange/callGenerators/uniswapV2.ts create mode 100644 src/Unit/Exchange/callGenerators/uniswapV3.ts create mode 100644 src/Unit/Exchange/callGenerators/utils.ts diff --git a/package-lock.json b/package-lock.json index 23406c1..b70a5e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.88", + "version": "0.19.89", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.88", + "version": "0.19.89", "hasInstallScript": true, "license": "ISC", "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.17.0", + "@orionprotocol/contracts": "1.18.0", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", "buffer": "^6.0.3", @@ -2619,9 +2619,9 @@ } }, "node_modules/@orionprotocol/contracts": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.17.0.tgz", - "integrity": "sha512-Ur61rlBXloIDC98nqDUG3vR/Ql1gSPXJb05SBy4kVyHrriVAx7wpHxnKRhz+VJo1R31j/1g8kA4DaDfBdtqRHA==" + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.18.0.tgz", + "integrity": "sha512-Wo+cjcaM5QOFjtuWt9GVNKxmvUzgbglqRmtX9Bki5btZe1ov+Ib5IXhAooT6+H+3pa5Ko4rvYVi1gKiAvaQJ4Q==" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", diff --git a/package.json b/package.json index da99f7a..72b0b06 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.88", + "version": "0.19.89", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -87,7 +87,7 @@ "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.17.0", + "@orionprotocol/contracts": "1.18.0", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", "buffer": "^6.0.3", diff --git a/src/Unit/Exchange/callGenerators/curve.ts b/src/Unit/Exchange/callGenerators/curve.ts new file mode 100644 index 0000000..422ef0f --- /dev/null +++ b/src/Unit/Exchange/callGenerators/curve.ts @@ -0,0 +1,27 @@ +import { SwapExecutor__factory, CurveRegistry__factory } from "@orionprotocol/contracts/lib/ethers-v5/index.js" +import type { BigNumberish, providers } from "ethers" +import type { SwapInfo } from "../generateSwapCalldata.js" + +export async function generateCurveStableSwapCall( + amount: BigNumberish, + to: string, + swap: SwapInfo, + provider: providers.JsonRpcProvider, + curveRegistry: string +) { + const executorInterface = SwapExecutor__factory.createInterface() + const registry = CurveRegistry__factory.connect(curveRegistry, provider) + const { pool, assetIn, assetOut } = swap + const [i, j,] = await registry.get_coin_indices(pool, assetIn, assetOut) + + let calldata = executorInterface.encodeFunctionData('curveSwapStableAmountIn', [ + pool, + assetOut, + i, + j, + to, + amount, + ]) + + return calldata +} \ No newline at end of file diff --git a/src/Unit/Exchange/callGenerators/erc20.ts b/src/Unit/Exchange/callGenerators/erc20.ts new file mode 100644 index 0000000..0bc3085 --- /dev/null +++ b/src/Unit/Exchange/callGenerators/erc20.ts @@ -0,0 +1,35 @@ +import { SwapExecutor__factory } from "@orionprotocol/contracts/lib/ethers-v5/index.js" +import type { BigNumberish } from "ethers" +import { type CallParams, addCallParams } from "./utils.js" + +export async function generateTransferCall( + token: string, + target: string, + amount: BigNumberish, + callParams?: CallParams +) { + const executorInterface = SwapExecutor__factory.createInterface() + const calldata = executorInterface.encodeFunctionData('safeTransfer', [ + token, + target, + amount + ]) + + return addCallParams(calldata, callParams) +} + +export async function generateApproveCall( + token: string, + target: string, + amount: BigNumberish, + callParams?: CallParams +) { + const executorInterface = SwapExecutor__factory.createInterface() + const calldata = executorInterface.encodeFunctionData('safeApprove', [ + token, + target, + amount + ]) + + return addCallParams(calldata, callParams) +} \ No newline at end of file diff --git a/src/Unit/Exchange/callGenerators/uniswapV2.ts b/src/Unit/Exchange/callGenerators/uniswapV2.ts new file mode 100644 index 0000000..37f57a5 --- /dev/null +++ b/src/Unit/Exchange/callGenerators/uniswapV2.ts @@ -0,0 +1,56 @@ +import { SwapExecutor__factory } from "@orionprotocol/contracts/lib/ethers-v5/index.js" +import { SafeArray } from "../../../utils/safeGetters.js" +import { BigNumber } from "ethers" +import type { BytesLike, BigNumberish } from "ethers" +import { defaultAbiCoder, concat } from "ethers/lib/utils.js" +import type { SwapInfo } from "../generateSwapCalldata.js" +import { addCallParams, generateCalls } from "./utils.js" + +export async function generateUni2Calls( + path: SafeArray, + recipient: string +) { + const executorInterface = SwapExecutor__factory.createInterface() + const calls: BytesLike[] = [] + if (path.length > 1) { + for (let i = 0; i < path.length - 1; ++i) { + const currentSwap = path.get(i) + const nextSwap = path.get(i + 1) + + const call = await generateUni2Call( + currentSwap.pool, + currentSwap.assetIn, + currentSwap.assetOut, + nextSwap.pool + ) + calls.push(call) + } + } + const lastSwap = path.last(); + const calldata = executorInterface.encodeFunctionData('swapUniV2', [ + lastSwap.pool, + lastSwap.assetIn, + lastSwap.assetOut, + defaultAbiCoder.encode(['uint256'], [concat(['0x03', recipient])]), + ]) + calls.push(addCallParams(calldata)) + + return generateCalls(calls) +} + +export async function generateUni2Call( + pool: string, + assetIn: string, + assetOut: string, + recipient: string, + fee: BigNumberish = BigNumber.from(3), +) { + const executorInterface = SwapExecutor__factory.createInterface() + const calldata = executorInterface.encodeFunctionData('swapUniV2', [ + pool, + assetIn, + assetOut, + defaultAbiCoder.encode(['uint256'], [concat([BigNumber.from(fee).toHexString(), recipient])]), + ]) + return addCallParams(calldata) +} \ No newline at end of file diff --git a/src/Unit/Exchange/callGenerators/uniswapV3.ts b/src/Unit/Exchange/callGenerators/uniswapV3.ts new file mode 100644 index 0000000..18abb49 --- /dev/null +++ b/src/Unit/Exchange/callGenerators/uniswapV3.ts @@ -0,0 +1,92 @@ +import { SwapExecutor__factory, UniswapV3Pool__factory } from "@orionprotocol/contracts/lib/ethers-v5/index.js" +import { type BigNumberish, providers, type BytesLike, ethers } from "ethers" +import { SafeArray } from "../../../utils/safeGetters.js" +import type { SwapInfo } from "../generateSwapCalldata.js" +import { addCallParams, generateCalls } from "./utils.js" + +export async function generateUni3Call( + swap: SwapInfo, + amount: BigNumberish | undefined, + recipient: string, + provider: providers.JsonRpcProvider +) { + if (typeof amount === 'undefined') amount = 0 + + const encodedPool = await encodePoolV3(swap.pool, swap.assetIn, swap.assetOut, provider) + const executorInterface = SwapExecutor__factory.createInterface() + let calldata = executorInterface.encodeFunctionData('uniswapV3SingleSwapTo', [encodedPool, recipient, amount]) + + return calldata +} + +export async function generateOrion3Call( + swap: SwapInfo, + amount: BigNumberish | undefined, + recipient: string, + provider: providers.JsonRpcProvider +) { + if (typeof amount === 'undefined') amount = 0 + + const encodedPool = await encodePoolV3(swap.pool, swap.assetIn, swap.assetOut, provider) + const executorInterface = SwapExecutor__factory.createInterface() + let calldata = executorInterface.encodeFunctionData('orionV3SingleSwapTo', [encodedPool, recipient, amount]) + + return calldata +} + +export async function generateUni3Calls( + path: SafeArray, + amount: BigNumberish, + recipient: string, + provider: providers.JsonRpcProvider +) { + const encodedPools: BytesLike[] = [] + for (const swap of path) { + const encodedPool = await encodePoolV3(swap.pool, swap.assetIn, swap.assetOut, provider) + encodedPools.push(encodedPool) + } + const executorInterface = SwapExecutor__factory.createInterface() + let calldata = executorInterface.encodeFunctionData('uniswapV3SwapTo', [encodedPools, recipient, amount]) + calldata = addCallParams(calldata) + + return generateCalls([calldata]) +} + +export async function generateOrion3Calls( + path: SafeArray, + amount: BigNumberish, + recipient: string, + provider: providers.JsonRpcProvider +) { + const encodedPools: BytesLike[] = [] + for (const swap of path) { + const encodedPool = await encodePoolV3(swap.pool, swap.assetIn, swap.assetOut, provider) + encodedPools.push(encodedPool) + } + const executorInterface = SwapExecutor__factory.createInterface() + let calldata = executorInterface.encodeFunctionData('orionV3SwapTo', [encodedPools, recipient, amount]) + calldata = addCallParams(calldata) + + return generateCalls([calldata]) +} + +export async function encodePoolV3( + poolAddress: string, + assetInAddress: string, + assetOutAddress: string, + provider: providers.JsonRpcProvider +) { + const pool = UniswapV3Pool__factory.connect(poolAddress, provider) + const token0 = await pool.token0() + const zeroForOne = token0.toLowerCase() === assetInAddress.toLowerCase() + const unwrapWETH = assetOutAddress === ethers.constants.AddressZero + + let encodedPool = ethers.utils.solidityPack(['uint256'], [pool.address]) + encodedPool = ethers.utils.hexDataSlice(encodedPool, 1) + let firstByte = 0 + if (unwrapWETH) firstByte += 32 + if (!zeroForOne) firstByte += 128 + const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) + encodedPool = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, encodedPool])) + return encodedPool +} \ No newline at end of file diff --git a/src/Unit/Exchange/callGenerators/utils.ts b/src/Unit/Exchange/callGenerators/utils.ts new file mode 100644 index 0000000..955d2a5 --- /dev/null +++ b/src/Unit/Exchange/callGenerators/utils.ts @@ -0,0 +1,101 @@ +import type { PromiseOrValue } from "@orionprotocol/contracts/lib/ethers-v5/common.js" +import { ERC20__factory, SwapExecutor__factory } from "@orionprotocol/contracts/lib/ethers-v5/index.js" +import { type BytesLike, ethers, BigNumber, type BigNumberish, providers } from "ethers" + +const EXECUTOR_SWAP_FUNCTION = 'func_70LYiww' + +export type CallParams = { + isMandatory?: boolean, + target?: string, + gaslimit?: BigNumber, + value?: BigNumber +} + +export type PatchParams = { + skipOnZeroAmount?: boolean, + skipCallDataPatching?: boolean, + skipValuePatching?: boolean +} + +export function pathCallWithBalance( + calldata: BytesLike, + tokenAddress: string, + patchParams: PatchParams = { skipCallDataPatching: false, skipValuePatching: true } +) { + const executorInterface = SwapExecutor__factory.createInterface() + const skipMaskAndOffset = createPatchMask(calldata, patchParams) + calldata = executorInterface.encodeFunctionData("patchCallWithTokenBalance", [ + calldata, + skipMaskAndOffset, + tokenAddress, + ethers.constants.MaxUint256]) + return addCallParams(calldata) +} + +export function addCallParams( + calldata: BytesLike, + callParams?: CallParams +) { + let firstByte = 0 + if (callParams) { + if (callParams.value !== undefined) { + firstByte += 16 // 00010000 + const encodedValue = ethers.utils.solidityPack(['uint128'], [callParams.value]) + calldata = ethers.utils.hexlify(ethers.utils.concat([encodedValue, calldata])) + } + if (callParams.target !== undefined) { + firstByte += 32 // 00100000 + const encodedAddress = ethers.utils.solidityPack(['address'], [callParams.target]) + calldata = ethers.utils.hexlify(ethers.utils.concat([encodedAddress, calldata])) + } + if (callParams.gaslimit !== undefined) { + firstByte += 64 // 01000000 + const encodedGaslimit = ethers.utils.solidityPack(['uint32'], [callParams.gaslimit]) + calldata = ethers.utils.hexlify(ethers.utils.concat([encodedGaslimit, calldata])) + } + if (callParams.isMandatory !== undefined) firstByte += 128 // 10000000 + } + + const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) + calldata = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, calldata])) + return calldata +} + +export function createPatchMask(calldata: BytesLike, patchParams?: PatchParams) { + let firstByte = 0 + let mask = ethers.utils.solidityPack(["uint256"], [(calldata.length - 4) / 2 - 32]) + mask = ethers.utils.hexDataSlice(mask, 1) + if (patchParams) { + if (patchParams.skipOnZeroAmount !== undefined && patchParams.skipOnZeroAmount === false) { + firstByte += 32 + console.log(firstByte) + } + if (patchParams.skipCallDataPatching !== undefined && patchParams.skipCallDataPatching) { + firstByte += 64 + console.log(firstByte) + } + if (patchParams.skipValuePatching !== undefined && patchParams.skipValuePatching) { + firstByte += 128 + console.log(firstByte) + } + } + const encodedFirstByte = ethers.utils.solidityPack(["uint8"], [firstByte]) + mask = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, mask])) + console.log(mask) + return mask +} + +export function generateCalls(calls: BytesLike[]) { + const executorInterface = SwapExecutor__factory.createInterface() + return '0x' + executorInterface.encodeFunctionData(EXECUTOR_SWAP_FUNCTION, [ethers.constants.AddressZero, calls]).slice(74) +} + +export async function exchangeToNativeDecimals(token: PromiseOrValue, amount: BigNumberish, provider: providers.JsonRpcProvider) { + token = await token + let decimals = 18 + if (token !== ethers.constants.AddressZero) { + const contract = ERC20__factory.connect(token, provider) + decimals = await contract.decimals() + } + return BigNumber.from(amount).mul(BigNumber.from(10).pow(decimals)).div(BigNumber.from(10).pow(8)) +} \ No newline at end of file diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index c781c28..eb512ba 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -1,26 +1,22 @@ import type { ExchangeWithGenericSwap } from '@orionprotocol/contracts/lib/ethers-v5/Exchange.js'; -import { UniswapV3Pool__factory, ERC20__factory, SwapExecutor__factory, CurveRegistry__factory } from '@orionprotocol/contracts/lib/ethers-v5/index.js'; -import { BigNumber, ethers, type BigNumberish } from 'ethers'; -import { concat, defaultAbiCoder, type BytesLike } from 'ethers/lib/utils.js'; +import { ERC20__factory } from '@orionprotocol/contracts/lib/ethers-v5/index.js'; +import { type BytesLike, ethers, type BigNumberish, providers } from 'ethers'; import { safeGet, SafeArray } from '../../utils/safeGetters.js'; -import type Unit from '../index.js'; import { simpleFetch } from 'simple-typed-fetch'; -import type { PromiseOrValue } from '@orionprotocol/contracts/lib/ethers-v5/common.js'; +import type Unit from '../index.js'; +import { generateUni2Calls, generateUni2Call } from './callGenerators/uniswapV2.js'; +import { generateUni3Calls, generateOrion3Calls, generateUni3Call, generateOrion3Call } from './callGenerators/uniswapV3.js'; +import { exchangeToNativeDecimals, generateCalls, pathCallWithBalance } from './callGenerators/utils.js'; +import { generateApproveCall, generateTransferCall } from './callGenerators/erc20.js'; +import { generateCurveStableSwapCall } from './callGenerators/curve.js'; -const EXECUTOR_SWAP_FUNCTION = 'func_70LYiww' +export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3" export type SwapInfo = { pool: string assetIn: string assetOut: string - factory: string -} - -export type CallParams = { - isMandatory?: boolean - target?: string - gaslimit?: BigNumber - value?: BigNumber + factory: Factory } export type GenerateSwapCalldataParams = { @@ -35,81 +31,124 @@ export default async function generateSwapCalldata({ amount, minReturnAmount, receiverAddress, - path: path_, + path: arrayLikePath, unit }: GenerateSwapCalldataParams ): Promise<{ calldata: string, swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct }> { - if (path_ == undefined || path_.length == 0) { + if (arrayLikePath == undefined || arrayLikePath.length == 0) { throw new Error('Empty path'); } const wethAddress = safeGet(unit.contracts, 'WETH') const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); - let path = SafeArray.from(path_).map((swapInfo) => { + let path = SafeArray.from(arrayLikePath).map((swapInfo) => { swapInfo.assetIn = safeGet(assetToAddress, swapInfo.assetIn); swapInfo.assetOut = safeGet(assetToAddress, swapInfo.assetOut); return swapInfo; }) - const factory = path.first().factory - if (!path.every(swapInfo => swapInfo.factory === factory)) { - throw new Error('Supporting only swaps with single factory'); - } - const swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct = { - srcToken: path.first().assetIn, - dstToken: path.last().assetOut, - srcReceiver: swapExecutorContractAddress ?? '', + + const { factory, assetIn: srcToken } = path.first() + const dstToken = path.last().assetOut + + let swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct = { + srcToken: srcToken, + dstToken: dstToken, + srcReceiver: swapExecutorContractAddress, dstReceiver: receiverAddress, amount, minReturnAmount, flags: 0 } + const amountNativeDecimals = await exchangeToNativeDecimals(srcToken, amount, unit.provider); - const exchangeToNativeDecimals = async (token: PromiseOrValue) => { - token = await token - let decimals = 18 - if (token !== ethers.constants.AddressZero) { - const contract = ERC20__factory.connect(token, unit.provider) - decimals = await contract.decimals() - } - return BigNumber.from(amount).mul(BigNumber.from(10).pow(decimals)).div(BigNumber.from(10).pow(8)) - } - const amountNativeDecimals = await exchangeToNativeDecimals(swapDescription.srcToken); - - path = SafeArray.from(path_).map((swapInfo) => { + path = SafeArray.from(arrayLikePath).map((swapInfo) => { if (swapInfo.assetIn == ethers.constants.AddressZero) swapInfo.assetIn = wethAddress if (swapInfo.assetOut == ethers.constants.AddressZero) swapInfo.assetOut = wethAddress return swapInfo; }); + const isSingleFactorySwap = path.every(swapInfo => swapInfo.factory === factory) + let calldata: BytesLike + if (isSingleFactorySwap) { + ({ swapDescription, calldata } = await processSingleFactorySwaps( + factory, + swapDescription, + path, + exchangeContractAddress, + amountNativeDecimals, + swapExecutorContractAddress, + curveRegistryAddress, + unit.provider + )) + } else { + ({ swapDescription, calldata } = await processMultiFactorySwaps( + swapDescription, + path, + exchangeContractAddress, + amountNativeDecimals, + swapExecutorContractAddress, + curveRegistryAddress, + unit.provider + )) + } - let calldata: string + return { swapDescription, calldata } +} + +async function processSingleFactorySwaps( + factory: Factory, + swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct, + path: SafeArray, + recipient: string, + amount: BigNumberish, + swapExecutorContractAddress: string, + curveRegistryAddress: string, + provider: providers.JsonRpcProvider +) { + let calldata: BytesLike switch (factory) { case 'OrionV2': { swapDescription.srcReceiver = path.first().pool - calldata = await generateUni2Calls(exchangeContractAddress, path); + calldata = await generateUni2Calls(path, recipient); break; } case 'UniswapV2': { swapDescription.srcReceiver = path.first().pool - calldata = await generateUni2Calls(exchangeContractAddress, path); + calldata = await generateUni2Calls(path, recipient); break; } case 'UniswapV3': { - calldata = await generateUni3Calls(amountNativeDecimals, exchangeContractAddress, path, unit.provider) + calldata = await generateUni3Calls(path, amount, recipient, provider) break; } case 'OrionV3': { - calldata = await generateOrion3Calls(amountNativeDecimals, exchangeContractAddress, path, unit.provider) + calldata = await generateOrion3Calls(path, amount, recipient, provider) break; } case 'Curve': { - calldata = await generateCurveStableSwapCalls( - amountNativeDecimals, - exchangeContractAddress, - swapExecutorContractAddress ?? '', - path, - unit.provider, + if (path.length > 1) { + throw new Error('Supporting only single stable swap on curve') + } + const { pool, assetIn } = path.first() + const firstToken = ERC20__factory.connect(assetIn, provider) + const executorAllowance = await firstToken.allowance(swapExecutorContractAddress, pool) + const calls: BytesLike[] = [] + if (executorAllowance.lt(amount)) { + const approveCall = await generateApproveCall( + assetIn, + pool, + ethers.constants.MaxUint256 + ) + calls.push(approveCall) + } + let curveCall = await generateCurveStableSwapCall( + amount, + recipient, + path.first(), + provider, curveRegistryAddress ); + calls.push(curveCall) + calldata = await generateCalls(calls) break; } default: { @@ -119,174 +158,77 @@ export default async function generateSwapCalldata({ return { swapDescription, calldata } } -export async function generateUni2Calls( - exchangeAddress: string, - path: SafeArray -) { - const executorInterface = SwapExecutor__factory.createInterface() - const calls: BytesLike[] = [] - if (path.length > 1) { - for (let i = 0; i < path.length - 1; ++i) { - const currentSwap = path.get(i) - const nextSwap = path.get(i + 1) - - const calldata = executorInterface.encodeFunctionData('swapUniV2', [ - currentSwap.pool, - currentSwap.assetIn, - currentSwap.assetOut, - defaultAbiCoder.encode(['uint256'], [concat(['0x03', nextSwap.pool])]), - ] - ) - calls.push(addCallParams(calldata)) - } - } - const lastSwap = path.last(); - const calldata = executorInterface.encodeFunctionData('swapUniV2', [ - lastSwap.pool, - lastSwap.assetIn, - lastSwap.assetOut, - defaultAbiCoder.encode(['uint256'], [concat(['0x03', exchangeAddress])]), - ]) - calls.push(addCallParams(calldata)) - - return await generateCalls(calls) -} - -async function generateUni3Calls( - amount: BigNumberish, - exchangeContractAddress: string, +async function processMultiFactorySwaps( + swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct, path: SafeArray, - provider: ethers.providers.JsonRpcProvider + recipient: string, + amount: BigNumberish, + swapExecutorContractAddress: string, + curveRegistryAddress: string, + provider: providers.JsonRpcProvider ) { - const encodedPools: BytesLike[] = [] + let calls: BytesLike[] = [] for (const swap of path) { - const pool = UniswapV3Pool__factory.connect(swap.pool, provider) - const token0 = await pool.token0() - const zeroForOne = token0.toLowerCase() === swap.assetIn.toLowerCase() - const unwrapWETH = swap.assetOut === ethers.constants.AddressZero - - let encodedPool = ethers.utils.solidityPack(['uint256'], [pool.address]) - encodedPool = ethers.utils.hexDataSlice(encodedPool, 1) - let firstByte = 0 - if (unwrapWETH) firstByte += 32 - if (!zeroForOne) firstByte += 128 - const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) - encodedPool = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, encodedPool])) - encodedPools.push(encodedPool) - } - const executorInterface = SwapExecutor__factory.createInterface() - let calldata = executorInterface.encodeFunctionData('uniswapV3SwapTo', [encodedPools, exchangeContractAddress, amount]) - calldata = addCallParams(calldata) - - return await generateCalls([calldata]) -} - -async function generateOrion3Calls( - amount: BigNumberish, - exchangeContractAddress: string, - path: SafeArray, - provider: ethers.providers.JsonRpcProvider -) { - const encodedPools: BytesLike[] = [] - for (const swap of path) { - const pool = UniswapV3Pool__factory.connect(swap.pool, provider) - const token0 = await pool.token0() - const zeroForOne = token0.toLowerCase() === swap.assetIn.toLowerCase() - const unwrapWETH = swap.assetOut === ethers.constants.AddressZero - - let encodedPool = ethers.utils.solidityPack(['uint256'], [pool.address]) - encodedPool = ethers.utils.hexDataSlice(encodedPool, 1) - let firstByte = 0 - if (unwrapWETH) firstByte += 32 - if (!zeroForOne) firstByte += 128 - const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) - encodedPool = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, encodedPool])) - encodedPools.push(encodedPool) - } - const executorInterface = SwapExecutor__factory.createInterface() - let calldata = executorInterface.encodeFunctionData('orionV3SwapTo', [encodedPools, exchangeContractAddress, amount]) - calldata = addCallParams(calldata) - - return await generateCalls([calldata]) -} - -async function generateCurveStableSwapCalls( - amount: BigNumberish, - exchangeContractAddress: string, - executorAddress: string, - path: SafeArray, - provider: ethers.providers.JsonRpcProvider, - curveRegistry: string -) { - if (path.length > 1) { - throw new Error('Supporting only single stable swap on curve') - } - const executorInterface = SwapExecutor__factory.createInterface() - const registry = CurveRegistry__factory.connect(curveRegistry, provider) - - const swap = path.first() - const firstToken = ERC20__factory.connect(swap.assetIn, provider) - const { pool, assetIn, assetOut } = swap - const [i, j,] = await registry.get_coin_indices(pool, assetIn, assetOut) - - const executorAllowance = await firstToken.allowance(executorAddress, swap.pool) - const calls: BytesLike[] = [] - if (executorAllowance.lt(amount)) { - const calldata = addCallParams( - executorInterface.encodeFunctionData('safeApprove', [ - swap.assetIn, - swap.pool, - ethers.constants.MaxUint256 - ]) - ) - calls.push(calldata) - } - let calldata = executorInterface.encodeFunctionData('curveSwapStableAmountIn', [ - pool, - assetOut, - i, - j, - amount, - 0, - exchangeContractAddress]) - - calldata = addCallParams(calldata) - calls.push(calldata) - - return await generateCalls(calls) -} - -// Adds additional byte to single swap with settings -function addCallParams( - calldata: BytesLike, - callParams?: CallParams -) { - let firstByte = 0 - if (callParams) { - if (callParams.value !== undefined) { - firstByte += 16 // 00010000 - const encodedValue = ethers.utils.solidityPack(['uint128'], [callParams.value]) - calldata = ethers.utils.hexlify(ethers.utils.concat([encodedValue, calldata])) + switch (swap.factory) { + case 'OrionV2': { + let transferCall = await generateTransferCall(swap.assetIn, swap.pool, 0) + transferCall = pathCallWithBalance(transferCall, swap.assetIn) + const uni2Call = await generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress) + calls = calls.concat([transferCall, uni2Call]) + break; + } + case 'UniswapV2': { + let transferCall = await generateTransferCall(swap.assetIn, swap.pool, 0) + transferCall = pathCallWithBalance(transferCall, swap.assetIn) + const uni2Call = await generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress) + calls = calls.concat([transferCall, uni2Call]) + break; + } + case 'UniswapV3': { + let uni3Call = await generateUni3Call(swap, 0, swapExecutorContractAddress, provider) + uni3Call = pathCallWithBalance(uni3Call, swap.assetIn) + calls.push(uni3Call) + break; + } + case 'OrionV3': { + let orion3Call = await generateOrion3Call(swap, 0, swapExecutorContractAddress, provider) + orion3Call = pathCallWithBalance(orion3Call, swap.assetIn) + calls.push(orion3Call) + break; + } + case 'Curve': { + const { pool, assetIn } = swap + const firstToken = ERC20__factory.connect(assetIn, provider) + const executorAllowance = await firstToken.allowance(swapExecutorContractAddress, pool) + if (executorAllowance.lt(amount)) { + const approveCall = await generateApproveCall( + assetIn, + pool, + ethers.constants.MaxUint256 + ) + calls.push(approveCall) + } + let curveCall = await generateCurveStableSwapCall( + amount, + swapExecutorContractAddress, + swap, + provider, + curveRegistryAddress + ); + curveCall = pathCallWithBalance(curveCall, swap.assetIn) + calls.push(curveCall) + break; + } + default: { + throw new Error(`Factory ${swap.factory} is not supported`) + } } - if (callParams.target !== undefined) { - firstByte += 32 // 00100000 - const encodedAddress = ethers.utils.solidityPack(['address'], [callParams.target]) - calldata = ethers.utils.hexlify(ethers.utils.concat([encodedAddress, calldata])) - } - if (callParams.gaslimit !== undefined) { - firstByte += 64 // 01000000 - const encodedGaslimit = ethers.utils.solidityPack(['uint32'], [callParams.gaslimit]) - calldata = ethers.utils.hexlify(ethers.utils.concat([encodedGaslimit, calldata])) - } - if (callParams.isMandatory !== undefined) firstByte += 128 // 10000000 } + const dstToken = await swapDescription.dstToken + let finalTransferCall = await generateTransferCall(dstToken, recipient, 0) + finalTransferCall = pathCallWithBalance(finalTransferCall, dstToken) + calls.push(finalTransferCall) + const calldata = await generateCalls(calls) - const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) - calldata = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, calldata])) - return calldata -} - -async function generateCalls(calls: BytesLike[]) { - const executorInterface = SwapExecutor__factory.createInterface() - return '0x' + executorInterface.encodeFunctionData(EXECUTOR_SWAP_FUNCTION, [ethers.constants.AddressZero, calls]).slice(74) -} + return { swapDescription, calldata } +} \ No newline at end of file diff --git a/src/services/BlockchainService/schemas/infoSchema.ts b/src/services/BlockchainService/schemas/infoSchema.ts index 2c9ef32..472a895 100644 --- a/src/services/BlockchainService/schemas/infoSchema.ts +++ b/src/services/BlockchainService/schemas/infoSchema.ts @@ -11,7 +11,7 @@ const infoSchema = z.object({ chainId: z.number(), chainName: z.string(), exchangeContractAddress: z.string(), - swapExecutorContractAddress: z.string().optional(), + swapExecutorContractAddress: z.string(), oracleContractAddress: z.string(), matcherAddress: z.string(), orderFeePercent: z.number(), From d6b1c625b3dc6e8108e01915f054877ed2062052 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 27 Sep 2023 16:20:35 +0300 Subject: [PATCH 031/225] add veORN method --- package-lock.json | 4 +-- package.json | 2 +- src/services/Integrator/index.ts | 28 ++++++++++++++++--- src/services/Integrator/schemas/index.ts | 1 + .../Integrator/schemas/veORN-info-schema.ts | 26 +++++++++++++++++ 5 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 src/services/Integrator/schemas/veORN-info-schema.ts diff --git a/package-lock.json b/package-lock.json index 8f4d0e7..f08d407 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc0", + "version": "0.19.89-rc1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc0", + "version": "0.19.89-rc1", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 27749e9..b6df1a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc0", + "version": "0.19.89-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index ebb36ce..76efab4 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -3,6 +3,7 @@ import { getPoolResponseSchema, listNFTOrderResponseSchema, listPoolResponseSchema, + veORNInfoSchema, } from './schemas/index.js'; import { fetchWithValidation } from 'simple-typed-fetch'; @@ -35,11 +36,18 @@ type ListPoolPayload = BasePayload & { params: [string] }; +type VeORNInfoPayload = BasePayload & { + model: 'veORN' + method: 'info' + params: [string] +} + type Payload = - | GetEnvironmentPayload - | ListNFTOrderPayload - | GetPoolInfoPayload - | ListPoolPayload; + | GetEnvironmentPayload + | ListNFTOrderPayload + | GetPoolInfoPayload + | ListPoolPayload + | VeORNInfoPayload; class IntegratorService { private readonly apiUrl: string; @@ -58,6 +66,7 @@ class IntegratorService { this.listNFTOrder = this.listNFTOrder.bind(this); this.getPoolInfo = this.getPoolInfo.bind(this); this.listPool = this.listPool.bind(this); + this.veORNInfo = this.veORNInfo.bind(this); } makeRPCPayload = (payload: Omit) => { @@ -115,6 +124,17 @@ class IntegratorService { }), }); } + + private readonly veORNInfo = (address: string) => { + return fetchWithValidation(this.apiUrl, veORNInfoSchema, { + method: 'POST', + body: this.makeRPCPayload({ + model: 'veORN', + method: 'info', + params: [address] + }) + }) + } } export * as schemas from './schemas/index.js'; diff --git a/src/services/Integrator/schemas/index.ts b/src/services/Integrator/schemas/index.ts index 1d09d6e..a8cca95 100644 --- a/src/services/Integrator/schemas/index.ts +++ b/src/services/Integrator/schemas/index.ts @@ -2,3 +2,4 @@ export { default as environmentResponseSchema } from './environment-response-sch export { default as listNFTOrderResponseSchema } from './list-nft-order-response-schema.js'; export { default as getPoolResponseSchema } from './get-pool-response-schema.js'; export { default as listPoolResponseSchema } from './list-pool-response-schema.js'; +export { default as veORNInfoSchema } from './veORN-info-schema.js'; diff --git a/src/services/Integrator/schemas/veORN-info-schema.ts b/src/services/Integrator/schemas/veORN-info-schema.ts new file mode 100644 index 0000000..67f0602 --- /dev/null +++ b/src/services/Integrator/schemas/veORN-info-schema.ts @@ -0,0 +1,26 @@ +import { z } from 'zod'; +import { evmAddressSchema } from './util-schemas.js'; +import infoSchema from './info-schema.js'; + +const veORNResultSchema = z.object({ + avgAPR: z.number(), + minAPR: z.number(), + maxAPR: z.number(), + veTOKENAddress: evmAddressSchema, + totalORNLocked: z.number(), + totalVeORN: z.number(), + weekly_reward: z.number(), + userAPR: z.number(), + userVeORN: z.number(), + userORNLocked: z.number(), + userPeriodLock: z.number(), + userReward: z.number(), + userWeeklyReward: z.number() +}); + +const veORNInfoSchema = z.object({ + result: veORNResultSchema, + info: infoSchema, +}); + +export default veORNInfoSchema; From b6e6a57d2cb97112b5814432667e2fabcc597270 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 27 Sep 2023 16:46:57 +0300 Subject: [PATCH 032/225] make veORN method public --- package.json | 2 +- src/services/Integrator/index.ts | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index b6df1a3..04fe10b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc1", + "version": "0.19.89-rc2", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index 76efab4..e5a1aa0 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -77,6 +77,17 @@ class IntegratorService { }); }; + veORNInfo = (address: string) => { + return fetchWithValidation(this.apiUrl, veORNInfoSchema, { + method: 'POST', + body: this.makeRPCPayload({ + model: 'veORN', + method: 'info', + params: [address] + }) + }) + } + private readonly getEnvironment = () => { return fetchWithValidation(this.apiUrl, environmentResponseSchema, { method: 'POST', @@ -124,17 +135,6 @@ class IntegratorService { }), }); } - - private readonly veORNInfo = (address: string) => { - return fetchWithValidation(this.apiUrl, veORNInfoSchema, { - method: 'POST', - body: this.makeRPCPayload({ - model: 'veORN', - method: 'info', - params: [address] - }) - }) - } } export * as schemas from './schemas/index.js'; From 14b05af8503cf2966c564b6d60d04565c82a1276 Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Wed, 27 Sep 2023 17:50:23 +0400 Subject: [PATCH 033/225] orionprotocol.io replaces with orion.xyz --- src/config/chains.json | 6 ++-- src/config/envs.json | 68 +++++++++++++++++++++--------------------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/config/chains.json b/src/config/chains.json index ea3dd8e..33b7724 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -5,7 +5,7 @@ "label": "Ethereum", "shortName": "ETH", "code": "eth", - "rpc": "https://trade.orionprotocol.io/eth-mainnet/rpc", + "rpc": "https://trade.orion.xyz/eth-mainnet/rpc", "baseCurrencyName": "ETH", "contracts": { "WETH": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", @@ -44,7 +44,7 @@ "label": "Ropsten", "shortName": "ETH-Ropsten", "code": "eth", - "rpc": "https://testing.orionprotocol.io/eth-ropsten/rpc", + "rpc": "https://testing.orion.xyz/eth-ropsten/rpc", "baseCurrencyName": "ETH", "contracts": { "WETH": "", @@ -57,7 +57,7 @@ "label": "Goerli", "shortName": "ETH-Goerli", "code": "eth", - "rpc": "https://testing.orionprotocol.io/eth-goerli/rpc", + "rpc": "https://testing.orion.xyz/eth-goerli/rpc", "baseCurrencyName": "ETH", "contracts": { "WETH": "", diff --git a/src/config/envs.json b/src/config/envs.json index fd2bb30..1c193bf 100644 --- a/src/config/envs.json +++ b/src/config/envs.json @@ -1,10 +1,10 @@ { "production": { - "analyticsAPI": "https://trade.orionprotocol.io/api/stats", - "referralAPI": "https://trade.orionprotocol.io/referral-api", + "analyticsAPI": "https://trade.orion.xyz/api/stats", + "referralAPI": "https://trade.orion.xyz/referral-api", "networks": { "1": { - "api": "https://trade.orionprotocol.io/eth-mainnet", + "api": "https://trade.orion.xyz/eth-mainnet", "services": { "aggregator": { "http": "/backend", @@ -20,7 +20,7 @@ "liquidityMigratorAddress": "0x23a1820a47BcD022E29f6058a5FD224242F50D1A" }, "56": { - "api": "https://trade.orionprotocol.io/bsc-mainnet", + "api": "https://trade.orion.xyz/bsc-mainnet", "services": { "aggregator": { "http": "/backend", @@ -35,7 +35,7 @@ } }, "250": { - "api": "https://trade.orionprotocol.io/ftm-mainnet", + "api": "https://trade.orion.xyz/ftm-mainnet", "services": { "aggregator": { "http": "/backend", @@ -50,7 +50,7 @@ } }, "137": { - "api": "https://trade.orionprotocol.io/polygon-mainnet", + "api": "https://trade.orion.xyz/polygon-mainnet", "services": { "aggregator": { "http": "/backend", @@ -65,7 +65,7 @@ } }, "66": { - "api": "https://trade.orionprotocol.io/okc-mainnet", + "api": "https://trade.orion.xyz/okc-mainnet", "services": { "aggregator": { "http": "/backend", @@ -82,11 +82,11 @@ } }, "testing": { - "analyticsAPI": "https://trade.orionprotocol.io/api/stats", - "referralAPI": "https://testing.orionprotocol.io/referral-api", + "analyticsAPI": "https://trade.orion.xyz/api/stats", + "referralAPI": "https://testing.orion.xyz/referral-api", "networks": { "97": { - "api": "https://testing.orionprotocol.io/bsc-testnet", + "api": "https://testing.orion.xyz/bsc-testnet", "services": { "aggregator": { "http": "/backend", @@ -102,7 +102,7 @@ "liquidityMigratorAddress": "0x01b10dds12478C88A5E18e2707E729906bC25CfF6" }, "5": { - "api": "https://testing.orionprotocol.io/eth-goerli", + "api": "https://testing.orion.xyz/eth-goerli", "services": { "aggregator": { "http": "/backend", @@ -117,7 +117,7 @@ } }, "421613": { - "api": "https://testing.orionprotocol.io/arbitrum-goerli", + "api": "https://testing.orion.xyz/arbitrum-goerli", "services": { "aggregator": { "http": "/backend", @@ -132,7 +132,7 @@ } }, "4002": { - "api": "https://testing.orionprotocol.io/ftm-testnet", + "api": "https://testing.orion.xyz/ftm-testnet", "services": { "aggregator": { "http": "/backend", @@ -147,7 +147,7 @@ } }, "80001": { - "api": "https://testing.orionprotocol.io/polygon-mumbai", + "api": "https://testing.orion.xyz/polygon-mumbai", "services": { "aggregator": { "http": "/backend", @@ -162,7 +162,7 @@ } }, "56303": { - "api": "https://testing.orionprotocol.io/drip-testnet", + "api": "https://testing.orion.xyz/drip-testnet", "services": { "aggregator": { "http": "/backend", @@ -179,11 +179,11 @@ } }, "staging": { - "analyticsAPI": "https://trade.orionprotocol.io/api/stats", - "referralAPI": "https://staging.orionprotocol.io/referral-api", + "analyticsAPI": "https://trade.orion.xyz/api/stats", + "referralAPI": "https://staging.orion.xyz/referral-api", "networks": { "1": { - "api": "https://staging.orionprotocol.io/eth-mainnet", + "api": "https://staging.orion.xyz/eth-mainnet", "services": { "aggregator": { "http": "/backend", @@ -198,7 +198,7 @@ } }, "56": { - "api": "https://staging.orionprotocol.io/bsc-mainnet", + "api": "https://staging.orion.xyz/bsc-mainnet", "services": { "aggregator": { "http": "/backend", @@ -213,7 +213,7 @@ } }, "250": { - "api": "https://staging.orionprotocol.io/ftm-mainnet", + "api": "https://staging.orion.xyz/ftm-mainnet", "services": { "aggregator": { "http": "/backend", @@ -228,7 +228,7 @@ } }, "137": { - "api": "https://staging.orionprotocol.io/polygon-mainnet", + "api": "https://staging.orion.xyz/polygon-mainnet", "services": { "aggregator": { "http": "/backend", @@ -243,7 +243,7 @@ } }, "66": { - "api": "https://staging.orionprotocol.io/okc-mainnet", + "api": "https://staging.orion.xyz/okc-mainnet", "services": { "aggregator": { "http": "/backend", @@ -260,11 +260,11 @@ } }, "experimental": { - "analyticsAPI": "https://trade.orionprotocol.io/api/stats", - "referralAPI": "https://testing.orionprotocol.io/referral-api", + "analyticsAPI": "https://trade.orion.xyz/api/stats", + "referralAPI": "https://testing.orion.xyz/referral-api", "networks": { "97": { - "api": "https://dn-dev.orionprotocol.io/bsc-testnet", + "api": "https://dn-dev.orion.xyz/bsc-testnet", "services": { "aggregator": { "http": "/backend", @@ -279,7 +279,7 @@ } }, "3": { - "api": "https://dn-dev.orionprotocol.io/eth-ropsten", + "api": "https://dn-dev.orion.xyz/eth-ropsten", "services": { "aggregator": { "http": "/backend", @@ -296,11 +296,11 @@ } }, "kucoin-production": { - "analyticsAPI": "https://trade.orionprotocol.io/api/stats", - "referralAPI": "https://trade.orionprotocol.io/referral-api", + "analyticsAPI": "https://trade.orion.xyz/api/stats", + "referralAPI": "https://trade.orion.xyz/referral-api", "networks": { "1": { - "api": "https://trade.orionprotocol.io/eth-mainnet", + "api": "https://trade.orion.xyz/eth-mainnet", "services": { "aggregator": { "http": "/backend", @@ -316,7 +316,7 @@ "liquidityMigratorAddress": "0x23a1820a47BcD022E29f6058a5FD224242F50D1A" }, "56": { - "api": "https://trade.orionprotocol.io/bsc-mainnet", + "api": "https://trade.orion.xyz/bsc-mainnet", "services": { "aggregator": { "http": "/backend", @@ -331,7 +331,7 @@ } }, "250": { - "api": "https://trade.orionprotocol.io/ftm-mainnet", + "api": "https://trade.orion.xyz/ftm-mainnet", "services": { "aggregator": { "http": "/backend", @@ -346,7 +346,7 @@ } }, "137": { - "api": "https://trade.orionprotocol.io/polygon-mainnet", + "api": "https://trade.orion.xyz/polygon-mainnet", "services": { "aggregator": { "http": "/backend", @@ -361,7 +361,7 @@ } }, "66": { - "api": "https://trade.orionprotocol.io/okc-mainnet", + "api": "https://trade.orion.xyz/okc-mainnet", "services": { "aggregator": { "http": "/backend", @@ -377,4 +377,4 @@ } } } -} \ No newline at end of file +} From 24d2a14f535b8bc48f37cbb8980553734c883713 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Wed, 27 Sep 2023 18:21:35 +0400 Subject: [PATCH 034/225] bump --- package.json | 2 +- src/Unit/Exchange/callGenerators/curve.ts | 3 ++- src/Unit/Exchange/callGenerators/uniswapV3.ts | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 72b0b06..74c9320 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89", + "version": "0.19.89-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/callGenerators/curve.ts b/src/Unit/Exchange/callGenerators/curve.ts index 422ef0f..5bb68de 100644 --- a/src/Unit/Exchange/callGenerators/curve.ts +++ b/src/Unit/Exchange/callGenerators/curve.ts @@ -1,6 +1,7 @@ import { SwapExecutor__factory, CurveRegistry__factory } from "@orionprotocol/contracts/lib/ethers-v5/index.js" import type { BigNumberish, providers } from "ethers" import type { SwapInfo } from "../generateSwapCalldata.js" +import { addCallParams } from "./utils.js" export async function generateCurveStableSwapCall( amount: BigNumberish, @@ -23,5 +24,5 @@ export async function generateCurveStableSwapCall( amount, ]) - return calldata + return addCallParams(calldata) } \ No newline at end of file diff --git a/src/Unit/Exchange/callGenerators/uniswapV3.ts b/src/Unit/Exchange/callGenerators/uniswapV3.ts index 18abb49..21fadd8 100644 --- a/src/Unit/Exchange/callGenerators/uniswapV3.ts +++ b/src/Unit/Exchange/callGenerators/uniswapV3.ts @@ -16,7 +16,7 @@ export async function generateUni3Call( const executorInterface = SwapExecutor__factory.createInterface() let calldata = executorInterface.encodeFunctionData('uniswapV3SingleSwapTo', [encodedPool, recipient, amount]) - return calldata + return addCallParams(calldata) } export async function generateOrion3Call( @@ -31,7 +31,7 @@ export async function generateOrion3Call( const executorInterface = SwapExecutor__factory.createInterface() let calldata = executorInterface.encodeFunctionData('orionV3SingleSwapTo', [encodedPool, recipient, amount]) - return calldata + return addCallParams(calldata) } export async function generateUni3Calls( From 8453f92a7f8af560520df2cc00300fc3a2719448 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 27 Sep 2023 17:28:10 +0300 Subject: [PATCH 035/225] update config --- package-lock.json | 4 +-- package.json | 2 +- src/config/envs.json | 69 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index f08d407..0cffd32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc1", + "version": "0.19.89-rc3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc1", + "version": "0.19.89-rc3", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 04fe10b..a89b8e5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc2", + "version": "0.19.89-rc3", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/config/envs.json b/src/config/envs.json index fd2bb30..bad0b9d 100644 --- a/src/config/envs.json +++ b/src/config/envs.json @@ -15,6 +15,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } }, "liquidityMigratorAddress": "0x23a1820a47BcD022E29f6058a5FD224242F50D1A" @@ -31,6 +34,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -46,6 +52,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -61,6 +70,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -76,6 +88,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } } @@ -97,6 +112,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } }, "liquidityMigratorAddress": "0x01b10dds12478C88A5E18e2707E729906bC25CfF6" @@ -113,6 +131,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -128,6 +149,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -143,6 +167,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -158,6 +185,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -173,6 +203,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } } @@ -194,6 +227,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -209,6 +245,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -224,6 +263,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -239,6 +281,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -254,6 +299,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } } @@ -275,6 +323,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -290,6 +341,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } } @@ -311,6 +365,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } }, "liquidityMigratorAddress": "0x23a1820a47BcD022E29f6058a5FD224242F50D1A" @@ -327,6 +384,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -342,6 +402,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -357,6 +420,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } }, @@ -372,6 +438,9 @@ }, "priceFeed": { "all": "/price-feed" + }, + "integrator": { + "http": "http://65.109.97.170:33000" } } } From 7c0c057e0fee8f94b29bccde9c02bdf7b7160130 Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Wed, 27 Sep 2023 18:40:31 +0400 Subject: [PATCH 036/225] Bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index da99f7a..cd32b98 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.88", + "version": "0.19.89", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 4ac13992eb67a59290843a09e5f7f6d3b09dc960 Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Wed, 27 Sep 2023 18:45:26 +0400 Subject: [PATCH 037/225] Bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cd32b98..d589054 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89", + "version": "0.19.90", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 1227562402d9052d37126238c7c5595f96082112 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 27 Sep 2023 17:55:01 +0300 Subject: [PATCH 038/225] fix hex validation --- package-lock.json | 4 +- package.json | 2 +- src/config/envs.json | 46 +++++++++---------- .../Integrator/schemas/util-schemas.ts | 2 +- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0cffd32..6df12c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc3", + "version": "0.19.89-rc4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc3", + "version": "0.19.89-rc4", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index a89b8e5..8addc9d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc3", + "version": "0.19.89-rc4", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/config/envs.json b/src/config/envs.json index bad0b9d..00e4268 100644 --- a/src/config/envs.json +++ b/src/config/envs.json @@ -17,7 +17,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } }, "liquidityMigratorAddress": "0x23a1820a47BcD022E29f6058a5FD224242F50D1A" @@ -36,7 +36,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -54,7 +54,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -72,7 +72,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -90,7 +90,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } } @@ -114,7 +114,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } }, "liquidityMigratorAddress": "0x01b10dds12478C88A5E18e2707E729906bC25CfF6" @@ -133,7 +133,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -151,7 +151,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -169,7 +169,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -187,7 +187,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -205,7 +205,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } } @@ -229,7 +229,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -247,7 +247,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -265,7 +265,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -283,7 +283,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -301,7 +301,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } } @@ -325,7 +325,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -343,7 +343,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } } @@ -367,7 +367,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } }, "liquidityMigratorAddress": "0x23a1820a47BcD022E29f6058a5FD224242F50D1A" @@ -386,7 +386,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -404,7 +404,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -422,7 +422,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } }, @@ -440,7 +440,7 @@ "all": "/price-feed" }, "integrator": { - "http": "http://65.109.97.170:33000" + "http": "/orion-integrator/" } } } diff --git a/src/services/Integrator/schemas/util-schemas.ts b/src/services/Integrator/schemas/util-schemas.ts index 0d58a75..f0e80b2 100644 --- a/src/services/Integrator/schemas/util-schemas.ts +++ b/src/services/Integrator/schemas/util-schemas.ts @@ -9,6 +9,6 @@ export const evmAddressSchema = z export const hexStringSchema = z .string() - .refine(ethers.utils.isAddress, (v) => ({ + .refine(ethers.utils.isHexString, (v) => ({ message: `${v} is not a valid hex string`, })); From 0b212bbbd9d566e1c5c38e5036963bed226e6030 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 27 Sep 2023 18:13:37 +0300 Subject: [PATCH 039/225] bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6df12c7..c51fd01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc4", + "version": "0.19.89-rc5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc4", + "version": "0.19.89-rc5", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 8addc9d..6573e2f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc4", + "version": "0.19.89-rc5", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From bcf0a3c4d0b04d27c047bc17f255b699e71344f1 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 28 Sep 2023 10:45:04 +0300 Subject: [PATCH 040/225] fix publishing --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index c51fd01..97b6cdc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc5", + "version": "0.19.89-rc6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc5", + "version": "0.19.89-rc6", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 6573e2f..fee5419 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc5", + "version": "0.19.89-rc6", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 27c426e815379a86d375a61ccf9844bb88dae5f5 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Thu, 28 Sep 2023 12:33:13 +0300 Subject: [PATCH 041/225] bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0196ef9..0e30774 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.88-rc1", + "version": "0.19.91", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.88-rc1", + "version": "0.19.91", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 426e014..4e7d8fc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.88-rc1", + "version": "0.19.91", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From c2a40841589b8a117cde35123dc30229260a36ac Mon Sep 17 00:00:00 2001 From: Oleg Nechiporenko Date: Thu, 7 Sep 2023 00:12:07 +0300 Subject: [PATCH 042/225] feat: update ethers@6 fix: bigint errors fix: TS errors fix: gasLimit fetch fix: review comments fix: contracts errors chore: bump rc version fix: revert wrong fix fix: ts config fix: ts config fix: ts config feat: update signer --- docs/INTEGRATION.md | 2 +- package-lock.json | 350 ++++-------------- package.json | 4 +- src/BalanceGuard.ts | 46 ++- src/Orion/bridge/getHistory.ts | 4 +- src/Orion/bridge/index.ts | 2 +- src/Orion/bridge/swap.ts | 74 ++-- src/Unit/Exchange/deposit.ts | 28 +- src/Unit/Exchange/generateSwapCalldata.ts | 91 ++--- src/Unit/Exchange/getSwapInfo.ts | 10 +- src/Unit/Exchange/swapLimit.ts | 32 +- src/Unit/Exchange/swapMarket.ts | 36 +- src/Unit/Exchange/withdraw.ts | 26 +- src/Unit/FarmingManager/index.ts | 99 ++--- src/Unit/index.ts | 6 +- src/__tests__/basic.test.ts | 6 +- src/__tests__/fee.test.ts | 2 +- src/addressSchema.ts | 2 +- src/crypt/hashOrder.ts | 2 +- src/crypt/signCancelOrder.ts | 7 +- src/crypt/signCancelOrderPersonal.ts | 7 +- src/crypt/signOrder.ts | 19 +- src/crypt/signOrderPersonal.ts | 8 +- src/services/Aggregator/index.ts | 4 +- .../Aggregator/schemas/orderSchema.ts | 24 +- .../schemas/atomicHistorySchema.ts | 6 +- .../schemas/contractsAddressesSchema.ts | 4 +- src/utils/calculateNetworkFee.ts | 2 +- src/utils/checkIsToken.ts | 6 +- src/utils/denormalizeNumber.ts | 5 +- src/utils/generateSecret.ts | 2 +- src/utils/getAvailableFundsSources.ts | 2 +- src/utils/getBalance.ts | 14 +- src/utils/getBalances.ts | 4 +- src/utils/getNativeCryptocurrencyName.ts | 2 +- src/utils/normalizeNumber.ts | 14 +- src/utils/parseExchangeTradeTransaction.ts | 62 ++-- tsconfig.json | 3 +- 38 files changed, 409 insertions(+), 608 deletions(-) diff --git a/docs/INTEGRATION.md b/docs/INTEGRATION.md index d1110f3..95798ec 100644 --- a/docs/INTEGRATION.md +++ b/docs/INTEGRATION.md @@ -28,7 +28,7 @@ import { BaseProvider } from "@metamask/providers"; import { ethers } from "ethers"; const startApp = async (provider: BaseProvider) => { - const web3Provider = new ethers.providers.Web3Provider(provider); + const web3Provider = new ethers.Web3Provider(provider); await web3Provider.ready; const signer = web3Provider.getSigner(); // ready to go }; diff --git a/package-lock.json b/package-lock.json index 0e30774..52dd706 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.91", + "version": "0.19.92-rc0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.91", + "version": "0.19.92-rc0", "hasInstallScript": true, "license": "ISC", "dependencies": { @@ -17,7 +17,7 @@ "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", "buffer": "^6.0.3", - "ethers": "^5.6.2", + "ethers": "^6.7.1", "express": "^4.18.2", "isomorphic-ws": "^5.0.0", "just-clone": "^6.2.0", @@ -76,6 +76,11 @@ "node": ">=0.10.0" } }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", + "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -1052,32 +1057,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, "node_modules/@ethersproject/abstract-provider": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", @@ -1239,33 +1218,6 @@ "@ethersproject/bignumber": "^5.7.0" } }, - "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, "node_modules/@ethersproject/hash": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", @@ -1292,65 +1244,6 @@ "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, "node_modules/@ethersproject/keccak256": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", @@ -1403,25 +1296,6 @@ "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, "node_modules/@ethersproject/properties": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", @@ -1578,29 +1452,6 @@ "hash.js": "1.1.7" } }, - "node_modules/@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, "node_modules/@ethersproject/strings": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", @@ -1647,58 +1498,6 @@ "@ethersproject/signing-key": "^5.7.0" } }, - "node_modules/@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, "node_modules/@ethersproject/web": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", @@ -1721,28 +1520,6 @@ "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, "node_modules/@fastify/deepmerge": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-1.3.0.tgz", @@ -2583,6 +2360,28 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@noble/hashes": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3459,9 +3258,9 @@ } }, "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" }, "node_modules/ajv": { "version": "6.12.6", @@ -5526,13 +5325,13 @@ } }, "node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", + "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", "funding": [ { "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + "url": "https://github.com/sponsors/ethers-io/" }, { "type": "individual", @@ -5540,36 +5339,46 @@ } ], "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" + "@adraffy/ens-normalize": "1.9.2", + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.7.1", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/ethers/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/ethers/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/events": { @@ -10260,11 +10069,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", diff --git a/package.json b/package.json index 4e7d8fc..a99395b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.91", + "version": "0.19.92-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -91,7 +91,7 @@ "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", "buffer": "^6.0.3", - "ethers": "^5.6.2", + "ethers": "^6.7.1", "express": "^4.18.2", "isomorphic-ws": "^5.0.0", "just-clone": "^6.2.0", diff --git a/src/BalanceGuard.ts b/src/BalanceGuard.ts index 42bbb23..9434591 100644 --- a/src/BalanceGuard.ts +++ b/src/BalanceGuard.ts @@ -1,7 +1,7 @@ import { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; import clone from 'just-clone'; -import { ERC20__factory } from '@orionprotocol/contracts/lib/ethers-v5/index.js'; +import { ERC20__factory } from '@orionprotocol/contracts/lib/ethers-v6'; import { APPROVE_ERC20_GAS_LIMIT, NATIVE_CURRENCY_PRECISION } from './constants/index.js'; import type { AggregatedBalanceRequirement, ApproveFix, Asset, BalanceIssue, BalanceRequirement, Source, @@ -24,7 +24,7 @@ export default class BalanceGuard { private readonly nativeCryptocurrency: Asset; - private readonly provider: ethers.providers.Provider; + private readonly provider: ethers.Provider; private readonly signer: ethers.Signer; @@ -33,7 +33,7 @@ export default class BalanceGuard { constructor( balances: Partial>>, nativeCryptocurrency: Asset, - provider: ethers.providers.Provider, + provider: ethers.Provider, signer: ethers.Signer, logger?: (message: string) => void, ) { @@ -62,10 +62,10 @@ export default class BalanceGuard { const walletAddress = await this.signer.getAddress(); const tokenContract = ERC20__factory .connect(assetAddress, this.provider); - const unsignedTx = await tokenContract.populateTransaction - .approve( + const unsignedTx = await tokenContract.approve + .populateTransaction( spenderAddress, - ethers.constants.MaxUint256, + ethers.MaxUint256, ); unsignedTx.from = walletAddress; let resetRequired = false; @@ -117,21 +117,23 @@ export default class BalanceGuard { const approve = async ({ spenderAddress, targetAmount }: ApproveFix) => { const bnTargetAmount = new BigNumber(targetAmount); const unsignedApproveTx = await tokenContract - .populateTransaction - .approve( + .approve.populateTransaction( spenderAddress, bnTargetAmount.isZero() ? '0' // Reset - : ethers.constants.MaxUint256, // Infinite approve + : ethers.MaxUint256, // Infinite approve ); const walletAddress = await this.signer.getAddress(); const nonce = await this.provider.getTransactionCount(walletAddress, 'pending'); - const gasPrice = await this.provider.getGasPrice(); + const { gasPrice, maxFeePerGas } = await this.provider.getFeeData(); const network = await this.provider.getNetwork(); + if (gasPrice !== null && maxFeePerGas !== null) { + unsignedApproveTx.gasPrice = gasPrice; + unsignedApproveTx.maxFeePerGas = maxFeePerGas; + } unsignedApproveTx.chainId = network.chainId; - unsignedApproveTx.gasPrice = gasPrice; unsignedApproveTx.nonce = nonce; unsignedApproveTx.from = walletAddress; const gasLimit = await this.provider.estimateGas(unsignedApproveTx); @@ -139,7 +141,7 @@ export default class BalanceGuard { this.logger?.('Approve transaction signing...'); const signedTx = await this.signer.signTransaction(unsignedApproveTx); - const txResponse = await this.provider.sendTransaction(signedTx); + const txResponse = await this.provider.broadcastTransaction(signedTx); this.logger?.(`${issue.asset.name} approve transaction sent ${txResponse.hash}. Waiting for confirmation...`); await txResponse.wait(); this.logger?.(`${issue.asset.name} approve transaction confirmed.`); @@ -230,7 +232,7 @@ export default class BalanceGuard { const lackAmount = remainingBalance.exchange.abs(); // e.g. -435.234234 to 434.234234 let denormalizedAllowance: BigNumber; - if (asset.address === ethers.constants.AddressZero) { + if (asset.address === ethers.ZeroAddress) { denormalizedAllowance = remainingBalance.wallet; } else { if (spenderAddress === undefined) throw new Error(`Spender address is required for ${asset.name}`); @@ -272,13 +274,11 @@ export default class BalanceGuard { asset.address, spenderAddress, ); - const gasPriceWei = await this.provider.getGasPrice(); - const approveTransactionCost = ethers.BigNumber - .from(APPROVE_ERC20_GAS_LIMIT) - .mul(gasPriceWei); + const { gasPrice: gasPriceWei } = await this.provider.getFeeData(); + const approveTransactionCost = BigInt(APPROVE_ERC20_GAS_LIMIT) * (gasPriceWei ?? 0n); const denormalizedApproveTransactionCost = denormalizeNumber( approveTransactionCost, - NATIVE_CURRENCY_PRECISION + BigInt(NATIVE_CURRENCY_PRECISION) ); requiredApproves.items = { @@ -329,7 +329,7 @@ export default class BalanceGuard { .reduce((p, c) => (c !== undefined ? p.plus(c) : p), new BigNumber(0)); let denormalizedAllowance: BigNumber; - if (asset.address === ethers.constants.AddressZero) { + if (asset.address === ethers.ZeroAddress) { denormalizedAllowance = remainingBalance.wallet; } else { if (spenderAddress === undefined) throw new Error(`Spender address is required for ${asset.name}`); @@ -365,13 +365,11 @@ export default class BalanceGuard { asset.address, spenderAddress, ); - const gasPriceWei = await this.provider.getGasPrice(); - const approveTransactionCost = ethers.BigNumber - .from(APPROVE_ERC20_GAS_LIMIT) - .mul(gasPriceWei); + const { gasPrice: gasPriceWei } = await this.provider.getFeeData(); + const approveTransactionCost = BigInt(APPROVE_ERC20_GAS_LIMIT) * (gasPriceWei ?? 0n); const denormalizedApproveTransactionCost = denormalizeNumber( approveTransactionCost, - NATIVE_CURRENCY_PRECISION + BigInt(NATIVE_CURRENCY_PRECISION) ); requiredApproves.items = { diff --git a/src/Orion/bridge/getHistory.ts b/src/Orion/bridge/getHistory.ts index 0cce384..13da84b 100644 --- a/src/Orion/bridge/getHistory.ts +++ b/src/Orion/bridge/getHistory.ts @@ -5,10 +5,10 @@ import { isValidChainId } from '../../utils/index.js'; import { simpleFetch } from 'simple-typed-fetch'; import bsonObjectId from 'bson-objectid'; -const ObjectID = bsonObjectId.default +const ObjectID = bsonObjectId; const getHistory = async (units: Unit[], address: string, limit = 1000) => { - if (!ethers.utils.isAddress(address)) throw new Error(`Invalid address: ${address}`); + if (!ethers.isAddress(address)) throw new Error(`Invalid address: ${address}`); const data = await Promise.all(units.map(async ({ blockchainService, aggregator, chainId }) => { const sourceNetworkHistory = await simpleFetch(blockchainService.getSourceAtomicSwapHistory)({ limit, diff --git a/src/Orion/bridge/index.ts b/src/Orion/bridge/index.ts index ccadd14..59da9c8 100644 --- a/src/Orion/bridge/index.ts +++ b/src/Orion/bridge/index.ts @@ -229,7 +229,7 @@ export default class Bridge { env?: string | undefined, ) { const secret = generateSecret(); - const secretHash = ethers.utils.keccak256(secret); + const secretHash = ethers.keccak256(secret); const lockExpiration = Date.now() + SECONDS_IN_DAY * EXPIRATION_DAYS * 1000; return { diff --git a/src/Orion/bridge/swap.ts b/src/Orion/bridge/swap.ts index 9fe41be..e9eae6b 100644 --- a/src/Orion/bridge/swap.ts +++ b/src/Orion/bridge/swap.ts @@ -1,6 +1,6 @@ import { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; -import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v5/index.js'; +import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v6'; import getBalances from '../../utils/getBalances.js'; import BalanceGuard from '../../BalanceGuard.js'; import getAvailableSources from '../../utils/getAvailableFundsSources.js'; @@ -123,7 +123,7 @@ export default async function swap({ const sourceChainBalances = await getBalances( { [assetName]: sourceChainAssetAddress, - [sourceChainNativeCryptocurrency]: ethers.constants.AddressZero, + [sourceChainNativeCryptocurrency]: ethers.ZeroAddress, }, sourceAggregator, walletAddress, @@ -134,7 +134,7 @@ export default async function swap({ const targetChainBalances = await getBalances( { [assetName]: targetChainAssetAddress, - [targetChainNativeCryptocurrency]: ethers.constants.AddressZero, + [targetChainNativeCryptocurrency]: ethers.ZeroAddress, }, targetAggregator, walletAddress, @@ -146,7 +146,7 @@ export default async function swap({ sourceChainBalances, { name: sourceChainNativeCryptocurrency, - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, }, sourceProvider, signer, @@ -157,7 +157,7 @@ export default async function swap({ targetChainBalances, { name: targetChainNativeCryptocurrency, - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, }, targetProvider, signer, @@ -181,33 +181,33 @@ export default async function swap({ BigNumber.ROUND_FLOOR, ); const secret = generateSecret(); - const secretHash = ethers.utils.keccak256(secret); + const secretHash = ethers.keccak256(secret); options?.logger?.(`Secret is ${secret}`); options?.logger?.(`Secret hash is ${secretHash}`); const secondsInDay = 60 * 60 * 24; const expirationDays = 4; - const expirationEtherBN = ethers.BigNumber.from( + const expirationEtherBN = BigInt( Date.now() + (secondsInDay * expirationDays * 1000), ); - const unsignedLockAtomicTx = await sourceExchangeContract.populateTransaction.lockAtomic({ + const unsignedLockAtomicTx = await sourceExchangeContract.lockAtomic.populateTransaction({ amount: amountBlockchainParam, asset: sourceChainAssetAddress, expiration: expirationEtherBN, secretHash, sender: walletAddress, - targetChainId: ethers.BigNumber.from(targetChain), + targetChainId: BigInt(targetChain), }); - let sourceChainGasPrice: ethers.BigNumber; + let sourceChainGasPrice: bigint; const sourceChainFeeData = await sourceChainUnit.provider.getFeeData(); - if (ethers.BigNumber.isBigNumber(sourceChainFeeData.gasPrice)) { // + if (sourceChainFeeData.gasPrice !== null) { // unsignedLockAtomicTx.gasPrice = sourceChainFeeData.gasPrice; sourceChainGasPrice = sourceChainFeeData.gasPrice; } else if ( - ethers.BigNumber.isBigNumber(sourceChainFeeData.maxFeePerGas) && - ethers.BigNumber.isBigNumber(sourceChainFeeData.maxPriorityFeePerGas) + sourceChainFeeData.maxFeePerGas !== null && + sourceChainFeeData.maxPriorityFeePerGas !== null ) { // EIP-1559 unsignedLockAtomicTx.maxFeePerGas = sourceChainFeeData.maxFeePerGas; unsignedLockAtomicTx.maxPriorityFeePerGas = sourceChainFeeData.maxPriorityFeePerGas; @@ -216,7 +216,7 @@ export default async function swap({ throw new Error('Can\'t get gas price'); } - unsignedLockAtomicTx.chainId = parseInt(chainId, 10); + unsignedLockAtomicTx.chainId = BigInt(chainId); unsignedLockAtomicTx.from = walletAddress; let value = new BigNumber(0); @@ -230,16 +230,16 @@ export default async function swap({ NATIVE_CURRENCY_PRECISION, BigNumber.ROUND_CEIL, ); - unsignedLockAtomicTx.gasLimit = ethers.BigNumber.from(LOCKATOMIC_GAS_LIMIT); + unsignedLockAtomicTx.gasLimit = BigInt(LOCKATOMIC_GAS_LIMIT); - const transactionCost = ethers.BigNumber.from(LOCKATOMIC_GAS_LIMIT).mul(sourceChainGasPrice); - const denormalizedTransactionCost = denormalizeNumber(transactionCost, NATIVE_CURRENCY_PRECISION); + const transactionCost = BigInt(LOCKATOMIC_GAS_LIMIT) * sourceChainGasPrice; + const denormalizedTransactionCost = denormalizeNumber(transactionCost, BigInt(NATIVE_CURRENCY_PRECISION)); sourceChainBalanceGuard.registerRequirement({ reason: 'Network fee', asset: { name: sourceChainNativeCryptocurrency, - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, }, amount: denormalizedTransactionCost.toString(), sources: ['wallet'] @@ -252,7 +252,7 @@ export default async function swap({ options?.logger?.('Signing lock tx transaction...'); const signedTransaction = await signer.signTransaction(unsignedLockAtomicTx); - const lockAtomicTxResponse = await sourceChainUnit.provider.sendTransaction(signedTransaction); + const lockAtomicTxResponse = await sourceChainUnit.provider.broadcastTransaction(signedTransaction); options?.logger?.(`Lock tx sent. Tx hash: ${lockAtomicTxResponse.hash}. Waiting for tx to be mined...`); await lockAtomicTxResponse.wait(); options?.logger?.('Lock tx mined.'); @@ -280,7 +280,7 @@ export default async function swap({ options?.logger?.('Atomic swap placed.'); // const targetChainGasPriceWei = await simpleFetch(targetBlockchainService.getGasPriceWei)(); - const unsignedRedeemAtomicTx = await targetExchangeContract.populateTransaction.redeemAtomic( + const unsignedRedeemAtomicTx = await targetExchangeContract.redeemAtomic.populateTransaction( { amount: amountBlockchainParam, asset: targetChainAssetAddress, @@ -294,14 +294,14 @@ export default async function swap({ secret ) - let targetChainGasPrice: ethers.BigNumber; + let targetChainGasPrice: bigint; const targetChainFeeData = await targetChainUnit.provider.getFeeData(); - if (ethers.BigNumber.isBigNumber(targetChainFeeData.gasPrice)) { // + if (targetChainFeeData.gasPrice !== null) { // unsignedRedeemAtomicTx.gasPrice = targetChainFeeData.gasPrice; targetChainGasPrice = targetChainFeeData.gasPrice; } else if ( - ethers.BigNumber.isBigNumber(targetChainFeeData.maxFeePerGas) && - ethers.BigNumber.isBigNumber(targetChainFeeData.maxPriorityFeePerGas) + targetChainFeeData.maxFeePerGas !== null && + targetChainFeeData.maxPriorityFeePerGas !== null ) { // EIP-1559 unsignedRedeemAtomicTx.maxFeePerGas = targetChainFeeData.maxFeePerGas; unsignedRedeemAtomicTx.maxPriorityFeePerGas = targetChainFeeData.maxPriorityFeePerGas; @@ -310,18 +310,18 @@ export default async function swap({ throw new Error('Can\'t get gas price'); } - unsignedRedeemAtomicTx.chainId = parseInt(targetChain, 10); + unsignedRedeemAtomicTx.chainId = BigInt(parseInt(targetChain, 10)); unsignedRedeemAtomicTx.from = walletAddress; - unsignedRedeemAtomicTx.gasLimit = ethers.BigNumber.from(REDEEMATOMIC_GAS_LIMIT); + unsignedRedeemAtomicTx.gasLimit = BigInt(REDEEMATOMIC_GAS_LIMIT); - const redeemAtomicTransactionCost = ethers.BigNumber.from(REDEEMATOMIC_GAS_LIMIT).mul(targetChainGasPrice); - const targetDenormalizedTransactionCost = denormalizeNumber(redeemAtomicTransactionCost, NATIVE_CURRENCY_PRECISION); + const redeemAtomicTransactionCost = BigInt(REDEEMATOMIC_GAS_LIMIT) * targetChainGasPrice; + const targetDenormalizedTransactionCost = denormalizeNumber(redeemAtomicTransactionCost, BigInt(NATIVE_CURRENCY_PRECISION)); targetChainBalanceGuard.registerRequirement({ reason: 'Network fee', asset: { name: targetChainNativeCryptocurrency, - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, }, amount: targetDenormalizedTransactionCost.toString(), sources: ['wallet'] @@ -334,7 +334,7 @@ export default async function swap({ options?.logger?.('Signing redeem tx transaction...'); const targetSignedTransaction = await signer.signTransaction(unsignedRedeemAtomicTx); - const targetLockAtomicTxResponse = await targetChainUnit.provider.sendTransaction(targetSignedTransaction); + const targetLockAtomicTxResponse = await targetChainUnit.provider.broadcastTransaction(targetSignedTransaction); options?.logger?.(`Redeem tx sent. Tx hash: ${targetLockAtomicTxResponse.hash}. Waiting for tx to be mined...`); await targetLockAtomicTxResponse.wait(); @@ -343,16 +343,16 @@ export default async function swap({ if (options?.withdrawToWallet !== undefined && options.withdrawToWallet) { options.logger?.('Withdrawing to wallet...'); - const unsignedWithdrawTx = await targetExchangeContract.populateTransaction.withdraw( + const unsignedWithdrawTx = await targetExchangeContract.withdraw.populateTransaction( targetChainAssetAddress, amountBlockchainParam, ); - if (ethers.BigNumber.isBigNumber(targetChainFeeData.gasPrice)) { // + if (targetChainFeeData.gasPrice !== null) { // unsignedWithdrawTx.gasPrice = targetChainFeeData.gasPrice; targetChainGasPrice = targetChainFeeData.gasPrice; } else if ( - ethers.BigNumber.isBigNumber(targetChainFeeData.maxFeePerGas) && - ethers.BigNumber.isBigNumber(targetChainFeeData.maxPriorityFeePerGas) + targetChainFeeData.maxFeePerGas !== null && + targetChainFeeData.maxPriorityFeePerGas !== null ) { // EIP-1559 unsignedWithdrawTx.maxFeePerGas = targetChainFeeData.maxFeePerGas; unsignedWithdrawTx.maxPriorityFeePerGas = targetChainFeeData.maxPriorityFeePerGas; @@ -360,12 +360,12 @@ export default async function swap({ } else { throw new Error('Can\'t get gas price'); } - unsignedWithdrawTx.chainId = parseInt(targetChain, 10); - unsignedWithdrawTx.gasLimit = ethers.BigNumber.from(WITHDRAW_GAS_LIMIT); + unsignedWithdrawTx.chainId = BigInt(parseInt(targetChain, 10)); + unsignedWithdrawTx.gasLimit = BigInt(WITHDRAW_GAS_LIMIT); unsignedWithdrawTx.from = walletAddress; unsignedWithdrawTx.nonce = await targetProvider.getTransactionCount(walletAddress, 'pending'); const signedTx = await signer.signTransaction(unsignedWithdrawTx); - const withdrawTx = await targetProvider.sendTransaction(signedTx); + const withdrawTx = await targetProvider.broadcastTransaction(signedTx); options.logger?.(`Withdraw tx sent. Tx hash: ${withdrawTx.hash}. Waiting for tx to be mined...`); await withdrawTx.wait(); options.logger?.('Withdraw tx mined.'); diff --git a/src/Unit/Exchange/deposit.ts b/src/Unit/Exchange/deposit.ts index dd3ebf8..96bcbfe 100644 --- a/src/Unit/Exchange/deposit.ts +++ b/src/Unit/Exchange/deposit.ts @@ -1,6 +1,6 @@ import { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; -import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v5/index.js'; +import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v6'; import getBalances from '../../utils/getBalances.js'; import BalanceGuard from '../../BalanceGuard.js'; import type Unit from '../index.js'; @@ -51,7 +51,7 @@ export default async function deposit({ const balances = await getBalances( { [asset]: assetAddress, - [nativeCryptocurrency]: ethers.constants.AddressZero, + [nativeCryptocurrency]: ethers.ZeroAddress, }, aggregator, walletAddress, @@ -63,7 +63,7 @@ export default async function deposit({ balances, { name: nativeCryptocurrency, - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, }, provider, signer, @@ -80,34 +80,34 @@ export default async function deposit({ sources: ['wallet'], }); - let unsignedTx: ethers.PopulatedTransaction; + let unsignedTx: ethers.TransactionLike; if (asset === nativeCryptocurrency) { - unsignedTx = await exchangeContract.populateTransaction.deposit(); + unsignedTx = await exchangeContract.deposit.populateTransaction(); unsignedTx.value = normalizeNumber(amount, NATIVE_CURRENCY_PRECISION, BigNumber.ROUND_CEIL); - unsignedTx.gasLimit = ethers.BigNumber.from(DEPOSIT_ETH_GAS_LIMIT); + unsignedTx.gasLimit = BigInt(DEPOSIT_ETH_GAS_LIMIT); } else { - unsignedTx = await exchangeContract.populateTransaction.depositAsset( + unsignedTx = await exchangeContract.depositAsset.populateTransaction( assetAddress, normalizeNumber(amount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_CEIL), ); - unsignedTx.gasLimit = ethers.BigNumber.from(DEPOSIT_ERC20_GAS_LIMIT); + unsignedTx.gasLimit = BigInt(DEPOSIT_ERC20_GAS_LIMIT); } - const transactionCost = ethers.BigNumber.from(unsignedTx.gasLimit).mul(gasPriceWei); - const denormalizedTransactionCost = denormalizeNumber(transactionCost, NATIVE_CURRENCY_PRECISION); + const transactionCost = BigInt(unsignedTx.gasLimit) * BigInt(gasPriceWei); + const denormalizedTransactionCost = denormalizeNumber(transactionCost, BigInt(NATIVE_CURRENCY_PRECISION)); balanceGuard.registerRequirement({ reason: 'Network fee', asset: { name: nativeCryptocurrency, - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, }, amount: denormalizedTransactionCost.toString(), sources: ['wallet'], }); unsignedTx.chainId = parseInt(chainId, 10); - unsignedTx.gasPrice = ethers.BigNumber.from(gasPriceWei); + unsignedTx.gasPrice = BigInt(gasPriceWei); unsignedTx.from = walletAddress; await balanceGuard.check(true); @@ -117,10 +117,10 @@ export default async function deposit({ const signedTx = await signer.signTransaction(unsignedTx); try { - const txResponse = await provider.sendTransaction(signedTx); + const txResponse = await provider.broadcastTransaction(signedTx); console.log(`Deposit tx sent: ${txResponse.hash}. Waiting for confirmation...`); const txReceipt = await txResponse.wait(); - if (txReceipt.status !== undefined) { + if (txReceipt?.status !== undefined) { console.log('Deposit tx confirmed'); } else { console.log('Deposit tx failed'); diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index c781c28..1664a03 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -1,11 +1,10 @@ -import type { ExchangeWithGenericSwap } from '@orionprotocol/contracts/lib/ethers-v5/Exchange.js'; -import { UniswapV3Pool__factory, ERC20__factory, SwapExecutor__factory, CurveRegistry__factory } from '@orionprotocol/contracts/lib/ethers-v5/index.js'; -import { BigNumber, ethers, type BigNumberish } from 'ethers'; -import { concat, defaultAbiCoder, type BytesLike } from 'ethers/lib/utils.js'; +import type { ExchangeWithGenericSwap } from '@orionprotocol/contracts/lib/ethers-v6/Exchange.js'; +import { UniswapV3Pool__factory, ERC20__factory, SwapExecutor__factory, CurveRegistry__factory } from '@orionprotocol/contracts/lib/ethers-v6'; +import { ethers, type BigNumberish, type AddressLike, concat, type BytesLike } from 'ethers'; import { safeGet, SafeArray } from '../../utils/safeGetters.js'; import type Unit from '../index.js'; import { simpleFetch } from 'simple-typed-fetch'; -import type { PromiseOrValue } from '@orionprotocol/contracts/lib/ethers-v5/common.js'; +import { BigNumber } from 'bignumber.js'; const EXECUTOR_SWAP_FUNCTION = 'func_70LYiww' @@ -64,20 +63,24 @@ export default async function generateSwapCalldata({ flags: 0 } - const exchangeToNativeDecimals = async (token: PromiseOrValue) => { - token = await token - let decimals = 18 - if (token !== ethers.constants.AddressZero) { + const exchangeToNativeDecimals = async (token: AddressLike) => { + if (typeof token !== 'string' && 'getAddress' in token) { + token = await token.getAddress(); + } else { + token = await token + } + let decimals = 18n + if (token !== ethers.ZeroAddress) { const contract = ERC20__factory.connect(token, unit.provider) decimals = await contract.decimals() } - return BigNumber.from(amount).mul(BigNumber.from(10).pow(decimals)).div(BigNumber.from(10).pow(8)) + return BigNumber(amount.toString()).multipliedBy(BigNumber(10).pow(decimals.toString())).div(BigNumber(10).pow(8)) } const amountNativeDecimals = await exchangeToNativeDecimals(swapDescription.srcToken); path = SafeArray.from(path_).map((swapInfo) => { - if (swapInfo.assetIn == ethers.constants.AddressZero) swapInfo.assetIn = wethAddress - if (swapInfo.assetOut == ethers.constants.AddressZero) swapInfo.assetOut = wethAddress + if (swapInfo.assetIn == ethers.ZeroAddress) swapInfo.assetIn = wethAddress + if (swapInfo.assetOut == ethers.ZeroAddress) swapInfo.assetOut = wethAddress return swapInfo; }); @@ -94,16 +97,16 @@ export default async function generateSwapCalldata({ break; } case 'UniswapV3': { - calldata = await generateUni3Calls(amountNativeDecimals, exchangeContractAddress, path, unit.provider) + calldata = await generateUni3Calls(amountNativeDecimals.toString(), exchangeContractAddress, path, unit.provider) break; } case 'OrionV3': { - calldata = await generateOrion3Calls(amountNativeDecimals, exchangeContractAddress, path, unit.provider) + calldata = await generateOrion3Calls(amountNativeDecimals.toString(), exchangeContractAddress, path, unit.provider) break; } case 'Curve': { calldata = await generateCurveStableSwapCalls( - amountNativeDecimals, + amountNativeDecimals.toString(), exchangeContractAddress, swapExecutorContractAddress ?? '', path, @@ -134,7 +137,7 @@ export async function generateUni2Calls( currentSwap.pool, currentSwap.assetIn, currentSwap.assetOut, - defaultAbiCoder.encode(['uint256'], [concat(['0x03', nextSwap.pool])]), + ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [concat(['0x03', nextSwap.pool])]), ] ) calls.push(addCallParams(calldata)) @@ -145,7 +148,7 @@ export async function generateUni2Calls( lastSwap.pool, lastSwap.assetIn, lastSwap.assetOut, - defaultAbiCoder.encode(['uint256'], [concat(['0x03', exchangeAddress])]), + ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [concat(['0x03', exchangeAddress])]), ]) calls.push(addCallParams(calldata)) @@ -156,22 +159,22 @@ async function generateUni3Calls( amount: BigNumberish, exchangeContractAddress: string, path: SafeArray, - provider: ethers.providers.JsonRpcProvider + provider: ethers.JsonRpcApiProvider ) { - const encodedPools: BytesLike[] = [] + const encodedPools: string[] = [] for (const swap of path) { const pool = UniswapV3Pool__factory.connect(swap.pool, provider) const token0 = await pool.token0() const zeroForOne = token0.toLowerCase() === swap.assetIn.toLowerCase() - const unwrapWETH = swap.assetOut === ethers.constants.AddressZero + const unwrapWETH = swap.assetOut === ethers.ZeroAddress - let encodedPool = ethers.utils.solidityPack(['uint256'], [pool.address]) - encodedPool = ethers.utils.hexDataSlice(encodedPool, 1) + let encodedPool = ethers.solidityPacked(['uint256'], [await pool.getAddress()]) + encodedPool = ethers.dataSlice(encodedPool, 1) let firstByte = 0 if (unwrapWETH) firstByte += 32 if (!zeroForOne) firstByte += 128 - const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) - encodedPool = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, encodedPool])) + const encodedFirstByte = ethers.solidityPacked(['uint8'], [firstByte]) + encodedPool = ethers.hexlify(ethers.concat([encodedFirstByte, encodedPool])) encodedPools.push(encodedPool) } const executorInterface = SwapExecutor__factory.createInterface() @@ -185,22 +188,22 @@ async function generateOrion3Calls( amount: BigNumberish, exchangeContractAddress: string, path: SafeArray, - provider: ethers.providers.JsonRpcProvider + provider: ethers.JsonRpcApiProvider ) { - const encodedPools: BytesLike[] = [] + const encodedPools: string[] = [] for (const swap of path) { const pool = UniswapV3Pool__factory.connect(swap.pool, provider) const token0 = await pool.token0() const zeroForOne = token0.toLowerCase() === swap.assetIn.toLowerCase() - const unwrapWETH = swap.assetOut === ethers.constants.AddressZero + const unwrapWETH = swap.assetOut === ethers.ZeroAddress - let encodedPool = ethers.utils.solidityPack(['uint256'], [pool.address]) - encodedPool = ethers.utils.hexDataSlice(encodedPool, 1) + let encodedPool = ethers.solidityPacked(['uint256'], [await pool.getAddress()]) + encodedPool = ethers.dataSlice(encodedPool, 1) let firstByte = 0 if (unwrapWETH) firstByte += 32 if (!zeroForOne) firstByte += 128 - const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) - encodedPool = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, encodedPool])) + const encodedFirstByte = ethers.solidityPacked(['uint8'], [firstByte]) + encodedPool = ethers.hexlify(ethers.concat([encodedFirstByte, encodedPool])) encodedPools.push(encodedPool) } const executorInterface = SwapExecutor__factory.createInterface() @@ -215,7 +218,7 @@ async function generateCurveStableSwapCalls( exchangeContractAddress: string, executorAddress: string, path: SafeArray, - provider: ethers.providers.JsonRpcProvider, + provider: ethers.JsonRpcProvider, curveRegistry: string ) { if (path.length > 1) { @@ -231,12 +234,12 @@ async function generateCurveStableSwapCalls( const executorAllowance = await firstToken.allowance(executorAddress, swap.pool) const calls: BytesLike[] = [] - if (executorAllowance.lt(amount)) { + if (executorAllowance < BigInt(amount)) { const calldata = addCallParams( executorInterface.encodeFunctionData('safeApprove', [ swap.assetIn, swap.pool, - ethers.constants.MaxUint256 + ethers.MaxUint256 ]) ) calls.push(calldata) @@ -265,28 +268,28 @@ function addCallParams( if (callParams) { if (callParams.value !== undefined) { firstByte += 16 // 00010000 - const encodedValue = ethers.utils.solidityPack(['uint128'], [callParams.value]) - calldata = ethers.utils.hexlify(ethers.utils.concat([encodedValue, calldata])) + const encodedValue = ethers.solidityPacked(['uint128'], [callParams.value]) + calldata = ethers.hexlify(ethers.concat([encodedValue, calldata])) } if (callParams.target !== undefined) { firstByte += 32 // 00100000 - const encodedAddress = ethers.utils.solidityPack(['address'], [callParams.target]) - calldata = ethers.utils.hexlify(ethers.utils.concat([encodedAddress, calldata])) + const encodedAddress = ethers.solidityPacked(['address'], [callParams.target]) + calldata = ethers.hexlify(ethers.concat([encodedAddress, calldata])) } if (callParams.gaslimit !== undefined) { firstByte += 64 // 01000000 - const encodedGaslimit = ethers.utils.solidityPack(['uint32'], [callParams.gaslimit]) - calldata = ethers.utils.hexlify(ethers.utils.concat([encodedGaslimit, calldata])) + const encodedGaslimit = ethers.solidityPacked(['uint32'], [callParams.gaslimit]) + calldata = ethers.hexlify(ethers.concat([encodedGaslimit, calldata])) } if (callParams.isMandatory !== undefined) firstByte += 128 // 10000000 } - const encodedFirstByte = ethers.utils.solidityPack(['uint8'], [firstByte]) - calldata = ethers.utils.hexlify(ethers.utils.concat([encodedFirstByte, calldata])) + const encodedFirstByte = ethers.solidityPacked(['uint8'], [firstByte]) + calldata = ethers.hexlify(ethers.concat([encodedFirstByte, calldata])) return calldata } -async function generateCalls(calls: BytesLike[]) { +function generateCalls(calls: BytesLike[]) { const executorInterface = SwapExecutor__factory.createInterface() - return '0x' + executorInterface.encodeFunctionData(EXECUTOR_SWAP_FUNCTION, [ethers.constants.AddressZero, calls]).slice(74) + return '0x' + executorInterface.encodeFunctionData(EXECUTOR_SWAP_FUNCTION, [ethers.ZeroAddress, calls]).slice(74) } diff --git a/src/Unit/Exchange/getSwapInfo.ts b/src/Unit/Exchange/getSwapInfo.ts index aa3e315..02cd26d 100644 --- a/src/Unit/Exchange/getSwapInfo.ts +++ b/src/Unit/Exchange/getSwapInfo.ts @@ -51,7 +51,7 @@ export default async function getSwapInfo({ const allPrices = await simpleFetch(blockchainService.getPricesWithQuoteAsset)(); const gasPriceWei = await simpleFetch(blockchainService.getGasPriceWei)(); - const gasPriceGwei = ethers.utils.formatUnits(gasPriceWei, 'gwei').toString(); + const gasPriceGwei = ethers.formatUnits(gasPriceWei, 'gwei').toString(); const assetInAddress = assetToAddress[assetIn]; if (assetInAddress === undefined) throw new Error(`Asset '${assetIn}' not found`); @@ -101,15 +101,15 @@ export default async function getSwapInfo({ } if (route === 'pool') { - const transactionCost = ethers.BigNumber.from(SWAP_THROUGH_ORION_POOL_GAS_LIMIT).mul(gasPriceWei); - const denormalizedTransactionCost = denormalizeNumber(transactionCost, NATIVE_CURRENCY_PRECISION); + const transactionCost = BigInt(SWAP_THROUGH_ORION_POOL_GAS_LIMIT) * BigInt(gasPriceWei); + const denormalizedTransactionCost = denormalizeNumber(transactionCost, BigInt(NATIVE_CURRENCY_PRECISION)); return { route, swapInfo, fee: { assetName: nativeCryptocurrencyName, - assetAddress: ethers.constants.AddressZero, + assetAddress: ethers.ZeroAddress, networkFeeInFeeAsset: denormalizedTransactionCost.toString(), protocolFeeInFeeAsset: undefined, }, @@ -134,7 +134,7 @@ export default async function getSwapInfo({ gasPriceGwei, feePercent, baseAssetAddress, - ethers.constants.AddressZero, + ethers.ZeroAddress, feeAssetAddress, allPrices.prices ); diff --git a/src/Unit/Exchange/swapLimit.ts b/src/Unit/Exchange/swapLimit.ts index 11a9d06..e9d7492 100644 --- a/src/Unit/Exchange/swapLimit.ts +++ b/src/Unit/Exchange/swapLimit.ts @@ -1,6 +1,6 @@ import { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; -import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v5/index.js'; +import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v6/index.js'; import getBalances from '../../utils/getBalances.js'; import BalanceGuard from '../../BalanceGuard.js'; import getAvailableSources from '../../utils/getAvailableFundsSources.js'; @@ -44,7 +44,7 @@ type PoolSwap = { amountOut: number through: 'pool' txHash: string - wait: (confirmations?: number | undefined) => Promise + wait: (confirmations?: number | undefined) => Promise } export type Swap = AggregatorOrder | PoolSwap; @@ -95,7 +95,7 @@ export default async function swapLimit({ const { factories } = await simpleFetch(blockchainService.getPoolsConfig)(); const poolExchangesList = factories !== undefined ? Object.keys(factories) : []; - const gasPriceGwei = ethers.utils.formatUnits(gasPriceWei, 'gwei').toString(); + const gasPriceGwei = ethers.formatUnits(gasPriceWei, 'gwei').toString(); const assetInAddress = assetToAddress[assetIn]; if (assetInAddress === undefined) throw new Error(`Asset '${assetIn}' not found`); @@ -108,7 +108,7 @@ export default async function swapLimit({ { [assetIn]: assetInAddress, [feeAsset]: feeAssetAddress, - [nativeCryptocurrency]: ethers.constants.AddressZero, + [nativeCryptocurrency]: ethers.ZeroAddress, }, aggregator, walletAddress, @@ -120,7 +120,7 @@ export default async function swapLimit({ balances, { name: nativeCryptocurrency, - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, }, provider, signer, @@ -271,7 +271,7 @@ export default async function swapLimit({ BigNumber.ROUND_FLOOR, ); - const unsignedSwapThroughOrionPoolTx = await exchangeContract.populateTransaction.swapThroughOrionPool( + const unsignedSwapThroughOrionPoolTx = await exchangeContract.swapThroughOrionPool.populateTransaction( amountSpendBlockchainParam, amountReceiveBlockchainParam, factoryAddress !== undefined @@ -280,8 +280,8 @@ export default async function swapLimit({ type === 'exactSpend', ); - unsignedSwapThroughOrionPoolTx.chainId = parseInt(chainId, 10); - unsignedSwapThroughOrionPoolTx.gasPrice = ethers.BigNumber.from(gasPriceWei); + unsignedSwapThroughOrionPoolTx.chainId = BigInt(parseInt(chainId, 10)); + unsignedSwapThroughOrionPoolTx.gasPrice = BigInt(gasPriceWei); unsignedSwapThroughOrionPoolTx.from = walletAddress; const amountSpendBN = new BigNumber(amountSpend); @@ -297,19 +297,19 @@ export default async function swapLimit({ NATIVE_CURRENCY_PRECISION, BigNumber.ROUND_CEIL, ); - unsignedSwapThroughOrionPoolTx.gasLimit = ethers.BigNumber.from(SWAP_THROUGH_ORION_POOL_GAS_LIMIT); + unsignedSwapThroughOrionPoolTx.gasLimit = BigInt(SWAP_THROUGH_ORION_POOL_GAS_LIMIT); - const transactionCost = ethers.BigNumber.from(SWAP_THROUGH_ORION_POOL_GAS_LIMIT).mul(gasPriceWei); - const denormalizedTransactionCost = denormalizeNumber(transactionCost, NATIVE_CURRENCY_PRECISION); + const transactionCost = BigInt(SWAP_THROUGH_ORION_POOL_GAS_LIMIT) * BigInt(gasPriceWei); + const denormalizedTransactionCost = denormalizeNumber(transactionCost, BigInt(NATIVE_CURRENCY_PRECISION)); balanceGuard.registerRequirement({ reason: 'Network fee', asset: { name: nativeCryptocurrency, - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, }, amount: denormalizedTransactionCost.toString(), - sources: getAvailableSources('network_fee', ethers.constants.AddressZero, 'pool'), + sources: getAvailableSources('network_fee', ethers.ZeroAddress, 'pool'), }); // if (value.gt(0)) { @@ -317,10 +317,10 @@ export default async function swapLimit({ // reason: 'Transaction value (extra amount)', // asset: { // name: nativeCryptocurrency, - // address: ethers.constants.AddressZero, + // address: ethers.ZeroAddress, // }, // amount: value.toString(), - // sources: getAvailableSources('amount', ethers.constants.AddressZero, 'pool'), + // sources: getAvailableSources('amount', ethers.ZeroAddress, 'pool'), // }); // } @@ -380,7 +380,7 @@ export default async function swapLimit({ gasPriceGwei, feePercent, baseAssetAddress, - ethers.constants.AddressZero, + ethers.ZeroAddress, feeAssetAddress, allPrices.prices, ); diff --git a/src/Unit/Exchange/swapMarket.ts b/src/Unit/Exchange/swapMarket.ts index 22ceaf1..90c6bd4 100644 --- a/src/Unit/Exchange/swapMarket.ts +++ b/src/Unit/Exchange/swapMarket.ts @@ -1,6 +1,6 @@ import { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; -import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v5/index.js'; +import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v6/index.js'; import getBalances from '../../utils/getBalances.js'; import BalanceGuard from '../../BalanceGuard.js'; import getAvailableSources from '../../utils/getAvailableFundsSources.js'; @@ -28,7 +28,7 @@ type PoolSwap = { amountOut: number through: 'pool' txHash: string - wait: (confirmations?: number | undefined) => Promise + wait: (confirmations?: number | undefined) => Promise } export type Swap = AggregatorOrder | PoolSwap; @@ -80,7 +80,7 @@ export default async function swapMarket({ const { factories } = await simpleFetch(blockchainService.getPoolsConfig)(); const poolExchangesList = factories !== undefined ? Object.keys(factories) : []; - const gasPriceGwei = ethers.utils.formatUnits(gasPriceWei, 'gwei').toString(); + const gasPriceGwei = ethers.formatUnits(gasPriceWei, 'gwei').toString(); const assetInAddress = assetToAddress[assetIn]; if (assetInAddress === undefined) throw new Error(`Asset '${assetIn}' not found`); @@ -93,7 +93,7 @@ export default async function swapMarket({ { [assetIn]: assetInAddress, [feeAsset]: feeAssetAddress, - [nativeCryptocurrency]: ethers.constants.AddressZero, + [nativeCryptocurrency]: ethers.ZeroAddress, }, aggregator, walletAddress, @@ -105,7 +105,7 @@ export default async function swapMarket({ balances, { name: nativeCryptocurrency, - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, }, provider, signer, @@ -221,17 +221,17 @@ export default async function swapMarket({ INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR, ); - const unsignedSwapThroughOrionPoolTx = await exchangeContract.populateTransaction.swapThroughOrionPool( - amountSpendBlockchainParam, - amountReceiveBlockchainParam, + const unsignedSwapThroughOrionPoolTx = await exchangeContract.swapThroughOrionPool.populateTransaction( + amountSpendBlockchainParam.toString(), + amountReceiveBlockchainParam.toString(), factoryAddress !== undefined ? [factoryAddress, ...pathAddresses] : pathAddresses, type === 'exactSpend', ); - unsignedSwapThroughOrionPoolTx.chainId = parseInt(chainId, 10); - unsignedSwapThroughOrionPoolTx.gasPrice = ethers.BigNumber.from(gasPriceWei); + unsignedSwapThroughOrionPoolTx.chainId = BigInt(chainId); + unsignedSwapThroughOrionPoolTx.gasPrice = BigInt(gasPriceWei); unsignedSwapThroughOrionPoolTx.from = walletAddress; const amountSpendBN = new BigNumber(amountSpend); @@ -247,19 +247,19 @@ export default async function swapMarket({ NATIVE_CURRENCY_PRECISION, BigNumber.ROUND_CEIL, ); - unsignedSwapThroughOrionPoolTx.gasLimit = ethers.BigNumber.from(SWAP_THROUGH_ORION_POOL_GAS_LIMIT); + unsignedSwapThroughOrionPoolTx.gasLimit = BigInt(SWAP_THROUGH_ORION_POOL_GAS_LIMIT); - const transactionCost = ethers.BigNumber.from(SWAP_THROUGH_ORION_POOL_GAS_LIMIT).mul(gasPriceWei); - const denormalizedTransactionCost = denormalizeNumber(transactionCost, NATIVE_CURRENCY_PRECISION); + const transactionCost = BigInt(SWAP_THROUGH_ORION_POOL_GAS_LIMIT) * BigInt(gasPriceWei); + const denormalizedTransactionCost = denormalizeNumber(transactionCost, BigInt(NATIVE_CURRENCY_PRECISION)); balanceGuard.registerRequirement({ reason: 'Network fee', asset: { name: nativeCryptocurrency, - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, }, amount: denormalizedTransactionCost.toString(), - sources: getAvailableSources('network_fee', ethers.constants.AddressZero, 'pool'), + sources: getAvailableSources('network_fee', ethers.ZeroAddress, 'pool'), }); // if (value.gt(0)) { @@ -267,10 +267,10 @@ export default async function swapMarket({ // reason: 'Transaction value (extra amount)', // asset: { // name: nativeCryptocurrency, - // address: ethers.constants.AddressZero, + // address: ethers.ZeroAddress, // }, // amount: value.toString(), - // sources: getAvailableSources('amount', ethers.constants.AddressZero, 'pool'), + // sources: getAvailableSources('amount', ethers.ZeroAddress, 'pool'), // }); // } @@ -338,7 +338,7 @@ export default async function swapMarket({ gasPriceGwei, feePercent, baseAssetAddress, - ethers.constants.AddressZero, + ethers.ZeroAddress, feeAssetAddress, allPrices.prices, ); diff --git a/src/Unit/Exchange/withdraw.ts b/src/Unit/Exchange/withdraw.ts index 90ac0df..9b5d2d7 100644 --- a/src/Unit/Exchange/withdraw.ts +++ b/src/Unit/Exchange/withdraw.ts @@ -1,6 +1,6 @@ import { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; -import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v5/index.js'; +import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v6/index.js'; import getBalances from '../../utils/getBalances.js'; import BalanceGuard from '../../BalanceGuard.js'; import type Unit from '../index.js'; @@ -50,7 +50,7 @@ export default async function withdraw({ const balances = await getBalances( { [asset]: assetAddress, - [nativeCryptocurrency]: ethers.constants.AddressZero, + [nativeCryptocurrency]: ethers.ZeroAddress, }, aggregator, walletAddress, @@ -62,7 +62,7 @@ export default async function withdraw({ balances, { name: nativeCryptocurrency, - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, }, provider, signer, @@ -78,27 +78,27 @@ export default async function withdraw({ sources: ['exchange'], }); - const unsignedTx = await exchangeContract.populateTransaction.withdraw( + const unsignedTx = await exchangeContract.withdraw.populateTransaction( assetAddress, - normalizeNumber(amount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR), + normalizeNumber(amount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString(), ); - unsignedTx.gasLimit = ethers.BigNumber.from(WITHDRAW_GAS_LIMIT); + unsignedTx.gasLimit = BigInt(WITHDRAW_GAS_LIMIT); - const transactionCost = ethers.BigNumber.from(unsignedTx.gasLimit).mul(gasPriceWei); - const denormalizedTransactionCost = denormalizeNumber(transactionCost, NATIVE_CURRENCY_PRECISION); + const transactionCost = BigInt(unsignedTx.gasLimit) * BigInt(gasPriceWei); + const denormalizedTransactionCost = denormalizeNumber(transactionCost, BigInt(NATIVE_CURRENCY_PRECISION)); balanceGuard.registerRequirement({ reason: 'Network fee', asset: { name: nativeCryptocurrency, - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, }, amount: denormalizedTransactionCost.toString(), sources: ['wallet'], }); - unsignedTx.chainId = parseInt(chainId, 10); - unsignedTx.gasPrice = ethers.BigNumber.from(gasPriceWei); + unsignedTx.chainId = BigInt(chainId); + unsignedTx.gasPrice = BigInt(gasPriceWei); unsignedTx.from = walletAddress; await balanceGuard.check(true); @@ -107,11 +107,11 @@ export default async function withdraw({ unsignedTx.nonce = nonce; const signedTx = await signer.signTransaction(unsignedTx); - const txResponse = await provider.sendTransaction(signedTx); + const txResponse = await provider.broadcastTransaction(signedTx); console.log(`Withdraw tx sent: ${txResponse.hash}. Waiting for confirmation...`); try { const txReceipt = await txResponse.wait(); - if (txReceipt.status !== undefined) { + if (txReceipt?.status !== undefined) { console.log('Withdraw tx confirmed'); } else { console.log('Withdraw tx failed'); diff --git a/src/Unit/FarmingManager/index.ts b/src/Unit/FarmingManager/index.ts index a650d60..f4f7fbb 100644 --- a/src/Unit/FarmingManager/index.ts +++ b/src/Unit/FarmingManager/index.ts @@ -1,4 +1,4 @@ -import { Exchange__factory, IUniswapV2Pair__factory, IUniswapV2Router__factory } from '@orionprotocol/contracts/lib/ethers-v5/index.js'; +import { Exchange__factory, IUniswapV2Pair__factory, IUniswapV2Router__factory } from '@orionprotocol/contracts/lib/ethers-v6/index.js'; import { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; import { simpleFetch } from 'simple-typed-fetch'; @@ -71,7 +71,7 @@ export default class FarmingManager { { [assetA]: assetAAddress, [assetB]: assetBAddress, - [nativeCryptocurrency]: ethers.constants.AddressZero, + [nativeCryptocurrency]: ethers.ZeroAddress, }, this.unit.aggregator, walletAddress, @@ -81,7 +81,7 @@ export default class FarmingManager { const balanceGuard = new BalanceGuard( balances, { - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, name: nativeCryptocurrency, }, this.unit.provider, @@ -109,13 +109,13 @@ export default class FarmingManager { const assetAReserve = pairTokensIsInversed ? _reserve1 : _reserve0; const assetBReserve = pairTokensIsInversed ? _reserve0 : _reserve1; - const denormalizedAssetAReserve = denormalizeNumber(assetAReserve, assetADecimals); - const denormalizedAssetBReserve = denormalizeNumber(assetBReserve, assetBDecimals); + const denormalizedAssetAReserve = denormalizeNumber(assetAReserve, BigInt(assetADecimals)); + const denormalizedAssetBReserve = denormalizeNumber(assetBReserve, BigInt(assetBDecimals)); const price = denormalizedAssetBReserve.div(denormalizedAssetAReserve); - const assetAIsNativeCurrency = assetAAddress === ethers.constants.AddressZero; - const assetBIsNativeCurrency = assetBAddress === ethers.constants.AddressZero; + const assetAIsNativeCurrency = assetAAddress === ethers.ZeroAddress; + const assetBIsNativeCurrency = assetBAddress === ethers.ZeroAddress; const assetAAmount = assetA === amountAsset ? amountBN : amountBN.div(price); const assetBAmount = assetA === amountAsset ? amountBN.multipliedBy(price) : amountBN; @@ -145,33 +145,33 @@ export default class FarmingManager { sources: ['exchange', 'wallet'], }); - const unsignedTx = await exchangeContract.populateTransaction.withdrawToPool( + const unsignedTx = await exchangeContract.withdrawToPool.populateTransaction( assetBIsNativeCurrency ? assetBAddress : assetAAddress, assetBIsNativeCurrency ? assetAAddress : assetBAddress, assetBIsNativeCurrency - ? normalizeNumber(assetBAmount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR) - : normalizeNumber(assetAAmount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR), + ? normalizeNumber(assetBAmount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString() + : normalizeNumber(assetAAmount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString(), assetBIsNativeCurrency - ? normalizeNumber(assetAAmount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR) - : normalizeNumber(assetBAmount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR), + ? normalizeNumber(assetAAmount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString() + : normalizeNumber(assetBAmount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString(), assetBIsNativeCurrency - ? normalizeNumber(assetBAmountWithSlippage, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR) - : normalizeNumber(assetAAmountWithSlippage, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR), + ? normalizeNumber(assetBAmountWithSlippage, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString() + : normalizeNumber(assetAAmountWithSlippage, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString(), assetBIsNativeCurrency - ? normalizeNumber(assetAAmountWithSlippage, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR) - : normalizeNumber(assetBAmountWithSlippage, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR), + ? normalizeNumber(assetAAmountWithSlippage, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString() + : normalizeNumber(assetBAmountWithSlippage, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString(), ); - const gasPrice = await this.unit.provider.getGasPrice(); + const { gasPrice, maxFeePerGas } = await this.unit.provider.getFeeData(); - const transactionCost = ethers.BigNumber.from(ADD_LIQUIDITY_GAS_LIMIT).mul(gasPrice); - const denormalizedTransactionCost = denormalizeNumber(transactionCost, NATIVE_CURRENCY_PRECISION); + const transactionCost = BigInt(ADD_LIQUIDITY_GAS_LIMIT) * (gasPrice ?? 0n); + const denormalizedTransactionCost = denormalizeNumber(transactionCost, BigInt(NATIVE_CURRENCY_PRECISION)); balanceGuard.registerRequirement({ reason: 'Network fee', asset: { name: nativeCryptocurrency, - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, }, amount: denormalizedTransactionCost.toString(), sources: ['wallet'], @@ -195,8 +195,11 @@ export default class FarmingManager { } } + if (gasPrice !== null && maxFeePerGas !== null) { + unsignedTx.gasPrice = gasPrice; + unsignedTx.maxFeePerGas = maxFeePerGas; + } unsignedTx.chainId = network.chainId; - unsignedTx.gasPrice = gasPrice; unsignedTx.nonce = nonce; unsignedTx.from = walletAddress; const gasLimit = await this.unit.provider.estimateGas(unsignedTx); @@ -205,13 +208,13 @@ export default class FarmingManager { await balanceGuard.check(true); const signedTx = await signer.signTransaction(unsignedTx); - const txResponse = await this.unit.provider.sendTransaction(signedTx); + const txResponse = await this.unit.provider.broadcastTransaction(signedTx); console.log(`Add liquidity tx sent: ${txResponse.hash}. Waiting for confirmation...`); const txReceipt = await txResponse.wait(); - if (txReceipt.status === 1) { - console.log(`Add liquidity tx confirmed: ${txReceipt.transactionHash}`); + if (txReceipt?.status === 1) { + console.log(`Add liquidity tx confirmed: ${txReceipt.hash}`); } else { - console.log(`Add liquidity tx failed: ${txReceipt.transactionHash}`); + console.log(`Add liquidity tx failed: ${txReceipt?.hash}`); } } @@ -254,7 +257,7 @@ export default class FarmingManager { [assetA]: assetAAddress, [assetB]: assetBAddress, [`${poolName} LP Token`]: pool.lpTokenAddress, - [nativeCryptocurrency]: ethers.constants.AddressZero, + [nativeCryptocurrency]: ethers.ZeroAddress, }, this.unit.aggregator, walletAddress, @@ -265,7 +268,7 @@ export default class FarmingManager { const balanceGuard = new BalanceGuard( balances, { - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, name: nativeCryptocurrency, }, this.unit.provider, @@ -298,8 +301,8 @@ export default class FarmingManager { const assetAReserve = pairTokensIsInversed ? _reserve1 : _reserve0; const assetBReserve = pairTokensIsInversed ? _reserve0 : _reserve1; - const denormalizedAssetAReserve = denormalizeNumber(assetAReserve, assetADecimals); - const denormalizedAssetBReserve = denormalizeNumber(assetBReserve, assetBDecimals); + const denormalizedAssetAReserve = denormalizeNumber(assetAReserve, BigInt(assetADecimals)); + const denormalizedAssetBReserve = denormalizeNumber(assetBReserve, BigInt(assetBDecimals)); const denormalizedUserPooledAssetA = denormalizedAssetAReserve.multipliedBy(userShare); const denormalizedUserPooledAssetB = denormalizedAssetBReserve.multipliedBy(userShare); @@ -307,8 +310,8 @@ export default class FarmingManager { const denormalizedUserPooledAssetAWithSlippage = denormalizedUserPooledAssetA.multipliedBy(1 - ADD_LIQUIDITY_SLIPPAGE); const denormalizedUserPooledAssetBWithSlippage = denormalizedUserPooledAssetB.multipliedBy(1 - ADD_LIQUIDITY_SLIPPAGE); - const assetAIsNativeCurrency = assetAAddress === ethers.constants.AddressZero; - const assetBIsNativeCurrency = assetBAddress === ethers.constants.AddressZero; + const assetAIsNativeCurrency = assetAAddress === ethers.ZeroAddress; + const assetBIsNativeCurrency = assetBAddress === ethers.ZeroAddress; balanceGuard.registerRequirement({ reason: `${poolName} liquidity`, @@ -321,9 +324,9 @@ export default class FarmingManager { sources: ['wallet'], }); - let unsignedTx: ethers.PopulatedTransaction; + let unsignedTx: ethers.TransactionLike; if (assetAIsNativeCurrency || assetBIsNativeCurrency) { - unsignedTx = await routerContract.populateTransaction.removeLiquidityETH( + unsignedTx = await routerContract.removeLiquidityETH.populateTransaction( assetBIsNativeCurrency ? assetAAddress : assetBAddress, // token lpTokenUserBalance, assetBIsNativeCurrency @@ -331,28 +334,28 @@ export default class FarmingManager { denormalizedUserPooledAssetAWithSlippage, assetADecimals, BigNumber.ROUND_FLOOR, - ) + ).toString() : normalizeNumber( denormalizedUserPooledAssetBWithSlippage, assetBDecimals, BigNumber.ROUND_FLOOR, - ), // token min + ).toString(), // token min assetBIsNativeCurrency ? normalizeNumber( denormalizedUserPooledAssetBWithSlippage, assetBDecimals, BigNumber.ROUND_FLOOR, - ) + ).toString() : normalizeNumber( denormalizedUserPooledAssetAWithSlippage, assetADecimals, BigNumber.ROUND_FLOOR, - ), // eth min + ).toString(), // eth min walletAddress, Math.floor(Date.now() / 1000) + 60 * 20, ); } else { - unsignedTx = await routerContract.populateTransaction.removeLiquidity( + unsignedTx = await routerContract.removeLiquidity.populateTransaction( assetAAddress, assetBAddress, lpTokenUserBalance, @@ -360,27 +363,27 @@ export default class FarmingManager { denormalizedUserPooledAssetAWithSlippage, assetADecimals, BigNumber.ROUND_FLOOR, - ), + ).toString(), normalizeNumber( denormalizedUserPooledAssetBWithSlippage, assetBDecimals, BigNumber.ROUND_FLOOR, - ), + ).toString(), walletAddress, Math.floor(Date.now() / 1000) + 60 * 20, ); } - const gasPrice = await this.unit.provider.getGasPrice(); + const { gasPrice } = await this.unit.provider.getFeeData() - const transactionCost = ethers.BigNumber.from(ADD_LIQUIDITY_GAS_LIMIT).mul(gasPrice); - const denormalizedTransactionCost = denormalizeNumber(transactionCost, NATIVE_CURRENCY_PRECISION); + const transactionCost = BigInt(ADD_LIQUIDITY_GAS_LIMIT) * (gasPrice ?? 0n); + const denormalizedTransactionCost = denormalizeNumber(transactionCost, BigInt(NATIVE_CURRENCY_PRECISION)); balanceGuard.registerRequirement({ reason: 'Network fee', asset: { name: nativeCryptocurrency, - address: ethers.constants.AddressZero, + address: ethers.ZeroAddress, }, amount: denormalizedTransactionCost.toString(), sources: ['wallet'], @@ -398,13 +401,13 @@ export default class FarmingManager { unsignedTx.gasLimit = gasLimit; const signedTx = await signer.signTransaction(unsignedTx); - const txResponse = await this.unit.provider.sendTransaction(signedTx); + const txResponse = await this.unit.provider.broadcastTransaction(signedTx); console.log(`Remove all liquidity tx sent: ${txResponse.hash}. Waiting for confirmation...`); const txReceipt = await txResponse.wait(); - if (txReceipt.status === 1) { - console.log(`Remove all liquidity tx confirmed: ${txReceipt.transactionHash}`); + if (txReceipt?.status === 1) { + console.log(`Remove all liquidity tx confirmed: ${txReceipt.hash}`); } else { - console.log(`Remove all liquidity tx failed: ${txReceipt.transactionHash}`); + console.log(`Remove all liquidity tx failed: ${txReceipt?.hash}`); } } } diff --git a/src/Unit/index.ts b/src/Unit/index.ts index c8b4462..e0ea40f 100644 --- a/src/Unit/index.ts +++ b/src/Unit/index.ts @@ -7,6 +7,7 @@ import Exchange from './Exchange/index.js'; import FarmingManager from './FarmingManager/index.js'; import { chains, envs } from '../config/index.js'; import type { networkCodes } from '../constants/index.js'; +import type { JsonRpcProvider } from 'ethers'; type KnownConfig = { env: KnownEnv @@ -18,7 +19,7 @@ export default class Unit { public readonly chainId: SupportedChainId; - public readonly provider: ethers.providers.StaticJsonRpcProvider; + public readonly provider: JsonRpcProvider; public readonly blockchainService: BlockchainService; @@ -65,13 +66,12 @@ export default class Unit { } const chainInfo = chains[config.chainId]; if (!chainInfo) throw new Error('Chain info is required'); - this.chainId = config.chainId; this.networkCode = chainInfo.code; this.contracts = chainInfo.contracts const intNetwork = parseInt(this.chainId, 10); if (Number.isNaN(intNetwork)) throw new Error('Invalid chainId (not a number)' + this.chainId); - this.provider = new ethers.providers.StaticJsonRpcProvider(this.config.nodeJsonRpc, intNetwork); + this.provider = new ethers.JsonRpcProvider(this.config.nodeJsonRpc, intNetwork); this.provider.pollingInterval = 1000; this.blockchainService = new BlockchainService(this.config.services.blockchainService.http, this.config.basicAuth); diff --git a/src/__tests__/basic.test.ts b/src/__tests__/basic.test.ts index 6f8241b..0643669 100644 --- a/src/__tests__/basic.test.ts +++ b/src/__tests__/basic.test.ts @@ -195,7 +195,7 @@ describe('Orion', () => { expect(unit.aggregator.ws.api).toBe(`ws://localhost:${server1.port}/v1`); expect(unit.blockchainService.api).toBe(blockchainServiceAPI); expect(unit.priceFeed.api).toBe(orionPriceFeedAPI + '/price-feed'); - expect(unit.provider.connection.url).toBe('https://cloudflare-eth.com/'); + expect(unit.provider._getConnection().url).toBe('https://cloudflare-eth.com/'); const info = await simpleFetch(unit.blockchainService.getInfo)(); expect(info).toBeDefined(); @@ -246,7 +246,7 @@ describe('Orion', () => { }); const bscUnit = orion.units[SupportedChainId.BSC_TESTNET] - expect(bscUnit?.provider.connection.url).toBe('https://data-seed-prebsc-1-s1.binance.org:8545/'); + expect(bscUnit?.provider._getConnection().url).toBe('https://data-seed-prebsc-1-s1.binance.org:8545/'); expect(orion.referralSystem.api).toBe('https://zxczxc.orionprotocol.io'); }); @@ -312,7 +312,7 @@ describe('Orion', () => { const network = await unitBSC.provider.getNetwork(); expect(network.chainId).toBe(97); - const zeroAddressWithout0x = ethers.constants.AddressZero.slice(2); + const zeroAddressWithout0x = ethers.ZeroAddress.slice(2); expect(simpleFetch(orion.referralSystem.getMiniStats)(zeroAddressWithout0x)) .rejects .toThrow('empty reward history'); diff --git a/src/__tests__/fee.test.ts b/src/__tests__/fee.test.ts index eec8eeb..1cf8b14 100644 --- a/src/__tests__/fee.test.ts +++ b/src/__tests__/fee.test.ts @@ -83,7 +83,7 @@ describe('Fee calculation', () => { const gasPriceGwei = 3; const feePercent = 0.2; const baseAssetAddress = '0xcb2951e90d8dcf16e1fa84ac0c83f48906d6a744'; - const baseCurrencyAddress = ethers.constants.AddressZero; + const baseCurrencyAddress = ethers.ZeroAddress; const feeAssetAddress = '0xf223eca06261145b3287a0fefd8cfad371c7eb34'; const { totalFeeInFeeAsset: ornTotalFee } = calculateFeeInFeeAsset( amount, diff --git a/src/addressSchema.ts b/src/addressSchema.ts index 982eda1..2eb9262 100644 --- a/src/addressSchema.ts +++ b/src/addressSchema.ts @@ -1,7 +1,7 @@ import { ethers } from 'ethers'; import { z } from 'zod'; -const addressSchema = z.string().refine(ethers.utils.isAddress, (value) => ({ +const addressSchema = z.string().refine(ethers.isAddress, (value) => ({ message: `Should be an address, got ${value}`, })); diff --git a/src/crypt/hashOrder.ts b/src/crypt/hashOrder.ts index 2106514..23bc474 100644 --- a/src/crypt/hashOrder.ts +++ b/src/crypt/hashOrder.ts @@ -1,7 +1,7 @@ import { ethers } from 'ethers'; import type { Order } from '../types.js'; -const hashOrder = (order: Order) => ethers.utils.solidityKeccak256( +const hashOrder = (order: Order) => ethers.solidityPackedKeccak256( [ 'uint8', 'address', diff --git a/src/crypt/signCancelOrder.ts b/src/crypt/signCancelOrder.ts index 1ed3cd1..ff49d22 100644 --- a/src/crypt/signCancelOrder.ts +++ b/src/crypt/signCancelOrder.ts @@ -1,6 +1,5 @@ import type { TypedDataSigner } from '@ethersproject/abstract-signer'; -import type { ethers } from 'ethers'; -import { joinSignature, splitSignature } from 'ethers/lib/utils.js'; +import { ethers } from 'ethers'; import CANCEL_ORDER_TYPES from '../constants/cancelOrderTypes.js'; import type { CancelOrderRequest, SignedCancelOrderRequest, SupportedChainId } from '../types.js'; import getDomainData from './getDomainData.js'; @@ -26,7 +25,7 @@ const signCancelOrder = async ( const signature = usePersonalSign ? await signCancelOrderPersonal(cancelOrderRequest, signer) // https://docs.ethers.io/v5/api/signer/#Signer-signTypedData - : await typedDataSigner._signTypedData( + : await typedDataSigner.signTypedData( getDomainData(chainId), CANCEL_ORDER_TYPES, cancelOrderRequest, @@ -34,7 +33,7 @@ const signCancelOrder = async ( // https://github.com/poap-xyz/poap-fun/pull/62#issue-928290265 // "Signature's v was always send as 27 or 28, but from Ledger was 0 or 1" - const fixedSignature = joinSignature(splitSignature(signature)); + const fixedSignature = ethers.Signature.from(signature).serialized; // if (!fixedSignature) throw new Error("Can't sign order cancel"); diff --git a/src/crypt/signCancelOrderPersonal.ts b/src/crypt/signCancelOrderPersonal.ts index c53975a..2837c3b 100644 --- a/src/crypt/signCancelOrderPersonal.ts +++ b/src/crypt/signCancelOrderPersonal.ts @@ -1,5 +1,4 @@ import { ethers } from 'ethers'; -import { arrayify, joinSignature, splitSignature } from 'ethers/lib/utils.js'; import type { CancelOrderRequest } from '../types.js'; const signCancelOrderPersonal = async ( @@ -7,14 +6,14 @@ const signCancelOrderPersonal = async ( signer: ethers.Signer, ) => { const types = ['string', 'string', 'address']; - const message = ethers.utils.solidityKeccak256( + const message = ethers.solidityPackedKeccak256( types, ['cancelOrder', cancelOrderRequest.id, cancelOrderRequest.senderAddress], ); - const signature = await signer.signMessage(arrayify(message)); + const signature = await signer.signMessage(ethers.getBytes(message)); // NOTE: metamask broke sig.v value and we fix it in next line - return joinSignature(splitSignature(signature)); + return ethers.Signature.from(signature).serialized; }; export default signCancelOrderPersonal; diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index 8df5414..90e59df 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -1,7 +1,6 @@ import type { TypedDataSigner } from '@ethersproject/abstract-signer'; import { BigNumber } from 'bignumber.js'; -import type { ethers } from 'ethers'; -import { joinSignature, splitSignature } from 'ethers/lib/utils.js'; +import { ethers } from 'ethers'; import { INTERNAL_PROTOCOL_PRECISION } from '../constants/index.js'; import ORDER_TYPES from '../constants/orderTypes.js'; import type { Order, SignedOrder, SupportedChainId } from '../types.js'; @@ -37,21 +36,21 @@ export const signOrder = async ( baseAsset: baseAssetAddr, quoteAsset: quoteAssetAddr, matcherFeeAsset: serviceFeeAssetAddr, - amount: normalizeNumber( + amount: Number(normalizeNumber( amount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR, - ).toNumber(), - price: normalizeNumber( + )), + price: Number(normalizeNumber( price, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR, - ).toNumber(), - matcherFee: normalizeNumber( + )), + matcherFee: Number(normalizeNumber( matcherFee, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_CEIL, // ROUND_CEIL because we don't want get "not enough fee" error - ).toNumber(), + )), nonce, expiration, buySide: side === 'BUY' ? 1 : 0, @@ -63,7 +62,7 @@ export const signOrder = async ( const signature = usePersonalSign ? await signOrderPersonal(order, signer) - : await typedDataSigner._signTypedData( + : await typedDataSigner.signTypedData( getDomainData(chainId), ORDER_TYPES, order, @@ -71,7 +70,7 @@ export const signOrder = async ( // https://github.com/poap-xyz/poap-fun/pull/62#issue-928290265 // "Signature's v was always send as 27 or 28, but from Ledger was 0 or 1" - const fixedSignature = joinSignature(splitSignature(signature)); + const fixedSignature = ethers.Signature.from(signature).serialized; // if (!fixedSignature) throw new Error("Can't sign order"); diff --git a/src/crypt/signOrderPersonal.ts b/src/crypt/signOrderPersonal.ts index 82c163d..4573e96 100644 --- a/src/crypt/signOrderPersonal.ts +++ b/src/crypt/signOrderPersonal.ts @@ -1,10 +1,8 @@ import { ethers } from 'ethers'; import type { Order } from '../types.js'; -const { arrayify, joinSignature, splitSignature } = ethers.utils; - const signOrderPersonal = async (order: Order, signer: ethers.Signer) => { - const message = ethers.utils.solidityKeccak256( + const message = ethers.solidityPackedKeccak256( [ 'string', 'address', 'address', 'address', 'address', 'address', 'uint64', 'uint64', 'uint64', 'uint64', 'uint64', 'uint8', @@ -24,10 +22,10 @@ const signOrderPersonal = async (order: Order, signer: ethers.Signer) => { order.buySide, ], ); - const signature = await signer.signMessage(arrayify(message)); + const signature = await signer.signMessage(ethers.getBytes(message)); // NOTE: metamask broke sig.v value and we fix it in next line - return joinSignature(splitSignature(signature)); + return ethers.Signature.from(signature).serialized; }; export default signOrderPersonal; diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index 6da1b14..f30d7cf 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -74,13 +74,13 @@ class Aggregator { } getOrder = (orderId: string, owner?: string) => { - if (!ethers.utils.isHexString(orderId)) { + if (!ethers.isHexString(orderId)) { throw new Error(`Invalid order id: ${orderId}. Must be a hex string`); } const url = new URL(`${this.apiUrl}/api/v1/order`); url.searchParams.append('orderId', orderId); if (owner !== undefined) { - if (!ethers.utils.isAddress(owner)) { + if (!ethers.isAddress(owner)) { throw new Error(`Invalid owner address: ${owner}`); } url.searchParams.append('owner', owner); diff --git a/src/services/Aggregator/schemas/orderSchema.ts b/src/services/Aggregator/schemas/orderSchema.ts index 0f2accf..77d2347 100644 --- a/src/services/Aggregator/schemas/orderSchema.ts +++ b/src/services/Aggregator/schemas/orderSchema.ts @@ -3,22 +3,22 @@ import { z } from 'zod'; import { exchanges, orderStatuses, subOrderStatuses } from '../../../constants/index.js'; const blockchainOrderSchema = z.object({ - id: z.string().refine(ethers.utils.isHexString, (value) => ({ + id: z.string().refine(ethers.isHexString, (value) => ({ message: `blockchainOrder.id must be a hex string, got ${value}`, })), - senderAddress: z.string().refine(ethers.utils.isAddress, (value) => ({ + senderAddress: z.string().refine(ethers.isAddress, (value) => ({ message: `blockchainOrder.senderAddress must be an address, got ${value}`, })), - matcherAddress: z.string().refine(ethers.utils.isAddress, (value) => ({ + matcherAddress: z.string().refine(ethers.isAddress, (value) => ({ message: `blockchainOrder.matcherAddress must be an address, got ${value}`, })), - baseAsset: z.string().refine(ethers.utils.isAddress, (value) => ({ + baseAsset: z.string().refine(ethers.isAddress, (value) => ({ message: `blockchainOrder.baseAsset must be an address, got ${value}`, })), - quoteAsset: z.string().refine(ethers.utils.isAddress, (value) => ({ + quoteAsset: z.string().refine(ethers.isAddress, (value) => ({ message: `blockchainOrder.quoteAsset must be an address, got ${value}`, })), - matcherFeeAsset: z.string().refine(ethers.utils.isAddress, (value) => ({ + matcherFeeAsset: z.string().refine(ethers.isAddress, (value) => ({ message: `blockchainOrder.matcherFeeAsset must be an address, got ${value}`, })), amount: z.number().int().nonnegative(), @@ -27,7 +27,7 @@ const blockchainOrderSchema = z.object({ nonce: z.number(), expiration: z.number(), buySide: z.union([z.literal(1), z.literal(0)]), - signature: z.string().refine(ethers.utils.isHexString, (value) => ({ + signature: z.string().refine(ethers.isHexString, (value) => ({ message: `blockchainOrder.signature must be a hex string, got ${value}`, })).nullable(), isPersonalSign: z.boolean(), @@ -53,7 +53,7 @@ const baseOrderSchema = z.object({ amount: z.number().nonnegative(), remainingAmount: z.number().nonnegative(), price: z.number().nonnegative(), - sender: z.string().refine(ethers.utils.isAddress, (value) => ({ + sender: z.string().refine(ethers.isAddress, (value) => ({ message: `order.sender must be an address, got ${value}`, })), filledAmount: z.number().nonnegative(), @@ -77,13 +77,13 @@ const brokerAddressSchema = z.enum([ 'SELF_BROKER' ]) .or(selfBrokerSchema) - .or(z.string().refine(ethers.utils.isAddress, (value) => ({ + .or(z.string().refine(ethers.isAddress, (value) => ({ message: `subOrder.subOrders.[n].brokerAddress must be an address, got ${value}`, }))); const subOrderSchema = baseOrderSchema.extend({ price: z.number(), id: z.number(), - parentOrderId: z.string().refine(ethers.utils.isHexString, (value) => ({ + parentOrderId: z.string().refine(ethers.isHexString, (value) => ({ message: `subOrder.parentOrderId must be a hex string, got ${value}`, })), exchange: z.string(), @@ -98,11 +98,11 @@ const subOrderSchema = baseOrderSchema.extend({ }); const orderSchema = z.object({ - orderId: z.string().refine(ethers.utils.isHexString, (value) => ({ + orderId: z.string().refine(ethers.isHexString, (value) => ({ message: `orderId must be a hex string, got ${value}`, })), order: baseOrderSchema.extend({ - id: z.string().refine(ethers.utils.isHexString, (value) => ({ + id: z.string().refine(ethers.isHexString, (value) => ({ message: `order.id must be a hex string, got ${value}`, })), fee: z.number().nonnegative(), diff --git a/src/services/BlockchainService/schemas/atomicHistorySchema.ts b/src/services/BlockchainService/schemas/atomicHistorySchema.ts index 504145b..0123c1a 100644 --- a/src/services/BlockchainService/schemas/atomicHistorySchema.ts +++ b/src/services/BlockchainService/schemas/atomicHistorySchema.ts @@ -16,9 +16,9 @@ const baseAtomicHistoryItem = z.object({ _id: z.string(), __v: z.number(), asset: z.string(), - sender: z.string().refine(ethers.utils.isAddress), - secretHash: z.string().refine(ethers.utils.isHexString), - receiver: z.string().refine(ethers.utils.isAddress).optional(), + sender: z.string().refine(ethers.isAddress), + secretHash: z.string().refine(ethers.isHexString), + receiver: z.string().refine(ethers.isAddress).optional(), secret: z.string().optional(), }); diff --git a/src/services/ReferralSystem/schemas/contractsAddressesSchema.ts b/src/services/ReferralSystem/schemas/contractsAddressesSchema.ts index caa3a85..5004366 100644 --- a/src/services/ReferralSystem/schemas/contractsAddressesSchema.ts +++ b/src/services/ReferralSystem/schemas/contractsAddressesSchema.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; import { SupportedChainId } from '../../../types.js'; -import { isAddress } from 'ethers/lib/utils.js'; +import { ethers } from 'ethers'; const contractsAddressesSchema = z.record( z.nativeEnum(SupportedChainId), - z.string().refine(isAddress) + z.string().refine(ethers.isAddress) ); export default contractsAddressesSchema; diff --git a/src/utils/calculateNetworkFee.ts b/src/utils/calculateNetworkFee.ts index 8f348e9..5a84809 100644 --- a/src/utils/calculateNetworkFee.ts +++ b/src/utils/calculateNetworkFee.ts @@ -8,6 +8,6 @@ export default function calculateNetworkFee( ) { const networkFeeGwei = new BigNumber(gasPriceGwei).multipliedBy(gasLimit); - const bn = new BigNumber(ethers.utils.parseUnits(networkFeeGwei.toString(), 'gwei').toString()); + const bn = new BigNumber(ethers.parseUnits(networkFeeGwei.toString(), 'gwei').toString()); return bn.div(new BigNumber(10).pow(NATIVE_CURRENCY_PRECISION)).toString(); } diff --git a/src/utils/checkIsToken.ts b/src/utils/checkIsToken.ts index 20d1f5d..5be176a 100644 --- a/src/utils/checkIsToken.ts +++ b/src/utils/checkIsToken.ts @@ -1,8 +1,8 @@ -import { ERC20__factory } from '@orionprotocol/contracts/lib/ethers-v5/index.js'; +import { ERC20__factory } from '@orionprotocol/contracts/lib/ethers-v6/index.js'; import { ethers } from 'ethers'; import invariant from 'tiny-invariant'; -const checkIsToken = async (address: string, provider?: ethers.providers.Provider) => { +const checkIsToken = async (address: string, provider?: ethers.Provider) => { invariant(provider, 'No provider for token checking'); const tokenContract = ERC20__factory.connect(address, provider); try { @@ -12,7 +12,7 @@ const checkIsToken = async (address: string, provider?: ethers.providers.Provide tokenContract.symbol(), tokenContract.decimals(), tokenContract.totalSupply(), - tokenContract.balanceOf(ethers.constants.AddressZero), + tokenContract.balanceOf(ethers.ZeroAddress), ], ); diff --git a/src/utils/denormalizeNumber.ts b/src/utils/denormalizeNumber.ts index 6ebffd9..86bce3c 100644 --- a/src/utils/denormalizeNumber.ts +++ b/src/utils/denormalizeNumber.ts @@ -1,5 +1,4 @@ import { BigNumber } from 'bignumber.js'; -import type { ethers } from 'ethers'; /** * Converts normalized blockchain ("machine-readable") number to denormalized ("human-readable") number. @@ -7,8 +6,8 @@ import type { ethers } from 'ethers'; * @param decimals Blockchain asset precision * @returns BigNumber */ -export default function denormalizeNumber(input: ethers.BigNumber, decimals: BigNumber.Value) { - const decimalsBN = new BigNumber(decimals); +export default function denormalizeNumber(input: bigint, decimals: bigint) { + const decimalsBN = new BigNumber(decimals.toString()); if (!decimalsBN.isInteger()) throw new Error(`Decimals '${decimalsBN.toString()}' is not an integer`); return new BigNumber(input.toString()).div(new BigNumber(10).pow(decimalsBN)); } diff --git a/src/utils/generateSecret.ts b/src/utils/generateSecret.ts index d1ff475..7caabca 100644 --- a/src/utils/generateSecret.ts +++ b/src/utils/generateSecret.ts @@ -45,7 +45,7 @@ function isomorphicCryptoRandomBytes(size: number): Uint8Array { const generateSecret = () => { const RANDOM_BITS = 256; const rand = isomorphicCryptoRandomBytes(RANDOM_BITS); - const secret = ethers.utils.keccak256(rand); + const secret = ethers.keccak256(rand); return secret; }; diff --git a/src/utils/getAvailableFundsSources.ts b/src/utils/getAvailableFundsSources.ts index e552576..4b490ec 100644 --- a/src/utils/getAvailableFundsSources.ts +++ b/src/utils/getAvailableFundsSources.ts @@ -8,7 +8,7 @@ export default function getAvailableFundsSources( ): Source[] { switch (route) { case 'aggregator': - if (assetAddress === ethers.constants.AddressZero) return ['exchange']; // We can't take native crypto from wallet + if (assetAddress === ethers.ZeroAddress) return ['exchange']; // We can't take native crypto from wallet return ['exchange', 'wallet']; // We can take any token amount from exchange + wallet. Order is important! case 'pool': if (expenseType === 'network_fee') return ['wallet']; // Network fee is always taken from wallet diff --git a/src/utils/getBalance.ts b/src/utils/getBalance.ts index f63b28c..861d0d8 100644 --- a/src/utils/getBalance.ts +++ b/src/utils/getBalance.ts @@ -1,5 +1,5 @@ -import type { Exchange } from '@orionprotocol/contracts/lib/ethers-v5/index.js'; -import { ERC20__factory } from '@orionprotocol/contracts/lib/ethers-v5/index.js'; +import type { Exchange } from '@orionprotocol/contracts/lib/ethers-v6'; +import { ERC20__factory } from '@orionprotocol/contracts/lib/ethers-v6'; import type { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; import { INTERNAL_PROTOCOL_PRECISION, NATIVE_CURRENCY_PRECISION } from '../constants/index.js'; @@ -12,11 +12,11 @@ export default async function getBalance( assetAddress: string, walletAddress: string, exchangeContract: Exchange, - provider: ethers.providers.Provider, + provider: ethers.Provider, ) { - const assetIsNativeCryptocurrency = assetAddress === ethers.constants.AddressZero; + const assetIsNativeCryptocurrency = assetAddress === ethers.ZeroAddress; - let assetWalletBalance: ethers.BigNumber | undefined; + let assetWalletBalance: bigint | undefined; let denormalizedAssetInWalletBalance: BigNumber | undefined; @@ -28,10 +28,10 @@ export default async function getBalance( denormalizedAssetInWalletBalance = denormalizeNumber(assetWalletBalance, assetDecimals); } else { assetWalletBalance = await provider.getBalance(walletAddress); - denormalizedAssetInWalletBalance = denormalizeNumber(assetWalletBalance, NATIVE_CURRENCY_PRECISION); + denormalizedAssetInWalletBalance = denormalizeNumber(assetWalletBalance, BigInt(NATIVE_CURRENCY_PRECISION)); } const assetContractBalance = await exchangeContract.getBalance(assetAddress, walletAddress); - const denormalizedAssetInContractBalance = denormalizeNumber(assetContractBalance, INTERNAL_PROTOCOL_PRECISION); + const denormalizedAssetInContractBalance = denormalizeNumber(assetContractBalance, BigInt(INTERNAL_PROTOCOL_PRECISION)); const denormalizedAssetLockedBalanceResult = await aggregator.getLockedBalance(walletAddress, assetName); if (denormalizedAssetLockedBalanceResult.isErr()) { throw new Error(denormalizedAssetLockedBalanceResult.error.message); diff --git a/src/utils/getBalances.ts b/src/utils/getBalances.ts index 8475b1c..f9e5390 100644 --- a/src/utils/getBalances.ts +++ b/src/utils/getBalances.ts @@ -1,4 +1,4 @@ -import type { Exchange } from '@orionprotocol/contracts/lib/ethers-v5/index.js'; +import type { Exchange } from '@orionprotocol/contracts/lib/ethers-v6/index.js'; import type { BigNumber } from 'bignumber.js'; import type { ethers } from 'ethers'; import type { Aggregator } from '../services/Aggregator/index.js'; @@ -9,7 +9,7 @@ export default async ( aggregator: Aggregator, walletAddress: string, exchangeContract: Exchange, - provider: ethers.providers.Provider, + provider: ethers.Provider, ) => { const balances = await Promise.all( Object.entries(balancesRequired) diff --git a/src/utils/getNativeCryptocurrencyName.ts b/src/utils/getNativeCryptocurrencyName.ts index 67c3fec..fa12251 100644 --- a/src/utils/getNativeCryptocurrencyName.ts +++ b/src/utils/getNativeCryptocurrencyName.ts @@ -11,7 +11,7 @@ const getNativeCryptocurrencyName = (assetToAddress: Partial ({ @@ -21,34 +21,34 @@ const swapThroughOrionPoolSchema = z.object({ })); const buyOrderSchema = z.tuple([ // buy order - z.string().refine(ethers.utils.isAddress), // senderAddress - z.string().refine(ethers.utils.isAddress), // matcherAddress - z.string().refine(ethers.utils.isAddress), // baseAsset - z.string().refine(ethers.utils.isAddress), // quoteAsset - z.string().refine(ethers.utils.isAddress), // matcherFeeAsset - z.instanceof(ethers.BigNumber), // amount - z.instanceof(ethers.BigNumber), // price - z.instanceof(ethers.BigNumber), // matcherFee - z.instanceof(ethers.BigNumber), // nonce - z.instanceof(ethers.BigNumber), // expiration + z.string().refine(ethers.isAddress), // senderAddress + z.string().refine(ethers.isAddress), // matcherAddress + z.string().refine(ethers.isAddress), // baseAsset + z.string().refine(ethers.isAddress), // quoteAsset + z.string().refine(ethers.isAddress), // matcherFeeAsset + z.bigint(), // amount + z.bigint(), // price + z.bigint(), // matcherFee + z.bigint(), // nonce + z.bigint(), // expiration z.literal(1), // buySide z.boolean(), // isPersonalSign - z.string().refine(ethers.utils.isHexString), // signature + z.string().refine(ethers.isHexString), // signature ]); const sellOrderSchema = z.tuple([ // sell orer - z.string().refine(ethers.utils.isAddress), // senderAddress - z.string().refine(ethers.utils.isAddress), // matcherAddress - z.string().refine(ethers.utils.isAddress), // baseAsset - z.string().refine(ethers.utils.isAddress), // quoteAsset - z.string().refine(ethers.utils.isAddress), // matcherFeeAsset - z.instanceof(ethers.BigNumber), // amount - z.instanceof(ethers.BigNumber), // price - z.instanceof(ethers.BigNumber), // matcherFee - z.instanceof(ethers.BigNumber), // nonce - z.instanceof(ethers.BigNumber), // expiration + z.string().refine(ethers.isAddress), // senderAddress + z.string().refine(ethers.isAddress), // matcherAddress + z.string().refine(ethers.isAddress), // baseAsset + z.string().refine(ethers.isAddress), // quoteAsset + z.string().refine(ethers.isAddress), // matcherFeeAsset + z.bigint(), // amount + z.bigint(), // price + z.bigint(), // matcherFee + z.bigint(), // nonce + z.bigint(), // expiration z.literal(0), // buySide z.boolean(), // isPersonalSign - z.string().refine(ethers.utils.isHexString), // signature + z.string().refine(ethers.isHexString), // signature ]); const toOrder = | z.infer>(data: T) => ({ @@ -71,9 +71,9 @@ const fillThroughOrionPoolSchema = z.object({ name: z.literal('fillThroughOrionPool'), args: z.tuple([ sellOrderSchema, - z.instanceof(ethers.BigNumber), // filled amount - z.instanceof(ethers.BigNumber), // blockchainFee - z.string().refine(ethers.utils.isAddress).array().nonempty(), // path + z.bigint(), // filled amount + z.bigint(), // blockchainFee + z.string().refine(ethers.isAddress).array().nonempty(), // path ]), }).transform((data) => ({ name: data.name, @@ -90,8 +90,8 @@ const fillOrdersSchema = z.object({ args: z.tuple([ buyOrderSchema, sellOrderSchema, - z.instanceof(ethers.BigNumber), // filledPrice - z.instanceof(ethers.BigNumber), // filledAmount + z.bigint(), // filledPrice + z.bigint(), // filledAmount ]), }).transform((data) => ({ name: data.name, diff --git a/tsconfig.json b/tsconfig.json index 37764ec..2bbded1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,8 +12,7 @@ ], "compilerOptions": { "target": "esnext", - "module": "NodeNext", - "moduleResolution": "NodeNext", + "module": "ESNext", "esModuleInterop": true, "resolveJsonModule": true /* Enable importing .json files */, "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, From 9b178c87ad4ce5a1bbcd168312bcfb081dd60737 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 28 Sep 2023 12:55:37 +0300 Subject: [PATCH 043/225] update model --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Integrator/schemas/veORN-info-schema.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 97b6cdc..d5c6f7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc6", + "version": "0.19.89-rc7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc6", + "version": "0.19.89-rc7", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index fee5419..4e46f46 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc6", + "version": "0.19.89-rc7", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/schemas/veORN-info-schema.ts b/src/services/Integrator/schemas/veORN-info-schema.ts index 67f0602..46933b1 100644 --- a/src/services/Integrator/schemas/veORN-info-schema.ts +++ b/src/services/Integrator/schemas/veORN-info-schema.ts @@ -6,10 +6,10 @@ const veORNResultSchema = z.object({ avgAPR: z.number(), minAPR: z.number(), maxAPR: z.number(), - veTOKENAddress: evmAddressSchema, + veTokenAddress: evmAddressSchema, totalORNLocked: z.number(), totalVeORN: z.number(), - weekly_reward: z.number(), + weeklyReward: z.number(), userAPR: z.number(), userVeORN: z.number(), userORNLocked: z.number(), From e868711374843e02595e45b50812ec15e041d7ea Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 28 Sep 2023 13:23:19 +0300 Subject: [PATCH 044/225] update model veORNInfo --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Integrator/schemas/veORN-info-schema.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5c6f7d..32e2175 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc7", + "version": "0.19.89-rc8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc7", + "version": "0.19.89-rc8", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 4e46f46..d0e0fa5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc7", + "version": "0.19.89-rc8", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/schemas/veORN-info-schema.ts b/src/services/Integrator/schemas/veORN-info-schema.ts index 46933b1..1e05026 100644 --- a/src/services/Integrator/schemas/veORN-info-schema.ts +++ b/src/services/Integrator/schemas/veORN-info-schema.ts @@ -13,7 +13,7 @@ const veORNResultSchema = z.object({ userAPR: z.number(), userVeORN: z.number(), userORNLocked: z.number(), - userPeriodLock: z.number(), + userLockEndDate: z.number(), userReward: z.number(), userWeeklyReward: z.number() }); From f78266818fe84f7860340a1cc7da5a28309218ae Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Thu, 28 Sep 2023 14:50:43 +0100 Subject: [PATCH 045/225] feature: up version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2a3b59e..2b47430 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.92-rc0", + "version": "0.19.92-rc100", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From d5a3e1d64e8a2571901b6b60eff21948290ab316 Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Thu, 28 Sep 2023 18:31:54 +0400 Subject: [PATCH 046/225] fix: getPlatformFees inputs --- src/services/BlockchainService/index.ts | 29 +++++++++++++------------ 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/services/BlockchainService/index.ts b/src/services/BlockchainService/index.ts index 8ac862e..6c43a0a 100644 --- a/src/services/BlockchainService/index.ts +++ b/src/services/BlockchainService/index.ts @@ -59,6 +59,13 @@ type AtomicSwapHistoryTargetQuery = AtomicSwapHistoryBaseQuery & { expiredRedeem?: 0 | 1 state?: 'REDEEMED' | 'BEFORE-REDEEM' } + +type PlatformFees = { + assetIn: string + assetOut: string + walletAddress?: string | undefined + fromWidget?: string | undefined +} class BlockchainService { private readonly apiUrl: string; @@ -231,23 +238,17 @@ class BlockchainService { { headers: this.basicAuthHeaders } ); - getPlatformFees = ( - { assetIn, assetOut, walletAddress, fromWidget }: { - assetIn?: string | undefined, - assetOut?: string | undefined, - walletAddress?: string | undefined, - fromWidget?: string | undefined - } + getPlatformFees = ({ + assetIn, + assetOut, + walletAddress, + fromWidget + }: PlatformFees ) => { const url = new URL(`${this.apiUrl}/api/platform-fees`); - if (assetIn !== undefined) { - url.searchParams.append('assetIn', assetIn); - } - - if (assetOut !== undefined) { - url.searchParams.append('assetOut', assetOut); - } + url.searchParams.append('assetIn', assetIn); + url.searchParams.append('assetOut', assetOut); if (walletAddress !== undefined) { url.searchParams.append('walletAddress', walletAddress); From 1134865abf04b6ad09e6be0a2f1f5895d0e12ec7 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Thu, 28 Sep 2023 18:35:59 +0400 Subject: [PATCH 047/225] Renamed type SwapInfo to SingleSwap --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 26 +++++++++++------------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 2b47430..4bb08a6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.92-rc100", + "version": "0.19.92-rc101", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index eb512ba..7358acb 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -12,7 +12,7 @@ import { generateCurveStableSwapCall } from './callGenerators/curve.js'; export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3" -export type SwapInfo = { +export type SingleSwap = { pool: string assetIn: string assetOut: string @@ -23,7 +23,7 @@ export type GenerateSwapCalldataParams = { amount: BigNumberish minReturnAmount: BigNumberish receiverAddress: string - path: ArrayLike + path: ArrayLike unit: Unit } @@ -41,10 +41,10 @@ export default async function generateSwapCalldata({ const wethAddress = safeGet(unit.contracts, 'WETH') const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); - let path = SafeArray.from(arrayLikePath).map((swapInfo) => { - swapInfo.assetIn = safeGet(assetToAddress, swapInfo.assetIn); - swapInfo.assetOut = safeGet(assetToAddress, swapInfo.assetOut); - return swapInfo; + let path = SafeArray.from(arrayLikePath).map((singleSwap) => { + singleSwap.assetIn = safeGet(assetToAddress, singleSwap.assetIn); + singleSwap.assetOut = safeGet(assetToAddress, singleSwap.assetOut); + return singleSwap; }) const { factory, assetIn: srcToken } = path.first() @@ -61,12 +61,12 @@ export default async function generateSwapCalldata({ } const amountNativeDecimals = await exchangeToNativeDecimals(srcToken, amount, unit.provider); - path = SafeArray.from(arrayLikePath).map((swapInfo) => { - if (swapInfo.assetIn == ethers.constants.AddressZero) swapInfo.assetIn = wethAddress - if (swapInfo.assetOut == ethers.constants.AddressZero) swapInfo.assetOut = wethAddress - return swapInfo; + path = SafeArray.from(arrayLikePath).map((singleSwap) => { + if (singleSwap.assetIn == ethers.constants.AddressZero) singleSwap.assetIn = wethAddress + if (singleSwap.assetOut == ethers.constants.AddressZero) singleSwap.assetOut = wethAddress + return singleSwap; }); - const isSingleFactorySwap = path.every(swapInfo => swapInfo.factory === factory) + const isSingleFactorySwap = path.every(singleSwap => singleSwap.factory === factory) let calldata: BytesLike if (isSingleFactorySwap) { ({ swapDescription, calldata } = await processSingleFactorySwaps( @@ -97,7 +97,7 @@ export default async function generateSwapCalldata({ async function processSingleFactorySwaps( factory: Factory, swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct, - path: SafeArray, + path: SafeArray, recipient: string, amount: BigNumberish, swapExecutorContractAddress: string, @@ -160,7 +160,7 @@ async function processSingleFactorySwaps( async function processMultiFactorySwaps( swapDescription: ExchangeWithGenericSwap.SwapDescriptionStruct, - path: SafeArray, + path: SafeArray, recipient: string, amount: BigNumberish, swapExecutorContractAddress: string, From 1441b51e0d4ea776e8f968223eac33f42cb2c6ad Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 28 Sep 2023 17:36:08 +0300 Subject: [PATCH 048/225] add more methods to integrator --- package-lock.json | 4 +- package.json | 2 +- src/services/Integrator/index.ts | 78 ++++++++++++++++++- src/services/Integrator/schemas/index.ts | 4 +- .../Integrator/schemas/list-amount-schema.ts | 5 ++ .../Integrator/schemas/voting-info-schema.ts | 21 +++++ 6 files changed, 107 insertions(+), 7 deletions(-) create mode 100644 src/services/Integrator/schemas/list-amount-schema.ts create mode 100644 src/services/Integrator/schemas/voting-info-schema.ts diff --git a/package-lock.json b/package-lock.json index 32e2175..971de74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc8", + "version": "0.19.89-rc9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc8", + "version": "0.19.89-rc9", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index d0e0fa5..4c48fb6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc8", + "version": "0.19.89-rc9", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index e5a1aa0..250a271 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -1,11 +1,14 @@ import { environmentResponseSchema, getPoolResponseSchema, + listAmountResponseSchema, listNFTOrderResponseSchema, listPoolResponseSchema, - veORNInfoSchema, + veORNInfoResponseSchema, + votingInfoResponseSchema } from './schemas/index.js'; import { fetchWithValidation } from 'simple-typed-fetch'; +import { BigNumber } from 'bignumber.js'; type BasePayload = { chainId: number @@ -42,12 +45,29 @@ type VeORNInfoPayload = BasePayload & { params: [string] } +type ListAmountPayload = BasePayload & { + model: string + method: 'listAmount' + params: [] +} + +type GetAmountByORNPayload = BasePayload & { + amountToken: number + timeLock: number +} + type Payload = | GetEnvironmentPayload | ListNFTOrderPayload | GetPoolInfoPayload | ListPoolPayload - | VeORNInfoPayload; + | VeORNInfoPayload + | ListAmountPayload + | GetAmountByORNPayload; + +const START_TIME = 1690848000;// Aug 01 2023 00:00:00 UTC +const DAY = 86400 +const YEAR = 365 * DAY class IntegratorService { private readonly apiUrl: string; @@ -67,6 +87,10 @@ class IntegratorService { this.getPoolInfo = this.getPoolInfo.bind(this); this.listPool = this.listPool.bind(this); this.veORNInfo = this.veORNInfo.bind(this); + this.listAmount = this.listAmount.bind(this); + this.getAmountByORN = this.getAmountByORN.bind(this); + this.getAmountAtCurrent = this.getAmountAtCurrent.bind(this); + this.getVotingInfo = this.getVotingInfo.bind(this); } makeRPCPayload = (payload: Omit) => { @@ -78,7 +102,7 @@ class IntegratorService { }; veORNInfo = (address: string) => { - return fetchWithValidation(this.apiUrl, veORNInfoSchema, { + return fetchWithValidation(this.apiUrl, veORNInfoResponseSchema, { method: 'POST', body: this.makeRPCPayload({ model: 'veORN', @@ -88,6 +112,13 @@ class IntegratorService { }) } + getAmountAtCurrent = (amount: number) => { + const timestamp = Date.now() / 1000; + + // sqrt + return BigNumber(amount).dividedBy(this.getK(timestamp)); + } + private readonly getEnvironment = () => { return fetchWithValidation(this.apiUrl, environmentResponseSchema, { method: 'POST', @@ -135,6 +166,47 @@ class IntegratorService { }), }); } + + private readonly listAmount = (poolKey: string) => { + return fetchWithValidation(this.apiUrl, listAmountResponseSchema, { + method: 'POST', + body: this.makeRPCPayload({ + model: poolKey, + method: 'listAmount', + params: [], + }), + }); + } + + private readonly getK = (time: number) => { + const currentTime = time < START_TIME ? START_TIME : time; + + const deltaYears = BigNumber(currentTime).minus(START_TIME).dividedBy(YEAR); + return BigNumber(2).pow(BigNumber(deltaYears).pow(2)); + } + + private readonly getAmountByORN = (amountToken: number, timeLock: number) => { + const timestamp = Date.now() / 1000; + + const deltaDays = BigNumber(timeLock).minus(timestamp).dividedBy(DAY); + if (deltaDays.lt(0)) { + return 0; + } + + // sqrt + return BigNumber(amountToken).multipliedBy(BigNumber(deltaDays).sqrt()).dividedBy(5); + } + + private readonly getVotingInfo = (userAddress: number) => { + return fetchWithValidation(this.apiUrl, votingInfoResponseSchema, { + method: 'POST', + body: this.makeRPCPayload({ + model: 'OrionVoting', + method: 'info', + params: [userAddress], + }), + }); + } } export * as schemas from './schemas/index.js'; diff --git a/src/services/Integrator/schemas/index.ts b/src/services/Integrator/schemas/index.ts index a8cca95..ebd913d 100644 --- a/src/services/Integrator/schemas/index.ts +++ b/src/services/Integrator/schemas/index.ts @@ -2,4 +2,6 @@ export { default as environmentResponseSchema } from './environment-response-sch export { default as listNFTOrderResponseSchema } from './list-nft-order-response-schema.js'; export { default as getPoolResponseSchema } from './get-pool-response-schema.js'; export { default as listPoolResponseSchema } from './list-pool-response-schema.js'; -export { default as veORNInfoSchema } from './veORN-info-schema.js'; +export { default as veORNInfoResponseSchema } from './veORN-info-schema.js'; +export { default as listAmountResponseSchema } from './list-amount-schema.js'; +export { default as votingInfoResponseSchema } from './voting-info-schema.js'; diff --git a/src/services/Integrator/schemas/list-amount-schema.ts b/src/services/Integrator/schemas/list-amount-schema.ts new file mode 100644 index 0000000..c4bf3b1 --- /dev/null +++ b/src/services/Integrator/schemas/list-amount-schema.ts @@ -0,0 +1,5 @@ +import { z } from 'zod'; + +const listAmountSchema = z.record(z.number(), z.number()) + +export default listAmountSchema; diff --git a/src/services/Integrator/schemas/voting-info-schema.ts b/src/services/Integrator/schemas/voting-info-schema.ts new file mode 100644 index 0000000..74c05dc --- /dev/null +++ b/src/services/Integrator/schemas/voting-info-schema.ts @@ -0,0 +1,21 @@ +import { z } from 'zod'; + +const poolSchema = z.object({ + allVote: z.number(), + name: z.string(), + poolAddress: z.string(), + type: z.string(), + userVote: z.number() +}) + +const votingInfoSchema = z.object({ + absoluteVeTokenInVoting: z.number(), + pools: z.array(poolSchema), + userVeTokenBalance: z.number(), + userVeTokenInVoting: z.number(), + veTokenAddress: z.string(), + votingAddress: z.string(), + weeklyReward: z.number() +}) + +export default votingInfoSchema; From 3c183f6cff8a9d43bf864439c42bf8e8843c4309 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Thu, 28 Sep 2023 18:45:40 +0400 Subject: [PATCH 049/225] Renamed type SwapInfo to SingleSwap --- src/Unit/Exchange/callGenerators/curve.ts | 4 ++-- src/Unit/Exchange/callGenerators/uniswapV2.ts | 4 ++-- src/Unit/Exchange/callGenerators/uniswapV3.ts | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Unit/Exchange/callGenerators/curve.ts b/src/Unit/Exchange/callGenerators/curve.ts index 5bb68de..42e2123 100644 --- a/src/Unit/Exchange/callGenerators/curve.ts +++ b/src/Unit/Exchange/callGenerators/curve.ts @@ -1,12 +1,12 @@ import { SwapExecutor__factory, CurveRegistry__factory } from "@orionprotocol/contracts/lib/ethers-v5/index.js" import type { BigNumberish, providers } from "ethers" -import type { SwapInfo } from "../generateSwapCalldata.js" +import type { SingleSwap } from "../generateSwapCalldata.js" import { addCallParams } from "./utils.js" export async function generateCurveStableSwapCall( amount: BigNumberish, to: string, - swap: SwapInfo, + swap: SingleSwap, provider: providers.JsonRpcProvider, curveRegistry: string ) { diff --git a/src/Unit/Exchange/callGenerators/uniswapV2.ts b/src/Unit/Exchange/callGenerators/uniswapV2.ts index 37f57a5..bec62de 100644 --- a/src/Unit/Exchange/callGenerators/uniswapV2.ts +++ b/src/Unit/Exchange/callGenerators/uniswapV2.ts @@ -3,11 +3,11 @@ import { SafeArray } from "../../../utils/safeGetters.js" import { BigNumber } from "ethers" import type { BytesLike, BigNumberish } from "ethers" import { defaultAbiCoder, concat } from "ethers/lib/utils.js" -import type { SwapInfo } from "../generateSwapCalldata.js" +import type { SingleSwap } from "../generateSwapCalldata.js" import { addCallParams, generateCalls } from "./utils.js" export async function generateUni2Calls( - path: SafeArray, + path: SafeArray, recipient: string ) { const executorInterface = SwapExecutor__factory.createInterface() diff --git a/src/Unit/Exchange/callGenerators/uniswapV3.ts b/src/Unit/Exchange/callGenerators/uniswapV3.ts index 21fadd8..f18e05a 100644 --- a/src/Unit/Exchange/callGenerators/uniswapV3.ts +++ b/src/Unit/Exchange/callGenerators/uniswapV3.ts @@ -1,11 +1,11 @@ import { SwapExecutor__factory, UniswapV3Pool__factory } from "@orionprotocol/contracts/lib/ethers-v5/index.js" import { type BigNumberish, providers, type BytesLike, ethers } from "ethers" import { SafeArray } from "../../../utils/safeGetters.js" -import type { SwapInfo } from "../generateSwapCalldata.js" +import type { SingleSwap } from "../generateSwapCalldata.js" import { addCallParams, generateCalls } from "./utils.js" export async function generateUni3Call( - swap: SwapInfo, + swap: SingleSwap, amount: BigNumberish | undefined, recipient: string, provider: providers.JsonRpcProvider @@ -20,7 +20,7 @@ export async function generateUni3Call( } export async function generateOrion3Call( - swap: SwapInfo, + swap: SingleSwap, amount: BigNumberish | undefined, recipient: string, provider: providers.JsonRpcProvider @@ -35,7 +35,7 @@ export async function generateOrion3Call( } export async function generateUni3Calls( - path: SafeArray, + path: SafeArray, amount: BigNumberish, recipient: string, provider: providers.JsonRpcProvider @@ -53,7 +53,7 @@ export async function generateUni3Calls( } export async function generateOrion3Calls( - path: SafeArray, + path: SafeArray, amount: BigNumberish, recipient: string, provider: providers.JsonRpcProvider From 823e9a8ad5207ce77c13a9adb370ecab806848cf Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Thu, 28 Sep 2023 18:56:25 +0400 Subject: [PATCH 050/225] Added Factory type to ws path --- package.json | 2 +- src/services/Aggregator/ws/index.ts | 3 ++- src/types.ts | 10 ++-------- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 4bb08a6..707d1bd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.92-rc101", + "version": "0.19.92-rc102", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/ws/index.ts b/src/services/Aggregator/ws/index.ts index 00f5ec8..352bb36 100644 --- a/src/services/Aggregator/ws/index.ts +++ b/src/services/Aggregator/ws/index.ts @@ -17,6 +17,7 @@ import unsubscriptionDoneSchema from './schemas/unsubscriptionDoneSchema.js'; import assetPairConfigSchema from './schemas/assetPairConfigSchema.js'; import type { fullOrderSchema, orderUpdateSchema } from './schemas/addressUpdateSchema.js'; import { objectKeys } from '../../../utils/objectKeys.js'; +import type { Factory } from '../../../Unit/Exchange/generateSwapCalldata.js'; // import assertError from '../../../utils/assertError.js'; // import errorSchema from './schemas/errorSchema'; @@ -507,7 +508,7 @@ class AggregatorWS { pool: path.p, assetIn: path.ai, assetOut: path.ao, - factory: path.f, + factory: path.f as Factory, })), poolOptimal: json.po, ...(json.oi) && { diff --git a/src/types.ts b/src/types.ts index 64449e8..d7a7b3f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -4,6 +4,7 @@ import type subOrderStatuses from './constants/subOrderStatuses.js'; import type positionStatuses from './constants/positionStatuses.js'; import type { knownEnvs } from './config/schemas/index.js'; import type getHistory from './Orion/bridge/getHistory.js'; +import type { SingleSwap } from './Unit/Exchange/generateSwapCalldata.js'; export type DeepPartial = T extends object ? { [P in keyof T]?: DeepPartial; @@ -165,13 +166,6 @@ export type SwapInfoAlternative = { availableAmountOut?: number | undefined } -type ExchangeContractPath = { - pool: string - assetIn: string - assetOut: string - factory: string -} - export type SwapInfoBase = { swapRequestId: string assetIn: string @@ -182,7 +176,7 @@ export type SwapInfoBase = { minAmountOut: number path: string[] - exchangeContractPath: ExchangeContractPath[] + exchangeContractPath: SingleSwap[] exchanges?: string[] | undefined poolOptimal: boolean From 21015e921945545cd552d59ffb1e0251593c80f2 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Thu, 28 Sep 2023 19:48:12 +0400 Subject: [PATCH 051/225] Added factory schema --- package.json | 2 +- src/Unit/Exchange/callGenerators/curve.ts | 2 +- src/Unit/Exchange/callGenerators/uniswapV2.ts | 2 +- src/Unit/Exchange/callGenerators/uniswapV3.ts | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 8 ++------ src/constants/factories.ts | 1 + src/services/Aggregator/ws/schemas/swapInfoSchema.ts | 4 +++- src/types.ts | 11 ++++++++++- 8 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 src/constants/factories.ts diff --git a/package.json b/package.json index 707d1bd..242b3be 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.92-rc102", + "version": "0.19.92-rc103", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/callGenerators/curve.ts b/src/Unit/Exchange/callGenerators/curve.ts index 42e2123..2ce2b0a 100644 --- a/src/Unit/Exchange/callGenerators/curve.ts +++ b/src/Unit/Exchange/callGenerators/curve.ts @@ -1,7 +1,7 @@ import { SwapExecutor__factory, CurveRegistry__factory } from "@orionprotocol/contracts/lib/ethers-v5/index.js" import type { BigNumberish, providers } from "ethers" -import type { SingleSwap } from "../generateSwapCalldata.js" import { addCallParams } from "./utils.js" +import type { SingleSwap } from "../../../types.js" export async function generateCurveStableSwapCall( amount: BigNumberish, diff --git a/src/Unit/Exchange/callGenerators/uniswapV2.ts b/src/Unit/Exchange/callGenerators/uniswapV2.ts index bec62de..fe276d7 100644 --- a/src/Unit/Exchange/callGenerators/uniswapV2.ts +++ b/src/Unit/Exchange/callGenerators/uniswapV2.ts @@ -3,8 +3,8 @@ import { SafeArray } from "../../../utils/safeGetters.js" import { BigNumber } from "ethers" import type { BytesLike, BigNumberish } from "ethers" import { defaultAbiCoder, concat } from "ethers/lib/utils.js" -import type { SingleSwap } from "../generateSwapCalldata.js" import { addCallParams, generateCalls } from "./utils.js" +import type { SingleSwap } from "../../../types.js" export async function generateUni2Calls( path: SafeArray, diff --git a/src/Unit/Exchange/callGenerators/uniswapV3.ts b/src/Unit/Exchange/callGenerators/uniswapV3.ts index f18e05a..2dd8b95 100644 --- a/src/Unit/Exchange/callGenerators/uniswapV3.ts +++ b/src/Unit/Exchange/callGenerators/uniswapV3.ts @@ -1,8 +1,8 @@ import { SwapExecutor__factory, UniswapV3Pool__factory } from "@orionprotocol/contracts/lib/ethers-v5/index.js" import { type BigNumberish, providers, type BytesLike, ethers } from "ethers" import { SafeArray } from "../../../utils/safeGetters.js" -import type { SingleSwap } from "../generateSwapCalldata.js" import { addCallParams, generateCalls } from "./utils.js" +import type { SingleSwap } from "../../../types.js" export async function generateUni3Call( swap: SingleSwap, diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 7358acb..f0b70a3 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -9,15 +9,11 @@ import { generateUni3Calls, generateOrion3Calls, generateUni3Call, generateOrion import { exchangeToNativeDecimals, generateCalls, pathCallWithBalance } from './callGenerators/utils.js'; import { generateApproveCall, generateTransferCall } from './callGenerators/erc20.js'; import { generateCurveStableSwapCall } from './callGenerators/curve.js'; +import type { SingleSwap } from '../../types.js'; export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3" -export type SingleSwap = { - pool: string - assetIn: string - assetOut: string - factory: Factory -} + export type GenerateSwapCalldataParams = { amount: BigNumberish diff --git a/src/constants/factories.ts b/src/constants/factories.ts new file mode 100644 index 0000000..200d3e2 --- /dev/null +++ b/src/constants/factories.ts @@ -0,0 +1 @@ +export default ["UniswapV2", "UniswapV3", "Curve", "OrionV2", "OrionV3"] as const diff --git a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts index 288838b..aa79db8 100644 --- a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts @@ -1,6 +1,7 @@ import { z } from 'zod'; import MessageType from '../MessageType.js'; import baseMessageSchema from './baseMessageSchema.js'; +import factories from '../../../../constants/factories.js'; const alternativeSchema = z.object({ // execution alternatives e: z.string().array(), // exchanges @@ -11,6 +12,7 @@ const alternativeSchema = z.object({ // execution alternatives aa: z.number().optional(), // available amount in aao: z.number().optional(), // available amount out }); +const factorySchema = z.enum(factories); const swapInfoSchemaBase = baseMessageSchema.extend({ T: z.literal(MessageType.SWAP_INFO), S: z.string(), // swap request id @@ -37,7 +39,7 @@ const swapInfoSchemaBase = baseMessageSchema.extend({ p: z.string(), // pool address ai: z.string().toUpperCase(), // asset in ao: z.string().toUpperCase(), // asset out - f: z.string(), // factory + f: factorySchema, // factory })) }); diff --git a/src/types.ts b/src/types.ts index d7a7b3f..6f3afc4 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,10 +1,10 @@ /* eslint-disable @typescript-eslint/consistent-type-definitions */ +import factories from './constants/factories.js'; import type { BigNumber } from 'bignumber.js'; import type subOrderStatuses from './constants/subOrderStatuses.js'; import type positionStatuses from './constants/positionStatuses.js'; import type { knownEnvs } from './config/schemas/index.js'; import type getHistory from './Orion/bridge/getHistory.js'; -import type { SingleSwap } from './Unit/Exchange/generateSwapCalldata.js'; export type DeepPartial = T extends object ? { [P in keyof T]?: DeepPartial; @@ -166,6 +166,15 @@ export type SwapInfoAlternative = { availableAmountOut?: number | undefined } +export type Factory = typeof factories[number] + +export type SingleSwap = { + pool: string + assetIn: string + assetOut: string + factory: Factory +} + export type SwapInfoBase = { swapRequestId: string assetIn: string From cad6b1e943b9f4f27ac7b1d561b04243f8f42464 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Thu, 28 Sep 2023 19:49:49 +0400 Subject: [PATCH 052/225] Removed type assertion --- src/services/Aggregator/ws/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/Aggregator/ws/index.ts b/src/services/Aggregator/ws/index.ts index 352bb36..a3e0049 100644 --- a/src/services/Aggregator/ws/index.ts +++ b/src/services/Aggregator/ws/index.ts @@ -508,7 +508,7 @@ class AggregatorWS { pool: path.p, assetIn: path.ai, assetOut: path.ao, - factory: path.f as Factory, + factory: path.f, })), poolOptimal: json.po, ...(json.oi) && { From f35e2ef338a73eb1975b76856ec14c10ea808fe1 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Thu, 28 Sep 2023 19:50:18 +0400 Subject: [PATCH 053/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 242b3be..f9b995b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.92-rc103", + "version": "0.19.92-rc104", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 2a089b3c4b39220cebc502e32950351aab5937f3 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Thu, 28 Sep 2023 19:57:58 +0400 Subject: [PATCH 054/225] Removed unused import --- src/services/Aggregator/ws/index.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/services/Aggregator/ws/index.ts b/src/services/Aggregator/ws/index.ts index a3e0049..a50d62b 100644 --- a/src/services/Aggregator/ws/index.ts +++ b/src/services/Aggregator/ws/index.ts @@ -17,9 +17,6 @@ import unsubscriptionDoneSchema from './schemas/unsubscriptionDoneSchema.js'; import assetPairConfigSchema from './schemas/assetPairConfigSchema.js'; import type { fullOrderSchema, orderUpdateSchema } from './schemas/addressUpdateSchema.js'; import { objectKeys } from '../../../utils/objectKeys.js'; -import type { Factory } from '../../../Unit/Exchange/generateSwapCalldata.js'; -// import assertError from '../../../utils/assertError.js'; -// import errorSchema from './schemas/errorSchema'; const UNSUBSCRIBE = 'u'; const SERVER_PING_INTERVAL = 30000; From 020b153597534748e915e3d313388e39ef561792 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Fri, 29 Sep 2023 10:56:55 +0300 Subject: [PATCH 055/225] move constants --- package-lock.json | 4 ++-- package.json | 2 +- src/constants/index.ts | 1 + src/constants/timings.ts | 3 +++ src/services/Integrator/index.ts | 9 +++------ 5 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 src/constants/timings.ts diff --git a/package-lock.json b/package-lock.json index e241e30..b16089f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc9", + "version": "0.19.89-rc11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc9", + "version": "0.19.89-rc11", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 54faf66..dc30e31 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc10", + "version": "0.19.89-rc11", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/index.ts b/src/constants/index.ts index c414279..efe47f0 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -9,5 +9,6 @@ export { default as exchangesMap } from './exchangesMap.js'; export * from './chains.js'; export * from './precisions.js'; export * from './gasLimits.js'; +export * from './timings.js'; export const SERVICE_TOKEN = 'ORN'; diff --git a/src/constants/timings.ts b/src/constants/timings.ts new file mode 100644 index 0000000..e92fc85 --- /dev/null +++ b/src/constants/timings.ts @@ -0,0 +1,3 @@ +export const LOCK_START_TIME = 1690848000;// Aug 01 2023 00:00:00 UTC +export const DAY = 86400 +export const YEAR = 365 * DAY diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index 250a271..8f06bfd 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -9,6 +9,7 @@ import { } from './schemas/index.js'; import { fetchWithValidation } from 'simple-typed-fetch'; import { BigNumber } from 'bignumber.js'; +import { DAY, LOCK_START_TIME, YEAR } from '../../constants/index.js'; type BasePayload = { chainId: number @@ -65,10 +66,6 @@ type Payload = | ListAmountPayload | GetAmountByORNPayload; -const START_TIME = 1690848000;// Aug 01 2023 00:00:00 UTC -const DAY = 86400 -const YEAR = 365 * DAY - class IntegratorService { private readonly apiUrl: string; @@ -179,9 +176,9 @@ class IntegratorService { } private readonly getK = (time: number) => { - const currentTime = time < START_TIME ? START_TIME : time; + const currentTime = time < LOCK_START_TIME ? LOCK_START_TIME : time; - const deltaYears = BigNumber(currentTime).minus(START_TIME).dividedBy(YEAR); + const deltaYears = BigNumber(currentTime).minus(LOCK_START_TIME).dividedBy(YEAR); return BigNumber(2).pow(BigNumber(deltaYears).pow(2)); } From 6edb6f3c0cb34b0da8158f16df97e8342094ba2c Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Fri, 29 Sep 2023 17:58:01 +0400 Subject: [PATCH 056/225] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4e7d8fc..7cfb7fc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.91", + "version": "0.19.92", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From bed0aac578d07ec181ec8e5aa6163f5cfc0a307f Mon Sep 17 00:00:00 2001 From: TheJuze Date: Fri, 29 Sep 2023 17:01:22 +0300 Subject: [PATCH 057/225] make PlatformFees fields optional. temporary solution --- package-lock.json | 4 ++-- package.json | 2 +- src/constants/index.ts | 1 + src/services/BlockchainService/index.ts | 13 +++++++++---- src/services/Integrator/index.ts | 6 +++--- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index b16089f..74382d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc11", + "version": "0.19.89-rc12", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc11", + "version": "0.19.89-rc12", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index dc30e31..ab14ecd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc11", + "version": "0.19.89-rc12", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/index.ts b/src/constants/index.ts index efe47f0..1651be1 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -12,3 +12,4 @@ export * from './gasLimits.js'; export * from './timings.js'; export const SERVICE_TOKEN = 'ORN'; +export const INITIAL_VEORN_ADJUSTMENT_FACTOR = 5; diff --git a/src/services/BlockchainService/index.ts b/src/services/BlockchainService/index.ts index 6c43a0a..e301615 100644 --- a/src/services/BlockchainService/index.ts +++ b/src/services/BlockchainService/index.ts @@ -61,8 +61,8 @@ type AtomicSwapHistoryTargetQuery = AtomicSwapHistoryBaseQuery & { } type PlatformFees = { - assetIn: string - assetOut: string + assetIn?: string // TODO: return types from main branch + assetOut?: string walletAddress?: string | undefined fromWidget?: string | undefined } @@ -247,8 +247,13 @@ class BlockchainService { ) => { const url = new URL(`${this.apiUrl}/api/platform-fees`); - url.searchParams.append('assetIn', assetIn); - url.searchParams.append('assetOut', assetOut); + if (assetIn !== undefined) { // TODO: make same as in main branch + url.searchParams.append('assetIn', assetIn); + } + + if (assetOut !== undefined) { + url.searchParams.append('assetOut', assetOut); + } if (walletAddress !== undefined) { url.searchParams.append('walletAddress', walletAddress); diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index 8f06bfd..4b050ed 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -9,7 +9,7 @@ import { } from './schemas/index.js'; import { fetchWithValidation } from 'simple-typed-fetch'; import { BigNumber } from 'bignumber.js'; -import { DAY, LOCK_START_TIME, YEAR } from '../../constants/index.js'; +import { DAY, INITIAL_VEORN_ADJUSTMENT_FACTOR, LOCK_START_TIME, YEAR } from '../../constants/index.js'; type BasePayload = { chainId: number @@ -109,7 +109,7 @@ class IntegratorService { }) } - getAmountAtCurrent = (amount: number) => { + getAmountAtCurrent = async (amount: number) => { const timestamp = Date.now() / 1000; // sqrt @@ -191,7 +191,7 @@ class IntegratorService { } // sqrt - return BigNumber(amountToken).multipliedBy(BigNumber(deltaDays).sqrt()).dividedBy(5); + return BigNumber(amountToken).multipliedBy(BigNumber(deltaDays).sqrt()).dividedBy(INITIAL_VEORN_ADJUSTMENT_FACTOR); } private readonly getVotingInfo = (userAddress: number) => { From ffa4d8b9d64613dc8673372d855485cc5c34f4f4 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Fri, 29 Sep 2023 17:16:55 +0300 Subject: [PATCH 058/225] fix getAmountAtCurrent return type --- package-lock.json | 4 ++-- package.json | 2 +- src/constants/index.ts | 1 - src/constants/timings.ts | 1 - src/services/Integrator/constants.ts | 2 ++ src/services/Integrator/index.ts | 5 +++-- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 74382d0..542573d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc12", + "version": "0.19.89-rc13", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc12", + "version": "0.19.89-rc13", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index ab14ecd..c84fa96 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc12", + "version": "0.19.89-rc13", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/index.ts b/src/constants/index.ts index 1651be1..efe47f0 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -12,4 +12,3 @@ export * from './gasLimits.js'; export * from './timings.js'; export const SERVICE_TOKEN = 'ORN'; -export const INITIAL_VEORN_ADJUSTMENT_FACTOR = 5; diff --git a/src/constants/timings.ts b/src/constants/timings.ts index e92fc85..a5ee04b 100644 --- a/src/constants/timings.ts +++ b/src/constants/timings.ts @@ -1,3 +1,2 @@ -export const LOCK_START_TIME = 1690848000;// Aug 01 2023 00:00:00 UTC export const DAY = 86400 export const YEAR = 365 * DAY diff --git a/src/services/Integrator/constants.ts b/src/services/Integrator/constants.ts index 00c0d3d..8ec49a1 100644 --- a/src/services/Integrator/constants.ts +++ b/src/services/Integrator/constants.ts @@ -1 +1,3 @@ export const AVAILABLE_POOL_FEE = ['0.01', '0.05', '0.3', '1'] as const; +export const INITIAL_VEORN_ADJUSTMENT_FACTOR = 5; +export const LOCK_START_TIME = 1690848000;// Aug 01 2023 00:00:00 UTC diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index 4b050ed..01e27e5 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -9,7 +9,8 @@ import { } from './schemas/index.js'; import { fetchWithValidation } from 'simple-typed-fetch'; import { BigNumber } from 'bignumber.js'; -import { DAY, INITIAL_VEORN_ADJUSTMENT_FACTOR, LOCK_START_TIME, YEAR } from '../../constants/index.js'; +import { DAY, YEAR } from '../../constants/index.js'; +import { INITIAL_VEORN_ADJUSTMENT_FACTOR, LOCK_START_TIME } from './constants.js'; type BasePayload = { chainId: number @@ -109,7 +110,7 @@ class IntegratorService { }) } - getAmountAtCurrent = async (amount: number) => { + getAmountAtCurrent = (amount: number) => { const timestamp = Date.now() / 1000; // sqrt From d0eb2288c040b8fd9fca0903ab03d6976b88e406 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Sun, 1 Oct 2023 17:42:36 +0300 Subject: [PATCH 059/225] update formulas --- package-lock.json | 4 ++-- package.json | 2 +- src/constants/timings.ts | 1 + src/services/Integrator/index.ts | 12 ++++++------ 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 542573d..2fa1e5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc13", + "version": "0.19.89-rc14", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc13", + "version": "0.19.89-rc14", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index c84fa96..5d5157e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc13", + "version": "0.19.89-rc14", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/timings.ts b/src/constants/timings.ts index a5ee04b..471091e 100644 --- a/src/constants/timings.ts +++ b/src/constants/timings.ts @@ -1,2 +1,3 @@ export const DAY = 86400 +export const WEEK_DAYS = 7; export const YEAR = 365 * DAY diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index 01e27e5..2c00111 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -9,8 +9,8 @@ import { } from './schemas/index.js'; import { fetchWithValidation } from 'simple-typed-fetch'; import { BigNumber } from 'bignumber.js'; -import { DAY, YEAR } from '../../constants/index.js'; -import { INITIAL_VEORN_ADJUSTMENT_FACTOR, LOCK_START_TIME } from './constants.js'; +import { DAY, WEEK_DAYS, YEAR } from '../../constants/index.js'; +import { LOCK_START_TIME } from './constants.js'; type BasePayload = { chainId: number @@ -110,7 +110,7 @@ class IntegratorService { }) } - getAmountAtCurrent = (amount: number) => { + getAmountAtCurrent = (amount: number): BigNumber => { const timestamp = Date.now() / 1000; // sqrt @@ -176,11 +176,11 @@ class IntegratorService { }); } - private readonly getK = (time: number) => { + private readonly getK = (time: number): BigNumber => { const currentTime = time < LOCK_START_TIME ? LOCK_START_TIME : time; const deltaYears = BigNumber(currentTime).minus(LOCK_START_TIME).dividedBy(YEAR); - return BigNumber(2).pow(BigNumber(deltaYears).pow(2)); + return BigNumber(2).pow(BigNumber(deltaYears).multipliedBy(2)); } private readonly getAmountByORN = (amountToken: number, timeLock: number) => { @@ -192,7 +192,7 @@ class IntegratorService { } // sqrt - return BigNumber(amountToken).multipliedBy(BigNumber(deltaDays).sqrt()).dividedBy(INITIAL_VEORN_ADJUSTMENT_FACTOR); + return BigNumber(amountToken).multipliedBy(BigNumber(deltaDays).sqrt()).dividedBy(BigNumber(WEEK_DAYS).sqrt()); } private readonly getVotingInfo = (userAddress: number) => { From 3b784906cbe20350d5b1a7f9c89397dd52b00e45 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Sun, 1 Oct 2023 17:53:51 +0300 Subject: [PATCH 060/225] change pow method --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Integrator/index.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2fa1e5e..864da52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc14", + "version": "0.19.89-rc15", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc14", + "version": "0.19.89-rc15", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 5d5157e..b4effed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc14", + "version": "0.19.89-rc15", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index 2c00111..8cdd0d6 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -176,11 +176,11 @@ class IntegratorService { }); } - private readonly getK = (time: number): BigNumber => { + private readonly getK = (time: number) => { const currentTime = time < LOCK_START_TIME ? LOCK_START_TIME : time; const deltaYears = BigNumber(currentTime).minus(LOCK_START_TIME).dividedBy(YEAR); - return BigNumber(2).pow(BigNumber(deltaYears).multipliedBy(2)); + return 2 ** BigNumber(deltaYears).multipliedBy(2).toNumber(); } private readonly getAmountByORN = (amountToken: number, timeLock: number) => { From 0f4940a6f9bed227d128bd4a820be34f82479de4 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Sun, 1 Oct 2023 18:16:42 +0300 Subject: [PATCH 061/225] make field getVotingInfo public --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Integrator/index.ts | 22 +++++++++++----------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 864da52..479d1fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc15", + "version": "0.19.89-rc16", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc15", + "version": "0.19.89-rc16", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index b4effed..61c27f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc15", + "version": "0.19.89-rc16", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index 8cdd0d6..a405bb9 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -117,6 +117,17 @@ class IntegratorService { return BigNumber(amount).dividedBy(this.getK(timestamp)); } + getVotingInfo = (userAddress: number) => { + return fetchWithValidation(this.apiUrl, votingInfoResponseSchema, { + method: 'POST', + body: this.makeRPCPayload({ + model: 'OrionVoting', + method: 'info', + params: [userAddress], + }), + }); + } + private readonly getEnvironment = () => { return fetchWithValidation(this.apiUrl, environmentResponseSchema, { method: 'POST', @@ -194,17 +205,6 @@ class IntegratorService { // sqrt return BigNumber(amountToken).multipliedBy(BigNumber(deltaDays).sqrt()).dividedBy(BigNumber(WEEK_DAYS).sqrt()); } - - private readonly getVotingInfo = (userAddress: number) => { - return fetchWithValidation(this.apiUrl, votingInfoResponseSchema, { - method: 'POST', - body: this.makeRPCPayload({ - model: 'OrionVoting', - method: 'info', - params: [userAddress], - }), - }); - } } export * as schemas from './schemas/index.js'; From de23a73487148457465ad5504476c1001c85f9fa Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Mon, 2 Oct 2023 09:36:50 +0400 Subject: [PATCH 062/225] make readonly and public --- package.json | 2 +- src/services/Integrator/index.ts | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 61c27f3..852117d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc16", + "version": "0.19.89-rc17", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index a405bb9..927f15f 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -91,7 +91,7 @@ class IntegratorService { this.getVotingInfo = this.getVotingInfo.bind(this); } - makeRPCPayload = (payload: Omit) => { + readonly makeRPCPayload = (payload: Omit) => { return JSON.stringify({ ...payload, chainId: this.chainId, @@ -99,7 +99,7 @@ class IntegratorService { }); }; - veORNInfo = (address: string) => { + readonly veORNInfo = (address: string) => { return fetchWithValidation(this.apiUrl, veORNInfoResponseSchema, { method: 'POST', body: this.makeRPCPayload({ @@ -110,14 +110,14 @@ class IntegratorService { }) } - getAmountAtCurrent = (amount: number): BigNumber => { + readonly getAmountAtCurrent = (amount: number): BigNumber => { const timestamp = Date.now() / 1000; // sqrt return BigNumber(amount).dividedBy(this.getK(timestamp)); } - getVotingInfo = (userAddress: number) => { + readonly getVotingInfo = (userAddress: number) => { return fetchWithValidation(this.apiUrl, votingInfoResponseSchema, { method: 'POST', body: this.makeRPCPayload({ @@ -128,7 +128,7 @@ class IntegratorService { }); } - private readonly getEnvironment = () => { + readonly getEnvironment = () => { return fetchWithValidation(this.apiUrl, environmentResponseSchema, { method: 'POST', body: this.makeRPCPayload({ @@ -139,7 +139,7 @@ class IntegratorService { }); }; - private readonly listNFTOrder = (address: string) => { + readonly listNFTOrder = (address: string) => { return fetchWithValidation(this.apiUrl, listNFTOrderResponseSchema, { method: 'POST', body: this.makeRPCPayload({ @@ -150,7 +150,7 @@ class IntegratorService { }); }; - private readonly getPoolInfo = ( + readonly getPoolInfo = ( token0: string, token1: string, poolAddress: string @@ -165,7 +165,7 @@ class IntegratorService { }); } - private readonly listPool = (address: string) => { + readonly listPool = (address: string) => { return fetchWithValidation(this.apiUrl, listPoolResponseSchema, { method: 'POST', body: this.makeRPCPayload({ @@ -176,7 +176,7 @@ class IntegratorService { }); } - private readonly listAmount = (poolKey: string) => { + readonly listAmount = (poolKey: string) => { return fetchWithValidation(this.apiUrl, listAmountResponseSchema, { method: 'POST', body: this.makeRPCPayload({ From e4009d297b4df6530241dfaecabc029f750d5857 Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Mon, 2 Oct 2023 10:26:42 +0400 Subject: [PATCH 063/225] fixed listAmountSchema --- package.json | 2 +- src/services/Integrator/schemas/list-amount-schema.ts | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 852117d..4414d37 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc17", + "version": "0.19.89-rc18", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/schemas/list-amount-schema.ts b/src/services/Integrator/schemas/list-amount-schema.ts index c4bf3b1..d942a51 100644 --- a/src/services/Integrator/schemas/list-amount-schema.ts +++ b/src/services/Integrator/schemas/list-amount-schema.ts @@ -1,5 +1,9 @@ import { z } from 'zod'; +import infoSchema from './info-schema.js'; -const listAmountSchema = z.record(z.number(), z.number()) +const listAmountSchema = z.object({ + result: z.record(z.number()), + info: infoSchema, +}); export default listAmountSchema; From cf33e8b841f6057406423d361aa56b75b17dd962 Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Mon, 2 Oct 2023 10:38:05 +0400 Subject: [PATCH 064/225] added test method --- package.json | 2 +- src/services/Integrator/index.ts | 12 ++++++++++++ src/services/Integrator/schemas/index.ts | 1 + .../Integrator/schemas/test-incrementor-schema.ts | 9 +++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/services/Integrator/schemas/test-incrementor-schema.ts diff --git a/package.json b/package.json index 4414d37..c8596ad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc18", + "version": "0.19.89-rc19", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index 927f15f..b674610 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -4,6 +4,7 @@ import { listAmountResponseSchema, listNFTOrderResponseSchema, listPoolResponseSchema, + testIncrementorSchema, veORNInfoResponseSchema, votingInfoResponseSchema } from './schemas/index.js'; @@ -187,6 +188,17 @@ class IntegratorService { }); } + readonly testRetrieve = () => { + return fetchWithValidation(this.apiUrl, testIncrementorSchema, { + method: 'POST', + body: this.makeRPCPayload({ + model: 'Incrementer', + method: 'retrieve', + params: [], + }), + }); + } + private readonly getK = (time: number) => { const currentTime = time < LOCK_START_TIME ? LOCK_START_TIME : time; diff --git a/src/services/Integrator/schemas/index.ts b/src/services/Integrator/schemas/index.ts index ebd913d..e6e03b6 100644 --- a/src/services/Integrator/schemas/index.ts +++ b/src/services/Integrator/schemas/index.ts @@ -5,3 +5,4 @@ export { default as listPoolResponseSchema } from './list-pool-response-schema.j export { default as veORNInfoResponseSchema } from './veORN-info-schema.js'; export { default as listAmountResponseSchema } from './list-amount-schema.js'; export { default as votingInfoResponseSchema } from './voting-info-schema.js'; +export { default as testIncrementorSchema } from './test-incrementor-schema.js'; diff --git a/src/services/Integrator/schemas/test-incrementor-schema.ts b/src/services/Integrator/schemas/test-incrementor-schema.ts new file mode 100644 index 0000000..945d461 --- /dev/null +++ b/src/services/Integrator/schemas/test-incrementor-schema.ts @@ -0,0 +1,9 @@ +import { z } from 'zod'; +import infoSchema from './info-schema.js'; + +const testIncrementorSchema = z.object({ + result: z.number().int(), + info: infoSchema, +}); + +export default testIncrementorSchema; From e734e5e7e9339e5e6e493762198ca0ed8c877c94 Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Mon, 2 Oct 2023 10:57:52 +0400 Subject: [PATCH 065/225] fix info schema --- package.json | 2 +- src/services/Integrator/schemas/info-schema.ts | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index c8596ad..6957f5f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc19", + "version": "0.19.89-rc20", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/schemas/info-schema.ts b/src/services/Integrator/schemas/info-schema.ts index 949727e..9e1dc60 100644 --- a/src/services/Integrator/schemas/info-schema.ts +++ b/src/services/Integrator/schemas/info-schema.ts @@ -1,9 +1,11 @@ import { z } from 'zod'; -import { hexStringSchema } from './util-schemas.js'; +import { ethers } from 'ethers'; const infoSchema = z.object({ blockNumber: z.number().int().nonnegative(), - blockHash: hexStringSchema, + blockHash: z.string().refine((v) => v.length === 0 || ethers.utils.isHexString(v), { + message: 'blockHash must be a valid hex string or empty', + }), timeRequest: z.number().int().nonnegative(), timeAnswer: z.number().int().nonnegative(), changes: z.number().int().nonnegative(), From 4bb4798666ba4df8af94429f20e8c5e4e774827b Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 2 Oct 2023 10:36:14 +0300 Subject: [PATCH 066/225] make field address getVotingInfo string --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Integrator/index.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 479d1fc..12e110b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc16", + "version": "0.19.89-rc21", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc16", + "version": "0.19.89-rc21", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 6957f5f..8e6f7bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc20", + "version": "0.19.89-rc21", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index b674610..43be3fb 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -118,7 +118,7 @@ class IntegratorService { return BigNumber(amount).dividedBy(this.getK(timestamp)); } - readonly getVotingInfo = (userAddress: number) => { + readonly getVotingInfo = (userAddress: string) => { return fetchWithValidation(this.apiUrl, votingInfoResponseSchema, { method: 'POST', body: this.makeRPCPayload({ From 9f39d789e5875205b0b158b7a0553eb23dd5a0a5 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 2 Oct 2023 10:47:56 +0300 Subject: [PATCH 067/225] update votingInfo schema --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Integrator/schemas/voting-info-schema.ts | 8 +++++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 12e110b..784bfc5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc21", + "version": "0.19.89-rc22", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc21", + "version": "0.19.89-rc22", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 8e6f7bf..a3fb0fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.89-rc21", + "version": "0.19.89-rc22", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/schemas/voting-info-schema.ts b/src/services/Integrator/schemas/voting-info-schema.ts index 74c05dc..bb0718f 100644 --- a/src/services/Integrator/schemas/voting-info-schema.ts +++ b/src/services/Integrator/schemas/voting-info-schema.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import infoSchema from './info-schema.js'; const poolSchema = z.object({ allVote: z.number(), @@ -8,7 +9,7 @@ const poolSchema = z.object({ userVote: z.number() }) -const votingInfoSchema = z.object({ +const votingResultSchema = z.object({ absoluteVeTokenInVoting: z.number(), pools: z.array(poolSchema), userVeTokenBalance: z.number(), @@ -18,4 +19,9 @@ const votingInfoSchema = z.object({ weeklyReward: z.number() }) +const votingInfoSchema = z.object({ + result: votingResultSchema, + info: infoSchema, +}); + export default votingInfoSchema; From 91c6342813b460d5cabfb759e17b619957dbf5bf Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 2 Oct 2023 13:35:15 +0300 Subject: [PATCH 068/225] swap by address fix --- package-lock.json | 4 ++-- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0e30774..2ac3f59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.91", + "version": "0.19.93-rc1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.91", + "version": "0.19.93-rc1", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 7cfb7fc..c5dacf4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.92", + "version": "0.19.93-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index c781c28..7b9a25f 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -46,8 +46,8 @@ export default async function generateSwapCalldata({ const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); let path = SafeArray.from(path_).map((swapInfo) => { - swapInfo.assetIn = safeGet(assetToAddress, swapInfo.assetIn); - swapInfo.assetOut = safeGet(assetToAddress, swapInfo.assetOut); + swapInfo.assetIn = ethers.utils.isAddress(swapInfo.assetIn) ? swapInfo.assetIn : safeGet(assetToAddress, swapInfo.assetIn); + swapInfo.assetOut = ethers.utils.isAddress(swapInfo.assetOut) ? swapInfo.assetOut : safeGet(assetToAddress, swapInfo.assetOut); return swapInfo; }) const factory = path.first().factory From 6002899ef8b5e1dd4be513d27afd42d09a6a710f Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 2 Oct 2023 14:03:06 +0300 Subject: [PATCH 069/225] test --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index c5dacf4..fda7bd0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.93-rc1", + "version": "0.19.93-rc2", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 7b9a25f..6084e0b 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -46,8 +46,10 @@ export default async function generateSwapCalldata({ const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); let path = SafeArray.from(path_).map((swapInfo) => { - swapInfo.assetIn = ethers.utils.isAddress(swapInfo.assetIn) ? swapInfo.assetIn : safeGet(assetToAddress, swapInfo.assetIn); - swapInfo.assetOut = ethers.utils.isAddress(swapInfo.assetOut) ? swapInfo.assetOut : safeGet(assetToAddress, swapInfo.assetOut); + console.log('test_1', swapInfo.assetIn, swapInfo.assetOut, ethers.utils.isAddress(swapInfo.assetIn), ethers.utils.isAddress(swapInfo.assetOut)); + swapInfo.assetIn = ethers.utils.isAddress(swapInfo.assetIn.toLowerCase()) ? swapInfo.assetIn : safeGet(assetToAddress, swapInfo.assetIn); + swapInfo.assetOut = ethers.utils.isAddress(swapInfo.assetOut.toLowerCase()) ? swapInfo.assetOut : safeGet(assetToAddress, swapInfo.assetOut); + console.log('test_2', swapInfo.assetIn, swapInfo.assetOut, ethers.utils.isAddress(swapInfo.assetIn), ethers.utils.isAddress(swapInfo.assetOut)); return swapInfo; }) const factory = path.first().factory From 3d1a23ab7b9cbc251e7ab3e27c6eeb6590eec7c2 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 2 Oct 2023 14:21:21 +0300 Subject: [PATCH 070/225] fix --- src/Unit/Exchange/generateSwapCalldata.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 6084e0b..ba1382d 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -46,10 +46,8 @@ export default async function generateSwapCalldata({ const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); let path = SafeArray.from(path_).map((swapInfo) => { - console.log('test_1', swapInfo.assetIn, swapInfo.assetOut, ethers.utils.isAddress(swapInfo.assetIn), ethers.utils.isAddress(swapInfo.assetOut)); swapInfo.assetIn = ethers.utils.isAddress(swapInfo.assetIn.toLowerCase()) ? swapInfo.assetIn : safeGet(assetToAddress, swapInfo.assetIn); swapInfo.assetOut = ethers.utils.isAddress(swapInfo.assetOut.toLowerCase()) ? swapInfo.assetOut : safeGet(assetToAddress, swapInfo.assetOut); - console.log('test_2', swapInfo.assetIn, swapInfo.assetOut, ethers.utils.isAddress(swapInfo.assetIn), ethers.utils.isAddress(swapInfo.assetOut)); return swapInfo; }) const factory = path.first().factory From 1a2f1d79407ba82521bc4d6d34a7c5571e44f456 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 2 Oct 2023 14:21:43 +0300 Subject: [PATCH 071/225] update --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index fda7bd0..67ba92a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.93-rc2", + "version": "0.19.93-rc3", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index ba1382d..99b3657 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -46,8 +46,8 @@ export default async function generateSwapCalldata({ const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); let path = SafeArray.from(path_).map((swapInfo) => { - swapInfo.assetIn = ethers.utils.isAddress(swapInfo.assetIn.toLowerCase()) ? swapInfo.assetIn : safeGet(assetToAddress, swapInfo.assetIn); - swapInfo.assetOut = ethers.utils.isAddress(swapInfo.assetOut.toLowerCase()) ? swapInfo.assetOut : safeGet(assetToAddress, swapInfo.assetOut); + swapInfo.assetIn = ethers.utils.isAddress(swapInfo.assetIn.toLowerCase()) ? swapInfo.assetIn.toLowerCase() : safeGet(assetToAddress, swapInfo.assetIn); + swapInfo.assetOut = ethers.utils.isAddress(swapInfo.assetOut.toLowerCase()) ? swapInfo.assetOut.toLowerCase() : safeGet(assetToAddress, swapInfo.assetOut); return swapInfo; }) const factory = path.first().factory From 4f2c1a5c0691477becd9b8041104aa2ff121634d Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 2 Oct 2023 14:39:08 +0300 Subject: [PATCH 072/225] fix lowercase --- package-lock.json | 4 ++-- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2ac3f59..9801d03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.93-rc1", + "version": "0.19.93-rc4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.93-rc1", + "version": "0.19.93-rc4", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 67ba92a..12284d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.93-rc3", + "version": "0.19.93-rc4", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 99b3657..ba1382d 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -46,8 +46,8 @@ export default async function generateSwapCalldata({ const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); let path = SafeArray.from(path_).map((swapInfo) => { - swapInfo.assetIn = ethers.utils.isAddress(swapInfo.assetIn.toLowerCase()) ? swapInfo.assetIn.toLowerCase() : safeGet(assetToAddress, swapInfo.assetIn); - swapInfo.assetOut = ethers.utils.isAddress(swapInfo.assetOut.toLowerCase()) ? swapInfo.assetOut.toLowerCase() : safeGet(assetToAddress, swapInfo.assetOut); + swapInfo.assetIn = ethers.utils.isAddress(swapInfo.assetIn.toLowerCase()) ? swapInfo.assetIn : safeGet(assetToAddress, swapInfo.assetIn); + swapInfo.assetOut = ethers.utils.isAddress(swapInfo.assetOut.toLowerCase()) ? swapInfo.assetOut : safeGet(assetToAddress, swapInfo.assetOut); return swapInfo; }) const factory = path.first().factory From b2344549eb5f9905a513595ab5ea7372454f835d Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 2 Oct 2023 14:48:35 +0300 Subject: [PATCH 073/225] fix: lowercase --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 12284d3..6864e31 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.93-rc4", + "version": "0.19.93-rc5", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index ba1382d..e336724 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -46,8 +46,9 @@ export default async function generateSwapCalldata({ const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); let path = SafeArray.from(path_).map((swapInfo) => { - swapInfo.assetIn = ethers.utils.isAddress(swapInfo.assetIn.toLowerCase()) ? swapInfo.assetIn : safeGet(assetToAddress, swapInfo.assetIn); - swapInfo.assetOut = ethers.utils.isAddress(swapInfo.assetOut.toLowerCase()) ? swapInfo.assetOut : safeGet(assetToAddress, swapInfo.assetOut); + swapInfo.assetIn = ethers.utils.isAddress(swapInfo.assetIn.toLowerCase()) ? swapInfo.assetIn.toLowerCase() : safeGet(assetToAddress, swapInfo.assetIn); + swapInfo.assetOut = ethers.utils.isAddress(swapInfo.assetOut.toLowerCase()) ? swapInfo.assetOut.toLowerCase() : safeGet(assetToAddress, swapInfo.assetOut); + console.log('test_', swapInfo.assetIn, swapInfo.assetOut); return swapInfo; }) const factory = path.first().factory From 6cd0995d268310055f06891c5f3ea4f15f30940f Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 2 Oct 2023 15:02:18 +0300 Subject: [PATCH 074/225] fix address --- src/Unit/Exchange/generateSwapCalldata.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index e336724..9f4bb29 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -46,9 +46,10 @@ export default async function generateSwapCalldata({ const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); let path = SafeArray.from(path_).map((swapInfo) => { - swapInfo.assetIn = ethers.utils.isAddress(swapInfo.assetIn.toLowerCase()) ? swapInfo.assetIn.toLowerCase() : safeGet(assetToAddress, swapInfo.assetIn); - swapInfo.assetOut = ethers.utils.isAddress(swapInfo.assetOut.toLowerCase()) ? swapInfo.assetOut.toLowerCase() : safeGet(assetToAddress, swapInfo.assetOut); - console.log('test_', swapInfo.assetIn, swapInfo.assetOut); + console.log('test_1', swapInfo.assetIn, swapInfo.assetOut, assetToAddress); + swapInfo.assetIn = assetToAddress[swapInfo.assetIn] ?? swapInfo.assetIn.toLowerCase(); + swapInfo.assetOut = assetToAddress[swapInfo.assetOut] ?? swapInfo.assetOut.toLowerCase(); + console.log('test_2', swapInfo.assetIn, swapInfo.assetOut); return swapInfo; }) const factory = path.first().factory From adca4b76b56f83564751de26efd8440413e87eb2 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 2 Oct 2023 15:02:31 +0300 Subject: [PATCH 075/225] bump ver --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6864e31..8ac4e5c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.93-rc5", + "version": "0.19.93-rc6", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From b73bbd8f3120cf0656f62392449a5cc1745d1f20 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 2 Oct 2023 15:13:29 +0300 Subject: [PATCH 076/225] test --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8ac4e5c..27c0266 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.93-rc6", + "version": "0.19.93-rc7", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 9f4bb29..72a85e4 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -46,7 +46,7 @@ export default async function generateSwapCalldata({ const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); let path = SafeArray.from(path_).map((swapInfo) => { - console.log('test_1', swapInfo.assetIn, swapInfo.assetOut, assetToAddress); + console.log('test_1', swapInfo.assetIn, swapInfo.assetOut, assetToAddress, assetToAddress[swapInfo.assetIn], assetToAddress[swapInfo.assetOut], assetToAddress[swapInfo.assetIn.toLowerCase()], assetToAddress[swapInfo.assetOut.toLowerCase()], assetToAddress['ORN']); swapInfo.assetIn = assetToAddress[swapInfo.assetIn] ?? swapInfo.assetIn.toLowerCase(); swapInfo.assetOut = assetToAddress[swapInfo.assetOut] ?? swapInfo.assetOut.toLowerCase(); console.log('test_2', swapInfo.assetIn, swapInfo.assetOut); From bff9be6d83c48eddf61163a520b3cbab5fff3a6c Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 2 Oct 2023 16:57:10 +0300 Subject: [PATCH 077/225] remove console log --- package-lock.json | 4 ++-- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 2 -- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9801d03..664ed0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.93-rc4", + "version": "0.19.93-rc8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.93-rc4", + "version": "0.19.93-rc8", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 27c0266..5567dbd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.93-rc7", + "version": "0.19.93-rc8", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 72a85e4..11b56b0 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -46,10 +46,8 @@ export default async function generateSwapCalldata({ const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); let path = SafeArray.from(path_).map((swapInfo) => { - console.log('test_1', swapInfo.assetIn, swapInfo.assetOut, assetToAddress, assetToAddress[swapInfo.assetIn], assetToAddress[swapInfo.assetOut], assetToAddress[swapInfo.assetIn.toLowerCase()], assetToAddress[swapInfo.assetOut.toLowerCase()], assetToAddress['ORN']); swapInfo.assetIn = assetToAddress[swapInfo.assetIn] ?? swapInfo.assetIn.toLowerCase(); swapInfo.assetOut = assetToAddress[swapInfo.assetOut] ?? swapInfo.assetOut.toLowerCase(); - console.log('test_2', swapInfo.assetIn, swapInfo.assetOut); return swapInfo; }) const factory = path.first().factory From 28915d35b7cd9b65296cbb9632a4190080a37c71 Mon Sep 17 00:00:00 2001 From: kigastu Date: Mon, 2 Oct 2023 17:11:42 +0300 Subject: [PATCH 078/225] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5567dbd..06c88db 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.93-rc8", + "version": "0.19.93", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 5efad05fef815fcff5189533103cf880ad5fede3 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 2 Oct 2023 17:58:09 +0300 Subject: [PATCH 079/225] referral schema update --- package-lock.json | 4 ++-- package.json | 2 +- src/services/ReferralSystem/schemas/ratingSchema.ts | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 664ed0f..2ba7d17 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.93-rc8", + "version": "0.19.94", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.93-rc8", + "version": "0.19.94", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 06c88db..0733e6b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.93", + "version": "0.19.94", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/ReferralSystem/schemas/ratingSchema.ts b/src/services/ReferralSystem/schemas/ratingSchema.ts index 57489bb..ecc9354 100644 --- a/src/services/ReferralSystem/schemas/ratingSchema.ts +++ b/src/services/ReferralSystem/schemas/ratingSchema.ts @@ -6,6 +6,7 @@ const ratingSchema = z.object({ weekly_boost_budget_fmt: z.number(), monthly_boost_budget: z.string(), monthly_boost_budget_fmt: z.number(), + displayed_boost_budget_fmt: z.string(), time_left_for_the_reward: z.number(), time_left_for_the_reward_local: z.string(), time_left_for_the_reward_utc: z.string(), From acb1e0c3974283869cd3493888286b9ee92820c1 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 2 Oct 2023 19:15:51 +0300 Subject: [PATCH 080/225] fix referral schema --- package-lock.json | 4 ++-- package.json | 2 +- src/services/ReferralSystem/schemas/ratingSchema.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2ba7d17..a0527fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.94", + "version": "0.19.95", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.19.94", + "version": "0.19.95", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 0733e6b..c6206d8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.94", + "version": "0.19.95", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/ReferralSystem/schemas/ratingSchema.ts b/src/services/ReferralSystem/schemas/ratingSchema.ts index ecc9354..bb028da 100644 --- a/src/services/ReferralSystem/schemas/ratingSchema.ts +++ b/src/services/ReferralSystem/schemas/ratingSchema.ts @@ -6,7 +6,7 @@ const ratingSchema = z.object({ weekly_boost_budget_fmt: z.number(), monthly_boost_budget: z.string(), monthly_boost_budget_fmt: z.number(), - displayed_boost_budget_fmt: z.string(), + displayed_boost_budget_fmt: z.number(), time_left_for_the_reward: z.number(), time_left_for_the_reward_local: z.string(), time_left_for_the_reward_utc: z.string(), From 2942bb5426c0fdeff3a2b4a461cd0e3620f33130 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Tue, 3 Oct 2023 07:53:11 +0100 Subject: [PATCH 081/225] Update to 0.20.0 version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ef29267..b94983f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.92-rc2", + "version": "0.20.0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 902b5f39948fd3f56a3906ff0d11ad413f2b4fb7 Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Tue, 3 Oct 2023 16:54:40 +0400 Subject: [PATCH 082/225] consistent imports --- package.json | 2 +- src/BalanceGuard.ts | 2 +- src/Orion/bridge/swap.ts | 2 +- src/Unit/Exchange/deposit.ts | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 5 ++++- src/utils/getBalance.ts | 3 +-- src/utils/parseExchangeTradeTransaction.ts | 2 +- 7 files changed, 10 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index b94983f..aa1ba69 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.0", + "version": "0.20.1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/BalanceGuard.ts b/src/BalanceGuard.ts index 9434591..f466c82 100644 --- a/src/BalanceGuard.ts +++ b/src/BalanceGuard.ts @@ -1,7 +1,7 @@ import { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; import clone from 'just-clone'; -import { ERC20__factory } from '@orionprotocol/contracts/lib/ethers-v6'; +import { ERC20__factory } from '@orionprotocol/contracts/lib/ethers-v6/index.js'; import { APPROVE_ERC20_GAS_LIMIT, NATIVE_CURRENCY_PRECISION } from './constants/index.js'; import type { AggregatedBalanceRequirement, ApproveFix, Asset, BalanceIssue, BalanceRequirement, Source, diff --git a/src/Orion/bridge/swap.ts b/src/Orion/bridge/swap.ts index e9eae6b..4bb8352 100644 --- a/src/Orion/bridge/swap.ts +++ b/src/Orion/bridge/swap.ts @@ -1,6 +1,6 @@ import { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; -import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v6'; +import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v6/index.js'; import getBalances from '../../utils/getBalances.js'; import BalanceGuard from '../../BalanceGuard.js'; import getAvailableSources from '../../utils/getAvailableFundsSources.js'; diff --git a/src/Unit/Exchange/deposit.ts b/src/Unit/Exchange/deposit.ts index 96bcbfe..d257244 100644 --- a/src/Unit/Exchange/deposit.ts +++ b/src/Unit/Exchange/deposit.ts @@ -1,6 +1,6 @@ import { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; -import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v6'; +import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v6/index.js'; import getBalances from '../../utils/getBalances.js'; import BalanceGuard from '../../BalanceGuard.js'; import type Unit from '../index.js'; diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 76e9fe3..5683b0b 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -1,5 +1,8 @@ import type { ExchangeWithGenericSwap } from '@orionprotocol/contracts/lib/ethers-v6/Exchange.js'; -import { UniswapV3Pool__factory, ERC20__factory, SwapExecutor__factory, CurveRegistry__factory } from '@orionprotocol/contracts/lib/ethers-v6'; +import { + UniswapV3Pool__factory, ERC20__factory, + SwapExecutor__factory, CurveRegistry__factory +} from '@orionprotocol/contracts/lib/ethers-v6/index.js'; import { ethers, type BigNumberish, type AddressLike, concat, type BytesLike } from 'ethers'; import { safeGet, SafeArray } from '../../utils/safeGetters.js'; import type Unit from '../index.js'; diff --git a/src/utils/getBalance.ts b/src/utils/getBalance.ts index 861d0d8..35738ce 100644 --- a/src/utils/getBalance.ts +++ b/src/utils/getBalance.ts @@ -1,5 +1,4 @@ -import type { Exchange } from '@orionprotocol/contracts/lib/ethers-v6'; -import { ERC20__factory } from '@orionprotocol/contracts/lib/ethers-v6'; +import { ERC20__factory, type Exchange } from '@orionprotocol/contracts/lib/ethers-v6/index.js'; import type { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; import { INTERNAL_PROTOCOL_PRECISION, NATIVE_CURRENCY_PRECISION } from '../constants/index.js'; diff --git a/src/utils/parseExchangeTradeTransaction.ts b/src/utils/parseExchangeTradeTransaction.ts index 38aa5e4..efd0235 100644 --- a/src/utils/parseExchangeTradeTransaction.ts +++ b/src/utils/parseExchangeTradeTransaction.ts @@ -1,4 +1,4 @@ -import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v6'; +import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v6/index.js'; import { ethers } from 'ethers'; import { z } from 'zod'; From 52fd8b1b782c783a0d59f23ef3ae0ae92f15d3f3 Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Tue, 3 Oct 2023 16:56:15 +0400 Subject: [PATCH 083/225] Update ethers version in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 677f4d9..3065e7c 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ npm i @orionprotocol/sdk ## Initialization -> :warning: **Ethers ^5.6.0 required** +> :warning: **Ethers ^6.7.0 required** ```js // Node.js From c45179ceb9ad65130e02ebd420d1345f8db1072b Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Tue, 3 Oct 2023 22:33:11 +0400 Subject: [PATCH 084/225] Export factories array --- package.json | 2 +- src/index.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f9b995b..6f7421e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.19.92-rc104", + "version": "0.19.92-rc105", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/index.ts b/src/index.ts index 04f68e7..a23d913 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,7 @@ BigNumber.config({ EXPONENTIAL_AT: 1e+9 }); export * as config from './config/index.js'; export { default as Unit } from './Unit/index.js'; export { default as Orion } from './Orion/index.js'; +export { default as factories} from './constants/factories.js'; export * as utils from './utils/index.js'; export * as services from './services/index.js'; export * as crypt from './crypt/index.js'; From 9bcb392680a2dd13e3ac4d07fd1b348601eef4bb Mon Sep 17 00:00:00 2001 From: Dmitry Leleko Date: Wed, 4 Oct 2023 09:09:41 +0200 Subject: [PATCH 085/225] bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6583b8b..5d8e6fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.1", + "version": "0.20.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.1", + "version": "0.20.2", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index aa1ba69..e0c8749 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.1", + "version": "0.20.2", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 2f1dfc25313642fe09e709148f4c4254757387c9 Mon Sep 17 00:00:00 2001 From: Dmitry Leleko Date: Wed, 4 Oct 2023 11:40:46 +0200 Subject: [PATCH 086/225] Fixup for ethers new version --- package.json | 2 +- src/services/Integrator/schemas/info-schema.ts | 2 +- src/services/Integrator/schemas/util-schemas.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index e0c8749..df9ecc3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.2", + "version": "0.20.3", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/schemas/info-schema.ts b/src/services/Integrator/schemas/info-schema.ts index 9e1dc60..6a14901 100644 --- a/src/services/Integrator/schemas/info-schema.ts +++ b/src/services/Integrator/schemas/info-schema.ts @@ -3,7 +3,7 @@ import { ethers } from 'ethers'; const infoSchema = z.object({ blockNumber: z.number().int().nonnegative(), - blockHash: z.string().refine((v) => v.length === 0 || ethers.utils.isHexString(v), { + blockHash: z.string().refine((v) => v.length === 0 || ethers.isHexString(v), { message: 'blockHash must be a valid hex string or empty', }), timeRequest: z.number().int().nonnegative(), diff --git a/src/services/Integrator/schemas/util-schemas.ts b/src/services/Integrator/schemas/util-schemas.ts index f0e80b2..3e93133 100644 --- a/src/services/Integrator/schemas/util-schemas.ts +++ b/src/services/Integrator/schemas/util-schemas.ts @@ -3,12 +3,12 @@ import { z } from 'zod'; export const evmAddressSchema = z .string() - .refine(ethers.utils.isAddress, (v) => ({ + .refine(ethers.isAddress, (v) => ({ message: `${v} is not a valid address`, })); export const hexStringSchema = z .string() - .refine(ethers.utils.isHexString, (v) => ({ + .refine(ethers.isHexString, (v) => ({ message: `${v} is not a valid hex string`, })); From 944ed79ea70e23785f6ee46174a540f06dd8ea97 Mon Sep 17 00:00:00 2001 From: Dmitry Leleko Date: Wed, 4 Oct 2023 14:46:53 +0200 Subject: [PATCH 087/225] Update integrator service --- package.json | 2 +- src/services/Integrator/index.ts | 72 ++++++++++++++++---------------- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/package.json b/package.json index df9ecc3..5d8cd66 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.3", + "version": "0.20.4", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index 43be3fb..8da1a75 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -6,7 +6,7 @@ import { listPoolResponseSchema, testIncrementorSchema, veORNInfoResponseSchema, - votingInfoResponseSchema + votingInfoResponseSchema, } from './schemas/index.js'; import { fetchWithValidation } from 'simple-typed-fetch'; import { BigNumber } from 'bignumber.js'; @@ -46,27 +46,27 @@ type VeORNInfoPayload = BasePayload & { model: 'veORN' method: 'info' params: [string] -} +}; type ListAmountPayload = BasePayload & { model: string method: 'listAmount' params: [] -} +}; type GetAmountByORNPayload = BasePayload & { amountToken: number timeLock: number -} +}; type Payload = - | GetEnvironmentPayload - | ListNFTOrderPayload - | GetPoolInfoPayload - | ListPoolPayload - | VeORNInfoPayload - | ListAmountPayload - | GetAmountByORNPayload; + | GetEnvironmentPayload + | ListNFTOrderPayload + | GetPoolInfoPayload + | ListPoolPayload + | VeORNInfoPayload + | ListAmountPayload + | GetAmountByORNPayload; class IntegratorService { private readonly apiUrl: string; @@ -106,17 +106,29 @@ class IntegratorService { body: this.makeRPCPayload({ model: 'veORN', method: 'info', - params: [address] - }) - }) - } + params: [address], + }), + }); + }; readonly getAmountAtCurrent = (amount: number): BigNumber => { const timestamp = Date.now() / 1000; // sqrt return BigNumber(amount).dividedBy(this.getK(timestamp)); - } + }; + + readonly getAmountByORN = (amountToken: number, timeLock: number) => { + const timestamp = Date.now() / 1000; + + const deltaDays = BigNumber(timeLock).minus(timestamp).dividedBy(DAY); + + if (deltaDays.lte(0)) return 0; + + return BigNumber(amountToken) + .multipliedBy(BigNumber(deltaDays).sqrt()) + .dividedBy(BigNumber(WEEK_DAYS).sqrt()); + }; readonly getVotingInfo = (userAddress: string) => { return fetchWithValidation(this.apiUrl, votingInfoResponseSchema, { @@ -127,7 +139,7 @@ class IntegratorService { params: [userAddress], }), }); - } + }; readonly getEnvironment = () => { return fetchWithValidation(this.apiUrl, environmentResponseSchema, { @@ -164,7 +176,7 @@ class IntegratorService { params: [token0, token1, poolAddress], }), }); - } + }; readonly listPool = (address: string) => { return fetchWithValidation(this.apiUrl, listPoolResponseSchema, { @@ -175,7 +187,7 @@ class IntegratorService { params: [address], }), }); - } + }; readonly listAmount = (poolKey: string) => { return fetchWithValidation(this.apiUrl, listAmountResponseSchema, { @@ -186,7 +198,7 @@ class IntegratorService { params: [], }), }); - } + }; readonly testRetrieve = () => { return fetchWithValidation(this.apiUrl, testIncrementorSchema, { @@ -197,26 +209,16 @@ class IntegratorService { params: [], }), }); - } + }; private readonly getK = (time: number) => { const currentTime = time < LOCK_START_TIME ? LOCK_START_TIME : time; - const deltaYears = BigNumber(currentTime).minus(LOCK_START_TIME).dividedBy(YEAR); + const deltaYears = BigNumber(currentTime) + .minus(LOCK_START_TIME) + .dividedBy(YEAR); return 2 ** BigNumber(deltaYears).multipliedBy(2).toNumber(); - } - - private readonly getAmountByORN = (amountToken: number, timeLock: number) => { - const timestamp = Date.now() / 1000; - - const deltaDays = BigNumber(timeLock).minus(timestamp).dividedBy(DAY); - if (deltaDays.lt(0)) { - return 0; - } - - // sqrt - return BigNumber(amountToken).multipliedBy(BigNumber(deltaDays).sqrt()).dividedBy(BigNumber(WEEK_DAYS).sqrt()); - } + }; } export * as schemas from './schemas/index.js'; From 02764655a08d97a80b79b4b5fb8ae7189d36cd3c Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Thu, 5 Oct 2023 13:11:34 +0300 Subject: [PATCH 088/225] fix: exchanges name --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/ws/schemas/addressUpdateSchema.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5d8e6fb..bfb9c37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.2", + "version": "0.20.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.2", + "version": "0.20.5", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 5d8cd66..e2eebec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.4", + "version": "0.20.5", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts index 7cfeb4b..1e3e8d9 100644 --- a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts +++ b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts @@ -108,7 +108,7 @@ export const fullOrderSchema = z.object({ subOrders: o.c.map((so) => ({ pair: so.P, exchange: so.e, - exchangs: so.es, + exchanges: so.es, id: so.i, amount: so.a, settledAmount: so.A, From 4dd7245c78d3f2360337adfe65cb2dfba367079d Mon Sep 17 00:00:00 2001 From: Dmitry Leleko Date: Fri, 6 Oct 2023 09:49:11 +0200 Subject: [PATCH 089/225] Fix integrator service --- package.json | 2 +- src/services/Integrator/index.ts | 12 ++++++------ .../Integrator/schemas/voting-info-schema.ts | 14 ++++++++++---- src/services/index.ts | 1 + 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index e2eebec..fd8c4ee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.5", + "version": "0.20.6", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index 8da1a75..a3e4de8 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -100,7 +100,7 @@ class IntegratorService { }); }; - readonly veORNInfo = (address: string) => { + readonly veORNInfo = (address?: string) => { return fetchWithValidation(this.apiUrl, veORNInfoResponseSchema, { method: 'POST', body: this.makeRPCPayload({ @@ -121,16 +121,16 @@ class IntegratorService { readonly getAmountByORN = (amountToken: number, timeLock: number) => { const timestamp = Date.now() / 1000; - const deltaDays = BigNumber(timeLock).minus(timestamp).dividedBy(DAY); + const deltaDaysBN = BigNumber(timeLock).minus(timestamp).dividedBy(DAY); - if (deltaDays.lte(0)) return 0; + if (deltaDaysBN.lte(0)) return 0; return BigNumber(amountToken) - .multipliedBy(BigNumber(deltaDays).sqrt()) + .multipliedBy(deltaDaysBN.sqrt()) .dividedBy(BigNumber(WEEK_DAYS).sqrt()); }; - readonly getVotingInfo = (userAddress: string) => { + readonly getVotingInfo = (userAddress?: string) => { return fetchWithValidation(this.apiUrl, votingInfoResponseSchema, { method: 'POST', body: this.makeRPCPayload({ @@ -178,7 +178,7 @@ class IntegratorService { }); }; - readonly listPool = (address: string) => { + readonly listPool = (address?: string) => { return fetchWithValidation(this.apiUrl, listPoolResponseSchema, { method: 'POST', body: this.makeRPCPayload({ diff --git a/src/services/Integrator/schemas/voting-info-schema.ts b/src/services/Integrator/schemas/voting-info-schema.ts index bb0718f..5ea18f5 100644 --- a/src/services/Integrator/schemas/voting-info-schema.ts +++ b/src/services/Integrator/schemas/voting-info-schema.ts @@ -6,8 +6,14 @@ const poolSchema = z.object({ name: z.string(), poolAddress: z.string(), type: z.string(), - userVote: z.number() -}) + userVote: z.number(), + token0: z.string(), // deprecated + token1: z.string(), // deprecated + name0: z.string(), + name1: z.string(), + poolFee: z.number(), + weight: z.number(), +}); const votingResultSchema = z.object({ absoluteVeTokenInVoting: z.number(), @@ -16,8 +22,8 @@ const votingResultSchema = z.object({ userVeTokenInVoting: z.number(), veTokenAddress: z.string(), votingAddress: z.string(), - weeklyReward: z.number() -}) + weeklyReward: z.number(), +}); const votingInfoSchema = z.object({ result: votingResultSchema, diff --git a/src/services/index.ts b/src/services/index.ts index 4228275..7d35c9e 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -2,3 +2,4 @@ export * as aggregator from './Aggregator/index.js'; export * as blockchainService from './BlockchainService/index.js'; export * as priceFeed from './PriceFeed/index.js'; export * as referralSystem from './ReferralSystem/index.js'; +export * as integrator from './Integrator/index.js'; From 20cf407de2d248277b15de6384766aa2691cec85 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Tue, 10 Oct 2023 19:26:28 +0400 Subject: [PATCH 090/225] Minor review fixes --- src/Unit/Exchange/callGenerators/uniswapV3.ts | 4 ++-- src/Unit/Exchange/callGenerators/utils.ts | 6 +----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/Unit/Exchange/callGenerators/uniswapV3.ts b/src/Unit/Exchange/callGenerators/uniswapV3.ts index d600e9d..2ef3f04 100644 --- a/src/Unit/Exchange/callGenerators/uniswapV3.ts +++ b/src/Unit/Exchange/callGenerators/uniswapV3.ts @@ -25,11 +25,11 @@ export async function generateOrion3Call( recipient: string, provider: JsonRpcProvider ) { - if (typeof amount === 'undefined') amount = 0 + if (amount === undefined) amount = 0 const encodedPool = await encodePoolV3(swap.pool, swap.assetIn, swap.assetOut, provider) const executorInterface = SwapExecutor__factory.createInterface() - let calldata = executorInterface.encodeFunctionData('orionV3SingleSwapTo', [encodedPool, recipient, amount]) + const calldata = executorInterface.encodeFunctionData('orionV3SingleSwapTo', [encodedPool, recipient, amount]) return addCallParams(calldata) } diff --git a/src/Unit/Exchange/callGenerators/utils.ts b/src/Unit/Exchange/callGenerators/utils.ts index 15a8172..e49217b 100644 --- a/src/Unit/Exchange/callGenerators/utils.ts +++ b/src/Unit/Exchange/callGenerators/utils.ts @@ -63,25 +63,21 @@ export function addCallParams( export function createPatchMask(calldata: BytesLike, patchParams?: PatchParams) { let firstByte = 0 - let mask = ethers.solidityPacked(["uint256"], [(calldata.length - 4) / 2 - 32]) + let mask = ethers.solidityPacked(["uint256"], [(calldata.length - 4) / 2 - 32]) //finding offset of last 32 bytes slot in calldata mask = ethers.dataSlice(mask, 1) if (patchParams) { if (patchParams.skipOnZeroAmount !== undefined && patchParams.skipOnZeroAmount === false) { firstByte += 32 - console.log(firstByte) } if (patchParams.skipCallDataPatching !== undefined && patchParams.skipCallDataPatching) { firstByte += 64 - console.log(firstByte) } if (patchParams.skipValuePatching !== undefined && patchParams.skipValuePatching) { firstByte += 128 - console.log(firstByte) } } const encodedFirstByte = ethers.solidityPacked(["uint8"], [firstByte]) mask = ethers.hexlify(ethers.concat([encodedFirstByte, mask])) - console.log(mask) return mask } From 1b791462de27d84df255ab88a04e47a008f30b92 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Tue, 10 Oct 2023 19:29:28 +0400 Subject: [PATCH 091/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c7aeeb2..15c7cc0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.6", + "version": "0.20.7-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 94dde6dd96b80d84d9fff256ffcb03e4e5ca8941 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Tue, 10 Oct 2023 19:34:24 +0400 Subject: [PATCH 092/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 15c7cc0..a475243 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.7-rc1", + "version": "0.20.7", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 8bb5c185354b888302bd780d8e2575196175a855 Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Wed, 11 Oct 2023 10:27:42 +0400 Subject: [PATCH 093/225] Added `simple-typed-fetch` install instruction --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3065e7c..05438c5 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ Orion’s SDK is free to use and does not require an API key or registration. Re ## Install ```console +npm i simple-typed-fetch npm i @orionprotocol/sdk ``` From ec81a62d65bcc57e5a1ed3e71f9a394819ea67f0 Mon Sep 17 00:00:00 2001 From: Dmitry <35160421+TheJuze@users.noreply.github.com> Date: Wed, 11 Oct 2023 10:34:55 +0300 Subject: [PATCH 094/225] OP-4534: Integrator pools (#188) --- package-lock.json | 4 ++-- package.json | 2 +- src/services/BlockchainService/index.ts | 15 +++++---------- src/services/Integrator/constants.ts | 2 -- src/services/Integrator/index.ts | 10 +++++----- .../schemas/get-pool-response-schema.ts | 3 +-- 6 files changed, 14 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index cbd9af1..89e3777 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.6", + "version": "0.20.8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.6", + "version": "0.20.8", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index a475243..270178a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.7", + "version": "0.20.8", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/BlockchainService/index.ts b/src/services/BlockchainService/index.ts index e301615..3833cf9 100644 --- a/src/services/BlockchainService/index.ts +++ b/src/services/BlockchainService/index.ts @@ -18,7 +18,7 @@ import { } from './schemas/index.js'; import type redeemOrderSchema from '../Aggregator/schemas/redeemOrderSchema.js'; import { sourceAtomicHistorySchema, targetAtomicHistorySchema } from './schemas/atomicHistorySchema.js'; -import { makePartial } from '../../utils/index.js'; +import { makePartial } from '../../utils'; import type { networkCodes } from '../../constants/index.js'; import { fetchWithValidation } from 'simple-typed-fetch'; import type { BasicAuthCredentials } from '../../types.js'; @@ -61,8 +61,8 @@ type AtomicSwapHistoryTargetQuery = AtomicSwapHistoryBaseQuery & { } type PlatformFees = { - assetIn?: string // TODO: return types from main branch - assetOut?: string + assetIn: string + assetOut: string walletAddress?: string | undefined fromWidget?: string | undefined } @@ -247,13 +247,8 @@ class BlockchainService { ) => { const url = new URL(`${this.apiUrl}/api/platform-fees`); - if (assetIn !== undefined) { // TODO: make same as in main branch - url.searchParams.append('assetIn', assetIn); - } - - if (assetOut !== undefined) { - url.searchParams.append('assetOut', assetOut); - } + url.searchParams.append('assetIn', assetIn); + url.searchParams.append('assetOut', assetOut); if (walletAddress !== undefined) { url.searchParams.append('walletAddress', walletAddress); diff --git a/src/services/Integrator/constants.ts b/src/services/Integrator/constants.ts index 8ec49a1..8c9bfde 100644 --- a/src/services/Integrator/constants.ts +++ b/src/services/Integrator/constants.ts @@ -1,3 +1 @@ -export const AVAILABLE_POOL_FEE = ['0.01', '0.05', '0.3', '1'] as const; -export const INITIAL_VEORN_ADJUSTMENT_FACTOR = 5; export const LOCK_START_TIME = 1690848000;// Aug 01 2023 00:00:00 UTC diff --git a/src/services/Integrator/index.ts b/src/services/Integrator/index.ts index a3e4de8..8154e52 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Integrator/index.ts @@ -6,12 +6,12 @@ import { listPoolResponseSchema, testIncrementorSchema, veORNInfoResponseSchema, - votingInfoResponseSchema, -} from './schemas/index.js'; + votingInfoResponseSchema +} from './schemas'; import { fetchWithValidation } from 'simple-typed-fetch'; import { BigNumber } from 'bignumber.js'; -import { DAY, WEEK_DAYS, YEAR } from '../../constants/index.js'; -import { LOCK_START_TIME } from './constants.js'; +import { DAY, WEEK_DAYS, YEAR } from '../../constants'; +import { LOCK_START_TIME } from './constants'; type BasePayload = { chainId: number @@ -166,7 +166,7 @@ class IntegratorService { readonly getPoolInfo = ( token0: string, token1: string, - poolAddress: string + poolAddress?: string ) => { return fetchWithValidation(this.apiUrl, getPoolResponseSchema, { method: 'POST', diff --git a/src/services/Integrator/schemas/get-pool-response-schema.ts b/src/services/Integrator/schemas/get-pool-response-schema.ts index ee49682..8527e0c 100644 --- a/src/services/Integrator/schemas/get-pool-response-schema.ts +++ b/src/services/Integrator/schemas/get-pool-response-schema.ts @@ -1,6 +1,5 @@ import { z } from 'zod'; import { evmAddressSchema } from './util-schemas.js'; -import { AVAILABLE_POOL_FEE } from '../constants.js'; import basicPoolInfo from './basic-pool-info-schema.js'; import infoSchema from './info-schema.js'; @@ -13,7 +12,7 @@ const getPoolResponseSchema = z.object({ totalLiquidity: z.number().nonnegative(), WETH9: evmAddressSchema, - pools: z.record(z.enum(AVAILABLE_POOL_FEE), basicPoolInfo.nullable()), + pools: z.record(z.number(), basicPoolInfo.nullable()), }), info: infoSchema, }); From c23958ad6eabfd85b9e75419bfcac84b98217744 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Wed, 11 Oct 2023 16:27:57 +0400 Subject: [PATCH 095/225] Fixed ethers contracts version --- package.json | 2 +- src/Unit/Exchange/callGenerators/uniswapV2.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a475243..781e51d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.7", + "version": "0.20.8-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/callGenerators/uniswapV2.ts b/src/Unit/Exchange/callGenerators/uniswapV2.ts index d2f2bdc..6d34820 100644 --- a/src/Unit/Exchange/callGenerators/uniswapV2.ts +++ b/src/Unit/Exchange/callGenerators/uniswapV2.ts @@ -1,4 +1,4 @@ -import { SwapExecutor__factory } from "@orionprotocol/contracts/lib/ethers-v5/index.js" +import { SwapExecutor__factory } from "@orionprotocol/contracts/lib/ethers-v6/index.js" import { SafeArray } from "../../../utils/safeGetters.js" import { type BytesLike, type BigNumberish, concat, ethers, toBeHex } from "ethers" import { addCallParams, generateCalls } from "./utils.js" From 0ad7ce79deeba332432af46f9c03ae7c1080cc05 Mon Sep 17 00:00:00 2001 From: lomonoshka <56521834+lomonoshka@users.noreply.github.com> Date: Wed, 11 Oct 2023 17:24:27 +0400 Subject: [PATCH 096/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 774f793..68cf9ba 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.8-rc2", + "version": "0.20.9", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 1fc201a6261f410163118a8cc91106ac35223fb6 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Wed, 25 Oct 2023 13:48:43 +0300 Subject: [PATCH 097/225] fix: drip rpc --- package-lock.json | 4 ++-- package.json | 2 +- src/config/chains.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 89e3777..b77e8ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.8", + "version": "0.20.10", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.8", + "version": "0.20.10", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 68cf9ba..51a3ce5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.9", + "version": "0.20.10", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/config/chains.json b/src/config/chains.json index 33b7724..0cba1b0 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -161,7 +161,7 @@ "shortName": "DRIP Chain", "code": "drip", "baseCurrencyName": "DRIP", - "rpc": "testnet.1d.rip", + "rpc": "https://testnet.1d.rip/", "explorer": "https://explorer-testnet.1d.rip/", "contracts": { "WETH": "", From 92d7e2028ea6a2dc19756e2b695bbb1160ce1473 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Fri, 27 Oct 2023 15:41:22 +0400 Subject: [PATCH 098/225] export generateCalldata function without unit param --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 57 ++++++++++++++++++++--- src/Unit/Exchange/index.ts | 4 +- src/index.ts | 1 + src/utils/addressLikeToString.ts | 9 ++++ 5 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 src/utils/addressLikeToString.ts diff --git a/package.json b/package.json index 51a3ce5..67bd4d9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.10", + "version": "0.20.10-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index da40ee6..c28c02f 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -12,10 +12,12 @@ import { exchangeToNativeDecimals, generateCalls, pathCallWithBalance } from './ import { generateApproveCall, generateTransferCall } from './callGenerators/erc20.js'; import { generateCurveStableSwapCall } from './callGenerators/curve.js'; import type { SingleSwap } from '../../types.js'; +import type { AddressLike } from 'ethers'; +import { addressLikeToString } from '../../utils/addressLikeToString.js'; export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3" -export type GenerateSwapCalldataParams = { +export type GenerateSwapCalldataWithUnitParams = { amount: BigNumberish minReturnAmount: BigNumberish receiverAddress: string @@ -23,13 +25,25 @@ export type GenerateSwapCalldataParams = { unit: Unit } -export default async function generateSwapCalldata({ +export type GenerateSwapCalldataParams = { + amount: BigNumberish + minReturnAmount: BigNumberish + receiverAddress: string + path: ArrayLike + wethAddress: AddressLike, + curveRegistryAddress: AddressLike, + swapExecutorContractAddress: AddressLike, + exchangeContractAddress: AddressLike, + provider: JsonRpcProvider +} + +export async function generateSwapCalldataWithUnit({ amount, minReturnAmount, receiverAddress, path: arrayLikePath, unit -}: GenerateSwapCalldataParams +}: GenerateSwapCalldataWithUnitParams ): Promise<{ calldata: string, swapDescription: LibValidator.SwapDescriptionStruct }> { if (arrayLikePath == undefined || arrayLikePath.length == 0) { throw new Error('Empty path'); @@ -43,6 +57,36 @@ export default async function generateSwapCalldata({ return swapInfo; }) + return generateSwapCalldata({ + amount, + minReturnAmount, + receiverAddress, + path, + wethAddress, + curveRegistryAddress, + swapExecutorContractAddress, + exchangeContractAddress, + provider: unit.provider + }) +} + +export async function generateSwapCalldata({ + amount, + minReturnAmount, + receiverAddress, + path: arrayLikePath, + wethAddress: wethAddressLike, + curveRegistryAddress: curveRegistryAddressLike, + swapExecutorContractAddress: swapExecutorContractAddressLike, + exchangeContractAddress: exchangeContractAddressLike, + provider, +}: GenerateSwapCalldataParams) { + const wethAddress = await addressLikeToString(wethAddressLike) + const curveRegistryAddress = await addressLikeToString(curveRegistryAddressLike) + const swapExecutorContractAddress = await addressLikeToString(swapExecutorContractAddressLike) + const exchangeContractAddress = await addressLikeToString(exchangeContractAddressLike) + let path = SafeArray.from(arrayLikePath) + const { factory, assetIn: srcToken } = path.first() const dstToken = path.last().assetOut @@ -55,13 +99,14 @@ export default async function generateSwapCalldata({ minReturnAmount, flags: 0 } - const amountNativeDecimals = await exchangeToNativeDecimals(srcToken, amount, unit.provider); + const amountNativeDecimals = await exchangeToNativeDecimals(srcToken, amount, provider); path = SafeArray.from(arrayLikePath).map((singleSwap) => { if (singleSwap.assetIn == ethers.ZeroAddress) singleSwap.assetIn = wethAddress if (singleSwap.assetOut == ethers.ZeroAddress) singleSwap.assetOut = wethAddress return singleSwap; }); + const isSingleFactorySwap = path.every(singleSwap => singleSwap.factory === factory) let calldata: BytesLike if (isSingleFactorySwap) { @@ -73,7 +118,7 @@ export default async function generateSwapCalldata({ amountNativeDecimals, swapExecutorContractAddress, curveRegistryAddress, - unit.provider + provider )) } else { ({ swapDescription, calldata } = await processMultiFactorySwaps( @@ -83,7 +128,7 @@ export default async function generateSwapCalldata({ amountNativeDecimals, swapExecutorContractAddress, curveRegistryAddress, - unit.provider + provider )) } diff --git a/src/Unit/Exchange/index.ts b/src/Unit/Exchange/index.ts index f6b75a3..c25b7b9 100644 --- a/src/Unit/Exchange/index.ts +++ b/src/Unit/Exchange/index.ts @@ -1,7 +1,7 @@ import type Unit from '../index.js'; import deposit, { type DepositParams } from './deposit.js'; import getSwapInfo, { type GetSwapInfoParams } from './getSwapInfo.js'; -import generateSwapCalldata, { type GenerateSwapCalldataParams } from './generateSwapCalldata.js'; +import {generateSwapCalldataWithUnit, type GenerateSwapCalldataParams } from './generateSwapCalldata.js'; import withdraw, { type WithdrawParams } from './withdraw.js'; type PureDepositParams = Omit @@ -39,7 +39,7 @@ export default class Exchange { } public generateSwapCalldata(params: PureGenerateSwapCalldataParams) { - return generateSwapCalldata({ + return generateSwapCalldataWithUnit({ ...params, unit: this.unit }) diff --git a/src/index.ts b/src/index.ts index a23d913..7b72aa7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,7 @@ BigNumber.config({ EXPONENTIAL_AT: 1e+9 }); export * as config from './config/index.js'; export { default as Unit } from './Unit/index.js'; export { default as Orion } from './Orion/index.js'; +export {generateSwapCalldata} from './Unit/Exchange/generateSwapCalldata.js'; export { default as factories} from './constants/factories.js'; export * as utils from './utils/index.js'; export * as services from './services/index.js'; diff --git a/src/utils/addressLikeToString.ts b/src/utils/addressLikeToString.ts new file mode 100644 index 0000000..974c505 --- /dev/null +++ b/src/utils/addressLikeToString.ts @@ -0,0 +1,9 @@ +import type { AddressLike } from "ethers"; + +export async function addressLikeToString(address: AddressLike): Promise { + address = await address + if (typeof address !== 'string') { + address = await address.getAddress() + } + return address +} \ No newline at end of file From b3ed38890cb8b78214f18ca7887ae22494295da8 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Fri, 27 Oct 2023 15:48:19 +0400 Subject: [PATCH 099/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 67bd4d9..8da21a6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.10-rc0", + "version": "0.20.10-rc101", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From cdc3a78eb91a5f6d2d2b7ad547f84c59a3714754 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Mon, 30 Oct 2023 19:54:47 +0400 Subject: [PATCH 100/225] Change final transfer location. Add wrap/unwrap functionality --- package-lock.json | 18 +- package.json | 4 +- src/Unit/Exchange/callGenerators/curve.ts | 52 ++-- src/Unit/Exchange/callGenerators/uniswapV2.ts | 4 +- src/Unit/Exchange/callGenerators/uniswapV3.ts | 8 +- src/Unit/Exchange/callGenerators/weth.ts | 32 ++ src/Unit/Exchange/generateSwapCalldata.ts | 273 +++++++++--------- 7 files changed, 213 insertions(+), 178 deletions(-) create mode 100644 src/Unit/Exchange/callGenerators/weth.ts diff --git a/package-lock.json b/package-lock.json index b77e8ec..9e5ad1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.10", + "version": "0.20.10-rc101", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.10", + "version": "0.20.10-rc101", "hasInstallScript": true, "license": "ISC", "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.19.5", + "@orionprotocol/contracts": "1.22.1", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", "buffer": "^6.0.3", @@ -2419,9 +2419,9 @@ } }, "node_modules/@orionprotocol/contracts": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.19.5.tgz", - "integrity": "sha512-z8oWz+BswG+kN2dZCgjmQJwNc52S3aAnchZX0JRMe8+l/4WHIYDJQ3W9pEClzvg/86LO41DAHmS73rHNrGAARw==" + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.1.tgz", + "integrity": "sha512-DrIyAmZ+LK3Eflv/gk6Uq3shpTLjeG4wV6PoKVxJKoqk05qL35cJs5V/2it16s5NolcQliFrtJ54G3xI78gTwA==" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -13460,9 +13460,9 @@ } }, "@orionprotocol/contracts": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.19.5.tgz", - "integrity": "sha512-z8oWz+BswG+kN2dZCgjmQJwNc52S3aAnchZX0JRMe8+l/4WHIYDJQ3W9pEClzvg/86LO41DAHmS73rHNrGAARw==" + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.1.tgz", + "integrity": "sha512-DrIyAmZ+LK3Eflv/gk6Uq3shpTLjeG4wV6PoKVxJKoqk05qL35cJs5V/2it16s5NolcQliFrtJ54G3xI78gTwA==" }, "@sinclair/typebox": { "version": "0.27.8", diff --git a/package.json b/package.json index 8da21a6..18ea5e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.10-rc101", + "version": "0.20.10-rc102", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -88,7 +88,7 @@ "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.19.5", + "@orionprotocol/contracts": "1.22.1", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", "buffer": "^6.0.3", diff --git a/src/Unit/Exchange/callGenerators/curve.ts b/src/Unit/Exchange/callGenerators/curve.ts index 7fc54d3..eb9d29e 100644 --- a/src/Unit/Exchange/callGenerators/curve.ts +++ b/src/Unit/Exchange/callGenerators/curve.ts @@ -1,28 +1,44 @@ -import { SwapExecutor__factory, CurveRegistry__factory } from "@orionprotocol/contracts/lib/ethers-v6/index.js" -import type { BigNumberish, JsonRpcProvider } from "ethers" -import { addCallParams } from "./utils.js" -import type { SingleSwap } from "../../../types.js" +import { + SwapExecutor__factory, + CurveRegistry__factory, + ERC20__factory, +} from "@orionprotocol/contracts/lib/ethers-v6/index.js"; +import { MaxUint256, type BigNumberish, type JsonRpcProvider } from "ethers"; +import { addCallParams } from "./utils.js"; +import type { SingleSwap } from "../../../types.js"; +import { generateApproveCall } from "./erc20.js"; +import type { BytesLike } from "ethers"; export async function generateCurveStableSwapCall( amount: BigNumberish, to: string, swap: SingleSwap, provider: JsonRpcProvider, + swapExecutorContractAddress: string, curveRegistry: string ) { - const executorInterface = SwapExecutor__factory.createInterface() - const registry = CurveRegistry__factory.connect(curveRegistry, provider) - const { pool, assetIn, assetOut } = swap - const [i, j,] = await registry.get_coin_indices(pool, assetIn, assetOut) + const executorInterface = SwapExecutor__factory.createInterface(); + const registry = CurveRegistry__factory.connect(curveRegistry, provider); + const { pool, assetIn, assetOut } = swap; + const firstToken = ERC20__factory.connect(assetIn, provider) + const executorAllowance = await firstToken.allowance(swapExecutorContractAddress, pool) - let calldata = executorInterface.encodeFunctionData('curveSwapStableAmountIn', [ - pool, - assetOut, - i, - j, - to, - amount, - ]) + const calls: BytesLike[] = [] + if (executorAllowance <= BigInt(amount)) { + const approveCall = await generateApproveCall( + assetIn, + pool, + MaxUint256 + ); + calls.push(approveCall); + } - return addCallParams(calldata) -} \ No newline at end of file + const [i, j] = await registry.get_coin_indices(pool, assetIn, assetOut); + let calldata = executorInterface.encodeFunctionData( + "curveSwapStableAmountIn", + [pool, assetOut, i, j, to, amount] + ); + calls.push(addCallParams(calldata)) + + return calls +} diff --git a/src/Unit/Exchange/callGenerators/uniswapV2.ts b/src/Unit/Exchange/callGenerators/uniswapV2.ts index 6d34820..19b86b0 100644 --- a/src/Unit/Exchange/callGenerators/uniswapV2.ts +++ b/src/Unit/Exchange/callGenerators/uniswapV2.ts @@ -1,7 +1,7 @@ import { SwapExecutor__factory } from "@orionprotocol/contracts/lib/ethers-v6/index.js" import { SafeArray } from "../../../utils/safeGetters.js" import { type BytesLike, type BigNumberish, concat, ethers, toBeHex } from "ethers" -import { addCallParams, generateCalls } from "./utils.js" +import { addCallParams } from "./utils.js" import type { SingleSwap } from "../../../types.js" export async function generateUni2Calls( @@ -33,7 +33,7 @@ export async function generateUni2Calls( ]) calls.push(addCallParams(calldata)) - return generateCalls(calls) + return calls } export async function generateUni2Call( diff --git a/src/Unit/Exchange/callGenerators/uniswapV3.ts b/src/Unit/Exchange/callGenerators/uniswapV3.ts index 2ef3f04..67bfcec 100644 --- a/src/Unit/Exchange/callGenerators/uniswapV3.ts +++ b/src/Unit/Exchange/callGenerators/uniswapV3.ts @@ -1,7 +1,7 @@ import { SwapExecutor__factory, UniswapV3Pool__factory } from "@orionprotocol/contracts/lib/ethers-v6/index.js" -import { type BigNumberish , type BytesLike, ethers, JsonRpcProvider } from "ethers" +import { type BigNumberish , ethers, JsonRpcProvider } from "ethers" import { SafeArray } from "../../../utils/safeGetters.js" -import { addCallParams, generateCalls } from "./utils.js" +import { addCallParams } from "./utils.js" import type { SingleSwap } from "../../../types.js" export async function generateUni3Call( @@ -49,7 +49,7 @@ export async function generateUni3Calls( let calldata = executorInterface.encodeFunctionData('uniswapV3SwapTo', [encodedPools, recipient, amount]) calldata = addCallParams(calldata) - return generateCalls([calldata]) + return [calldata] } export async function generateOrion3Calls( @@ -67,7 +67,7 @@ export async function generateOrion3Calls( let calldata = executorInterface.encodeFunctionData('orionV3SwapTo', [encodedPools, recipient, amount]) calldata = addCallParams(calldata) - return generateCalls([calldata]) + return [calldata] } export async function encodePoolV3( diff --git a/src/Unit/Exchange/callGenerators/weth.ts b/src/Unit/Exchange/callGenerators/weth.ts new file mode 100644 index 0000000..7aaf566 --- /dev/null +++ b/src/Unit/Exchange/callGenerators/weth.ts @@ -0,0 +1,32 @@ +import { SwapExecutor__factory } from "@orionprotocol/contracts/lib/ethers-v6/index.js" +import type { BigNumberish } from "ethers" +import { type CallParams, addCallParams } from "./utils.js" +import type { AddressLike } from "ethers" + +export function generateWrapAndTransferCall( + target: AddressLike, + callParams?: CallParams +) { + + const executorInterface = SwapExecutor__factory.createInterface() + const calldata = executorInterface.encodeFunctionData('wrapAndTransfer', [ + target, + ]) + + return addCallParams(calldata, callParams) +} + +export function generateUnwrapAndTransferCall( + target: AddressLike, + amount: BigNumberish, + callParams?: CallParams +) { + + const executorInterface = SwapExecutor__factory.createInterface() + const calldata = executorInterface.encodeFunctionData('unwrapAndTransfer', [ + target, + amount + ]) + + return addCallParams(calldata, callParams) +} \ No newline at end of file diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index c28c02f..cef0f02 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -1,61 +1,65 @@ -import type { LibValidator } from '@orionprotocol/contracts/lib/ethers-v6/Exchange.js'; +import type { LibValidator } from "@orionprotocol/contracts/lib/ethers-v6/Exchange.js"; +import { ethers, type BigNumberish, type BytesLike, JsonRpcProvider, ZeroAddress } from "ethers"; +import { safeGet, SafeArray } from "../../utils/safeGetters.js"; +import { simpleFetch } from "simple-typed-fetch"; +import type Unit from "../index.js"; +import { generateUni2Calls, generateUni2Call } from "./callGenerators/uniswapV2.js"; import { - ERC20__factory -} from '@orionprotocol/contracts/lib/ethers-v6/index.js'; -import { ethers, type BigNumberish, type BytesLike, JsonRpcProvider } from 'ethers'; -import { safeGet, SafeArray } from '../../utils/safeGetters.js'; -import { simpleFetch } from 'simple-typed-fetch'; -import type Unit from '../index.js'; -import { generateUni2Calls, generateUni2Call } from './callGenerators/uniswapV2.js'; -import { generateUni3Calls, generateOrion3Calls, generateUni3Call, generateOrion3Call } from './callGenerators/uniswapV3.js'; -import { exchangeToNativeDecimals, generateCalls, pathCallWithBalance } from './callGenerators/utils.js'; -import { generateApproveCall, generateTransferCall } from './callGenerators/erc20.js'; -import { generateCurveStableSwapCall } from './callGenerators/curve.js'; -import type { SingleSwap } from '../../types.js'; -import type { AddressLike } from 'ethers'; -import { addressLikeToString } from '../../utils/addressLikeToString.js'; + generateUni3Calls, + generateOrion3Calls, + generateUni3Call, + generateOrion3Call, +} from "./callGenerators/uniswapV3.js"; +import { exchangeToNativeDecimals, generateCalls, pathCallWithBalance } from "./callGenerators/utils.js"; +import { generateTransferCall } from "./callGenerators/erc20.js"; +import { generateCurveStableSwapCall } from "./callGenerators/curve.js"; +import type { SingleSwap } from "../../types.js"; +import type { AddressLike } from "ethers"; +import { addressLikeToString } from "../../utils/addressLikeToString.js"; +import { generateUnwrapAndTransferCall, generateWrapAndTransferCall } from "./callGenerators/weth.js"; -export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3" +export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3"; export type GenerateSwapCalldataWithUnitParams = { - amount: BigNumberish - minReturnAmount: BigNumberish - receiverAddress: string - path: ArrayLike - unit: Unit -} + amount: BigNumberish; + minReturnAmount: BigNumberish; + receiverAddress: string; + path: ArrayLike; + unit: Unit; +}; export type GenerateSwapCalldataParams = { - amount: BigNumberish - minReturnAmount: BigNumberish - receiverAddress: string - path: ArrayLike - wethAddress: AddressLike, - curveRegistryAddress: AddressLike, - swapExecutorContractAddress: AddressLike, - exchangeContractAddress: AddressLike, - provider: JsonRpcProvider -} + amount: BigNumberish; + minReturnAmount: BigNumberish; + receiverAddress: string; + path: ArrayLike; + wethAddress: AddressLike; + curveRegistryAddress: AddressLike; + swapExecutorContractAddress: AddressLike; + provider: JsonRpcProvider; +}; export async function generateSwapCalldataWithUnit({ amount, minReturnAmount, receiverAddress, path: arrayLikePath, - unit -}: GenerateSwapCalldataWithUnitParams -): Promise<{ calldata: string, swapDescription: LibValidator.SwapDescriptionStruct }> { + unit, +}: GenerateSwapCalldataWithUnitParams): Promise<{ + calldata: string; + swapDescription: LibValidator.SwapDescriptionStruct; +}> { if (arrayLikePath == undefined || arrayLikePath.length == 0) { - throw new Error('Empty path'); + throw new Error("Empty path"); } - const wethAddress = safeGet(unit.contracts, 'WETH') - const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry') - const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); + const wethAddress = safeGet(unit.contracts, "WETH"); + const curveRegistryAddress = safeGet(unit.contracts, "curveRegistry"); + const { assetToAddress, swapExecutorContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); let path = SafeArray.from(arrayLikePath).map((swapInfo) => { swapInfo.assetIn = assetToAddress[swapInfo.assetIn] ?? swapInfo.assetIn.toLowerCase(); swapInfo.assetOut = assetToAddress[swapInfo.assetOut] ?? swapInfo.assetOut.toLowerCase(); return swapInfo; - }) + }); return generateSwapCalldata({ amount, @@ -65,9 +69,8 @@ export async function generateSwapCalldataWithUnit({ wethAddress, curveRegistryAddress, swapExecutorContractAddress, - exchangeContractAddress, - provider: unit.provider - }) + provider: unit.provider, + }); } export async function generateSwapCalldata({ @@ -78,198 +81,182 @@ export async function generateSwapCalldata({ wethAddress: wethAddressLike, curveRegistryAddress: curveRegistryAddressLike, swapExecutorContractAddress: swapExecutorContractAddressLike, - exchangeContractAddress: exchangeContractAddressLike, provider, }: GenerateSwapCalldataParams) { - const wethAddress = await addressLikeToString(wethAddressLike) - const curveRegistryAddress = await addressLikeToString(curveRegistryAddressLike) - const swapExecutorContractAddress = await addressLikeToString(swapExecutorContractAddressLike) - const exchangeContractAddress = await addressLikeToString(exchangeContractAddressLike) - let path = SafeArray.from(arrayLikePath) + const wethAddress = await addressLikeToString(wethAddressLike); + const curveRegistryAddress = await addressLikeToString(curveRegistryAddressLike); + const swapExecutorContractAddress = await addressLikeToString(swapExecutorContractAddressLike); + let path = SafeArray.from(arrayLikePath); - const { factory, assetIn: srcToken } = path.first() - const dstToken = path.last().assetOut + const { factory, assetIn: srcToken } = path.first(); + const dstToken = path.last().assetOut; + const amountNativeDecimals = await exchangeToNativeDecimals(srcToken, amount, provider); + const minReturnAmountNativeDecimals = await exchangeToNativeDecimals(dstToken, minReturnAmount, provider); let swapDescription: LibValidator.SwapDescriptionStruct = { srcToken: srcToken, dstToken: dstToken, srcReceiver: swapExecutorContractAddress, dstReceiver: receiverAddress, - amount, - minReturnAmount, - flags: 0 - } - const amountNativeDecimals = await exchangeToNativeDecimals(srcToken, amount, provider); + amount: amountNativeDecimals, + minReturnAmount: minReturnAmountNativeDecimals, + flags: 0, + }; path = SafeArray.from(arrayLikePath).map((singleSwap) => { - if (singleSwap.assetIn == ethers.ZeroAddress) singleSwap.assetIn = wethAddress - if (singleSwap.assetOut == ethers.ZeroAddress) singleSwap.assetOut = wethAddress + if (singleSwap.assetIn == ethers.ZeroAddress) singleSwap.assetIn = wethAddress; + if (singleSwap.assetOut == ethers.ZeroAddress) singleSwap.assetOut = wethAddress; return singleSwap; }); - - const isSingleFactorySwap = path.every(singleSwap => singleSwap.factory === factory) - let calldata: BytesLike + + const isSingleFactorySwap = path.every((singleSwap) => singleSwap.factory === factory); + let calls: BytesLike[]; if (isSingleFactorySwap) { - ({ swapDescription, calldata } = await processSingleFactorySwaps( + ({ swapDescription, calls } = await processSingleFactorySwaps( factory, swapDescription, path, - exchangeContractAddress, amountNativeDecimals, swapExecutorContractAddress, curveRegistryAddress, provider - )) + )); } else { - ({ swapDescription, calldata } = await processMultiFactorySwaps( + ({ swapDescription, calls } = await processMultiFactorySwaps( swapDescription, path, - exchangeContractAddress, amountNativeDecimals, swapExecutorContractAddress, curveRegistryAddress, provider - )) + )); } - return { swapDescription, calldata } + calls = wrapOrUnwrapIfNeeded(swapDescription, calls); + const calldata = generateCalls(calls); + return { swapDescription, calldata }; } async function processSingleFactorySwaps( factory: Factory, swapDescription: LibValidator.SwapDescriptionStruct, path: SafeArray, - recipient: string, amount: BigNumberish, swapExecutorContractAddress: string, curveRegistryAddress: string, provider: JsonRpcProvider ) { - let calldata: BytesLike + let calls: BytesLike[] = []; switch (factory) { - case 'OrionV2': { - swapDescription.srcReceiver = path.first().pool - calldata = await generateUni2Calls(path, recipient); + case "OrionV2": { + swapDescription.srcReceiver = path.first().pool; + calls = await generateUni2Calls(path, swapExecutorContractAddress); break; } - case 'UniswapV2': { - swapDescription.srcReceiver = path.first().pool - calldata = await generateUni2Calls(path, recipient); + case "UniswapV2": { + swapDescription.srcReceiver = path.first().pool; + calls = await generateUni2Calls(path, swapExecutorContractAddress); break; } - case 'UniswapV3': { - calldata = await generateUni3Calls(path, amount, recipient, provider) + case "UniswapV3": { + calls = await generateUni3Calls(path, amount, swapExecutorContractAddress, provider); break; } - case 'OrionV3': { - calldata = await generateOrion3Calls(path, amount, recipient, provider) + case "OrionV3": { + calls = await generateOrion3Calls(path, amount, swapExecutorContractAddress, provider); break; } - case 'Curve': { + case "Curve": { if (path.length > 1) { - throw new Error('Supporting only single stable swap on curve') + throw new Error("Supporting only single stable swap on curve"); } - const { pool, assetIn } = path.first() - const firstToken = ERC20__factory.connect(assetIn, provider) - const executorAllowance = await firstToken.allowance(swapExecutorContractAddress, pool) - const calls: BytesLike[] = [] - if (executorAllowance <= BigInt(amount)) { - const approveCall = await generateApproveCall( - assetIn, - pool, - ethers.MaxUint256 - ) - calls.push(approveCall) - } - let curveCall = await generateCurveStableSwapCall( + calls = await generateCurveStableSwapCall( amount, - recipient, + swapExecutorContractAddress, path.first(), provider, + swapExecutorContractAddress, curveRegistryAddress ); - calls.push(curveCall) - calldata = await generateCalls(calls) break; } default: { - throw new Error(`Factory ${factory} is not supported`) + throw new Error(`Factory ${factory} is not supported`); } } - return { swapDescription, calldata } + return { swapDescription, calls }; } async function processMultiFactorySwaps( swapDescription: LibValidator.SwapDescriptionStruct, path: SafeArray, - recipient: string, amount: BigNumberish, swapExecutorContractAddress: string, curveRegistryAddress: string, provider: JsonRpcProvider ) { - let calls: BytesLike[] = [] + let calls: BytesLike[] = []; + if (swapDescription.srcToken === ZeroAddress) { + const wrapCall = await generateWrapAndTransferCall(swapExecutorContractAddress, { value: amount }); + calls.push(wrapCall); + } for (const swap of path) { switch (swap.factory) { - case 'OrionV2': { - let transferCall = await generateTransferCall(swap.assetIn, swap.pool, 0) - transferCall = pathCallWithBalance(transferCall, swap.assetIn) - const uni2Call = await generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress) - calls = calls.concat([transferCall, uni2Call]) + case "OrionV2": { + let transferCall = await generateTransferCall(swap.assetIn, swap.pool, 0); + transferCall = pathCallWithBalance(transferCall, swap.assetIn); + const uni2Call = await generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress); + calls.push(transferCall, uni2Call); break; } - case 'UniswapV2': { - let transferCall = await generateTransferCall(swap.assetIn, swap.pool, 0) - transferCall = pathCallWithBalance(transferCall, swap.assetIn) - const uni2Call = await generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress) - calls = calls.concat([transferCall, uni2Call]) + case "UniswapV2": { + let transferCall = await generateTransferCall(swap.assetIn, swap.pool, 0); + transferCall = pathCallWithBalance(transferCall, swap.assetIn); + const uni2Call = await generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress); + calls.push(transferCall, uni2Call); break; } - case 'UniswapV3': { - let uni3Call = await generateUni3Call(swap, 0, swapExecutorContractAddress, provider) - uni3Call = pathCallWithBalance(uni3Call, swap.assetIn) - calls.push(uni3Call) + case "UniswapV3": { + let uni3Call = await generateUni3Call(swap, 0, swapExecutorContractAddress, provider); + uni3Call = pathCallWithBalance(uni3Call, swap.assetIn); + calls.push(uni3Call); break; } - case 'OrionV3': { - let orion3Call = await generateOrion3Call(swap, 0, swapExecutorContractAddress, provider) - orion3Call = pathCallWithBalance(orion3Call, swap.assetIn) - calls.push(orion3Call) + case "OrionV3": { + let orion3Call = await generateOrion3Call(swap, 0, swapExecutorContractAddress, provider); + orion3Call = pathCallWithBalance(orion3Call, swap.assetIn); + calls.push(orion3Call); break; } - case 'Curve': { - const { pool, assetIn } = swap - const firstToken = ERC20__factory.connect(assetIn, provider) - const executorAllowance = await firstToken.allowance(swapExecutorContractAddress, pool) - if (executorAllowance <= BigInt(amount)) { - const approveCall = await generateApproveCall( - assetIn, - pool, - ethers.MaxUint256 - ) - calls.push(approveCall) - } - let curveCall = await generateCurveStableSwapCall( + case "Curve": { + let curveCalls = await generateCurveStableSwapCall( amount, swapExecutorContractAddress, swap, provider, + swapExecutorContractAddress, curveRegistryAddress ); - curveCall = pathCallWithBalance(curveCall, swap.assetIn) - calls.push(curveCall) + calls.push(...curveCalls); break; } default: { - throw new Error(`Factory ${swap.factory} is not supported`) + throw new Error(`Factory ${swap.factory} is not supported`); } } } - const dstToken = swapDescription.dstToken - let finalTransferCall = await generateTransferCall(dstToken, recipient, 0) - finalTransferCall = pathCallWithBalance(finalTransferCall, dstToken) - calls.push(finalTransferCall) - const calldata = generateCalls(calls) - - return { swapDescription, calldata } + return { swapDescription, calls }; +} + +function wrapOrUnwrapIfNeeded(swapDescription: LibValidator.SwapDescriptionStruct, calls: BytesLike[]): BytesLike[] { + if (swapDescription.srcToken === ZeroAddress) { + const wrapCall = generateWrapAndTransferCall(swapDescription.dstReceiver, { value: swapDescription.amount }); + calls = ([wrapCall] as BytesLike[]).concat(calls); + } + if (swapDescription.dstToken === ZeroAddress) { + let unwrapCall = generateUnwrapAndTransferCall(swapDescription.dstReceiver, 0); + unwrapCall = pathCallWithBalance(unwrapCall, swapDescription.dstToken); + calls.push(unwrapCall); + } + return calls; } From 31efda9969721403558d6a1a4b9497568ecddb8a Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Mon, 30 Oct 2023 20:07:06 +0400 Subject: [PATCH 101/225] Return exchange precision in swapDescription --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 18ea5e3..ea50977 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.10-rc102", + "version": "0.20.10-rc103", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index cef0f02..2a90444 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -91,18 +91,17 @@ export async function generateSwapCalldata({ const { factory, assetIn: srcToken } = path.first(); const dstToken = path.last().assetOut; - const amountNativeDecimals = await exchangeToNativeDecimals(srcToken, amount, provider); - const minReturnAmountNativeDecimals = await exchangeToNativeDecimals(dstToken, minReturnAmount, provider); let swapDescription: LibValidator.SwapDescriptionStruct = { srcToken: srcToken, dstToken: dstToken, srcReceiver: swapExecutorContractAddress, dstReceiver: receiverAddress, - amount: amountNativeDecimals, - minReturnAmount: minReturnAmountNativeDecimals, + amount, + minReturnAmount, flags: 0, }; - + const amountNativeDecimals = await exchangeToNativeDecimals(srcToken, amount, provider); + path = SafeArray.from(arrayLikePath).map((singleSwap) => { if (singleSwap.assetIn == ethers.ZeroAddress) singleSwap.assetIn = wethAddress; if (singleSwap.assetOut == ethers.ZeroAddress) singleSwap.assetOut = wethAddress; @@ -132,7 +131,7 @@ export async function generateSwapCalldata({ )); } - calls = wrapOrUnwrapIfNeeded(swapDescription, calls); + calls = wrapOrUnwrapIfNeeded(amountNativeDecimals, swapDescription, calls); const calldata = generateCalls(calls); return { swapDescription, calldata }; } @@ -248,7 +247,7 @@ async function processMultiFactorySwaps( return { swapDescription, calls }; } -function wrapOrUnwrapIfNeeded(swapDescription: LibValidator.SwapDescriptionStruct, calls: BytesLike[]): BytesLike[] { +function wrapOrUnwrapIfNeeded(amount: BigNumberish, swapDescription: LibValidator.SwapDescriptionStruct, calls: BytesLike[]): BytesLike[] { if (swapDescription.srcToken === ZeroAddress) { const wrapCall = generateWrapAndTransferCall(swapDescription.dstReceiver, { value: swapDescription.amount }); calls = ([wrapCall] as BytesLike[]).concat(calls); From 43e0fa0abef7443372255bafca694a8b786cf5cf Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Mon, 30 Oct 2023 20:10:50 +0400 Subject: [PATCH 102/225] fix build --- src/Unit/Exchange/generateSwapCalldata.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 2a90444..449c5b0 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -249,7 +249,7 @@ async function processMultiFactorySwaps( function wrapOrUnwrapIfNeeded(amount: BigNumberish, swapDescription: LibValidator.SwapDescriptionStruct, calls: BytesLike[]): BytesLike[] { if (swapDescription.srcToken === ZeroAddress) { - const wrapCall = generateWrapAndTransferCall(swapDescription.dstReceiver, { value: swapDescription.amount }); + const wrapCall = generateWrapAndTransferCall(swapDescription.dstReceiver, { value: amount }); calls = ([wrapCall] as BytesLike[]).concat(calls); } if (swapDescription.dstToken === ZeroAddress) { From 4d9f09bc211e6b4a51e537fe7913782646ceda4d Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Mon, 30 Oct 2023 20:24:58 +0400 Subject: [PATCH 103/225] Add final transfer from executor in any case --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index ea50977..122bdbe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.10-rc103", + "version": "0.20.10-rc104", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 449c5b0..bfdf259 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -131,7 +131,7 @@ export async function generateSwapCalldata({ )); } - calls = wrapOrUnwrapIfNeeded(amountNativeDecimals, swapDescription, calls); + calls = await wrapOrUnwrapIfNeeded(amountNativeDecimals, swapDescription, calls); const calldata = generateCalls(calls); return { swapDescription, calldata }; } @@ -247,7 +247,7 @@ async function processMultiFactorySwaps( return { swapDescription, calls }; } -function wrapOrUnwrapIfNeeded(amount: BigNumberish, swapDescription: LibValidator.SwapDescriptionStruct, calls: BytesLike[]): BytesLike[] { +async function wrapOrUnwrapIfNeeded(amount: BigNumberish, swapDescription: LibValidator.SwapDescriptionStruct, calls: BytesLike[]): Promise { if (swapDescription.srcToken === ZeroAddress) { const wrapCall = generateWrapAndTransferCall(swapDescription.dstReceiver, { value: amount }); calls = ([wrapCall] as BytesLike[]).concat(calls); @@ -256,6 +256,10 @@ function wrapOrUnwrapIfNeeded(amount: BigNumberish, swapDescription: LibValidato let unwrapCall = generateUnwrapAndTransferCall(swapDescription.dstReceiver, 0); unwrapCall = pathCallWithBalance(unwrapCall, swapDescription.dstToken); calls.push(unwrapCall); + } else { + let transferCall = await generateTransferCall(swapDescription.dstToken, swapDescription.dstReceiver, 0); + transferCall = pathCallWithBalance(transferCall, swapDescription.dstToken); + calls.push(transferCall); } return calls; } From 83f4a54ef8c65ac0103762daf4b6a64efc5b7e15 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Mon, 30 Oct 2023 20:43:39 +0400 Subject: [PATCH 104/225] Fix single factory srcReceiver bug --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 122bdbe..9c10b83 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.10-rc104", + "version": "0.20.10-rc105", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index bfdf259..d38df4e 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -101,7 +101,7 @@ export async function generateSwapCalldata({ flags: 0, }; const amountNativeDecimals = await exchangeToNativeDecimals(srcToken, amount, provider); - + path = SafeArray.from(arrayLikePath).map((singleSwap) => { if (singleSwap.assetIn == ethers.ZeroAddress) singleSwap.assetIn = wethAddress; if (singleSwap.assetOut == ethers.ZeroAddress) singleSwap.assetOut = wethAddress; @@ -131,7 +131,7 @@ export async function generateSwapCalldata({ )); } - calls = await wrapOrUnwrapIfNeeded(amountNativeDecimals, swapDescription, calls); + ({ swapDescription, calls } = await wrapOrUnwrapIfNeeded(amountNativeDecimals, swapDescription, calls, swapExecutorContractAddress)); const calldata = generateCalls(calls); return { swapDescription, calldata }; } @@ -247,9 +247,15 @@ async function processMultiFactorySwaps( return { swapDescription, calls }; } -async function wrapOrUnwrapIfNeeded(amount: BigNumberish, swapDescription: LibValidator.SwapDescriptionStruct, calls: BytesLike[]): Promise { +async function wrapOrUnwrapIfNeeded( + amount: BigNumberish, + swapDescription: LibValidator.SwapDescriptionStruct, + calls: BytesLike[], + swapExecutorContractAddress: string +) { if (swapDescription.srcToken === ZeroAddress) { - const wrapCall = generateWrapAndTransferCall(swapDescription.dstReceiver, { value: amount }); + const wrapCall = generateWrapAndTransferCall(swapDescription.srcReceiver, { value: amount }); + swapDescription.srcReceiver = swapExecutorContractAddress calls = ([wrapCall] as BytesLike[]).concat(calls); } if (swapDescription.dstToken === ZeroAddress) { @@ -261,5 +267,5 @@ async function wrapOrUnwrapIfNeeded(amount: BigNumberish, swapDescription: LibVa transferCall = pathCallWithBalance(transferCall, swapDescription.dstToken); calls.push(transferCall); } - return calls; + return { swapDescription, calls }; } From fa5863b42cd0b1b59b2589bac588836411d730f0 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Tue, 31 Oct 2023 10:44:23 +0400 Subject: [PATCH 105/225] Fix patching with eth balance --- src/Unit/Exchange/generateSwapCalldata.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index d38df4e..4aa3e18 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -131,7 +131,7 @@ export async function generateSwapCalldata({ )); } - ({ swapDescription, calls } = await wrapOrUnwrapIfNeeded(amountNativeDecimals, swapDescription, calls, swapExecutorContractAddress)); + ({ swapDescription, calls } = await wrapOrUnwrapIfNeeded(amountNativeDecimals, swapDescription, calls, swapExecutorContractAddress, wethAddress)); const calldata = generateCalls(calls); return { swapDescription, calldata }; } @@ -251,16 +251,17 @@ async function wrapOrUnwrapIfNeeded( amount: BigNumberish, swapDescription: LibValidator.SwapDescriptionStruct, calls: BytesLike[], - swapExecutorContractAddress: string + swapExecutorContractAddress: string, + wethAddress: string ) { if (swapDescription.srcToken === ZeroAddress) { const wrapCall = generateWrapAndTransferCall(swapDescription.srcReceiver, { value: amount }); swapDescription.srcReceiver = swapExecutorContractAddress calls = ([wrapCall] as BytesLike[]).concat(calls); - } + } if (swapDescription.dstToken === ZeroAddress) { let unwrapCall = generateUnwrapAndTransferCall(swapDescription.dstReceiver, 0); - unwrapCall = pathCallWithBalance(unwrapCall, swapDescription.dstToken); + unwrapCall = pathCallWithBalance(unwrapCall, wethAddress); calls.push(unwrapCall); } else { let transferCall = await generateTransferCall(swapDescription.dstToken, swapDescription.dstReceiver, 0); From d2982e9265abd93fd906beaa419759e30bcc6442 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Tue, 31 Oct 2023 10:52:36 +0400 Subject: [PATCH 106/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9c10b83..77d6642 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.10-rc105", + "version": "0.20.10-rc106", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 935412724eeaee4989899ba3e795215e218d503e Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Tue, 31 Oct 2023 20:56:25 +0400 Subject: [PATCH 107/225] fix: correct swapDescription.flags initialization to enable contract balance for swaps --- src/Unit/Exchange/generateSwapCalldata.ts | 39 ++++++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 4aa3e18..e792a27 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -17,6 +17,8 @@ import type { SingleSwap } from "../../types.js"; import type { AddressLike } from "ethers"; import { addressLikeToString } from "../../utils/addressLikeToString.js"; import { generateUnwrapAndTransferCall, generateWrapAndTransferCall } from "./callGenerators/weth.js"; +import { Exchange__factory } from "@orionprotocol/contracts/lib/ethers-v6/index.js"; +import getBalance from "../../utils/getBalance.js"; export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3"; @@ -32,6 +34,7 @@ export type GenerateSwapCalldataParams = { amount: BigNumberish; minReturnAmount: BigNumberish; receiverAddress: string; + useContractBalance: boolean; path: ArrayLike; wethAddress: AddressLike; curveRegistryAddress: AddressLike; @@ -54,8 +57,21 @@ export async function generateSwapCalldataWithUnit({ } const wethAddress = safeGet(unit.contracts, "WETH"); const curveRegistryAddress = safeGet(unit.contracts, "curveRegistry"); - const { assetToAddress, swapExecutorContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); - let path = SafeArray.from(arrayLikePath).map((swapInfo) => { + const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch( + unit.blockchainService.getInfo + )(); + + let path = SafeArray.from(arrayLikePath); + const { wallet } = await getBalance( + unit.aggregator, + path.first().assetIn, + safeGet(assetToAddress, path.first().assetIn), + receiverAddress, + Exchange__factory.connect(exchangeContractAddress, unit.provider), + unit.provider + ); + + path = SafeArray.from(arrayLikePath).map((swapInfo) => { swapInfo.assetIn = assetToAddress[swapInfo.assetIn] ?? swapInfo.assetIn.toLowerCase(); swapInfo.assetOut = assetToAddress[swapInfo.assetOut] ?? swapInfo.assetOut.toLowerCase(); return swapInfo; @@ -65,6 +81,7 @@ export async function generateSwapCalldataWithUnit({ amount, minReturnAmount, receiverAddress, + useContractBalance: BigInt(wallet.toString()) < BigInt(amount), path, wethAddress, curveRegistryAddress, @@ -77,6 +94,7 @@ export async function generateSwapCalldata({ amount, minReturnAmount, receiverAddress, + useContractBalance, path: arrayLikePath, wethAddress: wethAddressLike, curveRegistryAddress: curveRegistryAddressLike, @@ -131,8 +149,19 @@ export async function generateSwapCalldata({ )); } - ({ swapDescription, calls } = await wrapOrUnwrapIfNeeded(amountNativeDecimals, swapDescription, calls, swapExecutorContractAddress, wethAddress)); + ({ swapDescription, calls } = await wrapOrUnwrapIfNeeded( + amountNativeDecimals, + swapDescription, + calls, + swapExecutorContractAddress, + wethAddress + )); const calldata = generateCalls(calls); + + if (useContractBalance) { + swapDescription.flags = 1n << 255n; + } + return { swapDescription, calldata }; } @@ -256,9 +285,9 @@ async function wrapOrUnwrapIfNeeded( ) { if (swapDescription.srcToken === ZeroAddress) { const wrapCall = generateWrapAndTransferCall(swapDescription.srcReceiver, { value: amount }); - swapDescription.srcReceiver = swapExecutorContractAddress + swapDescription.srcReceiver = swapExecutorContractAddress; calls = ([wrapCall] as BytesLike[]).concat(calls); - } + } if (swapDescription.dstToken === ZeroAddress) { let unwrapCall = generateUnwrapAndTransferCall(swapDescription.dstReceiver, 0); unwrapCall = pathCallWithBalance(unwrapCall, wethAddress); From 0b74c695a12bdf7e963cb9ef47de6080cb030057 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Tue, 31 Oct 2023 20:56:38 +0400 Subject: [PATCH 108/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 77d6642..68d26fb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.10-rc106", + "version": "0.20.10-rc107", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 3e02f15bc4eae76c2e14a9f886c4b6b169c480ca Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Wed, 1 Nov 2023 12:21:27 +0400 Subject: [PATCH 109/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 68d26fb..bb686d6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.10-rc107", + "version": "0.20.11", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 8f4ab825656bdcf4c0ac03a7a9d429f5a2d19935 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Wed, 1 Nov 2023 12:25:06 +0400 Subject: [PATCH 110/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bb686d6..d6dec1a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.11", + "version": "0.20.12", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 8e018aa1b0c2a29ac5d8d6231f1318047b09d95d Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Wed, 1 Nov 2023 13:02:08 +0400 Subject: [PATCH 111/225] fix: correct exchange::generateSwapCalldata params type --- package.json | 2 +- src/Unit/Exchange/index.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index d6dec1a..b256294 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.12", + "version": "0.20.13", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/index.ts b/src/Unit/Exchange/index.ts index c25b7b9..23e71da 100644 --- a/src/Unit/Exchange/index.ts +++ b/src/Unit/Exchange/index.ts @@ -1,13 +1,13 @@ import type Unit from '../index.js'; import deposit, { type DepositParams } from './deposit.js'; import getSwapInfo, { type GetSwapInfoParams } from './getSwapInfo.js'; -import {generateSwapCalldataWithUnit, type GenerateSwapCalldataParams } from './generateSwapCalldata.js'; +import {generateSwapCalldataWithUnit, type GenerateSwapCalldataWithUnitParams } from './generateSwapCalldata.js'; import withdraw, { type WithdrawParams } from './withdraw.js'; type PureDepositParams = Omit type PureWithdrawParams = Omit type PureGetSwapMarketInfoParams = Omit -type PureGenerateSwapCalldataParams = Omit +type PureGenerateSwapCalldataParams = Omit export default class Exchange { private readonly unit: Unit; From e5d4f5a2b179a7b3cc2d61beb65284b6d810342d Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Wed, 1 Nov 2023 15:08:34 +0000 Subject: [PATCH 112/225] feature: updated version to 0.20.14-rc0 --- package.json | 2 +- src/crypt/index.ts | 2 -- src/crypt/signCancelOrder.ts | 16 +++++--------- src/crypt/signCancelOrderPersonal.ts | 19 ----------------- src/crypt/signOrder.ts | 15 +++++--------- src/crypt/signOrderPersonal.ts | 31 ---------------------------- src/types.ts | 2 -- 7 files changed, 11 insertions(+), 76 deletions(-) delete mode 100644 src/crypt/signCancelOrderPersonal.ts delete mode 100644 src/crypt/signOrderPersonal.ts diff --git a/package.json b/package.json index b256294..fa10312 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.13", + "version": "0.20.14-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/index.ts b/src/crypt/index.ts index 8dbb278..d09530a 100644 --- a/src/crypt/index.ts +++ b/src/crypt/index.ts @@ -1,4 +1,2 @@ export { default as signCancelOrder } from './signCancelOrder.js'; -export { default as signCancelOrderPersonal } from './signCancelOrderPersonal.js'; export { default as signOrder } from './signOrder.js'; -export { default as signOrderPersonal } from './signOrderPersonal.js'; diff --git a/src/crypt/signCancelOrder.ts b/src/crypt/signCancelOrder.ts index ff49d22..f9bd329 100644 --- a/src/crypt/signCancelOrder.ts +++ b/src/crypt/signCancelOrder.ts @@ -3,33 +3,27 @@ import { ethers } from 'ethers'; import CANCEL_ORDER_TYPES from '../constants/cancelOrderTypes.js'; import type { CancelOrderRequest, SignedCancelOrderRequest, SupportedChainId } from '../types.js'; import getDomainData from './getDomainData.js'; -import signCancelOrderPersonal from './signCancelOrderPersonal.js'; type SignerWithTypedDataSign = ethers.Signer & TypedDataSigner; const signCancelOrder = async ( senderAddress: string, id: string, - usePersonalSign: boolean, signer: ethers.Signer, chainId: SupportedChainId, ) => { const cancelOrderRequest: CancelOrderRequest = { id, senderAddress, - isPersonalSign: usePersonalSign, }; // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const typedDataSigner = signer as SignerWithTypedDataSign; - const signature = usePersonalSign - ? await signCancelOrderPersonal(cancelOrderRequest, signer) - // https://docs.ethers.io/v5/api/signer/#Signer-signTypedData - : await typedDataSigner.signTypedData( - getDomainData(chainId), - CANCEL_ORDER_TYPES, - cancelOrderRequest, - ); + const signature = await typedDataSigner.signTypedData( + getDomainData(chainId), + CANCEL_ORDER_TYPES, + cancelOrderRequest, + ); // https://github.com/poap-xyz/poap-fun/pull/62#issue-928290265 // "Signature's v was always send as 27 or 28, but from Ledger was 0 or 1" diff --git a/src/crypt/signCancelOrderPersonal.ts b/src/crypt/signCancelOrderPersonal.ts deleted file mode 100644 index 2837c3b..0000000 --- a/src/crypt/signCancelOrderPersonal.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ethers } from 'ethers'; -import type { CancelOrderRequest } from '../types.js'; - -const signCancelOrderPersonal = async ( - cancelOrderRequest: CancelOrderRequest, - signer: ethers.Signer, -) => { - const types = ['string', 'string', 'address']; - const message = ethers.solidityPackedKeccak256( - types, - ['cancelOrder', cancelOrderRequest.id, cancelOrderRequest.senderAddress], - ); - const signature = await signer.signMessage(ethers.getBytes(message)); - - // NOTE: metamask broke sig.v value and we fix it in next line - return ethers.Signature.from(signature).serialized; -}; - -export default signCancelOrderPersonal; diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index 90e59df..fca41a7 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -7,7 +7,6 @@ import type { Order, SignedOrder, SupportedChainId } from '../types.js'; import normalizeNumber from '../utils/normalizeNumber.js'; import getDomainData from './getDomainData.js'; import hashOrder from './hashOrder.js'; -import signOrderPersonal from './signOrderPersonal.js'; const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days @@ -23,7 +22,6 @@ export const signOrder = async ( senderAddress: string, matcherAddress: string, serviceFeeAssetAddr: string, - usePersonalSign: boolean, signer: ethers.Signer, chainId: SupportedChainId, ) => { @@ -54,19 +52,16 @@ export const signOrder = async ( nonce, expiration, buySide: side === 'BUY' ? 1 : 0, - isPersonalSign: usePersonalSign, }; // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const typedDataSigner = signer as SignerWithTypedDataSign; - const signature = usePersonalSign - ? await signOrderPersonal(order, signer) - : await typedDataSigner.signTypedData( - getDomainData(chainId), - ORDER_TYPES, - order, - ); + const signature = await typedDataSigner.signTypedData( + getDomainData(chainId), + ORDER_TYPES, + order, + ); // https://github.com/poap-xyz/poap-fun/pull/62#issue-928290265 // "Signature's v was always send as 27 or 28, but from Ledger was 0 or 1" diff --git a/src/crypt/signOrderPersonal.ts b/src/crypt/signOrderPersonal.ts deleted file mode 100644 index 4573e96..0000000 --- a/src/crypt/signOrderPersonal.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ethers } from 'ethers'; -import type { Order } from '../types.js'; - -const signOrderPersonal = async (order: Order, signer: ethers.Signer) => { - const message = ethers.solidityPackedKeccak256( - [ - 'string', 'address', 'address', 'address', 'address', - 'address', 'uint64', 'uint64', 'uint64', 'uint64', 'uint64', 'uint8', - ], - [ - 'order', - order.senderAddress, - order.matcherAddress, - order.baseAsset, - order.quoteAsset, - order.matcherFeeAsset, - order.amount, - order.price, - order.matcherFee, - order.nonce, - order.expiration, - order.buySide, - ], - ); - const signature = await signer.signMessage(ethers.getBytes(message)); - - // NOTE: metamask broke sig.v value and we fix it in next line - return ethers.Signature.from(signature).serialized; -}; - -export default signOrderPersonal; diff --git a/src/types.ts b/src/types.ts index be08dd2..a528108 100644 --- a/src/types.ts +++ b/src/types.ts @@ -48,7 +48,6 @@ export type Order = { nonce: number // uint64 expiration: number // uint64 buySide: 0 | 1 // uint8, 1=buy, 0=sell - isPersonalSign: boolean // bool } export type SignedOrder = { @@ -60,7 +59,6 @@ export type SignedOrder = { export type CancelOrderRequest = { id: number | string senderAddress: string - isPersonalSign: boolean } export type SignedCancelOrderRequest = { From 47e68cc7fa3ca4cb841e17db9fa00cce9d245899 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Fri, 3 Nov 2023 13:16:16 +0400 Subject: [PATCH 113/225] fix denormolized wallet balance error --- package.json | 2 +- src/Unit/Exchange/callGenerators/utils.ts | 4 ++++ src/Unit/Exchange/generateSwapCalldata.ts | 9 +++------ src/utils/getBalance.ts | 19 +++++++++++++++++++ 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index b256294..fa10312 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.13", + "version": "0.20.14-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/callGenerators/utils.ts b/src/Unit/Exchange/callGenerators/utils.ts index e49217b..ad10f6b 100644 --- a/src/Unit/Exchange/callGenerators/utils.ts +++ b/src/Unit/Exchange/callGenerators/utils.ts @@ -87,6 +87,10 @@ export function generateCalls(calls: BytesLike[]) { } export async function exchangeToNativeDecimals(token: AddressLike, amount: BigNumberish, provider: ethers.JsonRpcProvider) { + return await toNativeDecimals(token, amount, provider) / (BigInt(10) ** 8n) +} + +export async function toNativeDecimals(token: AddressLike, amount: BigNumberish, provider: ethers.JsonRpcProvider) { token = await token if (typeof token !== "string") token = await token.getAddress() diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index e792a27..ffbddcb 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -18,7 +18,7 @@ import type { AddressLike } from "ethers"; import { addressLikeToString } from "../../utils/addressLikeToString.js"; import { generateUnwrapAndTransferCall, generateWrapAndTransferCall } from "./callGenerators/weth.js"; import { Exchange__factory } from "@orionprotocol/contracts/lib/ethers-v6/index.js"; -import getBalance from "../../utils/getBalance.js"; +import { getWalletBalance } from "../../utils/getBalance.js"; export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3"; @@ -62,12 +62,9 @@ export async function generateSwapCalldataWithUnit({ )(); let path = SafeArray.from(arrayLikePath); - const { wallet } = await getBalance( - unit.aggregator, + const walletBalance = await getWalletBalance( path.first().assetIn, - safeGet(assetToAddress, path.first().assetIn), receiverAddress, - Exchange__factory.connect(exchangeContractAddress, unit.provider), unit.provider ); @@ -81,7 +78,7 @@ export async function generateSwapCalldataWithUnit({ amount, minReturnAmount, receiverAddress, - useContractBalance: BigInt(wallet.toString()) < BigInt(amount), + useContractBalance: walletBalance < BigInt(amount), path, wethAddress, curveRegistryAddress, diff --git a/src/utils/getBalance.ts b/src/utils/getBalance.ts index 35738ce..e7c84b2 100644 --- a/src/utils/getBalance.ts +++ b/src/utils/getBalance.ts @@ -41,3 +41,22 @@ export default async function getBalance( wallet: denormalizedAssetInWalletBalance, }; } + +export async function getWalletBalance( + assetAddress: string, + walletAddress: string, + provider: ethers.Provider, +) { + const assetIsNativeCryptocurrency = assetAddress === ethers.ZeroAddress; + + let assetWalletBalance: bigint | undefined; + + if (!assetIsNativeCryptocurrency) { + const assetContract = ERC20__factory.connect(assetAddress, provider); + assetWalletBalance = await assetContract.balanceOf(walletAddress); + } else { + assetWalletBalance = await provider.getBalance(walletAddress); + } + + return assetWalletBalance +} From fa0a9d09cef32fd0228097f702d127d0e7cfc4f6 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Fri, 3 Nov 2023 13:21:45 +0400 Subject: [PATCH 114/225] remove unused imports and variables --- src/Unit/Exchange/generateSwapCalldata.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index ffbddcb..a55d4a5 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -17,7 +17,6 @@ import type { SingleSwap } from "../../types.js"; import type { AddressLike } from "ethers"; import { addressLikeToString } from "../../utils/addressLikeToString.js"; import { generateUnwrapAndTransferCall, generateWrapAndTransferCall } from "./callGenerators/weth.js"; -import { Exchange__factory } from "@orionprotocol/contracts/lib/ethers-v6/index.js"; import { getWalletBalance } from "../../utils/getBalance.js"; export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3"; @@ -57,7 +56,7 @@ export async function generateSwapCalldataWithUnit({ } const wethAddress = safeGet(unit.contracts, "WETH"); const curveRegistryAddress = safeGet(unit.contracts, "curveRegistry"); - const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch( + const { assetToAddress, swapExecutorContractAddress } = await simpleFetch( unit.blockchainService.getInfo )(); From 9d297dcbb8f9d574d337ea1e1f6c6483a346ca0d Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Fri, 3 Nov 2023 13:25:37 +0400 Subject: [PATCH 115/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fa10312..437abf1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.14-rc0", + "version": "0.20.14-rc100", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 827b2d32cdee5ee4e57df125276f8daa41cadf1e Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Fri, 3 Nov 2023 14:55:24 +0400 Subject: [PATCH 116/225] fix passing ticker instead of token address --- src/Unit/Exchange/generateSwapCalldata.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index a55d4a5..948d094 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -62,7 +62,7 @@ export async function generateSwapCalldataWithUnit({ let path = SafeArray.from(arrayLikePath); const walletBalance = await getWalletBalance( - path.first().assetIn, + safeGet(assetToAddress, path.first().assetIn), receiverAddress, unit.provider ); From ba508ec37eae4fa8605856e1ce15f1a7dfa77063 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Fri, 3 Nov 2023 14:59:50 +0400 Subject: [PATCH 117/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fb57e71..785ac64 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.14-rc1", + "version": "0.20.14-rc2", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 323b4e052d1c8464b691abcab21f5365e3b67c84 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Fri, 3 Nov 2023 15:45:50 +0400 Subject: [PATCH 118/225] change curve registry address --- src/config/chains.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/chains.json b/src/config/chains.json index 0cba1b0..68b940c 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -35,7 +35,7 @@ "baseCurrencyName": "BNB", "contracts": { "WETH": "0x23eE96bEaAB62abE126AA192e677c52bB7d274F0", - "curveRegistry": "0x8845b36C3DE93379F468590FFa102D4aF8C49A6c" + "curveRegistry": "0x93461072c00b2740c474a3d52c70be6249c802d8" } }, "3": { From 82632582265dd38c52fec014805253147e5a8c64 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Fri, 3 Nov 2023 15:46:18 +0400 Subject: [PATCH 119/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 785ac64..3895c72 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.14-rc2", + "version": "0.20.14-rc3", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From ad40b10f78e9cab51cd216d7f11fd604e645065d Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Fri, 3 Nov 2023 18:34:43 +0400 Subject: [PATCH 120/225] fix exchangeToNativeDecimal function --- src/Unit/Exchange/callGenerators/utils.ts | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Unit/Exchange/callGenerators/utils.ts b/src/Unit/Exchange/callGenerators/utils.ts index ad10f6b..b61dc4b 100644 --- a/src/Unit/Exchange/callGenerators/utils.ts +++ b/src/Unit/Exchange/callGenerators/utils.ts @@ -99,5 +99,5 @@ export async function toNativeDecimals(token: AddressLike, amount: BigNumberish, const contract = ERC20__factory.connect(token, provider) decimals = BigInt(await contract.decimals()) } - return BigInt(amount) * (BigInt(10) ** decimals) / (BigInt(10) ** 8n) + return BigInt(amount) * (BigInt(10) ** decimals) } \ No newline at end of file diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 948d094..506c79b 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -77,7 +77,7 @@ export async function generateSwapCalldataWithUnit({ amount, minReturnAmount, receiverAddress, - useContractBalance: walletBalance < BigInt(amount), + useContractBalance: walletBalance < await exchangeToNativeDecimals(path.first().assetIn, amount, unit.provider), path, wethAddress, curveRegistryAddress, From 41e511a98855798ec005f865ea3c59a4e8e98ab7 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Fri, 3 Nov 2023 18:35:01 +0400 Subject: [PATCH 121/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3895c72..da39107 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.14-rc3", + "version": "0.20.14-rc4", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From a9103e8744e4ac362e83cedf0abf7f8037eefafa Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Mon, 6 Nov 2023 16:05:50 +0400 Subject: [PATCH 122/225] bump before merge --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index da39107..65738eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.14-rc4", + "version": "0.20.15", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From a0d2df3cd5216ceb8bf7eee921da332eb6307193 Mon Sep 17 00:00:00 2001 From: Dmitry <35160421+TheJuze@users.noreply.github.com> Date: Thu, 9 Nov 2023 10:56:32 +0300 Subject: [PATCH 123/225] Rename integrator to indexer (#207) --- package-lock.json | 18 ++-- package.json | 4 +- src/Orion/index.ts | 4 +- src/Unit/index.ts | 12 +-- src/__tests__/basic.test.ts | 2 +- src/config/envs.json | 92 +++++++++---------- src/config/schemas/pureEnvSchema.ts | 2 +- .../{Integrator => Indexer}/constants.ts | 0 src/services/{Integrator => Indexer}/index.ts | 4 +- .../schemas/basic-pool-info-schema.ts | 0 .../schemas/environment-response-schema.ts | 0 .../schemas/get-pool-response-schema.ts | 0 .../{Integrator => Indexer}/schemas/index.ts | 0 .../schemas/info-schema.ts | 0 .../schemas/list-amount-schema.ts | 0 .../schemas/list-nft-order-response-schema.ts | 0 .../schemas/list-pool-response-schema.ts | 0 .../schemas/pool-schema.ts | 0 .../schemas/test-incrementor-schema.ts | 0 .../schemas/util-schemas.ts | 0 .../schemas/veORN-info-schema.ts | 0 .../schemas/voting-info-schema.ts | 0 src/services/index.ts | 2 +- src/types.ts | 4 +- 24 files changed, 72 insertions(+), 72 deletions(-) rename src/services/{Integrator => Indexer}/constants.ts (100%) rename src/services/{Integrator => Indexer}/index.ts (99%) rename src/services/{Integrator => Indexer}/schemas/basic-pool-info-schema.ts (100%) rename src/services/{Integrator => Indexer}/schemas/environment-response-schema.ts (100%) rename src/services/{Integrator => Indexer}/schemas/get-pool-response-schema.ts (100%) rename src/services/{Integrator => Indexer}/schemas/index.ts (100%) rename src/services/{Integrator => Indexer}/schemas/info-schema.ts (100%) rename src/services/{Integrator => Indexer}/schemas/list-amount-schema.ts (100%) rename src/services/{Integrator => Indexer}/schemas/list-nft-order-response-schema.ts (100%) rename src/services/{Integrator => Indexer}/schemas/list-pool-response-schema.ts (100%) rename src/services/{Integrator => Indexer}/schemas/pool-schema.ts (100%) rename src/services/{Integrator => Indexer}/schemas/test-incrementor-schema.ts (100%) rename src/services/{Integrator => Indexer}/schemas/util-schemas.ts (100%) rename src/services/{Integrator => Indexer}/schemas/veORN-info-schema.ts (100%) rename src/services/{Integrator => Indexer}/schemas/voting-info-schema.ts (100%) diff --git a/package-lock.json b/package-lock.json index 9e5ad1d..2b35319 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.10-rc101", + "version": "0.20.16-rc1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.10-rc101", + "version": "0.20.16-rc1", "hasInstallScript": true, "license": "ISC", "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.22.1", + "@orionprotocol/contracts": "1.22.3", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", "buffer": "^6.0.3", @@ -2419,9 +2419,9 @@ } }, "node_modules/@orionprotocol/contracts": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.1.tgz", - "integrity": "sha512-DrIyAmZ+LK3Eflv/gk6Uq3shpTLjeG4wV6PoKVxJKoqk05qL35cJs5V/2it16s5NolcQliFrtJ54G3xI78gTwA==" + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.3.tgz", + "integrity": "sha512-TVZftFbrHA+ldZSvMAGTntSiTT20UWn6P/+N392A9dv6RtiIXaQpMic5hOhVdIed74DU/KixVxwjVL1Hr0RLGQ==" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -13460,9 +13460,9 @@ } }, "@orionprotocol/contracts": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.1.tgz", - "integrity": "sha512-DrIyAmZ+LK3Eflv/gk6Uq3shpTLjeG4wV6PoKVxJKoqk05qL35cJs5V/2it16s5NolcQliFrtJ54G3xI78gTwA==" + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.3.tgz", + "integrity": "sha512-TVZftFbrHA+ldZSvMAGTntSiTT20UWn6P/+N392A9dv6RtiIXaQpMic5hOhVdIed74DU/KixVxwjVL1Hr0RLGQ==" }, "@sinclair/typebox": { "version": "0.27.8", diff --git a/package.json b/package.json index 65738eb..c0e98e8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.15", + "version": "0.20.16-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -88,7 +88,7 @@ "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.22.1", + "@orionprotocol/contracts": "1.22.3", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", "buffer": "^6.0.3", diff --git a/src/Orion/index.ts b/src/Orion/index.ts index b2a6b44..649b293 100644 --- a/src/Orion/index.ts +++ b/src/Orion/index.ts @@ -58,8 +58,8 @@ export default class Orion { priceFeed: { api: networkConfig.api + networkConfig.services.priceFeed.all, }, - integrator: { - api: networkConfig.api + networkConfig.services.integrator.http, + indexer: { + api: networkConfig.api + networkConfig.services.indexer.http, } }, }; diff --git a/src/Unit/index.ts b/src/Unit/index.ts index 5fd9e87..d79200e 100644 --- a/src/Unit/index.ts +++ b/src/Unit/index.ts @@ -11,7 +11,7 @@ import Exchange from './Exchange/index.js'; import FarmingManager from './FarmingManager/index.js'; import { chains, envs } from '../config/index.js'; import type { networkCodes } from '../constants/index.js'; -import { IntegratorService } from '../services/Integrator/index.js'; +import { IndexerService } from '../services/Indexer/index.js'; type KnownConfig = { env: KnownEnv @@ -27,7 +27,7 @@ export default class Unit { public readonly blockchainService: BlockchainService; - public readonly integrator: IntegratorService; + public readonly indexer: IndexerService; public readonly aggregator: Aggregator; @@ -85,8 +85,8 @@ export default class Unit { priceFeed: { api: networkConfig.api + networkConfig.services.priceFeed.all, }, - integrator: { - api: networkConfig.api + networkConfig.services.integrator.http, + indexer: { + api: networkConfig.api + networkConfig.services.indexer.http, }, }, }; @@ -109,8 +109,8 @@ export default class Unit { this.config.services.blockchainService.http, this.config.basicAuth ); - this.integrator = new IntegratorService( - this.config.services.integrator.api, + this.indexer = new IndexerService( + this.config.services.indexer.api, intNetwork ); this.aggregator = new Aggregator( diff --git a/src/__tests__/basic.test.ts b/src/__tests__/basic.test.ts index 7967396..d4de381 100644 --- a/src/__tests__/basic.test.ts +++ b/src/__tests__/basic.test.ts @@ -177,7 +177,7 @@ describe('Orion', () => { priceFeed: { api: orionPriceFeedAPI + '/price-feed', }, - integrator: { + indexer: { api: '', } }, diff --git a/src/config/envs.json b/src/config/envs.json index 8359aa9..be254cf 100644 --- a/src/config/envs.json +++ b/src/config/envs.json @@ -16,8 +16,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } }, "liquidityMigratorAddress": "0x23a1820a47BcD022E29f6058a5FD224242F50D1A" @@ -35,8 +35,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -53,8 +53,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -71,8 +71,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -89,8 +89,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } } @@ -113,8 +113,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } }, "liquidityMigratorAddress": "0x01b10dds12478C88A5E18e2707E729906bC25CfF6" @@ -132,8 +132,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -150,8 +150,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -168,8 +168,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -186,8 +186,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -204,8 +204,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } } @@ -228,8 +228,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -246,8 +246,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -264,8 +264,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -282,8 +282,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -300,8 +300,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } } @@ -324,8 +324,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -342,8 +342,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } } @@ -366,8 +366,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } }, "liquidityMigratorAddress": "0x23a1820a47BcD022E29f6058a5FD224242F50D1A" @@ -385,8 +385,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -403,8 +403,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -421,8 +421,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } }, @@ -439,8 +439,8 @@ "priceFeed": { "all": "/price-feed" }, - "integrator": { - "http": "/orion-integrator/" + "indexer": { + "http": "/orion-indexer/" } } } diff --git a/src/config/schemas/pureEnvSchema.ts b/src/config/schemas/pureEnvSchema.ts index 854e9f4..ca5bb3e 100644 --- a/src/config/schemas/pureEnvSchema.ts +++ b/src/config/schemas/pureEnvSchema.ts @@ -14,7 +14,7 @@ export const pureEnvNetworksSchema = z.object({ priceFeed: z.object({ all: z.string(), }), - integrator: z.object({ + indexer: z.object({ http: z.string(), }), }), diff --git a/src/services/Integrator/constants.ts b/src/services/Indexer/constants.ts similarity index 100% rename from src/services/Integrator/constants.ts rename to src/services/Indexer/constants.ts diff --git a/src/services/Integrator/index.ts b/src/services/Indexer/index.ts similarity index 99% rename from src/services/Integrator/index.ts rename to src/services/Indexer/index.ts index 8154e52..6ac234c 100644 --- a/src/services/Integrator/index.ts +++ b/src/services/Indexer/index.ts @@ -68,7 +68,7 @@ type Payload = | ListAmountPayload | GetAmountByORNPayload; -class IntegratorService { +class IndexerService { private readonly apiUrl: string; private readonly chainId: number; @@ -222,4 +222,4 @@ class IntegratorService { } export * as schemas from './schemas/index.js'; -export { IntegratorService }; +export { IndexerService }; diff --git a/src/services/Integrator/schemas/basic-pool-info-schema.ts b/src/services/Indexer/schemas/basic-pool-info-schema.ts similarity index 100% rename from src/services/Integrator/schemas/basic-pool-info-schema.ts rename to src/services/Indexer/schemas/basic-pool-info-schema.ts diff --git a/src/services/Integrator/schemas/environment-response-schema.ts b/src/services/Indexer/schemas/environment-response-schema.ts similarity index 100% rename from src/services/Integrator/schemas/environment-response-schema.ts rename to src/services/Indexer/schemas/environment-response-schema.ts diff --git a/src/services/Integrator/schemas/get-pool-response-schema.ts b/src/services/Indexer/schemas/get-pool-response-schema.ts similarity index 100% rename from src/services/Integrator/schemas/get-pool-response-schema.ts rename to src/services/Indexer/schemas/get-pool-response-schema.ts diff --git a/src/services/Integrator/schemas/index.ts b/src/services/Indexer/schemas/index.ts similarity index 100% rename from src/services/Integrator/schemas/index.ts rename to src/services/Indexer/schemas/index.ts diff --git a/src/services/Integrator/schemas/info-schema.ts b/src/services/Indexer/schemas/info-schema.ts similarity index 100% rename from src/services/Integrator/schemas/info-schema.ts rename to src/services/Indexer/schemas/info-schema.ts diff --git a/src/services/Integrator/schemas/list-amount-schema.ts b/src/services/Indexer/schemas/list-amount-schema.ts similarity index 100% rename from src/services/Integrator/schemas/list-amount-schema.ts rename to src/services/Indexer/schemas/list-amount-schema.ts diff --git a/src/services/Integrator/schemas/list-nft-order-response-schema.ts b/src/services/Indexer/schemas/list-nft-order-response-schema.ts similarity index 100% rename from src/services/Integrator/schemas/list-nft-order-response-schema.ts rename to src/services/Indexer/schemas/list-nft-order-response-schema.ts diff --git a/src/services/Integrator/schemas/list-pool-response-schema.ts b/src/services/Indexer/schemas/list-pool-response-schema.ts similarity index 100% rename from src/services/Integrator/schemas/list-pool-response-schema.ts rename to src/services/Indexer/schemas/list-pool-response-schema.ts diff --git a/src/services/Integrator/schemas/pool-schema.ts b/src/services/Indexer/schemas/pool-schema.ts similarity index 100% rename from src/services/Integrator/schemas/pool-schema.ts rename to src/services/Indexer/schemas/pool-schema.ts diff --git a/src/services/Integrator/schemas/test-incrementor-schema.ts b/src/services/Indexer/schemas/test-incrementor-schema.ts similarity index 100% rename from src/services/Integrator/schemas/test-incrementor-schema.ts rename to src/services/Indexer/schemas/test-incrementor-schema.ts diff --git a/src/services/Integrator/schemas/util-schemas.ts b/src/services/Indexer/schemas/util-schemas.ts similarity index 100% rename from src/services/Integrator/schemas/util-schemas.ts rename to src/services/Indexer/schemas/util-schemas.ts diff --git a/src/services/Integrator/schemas/veORN-info-schema.ts b/src/services/Indexer/schemas/veORN-info-schema.ts similarity index 100% rename from src/services/Integrator/schemas/veORN-info-schema.ts rename to src/services/Indexer/schemas/veORN-info-schema.ts diff --git a/src/services/Integrator/schemas/voting-info-schema.ts b/src/services/Indexer/schemas/voting-info-schema.ts similarity index 100% rename from src/services/Integrator/schemas/voting-info-schema.ts rename to src/services/Indexer/schemas/voting-info-schema.ts diff --git a/src/services/index.ts b/src/services/index.ts index 7d35c9e..ca04ebd 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -2,4 +2,4 @@ export * as aggregator from './Aggregator/index.js'; export * as blockchainService from './BlockchainService/index.js'; export * as priceFeed from './PriceFeed/index.js'; export * as referralSystem from './ReferralSystem/index.js'; -export * as integrator from './Integrator/index.js'; +export * as indexer from './Indexer/index.js'; diff --git a/src/types.ts b/src/types.ts index a528108..ecc3568 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/consistent-type-definitions */ -import factories from './constants/factories.js'; +import type factories from './constants/factories.js'; import type { BigNumber } from 'bignumber.js'; import type subOrderStatuses from './constants/subOrderStatuses.js'; import type positionStatuses from './constants/positionStatuses.js'; @@ -253,7 +253,7 @@ export type VerboseUnitConfig = { // http://10.23.5.11:3003/, // https://price-feed:3003/ } - integrator: { + indexer: { api: string // For example: // http://localhost:3004/, From 803a9e1b588d0374ae77c537e79bfca45be89e59 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 9 Nov 2023 10:57:12 +0300 Subject: [PATCH 124/225] bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2b35319..b560d00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.16-rc1", + "version": "0.20.16", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.16-rc1", + "version": "0.20.16", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index c0e98e8..b86f372 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.16-rc1", + "version": "0.20.16", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 9175d9ad1db94861dd963585c3144dd27db6d542 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Thu, 9 Nov 2023 17:40:54 +0400 Subject: [PATCH 125/225] update weth curve registry addresses in config --- package.json | 2 +- src/config/chains.json | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b86f372..85debc5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.16", + "version": "0.20.17", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/config/chains.json b/src/config/chains.json index 68b940c..7da650e 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -99,8 +99,8 @@ "rpc": "https://rpcapi.fantom.network/", "baseCurrencyName": "FTM", "contracts": { - "WETH": "", - "curveRegistry": "" + "WETH": "0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83", + "curveRegistry": "0x0f854EA9F38ceA4B1c2FC79047E9D0134419D5d6" } }, "137": { @@ -112,8 +112,8 @@ "rpc": "https://polygon-rpc.com/", "explorer": "https://polygonscan.com/", "contracts": { - "WETH": "", - "curveRegistry": "" + "WETH": "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", + "curveRegistry": "0x094d12e5b541784701FD8d65F11fc0598FBC6332" } }, "80001": { @@ -138,7 +138,7 @@ "rpc": "https://exchainrpc.okex.org/", "baseCurrencyName": "OKT", "contracts": { - "WETH": "", + "WETH": "0x843340759bFCa4a3776F401cD2E03fE9bc0d838f", "curveRegistry": "" } }, From 8fe0c4314c248d9ab8a587cbb63531681a77add8 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Thu, 9 Nov 2023 19:03:47 +0400 Subject: [PATCH 126/225] hotfix: support for ticker and address in generateSwapCalldata --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 85debc5..7bf3b7b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.17", + "version": "0.20.18", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 506c79b..eb59716 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -62,7 +62,7 @@ export async function generateSwapCalldataWithUnit({ let path = SafeArray.from(arrayLikePath); const walletBalance = await getWalletBalance( - safeGet(assetToAddress, path.first().assetIn), + assetToAddress[path.first().assetIn] ?? path.first().assetIn.toLowerCase(), receiverAddress, unit.provider ); From b5d6dd937bec106dbfe3e55ccb98306e26e32429 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Tue, 14 Nov 2023 09:35:51 +0000 Subject: [PATCH 127/225] OP-4504 Fix Governance and Pools (#197) --- package-lock.json | 4 +- package.json | 2 +- src/services/Indexer/index.ts | 63 +++++++++++++++---- .../Indexer/schemas/basic-pool-info-schema.ts | 2 +- .../schemas/environment-response-schema.ts | 6 +- src/services/Indexer/schemas/index.ts | 19 +++--- .../Indexer/schemas/list-pool-schema.ts | 11 ++++ .../schemas/list-pool-v2-response-schema.ts | 62 ++++++++++++++++++ ...ema.ts => list-pool-v3-response-schema.ts} | 18 ++++-- .../Indexer/schemas/pool-v2-info-schema.ts | 63 +++++++++++++++++++ .../Indexer/schemas/veORN-info-schema.ts | 3 +- .../Indexer/schemas/voting-info-schema.ts | 1 + 12 files changed, 223 insertions(+), 31 deletions(-) create mode 100644 src/services/Indexer/schemas/list-pool-schema.ts create mode 100644 src/services/Indexer/schemas/list-pool-v2-response-schema.ts rename src/services/Indexer/schemas/{list-pool-response-schema.ts => list-pool-v3-response-schema.ts} (59%) create mode 100644 src/services/Indexer/schemas/pool-v2-info-schema.ts diff --git a/package-lock.json b/package-lock.json index b560d00..3d481ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.16", + "version": "0.20.10-rc31", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.16", + "version": "0.20.10-rc31", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 7bf3b7b..63c049a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.18", + "version": "0.20.10-rc31", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Indexer/index.ts b/src/services/Indexer/index.ts index 6ac234c..13f0b66 100644 --- a/src/services/Indexer/index.ts +++ b/src/services/Indexer/index.ts @@ -4,13 +4,16 @@ import { listAmountResponseSchema, listNFTOrderResponseSchema, listPoolResponseSchema, + listPoolV2ResponseSchema, + listPoolV3ResponseSchema, + PoolV2InfoResponseSchema, testIncrementorSchema, veORNInfoResponseSchema, votingInfoResponseSchema } from './schemas'; import { fetchWithValidation } from 'simple-typed-fetch'; import { BigNumber } from 'bignumber.js'; -import { DAY, WEEK_DAYS, YEAR } from '../../constants'; +import { WEEK_DAYS, YEAR } from '../../constants'; import { LOCK_START_TIME } from './constants'; type BasePayload = { @@ -31,7 +34,7 @@ type ListNFTOrderPayload = BasePayload & { }; type GetPoolInfoPayload = BasePayload & { - model: 'OrionV3Factory' + model: 'OrionV3Factory' | 'OrionV2Factory' method: 'getPoolInfo' params: [string, string, string] }; @@ -84,7 +87,10 @@ class IndexerService { this.getEnvironment = this.getEnvironment.bind(this); this.listNFTOrder = this.listNFTOrder.bind(this); this.getPoolInfo = this.getPoolInfo.bind(this); - this.listPool = this.listPool.bind(this); + this.getListPool = this.getListPool.bind(this); + this.listPoolV2 = this.listPoolV2.bind(this); + this.poolV2Info = this.poolV2Info.bind(this); + this.listPoolV3 = this.listPoolV3.bind(this); this.veORNInfo = this.veORNInfo.bind(this); this.listAmount = this.listAmount.bind(this); this.getAmountByORN = this.getAmountByORN.bind(this); @@ -118,16 +124,18 @@ class IndexerService { return BigNumber(amount).dividedBy(this.getK(timestamp)); }; - readonly getAmountByORN = (amountToken: number, timeLock: number) => { - const timestamp = Date.now() / 1000; + readonly getAmountByORN = (amountToken: string, lockingDays: number) => { + const alpha = 730 / (30 - Math.sqrt(730 / 7)) ** (1 / 3); - const deltaDaysBN = BigNumber(timeLock).minus(timestamp).dividedBy(DAY); + const deltaDaysBN = BigNumber(lockingDays); - if (deltaDaysBN.lte(0)) return 0; + if (deltaDaysBN.lte(0)) return BigNumber(0); + + const multSQRT = deltaDaysBN.dividedBy(WEEK_DAYS).sqrt(); + const multCUBE = deltaDaysBN.dividedBy(alpha).pow(3); return BigNumber(amountToken) - .multipliedBy(deltaDaysBN.sqrt()) - .dividedBy(BigNumber(WEEK_DAYS).sqrt()); + .multipliedBy(multSQRT.plus(multCUBE)); }; readonly getVotingInfo = (userAddress?: string) => { @@ -163,6 +171,17 @@ class IndexerService { }); }; + readonly getListPool = (userAddress?: string) => { + return fetchWithValidation(this.apiUrl, listPoolResponseSchema, { + method: 'POST', + body: this.makeRPCPayload({ + model: 'OrionVoting', + method: 'listPool', + params: [userAddress], + }), + }); + }; + readonly getPoolInfo = ( token0: string, token1: string, @@ -178,8 +197,30 @@ class IndexerService { }); }; - readonly listPool = (address?: string) => { - return fetchWithValidation(this.apiUrl, listPoolResponseSchema, { + readonly listPoolV2 = (address?: string) => { + return fetchWithValidation(this.apiUrl, listPoolV2ResponseSchema, { + method: 'POST', + body: this.makeRPCPayload({ + model: 'OrionFarmV2', + method: 'listPool', + params: [address], + }), + }); + }; + + readonly poolV2Info = (token0: string, token1: string, address: string) => { + return fetchWithValidation(this.apiUrl, PoolV2InfoResponseSchema, { + method: 'POST', + body: this.makeRPCPayload({ + model: 'OrionV2Factory', + method: 'getPoolInfo', + params: [token0, token1, address], + }), + }); + }; + + readonly listPoolV3 = (address?: string) => { + return fetchWithValidation(this.apiUrl, listPoolV3ResponseSchema, { method: 'POST', body: this.makeRPCPayload({ model: 'OrionFarmV3', diff --git a/src/services/Indexer/schemas/basic-pool-info-schema.ts b/src/services/Indexer/schemas/basic-pool-info-schema.ts index 049c92f..a46acbf 100644 --- a/src/services/Indexer/schemas/basic-pool-info-schema.ts +++ b/src/services/Indexer/schemas/basic-pool-info-schema.ts @@ -5,7 +5,7 @@ const basicPoolInfo = z.object({ poolAddress: evmAddressSchema, isInitialized: z.boolean(), liquidity: z.number().nonnegative(), - liquidityInUsd: z.number().nonnegative(), + liquidityInUSD: z.number().nonnegative(), liquidityShare: z.number().nonnegative(), isFarming: z.boolean(), rewardsTotal: z.number().nonnegative(), diff --git a/src/services/Indexer/schemas/environment-response-schema.ts b/src/services/Indexer/schemas/environment-response-schema.ts index 5da5cd2..3f79130 100644 --- a/src/services/Indexer/schemas/environment-response-schema.ts +++ b/src/services/Indexer/schemas/environment-response-schema.ts @@ -7,11 +7,15 @@ const environmentResponseSchema = z.object({ chainId: z.number().int().nonnegative(), nativeToken: z.string(), OrionV3Factory: evmAddressSchema, + OrionV2Factory: evmAddressSchema, OrionV3NFTManager: evmAddressSchema, - SwapRouter: evmAddressSchema, + SwapRouterV3: evmAddressSchema, OrionFarmV3: evmAddressSchema, + OrionFarmV2: evmAddressSchema, OrionVoting: evmAddressSchema, veORN: evmAddressSchema, + ORN: evmAddressSchema, + WETH9: evmAddressSchema, }), info: infoSchema, }); diff --git a/src/services/Indexer/schemas/index.ts b/src/services/Indexer/schemas/index.ts index e6e03b6..8690e93 100644 --- a/src/services/Indexer/schemas/index.ts +++ b/src/services/Indexer/schemas/index.ts @@ -1,8 +1,11 @@ -export { default as environmentResponseSchema } from './environment-response-schema.js'; -export { default as listNFTOrderResponseSchema } from './list-nft-order-response-schema.js'; -export { default as getPoolResponseSchema } from './get-pool-response-schema.js'; -export { default as listPoolResponseSchema } from './list-pool-response-schema.js'; -export { default as veORNInfoResponseSchema } from './veORN-info-schema.js'; -export { default as listAmountResponseSchema } from './list-amount-schema.js'; -export { default as votingInfoResponseSchema } from './voting-info-schema.js'; -export { default as testIncrementorSchema } from './test-incrementor-schema.js'; +export { default as environmentResponseSchema } from './environment-response-schema'; +export { default as listNFTOrderResponseSchema } from './list-nft-order-response-schema'; +export { default as getPoolResponseSchema } from './get-pool-response-schema'; +export { default as listPoolResponseSchema } from './list-pool-schema'; +export { default as listPoolV2ResponseSchema } from './list-pool-v2-response-schema'; +export { default as PoolV2InfoResponseSchema } from './pool-v2-info-schema'; +export { default as listPoolV3ResponseSchema } from './list-pool-v3-response-schema'; +export { default as veORNInfoResponseSchema } from './veORN-info-schema'; +export { default as listAmountResponseSchema } from './list-amount-schema'; +export { default as votingInfoResponseSchema } from './voting-info-schema'; +export { default as testIncrementorSchema } from './test-incrementor-schema'; diff --git a/src/services/Indexer/schemas/list-pool-schema.ts b/src/services/Indexer/schemas/list-pool-schema.ts new file mode 100644 index 0000000..7d87dfa --- /dev/null +++ b/src/services/Indexer/schemas/list-pool-schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; +import infoSchema from './info-schema'; +import { listPoolV2Schema } from './list-pool-v2-response-schema'; +import { listPoolV3Schema } from './list-pool-v3-response-schema'; + +const listPoolResponseSchema = z.object({ + result: z.array(listPoolV2Schema.or(listPoolV3Schema)), + info: infoSchema, +}); + +export default listPoolResponseSchema; diff --git a/src/services/Indexer/schemas/list-pool-v2-response-schema.ts b/src/services/Indexer/schemas/list-pool-v2-response-schema.ts new file mode 100644 index 0000000..8d128db --- /dev/null +++ b/src/services/Indexer/schemas/list-pool-v2-response-schema.ts @@ -0,0 +1,62 @@ +import { z } from 'zod'; +import { evmAddressSchema } from './util-schemas.js'; +import basicPoolInfo from './basic-pool-info-schema.js'; +import infoSchema from './info-schema.js'; + +export const listPoolV2Schema = z.object({ + pair: z.string(), + token0: z.string().nonempty(), + token1: z.string().nonempty(), + name: z.string(), + name0: z.string(), + name1: z.string(), + token0Address: evmAddressSchema, + token1Address: evmAddressSchema, + token0Decimals: z.number().int().nonnegative().max(18), + token1Decimals: z.number().int().nonnegative().max(18), + WETH9: evmAddressSchema, + farmAddress: z.string(), + weight: z.number(), + liquidity0: z.number(), + liquidity1: z.number(), + token0Price: z.number(), + token1Price: z.number(), + totalLPSupply: z.number(), + totalLPStake: z.number(), + totalLPStakeInUSD: z.number(), + userLPStaked: z.number(), + userLPStakedInUSD: z.number(), + lpPriceInUSD: z.number(), + lpPriceInORN: z.number(), + userReward: z.number(), + weeklyReward: z.number(), + userAPR: z.number(), + lockMaxMultiplier: z.number(), + veornMaxMultiplier: z.number(), + veornBoostScaleFactor: z.number(), + lockTimeForMaxMultiplier: z.number(), + userBoost: z.number(), + userTimeDeposit: z.number(), + userLockTimeStart: z.number(), + userLockTimePeriod: z.number(), + userVeORN: z.number(), + userORN: z.number(), + userRewardToPool: z.number(), + boostTotalVeORN: z.number(), + boostCurrentPoolReward: z.number(), + boostTotalLiquidity: z.number(), + boostCurrentLiquidity: z.number(), + boostCurrentVeORN: z.number(), + boostTotalReward: z.number(), + + ...basicPoolInfo.shape, + + type: z.string().nonempty(), +}); + +const listPoolV2ResponseSchema = z.object({ + result: z.array(listPoolV2Schema), + info: infoSchema, +}); + +export default listPoolV2ResponseSchema; diff --git a/src/services/Indexer/schemas/list-pool-response-schema.ts b/src/services/Indexer/schemas/list-pool-v3-response-schema.ts similarity index 59% rename from src/services/Indexer/schemas/list-pool-response-schema.ts rename to src/services/Indexer/schemas/list-pool-v3-response-schema.ts index 2e19738..461ecd7 100644 --- a/src/services/Indexer/schemas/list-pool-response-schema.ts +++ b/src/services/Indexer/schemas/list-pool-v3-response-schema.ts @@ -3,24 +3,30 @@ import { evmAddressSchema } from './util-schemas.js'; import basicPoolInfo from './basic-pool-info-schema.js'; import infoSchema from './info-schema.js'; -const poolOfListPoolSchema = z.object({ +export const listPoolV3Schema = z.object({ token0: z.string().nonempty(), token1: z.string().nonempty(), + name: z.string(), + name0: z.string(), + name1: z.string(), token0Address: evmAddressSchema, token1Address: evmAddressSchema, - token0Decimals: z.number().int().nonnegative().max(18), token1Decimals: z.number().int().nonnegative().max(18), WETH9: evmAddressSchema, + poolFee: z.number(), + weeklyReward: z.number(), + weight: z.number(), + totalLPStakeInUSD: z.number(), ...basicPoolInfo.shape, - type: z.string().nonempty(), + type: z.literal('v3'), }); -const listPoolResponseSchema = z.object({ - result: z.array(poolOfListPoolSchema), +const listPoolV3ResponseSchema = z.object({ + result: z.array(listPoolV3Schema), info: infoSchema, }); -export default listPoolResponseSchema; +export default listPoolV3ResponseSchema; diff --git a/src/services/Indexer/schemas/pool-v2-info-schema.ts b/src/services/Indexer/schemas/pool-v2-info-schema.ts new file mode 100644 index 0000000..94c8d59 --- /dev/null +++ b/src/services/Indexer/schemas/pool-v2-info-schema.ts @@ -0,0 +1,63 @@ +import { z } from 'zod'; +import { evmAddressSchema } from './util-schemas.js'; +import basicPoolInfo from './basic-pool-info-schema'; +import infoSchema from './info-schema.js'; + +const poolInfoSchema = z.object({ + pair: z.string(), + name: z.string(), + token0: z.string(), + token1: z.string(), + name0: z.string(), + name1: z.string(), + token0Address: evmAddressSchema, + token1Address: evmAddressSchema, + token0Decimals: z.number().int().nonnegative().max(18), + token1Decimals: z.number().int().nonnegative().max(18), + WETH9: z.string(), + farmAddress: z.string(), + weight: z.number(), + liquidity0: z.number(), + liquidity1: z.number(), + token0Price: z.number(), + token1Price: z.number(), + userLPBalance: z.number(), + totalLPSupply: z.number(), + totalLPStake: z.number(), + totalLPStakeInUSD: z.number(), + userLPStaked: z.number(), + userLPStakedInUSD: z.number(), + lpPriceInUSD: z.number(), + lpPriceInORN: z.number(), + userReward: z.number(), + userWeeklyReward: z.number(), + userRewardToPool: z.number(), + weeklyReward: z.number(), + userAPR: z.number(), + lockMaxMultiplier: z.number(), + veornMaxMultiplier: z.number(), + veornBoostScaleFactor: z.number(), + lockTimeForMaxMultiplier: z.number(), + userBoost: z.number(), + userTimeDeposit: z.number(), + userLockTimeStart: z.number(), + userLockTimePeriod: z.number(), + userVeORN: z.number(), + userORN: z.number(), + boostTotalVeORN: z.number(), + boostCurrentPoolReward: z.number(), + boostTotalLiquidity: z.number(), + boostCurrentLiquidity: z.number(), + boostCurrentVeORN: z.number(), + boostTotalReward: z.number(), + type: z.literal('v2'), + + ...basicPoolInfo.shape, +}); + +const PoolV2InfoResponseSchema = z.object({ + result: poolInfoSchema, + info: infoSchema, +}); + +export default PoolV2InfoResponseSchema; diff --git a/src/services/Indexer/schemas/veORN-info-schema.ts b/src/services/Indexer/schemas/veORN-info-schema.ts index 1e05026..5c4d018 100644 --- a/src/services/Indexer/schemas/veORN-info-schema.ts +++ b/src/services/Indexer/schemas/veORN-info-schema.ts @@ -15,7 +15,8 @@ const veORNResultSchema = z.object({ userORNLocked: z.number(), userLockEndDate: z.number(), userReward: z.number(), - userWeeklyReward: z.number() + userWeeklyReward: z.number(), + userMinLockPeriod: z.number(), }); const veORNInfoSchema = z.object({ diff --git a/src/services/Indexer/schemas/voting-info-schema.ts b/src/services/Indexer/schemas/voting-info-schema.ts index 5ea18f5..5373386 100644 --- a/src/services/Indexer/schemas/voting-info-schema.ts +++ b/src/services/Indexer/schemas/voting-info-schema.ts @@ -12,6 +12,7 @@ const poolSchema = z.object({ name0: z.string(), name1: z.string(), poolFee: z.number(), + userWeight: z.number(), weight: z.number(), }); From a8c60271e5d30ce9ae0a02b88d7f2e76942023d1 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 14 Nov 2023 12:36:53 +0300 Subject: [PATCH 128/225] bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3d481ff..1771016 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.10-rc31", + "version": "0.20.19", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.10-rc31", + "version": "0.20.19", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 63c049a..2aee5e1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.10-rc31", + "version": "0.20.19", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 186c29342ba91562fdb39332d78995a9d1b8b914 Mon Sep 17 00:00:00 2001 From: Dmitry <35160421+TheJuze@users.noreply.github.com> Date: Wed, 15 Nov 2023 13:13:41 +0300 Subject: [PATCH 129/225] governance improvements (#209) --- package-lock.json | 4 +-- package.json | 2 +- src/services/BlockchainService/index.ts | 32 ------------------- .../schemas/governanceChainsInfoSchema.ts | 7 ---- .../schemas/governanceContractsSchema.ts | 19 ----------- .../schemas/governancePoolSchema.ts | 18 ----------- .../schemas/governancePoolsSchema.ts | 28 ---------------- .../BlockchainService/schemas/index.ts | 4 --- .../schemas/environment-response-schema.ts | 8 ++--- .../schemas/list-pool-v2-response-schema.ts | 2 +- 10 files changed, 8 insertions(+), 116 deletions(-) delete mode 100644 src/services/BlockchainService/schemas/governanceChainsInfoSchema.ts delete mode 100644 src/services/BlockchainService/schemas/governanceContractsSchema.ts delete mode 100644 src/services/BlockchainService/schemas/governancePoolSchema.ts delete mode 100644 src/services/BlockchainService/schemas/governancePoolsSchema.ts diff --git a/package-lock.json b/package-lock.json index 1771016..8034f64 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.19", + "version": "0.20.20-rc1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.19", + "version": "0.20.20-rc1", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 2aee5e1..2596a92 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.19", + "version": "0.20.20-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/BlockchainService/index.ts b/src/services/BlockchainService/index.ts index 3833cf9..1279e92 100644 --- a/src/services/BlockchainService/index.ts +++ b/src/services/BlockchainService/index.ts @@ -10,10 +10,6 @@ import { userEarnedSchema, type PairStatusEnum, pairStatusSchema, - governanceContractsSchema, - governancePoolsSchema, - governancePoolSchema, - governanceChainsInfoSchema, pricesWithQuoteAssetSchema, } from './schemas/index.js'; import type redeemOrderSchema from '../Aggregator/schemas/redeemOrderSchema.js'; @@ -113,10 +109,6 @@ class BlockchainService { this.getBlockNumber = this.getBlockNumber.bind(this); this.getRedeemOrderBySecretHash = this.getRedeemOrderBySecretHash.bind(this); this.claimOrder = this.claimOrder.bind(this); - this.getGovernanceContracts = this.getGovernanceContracts.bind(this); - this.getGovernancePools = this.getGovernancePools.bind(this); - this.getGovernancePool = this.getGovernancePool.bind(this); - this.getGovernanceChainsInfo = this.getGovernanceChainsInfo.bind(this); } get basicAuthHeaders() { @@ -484,30 +476,6 @@ class BlockchainService { body: JSON.stringify(secretHashes), }, ); - - getGovernanceContracts = () => fetchWithValidation( - `${this.apiUrl}/api/governance/info`, - governanceContractsSchema, - { headers: this.basicAuthHeaders }, - ); - - getGovernancePools = () => fetchWithValidation( - `${this.apiUrl}/api/governance/pools`, - governancePoolsSchema, - { headers: this.basicAuthHeaders }, - ); - - getGovernancePool = (address: string) => fetchWithValidation( - `${this.apiUrl}/api/governance/pools/${address}`, - governancePoolSchema, - { headers: this.basicAuthHeaders }, - ); - - getGovernanceChainsInfo = () => fetchWithValidation( - `${this.apiUrl}/api/governance/chains-info`, - governanceChainsInfoSchema, - { headers: this.basicAuthHeaders }, - ); } export * as schemas from './schemas/index.js'; diff --git a/src/services/BlockchainService/schemas/governanceChainsInfoSchema.ts b/src/services/BlockchainService/schemas/governanceChainsInfoSchema.ts deleted file mode 100644 index 7a1b8b8..0000000 --- a/src/services/BlockchainService/schemas/governanceChainsInfoSchema.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { z } from 'zod'; - -const governanceChainsInfoSchema = z.object({ - isChainSupported: z.boolean(), -}); - -export default governanceChainsInfoSchema; diff --git a/src/services/BlockchainService/schemas/governanceContractsSchema.ts b/src/services/BlockchainService/schemas/governanceContractsSchema.ts deleted file mode 100644 index 9934b4d..0000000 --- a/src/services/BlockchainService/schemas/governanceContractsSchema.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { z } from 'zod'; - -const governanceContractsSchema = z.object({ - controllerAddress: z.string(), - veTOKENAddress: z.string(), - veTOKENYieldDistributorV4Address: z.string(), - time_total: z.string(), - absolute_ve_token_in_voting: z.string(), - info: z.record( - z.string(), - z.object({ - gaugeAddress: z.string(), - gaugeType: z.number(), - gaugeName: z.string(), - }) - ), -}); - -export default governanceContractsSchema; diff --git a/src/services/BlockchainService/schemas/governancePoolSchema.ts b/src/services/BlockchainService/schemas/governancePoolSchema.ts deleted file mode 100644 index dd613b6..0000000 --- a/src/services/BlockchainService/schemas/governancePoolSchema.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { z } from 'zod'; - -const governancePoolSchema = z.object({ - min_apr: z.string(), - max_apr: z.string(), - tvl: z.string(), - lp_supply: z.string(), - lp_staked: z.string(), - lp_staked_with_boost: z.string(), - lp_price_in_usd: z.string(), - reward_per_period: z.string(), - lock_time_for_max_multiplier: z.string(), - lock_max_multiplier: z.string(), - veorn_max_multiplier: z.string(), - veorn_boost_scale_factor: z.string(), -}); - -export default governancePoolSchema; diff --git a/src/services/BlockchainService/schemas/governancePoolsSchema.ts b/src/services/BlockchainService/schemas/governancePoolsSchema.ts deleted file mode 100644 index 8b3bcb3..0000000 --- a/src/services/BlockchainService/schemas/governancePoolsSchema.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { z } from 'zod'; - -const governancePoolsSchema = z.array( - z.object({ - slug: z.string(), - identifier: z.string(), - chain: z.string(), - platform: z.string(), - logo: z.string(), - pair: z.string(), - lp_address: z.string(), - lp_staked: z.string(), - lp_staked_with_boost: z.string(), - lp_supply: z.string(), - lp_price_in_usd: z.string(), - farm_address: z.string(), - pool_tokens: z.tuple([z.string(), z.string()]), - pool_rewards: z.array(z.string()), - tvl: z.string(), - min_apr: z.string(), - max_apr: z.string(), - reward_per_period: z.array(z.string()), - weight: z.string(), - liquidity: z.string(), - }) -); - -export default governancePoolsSchema; diff --git a/src/services/BlockchainService/schemas/index.ts b/src/services/BlockchainService/schemas/index.ts index 80b82f3..2abb10d 100644 --- a/src/services/BlockchainService/schemas/index.ts +++ b/src/services/BlockchainService/schemas/index.ts @@ -12,9 +12,5 @@ export { default as atomicSummarySchema } from './atomicSummarySchema.js'; export { default as poolsLpAndStakedSchema } from './poolsLpAndStakedSchema.js'; export { default as userVotesSchema } from './userVotesSchema.js'; export { default as userEarnedSchema } from './userEarnedSchema.js'; -export { default as governanceContractsSchema } from './governanceContractsSchema.js'; -export { default as governancePoolsSchema } from './governancePoolsSchema.js'; -export { default as governancePoolSchema } from './governancePoolSchema.js'; -export { default as governanceChainsInfoSchema } from './governanceChainsInfoSchema.js'; export { default as poolsV3InfoSchema } from './poolsV3InfoSchema.js'; export { pricesWithQuoteAssetSchema } from './pricesWithQuoteAssetSchema.js'; diff --git a/src/services/Indexer/schemas/environment-response-schema.ts b/src/services/Indexer/schemas/environment-response-schema.ts index 3f79130..80984b5 100644 --- a/src/services/Indexer/schemas/environment-response-schema.ts +++ b/src/services/Indexer/schemas/environment-response-schema.ts @@ -6,11 +6,11 @@ const environmentResponseSchema = z.object({ result: z.object({ chainId: z.number().int().nonnegative(), nativeToken: z.string(), - OrionV3Factory: evmAddressSchema, + OrionV3Factory: evmAddressSchema.optional(), OrionV2Factory: evmAddressSchema, - OrionV3NFTManager: evmAddressSchema, - SwapRouterV3: evmAddressSchema, - OrionFarmV3: evmAddressSchema, + OrionV3NFTManager: evmAddressSchema.optional(), + SwapRouterV3: evmAddressSchema.optional(), + OrionFarmV3: evmAddressSchema.optional(), OrionFarmV2: evmAddressSchema, OrionVoting: evmAddressSchema, veORN: evmAddressSchema, diff --git a/src/services/Indexer/schemas/list-pool-v2-response-schema.ts b/src/services/Indexer/schemas/list-pool-v2-response-schema.ts index 8d128db..0d96314 100644 --- a/src/services/Indexer/schemas/list-pool-v2-response-schema.ts +++ b/src/services/Indexer/schemas/list-pool-v2-response-schema.ts @@ -15,7 +15,7 @@ export const listPoolV2Schema = z.object({ token0Decimals: z.number().int().nonnegative().max(18), token1Decimals: z.number().int().nonnegative().max(18), WETH9: evmAddressSchema, - farmAddress: z.string(), + farmAddress: z.string().optional(), weight: z.number(), liquidity0: z.number(), liquidity1: z.number(), From cb8b94b8eee23079fdbbb0bdf99ccdba7bb3d705 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 15 Nov 2023 13:15:33 +0300 Subject: [PATCH 130/225] bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8034f64..aa9feb5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.20-rc1", + "version": "0.20.21", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.20-rc1", + "version": "0.20.21", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 2596a92..4fde2da 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.20-rc1", + "version": "0.20.21", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 30512d750083a12813741af297320edb0d3658bd Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 15 Nov 2023 13:20:07 +0300 Subject: [PATCH 131/225] bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index aa9feb5..22d758c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.21", + "version": "0.20.20", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.21", + "version": "0.20.20", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 4fde2da..c844efb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.21", + "version": "0.20.20", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 093c57ccdcc2398330f8e23383eb7b3f98ce47cd Mon Sep 17 00:00:00 2001 From: Dmitry <35160421+TheJuze@users.noreply.github.com> Date: Wed, 15 Nov 2023 14:03:46 +0300 Subject: [PATCH 132/225] return governance schemas (#210) --- package.json | 2 +- src/services/BlockchainService/index.ts | 45 ++++++++++++++++--- .../schemas/governanceChainsInfoSchema.ts | 7 +++ .../schemas/governanceContractsSchema.ts | 19 ++++++++ .../schemas/governancePoolSchema.ts | 18 ++++++++ .../schemas/governancePoolsSchema.ts | 28 ++++++++++++ .../BlockchainService/schemas/index.ts | 4 ++ 7 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 src/services/BlockchainService/schemas/governanceChainsInfoSchema.ts create mode 100644 src/services/BlockchainService/schemas/governanceContractsSchema.ts create mode 100644 src/services/BlockchainService/schemas/governancePoolSchema.ts create mode 100644 src/services/BlockchainService/schemas/governancePoolsSchema.ts diff --git a/package.json b/package.json index c844efb..f3d3421 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.20", + "version": "0.20.21-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/BlockchainService/index.ts b/src/services/BlockchainService/index.ts index 1279e92..3056b93 100644 --- a/src/services/BlockchainService/index.ts +++ b/src/services/BlockchainService/index.ts @@ -18,6 +18,12 @@ import { makePartial } from '../../utils'; import type { networkCodes } from '../../constants/index.js'; import { fetchWithValidation } from 'simple-typed-fetch'; import type { BasicAuthCredentials } from '../../types.js'; +import { + governanceChainsInfoSchema, + governanceContractsSchema, + governancePoolSchema, + governancePoolsSchema +} from './schemas'; type IAdminAuthHeaders = { auth: string @@ -62,6 +68,7 @@ type PlatformFees = { walletAddress?: string | undefined fromWidget?: string | undefined } + class BlockchainService { private readonly apiUrl: string; @@ -109,6 +116,10 @@ class BlockchainService { this.getBlockNumber = this.getBlockNumber.bind(this); this.getRedeemOrderBySecretHash = this.getRedeemOrderBySecretHash.bind(this); this.claimOrder = this.claimOrder.bind(this); + this.getGovernanceContracts = this.getGovernanceContracts.bind(this); + this.getGovernancePools = this.getGovernancePools.bind(this); + this.getGovernancePool = this.getGovernancePool.bind(this); + this.getGovernanceChainsInfo = this.getGovernanceChainsInfo.bind(this); } get basicAuthHeaders() { @@ -222,8 +233,8 @@ class BlockchainService { ); /** - * @deprecated In favor of getPlatformFees - */ + * @deprecated In favor of getPlatformFees + */ getTokensFee = () => fetchWithValidation( `${this.apiUrl}/api/tokensFee`, z.record(z.string()).transform(makePartial), @@ -420,9 +431,9 @@ class BlockchainService { ); /** - * Sender is user address in source BlockchainService instance \ - * Receiver is user address in target BlockchainService instance - */ + * Sender is user address in source BlockchainService instance \ + * Receiver is user address in target BlockchainService instance + */ getAtomicSwapHistory = (query: AtomicSwapHistorySourceQuery | AtomicSwapHistoryTargetQuery) => { const url = new URL(`${this.apiUrl}/api/atomic/history/`); @@ -476,6 +487,30 @@ class BlockchainService { body: JSON.stringify(secretHashes), }, ); + + getGovernanceContracts = () => fetchWithValidation( + `${this.apiUrl}/api/governance/info`, + governanceContractsSchema, + { headers: this.basicAuthHeaders }, + ); + + getGovernancePools = () => fetchWithValidation( + `${this.apiUrl}/api/governance/pools`, + governancePoolsSchema, + { headers: this.basicAuthHeaders }, + ); + + getGovernancePool = (address: string) => fetchWithValidation( + `${this.apiUrl}/api/governance/pools/${address}`, + governancePoolSchema, + { headers: this.basicAuthHeaders }, + ); + + getGovernanceChainsInfo = () => fetchWithValidation( + `${this.apiUrl}/api/governance/chains-info`, + governanceChainsInfoSchema, + { headers: this.basicAuthHeaders }, + ); } export * as schemas from './schemas/index.js'; diff --git a/src/services/BlockchainService/schemas/governanceChainsInfoSchema.ts b/src/services/BlockchainService/schemas/governanceChainsInfoSchema.ts new file mode 100644 index 0000000..7a1b8b8 --- /dev/null +++ b/src/services/BlockchainService/schemas/governanceChainsInfoSchema.ts @@ -0,0 +1,7 @@ +import { z } from 'zod'; + +const governanceChainsInfoSchema = z.object({ + isChainSupported: z.boolean(), +}); + +export default governanceChainsInfoSchema; diff --git a/src/services/BlockchainService/schemas/governanceContractsSchema.ts b/src/services/BlockchainService/schemas/governanceContractsSchema.ts new file mode 100644 index 0000000..9934b4d --- /dev/null +++ b/src/services/BlockchainService/schemas/governanceContractsSchema.ts @@ -0,0 +1,19 @@ +import { z } from 'zod'; + +const governanceContractsSchema = z.object({ + controllerAddress: z.string(), + veTOKENAddress: z.string(), + veTOKENYieldDistributorV4Address: z.string(), + time_total: z.string(), + absolute_ve_token_in_voting: z.string(), + info: z.record( + z.string(), + z.object({ + gaugeAddress: z.string(), + gaugeType: z.number(), + gaugeName: z.string(), + }) + ), +}); + +export default governanceContractsSchema; diff --git a/src/services/BlockchainService/schemas/governancePoolSchema.ts b/src/services/BlockchainService/schemas/governancePoolSchema.ts new file mode 100644 index 0000000..dd613b6 --- /dev/null +++ b/src/services/BlockchainService/schemas/governancePoolSchema.ts @@ -0,0 +1,18 @@ +import { z } from 'zod'; + +const governancePoolSchema = z.object({ + min_apr: z.string(), + max_apr: z.string(), + tvl: z.string(), + lp_supply: z.string(), + lp_staked: z.string(), + lp_staked_with_boost: z.string(), + lp_price_in_usd: z.string(), + reward_per_period: z.string(), + lock_time_for_max_multiplier: z.string(), + lock_max_multiplier: z.string(), + veorn_max_multiplier: z.string(), + veorn_boost_scale_factor: z.string(), +}); + +export default governancePoolSchema; diff --git a/src/services/BlockchainService/schemas/governancePoolsSchema.ts b/src/services/BlockchainService/schemas/governancePoolsSchema.ts new file mode 100644 index 0000000..8b3bcb3 --- /dev/null +++ b/src/services/BlockchainService/schemas/governancePoolsSchema.ts @@ -0,0 +1,28 @@ +import { z } from 'zod'; + +const governancePoolsSchema = z.array( + z.object({ + slug: z.string(), + identifier: z.string(), + chain: z.string(), + platform: z.string(), + logo: z.string(), + pair: z.string(), + lp_address: z.string(), + lp_staked: z.string(), + lp_staked_with_boost: z.string(), + lp_supply: z.string(), + lp_price_in_usd: z.string(), + farm_address: z.string(), + pool_tokens: z.tuple([z.string(), z.string()]), + pool_rewards: z.array(z.string()), + tvl: z.string(), + min_apr: z.string(), + max_apr: z.string(), + reward_per_period: z.array(z.string()), + weight: z.string(), + liquidity: z.string(), + }) +); + +export default governancePoolsSchema; diff --git a/src/services/BlockchainService/schemas/index.ts b/src/services/BlockchainService/schemas/index.ts index 2abb10d..80b82f3 100644 --- a/src/services/BlockchainService/schemas/index.ts +++ b/src/services/BlockchainService/schemas/index.ts @@ -12,5 +12,9 @@ export { default as atomicSummarySchema } from './atomicSummarySchema.js'; export { default as poolsLpAndStakedSchema } from './poolsLpAndStakedSchema.js'; export { default as userVotesSchema } from './userVotesSchema.js'; export { default as userEarnedSchema } from './userEarnedSchema.js'; +export { default as governanceContractsSchema } from './governanceContractsSchema.js'; +export { default as governancePoolsSchema } from './governancePoolsSchema.js'; +export { default as governancePoolSchema } from './governancePoolSchema.js'; +export { default as governanceChainsInfoSchema } from './governanceChainsInfoSchema.js'; export { default as poolsV3InfoSchema } from './poolsV3InfoSchema.js'; export { pricesWithQuoteAssetSchema } from './pricesWithQuoteAssetSchema.js'; From 501fac94e6d816619afa0f5bd953f188d0bc7145 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 15 Nov 2023 14:04:38 +0300 Subject: [PATCH 133/225] bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 22d758c..aa9feb5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.20", + "version": "0.20.21", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.20", + "version": "0.20.21", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index f3d3421..4fde2da 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.21-rc0", + "version": "0.20.21", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From e5ec15a87a7b49aa284d0217ee772fa3f2a64d80 Mon Sep 17 00:00:00 2001 From: Dmitry <35160421+TheJuze@users.noreply.github.com> Date: Thu, 16 Nov 2023 10:40:16 +0300 Subject: [PATCH 134/225] feat: governance improvements (#211) --- package-lock.json | 4 +-- package.json | 2 +- src/services/BlockchainService/index.ts | 34 ------------------- .../schemas/governanceChainsInfoSchema.ts | 7 ---- .../schemas/governanceContractsSchema.ts | 19 ----------- .../schemas/governancePoolSchema.ts | 18 ---------- .../schemas/governancePoolsSchema.ts | 28 --------------- .../BlockchainService/schemas/index.ts | 4 --- src/services/Indexer/index.ts | 2 +- .../schemas/environment-response-schema.ts | 12 +++---- .../Indexer/schemas/pool-v2-info-schema.ts | 2 +- 11 files changed, 11 insertions(+), 121 deletions(-) delete mode 100644 src/services/BlockchainService/schemas/governanceChainsInfoSchema.ts delete mode 100644 src/services/BlockchainService/schemas/governanceContractsSchema.ts delete mode 100644 src/services/BlockchainService/schemas/governancePoolSchema.ts delete mode 100644 src/services/BlockchainService/schemas/governancePoolsSchema.ts diff --git a/package-lock.json b/package-lock.json index aa9feb5..4d06cb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.21", + "version": "0.20.22-rc3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.21", + "version": "0.20.22-rc3", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 4fde2da..4abb0e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.21", + "version": "0.20.22-rc3", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/BlockchainService/index.ts b/src/services/BlockchainService/index.ts index 3056b93..eebec2f 100644 --- a/src/services/BlockchainService/index.ts +++ b/src/services/BlockchainService/index.ts @@ -18,12 +18,6 @@ import { makePartial } from '../../utils'; import type { networkCodes } from '../../constants/index.js'; import { fetchWithValidation } from 'simple-typed-fetch'; import type { BasicAuthCredentials } from '../../types.js'; -import { - governanceChainsInfoSchema, - governanceContractsSchema, - governancePoolSchema, - governancePoolsSchema -} from './schemas'; type IAdminAuthHeaders = { auth: string @@ -116,10 +110,6 @@ class BlockchainService { this.getBlockNumber = this.getBlockNumber.bind(this); this.getRedeemOrderBySecretHash = this.getRedeemOrderBySecretHash.bind(this); this.claimOrder = this.claimOrder.bind(this); - this.getGovernanceContracts = this.getGovernanceContracts.bind(this); - this.getGovernancePools = this.getGovernancePools.bind(this); - this.getGovernancePool = this.getGovernancePool.bind(this); - this.getGovernanceChainsInfo = this.getGovernanceChainsInfo.bind(this); } get basicAuthHeaders() { @@ -487,30 +477,6 @@ class BlockchainService { body: JSON.stringify(secretHashes), }, ); - - getGovernanceContracts = () => fetchWithValidation( - `${this.apiUrl}/api/governance/info`, - governanceContractsSchema, - { headers: this.basicAuthHeaders }, - ); - - getGovernancePools = () => fetchWithValidation( - `${this.apiUrl}/api/governance/pools`, - governancePoolsSchema, - { headers: this.basicAuthHeaders }, - ); - - getGovernancePool = (address: string) => fetchWithValidation( - `${this.apiUrl}/api/governance/pools/${address}`, - governancePoolSchema, - { headers: this.basicAuthHeaders }, - ); - - getGovernanceChainsInfo = () => fetchWithValidation( - `${this.apiUrl}/api/governance/chains-info`, - governanceChainsInfoSchema, - { headers: this.basicAuthHeaders }, - ); } export * as schemas from './schemas/index.js'; diff --git a/src/services/BlockchainService/schemas/governanceChainsInfoSchema.ts b/src/services/BlockchainService/schemas/governanceChainsInfoSchema.ts deleted file mode 100644 index 7a1b8b8..0000000 --- a/src/services/BlockchainService/schemas/governanceChainsInfoSchema.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { z } from 'zod'; - -const governanceChainsInfoSchema = z.object({ - isChainSupported: z.boolean(), -}); - -export default governanceChainsInfoSchema; diff --git a/src/services/BlockchainService/schemas/governanceContractsSchema.ts b/src/services/BlockchainService/schemas/governanceContractsSchema.ts deleted file mode 100644 index 9934b4d..0000000 --- a/src/services/BlockchainService/schemas/governanceContractsSchema.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { z } from 'zod'; - -const governanceContractsSchema = z.object({ - controllerAddress: z.string(), - veTOKENAddress: z.string(), - veTOKENYieldDistributorV4Address: z.string(), - time_total: z.string(), - absolute_ve_token_in_voting: z.string(), - info: z.record( - z.string(), - z.object({ - gaugeAddress: z.string(), - gaugeType: z.number(), - gaugeName: z.string(), - }) - ), -}); - -export default governanceContractsSchema; diff --git a/src/services/BlockchainService/schemas/governancePoolSchema.ts b/src/services/BlockchainService/schemas/governancePoolSchema.ts deleted file mode 100644 index dd613b6..0000000 --- a/src/services/BlockchainService/schemas/governancePoolSchema.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { z } from 'zod'; - -const governancePoolSchema = z.object({ - min_apr: z.string(), - max_apr: z.string(), - tvl: z.string(), - lp_supply: z.string(), - lp_staked: z.string(), - lp_staked_with_boost: z.string(), - lp_price_in_usd: z.string(), - reward_per_period: z.string(), - lock_time_for_max_multiplier: z.string(), - lock_max_multiplier: z.string(), - veorn_max_multiplier: z.string(), - veorn_boost_scale_factor: z.string(), -}); - -export default governancePoolSchema; diff --git a/src/services/BlockchainService/schemas/governancePoolsSchema.ts b/src/services/BlockchainService/schemas/governancePoolsSchema.ts deleted file mode 100644 index 8b3bcb3..0000000 --- a/src/services/BlockchainService/schemas/governancePoolsSchema.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { z } from 'zod'; - -const governancePoolsSchema = z.array( - z.object({ - slug: z.string(), - identifier: z.string(), - chain: z.string(), - platform: z.string(), - logo: z.string(), - pair: z.string(), - lp_address: z.string(), - lp_staked: z.string(), - lp_staked_with_boost: z.string(), - lp_supply: z.string(), - lp_price_in_usd: z.string(), - farm_address: z.string(), - pool_tokens: z.tuple([z.string(), z.string()]), - pool_rewards: z.array(z.string()), - tvl: z.string(), - min_apr: z.string(), - max_apr: z.string(), - reward_per_period: z.array(z.string()), - weight: z.string(), - liquidity: z.string(), - }) -); - -export default governancePoolsSchema; diff --git a/src/services/BlockchainService/schemas/index.ts b/src/services/BlockchainService/schemas/index.ts index 80b82f3..2abb10d 100644 --- a/src/services/BlockchainService/schemas/index.ts +++ b/src/services/BlockchainService/schemas/index.ts @@ -12,9 +12,5 @@ export { default as atomicSummarySchema } from './atomicSummarySchema.js'; export { default as poolsLpAndStakedSchema } from './poolsLpAndStakedSchema.js'; export { default as userVotesSchema } from './userVotesSchema.js'; export { default as userEarnedSchema } from './userEarnedSchema.js'; -export { default as governanceContractsSchema } from './governanceContractsSchema.js'; -export { default as governancePoolsSchema } from './governancePoolsSchema.js'; -export { default as governancePoolSchema } from './governancePoolSchema.js'; -export { default as governanceChainsInfoSchema } from './governanceChainsInfoSchema.js'; export { default as poolsV3InfoSchema } from './poolsV3InfoSchema.js'; export { pricesWithQuoteAssetSchema } from './pricesWithQuoteAssetSchema.js'; diff --git a/src/services/Indexer/index.ts b/src/services/Indexer/index.ts index 13f0b66..bcdfaca 100644 --- a/src/services/Indexer/index.ts +++ b/src/services/Indexer/index.ts @@ -208,7 +208,7 @@ class IndexerService { }); }; - readonly poolV2Info = (token0: string, token1: string, address: string) => { + readonly poolV2Info = (token0: string, token1: string, address: string | undefined) => { return fetchWithValidation(this.apiUrl, PoolV2InfoResponseSchema, { method: 'POST', body: this.makeRPCPayload({ diff --git a/src/services/Indexer/schemas/environment-response-schema.ts b/src/services/Indexer/schemas/environment-response-schema.ts index 80984b5..8479e05 100644 --- a/src/services/Indexer/schemas/environment-response-schema.ts +++ b/src/services/Indexer/schemas/environment-response-schema.ts @@ -6,16 +6,16 @@ const environmentResponseSchema = z.object({ result: z.object({ chainId: z.number().int().nonnegative(), nativeToken: z.string(), + ORN: evmAddressSchema, + WETH9: evmAddressSchema, OrionV3Factory: evmAddressSchema.optional(), - OrionV2Factory: evmAddressSchema, + OrionV2Factory: evmAddressSchema.optional(), OrionV3NFTManager: evmAddressSchema.optional(), SwapRouterV3: evmAddressSchema.optional(), OrionFarmV3: evmAddressSchema.optional(), - OrionFarmV2: evmAddressSchema, - OrionVoting: evmAddressSchema, - veORN: evmAddressSchema, - ORN: evmAddressSchema, - WETH9: evmAddressSchema, + OrionFarmV2: evmAddressSchema.optional(), + OrionVoting: evmAddressSchema.optional(), + veORN: evmAddressSchema.optional(), }), info: infoSchema, }); diff --git a/src/services/Indexer/schemas/pool-v2-info-schema.ts b/src/services/Indexer/schemas/pool-v2-info-schema.ts index 94c8d59..d5a369e 100644 --- a/src/services/Indexer/schemas/pool-v2-info-schema.ts +++ b/src/services/Indexer/schemas/pool-v2-info-schema.ts @@ -15,7 +15,7 @@ const poolInfoSchema = z.object({ token0Decimals: z.number().int().nonnegative().max(18), token1Decimals: z.number().int().nonnegative().max(18), WETH9: z.string(), - farmAddress: z.string(), + farmAddress: z.string().optional(), weight: z.number(), liquidity0: z.number(), liquidity1: z.number(), From 2600688017931cdd6f8116b3db39ca7d9a3d447e Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 16 Nov 2023 10:41:21 +0300 Subject: [PATCH 135/225] bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4d06cb4..46493bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.22-rc3", + "version": "0.20.22", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.22-rc3", + "version": "0.20.22", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 4abb0e6..76f3ce0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.22-rc3", + "version": "0.20.22", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From d38d8bd7153c869ca83bc8427f95bbcd152393b7 Mon Sep 17 00:00:00 2001 From: Dmitry <35160421+TheJuze@users.noreply.github.com> Date: Mon, 27 Nov 2023 15:56:34 +0300 Subject: [PATCH 136/225] OP-4758: fix generateSwapCallData (#214) --- package-lock.json | 42 ++++++++- package.json | 4 +- src/Unit/Exchange/generateSwapCalldata.ts | 108 +++++++++++----------- src/utils/safeGetters.ts | 20 ++-- 4 files changed, 108 insertions(+), 66 deletions(-) diff --git a/package-lock.json b/package-lock.json index 46493bf..c31e7e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.22", + "version": "0.20.23-rc1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.22", + "version": "0.20.23-rc1", "hasInstallScript": true, "license": "ISC", "dependencies": { @@ -14,6 +14,7 @@ "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", "@orionprotocol/contracts": "1.22.3", + "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", "buffer": "^6.0.3", @@ -21,6 +22,7 @@ "express": "^4.18.2", "isomorphic-ws": "^5.0.0", "just-clone": "^6.2.0", + "lodash.clonedeep": "^4.5.0", "merge-anything": "^5.1.7", "neverthrow": "^6.0.0", "patch-package": "^8.0.0", @@ -2651,6 +2653,19 @@ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" + }, + "node_modules/@types/lodash.clonedeep": { + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.9.tgz", + "integrity": "sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==", + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -8787,6 +8802,11 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -13692,6 +13712,19 @@ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, + "@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" + }, + "@types/lodash.clonedeep": { + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.9.tgz", + "integrity": "sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==", + "requires": { + "@types/lodash": "*" + } + }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -18165,6 +18198,11 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", diff --git a/package.json b/package.json index 76f3ce0..0d289b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.22", + "version": "0.20.23-rc4", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -89,6 +89,7 @@ "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", "@orionprotocol/contracts": "1.22.3", + "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", "buffer": "^6.0.3", @@ -96,6 +97,7 @@ "express": "^4.18.2", "isomorphic-ws": "^5.0.0", "just-clone": "^6.2.0", + "lodash.clonedeep": "^4.5.0", "merge-anything": "^5.1.7", "neverthrow": "^6.0.0", "patch-package": "^8.0.0", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index eb59716..5cbd512 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -1,44 +1,45 @@ -import type { LibValidator } from "@orionprotocol/contracts/lib/ethers-v6/Exchange.js"; -import { ethers, type BigNumberish, type BytesLike, JsonRpcProvider, ZeroAddress } from "ethers"; -import { safeGet, SafeArray } from "../../utils/safeGetters.js"; -import { simpleFetch } from "simple-typed-fetch"; -import type Unit from "../index.js"; -import { generateUni2Calls, generateUni2Call } from "./callGenerators/uniswapV2.js"; +import type { LibValidator } from '@orionprotocol/contracts/lib/ethers-v6/Exchange.js'; +import { ethers, ZeroAddress } from 'ethers'; +import type { AddressLike, JsonRpcProvider, BigNumberish, BytesLike } from 'ethers'; +import cloneDeep from 'lodash.clonedeep'; +import { safeGet, SafeArray } from '../../utils/safeGetters.js'; +import { simpleFetch } from 'simple-typed-fetch'; +import type Unit from '../index.js'; +import { generateUni2Calls, generateUni2Call } from './callGenerators/uniswapV2.js'; import { generateUni3Calls, generateOrion3Calls, generateUni3Call, generateOrion3Call, -} from "./callGenerators/uniswapV3.js"; -import { exchangeToNativeDecimals, generateCalls, pathCallWithBalance } from "./callGenerators/utils.js"; -import { generateTransferCall } from "./callGenerators/erc20.js"; -import { generateCurveStableSwapCall } from "./callGenerators/curve.js"; -import type { SingleSwap } from "../../types.js"; -import type { AddressLike } from "ethers"; -import { addressLikeToString } from "../../utils/addressLikeToString.js"; -import { generateUnwrapAndTransferCall, generateWrapAndTransferCall } from "./callGenerators/weth.js"; -import { getWalletBalance } from "../../utils/getBalance.js"; +} from './callGenerators/uniswapV3.js'; +import { exchangeToNativeDecimals, generateCalls, pathCallWithBalance } from './callGenerators/utils.js'; +import { generateTransferCall } from './callGenerators/erc20.js'; +import { generateCurveStableSwapCall } from './callGenerators/curve.js'; +import type { SingleSwap } from '../../types.js'; +import { addressLikeToString } from '../../utils/addressLikeToString.js'; +import { generateUnwrapAndTransferCall, generateWrapAndTransferCall } from './callGenerators/weth.js'; +import { getWalletBalance } from '../../utils/getBalance.js'; -export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3"; +export type Factory = 'UniswapV2' | 'UniswapV3' | 'Curve' | 'OrionV2' | 'OrionV3'; export type GenerateSwapCalldataWithUnitParams = { - amount: BigNumberish; - minReturnAmount: BigNumberish; - receiverAddress: string; - path: ArrayLike; - unit: Unit; + amount: BigNumberish + minReturnAmount: BigNumberish + receiverAddress: string + path: ArrayLike + unit: Unit }; export type GenerateSwapCalldataParams = { - amount: BigNumberish; - minReturnAmount: BigNumberish; - receiverAddress: string; - useContractBalance: boolean; - path: ArrayLike; - wethAddress: AddressLike; - curveRegistryAddress: AddressLike; - swapExecutorContractAddress: AddressLike; - provider: JsonRpcProvider; + amount: BigNumberish + minReturnAmount: BigNumberish + receiverAddress: string + useContractBalance: boolean + path: ArrayLike + wethAddress: AddressLike + curveRegistryAddress: AddressLike + swapExecutorContractAddress: AddressLike + provider: JsonRpcProvider }; export async function generateSwapCalldataWithUnit({ @@ -48,32 +49,33 @@ export async function generateSwapCalldataWithUnit({ path: arrayLikePath, unit, }: GenerateSwapCalldataWithUnitParams): Promise<{ - calldata: string; - swapDescription: LibValidator.SwapDescriptionStruct; + calldata: string + swapDescription: LibValidator.SwapDescriptionStruct }> { if (arrayLikePath == undefined || arrayLikePath.length == 0) { - throw new Error("Empty path"); + throw new Error('Empty path'); } - const wethAddress = safeGet(unit.contracts, "WETH"); - const curveRegistryAddress = safeGet(unit.contracts, "curveRegistry"); + const wethAddress = safeGet(unit.contracts, 'WETH'); + const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry'); const { assetToAddress, swapExecutorContractAddress } = await simpleFetch( unit.blockchainService.getInfo )(); - let path = SafeArray.from(arrayLikePath); + const arrayLikePathCopy = cloneDeep(arrayLikePath); + let path = SafeArray.from(arrayLikePathCopy); const walletBalance = await getWalletBalance( assetToAddress[path.first().assetIn] ?? path.first().assetIn.toLowerCase(), receiverAddress, unit.provider ); - path = SafeArray.from(arrayLikePath).map((swapInfo) => { + path = SafeArray.from(arrayLikePathCopy).map((swapInfo) => { swapInfo.assetIn = assetToAddress[swapInfo.assetIn] ?? swapInfo.assetIn.toLowerCase(); swapInfo.assetOut = assetToAddress[swapInfo.assetOut] ?? swapInfo.assetOut.toLowerCase(); return swapInfo; }); - return generateSwapCalldata({ + return await generateSwapCalldata({ amount, minReturnAmount, receiverAddress, @@ -106,8 +108,8 @@ export async function generateSwapCalldata({ const dstToken = path.last().assetOut; let swapDescription: LibValidator.SwapDescriptionStruct = { - srcToken: srcToken, - dstToken: dstToken, + srcToken, + dstToken, srcReceiver: swapExecutorContractAddress, dstReceiver: receiverAddress, amount, @@ -172,27 +174,27 @@ async function processSingleFactorySwaps( ) { let calls: BytesLike[] = []; switch (factory) { - case "OrionV2": { + case 'OrionV2': { swapDescription.srcReceiver = path.first().pool; calls = await generateUni2Calls(path, swapExecutorContractAddress); break; } - case "UniswapV2": { + case 'UniswapV2': { swapDescription.srcReceiver = path.first().pool; calls = await generateUni2Calls(path, swapExecutorContractAddress); break; } - case "UniswapV3": { + case 'UniswapV3': { calls = await generateUni3Calls(path, amount, swapExecutorContractAddress, provider); break; } - case "OrionV3": { + case 'OrionV3': { calls = await generateOrion3Calls(path, amount, swapExecutorContractAddress, provider); break; } - case "Curve": { + case 'Curve': { if (path.length > 1) { - throw new Error("Supporting only single stable swap on curve"); + throw new Error('Supporting only single stable swap on curve'); } calls = await generateCurveStableSwapCall( amount, @@ -219,41 +221,41 @@ async function processMultiFactorySwaps( curveRegistryAddress: string, provider: JsonRpcProvider ) { - let calls: BytesLike[] = []; + const calls: BytesLike[] = []; if (swapDescription.srcToken === ZeroAddress) { const wrapCall = await generateWrapAndTransferCall(swapExecutorContractAddress, { value: amount }); calls.push(wrapCall); } for (const swap of path) { switch (swap.factory) { - case "OrionV2": { + case 'OrionV2': { let transferCall = await generateTransferCall(swap.assetIn, swap.pool, 0); transferCall = pathCallWithBalance(transferCall, swap.assetIn); const uni2Call = await generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress); calls.push(transferCall, uni2Call); break; } - case "UniswapV2": { + case 'UniswapV2': { let transferCall = await generateTransferCall(swap.assetIn, swap.pool, 0); transferCall = pathCallWithBalance(transferCall, swap.assetIn); const uni2Call = await generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress); calls.push(transferCall, uni2Call); break; } - case "UniswapV3": { + case 'UniswapV3': { let uni3Call = await generateUni3Call(swap, 0, swapExecutorContractAddress, provider); uni3Call = pathCallWithBalance(uni3Call, swap.assetIn); calls.push(uni3Call); break; } - case "OrionV3": { + case 'OrionV3': { let orion3Call = await generateOrion3Call(swap, 0, swapExecutorContractAddress, provider); orion3Call = pathCallWithBalance(orion3Call, swap.assetIn); calls.push(orion3Call); break; } - case "Curve": { - let curveCalls = await generateCurveStableSwapCall( + case 'Curve': { + const curveCalls = await generateCurveStableSwapCall( amount, swapExecutorContractAddress, swap, diff --git a/src/utils/safeGetters.ts b/src/utils/safeGetters.ts index 0da1797..44dba35 100644 --- a/src/utils/safeGetters.ts +++ b/src/utils/safeGetters.ts @@ -1,5 +1,4 @@ export class SafeArray extends Array { - public static override from(array: ArrayLike): SafeArray { return new SafeArray(array); } @@ -9,9 +8,10 @@ export class SafeArray extends Array { for (const index in array) { const value = array[index] if (value === undefined) { - throw new Error("Array passed to constructor has undefined values") + throw new Error('Array passed to constructor has undefined values') } - this[index] = value + + this[index] = value; } } @@ -19,11 +19,11 @@ export class SafeArray extends Array { return [...this]; } - public override map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): SafeArray { + public override map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: unknown): SafeArray { return new SafeArray(super.map(callbackfn, thisArg)); } - public override filter(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): SafeArray { + public override filter(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: unknown): SafeArray { return new SafeArray(super.filter(callbackfn, thisArg)); } @@ -53,8 +53,8 @@ export function safeGet(obj: Partial>, key: string, errorMe const prefix = 'Requirement not met'; export function must(condition: unknown, message?: string | (() => string)): asserts condition { - if (condition) return; - const provided = typeof message === 'function' ? message() : message; - const value = provided ? `${prefix}: ${provided}` : prefix; - throw new Error(value); -} \ No newline at end of file + if (condition) return; + const provided = typeof message === 'function' ? message() : message; + const value = provided ? `${prefix}: ${provided}` : prefix; + throw new Error(value); +} From c76d6f5dca5480b15272e535e1a3462e55d1594d Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 27 Nov 2023 15:57:21 +0300 Subject: [PATCH 137/225] bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index c31e7e7..bfcfeb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.23-rc1", + "version": "0.20.23", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.23-rc1", + "version": "0.20.23", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 0d289b4..ed34454 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.23-rc4", + "version": "0.20.23", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 09a894e9ed378aa0248cc5ecf52395131cc0e532 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 27 Nov 2023 19:49:03 +0500 Subject: [PATCH 138/225] swapInfo usd --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/schemas/swapInfoSchema.ts | 7 +++++++ src/services/Aggregator/ws/schemas/swapInfoSchema.ts | 9 ++++++++- src/types.ts | 7 +++++++ 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index bfcfeb6..26e7112 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.23", + "version": "0.20.24", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.23", + "version": "0.20.24", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index ed34454..04d614d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.23", + "version": "0.20.24-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/schemas/swapInfoSchema.ts b/src/services/Aggregator/schemas/swapInfoSchema.ts index 76e963d..d29c82a 100644 --- a/src/services/Aggregator/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/schemas/swapInfoSchema.ts @@ -40,6 +40,13 @@ const swapInfoBase = z.object({ isThroughPoolOrCurve: z.boolean(), }).array(), assetNameMapping: z.record(z.string()).optional(), // address to ERC20 names + usd: z.object({ // USD info of this swap, nullable + aa: z.number(), // available amount in, USD + aao: z.number().optional(), // available amount out, USD + mo: z.number(), // market amount out, USD + mi: z.number().optional(), // market amount in, USD + d: z.number().optional(), // difference in available amount in/out (USD) and market amount out/in (USD) in percentage + }).optional(), }); const swapInfoByAmountIn = swapInfoBase.extend({ diff --git a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts index aa79db8..a38e783 100644 --- a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts @@ -40,7 +40,14 @@ const swapInfoSchemaBase = baseMessageSchema.extend({ ai: z.string().toUpperCase(), // asset in ao: z.string().toUpperCase(), // asset out f: factorySchema, // factory - })) + })), + usd: z.object({ // USD info of this swap, nullable + aa: z.number(), // available amount in, USD + aao: z.number().optional(), // available amount out, USD + mo: z.number(), // market amount out, USD + mi: z.number().optional(), // market amount in, USD + d: z.number().optional(), // difference in available amount in/out (USD) and market amount out/in (USD) in percentage + }).optional(), }); const swapInfoSchemaByAmountIn = swapInfoSchemaBase.extend({ diff --git a/src/types.ts b/src/types.ts index ecc3568..39ab935 100644 --- a/src/types.ts +++ b/src/types.ts @@ -197,6 +197,13 @@ export type SwapInfoBase = { } | undefined alternatives: SwapInfoAlternative[] assetsNameMapping?: Partial> | undefined + usdInfo?: { + availableAmountIn: number + availableAmountOut?: number + marketAmountIn: number + marketAmountOut?: number + difference: number + } } export type SwapInfoByAmountIn = SwapInfoBase & { From 643a2c846981f705b8d826684c6d3eec71e966a3 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 28 Nov 2023 06:47:32 +0500 Subject: [PATCH 139/225] fix: types --- package.json | 2 +- src/services/Aggregator/schemas/swapInfoSchema.ts | 2 +- src/services/Aggregator/ws/schemas/swapInfoSchema.ts | 2 +- src/types.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 04d614d..3d5ece1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.24-rc1", + "version": "0.20.24-rc2", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/schemas/swapInfoSchema.ts b/src/services/Aggregator/schemas/swapInfoSchema.ts index d29c82a..85a85a9 100644 --- a/src/services/Aggregator/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/schemas/swapInfoSchema.ts @@ -45,7 +45,7 @@ const swapInfoBase = z.object({ aao: z.number().optional(), // available amount out, USD mo: z.number(), // market amount out, USD mi: z.number().optional(), // market amount in, USD - d: z.number().optional(), // difference in available amount in/out (USD) and market amount out/in (USD) in percentage + d: z.string().optional(), // difference in available amount in/out (USD) and market amount out/in (USD) in percentage }).optional(), }); diff --git a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts index a38e783..44d1bd5 100644 --- a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts @@ -46,7 +46,7 @@ const swapInfoSchemaBase = baseMessageSchema.extend({ aao: z.number().optional(), // available amount out, USD mo: z.number(), // market amount out, USD mi: z.number().optional(), // market amount in, USD - d: z.number().optional(), // difference in available amount in/out (USD) and market amount out/in (USD) in percentage + d: z.string().optional(), // difference in available amount in/out (USD) and market amount out/in (USD) in percentage }).optional(), }); diff --git a/src/types.ts b/src/types.ts index 39ab935..5882e9a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -202,7 +202,7 @@ export type SwapInfoBase = { availableAmountOut?: number marketAmountIn: number marketAmountOut?: number - difference: number + difference: string } } From 87f9c738a50f701227719badbeecf0be5f8cb1e1 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 28 Nov 2023 07:16:21 +0500 Subject: [PATCH 140/225] fix: types --- src/services/Aggregator/ws/index.ts | 7 +++++++ src/types.ts | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/services/Aggregator/ws/index.ts b/src/services/Aggregator/ws/index.ts index a50d62b..d1ce566 100644 --- a/src/services/Aggregator/ws/index.ts +++ b/src/services/Aggregator/ws/index.ts @@ -526,6 +526,13 @@ class AggregatorWS { availableAmountOut: item.aao, })), assetsNameMapping: json.anm, + usdInfo: json.usd && { + availableAmountIn: json.usd.aa, + availableAmountOut: json.usd.aao, + marketAmountOut: json.usd.mo, + marketAmountIn: json.usd.mi, + difference: json.usd.d, + }, }; switch (json.k) { // kind diff --git a/src/types.ts b/src/types.ts index 5882e9a..0e9b681 100644 --- a/src/types.ts +++ b/src/types.ts @@ -199,10 +199,10 @@ export type SwapInfoBase = { assetsNameMapping?: Partial> | undefined usdInfo?: { availableAmountIn: number - availableAmountOut?: number - marketAmountIn: number - marketAmountOut?: number - difference: string + availableAmountOut: number | undefined + marketAmountOut: number + marketAmountIn: number | undefined + difference: string | undefined } } From 111f94be1fc41839858940e7e81ad107f73bab06 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 28 Nov 2023 07:17:49 +0500 Subject: [PATCH 141/225] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3d5ece1..b3bd777 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.24-rc2", + "version": "0.20.24-rc3", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 5e932276e78751ef43540bf698b596806f6af12e Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 28 Nov 2023 07:24:42 +0500 Subject: [PATCH 142/225] fix: types --- src/types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/types.ts b/src/types.ts index 0e9b681..c72f377 100644 --- a/src/types.ts +++ b/src/types.ts @@ -197,13 +197,13 @@ export type SwapInfoBase = { } | undefined alternatives: SwapInfoAlternative[] assetsNameMapping?: Partial> | undefined - usdInfo?: { + usdInfo: { availableAmountIn: number availableAmountOut: number | undefined marketAmountOut: number marketAmountIn: number | undefined difference: string | undefined - } + } | undefined } export type SwapInfoByAmountIn = SwapInfoBase & { From 6c770f41f077bb9171b3b70f0c8ddef581607bbb Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 28 Nov 2023 07:31:20 +0500 Subject: [PATCH 143/225] fix: zod --- package.json | 2 +- src/services/Aggregator/schemas/swapInfoSchema.ts | 4 ++-- src/services/Aggregator/ws/schemas/swapInfoSchema.ts | 4 ++-- src/types.ts | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index b3bd777..2faf2a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.24-rc3", + "version": "0.20.24-rc4", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/schemas/swapInfoSchema.ts b/src/services/Aggregator/schemas/swapInfoSchema.ts index 85a85a9..049c8bc 100644 --- a/src/services/Aggregator/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/schemas/swapInfoSchema.ts @@ -41,9 +41,9 @@ const swapInfoBase = z.object({ }).array(), assetNameMapping: z.record(z.string()).optional(), // address to ERC20 names usd: z.object({ // USD info of this swap, nullable - aa: z.number(), // available amount in, USD + aa: z.number().optional(), // available amount in, USD aao: z.number().optional(), // available amount out, USD - mo: z.number(), // market amount out, USD + mo: z.number().optional(), // market amount out, USD mi: z.number().optional(), // market amount in, USD d: z.string().optional(), // difference in available amount in/out (USD) and market amount out/in (USD) in percentage }).optional(), diff --git a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts index 44d1bd5..3c8a5d4 100644 --- a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts @@ -42,9 +42,9 @@ const swapInfoSchemaBase = baseMessageSchema.extend({ f: factorySchema, // factory })), usd: z.object({ // USD info of this swap, nullable - aa: z.number(), // available amount in, USD + aa: z.number().optional(), // available amount in, USD aao: z.number().optional(), // available amount out, USD - mo: z.number(), // market amount out, USD + mo: z.number().optional(), // market amount out, USD mi: z.number().optional(), // market amount in, USD d: z.string().optional(), // difference in available amount in/out (USD) and market amount out/in (USD) in percentage }).optional(), diff --git a/src/types.ts b/src/types.ts index c72f377..7511476 100644 --- a/src/types.ts +++ b/src/types.ts @@ -198,9 +198,9 @@ export type SwapInfoBase = { alternatives: SwapInfoAlternative[] assetsNameMapping?: Partial> | undefined usdInfo: { - availableAmountIn: number + availableAmountIn: number | undefined availableAmountOut: number | undefined - marketAmountOut: number + marketAmountOut: number | undefined marketAmountIn: number | undefined difference: string | undefined } | undefined From 5fb74378348c46096c994e208ac68d1f84884d1b Mon Sep 17 00:00:00 2001 From: kigastu Date: Tue, 28 Nov 2023 07:37:46 +0500 Subject: [PATCH 144/225] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2faf2a1..e7b37ad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.24-rc4", + "version": "0.20.24", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 91b5ca3239bcbd71eb676a90b13a3e56121adb89 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Wed, 29 Nov 2023 18:41:46 +0400 Subject: [PATCH 145/225] hotfix: fix calldata generation for nativeAsset => anyAsset --- src/Unit/Exchange/generateSwapCalldata.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 5cbd512..2f34198 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -221,11 +221,7 @@ async function processMultiFactorySwaps( curveRegistryAddress: string, provider: JsonRpcProvider ) { - const calls: BytesLike[] = []; - if (swapDescription.srcToken === ZeroAddress) { - const wrapCall = await generateWrapAndTransferCall(swapExecutorContractAddress, { value: amount }); - calls.push(wrapCall); - } + let calls: BytesLike[] = []; for (const swap of path) { switch (swap.factory) { case 'OrionV2': { From 51907c17e5c50ec6354f99c8276571938e1254fe Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Wed, 29 Nov 2023 18:41:53 +0400 Subject: [PATCH 146/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e7b37ad..1fc379b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.24", + "version": "0.20.25", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From ff8729a1d3e2c466f77c17f4135cccf39bd60279 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Wed, 29 Nov 2023 20:03:47 +0400 Subject: [PATCH 147/225] fix: fix bug with curve calldata generation while in crossfactory --- package.json | 2 +- src/Unit/Exchange/callGenerators/curve.ts | 11 ++++++++--- src/Unit/Exchange/generateSwapCalldata.ts | 5 +++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 1fc379b..60d26ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.25", + "version": "0.20.25-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/callGenerators/curve.ts b/src/Unit/Exchange/callGenerators/curve.ts index eb9d29e..69eeb2d 100644 --- a/src/Unit/Exchange/callGenerators/curve.ts +++ b/src/Unit/Exchange/callGenerators/curve.ts @@ -4,7 +4,7 @@ import { ERC20__factory, } from "@orionprotocol/contracts/lib/ethers-v6/index.js"; import { MaxUint256, type BigNumberish, type JsonRpcProvider } from "ethers"; -import { addCallParams } from "./utils.js"; +import { addCallParams, pathCallWithBalance } from "./utils.js"; import type { SingleSwap } from "../../../types.js"; import { generateApproveCall } from "./erc20.js"; import type { BytesLike } from "ethers"; @@ -15,7 +15,8 @@ export async function generateCurveStableSwapCall( swap: SingleSwap, provider: JsonRpcProvider, swapExecutorContractAddress: string, - curveRegistry: string + curveRegistry: string, + pathWithBalance = false ) { const executorInterface = SwapExecutor__factory.createInterface(); const registry = CurveRegistry__factory.connect(curveRegistry, provider); @@ -38,7 +39,11 @@ export async function generateCurveStableSwapCall( "curveSwapStableAmountIn", [pool, assetOut, i, j, to, amount] ); - calls.push(addCallParams(calldata)) + calldata = addCallParams(calldata) + if (pathWithBalance) { + calldata = pathCallWithBalance(calldata, swap.assetIn) + } + calls.push(calldata) return calls } diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 2f34198..d5487f4 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -251,13 +251,14 @@ async function processMultiFactorySwaps( break; } case 'Curve': { - const curveCalls = await generateCurveStableSwapCall( + let curveCalls = await generateCurveStableSwapCall( amount, swapExecutorContractAddress, swap, provider, swapExecutorContractAddress, - curveRegistryAddress + curveRegistryAddress, + true ); calls.push(...curveCalls); break; From 982ec94d401e9d531c2423bb6b94b92899e27127 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Wed, 29 Nov 2023 21:46:00 +0400 Subject: [PATCH 148/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 60d26ca..b5f9bc6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.25-rc0", + "version": "0.20.26", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From e0acb78d4f25b3a6fa78db0c3a1b76268753d33e Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Thu, 30 Nov 2023 14:15:49 +0400 Subject: [PATCH 149/225] swaps nativeToken => anyToken use exchangeBalance as a priority; generateSwapCalldata now also returns eth value for transaction --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 130 +++++++++--------- src/utils/getBalance.ts | 152 +++++++++++++++++++--- 3 files changed, 204 insertions(+), 80 deletions(-) diff --git a/package.json b/package.json index b5f9bc6..f39986a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.26", + "version": "0.20.26-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index d5487f4..5a8309d 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -1,73 +1,70 @@ -import type { LibValidator } from '@orionprotocol/contracts/lib/ethers-v6/Exchange.js'; -import { ethers, ZeroAddress } from 'ethers'; -import type { AddressLike, JsonRpcProvider, BigNumberish, BytesLike } from 'ethers'; -import cloneDeep from 'lodash.clonedeep'; -import { safeGet, SafeArray } from '../../utils/safeGetters.js'; -import { simpleFetch } from 'simple-typed-fetch'; -import type Unit from '../index.js'; -import { generateUni2Calls, generateUni2Call } from './callGenerators/uniswapV2.js'; +import type { LibValidator } from "@orionprotocol/contracts/lib/ethers-v6/Exchange.js"; +import { ethers, ZeroAddress } from "ethers"; +import type { AddressLike, JsonRpcProvider, BigNumberish, BytesLike } from "ethers"; +import cloneDeep from "lodash.clonedeep"; +import { safeGet, SafeArray } from "../../utils/safeGetters.js"; +import { simpleFetch } from "simple-typed-fetch"; +import type Unit from "../index.js"; +import { generateUni2Calls, generateUni2Call } from "./callGenerators/uniswapV2.js"; import { generateUni3Calls, generateOrion3Calls, generateUni3Call, generateOrion3Call, -} from './callGenerators/uniswapV3.js'; -import { exchangeToNativeDecimals, generateCalls, pathCallWithBalance } from './callGenerators/utils.js'; -import { generateTransferCall } from './callGenerators/erc20.js'; -import { generateCurveStableSwapCall } from './callGenerators/curve.js'; -import type { SingleSwap } from '../../types.js'; -import { addressLikeToString } from '../../utils/addressLikeToString.js'; -import { generateUnwrapAndTransferCall, generateWrapAndTransferCall } from './callGenerators/weth.js'; -import { getWalletBalance } from '../../utils/getBalance.js'; +} from "./callGenerators/uniswapV3.js"; +import { exchangeToNativeDecimals, generateCalls, pathCallWithBalance } from "./callGenerators/utils.js"; +import { generateTransferCall } from "./callGenerators/erc20.js"; +import { generateCurveStableSwapCall } from "./callGenerators/curve.js"; +import type { SingleSwap } from "../../types.js"; +import { addressLikeToString } from "../../utils/addressLikeToString.js"; +import { generateUnwrapAndTransferCall, generateWrapAndTransferCall } from "./callGenerators/weth.js"; +import { getExchangeBalance, getWalletBalance } from "../../utils/getBalance.js"; -export type Factory = 'UniswapV2' | 'UniswapV3' | 'Curve' | 'OrionV2' | 'OrionV3'; +export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3"; export type GenerateSwapCalldataWithUnitParams = { - amount: BigNumberish - minReturnAmount: BigNumberish - receiverAddress: string - path: ArrayLike - unit: Unit + amount: BigNumberish; + minReturnAmount: BigNumberish; + initiatorAddress: string; + receiverAddress: string; + path: ArrayLike; + unit: Unit; }; export type GenerateSwapCalldataParams = { - amount: BigNumberish - minReturnAmount: BigNumberish - receiverAddress: string - useContractBalance: boolean - path: ArrayLike - wethAddress: AddressLike - curveRegistryAddress: AddressLike - swapExecutorContractAddress: AddressLike - provider: JsonRpcProvider + amount: BigNumberish; + minReturnAmount: BigNumberish; + initiatorAddress: string; + receiverAddress: string; + path: ArrayLike; + exchangeContractAddress: AddressLike; + wethAddress: AddressLike; + curveRegistryAddress: AddressLike; + swapExecutorContractAddress: AddressLike; + provider: JsonRpcProvider; }; export async function generateSwapCalldataWithUnit({ amount, minReturnAmount, + initiatorAddress, receiverAddress, path: arrayLikePath, unit, }: GenerateSwapCalldataWithUnitParams): Promise<{ - calldata: string - swapDescription: LibValidator.SwapDescriptionStruct + calldata: string; + swapDescription: LibValidator.SwapDescriptionStruct; + value: BigInt; }> { if (arrayLikePath == undefined || arrayLikePath.length == 0) { - throw new Error('Empty path'); + throw new Error("Empty path"); } - const wethAddress = safeGet(unit.contracts, 'WETH'); - const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry'); - const { assetToAddress, swapExecutorContractAddress } = await simpleFetch( - unit.blockchainService.getInfo - )(); + const wethAddress = safeGet(unit.contracts, "WETH"); + const curveRegistryAddress = safeGet(unit.contracts, "curveRegistry"); + const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); const arrayLikePathCopy = cloneDeep(arrayLikePath); let path = SafeArray.from(arrayLikePathCopy); - const walletBalance = await getWalletBalance( - assetToAddress[path.first().assetIn] ?? path.first().assetIn.toLowerCase(), - receiverAddress, - unit.provider - ); path = SafeArray.from(arrayLikePathCopy).map((swapInfo) => { swapInfo.assetIn = assetToAddress[swapInfo.assetIn] ?? swapInfo.assetIn.toLowerCase(); @@ -79,8 +76,9 @@ export async function generateSwapCalldataWithUnit({ amount, minReturnAmount, receiverAddress, - useContractBalance: walletBalance < await exchangeToNativeDecimals(path.first().assetIn, amount, unit.provider), + initiatorAddress, path, + exchangeContractAddress, wethAddress, curveRegistryAddress, swapExecutorContractAddress, @@ -91,21 +89,26 @@ export async function generateSwapCalldataWithUnit({ export async function generateSwapCalldata({ amount, minReturnAmount, + initiatorAddress, receiverAddress, - useContractBalance, path: arrayLikePath, + exchangeContractAddress, wethAddress: wethAddressLike, curveRegistryAddress: curveRegistryAddressLike, swapExecutorContractAddress: swapExecutorContractAddressLike, provider, -}: GenerateSwapCalldataParams) { +}: GenerateSwapCalldataParams): Promise<{ + calldata: string; + swapDescription: LibValidator.SwapDescriptionStruct; + value: BigInt; +}> { const wethAddress = await addressLikeToString(wethAddressLike); const curveRegistryAddress = await addressLikeToString(curveRegistryAddressLike); const swapExecutorContractAddress = await addressLikeToString(swapExecutorContractAddressLike); let path = SafeArray.from(arrayLikePath); const { factory, assetIn: srcToken } = path.first(); - const dstToken = path.last().assetOut; + const { assetOut: dstToken } = path.last(); let swapDescription: LibValidator.SwapDescriptionStruct = { srcToken, @@ -156,11 +159,18 @@ export async function generateSwapCalldata({ )); const calldata = generateCalls(calls); + const initiatorWalletBalance = await getWalletBalance(srcToken, initiatorAddress, provider) + const initiatorExchangeBalance = await getExchangeBalance(srcToken, initiatorAddress, exchangeContractAddress, provider, true) + const useContractBalance = srcToken === ZeroAddress || amountNativeDecimals < initiatorWalletBalance if (useContractBalance) { swapDescription.flags = 1n << 255n; } + let value = 0n; + if (srcToken === ZeroAddress && initiatorExchangeBalance < amountNativeDecimals) { + value = amountNativeDecimals - initiatorExchangeBalance; + } - return { swapDescription, calldata }; + return { swapDescription, calldata , value}; } async function processSingleFactorySwaps( @@ -174,27 +184,27 @@ async function processSingleFactorySwaps( ) { let calls: BytesLike[] = []; switch (factory) { - case 'OrionV2': { + case "OrionV2": { swapDescription.srcReceiver = path.first().pool; calls = await generateUni2Calls(path, swapExecutorContractAddress); break; } - case 'UniswapV2': { + case "UniswapV2": { swapDescription.srcReceiver = path.first().pool; calls = await generateUni2Calls(path, swapExecutorContractAddress); break; } - case 'UniswapV3': { + case "UniswapV3": { calls = await generateUni3Calls(path, amount, swapExecutorContractAddress, provider); break; } - case 'OrionV3': { + case "OrionV3": { calls = await generateOrion3Calls(path, amount, swapExecutorContractAddress, provider); break; } - case 'Curve': { + case "Curve": { if (path.length > 1) { - throw new Error('Supporting only single stable swap on curve'); + throw new Error("Supporting only single stable swap on curve"); } calls = await generateCurveStableSwapCall( amount, @@ -224,33 +234,33 @@ async function processMultiFactorySwaps( let calls: BytesLike[] = []; for (const swap of path) { switch (swap.factory) { - case 'OrionV2': { + case "OrionV2": { let transferCall = await generateTransferCall(swap.assetIn, swap.pool, 0); transferCall = pathCallWithBalance(transferCall, swap.assetIn); const uni2Call = await generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress); calls.push(transferCall, uni2Call); break; } - case 'UniswapV2': { + case "UniswapV2": { let transferCall = await generateTransferCall(swap.assetIn, swap.pool, 0); transferCall = pathCallWithBalance(transferCall, swap.assetIn); const uni2Call = await generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress); calls.push(transferCall, uni2Call); break; } - case 'UniswapV3': { + case "UniswapV3": { let uni3Call = await generateUni3Call(swap, 0, swapExecutorContractAddress, provider); uni3Call = pathCallWithBalance(uni3Call, swap.assetIn); calls.push(uni3Call); break; } - case 'OrionV3': { + case "OrionV3": { let orion3Call = await generateOrion3Call(swap, 0, swapExecutorContractAddress, provider); orion3Call = pathCallWithBalance(orion3Call, swap.assetIn); calls.push(orion3Call); break; } - case 'Curve': { + case "Curve": { let curveCalls = await generateCurveStableSwapCall( amount, swapExecutorContractAddress, diff --git a/src/utils/getBalance.ts b/src/utils/getBalance.ts index e7c84b2..c139574 100644 --- a/src/utils/getBalance.ts +++ b/src/utils/getBalance.ts @@ -1,9 +1,11 @@ -import { ERC20__factory, type Exchange } from '@orionprotocol/contracts/lib/ethers-v6/index.js'; -import type { BigNumber } from 'bignumber.js'; -import { ethers } from 'ethers'; -import { INTERNAL_PROTOCOL_PRECISION, NATIVE_CURRENCY_PRECISION } from '../constants/index.js'; -import type { Aggregator } from '../services/Aggregator/index.js'; -import denormalizeNumber from './denormalizeNumber.js'; +import { ERC20__factory, Exchange__factory, type Exchange } from "@orionprotocol/contracts/lib/ethers-v6/index.js"; +import type { BigNumber } from "bignumber.js"; +import { ZeroAddress, ethers } from "ethers"; +import { INTERNAL_PROTOCOL_PRECISION, NATIVE_CURRENCY_PRECISION } from "../constants/index.js"; +import type { Aggregator } from "../services/Aggregator/index.js"; +import denormalizeNumber from "./denormalizeNumber.js"; +import type { AddressLike } from "ethers"; +import { addressLikeToString } from "./addressLikeToString.js"; export default async function getBalance( aggregator: Aggregator, @@ -11,7 +13,7 @@ export default async function getBalance( assetAddress: string, walletAddress: string, exchangeContract: Exchange, - provider: ethers.Provider, + provider: ethers.Provider ) { const assetIsNativeCryptocurrency = assetAddress === ethers.ZeroAddress; @@ -30,7 +32,10 @@ export default async function getBalance( denormalizedAssetInWalletBalance = denormalizeNumber(assetWalletBalance, BigInt(NATIVE_CURRENCY_PRECISION)); } const assetContractBalance = await exchangeContract.getBalance(assetAddress, walletAddress); - const denormalizedAssetInContractBalance = denormalizeNumber(assetContractBalance, BigInt(INTERNAL_PROTOCOL_PRECISION)); + const denormalizedAssetInContractBalance = denormalizeNumber( + assetContractBalance, + BigInt(INTERNAL_PROTOCOL_PRECISION) + ); const denormalizedAssetLockedBalanceResult = await aggregator.getLockedBalance(walletAddress, assetName); if (denormalizedAssetLockedBalanceResult.isErr()) { throw new Error(denormalizedAssetLockedBalanceResult.error.message); @@ -42,21 +47,130 @@ export default async function getBalance( }; } -export async function getWalletBalance( - assetAddress: string, - walletAddress: string, +async function getExchangeBalanceERC20( + tokenAddress: AddressLike, + walletAddress: AddressLike, + exchangeAddress: AddressLike, provider: ethers.Provider, + convertToNativeDecimals = true ) { - const assetIsNativeCryptocurrency = assetAddress === ethers.ZeroAddress; + walletAddress = await addressLikeToString(walletAddress); + exchangeAddress = await addressLikeToString(exchangeAddress); + tokenAddress = await addressLikeToString(tokenAddress); - let assetWalletBalance: bigint | undefined; + const exchange = Exchange__factory.connect(exchangeAddress, provider) + const exchangeBalance = await exchange.getBalance(tokenAddress, walletAddress); - if (!assetIsNativeCryptocurrency) { - const assetContract = ERC20__factory.connect(assetAddress, provider); - assetWalletBalance = await assetContract.balanceOf(walletAddress); - } else { - assetWalletBalance = await provider.getBalance(walletAddress); + if (convertToNativeDecimals) { + const tokenContract = ERC20__factory.connect(tokenAddress, provider); + const decimals = await tokenContract.decimals(); + const convertedExchangeBalance = (exchangeBalance * BigInt(10) ** decimals) / BigInt(10) ** 8n; + return convertedExchangeBalance; } - return assetWalletBalance + return exchangeBalance; +} + +async function getExchangeBalanceNative( + walletAddress: AddressLike, + exchangeAddress: AddressLike, + provider: ethers.Provider, + convertToNativeDecimals = true +) { + walletAddress = await addressLikeToString(walletAddress); + exchangeAddress = await addressLikeToString(exchangeAddress); + const exchange = Exchange__factory.connect(exchangeAddress, provider) + const exchangeBalance = await exchange.getBalance(ZeroAddress, walletAddress); + + if (convertToNativeDecimals) { + const convertedExchangeBalance = (exchangeBalance * BigInt(10) ** 18n) / BigInt(10) ** 8n; + return convertedExchangeBalance; + } + + return exchangeBalance; +} + +export async function getExchangeBalance( + tokenAddress: AddressLike, + walletAddress: AddressLike, + exchangeAddress: AddressLike, + provider: ethers.Provider, + convertToNativeDecimals = true +) { + walletAddress = await addressLikeToString(walletAddress); + tokenAddress = await addressLikeToString(tokenAddress); + + if (typeof tokenAddress === "string" && tokenAddress === ZeroAddress) { + return getExchangeBalanceNative(walletAddress, exchangeAddress, provider, convertToNativeDecimals); + } else { + return getExchangeBalanceERC20(tokenAddress, walletAddress, exchangeAddress, provider, convertToNativeDecimals); + } +} + +async function getWalletBalanceERC20( + tokenAddress: AddressLike, + walletAddress: AddressLike, + provider: ethers.Provider, + convertToExchangeDecimals = false +) { + walletAddress = await addressLikeToString(walletAddress); + tokenAddress = await addressLikeToString(tokenAddress); + + const tokenContract = ERC20__factory.connect(tokenAddress, provider); + let walletBalance = await tokenContract.balanceOf(walletAddress); + + if (convertToExchangeDecimals) { + const tokenContract = ERC20__factory.connect(tokenAddress, provider); + const decimals = await tokenContract.decimals(); + const convertedNativeBalance = (walletBalance * BigInt(10) ** 8n) / BigInt(10) ** decimals; + return convertedNativeBalance; + } + return walletBalance; +} + +async function getWalletBalanceNative( + walletAddress: AddressLike, + provider: ethers.Provider, + convertToExchangeDecimals = false +) { + walletAddress = await addressLikeToString(walletAddress); + const nativeBalance = await provider.getBalance(walletAddress); + + if (convertToExchangeDecimals) { + const convertedNativeBalance = (nativeBalance * BigInt(10) ** 8n) / BigInt(10) ** 18n; + return convertedNativeBalance; + } + + return nativeBalance; +} + +export async function getWalletBalance( + tokenAddress: AddressLike, + walletAddress: AddressLike, + provider: ethers.Provider, + convertToExchangeDecimals = false +) { + if (typeof tokenAddress === "string" && tokenAddress === ZeroAddress) { + return getWalletBalanceNative(walletAddress, provider, convertToExchangeDecimals); + } else { + return getWalletBalanceERC20(tokenAddress, walletAddress, provider, convertToExchangeDecimals); + } +} + +export async function getTotalBalance( + tokenAddress: AddressLike, + walletAddress: AddressLike, + exchangeAddress: AddressLike, + provider: ethers.Provider, + convertToNativeDecimals = true +) { + const walletBalance = await getWalletBalance(tokenAddress, walletAddress, provider, !convertToNativeDecimals); + const exchangeBalance = await getExchangeBalance( + tokenAddress, + walletAddress, + exchangeAddress, + provider, + convertToNativeDecimals + ); + return walletBalance + exchangeBalance; } From 9d794b54289667827d891d35ea0e8647d94a8f06 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Thu, 30 Nov 2023 14:28:20 +0400 Subject: [PATCH 150/225] fix return eth value type BigInt => bigint --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index f39986a..73edc35 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.26-rc0", + "version": "0.20.26-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 5a8309d..74f08fe 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -54,7 +54,7 @@ export async function generateSwapCalldataWithUnit({ }: GenerateSwapCalldataWithUnitParams): Promise<{ calldata: string; swapDescription: LibValidator.SwapDescriptionStruct; - value: BigInt; + value: bigint; }> { if (arrayLikePath == undefined || arrayLikePath.length == 0) { throw new Error("Empty path"); @@ -100,7 +100,7 @@ export async function generateSwapCalldata({ }: GenerateSwapCalldataParams): Promise<{ calldata: string; swapDescription: LibValidator.SwapDescriptionStruct; - value: BigInt; + value: bigint; }> { const wethAddress = await addressLikeToString(wethAddressLike); const curveRegistryAddress = await addressLikeToString(curveRegistryAddressLike); From 4d2e006db083ef0c736f52d6c7199d1f8e7cc216 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Thu, 30 Nov 2023 14:46:52 +0400 Subject: [PATCH 151/225] dont use exchangeBalance if it's 0 --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 73edc35..e74467e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.26-rc1", + "version": "0.20.26-rc2", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 74f08fe..73c3f4c 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -61,7 +61,9 @@ export async function generateSwapCalldataWithUnit({ } const wethAddress = safeGet(unit.contracts, "WETH"); const curveRegistryAddress = safeGet(unit.contracts, "curveRegistry"); - const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch(unit.blockchainService.getInfo)(); + const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch( + unit.blockchainService.getInfo + )(); const arrayLikePathCopy = cloneDeep(arrayLikePath); let path = SafeArray.from(arrayLikePathCopy); @@ -159,10 +161,17 @@ export async function generateSwapCalldata({ )); const calldata = generateCalls(calls); - const initiatorWalletBalance = await getWalletBalance(srcToken, initiatorAddress, provider) - const initiatorExchangeBalance = await getExchangeBalance(srcToken, initiatorAddress, exchangeContractAddress, provider, true) - const useContractBalance = srcToken === ZeroAddress || amountNativeDecimals < initiatorWalletBalance - if (useContractBalance) { + const initiatorWalletBalance = await getWalletBalance(srcToken, initiatorAddress, provider); + const initiatorExchangeBalance = await getExchangeBalance( + srcToken, + initiatorAddress, + exchangeContractAddress, + provider, + true + ); + const useExchangeBalance = + initiatorExchangeBalance !== 0n && (srcToken === ZeroAddress || amountNativeDecimals < initiatorWalletBalance); + if (useExchangeBalance) { swapDescription.flags = 1n << 255n; } let value = 0n; @@ -170,7 +179,7 @@ export async function generateSwapCalldata({ value = amountNativeDecimals - initiatorExchangeBalance; } - return { swapDescription, calldata , value}; + return { swapDescription, calldata, value }; } async function processSingleFactorySwaps( From 3c56cd09269d56078601bfb212f4eede57e09ee8 Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Thu, 30 Nov 2023 14:59:40 +0400 Subject: [PATCH 152/225] fix incorrect definition of useExchangeBalance --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e74467e..a98a651 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.26-rc2", + "version": "0.20.26-rc3", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 73c3f4c..24ed183 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -170,7 +170,7 @@ export async function generateSwapCalldata({ true ); const useExchangeBalance = - initiatorExchangeBalance !== 0n && (srcToken === ZeroAddress || amountNativeDecimals < initiatorWalletBalance); + initiatorExchangeBalance !== 0n && (srcToken === ZeroAddress || initiatorWalletBalance < amountNativeDecimals); if (useExchangeBalance) { swapDescription.flags = 1n << 255n; } From a536db3433b9f7ce653b730f2cf6dabf4f491e3d Mon Sep 17 00:00:00 2001 From: lomonoshka Date: Thu, 30 Nov 2023 15:10:28 +0400 Subject: [PATCH 153/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a98a651..21cd716 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.26-rc3", + "version": "0.20.27", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 14313c98e8b29e6eab8f8ae6d0f8af2862c6686d Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Thu, 7 Dec 2023 17:57:19 +0300 Subject: [PATCH 154/225] added source header --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/index.ts | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 26e7112..e5dea1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.24", + "version": "0.20.28", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.24", + "version": "0.20.28", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 21cd716..20109f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.27", + "version": "0.20.28", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index f30d7cf..e567cea 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -197,6 +197,7 @@ class Aggregator { isReversedOrder?: boolean, partnerId?: string, fromWidget?: boolean, + source?: string, ) => { const headers = { 'Content-Type': 'application/json', @@ -206,6 +207,7 @@ class Aggregator { }, ...(partnerId !== undefined) && { 'X-Partner-Id': partnerId }, ...(fromWidget !== undefined) && { 'X-From-Widget': fromWidget ? 'true' : 'false' }, + ...(source !== undefined) && { 'X-Source': source }, ...this.basicAuthHeaders, }; From bbf7f664c7c40a76aa9c54f78518c5b3ea04c082 Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Fri, 8 Dec 2023 15:08:56 +0400 Subject: [PATCH 155/225] add useExchageBalance function, add balance and allowance validation --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 110 ++++++++++++++++------ src/utils/getBalance.ts | 29 +++++- 3 files changed, 108 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 20109f3..d31f694 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.28", + "version": "0.20.29-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 24ed183..986a288 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -18,7 +18,7 @@ import { generateCurveStableSwapCall } from "./callGenerators/curve.js"; import type { SingleSwap } from "../../types.js"; import { addressLikeToString } from "../../utils/addressLikeToString.js"; import { generateUnwrapAndTransferCall, generateWrapAndTransferCall } from "./callGenerators/weth.js"; -import { getExchangeBalance, getWalletBalance } from "../../utils/getBalance.js"; +import { getExchangeAllowance, getExchangeBalance, getTotalBalance, getWalletBalance } from "../../utils/getBalance.js"; export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3"; @@ -109,7 +109,7 @@ export async function generateSwapCalldata({ const swapExecutorContractAddress = await addressLikeToString(swapExecutorContractAddressLike); let path = SafeArray.from(arrayLikePath); - const { factory, assetIn: srcToken } = path.first(); + const { assetIn: srcToken } = path.first(); const { assetOut: dstToken } = path.last(); let swapDescription: LibValidator.SwapDescriptionStruct = { @@ -128,15 +128,51 @@ export async function generateSwapCalldata({ if (singleSwap.assetOut == ethers.ZeroAddress) singleSwap.assetOut = wethAddress; return singleSwap; }); + + let calls: BytesLike[]; + ({ swapDescription, calls } = await processSwaps( + swapDescription, + path, + amountNativeDecimals, + wethAddress, + swapExecutorContractAddress, + curveRegistryAddress, + provider + )); + const calldata = generateCalls(calls); - const isSingleFactorySwap = path.every((singleSwap) => singleSwap.factory === factory); + const { useExchangeBalance, additionalTransferAmount } = await shouldUseExchangeBalance( + srcToken, + initiatorAddress, + exchangeContractAddress, + amountNativeDecimals, + provider + ); + if (useExchangeBalance) { + swapDescription.flags = 1n << 255n; + } + + return { swapDescription, calldata, value: additionalTransferAmount }; +} + +async function processSwaps( + swapDescription: LibValidator.SwapDescriptionStruct, + path: SafeArray, + amount: BigNumberish, + wethAddress: string, + swapExecutorContractAddress: string, + curveRegistryAddress: string, + provider: JsonRpcProvider +) { + const { factory: firstSwapFactory } = path.first(); + const isSingleFactorySwap = path.every((singleSwap) => singleSwap.factory === firstSwapFactory); let calls: BytesLike[]; if (isSingleFactorySwap) { ({ swapDescription, calls } = await processSingleFactorySwaps( - factory, + firstSwapFactory, swapDescription, path, - amountNativeDecimals, + amount, swapExecutorContractAddress, curveRegistryAddress, provider @@ -145,41 +181,20 @@ export async function generateSwapCalldata({ ({ swapDescription, calls } = await processMultiFactorySwaps( swapDescription, path, - amountNativeDecimals, + amount, swapExecutorContractAddress, curveRegistryAddress, provider )); } - ({ swapDescription, calls } = await wrapOrUnwrapIfNeeded( - amountNativeDecimals, + amount, swapDescription, calls, swapExecutorContractAddress, wethAddress )); - const calldata = generateCalls(calls); - - const initiatorWalletBalance = await getWalletBalance(srcToken, initiatorAddress, provider); - const initiatorExchangeBalance = await getExchangeBalance( - srcToken, - initiatorAddress, - exchangeContractAddress, - provider, - true - ); - const useExchangeBalance = - initiatorExchangeBalance !== 0n && (srcToken === ZeroAddress || initiatorWalletBalance < amountNativeDecimals); - if (useExchangeBalance) { - swapDescription.flags = 1n << 255n; - } - let value = 0n; - if (srcToken === ZeroAddress && initiatorExchangeBalance < amountNativeDecimals) { - value = amountNativeDecimals - initiatorExchangeBalance; - } - - return { swapDescription, calldata, value }; + return { swapDescription, calls }; } async function processSingleFactorySwaps( @@ -313,3 +328,40 @@ async function wrapOrUnwrapIfNeeded( } return { swapDescription, calls }; } + +async function shouldUseExchangeBalance( + srcToken: AddressLike, + initiatorAddress: AddressLike, + exchangeContractAddress: AddressLike, + amount: bigint, + provider: ethers.provider +) { + const { walletBalance, exchangeBalance } = await getTotalBalance( + srcToken, + initiatorAddress, + exchangeContractAddress, + provider + ); + const exchangeAllowance = await getExchangeAllowance(srcToken, initiatorAddress, exchangeContractAddress, provider); + + if (walletBalance + exchangeBalance < amount) { + throw new Error( + `Not enough balance to make swap, totalBalance - ${walletBalance + exchangeBalance} swapAmount - ${amount}` + ); + } + let useExchangeBalance = true; + let additionalTransferAmount = 0n; + + if (exchangeBalance == 0n) { + useExchangeBalance = false; + additionalTransferAmount = amount; + } else { + additionalTransferAmount = exchangeBalance >= amount ? 0n : amount - exchangeBalance; + if (additionalTransferAmount > exchangeAllowance) { + throw new Error( + `Not enough allowance to make swap, allowance - ${exchangeAllowance} needed allowance - ${additionalTransferAmount}` + ); + } + } + return { useExchangeBalance, additionalTransferAmount }; +} diff --git a/src/utils/getBalance.ts b/src/utils/getBalance.ts index c139574..c863f65 100644 --- a/src/utils/getBalance.ts +++ b/src/utils/getBalance.ts @@ -58,7 +58,7 @@ async function getExchangeBalanceERC20( exchangeAddress = await addressLikeToString(exchangeAddress); tokenAddress = await addressLikeToString(tokenAddress); - const exchange = Exchange__factory.connect(exchangeAddress, provider) + const exchange = Exchange__factory.connect(exchangeAddress, provider); const exchangeBalance = await exchange.getBalance(tokenAddress, walletAddress); if (convertToNativeDecimals) { @@ -79,7 +79,7 @@ async function getExchangeBalanceNative( ) { walletAddress = await addressLikeToString(walletAddress); exchangeAddress = await addressLikeToString(exchangeAddress); - const exchange = Exchange__factory.connect(exchangeAddress, provider) + const exchange = Exchange__factory.connect(exchangeAddress, provider); const exchangeBalance = await exchange.getBalance(ZeroAddress, walletAddress); if (convertToNativeDecimals) { @@ -107,6 +107,25 @@ export async function getExchangeBalance( } } +export async function getExchangeAllowance( + tokenAddress: AddressLike, + walletAddress: AddressLike, + exchangeAddress: AddressLike, + provider: ethers.Provider +) { + if (typeof tokenAddress === "string" && tokenAddress === ZeroAddress) { + return 0n; + } else { + walletAddress = await addressLikeToString(walletAddress); + tokenAddress = await addressLikeToString(tokenAddress); + + const tokenContract = ERC20__factory.connect(tokenAddress, provider); + let allowance = await tokenContract.allowance(walletAddress, exchangeAddress); + + return allowance; + } +} + async function getWalletBalanceERC20( tokenAddress: AddressLike, walletAddress: AddressLike, @@ -172,5 +191,9 @@ export async function getTotalBalance( provider, convertToNativeDecimals ); - return walletBalance + exchangeBalance; + return { + walletBalance, + exchangeBalance, + totalBalance: walletBalance + exchangeBalance + } } From 2698434ab17722e57fdd338ccfe3b5d630f870f2 Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Fri, 8 Dec 2023 15:13:17 +0400 Subject: [PATCH 156/225] fix build, delete unused imports --- src/Unit/Exchange/generateSwapCalldata.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 986a288..2b04531 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -18,7 +18,7 @@ import { generateCurveStableSwapCall } from "./callGenerators/curve.js"; import type { SingleSwap } from "../../types.js"; import { addressLikeToString } from "../../utils/addressLikeToString.js"; import { generateUnwrapAndTransferCall, generateWrapAndTransferCall } from "./callGenerators/weth.js"; -import { getExchangeAllowance, getExchangeBalance, getTotalBalance, getWalletBalance } from "../../utils/getBalance.js"; +import { getExchangeAllowance, getTotalBalance } from "../../utils/getBalance.js"; export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3"; @@ -334,7 +334,7 @@ async function shouldUseExchangeBalance( initiatorAddress: AddressLike, exchangeContractAddress: AddressLike, amount: bigint, - provider: ethers.provider + provider: JsonRpcProvider ) { const { walletBalance, exchangeBalance } = await getTotalBalance( srcToken, From 99d02a42cdfc0aee5b02b7f14ae658a269e44227 Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Fri, 8 Dec 2023 16:05:41 +0400 Subject: [PATCH 157/225] fix not zero eth value when srcToken not eth --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index d31f694..c359668 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.29-rc0", + "version": "0.20.29-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 2b04531..f5cacde 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -128,7 +128,7 @@ export async function generateSwapCalldata({ if (singleSwap.assetOut == ethers.ZeroAddress) singleSwap.assetOut = wethAddress; return singleSwap; }); - + let calls: BytesLike[]; ({ swapDescription, calls } = await processSwaps( swapDescription, @@ -151,8 +151,8 @@ export async function generateSwapCalldata({ if (useExchangeBalance) { swapDescription.flags = 1n << 255n; } - - return { swapDescription, calldata, value: additionalTransferAmount }; + const value = srcToken == ZeroAddress ? additionalTransferAmount : 0n; + return { swapDescription, calldata, value }; } async function processSwaps( From 14998f253193810d11a54a2c7961fbda232e03a0 Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Fri, 8 Dec 2023 17:30:51 +0400 Subject: [PATCH 158/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c359668..052f03d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.29-rc1", + "version": "0.20.29", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 47d671a9f73236503184b1138be7283abc7833e4 Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Mon, 11 Dec 2023 13:39:23 +0400 Subject: [PATCH 159/225] fix: params count in swap funct; feat: added comments --- package-lock.json | 4 ++-- src/BalanceGuard.ts | 8 ++++++++ src/Unit/Exchange/swapLimit.ts | 1 - src/Unit/Exchange/swapMarket.ts | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index e5dea1e..0de3861 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.28", + "version": "0.20.29", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.28", + "version": "0.20.29", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/src/BalanceGuard.ts b/src/BalanceGuard.ts index f466c82..9d0b881 100644 --- a/src/BalanceGuard.ts +++ b/src/BalanceGuard.ts @@ -9,6 +9,8 @@ import type { import { denormalizeNumber } from './utils/index.js'; import arrayEquals from './utils/arrayEquals.js'; +// BalanceGuard helps to check if there is enough balance to perform a swap +// Also it can fix some balance issues (e.g. approve tokens) export default class BalanceGuard { private readonly balances: Partial< Record< @@ -55,6 +57,8 @@ export default class BalanceGuard { assetBalance[source] = assetBalance[source].plus(amount); } + // Reset is approve some token to zero + // This operation may be required by some tokens, e.g. USDT private async checkResetRequired( assetAddress: string, spenderAddress: string, @@ -109,6 +113,7 @@ export default class BalanceGuard { }, []); } + // This method can fix some balance issues (e.g. approve tokens) private readonly fixAllAutofixableBalanceIssues = async ( balanceIssues: BalanceIssue[], ) => { @@ -163,6 +168,7 @@ export default class BalanceGuard { return balanceIssues.filter((item) => !autofixableBalanceIssues.includes(item)); }; + // Check that all balance requirements are fulfilled async check(fixAutofixable?: boolean) { this.logger?.(`Balance requirements: ${this.requirements .map((requirement) => `${requirement.amount} ${requirement.asset.name} ` + @@ -173,6 +179,7 @@ export default class BalanceGuard { const remainingBalances = clone(this.balances); const aggregatedRequirements = BalanceGuard.aggregateBalanceRequirements(this.requirements); + // DO NOT IGNORE THIS COMMENT. THIS IS VERY IMPORTANT TO UNDERSTAND THIS CODE // Balance absorption order is important! // 1. Exchange-contract only // 2. Exchange + wallet (can produce approves requirements) @@ -321,6 +328,7 @@ export default class BalanceGuard { const walletTokensAggregatedRequirements = flattedAggregatedRequirements .filter(({ sources, asset }) => sources[0] === 'wallet' && asset.name !== this.nativeCryptocurrency.name); + // This requirements can be fulfilled by wallet await Promise.all(walletTokensAggregatedRequirements .map(async ({ asset, spenderAddress, items }) => { const remainingBalance = remainingBalances[asset.name]; diff --git a/src/Unit/Exchange/swapLimit.ts b/src/Unit/Exchange/swapLimit.ts index e9d7492..d69a9e0 100644 --- a/src/Unit/Exchange/swapLimit.ts +++ b/src/Unit/Exchange/swapLimit.ts @@ -426,7 +426,6 @@ export default async function swapLimit({ walletAddress, matcherAddress, feeAssetAddress, - false, signer, chainId, ); diff --git a/src/Unit/Exchange/swapMarket.ts b/src/Unit/Exchange/swapMarket.ts index 90c6bd4..0557e56 100644 --- a/src/Unit/Exchange/swapMarket.ts +++ b/src/Unit/Exchange/swapMarket.ts @@ -45,6 +45,7 @@ export default async function swapMarket({ options, }: SwapMarketParams): Promise { if (options?.developer) options.logger?.('YOU SPECIFIED A DEVELOPER OPTIONS. BE CAREFUL!'); + if (amount === '') throw new Error('Amount can not be empty'); if (assetIn === '') throw new Error('AssetIn can not be empty'); if (assetOut === '') throw new Error('AssetOut can not be empty'); @@ -384,7 +385,6 @@ export default async function swapMarket({ walletAddress, matcherAddress, feeAssetAddress, - false, signer, chainId, ); From e515998ba6a10d66a43ec7a18f37dc10f574fd9d Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Tue, 12 Dec 2023 09:53:17 +0400 Subject: [PATCH 160/225] fix: change default bsc-mainnet rpc --- package.json | 2 +- src/config/chains.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 052f03d..ceb1d96 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.29", + "version": "0.20.30", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/config/chains.json b/src/config/chains.json index 7da650e..f56cdc5 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -18,7 +18,7 @@ "label": "BNB Chain", "shortName": "BSC", "code": "bsc", - "rpc": "https://bsc-dataseed.binance.org/", + "rpc": "https://bsc-dataseed1.binance.org/", "baseCurrencyName": "BNB", "contracts": { "WETH": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", From 5576cc89b91798270fe018f794d3f9ea3d15f36f Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Tue, 12 Dec 2023 11:11:39 +0400 Subject: [PATCH 161/225] fix: change default bsc-mainnet rpc --- src/config/chains.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/chains.json b/src/config/chains.json index f56cdc5..ceb66e6 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -18,7 +18,7 @@ "label": "BNB Chain", "shortName": "BSC", "code": "bsc", - "rpc": "https://bsc-dataseed1.binance.org/", + "rpc": " https://bsc-dataseed.bnbchain.org/", "baseCurrencyName": "BNB", "contracts": { "WETH": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", From 661cce707d9cc1be3dc952ed2cb5a7de39c1a2f2 Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Tue, 12 Dec 2023 11:11:54 +0400 Subject: [PATCH 162/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ceb1d96..033ae51 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.30", + "version": "0.20.31", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From fa33024ea5111b7f7354e71826fcb9b94628ebde Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Wed, 13 Dec 2023 14:39:40 +0300 Subject: [PATCH 163/225] get referral data --- package.json | 2 +- src/services/BlockchainService/index.ts | 9 +++++++++ src/services/BlockchainService/schemas/index.ts | 1 + .../BlockchainService/schemas/referralDataSchema.ts | 6 ++++++ 4 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 src/services/BlockchainService/schemas/referralDataSchema.ts diff --git a/package.json b/package.json index 033ae51..fcb411e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.31", + "version": "0.20.32-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/BlockchainService/index.ts b/src/services/BlockchainService/index.ts index eebec2f..30cd7c7 100644 --- a/src/services/BlockchainService/index.ts +++ b/src/services/BlockchainService/index.ts @@ -258,6 +258,15 @@ class BlockchainService { ) }; + getReferralData = (walletAddress: string) => fetchWithValidation( + `${this.apiUrl}/api/referral-data/${walletAddress}`, + z.object({ + referer: z.string(), + isReferral: z.boolean(), + }), + { headers: this.basicAuthHeaders } + ); + getGasPriceWei = () => fetchWithValidation( `${this.apiUrl}/api/gasPrice`, z.string(), diff --git a/src/services/BlockchainService/schemas/index.ts b/src/services/BlockchainService/schemas/index.ts index 2abb10d..5f76ca8 100644 --- a/src/services/BlockchainService/schemas/index.ts +++ b/src/services/BlockchainService/schemas/index.ts @@ -14,3 +14,4 @@ export { default as userVotesSchema } from './userVotesSchema.js'; export { default as userEarnedSchema } from './userEarnedSchema.js'; export { default as poolsV3InfoSchema } from './poolsV3InfoSchema.js'; export { pricesWithQuoteAssetSchema } from './pricesWithQuoteAssetSchema.js'; +export { referralDataSchema } from './referralDataSchema.js'; \ No newline at end of file diff --git a/src/services/BlockchainService/schemas/referralDataSchema.ts b/src/services/BlockchainService/schemas/referralDataSchema.ts new file mode 100644 index 0000000..115e2a8 --- /dev/null +++ b/src/services/BlockchainService/schemas/referralDataSchema.ts @@ -0,0 +1,6 @@ +import { z } from "zod"; + +export const referralDataSchema = z.object({ + referer: z.string(), + isReferral: z.boolean(), +}); From 70ab3f1ffe6720709dbf4bd2d5aa1912cf68c48d Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Wed, 13 Dec 2023 14:40:38 +0300 Subject: [PATCH 164/225] fix: version --- package.json | 2 +- src/services/BlockchainService/index.ts | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index fcb411e..538b06a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.32-rc1", + "version": "0.20.33-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/BlockchainService/index.ts b/src/services/BlockchainService/index.ts index 30cd7c7..53ac157 100644 --- a/src/services/BlockchainService/index.ts +++ b/src/services/BlockchainService/index.ts @@ -11,6 +11,7 @@ import { type PairStatusEnum, pairStatusSchema, pricesWithQuoteAssetSchema, + referralDataSchema, } from './schemas/index.js'; import type redeemOrderSchema from '../Aggregator/schemas/redeemOrderSchema.js'; import { sourceAtomicHistorySchema, targetAtomicHistorySchema } from './schemas/atomicHistorySchema.js'; @@ -260,10 +261,7 @@ class BlockchainService { getReferralData = (walletAddress: string) => fetchWithValidation( `${this.apiUrl}/api/referral-data/${walletAddress}`, - z.object({ - referer: z.string(), - isReferral: z.boolean(), - }), + referralDataSchema, { headers: this.basicAuthHeaders } ); From 1af36a83ca28a35a6c45e4d32517fb27abef66c7 Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Wed, 13 Dec 2023 19:15:50 +0400 Subject: [PATCH 165/225] fix don't check allowance when token is native --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 033ae51..476e451 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.31", + "version": "0.20.32", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index f5cacde..cefce17 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -357,7 +357,7 @@ async function shouldUseExchangeBalance( additionalTransferAmount = amount; } else { additionalTransferAmount = exchangeBalance >= amount ? 0n : amount - exchangeBalance; - if (additionalTransferAmount > exchangeAllowance) { + if (srcToken !== ZeroAddress && additionalTransferAmount > exchangeAllowance) { throw new Error( `Not enough allowance to make swap, allowance - ${exchangeAllowance} needed allowance - ${additionalTransferAmount}` ); From 6e14d146ac7b3440c661bf38ef2589cb45d2cc4b Mon Sep 17 00:00:00 2001 From: kigastu Date: Thu, 14 Dec 2023 17:18:58 +0300 Subject: [PATCH 166/225] bump ver --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 538b06a..6c58b9f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.33-rc1", + "version": "0.20.33", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From fd666af7537ec8cd923f079dc9a13fee9ca8930e Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Fri, 15 Dec 2023 10:21:00 +0000 Subject: [PATCH 167/225] feature: added userLPBalanceStr to poolInfoSchema --- src/services/Indexer/schemas/pool-v2-info-schema.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/services/Indexer/schemas/pool-v2-info-schema.ts b/src/services/Indexer/schemas/pool-v2-info-schema.ts index d5a369e..f027208 100644 --- a/src/services/Indexer/schemas/pool-v2-info-schema.ts +++ b/src/services/Indexer/schemas/pool-v2-info-schema.ts @@ -22,6 +22,7 @@ const poolInfoSchema = z.object({ token0Price: z.number(), token1Price: z.number(), userLPBalance: z.number(), + userLPBalanceStr: z.string(), totalLPSupply: z.number(), totalLPStake: z.number(), totalLPStakeInUSD: z.number(), From b847a173bbbe0c2b3f903717f80ba96c7d6f54f2 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Fri, 15 Dec 2023 10:22:25 +0000 Subject: [PATCH 168/225] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6c58b9f..98378d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.33", + "version": "0.20.34", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 826b3b508caae83d18fb9adb0ba2afa2fdf7770e Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Fri, 15 Dec 2023 17:55:44 +0400 Subject: [PATCH 169/225] added fee payment to matcher if dst.Token === feeToken --- package-lock.json | 18 ++--- package.json | 4 +- src/Unit/Exchange/callGenerators/erc20.ts | 7 +- .../Exchange/callGenerators/feePayment.ts | 21 ++++++ src/Unit/Exchange/callGenerators/uniswapV2.ts | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 66 +++++++++++++++---- 6 files changed, 90 insertions(+), 28 deletions(-) create mode 100644 src/Unit/Exchange/callGenerators/feePayment.ts diff --git a/package-lock.json b/package-lock.json index e5dea1e..9d3274b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.28", + "version": "0.20.32", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.28", + "version": "0.20.32", "hasInstallScript": true, "license": "ISC", "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.22.3", + "@orionprotocol/contracts": "1.22.5", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", @@ -2421,9 +2421,9 @@ } }, "node_modules/@orionprotocol/contracts": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.3.tgz", - "integrity": "sha512-TVZftFbrHA+ldZSvMAGTntSiTT20UWn6P/+N392A9dv6RtiIXaQpMic5hOhVdIed74DU/KixVxwjVL1Hr0RLGQ==" + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.5.tgz", + "integrity": "sha512-kBgqMw0uqotl9UbSubw5cmEsck5aefS9l9/5DNvFfOfMLY1ewFLtn03X3/mO73ll1Y6tZBtqzYTGNZpcnk7tKA==" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -13480,9 +13480,9 @@ } }, "@orionprotocol/contracts": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.3.tgz", - "integrity": "sha512-TVZftFbrHA+ldZSvMAGTntSiTT20UWn6P/+N392A9dv6RtiIXaQpMic5hOhVdIed74DU/KixVxwjVL1Hr0RLGQ==" + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.5.tgz", + "integrity": "sha512-kBgqMw0uqotl9UbSubw5cmEsck5aefS9l9/5DNvFfOfMLY1ewFLtn03X3/mO73ll1Y6tZBtqzYTGNZpcnk7tKA==" }, "@sinclair/typebox": { "version": "0.27.8", diff --git a/package.json b/package.json index 98378d0..513f328 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.34", + "version": "0.20.34-rc-0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -88,7 +88,7 @@ "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.22.3", + "@orionprotocol/contracts": "1.22.5", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", diff --git a/src/Unit/Exchange/callGenerators/erc20.ts b/src/Unit/Exchange/callGenerators/erc20.ts index e88e24a..bd54dd2 100644 --- a/src/Unit/Exchange/callGenerators/erc20.ts +++ b/src/Unit/Exchange/callGenerators/erc20.ts @@ -1,9 +1,8 @@ import { SwapExecutor__factory } from "@orionprotocol/contracts/lib/ethers-v6/index.js" -import type { BigNumberish } from "ethers" +import type { BigNumberish, AddressLike } from "ethers" import { type CallParams, addCallParams } from "./utils.js" -import type { AddressLike } from "ethers" -export async function generateTransferCall( +export function generateTransferCall( token: AddressLike, target: AddressLike, amount: BigNumberish, @@ -20,7 +19,7 @@ export async function generateTransferCall( return addCallParams(calldata, callParams) } -export async function generateApproveCall( +export function generateApproveCall( token: AddressLike, target: AddressLike, amount: BigNumberish, diff --git a/src/Unit/Exchange/callGenerators/feePayment.ts b/src/Unit/Exchange/callGenerators/feePayment.ts new file mode 100644 index 0000000..ee1eb29 --- /dev/null +++ b/src/Unit/Exchange/callGenerators/feePayment.ts @@ -0,0 +1,21 @@ +import { SwapExecutor__factory } from "@orionprotocol/contracts/lib/ethers-v6/index.js" +import type { BigNumberish, AddressLike } from "ethers" +import { type CallParams, addCallParams } from "./utils.js" + + +export function generateFeePaymentCall( + matcher: AddressLike, + token: AddressLike, + amount: BigNumberish, + callParams?: CallParams +) { + + const executorInterface = SwapExecutor__factory.createInterface() + const calldata = executorInterface.encodeFunctionData('payFeeToMatcher', [ + matcher, + token, + amount + ]) + + return addCallParams(calldata, callParams) +} \ No newline at end of file diff --git a/src/Unit/Exchange/callGenerators/uniswapV2.ts b/src/Unit/Exchange/callGenerators/uniswapV2.ts index 19b86b0..4526fca 100644 --- a/src/Unit/Exchange/callGenerators/uniswapV2.ts +++ b/src/Unit/Exchange/callGenerators/uniswapV2.ts @@ -36,7 +36,7 @@ export async function generateUni2Calls( return calls } -export async function generateUni2Call( +export function generateUni2Call( pool: string, assetIn: string, assetOut: string, diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index cefce17..343723a 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -19,6 +19,7 @@ import type { SingleSwap } from "../../types.js"; import { addressLikeToString } from "../../utils/addressLikeToString.js"; import { generateUnwrapAndTransferCall, generateWrapAndTransferCall } from "./callGenerators/weth.js"; import { getExchangeAllowance, getTotalBalance } from "../../utils/getBalance.js"; +import { generateFeePaymentCall } from "./callGenerators/feePayment.js"; export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3"; @@ -27,6 +28,9 @@ export type GenerateSwapCalldataWithUnitParams = { minReturnAmount: BigNumberish; initiatorAddress: string; receiverAddress: string; + matcher: AddressLike, + feeToken: AddressLike, + fee: BigNumberish; path: ArrayLike; unit: Unit; }; @@ -37,6 +41,9 @@ export type GenerateSwapCalldataParams = { initiatorAddress: string; receiverAddress: string; path: ArrayLike; + matcher: AddressLike, + feeToken: AddressLike, + fee: BigNumberish; exchangeContractAddress: AddressLike; wethAddress: AddressLike; curveRegistryAddress: AddressLike; @@ -50,6 +57,9 @@ export async function generateSwapCalldataWithUnit({ initiatorAddress, receiverAddress, path: arrayLikePath, + matcher = ZeroAddress, + feeToken = ZeroAddress, + fee = 0, unit, }: GenerateSwapCalldataWithUnitParams): Promise<{ calldata: string; @@ -80,6 +90,9 @@ export async function generateSwapCalldataWithUnit({ receiverAddress, initiatorAddress, path, + matcher, + feeToken, + fee, exchangeContractAddress, wethAddress, curveRegistryAddress, @@ -94,6 +107,9 @@ export async function generateSwapCalldata({ initiatorAddress, receiverAddress, path: arrayLikePath, + matcher = ZeroAddress, + feeToken = ZeroAddress, + fee = 0, exchangeContractAddress, wethAddress: wethAddressLike, curveRegistryAddress: curveRegistryAddressLike, @@ -134,6 +150,9 @@ export async function generateSwapCalldata({ swapDescription, path, amountNativeDecimals, + matcher, + feeToken, + fee, wethAddress, swapExecutorContractAddress, curveRegistryAddress, @@ -159,6 +178,9 @@ async function processSwaps( swapDescription: LibValidator.SwapDescriptionStruct, path: SafeArray, amount: BigNumberish, + matcher: AddressLike, + feeToken: AddressLike, + fee: BigNumberish, wethAddress: string, swapExecutorContractAddress: string, curveRegistryAddress: string, @@ -187,13 +209,17 @@ async function processSwaps( provider )); } - ({ swapDescription, calls } = await wrapOrUnwrapIfNeeded( + + ({swapDescription, calls} = payFeeToMatcher(matcher, feeToken, fee, calls, swapDescription)); + + ({ swapDescription, calls } = wrapOrUnwrapIfNeeded( amount, swapDescription, calls, swapExecutorContractAddress, wethAddress )); + return { swapDescription, calls }; } @@ -259,16 +285,16 @@ async function processMultiFactorySwaps( for (const swap of path) { switch (swap.factory) { case "OrionV2": { - let transferCall = await generateTransferCall(swap.assetIn, swap.pool, 0); + let transferCall = generateTransferCall(swap.assetIn, swap.pool, 0); transferCall = pathCallWithBalance(transferCall, swap.assetIn); - const uni2Call = await generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress); + const uni2Call = generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress); calls.push(transferCall, uni2Call); break; } case "UniswapV2": { - let transferCall = await generateTransferCall(swap.assetIn, swap.pool, 0); + let transferCall = generateTransferCall(swap.assetIn, swap.pool, 0); transferCall = pathCallWithBalance(transferCall, swap.assetIn); - const uni2Call = await generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress); + const uni2Call = generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress); calls.push(transferCall, uni2Call); break; } @@ -305,25 +331,41 @@ async function processMultiFactorySwaps( return { swapDescription, calls }; } -async function wrapOrUnwrapIfNeeded( +function payFeeToMatcher( + matcher: AddressLike, + feeToken: AddressLike, + feeAmount: BigNumberish, + calls: BytesLike[], + swapDescription: LibValidator.SwapDescriptionStruct, +) { + feeAmount = BigInt(feeAmount) + if (feeAmount !== 0n && feeToken === swapDescription.dstToken) { + const feePaymentCall = generateFeePaymentCall(matcher, feeToken, feeAmount) + calls.push(feePaymentCall) + } + return {swapDescription, calls} +} + +function wrapOrUnwrapIfNeeded( amount: BigNumberish, swapDescription: LibValidator.SwapDescriptionStruct, calls: BytesLike[], swapExecutorContractAddress: string, wethAddress: string ) { - if (swapDescription.srcToken === ZeroAddress) { - const wrapCall = generateWrapAndTransferCall(swapDescription.srcReceiver, { value: amount }); + const {dstReceiver, srcReceiver, srcToken, dstToken} = swapDescription; + if (srcToken === ZeroAddress) { + const wrapCall = generateWrapAndTransferCall(srcReceiver, { value: amount }); swapDescription.srcReceiver = swapExecutorContractAddress; calls = ([wrapCall] as BytesLike[]).concat(calls); } - if (swapDescription.dstToken === ZeroAddress) { - let unwrapCall = generateUnwrapAndTransferCall(swapDescription.dstReceiver, 0); + if (dstToken === ZeroAddress) { + let unwrapCall = generateUnwrapAndTransferCall(dstReceiver, 0); unwrapCall = pathCallWithBalance(unwrapCall, wethAddress); calls.push(unwrapCall); } else { - let transferCall = await generateTransferCall(swapDescription.dstToken, swapDescription.dstReceiver, 0); - transferCall = pathCallWithBalance(transferCall, swapDescription.dstToken); + let transferCall = generateTransferCall(dstToken, dstReceiver, 0); + transferCall = pathCallWithBalance(transferCall, dstToken); calls.push(transferCall); } return { swapDescription, calls }; From 54bf512d21d5f8891c2cd5e47e8a21c1a856ff9f Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Fri, 15 Dec 2023 18:04:51 +0400 Subject: [PATCH 170/225] delete depricated addLiquidityToPool functionality --- src/Unit/FarmingManager/index.ts | 413 ------------------------------- src/Unit/index.ts | 4 - 2 files changed, 417 deletions(-) delete mode 100644 src/Unit/FarmingManager/index.ts diff --git a/src/Unit/FarmingManager/index.ts b/src/Unit/FarmingManager/index.ts deleted file mode 100644 index f4f7fbb..0000000 --- a/src/Unit/FarmingManager/index.ts +++ /dev/null @@ -1,413 +0,0 @@ -import { Exchange__factory, IUniswapV2Pair__factory, IUniswapV2Router__factory } from '@orionprotocol/contracts/lib/ethers-v6/index.js'; -import { BigNumber } from 'bignumber.js'; -import { ethers } from 'ethers'; -import { simpleFetch } from 'simple-typed-fetch'; -import type Unit from '../index.js'; -import BalanceGuard from '../../BalanceGuard.js'; -import { ADD_LIQUIDITY_GAS_LIMIT, INTERNAL_PROTOCOL_PRECISION, NATIVE_CURRENCY_PRECISION } from '../../constants/index.js'; -import { denormalizeNumber, normalizeNumber } from '../../utils/index.js'; -import getBalances from '../../utils/getBalances.js'; -import getNativeCryptocurrencyName from '../../utils/getNativeCryptocurrencyName.js'; - -const ADD_LIQUIDITY_SLIPPAGE = 0.05; - -export type AddLiquidityParams = { - poolName: string - amountAsset: string - amount: BigNumber.Value - signer: ethers.Signer -} - -export type RemoveAllLiquidityParams = { - poolName: string - signer: ethers.Signer -} - -export default class FarmingManager { - private readonly unit: Unit; - - constructor(unit: Unit) { - this.unit = unit; - } - - public async addLiquidity({ - poolName, - amountAsset, - amount, - signer, - }: AddLiquidityParams) { - const amountBN = new BigNumber(amount); - if (amountBN.isNaN()) throw new Error('Invalid amount'); - if (amountBN.lte(0)) throw new Error('Amount must be greater than 0'); - if (!poolName.includes('-')) throw new Error('Pool name must be in the format of "assetA-AssetB"'); - const [assetA, assetB] = poolName.split('-'); - if (assetA === undefined) throw new Error('Asset A undefined'); - if (assetB === undefined) throw new Error('Asset B undefined'); - if (amountAsset !== assetA && amountAsset !== assetB) throw new Error('Amount asset must be either assetA or assetB'); - - const { - exchangeContractAddress, - assetToAddress, - assetToDecimals, - } = await simpleFetch(this.unit.blockchainService.getInfo)(); - - const walletAddress = await signer.getAddress(); - - const exchangeContract = Exchange__factory - .connect(exchangeContractAddress, this.unit.provider); - - const assetAAddress = assetToAddress[assetA]; - if (assetAAddress === undefined) throw new Error(`Asset '${assetA}' not found`); - const assetBAddress = assetToAddress[assetB]; - if (assetBAddress === undefined) throw new Error(`Asset '${assetB}' not found`); - - const assetADecimals = assetToDecimals[assetA]; - if (assetADecimals === undefined) throw new Error(`Decimals for asset '${assetA}' not found`); - const assetBDecimals = assetToDecimals[assetB]; - if (assetBDecimals === undefined) throw new Error(`Decimals for asset '${assetB}' not found`); - - const nativeCryptocurrency = getNativeCryptocurrencyName(assetToAddress); - const balances = await getBalances( - { - [assetA]: assetAAddress, - [assetB]: assetBAddress, - [nativeCryptocurrency]: ethers.ZeroAddress, - }, - this.unit.aggregator, - walletAddress, - exchangeContract, - this.unit.provider, - ); - const balanceGuard = new BalanceGuard( - balances, - { - address: ethers.ZeroAddress, - name: nativeCryptocurrency, - }, - this.unit.provider, - signer, - ); - - const poolsConfig = await simpleFetch(this.unit.blockchainService.getPoolsConfig)(); - const pool = poolsConfig.pools[poolName]; - if (!pool) throw new Error(`Pool ${poolName} not found`); - - const pairContract = IUniswapV2Pair__factory - .connect(pool.lpTokenAddress, this.unit.provider); - const routerContract = IUniswapV2Router__factory - .connect(poolsConfig.routerAddress, this.unit.provider); - - let pairTokensIsInversed = false; - const token0 = await pairContract.token0(); - const wrappedNativeAddress = await routerContract.WETH(); - - // const token1 = await pairContract.token1(); - if (token0.toLowerCase() !== wrappedNativeAddress.toLowerCase()) pairTokensIsInversed = true; - - const { _reserve0, _reserve1 } = await pairContract.getReserves(); - - const assetAReserve = pairTokensIsInversed ? _reserve1 : _reserve0; - const assetBReserve = pairTokensIsInversed ? _reserve0 : _reserve1; - - const denormalizedAssetAReserve = denormalizeNumber(assetAReserve, BigInt(assetADecimals)); - const denormalizedAssetBReserve = denormalizeNumber(assetBReserve, BigInt(assetBDecimals)); - - const price = denormalizedAssetBReserve.div(denormalizedAssetAReserve); - - const assetAIsNativeCurrency = assetAAddress === ethers.ZeroAddress; - const assetBIsNativeCurrency = assetBAddress === ethers.ZeroAddress; - - const assetAAmount = assetA === amountAsset ? amountBN : amountBN.div(price); - const assetBAmount = assetA === amountAsset ? amountBN.multipliedBy(price) : amountBN; - - const assetAAmountWithSlippage = assetAAmount.multipliedBy(1 - ADD_LIQUIDITY_SLIPPAGE); - const assetBAmountWithSlippage = assetBAmount.multipliedBy(1 - ADD_LIQUIDITY_SLIPPAGE); - - balanceGuard.registerRequirement({ - reason: `${assetA} liquidity`, - amount: assetAAmount.toString(), - asset: { - name: assetA, - address: assetAAddress, - }, - spenderAddress: exchangeContractAddress, - sources: ['exchange', 'wallet'], - }); - - balanceGuard.registerRequirement({ - reason: `${assetB} liquidity`, - amount: assetBAmount.toString(), - asset: { - name: assetB, - address: assetBAddress, - }, - spenderAddress: exchangeContractAddress, - sources: ['exchange', 'wallet'], - }); - - const unsignedTx = await exchangeContract.withdrawToPool.populateTransaction( - assetBIsNativeCurrency ? assetBAddress : assetAAddress, - assetBIsNativeCurrency ? assetAAddress : assetBAddress, - assetBIsNativeCurrency - ? normalizeNumber(assetBAmount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString() - : normalizeNumber(assetAAmount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString(), - assetBIsNativeCurrency - ? normalizeNumber(assetAAmount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString() - : normalizeNumber(assetBAmount, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString(), - assetBIsNativeCurrency - ? normalizeNumber(assetBAmountWithSlippage, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString() - : normalizeNumber(assetAAmountWithSlippage, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString(), - assetBIsNativeCurrency - ? normalizeNumber(assetAAmountWithSlippage, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString() - : normalizeNumber(assetBAmountWithSlippage, INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR).toString(), - ); - - const { gasPrice, maxFeePerGas } = await this.unit.provider.getFeeData(); - - const transactionCost = BigInt(ADD_LIQUIDITY_GAS_LIMIT) * (gasPrice ?? 0n); - const denormalizedTransactionCost = denormalizeNumber(transactionCost, BigInt(NATIVE_CURRENCY_PRECISION)); - - balanceGuard.registerRequirement({ - reason: 'Network fee', - asset: { - name: nativeCryptocurrency, - address: ethers.ZeroAddress, - }, - amount: denormalizedTransactionCost.toString(), - sources: ['wallet'], - }); - - const nonce = await this.unit.provider.getTransactionCount(walletAddress, 'pending'); - - const network = await this.unit.provider.getNetwork(); - - if (assetAIsNativeCurrency || assetBIsNativeCurrency) { - const contractBalance = balances[nativeCryptocurrency]?.exchange; - if (!contractBalance) throw new Error(`No balance for '${nativeCryptocurrency}'`); - const nativeAssetAmount = assetBIsNativeCurrency ? assetBAmount : assetAAmount; - - if (nativeAssetAmount.gt(contractBalance)) { - unsignedTx.value = normalizeNumber( - nativeAssetAmount.minus(contractBalance), - NATIVE_CURRENCY_PRECISION, - BigNumber.ROUND_CEIL, - ); - } - } - - if (gasPrice !== null && maxFeePerGas !== null) { - unsignedTx.gasPrice = gasPrice; - unsignedTx.maxFeePerGas = maxFeePerGas; - } - unsignedTx.chainId = network.chainId; - unsignedTx.nonce = nonce; - unsignedTx.from = walletAddress; - const gasLimit = await this.unit.provider.estimateGas(unsignedTx); - unsignedTx.gasLimit = gasLimit; - - await balanceGuard.check(true); - - const signedTx = await signer.signTransaction(unsignedTx); - const txResponse = await this.unit.provider.broadcastTransaction(signedTx); - console.log(`Add liquidity tx sent: ${txResponse.hash}. Waiting for confirmation...`); - const txReceipt = await txResponse.wait(); - if (txReceipt?.status === 1) { - console.log(`Add liquidity tx confirmed: ${txReceipt.hash}`); - } else { - console.log(`Add liquidity tx failed: ${txReceipt?.hash}`); - } - } - - public async removeAllLiquidity({ - poolName, - signer, - }: RemoveAllLiquidityParams) { - if (!poolName.includes('-')) throw new Error('Pool name must be in the format of "assetA-AssetB"'); - const [assetA, assetB] = poolName.split('-'); - if (assetA === undefined) throw new Error('Asset A is not defined'); - if (assetB === undefined) throw new Error('Asset B is not defined'); - - const { - assetToAddress, - assetToDecimals, - exchangeContractAddress, - } = await simpleFetch(this.unit.blockchainService.getInfo)(); - - const assetAAddress = assetToAddress[assetA]; - if (assetAAddress === undefined) throw new Error(`Asset '${assetA}' not found`); - const assetBAddress = assetToAddress[assetB]; - if (assetBAddress === undefined) throw new Error(`Asset '${assetB}' not found`); - - const assetADecimals = assetToDecimals[assetA]; - if (assetADecimals === undefined) throw new Error(`Decimals for asset '${assetA}' not found`); - const assetBDecimals = assetToDecimals[assetB]; - if (assetBDecimals === undefined) throw new Error(`Decimals for asset '${assetB}' not found`); - - const poolsConfig = await simpleFetch(this.unit.blockchainService.getPoolsConfig)(); - const pool = poolsConfig.pools[poolName]; - if (!pool) throw new Error(`Pool ${poolName} not found`); - - const walletAddress = await signer.getAddress(); - - const exchangeContract = Exchange__factory - .connect(exchangeContractAddress, this.unit.provider); - const nativeCryptocurrency = getNativeCryptocurrencyName(assetToAddress); - const balances = await getBalances( - { - [assetA]: assetAAddress, - [assetB]: assetBAddress, - [`${poolName} LP Token`]: pool.lpTokenAddress, - [nativeCryptocurrency]: ethers.ZeroAddress, - }, - this.unit.aggregator, - walletAddress, - exchangeContract, - this.unit.provider, - ); - - const balanceGuard = new BalanceGuard( - balances, - { - address: ethers.ZeroAddress, - name: nativeCryptocurrency, - }, - this.unit.provider, - signer, - ); - - const pairContract = IUniswapV2Pair__factory - .connect(pool.lpTokenAddress, this.unit.provider); - - const { _reserve0, _reserve1 } = await pairContract.getReserves(); - - const routerContract = IUniswapV2Router__factory - .connect(poolsConfig.routerAddress, this.unit.provider); - - let pairTokensIsInversed = false; - - const lpTokenUserBalance = await pairContract.balanceOf(walletAddress); - const lpTokenDecimals = await pairContract.decimals(); - - const token0 = await pairContract.token0(); - const totalSupply = await pairContract.totalSupply(); - const wrappedNativeAddress = await routerContract.WETH(); - if (token0.toLowerCase() !== wrappedNativeAddress.toLowerCase()) pairTokensIsInversed = true; - - const denormalizedLpTokenUserBalance = denormalizeNumber(lpTokenUserBalance, lpTokenDecimals); - const denormalizedLpTokenSupply = denormalizeNumber(totalSupply, lpTokenDecimals); - - const userShare = denormalizedLpTokenUserBalance.div(denormalizedLpTokenSupply); - - const assetAReserve = pairTokensIsInversed ? _reserve1 : _reserve0; - const assetBReserve = pairTokensIsInversed ? _reserve0 : _reserve1; - - const denormalizedAssetAReserve = denormalizeNumber(assetAReserve, BigInt(assetADecimals)); - const denormalizedAssetBReserve = denormalizeNumber(assetBReserve, BigInt(assetBDecimals)); - - const denormalizedUserPooledAssetA = denormalizedAssetAReserve.multipliedBy(userShare); - const denormalizedUserPooledAssetB = denormalizedAssetBReserve.multipliedBy(userShare); - - const denormalizedUserPooledAssetAWithSlippage = denormalizedUserPooledAssetA.multipliedBy(1 - ADD_LIQUIDITY_SLIPPAGE); - const denormalizedUserPooledAssetBWithSlippage = denormalizedUserPooledAssetB.multipliedBy(1 - ADD_LIQUIDITY_SLIPPAGE); - - const assetAIsNativeCurrency = assetAAddress === ethers.ZeroAddress; - const assetBIsNativeCurrency = assetBAddress === ethers.ZeroAddress; - - balanceGuard.registerRequirement({ - reason: `${poolName} liquidity`, - asset: { - name: `${poolName} LP Token`, - address: pool.lpTokenAddress, - }, - spenderAddress: poolsConfig.routerAddress, - amount: denormalizedLpTokenUserBalance.toString(), - sources: ['wallet'], - }); - - let unsignedTx: ethers.TransactionLike; - if (assetAIsNativeCurrency || assetBIsNativeCurrency) { - unsignedTx = await routerContract.removeLiquidityETH.populateTransaction( - assetBIsNativeCurrency ? assetAAddress : assetBAddress, // token - lpTokenUserBalance, - assetBIsNativeCurrency - ? normalizeNumber( - denormalizedUserPooledAssetAWithSlippage, - assetADecimals, - BigNumber.ROUND_FLOOR, - ).toString() - : normalizeNumber( - denormalizedUserPooledAssetBWithSlippage, - assetBDecimals, - BigNumber.ROUND_FLOOR, - ).toString(), // token min - assetBIsNativeCurrency - ? normalizeNumber( - denormalizedUserPooledAssetBWithSlippage, - assetBDecimals, - BigNumber.ROUND_FLOOR, - ).toString() - : normalizeNumber( - denormalizedUserPooledAssetAWithSlippage, - assetADecimals, - BigNumber.ROUND_FLOOR, - ).toString(), // eth min - walletAddress, - Math.floor(Date.now() / 1000) + 60 * 20, - ); - } else { - unsignedTx = await routerContract.removeLiquidity.populateTransaction( - assetAAddress, - assetBAddress, - lpTokenUserBalance, - normalizeNumber( - denormalizedUserPooledAssetAWithSlippage, - assetADecimals, - BigNumber.ROUND_FLOOR, - ).toString(), - normalizeNumber( - denormalizedUserPooledAssetBWithSlippage, - assetBDecimals, - BigNumber.ROUND_FLOOR, - ).toString(), - walletAddress, - Math.floor(Date.now() / 1000) + 60 * 20, - ); - } - - const { gasPrice } = await this.unit.provider.getFeeData() - - const transactionCost = BigInt(ADD_LIQUIDITY_GAS_LIMIT) * (gasPrice ?? 0n); - const denormalizedTransactionCost = denormalizeNumber(transactionCost, BigInt(NATIVE_CURRENCY_PRECISION)); - - balanceGuard.registerRequirement({ - reason: 'Network fee', - asset: { - name: nativeCryptocurrency, - address: ethers.ZeroAddress, - }, - amount: denormalizedTransactionCost.toString(), - sources: ['wallet'], - }); - - await balanceGuard.check(true); - const nonce = await this.unit.provider.getTransactionCount(walletAddress, 'pending'); - const network = await this.unit.provider.getNetwork(); - - unsignedTx.chainId = network.chainId; - unsignedTx.gasPrice = gasPrice; - unsignedTx.nonce = nonce; - unsignedTx.from = walletAddress; - const gasLimit = await this.unit.provider.estimateGas(unsignedTx); - unsignedTx.gasLimit = gasLimit; - - const signedTx = await signer.signTransaction(unsignedTx); - const txResponse = await this.unit.provider.broadcastTransaction(signedTx); - console.log(`Remove all liquidity tx sent: ${txResponse.hash}. Waiting for confirmation...`); - const txReceipt = await txResponse.wait(); - if (txReceipt?.status === 1) { - console.log(`Remove all liquidity tx confirmed: ${txReceipt.hash}`); - } else { - console.log(`Remove all liquidity tx failed: ${txReceipt?.hash}`); - } - } -} diff --git a/src/Unit/index.ts b/src/Unit/index.ts index d79200e..c77bf1c 100644 --- a/src/Unit/index.ts +++ b/src/Unit/index.ts @@ -8,7 +8,6 @@ import type { VerboseUnitConfig, } from '../types.js'; import Exchange from './Exchange/index.js'; -import FarmingManager from './FarmingManager/index.js'; import { chains, envs } from '../config/index.js'; import type { networkCodes } from '../constants/index.js'; import { IndexerService } from '../services/Indexer/index.js'; @@ -35,8 +34,6 @@ export default class Unit { public readonly exchange: Exchange; - public readonly farmingManager: FarmingManager; - public readonly config: VerboseUnitConfig; public readonly contracts: Record; @@ -123,6 +120,5 @@ export default class Unit { this.config.basicAuth ); this.exchange = new Exchange(this); - this.farmingManager = new FarmingManager(this); } } From ba24f065edff49d50a17ad5edfca693d83e99d56 Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Mon, 18 Dec 2023 10:54:29 +0400 Subject: [PATCH 171/225] update contracts depedency --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9d3274b..b2f5812 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.32", + "version": "0.20.34-rc-0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.32", + "version": "0.20.34-rc-0", "hasInstallScript": true, "license": "ISC", "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.22.5", + "@orionprotocol/contracts": "1.22.6", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", @@ -2421,9 +2421,9 @@ } }, "node_modules/@orionprotocol/contracts": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.5.tgz", - "integrity": "sha512-kBgqMw0uqotl9UbSubw5cmEsck5aefS9l9/5DNvFfOfMLY1ewFLtn03X3/mO73ll1Y6tZBtqzYTGNZpcnk7tKA==" + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.6.tgz", + "integrity": "sha512-pPQGPNBcf1LQlNJk/Iq4BtV6ccuDSEBJhBIEORNf93vgYyUJ3SZ5O2/5y/nWgywLghPh2WwoAhnUKFeUEUmgsA==" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -13480,9 +13480,9 @@ } }, "@orionprotocol/contracts": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.5.tgz", - "integrity": "sha512-kBgqMw0uqotl9UbSubw5cmEsck5aefS9l9/5DNvFfOfMLY1ewFLtn03X3/mO73ll1Y6tZBtqzYTGNZpcnk7tKA==" + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.6.tgz", + "integrity": "sha512-pPQGPNBcf1LQlNJk/Iq4BtV6ccuDSEBJhBIEORNf93vgYyUJ3SZ5O2/5y/nWgywLghPh2WwoAhnUKFeUEUmgsA==" }, "@sinclair/typebox": { "version": "0.27.8", diff --git a/package.json b/package.json index 513f328..5b18e0c 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.22.5", + "@orionprotocol/contracts": "1.22.6", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", From fabce0540e39a9e3aa6cad7261bdac5aebfc8660 Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Mon, 18 Dec 2023 10:59:57 +0400 Subject: [PATCH 172/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5b18e0c..f3526bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.34-rc-0", + "version": "0.20.34-rc-1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 7cd71b2c60e15124eb16aa35d2d81a90ca886bcd Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Mon, 18 Dec 2023 11:10:35 +0400 Subject: [PATCH 173/225] fee parameter should be in exchange decimals --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f3526bf..d308744 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.34-rc-1", + "version": "0.20.34-rc-2", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 343723a..fa807b6 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -138,6 +138,7 @@ export async function generateSwapCalldata({ flags: 0, }; const amountNativeDecimals = await exchangeToNativeDecimals(srcToken, amount, provider); + const feeNativeDecimals = await exchangeToNativeDecimals(feeToken, fee, provider) path = SafeArray.from(arrayLikePath).map((singleSwap) => { if (singleSwap.assetIn == ethers.ZeroAddress) singleSwap.assetIn = wethAddress; @@ -152,7 +153,7 @@ export async function generateSwapCalldata({ amountNativeDecimals, matcher, feeToken, - fee, + feeNativeDecimals, wethAddress, swapExecutorContractAddress, curveRegistryAddress, @@ -210,7 +211,7 @@ async function processSwaps( )); } - ({swapDescription, calls} = payFeeToMatcher(matcher, feeToken, fee, calls, swapDescription)); + ({swapDescription, calls} = await payFeeToMatcher(matcher, feeToken, fee, calls, swapDescription)); ({ swapDescription, calls } = wrapOrUnwrapIfNeeded( amount, @@ -331,14 +332,13 @@ async function processMultiFactorySwaps( return { swapDescription, calls }; } -function payFeeToMatcher( +async function payFeeToMatcher( matcher: AddressLike, feeToken: AddressLike, feeAmount: BigNumberish, calls: BytesLike[], swapDescription: LibValidator.SwapDescriptionStruct, ) { - feeAmount = BigInt(feeAmount) if (feeAmount !== 0n && feeToken === swapDescription.dstToken) { const feePaymentCall = generateFeePaymentCall(matcher, feeToken, feeAmount) calls.push(feePaymentCall) From b38f0ba424a006eeba5d89dbf55f0ee1a5488536 Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Mon, 18 Dec 2023 11:56:27 +0400 Subject: [PATCH 174/225] convert addresslike to string --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 13 ++++++++----- src/utils/addressLikeToString.ts | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index d308744..fccdd62 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.34-rc-2", + "version": "0.20.34-rc-3", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index fa807b6..5527478 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -107,8 +107,8 @@ export async function generateSwapCalldata({ initiatorAddress, receiverAddress, path: arrayLikePath, - matcher = ZeroAddress, - feeToken = ZeroAddress, + matcher: matcherAddressLike = ZeroAddress, + feeToken: feeTokenAddressLike = ZeroAddress, fee = 0, exchangeContractAddress, wethAddress: wethAddressLike, @@ -123,6 +123,8 @@ export async function generateSwapCalldata({ const wethAddress = await addressLikeToString(wethAddressLike); const curveRegistryAddress = await addressLikeToString(curveRegistryAddressLike); const swapExecutorContractAddress = await addressLikeToString(swapExecutorContractAddressLike); + const feeToken = await addressLikeToString(feeTokenAddressLike); + const matcher = await addressLikeToString(matcherAddressLike); let path = SafeArray.from(arrayLikePath); const { assetIn: srcToken } = path.first(); @@ -333,13 +335,14 @@ async function processMultiFactorySwaps( } async function payFeeToMatcher( - matcher: AddressLike, - feeToken: AddressLike, + matcher: string, + feeToken: string, feeAmount: BigNumberish, calls: BytesLike[], swapDescription: LibValidator.SwapDescriptionStruct, ) { - if (feeAmount !== 0n && feeToken === swapDescription.dstToken) { + + if (BigInt(feeAmount) !== 0n && feeToken === swapDescription.dstToken) { const feePaymentCall = generateFeePaymentCall(matcher, feeToken, feeAmount) calls.push(feePaymentCall) } diff --git a/src/utils/addressLikeToString.ts b/src/utils/addressLikeToString.ts index 974c505..86fd132 100644 --- a/src/utils/addressLikeToString.ts +++ b/src/utils/addressLikeToString.ts @@ -5,5 +5,5 @@ export async function addressLikeToString(address: AddressLike): Promise if (typeof address !== 'string') { address = await address.getAddress() } - return address + return address.toLowerCase() } \ No newline at end of file From fc00a8bff0b0dbaed3bf2bdec203b20668c7a5bd Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Mon, 18 Dec 2023 12:42:38 +0400 Subject: [PATCH 175/225] fix types --- src/Unit/Exchange/generateSwapCalldata.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 5527478..a13096a 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -181,8 +181,8 @@ async function processSwaps( swapDescription: LibValidator.SwapDescriptionStruct, path: SafeArray, amount: BigNumberish, - matcher: AddressLike, - feeToken: AddressLike, + matcher: string, + feeToken: string, fee: BigNumberish, wethAddress: string, swapExecutorContractAddress: string, From 06f1f3d8cf25a1c9440f987dfa8dd3c5ff76319d Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Mon, 18 Dec 2023 13:01:56 +0400 Subject: [PATCH 176/225] add debug console.log --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fccdd62..0b27452 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.34-rc-3", + "version": "0.20.34-rc-4", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index a13096a..1280d2c 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -341,7 +341,10 @@ async function payFeeToMatcher( calls: BytesLike[], swapDescription: LibValidator.SwapDescriptionStruct, ) { - + console.log(matcher) + console.log(feeAmount) + console.log(feeToken) + console.log(swapDescription.dstToken) if (BigInt(feeAmount) !== 0n && feeToken === swapDescription.dstToken) { const feePaymentCall = generateFeePaymentCall(matcher, feeToken, feeAmount) calls.push(feePaymentCall) From 7672b9daf825864a5d14fa3290cfcc4aef4454e9 Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Mon, 18 Dec 2023 13:10:08 +0400 Subject: [PATCH 177/225] transform all addresses to lower case --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 0b27452..577e05f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.34-rc-4", + "version": "0.20.34-rc-5", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 1280d2c..c46f648 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -79,8 +79,10 @@ export async function generateSwapCalldataWithUnit({ let path = SafeArray.from(arrayLikePathCopy); path = SafeArray.from(arrayLikePathCopy).map((swapInfo) => { - swapInfo.assetIn = assetToAddress[swapInfo.assetIn] ?? swapInfo.assetIn.toLowerCase(); - swapInfo.assetOut = assetToAddress[swapInfo.assetOut] ?? swapInfo.assetOut.toLowerCase(); + swapInfo.assetIn = assetToAddress[swapInfo.assetIn] ?? swapInfo.assetIn + swapInfo.assetOut = assetToAddress[swapInfo.assetOut] ?? swapInfo.assetOut + swapInfo.assetIn = swapInfo.assetIn.toLowerCase() + swapInfo.assetOut = swapInfo.assetOut.toLowerCase() return swapInfo; }); From a0bed6b5b60a8badf482c0b74a50f5fc082a41a2 Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Mon, 18 Dec 2023 13:38:09 +0400 Subject: [PATCH 178/225] transform all addresses to lower case x2 --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 577e05f..8051bf3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.34-rc-5", + "version": "0.20.34-rc-6", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index c46f648..f0ac04c 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -127,7 +127,11 @@ export async function generateSwapCalldata({ const swapExecutorContractAddress = await addressLikeToString(swapExecutorContractAddressLike); const feeToken = await addressLikeToString(feeTokenAddressLike); const matcher = await addressLikeToString(matcherAddressLike); - let path = SafeArray.from(arrayLikePath); + let path = SafeArray.from(arrayLikePath).map((swapInfo) => { + swapInfo.assetIn = swapInfo.assetIn.toLowerCase() + swapInfo.assetOut = swapInfo.assetOut.toLowerCase() + return swapInfo; + }); const { assetIn: srcToken } = path.first(); const { assetOut: dstToken } = path.last(); From c7269f534eedc83398e8486adf0b72509eca25d7 Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Wed, 20 Dec 2023 14:09:32 +0400 Subject: [PATCH 179/225] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8051bf3..082551f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.34-rc-6", + "version": "0.20.35", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 8eea148a5fcecc2dd9b10af47aaf54459a2d0c60 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 26 Dec 2023 21:22:18 +0300 Subject: [PATCH 180/225] rawExchangeRestrictions --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/index.ts | 3 ++- src/services/Aggregator/ws/index.ts | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index b2f5812..ceeea41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.34-rc-0", + "version": "0.20.36", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.34-rc-0", + "version": "0.20.36", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 082551f..9175234 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.35", + "version": "0.20.36", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index e567cea..1c87daa 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -198,6 +198,7 @@ class Aggregator { partnerId?: string, fromWidget?: boolean, source?: string, + rawExchangeRestrictions?: string | undefined, ) => { const headers = { 'Content-Type': 'application/json', @@ -228,7 +229,7 @@ class Aggregator { { headers, method: 'POST', - body: JSON.stringify(signedOrder), + body: JSON.stringify({ signedOrder, rawExchangeRestrictions }), }, errorSchema, ); diff --git a/src/services/Aggregator/ws/index.ts b/src/services/Aggregator/ws/index.ts index d1ce566..69d214c 100644 --- a/src/services/Aggregator/ws/index.ts +++ b/src/services/Aggregator/ws/index.ts @@ -40,7 +40,7 @@ type SwapInfoSubscriptionPayload = { i: string // asset in o: string // asset out a: number // amount IN/OUT - es?: string[] | 'cex' | 'pools' // exchange list of all cex or all pools (ORION_POOL, UNISWAP, PANCAKESWAP etc) + es?: string // exchange list of all cex or all pools (ORION_POOL, UNISWAP, PANCAKESWAP etc) e?: boolean // is amount IN? Value `false` means a = amount OUT, `true` if omitted is?: boolean // instant settlement } From bec9dc5b3593c200c536819b0e63043fa1bc607a Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Wed, 27 Dec 2023 15:27:48 +0300 Subject: [PATCH 181/225] fix rawExchangeRestrictions --- package.json | 2 +- src/services/Aggregator/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9175234..5a85f3c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.36", + "version": "0.20.37", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index 1c87daa..1a4b229 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -229,7 +229,7 @@ class Aggregator { { headers, method: 'POST', - body: JSON.stringify({ signedOrder, rawExchangeRestrictions }), + body: JSON.stringify({ ...signedOrder, rawExchangeRestrictions }), }, errorSchema, ); From d4a94aca0272c58319acb1d73ae1d068e28a2b81 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Wed, 27 Dec 2023 20:01:54 +0300 Subject: [PATCH 182/225] added thena exchange --- package-lock.json | 4 ++-- package.json | 2 +- src/constants/exchanges.ts | 1 + src/constants/exchangesMap.ts | 1 + 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ceeea41..97e5759 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.36", + "version": "0.20.38", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.36", + "version": "0.20.38", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 5a85f3c..b2aa81c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.37", + "version": "0.20.38", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/exchanges.ts b/src/constants/exchanges.ts index 77be8cd..653ab7b 100644 --- a/src/constants/exchanges.ts +++ b/src/constants/exchanges.ts @@ -23,4 +23,5 @@ export default [ 'OKXSWAP', 'CURVE', 'CURVE_FACTORY', + 'THENA_ALGEBRA_V1', ] as const; diff --git a/src/constants/exchangesMap.ts b/src/constants/exchangesMap.ts index dc89d8d..7eedcbe 100644 --- a/src/constants/exchangesMap.ts +++ b/src/constants/exchangesMap.ts @@ -19,6 +19,7 @@ const mapping: Record = { OKXSWAP: 'OKXSwap', CURVE: 'Curve', CURVE_FACTORY: 'Curve Factory', + THENA_ALGEBRA_V1: 'Thena', }; export default mapping; From 994e6d44fa989e32698094de53eec5113f248a87 Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Thu, 4 Jan 2024 02:59:34 +0400 Subject: [PATCH 183/225] feat: return back swap market / limit --- package.json | 2 +- src/Unit/Exchange/index.ts | 14 +++++++++++++- src/Unit/Exchange/swapLimit.ts | 2 +- src/Unit/Exchange/swapMarket.ts | 4 ++-- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b2aa81c..2e0f74e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.38", + "version": "0.20.39", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/index.ts b/src/Unit/Exchange/index.ts index 23e71da..284ddef 100644 --- a/src/Unit/Exchange/index.ts +++ b/src/Unit/Exchange/index.ts @@ -1,8 +1,12 @@ import type Unit from '../index.js'; import deposit, { type DepositParams } from './deposit.js'; import getSwapInfo, { type GetSwapInfoParams } from './getSwapInfo.js'; -import {generateSwapCalldataWithUnit, type GenerateSwapCalldataWithUnitParams } from './generateSwapCalldata.js'; +import { generateSwapCalldataWithUnit, type GenerateSwapCalldataWithUnitParams } from './generateSwapCalldata.js'; import withdraw, { type WithdrawParams } from './withdraw.js'; +import type { SwapLimitParams } from './swapLimit.js'; +import swapLimit from './swapLimit.js'; +import swapMarket from './swapMarket.js'; +import type { SwapMarketParams } from './swapMarket.js'; type PureDepositParams = Omit type PureWithdrawParams = Omit @@ -44,4 +48,12 @@ export default class Exchange { unit: this.unit }) } + + public swapLimit(params: SwapLimitParams) { + return swapLimit(params); + } + + public swapMarket(params: SwapMarketParams) { + return swapMarket(params); + } } diff --git a/src/Unit/Exchange/swapLimit.ts b/src/Unit/Exchange/swapLimit.ts index d69a9e0..8ea85c2 100644 --- a/src/Unit/Exchange/swapLimit.ts +++ b/src/Unit/Exchange/swapLimit.ts @@ -334,7 +334,7 @@ export default async function swapLimit({ options?.logger?.(`Transaction sent. Tx hash: ${swapThroughOrionPoolTxResponse.hash}`); return { amountOut: swapInfo.amountOut, - wait: swapThroughOrionPoolTxResponse.wait, + wait: swapThroughOrionPoolTxResponse.wait.bind(swapThroughOrionPoolTxResponse), through: 'pool', txHash: swapThroughOrionPoolTxResponse.hash, }; diff --git a/src/Unit/Exchange/swapMarket.ts b/src/Unit/Exchange/swapMarket.ts index 0557e56..afcbaf0 100644 --- a/src/Unit/Exchange/swapMarket.ts +++ b/src/Unit/Exchange/swapMarket.ts @@ -45,7 +45,7 @@ export default async function swapMarket({ options, }: SwapMarketParams): Promise { if (options?.developer) options.logger?.('YOU SPECIFIED A DEVELOPER OPTIONS. BE CAREFUL!'); - + if (amount === '') throw new Error('Amount can not be empty'); if (assetIn === '') throw new Error('AssetIn can not be empty'); if (assetOut === '') throw new Error('AssetOut can not be empty'); @@ -285,7 +285,7 @@ export default async function swapMarket({ options?.logger?.(`Transaction sent. Tx hash: ${swapThroughOrionPoolTxResponse.hash}`); return { amountOut: swapInfo.amountOut, - wait: swapThroughOrionPoolTxResponse.wait, + wait: swapThroughOrionPoolTxResponse.wait.bind(swapThroughOrionPoolTxResponse), through: 'pool', txHash: swapThroughOrionPoolTxResponse.hash, }; From 0633f9c1139fd7b4bf4b7d80453a14bbc900c790 Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Thu, 4 Jan 2024 11:21:04 +0400 Subject: [PATCH 184/225] fix: swapMarket / swapLimit --- src/Unit/Exchange/index.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Unit/Exchange/index.ts b/src/Unit/Exchange/index.ts index 284ddef..217afb3 100644 --- a/src/Unit/Exchange/index.ts +++ b/src/Unit/Exchange/index.ts @@ -12,6 +12,8 @@ type PureDepositParams = Omit type PureWithdrawParams = Omit type PureGetSwapMarketInfoParams = Omit type PureGenerateSwapCalldataParams = Omit +type PureSwapLimitParams = Omit +type PureSwapMarketParams = Omit export default class Exchange { private readonly unit: Unit; @@ -49,11 +51,17 @@ export default class Exchange { }) } - public swapLimit(params: SwapLimitParams) { - return swapLimit(params); + public swapLimit(params: PureSwapLimitParams) { + return swapLimit({ + ...params, + unit: this.unit, + }); } - public swapMarket(params: SwapMarketParams) { - return swapMarket(params); + public swapMarket(params: PureSwapMarketParams) { + return swapMarket({ + ...params, + unit: this.unit, + }); } } From c42e660867264303ac39a657eb989833875c461d Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Thu, 4 Jan 2024 17:47:53 +0400 Subject: [PATCH 185/225] fix: `swapMarket` and `swapLimit` --- package-lock.json | 4 +- src/Unit/Exchange/swapLimit.ts | 73 +++++++++++------- src/Unit/Exchange/swapMarket.ts | 74 ++++++++++++------- .../Aggregator/schemas/swapInfoSchema.ts | 14 ++-- src/utils/isValidFactory.ts | 8 ++ 5 files changed, 115 insertions(+), 58 deletions(-) create mode 100644 src/utils/isValidFactory.ts diff --git a/package-lock.json b/package-lock.json index 97e5759..2671eeb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.38", + "version": "0.20.39", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.38", + "version": "0.20.39", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/src/Unit/Exchange/swapLimit.ts b/src/Unit/Exchange/swapLimit.ts index 8ea85c2..6c9f4c8 100644 --- a/src/Unit/Exchange/swapLimit.ts +++ b/src/Unit/Exchange/swapLimit.ts @@ -12,6 +12,10 @@ import { signOrder } from '../../crypt/index.js'; import type orderSchema from '../../services/Aggregator/schemas/orderSchema.js'; import type { z } from 'zod'; import { simpleFetch } from 'simple-typed-fetch'; +import { generateSwapCalldata } from './generateSwapCalldata.js'; +import isValidFactory from '../../utils/isValidFactory.js'; +import type { SingleSwap } from '../../types.js'; +import { must, safeGet } from '../../utils/safeGetters.js'; export type SwapLimitParams = { type: 'exactSpend' | 'exactReceive' @@ -49,6 +53,10 @@ type PoolSwap = { export type Swap = AggregatorOrder | PoolSwap; +const isValidSingleSwap = (singleSwap: Omit & { factory: string }): singleSwap is SingleSwap => { + return isValidFactory(singleSwap.factory); +} + export default async function swapLimit({ type, assetIn, @@ -85,6 +93,7 @@ export default async function swapLimit({ exchangeContractAddress, matcherAddress, assetToAddress, + swapExecutorContractAddress, } = await simpleFetch(blockchainService.getInfo)(); const nativeCryptocurrency = getNativeCryptocurrencyName(assetToAddress); @@ -92,7 +101,8 @@ export default async function swapLimit({ const feeAssets = await simpleFetch(blockchainService.getPlatformFees)({ walletAddress, assetIn, assetOut }); const allPrices = await simpleFetch(blockchainService.getPricesWithQuoteAsset)(); const gasPriceWei = await simpleFetch(blockchainService.getGasPriceWei)(); - const { factories } = await simpleFetch(blockchainService.getPoolsConfig)(); + const { factories, WETHAddress } = await simpleFetch(blockchainService.getPoolsConfig)(); + must(WETHAddress, 'WETHAddress is not defined'); const poolExchangesList = factories !== undefined ? Object.keys(factories) : []; const gasPriceGwei = ethers.formatUnits(gasPriceWei, 'gwei').toString(); @@ -138,7 +148,7 @@ export default async function swapLimit({ : undefined, ); - const { exchanges: swapExchanges } = swapInfo; + const { exchanges: swapExchanges, exchangeContractPath } = swapInfo; const [firstSwapExchange] = swapExchanges; @@ -236,12 +246,6 @@ export default async function swapLimit({ if (factoryAddress !== undefined) options?.logger?.(`Factory address is ${factoryAddress}. Exchange is ${firstSwapExchange}`); } - const pathAddresses = swapInfo.path.map((name) => { - const assetAddress = assetToAddress[name]; - if (assetAddress === undefined) throw new Error(`No asset address for ${name}`); - return assetAddress; - }); - const amountSpend = swapInfo.type === 'exactSpend' ? swapInfo.amountIn : new BigNumber(swapInfo.orderInfo.amount).multipliedBy(swapInfo.orderInfo.safePrice) @@ -271,33 +275,52 @@ export default async function swapLimit({ BigNumber.ROUND_FLOOR, ); - const unsignedSwapThroughOrionPoolTx = await exchangeContract.swapThroughOrionPool.populateTransaction( - amountSpendBlockchainParam, - amountReceiveBlockchainParam, - factoryAddress !== undefined - ? [factoryAddress, ...pathAddresses] - : pathAddresses, - type === 'exactSpend', + const { calldata, swapDescription, value } = await generateSwapCalldata({ + amount: amountSpendBlockchainParam, + minReturnAmount: amountReceiveBlockchainParam, + path: exchangeContractPath.filter(isValidSingleSwap), + initiatorAddress: walletAddress, + receiverAddress: walletAddress, + provider, + + matcher: matcherAddress, + feeToken: feeAssetAddress, + fee: 0, + exchangeContractAddress, + swapExecutorContractAddress, + wethAddress: WETHAddress, + + curveRegistryAddress: safeGet(unit.contracts, 'curveRegistry'), + }) + + const unsignedSwapThroughPoolsTx = await exchangeContract.swap.populateTransaction( + swapExecutorContractAddress, + swapDescription, + new Uint8Array(0), + calldata, + { + value + } ); - unsignedSwapThroughOrionPoolTx.chainId = BigInt(parseInt(chainId, 10)); - unsignedSwapThroughOrionPoolTx.gasPrice = BigInt(gasPriceWei); + unsignedSwapThroughPoolsTx.chainId = BigInt(parseInt(chainId, 10)); + unsignedSwapThroughPoolsTx.gasPrice = BigInt(gasPriceWei); - unsignedSwapThroughOrionPoolTx.from = walletAddress; + unsignedSwapThroughPoolsTx.from = walletAddress; const amountSpendBN = new BigNumber(amountSpend); - let value = new BigNumber(0); + let txValue = new BigNumber(0); const denormalizedAssetInExchangeBalance = balances[assetIn]?.exchange; if (denormalizedAssetInExchangeBalance === undefined) throw new Error(`Asset '${assetIn}' exchange balance is not found`); if (assetIn === nativeCryptocurrency && amountSpendBN.gt(denormalizedAssetInExchangeBalance)) { - value = amountSpendBN.minus(denormalizedAssetInExchangeBalance); + txValue = amountSpendBN.minus(denormalizedAssetInExchangeBalance); } - unsignedSwapThroughOrionPoolTx.value = normalizeNumber( - value.dp(INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_CEIL), + unsignedSwapThroughPoolsTx.value = normalizeNumber( + txValue.dp(INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_CEIL), NATIVE_CURRENCY_PRECISION, BigNumber.ROUND_CEIL, ); - unsignedSwapThroughOrionPoolTx.gasLimit = BigInt(SWAP_THROUGH_ORION_POOL_GAS_LIMIT); + unsignedSwapThroughPoolsTx.gasLimit = BigInt(SWAP_THROUGH_ORION_POOL_GAS_LIMIT); const transactionCost = BigInt(SWAP_THROUGH_ORION_POOL_GAS_LIMIT) * BigInt(gasPriceWei); const denormalizedTransactionCost = denormalizeNumber(transactionCost, BigInt(NATIVE_CURRENCY_PRECISION)); @@ -327,10 +350,10 @@ export default async function swapLimit({ await balanceGuard.check(options?.autoApprove); const nonce = await provider.getTransactionCount(walletAddress, 'pending'); - unsignedSwapThroughOrionPoolTx.nonce = nonce; + unsignedSwapThroughPoolsTx.nonce = nonce; options?.logger?.('Signing transaction...'); - const swapThroughOrionPoolTxResponse = await signer.sendTransaction(unsignedSwapThroughOrionPoolTx); + const swapThroughOrionPoolTxResponse = await signer.sendTransaction(unsignedSwapThroughPoolsTx); options?.logger?.(`Transaction sent. Tx hash: ${swapThroughOrionPoolTxResponse.hash}`); return { amountOut: swapInfo.amountOut, diff --git a/src/Unit/Exchange/swapMarket.ts b/src/Unit/Exchange/swapMarket.ts index afcbaf0..c4c0b05 100644 --- a/src/Unit/Exchange/swapMarket.ts +++ b/src/Unit/Exchange/swapMarket.ts @@ -12,6 +12,10 @@ import type orderSchema from '../../services/Aggregator/schemas/orderSchema.js'; import type { z } from 'zod'; import type { SwapLimitParams } from './swapLimit.js'; import { simpleFetch } from 'simple-typed-fetch'; +import { generateSwapCalldata } from './generateSwapCalldata.js'; +import isValidFactory from '../../utils/isValidFactory.js'; +import type { SingleSwap } from '../../types.js'; +import { must, safeGet } from '../../utils/safeGetters.js'; export type SwapMarketParams = Omit & { slippagePercent: BigNumber.Value @@ -33,6 +37,11 @@ type PoolSwap = { export type Swap = AggregatorOrder | PoolSwap; + +const isValidSingleSwap = (singleSwap: Omit & { factory: string }): singleSwap is SingleSwap => { + return isValidFactory(singleSwap.factory); +} + export default async function swapMarket({ type, assetIn, @@ -71,6 +80,7 @@ export default async function swapMarket({ exchangeContractAddress, matcherAddress, assetToAddress, + swapExecutorContractAddress, } = await simpleFetch(blockchainService.getInfo)(); const nativeCryptocurrency = getNativeCryptocurrencyName(assetToAddress); @@ -78,7 +88,8 @@ export default async function swapMarket({ const feeAssets = await simpleFetch(blockchainService.getPlatformFees)({ walletAddress, assetIn, assetOut }); const allPrices = await simpleFetch(blockchainService.getPricesWithQuoteAsset)(); const gasPriceWei = await simpleFetch(blockchainService.getGasPriceWei)(); - const { factories } = await simpleFetch(blockchainService.getPoolsConfig)(); + const { factories, WETHAddress } = await simpleFetch(blockchainService.getPoolsConfig)(); + must(WETHAddress, 'WETHAddress is not defined'); const poolExchangesList = factories !== undefined ? Object.keys(factories) : []; const gasPriceGwei = ethers.formatUnits(gasPriceWei, 'gwei').toString(); @@ -124,7 +135,7 @@ export default async function swapMarket({ : undefined, ); - const { exchanges: swapExchanges } = swapInfo; + const { exchanges: swapExchanges, exchangeContractPath } = swapInfo; const [firstSwapExchange] = swapExchanges; @@ -185,12 +196,6 @@ export default async function swapMarket({ if (factoryAddress !== undefined) options?.logger?.(`Factory address is ${factoryAddress}. Exchange is ${firstSwapExchange}`); } - const pathAddresses = swapInfo.path.map((name) => { - const assetAddress = assetToAddress[name]; - if (assetAddress === undefined) throw new Error(`No asset address for ${name}`); - return assetAddress; - }); - const amountOutWithSlippage = new BigNumber(swapInfo.amountOut) .multipliedBy(new BigNumber(1).minus(percent)) .toString(); @@ -222,33 +227,52 @@ export default async function swapMarket({ INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR, ); - const unsignedSwapThroughOrionPoolTx = await exchangeContract.swapThroughOrionPool.populateTransaction( - amountSpendBlockchainParam.toString(), - amountReceiveBlockchainParam.toString(), - factoryAddress !== undefined - ? [factoryAddress, ...pathAddresses] - : pathAddresses, - type === 'exactSpend', + const { calldata, swapDescription, value } = await generateSwapCalldata({ + amount: amountSpendBlockchainParam, + minReturnAmount: amountReceiveBlockchainParam, + path: exchangeContractPath.filter(isValidSingleSwap), + initiatorAddress: walletAddress, + receiverAddress: walletAddress, + provider, + + matcher: matcherAddress, + feeToken: feeAssetAddress, + fee: 0, + exchangeContractAddress, + swapExecutorContractAddress, + wethAddress: WETHAddress, + + curveRegistryAddress: safeGet(unit.contracts, 'curveRegistry'), + }) + + const unsignedSwapThroughPoolsTx = await exchangeContract.swap.populateTransaction( + swapExecutorContractAddress, + swapDescription, + new Uint8Array(0), + calldata, + { + value + } ); - unsignedSwapThroughOrionPoolTx.chainId = BigInt(chainId); - unsignedSwapThroughOrionPoolTx.gasPrice = BigInt(gasPriceWei); + unsignedSwapThroughPoolsTx.chainId = BigInt(parseInt(chainId, 10)); + unsignedSwapThroughPoolsTx.gasPrice = BigInt(gasPriceWei); - unsignedSwapThroughOrionPoolTx.from = walletAddress; + unsignedSwapThroughPoolsTx.from = walletAddress; const amountSpendBN = new BigNumber(amountSpend); - let value = new BigNumber(0); + let txValue = new BigNumber(0); const denormalizedAssetInExchangeBalance = balances[assetIn]?.exchange; if (denormalizedAssetInExchangeBalance === undefined) throw new Error(`Asset '${assetIn}' exchange balance is not found`); if (assetIn === nativeCryptocurrency && amountSpendBN.gt(denormalizedAssetInExchangeBalance)) { - value = amountSpendBN.minus(denormalizedAssetInExchangeBalance); + txValue = amountSpendBN.minus(denormalizedAssetInExchangeBalance); } - unsignedSwapThroughOrionPoolTx.value = normalizeNumber( - value.dp(INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_CEIL), + unsignedSwapThroughPoolsTx.value = normalizeNumber( + txValue.dp(INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_CEIL), NATIVE_CURRENCY_PRECISION, BigNumber.ROUND_CEIL, ); - unsignedSwapThroughOrionPoolTx.gasLimit = BigInt(SWAP_THROUGH_ORION_POOL_GAS_LIMIT); + unsignedSwapThroughPoolsTx.gasLimit = BigInt(SWAP_THROUGH_ORION_POOL_GAS_LIMIT); const transactionCost = BigInt(SWAP_THROUGH_ORION_POOL_GAS_LIMIT) * BigInt(gasPriceWei); const denormalizedTransactionCost = denormalizeNumber(transactionCost, BigInt(NATIVE_CURRENCY_PRECISION)); @@ -278,10 +302,10 @@ export default async function swapMarket({ await balanceGuard.check(options?.autoApprove); const nonce = await provider.getTransactionCount(walletAddress, 'pending'); - unsignedSwapThroughOrionPoolTx.nonce = nonce; + unsignedSwapThroughPoolsTx.nonce = nonce; options?.logger?.('Signing transaction...'); - const swapThroughOrionPoolTxResponse = await signer.sendTransaction(unsignedSwapThroughOrionPoolTx); + const swapThroughOrionPoolTxResponse = await signer.sendTransaction(unsignedSwapThroughPoolsTx); options?.logger?.(`Transaction sent. Tx hash: ${swapThroughOrionPoolTxResponse.hash}`); return { amountOut: swapInfo.amountOut, diff --git a/src/services/Aggregator/schemas/swapInfoSchema.ts b/src/services/Aggregator/schemas/swapInfoSchema.ts index 049c8bc..ecbd440 100644 --- a/src/services/Aggregator/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/schemas/swapInfoSchema.ts @@ -7,6 +7,13 @@ const orderInfoSchema = z.object({ safePrice: z.number(), }).nullable(); +const exchangeContractStep = z.object({ + pool: z.string(), + assetIn: z.string(), + assetOut: z.string(), + factory: z.string(), +}); + const swapInfoBase = z.object({ id: z.string(), amountIn: z.number(), @@ -22,12 +29,7 @@ const swapInfoBase = z.object({ minAmountOut: z.number(), minAmountIn: z.number(), marketPrice: z.number().nullable(), // spending asset market price - exchangeContractPath: z.array(z.object({ - pool: z.string(), - assetIn: z.string(), - assetOut: z.string(), - factory: z.string(), - })), + exchangeContractPath: z.array(exchangeContractStep), alternatives: z.object({ // execution alternatives exchanges: z.array(z.string()), path: z.array(z.string()), diff --git a/src/utils/isValidFactory.ts b/src/utils/isValidFactory.ts new file mode 100644 index 0000000..16fa2a3 --- /dev/null +++ b/src/utils/isValidFactory.ts @@ -0,0 +1,8 @@ +import { type Factory } from '../types.js'; +import { factories } from '../index.js'; + +const isValidFactory = (factory: string): factory is Factory => { + return factories.some((f) => f === factory); +}; + +export default isValidFactory; From 11a5bd9be00f7bfbfe0361a575aee39c6724941e Mon Sep 17 00:00:00 2001 From: kigastu Date: Thu, 4 Jan 2024 18:08:21 +0300 Subject: [PATCH 186/225] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2e0f74e..2b28918 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.39", + "version": "0.20.40", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 9002b4553f5110bf2f56c38efeae651c47ab8a7f Mon Sep 17 00:00:00 2001 From: Alex Kraiz Date: Tue, 9 Jan 2024 04:36:48 +0400 Subject: [PATCH 187/225] fix: unnecessary space in config; fix order schema removed unnecessary fields --- package.json | 2 +- src/config/chains.json | 2 +- src/services/Aggregator/schemas/orderSchema.ts | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 2b28918..fc99e35 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.40", + "version": "0.20.41", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/config/chains.json b/src/config/chains.json index ceb66e6..4fad92a 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -18,7 +18,7 @@ "label": "BNB Chain", "shortName": "BSC", "code": "bsc", - "rpc": " https://bsc-dataseed.bnbchain.org/", + "rpc": "https://bsc-dataseed.bnbchain.org/", "baseCurrencyName": "BNB", "contracts": { "WETH": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", diff --git a/src/services/Aggregator/schemas/orderSchema.ts b/src/services/Aggregator/schemas/orderSchema.ts index 77d2347..76f8c1a 100644 --- a/src/services/Aggregator/schemas/orderSchema.ts +++ b/src/services/Aggregator/schemas/orderSchema.ts @@ -43,8 +43,6 @@ const tradeInfoSchema = z.object({ updateTime: z.number(), matchedBlockchainOrder: blockchainOrderSchema.optional(), matchedSubOrderId: z.number().int().nonnegative().optional(), - exchangeTradeInfo: z.boolean(), - poolTradeInfo: z.boolean(), }); const baseOrderSchema = z.object({ From 5edd39b63f427b7b6f1ea89449ce3ede5011c46a Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Wed, 10 Jan 2024 21:45:02 +0300 Subject: [PATCH 188/225] update X-Source type --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/index.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2671eeb..685e05c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.39", + "version": "0.20.42", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.39", + "version": "0.20.42", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index fc99e35..90d430e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.41", + "version": "0.20.42", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index 1a4b229..82c3b2a 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -197,7 +197,7 @@ class Aggregator { isReversedOrder?: boolean, partnerId?: string, fromWidget?: boolean, - source?: string, + source?: 'TERMINAL' | 'SWAP_UI', rawExchangeRestrictions?: string | undefined, ) => { const headers = { From 93dc28805523d310b46c776dabeb7934f255dcf1 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Thu, 11 Jan 2024 12:55:32 +0000 Subject: [PATCH 189/225] feat: added new networks Arbitrum and opBNB --- src/config/chains.json | 25 ++++++++++++++++++++++++ src/config/envs.json | 36 +++++++++++++++++++++++++++++++++++ src/constants/chains.ts | 2 ++ src/constants/networkCodes.ts | 2 +- src/types.ts | 4 +++- 5 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/config/chains.json b/src/config/chains.json index 4fad92a..968c971 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -38,6 +38,18 @@ "curveRegistry": "0x93461072c00b2740c474a3d52c70be6249c802d8" } }, + "204": { + "chainId": "204", + "explorer": "http://opbnbscan.com/", + "label": "opBNB Chain", + "shortName": "opBNB", + "code": "opbnb", + "rpc": "https://opbnb-mainnet-rpc.bnbchain.org", + "baseCurrencyName": "BNB", + "contracts": { + "WETH": "0x4200000000000000000000000000000000000006", + } + }, "3": { "chainId": "3", "explorer": "https://ropsten.etherscan.io/", @@ -77,6 +89,19 @@ "curveRegistry": "" } }, + "42161": { + "chainId": "42161", + "explorer": "https://arbiscan.io/", + "label": "Arbitrum", + "shortName": "Arbitrum", + "code": "arb", + "rpc": "https://arb1.arbitrum.io/rpc", + "baseCurrencyName": "ARB", + "contracts": { + "WETH": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "curveRegistiry": "0x445FE580eF8d70FF569aB36e80c647af338db351", + } + }, "4002": { "chainId": "4002", "explorer": "https://testnet.ftmscan.com/", diff --git a/src/config/envs.json b/src/config/envs.json index be254cf..8672516 100644 --- a/src/config/envs.json +++ b/src/config/envs.json @@ -93,6 +93,42 @@ "http": "/orion-indexer/" } } + }, + "42161": { + "api": "https://trade.orion.xyz/arbitrum-mainnet", + "services": { + "aggregator": { + "http": "/backend", + "ws": "/v1" + }, + "blockchain": { + "http": "" + }, + "priceFeed": { + "all": "/price-feed" + }, + "indexer": { + "http": "/orion-indexer/" + } + } + }, + "204": { + "api": "https://trade.orion.xyz/opbnb-mainnet", + "services": { + "aggregator": { + "http": "/backend", + "ws": "/v1" + }, + "blockchain": { + "http": "" + }, + "priceFeed": { + "all": "/price-feed" + }, + "indexer": { + "http": "/orion-indexer/" + } + } } } }, diff --git a/src/constants/chains.ts b/src/constants/chains.ts index 790a42d..74135ed 100644 --- a/src/constants/chains.ts +++ b/src/constants/chains.ts @@ -15,4 +15,6 @@ export const productionChains = [ SupportedChainId.FANTOM_OPERA, SupportedChainId.POLYGON, SupportedChainId.OKC, + SupportedChainId.ARBITRUM, + SupportedChainId.OPBNB, ]; diff --git a/src/constants/networkCodes.ts b/src/constants/networkCodes.ts index 75fe8ee..d04ac04 100644 --- a/src/constants/networkCodes.ts +++ b/src/constants/networkCodes.ts @@ -1 +1 @@ -export default ['ftm', 'bsc', 'eth', 'polygon', 'okc', 'arb', 'drip'] as const; +export default ['ftm', 'bsc', 'eth', 'polygon', 'okc', 'arb', 'drip', 'opbnb'] as const; diff --git a/src/types.ts b/src/types.ts index 7511476..4685276 100644 --- a/src/types.ts +++ b/src/types.ts @@ -83,10 +83,11 @@ export enum SupportedChainId { MAINNET = '1', ROPSTEN = '3', GOERLI = '5', - ARBITRUM_GOERLI = '421613', + ARBITRUM = '42161', FANTOM_OPERA = '250', POLYGON = '137', OKC = '66', + OPBNB = '204', POLYGON_TESTNET = '80001', FANTOM_TESTNET = '4002', @@ -94,6 +95,7 @@ export enum SupportedChainId { BSC_TESTNET = '97', OKC_TESTNET = '65', DRIP_TESTNET = '56303', + ARBITRUM_GOERLI = '421613', // For testing and debug purpose // BROKEN = '0', From 59f8356da11bbd5172484e0d9bea445346ba31a4 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Thu, 11 Jan 2024 12:56:11 +0000 Subject: [PATCH 190/225] feat: update version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 90d430e..363a5af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42", + "version": "0.20.43-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From ad669fd3a608f73cf271090b71af3b560613e688 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Thu, 11 Jan 2024 13:08:55 +0000 Subject: [PATCH 191/225] bug: fixed build fail --- src/config/chains.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config/chains.json b/src/config/chains.json index 968c971..ea887a8 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -47,7 +47,7 @@ "rpc": "https://opbnb-mainnet-rpc.bnbchain.org", "baseCurrencyName": "BNB", "contracts": { - "WETH": "0x4200000000000000000000000000000000000006", + "WETH": "0x4200000000000000000000000000000000000006" } }, "3": { @@ -99,7 +99,7 @@ "baseCurrencyName": "ARB", "contracts": { "WETH": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", - "curveRegistiry": "0x445FE580eF8d70FF569aB36e80c647af338db351", + "curveRegistiry": "0x445FE580eF8d70FF569aB36e80c647af338db351" } }, "4002": { From 627e6f70be017c5d30a5ca3ca90f22fda547d984 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 16 Jan 2024 11:06:24 +0300 Subject: [PATCH 192/225] update x-source --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/index.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 685e05c..30b438e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42", + "version": "0.20.43", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.42", + "version": "0.20.43", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 90d430e..6a52d8c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42", + "version": "0.20.43", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index 82c3b2a..3d52508 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -197,7 +197,7 @@ class Aggregator { isReversedOrder?: boolean, partnerId?: string, fromWidget?: boolean, - source?: 'TERMINAL' | 'SWAP_UI', + source?: 'TERMINAL_MARKET' | 'TERMINAL_LIMIT' | 'SWAP_UI', rawExchangeRestrictions?: string | undefined, ) => { const headers = { From 769719293fd9f0d9042ff29e4a0450fcd7349bc6 Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Tue, 16 Jan 2024 19:32:26 +0400 Subject: [PATCH 193/225] fix: make matcher, feeAsset, fee fields of BaseGenerateSwapCalldata optional --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 25 ++++++++--------------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 6a52d8c..e2a7870 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.43", + "version": "0.20.44", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index f0ac04c..91f3fe6 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -23,27 +23,22 @@ import { generateFeePaymentCall } from "./callGenerators/feePayment.js"; export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3"; -export type GenerateSwapCalldataWithUnitParams = { +type BaseGenerateSwapCalldataParams = { amount: BigNumberish; minReturnAmount: BigNumberish; initiatorAddress: string; receiverAddress: string; - matcher: AddressLike, - feeToken: AddressLike, - fee: BigNumberish; path: ArrayLike; + matcher?: AddressLike, + feeToken?: AddressLike, + fee?: BigNumberish; +} + +export type GenerateSwapCalldataWithUnitParams = BaseGenerateSwapCalldataParams & { unit: Unit; }; -export type GenerateSwapCalldataParams = { - amount: BigNumberish; - minReturnAmount: BigNumberish; - initiatorAddress: string; - receiverAddress: string; - path: ArrayLike; - matcher: AddressLike, - feeToken: AddressLike, - fee: BigNumberish; +export type GenerateSwapCalldataParams = BaseGenerateSwapCalldataParams & { exchangeContractAddress: AddressLike; wethAddress: AddressLike; curveRegistryAddress: AddressLike; @@ -347,10 +342,6 @@ async function payFeeToMatcher( calls: BytesLike[], swapDescription: LibValidator.SwapDescriptionStruct, ) { - console.log(matcher) - console.log(feeAmount) - console.log(feeToken) - console.log(swapDescription.dstToken) if (BigInt(feeAmount) !== 0n && feeToken === swapDescription.dstToken) { const feePaymentCall = generateFeePaymentCall(matcher, feeToken, feeAmount) calls.push(feePaymentCall) From a8a11184ef7673692e3801389199f09162afe98e Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 22 Jan 2024 19:10:51 +0300 Subject: [PATCH 194/225] update OrderSource type --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/index.ts | 6 ++---- src/types.ts | 2 ++ 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 30b438e..01ec2eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.43", + "version": "0.20.45", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.43", + "version": "0.20.45", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index e2a7870..577092e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.44", + "version": "0.20.45", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index 3d52508..64cdc45 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -8,7 +8,7 @@ import errorSchema from './schemas/errorSchema.js'; import placeAtomicSwapSchema from './schemas/placeAtomicSwapSchema.js'; import { AggregatorWS } from './ws/index.js'; import { atomicSwapHistorySchema } from './schemas/atomicSwapHistorySchema.js'; -import type { BasicAuthCredentials, SignedCancelOrderRequest, SignedOrder } from '../../types.js'; +import type { BasicAuthCredentials, OrderSource, SignedCancelOrderRequest, SignedOrder } from '../../types.js'; import { pairConfigSchema, aggregatedOrderbookSchema, exchangeOrderbookSchema, poolReservesSchema, @@ -196,8 +196,7 @@ class Aggregator { isCreateInternalOrder: boolean, isReversedOrder?: boolean, partnerId?: string, - fromWidget?: boolean, - source?: 'TERMINAL_MARKET' | 'TERMINAL_LIMIT' | 'SWAP_UI', + source?: OrderSource, rawExchangeRestrictions?: string | undefined, ) => { const headers = { @@ -207,7 +206,6 @@ class Aggregator { 'X-Reverse-Order': isReversedOrder ? 'true' : 'false', }, ...(partnerId !== undefined) && { 'X-Partner-Id': partnerId }, - ...(fromWidget !== undefined) && { 'X-From-Widget': fromWidget ? 'true' : 'false' }, ...(source !== undefined) && { 'X-Source': source }, ...this.basicAuthHeaders, }; diff --git a/src/types.ts b/src/types.ts index 7511476..930c150 100644 --- a/src/types.ts +++ b/src/types.ts @@ -452,3 +452,5 @@ export type AtomicSwap = Partial< refundTx?: TransactionInfo | undefined liquidityMigrationTx?: TransactionInfo | undefined } + +export type OrderSource = 'TERMINAL_MARKET' | 'TERMINAL_LIMIT' | 'SWAP_UI' | 'WIDGET'; From 093274f6b7054aac1a7bce2f72be27ac25d00a40 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Tue, 23 Jan 2024 08:13:34 +0000 Subject: [PATCH 195/225] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9560eb9..1499d11 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.43-rc1", + "version": "0.20.46", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From ae57cb6fac501ebc2795961e55b0a279076e591d Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Tue, 23 Jan 2024 14:20:45 +0000 Subject: [PATCH 196/225] feat: updated envs.json --- package.json | 2 +- src/config/envs.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1499d11..ff28130 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.46", + "version": "0.20.47", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/config/envs.json b/src/config/envs.json index 8672516..f52aa93 100644 --- a/src/config/envs.json +++ b/src/config/envs.json @@ -95,7 +95,7 @@ } }, "42161": { - "api": "https://trade.orion.xyz/arbitrum-mainnet", + "api": "https://trade.orion.xyz/arbitrum-one", "services": { "aggregator": { "http": "/backend", From 01b4d9d76b176d50b2e6f59fff2189bdec95199e Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Tue, 23 Jan 2024 15:31:28 +0000 Subject: [PATCH 197/225] feat: added staging networks to envs.json --- package.json | 2 +- src/config/envs.json | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ff28130..0bf3ef1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.47", + "version": "0.20.48", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/config/envs.json b/src/config/envs.json index f52aa93..d063dad 100644 --- a/src/config/envs.json +++ b/src/config/envs.json @@ -340,6 +340,42 @@ "http": "/orion-indexer/" } } + }, + "42161": { + "api": "https://trade.orion.xyz/arbitrum-one", + "services": { + "aggregator": { + "http": "/backend", + "ws": "/v1" + }, + "blockchain": { + "http": "" + }, + "priceFeed": { + "all": "/price-feed" + }, + "indexer": { + "http": "/orion-indexer/" + } + } + }, + "204": { + "api": "https://trade.orion.xyz/opbnb-mainnet", + "services": { + "aggregator": { + "http": "/backend", + "ws": "/v1" + }, + "blockchain": { + "http": "" + }, + "priceFeed": { + "all": "/price-feed" + }, + "indexer": { + "http": "/orion-indexer/" + } + } } } }, From 27f6acdc7e27caffb5fd2dd9a95460765cd149f5 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Tue, 23 Jan 2024 15:36:22 +0000 Subject: [PATCH 198/225] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0bf3ef1..19d7b15 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.48", + "version": "0.20.49", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 0a002617971ba7a44d3cc783de5c481f313d558e Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Tue, 23 Jan 2024 15:39:07 +0000 Subject: [PATCH 199/225] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19d7b15..0bf3ef1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.49", + "version": "0.20.48", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 301b38f9aab07b42daf7455b93e79f56cc15bd78 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Tue, 23 Jan 2024 16:27:05 +0000 Subject: [PATCH 200/225] feat: updated staging networks to envs.json --- package.json | 2 +- src/config/envs.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 0bf3ef1..19d7b15 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.48", + "version": "0.20.49", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/config/envs.json b/src/config/envs.json index d063dad..d8ba4d2 100644 --- a/src/config/envs.json +++ b/src/config/envs.json @@ -342,7 +342,7 @@ } }, "42161": { - "api": "https://trade.orion.xyz/arbitrum-one", + "api": "https://staging.orion.xyz/arbitrum-one", "services": { "aggregator": { "http": "/backend", @@ -360,7 +360,7 @@ } }, "204": { - "api": "https://trade.orion.xyz/opbnb-mainnet", + "api": "https://staging.orion.xyz/opbnb-mainnet", "services": { "aggregator": { "http": "/backend", From fab7417e02ecb8e1b1441a1848026ae2134b3bc7 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 30 Jan 2024 11:57:27 +0300 Subject: [PATCH 201/225] update referral link schema --- package-lock.json | 4 ++-- package.json | 2 +- src/services/ReferralSystem/schemas/inviteCodeLinkSchema.ts | 2 +- src/services/ReferralSystem/schemas/linkSchema.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 01ec2eb..f2708ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.45", + "version": "0.20.50", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.45", + "version": "0.20.50", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 19d7b15..ab6bd22 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.49", + "version": "0.20.50", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/ReferralSystem/schemas/inviteCodeLinkSchema.ts b/src/services/ReferralSystem/schemas/inviteCodeLinkSchema.ts index 248ff96..468d773 100644 --- a/src/services/ReferralSystem/schemas/inviteCodeLinkSchema.ts +++ b/src/services/ReferralSystem/schemas/inviteCodeLinkSchema.ts @@ -3,8 +3,8 @@ import { z } from 'zod'; const inviteCodeLinkSchema = z.object({ link: z .object({ + status: z.string(), referer: z.string(), - ref_link: z.string(), }) .nullable(), invite: z diff --git a/src/services/ReferralSystem/schemas/linkSchema.ts b/src/services/ReferralSystem/schemas/linkSchema.ts index 20545f2..f9d3a4c 100644 --- a/src/services/ReferralSystem/schemas/linkSchema.ts +++ b/src/services/ReferralSystem/schemas/linkSchema.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; const linkSchema = z.object({ + status: z.string(), referer: z.string(), - ref_link: z.string(), }); export default linkSchema; From 85963892cb8769efc08f67800f1d26b741451b1f Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 30 Jan 2024 12:13:44 +0300 Subject: [PATCH 202/225] fix: invite code link schema --- package-lock.json | 4 ++-- package.json | 2 +- src/services/ReferralSystem/schemas/inviteCodeLinkSchema.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index f2708ec..6aabaf4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.50", + "version": "0.20.51", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.50", + "version": "0.20.51", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index ab6bd22..8958aad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.50", + "version": "0.20.51", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/ReferralSystem/schemas/inviteCodeLinkSchema.ts b/src/services/ReferralSystem/schemas/inviteCodeLinkSchema.ts index 468d773..248ff96 100644 --- a/src/services/ReferralSystem/schemas/inviteCodeLinkSchema.ts +++ b/src/services/ReferralSystem/schemas/inviteCodeLinkSchema.ts @@ -3,8 +3,8 @@ import { z } from 'zod'; const inviteCodeLinkSchema = z.object({ link: z .object({ - status: z.string(), referer: z.string(), + ref_link: z.string(), }) .nullable(), invite: z From c597fa0805be4391a239838db16c453961e5d8b6 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Fri, 2 Feb 2024 07:39:02 +0000 Subject: [PATCH 203/225] Make Indexer optional (#231) * feature: added new Thena exchange and indexer was made optional * fix: updated indexer types * Update package.json * fix: updated indexer types * fix: updated indexer types * fix: updated indexer types --------- Co-authored-by: TheJuze --- package-lock.json | 4 ++-- package.json | 2 +- src/Orion/index.ts | 2 +- src/Unit/index.ts | 24 +++++++++++++----------- src/config/schemas/pureEnvSchema.ts | 2 +- src/types.ts | 4 ++-- 6 files changed, 20 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6aabaf4..3dc62e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.51", + "version": "0.20.36-rc103", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.51", + "version": "0.20.36-rc103", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 8958aad..a40345b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.51", + "version": "0.20.36-rc103", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Orion/index.ts b/src/Orion/index.ts index 649b293..02ccd5c 100644 --- a/src/Orion/index.ts +++ b/src/Orion/index.ts @@ -59,7 +59,7 @@ export default class Orion { api: networkConfig.api + networkConfig.services.priceFeed.all, }, indexer: { - api: networkConfig.api + networkConfig.services.indexer.http, + api: networkConfig.api + networkConfig.services.indexer?.http, } }, }; diff --git a/src/Unit/index.ts b/src/Unit/index.ts index c77bf1c..33badc5 100644 --- a/src/Unit/index.ts +++ b/src/Unit/index.ts @@ -1,16 +1,16 @@ import { JsonRpcProvider } from 'ethers'; -import { Aggregator } from '../services/Aggregator/index.js'; -import { BlockchainService } from '../services/BlockchainService/index.js'; -import { PriceFeed } from '../services/PriceFeed/index.js'; +import { Aggregator } from '../services/Aggregator'; +import { BlockchainService } from '../services/BlockchainService'; +import { PriceFeed } from '../services/PriceFeed'; import type { KnownEnv, SupportedChainId, VerboseUnitConfig, } from '../types.js'; import Exchange from './Exchange/index.js'; -import { chains, envs } from '../config/index.js'; +import { chains, envs } from '../config'; import type { networkCodes } from '../constants/index.js'; -import { IndexerService } from '../services/Indexer/index.js'; +import { IndexerService } from '../services/Indexer'; type KnownConfig = { env: KnownEnv @@ -26,7 +26,7 @@ export default class Unit { public readonly blockchainService: BlockchainService; - public readonly indexer: IndexerService; + public readonly indexer: IndexerService | undefined; public readonly aggregator: Aggregator; @@ -83,7 +83,7 @@ export default class Unit { api: networkConfig.api + networkConfig.services.priceFeed.all, }, indexer: { - api: networkConfig.api + networkConfig.services.indexer.http, + api: networkConfig.api + networkConfig.services.indexer?.http, }, }, }; @@ -106,10 +106,12 @@ export default class Unit { this.config.services.blockchainService.http, this.config.basicAuth ); - this.indexer = new IndexerService( - this.config.services.indexer.api, - intNetwork - ); + this.indexer = this.config.services.indexer + ? new IndexerService( + this.config.services.indexer.api, + intNetwork + ) + : undefined; this.aggregator = new Aggregator( this.config.services.aggregator.http, this.config.services.aggregator.ws, diff --git a/src/config/schemas/pureEnvSchema.ts b/src/config/schemas/pureEnvSchema.ts index ca5bb3e..642dd0b 100644 --- a/src/config/schemas/pureEnvSchema.ts +++ b/src/config/schemas/pureEnvSchema.ts @@ -16,7 +16,7 @@ export const pureEnvNetworksSchema = z.object({ }), indexer: z.object({ http: z.string(), - }), + }).optional(), }), rpc: z.string().optional(), liquidityMigratorAddress: z.string().optional(), diff --git a/src/types.ts b/src/types.ts index dcc0324..b5f0330 100644 --- a/src/types.ts +++ b/src/types.ts @@ -262,12 +262,12 @@ export type VerboseUnitConfig = { // http://10.23.5.11:3003/, // https://price-feed:3003/ } - indexer: { + indexer?: { api: string // For example: // http://localhost:3004/, // http:// - } + } | undefined } basicAuth?: BasicAuthCredentials } From 384b581a0f0cb06d614c0cb6e0a685554ecaf648 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Fri, 2 Feb 2024 10:39:53 +0300 Subject: [PATCH 204/225] bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3dc62e5..cb5fa69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.36-rc103", + "version": "0.20.52", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.36-rc103", + "version": "0.20.52", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index a40345b..c190ffc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.36-rc103", + "version": "0.20.52", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From b0d2064328ffd8677ec1a701de4d6ee7208ab853 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Tue, 6 Feb 2024 07:13:08 +0000 Subject: [PATCH 205/225] fix: changed Arbitrum baseCurrencyName --- src/config/chains.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/chains.json b/src/config/chains.json index ea887a8..35fe60c 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -96,7 +96,7 @@ "shortName": "Arbitrum", "code": "arb", "rpc": "https://arb1.arbitrum.io/rpc", - "baseCurrencyName": "ARB", + "baseCurrencyName": "ETH", "contracts": { "WETH": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", "curveRegistiry": "0x445FE580eF8d70FF569aB36e80c647af338db351" From 9ffe06d7c8c185825ebed40562aa487b6135580f Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Tue, 6 Feb 2024 07:42:23 +0000 Subject: [PATCH 206/225] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c190ffc..41ad80b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.52", + "version": "0.20.53", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 7d99d18b8b5d6dc349ed1f2e2b731d99ab4caae2 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 6 Feb 2024 13:48:31 +0300 Subject: [PATCH 207/225] update contracts --- package-lock.json | 18 +++++++++--------- package.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb5fa69..1440a75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.52", + "version": "0.20.54", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.52", + "version": "0.20.54", "hasInstallScript": true, "license": "ISC", "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.22.6", + "@orionprotocol/contracts": "1.22.8", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", @@ -2421,9 +2421,9 @@ } }, "node_modules/@orionprotocol/contracts": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.6.tgz", - "integrity": "sha512-pPQGPNBcf1LQlNJk/Iq4BtV6ccuDSEBJhBIEORNf93vgYyUJ3SZ5O2/5y/nWgywLghPh2WwoAhnUKFeUEUmgsA==" + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.8.tgz", + "integrity": "sha512-0AcnOtGxLPMjzM/EAIomEnmUqy0f7fs3YnQfcU7WAMM8F30SLT4k8xL/4HlDPAB+f6cFBNsYZJqNzlA8jowrsw==" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -13480,9 +13480,9 @@ } }, "@orionprotocol/contracts": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.6.tgz", - "integrity": "sha512-pPQGPNBcf1LQlNJk/Iq4BtV6ccuDSEBJhBIEORNf93vgYyUJ3SZ5O2/5y/nWgywLghPh2WwoAhnUKFeUEUmgsA==" + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.8.tgz", + "integrity": "sha512-0AcnOtGxLPMjzM/EAIomEnmUqy0f7fs3YnQfcU7WAMM8F30SLT4k8xL/4HlDPAB+f6cFBNsYZJqNzlA8jowrsw==" }, "@sinclair/typebox": { "version": "0.27.8", diff --git a/package.json b/package.json index 41ad80b..65f627d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.53", + "version": "0.20.54", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -88,7 +88,7 @@ "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.22.6", + "@orionprotocol/contracts": "1.22.8", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", From e531ca3429e0b59be6c3c2ad3bb3208af638ac36 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 6 Feb 2024 16:51:18 +0300 Subject: [PATCH 208/225] update contracts --- package-lock.json | 18 +++++++++--------- package.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1440a75..0fb1e79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.54", + "version": "0.20.55", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.54", + "version": "0.20.55", "hasInstallScript": true, "license": "ISC", "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.22.8", + "@orionprotocol/contracts": "1.22.9", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", @@ -2421,9 +2421,9 @@ } }, "node_modules/@orionprotocol/contracts": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.8.tgz", - "integrity": "sha512-0AcnOtGxLPMjzM/EAIomEnmUqy0f7fs3YnQfcU7WAMM8F30SLT4k8xL/4HlDPAB+f6cFBNsYZJqNzlA8jowrsw==" + "version": "1.22.9", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.9.tgz", + "integrity": "sha512-KkX/TgPKMzvWq/wDHsUX9qcnrrgm0YqZeePpUCIanouxjWH2i1B+gEjctbjZ/WsdSskjUspR4yUNaWv7aiOgcQ==" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -13480,9 +13480,9 @@ } }, "@orionprotocol/contracts": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.8.tgz", - "integrity": "sha512-0AcnOtGxLPMjzM/EAIomEnmUqy0f7fs3YnQfcU7WAMM8F30SLT4k8xL/4HlDPAB+f6cFBNsYZJqNzlA8jowrsw==" + "version": "1.22.9", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.9.tgz", + "integrity": "sha512-KkX/TgPKMzvWq/wDHsUX9qcnrrgm0YqZeePpUCIanouxjWH2i1B+gEjctbjZ/WsdSskjUspR4yUNaWv7aiOgcQ==" }, "@sinclair/typebox": { "version": "0.27.8", diff --git a/package.json b/package.json index 65f627d..08cabb2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.54", + "version": "0.20.55", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -88,7 +88,7 @@ "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.22.8", + "@orionprotocol/contracts": "1.22.9", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", From ed1a7fefe46df3bae98ef45560e0c0c32f020257 Mon Sep 17 00:00:00 2001 From: Steam Deck User <0xlomonoshka@gmail.com> Date: Wed, 7 Feb 2024 11:12:08 +0400 Subject: [PATCH 209/225] change orderId calculation function --- package.json | 2 +- src/crypt/hashOrder.ts | 45 ++++++++++++------------------------------ 2 files changed, 14 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 08cabb2..1d76cfd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.55", + "version": "0.20.56", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/hashOrder.ts b/src/crypt/hashOrder.ts index 23bc474..c62f97d 100644 --- a/src/crypt/hashOrder.ts +++ b/src/crypt/hashOrder.ts @@ -1,35 +1,16 @@ -import { ethers } from 'ethers'; +import { ethers, keccak256 } from 'ethers'; import type { Order } from '../types.js'; -const hashOrder = (order: Order) => ethers.solidityPackedKeccak256( - [ - 'uint8', - 'address', - 'address', - 'address', - 'address', - 'address', - 'uint64', - 'uint64', - 'uint64', - 'uint64', - 'uint64', - 'uint8', - ], - [ - '0x03', - order.senderAddress, - order.matcherAddress, - order.baseAsset, - order.quoteAsset, - order.matcherFeeAsset, - order.amount, - order.price, - order.matcherFee, - order.nonce, - order.expiration, - order.buySide === 1 ? '0x01' : '0x00', - ], -); +const ORDER_TYPEHASH = "0xb5132db62dfceb466f2f8aee7a039db36a99772e5a9771d28388a5f9baad7c54" -export default hashOrder; +export default function getOrderHash(order: Order) { + const abiCoder = ethers.AbiCoder.defaultAbiCoder() + + const { senderAddress, matcherAddress, baseAsset, quoteAsset, matcherFeeAsset, amount, price, matcherFee, nonce, expiration, buySide } = order + const orderBytes = abiCoder.encode( + ["bytes32", "address", "address", "address", "address", "address", "uint64", "uint64", "uint64", "uint64", "uint64", "uint8"], + [ORDER_TYPEHASH, senderAddress, matcherAddress, baseAsset, quoteAsset, matcherFeeAsset, amount, price, matcherFee, nonce, expiration, buySide] + ) + + return keccak256(orderBytes) +} \ No newline at end of file From 9b769333cace7c551bc9f499fab7b952c02a66ec Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Wed, 7 Feb 2024 11:43:31 +0300 Subject: [PATCH 210/225] update contracts --- package-lock.json | 18 +++++++++--------- package.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0fb1e79..ef43b91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.55", + "version": "0.20.57", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.55", + "version": "0.20.57", "hasInstallScript": true, "license": "ISC", "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.22.9", + "@orionprotocol/contracts": "1.22.10", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", @@ -2421,9 +2421,9 @@ } }, "node_modules/@orionprotocol/contracts": { - "version": "1.22.9", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.9.tgz", - "integrity": "sha512-KkX/TgPKMzvWq/wDHsUX9qcnrrgm0YqZeePpUCIanouxjWH2i1B+gEjctbjZ/WsdSskjUspR4yUNaWv7aiOgcQ==" + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.10.tgz", + "integrity": "sha512-c9cUkXs1Nv8p+EVTybwJqeXhecwm7xeycAVauhl6jYAqvKOx7PDCUjzE3Nh0tpi4xP3CLeABgNy8JAFYyvN1VA==" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -13480,9 +13480,9 @@ } }, "@orionprotocol/contracts": { - "version": "1.22.9", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.9.tgz", - "integrity": "sha512-KkX/TgPKMzvWq/wDHsUX9qcnrrgm0YqZeePpUCIanouxjWH2i1B+gEjctbjZ/WsdSskjUspR4yUNaWv7aiOgcQ==" + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.10.tgz", + "integrity": "sha512-c9cUkXs1Nv8p+EVTybwJqeXhecwm7xeycAVauhl6jYAqvKOx7PDCUjzE3Nh0tpi4xP3CLeABgNy8JAFYyvN1VA==" }, "@sinclair/typebox": { "version": "0.27.8", diff --git a/package.json b/package.json index 1d76cfd..3684810 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.56", + "version": "0.20.57", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -88,7 +88,7 @@ "@babel/runtime": "^7.21.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.22.9", + "@orionprotocol/contracts": "1.22.10", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", From 2459777da8838264f3869e2b8ed80533b986f50c Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Thu, 8 Feb 2024 09:55:25 +0000 Subject: [PATCH 211/225] fix: fixed typo for Arb chain --- src/config/chains.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/chains.json b/src/config/chains.json index 35fe60c..275b577 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -99,7 +99,7 @@ "baseCurrencyName": "ETH", "contracts": { "WETH": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", - "curveRegistiry": "0x445FE580eF8d70FF569aB36e80c647af338db351" + "curveRegistry": "0x445FE580eF8d70FF569aB36e80c647af338db351" } }, "4002": { From a2e7e04ad11aa314843544d4462473bc13a08608 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Thu, 8 Feb 2024 09:58:24 +0000 Subject: [PATCH 212/225] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3684810..fa171c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.57", + "version": "0.20.58", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 81ef6a6aff32b343b809e0965010aee1421d0b93 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 13 Feb 2024 20:18:33 +0300 Subject: [PATCH 213/225] all time leaderboard --- package-lock.json | 4 ++-- package.json | 2 +- src/services/ReferralSystem/index.ts | 15 +++++++++++++++ .../schemas/allTimeLeadersSchema.ts | 11 +++++++++++ src/services/ReferralSystem/schemas/index.ts | 1 + 5 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 src/services/ReferralSystem/schemas/allTimeLeadersSchema.ts diff --git a/package-lock.json b/package-lock.json index ef43b91..e713c46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.57", + "version": "0.20.59", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.57", + "version": "0.20.59", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index fa171c9..1998e7f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.58", + "version": "0.20.59", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/ReferralSystem/index.ts b/src/services/ReferralSystem/index.ts index ea51262..92bf000 100644 --- a/src/services/ReferralSystem/index.ts +++ b/src/services/ReferralSystem/index.ts @@ -13,6 +13,7 @@ import { aggregatedHistorySchema, inviteCodeLinkSchema, contractsAddressesSchema, + allTimeLeadersSchema, } from './schemas/index.js'; import type { SupportedChainId } from '../../types.js'; @@ -71,6 +72,7 @@ class ReferralSystem { this.claimRewards = this.claimRewards.bind(this); this.getLeaderboard = this.getLeaderboard.bind(this); this.getLeaderboardSingleChain = this.getLeaderboardSingleChain.bind(this); + this.getAllTimeLeaders = this.getAllTimeLeaders.bind(this); this.getContractsAddresses = this.getContractsAddresses.bind(this); this.getClaimInfo = this.getClaimInfo.bind(this); this.getAggregatedHistory = this.getAggregatedHistory.bind(this); @@ -231,6 +233,19 @@ class ReferralSystem { errorSchema ); + getAllTimeLeaders = (refererAddress: string | undefined) => + fetchWithValidation( + `${this.apiUrl}/referer/ve/leaderboard-lifetime`, + ratingSchema, + { + headers: + refererAddress !== undefined + ? { 'referer-address': refererAddress } + : {}, + }, + allTimeLeadersSchema + ); + getContractsAddresses = () => fetchWithValidation( `${this.apiUrl}/referer/view/contracts`, diff --git a/src/services/ReferralSystem/schemas/allTimeLeadersSchema.ts b/src/services/ReferralSystem/schemas/allTimeLeadersSchema.ts new file mode 100644 index 0000000..885e1c8 --- /dev/null +++ b/src/services/ReferralSystem/schemas/allTimeLeadersSchema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; + +const allTimeLeadersSchema = z.array(z.object({ + wallet: z.string(), + total_earnings_fmt: z.number(), + referrals_count_fmt: z.number(), + total_trades_fmt: z.number(), + weekly_earnings_fmt: z.number(), +})); + +export default allTimeLeadersSchema; diff --git a/src/services/ReferralSystem/schemas/index.ts b/src/services/ReferralSystem/schemas/index.ts index f1a1391..972d940 100644 --- a/src/services/ReferralSystem/schemas/index.ts +++ b/src/services/ReferralSystem/schemas/index.ts @@ -10,3 +10,4 @@ export { default as claimInfoSchema } from './claimInfoSchema.js'; export { default as aggregatedHistorySchema } from './aggregatedHistorySchema.js'; export { default as contractsAddressesSchema } from './contractsAddressesSchema.js'; export { default as inviteCodeLinkSchema } from './inviteCodeLinkSchema.js'; +export { default as allTimeLeadersSchema } from './allTimeLeadersSchema.js'; From 60a22f86fb539daded020a2008a2b9bff41b4f8d Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Tue, 13 Feb 2024 20:45:18 +0300 Subject: [PATCH 214/225] fix: all time leaders schema --- package-lock.json | 4 ++-- package.json | 2 +- src/services/ReferralSystem/index.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index e713c46..7353eeb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.59", + "version": "0.20.60", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.59", + "version": "0.20.60", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 1998e7f..78c11af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.59", + "version": "0.20.60", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/ReferralSystem/index.ts b/src/services/ReferralSystem/index.ts index 92bf000..9305886 100644 --- a/src/services/ReferralSystem/index.ts +++ b/src/services/ReferralSystem/index.ts @@ -236,14 +236,14 @@ class ReferralSystem { getAllTimeLeaders = (refererAddress: string | undefined) => fetchWithValidation( `${this.apiUrl}/referer/ve/leaderboard-lifetime`, - ratingSchema, + allTimeLeadersSchema, { headers: refererAddress !== undefined ? { 'referer-address': refererAddress } : {}, }, - allTimeLeadersSchema + errorSchema ); getContractsAddresses = () => From a4e2f5cb31921f7ccff95d5dd9297d68a05e0b70 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Tue, 27 Feb 2024 09:17:16 +0000 Subject: [PATCH 215/225] feat: added endpoint for receiving gas limits from OB --- package.json | 2 +- src/services/BlockchainService/index.ts | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 78c11af..c2244ed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.60", + "version": "0.20.61-rc100", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/BlockchainService/index.ts b/src/services/BlockchainService/index.ts index 53ac157..0022218 100644 --- a/src/services/BlockchainService/index.ts +++ b/src/services/BlockchainService/index.ts @@ -111,6 +111,7 @@ class BlockchainService { this.getBlockNumber = this.getBlockNumber.bind(this); this.getRedeemOrderBySecretHash = this.getRedeemOrderBySecretHash.bind(this); this.claimOrder = this.claimOrder.bind(this); + this.getGasLimits = this.getGasLimits.bind(this); } get basicAuthHeaders() { @@ -484,6 +485,12 @@ class BlockchainService { body: JSON.stringify(secretHashes), }, ); + + getGasLimits = () => fetchWithValidation( + `${this.apiUrl}api/baseLimits`, + z.record(z.number()), + { headers: this.basicAuthHeaders } + ); } export * as schemas from './schemas/index.js'; From cbecf51c251aff73308ea60eb803322b4b7a2169 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Tue, 27 Feb 2024 11:49:37 +0000 Subject: [PATCH 216/225] feat: small fix --- package.json | 2 +- src/services/BlockchainService/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c2244ed..6fea188 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.61-rc100", + "version": "0.20.61-rc101", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/BlockchainService/index.ts b/src/services/BlockchainService/index.ts index 0022218..a64a358 100644 --- a/src/services/BlockchainService/index.ts +++ b/src/services/BlockchainService/index.ts @@ -487,7 +487,7 @@ class BlockchainService { ); getGasLimits = () => fetchWithValidation( - `${this.apiUrl}api/baseLimits`, + `${this.apiUrl}/api/baseLimits`, z.record(z.number()), { headers: this.basicAuthHeaders } ); From c67b35343902b4ce62e33dfbfb9b79dd62098730 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Fri, 1 Mar 2024 16:09:07 +0000 Subject: [PATCH 217/225] feat: added Line and inEVM mainnet chains --- src/config/chains.json | 26 +++++++++++++ src/config/envs.json | 72 +++++++++++++++++++++++++++++++++++ src/constants/chains.ts | 2 + src/constants/networkCodes.ts | 2 +- src/types.ts | 2 + 5 files changed, 103 insertions(+), 1 deletion(-) diff --git a/src/config/chains.json b/src/config/chains.json index 275b577..0a97c1d 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -192,5 +192,31 @@ "WETH": "", "curveRegistry": "" } + }, + "2525": { + "chainId": "2525", + "label": "inEVM", + "shortName": "inEVM", + "code": "inevm", + "baseCurrencyName": "INJ", + "rpc": "https://inevm.calderachain.xyz/http/", + "explorer": "https://explorer.injective.network/", + "contracts": { + "WETH": "0x4C3A213bd5e8c4BD70a8396d6F3C8302571598Cd", + "curveRegistry": "" + } + }, + "59144": { + "chainId": "59144", + "label": "Linea", + "shortName": "Linea", + "code": "linea", + "baseCurrencyName": "ETH", + "rpc": "https://rpc.linea.build/", + "explorer": "https://lineascan.build/", + "contracts": { + "WETH": "0xe5d7c2a44ffddf6b295a15c148167daaaf5cf34f", + "curveRegistry": "" + } } } diff --git a/src/config/envs.json b/src/config/envs.json index d8ba4d2..41094b3 100644 --- a/src/config/envs.json +++ b/src/config/envs.json @@ -129,6 +129,42 @@ "http": "/orion-indexer/" } } + }, + "2525": { + "api": "https://trade.orion.xyz/inevm-mainnet", + "services": { + "aggregator": { + "http": "/backend", + "ws": "/v1" + }, + "blockchain": { + "http": "" + }, + "priceFeed": { + "all": "/price-feed" + }, + "indexer": { + "http": "/orion-indexer/" + } + } + }, + "59144": { + "api": "https://trade.orion.xyz/linea-mainnet", + "services": { + "aggregator": { + "http": "/backend", + "ws": "/v1" + }, + "blockchain": { + "http": "" + }, + "priceFeed": { + "all": "/price-feed" + }, + "indexer": { + "http": "/orion-indexer/" + } + } } } }, @@ -376,6 +412,42 @@ "http": "/orion-indexer/" } } + }, + "2525": { + "api": "https://trade.orion.xyz/inevm-mainnet", + "services": { + "aggregator": { + "http": "/backend", + "ws": "/v1" + }, + "blockchain": { + "http": "" + }, + "priceFeed": { + "all": "/price-feed" + }, + "indexer": { + "http": "/orion-indexer/" + } + } + }, + "59144": { + "api": "https://trade.orion.xyz/linea-mainnet", + "services": { + "aggregator": { + "http": "/backend", + "ws": "/v1" + }, + "blockchain": { + "http": "" + }, + "priceFeed": { + "all": "/price-feed" + }, + "indexer": { + "http": "/orion-indexer/" + } + } } } }, diff --git a/src/constants/chains.ts b/src/constants/chains.ts index 74135ed..0e0b025 100644 --- a/src/constants/chains.ts +++ b/src/constants/chains.ts @@ -17,4 +17,6 @@ export const productionChains = [ SupportedChainId.OKC, SupportedChainId.ARBITRUM, SupportedChainId.OPBNB, + SupportedChainId.INEVM, + SupportedChainId.LINEA, ]; diff --git a/src/constants/networkCodes.ts b/src/constants/networkCodes.ts index d04ac04..74b0d0f 100644 --- a/src/constants/networkCodes.ts +++ b/src/constants/networkCodes.ts @@ -1 +1 @@ -export default ['ftm', 'bsc', 'eth', 'polygon', 'okc', 'arb', 'drip', 'opbnb'] as const; +export default ['ftm', 'bsc', 'eth', 'polygon', 'okc', 'arb', 'drip', 'opbnb', 'inevm', 'linea'] as const; diff --git a/src/types.ts b/src/types.ts index b5f0330..5a96d83 100644 --- a/src/types.ts +++ b/src/types.ts @@ -88,6 +88,8 @@ export enum SupportedChainId { POLYGON = '137', OKC = '66', OPBNB = '204', + INEVM = '2525', + LINEA = '59144', POLYGON_TESTNET = '80001', FANTOM_TESTNET = '4002', From 3c04a0fee63bbd4cb8acf8692408e7e0a132398a Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Fri, 1 Mar 2024 16:09:53 +0000 Subject: [PATCH 218/225] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 78c11af..6d978ba 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.60", + "version": "0.20.61", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 274807edbd69aac305ce0b2264f979e988cb9556 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 4 Mar 2024 14:52:32 +0300 Subject: [PATCH 219/225] update referralDataSchema --- package-lock.json | 4 ++-- package.json | 2 +- src/services/BlockchainService/schemas/referralDataSchema.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7353eeb..cbf62aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.60", + "version": "0.20.62", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.60", + "version": "0.20.62", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 6d978ba..a5cc917 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.61", + "version": "0.20.62", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/BlockchainService/schemas/referralDataSchema.ts b/src/services/BlockchainService/schemas/referralDataSchema.ts index 115e2a8..4b4674a 100644 --- a/src/services/BlockchainService/schemas/referralDataSchema.ts +++ b/src/services/BlockchainService/schemas/referralDataSchema.ts @@ -1,6 +1,6 @@ -import { z } from "zod"; +import { z } from 'zod'; export const referralDataSchema = z.object({ - referer: z.string(), + referer: z.string().nullable(), isReferral: z.boolean(), }); From 8b08802f556cea46871c5d723822bc70c4e5d69a Mon Sep 17 00:00:00 2001 From: Dmitry <35160421+TheJuze@users.noreply.github.com> Date: Wed, 6 Mar 2024 11:22:55 +0300 Subject: [PATCH 220/225] add opbnb curveRegistry to chains config (#245) --- package-lock.json | 4 ++-- package.json | 2 +- src/config/chains.json | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index cbf62aa..5a4864d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.62", + "version": "0.20.63-rc0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.62", + "version": "0.20.63-rc0", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index a5cc917..f439b68 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.62", + "version": "0.20.63-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/config/chains.json b/src/config/chains.json index 0a97c1d..bed5a5d 100644 --- a/src/config/chains.json +++ b/src/config/chains.json @@ -47,7 +47,8 @@ "rpc": "https://opbnb-mainnet-rpc.bnbchain.org", "baseCurrencyName": "BNB", "contracts": { - "WETH": "0x4200000000000000000000000000000000000006" + "WETH": "0x4200000000000000000000000000000000000006", + "curveRegistry": "" } }, "3": { From 0ba61a803549febbfa2136bea9a62e80cce8523e Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 6 Mar 2024 11:23:36 +0300 Subject: [PATCH 221/225] bump v --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5a4864d..bbd524e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.63-rc0", + "version": "0.20.63", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.63-rc0", + "version": "0.20.63", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index f439b68..03a3a32 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.63-rc0", + "version": "0.20.63", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From d26a21e526a2a69f248190d5789d713668ec08ca Mon Sep 17 00:00:00 2001 From: Dmitry <35160421+TheJuze@users.noreply.github.com> Date: Wed, 6 Mar 2024 11:50:22 +0300 Subject: [PATCH 222/225] add opbnb network code (#244) --- src/constants/uppercasedNetworkCodes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/constants/uppercasedNetworkCodes.ts b/src/constants/uppercasedNetworkCodes.ts index 8dc00e3..711241f 100644 --- a/src/constants/uppercasedNetworkCodes.ts +++ b/src/constants/uppercasedNetworkCodes.ts @@ -1 +1 @@ -export default ['FTM', 'BSC', 'ETH', 'POLYGON', 'OKC', 'ARB'] as const; +export default ['FTM', 'BSC', 'ETH', 'POLYGON', 'OKC', 'ARB', 'OPBNB'] as const; From 0faccd34c4dffb9a971041146fb7ddeb57ecfcf6 Mon Sep 17 00:00:00 2001 From: Dmitry <35160421+TheJuze@users.noreply.github.com> Date: Wed, 6 Mar 2024 11:55:34 +0300 Subject: [PATCH 223/225] add inevm, linea to uppercasedNetworkCodes.ts (#246) --- src/constants/uppercasedNetworkCodes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/constants/uppercasedNetworkCodes.ts b/src/constants/uppercasedNetworkCodes.ts index 711241f..f3c9515 100644 --- a/src/constants/uppercasedNetworkCodes.ts +++ b/src/constants/uppercasedNetworkCodes.ts @@ -1 +1 @@ -export default ['FTM', 'BSC', 'ETH', 'POLYGON', 'OKC', 'ARB', 'OPBNB'] as const; +export default ['FTM', 'BSC', 'ETH', 'POLYGON', 'OKC', 'ARB', 'OPBNB', 'INEVM', 'LINEA'] as const; From 4e7669bc2c200a45d56d6dd58737a9b21bebe3bc Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 6 Mar 2024 11:56:15 +0300 Subject: [PATCH 224/225] bump v --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index bbd524e..55fdb08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.63", + "version": "0.20.64", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.63", + "version": "0.20.64", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 03a3a32..4ab3e88 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.63", + "version": "0.20.64", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 184f66bf1704dd9b26b39216eb58e8995b62a08d Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Wed, 6 Mar 2024 11:39:51 +0000 Subject: [PATCH 225/225] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9d54d0d..4c77189 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.61-rc102", + "version": "0.20.65", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js",