@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,26 @@
1
+ export class WhitelistHalfAddress {
2
+ constructor(
3
+ /**
4
+ * Last 10 bytes of addresses
5
+ */
6
+ addresses) {
7
+ this.addresses = addresses;
8
+ }
9
+ get length() {
10
+ return this.addresses.length;
11
+ }
12
+ static new(addresses) {
13
+ return new WhitelistHalfAddress(addresses?.map((w) => w.lastHalf()) || []);
14
+ }
15
+ isWhitelisted(address) {
16
+ const half = address.lastHalf();
17
+ return this.addresses.some((w) => w === half);
18
+ }
19
+ encodeTo(builder) {
20
+ builder.addUint8(BigInt(this.addresses.length));
21
+ for (const halfAddress of this.addresses) {
22
+ builder.addBytes(halfAddress);
23
+ }
24
+ return builder;
25
+ }
26
+ }
@@ -0,0 +1,3 @@
1
+ export * from './extension.js';
2
+ export * from './extension-builder.js';
3
+ export * as FeeTakerExt from './fee-taker/index.js';
@@ -0,0 +1,3 @@
1
+ export * from './extension.js';
2
+ export * from './extension-builder.js';
3
+ export * as FeeTakerExt from './fee-taker/index.js';
@@ -0,0 +1,10 @@
1
+ export * from './eip712/index.js';
2
+ export * from './limit-order.js';
3
+ export * from './limit-order-with-fee.js';
4
+ export * from './maker-traits.js';
5
+ export * from './taker-traits.js';
6
+ export * from './extensions/index.js';
7
+ export * from './interaction.js';
8
+ export * from './types.js';
9
+ export * from './amounts.js';
10
+ export * from './verification.js';
@@ -0,0 +1,10 @@
1
+ export * from './eip712/index.js';
2
+ export * from './limit-order.js';
3
+ export * from './limit-order-with-fee.js';
4
+ export * from './maker-traits.js';
5
+ export * from './taker-traits.js';
6
+ export * from './extensions/index.js';
7
+ export * from './interaction.js';
8
+ export * from './types.js';
9
+ export * from './amounts.js';
10
+ export * from './verification.js';
@@ -0,0 +1,16 @@
1
+ import { Address } from '../address.js';
2
+ export declare class Interaction {
3
+ readonly target: Address;
4
+ readonly data: string;
5
+ constructor(target: Address, data: string);
6
+ /**
7
+ * Create `Interaction` from bytes
8
+ *
9
+ * @param bytes Hex string with 0x. First 20 bytes are target, then data
10
+ */
11
+ static decode(bytes: string): Interaction;
12
+ /**
13
+ * Hex string with 0x. First 20 bytes are target, then data
14
+ */
15
+ encode(): string;
16
+ }
@@ -0,0 +1,25 @@
1
+ import { BytesIter, isHexBytes, trim0x } from '@1inch/byte-utils';
2
+ import assert from 'assert';
3
+ import { Address } from '../address.js';
4
+ export class Interaction {
5
+ constructor(target, data) {
6
+ this.target = target;
7
+ this.data = data;
8
+ assert(isHexBytes(data), 'Interaction data must be valid hex bytes');
9
+ }
10
+ /**
11
+ * Create `Interaction` from bytes
12
+ *
13
+ * @param bytes Hex string with 0x. First 20 bytes are target, then data
14
+ */
15
+ static decode(bytes) {
16
+ const iter = BytesIter.HexString(bytes);
17
+ return new Interaction(new Address(iter.nextUint160()), iter.rest());
18
+ }
19
+ /**
20
+ * Hex string with 0x. First 20 bytes are target, then data
21
+ */
22
+ encode() {
23
+ return this.target.toString() + trim0x(this.data);
24
+ }
25
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import { Interaction } from './interaction.js';
2
+ import { Address } from '../address.js';
3
+ describe('Interaction', () => {
4
+ it('should encode/decode', () => {
5
+ const interaction = new Interaction(Address.fromBigInt(1337n), '0xdeadbeef');
6
+ expect(Interaction.decode(interaction.encode())).toStrictEqual(interaction);
7
+ });
8
+ });
@@ -0,0 +1,59 @@
1
+ import { FeeTakerExtension } from './extensions/fee-taker/fee-taker.extension.js';
2
+ import { LimitOrder } from './limit-order.js';
3
+ import { LimitOrderV4Struct, OrderInfoData } from './types.js';
4
+ import { MakerTraits } from './maker-traits.js';
5
+ import { Extension } from './extensions/extension.js';
6
+ import { Address } from '../address.js';
7
+ export declare class LimitOrderWithFee extends LimitOrder {
8
+ readonly feeExtension: FeeTakerExtension;
9
+ constructor(
10
+ /**
11
+ * Use `FeeTakerExtension.customReceiver` to set custom receiver
12
+ */
13
+ orderInfo: Omit<OrderInfoData, 'receiver'>, makerTraits: MakerTraits | undefined, feeExtension: FeeTakerExtension);
14
+ /**
15
+ * Set random nonce to `makerTraits` and creates `LimitOrderWithFee`
16
+ */
17
+ static withRandomNonce(
18
+ /**
19
+ * Use `FeeTakerExtension.recipients.tokensRecipient` to set custom receiver
20
+ */
21
+ orderInfo: Omit<OrderInfoData, 'receiver'>, feeExtension: FeeTakerExtension, makerTraits?: MakerTraits): LimitOrderWithFee;
22
+ static fromDataAndExtension(data: LimitOrderV4Struct, extension: Extension): LimitOrderWithFee;
23
+ /**
24
+ * Calculates the `takingAmount` required from the taker in exchange for the `makingAmount`
25
+ *
26
+ * @param taker
27
+ * @param makingAmount amount to be filled
28
+ */
29
+ getTakingAmount(taker: Address, makingAmount?: bigint): bigint;
30
+ /**
31
+ * Calculates the `makingAmount` that the taker receives in exchange for the `takingAmount`
32
+ *
33
+ * @param taker
34
+ * @param takingAmount amount to be filled
35
+ */
36
+ getMakingAmount(taker: Address, takingAmount?: bigint): bigint;
37
+ /**
38
+ * Fee in `takerAsset` which resolver pays to resolver fee receiver
39
+ *
40
+ * @param taker who will fill order
41
+ * @param makingAmount amount wanted to fill
42
+ */
43
+ getResolverFee(taker: Address, makingAmount?: bigint): bigint;
44
+ /**
45
+ * Fee in `takerAsset` which integrator gets to integrator wallet
46
+ *
47
+ * @param taker who will fill order
48
+ * @param makingAmount amount wanted to fill
49
+ */
50
+ getIntegratorFee(taker: Address, makingAmount?: bigint): bigint;
51
+ /**
52
+ * Fee in `takerAsset` which protocol gets
53
+ * It equals to `share from integrator fee plus resolver fee`
54
+ *
55
+ * @param taker who will fill order
56
+ * @param makingAmount amount wanted to fill
57
+ */
58
+ getProtocolFee(taker: Address, makingAmount?: bigint): bigint;
59
+ }
@@ -0,0 +1,94 @@
1
+ import { UINT_40_MAX } from '@1inch/byte-utils';
2
+ import assert from 'assert';
3
+ import { FeeTakerExtension } from './extensions/fee-taker/fee-taker.extension.js';
4
+ import { LimitOrder } from './limit-order.js';
5
+ import { MakerTraits } from './maker-traits.js';
6
+ import { calcMakingAmount, calcTakingAmount } from './amounts.js';
7
+ import { Address } from '../address.js';
8
+ import { randBigInt } from '../utils/rand-bigint.js';
9
+ export class LimitOrderWithFee extends LimitOrder {
10
+ constructor(
11
+ /**
12
+ * Use `FeeTakerExtension.customReceiver` to set custom receiver
13
+ */
14
+ orderInfo, makerTraits = MakerTraits.default(), feeExtension) {
15
+ makerTraits.enablePostInteraction(); // to execute extension
16
+ super({ ...orderInfo, receiver: feeExtension.address }, makerTraits, feeExtension.build());
17
+ this.feeExtension = feeExtension;
18
+ }
19
+ /**
20
+ * Set random nonce to `makerTraits` and creates `LimitOrderWithFee`
21
+ */
22
+ static withRandomNonce(
23
+ /**
24
+ * Use `FeeTakerExtension.recipients.tokensRecipient` to set custom receiver
25
+ */
26
+ orderInfo, feeExtension, makerTraits = MakerTraits.default()) {
27
+ makerTraits.withNonce(randBigInt(UINT_40_MAX));
28
+ return new LimitOrderWithFee(orderInfo, makerTraits, feeExtension);
29
+ }
30
+ static fromDataAndExtension(data, extension) {
31
+ const makerTraits = new MakerTraits(BigInt(data.makerTraits));
32
+ const feeExt = FeeTakerExtension.fromExtension(extension);
33
+ assert(feeExt.address.equal(new Address(data.receiver)), `invalid order: receiver must be FeeTaker extension address`);
34
+ return new LimitOrderWithFee({
35
+ salt: BigInt(data.salt),
36
+ maker: new Address(data.maker),
37
+ makerAsset: new Address(data.makerAsset),
38
+ takerAsset: new Address(data.takerAsset),
39
+ makingAmount: BigInt(data.makingAmount),
40
+ takingAmount: BigInt(data.takingAmount)
41
+ }, makerTraits, feeExt);
42
+ }
43
+ /**
44
+ * Calculates the `takingAmount` required from the taker in exchange for the `makingAmount`
45
+ *
46
+ * @param taker
47
+ * @param makingAmount amount to be filled
48
+ */
49
+ getTakingAmount(taker, makingAmount = this.makingAmount) {
50
+ const takingAmount = calcTakingAmount(makingAmount, this.makingAmount, this.takingAmount);
51
+ return this.feeExtension.getTakingAmount(taker, takingAmount);
52
+ }
53
+ /**
54
+ * Calculates the `makingAmount` that the taker receives in exchange for the `takingAmount`
55
+ *
56
+ * @param taker
57
+ * @param takingAmount amount to be filled
58
+ */
59
+ getMakingAmount(taker, takingAmount = this.takingAmount) {
60
+ const makingAmount = calcMakingAmount(takingAmount, this.makingAmount, this.takingAmount);
61
+ return this.feeExtension.getMakingAmount(taker, makingAmount);
62
+ }
63
+ /**
64
+ * Fee in `takerAsset` which resolver pays to resolver fee receiver
65
+ *
66
+ * @param taker who will fill order
67
+ * @param makingAmount amount wanted to fill
68
+ */
69
+ getResolverFee(taker, makingAmount = this.makingAmount) {
70
+ const takingAmount = calcTakingAmount(makingAmount, this.makingAmount, this.takingAmount);
71
+ return this.feeExtension.getResolverFee(taker, takingAmount);
72
+ }
73
+ /**
74
+ * Fee in `takerAsset` which integrator gets to integrator wallet
75
+ *
76
+ * @param taker who will fill order
77
+ * @param makingAmount amount wanted to fill
78
+ */
79
+ getIntegratorFee(taker, makingAmount = this.makingAmount) {
80
+ const takingAmount = calcTakingAmount(makingAmount, this.makingAmount, this.takingAmount);
81
+ return this.feeExtension.getIntegratorFee(taker, takingAmount);
82
+ }
83
+ /**
84
+ * Fee in `takerAsset` which protocol gets
85
+ * It equals to `share from integrator fee plus resolver fee`
86
+ *
87
+ * @param taker who will fill order
88
+ * @param makingAmount amount wanted to fill
89
+ */
90
+ getProtocolFee(taker, makingAmount = this.makingAmount) {
91
+ const takingAmount = calcTakingAmount(makingAmount, this.makingAmount, this.takingAmount);
92
+ return this.feeExtension.getProtocolFee(taker, takingAmount);
93
+ }
94
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
1
+ import { LimitOrderWithFee } from './limit-order-with-fee.js';
2
+ import { FeeTakerExtension } from './extensions/fee-taker/fee-taker.extension.js';
3
+ import { Fees } from './extensions/fee-taker/fees.js';
4
+ import { ResolverFee } from './extensions/fee-taker/resolver-fee.js';
5
+ import { IntegratorFee } from './extensions/fee-taker/integrator-fee.js';
6
+ import { Interaction } from './interaction.js';
7
+ import { MakerTraits } from './maker-traits.js';
8
+ import { Address } from '../address.js';
9
+ import { Bps } from '../bps.js';
10
+ describe('LimitOrderWithFee', () => {
11
+ it('should create fromDataAndExtension', () => {
12
+ const recipients = {
13
+ integratorFeeRecipient: Address.fromBigInt(2n),
14
+ protocolFeeRecipient: Address.fromBigInt(3n),
15
+ tokensRecipient: Address.fromBigInt(4n)
16
+ };
17
+ const extension = FeeTakerExtension.new(Address.fromBigInt(1n), new Fees(new ResolverFee(recipients.protocolFeeRecipient, Bps.fromPercent(2)), new IntegratorFee(recipients.integratorFeeRecipient, recipients.protocolFeeRecipient, Bps.fromFraction(0.0001), Bps.fromPercent(5))), [Address.fromBigInt(100n)], {
18
+ makerPermit: new Interaction(Address.fromBigInt(1n), '0xdeadbeef'),
19
+ extraInteraction: new Interaction(Address.fromBigInt(99n), '0xdeadbeefdeadbeef'),
20
+ customReceiver: recipients.tokensRecipient
21
+ });
22
+ const order = new LimitOrderWithFee({
23
+ makerAsset: new Address('0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'),
24
+ takerAsset: new Address('0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'),
25
+ makingAmount: 1000000000000000000n,
26
+ takingAmount: 1420000000n,
27
+ maker: new Address('0x00000000219ab540356cbb839cbe05303d7705fa')
28
+ }, MakerTraits.default(), extension);
29
+ expect(LimitOrderWithFee.fromDataAndExtension(order.build(), order.extension)).toEqual(order);
30
+ });
31
+ });
@@ -0,0 +1,63 @@
1
+ import { EIP712TypedData } from './eip712/index.js';
2
+ import { LimitOrderV4Struct, OrderInfoData } from './types.js';
3
+ import { MakerTraits } from './maker-traits.js';
4
+ import { Extension } from './extensions/extension.js';
5
+ import { Address } from '../address.js';
6
+ import { ProxyFactory } from '../limit-order-contract/index.js';
7
+ export declare class LimitOrder {
8
+ readonly extension: Extension;
9
+ static readonly CHAIN_TO_WRAPPER: Record<number, Address>;
10
+ private static readonly Web3Type;
11
+ readonly maker: Address;
12
+ receiver: Address;
13
+ readonly makerAsset: Address;
14
+ readonly takerAsset: Address;
15
+ readonly makingAmount: bigint;
16
+ readonly takingAmount: bigint;
17
+ readonly makerTraits: MakerTraits;
18
+ private _salt;
19
+ constructor(orderInfo: OrderInfoData, makerTraits?: MakerTraits, extension?: Extension, config?: {
20
+ optimizeReceiverAddress: boolean;
21
+ });
22
+ get salt(): bigint;
23
+ /**
24
+ * Build correct salt for order
25
+ *
26
+ * If order has extension - it is crucial to build correct salt
27
+ * otherwise order won't be ever filled
28
+ *
29
+ * @see https://github.com/1inch/limit-order-protocol/blob/7bc5129ae19832338169ca21e4cf6331e8ff44f6/contracts/OrderLib.sol#L153
30
+ *
31
+ */
32
+ static buildSalt(extension: Extension, baseSalt?: bigint): bigint;
33
+ static verifySalt(salt: bigint, extension: Extension): bigint;
34
+ static fromNative(chainId: number, nativeOrderFactory: ProxyFactory, orderInfo: Omit<OrderInfoData, 'makerAsset'>, makerTraits: MakerTraits, extension: Extension): LimitOrder;
35
+ static isNativeOrder(chainId: number, nativeOrderFactory: ProxyFactory, order: LimitOrderV4Struct, signature: string): boolean;
36
+ static fromCalldata(bytes: string): LimitOrder;
37
+ static fromDataAndExtension(data: LimitOrderV4Struct, extension: Extension): LimitOrder;
38
+ isNative(chainId: number, nativeOrderFactory: ProxyFactory, signature: string): boolean;
39
+ /**
40
+ * Returns signature for submitting native order on-chain
41
+ * Only valid if order is native
42
+ *
43
+ * @see FusionOrder.isNative
44
+ * @see FusionOrder.fromNative
45
+ */
46
+ nativeSignature(maker: Address): string;
47
+ /**
48
+ * Injects source info to order `salt` [224, 255] bits
49
+ * check `getTrackCodeForSource` implementation for exact injected data
50
+ *
51
+ * @param source order source identifier
52
+ * @see getTrackCodeForSource
53
+ */
54
+ setSource(source: string): this;
55
+ toCalldata(): string;
56
+ build(): LimitOrderV4Struct;
57
+ getTypedData(chainId: number): EIP712TypedData;
58
+ getOrderHash(chainId: number): string;
59
+ /**
60
+ * Returns true if only a specific address can fill order
61
+ */
62
+ isPrivate(): boolean;
63
+ }
@@ -0,0 +1,211 @@
1
+ import { AbiCoder } from 'ethers';
2
+ import { isHexString, UINT_160_MAX, UINT_256_MAX } from '@1inch/byte-utils';
3
+ import assert from 'assert';
4
+ import { buildOrderTypedData, getLimitOrderV4Domain, getOrderHash } from './eip712/index.js';
5
+ import { MakerTraits } from './maker-traits.js';
6
+ import { Extension } from './extensions/extension.js';
7
+ import { injectTrackCode } from './source-track.js';
8
+ import { Address } from '../address.js';
9
+ import { randBigInt } from '../utils/rand-bigint.js';
10
+ export class LimitOrder {
11
+ constructor(orderInfo, makerTraits = new MakerTraits(0n), extension = Extension.default(), config = {
12
+ /**
13
+ * When enabled, orders where maker == receiver will have ZERO_ADDRESS set
14
+ * Used to save calldata costs
15
+ */
16
+ optimizeReceiverAddress: true
17
+ }) {
18
+ this.extension = extension;
19
+ assert(!orderInfo.takerAsset.isNative(), `${orderInfo.takerAsset} can not be 'takerAsset'. Use wrapper address as 'takerAsset' and 'makerTraits.enableNativeUnwrap' to swap to NATIVE currency`);
20
+ assert(!orderInfo.makerAsset.isNative(), 'Maker asset can not be NATIVE, use wrapper');
21
+ this.makerAsset = orderInfo.makerAsset;
22
+ this.takerAsset = orderInfo.takerAsset;
23
+ this.makingAmount = orderInfo.makingAmount;
24
+ this.takingAmount = orderInfo.takingAmount;
25
+ this._salt = LimitOrder.verifySalt(orderInfo.salt || LimitOrder.buildSalt(extension), extension);
26
+ this.maker = orderInfo.maker;
27
+ if (config.optimizeReceiverAddress) {
28
+ this.receiver = orderInfo.receiver?.equal(orderInfo.maker)
29
+ ? Address.ZERO_ADDRESS
30
+ : orderInfo.receiver || Address.ZERO_ADDRESS;
31
+ }
32
+ else {
33
+ this.receiver = orderInfo.receiver || orderInfo.maker;
34
+ }
35
+ this.makerTraits = makerTraits;
36
+ assert(this.makingAmount <= UINT_256_MAX, 'makingAmount too big');
37
+ assert(this.takingAmount <= UINT_256_MAX, 'takingAmount too big');
38
+ if (!extension.isEmpty()) {
39
+ this.makerTraits.withExtension();
40
+ }
41
+ }
42
+ get salt() {
43
+ return this._salt;
44
+ }
45
+ /**
46
+ * Build correct salt for order
47
+ *
48
+ * If order has extension - it is crucial to build correct salt
49
+ * otherwise order won't be ever filled
50
+ *
51
+ * @see https://github.com/1inch/limit-order-protocol/blob/7bc5129ae19832338169ca21e4cf6331e8ff44f6/contracts/OrderLib.sol#L153
52
+ *
53
+ */
54
+ static buildSalt(extension, baseSalt = randBigInt((1n << 96n) - 1n)) {
55
+ if (extension.isEmpty()) {
56
+ return baseSalt;
57
+ }
58
+ return (baseSalt << 160n) | (extension.keccak256() & UINT_160_MAX);
59
+ }
60
+ static verifySalt(salt, extension) {
61
+ assert(salt <= UINT_256_MAX, 'salt too big');
62
+ if (extension.isEmpty()) {
63
+ return salt;
64
+ }
65
+ const hash = salt & UINT_160_MAX;
66
+ const expectedHash = extension.keccak256() & UINT_160_MAX;
67
+ assert(hash === expectedHash, 'invalid salt: lowest 160 bits should be extension hash');
68
+ return salt;
69
+ }
70
+ static fromNative(chainId, nativeOrderFactory, orderInfo, makerTraits, extension) {
71
+ const _orderInfo = {
72
+ ...orderInfo,
73
+ makerAsset: LimitOrder.CHAIN_TO_WRAPPER[chainId],
74
+ receiver: orderInfo.receiver && !orderInfo.receiver.isZero()
75
+ ? orderInfo.receiver
76
+ : orderInfo.maker
77
+ };
78
+ // create temp order to calc order hash
79
+ const _order = new LimitOrder(_orderInfo, makerTraits, extension, {
80
+ optimizeReceiverAddress: false
81
+ });
82
+ const finalOrderInfo = {
83
+ ..._orderInfo,
84
+ salt: _order.salt,
85
+ maker: nativeOrderFactory.getProxyAddress(_order.getOrderHash(chainId))
86
+ };
87
+ return new LimitOrder(finalOrderInfo, makerTraits, extension, {
88
+ optimizeReceiverAddress: false
89
+ });
90
+ }
91
+ static isNativeOrder(chainId, nativeOrderFactory, order, signature) {
92
+ try {
93
+ const orderWithRealMaker = LimitOrder.fromCalldata(signature);
94
+ const expectedAddress = nativeOrderFactory.getProxyAddress(orderWithRealMaker.getOrderHash(chainId));
95
+ return expectedAddress.equal(new Address(order.maker));
96
+ }
97
+ catch {
98
+ return false;
99
+ }
100
+ }
101
+ static fromCalldata(bytes) {
102
+ assert(isHexString(bytes), 'Bytes should be valid hex string with 0x prefix');
103
+ const info = AbiCoder.defaultAbiCoder().decode([LimitOrder.Web3Type], bytes);
104
+ const order = info[0];
105
+ return new LimitOrder({
106
+ salt: order.salt ? BigInt(order.salt) : undefined,
107
+ maker: new Address(order.maker),
108
+ receiver: new Address(order.receiver),
109
+ takingAmount: BigInt(order.takingAmount),
110
+ makingAmount: BigInt(order.makingAmount),
111
+ takerAsset: new Address(order.takerAsset),
112
+ makerAsset: new Address(order.makerAsset)
113
+ }, new MakerTraits(BigInt(order.makerTraits)), undefined, { optimizeReceiverAddress: false });
114
+ }
115
+ static fromDataAndExtension(data, extension) {
116
+ return new LimitOrder({
117
+ salt: BigInt(data.salt),
118
+ maker: new Address(data.maker),
119
+ receiver: new Address(data.receiver),
120
+ takingAmount: BigInt(data.takingAmount),
121
+ makingAmount: BigInt(data.makingAmount),
122
+ takerAsset: new Address(data.takerAsset),
123
+ makerAsset: new Address(data.makerAsset)
124
+ }, new MakerTraits(BigInt(data.makerTraits)), extension, { optimizeReceiverAddress: false });
125
+ }
126
+ isNative(chainId, nativeOrderFactory, signature) {
127
+ return LimitOrder.isNativeOrder(chainId, nativeOrderFactory, this.build(), signature);
128
+ }
129
+ /**
130
+ * Returns signature for submitting native order on-chain
131
+ * Only valid if order is native
132
+ *
133
+ * @see FusionOrder.isNative
134
+ * @see FusionOrder.fromNative
135
+ */
136
+ nativeSignature(maker) {
137
+ return new LimitOrder({
138
+ maker,
139
+ makerAsset: this.makerAsset,
140
+ makingAmount: this.makingAmount,
141
+ takingAmount: this.takingAmount,
142
+ takerAsset: this.takerAsset,
143
+ receiver: this.receiver,
144
+ salt: this.salt
145
+ }, this.makerTraits, undefined, { optimizeReceiverAddress: false }).toCalldata();
146
+ }
147
+ /**
148
+ * Injects source info to order `salt` [224, 255] bits
149
+ * check `getTrackCodeForSource` implementation for exact injected data
150
+ *
151
+ * @param source order source identifier
152
+ * @see getTrackCodeForSource
153
+ */
154
+ setSource(source) {
155
+ this._salt = injectTrackCode(this.salt, source);
156
+ return this;
157
+ }
158
+ toCalldata() {
159
+ return AbiCoder.defaultAbiCoder().encode([LimitOrder.Web3Type], [this.build()]);
160
+ }
161
+ build() {
162
+ return {
163
+ maker: this.maker.toString(),
164
+ makerAsset: this.makerAsset.toString(),
165
+ takerAsset: this.takerAsset.toString(),
166
+ makerTraits: (this.makerTraits?.asBigInt() || 0n).toString(),
167
+ salt: this.salt.toString(),
168
+ makingAmount: this.makingAmount.toString(),
169
+ takingAmount: this.takingAmount.toString(),
170
+ receiver: this.receiver.toString()
171
+ };
172
+ }
173
+ getTypedData(chainId) {
174
+ const domain = getLimitOrderV4Domain(chainId);
175
+ return buildOrderTypedData(domain.chainId, domain.verifyingContract, domain.name, domain.version, this.build());
176
+ }
177
+ getOrderHash(chainId) {
178
+ return getOrderHash(this.getTypedData(chainId));
179
+ }
180
+ /**
181
+ * Returns true if only a specific address can fill order
182
+ */
183
+ isPrivate() {
184
+ return this.makerTraits.isPrivate();
185
+ }
186
+ }
187
+ LimitOrder.CHAIN_TO_WRAPPER = {
188
+ [1]: new Address('0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'),
189
+ [56]: new Address('0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c'),
190
+ [137]: new Address('0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270'),
191
+ [42161]: new Address('0x82af49447d8a07e3bd95bd0d56f35241523fbab1'),
192
+ [43114]: new Address('0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7'),
193
+ [100]: new Address('0xe91d153e0b41518a2ce8dd3d7944fa863463a97d'),
194
+ [8453]: new Address('0x4200000000000000000000000000000000000006'),
195
+ [10]: new Address('0x4200000000000000000000000000000000000006'),
196
+ [250]: new Address('0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83'),
197
+ [324]: new Address('0x5aea5775959fbc2557cc8789bc1bf90a239d9a91'),
198
+ [59144]: new Address('0xe5d7c2a44ffddf6b295a15c148167daaaf5cf34f'),
199
+ [130]: new Address('0x4200000000000000000000000000000000000006'),
200
+ [146]: new Address('0x039e2fb66102314ce7b64ce5ce3e5183bc94ad38')
201
+ };
202
+ LimitOrder.Web3Type = `tuple(${[
203
+ 'uint256 salt',
204
+ 'address maker',
205
+ 'address receiver',
206
+ 'address makerAsset',
207
+ 'address takerAsset',
208
+ 'uint256 makingAmount',
209
+ 'uint256 takingAmount',
210
+ 'uint256 makerTraits'
211
+ ]})`;
@@ -0,0 +1 @@
1
+ export {};