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

fix: charge percentage fee on order amount #187

Merged
merged 2 commits into from
Aug 31, 2023
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
117 changes: 57 additions & 60 deletions .gas-report

Large diffs are not rendered by default.

102 changes: 50 additions & 52 deletions .gas-snapshot
Original file line number Diff line number Diff line change
@@ -1,68 +1,66 @@
BuyProcessorRequestTest:testRequestOrderWithPermit(uint256,uint256) (runs: 518, μ: 351458, ~: 351329)
BuyProcessorRequestTest:testRequestOrderWithPermitSingle() (gas: 382222)
BuyProcessorRequestTest:testRequestOrderWithPermit(uint256,uint256) (runs: 518, μ: 351255, ~: 351111)
BuyProcessorRequestTest:testRequestOrderWithPermitSingle() (gas: 382113)
BuyProcessorRequestTest:testSelfPermit() (gas: 75785)
BuyProcessorTest:testBlackListAssetRevert() (gas: 79234)
BuyProcessorTest:testCancelOrder(uint256,uint256,string) (runs: 518, μ: 453332, ~: 461981)
BuyProcessorTest:testCancelOrderNotFoundReverts(uint256) (runs: 518, μ: 44420, ~: 44420)
BuyProcessorTest:testFillBuyOrderLimit(uint256,uint256,uint256,uint256) (runs: 518, μ: 365235, ~: 320548)
BuyProcessorTest:testFillOrder(uint256,uint256,uint256) (runs: 518, μ: 411999, ~: 345378)
BuyProcessorTest:testCancelOrder(uint256,uint256,string) (runs: 518, μ: 453363, ~: 461686)
BuyProcessorTest:testCancelOrderNotFoundReverts(uint256) (runs: 518, μ: 44398, ~: 44398)
BuyProcessorTest:testFillBuyOrderLimit(uint256,uint256,uint256,uint256) (runs: 518, μ: 372724, ~: 320308)
BuyProcessorTest:testFillOrder(uint256,uint256,uint256) (runs: 518, μ: 411814, ~: 345138)
BuyProcessorTest:testFillorderNoOrderReverts(uint256) (runs: 518, μ: 29108, ~: 29108)
BuyProcessorTest:testFulfillOrder(uint256,uint256) (runs: 518, μ: 406348, ~: 406778)
BuyProcessorTest:testGetInputValue(uint24,uint24,uint128) (runs: 518, μ: 31649, ~: 31786)
BuyProcessorTest:testPaymentTokenBlackList(uint256) (runs: 518, μ: 176921, ~: 176735)
BuyProcessorTest:testRequestCancel() (gas: 363105)
BuyProcessorTest:testFulfillOrder(uint256,uint256) (runs: 518, μ: 406478, ~: 407356)
BuyProcessorTest:testPaymentTokenBlackList(uint256) (runs: 518, μ: 177000, ~: 176986)
BuyProcessorTest:testRequestCancel() (gas: 362974)
BuyProcessorTest:testRequestCancelNotFoundReverts(uint256) (runs: 518, μ: 17866, ~: 17866)
BuyProcessorTest:testRequestCancelNotRequesterReverts() (gas: 334597)
BuyProcessorTest:testRequestOrder(uint256) (runs: 518, μ: 336822, ~: 349527)
BuyProcessorTest:testRequestOrderBlacklist(uint256) (runs: 518, μ: 172415, ~: 172240)
BuyProcessorTest:testRequestOrderLimit(uint256,uint256) (runs: 518, μ: 309742, ~: 322442)
BuyProcessorTest:testRequestOrderPausedReverts() (gas: 35774)
BuyProcessorTest:testRequestOrderUnsupportedAssetReverts() (gas: 2561634)
BuyProcessorTest:testRequestOrderUnsupportedPaymentReverts() (gas: 882732)
BuyProcessorTest:testRequestOrderWithPermit() (gas: 422164)
BuyProcessorTest:testRequestCancelNotRequesterReverts() (gas: 334488)
BuyProcessorTest:testRequestOrder(uint256) (runs: 518, μ: 337055, ~: 350117)
BuyProcessorTest:testRequestOrderBlacklist(uint256) (runs: 518, μ: 172505, ~: 172491)
BuyProcessorTest:testRequestOrderLimit(uint256,uint256) (runs: 518, μ: 309911, ~: 322992)
BuyProcessorTest:testRequestOrderPausedReverts() (gas: 35752)
BuyProcessorTest:testRequestOrderUnsupportedAssetReverts() (gas: 2561612)
BuyProcessorTest:testRequestOrderUnsupportedPaymentReverts() (gas: 882776)
BuyProcessorTest:testRequestOrderWithPermit() (gas: 422099)
BuyProcessorTest:testRequestOrderZeroAddressReverts() (gas: 28976)
BuyProcessorTest:testSetFee(uint64,uint24,uint8,uint256) (runs: 518, μ: 572262, ~: 761752)
BuyProcessorTest:testSetOrdersPaused(bool) (runs: 518, μ: 17426, ~: 16513)
BuyProcessorTest:testSetTokenLockCheck(address) (runs: 518, μ: 19520, ~: 19539)
BuyProcessorTest:testSetTreasury(address) (runs: 518, μ: 43708, ~: 43708)
BuyProcessorTest:testSetFee(uint64,uint24,uint8,uint256) (runs: 518, μ: 566598, ~: 761708)
BuyProcessorTest:testSetOrdersPaused(bool) (runs: 518, μ: 17399, ~: 16491)
BuyProcessorTest:testSetTokenLockCheck(address) (runs: 518, μ: 19546, ~: 19584)
BuyProcessorTest:testSetTreasury(address) (runs: 518, μ: 43752, ~: 43752)
BuyProcessorTest:testSetTreasuryZeroReverts() (gas: 10932)
BuyUnlockedProcessorTest:testCancelOrder(uint256,uint256,string,uint256) (runs: 518, μ: 454653, ~: 481607)
BuyUnlockedProcessorTest:testCancelOrderUnreturnedEscrowReverts(uint256,uint256) (runs: 518, μ: 340171, ~: 340203)
BuyUnlockedProcessorTest:testFillOrder(uint256,uint256,uint256,uint256) (runs: 518, μ: 426840, ~: 388265)
BuyUnlockedProcessorTest:testReturnEscrow(uint256,uint256) (runs: 518, μ: 396385, ~: 392088)
BuyUnlockedProcessorTest:testTakeEscrow(uint256,uint256) (runs: 518, μ: 365324, ~: 352062)
BuyUnlockedProcessorTest:testCancelOrder(uint256,uint256,string,uint256) (runs: 518, μ: 455255, ~: 482292)
BuyUnlockedProcessorTest:testCancelOrderUnreturnedEscrowReverts(uint256,uint256) (runs: 518, μ: 340081, ~: 340034)
BuyUnlockedProcessorTest:testFillOrder(uint256,uint256,uint256,uint256) (runs: 518, μ: 429754, ~: 387981)
BuyUnlockedProcessorTest:testReturnEscrow(uint256,uint256) (runs: 518, μ: 395959, ~: 391804)
BuyUnlockedProcessorTest:testTakeEscrow(uint256,uint256) (runs: 518, μ: 365489, ~: 351800)
DividendDistributionTest:testCreateDistributionNotDistributorReverts() (gas: 74146)
DividendDistributionTest:testCreateNewDistribution(uint256,uint256) (runs: 518, μ: 167474, ~: 174733)
DividendDistributionTest:testDistribute(uint256,uint256) (runs: 518, μ: 271753, ~: 272031)
DividendDistributionTest:testReclaimed(uint256) (runs: 518, μ: 244180, ~: 248448)
FeeLibTest:testRecoverInputValueFromRemaining(uint24,uint128) (runs: 518, μ: 4013, ~: 4061)
FeeLibTest:testUSDCFlatFee() (gas: 8322)
ForwarderRequestCancelTest:testRequestCancel() (gas: 172959)
ForwarderTest:testAddProcessor(address) (runs: 518, μ: 35496, ~: 35495)
ForwarderTest:testCancel() (gas: 621840)
ForwarderTest:testDeployment(address,uint64,uint256) (runs: 518, μ: 91157, ~: 92359)
ForwarderTest:testForwarderCancellationFeeSet(uint256) (runs: 518, μ: 728600, ~: 730368)
ForwarderRequestCancelTest:testRequestCancel() (gas: 172915)
ForwarderTest:testAddProcessor(address) (runs: 518, μ: 35510, ~: 35495)
ForwarderTest:testCancel() (gas: 621544)
ForwarderTest:testDeployment(address,uint64,uint256) (runs: 518, μ: 91129, ~: 92359)
ForwarderTest:testForwarderCancellationFeeSet(uint256) (runs: 518, μ: 728217, ~: 730062)
ForwarderTest:testInvaldUserNonce() (gas: 291277)
ForwarderTest:testRelayer(address) (runs: 518, μ: 42114, ~: 42114)
ForwarderTest:testRequestCancel() (gas: 698370)
ForwarderTest:testRequestCancelNotRequesterReverts() (gas: 690918)
ForwarderTest:testRequestOrderModuleNotFound() (gas: 3885410)
ForwarderTest:testRequestOrderNotApprovedByProcessorReverts() (gas: 310749)
ForwarderTest:testRequestOrderPausedRevertThroughFordwarder(uint256) (runs: 518, μ: 379133, ~: 379133)
ForwarderTest:testRequestCancel() (gas: 698042)
ForwarderTest:testRequestCancelNotRequesterReverts() (gas: 690634)
ForwarderTest:testRequestOrderModuleNotFound() (gas: 3815986)
ForwarderTest:testRequestOrderNotApprovedByProcessorReverts() (gas: 310714)
ForwarderTest:testRequestOrderPausedRevertThroughFordwarder(uint256) (runs: 518, μ: 378980, ~: 378980)
ForwarderTest:testRequestOrderRevertInvalidDeadline() (gas: 148049)
ForwarderTest:testRequestOrderRevertInvalidRelayer() (gas: 140251)
ForwarderTest:testRequestOrderRevertStalePrice() (gas: 153496)
ForwarderTest:testRequestOrderThroughForwarder() (gas: 650112)
ForwarderTest:testReturnEscrowBuyUnlockedOrder(uint256) (runs: 518, μ: 713517, ~: 720532)
ForwarderTest:testSellOrder() (gas: 1377299)
ForwarderTest:testTakeEscrowBuyUnlockedOrder(uint256) (runs: 518, μ: 685561, ~: 701679)
ForwarderTest:testUnsupportedCall() (gas: 300735)
SellProcessorTest:testCancelOrder(uint256,uint256,uint256,string) (runs: 518, μ: 478576, ~: 486771)
SellProcessorTest:testFillOrder(uint256,uint256,uint256) (runs: 518, μ: 458778, ~: 433311)
SellProcessorTest:testFillSellOrderLimit(uint256,uint256,uint256,uint256) (runs: 518, μ: 435734, ~: 458545)
SellProcessorTest:testFulfillOrder(uint256,uint256,uint256,uint256) (runs: 518, μ: 514048, ~: 525437)
SellProcessorTest:testRequestOrder(uint256) (runs: 518, μ: 335753, ~: 348276)
SellProcessorTest:testRequestOrderLimit(uint256,uint256) (runs: 518, μ: 319566, ~: 334634)
ForwarderTest:testRequestOrderThroughForwarder() (gas: 649938)
ForwarderTest:testReturnEscrowBuyUnlockedOrder(uint256) (runs: 518, μ: 713152, ~: 720118)
ForwarderTest:testSellOrder() (gas: 1377081)
ForwarderTest:testTakeEscrowBuyUnlockedOrder(uint256) (runs: 518, μ: 684714, ~: 701287)
ForwarderTest:testUnsupportedCall() (gas: 300713)
SellProcessorTest:testCancelOrder(uint256,uint256,uint256,string) (runs: 518, μ: 479940, ~: 487506)
SellProcessorTest:testFillOrder(uint256,uint256,uint256) (runs: 518, μ: 457890, ~: 422761)
SellProcessorTest:testFillSellOrderLimit(uint256,uint256,uint256,uint256) (runs: 518, μ: 434273, ~: 459047)
SellProcessorTest:testFulfillOrder(uint256,uint256,uint256,uint256) (runs: 518, μ: 514179, ~: 525834)
SellProcessorTest:testRequestOrder(uint256) (runs: 518, μ: 335993, ~: 348527)
SellProcessorTest:testRequestOrderLimit(uint256,uint256) (runs: 518, μ: 319810, ~: 334885)
TokenLockTest:testLocked() (gas: 82637)
TokenManagerTest:testAdministration() (gas: 77238)
TokenManagerTest:testConvertSplitNotFoundReverts() (gas: 10921)
Expand All @@ -72,9 +70,9 @@ TokenManagerTest:testGetAggregateSupply(uint256,uint8,uint256) (runs: 518, μ: 2
TokenManagerTest:testSplit(uint256,uint8,bool) (runs: 518, μ: 1818773, ~: 2350234)
TokenManagerTest:testSplitReverts() (gas: 19634)
TransferRestrictorTest:testRestrictUnrestrict(address) (runs: 518, μ: 36886, ~: 36888)
dShareCompatTest:testRequestCancel() (gas: 697966)
dShareCompatTest:testRequestOrderThroughForwarder() (gas: 644957)
dShareCompatTest:testSellOrder() (gas: 811545)
dShareCompatTest:testRequestCancel() (gas: 697638)
dShareCompatTest:testRequestOrderThroughForwarder() (gas: 644783)
dShareCompatTest:testSellOrder() (gas: 811436)
dShareTest:testAttemptToFalsifyTotalsupply() (gas: 160410)
dShareTest:testBurn() (gas: 131555)
dShareTest:testBurnUnauthorizedReverts() (gas: 157733)
Expand Down
15 changes: 9 additions & 6 deletions script/DeployAll.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ contract DeployAllScript is Script {
// address owner;
address treasury;
address operator;
address operator2;
address usdc;
address usdt;
address relayer;
Expand All @@ -34,8 +35,11 @@ contract DeployAllScript is Script {
// owner: vm.addr(ownerKey),
treasury: vm.envAddress("TREASURY"),
operator: vm.envAddress("OPERATOR"),
usdc: vm.envAddress("USDC"),
usdt: vm.envAddress("USDT"),
operator2: vm.envAddress("OPERATOR2"),
// usdc: vm.envAddress("USDC"),
usdc: address(0),
// usdt: vm.envAddress("USDT"),
usdt: address(0),
relayer: vm.envAddress("RELAYER"),
oracle: vm.envAddress("ORACLE")
});
Expand Down Expand Up @@ -64,10 +68,9 @@ contract DeployAllScript is Script {
buyProcessor.grantRole(buyProcessor.OPERATOR_ROLE(), cfg.operator);
sellProcessor.grantRole(sellProcessor.OPERATOR_ROLE(), cfg.operator);
directBuyIssuer.grantRole(directBuyIssuer.OPERATOR_ROLE(), cfg.operator);
address op2 = 0x874c1606c678cdA1d0f054f5123567198B13fedF;
buyProcessor.grantRole(buyProcessor.OPERATOR_ROLE(), op2);
sellProcessor.grantRole(sellProcessor.OPERATOR_ROLE(), op2);
directBuyIssuer.grantRole(directBuyIssuer.OPERATOR_ROLE(), op2);
buyProcessor.grantRole(buyProcessor.OPERATOR_ROLE(), cfg.operator2);
sellProcessor.grantRole(sellProcessor.OPERATOR_ROLE(), cfg.operator2);
directBuyIssuer.grantRole(directBuyIssuer.OPERATOR_ROLE(), cfg.operator2);

// config payment token
buyProcessor.grantRole(buyProcessor.PAYMENTTOKEN_ROLE(), cfg.usdc);
Expand Down
17 changes: 3 additions & 14 deletions src/FeeLib.sol → src/common/FeeLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,6 @@ library FeeLib {
return percentageFeeRate != 0 ? PrbMath.mulDiv(value, percentageFeeRate, _ONEHUNDRED_PERCENT) : 0;
}

function recoverInputValueFromRemaining(uint256 remainingValue, uint24 percentageFeeRate)
internal
pure
returns (uint256)
{
if (percentageFeeRate >= _ONEHUNDRED_PERCENT) revert FeeTooLarge();
return percentageFeeRate == 0
? remainingValue
: PrbMath.mulDiv(remainingValue, _ONEHUNDRED_PERCENT, _ONEHUNDRED_PERCENT - percentageFeeRate);
}

function flatFeeForOrder(address token, uint64 perOrderFee) internal view returns (uint256 flatFee) {
uint8 decimals = IERC20Metadata(token).decimals();
if (decimals > 18) revert DecimalsTooLarge();
Expand All @@ -42,14 +31,14 @@ library FeeLib {
}
}

function estimateTotalFees(uint256 flatFee, uint24 percentageFeeRate, uint256 inputValue)
function estimateTotalFees(uint256 flatFee, uint24 percentageFeeRate, uint256 orderValue)
internal
pure
returns (uint256 totalFees)
{
totalFees = flatFee;
if (inputValue > flatFee && percentageFeeRate != 0) {
totalFees += PrbMath.mulDiv(inputValue - flatFee, percentageFeeRate, _ONEHUNDRED_PERCENT);
if (percentageFeeRate != 0) {
totalFees += PrbMath.mulDiv(orderValue, percentageFeeRate, _ONEHUNDRED_PERCENT);
}
}
}
2 changes: 1 addition & 1 deletion src/forwarder/Forwarder.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import {IOrderProcessor} from "../../src/orders/IOrderProcessor.sol";
import {PriceAttestationConsumer} from "./PriceAttestationConsumer.sol";
import {Nonces} from "../common/Nonces.sol";
import {SelfPermit} from "../common/SelfPermit.sol";
import {FeeLib} from "../../src/FeeLib.sol";
import {FeeLib} from "../common/FeeLib.sol";
import {IForwarder} from "./IForwarder.sol";

/// @notice Contract for paying gas fees for users and forwarding meta transactions to OrderProcessor contracts.
Expand Down
26 changes: 1 addition & 25 deletions src/orders/BuyProcessor.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ pragma solidity 0.8.19;

import "prb-math/Common.sol" as PrbMath;
import {OrderProcessor, ITokenLockCheck} from "./OrderProcessor.sol";
import {FeeLib} from "../FeeLib.sol";
import {FeeLib} from "../common/FeeLib.sol";

/// @notice Contract managing market purchase orders for bridged assets
/// @author Dinari (https://github.com/dinaricrypto/sbt-contracts/blob/main/src/BuyProcessor.sol)
Expand All @@ -24,30 +24,6 @@ contract BuyProcessor is OrderProcessor {
ITokenLockCheck _tokenLockCheck
) OrderProcessor(_owner, _treasury, _perOrderFee, _percentageFeeRate, _tokenLockCheck) {}

/// ------------------ Fee Helpers ------------------ ///

/// @notice Get the raw input value and fees that produce a final order value
/// @param token Payment token for order
/// @param orderValue Final order value
/// @return inputValue Total input value subject to fees
/// @return flatFee Flat fee for order
/// @return percentageFee Percentage fee for order
function getInputValueForOrderValue(address token, uint256 orderValue)
external
view
returns (uint256 inputValue, uint256 flatFee, uint256 percentageFee)
{
// load fee rate
uint24 _percentageFeeRate = percentageFeeRate;
// Calculate input value after flat fee
uint256 recoveredValue = FeeLib.recoverInputValueFromRemaining(orderValue, _percentageFeeRate);
// Calculate fees
percentageFee = FeeLib.percentageFeeForValue(recoveredValue, _percentageFeeRate);
flatFee = FeeLib.flatFeeForOrder(token, perOrderFee);
// Calculate raw input value
inputValue = recoveredValue + flatFee;
}

/// ------------------ Order Lifecycle ------------------ ///

function _requestOrderAccounting(bytes32, Order calldata order, uint256) internal virtual override {
Expand Down
9 changes: 6 additions & 3 deletions src/orders/IOrderProcessor.sol
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,12 @@ interface IOrderProcessor {
function getFeeRatesForOrder(address token) external view returns (uint256, uint24);

/// @notice Get total fees for an order
/// @param token Payment token for order
/// @param quantity Order quantity
function estimateTotalFeesForOrder(address token, uint256 quantity) external view returns (uint256);
/// @param paymentToken Payment token for order
/// @param paymentTokenOrderValue Order payment token quantity
function estimateTotalFeesForOrder(address paymentToken, uint256 paymentTokenOrderValue)
external
view
returns (uint256);

/// @dev Returns `true` if `account` has been granted `role`.
function hasRole(bytes32 role, address account) external view returns (bool);
Expand Down
12 changes: 8 additions & 4 deletions src/orders/OrderProcessor.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {ITransferRestrictor} from "../ITransferRestrictor.sol";
import {dShare} from "../dShare.sol";
import {ITokenLockCheck} from "../ITokenLockCheck.sol";
import {IdShare} from "../IdShare.sol";
import {FeeLib} from "../FeeLib.sol";
import {FeeLib} from "../common/FeeLib.sol";
import {IForwarder} from "../forwarder/IForwarder.sol";

/// @notice Base contract managing orders for bridged assets
Expand Down Expand Up @@ -272,11 +272,15 @@ abstract contract OrderProcessor is AccessControlDefaultAdminRules, Multicall, S
}

/// @inheritdoc IOrderProcessor
function estimateTotalFeesForOrder(address token, uint256 quantity) public view returns (uint256 totalFees) {
function estimateTotalFeesForOrder(address paymentToken, uint256 paymentTokenOrderValue)
public
view
returns (uint256 totalFees)
{
// Get fee rates
(uint256 flatFee, uint24 _percentageFeeRate) = getFeeRatesForOrder(token);
(uint256 flatFee, uint24 _percentageFeeRate) = getFeeRatesForOrder(paymentToken);
// Calculate total fees
totalFees = FeeLib.estimateTotalFees(flatFee, _percentageFeeRate, quantity);
totalFees = FeeLib.estimateTotalFees(flatFee, _percentageFeeRate, paymentTokenOrderValue);
}

/// ------------------ Order Lifecycle ------------------ ///
Expand Down
15 changes: 1 addition & 14 deletions test/BuyProcessor.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {TransferRestrictor} from "../src/TransferRestrictor.sol";
import {TokenLockCheck, ITokenLockCheck} from "../src/TokenLockCheck.sol";
import "openzeppelin-contracts/contracts/utils/Strings.sol";
import {NumberUtils} from "./utils/NumberUtils.sol";
import {FeeLib} from "../src/FeeLib.sol";
import {FeeLib} from "../src/common/FeeLib.sol";

contract BuyProcessorTest is Test {
event TreasurySet(address indexed treasury);
Expand Down Expand Up @@ -123,19 +123,6 @@ contract BuyProcessorTest is Test {
assertEq(address(issuer.tokenLockCheck()), address(_tokenLockCheck));
}

function testGetInputValue(uint24 perOrderFee, uint24 _percentageFeeRate, uint128 orderValue) public {
// uint128 used to avoid overflow when calculating larger raw input value
vm.assume(_percentageFeeRate < 1_000_000);
issuer.setFees(perOrderFee, _percentageFeeRate);
(uint256 inputValue, uint256 _flatFee, uint256 percentageFee) =
issuer.getInputValueForOrderValue(address(paymentToken), orderValue);
assertEq(inputValue - _flatFee - percentageFee, orderValue);
(uint256 flatFee2, uint24 percentageFeeRate2) = issuer.getFeeRatesForOrder(address(paymentToken));
uint256 totalFees = FeeLib.estimateTotalFees(flatFee2, percentageFeeRate2, inputValue);
assertEq(_flatFee, flatFee2);
assertEq(totalFees, _flatFee + percentageFee);
}

function testSetOrdersPaused(bool pause) public {
vm.expectEmit(true, true, true, true);
emit OrdersPaused(pause);
Expand Down
2 changes: 1 addition & 1 deletion test/BuyUnlockedProcessor.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import "../src/orders/IOrderProcessor.sol";
import {TokenLockCheck, ITokenLockCheck} from "../src/TokenLockCheck.sol";
import {NumberUtils} from "./utils/NumberUtils.sol";
import "prb-math/Common.sol" as PrbMath;
import {FeeLib} from "../src/FeeLib.sol";
import {FeeLib} from "../src/common/FeeLib.sol";

contract BuyUnlockedProcessorTest is Test {
event EscrowTaken(address indexed recipient, uint256 indexed index, uint256 amount);
Expand Down
Loading