@velora-dex/sdk 8.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.
- package/LICENSE +7 -0
- package/README.md +494 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/examples/customFetcher.d.ts +3 -0
- package/dist/examples/customFetcher.d.ts.map +1 -0
- package/dist/examples/delta.d.ts +2 -0
- package/dist/examples/delta.d.ts.map +1 -0
- package/dist/examples/ethersV6.d.ts +2 -0
- package/dist/examples/ethersV6.d.ts.map +1 -0
- package/dist/examples/limitOrders_all.d.ts +2 -0
- package/dist/examples/limitOrders_all.d.ts.map +1 -0
- package/dist/examples/limitOrders_partial.d.ts +2 -0
- package/dist/examples/limitOrders_partial.d.ts.map +1 -0
- package/dist/examples/limitOrders_postOrder.d.ts +2 -0
- package/dist/examples/limitOrders_postOrder.d.ts.map +1 -0
- package/dist/examples/partial.d.ts +2 -0
- package/dist/examples/partial.d.ts.map +1 -0
- package/dist/examples/quote.d.ts +2 -0
- package/dist/examples/quote.d.ts.map +1 -0
- package/dist/examples/sdk.d.ts +2 -0
- package/dist/examples/sdk.d.ts.map +1 -0
- package/dist/examples/simple.d.ts +2 -0
- package/dist/examples/simple.d.ts.map +1 -0
- package/dist/examples/simpleQuote.d.ts +2 -0
- package/dist/examples/simpleQuote.d.ts.map +1 -0
- package/dist/examples/viem.d.ts +2 -0
- package/dist/examples/viem.d.ts.map +1 -0
- package/dist/examples/wagmi.d.ts +43 -0
- package/dist/examples/wagmi.d.ts.map +1 -0
- package/dist/examples/web3.d.ts +2 -0
- package/dist/examples/web3.d.ts.map +1 -0
- package/dist/gas.d.ts +8 -0
- package/dist/gas.d.ts.map +1 -0
- package/dist/helpers/approve.d.ts +8 -0
- package/dist/helpers/approve.d.ts.map +1 -0
- package/dist/helpers/fetchers/axios.d.ts +5 -0
- package/dist/helpers/fetchers/axios.d.ts.map +1 -0
- package/dist/helpers/fetchers/fetch.d.ts +5 -0
- package/dist/helpers/fetchers/fetch.d.ts.map +1 -0
- package/dist/helpers/index.d.ts +13 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/misc.d.ts +48 -0
- package/dist/helpers/misc.d.ts.map +1 -0
- package/dist/helpers/providers/ethers.d.ts +10 -0
- package/dist/helpers/providers/ethers.d.ts.map +1 -0
- package/dist/helpers/providers/ethersV6.d.ts +8 -0
- package/dist/helpers/providers/ethersV6.d.ts.map +1 -0
- package/dist/helpers/providers/helpers.d.ts +3 -0
- package/dist/helpers/providers/helpers.d.ts.map +1 -0
- package/dist/helpers/providers/viem.d.ts +23 -0
- package/dist/helpers/providers/viem.d.ts.map +1 -0
- package/dist/helpers/providers/web3.d.ts +9 -0
- package/dist/helpers/providers/web3.d.ts.map +1 -0
- package/dist/helpers/token.d.ts +38 -0
- package/dist/helpers/token.d.ts.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/methods/common/orders/buildOrderData.d.ts +27 -0
- package/dist/methods/common/orders/buildOrderData.d.ts.map +1 -0
- package/dist/methods/common/orders/encoding.d.ts +23 -0
- package/dist/methods/common/orders/encoding.d.ts.map +1 -0
- package/dist/methods/common/orders/misc.d.ts +27 -0
- package/dist/methods/common/orders/misc.d.ts.map +1 -0
- package/dist/methods/common/orders/signature.d.ts +9 -0
- package/dist/methods/common/orders/signature.d.ts.map +1 -0
- package/dist/methods/common/orders/types.d.ts +8 -0
- package/dist/methods/common/orders/types.d.ts.map +1 -0
- package/dist/methods/delta/approveForDelta.d.ts +8 -0
- package/dist/methods/delta/approveForDelta.d.ts.map +1 -0
- package/dist/methods/delta/buildCrosschainOrderBridge.d.ts +23 -0
- package/dist/methods/delta/buildCrosschainOrderBridge.d.ts.map +1 -0
- package/dist/methods/delta/buildDeltaOrder.d.ts +49 -0
- package/dist/methods/delta/buildDeltaOrder.d.ts.map +1 -0
- package/dist/methods/delta/getBridgeInfo.d.ts +9 -0
- package/dist/methods/delta/getBridgeInfo.d.ts.map +1 -0
- package/dist/methods/delta/getDeltaContract.d.ts +9 -0
- package/dist/methods/delta/getDeltaContract.d.ts.map +1 -0
- package/dist/methods/delta/getDeltaOrders.d.ts +22 -0
- package/dist/methods/delta/getDeltaOrders.d.ts.map +1 -0
- package/dist/methods/delta/getDeltaPrice.d.ts +58 -0
- package/dist/methods/delta/getDeltaPrice.d.ts.map +1 -0
- package/dist/methods/delta/getMulticallHandlers.d.ts +9 -0
- package/dist/methods/delta/getMulticallHandlers.d.ts.map +1 -0
- package/dist/methods/delta/getPartnerFee.d.ts +16 -0
- package/dist/methods/delta/getPartnerFee.d.ts.map +1 -0
- package/dist/methods/delta/helpers/across.d.ts +22 -0
- package/dist/methods/delta/helpers/across.d.ts.map +1 -0
- package/dist/methods/delta/helpers/buildDeltaOrderData.d.ts +35 -0
- package/dist/methods/delta/helpers/buildDeltaOrderData.d.ts.map +1 -0
- package/dist/methods/delta/helpers/composePermit.d.ts +5 -0
- package/dist/methods/delta/helpers/composePermit.d.ts.map +1 -0
- package/dist/methods/delta/helpers/misc.d.ts +3 -0
- package/dist/methods/delta/helpers/misc.d.ts.map +1 -0
- package/dist/methods/delta/helpers/types.d.ts +96 -0
- package/dist/methods/delta/helpers/types.d.ts.map +1 -0
- package/dist/methods/delta/index.d.ts +28 -0
- package/dist/methods/delta/index.d.ts.map +1 -0
- package/dist/methods/delta/isTokenSupportedInDelta.d.ts +8 -0
- package/dist/methods/delta/isTokenSupportedInDelta.d.ts.map +1 -0
- package/dist/methods/delta/postDeltaOrder.d.ts +23 -0
- package/dist/methods/delta/postDeltaOrder.d.ts.map +1 -0
- package/dist/methods/delta/signDeltaOrder.d.ts +12 -0
- package/dist/methods/delta/signDeltaOrder.d.ts.map +1 -0
- package/dist/methods/limitOrders/approveForOrder.d.ts +12 -0
- package/dist/methods/limitOrders/approveForOrder.d.ts.map +1 -0
- package/dist/methods/limitOrders/buildOrder.d.ts +11 -0
- package/dist/methods/limitOrders/buildOrder.d.ts.map +1 -0
- package/dist/methods/limitOrders/cancelOrder.d.ts +9 -0
- package/dist/methods/limitOrders/cancelOrder.d.ts.map +1 -0
- package/dist/methods/limitOrders/fillOrderDirectly.d.ts +30 -0
- package/dist/methods/limitOrders/fillOrderDirectly.d.ts.map +1 -0
- package/dist/methods/limitOrders/getOrders.d.ts +39 -0
- package/dist/methods/limitOrders/getOrders.d.ts.map +1 -0
- package/dist/methods/limitOrders/getOrdersContract.d.ts +8 -0
- package/dist/methods/limitOrders/getOrdersContract.d.ts.map +1 -0
- package/dist/methods/limitOrders/helpers/buildOrderData.d.ts +43 -0
- package/dist/methods/limitOrders/helpers/buildOrderData.d.ts.map +1 -0
- package/dist/methods/limitOrders/helpers/misc.d.ts +9 -0
- package/dist/methods/limitOrders/helpers/misc.d.ts.map +1 -0
- package/dist/methods/limitOrders/helpers/types.d.ts +49 -0
- package/dist/methods/limitOrders/helpers/types.d.ts.map +1 -0
- package/dist/methods/limitOrders/index.d.ts +30 -0
- package/dist/methods/limitOrders/index.d.ts.map +1 -0
- package/dist/methods/limitOrders/postOrder.d.ts +10 -0
- package/dist/methods/limitOrders/postOrder.d.ts.map +1 -0
- package/dist/methods/limitOrders/signOrder.d.ts +7 -0
- package/dist/methods/limitOrders/signOrder.d.ts.map +1 -0
- package/dist/methods/limitOrders/transaction.d.ts +23 -0
- package/dist/methods/limitOrders/transaction.d.ts.map +1 -0
- package/dist/methods/nftOrders/approveForOrder.d.ts +12 -0
- package/dist/methods/nftOrders/approveForOrder.d.ts.map +1 -0
- package/dist/methods/nftOrders/buildOrder.d.ts +11 -0
- package/dist/methods/nftOrders/buildOrder.d.ts.map +1 -0
- package/dist/methods/nftOrders/cancelOrder.d.ts +8 -0
- package/dist/methods/nftOrders/cancelOrder.d.ts.map +1 -0
- package/dist/methods/nftOrders/getOrders.d.ts +18 -0
- package/dist/methods/nftOrders/getOrders.d.ts.map +1 -0
- package/dist/methods/nftOrders/getOrdersContract.d.ts +8 -0
- package/dist/methods/nftOrders/getOrdersContract.d.ts.map +1 -0
- package/dist/methods/nftOrders/helpers/buildOrderData.d.ts +52 -0
- package/dist/methods/nftOrders/helpers/buildOrderData.d.ts.map +1 -0
- package/dist/methods/nftOrders/helpers/misc.d.ts +13 -0
- package/dist/methods/nftOrders/helpers/misc.d.ts.map +1 -0
- package/dist/methods/nftOrders/helpers/types.d.ts +39 -0
- package/dist/methods/nftOrders/helpers/types.d.ts.map +1 -0
- package/dist/methods/nftOrders/index.d.ts +23 -0
- package/dist/methods/nftOrders/index.d.ts.map +1 -0
- package/dist/methods/nftOrders/postOrder.d.ts +10 -0
- package/dist/methods/nftOrders/postOrder.d.ts.map +1 -0
- package/dist/methods/nftOrders/signOrder.d.ts +7 -0
- package/dist/methods/nftOrders/signOrder.d.ts.map +1 -0
- package/dist/methods/nftOrders/transaction.d.ts +23 -0
- package/dist/methods/nftOrders/transaction.d.ts.map +1 -0
- package/dist/methods/quote/getQuote.d.ts +51 -0
- package/dist/methods/quote/getQuote.d.ts.map +1 -0
- package/dist/methods/swap/adapters.d.ts +8 -0
- package/dist/methods/swap/adapters.d.ts.map +1 -0
- package/dist/methods/swap/approve.d.ts +10 -0
- package/dist/methods/swap/approve.d.ts.map +1 -0
- package/dist/methods/swap/balance.d.ts +23 -0
- package/dist/methods/swap/balance.d.ts.map +1 -0
- package/dist/methods/swap/helpers/normalizeRateOptions.d.ts +12 -0
- package/dist/methods/swap/helpers/normalizeRateOptions.d.ts.map +1 -0
- package/dist/methods/swap/index.d.ts +13 -0
- package/dist/methods/swap/index.d.ts.map +1 -0
- package/dist/methods/swap/rates.d.ts +52 -0
- package/dist/methods/swap/rates.d.ts.map +1 -0
- package/dist/methods/swap/spender.d.ts +21 -0
- package/dist/methods/swap/spender.d.ts.map +1 -0
- package/dist/methods/swap/swapTx.d.ts +158 -0
- package/dist/methods/swap/swapTx.d.ts.map +1 -0
- package/dist/methods/swap/token.d.ts +8 -0
- package/dist/methods/swap/token.d.ts.map +1 -0
- package/dist/methods/swap/transaction.d.ts +115 -0
- package/dist/methods/swap/transaction.d.ts.map +1 -0
- package/dist/sdk/full.d.ts +17 -0
- package/dist/sdk/full.d.ts.map +1 -0
- package/dist/sdk/partial.d.ts +31 -0
- package/dist/sdk/partial.d.ts.map +1 -0
- package/dist/sdk/simple.d.ts +75 -0
- package/dist/sdk/simple.d.ts.map +1 -0
- package/dist/sdk.cjs.development.js +5182 -0
- package/dist/sdk.cjs.development.js.map +1 -0
- package/dist/sdk.cjs.production.min.js +2 -0
- package/dist/sdk.cjs.production.min.js.map +1 -0
- package/dist/sdk.esm.js +5102 -0
- package/dist/sdk.esm.js.map +1 -0
- package/dist/types.d.ts +161 -0
- package/dist/types.d.ts.map +1 -0
- package/docs/DELTA.md +207 -0
- package/package.json +126 -0
- package/src/constants.ts +16 -0
- package/src/examples/customFetcher.ts +44 -0
- package/src/examples/delta.ts +127 -0
- package/src/examples/ethersV6.ts +38 -0
- package/src/examples/limitOrders_all.ts +135 -0
- package/src/examples/limitOrders_partial.ts +171 -0
- package/src/examples/limitOrders_postOrder.ts +77 -0
- package/src/examples/partial.ts +34 -0
- package/src/examples/quote.ts +205 -0
- package/src/examples/sdk.ts +39 -0
- package/src/examples/simple.ts +44 -0
- package/src/examples/simpleQuote.ts +98 -0
- package/src/examples/viem.ts +120 -0
- package/src/examples/wagmi.ts +68 -0
- package/src/examples/web3.ts +32 -0
- package/src/gas.ts +7 -0
- package/src/helpers/approve.ts +60 -0
- package/src/helpers/fetchers/axios.ts +34 -0
- package/src/helpers/fetchers/fetch.ts +67 -0
- package/src/helpers/index.ts +27 -0
- package/src/helpers/misc.ts +160 -0
- package/src/helpers/providers/ethers.ts +192 -0
- package/src/helpers/providers/ethersV6.ts +121 -0
- package/src/helpers/providers/helpers.ts +36 -0
- package/src/helpers/providers/viem.ts +205 -0
- package/src/helpers/providers/web3.ts +154 -0
- package/src/helpers/token.ts +75 -0
- package/src/index.ts +425 -0
- package/src/methods/common/orders/buildOrderData.ts +29 -0
- package/src/methods/common/orders/encoding.ts +216 -0
- package/src/methods/common/orders/misc.ts +86 -0
- package/src/methods/common/orders/signature.ts +68 -0
- package/src/methods/common/orders/types.ts +13 -0
- package/src/methods/delta/approveForDelta.ts +38 -0
- package/src/methods/delta/buildCrosschainOrderBridge.ts +84 -0
- package/src/methods/delta/buildDeltaOrder.ts +192 -0
- package/src/methods/delta/getBridgeInfo.ts +38 -0
- package/src/methods/delta/getDeltaContract.ts +29 -0
- package/src/methods/delta/getDeltaOrders.ts +102 -0
- package/src/methods/delta/getDeltaPrice.ts +122 -0
- package/src/methods/delta/getMulticallHandlers.ts +44 -0
- package/src/methods/delta/getPartnerFee.ts +58 -0
- package/src/methods/delta/helpers/across.ts +255 -0
- package/src/methods/delta/helpers/buildDeltaOrderData.ts +153 -0
- package/src/methods/delta/helpers/composePermit.ts +76 -0
- package/src/methods/delta/helpers/misc.ts +32 -0
- package/src/methods/delta/helpers/types.ts +110 -0
- package/src/methods/delta/index.ts +146 -0
- package/src/methods/delta/isTokenSupportedInDelta.ts +54 -0
- package/src/methods/delta/postDeltaOrder.ts +50 -0
- package/src/methods/delta/signDeltaOrder.ts +41 -0
- package/src/methods/limitOrders/approveForOrder.ts +36 -0
- package/src/methods/limitOrders/buildOrder.ts +56 -0
- package/src/methods/limitOrders/cancelOrder.ts +111 -0
- package/src/methods/limitOrders/fillOrderDirectly.ts +277 -0
- package/src/methods/limitOrders/getOrders.ts +151 -0
- package/src/methods/limitOrders/getOrdersContract.ts +20 -0
- package/src/methods/limitOrders/helpers/buildOrderData.ts +121 -0
- package/src/methods/limitOrders/helpers/misc.ts +64 -0
- package/src/methods/limitOrders/helpers/types.ts +70 -0
- package/src/methods/limitOrders/index.ts +154 -0
- package/src/methods/limitOrders/postOrder.ts +74 -0
- package/src/methods/limitOrders/signOrder.ts +29 -0
- package/src/methods/limitOrders/transaction.ts +231 -0
- package/src/methods/nftOrders/approveForOrder.ts +79 -0
- package/src/methods/nftOrders/buildOrder.ts +52 -0
- package/src/methods/nftOrders/cancelOrder.ts +23 -0
- package/src/methods/nftOrders/getOrders.ts +84 -0
- package/src/methods/nftOrders/getOrdersContract.ts +24 -0
- package/src/methods/nftOrders/helpers/buildOrderData.ts +131 -0
- package/src/methods/nftOrders/helpers/misc.ts +92 -0
- package/src/methods/nftOrders/helpers/types.ts +50 -0
- package/src/methods/nftOrders/index.ts +139 -0
- package/src/methods/nftOrders/postOrder.ts +71 -0
- package/src/methods/nftOrders/signOrder.ts +29 -0
- package/src/methods/nftOrders/transaction.ts +234 -0
- package/src/methods/quote/getQuote.ts +131 -0
- package/src/methods/swap/adapters.ts +49 -0
- package/src/methods/swap/approve.ts +51 -0
- package/src/methods/swap/balance.ts +147 -0
- package/src/methods/swap/helpers/normalizeRateOptions.ts +55 -0
- package/src/methods/swap/index.ts +38 -0
- package/src/methods/swap/rates.ts +276 -0
- package/src/methods/swap/spender.ts +76 -0
- package/src/methods/swap/swapTx.ts +266 -0
- package/src/methods/swap/token.ts +35 -0
- package/src/methods/swap/transaction.ts +310 -0
- package/src/sdk/full.ts +54 -0
- package/src/sdk/partial.ts +107 -0
- package/src/sdk/simple.ts +429 -0
- package/src/types.ts +240 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { splitSignature } from './signature';
|
|
2
|
+
|
|
3
|
+
type EncodeEIP_2612PermitFunctionInput = {
|
|
4
|
+
permitSignature: string;
|
|
5
|
+
owner: string;
|
|
6
|
+
spender: string;
|
|
7
|
+
value: string | bigint;
|
|
8
|
+
deadline: string | number | bigint;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
// encoding params for Token.permit() Permit1 function
|
|
12
|
+
export function encodeEIP_2612PermitFunctionInput({
|
|
13
|
+
owner,
|
|
14
|
+
spender,
|
|
15
|
+
value,
|
|
16
|
+
deadline,
|
|
17
|
+
permitSignature,
|
|
18
|
+
}: EncodeEIP_2612PermitFunctionInput): string {
|
|
19
|
+
const { v, r, s } = splitSignature(permitSignature);
|
|
20
|
+
|
|
21
|
+
const encodedOwner = encodeAddress(owner);
|
|
22
|
+
const encodedSpender = encodeAddress(spender);
|
|
23
|
+
const encodedValue = encodeUint256(value);
|
|
24
|
+
const encodedDeadline = encodeUint256(deadline.toString());
|
|
25
|
+
const encodedV = encodeUint8(v);
|
|
26
|
+
const encodedR = encodeBytes32(r);
|
|
27
|
+
const encodedS = encodeBytes32(s);
|
|
28
|
+
|
|
29
|
+
// Concatenate all encoded values, stripping the "0x" prefix from each (except the first one)
|
|
30
|
+
return (
|
|
31
|
+
'0x' +
|
|
32
|
+
[
|
|
33
|
+
encodedOwner,
|
|
34
|
+
encodedSpender,
|
|
35
|
+
encodedValue,
|
|
36
|
+
encodedDeadline,
|
|
37
|
+
encodedV,
|
|
38
|
+
encodedR,
|
|
39
|
+
encodedS,
|
|
40
|
+
]
|
|
41
|
+
.map((val) => val.slice(2)) // Remove "0x" prefix from each encoded value
|
|
42
|
+
.join('') // Concatenate the values
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
type EncodeDAIlikePermitFunctionInput = {
|
|
47
|
+
permitSignature: string;
|
|
48
|
+
holder: string;
|
|
49
|
+
spender: string;
|
|
50
|
+
nonce: number | bigint | string;
|
|
51
|
+
expiry: number | bigint | string;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// encoding params for DAIlike.permit() function
|
|
55
|
+
export function encodeDAIlikePermitFunctionInput({
|
|
56
|
+
permitSignature,
|
|
57
|
+
holder,
|
|
58
|
+
spender,
|
|
59
|
+
nonce,
|
|
60
|
+
expiry,
|
|
61
|
+
}: EncodeDAIlikePermitFunctionInput): string {
|
|
62
|
+
const { v, r, s } = splitSignature(permitSignature);
|
|
63
|
+
|
|
64
|
+
const encodedHolder = encodeAddress(holder);
|
|
65
|
+
const encodedSpender = encodeAddress(spender);
|
|
66
|
+
const encodedNonce = encodeUint256(nonce.toString());
|
|
67
|
+
const encodedExpiry = encodeUint256(expiry.toString());
|
|
68
|
+
const encodedV = encodeUint8(v);
|
|
69
|
+
const encodedR = encodeBytes32(r);
|
|
70
|
+
const encodedS = encodeBytes32(s);
|
|
71
|
+
|
|
72
|
+
// Concatenate all encoded values, stripping the "0x" prefix from each (except the first one)
|
|
73
|
+
return (
|
|
74
|
+
'0x' +
|
|
75
|
+
[
|
|
76
|
+
encodedHolder,
|
|
77
|
+
encodedSpender,
|
|
78
|
+
encodedNonce,
|
|
79
|
+
encodedExpiry,
|
|
80
|
+
encodeBool(true), //allowed=true
|
|
81
|
+
encodedV,
|
|
82
|
+
encodedR,
|
|
83
|
+
encodedS,
|
|
84
|
+
]
|
|
85
|
+
.map((val) => val.slice(2)) // Remove "0x" prefix from each encoded value
|
|
86
|
+
.join('') // Concatenate the values
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// encode an address (20 bytes) into 32 bytes
|
|
91
|
+
export function encodeAddress(address: string): string {
|
|
92
|
+
const strippedAddress = address.replace(/^0x/, ''); // Remove "0x" prefix
|
|
93
|
+
return '0x' + strippedAddress.toLowerCase().padStart(64, '0');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// encode a uint256 value
|
|
97
|
+
export function encodeUint256(value: string | bigint): string {
|
|
98
|
+
const bn = BigInt(value);
|
|
99
|
+
return '0x' + bn.toString(16).padStart(64, '0');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// encode a uint8 value
|
|
103
|
+
export function encodeUint8(value: number | bigint): string {
|
|
104
|
+
return '0x' + value.toString(16).padStart(64, '0');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// encode a bytes32 value
|
|
108
|
+
export function encodeBytes32(value: string): string {
|
|
109
|
+
const strippedValue = value.replace(/^0x/, ''); // Remove "0x" prefix
|
|
110
|
+
return '0x' + strippedValue.padStart(64, '0').toLowerCase();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
//encode a boolean
|
|
114
|
+
export function encodeBool(value: boolean): string {
|
|
115
|
+
const encodedValue = value ? '1' : '0';
|
|
116
|
+
// padded to 32 bytes
|
|
117
|
+
return '0x' + encodedValue.padStart(64, '0');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/*
|
|
121
|
+
const EIP_2612_PERMIT_ABI = [
|
|
122
|
+
{
|
|
123
|
+
constant: false,
|
|
124
|
+
inputs: [
|
|
125
|
+
{
|
|
126
|
+
name: 'owner',
|
|
127
|
+
type: 'address',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
name: 'spender',
|
|
131
|
+
type: 'address',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: 'value',
|
|
135
|
+
type: 'uint256',
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: 'deadline',
|
|
139
|
+
type: 'uint256',
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: 'v',
|
|
143
|
+
type: 'uint8',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: 'r',
|
|
147
|
+
type: 'bytes32',
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: 's',
|
|
151
|
+
type: 'bytes32',
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
name: 'permit',
|
|
155
|
+
outputs: [],
|
|
156
|
+
payable: false,
|
|
157
|
+
stateMutability: 'nonpayable',
|
|
158
|
+
type: 'function',
|
|
159
|
+
},
|
|
160
|
+
];
|
|
161
|
+
*/
|
|
162
|
+
|
|
163
|
+
/*
|
|
164
|
+
const DAI_EIP_2612_PERMIT_ABI = [
|
|
165
|
+
{
|
|
166
|
+
constant: false,
|
|
167
|
+
inputs: [
|
|
168
|
+
{
|
|
169
|
+
internalType: 'address',
|
|
170
|
+
name: 'holder',
|
|
171
|
+
type: 'address',
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
internalType: 'address',
|
|
175
|
+
name: 'spender',
|
|
176
|
+
type: 'address',
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
internalType: 'uint256',
|
|
180
|
+
name: 'nonce',
|
|
181
|
+
type: 'uint256',
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
internalType: 'uint256',
|
|
185
|
+
name: 'expiry',
|
|
186
|
+
type: 'uint256',
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
internalType: 'bool',
|
|
190
|
+
name: 'allowed',
|
|
191
|
+
type: 'bool',
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
internalType: 'uint8',
|
|
195
|
+
name: 'v',
|
|
196
|
+
type: 'uint8',
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
internalType: 'bytes32',
|
|
200
|
+
name: 'r',
|
|
201
|
+
type: 'bytes32',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
internalType: 'bytes32',
|
|
205
|
+
name: 's',
|
|
206
|
+
type: 'bytes32',
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
name: 'permit',
|
|
210
|
+
outputs: [],
|
|
211
|
+
payable: false,
|
|
212
|
+
stateMutability: 'nonpayable',
|
|
213
|
+
type: 'function',
|
|
214
|
+
},
|
|
215
|
+
];
|
|
216
|
+
*/
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { LimitOrderFromApi } from '../../limitOrders/helpers/types';
|
|
2
|
+
import { ZERO_ADDRESS } from './buildOrderData';
|
|
3
|
+
import type { OrderType } from './types';
|
|
4
|
+
|
|
5
|
+
type GetBaseFetchUrlInput = {
|
|
6
|
+
apiURL: string;
|
|
7
|
+
chainId: number;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export type BaseFetchUrlInputConstructor<Kind extends OrderKind> = (
|
|
11
|
+
params: GetBaseFetchUrlInput
|
|
12
|
+
) => UrlByTypeFunction<Kind>;
|
|
13
|
+
|
|
14
|
+
type OrderType2URLPart = {
|
|
15
|
+
LIMIT: 'orders';
|
|
16
|
+
P2P: 'p2p';
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
type OrderKind = 'nft' | 'ft';
|
|
20
|
+
|
|
21
|
+
export type BaseFetchUrl<
|
|
22
|
+
Kind extends OrderKind,
|
|
23
|
+
Type extends OrderType = OrderType
|
|
24
|
+
> = `${string}/${Kind}/${OrderType2URLPart[Type]}/${number}`;
|
|
25
|
+
|
|
26
|
+
export type MinFetchUrl<Kind extends OrderKind> = `${string}/${Kind}/order`;
|
|
27
|
+
export type OrderFillableBalanceFetchUrl<Kind extends OrderKind> =
|
|
28
|
+
`${string}/${Kind}/fillablebalance/${number}`;
|
|
29
|
+
|
|
30
|
+
interface UrlByTypeFunction<Kind extends OrderKind> {
|
|
31
|
+
(): MinFetchUrl<Kind>;
|
|
32
|
+
(type: 'LIMIT'): BaseFetchUrl<Kind, 'LIMIT'>;
|
|
33
|
+
(type: 'P2P'): BaseFetchUrl<Kind, 'P2P'>;
|
|
34
|
+
(type: OrderType): BaseFetchUrl<Kind>;
|
|
35
|
+
(type: 'fillablebalance'): OrderFillableBalanceFetchUrl<Kind>;
|
|
36
|
+
(type?: OrderType | 'fillablebalance'):
|
|
37
|
+
| BaseFetchUrl<Kind>
|
|
38
|
+
| MinFetchUrl<Kind>
|
|
39
|
+
| OrderFillableBalanceFetchUrl<Kind>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function baseFetchUrlGetterFactory<Kind extends OrderKind>(
|
|
43
|
+
orderKind: Kind
|
|
44
|
+
): BaseFetchUrlInputConstructor<Kind> {
|
|
45
|
+
return function constructBaseFetchUrlGetter({
|
|
46
|
+
chainId,
|
|
47
|
+
apiURL,
|
|
48
|
+
}: GetBaseFetchUrlInput): UrlByTypeFunction<Kind> {
|
|
49
|
+
function urlGetter(type: 'LIMIT'): BaseFetchUrl<Kind, 'LIMIT'>;
|
|
50
|
+
function urlGetter(type: 'P2P'): BaseFetchUrl<Kind, 'P2P'>;
|
|
51
|
+
function urlGetter(type: OrderType): BaseFetchUrl<Kind>;
|
|
52
|
+
function urlGetter(
|
|
53
|
+
type: 'fillablebalance'
|
|
54
|
+
): OrderFillableBalanceFetchUrl<Kind>;
|
|
55
|
+
function urlGetter(): MinFetchUrl<Kind>;
|
|
56
|
+
function urlGetter(
|
|
57
|
+
type?: OrderType | 'fillablebalance'
|
|
58
|
+
):
|
|
59
|
+
| BaseFetchUrl<Kind>
|
|
60
|
+
| MinFetchUrl<Kind>
|
|
61
|
+
| OrderFillableBalanceFetchUrl<Kind> {
|
|
62
|
+
if (!type) return `${apiURL}/${orderKind}/order` as const;
|
|
63
|
+
|
|
64
|
+
if (type === 'fillablebalance')
|
|
65
|
+
return `${apiURL}/${orderKind}/fillablebalance/${chainId}` as const;
|
|
66
|
+
|
|
67
|
+
const orderURLpart = type === 'LIMIT' ? 'orders' : 'p2p';
|
|
68
|
+
return `${apiURL}/${orderKind}/${orderURLpart}/${chainId}` as const;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return urlGetter;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// orders with taker = EOA address
|
|
76
|
+
// that can't be filled through AugustusSwapper,
|
|
77
|
+
// only through AugustusRFQ
|
|
78
|
+
export function isOrderFillableDirectlyOnRFQOnly(
|
|
79
|
+
order: Pick<LimitOrderFromApi, 'taker' | 'takerFromMeta'>
|
|
80
|
+
): boolean {
|
|
81
|
+
// with 0x taker fillable by anyone
|
|
82
|
+
if (order.taker === ZERO_ADDRESS) return false;
|
|
83
|
+
|
|
84
|
+
// same intended EOA taker and msg.sender taker
|
|
85
|
+
return order.taker.toLowerCase() === order.takerFromMeta.toLowerCase();
|
|
86
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
type SplitSignatureResult = {
|
|
2
|
+
v: number;
|
|
3
|
+
r: string;
|
|
4
|
+
s: string;
|
|
5
|
+
compact: string;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export function splitSignature(signature: string): SplitSignatureResult {
|
|
9
|
+
// Remove "0x" prefix if present
|
|
10
|
+
if (signature.startsWith('0x')) {
|
|
11
|
+
signature = signature.slice(2);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Convert the hex string to a byte array
|
|
15
|
+
const bytes = new Uint8Array(signature.length / 2);
|
|
16
|
+
for (let i = 0; i < signature.length; i += 2) {
|
|
17
|
+
bytes[i / 2] = parseInt(signature.slice(i, i + 2), 16);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Validate the signature length (64 or 65 bytes)
|
|
21
|
+
if (bytes.length !== 64 && bytes.length !== 65) {
|
|
22
|
+
throw new Error('Invalid signature length: must be 64 or 65 bytes');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Extract r and s components
|
|
26
|
+
const r = `0x${Array.from(bytes.slice(0, 32), (b) =>
|
|
27
|
+
b.toString(16).padStart(2, '0')
|
|
28
|
+
).join('')}`;
|
|
29
|
+
let s: string;
|
|
30
|
+
let v;
|
|
31
|
+
|
|
32
|
+
// Handle 64-byte (EIP-2098 compact) and 65-byte signatures
|
|
33
|
+
if (bytes.length === 64) {
|
|
34
|
+
// Extract v from the highest bit of s and clear the bit in s
|
|
35
|
+
v = 27 + (bytes[32]! >> 7);
|
|
36
|
+
bytes[32]! &= 0x7f; // Clear the highest bit
|
|
37
|
+
s = `0x${Array.from(bytes.slice(32, 64))
|
|
38
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
39
|
+
.join('')}`;
|
|
40
|
+
} else {
|
|
41
|
+
s = `0x${Array.from(bytes.slice(32, 64))
|
|
42
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
43
|
+
.join('')}`;
|
|
44
|
+
|
|
45
|
+
// Extract v directly for 65-byte signature
|
|
46
|
+
v = bytes[64]!;
|
|
47
|
+
|
|
48
|
+
// Normalize v to canonical form (27 or 28)
|
|
49
|
+
if (v < 27) {
|
|
50
|
+
v += 27;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Compute yParityAndS (_vs) for the compact signature
|
|
55
|
+
const sBytes = Array.from(bytes.slice(32, 64));
|
|
56
|
+
if (v === 28) {
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
58
|
+
sBytes[0]! |= 0x80; // Set the highest bit if v is 28
|
|
59
|
+
}
|
|
60
|
+
const yParityAndS = `0x${sBytes
|
|
61
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
62
|
+
.join('')}`;
|
|
63
|
+
|
|
64
|
+
// Construct the compact signature by concatenating r and yParityAndS
|
|
65
|
+
const compactSignature = r + yParityAndS.slice(2);
|
|
66
|
+
|
|
67
|
+
return { v, r, s, compact: compactSignature };
|
|
68
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type OrderTransaction = {
|
|
2
|
+
hash: string;
|
|
3
|
+
event_type: 'OrderFilled' | 'OrderCancelled';
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
export type OrderType = 'LIMIT' | 'P2P';
|
|
7
|
+
|
|
8
|
+
// display states such as EXPIRED and PARTIALLY_FILLLED derived on client side
|
|
9
|
+
// returned by API but can be calculated too, EXPIRED == order.expiry < Date.now()/1000
|
|
10
|
+
// PARTIALLY_FILLED == order.fillableBalance < order.makerAmount && order.fillableBalance !== '0'
|
|
11
|
+
export type OrderState = 'PENDING' | 'FULFILLED' | 'CANCELLED' | 'EXPIRED';
|
|
12
|
+
|
|
13
|
+
export type BeneficiaryType = 'EOA' | 'SmartContract';
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ConstructProviderFetchInput,
|
|
3
|
+
RequestParameters,
|
|
4
|
+
} from '../../types';
|
|
5
|
+
import { ApproveToken, approveTokenMethodFactory } from '../../helpers/approve';
|
|
6
|
+
import { constructGetDeltaContract } from './getDeltaContract';
|
|
7
|
+
|
|
8
|
+
export type ApproveTokenForDeltaFunctions<T> = {
|
|
9
|
+
/** @description approving ParaswapDelta contract as spender for Token */
|
|
10
|
+
approveTokenForDelta: ApproveToken<T>;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// returns whatever `contractCaller` returns
|
|
14
|
+
// to allow for better versatility
|
|
15
|
+
export const constructApproveTokenForDelta = <T>(
|
|
16
|
+
options: ConstructProviderFetchInput<T, 'transactCall'>
|
|
17
|
+
): ApproveTokenForDeltaFunctions<T> => {
|
|
18
|
+
// getDeltaContract is cached internally for the same instance of SDK
|
|
19
|
+
// so should persist across same apiUrl & network
|
|
20
|
+
const { getDeltaContract } = constructGetDeltaContract(options);
|
|
21
|
+
|
|
22
|
+
const getParaswapDeltaAddress = async (requestParams?: RequestParameters) => {
|
|
23
|
+
const deltaContract = await getDeltaContract(requestParams);
|
|
24
|
+
if (!deltaContract) {
|
|
25
|
+
throw new Error(`Delta is not available on chain ${options.chainId}`);
|
|
26
|
+
}
|
|
27
|
+
return deltaContract;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const approveTokenForDelta: ApproveToken<T> = approveTokenMethodFactory<T>(
|
|
31
|
+
options.contractCaller,
|
|
32
|
+
getParaswapDeltaAddress
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
approveTokenForDelta,
|
|
37
|
+
};
|
|
38
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { assert } from 'ts-essentials';
|
|
2
|
+
import type { ConstructFetchInput, RequestParameters } from '../../types';
|
|
3
|
+
import { BridgePrice } from './getDeltaPrice';
|
|
4
|
+
import { constructGetMulticallHandlers } from './getMulticallHandlers';
|
|
5
|
+
import {
|
|
6
|
+
getDeltaBridgeAndDestToken,
|
|
7
|
+
GetDeltaBridgeAndDestTokenOutput,
|
|
8
|
+
} from './helpers/across';
|
|
9
|
+
import { BeneficiaryType } from '../common/orders/types';
|
|
10
|
+
export type { SignableDeltaOrderData } from './helpers/buildDeltaOrderData';
|
|
11
|
+
|
|
12
|
+
export type BuildCrosschainOrderBridgeParams = {
|
|
13
|
+
/** @description The address of the destination token on the destination chain */
|
|
14
|
+
destToken: string; // lowercase
|
|
15
|
+
/** @description Destination Chain ID for Crosschain Orders */
|
|
16
|
+
destChainId: number;
|
|
17
|
+
/** @description Whether the beneficiary is a contract. Needed to automatically fill in crosschain Bridge */
|
|
18
|
+
beneficiaryType: BeneficiaryType;
|
|
19
|
+
|
|
20
|
+
/** @description price response received from /delta/prices (getDeltaPrice method) */
|
|
21
|
+
deltaPrice: Pick<BridgePrice, 'bridgeFee' | 'destToken'>;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
type BuildCrosschainOrderBridge = (
|
|
25
|
+
buildOrderParams: BuildCrosschainOrderBridgeParams,
|
|
26
|
+
requestParams?: RequestParameters
|
|
27
|
+
) => Promise<GetDeltaBridgeAndDestTokenOutput>;
|
|
28
|
+
|
|
29
|
+
export { GetDeltaBridgeAndDestTokenOutput as CrosschainOrderBridgeAndChanges };
|
|
30
|
+
|
|
31
|
+
export type BuildCrosschainOrderBridgeFunctions = {
|
|
32
|
+
/** @description Build Orders to be posted to Delta API for execution */
|
|
33
|
+
buildCrosschainOrderBridge: BuildCrosschainOrderBridge;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export const constructBuildCrosschainOrderBridge = (
|
|
37
|
+
options: ConstructFetchInput
|
|
38
|
+
): BuildCrosschainOrderBridgeFunctions => {
|
|
39
|
+
const { chainId } = options;
|
|
40
|
+
|
|
41
|
+
// cached internally for `multicall` contracts
|
|
42
|
+
const { getMulticallHandlers } = constructGetMulticallHandlers(options);
|
|
43
|
+
|
|
44
|
+
const buildCrosschainOrderBridge: BuildCrosschainOrderBridge = async (
|
|
45
|
+
{ destToken, destChainId, beneficiaryType, deltaPrice },
|
|
46
|
+
requestParams
|
|
47
|
+
) => {
|
|
48
|
+
assert(
|
|
49
|
+
chainId !== destChainId,
|
|
50
|
+
'`destChainId` must be different from `chainId` for crosschain Order.bridge'
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
const getMulticallHandler = async (chainId: number) => {
|
|
54
|
+
const multicallHandlersMap = await getMulticallHandlers(requestParams);
|
|
55
|
+
const multicallHandler = multicallHandlersMap[chainId];
|
|
56
|
+
|
|
57
|
+
assert(
|
|
58
|
+
multicallHandler,
|
|
59
|
+
`Multicall handler not found for chain ${chainId}`
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
return multicallHandler;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const { bridge, orderChanges } = await getDeltaBridgeAndDestToken({
|
|
66
|
+
destTokenDestChain: destToken,
|
|
67
|
+
destChainId: destChainId,
|
|
68
|
+
destTokenSrcChain: deltaPrice.destToken,
|
|
69
|
+
srcChainId: chainId,
|
|
70
|
+
bridgeFee: deltaPrice.bridgeFee,
|
|
71
|
+
beneficiaryType,
|
|
72
|
+
getMulticallHandler,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
bridge,
|
|
77
|
+
orderChanges,
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
buildCrosschainOrderBridge,
|
|
83
|
+
};
|
|
84
|
+
};
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { assert } from 'ts-essentials';
|
|
2
|
+
import type { ConstructFetchInput, RequestParameters } from '../../types';
|
|
3
|
+
import { ZERO_ADDRESS } from '../common/orders/buildOrderData';
|
|
4
|
+
import { constructGetDeltaContract } from './getDeltaContract';
|
|
5
|
+
import { BridgePrice, DeltaPrice } from './getDeltaPrice';
|
|
6
|
+
import { constructGetPartnerFee } from './getPartnerFee';
|
|
7
|
+
import {
|
|
8
|
+
buildDeltaSignableOrderData,
|
|
9
|
+
type BuildDeltaOrderDataInput,
|
|
10
|
+
type SignableDeltaOrderData,
|
|
11
|
+
} from './helpers/buildDeltaOrderData';
|
|
12
|
+
import { Bridge, DeltaAuctionOrder } from './helpers/types';
|
|
13
|
+
import { constructBuildCrosschainOrderBridge } from './buildCrosschainOrderBridge';
|
|
14
|
+
import { BeneficiaryType } from '../common/orders/types';
|
|
15
|
+
export type { SignableDeltaOrderData } from './helpers/buildDeltaOrderData';
|
|
16
|
+
|
|
17
|
+
export type BuildDeltaOrderDataParams = {
|
|
18
|
+
/** @description The address of the order owner */
|
|
19
|
+
owner: string;
|
|
20
|
+
/** @description The address of the order beneficiary */
|
|
21
|
+
beneficiary?: string; // beneficiary==owner if no transferTo
|
|
22
|
+
/** @description The address of the src token */
|
|
23
|
+
srcToken: string; // lowercase
|
|
24
|
+
/** @description The address of the dest token. For Crosschain Order - destination token on the destination chain */
|
|
25
|
+
destToken: string; // lowercase
|
|
26
|
+
/** @description The amount of src token to swap */
|
|
27
|
+
srcAmount: string; // wei
|
|
28
|
+
/** @description The minimum amount of dest token to receive */
|
|
29
|
+
destAmount: string; // wei, deltaPrice.destAmount - slippage
|
|
30
|
+
/** @description The deadline for the order */
|
|
31
|
+
deadline?: number; // seconds
|
|
32
|
+
/** @description The nonce of the order */
|
|
33
|
+
nonce?: number | string; // can be random, can even be Date.now()
|
|
34
|
+
/** @description Optional permit signature for the src token https://developers.velora.xyz/api/velora-api/velora-delta-api/build-a-delta-order-to-sign#supported-permits-order#supported-permits */
|
|
35
|
+
permit?: string; //can be "0x"
|
|
36
|
+
/** @description Partner string. */
|
|
37
|
+
partner?: string;
|
|
38
|
+
|
|
39
|
+
/** @description The bridge input */
|
|
40
|
+
bridge?: Bridge;
|
|
41
|
+
/** @description Destination Chain ID for Crosschain Orders */
|
|
42
|
+
destChainId?: number;
|
|
43
|
+
/** @description Whether the beneficiary is a contract. Needed to automatically fill in crosschain Bridge */
|
|
44
|
+
beneficiaryType?: BeneficiaryType;
|
|
45
|
+
|
|
46
|
+
/** @description price response received from /delta/prices (getDeltaPrice method) */
|
|
47
|
+
deltaPrice: Pick<
|
|
48
|
+
DeltaPrice,
|
|
49
|
+
'destAmount' | 'partner' | 'partnerFee' | 'destToken'
|
|
50
|
+
> &
|
|
51
|
+
Partial<Pick<BridgePrice, 'bridgeFee'>>;
|
|
52
|
+
|
|
53
|
+
/** @description partner fee in basis points (bps), 50bps=0.5% */
|
|
54
|
+
partnerFeeBps?: number;
|
|
55
|
+
/** @description partner address */
|
|
56
|
+
partnerAddress?: string;
|
|
57
|
+
/** @description take surplus */
|
|
58
|
+
partnerTakesSurplus?: boolean;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
type BuildDeltaOrder = (
|
|
62
|
+
buildOrderParams: BuildDeltaOrderDataParams,
|
|
63
|
+
requestParams?: RequestParameters
|
|
64
|
+
) => Promise<SignableDeltaOrderData>;
|
|
65
|
+
|
|
66
|
+
export type BuildDeltaOrderFunctions = {
|
|
67
|
+
/** @description Build Orders to be posted to Delta API for execution */
|
|
68
|
+
buildDeltaOrder: BuildDeltaOrder;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
// for same-chain Orders, all 0 params
|
|
72
|
+
const DEFAULT_BRIDGE: Bridge = {
|
|
73
|
+
maxRelayerFee: '0',
|
|
74
|
+
destinationChainId: 0,
|
|
75
|
+
outputToken: ZERO_ADDRESS,
|
|
76
|
+
multiCallHandler: ZERO_ADDRESS,
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const constructBuildDeltaOrder = (
|
|
80
|
+
options: ConstructFetchInput
|
|
81
|
+
): BuildDeltaOrderFunctions => {
|
|
82
|
+
const { chainId } = options;
|
|
83
|
+
|
|
84
|
+
// cached internally
|
|
85
|
+
const { getDeltaContract } = constructGetDeltaContract(options);
|
|
86
|
+
// cached internally for `partner`
|
|
87
|
+
const { getPartnerFee } = constructGetPartnerFee(options);
|
|
88
|
+
|
|
89
|
+
const { buildCrosschainOrderBridge } =
|
|
90
|
+
constructBuildCrosschainOrderBridge(options);
|
|
91
|
+
|
|
92
|
+
const buildDeltaOrder: BuildDeltaOrder = async (options, requestParams) => {
|
|
93
|
+
const ParaswapDelta = await getDeltaContract(requestParams);
|
|
94
|
+
if (!ParaswapDelta) {
|
|
95
|
+
throw new Error(`Delta is not available on chain ${chainId}`);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
////// Partner logic //////
|
|
99
|
+
|
|
100
|
+
// externally supplied partner fee data takes precedence
|
|
101
|
+
let partnerAddress = options.partnerAddress;
|
|
102
|
+
let partnerFeeBps =
|
|
103
|
+
options.partnerFeeBps ?? options.deltaPrice.partnerFee * 100;
|
|
104
|
+
let partnerTakesSurplus = options.partnerTakesSurplus;
|
|
105
|
+
|
|
106
|
+
// if fee given, takeSurplus is ignored
|
|
107
|
+
const feeOrTakeSurplusSupplied =
|
|
108
|
+
partnerFeeBps !== undefined || partnerTakesSurplus !== undefined;
|
|
109
|
+
|
|
110
|
+
if (partnerAddress === undefined || feeOrTakeSurplusSupplied) {
|
|
111
|
+
const partner = options.partner || options.deltaPrice.partner;
|
|
112
|
+
const partnerFeeResponse = await getPartnerFee(
|
|
113
|
+
{ partner },
|
|
114
|
+
requestParams
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
partnerAddress = partnerAddress ?? partnerFeeResponse.partnerAddress;
|
|
118
|
+
// deltaPrice.partnerFee and partnerFeeResponse.partnerFee should be the same, but give priority to externally provided
|
|
119
|
+
partnerFeeBps = partnerFeeBps ?? partnerFeeResponse.partnerFee;
|
|
120
|
+
partnerTakesSurplus =
|
|
121
|
+
partnerTakesSurplus ?? partnerFeeResponse.takeSurplus;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
////// Bridge logic //////
|
|
125
|
+
|
|
126
|
+
// Bridge is necessary for Crosschain Delta Orders
|
|
127
|
+
let bridge = options.bridge;
|
|
128
|
+
let partialChangedOrder: Pick<DeltaAuctionOrder, 'destToken'> | null = null;
|
|
129
|
+
|
|
130
|
+
// give preference to user-provided bridge
|
|
131
|
+
if (!bridge) {
|
|
132
|
+
// no bridge passed in input
|
|
133
|
+
|
|
134
|
+
if (options.destChainId && chainId !== options.destChainId) {
|
|
135
|
+
// crosschain Delta Order
|
|
136
|
+
const deltaPrice = options.deltaPrice;
|
|
137
|
+
assert(
|
|
138
|
+
deltaPrice.bridgeFee,
|
|
139
|
+
'`bridgeFee` is required in `deltaPrice` for crosschain Delta Orders'
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
const { bridge: constructedBridge, orderChanges } =
|
|
143
|
+
await buildCrosschainOrderBridge(
|
|
144
|
+
{
|
|
145
|
+
destToken: options.destToken,
|
|
146
|
+
destChainId: options.destChainId,
|
|
147
|
+
beneficiaryType: options.beneficiaryType ?? 'EOA',
|
|
148
|
+
deltaPrice: {
|
|
149
|
+
bridgeFee: deltaPrice.bridgeFee,
|
|
150
|
+
destToken: deltaPrice.destToken,
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
requestParams
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
bridge = constructedBridge;
|
|
157
|
+
partialChangedOrder = orderChanges;
|
|
158
|
+
} else {
|
|
159
|
+
// 0-values bridge for same-chain Orders
|
|
160
|
+
bridge = DEFAULT_BRIDGE;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const input: BuildDeltaOrderDataInput = {
|
|
165
|
+
owner: options.owner,
|
|
166
|
+
beneficiary: options.beneficiary,
|
|
167
|
+
srcToken: options.srcToken,
|
|
168
|
+
// for some cases of WETH<->ETH crosschain swaps, the destToken is to WETH or ETH
|
|
169
|
+
destToken: partialChangedOrder?.destToken ?? options.destToken,
|
|
170
|
+
srcAmount: options.srcAmount,
|
|
171
|
+
destAmount: options.destAmount,
|
|
172
|
+
expectedDestAmount: options.deltaPrice.destAmount,
|
|
173
|
+
deadline: options.deadline,
|
|
174
|
+
nonce: options.nonce?.toString(10),
|
|
175
|
+
permit: options.permit,
|
|
176
|
+
|
|
177
|
+
chainId,
|
|
178
|
+
paraswapDeltaAddress: ParaswapDelta,
|
|
179
|
+
partnerAddress,
|
|
180
|
+
partnerTakesSurplus,
|
|
181
|
+
partnerFeeBps,
|
|
182
|
+
|
|
183
|
+
bridge,
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
return buildDeltaSignableOrderData(input);
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
return {
|
|
190
|
+
buildDeltaOrder,
|
|
191
|
+
};
|
|
192
|
+
};
|