@velora-dex/sdk 9.3.6 → 9.4.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 (132) hide show
  1. package/README.md +2 -0
  2. package/dist/examples/externalDelta.d.ts +2 -0
  3. package/dist/examples/externalDelta.d.ts.map +1 -0
  4. package/dist/examples/helpers/delta.d.ts +2 -2
  5. package/dist/examples/helpers/delta.d.ts.map +1 -1
  6. package/dist/index.d.ts +11 -6
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/methods/delta/buildDeltaOrder.d.ts +4 -10
  9. package/dist/methods/delta/buildDeltaOrder.d.ts.map +1 -1
  10. package/dist/methods/delta/buildExternalDeltaOrder.d.ts +46 -0
  11. package/dist/methods/delta/buildExternalDeltaOrder.d.ts.map +1 -0
  12. package/dist/methods/delta/getDeltaOrders.d.ts +14 -6
  13. package/dist/methods/delta/getDeltaOrders.d.ts.map +1 -1
  14. package/dist/methods/delta/helpers/abi.d.ts +16 -0
  15. package/dist/methods/delta/helpers/abi.d.ts.map +1 -0
  16. package/dist/methods/delta/helpers/buildDeltaOrderData.d.ts +0 -1
  17. package/dist/methods/delta/helpers/buildDeltaOrderData.d.ts.map +1 -1
  18. package/dist/methods/delta/helpers/buildExternalOrderData.d.ts +34 -0
  19. package/dist/methods/delta/helpers/buildExternalOrderData.d.ts.map +1 -0
  20. package/dist/methods/delta/helpers/misc.d.ts +43 -0
  21. package/dist/methods/delta/helpers/misc.d.ts.map +1 -1
  22. package/dist/methods/delta/helpers/types.d.ts +74 -3
  23. package/dist/methods/delta/helpers/types.d.ts.map +1 -1
  24. package/dist/methods/delta/index.d.ts +19 -3
  25. package/dist/methods/delta/index.d.ts.map +1 -1
  26. package/dist/methods/delta/postDeltaOrder.d.ts +4 -9
  27. package/dist/methods/delta/postDeltaOrder.d.ts.map +1 -1
  28. package/dist/methods/delta/postExternalDeltaOrder.d.ts +11 -0
  29. package/dist/methods/delta/postExternalDeltaOrder.d.ts.map +1 -0
  30. package/dist/methods/delta/preSignDeltaOrder.d.ts.map +1 -1
  31. package/dist/methods/delta/preSignExternalDeltaOrder.d.ts +17 -0
  32. package/dist/methods/delta/preSignExternalDeltaOrder.d.ts.map +1 -0
  33. package/dist/methods/delta/signExternalDeltaOrder.d.ts +9 -0
  34. package/dist/methods/delta/signExternalDeltaOrder.d.ts.map +1 -0
  35. package/dist/methods/limitOrders/approveForOrder.d.ts +2 -0
  36. package/dist/methods/limitOrders/approveForOrder.d.ts.map +1 -1
  37. package/dist/methods/limitOrders/buildOrder.d.ts +3 -0
  38. package/dist/methods/limitOrders/buildOrder.d.ts.map +1 -1
  39. package/dist/methods/limitOrders/cancelOrder.d.ts +2 -0
  40. package/dist/methods/limitOrders/cancelOrder.d.ts.map +1 -1
  41. package/dist/methods/limitOrders/fillOrderDirectly.d.ts +2 -0
  42. package/dist/methods/limitOrders/fillOrderDirectly.d.ts.map +1 -1
  43. package/dist/methods/limitOrders/getOrders.d.ts +2 -0
  44. package/dist/methods/limitOrders/getOrders.d.ts.map +1 -1
  45. package/dist/methods/limitOrders/getOrdersContract.d.ts +2 -0
  46. package/dist/methods/limitOrders/getOrdersContract.d.ts.map +1 -1
  47. package/dist/methods/limitOrders/index.d.ts +7 -1
  48. package/dist/methods/limitOrders/index.d.ts.map +1 -1
  49. package/dist/methods/limitOrders/postOrder.d.ts +2 -0
  50. package/dist/methods/limitOrders/postOrder.d.ts.map +1 -1
  51. package/dist/methods/limitOrders/signOrder.d.ts +2 -0
  52. package/dist/methods/limitOrders/signOrder.d.ts.map +1 -1
  53. package/dist/methods/limitOrders/transaction.d.ts +2 -0
  54. package/dist/methods/limitOrders/transaction.d.ts.map +1 -1
  55. package/dist/methods/nftOrders/approveForOrder.d.ts +2 -0
  56. package/dist/methods/nftOrders/approveForOrder.d.ts.map +1 -1
  57. package/dist/methods/nftOrders/buildOrder.d.ts +3 -0
  58. package/dist/methods/nftOrders/buildOrder.d.ts.map +1 -1
  59. package/dist/methods/nftOrders/cancelOrder.d.ts +2 -0
  60. package/dist/methods/nftOrders/cancelOrder.d.ts.map +1 -1
  61. package/dist/methods/nftOrders/getOrders.d.ts +2 -0
  62. package/dist/methods/nftOrders/getOrders.d.ts.map +1 -1
  63. package/dist/methods/nftOrders/getOrdersContract.d.ts +2 -0
  64. package/dist/methods/nftOrders/getOrdersContract.d.ts.map +1 -1
  65. package/dist/methods/nftOrders/helpers/misc.d.ts +1 -0
  66. package/dist/methods/nftOrders/helpers/misc.d.ts.map +1 -1
  67. package/dist/methods/nftOrders/index.d.ts +7 -1
  68. package/dist/methods/nftOrders/index.d.ts.map +1 -1
  69. package/dist/methods/nftOrders/postOrder.d.ts +2 -0
  70. package/dist/methods/nftOrders/postOrder.d.ts.map +1 -1
  71. package/dist/methods/nftOrders/signOrder.d.ts +2 -0
  72. package/dist/methods/nftOrders/signOrder.d.ts.map +1 -1
  73. package/dist/methods/nftOrders/transaction.d.ts +2 -0
  74. package/dist/methods/nftOrders/transaction.d.ts.map +1 -1
  75. package/dist/sdk/full.d.ts +2 -0
  76. package/dist/sdk/full.d.ts.map +1 -1
  77. package/dist/sdk/partial.d.ts +2 -0
  78. package/dist/sdk/partial.d.ts.map +1 -1
  79. package/dist/sdk/simple.d.ts +6 -0
  80. package/dist/sdk/simple.d.ts.map +1 -1
  81. package/dist/sdk.cjs.development.js +657 -95
  82. package/dist/sdk.cjs.development.js.map +1 -1
  83. package/dist/sdk.cjs.production.min.js +1 -1
  84. package/dist/sdk.cjs.production.min.js.map +1 -1
  85. package/dist/sdk.esm.js +653 -96
  86. package/dist/sdk.esm.js.map +1 -1
  87. package/package.json +1 -1
  88. package/src/constants.js +8 -0
  89. package/src/examples/delta.ts +9 -20
  90. package/src/examples/externalDelta.ts +162 -0
  91. package/src/examples/helpers/delta.ts +8 -4
  92. package/src/gas.js +1 -0
  93. package/src/index.js +142 -0
  94. package/src/index.ts +40 -3
  95. package/src/methods/delta/buildDeltaOrder.ts +13 -61
  96. package/src/methods/delta/buildExternalDeltaOrder.ts +124 -0
  97. package/src/methods/delta/getDeltaOrders.ts +31 -13
  98. package/src/methods/delta/helpers/abi.ts +20 -0
  99. package/src/methods/delta/helpers/buildDeltaOrderData.ts +3 -35
  100. package/src/methods/delta/helpers/buildExternalOrderData.ts +129 -0
  101. package/src/methods/delta/helpers/misc.ts +210 -0
  102. package/src/methods/delta/helpers/types.ts +87 -8
  103. package/src/methods/delta/index.ts +82 -3
  104. package/src/methods/delta/postDeltaOrder.ts +9 -11
  105. package/src/methods/delta/postExternalDeltaOrder.ts +45 -0
  106. package/src/methods/delta/preSignDeltaOrder.ts +1 -21
  107. package/src/methods/delta/preSignExternalDeltaOrder.ts +141 -0
  108. package/src/methods/delta/signExternalDeltaOrder.ts +35 -0
  109. package/src/methods/limitOrders/approveForOrder.ts +2 -0
  110. package/src/methods/limitOrders/buildOrder.ts +3 -0
  111. package/src/methods/limitOrders/cancelOrder.ts +2 -0
  112. package/src/methods/limitOrders/fillOrderDirectly.ts +2 -0
  113. package/src/methods/limitOrders/getOrders.ts +2 -0
  114. package/src/methods/limitOrders/getOrdersContract.ts +2 -0
  115. package/src/methods/limitOrders/index.ts +7 -1
  116. package/src/methods/limitOrders/postOrder.ts +2 -0
  117. package/src/methods/limitOrders/signOrder.ts +2 -0
  118. package/src/methods/limitOrders/transaction.ts +2 -0
  119. package/src/methods/nftOrders/approveForOrder.ts +2 -0
  120. package/src/methods/nftOrders/buildOrder.ts +3 -0
  121. package/src/methods/nftOrders/cancelOrder.ts +2 -0
  122. package/src/methods/nftOrders/getOrders.ts +2 -0
  123. package/src/methods/nftOrders/getOrdersContract.ts +2 -0
  124. package/src/methods/nftOrders/helpers/misc.ts +1 -0
  125. package/src/methods/nftOrders/index.ts +7 -1
  126. package/src/methods/nftOrders/postOrder.ts +2 -0
  127. package/src/methods/nftOrders/signOrder.ts +2 -0
  128. package/src/methods/nftOrders/transaction.ts +2 -0
  129. package/src/sdk/full.ts +2 -0
  130. package/src/sdk/partial.ts +2 -0
  131. package/src/sdk/simple.ts +6 -0
  132. package/src/types.js +1 -0
