Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(fee-taker-ext): move whitelist discount to ResolverFee #39

Merged
merged 2 commits into from
Jan 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 9 additions & 29 deletions src/limit-order/extensions/fee-taker/fee-taker.extension.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ describe('FeeTakerExtension', () => {
new Fees(
new ResolverFee(
recipients.protocolFeeRecipient,
Bps.fromPercent(2)
Bps.fromPercent(2),
Bps.fromPercent(1)
),
new IntegratorFee(
recipients.integratorFeeRecipient,
Expand All @@ -28,10 +29,7 @@ describe('FeeTakerExtension', () => {
Bps.fromPercent(5)
)
),
{
discount: Bps.fromPercent(1),
addresses: [Address.fromBigInt(100n)]
},
[Address.fromBigInt(100n)],
{
makerPermit: new Interaction(
Address.fromBigInt(1n),
Expand Down Expand Up @@ -62,10 +60,7 @@ describe('FeeTakerExtension', () => {
Bps.fromPercent(2)
)
),
{
discount: Bps.fromPercent(0),
addresses: [Address.fromBigInt(100n)]
}
[Address.fromBigInt(100n)]
)

expect(FeeTakerExtension.fromExtension(extension.build())).toEqual(
Expand All @@ -88,10 +83,7 @@ describe('FeeTakerExtension', () => {
Bps.fromPercent(5)
)
),
{
discount: Bps.fromPercent(0),
addresses: [Address.fromBigInt(100n)]
}
[Address.fromBigInt(100n)]
)

expect(FeeTakerExtension.fromExtension(extension.build())).toEqual(
Expand All @@ -107,10 +99,7 @@ describe('FeeTakerExtension', () => {
Fees.resolverFee(
new ResolverFee(Address.fromBigInt(2n), Bps.fromPercent(1))
),
{
addresses: [takerAddress], // mark taker as whitelisted resolver
discount: Bps.ZERO
}
[takerAddress] // mark taker as whitelisted resolver
)

const takingAmount = ext.getTakingAmount(takerAddress, 100_000_000n)
Expand All @@ -124,10 +113,7 @@ describe('FeeTakerExtension', () => {
Fees.resolverFee(
new ResolverFee(Address.fromBigInt(2n), Bps.fromPercent(1))
),
{
addresses: [takerAddress], // mark taker as whitelisted resolver
discount: Bps.ZERO
}
[takerAddress] // mark taker as whitelisted resolver
)

const resolverFee = ext.getResolverFee(takerAddress, 100_000_000n)
Expand All @@ -146,10 +132,7 @@ describe('FeeTakerExtension', () => {
Bps.fromPercent(10) // share
)
),
{
addresses: [takerAddress], // mark taker as whitelisted resolver
discount: Bps.ZERO
}
[takerAddress] // mark taker as whitelisted resolver
)

const integratorFee = ext.getIntegratorFee(takerAddress, 100_000_000n)
Expand All @@ -170,10 +153,7 @@ describe('FeeTakerExtension', () => {
Bps.fromPercent(10) // share
)
),
{
addresses: [takerAddress], // mark taker as whitelisted resolver
discount: Bps.ZERO
}
[takerAddress] // mark taker as whitelisted resolver
)

const protocolFee = ext.getProtocolFee(takerAddress, 100_000_000n)
Expand Down
38 changes: 18 additions & 20 deletions src/limit-order/extensions/fee-taker/fee-taker.extension.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import {BN, BytesBuilder, BytesIter} from '@1inch/byte-utils'
import assert from 'assert'
import {WhitelistInfo} from './types'
import {mulDiv, Rounding} from './mul-div'
import {Fees} from './fees'
import {ResolverFee} from './resolver-fee'
Expand All @@ -24,7 +23,10 @@ export class FeeTakerExtension {
private constructor(
public readonly address: Address,
public readonly fees: Fees,
public readonly whitelist: WhitelistInfo,
/**
* Last 10 bytes of addresses
*/
public readonly whitelist: string[],
public readonly makerPermit?: Interaction,
public readonly extraInteraction?: Interaction,
public readonly customReceiver?: Address
Expand All @@ -43,13 +45,7 @@ export class FeeTakerExtension {
/**
* If empty, then KYC token is required to fill order
*/
whitelist?: {
addresses: Address[]
/**
* Whitelisted resolvers have discount on fee
*/
discount: Bps
},
whitelist?: Address[],
extra?: {
makerPermit?: Interaction
/**
Expand All @@ -63,10 +59,7 @@ export class FeeTakerExtension {
extraInteraction?: Interaction
}
): FeeTakerExtension {
const _whitelist = {
addresses: whitelist?.addresses.map((w) => w.lastHalf()) || [],
discount: whitelist?.discount || Bps.fromPercent(0)
}
const _whitelist = whitelist?.map((w) => w.lastHalf()) || []

return new FeeTakerExtension(
address,
Expand Down Expand Up @@ -182,7 +175,8 @@ export class FeeTakerExtension {
? ResolverFee.ZERO
: new ResolverFee(
protocolFeeRecipient,
amountData.fees.resolverFee
amountData.fees.resolverFee,
amountData.whitelist.discount
),
amountData.fees.integratorFee.isZero()
? IntegratorFee.ZERO
Expand All @@ -193,7 +187,7 @@ export class FeeTakerExtension {
amountData.fees.integratorShare
)
),
amountData.whitelist,
amountData.whitelist.addresses,
permit,
extraInteraction,
customTokensRecipient
Expand Down Expand Up @@ -223,7 +217,7 @@ export class FeeTakerExtension {
public isWhitelisted(address: Address): boolean {
const half = address.lastHalf()

return this.whitelist.addresses.some((w) => w === half)
return this.whitelist.some((w) => w === half)
}

public getTakingAmount(taker: Address, orderTakingAmount: bigint): bigint {
Expand Down Expand Up @@ -346,7 +340,9 @@ export class FeeTakerExtension {
} {
const discountNumerator = this.isWhitelisted(taker)
? (Number(Fees.BASE_1E2) -
this.whitelist.discount.toFraction(Fees.BASE_1E2)) /
this.fees.resolver.whitelistDiscount.toFraction(
Fees.BASE_1E2
)) /
Number(Fees.BASE_1E2)
: 1

Expand Down Expand Up @@ -392,12 +388,14 @@ export class FeeTakerExtension {
BigInt(
// contract expects discount numerator, but class contain discount
Number(Fees.BASE_1E2) -
this.whitelist.discount.toFraction(Fees.BASE_1E2)
this.fees.resolver.whitelistDiscount.toFraction(
Fees.BASE_1E2
)
)
)
.addUint8(BigInt(this.whitelist.addresses.length))
.addUint8(BigInt(this.whitelist.length))

for (const halfAddress of this.whitelist.addresses) {
for (const halfAddress of this.whitelist) {
builder.addBytes(halfAddress)
}

Expand Down
10 changes: 9 additions & 1 deletion src/limit-order/extensions/fee-taker/resolver-fee.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@ export class ResolverFee {

constructor(
public readonly receiver: Address,
public readonly fee: Bps
public readonly fee: Bps,
/**
* whitelisted resolvers have discount on fee
*/
public readonly whitelistDiscount = Bps.ZERO
) {
if (receiver.isZero() && !fee.isZero()) {
throw new Error('fee must be zero if receiver is zero address')
Expand All @@ -18,5 +22,9 @@ export class ResolverFee {
if (!receiver.isZero() && fee.isZero()) {
throw new Error('receiver must be zero address if fee is zero')
}

if (fee.isZero() && !whitelistDiscount.isZero()) {
throw new Error('whitelist discount must be zero if fee is zero')
}
}
}
12 changes: 0 additions & 12 deletions src/limit-order/extensions/fee-taker/types.ts

This file was deleted.

5 changes: 1 addition & 4 deletions src/limit-order/limit-order-with-fee.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,7 @@ describe('LimitOrderWithFee', () => {
Bps.fromPercent(5)
)
),
{
discount: Bps.fromPercent(1),
addresses: [Address.fromBigInt(100n)]
},
[Address.fromBigInt(100n)],
{
makerPermit: new Interaction(
Address.fromBigInt(1n),
Expand Down
10 changes: 2 additions & 8 deletions tests/extensions/fee-taker/fee-taker.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,7 @@ describe('FeeTakerExtension', () => {
Bps.fromPercent(1)
)
),
{
addresses: [takerAddress], // mark taker as whitelisted resolver
discount: Bps.ZERO
}
[takerAddress] // mark taker as whitelisted resolver
)

const order = new LimitOrderWithFee(
Expand Down Expand Up @@ -159,10 +156,7 @@ describe('FeeTakerExtension', () => {
Bps.fromPercent(50) // share
)
),
{
addresses: [takerAddress], // mark taker as whitelisted resolver
discount: Bps.ZERO
}
[takerAddress] // mark taker as whitelisted resolver
)

const order = new LimitOrderWithFee(
Expand Down
Loading