Skip to content

Commit

Permalink
feat: applied surCharge fee
Browse files Browse the repository at this point in the history
  • Loading branch information
shkangr committed Nov 1, 2023
1 parent 911adf9 commit c48ee9a
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 36 deletions.
17 changes: 8 additions & 9 deletions bridge/src/policies/exchange-fee-ratio.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,20 +42,19 @@ export class FixedExchangeFeeRatioPolicy implements IExchangeFeeRatioPolicy {
return this._baseFeePolicy.fee;
}

// fee for Amount Range 1
let fee = new Decimal(amount.mul(this._feeRatios.range1).toFixed(2));

if (
amount.greaterThanOrEqualTo(this._baseFeePolicy.criterion) &&
amount.lessThanOrEqualTo(this._feeRangeDividerAmount)
) {
return new Decimal(amount.mul(this._feeRatios.range1).toFixed(2));
} else if (
// fee for Amount Range 2
amount.greaterThan(this._feeRangeDividerAmount) &&
amount.lessThanOrEqualTo(this._maximumNCG)
) {
return new Decimal(amount.mul(this._feeRatios.range2).toFixed(2));
const overAmount = amount.sub(this._feeRangeDividerAmount);
const surCharge = new Decimal(
overAmount.mul(this._feeRatios.range2).toFixed(2)
);
fee = fee.add(surCharge);
}

