Skip to content

Commit 976edf6

Browse files
authored
Merge pull request #228 from orionprotocol/feature/payMatcherFee
added fee payment to matcher if dst.Token === feeToken
2 parents b847a17 + a0bed6b commit 976edf6

File tree

9 files changed

+106
-449
lines changed

9 files changed

+106
-449
lines changed

package-lock.json

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@orionprotocol/sdk",
3-
"version": "0.20.34",
3+
"version": "0.20.34-rc-6",
44
"description": "Orion Protocol SDK",
55
"main": "./lib/index.cjs",
66
"module": "./lib/index.js",
@@ -88,7 +88,7 @@
8888
"@babel/runtime": "^7.21.0",
8989
"@ethersproject/abstract-signer": "^5.7.0",
9090
"@ethersproject/providers": "^5.7.2",
91-
"@orionprotocol/contracts": "1.22.3",
91+
"@orionprotocol/contracts": "1.22.6",
9292
"@types/lodash.clonedeep": "^4.5.9",
9393
"bignumber.js": "^9.1.1",
9494
"bson-objectid": "^2.0.4",

src/Unit/Exchange/callGenerators/erc20.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { SwapExecutor__factory } from "@orionprotocol/contracts/lib/ethers-v6/index.js"
2-
import type { BigNumberish } from "ethers"
2+
import type { BigNumberish, AddressLike } from "ethers"
33
import { type CallParams, addCallParams } from "./utils.js"
4-
import type { AddressLike } from "ethers"
54