@@ -0,0 +1,124 @@
1
+ import type { ConstructFetchInput, RequestParameters } from '../../types';
2
+ import { constructGetDeltaContract } from './getDeltaContract';
3
+ import type { DeltaPrice } from './getDeltaPrice';
4
+ import { constructGetPartnerFee } from './getPartnerFee';
5
+ import {
6
+ buildExternalOrderSignableData,
7
+ type BuildExternalOrderDataInput,
8
+ type SignableExternalOrderData,
9
+ } from './helpers/buildExternalOrderData';
10
+ import type { AmountsWithSlippage } from './helpers/types';
11
+ import { SwapSideToOrderKind } from './helpers/types';
12
+ import type { MarkOptional } from 'ts-essentials';
13
+ import { resolvePartnerFee, resolveAmounts } from './helpers/misc';
14
+ export type { SignableExternalOrderData } from './helpers/buildExternalOrderData';
15
+
16
+ type BuildExternalDeltaOrderParamsBase = {
17
+ /** @description The address of the order owner */
18
+ owner: string;
19
+ /** @description The address of the external handler contract */
20
+ handler: string;
21
+ /** @description Protocol-specific encoded bytes for the external handler */
22
+ data: string;
23
+ /** @description The address of the src token */
24
+ srcToken: string;
25
+ /** @description The address of the dest token */
26
+ destToken: string;
27
+ /** @description The deadline for the order */
28
+ deadline?: number;
29
+ /** @description The nonce of the order */
30
+ nonce?: number | string;
31
+ /** @description Optional permit signature for the src token */
32
+ permit?: string;
33
+ /** @description Partner string */
34
+ partner?: string;
35
+ /** @description partner fee in basis points (bps), 50bps=0.5% */
36
+ partnerFeeBps?: number;
37
+ /** @description partner address */
38
+ partnerAddress?: string;
39
+ /** @description take surplus */
40
+ partnerTakesSurplus?: boolean;
41
+ /** @description A boolean indicating whether the surplus should be capped. True by default */
42
+ capSurplus?: boolean;
43
+ /** @description Metadata for the order, hex string */
44
+ metadata?: string;
45
+
46
+ /** @description price response received from /delta/prices (getDeltaPrice method) */
47
+ deltaPrice: MarkOptional<
48
+ Pick<
49
+ DeltaPrice,
50
+ 'destAmount' | 'partner' | 'partnerFee' | 'destToken' | 'srcAmount'
51
+ >,
52
+ 'partner' | 'partnerFee'
53
+ >;
54
+ };
55
+
56
+ export type BuildExternalDeltaOrderParams = BuildExternalDeltaOrderParamsBase &
57
+ AmountsWithSlippage;
58
+
59
+ type BuildExternalDeltaOrder = (
60
+ buildOrderParams: BuildExternalDeltaOrderParams,
61
+ requestParams?: RequestParameters
62
+ ) => Promise<SignableExternalOrderData>;
63
+
64
+ export type BuildExternalDeltaOrderFunctions = {
65
+ /** @description Build External Orders to be posted to Delta API for execution */
66
+ buildExternalDeltaOrder: BuildExternalDeltaOrder;
67
+ };
68
+
69
+ export const constructBuildExternalDeltaOrder = (
70
+ options: ConstructFetchInput
71
+ ): BuildExternalDeltaOrderFunctions => {
72
+ const { chainId } = options;
73
+
74
+ // cached internally
75
+ const { getDeltaContract } = constructGetDeltaContract(options);
76
+ // cached internally for `partner`
77
+ const { getPartnerFee } = constructGetPartnerFee(options);
78
+
79
+ const buildExternalDeltaOrder: BuildExternalDeltaOrder = async (
80
+ options,
81
+ requestParams
82
+ ) => {
83
+ const ParaswapDelta = await getDeltaContract(requestParams);
84
+ if (!ParaswapDelta) {
85
+ throw new Error(`Delta is not available on chain ${chainId}`);
86
+ }
87
+
88
+ const { partnerAddress, partnerFeeBps, partnerTakesSurplus } =
89
+ await resolvePartnerFee(options, getPartnerFee, requestParams);
90
+
91
+ const { srcAmount, destAmount, expectedAmount, swapSide } =
92
+ resolveAmounts(options);
93
+
94
+ const input: BuildExternalOrderDataInput = {
95
+ owner: options.owner,
96
+ handler: options.handler,
97
+ srcToken: options.srcToken,
98
+ destToken: options.deltaPrice.destToken,
99
+ srcAmount,
100
+ destAmount,
101
+ expectedAmount,
102
+ deadline: options.deadline,
103
+ nonce: options.nonce?.toString(10),
104
+ permit: options.permit,
105
+ kind: SwapSideToOrderKind[swapSide],
106
+ metadata: options.metadata,
107
+ data: options.data,
108
+
109
+ chainId,
110
+ paraswapDeltaAddress: ParaswapDelta,
111
+ partnerAddress,
112
+ partnerTakesSurplus,
113
+ partnerFeeBps,
114
+
115
+ capSurplus: options.capSurplus,
116
+ };
117
+
118
+ return buildExternalOrderSignableData(input);
119
+ };
120
+
121
+ return {
122
+ buildExternalDeltaOrder,
123
+ };
124
+ };
@@ -5,9 +5,14 @@ import type {
5
5
  ConstructFetchInput,
6
6
  RequestParameters,
7
7
  } from '../../types';
