@stryke-xyz/premarket-sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abi/AggregationRouterV6.abi.json +1186 -0
- package/dist/abi/NativeOrderFactory.abi.json +291 -0
- package/dist/abi/NativeOrderImpl.abi.json +381 -0
- package/dist/abi/limitOrderProtocol.json +63 -0
- package/dist/address.d.ts +13 -0
- package/dist/address.js +32 -0
- package/dist/api/filler.d.ts +109 -0
- package/dist/api/filler.js +289 -0
- package/dist/api/index.d.ts +3 -0
- package/dist/api/index.js +3 -0
- package/dist/api/order-helper.d.ts +59 -0
- package/dist/api/order-helper.js +112 -0
- package/dist/api/orderbook-api.d.ts +36 -0
- package/dist/api/orderbook-api.js +69 -0
- package/dist/bps.d.ts +35 -0
- package/dist/bps.js +52 -0
- package/dist/config/chains.d.ts +50 -0
- package/dist/config/chains.js +21 -0
- package/dist/config/index.d.ts +25 -0
- package/dist/config/index.js +103 -0
- package/dist/config/markets.d.ts +53 -0
- package/dist/config/markets.js +125 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.js +30 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +21 -0
- package/dist/limit-order/amounts.d.ts +14 -0
- package/dist/limit-order/amounts.js +19 -0
- package/dist/limit-order/eip712/domain.d.ts +10 -0
- package/dist/limit-order/eip712/domain.js +18 -0
- package/dist/limit-order/eip712/eip712.types.d.ts +23 -0
- package/dist/limit-order/eip712/eip712.types.js +1 -0
- package/dist/limit-order/eip712/index.d.ts +3 -0
- package/dist/limit-order/eip712/index.js +3 -0
- package/dist/limit-order/eip712/order-typed-data-builder.d.ts +6 -0
- package/dist/limit-order/eip712/order-typed-data-builder.js +25 -0
- package/dist/limit-order/extensions/extension-builder.d.ts +35 -0
- package/dist/limit-order/extensions/extension-builder.js +83 -0
- package/dist/limit-order/extensions/extension.d.ts +45 -0
- package/dist/limit-order/extensions/extension.js +108 -0
- package/dist/limit-order/extensions/extension.spec.d.ts +1 -0
- package/dist/limit-order/extensions/extension.spec.js +17 -0
- package/dist/limit-order/extensions/fee-taker/errors.d.ts +2 -0
- package/dist/limit-order/extensions/fee-taker/errors.js +2 -0
- package/dist/limit-order/extensions/fee-taker/fee-calculator.d.ts +40 -0
- package/dist/limit-order/extensions/fee-taker/fee-calculator.js +83 -0
- package/dist/limit-order/extensions/fee-taker/fee-calculator.spec.d.ts +1 -0
- package/dist/limit-order/extensions/fee-taker/fee-calculator.spec.js +14 -0
- package/dist/limit-order/extensions/fee-taker/fee-taker.extension.d.ts +130 -0
- package/dist/limit-order/extensions/fee-taker/fee-taker.extension.js +249 -0
- package/dist/limit-order/extensions/fee-taker/fee-taker.extension.spec.d.ts +1 -0
- package/dist/limit-order/extensions/fee-taker/fee-taker.extension.spec.js +72 -0
- package/dist/limit-order/extensions/fee-taker/fees.d.ts +19 -0
- package/dist/limit-order/extensions/fee-taker/fees.js +36 -0
- package/dist/limit-order/extensions/fee-taker/index.d.ts +7 -0
- package/dist/limit-order/extensions/fee-taker/index.js +7 -0
- package/dist/limit-order/extensions/fee-taker/integrator-fee.d.ts +13 -0
- package/dist/limit-order/extensions/fee-taker/integrator-fee.js +28 -0
- package/dist/limit-order/extensions/fee-taker/resolver-fee.d.ts +19 -0
- package/dist/limit-order/extensions/fee-taker/resolver-fee.js +28 -0
- package/dist/limit-order/extensions/fee-taker/types.d.ts +4 -0
- package/dist/limit-order/extensions/fee-taker/types.js +1 -0
- package/dist/limit-order/extensions/fee-taker/whitelist-half-address.d.ts +18 -0
- package/dist/limit-order/extensions/fee-taker/whitelist-half-address.js +26 -0
- package/dist/limit-order/extensions/index.d.ts +3 -0
- package/dist/limit-order/extensions/index.js +3 -0
- package/dist/limit-order/index.d.ts +10 -0
- package/dist/limit-order/index.js +10 -0
- package/dist/limit-order/interaction.d.ts +16 -0
- package/dist/limit-order/interaction.js +25 -0
- package/dist/limit-order/interaction.spec.d.ts +1 -0
- package/dist/limit-order/interaction.spec.js +8 -0
- package/dist/limit-order/limit-order-with-fee.d.ts +59 -0
- package/dist/limit-order/limit-order-with-fee.js +94 -0
- package/dist/limit-order/limit-order-with-fee.spec.d.ts +1 -0
- package/dist/limit-order/limit-order-with-fee.spec.js +31 -0
- package/dist/limit-order/limit-order.d.ts +63 -0
- package/dist/limit-order/limit-order.js +211 -0
- package/dist/limit-order/limit-order.spec.d.ts +1 -0
- package/dist/limit-order/limit-order.spec.js +103 -0
- package/dist/limit-order/maker-traits.d.ts +200 -0
- package/dist/limit-order/maker-traits.js +309 -0
- package/dist/limit-order/maker-traits.spec.d.ts +1 -0
- package/dist/limit-order/maker-traits.spec.js +102 -0
- package/dist/limit-order/source-track.d.ts +1 -0
- package/dist/limit-order/source-track.js +22 -0
- package/dist/limit-order/taker-traits.d.ts +141 -0
- package/dist/limit-order/taker-traits.js +207 -0
- package/dist/limit-order/types.d.ts +24 -0
- package/dist/limit-order/types.js +1 -0
- package/dist/limit-order/verification.d.ts +16 -0
- package/dist/limit-order/verification.js +108 -0
- package/dist/limit-order-contract/index.d.ts +4 -0
- package/dist/limit-order-contract/index.js +4 -0
- package/dist/limit-order-contract/limit-order-contract.d.ts +34 -0
- package/dist/limit-order-contract/limit-order-contract.js +79 -0
- package/dist/limit-order-contract/native-order-factory.d.ts +10 -0
- package/dist/limit-order-contract/native-order-factory.js +22 -0
- package/dist/limit-order-contract/native-order-impl.d.ts +10 -0
- package/dist/limit-order-contract/native-order-impl.js +24 -0
- package/dist/limit-order-contract/proxy-factory.d.ts +20 -0
- package/dist/limit-order-contract/proxy-factory.js +32 -0
- package/dist/limit-order-contract/proxy-factory.spec.d.ts +1 -0
- package/dist/limit-order-contract/proxy-factory.spec.js +16 -0
- package/dist/limit-order-contract/types.d.ts +6 -0
- package/dist/limit-order-contract/types.js +1 -0
- package/dist/ponder/client/index.d.ts +23 -0
- package/dist/ponder/client/index.js +44 -0
- package/dist/ponder/client/queries/markets.d.ts +30 -0
- package/dist/ponder/client/queries/markets.js +200 -0
- package/dist/ponder/client/queries/positions.d.ts +13 -0
- package/dist/ponder/client/queries/positions.js +406 -0
- package/dist/ponder/client/types/history.d.ts +94 -0
- package/dist/ponder/client/types/history.js +1 -0
- package/dist/ponder/client/types/index.d.ts +5 -0
- package/dist/ponder/client/types/index.js +5 -0
- package/dist/ponder/client/types/market.d.ts +45 -0
- package/dist/ponder/client/types/market.js +1 -0
- package/dist/ponder/client/types/position.d.ts +32 -0
- package/dist/ponder/client/types/position.js +1 -0
- package/dist/ponder/client/types/serializers.d.ts +57 -0
- package/dist/ponder/client/types/serializers.js +248 -0
- package/dist/ponder/client/types/user.d.ts +5 -0
- package/dist/ponder/client/types/user.js +1 -0
- package/dist/ponder/client/utils.d.ts +1 -0
- package/dist/ponder/client/utils.js +32 -0
- package/dist/ponder/generated/index.d.ts +18 -0
- package/dist/ponder/generated/index.js +20 -0
- package/dist/ponder/generated/runtime/batcher.d.ts +105 -0
- package/dist/ponder/generated/runtime/batcher.js +188 -0
- package/dist/ponder/generated/runtime/createClient.d.ts +17 -0
- package/dist/ponder/generated/runtime/createClient.js +24 -0
- package/dist/ponder/generated/runtime/error.d.ts +18 -0
- package/dist/ponder/generated/runtime/error.js +15 -0
- package/dist/ponder/generated/runtime/fetcher.d.ts +10 -0
- package/dist/ponder/generated/runtime/fetcher.js +67 -0
- package/dist/ponder/generated/runtime/generateGraphqlOperation.d.ts +30 -0
- package/dist/ponder/generated/runtime/generateGraphqlOperation.js +128 -0
- package/dist/ponder/generated/runtime/index.d.ts +11 -0
- package/dist/ponder/generated/runtime/index.js +10 -0
- package/dist/ponder/generated/runtime/linkTypeMap.d.ts +9 -0
- package/dist/ponder/generated/runtime/linkTypeMap.js +83 -0
- package/dist/ponder/generated/runtime/typeSelection.d.ts +28 -0
- package/dist/ponder/generated/runtime/typeSelection.js +3 -0
- package/dist/ponder/generated/runtime/types.d.ts +55 -0
- package/dist/ponder/generated/runtime/types.js +2 -0
- package/dist/ponder/generated/schema.d.ts +3026 -0
- package/dist/ponder/generated/schema.js +222 -0
- package/dist/ponder/generated/types.d.ts +2393 -0
- package/dist/ponder/generated/types.js +6915 -0
- package/dist/ponder/index.d.ts +2 -0
- package/dist/ponder/index.js +2 -0
- package/dist/ponder/types.d.ts +3 -0
- package/dist/ponder/types.js +1 -0
- package/dist/rfq-order/index.d.ts +1 -0
- package/dist/rfq-order/index.js +1 -0
- package/dist/rfq-order/rfq-order.d.ts +21 -0
- package/dist/rfq-order/rfq-order.js +22 -0
- package/dist/rfq-order/rfq-order.spec.d.ts +1 -0
- package/dist/rfq-order/rfq-order.spec.js +27 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.js +2 -0
- package/dist/shared/types.d.ts +79 -0
- package/dist/shared/types.js +12 -0
- package/dist/shared/utils.d.ts +7 -0
- package/dist/shared/utils.js +19 -0
- package/dist/sync/clients/balance-client.d.ts +41 -0
- package/dist/sync/clients/balance-client.js +139 -0
- package/dist/sync/clients/base-client.d.ts +47 -0
- package/dist/sync/clients/base-client.js +154 -0
- package/dist/sync/clients/order-client.d.ts +18 -0
- package/dist/sync/clients/order-client.js +151 -0
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.js +3 -0
- package/dist/sync/redis-ws-client.d.ts +18 -0
- package/dist/sync/redis-ws-client.js +88 -0
- package/dist/sync/types.d.ts +20 -0
- package/dist/sync/types.js +1 -0
- package/dist/utils/mul-div.d.ts +5 -0
- package/dist/utils/mul-div.js +13 -0
- package/dist/utils/orderUtils.d.ts +19 -0
- package/dist/utils/orderUtils.js +51 -0
- package/dist/utils/rand-bigint.d.ts +1 -0
- package/dist/utils/rand-bigint.js +13 -0
- package/dist/utils/rand-bigint.spec.d.ts +1 -0
- package/dist/utils/rand-bigint.spec.js +11 -0
- package/dist/validations.d.ts +1 -0
- package/dist/validations.js +3 -0
- package/package.json +60 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export const ZX = '0x';
|
|
2
|
+
const ONE_INCH_LIMIT_ORDER_V4 = '0x111111125421ca6dc452d289314280a0f8842a65';
|
|
3
|
+
const ONE_INCH_LIMIT_ORDER_V4_ZK_SYNC = '0x6fd4383cb451173d5f9304f041c7bcbf27d561ff';
|
|
4
|
+
// Custom deployment for local testing
|
|
5
|
+
const ONE_INCH_LIMIT_ORDER_V4_LOCAL = '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512';
|
|
6
|
+
const NATIVE_ORDER_FACTORY = '0xe12e0f117d23a5ccc57f8935cd8c4e80cd91ff01';
|
|
7
|
+
const NATIVE_ORDER_FACTORY_ZK_SYNC = '0xfd1d18173d2f179a45bf21f755a261aae7c2d769';
|
|
8
|
+
const NATIVE_ORDER_IMPL = '0xf3eaf3c54f1ef887914b9c19e1ab9d3e581557eb';
|
|
9
|
+
const NATIVE_ORDER_IMPL_ZK_SYNC = '0xf850a926554fc7898d1bda051bc206942909b8f2';
|
|
10
|
+
export const getLimitOrderContract = (chainId) => {
|
|
11
|
+
if (chainId === 324 /*ZkSync*/) {
|
|
12
|
+
return ONE_INCH_LIMIT_ORDER_V4_ZK_SYNC;
|
|
13
|
+
}
|
|
14
|
+
if (chainId === 31337 /*Anvil/Hardhat local*/) {
|
|
15
|
+
return ONE_INCH_LIMIT_ORDER_V4_LOCAL;
|
|
16
|
+
}
|
|
17
|
+
return ONE_INCH_LIMIT_ORDER_V4;
|
|
18
|
+
};
|
|
19
|
+
export const getNativeOrderFactoryContract = (chainId) => {
|
|
20
|
+
if (chainId === 324 /*ZkSync*/) {
|
|
21
|
+
return NATIVE_ORDER_FACTORY_ZK_SYNC;
|
|
22
|
+
}
|
|
23
|
+
return NATIVE_ORDER_FACTORY;
|
|
24
|
+
};
|
|
25
|
+
export const getNativeOrderImplContract = (chainId) => {
|
|
26
|
+
if (chainId === 324 /*ZkSync*/) {
|
|
27
|
+
return NATIVE_ORDER_IMPL_ZK_SYNC;
|
|
28
|
+
}
|
|
29
|
+
return NATIVE_ORDER_IMPL;
|
|
30
|
+
};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export * from "./limit-order-contract/index.js";
|
|
2
|
+
export * from "./limit-order/index.js";
|
|
3
|
+
export * from "./rfq-order/index.js";
|
|
4
|
+
export * from "./address.js";
|
|
5
|
+
export * from "./bps.js";
|
|
6
|
+
export * from "./constants.js";
|
|
7
|
+
export * from "./utils/rand-bigint.js";
|
|
8
|
+
export * from "./utils/mul-div.js";
|
|
9
|
+
export * from "./utils/orderUtils.js";
|
|
10
|
+
export type { Order } from "./shared/types.js";
|
|
11
|
+
export { OrderType, OrderStatus, calculateOptionTokenId, } from "./shared/index.js";
|
|
12
|
+
export type { StoredOrder, CreateOrderParams, Option, OrderSignature, OrderQueryParams, OrderResponse, CreateOrderRequest, } from "./shared/index.js";
|
|
13
|
+
export * from "./api/orderbook-api.js";
|
|
14
|
+
export * from "./api/order-helper.js";
|
|
15
|
+
export * from "./api/filler.js";
|
|
16
|
+
export * from "./sync/index.js";
|
|
17
|
+
export * from "./ponder/index.js";
|
|
18
|
+
export * from "./config/index.js";
|
|
19
|
+
export * from "./config/markets.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export * from "./limit-order-contract/index.js";
|
|
2
|
+
// Export limit-order but exclude Order constant from eip712 to avoid conflict with shared Order interface
|
|
3
|
+
export * from "./limit-order/index.js";
|
|
4
|
+
export * from "./rfq-order/index.js";
|
|
5
|
+
export * from "./address.js";
|
|
6
|
+
export * from "./bps.js";
|
|
7
|
+
export * from "./constants.js";
|
|
8
|
+
export * from "./utils/rand-bigint.js";
|
|
9
|
+
export * from "./utils/mul-div.js";
|
|
10
|
+
export * from "./utils/orderUtils.js";
|
|
11
|
+
export { OrderType, OrderStatus, calculateOptionTokenId, } from "./shared/index.js";
|
|
12
|
+
export * from "./api/orderbook-api.js";
|
|
13
|
+
export * from "./api/order-helper.js";
|
|
14
|
+
export * from "./api/filler.js";
|
|
15
|
+
// Export sync client
|
|
16
|
+
export * from "./sync/index.js";
|
|
17
|
+
// Export Ponder client
|
|
18
|
+
export * from "./ponder/index.js";
|
|
19
|
+
// Export config
|
|
20
|
+
export * from "./config/index.js";
|
|
21
|
+
export * from "./config/markets.js";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculates taker amount by linear proportion
|
|
3
|
+
*
|
|
4
|
+
* @return Ceiled taker amount
|
|
5
|
+
* @see https://github.com/1inch/limit-order-protocol/blob/23d655844191dea7960a186652307604a1ed480a/contracts/libraries/AmountCalculatorLib.sol#L6
|
|
6
|
+
*/
|
|
7
|
+
export declare function calcTakingAmount(swapMakerAmount: bigint, orderMakerAmount: bigint, orderTakerAmount: bigint): bigint;
|
|
8
|
+
/**
|
|
9
|
+
* Calculates maker amount by linear proportion
|
|
10
|
+
*
|
|
11
|
+
* @return Floored maker amount
|
|
12
|
+
* @see https://github.com/1inch/limit-order-protocol/blob/23d655844191dea7960a186652307604a1ed480a/contracts/libraries/AmountCalculatorLib.sol#L6
|
|
13
|
+
*/
|
|
14
|
+
export declare function calcMakingAmount(swapTakerAmount: bigint, orderMakerAmount: bigint, orderTakerAmount: bigint): bigint;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculates taker amount by linear proportion
|
|
3
|
+
*
|
|
4
|
+
* @return Ceiled taker amount
|
|
5
|
+
* @see https://github.com/1inch/limit-order-protocol/blob/23d655844191dea7960a186652307604a1ed480a/contracts/libraries/AmountCalculatorLib.sol#L6
|
|
6
|
+
*/
|
|
7
|
+
export function calcTakingAmount(swapMakerAmount, orderMakerAmount, orderTakerAmount) {
|
|
8
|
+
return ((swapMakerAmount * orderTakerAmount + orderMakerAmount - 1n) /
|
|
9
|
+
orderMakerAmount);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Calculates maker amount by linear proportion
|
|
13
|
+
*
|
|
14
|
+
* @return Floored maker amount
|
|
15
|
+
* @see https://github.com/1inch/limit-order-protocol/blob/23d655844191dea7960a186652307604a1ed480a/contracts/libraries/AmountCalculatorLib.sol#L6
|
|
16
|
+
*/
|
|
17
|
+
export function calcMakingAmount(swapTakerAmount, orderMakerAmount, orderTakerAmount) {
|
|
18
|
+
return (swapTakerAmount * orderMakerAmount) / orderTakerAmount;
|
|
19
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const EIP712Domain: {
|
|
2
|
+
name: string;
|
|
3
|
+
type: string;
|
|
4
|
+
}[];
|
|
5
|
+
export declare const OrderTypeDefinition: {
|
|
6
|
+
name: string;
|
|
7
|
+
type: string;
|
|
8
|
+
}[];
|
|
9
|
+
export declare const LimitOrderV4TypeDataName = "1inch Limit Order Protocol";
|
|
10
|
+
export declare const LimitOrderV4TypeDataVersion = "4";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const EIP712Domain = [
|
|
2
|
+
{ name: 'name', type: 'string' },
|
|
3
|
+
{ name: 'version', type: 'string' },
|
|
4
|
+
{ name: 'chainId', type: 'uint256' },
|
|
5
|
+
{ name: 'verifyingContract', type: 'address' }
|
|
6
|
+
];
|
|
7
|
+
export const OrderTypeDefinition = [
|
|
8
|
+
{ name: 'salt', type: 'uint256' },
|
|
9
|
+
{ name: 'maker', type: 'address' },
|
|
10
|
+
{ name: 'receiver', type: 'address' },
|
|
11
|
+
{ name: 'makerAsset', type: 'address' },
|
|
12
|
+
{ name: 'takerAsset', type: 'address' },
|
|
13
|
+
{ name: 'makingAmount', type: 'uint256' },
|
|
14
|
+
{ name: 'takingAmount', type: 'uint256' },
|
|
15
|
+
{ name: 'makerTraits', type: 'uint256' }
|
|
16
|
+
];
|
|
17
|
+
export const LimitOrderV4TypeDataName = '1inch Limit Order Protocol';
|
|
18
|
+
export const LimitOrderV4TypeDataVersion = '4';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface EIP712TypedData {
|
|
2
|
+
types: EIP712Types;
|
|
3
|
+
domain: EIP712Object;
|
|
4
|
+
message: EIP712Object;
|
|
5
|
+
primaryType: string;
|
|
6
|
+
}
|
|
7
|
+
export interface EIP712Types {
|
|
8
|
+
[key: string]: EIP712Parameter[];
|
|
9
|
+
}
|
|
10
|
+
export interface EIP712Parameter {
|
|
11
|
+
name: string;
|
|
12
|
+
type: string;
|
|
13
|
+
}
|
|
14
|
+
export declare type EIP712ObjectValue = string | bigint | number | EIP712Object;
|
|
15
|
+
export interface EIP712Object {
|
|
16
|
+
[key: string]: EIP712ObjectValue;
|
|
17
|
+
}
|
|
18
|
+
export type EIP712DomainType = {
|
|
19
|
+
name: string;
|
|
20
|
+
version: string;
|
|
21
|
+
chainId: number;
|
|
22
|
+
verifyingContract: string;
|
|
23
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { EIP712DomainType, EIP712TypedData } from './eip712.types.js';
|
|
2
|
+
import { LimitOrderV4Struct } from '../types.js';
|
|
3
|
+
export declare function getOrderHash(data: EIP712TypedData): string;
|
|
4
|
+
export declare function buildOrderTypedData(chainId: number, verifyingContract: string, name: string, version: string, order: LimitOrderV4Struct): EIP712TypedData;
|
|
5
|
+
export declare function getDomainSeparator(name: string, version: string, chainId: number, verifyingContract: string): string;
|
|
6
|
+
export declare function getLimitOrderV4Domain(chainId: number): EIP712DomainType;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ethers } from 'ethers';
|
|
2
|
+
import { EIP712Domain, LimitOrderV4TypeDataName, LimitOrderV4TypeDataVersion, OrderTypeDefinition as Order } from './domain.js';
|
|
3
|
+
import { getLimitOrderContract } from '../../constants.js';
|
|
4
|
+
export function getOrderHash(data) {
|
|
5
|
+
return ethers.TypedDataEncoder.hash(data.domain, { Order: data.types.Order }, data.message);
|
|
6
|
+
}
|
|
7
|
+
export function buildOrderTypedData(chainId, verifyingContract, name, version, order) {
|
|
8
|
+
return {
|
|
9
|
+
primaryType: 'Order',
|
|
10
|
+
types: { EIP712Domain, Order },
|
|
11
|
+
domain: { name, version, chainId, verifyingContract },
|
|
12
|
+
message: order
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function getDomainSeparator(name, version, chainId, verifyingContract) {
|
|
16
|
+
return ethers.TypedDataEncoder.hashStruct('EIP712Domain', { EIP712Domain: EIP712Domain }, { name, version, chainId, verifyingContract });
|
|
17
|
+
}
|
|
18
|
+
export function getLimitOrderV4Domain(chainId) {
|
|
19
|
+
return {
|
|
20
|
+
name: LimitOrderV4TypeDataName,
|
|
21
|
+
version: LimitOrderV4TypeDataVersion,
|
|
22
|
+
chainId,
|
|
23
|
+
verifyingContract: getLimitOrderContract(chainId)
|
|
24
|
+
};
|
|
25
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Extension } from './extension.js';
|
|
2
|
+
import { IExtensionBuilder } from '../types.js';
|
|
3
|
+
import { Interaction } from '../interaction.js';
|
|
4
|
+
import { Address } from '../../address.js';
|
|
5
|
+
export declare class ExtensionBuilder implements IExtensionBuilder {
|
|
6
|
+
private makerAssetSuffix;
|
|
7
|
+
private takerAssetSuffix;
|
|
8
|
+
private makingAmountData;
|
|
9
|
+
private takingAmountData;
|
|
10
|
+
private predicate;
|
|
11
|
+
private makerPermit;
|
|
12
|
+
private preInteraction;
|
|
13
|
+
private postInteraction;
|
|
14
|
+
private customData;
|
|
15
|
+
withMakerAssetSuffix(suffix: string): this;
|
|
16
|
+
withTakerAssetSuffix(suffix: string): this;
|
|
17
|
+
/**
|
|
18
|
+
*
|
|
19
|
+
* @param address Address of contract which will be called with `data` to calculate making amount
|
|
20
|
+
* @param data
|
|
21
|
+
*/
|
|
22
|
+
withMakingAmountData(address: Address, data: string): this;
|
|
23
|
+
/**
|
|
24
|
+
*
|
|
25
|
+
* @param address Address of contract which will be called with `data` to calculate taking amount
|
|
26
|
+
* @param data
|
|
27
|
+
*/
|
|
28
|
+
withTakingAmountData(address: Address, data: string): this;
|
|
29
|
+
withPredicate(predicate: string): this;
|
|
30
|
+
withMakerPermit(tokenFrom: Address, permitData: string): this;
|
|
31
|
+
withPreInteraction(interaction: Interaction): this;
|
|
32
|
+
withPostInteraction(interaction: Interaction): this;
|
|
33
|
+
withCustomData(data: string): this;
|
|
34
|
+
build(): Extension;
|
|
35
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { isHexString, trim0x } from '@1inch/byte-utils';
|
|
2
|
+
import assert from 'assert';
|
|
3
|
+
import { Extension } from './extension.js';
|
|
4
|
+
import { ZX } from '../../constants.js';
|
|
5
|
+
export class ExtensionBuilder {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.makerAssetSuffix = ZX;
|
|
8
|
+
this.takerAssetSuffix = ZX;
|
|
9
|
+
this.makingAmountData = ZX;
|
|
10
|
+
this.takingAmountData = ZX;
|
|
11
|
+
this.predicate = ZX;
|
|
12
|
+
this.makerPermit = ZX;
|
|
13
|
+
this.preInteraction = ZX;
|
|
14
|
+
this.postInteraction = ZX;
|
|
15
|
+
this.customData = ZX;
|
|
16
|
+
}
|
|
17
|
+
withMakerAssetSuffix(suffix) {
|
|
18
|
+
assert(isHexString(suffix), 'MakerAssetSuffix must be valid hex string');
|
|
19
|
+
this.makerAssetSuffix = suffix;
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
withTakerAssetSuffix(suffix) {
|
|
23
|
+
assert(isHexString(suffix), 'TakerAssetSuffix must be valid hex string');
|
|
24
|
+
this.takerAssetSuffix = suffix;
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
*
|
|
29
|
+
* @param address Address of contract which will be called with `data` to calculate making amount
|
|
30
|
+
* @param data
|
|
31
|
+
*/
|
|
32
|
+
withMakingAmountData(address, data) {
|
|
33
|
+
assert(isHexString(data), 'MakingAmountData must be valid hex string');
|
|
34
|
+
this.makingAmountData = address.toString() + trim0x(data);
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
*
|
|
39
|
+
* @param address Address of contract which will be called with `data` to calculate taking amount
|
|
40
|
+
* @param data
|
|
41
|
+
*/
|
|
42
|
+
withTakingAmountData(address, data) {
|
|
43
|
+
assert(isHexString(data), 'TakingAmountData must be valid hex string');
|
|
44
|
+
this.takingAmountData = address.toString() + trim0x(data);
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
withPredicate(predicate) {
|
|
48
|
+
assert(isHexString(predicate), 'Predicate must be valid hex string');
|
|
49
|
+
this.predicate = predicate;
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
withMakerPermit(tokenFrom, permitData) {
|
|
53
|
+
assert(isHexString(permitData), 'Permit data must be valid hex string');
|
|
54
|
+
this.makerPermit = tokenFrom.toString() + trim0x(permitData);
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
withPreInteraction(interaction) {
|
|
58
|
+
this.preInteraction = interaction.encode();
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
withPostInteraction(interaction) {
|
|
62
|
+
this.postInteraction = interaction.encode();
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
withCustomData(data) {
|
|
66
|
+
assert(isHexString(data), 'Custom data must be valid hex string');
|
|
67
|
+
this.customData = data;
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
build() {
|
|
71
|
+
return new Extension({
|
|
72
|
+
makerAssetSuffix: this.makerAssetSuffix,
|
|
73
|
+
takerAssetSuffix: this.takerAssetSuffix,
|
|
74
|
+
makingAmountData: this.makingAmountData,
|
|
75
|
+
takingAmountData: this.takingAmountData,
|
|
76
|
+
predicate: this.predicate,
|
|
77
|
+
makerPermit: this.makerPermit,
|
|
78
|
+
preInteraction: this.preInteraction,
|
|
79
|
+
postInteraction: this.postInteraction,
|
|
80
|
+
customData: this.customData
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export declare class Extension {
|
|
2
|
+
static EMPTY: {
|
|
3
|
+
makerAssetSuffix: string;
|
|
4
|
+
takerAssetSuffix: string;
|
|
5
|
+
makingAmountData: string;
|
|
6
|
+
takingAmountData: string;
|
|
7
|
+
predicate: string;
|
|
8
|
+
makerPermit: string;
|
|
9
|
+
preInteraction: string;
|
|
10
|
+
postInteraction: string;
|
|
11
|
+
customData: string;
|
|
12
|
+
};
|
|
13
|
+
private static fields;
|
|
14
|
+
readonly makerAssetSuffix: string;
|
|
15
|
+
readonly takerAssetSuffix: string;
|
|
16
|
+
readonly makingAmountData: string;
|
|
17
|
+
readonly takingAmountData: string;
|
|
18
|
+
readonly predicate: string;
|
|
19
|
+
readonly makerPermit: string;
|
|
20
|
+
readonly preInteraction: string;
|
|
21
|
+
readonly postInteraction: string;
|
|
22
|
+
readonly customData: string;
|
|
23
|
+
constructor(data?: {
|
|
24
|
+
makerAssetSuffix: string;
|
|
25
|
+
takerAssetSuffix: string;
|
|
26
|
+
makingAmountData: string;
|
|
27
|
+
takingAmountData: string;
|
|
28
|
+
predicate: string;
|
|
29
|
+
makerPermit: string;
|
|
30
|
+
preInteraction: string;
|
|
31
|
+
postInteraction: string;
|
|
32
|
+
customData: string;
|
|
33
|
+
});
|
|
34
|
+
get hasPredicate(): boolean;
|
|
35
|
+
get hasMakerPermit(): boolean;
|
|
36
|
+
static decode(bytes: string): Extension;
|
|
37
|
+
static default(): Extension;
|
|
38
|
+
keccak256(): bigint;
|
|
39
|
+
isEmpty(): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Hex string with 0x
|
|
42
|
+
*/
|
|
43
|
+
encode(): string;
|
|
44
|
+
private getAll;
|
|
45
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { keccak256 } from 'ethers';
|
|
2
|
+
import { BytesIter, isHexString, trim0x, UINT_32_MAX } from '@1inch/byte-utils';
|
|
3
|
+
import assert from 'assert';
|
|
4
|
+
import { ZX } from '../../constants.js';
|
|
5
|
+
export class Extension {
|
|
6
|
+
constructor(data = Extension.EMPTY) {
|
|
7
|
+
this.makerAssetSuffix = ZX;
|
|
8
|
+
this.takerAssetSuffix = ZX;
|
|
9
|
+
this.makingAmountData = ZX;
|
|
10
|
+
this.takingAmountData = ZX;
|
|
11
|
+
this.predicate = ZX;
|
|
12
|
+
this.makerPermit = ZX;
|
|
13
|
+
this.preInteraction = ZX;
|
|
14
|
+
this.postInteraction = ZX;
|
|
15
|
+
this.customData = ZX;
|
|
16
|
+
Object.entries(data).forEach(([key, val]) => assert(isHexString(val) || val === ZX, `${key} must be valid hex string`));
|
|
17
|
+
this.makerAssetSuffix = data.makerAssetSuffix;
|
|
18
|
+
this.takerAssetSuffix = data.takerAssetSuffix;
|
|
19
|
+
this.makingAmountData = data.makingAmountData;
|
|
20
|
+
this.takingAmountData = data.takingAmountData;
|
|
21
|
+
this.predicate = data.predicate;
|
|
22
|
+
this.makerPermit = data.makerPermit;
|
|
23
|
+
this.preInteraction = data.preInteraction;
|
|
24
|
+
this.postInteraction = data.postInteraction;
|
|
25
|
+
this.customData = data.customData;
|
|
26
|
+
}
|
|
27
|
+
get hasPredicate() {
|
|
28
|
+
return this.predicate !== ZX;
|
|
29
|
+
}
|
|
30
|
+
get hasMakerPermit() {
|
|
31
|
+
return this.makerPermit !== ZX;
|
|
32
|
+
}
|
|
33
|
+
static decode(bytes) {
|
|
34
|
+
if (bytes === ZX) {
|
|
35
|
+
return Extension.default();
|
|
36
|
+
}
|
|
37
|
+
const iter = BytesIter.HexString(bytes);
|
|
38
|
+
let offsets = BigInt(iter.nextUint256());
|
|
39
|
+
let consumed = 0;
|
|
40
|
+
const data = {};
|
|
41
|
+
for (const field of Extension.fields) {
|
|
42
|
+
const offset = Number(offsets & UINT_32_MAX);
|
|
43
|
+
const bytesCount = offset - consumed;
|
|
44
|
+
data[field] = iter.nextBytes(bytesCount);
|
|
45
|
+
consumed += bytesCount;
|
|
46
|
+
offsets = offsets >> 32n;
|
|
47
|
+
}
|
|
48
|
+
data.customData = iter.rest();
|
|
49
|
+
return new Extension(data);
|
|
50
|
+
}
|
|
51
|
+
static default() {
|
|
52
|
+
return new Extension();
|
|
53
|
+
}
|
|
54
|
+
keccak256() {
|
|
55
|
+
return BigInt(keccak256(this.encode()));
|
|
56
|
+
}
|
|
57
|
+
isEmpty() {
|
|
58
|
+
const allInteractions = this.getAll();
|
|
59
|
+
const allInteractionsConcat = allInteractions.map(trim0x).join('') + trim0x(this.customData);
|
|
60
|
+
return allInteractionsConcat.length === 0;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Hex string with 0x
|
|
64
|
+
*/
|
|
65
|
+
encode() {
|
|
66
|
+
const allInteractions = this.getAll();
|
|
67
|
+
const allInteractionsConcat = allInteractions.map(trim0x).join('') + trim0x(this.customData);
|
|
68
|
+
// https://stackoverflow.com/a/55261098/440168
|
|
69
|
+
const cumulativeSum = ((sum) => (value) => {
|
|
70
|
+
sum += value;
|
|
71
|
+
return sum;
|
|
72
|
+
})(0);
|
|
73
|
+
const offsets = allInteractions
|
|
74
|
+
.map((a) => a.length / 2 - 1)
|
|
75
|
+
.map(cumulativeSum)
|
|
76
|
+
.reduce((acc, a, i) => acc + (BigInt(a) << BigInt(32 * i)), 0n);
|
|
77
|
+
let extension = '0x';
|
|
78
|
+
if (allInteractionsConcat.length > 0) {
|
|
79
|
+
extension +=
|
|
80
|
+
offsets.toString(16).padStart(64, '0') + allInteractionsConcat;
|
|
81
|
+
}
|
|
82
|
+
return extension;
|
|
83
|
+
}
|
|
84
|
+
getAll() {
|
|
85
|
+
return Extension.fields.map((f) => this[f]);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
Extension.EMPTY = {
|
|
89
|
+
makerAssetSuffix: ZX,
|
|
90
|
+
takerAssetSuffix: ZX,
|
|
91
|
+
makingAmountData: ZX,
|
|
92
|
+
takingAmountData: ZX,
|
|
93
|
+
predicate: ZX,
|
|
94
|
+
makerPermit: ZX,
|
|
95
|
+
preInteraction: ZX,
|
|
96
|
+
postInteraction: ZX,
|
|
97
|
+
customData: ZX
|
|
98
|
+
};
|
|
99
|
+
Extension.fields = [
|
|
100
|
+
'makerAssetSuffix',
|
|
101
|
+
'takerAssetSuffix',
|
|
102
|
+
'makingAmountData',
|
|
103
|
+
'takingAmountData',
|
|
104
|
+
'predicate',
|
|
105
|
+
'makerPermit',
|
|
106
|
+
'preInteraction',
|
|
107
|
+
'postInteraction'
|
|
108
|
+
];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Extension } from './extension.js';
|
|
2
|
+
describe('Extension', () => {
|
|
3
|
+
it('should encode/decode', () => {
|
|
4
|
+
const ext = new Extension({
|
|
5
|
+
makerAssetSuffix: '0x01',
|
|
6
|
+
takerAssetSuffix: '0x02',
|
|
7
|
+
makerPermit: '0x03',
|
|
8
|
+
predicate: '0x04',
|
|
9
|
+
makingAmountData: '0x05',
|
|
10
|
+
takingAmountData: '0x06',
|
|
11
|
+
preInteraction: '0x07',
|
|
12
|
+
postInteraction: '0x08',
|
|
13
|
+
customData: '0xff'
|
|
14
|
+
});
|
|
15
|
+
expect(Extension.decode(ext.encode())).toStrictEqual(ext);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Fees } from './fees.js';
|
|
2
|
+
import { Whitelist } from './types.js';
|
|
3
|
+
import { Address } from '../../../address.js';
|
|
4
|
+
export declare class FeeCalculator {
|
|
5
|
+
readonly fees: Fees;
|
|
6
|
+
readonly whitelist: Whitelist;
|
|
7
|
+
constructor(fees: Fees, whitelist: Whitelist);
|
|
8
|
+
getTakingAmount(taker: Address, orderTakingAmount: bigint): bigint;
|
|
9
|
+
getMakingAmount(taker: Address, makingAmount: bigint): bigint;
|
|
10
|
+
/**
|
|
11
|
+
* Fee in `takerAsset` which resolver pays to resolver fee receiver
|
|
12
|
+
*
|
|
13
|
+
* @param taker who will fill order
|
|
14
|
+
* @param orderTakingAmount taking amount from order struct
|
|
15
|
+
*/
|
|
16
|
+
getResolverFee(taker: Address, orderTakingAmount: bigint): bigint;
|
|
17
|
+
/**
|
|
18
|
+
* Fee in `takerAsset` which integrator gets to integrator wallet
|
|
19
|
+
*
|
|
20
|
+
* @param taker who will fill order
|
|
21
|
+
* @param orderTakingAmount taking amount from order struct
|
|
22
|
+
*/
|
|
23
|
+
getIntegratorFee(taker: Address, orderTakingAmount: bigint): bigint;
|
|
24
|
+
/**
|
|
25
|
+
* Fee in `takerAsset` which protocol gets as share from integrator fee
|
|
26
|
+
*
|
|
27
|
+
* @param taker who will fill order
|
|
28
|
+
* @param orderTakingAmount taking amount from order struct
|
|
29
|
+
*/
|
|
30
|
+
getProtocolShareOfIntegratorFee(taker: Address, orderTakingAmount: bigint): bigint;
|
|
31
|
+
/**
|
|
32
|
+
* Fee in `takerAsset` which protocol gets
|
|
33
|
+
* It equals to `share from integrator fee plus resolver fee`
|
|
34
|
+
*
|
|
35
|
+
* @param taker who will fill order
|
|
36
|
+
* @param orderTakingAmount taking amount from order struct
|
|
37
|
+
*/
|
|
38
|
+
getProtocolFee(taker: Address, orderTakingAmount: bigint): bigint;
|
|
39
|
+
private getFeesForTaker;
|
|
40
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Fees } from './fees.js';
|
|
2
|
+
import { mulDiv, Rounding } from '../../../utils/mul-div.js';
|
|
3
|
+
export class FeeCalculator {
|
|
4
|
+
constructor(fees, whitelist) {
|
|
5
|
+
this.fees = fees;
|
|
6
|
+
this.whitelist = whitelist;
|
|
7
|
+
}
|
|
8
|
+
getTakingAmount(taker, orderTakingAmount) {
|
|
9
|
+
const fees = this.getFeesForTaker(taker);
|
|
10
|
+
return mulDiv(orderTakingAmount, Fees.BASE_1E5 + fees.resolverFee + fees.integratorFee, Fees.BASE_1E5, Rounding.Ceil);
|
|
11
|
+
}
|
|
12
|
+
getMakingAmount(taker, makingAmount) {
|
|
13
|
+
const fees = this.getFeesForTaker(taker);
|
|
14
|
+
return mulDiv(makingAmount, Fees.BASE_1E5, Fees.BASE_1E5 + fees.resolverFee + fees.integratorFee);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Fee in `takerAsset` which resolver pays to resolver fee receiver
|
|
18
|
+
*
|
|
19
|
+
* @param taker who will fill order
|
|
20
|
+
* @param orderTakingAmount taking amount from order struct
|
|
21
|
+
*/
|
|
22
|
+
getResolverFee(taker, orderTakingAmount) {
|
|
23
|
+
// the logic copied from contract to avoid calculation issues
|
|
24
|
+
// @see https://github.com/1inch/limit-order-protocol/blob/22a18f7f20acfec69d4f50ce1880e8e662477710/contracts/extensions/FeeTaker.sol#L145
|
|
25
|
+
const takingAmount = this.getTakingAmount(taker, orderTakingAmount);
|
|
26
|
+
const fees = this.getFeesForTaker(taker);
|
|
27
|
+
return mulDiv(takingAmount, fees.resolverFee, Fees.BASE_1E5 + fees.resolverFee + fees.integratorFee);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Fee in `takerAsset` which integrator gets to integrator wallet
|
|
31
|
+
*
|
|
32
|
+
* @param taker who will fill order
|
|
33
|
+
* @param orderTakingAmount taking amount from order struct
|
|
34
|
+
*/
|
|
35
|
+
getIntegratorFee(taker, orderTakingAmount) {
|
|
36
|
+
// the logic copied from contract to avoid calculation issues
|
|
37
|
+
// @see https://github.com/1inch/limit-order-protocol/blob/22a18f7f20acfec69d4f50ce1880e8e662477710/contracts/extensions/FeeTaker.sol#L145
|
|
38
|
+
const takingAmount = this.getTakingAmount(taker, orderTakingAmount);
|
|
39
|
+
const fees = this.getFeesForTaker(taker);
|
|
40
|
+
const total = mulDiv(takingAmount, fees.integratorFee, Fees.BASE_1E5 + fees.resolverFee + fees.integratorFee);
|
|
41
|
+
return mulDiv(total, BigInt(this.fees.integrator.share.toFraction(Fees.BASE_1E2)), Fees.BASE_1E2);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Fee in `takerAsset` which protocol gets as share from integrator fee
|
|
45
|
+
*
|
|
46
|
+
* @param taker who will fill order
|
|
47
|
+
* @param orderTakingAmount taking amount from order struct
|
|
48
|
+
*/
|
|
49
|
+
getProtocolShareOfIntegratorFee(taker, orderTakingAmount) {
|
|
50
|
+
// the logic copied from contract to avoid calculation issues
|
|
51
|
+
// @see https://github.com/1inch/limit-order-protocol/blob/22a18f7f20acfec69d4f50ce1880e8e662477710/contracts/extensions/FeeTaker.sol#L145
|
|
52
|
+
const takingAmount = this.getTakingAmount(taker, orderTakingAmount);
|
|
53
|
+
const fees = this.getFeesForTaker(taker);
|
|
54
|
+
const total = mulDiv(takingAmount, fees.integratorFee, Fees.BASE_1E5 + fees.resolverFee + fees.integratorFee);
|
|
55
|
+
return total - this.getIntegratorFee(taker, orderTakingAmount);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Fee in `takerAsset` which protocol gets
|
|
59
|
+
* It equals to `share from integrator fee plus resolver fee`
|
|
60
|
+
*
|
|
61
|
+
* @param taker who will fill order
|
|
62
|
+
* @param orderTakingAmount taking amount from order struct
|
|
63
|
+
*/
|
|
64
|
+
getProtocolFee(taker, orderTakingAmount) {
|
|
65
|
+
const resolverFee = this.getResolverFee(taker, orderTakingAmount);
|
|
66
|
+
const integratorPart = this.getProtocolShareOfIntegratorFee(taker, orderTakingAmount);
|
|
67
|
+
return integratorPart + resolverFee;
|
|
68
|
+
}
|
|
69
|
+
getFeesForTaker(taker) {
|
|
70
|
+
const discountNumerator = this.whitelist.isWhitelisted(taker)
|
|
71
|
+
? Number(Fees.BASE_1E2) -
|
|
72
|
+
this.fees.resolver.whitelistDiscount.toFraction(Fees.BASE_1E2)
|
|
73
|
+
: 100;
|
|
74
|
+
const resolverFee = BigInt(discountNumerator *
|
|
75
|
+
this.fees.resolver.fee.toFraction(Fees.BASE_1E5)) / Fees.BASE_1E2;
|
|
76
|
+
const resolverFeeBN = BigInt(resolverFee);
|
|
77
|
+
const integratorFeeBN = BigInt(this.fees.integrator.fee.toFraction(Fees.BASE_1E5));
|
|
78
|
+
return {
|
|
79
|
+
resolverFee: resolverFeeBN,
|
|
80
|
+
integratorFee: integratorFeeBN
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FeeCalculator } from './fee-calculator.js';
|
|
2
|
+
import { IntegratorFee } from './integrator-fee.js';
|
|
3
|
+
import { WhitelistHalfAddress } from './whitelist-half-address.js';
|
|
4
|
+
import { Fees } from './fees.js';
|
|
5
|
+
import { Address } from '../../../address.js';
|
|
6
|
+
import { Bps } from '../../../bps.js';
|
|
7
|
+
describe('FeeCalculator', () => {
|
|
8
|
+
it('should calculate protocol fee amount', () => {
|
|
9
|
+
// https://etherscan.io/tx/0x8f95dc0e6e836ca0abdad88e20cf61b0caf7c5463d67b577740f3084d428e56e
|
|
10
|
+
const calculator = new FeeCalculator(Fees.integratorFee(new IntegratorFee(new Address('0x8e097e5e0493de033270a01b324caf31f464dc67'), new Address('0x90cbe4bdd538d6e9b379bff5fe72c3d67a521de5'), new Bps(10n), new Bps(6000n))), WhitelistHalfAddress.new([Address.fromBigInt(1n)]));
|
|
11
|
+
const protocolFee = calculator.getProtocolFee(Address.ZERO_ADDRESS, 18442227n);
|
|
12
|
+
expect(protocolFee).toBe(7377n);
|
|
13
|
+
});
|
|
14
|
+
});
|