@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,130 @@
1
+ import { Fees } from './fees.js';
2
+ import { WhitelistHalfAddress } from './whitelist-half-address.js';
3
+ import { FeeCalculator } from './fee-calculator.js';
4
+ import { Address } from '../../../address.js';
5
+ import { Interaction } from '../../interaction.js';
6
+ import { Extension } from '../extension.js';
7
+ /**
8
+ * @see https://github.com/1inch/limit-order-protocol/blob/master/contracts/extensions/FeeTaker.sol
9
+ */
10
+ export declare class FeeTakerExtension {
11
+ readonly address: Address;
12
+ readonly fees: Fees;
13
+ readonly whitelist: WhitelistHalfAddress;
14
+ readonly makerPermit?: Interaction | undefined;
15
+ readonly extraInteraction?: Interaction | undefined;
16
+ readonly customReceiver?: Address | undefined;
17
+ /**
18
+ * Flags for post-interaction data
19
+ * @private
20
+ */
21
+ private static CUSTOM_RECEIVER_FLAG_BIT;
22
+ private constructor();
23
+ static new(
24
+ /**
25
+ * Address of extension
26
+ */
27
+ address: Address,
28
+ /**
29
+ * @see ResolverFee
30
+ * @see IntegratorFee
31
+ */
32
+ fees: Fees,
33
+ /**
34
+ * If empty, then KYC token is required to fill order
35
+ */
36
+ whitelist?: Address[], extra?: {
37
+ makerPermit?: Interaction;
38
+ /**
39
+ * In case receiver of taker tokens is not maker
40
+ */
41
+ customReceiver?: Address;
42
+ /**
43
+ * Will be called after FeeTaker.postInteraction
44
+ */
45
+ extraInteraction?: Interaction;
46
+ }): FeeTakerExtension;
47
+ /**
48
+ * Create `FeeTakerExtension` from bytes
49
+ *
50
+ * @param bytes 0x prefixed bytes
51
+ */
52
+ static decode(bytes: string): FeeTakerExtension;
53
+ /**
54
+ * Create `FeeTakerExtension` from `Extension`
55
+ */
56
+ static fromExtension(extension: Extension): FeeTakerExtension;
57
+ getFeeCalculator(): FeeCalculator;
58
+ build(): Extension;
59
+ /**
60
+ * Returns takingAmount with applied fees to it
61
+ *
62
+ * @param taker address which fill order
63
+ * @param takingAmount amount to apply fee to
64
+ */
65
+ getTakingAmount(taker: Address, takingAmount: bigint): bigint;
66
+ /**
67
+ * Returns makingAmount with applied fees to it
68
+ *
69
+ * @param taker address which fill order
70
+ * @param makingAmount amount to apply fee to
71
+ */
72
+ getMakingAmount(taker: Address, makingAmount: bigint): bigint;
73
+ /**
74
+ * Fee in `takerAsset` which resolver pays to resolver fee receiver
75
+ *
76
+ * @param taker who will fill order
77
+ * @param takingAmount taking amount to apply fee to
78
+ */
79
+ getResolverFee(taker: Address, takingAmount: bigint): bigint;
80
+ /**
81
+ * Fee in `takerAsset` which integrator gets to integrator wallet
82
+ *
83
+ * @param taker who will fill order
84
+ * @param takingAmount taking amount to calculate fee from
85
+ */
86
+ getIntegratorFee(taker: Address, takingAmount: bigint): bigint;
87
+ /**
88
+ * Fee in `takerAsset` which protocol gets as share from integrator fee
89
+ *
90
+ * @param taker who will fill order
91
+ * @param takingAmount taking amount to calculate fee from
92
+ */
93
+ getProtocolShareOfIntegratorFee(taker: Address, takingAmount: bigint): bigint;
94
+ /**
95
+ * Fee in `takerAsset` which protocol gets
96
+ * It equals to `share from integrator fee plus resolver fee`
97
+ *
98
+ * @param taker who will fill order
99
+ * @param takingAmount taking amount to calculate fee from
100
+ */
101
+ getProtocolFee(taker: Address, takingAmount: bigint): bigint;
102
+ /**
103
+ * Build data for AmountGetterWithFee
104
+ *
105
+ * 2 bytes — integrator fee percentage (in 1e5)
106
+ * 1 byte - integrator share percentage (in 1e2)
107
+ * 2 bytes — resolver fee percentage (in 1e5)
108
+ * 1 byte - whitelist discount numerator (in 1e2)
109
+ * 1 byte - size of the whitelist
110
+ * (bytes10)[N] whitelisted addresses;
111
+ *
112
+ * @see https://github.com/1inch/limit-order-protocol/blob/22a18f7f20acfec69d4f50ce1880e8e662477710/contracts/extensions/AmountGetterWithFee.sol#L56
113
+ */
114
+ private buildAmountGetterData;
115
+ /**
116
+ * Build data for `FeeTaker.postInteraction`
117
+ *
118
+ *
119
+ * 1 byte - flags:
120
+ * 01 bit `CUSTOM_RECEIVER_FLAG` - set to 1 if order has custom receiver
121
+ * 20 bytes — integrator fee recipient
122
+ * 20 bytes - protocol fee recipient
123
+ * [20 bytes] — receiver of taking tokens (optional, if not set, maker is used). See `CUSTOM_RECEIVER_FLAG` flag
124
+ * Same as in `buildAmountGetterData`
125
+ * [bytes20, bytes] - optional extra interaction
126
+ * @see buildAmountGetterData
127
+ * @see https://github.com/1inch/limit-order-protocol/blob/22a18f7f20acfec69d4f50ce1880e8e662477710/contracts/extensions/FeeTaker.sol#L114
128
+ */
129
+ private buildInteractionData;
130
+ }
@@ -0,0 +1,249 @@
1
+ import { BN, BytesBuilder, BytesIter } from '@1inch/byte-utils';
2
+ import assert from 'assert';
3
+ import { Fees } from './fees.js';
4
+ import { ResolverFee } from './resolver-fee.js';
5
+ import { IntegratorFee } from './integrator-fee.js';
6
+ import { WhitelistHalfAddress } from './whitelist-half-address.js';
7
+ import { FeeCalculator } from './fee-calculator.js';
8
+ import { ExtensionBuilder } from '../extension-builder.js';
9
+ import { Address } from '../../../address.js';
10
+ import { Interaction } from '../../interaction.js';
11
+ import { Extension } from '../extension.js';
12
+ import { Bps } from '../../../bps.js';
13
+ /**
14
+ * @see https://github.com/1inch/limit-order-protocol/blob/master/contracts/extensions/FeeTaker.sol
15
+ */
16
+ export class FeeTakerExtension {
17
+ constructor(address, fees, whitelist, makerPermit, extraInteraction, customReceiver) {
18
+ this.address = address;
19
+ this.fees = fees;
20
+ this.whitelist = whitelist;
21
+ this.makerPermit = makerPermit;
22
+ this.extraInteraction = extraInteraction;
23
+ this.customReceiver = customReceiver;
24
+ }
25
+ static new(
26
+ /**
27
+ * Address of extension
28
+ */
29
+ address,
30
+ /**
31
+ * @see ResolverFee
32
+ * @see IntegratorFee
33
+ */
34
+ fees,
35
+ /**
36
+ * If empty, then KYC token is required to fill order
37
+ */
38
+ whitelist, extra) {
39
+ return new FeeTakerExtension(address, fees, WhitelistHalfAddress.new(whitelist || []), extra?.makerPermit, extra?.extraInteraction, extra?.customReceiver);
40
+ }
41
+ /**
42
+ * Create `FeeTakerExtension` from bytes
43
+ *
44
+ * @param bytes 0x prefixed bytes
45
+ */
46
+ static decode(bytes) {
47
+ const extension = Extension.decode(bytes);
48
+ return FeeTakerExtension.fromExtension(extension);
49
+ }
50
+ /**
51
+ * Create `FeeTakerExtension` from `Extension`
52
+ */
53
+ static fromExtension(extension) {
54
+ const extensionAddress = Address.fromFirstBytes(extension.makingAmountData);
55
+ assert(Address.fromFirstBytes(extension.takingAmountData).equal(extensionAddress) &&
56
+ Address.fromFirstBytes(extension.postInteraction).equal(extensionAddress), 'Invalid extension, all calls should be to the same address');
57
+ assert(extension.takingAmountData == extension.makingAmountData, 'Invalid extension, taking amount data must be equal to making amount data');
58
+ // region Parse postInteraction data
59
+ const interactionBytes = BytesIter.HexString(extension.postInteraction);
60
+ interactionBytes.nextUint160(); // skip address of extension
61
+ const flags = BN.fromHex(interactionBytes.nextUint8());
62
+ const integratorFeeRecipient = new Address(interactionBytes.nextUint160());
63
+ const protocolFeeRecipient = new Address(interactionBytes.nextUint160());
64
+ const customTokensRecipient = flags.getBit(FeeTakerExtension.CUSTOM_RECEIVER_FLAG_BIT)
65
+ ? new Address(interactionBytes.nextUint160())
66
+ : undefined;
67
+ const interactionData = parseAmountData(interactionBytes);
68
+ const extraInteraction = interactionBytes.isEmpty()
69
+ ? undefined
70
+ : Interaction.decode(interactionBytes.rest());
71
+ //endregion Parse postInteraction data
72
+ //region Parse amount data
73
+ const amountBytes = BytesIter.HexString(extension.makingAmountData);
74
+ amountBytes.nextUint160(); // skip address of extension
75
+ const amountData = parseAmountData(amountBytes);
76
+ //endregion Parse amount data
77
+ const permit = extension.hasMakerPermit
78
+ ? Interaction.decode(extension.makerPermit)
79
+ : undefined;
80
+ assert(amountData.fees.integratorFee.value ===
81
+ interactionData.fees.integratorFee.value, `invalid extension: integrator fee must be same in interaction data and in amount data`);
82
+ assert(amountData.fees.resolverFee.value ===
83
+ interactionData.fees.resolverFee.value, `invalid extension: resolver fee must be same in interaction data and in amount data`);
84
+ assert(amountData.whitelist.discount.value ===
85
+ interactionData.whitelist.discount.value, `invalid extension: whitelist discount fee must be same in interaction data and in amount data`);
86
+ assert(amountData.fees.integratorShare.value ===
87
+ interactionData.fees.integratorShare.value, `invalid extension: integrator share must be same in interaction data and in amount data`);
88
+ assert(interactionData.whitelist.addresses.length ===
89
+ amountData.whitelist.addresses.length, 'whitelist must be same in interaction data and in amount data');
90
+ assert(interactionData.whitelist.addresses.every((val, i) => amountData.whitelist.addresses[i] === val), 'whitelist must be same in interaction data and in amount data');
91
+ return new FeeTakerExtension(extensionAddress, new Fees(amountData.fees.resolverFee.isZero()
92
+ ? ResolverFee.ZERO
93
+ : new ResolverFee(protocolFeeRecipient, amountData.fees.resolverFee, amountData.whitelist.discount), amountData.fees.integratorFee.isZero()
94
+ ? IntegratorFee.ZERO
95
+ : new IntegratorFee(integratorFeeRecipient, protocolFeeRecipient, amountData.fees.integratorFee, amountData.fees.integratorShare)), new WhitelistHalfAddress(amountData.whitelist.addresses), permit, extraInteraction, customTokensRecipient);
96
+ }
97
+ getFeeCalculator() {
98
+ return new FeeCalculator(this.fees, this.whitelist);
99
+ }
100
+ build() {
101
+ const amountGetterData = this.buildAmountGetterData();
102
+ const builder = new ExtensionBuilder()
103
+ .withMakingAmountData(this.address, amountGetterData)
104
+ .withTakingAmountData(this.address, amountGetterData)
105
+ .withPostInteraction(new Interaction(this.address, this.buildInteractionData()));
106
+ if (this.makerPermit) {
107
+ builder.withMakerPermit(this.makerPermit.target, this.makerPermit.data);
108
+ }
109
+ return builder.build();
110
+ }
111
+ /**
112
+ * Returns takingAmount with applied fees to it
113
+ *
114
+ * @param taker address which fill order
115
+ * @param takingAmount amount to apply fee to
116
+ */
117
+ getTakingAmount(taker, takingAmount) {
118
+ return this.getFeeCalculator().getTakingAmount(taker, takingAmount);
119
+ }
120
+ /**
121
+ * Returns makingAmount with applied fees to it
122
+ *
123
+ * @param taker address which fill order
124
+ * @param makingAmount amount to apply fee to
125
+ */
126
+ getMakingAmount(taker, makingAmount) {
127
+ return this.getFeeCalculator().getMakingAmount(taker, makingAmount);
128
+ }
129
+ /**
130
+ * Fee in `takerAsset` which resolver pays to resolver fee receiver
131
+ *
132
+ * @param taker who will fill order
133
+ * @param takingAmount taking amount to apply fee to
134
+ */
135
+ getResolverFee(taker, takingAmount) {
136
+ return this.getFeeCalculator().getResolverFee(taker, takingAmount);
137
+ }
138
+ /**
139
+ * Fee in `takerAsset` which integrator gets to integrator wallet
140
+ *
141
+ * @param taker who will fill order
142
+ * @param takingAmount taking amount to calculate fee from
143
+ */
144
+ getIntegratorFee(taker, takingAmount) {
145
+ return this.getFeeCalculator().getIntegratorFee(taker, takingAmount);
146
+ }
147
+ /**
148
+ * Fee in `takerAsset` which protocol gets as share from integrator fee
149
+ *
150
+ * @param taker who will fill order
151
+ * @param takingAmount taking amount to calculate fee from
152
+ */
153
+ getProtocolShareOfIntegratorFee(taker, takingAmount) {
154
+ return this.getFeeCalculator().getProtocolShareOfIntegratorFee(taker, takingAmount);
155
+ }
156
+ /**
157
+ * Fee in `takerAsset` which protocol gets
158
+ * It equals to `share from integrator fee plus resolver fee`
159
+ *
160
+ * @param taker who will fill order
161
+ * @param takingAmount taking amount to calculate fee from
162
+ */
163
+ getProtocolFee(taker, takingAmount) {
164
+ return this.getFeeCalculator().getProtocolFee(taker, takingAmount);
165
+ }
166
+ /**
167
+ * Build data for AmountGetterWithFee
168
+ *
169
+ * 2 bytes — integrator fee percentage (in 1e5)
170
+ * 1 byte - integrator share percentage (in 1e2)
171
+ * 2 bytes — resolver fee percentage (in 1e5)
172
+ * 1 byte - whitelist discount numerator (in 1e2)
173
+ * 1 byte - size of the whitelist
174
+ * (bytes10)[N] whitelisted addresses;
175
+ *
176
+ * @see https://github.com/1inch/limit-order-protocol/blob/22a18f7f20acfec69d4f50ce1880e8e662477710/contracts/extensions/AmountGetterWithFee.sol#L56
177
+ */
178
+ buildAmountGetterData() {
179
+ const integrator = {
180
+ fee: this.fees.integrator.fee.toFraction(Fees.BASE_1E5),
181
+ share: this.fees.integrator.share.toFraction(Fees.BASE_1E2)
182
+ };
183
+ const resolverFee = this.fees.resolver.fee.toFraction(Fees.BASE_1E5);
184
+ const builder = new BytesBuilder()
185
+ .addUint16(BigInt(integrator.fee))
186
+ .addUint8(BigInt(integrator.share))
187
+ .addUint16(BigInt(resolverFee))
188
+ .addUint8(BigInt(
189
+ // contract expects discount numerator, but class contain discount
190
+ Number(Fees.BASE_1E2) -
191
+ this.fees.resolver.whitelistDiscount.toFraction(Fees.BASE_1E2)));
192
+ this.whitelist.encodeTo(builder);
193
+ return builder.asHex();
194
+ }
195
+ /**
196
+ * Build data for `FeeTaker.postInteraction`
197
+ *
198
+ *
199
+ * 1 byte - flags:
200
+ * 01 bit `CUSTOM_RECEIVER_FLAG` - set to 1 if order has custom receiver
201
+ * 20 bytes — integrator fee recipient
202
+ * 20 bytes - protocol fee recipient
203
+ * [20 bytes] — receiver of taking tokens (optional, if not set, maker is used). See `CUSTOM_RECEIVER_FLAG` flag
204
+ * Same as in `buildAmountGetterData`
205
+ * [bytes20, bytes] - optional extra interaction
206
+ * @see buildAmountGetterData
207
+ * @see https://github.com/1inch/limit-order-protocol/blob/22a18f7f20acfec69d4f50ce1880e8e662477710/contracts/extensions/FeeTaker.sol#L114
208
+ */
209
+ buildInteractionData() {
210
+ const flags = new BN(0n).setBit(FeeTakerExtension.CUSTOM_RECEIVER_FLAG_BIT, Boolean(this.customReceiver));
211
+ const builder = new BytesBuilder()
212
+ .addUint8(flags)
213
+ .addAddress(this.fees.integrator.integrator.toString())
214
+ .addAddress(this.fees.protocol.toString());
215
+ if (this.customReceiver) {
216
+ builder.addAddress(this.customReceiver.toString());
217
+ }
218
+ builder.addBytes(this.buildAmountGetterData());
219
+ if (this.extraInteraction) {
220
+ builder
221
+ .addAddress(this.extraInteraction.target.toString())
222
+ .addBytes(this.extraInteraction.data);
223
+ }
224
+ return builder.asHex();
225
+ }
226
+ }
227
+ /**
228
+ * Flags for post-interaction data
229
+ * @private
230
+ */
231
+ FeeTakerExtension.CUSTOM_RECEIVER_FLAG_BIT = 0n;
232
+ function parseAmountData(iter) {
233
+ const fees = {
234
+ integratorFee: Bps.fromFraction(Number(iter.nextUint16()), Fees.BASE_1E5),
235
+ integratorShare: Bps.fromFraction(Number(iter.nextUint8()), Fees.BASE_1E2),
236
+ resolverFee: Bps.fromFraction(Number(iter.nextUint16()), Fees.BASE_1E5)
237
+ };
238
+ const whitelistDiscount = Bps.fromFraction(Number(Fees.BASE_1E2) - Number(iter.nextUint8()), // contract uses 1 - discount
239
+ Fees.BASE_1E2);
240
+ const whitelistAddresses = [];
241
+ const whitelistFromAmountSize = Number(iter.nextUint8());
242
+ for (let i = 0; i < whitelistFromAmountSize; i++) {
243
+ whitelistAddresses.push(iter.nextBytes(10));
244
+ }
245
+ return {
246
+ fees,
247
+ whitelist: { discount: whitelistDiscount, addresses: whitelistAddresses }
248
+ };
249
+ }
@@ -0,0 +1,72 @@
1
+ import { FeeTakerExtension } from './fee-taker.extension.js';
2
+ import { Fees } from './fees.js';
3
+ import { ResolverFee } from './resolver-fee.js';
4
+ import { IntegratorFee } from './integrator-fee.js';
5
+ import { Address } from '../../../address.js';
6
+ import { Bps } from '../../../bps.js';
7
+ import { Interaction } from '../../interaction.js';
8
+ describe('FeeTakerExtension', () => {
9
+ describe('serialize/deserialize', () => {
10
+ it('all data', () => {
11
+ const recipients = {
12
+ integratorFeeRecipient: Address.fromBigInt(2n),
13
+ protocolFeeRecipient: Address.fromBigInt(3n),
14
+ tokensRecipient: Address.fromBigInt(4n)
15
+ };
16
+ const extension = FeeTakerExtension.new(Address.fromBigInt(1n), new Fees(new ResolverFee(recipients.protocolFeeRecipient, Bps.fromPercent(2), Bps.fromPercent(1)), new IntegratorFee(recipients.integratorFeeRecipient, recipients.protocolFeeRecipient, Bps.fromFraction(0.0001), Bps.fromPercent(5))), [Address.fromBigInt(100n)], {
17
+ makerPermit: new Interaction(Address.fromBigInt(1n), '0xdeadbeef'),
18
+ extraInteraction: new Interaction(Address.fromBigInt(99n), '0xdeadbeefdeadbeef'),
19
+ customReceiver: recipients.tokensRecipient
20
+ });
21
+ expect(FeeTakerExtension.fromExtension(extension.build())).toEqual(extension);
22
+ });
23
+ it('only resolver data', () => {
24
+ const recipients = {
25
+ protocolFeeRecipient: Address.fromBigInt(3n)
26
+ };
27
+ const extension = FeeTakerExtension.new(Address.fromBigInt(1n), Fees.resolverFee(new ResolverFee(recipients.protocolFeeRecipient, Bps.fromPercent(2))), [Address.fromBigInt(100n)]);
28
+ expect(FeeTakerExtension.fromExtension(extension.build())).toEqual(extension);
29
+ });
30
+ it('only integrator data', () => {
31
+ const recipients = {
32
+ integratorFeeRecipient: Address.fromBigInt(2n),
33
+ protocolFeeRecipient: Address.fromBigInt(3n)
34
+ };
35
+ const extension = FeeTakerExtension.new(Address.fromBigInt(1n), Fees.integratorFee(new IntegratorFee(recipients.integratorFeeRecipient, recipients.protocolFeeRecipient, Bps.fromFraction(0.0001), Bps.fromPercent(5))), [Address.fromBigInt(100n)]);
36
+ expect(FeeTakerExtension.fromExtension(extension.build())).toEqual(extension);
37
+ });
38
+ });
39
+ it('should calculate taking amount', () => {
40
+ const takerAddress = Address.fromBigInt(100n);
41
+ const ext = FeeTakerExtension.new(Address.fromBigInt(1n), Fees.resolverFee(new ResolverFee(Address.fromBigInt(2n), Bps.fromPercent(1))), [takerAddress] // mark taker as whitelisted resolver
42
+ );
43
+ const takingAmount = ext.getTakingAmount(takerAddress, 100000000n);
44
+ expect(takingAmount).toEqual(101000000n);
45
+ });
46
+ it('should calculate resolver fee', () => {
47
+ const takerAddress = Address.fromBigInt(100n);
48
+ const ext = FeeTakerExtension.new(Address.fromBigInt(1n), Fees.resolverFee(new ResolverFee(Address.fromBigInt(2n), Bps.fromPercent(1))), [takerAddress] // mark taker as whitelisted resolver
49
+ );
50
+ const resolverFee = ext.getResolverFee(takerAddress, 100000000n);
51
+ expect(resolverFee).toEqual(1000000n);
52
+ });
53
+ it('should calculate integrator fee', () => {
54
+ const takerAddress = Address.fromBigInt(100n);
55
+ const ext = FeeTakerExtension.new(Address.fromBigInt(1n), Fees.integratorFee(new IntegratorFee(Address.fromBigInt(2n), Address.fromBigInt(3n), Bps.fromPercent(5), // fee
56
+ Bps.fromPercent(10) // share
57
+ )), [takerAddress] // mark taker as whitelisted resolver
58
+ );
59
+ const integratorFee = ext.getIntegratorFee(takerAddress, 100000000n);
60
+ expect(integratorFee).toEqual(500000n); // 10% from 5% = 0.5%
61
+ });
62
+ it('should calculate protocol fee', () => {
63
+ const protocolAddress = Address.fromBigInt(111n);
64
+ const takerAddress = Address.fromBigInt(100n);
65
+ const ext = FeeTakerExtension.new(Address.fromBigInt(1n), new Fees(new ResolverFee(protocolAddress, Bps.fromPercent(1)), new IntegratorFee(Address.fromBigInt(2n), protocolAddress, Bps.fromPercent(5), // fee
66
+ Bps.fromPercent(10) // share
67
+ )), [takerAddress] // mark taker as whitelisted resolver
68
+ );
69
+ const protocolFee = ext.getProtocolFee(takerAddress, 100000000n);
70
+ expect(protocolFee).toEqual(1000000n + 4500000n); // 90% from 5% (integrator fee share)+ 1% (resolver fee) = 5.5%
71
+ });
72
+ });
@@ -0,0 +1,19 @@
1
+ import { ResolverFee } from './resolver-fee.js';
2
+ import { IntegratorFee } from './integrator-fee.js';
3
+ import { Address } from '../../../address.js';
4
+ export declare class Fees {
5
+ readonly resolver: ResolverFee;
6
+ readonly integrator: IntegratorFee;
7
+ /**
8
+ * 100% = 100000
9
+ */
10
+ static BASE_1E5: bigint;
11
+ /**
12
+ * 100% = 100
13
+ */
14
+ static BASE_1E2: bigint;
15
+ constructor(resolver: ResolverFee, integrator: IntegratorFee);
16
+ get protocol(): Address;
17
+ static resolverFee(fee: ResolverFee): Fees;
18
+ static integratorFee(fee: IntegratorFee): Fees;
19
+ }
@@ -0,0 +1,36 @@
1
+ import assert from 'assert';
2
+ import { ResolverFee } from './resolver-fee.js';
3
+ import { IntegratorFee } from './integrator-fee.js';
4
+ export class Fees {
5
+ constructor(resolver, integrator) {
6
+ this.resolver = resolver;
7
+ this.integrator = integrator;
8
+ if (!resolver.fee.isZero() && !integrator.fee.isZero()) {
9
+ assert(resolver.receiver.equal(integrator.protocol), 'resolver fee receiver address and integrator fee protocol address must be same');
10
+ }
11
+ assert(!(resolver.fee.isZero() && integrator.fee.isZero()), 'at least one fee must be set');
12
+ assert(this.integrator.fee.toFraction() < 0.6553, 'max fee is 65.53%' // 2bytes
13
+ );
14
+ assert(this.resolver.fee.toFraction() < 0.6553, 'max fee is 65.53%' // 2bytes
15
+ );
16
+ }
17
+ get protocol() {
18
+ return this.integrator.fee.isZero()
19
+ ? this.resolver.receiver
20
+ : this.integrator.protocol;
21
+ }
22
+ static resolverFee(fee) {
23
+ return new Fees(fee, IntegratorFee.ZERO);
24
+ }
25
+ static integratorFee(fee) {
26
+ return new Fees(ResolverFee.ZERO, fee);
27
+ }
28
+ }
29
+ /**
30
+ * 100% = 100000
31
+ */
32
+ Fees.BASE_1E5 = 100000n;
33
+ /**
34
+ * 100% = 100
35
+ */
36
+ Fees.BASE_1E2 = 100n;
@@ -0,0 +1,7 @@
1
+ export * from './fee-taker.extension.js';
2
+ export * from './fees.js';
3
+ export * from './integrator-fee.js';
4
+ export * from './resolver-fee.js';
5
+ export * from './fee-calculator.js';
6
+ export * from './types.js';
7
+ export * from './whitelist-half-address.js';
@@ -0,0 +1,7 @@
1
+ export * from './fee-taker.extension.js';
2
+ export * from './fees.js';
3
+ export * from './integrator-fee.js';
4
+ export * from './resolver-fee.js';
5
+ export * from './fee-calculator.js';
6
+ export * from './types.js';
7
+ export * from './whitelist-half-address.js';
@@ -0,0 +1,13 @@
1
+ import { Address } from '../../../address.js';
2
+ import { Bps } from '../../../bps.js';
3
+ /**
4
+ * Integrator gets `share` of `fee` to `integrator` and the rest goes to `protocol`
5
+ */
6
+ export declare class IntegratorFee {
7
+ readonly integrator: Address;
8
+ readonly protocol: Address;
9
+ readonly fee: Bps;
10
+ readonly share: Bps;
11
+ static ZERO: IntegratorFee;
12
+ constructor(integrator: Address, protocol: Address, fee: Bps, share: Bps);
13
+ }
@@ -0,0 +1,28 @@
1
+ import { Address } from '../../../address.js';
2
+ import { Bps } from '../../../bps.js';
3
+ /**
4
+ * Integrator gets `share` of `fee` to `integrator` and the rest goes to `protocol`
5
+ */
6
+ export class IntegratorFee {
7
+ constructor(integrator, protocol, fee, share) {
8
+ this.integrator = integrator;
9
+ this.protocol = protocol;
10
+ this.fee = fee;
11
+ this.share = share;
12
+ if (fee.isZero()) {
13
+ if (!share.isZero()) {
14
+ throw new Error('integrator share must be zero if fee is zero');
15
+ }
16
+ if (!integrator.isZero()) {
17
+ throw new Error('integrator address must be zero if fee is zero');
18
+ }
19
+ if (!protocol.isZero()) {
20
+ throw new Error('protocol address must be zero if fee is zero');
21
+ }
22
+ }
23
+ if ((integrator.isZero() || protocol.isZero()) && !fee.isZero()) {
24
+ throw new Error('fee must be zero if integrator or protocol is zero address');
25
+ }
26
+ }
27
+ }
28
+ IntegratorFee.ZERO = new IntegratorFee(Address.ZERO_ADDRESS, Address.ZERO_ADDRESS, Bps.ZERO, Bps.ZERO);
@@ -0,0 +1,19 @@
1
+ import { Address } from '../../../address.js';
2
+ import { Bps } from '../../../bps.js';
3
+ /**
4
+ * Fee paid by resolver to `receiver`
5
+ */
6
+ export declare class ResolverFee {
7
+ readonly receiver: Address;
8
+ readonly fee: Bps;
9
+ /**
10
+ * whitelisted resolvers have discount on fee
11
+ */
12
+ readonly whitelistDiscount: Bps;
13
+ static ZERO: ResolverFee;
14
+ constructor(receiver: Address, fee: Bps,
15
+ /**
16
+ * whitelisted resolvers have discount on fee
17
+ */
18
+ whitelistDiscount?: Bps);
19
+ }
@@ -0,0 +1,28 @@
1
+ import assert from 'assert';
2
+ import { Address } from '../../../address.js';
3
+ import { Bps } from '../../../bps.js';
4
+ /**
5
+ * Fee paid by resolver to `receiver`
6
+ */
7
+ export class ResolverFee {
8
+ constructor(receiver, fee,
9
+ /**
10
+ * whitelisted resolvers have discount on fee
11
+ */
12
+ whitelistDiscount = Bps.ZERO) {
13
+ this.receiver = receiver;
14
+ this.fee = fee;
15
+ this.whitelistDiscount = whitelistDiscount;
16
+ if (receiver.isZero() && !fee.isZero()) {
17
+ throw new Error('fee must be zero if receiver is zero address');
18
+ }
19
+ if (!receiver.isZero() && fee.isZero()) {
20
+ throw new Error('receiver must be zero address if fee is zero');
21
+ }
22
+ if (fee.isZero() && !whitelistDiscount.isZero()) {
23
+ throw new Error('whitelist discount must be zero if fee is zero');
24
+ }
25
+ assert(this.whitelistDiscount.value % 100n === 0n, `whitelist discount must have percent precision: 1%, 2% and so on`);
26
+ }
27
+ }
28
+ ResolverFee.ZERO = new ResolverFee(Address.ZERO_ADDRESS, Bps.ZERO);
@@ -0,0 +1,4 @@
1
+ import { Address } from '../../../address.js';
2
+ export type Whitelist = {
3
+ isWhitelisted(taker: Address): boolean;
4
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ import { BytesBuilder } from "@1inch/byte-utils";
2
+ import { Whitelist } from "./types.js";
3
+ import { Address } from "../../../address.js";
4
+ export declare class WhitelistHalfAddress implements Whitelist {
5
+ /**
6
+ * Last 10 bytes of addresses
7
+ */
8
+ private readonly addresses;
9
+ constructor(
10
+ /**
11
+ * Last 10 bytes of addresses
12
+ */
13
+ addresses: string[]);
14
+ get length(): number;
15
+ static new(addresses: Address[]): WhitelistHalfAddress;
16
+ isWhitelisted(address: Address): boolean;
17
+ encodeTo(builder: BytesBuilder): BytesBuilder;
18
+ }