Skip to content

Commit

Permalink
fix(trading-sdk): add partner fee to app-data
Browse files Browse the repository at this point in the history
  • Loading branch information
shoom3301 committed Jan 23, 2025
1 parent 8e82093 commit 623630a
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 42 deletions.
3 changes: 2 additions & 1 deletion src/trading/appDataUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { AppDataParams, MetadataApi, stringifyDeterministic } from '@cowprotocol
import { keccak256, toUtf8Bytes } from 'ethers/lib/utils'

export async function buildAppData(
{ slippageBps, appCode, orderClass: orderClassName }: BuildAppDataParams,
{ slippageBps, appCode, orderClass: orderClassName, partnerFee }: BuildAppDataParams,
advancedParams?: AppDataParams
): Promise<AppDataInfo> {
const metadataApiSDK = new MetadataApi()
Expand All @@ -16,6 +16,7 @@ export async function buildAppData(
metadata: {
quote: quoteParams,
orderClass,
partnerFee,
},
...advancedParams,
})
Expand Down
1 change: 1 addition & 0 deletions src/trading/getQuote.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ export async function getQuote(
slippageBps,
orderClass: 'market',
appCode,
partnerFee,
},
advancedSettings?.appData
)
Expand Down
13 changes: 12 additions & 1 deletion src/trading/postLimitOrder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,17 @@ export async function postLimitOrder(
advancedSettings?: LimitOrderAdvancedSettings,
_orderBookApi?: OrderBookApi
): Promise<string> {
const { appCode, chainId, sellToken, buyToken, sellAmount, buyAmount, slippageBps = 0, env = 'prod' } = params
const {
appCode,
chainId,
sellToken,
buyToken,
sellAmount,
buyAmount,
partnerFee,
slippageBps = 0,
env = 'prod',
} = params

log(`Limit order ${sellAmount} ${sellToken} for ${buyAmount} ${buyToken} on chain ${chainId}`)

Expand All @@ -24,6 +34,7 @@ export async function postLimitOrder(
slippageBps,
orderClass: 'limit',
appCode,
partnerFee,
},
advancedSettings?.appData
)
Expand Down
106 changes: 66 additions & 40 deletions src/trading/postSwapOrder.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,54 +21,56 @@ import { SupportedChainId } from '../common'
const WETH_ADDRESS = '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14'
const COW_ADDRESS = '0x0625aFB445C3B6B7B929342a04A22599fd5dBB59'

const SELL_ORDER_QUOTE_MOCK = {
quote: {
sellToken: WETH_ADDRESS.toLowerCase(),
buyToken: COW_ADDRESS.toLowerCase(),
receiver: '0xc8c753ee51e8fc80e199ab297fb575634a1ac1d3',
sellAmount: '98646335338956442',
buyAmount: '39562052700191266415',
validTo: 1737464594,
appData:
'{"appCode":"test","metadata":{"orderClass":{"orderClass":"market"},"quote":{"slippageBips":50}},"version":"1.3.0"}',
appDataHash: '0xe269b09f45b1d3c98d8e4e841b99a0779fbd3b77943d069b91ddc4fd9789e27e',
feeAmount: '1353664661043558',
kind: 'sell',
partiallyFillable: false,
sellTokenBalance: 'erc20',
buyTokenBalance: 'erc20',
signingScheme: 'eip712',
},
from: '0xc8c753ee51e8fc80e199ab297fb575634a1ac1d3',
expiration: '2025-01-21T12:55:14.799709609Z',
id: 575401,
verified: true,
}

const SELL_ORDER_PARAMS: SwapParameters = {
chainId: SupportedChainId.SEPOLIA,
appCode: 'test',
signer: '0xa43ccc40ff785560dab6cb0f13b399d050073e8a54114621362f69444e1421ca',
kind: OrderKind.SELL,
amount: parseUnits('0.1', 18).toString(), // 0.1 WETH
sellToken: WETH_ADDRESS,
sellTokenDecimals: 18,
buyToken: COW_ADDRESS,
buyTokenDecimals: 18,
slippageBps: 50,
}