8
- import type { DeltaAuction, DeltaAuctionStatus } from './helpers/types';
8
+ import type {
9
+ DeltaAuction,
10
+ DeltaAuctionStatus,
11
+ OnChainOrderType,
12
+ } from './helpers/types';
9
13
 
10
- export type DeltaOrderFromAPI = Omit<DeltaAuction, 'signature'>;
14
+ /** @deprecated Use DeltaAuction directly */
15
+ export type DeltaOrderFromAPI = DeltaAuction;
11
16
 
12
17
  export type DeltaOrderFilterByStatus =
13
18
  | DeltaAuctionStatus
@@ -20,14 +25,14 @@ export type DeltaOrderFilterByStatus =
20
25
  type GetDeltaOrderById = (
21
26
  orderId: string,
22
27
  requestParams?: RequestParameters
23
- ) => Promise<DeltaOrderFromAPI>;
28
+ ) => Promise<DeltaAuction>;
24
29
 
25
30
  type GetDeltaOrderByHash = (
26
31
  orderHash: string,
27
32
  requestParams?: RequestParameters
28
- ) => Promise<DeltaOrderFromAPI>;
33
+ ) => Promise<DeltaAuction>;
29
34
 
30
- type OrdersFilter = {
35
+ type OrdersFilter<T extends OnChainOrderType = OnChainOrderType> = {
31
36
  /** @description Order.owner to fetch Delta Order for */
32
37
  userAddress: Address;
33
38
  /** @description Pagination option, page. Default 1 */
@@ -48,16 +53,23 @@ type OrdersFilter = {
48
53
  status?: DeltaOrderFilterByStatus[];
49
54
  /** @description Filter by type. MARKET, LIMIT. Orders with both types are returned if not specified */
50
55
  type?: 'MARKET' | 'LIMIT';
56
+ /** @description Filter by on-chain order type. Order, ExternalOrder. Orders of all types are returned if not specified */
57
+ onChainOrderType?: T;
51
58
  };
52
59
  type OrderFiltersQuery = Omit<OrdersFilter, 'chainId' | 'status'> & {
53
60
  chainId?: string;
54
61
  status?: string;
55
62
  };
56
63
 
57
- type GetDeltaOrders = (
58
- options: OrdersFilter,
59
- requestParams?: RequestParameters
60
- ) => Promise<DeltaOrderFromAPI[]>;
64
+ type GetDeltaOrders = {
65
+ <T extends OnChainOrderType>(
66
+ options: OrdersFilter<T> & { onChainOrderType: T },
67
+ requestParams?: RequestParameters
68
+ ): Promise<DeltaAuction<T>[]>;
69
+ (options: OrdersFilter, requestParams?: RequestParameters): Promise<
70
+ DeltaAuction[]
71
+ >;
72
+ };
61
73
 
62
74
  type GetRequiredBalanceParams = {
63
75
  userAddress: Address;
@@ -89,7 +101,7 @@ export const constructGetDeltaOrders = ({
89
101
  ) => {
90
102
  const fetchURL = `${baseUrl}/${orderId}` as const;
91
103
 
92
- const order = await fetcher<DeltaOrderFromAPI>({
104
+ const order = await fetcher<DeltaAuction>({
93
105
  url: fetchURL,
94
106
  method: 'GET',
95
107
  requestParams,
@@ -104,7 +116,7 @@ export const constructGetDeltaOrders = ({
104
116
  ) => {
105
117
  const fetchURL = `${baseUrl}/hash/${orderHash}` as const;
106
118
 
107
- const order = await fetcher<DeltaOrderFromAPI>({
119
+ const order = await fetcher<DeltaAuction>({
108
120
  url: fetchURL,
109
121
  method: 'GET',
110
122
  requestParams,
@@ -113,7 +125,12 @@ export const constructGetDeltaOrders = ({
113
125
  return order;
114
126
  };
115
127
 
116
- const getDeltaOrders: GetDeltaOrders = async (options, requestParams) => {
128
+ const getDeltaOrders: GetDeltaOrders = async <
129
+ T extends OnChainOrderType = OnChainOrderType
130
+ >(
131
+ options: OrdersFilter<T>,
132
+ requestParams?: RequestParameters
133
+ ) => {
117
134
  const chainIdString = options.chainId?.join(',');
118
135
  const statusString = options.status?.join(',');
119
136
 
@@ -122,13 +139,14 @@ export const constructGetDeltaOrders = ({
122
139
  page: options.page,
123
140
  limit: options.limit,
124
141
  type: options.type,
142
+ onChainOrderType: options.onChainOrderType,
125
143
  chainId: chainIdString,
126
144
  status: statusString,
127
145
  });
128
146
 
129
147
  const fetchURL = `${baseUrl}${search}` as const;
130
148
 
131
- const orders = await fetcher<DeltaOrderFromAPI[]>({
149
+ const orders = await fetcher<DeltaAuction<T>[]>({
132
150
  url: fetchURL,
133
151
  method: 'GET',
134
152
  requestParams,
@@ -0,0 +1,20 @@
1
+ export const PreSignatureModuleAbi = [
2
+ {
3
+ inputs: [
4
+ {
5
+ internalType: 'bytes32',
6
+ name: 'orderHash',
7
+ type: 'bytes32',
8
+ },
9
+ {
10
+ internalType: 'bool',
11
+ name: 'preSigned',
12
+ type: 'bool',
13
+ },
14
+ ],
15
+ name: 'setPreSignature',
16
+ outputs: [],
17
+ stateMutability: 'nonpayable',
18
+ type: 'function',
19
+ },
20
+ ] as const;
@@ -1,6 +1,7 @@
1
1
  import { MarkOptional } from 'ts-essentials';
2
- import { Domain, ZERO_ADDRESS } from '../../common/orders/buildOrderData';
2
+ import { Domain } from '../../common/orders/buildOrderData';
3
3
  import { Bridge, DeltaAuctionOrder } from './types';
4
+ import { DELTA_DEFAULT_EXPIRY, producePartnerAndFee } from './misc';
4
5
 
5
6
  // Order(address owner,address beneficiary,address srcToken,address destToken,uint256 srcAmount,uint256 destAmount,uint256 deadline,uint256 nonce,bytes permit, bridge Bridge)";
6
7
  const SWAP_ORDER_EIP_712_TYPES = {
@@ -64,7 +65,7 @@ export function produceDeltaOrderTypedData({
64
65
  chainId,
65
66
  paraswapDeltaAddress,
66
67
  }: SignDeltaOrderInput): SignableDeltaOrderData {
67
- const typedData = {
68
+ return {
68
69
  types: {
69
70
  Order: SWAP_ORDER_EIP_712_TYPES.Order,
70
71
  Bridge: SWAP_ORDER_EIP_712_TYPES.Bridge,
@@ -77,8 +78,6 @@ export function produceDeltaOrderTypedData({
77
78
  },
78
79
  data: orderInput,
79
80
  };
80
-
81
- return typedData;
82
81
  }
83
82
 
84
83
  export type DeltaOrderDataInput = MarkOptional<
@@ -99,9 +98,6 @@ export type BuildDeltaOrderDataInput = MarkOptional<
99
98
  bridge: Bridge;
100
99
  };
101
100
 
102
- // default deadline = 1 hour for now (may be changed later)
103
- export const DELTA_DEFAULT_EXPIRY = 60 * 60; // seconds
104
-
105
101
  export function buildDeltaSignableOrderData({
106
102
  owner,
107
103
  beneficiary = owner,
@@ -157,31 +153,3 @@ export function buildDeltaSignableOrderData({
157
153
  paraswapDeltaAddress,
158
154
  });
159
155
  }
160
-
161
- type ProducePartnerAndFeeInput = {
162
- partnerFeeBps: number;
163
- partnerAddress: string;
164
- partnerTakesSurplus: boolean;
165
- capSurplus: boolean;
166
- };
167
-
168
- // fee and address are encoded together
169
- function producePartnerAndFee({
170
- partnerFeeBps,
171
- partnerAddress,
172
- partnerTakesSurplus,
173
- capSurplus,
174
- }: ProducePartnerAndFeeInput): string {
175
- const capSurplusShifted = BigInt(capSurplus) << BigInt(9);
176
- if (partnerAddress === ZERO_ADDRESS) {
177
- return capSurplusShifted.toString(10);
178
- } else {
179
- const partnerAndFee =
180
- (BigInt(partnerAddress) << BigInt(96)) |
181
- BigInt(partnerFeeBps.toFixed(0)) |
182
- (BigInt(partnerTakesSurplus) << BigInt(8)) |
183
- capSurplusShifted;
184
-
185
- return partnerAndFee.toString(10);
186
- }
187
- }
@@ -0,0 +1,129 @@
1
+ import { MarkOptional } from 'ts-essentials';
2
+ import { Domain } from '../../common/orders/buildOrderData';
3
+ import { ExternalDeltaOrder } from './types';
4
+ import { DELTA_DEFAULT_EXPIRY, producePartnerAndFee } from './misc';
5
+
6
+ const EXTERNAL_ORDER_EIP_712_TYPES = {
7
+ ExternalOrder: [
8
+ { name: 'owner', type: 'address' },
9
+ { name: 'handler', type: 'address' },
10
+ { name: 'srcToken', type: 'address' },
11
+ { name: 'destToken', type: 'address' },
12
+ { name: 'srcAmount', type: 'uint256' },
13
+ { name: 'destAmount', type: 'uint256' },
14
+ { name: 'expectedAmount', type: 'uint256' },
15
+ { name: 'deadline', type: 'uint256' },
16
+ { name: 'kind', type: 'uint8' },
17
+ { name: 'nonce', type: 'uint256' },
18
+ { name: 'partnerAndFee', type: 'uint256' },
19
+ { name: 'permit', type: 'bytes' },
20
+ { name: 'metadata', type: 'bytes' },
21
+ { name: 'data', type: 'bytes' },
22
+ ],
23
+ };
24
+
25
+ export type SignableExternalOrderData = {
26
+ types: {
27
+ ExternalOrder: typeof EXTERNAL_ORDER_EIP_712_TYPES.ExternalOrder;
28
+ };
29
+ domain: Domain;
30
+ data: ExternalDeltaOrder;
31
+ };
32
+
33
+ type SignExternalOrderInput = {
34
+ orderInput: ExternalDeltaOrder;
35
+ paraswapDeltaAddress: string;
36
+ chainId: number;
37
+ };
38
+
39
+ export function produceExternalOrderTypedData({
40
+ orderInput,
41
+ chainId,
42
+ paraswapDeltaAddress,
43
+ }: SignExternalOrderInput): SignableExternalOrderData {
44
+ return {
45
+ types: {
46
+ ExternalOrder: EXTERNAL_ORDER_EIP_712_TYPES.ExternalOrder,
47
+ },
48
+ domain: {
49
+ name: 'Portikus',
50
+ version: '2.0.0',
51
+ chainId,
52
+ verifyingContract: paraswapDeltaAddress,
53
+ },
54
+ data: orderInput,
55
+ };
56
+ }
57
+
58
+ export type ExternalOrderDataInput = MarkOptional<
59
+ Omit<ExternalDeltaOrder, 'partnerAndFee'>,
60
+ 'deadline' | 'nonce' | 'permit'
61
+ >;
62
+
63
+ export type BuildExternalOrderDataInput = MarkOptional<
64
+ ExternalOrderDataInput,
65
+ 'metadata'
66
+ > & {
67
+ partnerAddress: string;
68
+ paraswapDeltaAddress: string;
69
+ partnerFeeBps: number;
70
+ partnerTakesSurplus?: boolean;
71
+ capSurplus?: boolean;
72
+ chainId: number;
73
+ };
74
+
75
+ export function buildExternalOrderSignableData({
76
+ owner,
77
+ handler,
78
+
79
+ srcToken,
80
+ destToken,
81
+ srcAmount,
82
+ destAmount,
83
+ expectedAmount,
84
+
85
+ deadline = Math.floor(Date.now() / 1000 + DELTA_DEFAULT_EXPIRY),
86
+ nonce = Date.now().toString(10),
87
+
88
+ permit = '0x',
89
+
90
+ kind,
91
+ metadata = '0x',
92
+ data,
93
+
94
+ partnerAddress,
95
+ partnerFeeBps,
96
+ partnerTakesSurplus = false,
97
+ capSurplus = true,
98
+
99
+ chainId,
100
+ paraswapDeltaAddress,
101
+ }: BuildExternalOrderDataInput): SignableExternalOrderData {
102
+ const orderInput: ExternalDeltaOrder = {
103
+ owner,
104
+ handler,
105
+ srcToken,
106
+ destToken,
107
+ srcAmount,
108
+ destAmount,
109
+ expectedAmount,
110
+ deadline,
111
+ nonce,
112
+ permit,
113
+ partnerAndFee: producePartnerAndFee({
114
+ partnerFeeBps,
115
+ partnerAddress,
116
+ partnerTakesSurplus,
117
+ capSurplus,
118
+ }),
119
+ kind,
120
+ metadata,
121
+ data,
122
+ };
123
+
124
+ return produceExternalOrderTypedData({
125
+ orderInput,
126
+ chainId,
127
+ paraswapDeltaAddress,
128
+ });
129
+ }
@@ -1,4 +1,179 @@
1
+ import { ZERO_ADDRESS } from '../../common/orders/buildOrderData';
1
2
  import type { SignableDeltaOrderData } from './buildDeltaOrderData';
3
+ import type { SignableExternalOrderData } from './buildExternalOrderData';
4
+ import type { GetPartnerFeeFunctions } from '../getPartnerFee';
5
+ import type { RequestParameters } from '../../../types';
6
+ import type { AmountsWithSlippage, SwapSideUnion } from './types';
7
+ import { SwapSide } from '../../../constants';
8
+ import { assert } from 'ts-essentials';
9
+
10
+ // default deadline = 10 min
11
+ export const DELTA_DEFAULT_EXPIRY = 10 * 60; // seconds
12
+
13
+ type ProducePartnerAndFeeInput = {
14
+ partnerFeeBps: number;
15
+ partnerAddress: string;
16
+ partnerTakesSurplus: boolean;
17
+ capSurplus: boolean;
18
+ };
19
+
20
+ // fee and address are encoded together
21
+ export function producePartnerAndFee({
22
+ partnerFeeBps,
23
+ partnerAddress,
24
+ partnerTakesSurplus,
25
+ capSurplus,
26
+ }: ProducePartnerAndFeeInput): string {
27
+ const capSurplusShifted = BigInt(capSurplus) << BigInt(9);
28
+ if (partnerAddress === ZERO_ADDRESS) {
29
+ return capSurplusShifted.toString(10);
30
+ } else {
31
+ const partnerAndFee =
32
+ (BigInt(partnerAddress) << BigInt(96)) |
33
+ BigInt(partnerFeeBps.toFixed(0)) |
34
+ (BigInt(partnerTakesSurplus) << BigInt(8)) |
35
+ capSurplusShifted;
36
+
37
+ return partnerAndFee.toString(10);
38
+ }
39
+ }
40
+
41
+ type ApplySlippageInput = {
42
+ amount: string;
43
+ slippageBps: number;
44
+ increase: boolean;
45
+ };
46
+
47
+ function applySlippage({
48
+ amount,
49
+ slippageBps,
50
+ increase,
51
+ }: ApplySlippageInput): string {
52
+ assert(
53
+ Number.isInteger(slippageBps) && slippageBps >= 0 && slippageBps <= 10_000,
54
+ 'slippageBps must be an integer between 0 and 10_000'
55
+ );
56
+
57
+ const BPS_BASE = 10_000n;
58
+ const amt = BigInt(amount);
59
+ const bps = BigInt(slippageBps);
60
+
61
+ return increase
62
+ ? ((amt * (BPS_BASE + bps)) / BPS_BASE).toString(10)
63
+ : ((amt * (BPS_BASE - bps)) / BPS_BASE).toString(10);
64
+ }
65
+
66
+ export type ResolvePartnerFeeInput = {
67
+ partnerAddress?: string;
68
+ partnerFeeBps?: number;
69
+ partnerTakesSurplus?: boolean;
70
+ partner?: string;
71
+ deltaPrice: { partner?: string; partnerFee?: number };
72
+ };
73
+
74
+ export type ResolvedPartnerFee = {
75
+ partnerAddress: string;
76
+ partnerFeeBps: number;
77
+ partnerTakesSurplus: boolean;
78
+ };
79
+
80
+ export async function resolvePartnerFee(
81
+ options: ResolvePartnerFeeInput,
82
+ getPartnerFee: GetPartnerFeeFunctions['getPartnerFee'],
83
+ requestParams?: RequestParameters
84
+ ): Promise<ResolvedPartnerFee> {
85
+ // externally supplied partner fee data takes precedence
86
+ let partnerAddress = options.partnerAddress;
87
+ let partnerFeeBps =
88
+ options.partnerFeeBps ??
89
+ (options.deltaPrice.partnerFee
90
+ ? options.deltaPrice.partnerFee * 100
91
+ : undefined);
92
+ let partnerTakesSurplus = options.partnerTakesSurplus;
93
+
94
+ // if fee given, takeSurplus is ignored
95
+ const feeOrTakeSurplusSupplied =
96
+ partnerFeeBps !== undefined || partnerTakesSurplus !== undefined;
97
+
98
+ if (partnerAddress === undefined || feeOrTakeSurplusSupplied) {
99
+ const partner = options.partner || options.deltaPrice.partner;
100
+ if (!partner) {
101
+ // if no partner given in options or deltaPrice, default partnerAddress to zero,
102
+ // unless supplied explicitly
103
+ partnerAddress = partnerAddress ?? ZERO_ADDRESS;
104
+ } else {
105
+ const partnerFeeResponse = await getPartnerFee(
106
+ { partner },
107
+ requestParams
108
+ );
109
+
110
+ partnerAddress = partnerAddress ?? partnerFeeResponse.partnerAddress;
111
+ // deltaPrice.partnerFee and partnerFeeResponse.partnerFee should be the same, but give priority to externally provided
112
+ partnerFeeBps = partnerFeeBps ?? partnerFeeResponse.partnerFee * 100;
113
+ partnerTakesSurplus =
114
+ partnerTakesSurplus ?? partnerFeeResponse.takeSurplus;
115
+ }
116
+ }
117
+
118
+ return {
119
+ partnerAddress: partnerAddress!,
120
+ partnerFeeBps: partnerFeeBps ?? 0,
121
+ partnerTakesSurplus: partnerTakesSurplus ?? false,
122
+ };
123
+ }
124
+
125
+ export type ResolveAmountsInput = AmountsWithSlippage & {
126
+ deltaPrice: { destAmount: string; srcAmount: string };
127
+ };
128
+
129
+ export type ResolvedAmounts = {
130
+ srcAmount: string;
131
+ destAmount: string;
132
+ expectedAmount: string;
133
+ swapSide: SwapSideUnion;
134
+ };
135
+
136
+ export function resolveAmounts(options: ResolveAmountsInput): ResolvedAmounts {
137
+ let srcAmount: string;
138
+ let destAmount: string;
139
+
140
+ const swapSide: SwapSideUnion =
141
+ options.slippage !== undefined
142
+ ? options.srcAmount !== undefined
143
+ ? SwapSide.SELL
144
+ : SwapSide.BUY
145
+ : options.side ?? SwapSide.SELL;
146
+
147
+ if (options.slippage !== undefined) {
148
+ if (options.srcAmount !== undefined) {
149
+ // SELL with slippage: destAmount auto-computed
150
+ srcAmount = options.srcAmount;
151
+ destAmount = applySlippage({
152
+ amount: options.deltaPrice.destAmount,
153
+ slippageBps: options.slippage,
154
+ increase: false,
155
+ });
156
+ } else {
157
+ // BUY with slippage: srcAmount auto-computed
158
+ destAmount = options.destAmount;
159
+ srcAmount = applySlippage({
160
+ amount: options.deltaPrice.srcAmount,
161
+ slippageBps: options.slippage,
162
+ increase: true,
163
+ });
164
+ }
165
+ } else {
166
+ srcAmount = options.srcAmount;
167
+ destAmount = options.destAmount;
168
+ }
169
+
170
+ const expectedAmount =
171
+ swapSide === SwapSide.SELL
172
+ ? options.deltaPrice.destAmount
173
+ : options.deltaPrice.srcAmount;
174
+
175
+ return { srcAmount, destAmount, expectedAmount, swapSide };
176
+ }
2
177
 
3
178
  export function sanitizeDeltaOrderData({
4
179
  owner,
@@ -34,3 +209,38 @@ export function sanitizeDeltaOrderData({
34
209
  metadata,
35
210
  };
36
211
  }
212
+
213
+ export function sanitizeExternalOrderData({
214
+ owner,
215
+ handler,
216
+ srcToken,
217
+ destToken,
218
+ srcAmount,
219
+ destAmount,
220
+ expectedAmount,
221
+ deadline,
222
+ nonce,
223
+ permit,
224
+ partnerAndFee,
225
+ kind,
226
+ metadata,
227
+ data,
228
+ }: SignableExternalOrderData['data'] &
229
+ Record<string, any>): SignableExternalOrderData['data'] {
230
+ return {
231
+ owner,
232
+ handler,
233
+ srcToken,
234
+ destToken,
235
+ srcAmount,
236
+ destAmount,
237
+ expectedAmount,
238
+ deadline,
239
+ nonce,
240
+ permit,
241
+ partnerAndFee,
242
+ kind,
243
+ metadata,
244
+ data,
245
+ };
246
+ }