From 4af485cbbf74c0161626054db96994bc9093279b Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Mon, 25 Mar 2024 12:13:39 +0000 Subject: [PATCH 01/15] fix: console log all constants --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 92660807..f075da97 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.77", + "version": "0.20.76-rc100", "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 fd7fe082..6933d9f3 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -118,15 +118,21 @@ export async function generateSwapCalldata({ value: bigint; }> { const wethAddress = await addressLikeToString(wethAddressLike); + console.log('wethAddress', wethAddress); const curveRegistryAddress = await addressLikeToString(curveRegistryAddressLike); + console.log('curveRegistryAddress', curveRegistryAddress); const swapExecutorContractAddress = await addressLikeToString(swapExecutorContractAddressLike); + console.log('swapExecutorContractAddress', swapExecutorContractAddress); const feeToken = await addressLikeToString(feeTokenAddressLike); + console.log('feeToken', feeToken); const matcher = await addressLikeToString(matcherAddressLike); + console.log('matcher', matcher); let path = SafeArray.from(arrayLikePath).map((swapInfo) => { swapInfo.assetIn = swapInfo.assetIn.toLowerCase() swapInfo.assetOut = swapInfo.assetOut.toLowerCase() return swapInfo; }); + console.log('path', path); const { assetIn: srcToken } = path.first(); const { assetOut: dstToken } = path.last(); @@ -140,14 +146,18 @@ export async function generateSwapCalldata({ minReturnAmount, flags: 0, }; + console.log('swapDescription', swapDescription); const amountNativeDecimals = await exchangeToNativeDecimals(srcToken, amount, provider); + console.log('amountNativeDecimals', amountNativeDecimals); const feeNativeDecimals = await exchangeToNativeDecimals(feeToken, fee, provider) + console.log('feeNativeDecimals', feeNativeDecimals); path = SafeArray.from(arrayLikePath).map((singleSwap) => { if (singleSwap.assetIn == ethers.ZeroAddress) singleSwap.assetIn = wethAddress; if (singleSwap.assetOut == ethers.ZeroAddress) singleSwap.assetOut = wethAddress; return singleSwap; }); + calldata let calls: BytesLike[]; ({ swapDescription, calls } = await processSwaps( @@ -162,7 +172,10 @@ export async function generateSwapCalldata({ curveRegistryAddress, provider )); + console.log('swapDescription', swapDescription); + console.log('calls', calls); const calldata = generateCalls(calls); + console.log('calldata', calldata); const { useExchangeBalance, additionalTransferAmount } = await shouldUseExchangeBalance( srcToken, @@ -171,10 +184,13 @@ export async function generateSwapCalldata({ amountNativeDecimals, provider ); + console.log('useExchangeBalance', useExchangeBalance); + console.log('additionalTransferAmount', additionalTransferAmount); if (useExchangeBalance) { swapDescription.flags = 1n << 255n; } const value = srcToken == ZeroAddress ? additionalTransferAmount : 0n; + console.log('value', value); return { swapDescription, calldata, value }; } From 940b269c01625ad5a9dd6782b3445de3a5f77af5 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Mon, 25 Mar 2024 12:23:44 +0000 Subject: [PATCH 02/15] fix: console log all constants --- 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 f075da97..c3237b09 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.76-rc100", + "version": "0.20.76-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 6933d9f3..d734b49b 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -157,7 +157,7 @@ export async function generateSwapCalldata({ if (singleSwap.assetOut == ethers.ZeroAddress) singleSwap.assetOut = wethAddress; return singleSwap; }); - calldata + console.log('path2', path); let calls: BytesLike[]; ({ swapDescription, calls } = await processSwaps( From 386b2e50ae46d0899d9b90dc2ce7dcc02ce48d5e Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Mon, 25 Mar 2024 12:40:55 +0000 Subject: [PATCH 03/15] fix: console log all constants --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c3237b09..f39ff4fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.76-rc101", + "version": "0.20.76-rc102", "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 d734b49b..9f8f9e02 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -127,7 +127,9 @@ export async function generateSwapCalldata({ console.log('feeToken', feeToken); const matcher = await addressLikeToString(matcherAddressLike); console.log('matcher', matcher); + console.log('arrayLikePath', arrayLikePath); let path = SafeArray.from(arrayLikePath).map((swapInfo) => { + console.log('swapInfo', swapInfo); swapInfo.assetIn = swapInfo.assetIn.toLowerCase() swapInfo.assetOut = swapInfo.assetOut.toLowerCase() return swapInfo; From 09a394b28b5d95e4ca0eb42e53a37ca71579c977 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Mon, 25 Mar 2024 16:45:34 +0000 Subject: [PATCH 04/15] fix: change asset names to asset addresses --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 14 ++++++-------- src/services/Aggregator/ws/index.ts | 2 ++ .../Aggregator/ws/schemas/swapInfoSchema.ts | 2 ++ src/types.ts | 2 ++ 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index f39ff4fd..29a8ecc2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.76-rc102", + "version": "0.20.76-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 9f8f9e02..68f5f905 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -66,20 +66,18 @@ export async function generateSwapCalldataWithUnit({ } const wethAddress = safeGet(unit.contracts, "WETH"); const curveRegistryAddress = safeGet(unit.contracts, "curveRegistry"); - const { assetToAddress, swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch( + const { swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch( unit.blockchainService.getInfo )(); const arrayLikePathCopy = cloneDeep(arrayLikePath); let path = SafeArray.from(arrayLikePathCopy); - path = SafeArray.from(arrayLikePathCopy).map((swapInfo) => { - 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; - }); + path = SafeArray.from(arrayLikePathCopy).map((swapInfo) => ({ + ...swapInfo, + assetIn: swapInfo.assetAddressIn.toLowerCase(), + assetOut: swapInfo.assetAddressOut.toLowerCase(), + })); return await generateSwapCalldata({ amount, diff --git a/src/services/Aggregator/ws/index.ts b/src/services/Aggregator/ws/index.ts index 69d214cb..0583261e 100644 --- a/src/services/Aggregator/ws/index.ts +++ b/src/services/Aggregator/ws/index.ts @@ -506,6 +506,8 @@ class AggregatorWS { assetIn: path.ai, assetOut: path.ao, factory: path.f, + assetAddressIn: path.aai, + assetAddressOut: path.aao, })), poolOptimal: json.po, ...(json.oi) && { diff --git a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts index 3c8a5d4f..ba327897 100644 --- a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts @@ -40,6 +40,8 @@ const swapInfoSchemaBase = baseMessageSchema.extend({ ai: z.string().toUpperCase(), // asset in ao: z.string().toUpperCase(), // asset out f: factorySchema, // factory + aai: z.string(), // asset address in + aao: z.string(), // asset address out })), usd: z.object({ // USD info of this swap, nullable aa: z.number().optional(), // available amount in, USD diff --git a/src/types.ts b/src/types.ts index 58282965..a4fd6d62 100644 --- a/src/types.ts +++ b/src/types.ts @@ -176,6 +176,8 @@ export type SingleSwap = { assetIn: string assetOut: string factory: Factory + assetAddressIn: string + assetAddressOut: string } export type SwapInfoBase = { From cb7ae8a1ff8f3eb11e84c4378cbb03fe5ad39e7b Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Mon, 25 Mar 2024 16:55:44 +0000 Subject: [PATCH 05/15] fix: change asset names to asset addresses --- package.json | 2 +- src/services/Aggregator/schemas/swapInfoSchema.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 29a8ecc2..590c3035 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.76-rc103", + "version": "0.20.76-rc104", "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 ecbd440e..f4d0e0e2 100644 --- a/src/services/Aggregator/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/schemas/swapInfoSchema.ts @@ -12,6 +12,8 @@ const exchangeContractStep = z.object({ assetIn: z.string(), assetOut: z.string(), factory: z.string(), + assetAddressIn: z.string(), + assetAddressOut: z.string(), }); const swapInfoBase = z.object({ From b2809ee8f2a16ba3269cadc1cf314718f694c422 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 15 Apr 2024 13:00:31 +0300 Subject: [PATCH 06/15] fix: test text --- src/Unit/Exchange/generateSwapCalldata.ts | 130 +++++++++++----------- src/Unit/Exchange/index.ts | 8 +- 2 files changed, 73 insertions(+), 65 deletions(-) diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index 68f5f905..58836cc3 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -1,49 +1,51 @@ -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 { getExchangeAllowance, getTotalBalance } from "../../utils/getBalance.js"; -import { generateFeePaymentCall } from "./callGenerators/feePayment.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 { getExchangeAllowance, getTotalBalance } from '../../utils/getBalance.js'; +import { generateFeePaymentCall } from './callGenerators/feePayment.js'; -export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3"; +export type Factory = 'UniswapV2' | 'UniswapV3' | 'Curve' | 'OrionV2' | 'OrionV3'; type BaseGenerateSwapCalldataParams = { - amount: BigNumberish; - minReturnAmount: BigNumberish; - initiatorAddress: string; - receiverAddress: string; - path: ArrayLike; - matcher?: AddressLike, - feeToken?: AddressLike, - fee?: BigNumberish; + amount: BigNumberish + minReturnAmount: BigNumberish + initiatorAddress: string + receiverAddress: string + path: ArrayLike + matcher?: AddressLike + feeToken?: AddressLike + fee?: BigNumberish } export type GenerateSwapCalldataWithUnitParams = BaseGenerateSwapCalldataParams & { - unit: Unit; + unit: Unit + logger?: ((message: string) => void) | undefined }; export type GenerateSwapCalldataParams = BaseGenerateSwapCalldataParams & { - exchangeContractAddress: AddressLike; - wethAddress: AddressLike; - curveRegistryAddress: AddressLike; - swapExecutorContractAddress: AddressLike; - provider: JsonRpcProvider; + exchangeContractAddress: AddressLike + wethAddress: AddressLike + curveRegistryAddress: AddressLike + swapExecutorContractAddress: AddressLike + provider: JsonRpcProvider + logger?: ((message: string) => void) | undefined }; export async function generateSwapCalldataWithUnit({ @@ -57,15 +59,15 @@ export async function generateSwapCalldataWithUnit({ fee = 0, unit, }: GenerateSwapCalldataWithUnitParams): Promise<{ - calldata: string; - swapDescription: LibValidator.SwapDescriptionStruct; - value: bigint; + 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 wethAddress = safeGet(unit.contracts, 'WETH'); + const curveRegistryAddress = safeGet(unit.contracts, 'curveRegistry'); const { swapExecutorContractAddress, exchangeContractAddress } = await simpleFetch( unit.blockchainService.getInfo )(); @@ -110,22 +112,23 @@ export async function generateSwapCalldata({ curveRegistryAddress: curveRegistryAddressLike, swapExecutorContractAddress: swapExecutorContractAddressLike, provider, + logger, }: GenerateSwapCalldataParams): Promise<{ - calldata: string; - swapDescription: LibValidator.SwapDescriptionStruct; - value: bigint; + calldata: string + swapDescription: LibValidator.SwapDescriptionStruct + value: bigint }> { const wethAddress = await addressLikeToString(wethAddressLike); console.log('wethAddress', wethAddress); const curveRegistryAddress = await addressLikeToString(curveRegistryAddressLike); - console.log('curveRegistryAddress', curveRegistryAddress); + logger?.(`curveRegistryAddress: ${curveRegistryAddress}`); const swapExecutorContractAddress = await addressLikeToString(swapExecutorContractAddressLike); - console.log('swapExecutorContractAddress', swapExecutorContractAddress); + logger?.(`swapExecutorContractAddress, ${swapExecutorContractAddress}`); const feeToken = await addressLikeToString(feeTokenAddressLike); - console.log('feeToken', feeToken); + logger?.(`feeToken, ${feeToken}`); const matcher = await addressLikeToString(matcherAddressLike); - console.log('matcher', matcher); - console.log('arrayLikePath', arrayLikePath); + logger?.(`matcher: ${matcher}`); + logger?.(`arrayLikePath: ${arrayLikePath}`); let path = SafeArray.from(arrayLikePath).map((swapInfo) => { console.log('swapInfo', swapInfo); swapInfo.assetIn = swapInfo.assetIn.toLowerCase() @@ -230,7 +233,7 @@ async function processSwaps( )); } - ({swapDescription, calls} = await payFeeToMatcher(matcher, feeToken, fee, calls, swapDescription)); + ({ swapDescription, calls } = await payFeeToMatcher(matcher, feeToken, fee, calls, swapDescription)); ({ swapDescription, calls } = wrapOrUnwrapIfNeeded( amount, @@ -254,27 +257,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, @@ -301,37 +304,37 @@ async function processMultiFactorySwaps( curveRegistryAddress: string, provider: JsonRpcProvider ) { - let calls: BytesLike[] = []; + const calls: BytesLike[] = []; for (const swap of path) { switch (swap.factory) { - case "OrionV2": { + case 'OrionV2': { let transferCall = generateTransferCall(swap.assetIn, swap.pool, 0); transferCall = pathCallWithBalance(transferCall, swap.assetIn); const uni2Call = generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress); calls.push(transferCall, uni2Call); break; } - case "UniswapV2": { + case 'UniswapV2': { let transferCall = generateTransferCall(swap.assetIn, swap.pool, 0); transferCall = pathCallWithBalance(transferCall, swap.assetIn); const uni2Call = 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, @@ -362,7 +365,7 @@ async function payFeeToMatcher( const feePaymentCall = generateFeePaymentCall(matcher, feeToken, feeAmount) calls.push(feePaymentCall) } - return {swapDescription, calls} + return { swapDescription, calls } } function wrapOrUnwrapIfNeeded( @@ -372,7 +375,7 @@ function wrapOrUnwrapIfNeeded( swapExecutorContractAddress: string, wethAddress: string ) { - const {dstReceiver, srcReceiver, srcToken, dstToken} = swapDescription; + const { dstReceiver, srcReceiver, srcToken, dstToken } = swapDescription; if (srcToken === ZeroAddress) { const wrapCall = generateWrapAndTransferCall(srcReceiver, { value: amount }); swapDescription.srcReceiver = swapExecutorContractAddress; @@ -403,11 +406,12 @@ async function shouldUseExchangeBalance( 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}` + `Not enough balance to make swap, walletBalance: ${walletBalance} exchangeBalance: ${exchangeBalance} totalBalance - ${walletBalance + exchangeBalance} swapAmount - ${amount}` ); } let useExchangeBalance = true; diff --git a/src/Unit/Exchange/index.ts b/src/Unit/Exchange/index.ts index 217afb3c..d8afd47e 100644 --- a/src/Unit/Exchange/index.ts +++ b/src/Unit/Exchange/index.ts @@ -18,8 +18,11 @@ type PureSwapMarketParams = Omit export default class Exchange { private readonly unit: Unit; - constructor(unit: Unit) { + public logger: ((message: string) => void) | undefined + + constructor(unit: Unit, logger?: ((message: string) => void) | undefined) { this.unit = unit; + this.logger = logger; } public getSwapInfo(params: PureGetSwapMarketInfoParams) { @@ -47,7 +50,8 @@ export default class Exchange { public generateSwapCalldata(params: PureGenerateSwapCalldataParams) { return generateSwapCalldataWithUnit({ ...params, - unit: this.unit + unit: this.unit, + logger: this.logger }) } From dc1519f26c1a61d5bcc166666baf32e69475ab49 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 15 Apr 2024 13:08:49 +0300 Subject: [PATCH 07/15] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 32f7e9e3..33a2c3e7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.76-rc105", + "version": "0.20.76-rc106", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 39f5287ea440ad3f4ee196109e2ec64de73d46f0 Mon Sep 17 00:00:00 2001 From: Kirill Litvinov Date: Mon, 15 Apr 2024 15:38:54 +0300 Subject: [PATCH 08/15] fix: logger --- package.json | 2 +- src/Unit/Exchange/generateSwapCalldata.ts | 33 ++++++++++++----------- src/Unit/Exchange/index.ts | 6 +---- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 33a2c3e7..a07086d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.76-rc106", + "version": "0.20.76-rc107", "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 58836cc3..de5e3077 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -36,7 +36,6 @@ type BaseGenerateSwapCalldataParams = { export type GenerateSwapCalldataWithUnitParams = BaseGenerateSwapCalldataParams & { unit: Unit - logger?: ((message: string) => void) | undefined }; export type GenerateSwapCalldataParams = BaseGenerateSwapCalldataParams & { @@ -95,6 +94,7 @@ export async function generateSwapCalldataWithUnit({ curveRegistryAddress, swapExecutorContractAddress, provider: unit.provider, + logger: unit.logger, }); } @@ -119,7 +119,7 @@ export async function generateSwapCalldata({ value: bigint }> { const wethAddress = await addressLikeToString(wethAddressLike); - console.log('wethAddress', wethAddress); + logger?.(`wethAddress: ${wethAddress}`); const curveRegistryAddress = await addressLikeToString(curveRegistryAddressLike); logger?.(`curveRegistryAddress: ${curveRegistryAddress}`); const swapExecutorContractAddress = await addressLikeToString(swapExecutorContractAddressLike); @@ -130,7 +130,7 @@ export async function generateSwapCalldata({ logger?.(`matcher: ${matcher}`); logger?.(`arrayLikePath: ${arrayLikePath}`); let path = SafeArray.from(arrayLikePath).map((swapInfo) => { - console.log('swapInfo', swapInfo); + logger?.(`swapInfo: ${swapInfo}`); swapInfo.assetIn = swapInfo.assetIn.toLowerCase() swapInfo.assetOut = swapInfo.assetOut.toLowerCase() return swapInfo; @@ -149,18 +149,18 @@ export async function generateSwapCalldata({ minReturnAmount, flags: 0, }; - console.log('swapDescription', swapDescription); + logger?.(`swapDescription: ${swapDescription}`); const amountNativeDecimals = await exchangeToNativeDecimals(srcToken, amount, provider); - console.log('amountNativeDecimals', amountNativeDecimals); + logger?.(`amountNativeDecimals: ${amountNativeDecimals}`); const feeNativeDecimals = await exchangeToNativeDecimals(feeToken, fee, provider) - console.log('feeNativeDecimals', feeNativeDecimals); + logger?.(`feeNativeDecimals: ${feeNativeDecimals}`); path = SafeArray.from(arrayLikePath).map((singleSwap) => { if (singleSwap.assetIn == ethers.ZeroAddress) singleSwap.assetIn = wethAddress; if (singleSwap.assetOut == ethers.ZeroAddress) singleSwap.assetOut = wethAddress; return singleSwap; }); - console.log('path2', path); + logger?.(`path2: ${path}`); let calls: BytesLike[]; ({ swapDescription, calls } = await processSwaps( @@ -175,25 +175,26 @@ export async function generateSwapCalldata({ curveRegistryAddress, provider )); - console.log('swapDescription', swapDescription); - console.log('calls', calls); + logger?.(`swapDescription: ${swapDescription}`); + logger?.(`calls: ${calls}`); const calldata = generateCalls(calls); - console.log('calldata', calldata); + logger?.(`calldata: ${calldata}`); const { useExchangeBalance, additionalTransferAmount } = await shouldUseExchangeBalance( srcToken, initiatorAddress, exchangeContractAddress, amountNativeDecimals, - provider + provider, + logger ); - console.log('useExchangeBalance', useExchangeBalance); - console.log('additionalTransferAmount', additionalTransferAmount); + logger?.(`useExchangeBalance: ${useExchangeBalance}`); + logger?.(`additionalTransferAmount: ${additionalTransferAmount}`); if (useExchangeBalance) { swapDescription.flags = 1n << 255n; } const value = srcToken == ZeroAddress ? additionalTransferAmount : 0n; - console.log('value', value); + logger?.(`value: ${value}`); return { swapDescription, calldata, value }; } @@ -398,7 +399,8 @@ async function shouldUseExchangeBalance( initiatorAddress: AddressLike, exchangeContractAddress: AddressLike, amount: bigint, - provider: JsonRpcProvider + provider: JsonRpcProvider, + logger?: ((message: string) => void) | undefined ) { const { walletBalance, exchangeBalance } = await getTotalBalance( srcToken, @@ -408,6 +410,7 @@ async function shouldUseExchangeBalance( ); const exchangeAllowance = await getExchangeAllowance(srcToken, initiatorAddress, exchangeContractAddress, provider); + logger?.('test_123'); if (walletBalance + exchangeBalance < amount) { throw new Error( diff --git a/src/Unit/Exchange/index.ts b/src/Unit/Exchange/index.ts index d8afd47e..7b846663 100644 --- a/src/Unit/Exchange/index.ts +++ b/src/Unit/Exchange/index.ts @@ -18,11 +18,8 @@ type PureSwapMarketParams = Omit export default class Exchange { private readonly unit: Unit; - public logger: ((message: string) => void) | undefined - - constructor(unit: Unit, logger?: ((message: string) => void) | undefined) { + constructor(unit: Unit) { this.unit = unit; - this.logger = logger; } public getSwapInfo(params: PureGetSwapMarketInfoParams) { @@ -51,7 +48,6 @@ export default class Exchange { return generateSwapCalldataWithUnit({ ...params, unit: this.unit, - logger: this.logger }) } From 642d7f26631569448118b9557ad8b677d7fa3142 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 15 May 2024 16:09:08 +0300 Subject: [PATCH 09/15] update package-lock.json --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ab175b0..31766758 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.86", + "version": "0.20.76-rc110", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.86", + "version": "0.20.76-rc110", "hasInstallScript": true, "license": "ISC", "dependencies": { From f4bf91eb36517a2eb5996ba60ede33848eb21f73 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Mon, 20 May 2024 15:14:01 +0100 Subject: [PATCH 10/15] feat: small updates in Swap info schema --- package.json | 2 +- src/services/Aggregator/ws/schemas/swapInfoSchema.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 6fc106a7..bc925007 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.76-rc111", + "version": "0.20.76-rc112", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts index 48abe198..9b385adc 100644 --- a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts @@ -40,8 +40,8 @@ const swapInfoSchemaBase = baseMessageSchema.extend({ ai: z.string().toUpperCase(), // asset in ao: z.string().toUpperCase(), // asset out f: factorySchema, // factory - aai: z.string(), // asset address in - aao: z.string(), // asset address out + aai: z.string().optional(), // asset address in + aao: z.string().optional(), // asset address out })), usd: z.object({ // USD info of this swap, nullable aa: z.number().optional(), // available amount in, USD From ac90d4981c3db0d97bba9c29874409eddfba7aba Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Mon, 20 May 2024 15:27:29 +0100 Subject: [PATCH 11/15] Revert "feat: small updates in Swap info schema" This reverts commit f4bf91eb36517a2eb5996ba60ede33848eb21f73. --- package.json | 2 +- src/services/Aggregator/ws/schemas/swapInfoSchema.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index bc925007..6fc106a7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.76-rc112", + "version": "0.20.76-rc111", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts index 9b385adc..48abe198 100644 --- a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts @@ -40,8 +40,8 @@ const swapInfoSchemaBase = baseMessageSchema.extend({ ai: z.string().toUpperCase(), // asset in ao: z.string().toUpperCase(), // asset out f: factorySchema, // factory - aai: z.string().optional(), // asset address in - aao: z.string().optional(), // asset address out + aai: z.string(), // asset address in + aao: z.string(), // asset address out })), usd: z.object({ // USD info of this swap, nullable aa: z.number().optional(), // available amount in, USD From 495313546de11ff6669affdc27816262504e8db9 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Thu, 23 May 2024 10:13:22 +0100 Subject: [PATCH 12/15] feat: added fee to eps in swapInfoSchema.ts --- package.json | 2 +- src/services/Aggregator/ws/schemas/swapInfoSchema.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 6fc106a7..bc925007 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.76-rc111", + "version": "0.20.76-rc112", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts index 48abe198..efd2cf05 100644 --- a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts @@ -42,6 +42,7 @@ const swapInfoSchemaBase = baseMessageSchema.extend({ f: factorySchema, // factory aai: z.string(), // asset address in aao: z.string(), // asset address out + fee: z.number(), // fee })), usd: z.object({ // USD info of this swap, nullable aa: z.number().optional(), // available amount in, USD From eed05bd8303ad15abf5a1d494d020d645253834b Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Thu, 23 May 2024 10:42:11 +0100 Subject: [PATCH 13/15] feat: updated generateSwapCalldata with custom fee from the path --- package.json | 2 +- src/Unit/Exchange/callGenerators/uniswapV2.ts | 5 +++-- src/Unit/Exchange/generateSwapCalldata.ts | 4 ++-- src/services/Aggregator/ws/schemas/swapInfoSchema.ts | 2 +- src/types.ts | 1 + 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index bc925007..2048146e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.76-rc112", + "version": "0.20.76-rc113", "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 4526fca2..97428955 100644 --- a/src/Unit/Exchange/callGenerators/uniswapV2.ts +++ b/src/Unit/Exchange/callGenerators/uniswapV2.ts @@ -19,7 +19,8 @@ export async function generateUni2Calls( currentSwap.pool, currentSwap.assetIn, currentSwap.assetOut, - nextSwap.pool + nextSwap.pool, + nextSwap.fee ) calls.push(call) } @@ -51,4 +52,4 @@ export function generateUni2Call( ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [concat([toBeHex(fee), recipient])]), ]) return addCallParams(calldata) -} \ No newline at end of file +} diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index de5e3077..a600947c 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -311,14 +311,14 @@ async function processMultiFactorySwaps( case 'OrionV2': { let transferCall = generateTransferCall(swap.assetIn, swap.pool, 0); transferCall = pathCallWithBalance(transferCall, swap.assetIn); - const uni2Call = generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress); + const uni2Call = generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress, swap.fee); calls.push(transferCall, uni2Call); break; } case 'UniswapV2': { let transferCall = generateTransferCall(swap.assetIn, swap.pool, 0); transferCall = pathCallWithBalance(transferCall, swap.assetIn); - const uni2Call = generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress); + const uni2Call = generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress, swap.fee); calls.push(transferCall, uni2Call); break; } diff --git a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts index efd2cf05..f153a9fe 100644 --- a/src/services/Aggregator/ws/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/ws/schemas/swapInfoSchema.ts @@ -42,7 +42,7 @@ const swapInfoSchemaBase = baseMessageSchema.extend({ f: factorySchema, // factory aai: z.string(), // asset address in aao: z.string(), // asset address out - fee: z.number(), // fee + fee: z.number().optional(), // fee })), usd: z.object({ // USD info of this swap, nullable aa: z.number().optional(), // available amount in, USD diff --git a/src/types.ts b/src/types.ts index 69c56088..e19940fb 100644 --- a/src/types.ts +++ b/src/types.ts @@ -181,6 +181,7 @@ export type SingleSwap = { factory: Factory assetAddressIn: string assetAddressOut: string + fee?: number } export type SwapInfoBase = { From cec0688c8ebf45b8d093446af60358388911d5e7 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Thu, 23 May 2024 11:01:03 +0100 Subject: [PATCH 14/15] feat: updated fee type --- package.json | 2 +- src/services/Aggregator/ws/index.ts | 1 + src/types.ts | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2048146e..9aa6c780 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.76-rc113", + "version": "0.20.76-rc114", "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 c7de84e8..ee64bd3d 100644 --- a/src/services/Aggregator/ws/index.ts +++ b/src/services/Aggregator/ws/index.ts @@ -516,6 +516,7 @@ class AggregatorWS { factory: path.f, assetAddressIn: path.aai, assetAddressOut: path.aao, + fee: path.fee, })), poolOptimal: json.po, ...(json.oi) && { diff --git a/src/types.ts b/src/types.ts index e19940fb..f26da80d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -181,7 +181,7 @@ export type SingleSwap = { factory: Factory assetAddressIn: string assetAddressOut: string - fee?: number + fee?: number | undefined } export type SwapInfoBase = { From a1455bdda9f3b39525b0462ae27d1d235a239074 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Mon, 27 May 2024 11:51:18 +0100 Subject: [PATCH 15/15] feat: moved to swapUniV2Scaled function --- package.json | 2 +- src/Unit/Exchange/callGenerators/uniswapV2.ts | 23 +++++++++++++++---- src/Unit/Exchange/generateSwapCalldata.ts | 2 +- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 9aa6c780..638a0f81 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.76-rc114", + "version": "0.20.76-rc115", "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 97428955..86778bce 100644 --- a/src/Unit/Exchange/callGenerators/uniswapV2.ts +++ b/src/Unit/Exchange/callGenerators/uniswapV2.ts @@ -3,6 +3,15 @@ import { SafeArray } from "../../../utils/safeGetters.js" import { type BytesLike, type BigNumberish, concat, ethers, toBeHex } from "ethers" import { addCallParams } from "./utils.js" import type { SingleSwap } from "../../../types.js" +import { BigNumber } from 'bignumber.js'; + +const BILLION = 1000000000; +const TEN_THOUSANDS = 10000; + +function countScaledFee(fee: string) { + // The count is needed for the swapUniV2Scaled function, where the denominator is one billion + return new BigNumber(fee).multipliedBy(BILLION).div(TEN_THOUSANDS).toNumber(); +} export async function generateUni2Calls( path: SafeArray, @@ -20,17 +29,20 @@ export async function generateUni2Calls( currentSwap.assetIn, currentSwap.assetOut, nextSwap.pool, - nextSwap.fee + currentSwap.fee ) calls.push(call) } } + const lastSwap = path.last(); - const calldata = executorInterface.encodeFunctionData('swapUniV2', [ + const fee = lastSwap.fee ?? 3; + const scaledFee = countScaledFee(fee.toString()); + const calldata = executorInterface.encodeFunctionData('swapUniV2Scaled', [ lastSwap.pool, lastSwap.assetIn, lastSwap.assetOut, - ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [concat(['0x03', recipient])]), + ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [concat([toBeHex(scaledFee), recipient])]), ]) calls.push(addCallParams(calldata)) @@ -45,11 +57,12 @@ export function generateUni2Call( fee: BigNumberish = 3, ) { const executorInterface = SwapExecutor__factory.createInterface() - const calldata = executorInterface.encodeFunctionData('swapUniV2', [ + const scaledFee = countScaledFee(fee.toString()); + const calldata = executorInterface.encodeFunctionData('swapUniV2Scaled', [ pool, assetIn, assetOut, - ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [concat([toBeHex(fee), recipient])]), + ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [concat([toBeHex(scaledFee), recipient])]), ]) return addCallParams(calldata) } diff --git a/src/Unit/Exchange/generateSwapCalldata.ts b/src/Unit/Exchange/generateSwapCalldata.ts index a600947c..d58a68ab 100644 --- a/src/Unit/Exchange/generateSwapCalldata.ts +++ b/src/Unit/Exchange/generateSwapCalldata.ts @@ -135,7 +135,7 @@ export async function generateSwapCalldata({ swapInfo.assetOut = swapInfo.assetOut.toLowerCase() return swapInfo; }); - console.log('path', path); + logger?.(`path: ${path}`); const { assetIn: srcToken } = path.first(); const { assetOut: dstToken } = path.last();