@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.
- package/README.md +2 -0
- package/dist/examples/externalDelta.d.ts +2 -0
- package/dist/examples/externalDelta.d.ts.map +1 -0
- package/dist/examples/helpers/delta.d.ts +2 -2
- package/dist/examples/helpers/delta.d.ts.map +1 -1
- package/dist/index.d.ts +11 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/methods/delta/buildDeltaOrder.d.ts +4 -10
- package/dist/methods/delta/buildDeltaOrder.d.ts.map +1 -1
- package/dist/methods/delta/buildExternalDeltaOrder.d.ts +46 -0
- package/dist/methods/delta/buildExternalDeltaOrder.d.ts.map +1 -0
- package/dist/methods/delta/getDeltaOrders.d.ts +14 -6
- package/dist/methods/delta/getDeltaOrders.d.ts.map +1 -1
- package/dist/methods/delta/helpers/abi.d.ts +16 -0
- package/dist/methods/delta/helpers/abi.d.ts.map +1 -0
- package/dist/methods/delta/helpers/buildDeltaOrderData.d.ts +0 -1
- package/dist/methods/delta/helpers/buildDeltaOrderData.d.ts.map +1 -1
- package/dist/methods/delta/helpers/buildExternalOrderData.d.ts +34 -0
- package/dist/methods/delta/helpers/buildExternalOrderData.d.ts.map +1 -0
- package/dist/methods/delta/helpers/misc.d.ts +43 -0
- package/dist/methods/delta/helpers/misc.d.ts.map +1 -1
- package/dist/methods/delta/helpers/types.d.ts +74 -3
- package/dist/methods/delta/helpers/types.d.ts.map +1 -1
- package/dist/methods/delta/index.d.ts +19 -3
- package/dist/methods/delta/index.d.ts.map +1 -1
- package/dist/methods/delta/postDeltaOrder.d.ts +4 -9
- package/dist/methods/delta/postDeltaOrder.d.ts.map +1 -1
- package/dist/methods/delta/postExternalDeltaOrder.d.ts +11 -0
- package/dist/methods/delta/postExternalDeltaOrder.d.ts.map +1 -0
- package/dist/methods/delta/preSignDeltaOrder.d.ts.map +1 -1
- package/dist/methods/delta/preSignExternalDeltaOrder.d.ts +17 -0
- package/dist/methods/delta/preSignExternalDeltaOrder.d.ts.map +1 -0
- package/dist/methods/delta/signExternalDeltaOrder.d.ts +9 -0
- package/dist/methods/delta/signExternalDeltaOrder.d.ts.map +1 -0
- package/dist/methods/limitOrders/approveForOrder.d.ts +2 -0
- package/dist/methods/limitOrders/approveForOrder.d.ts.map +1 -1
- package/dist/methods/limitOrders/buildOrder.d.ts +3 -0
- package/dist/methods/limitOrders/buildOrder.d.ts.map +1 -1
- package/dist/methods/limitOrders/cancelOrder.d.ts +2 -0
- package/dist/methods/limitOrders/cancelOrder.d.ts.map +1 -1
- package/dist/methods/limitOrders/fillOrderDirectly.d.ts +2 -0
- package/dist/methods/limitOrders/fillOrderDirectly.d.ts.map +1 -1
- package/dist/methods/limitOrders/getOrders.d.ts +2 -0
- package/dist/methods/limitOrders/getOrders.d.ts.map +1 -1
- package/dist/methods/limitOrders/getOrdersContract.d.ts +2 -0
- package/dist/methods/limitOrders/getOrdersContract.d.ts.map +1 -1
- package/dist/methods/limitOrders/index.d.ts +7 -1
- package/dist/methods/limitOrders/index.d.ts.map +1 -1
- package/dist/methods/limitOrders/postOrder.d.ts +2 -0
- package/dist/methods/limitOrders/postOrder.d.ts.map +1 -1
- package/dist/methods/limitOrders/signOrder.d.ts +2 -0
- package/dist/methods/limitOrders/signOrder.d.ts.map +1 -1
- package/dist/methods/limitOrders/transaction.d.ts +2 -0
- package/dist/methods/limitOrders/transaction.d.ts.map +1 -1
- package/dist/methods/nftOrders/approveForOrder.d.ts +2 -0
- package/dist/methods/nftOrders/approveForOrder.d.ts.map +1 -1
- package/dist/methods/nftOrders/buildOrder.d.ts +3 -0
- package/dist/methods/nftOrders/buildOrder.d.ts.map +1 -1
- package/dist/methods/nftOrders/cancelOrder.d.ts +2 -0
- package/dist/methods/nftOrders/cancelOrder.d.ts.map +1 -1
- package/dist/methods/nftOrders/getOrders.d.ts +2 -0
- package/dist/methods/nftOrders/getOrders.d.ts.map +1 -1
- package/dist/methods/nftOrders/getOrdersContract.d.ts +2 -0
- package/dist/methods/nftOrders/getOrdersContract.d.ts.map +1 -1
- package/dist/methods/nftOrders/helpers/misc.d.ts +1 -0
- package/dist/methods/nftOrders/helpers/misc.d.ts.map +1 -1
- package/dist/methods/nftOrders/index.d.ts +7 -1
- package/dist/methods/nftOrders/index.d.ts.map +1 -1
- package/dist/methods/nftOrders/postOrder.d.ts +2 -0
- package/dist/methods/nftOrders/postOrder.d.ts.map +1 -1
- package/dist/methods/nftOrders/signOrder.d.ts +2 -0
- package/dist/methods/nftOrders/signOrder.d.ts.map +1 -1
- package/dist/methods/nftOrders/transaction.d.ts +2 -0
- package/dist/methods/nftOrders/transaction.d.ts.map +1 -1
- package/dist/sdk/full.d.ts +2 -0
- package/dist/sdk/full.d.ts.map +1 -1
- package/dist/sdk/partial.d.ts +2 -0
- package/dist/sdk/partial.d.ts.map +1 -1
- package/dist/sdk/simple.d.ts +6 -0
- package/dist/sdk/simple.d.ts.map +1 -1
- package/dist/sdk.cjs.development.js +657 -95
- package/dist/sdk.cjs.development.js.map +1 -1
- package/dist/sdk.cjs.production.min.js +1 -1
- package/dist/sdk.cjs.production.min.js.map +1 -1
- package/dist/sdk.esm.js +653 -96
- package/dist/sdk.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/constants.js +8 -0
- package/src/examples/delta.ts +9 -20
- package/src/examples/externalDelta.ts +162 -0
- package/src/examples/helpers/delta.ts +8 -4
- package/src/gas.js +1 -0
- package/src/index.js +142 -0
- package/src/index.ts +40 -3
- package/src/methods/delta/buildDeltaOrder.ts +13 -61
- package/src/methods/delta/buildExternalDeltaOrder.ts +124 -0
- package/src/methods/delta/getDeltaOrders.ts +31 -13
- package/src/methods/delta/helpers/abi.ts +20 -0
- package/src/methods/delta/helpers/buildDeltaOrderData.ts +3 -35
- package/src/methods/delta/helpers/buildExternalOrderData.ts +129 -0
- package/src/methods/delta/helpers/misc.ts +210 -0
- package/src/methods/delta/helpers/types.ts +87 -8
- package/src/methods/delta/index.ts +82 -3
- package/src/methods/delta/postDeltaOrder.ts +9 -11
- package/src/methods/delta/postExternalDeltaOrder.ts +45 -0
- package/src/methods/delta/preSignDeltaOrder.ts +1 -21
- package/src/methods/delta/preSignExternalDeltaOrder.ts +141 -0
- package/src/methods/delta/signExternalDeltaOrder.ts +35 -0
- package/src/methods/limitOrders/approveForOrder.ts +2 -0
- package/src/methods/limitOrders/buildOrder.ts +3 -0
- package/src/methods/limitOrders/cancelOrder.ts +2 -0
- package/src/methods/limitOrders/fillOrderDirectly.ts +2 -0
- package/src/methods/limitOrders/getOrders.ts +2 -0
- package/src/methods/limitOrders/getOrdersContract.ts +2 -0
- package/src/methods/limitOrders/index.ts +7 -1
- package/src/methods/limitOrders/postOrder.ts +2 -0
- package/src/methods/limitOrders/signOrder.ts +2 -0
- package/src/methods/limitOrders/transaction.ts +2 -0
- package/src/methods/nftOrders/approveForOrder.ts +2 -0
- package/src/methods/nftOrders/buildOrder.ts +3 -0
- package/src/methods/nftOrders/cancelOrder.ts +2 -0
- package/src/methods/nftOrders/getOrders.ts +2 -0
- package/src/methods/nftOrders/getOrdersContract.ts +2 -0
- package/src/methods/nftOrders/helpers/misc.ts +1 -0
- package/src/methods/nftOrders/index.ts +7 -1
- package/src/methods/nftOrders/postOrder.ts +2 -0
- package/src/methods/nftOrders/signOrder.ts +2 -0
- package/src/methods/nftOrders/transaction.ts +2 -0
- package/src/sdk/full.ts +2 -0
- package/src/sdk/partial.ts +2 -0
- package/src/sdk/simple.ts +6 -0
- 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 {
|
|
8
|
+
import type {
|
|
9
|
+
DeltaAuction,
|
|
10
|
+
DeltaAuctionStatus,
|
|
11
|
+
OnChainOrderType,
|
|
12
|
+
} from './helpers/types';
|
|
9
13
|
|
|
10
|
-
|
|
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<
|
|
28
|
+
) => Promise<DeltaAuction>;
|
|
24
29
|
|
|
25
30
|
type GetDeltaOrderByHash = (
|
|
26
31
|
orderHash: string,
|
|
27
32
|
requestParams?: RequestParameters
|
|
28
|
-
) => Promise<
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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<
|
|
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<
|
|
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
|
|
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<
|
|
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
|
|
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
|
-
|
|
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
|
+
}
|