@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.
Files changed (189) hide show
  1. package/dist/abi/AggregationRouterV6.abi.json +1186 -0
  2. package/dist/abi/NativeOrderFactory.abi.json +291 -0
  3. package/dist/abi/NativeOrderImpl.abi.json +381 -0
  4. package/dist/abi/limitOrderProtocol.json +63 -0
  5. package/dist/address.d.ts +13 -0
  6. package/dist/address.js +32 -0
  7. package/dist/api/filler.d.ts +109 -0
  8. package/dist/api/filler.js +289 -0
  9. package/dist/api/index.d.ts +3 -0
  10. package/dist/api/index.js +3 -0
  11. package/dist/api/order-helper.d.ts +59 -0
  12. package/dist/api/order-helper.js +112 -0
  13. package/dist/api/orderbook-api.d.ts +36 -0
  14. package/dist/api/orderbook-api.js +69 -0
  15. package/dist/bps.d.ts +35 -0
  16. package/dist/bps.js +52 -0
  17. package/dist/config/chains.d.ts +50 -0
  18. package/dist/config/chains.js +21 -0
  19. package/dist/config/index.d.ts +25 -0
  20. package/dist/config/index.js +103 -0
  21. package/dist/config/markets.d.ts +53 -0
  22. package/dist/config/markets.js +125 -0
  23. package/dist/constants.d.ts +4 -0
  24. package/dist/constants.js +30 -0
  25. package/dist/index.d.ts +19 -0
  26. package/dist/index.js +21 -0
  27. package/dist/limit-order/amounts.d.ts +14 -0
  28. package/dist/limit-order/amounts.js +19 -0
  29. package/dist/limit-order/eip712/domain.d.ts +10 -0
  30. package/dist/limit-order/eip712/domain.js +18 -0
  31. package/dist/limit-order/eip712/eip712.types.d.ts +23 -0
  32. package/dist/limit-order/eip712/eip712.types.js +1 -0
  33. package/dist/limit-order/eip712/index.d.ts +3 -0
  34. package/dist/limit-order/eip712/index.js +3 -0
  35. package/dist/limit-order/eip712/order-typed-data-builder.d.ts +6 -0
  36. package/dist/limit-order/eip712/order-typed-data-builder.js +25 -0
  37. package/dist/limit-order/extensions/extension-builder.d.ts +35 -0
  38. package/dist/limit-order/extensions/extension-builder.js +83 -0
  39. package/dist/limit-order/extensions/extension.d.ts +45 -0
  40. package/dist/limit-order/extensions/extension.js +108 -0
  41. package/dist/limit-order/extensions/extension.spec.d.ts +1 -0
  42. package/dist/limit-order/extensions/extension.spec.js +17 -0
  43. package/dist/limit-order/extensions/fee-taker/errors.d.ts +2 -0
  44. package/dist/limit-order/extensions/fee-taker/errors.js +2 -0
  45. package/dist/limit-order/extensions/fee-taker/fee-calculator.d.ts +40 -0
  46. package/dist/limit-order/extensions/fee-taker/fee-calculator.js +83 -0
  47. package/dist/limit-order/extensions/fee-taker/fee-calculator.spec.d.ts +1 -0
  48. package/dist/limit-order/extensions/fee-taker/fee-calculator.spec.js +14 -0
  49. package/dist/limit-order/extensions/fee-taker/fee-taker.extension.d.ts +130 -0
  50. package/dist/limit-order/extensions/fee-taker/fee-taker.extension.js +249 -0
  51. package/dist/limit-order/extensions/fee-taker/fee-taker.extension.spec.d.ts +1 -0
  52. package/dist/limit-order/extensions/fee-taker/fee-taker.extension.spec.js +72 -0
  53. package/dist/limit-order/extensions/fee-taker/fees.d.ts +19 -0
  54. package/dist/limit-order/extensions/fee-taker/fees.js +36 -0
  55. package/dist/limit-order/extensions/fee-taker/index.d.ts +7 -0
  56. package/dist/limit-order/extensions/fee-taker/index.js +7 -0
  57. package/dist/limit-order/extensions/fee-taker/integrator-fee.d.ts +13 -0
  58. package/dist/limit-order/extensions/fee-taker/integrator-fee.js +28 -0
  59. package/dist/limit-order/extensions/fee-taker/resolver-fee.d.ts +19 -0
  60. package/dist/limit-order/extensions/fee-taker/resolver-fee.js +28 -0
  61. package/dist/limit-order/extensions/fee-taker/types.d.ts +4 -0
  62. package/dist/limit-order/extensions/fee-taker/types.js +1 -0
  63. package/dist/limit-order/extensions/fee-taker/whitelist-half-address.d.ts +18 -0
  64. package/dist/limit-order/extensions/fee-taker/whitelist-half-address.js +26 -0
  65. package/dist/limit-order/extensions/index.d.ts +3 -0
  66. package/dist/limit-order/extensions/index.js +3 -0
  67. package/dist/limit-order/index.d.ts +10 -0
  68. package/dist/limit-order/index.js +10 -0
  69. package/dist/limit-order/interaction.d.ts +16 -0
  70. package/dist/limit-order/interaction.js +25 -0
  71. package/dist/limit-order/interaction.spec.d.ts +1 -0
  72. package/dist/limit-order/interaction.spec.js +8 -0
  73. package/dist/limit-order/limit-order-with-fee.d.ts +59 -0
  74. package/dist/limit-order/limit-order-with-fee.js +94 -0
  75. package/dist/limit-order/limit-order-with-fee.spec.d.ts +1 -0
  76. package/dist/limit-order/limit-order-with-fee.spec.js +31 -0
  77. package/dist/limit-order/limit-order.d.ts +63 -0
  78. package/dist/limit-order/limit-order.js +211 -0
  79. package/dist/limit-order/limit-order.spec.d.ts +1 -0
  80. package/dist/limit-order/limit-order.spec.js +103 -0
  81. package/dist/limit-order/maker-traits.d.ts +200 -0
  82. package/dist/limit-order/maker-traits.js +309 -0
  83. package/dist/limit-order/maker-traits.spec.d.ts +1 -0
  84. package/dist/limit-order/maker-traits.spec.js +102 -0
  85. package/dist/limit-order/source-track.d.ts +1 -0
  86. package/dist/limit-order/source-track.js +22 -0
  87. package/dist/limit-order/taker-traits.d.ts +141 -0
  88. package/dist/limit-order/taker-traits.js +207 -0
  89. package/dist/limit-order/types.d.ts +24 -0
  90. package/dist/limit-order/types.js +1 -0
  91. package/dist/limit-order/verification.d.ts +16 -0
  92. package/dist/limit-order/verification.js +108 -0
  93. package/dist/limit-order-contract/index.d.ts +4 -0
  94. package/dist/limit-order-contract/index.js +4 -0
  95. package/dist/limit-order-contract/limit-order-contract.d.ts +34 -0
  96. package/dist/limit-order-contract/limit-order-contract.js +79 -0
  97. package/dist/limit-order-contract/native-order-factory.d.ts +10 -0
  98. package/dist/limit-order-contract/native-order-factory.js +22 -0
  99. package/dist/limit-order-contract/native-order-impl.d.ts +10 -0
  100. package/dist/limit-order-contract/native-order-impl.js +24 -0
  101. package/dist/limit-order-contract/proxy-factory.d.ts +20 -0
  102. package/dist/limit-order-contract/proxy-factory.js +32 -0
  103. package/dist/limit-order-contract/proxy-factory.spec.d.ts +1 -0
  104. package/dist/limit-order-contract/proxy-factory.spec.js +16 -0
  105. package/dist/limit-order-contract/types.d.ts +6 -0
  106. package/dist/limit-order-contract/types.js +1 -0
  107. package/dist/ponder/client/index.d.ts +23 -0
  108. package/dist/ponder/client/index.js +44 -0
  109. package/dist/ponder/client/queries/markets.d.ts +30 -0
  110. package/dist/ponder/client/queries/markets.js +200 -0
  111. package/dist/ponder/client/queries/positions.d.ts +13 -0
  112. package/dist/ponder/client/queries/positions.js +406 -0
  113. package/dist/ponder/client/types/history.d.ts +94 -0
  114. package/dist/ponder/client/types/history.js +1 -0
  115. package/dist/ponder/client/types/index.d.ts +5 -0
  116. package/dist/ponder/client/types/index.js +5 -0
  117. package/dist/ponder/client/types/market.d.ts +45 -0
  118. package/dist/ponder/client/types/market.js +1 -0
  119. package/dist/ponder/client/types/position.d.ts +32 -0
  120. package/dist/ponder/client/types/position.js +1 -0
  121. package/dist/ponder/client/types/serializers.d.ts +57 -0
  122. package/dist/ponder/client/types/serializers.js +248 -0
  123. package/dist/ponder/client/types/user.d.ts +5 -0
  124. package/dist/ponder/client/types/user.js +1 -0
  125. package/dist/ponder/client/utils.d.ts +1 -0
  126. package/dist/ponder/client/utils.js +32 -0
  127. package/dist/ponder/generated/index.d.ts +18 -0
  128. package/dist/ponder/generated/index.js +20 -0
  129. package/dist/ponder/generated/runtime/batcher.d.ts +105 -0
  130. package/dist/ponder/generated/runtime/batcher.js +188 -0
  131. package/dist/ponder/generated/runtime/createClient.d.ts +17 -0
  132. package/dist/ponder/generated/runtime/createClient.js +24 -0
  133. package/dist/ponder/generated/runtime/error.d.ts +18 -0
  134. package/dist/ponder/generated/runtime/error.js +15 -0
  135. package/dist/ponder/generated/runtime/fetcher.d.ts +10 -0
  136. package/dist/ponder/generated/runtime/fetcher.js +67 -0
  137. package/dist/ponder/generated/runtime/generateGraphqlOperation.d.ts +30 -0
  138. package/dist/ponder/generated/runtime/generateGraphqlOperation.js +128 -0
  139. package/dist/ponder/generated/runtime/index.d.ts +11 -0
  140. package/dist/ponder/generated/runtime/index.js +10 -0
  141. package/dist/ponder/generated/runtime/linkTypeMap.d.ts +9 -0
  142. package/dist/ponder/generated/runtime/linkTypeMap.js +83 -0
  143. package/dist/ponder/generated/runtime/typeSelection.d.ts +28 -0
  144. package/dist/ponder/generated/runtime/typeSelection.js +3 -0
  145. package/dist/ponder/generated/runtime/types.d.ts +55 -0
  146. package/dist/ponder/generated/runtime/types.js +2 -0
  147. package/dist/ponder/generated/schema.d.ts +3026 -0
  148. package/dist/ponder/generated/schema.js +222 -0
  149. package/dist/ponder/generated/types.d.ts +2393 -0
  150. package/dist/ponder/generated/types.js +6915 -0
  151. package/dist/ponder/index.d.ts +2 -0
  152. package/dist/ponder/index.js +2 -0
  153. package/dist/ponder/types.d.ts +3 -0
  154. package/dist/ponder/types.js +1 -0
  155. package/dist/rfq-order/index.d.ts +1 -0
  156. package/dist/rfq-order/index.js +1 -0
  157. package/dist/rfq-order/rfq-order.d.ts +21 -0
  158. package/dist/rfq-order/rfq-order.js +22 -0
  159. package/dist/rfq-order/rfq-order.spec.d.ts +1 -0
  160. package/dist/rfq-order/rfq-order.spec.js +27 -0
  161. package/dist/shared/index.d.ts +2 -0
  162. package/dist/shared/index.js +2 -0
  163. package/dist/shared/types.d.ts +79 -0
  164. package/dist/shared/types.js +12 -0
  165. package/dist/shared/utils.d.ts +7 -0
  166. package/dist/shared/utils.js +19 -0
  167. package/dist/sync/clients/balance-client.d.ts +41 -0
  168. package/dist/sync/clients/balance-client.js +139 -0
  169. package/dist/sync/clients/base-client.d.ts +47 -0
  170. package/dist/sync/clients/base-client.js +154 -0
  171. package/dist/sync/clients/order-client.d.ts +18 -0
  172. package/dist/sync/clients/order-client.js +151 -0
  173. package/dist/sync/index.d.ts +5 -0
  174. package/dist/sync/index.js +3 -0
  175. package/dist/sync/redis-ws-client.d.ts +18 -0
  176. package/dist/sync/redis-ws-client.js +88 -0
  177. package/dist/sync/types.d.ts +20 -0
  178. package/dist/sync/types.js +1 -0
  179. package/dist/utils/mul-div.d.ts +5 -0
  180. package/dist/utils/mul-div.js +13 -0
  181. package/dist/utils/orderUtils.d.ts +19 -0
  182. package/dist/utils/orderUtils.js +51 -0
  183. package/dist/utils/rand-bigint.d.ts +1 -0
  184. package/dist/utils/rand-bigint.js +13 -0
  185. package/dist/utils/rand-bigint.spec.d.ts +1 -0
  186. package/dist/utils/rand-bigint.spec.js +11 -0
  187. package/dist/validations.d.ts +1 -0
  188. package/dist/validations.js +3 -0
  189. package/package.json +60 -0
@@ -0,0 +1,4 @@
1
+ export declare const ZX = "0x";
2
+ export declare const getLimitOrderContract: (chainId: number) => string;
3
+ export declare const getNativeOrderFactoryContract: (chainId: number) => string;
4
+ export declare const getNativeOrderImplContract: (chainId: number) => string;
@@ -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
+ };
@@ -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,3 @@
1
+ export * from './domain.js';
2
+ export * from './eip712.types.js';
3
+ export * from './order-typed-data-builder.js';
@@ -0,0 +1,3 @@
1
+ export * from './domain.js';
2
+ export * from './eip712.types.js';
3
+ export * from './order-typed-data-builder.js';
@@ -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,2 @@
1
+ export declare class FeeTakerExtensionError extends Error {
2
+ }
@@ -0,0 +1,2 @@
1
+ export class FeeTakerExtensionError extends Error {
2
+ }
@@ -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,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
+ });