throw new Error(`Invalid amount for getting fee.`);
return fee;
}
}
25 changes: 13 additions & 12 deletions bridge/test/observers/nine-chronicles.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ describe(NCGTransferredEventObserver.name, () => {
};

const exchangeFeeRatioPolicy = new FixedExchangeFeeRatioPolicy(
new Decimal(100000),
new Decimal(50000),
new Decimal(20000),
new Decimal(10000),
{
criterion: new Decimal(1000),
fee: new Decimal(10),
Expand All @@ -102,7 +102,7 @@ describe(NCGTransferredEventObserver.name, () => {
};

const limitationPolicy = {
maximum: 100000,
maximum: 20000,
whitelistMaximum: 200000,
minimum: 100,
};
Expand Down Expand Up @@ -400,9 +400,9 @@ describe(NCGTransferredEventObserver.name, () => {
makeEvent(wrappedNcgRecipient, "1.2", "TX-INVALID-B"),
makeEvent(wrappedNcgRecipient, "0.01", "TX-INVALID-C"),
makeEvent(wrappedNcgRecipient, "3.22", "TX-INVALID-D"),
makeEvent(wrappedNcgRecipient, "100", "TX-E"), // Success TX - Base Fee
makeEvent(wrappedNcgRecipient, "500", "TX-E"), // Success TX - Base Fee
makeEvent(wrappedNcgRecipient, "5000", "TX-FEE-FIRST-RANGE"), //Success TX - fee first range
makeEvent(wrappedNcgRecipient, "60000", "TX-FEE-SECOND-RANGE"), //Success TX - fee second range
makeEvent(wrappedNcgRecipient, "12000", "TX-FEE-SECOND-RANGE"), //Success TX - fee second range
makeEvent(
wrappedNcgRecipient,
"10000000000",
Expand Down Expand Up @@ -595,7 +595,7 @@ describe(NCGTransferredEventObserver.name, () => {
});

expect(mockExchangeHistoryStore.put).toHaveBeenNthCalledWith(5, {
amount: 100,
amount: 500,
network: "nineChronicles",
recipient: wrappedNcgRecipient,
sender: sender,
Expand All @@ -613,7 +613,7 @@ describe(NCGTransferredEventObserver.name, () => {
});

expect(mockExchangeHistoryStore.put).toHaveBeenNthCalledWith(7, {
amount: 60000,
amount: 12000,
network: "nineChronicles",
recipient: wrappedNcgRecipient,
sender: sender,
Expand All @@ -622,7 +622,7 @@ describe(NCGTransferredEventObserver.name, () => {
});

expect(mockExchangeHistoryStore.put).toHaveBeenNthCalledWith(8, {
amount: 34900, // 100000 - ( 100 + 5000 + 60000 )
amount: 2500, // 20000 - ( 500 + 5000 + 12000 )
network: "nineChronicles",
recipient: wrappedNcgRecipient,
sender: sender,
Expand Down Expand Up @@ -686,11 +686,12 @@ describe(NCGTransferredEventObserver.name, () => {

// applied fixed fee ( 10 NCG for transfer under 1000 NCG )
expect(mockWrappedNcgMinter.mint.mock.calls).toEqual([
[wrappedNcgRecipient, new Decimal(90000000000000000000)], // Base Fee ( 100 NCG, BaseFee 10 NCG )
[wrappedNcgRecipient, new Decimal(490000000000000000000)], // Base Fee ( 500 NCG, BaseFee 10 NCG )
[wrappedNcgRecipient, new Decimal(4950000000000000000000)], // Fee First Range ( 5000 NCG, Fee 0.01 )
[wrappedNcgRecipient, new Decimal(58800000000000000000000)], // Fee Second Range ( 60000 NCG, Fee 0.02 )
[wrappedNcgRecipient, new Decimal(34551000000000000000000)],
[allowlistRecipient, new Decimal(10890000000000000000000)],
// Fee Second Range ( 12000 NCG, Fee ( 0.01 for 12000 + 0.02 for 2000 )
[wrappedNcgRecipient, new Decimal(11840000000000000000000)],
[wrappedNcgRecipient, new Decimal(2475000000000000000000)],
[allowlistRecipient, new Decimal(10870000000000000000000)],
[feeWaiverRecipient, new Decimal(11000000000000000000000)],
]);
});
Expand Down
33 changes: 18 additions & 15 deletions bridge/test/policies/exchange-fee-ratio.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ import { FixedExchangeFeeRatioPolicy } from "../../src/policies/exchange-fee-rat

describe(FixedExchangeFeeRatioPolicy.name, () => {
const policy = new FixedExchangeFeeRatioPolicy(
new Decimal(1000),
new Decimal(500),
new Decimal(20000),
new Decimal(10000),
{
criterion: new Decimal(100),
criterion: new Decimal(1000),
fee: new Decimal(10),
},
{
Expand All @@ -17,19 +17,22 @@ describe(FixedExchangeFeeRatioPolicy.name, () => {

describe(FixedExchangeFeeRatioPolicy.prototype.getFee.name, () => {
it("should return value of exchange fee ratio information", () => {
expect(policy.getFee(new Decimal(50))).toEqual(new Decimal(10));
expect(policy.getFee(new Decimal(100))).toEqual(new Decimal(1));
expect(policy.getFee(new Decimal(150))).toEqual(new Decimal(1.5));
expect(policy.getFee(new Decimal(500))).toEqual(new Decimal(5));
expect(policy.getFee(new Decimal(700))).toEqual(new Decimal(14));
});
// base fee
expect(policy.getFee(new Decimal(300))).toEqual(new Decimal(10));
expect(policy.getFee(new Decimal(500))).toEqual(new Decimal(10));

// range1 - 0.01
expect(policy.getFee(new Decimal(1000))).toEqual(new Decimal(10));
expect(policy.getFee(new Decimal(1001))).toEqual(
new Decimal(10.01)
);
expect(policy.getFee(new Decimal(5000))).toEqual(new Decimal(50));
expect(policy.getFee(new Decimal(10000))).toEqual(new Decimal(100));

it("should return error", () => {
try {
const fee = policy.getFee(new Decimal(5000));
} catch (e: any) {
expect(e.message).toBe("Invalid amount for getting fee.");
}
// range2 - ( 1% fee + 2% surCharge applied )
expect(policy.getFee(new Decimal(12000))).toEqual(new Decimal(160));
expect(policy.getFee(new Decimal(15000))).toEqual(new Decimal(250));
expect(policy.getFee(new Decimal(20000))).toEqual(new Decimal(400));
});
});
});

0 comments on commit c48ee9a

Please sign in to comment.