6-
export async function generateTransferCall(
5+
export function generateTransferCall(
76
token: AddressLike,
87
target: AddressLike,
98
amount: BigNumberish,
@@ -20,7 +19,7 @@ export async function generateTransferCall(
2019
return addCallParams(calldata, callParams)
2120
}
2221

23-
export async function generateApproveCall(
22+
export function generateApproveCall(
2423
token: AddressLike,
2524
target: AddressLike,
2625
amount: BigNumberish,
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { SwapExecutor__factory } from "@orionprotocol/contracts/lib/ethers-v6/index.js"
2+
import type { BigNumberish, AddressLike } from "ethers"
3+
import { type CallParams, addCallParams } from "./utils.js"
4+
5+
6+
export function generateFeePaymentCall(
7+
matcher: AddressLike,
8+
token: AddressLike,
9+
amount: BigNumberish,
10+
callParams?: CallParams
11+
) {
12+
13+
const executorInterface = SwapExecutor__factory.createInterface()
14+
const calldata = executorInterface.encodeFunctionData('payFeeToMatcher', [
15+
matcher,
16+
token,
17+
amount
18+
])
19+
20+
return addCallParams(calldata, callParams)
21+
}

src/Unit/Exchange/callGenerators/uniswapV2.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export async function generateUni2Calls(
3636
return calls
3737
}
3838

39-
export async function generateUni2Call(
39+
export function generateUni2Call(
4040
pool: string,
4141
assetIn: string,
4242
assetOut: string,

src/Unit/Exchange/generateSwapCalldata.ts

Lines changed: 69 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import type { SingleSwap } from "../../types.js";
1919
import { addressLikeToString } from "../../utils/addressLikeToString.js";
2020
import { generateUnwrapAndTransferCall, generateWrapAndTransferCall } from "./callGenerators/weth.js";
2121
import { getExchangeAllowance, getTotalBalance } from "../../utils/getBalance.js";
22+
import { generateFeePaymentCall } from "./callGenerators/feePayment.js";
2223

2324
export type Factory = "UniswapV2" | "UniswapV3" | "Curve" | "OrionV2" | "OrionV3";
2425

@@ -27,6 +28,9 @@ export type GenerateSwapCalldataWithUnitParams = {
2728
minReturnAmount: BigNumberish;
2829
initiatorAddress: string;
2930
receiverAddress: string;
31+
matcher: AddressLike,
32+
feeToken: AddressLike,
33+
fee: BigNumberish;
3034
path: ArrayLike<SingleSwap>;
3135
unit: Unit;
3236
};
@@ -37,6 +41,9 @@ export type GenerateSwapCalldataParams = {
3741
initiatorAddress: string;
3842
receiverAddress: string;
3943
path: ArrayLike<SingleSwap>;
44+
matcher: AddressLike,
45+
feeToken: AddressLike,
46+
fee: BigNumberish;
4047
exchangeContractAddress: AddressLike;
4148
wethAddress: AddressLike;
4249
curveRegistryAddress: AddressLike;
@@ -50,6 +57,9 @@ export async function generateSwapCalldataWithUnit({
5057
initiatorAddress,
5158
receiverAddress,
5259
path: arrayLikePath,
60+
matcher = ZeroAddress,
61+
feeToken = ZeroAddress,
62+
fee = 0,
5363
unit,
5464
}: GenerateSwapCalldataWithUnitParams): Promise<{
5565
calldata: string;
@@ -69,8 +79,10 @@ export async function generateSwapCalldataWithUnit({
6979
let path = SafeArray.from(arrayLikePathCopy);
7080

7181
path = SafeArray.from(arrayLikePathCopy).map((swapInfo) => {
72-
swapInfo.assetIn = assetToAddress[swapInfo.assetIn] ?? swapInfo.assetIn.toLowerCase();
73-
swapInfo.assetOut = assetToAddress[swapInfo.assetOut] ?? swapInfo.assetOut.toLowerCase();
82+
swapInfo.assetIn = assetToAddress[swapInfo.assetIn] ?? swapInfo.assetIn
83+
swapInfo.assetOut = assetToAddress[swapInfo.assetOut] ?? swapInfo.assetOut
84+
swapInfo.assetIn = swapInfo.assetIn.toLowerCase()
85+
swapInfo.assetOut = swapInfo.assetOut.toLowerCase()
7486
return swapInfo;
7587
});
7688

@@ -80,6 +92,9 @@ export async function generateSwapCalldataWithUnit({
8092
receiverAddress,
8193
initiatorAddress,
8294
path,
95+
matcher,
96+
feeToken,
97+
fee,
8398
exchangeContractAddress,
8499
wethAddress,
85100
curveRegistryAddress,
@@ -94,6 +109,9 @@ export async function generateSwapCalldata({
94109
initiatorAddress,
95110
receiverAddress,
96111
path: arrayLikePath,
112+
matcher: matcherAddressLike = ZeroAddress,
113+
feeToken: feeTokenAddressLike = ZeroAddress,
114+
fee = 0,
97115
exchangeContractAddress,
98116
wethAddress: wethAddressLike,
99117
curveRegistryAddress: curveRegistryAddressLike,
@@ -107,7 +125,13 @@ export async function generateSwapCalldata({
107125
const wethAddress = await addressLikeToString(wethAddressLike);
108126
const curveRegistryAddress = await addressLikeToString(curveRegistryAddressLike);
109127
const swapExecutorContractAddress = await addressLikeToString(swapExecutorContractAddressLike);
110-
let path = SafeArray.from(arrayLikePath);
128+
const feeToken = await addressLikeToString(feeTokenAddressLike);
129+
const matcher = await addressLikeToString(matcherAddressLike);
130+
let path = SafeArray.from(arrayLikePath).map((swapInfo) => {
131+
swapInfo.assetIn = swapInfo.assetIn.toLowerCase()
132+
swapInfo.assetOut = swapInfo.assetOut.toLowerCase()
133+
return swapInfo;
134+
});
111135

112136
const { assetIn: srcToken } = path.first();
113137
const { assetOut: dstToken } = path.last();
@@ -122,6 +146,7 @@ export async function generateSwapCalldata({
122146
flags: 0,
123147
};
124148
const amountNativeDecimals = await exchangeToNativeDecimals(srcToken, amount, provider);
149+
const feeNativeDecimals = await exchangeToNativeDecimals(feeToken, fee, provider)
125150

126151
path = SafeArray.from(arrayLikePath).map((singleSwap) => {
127152
if (singleSwap.assetIn == ethers.ZeroAddress) singleSwap.assetIn = wethAddress;
@@ -134,6 +159,9 @@ export async function generateSwapCalldata({
134159
swapDescription,
135160
path,
136161
amountNativeDecimals,
162+
matcher,
163+
feeToken,
164+
feeNativeDecimals,
137165
wethAddress,
138166
swapExecutorContractAddress,
139167
curveRegistryAddress,
@@ -159,6 +187,9 @@ async function processSwaps(
159187
swapDescription: LibValidator.SwapDescriptionStruct,
160188
path: SafeArray<SingleSwap>,
161189
amount: BigNumberish,
190+
matcher: string,
191+
feeToken: string,
192+
fee: BigNumberish,
162193
wethAddress: string,
163194
swapExecutorContractAddress: string,
164195
curveRegistryAddress: string,
@@ -187,13 +218,17 @@ async function processSwaps(
187218
provider
188219
));
189220
}
190-
({ swapDescription, calls } = await wrapOrUnwrapIfNeeded(
221+
222+
({swapDescription, calls} = await payFeeToMatcher(matcher, feeToken, fee, calls, swapDescription));
223+
224+
({ swapDescription, calls } = wrapOrUnwrapIfNeeded(
191225
amount,
192226
swapDescription,
193227
calls,
194228
swapExecutorContractAddress,
195229
wethAddress
196230
));
231+
197232
return { swapDescription, calls };
198233
}
199234

@@ -259,16 +294,16 @@ async function processMultiFactorySwaps(
259294
for (const swap of path) {
260295
switch (swap.factory) {
261296
case "OrionV2": {
262-
let transferCall = await generateTransferCall(swap.assetIn, swap.pool, 0);
297+
let transferCall = generateTransferCall(swap.assetIn, swap.pool, 0);
263298
transferCall = pathCallWithBalance(transferCall, swap.assetIn);
264-
const uni2Call = await generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress);
299+
const uni2Call = generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress);
265300
calls.push(transferCall, uni2Call);
266301
break;
267302
}
268303
case "UniswapV2": {
269-
let transferCall = await generateTransferCall(swap.assetIn, swap.pool, 0);
304+
let transferCall = generateTransferCall(swap.assetIn, swap.pool, 0);
270305
transferCall = pathCallWithBalance(transferCall, swap.assetIn);
271-
const uni2Call = await generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress);
306+
const uni2Call = generateUni2Call(swap.pool, swap.assetIn, swap.assetOut, swapExecutorContractAddress);
272307
calls.push(transferCall, uni2Call);
273308
break;
274309
}
@@ -305,25 +340,44 @@ async function processMultiFactorySwaps(
305340
return { swapDescription, calls };
306341
}
307342

308-
async function wrapOrUnwrapIfNeeded(
343+
async function payFeeToMatcher(
344+
matcher: string,
345+
feeToken: string,
346+
feeAmount: BigNumberish,
347+
calls: BytesLike[],
348+
swapDescription: LibValidator.SwapDescriptionStruct,
349+
) {
350+
console.log(matcher)
351+
console.log(feeAmount)
352+
console.log(feeToken)
353+
console.log(swapDescription.dstToken)
354+
if (BigInt(feeAmount) !== 0n && feeToken === swapDescription.dstToken) {
355+
const feePaymentCall = generateFeePaymentCall(matcher, feeToken, feeAmount)
356+
calls.push(feePaymentCall)
357+
}
358+
return {swapDescription, calls}
359+
}
360+
361+
function wrapOrUnwrapIfNeeded(
309362
amount: BigNumberish,
310363
swapDescription: LibValidator.SwapDescriptionStruct,
311364
calls: BytesLike[],
312365
swapExecutorContractAddress: string,
313366
wethAddress: string
314367
) {
315-
if (swapDescription.srcToken === ZeroAddress) {
316-
const wrapCall = generateWrapAndTransferCall(swapDescription.srcReceiver, { value: amount });
368+
const {dstReceiver, srcReceiver, srcToken, dstToken} = swapDescription;
369+
if (srcToken === ZeroAddress) {
370+
const wrapCall = generateWrapAndTransferCall(srcReceiver, { value: amount });
317371
swapDescription.srcReceiver = swapExecutorContractAddress;
318372
calls = ([wrapCall] as BytesLike[]).concat(calls);
319373
}
320-
if (swapDescription.dstToken === ZeroAddress) {
321-
let unwrapCall = generateUnwrapAndTransferCall(swapDescription.dstReceiver, 0);
374+
if (dstToken === ZeroAddress) {
375+
let unwrapCall = generateUnwrapAndTransferCall(dstReceiver, 0);
322376
unwrapCall = pathCallWithBalance(unwrapCall, wethAddress);
323377
calls.push(unwrapCall);
324378
} else {
325-
let transferCall = await generateTransferCall(swapDescription.dstToken, swapDescription.dstReceiver, 0);
326-
transferCall = pathCallWithBalance(transferCall, swapDescription.dstToken);
379+
let transferCall = generateTransferCall(dstToken, dstReceiver, 0);
380+
transferCall = pathCallWithBalance(transferCall, dstToken);
327381
calls.push(transferCall);
328382
}
329383
return { swapDescription, calls };

0 commit comments

Comments
 (0)