describe('postSwapOrder', () => {
it('Sell order amounts should take fees and slippage into account', async () => {
const parameters: SwapParameters = {
chainId: SupportedChainId.SEPOLIA,
appCode: 'test',
signer: '0xa43ccc40ff785560dab6cb0f13b399d050073e8a54114621362f69444e1421ca',
kind: OrderKind.SELL,
amount: parseUnits('0.1', 18).toString(), // 0.1 WETH
sellToken: WETH_ADDRESS,
sellTokenDecimals: 18,
buyToken: COW_ADDRESS,
buyTokenDecimals: 18,
slippageBps: 50,
}

const quoteResponseMock = {
quote: {
sellToken: WETH_ADDRESS.toLowerCase(),
buyToken: COW_ADDRESS.toLowerCase(),
receiver: '0xc8c753ee51e8fc80e199ab297fb575634a1ac1d3',
sellAmount: '98646335338956442',
buyAmount: '39562052700191266415',
validTo: 1737464594,
appData:
'{"appCode":"test","metadata":{"orderClass":{"orderClass":"market"},"quote":{"slippageBips":50}},"version":"1.3.0"}',
appDataHash: '0xe269b09f45b1d3c98d8e4e841b99a0779fbd3b77943d069b91ddc4fd9789e27e',
feeAmount: '1353664661043558',
kind: 'sell',
partiallyFillable: false,
sellTokenBalance: 'erc20',
buyTokenBalance: 'erc20',
signingScheme: 'eip712',
},
from: '0xc8c753ee51e8fc80e199ab297fb575634a1ac1d3',
expiration: '2025-01-21T12:55:14.799709609Z',
id: 575401,
verified: true,
}

const orderBookApi = {
context: {
chainId: parameters.chainId,
chainId: SELL_ORDER_PARAMS.chainId,
},
getQuote: jest.fn().mockResolvedValue(quoteResponseMock),
getQuote: jest.fn().mockResolvedValue(SELL_ORDER_QUOTE_MOCK),
sendOrder: jest.fn().mockResolvedValue('0x01'),
}

const orderId = await postSwapOrderFromQuote(await getQuoteWithSigner(parameters, undefined, orderBookApi as any))
const orderId = await postSwapOrderFromQuote(
await getQuoteWithSigner(SELL_ORDER_PARAMS, undefined, orderBookApi as any)
)

const call = orderBookApi.sendOrder.mock.calls[0][0]

Expand Down Expand Up @@ -141,4 +143,28 @@ describe('postSwapOrder', () => {
// quoteResponseMock.buyAmount
expect(call.buyAmount).toBe('400000000000000000000')
})

it('When partner fee is specified, then it must be reflected in appData', async () => {
const orderBookApi = {
context: {
chainId: SELL_ORDER_PARAMS.chainId,
},
getQuote: jest.fn().mockResolvedValue(SELL_ORDER_QUOTE_MOCK),
sendOrder: jest.fn().mockResolvedValue('0x01'),
}

const orderParams = {
...SELL_ORDER_PARAMS,
partnerFee: {
bps: 50,
recipient: '0x444cc',
},
}

await postSwapOrderFromQuote(await getQuoteWithSigner(orderParams, undefined, orderBookApi as any))

const call = orderBookApi.sendOrder.mock.calls[0][0]

expect(JSON.parse(call.appData).metadata.partnerFee).toEqual(orderParams.partnerFee)
})
})
1 change: 1 addition & 0 deletions src/trading/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ export interface BuildAppDataParams {
appCode: latest.AppCode
slippageBps: latest.SlippageBips
orderClass: latest.OrderClass['orderClass']
partnerFee?: latest.PartnerFee
}

/**
Expand Down

0 comments on commit 623630a

Please sign in to comment.