@1inch/fusion-sdk 1.0.1-rc.3 → 1.0.1-rc.31
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/dist/api/orders/order-api.spec.js +6 -5
- package/dist/api/orders/order-api.spec.js.map +1 -1
- package/dist/api/orders/orders.api.d.ts +1 -0
- package/dist/api/orders/orders.api.js +4 -3
- package/dist/api/orders/orders.api.js.map +1 -1
- package/dist/api/quoter/quote/quote.d.ts +5 -1
- package/dist/api/quoter/quote/quote.js +13 -6
- package/dist/api/quoter/quote/quote.js.map +1 -1
- package/dist/api/quoter/quote/types.d.ts +4 -0
- package/dist/api/quoter/quoter.api.d.ts +1 -0
- package/dist/api/quoter/quoter.api.js +3 -2
- package/dist/api/quoter/quoter.api.js.map +1 -1
- package/dist/api/quoter/quoter.api.spec.js +21 -6
- package/dist/api/quoter/quoter.api.spec.js.map +1 -1
- package/dist/api/quoter/types.d.ts +3 -3
- package/dist/api/relayer/relayer.api.d.ts +1 -0
- package/dist/api/relayer/relayer.api.js +3 -2
- package/dist/api/relayer/relayer.api.js.map +1 -1
- package/dist/api/relayer/relayer.api.spec.js +8 -5
- package/dist/api/relayer/relayer.api.spec.js.map +1 -1
- package/dist/api/relayer/relayer.request.d.ts +1 -0
- package/dist/api/relayer/relayer.request.js +3 -1
- package/dist/api/relayer/relayer.request.js.map +1 -1
- package/dist/api/relayer/types.d.ts +1 -0
- package/dist/auction-calculator/auction-calculator.d.ts +23 -4
- package/dist/auction-calculator/auction-calculator.js +40 -6
- package/dist/auction-calculator/auction-calculator.js.map +1 -1
- package/dist/auction-calculator/auction-calculator.spec.js +7 -5
- package/dist/auction-calculator/auction-calculator.spec.js.map +1 -1
- package/dist/auction-calculator/calc.d.ts +8 -0
- package/dist/auction-calculator/calc.js +8 -0
- package/dist/auction-calculator/calc.js.map +1 -1
- package/dist/auction-calculator/constants.js +1 -1
- package/dist/auction-calculator/constants.js.map +1 -1
- package/dist/connector/blockchain/private-key-provider.connector.js +2 -0
- package/dist/connector/blockchain/private-key-provider.connector.js.map +1 -1
- package/dist/connector/ws/websocket-client.connector.js +2 -0
- package/dist/connector/ws/websocket-client.connector.js.map +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/fusion-order/auction-details/auction-details.d.ts +29 -0
- package/dist/fusion-order/auction-details/auction-details.js +21 -0
- package/dist/fusion-order/auction-details/auction-details.js.map +1 -1
- package/dist/fusion-order/auction-details/types.d.ts +12 -0
- package/dist/fusion-order/fusion-extension.d.ts +2 -2
- package/dist/fusion-order/fusion-extension.js +3 -3
- package/dist/fusion-order/fusion-extension.js.map +1 -1
- package/dist/fusion-order/fusion-order.d.ts +90 -3
- package/dist/fusion-order/fusion-order.js +144 -17
- package/dist/fusion-order/fusion-order.js.map +1 -1
- package/dist/fusion-order/fusion-order.spec.js +35 -5
- package/dist/fusion-order/fusion-order.spec.js.map +1 -1
- package/dist/fusion-order/settlement-post-interaction-data/settlement-post-interaction-data.d.ts +38 -1
- package/dist/fusion-order/settlement-post-interaction-data/settlement-post-interaction-data.js +125 -46
- package/dist/fusion-order/settlement-post-interaction-data/settlement-post-interaction-data.js.map +1 -1
- package/dist/fusion-order/settlement-post-interaction-data/settlement-post-interaction-data.spec.js +95 -8
- package/dist/fusion-order/settlement-post-interaction-data/settlement-post-interaction-data.spec.js.map +1 -1
- package/dist/fusion-order/settlement-post-interaction-data/types.d.ts +12 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/sdk/sdk.js +6 -7
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/types.d.ts +12 -0
- package/dist/sdk/utils.js +5 -2
- package/dist/sdk/utils.js.map +1 -1
- package/dist/utils/amounts.d.ts +17 -1
- package/dist/utils/amounts.js +19 -3
- package/dist/utils/amounts.js.map +1 -1
- package/dist/utils/time.d.ts +1 -0
- package/dist/utils/time.js +8 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/validations.d.ts +4 -0
- package/dist/validations.js +4 -0
- package/dist/validations.js.map +1 -1
- package/dist/ws-api/ws-api.d.ts +1 -0
- package/dist/ws-api/ws-api.js +2 -1
- package/dist/ws-api/ws-api.js.map +1 -1
- package/dist/ws-api/ws.spec.js +9 -8
- package/dist/ws-api/ws.spec.js.map +1 -1
- package/package.json +31 -24
- package/dist/limit-order-contract/index.d.ts +0 -1
- package/dist/limit-order-contract/index.js +0 -6
- package/dist/limit-order-contract/index.js.map +0 -1
|
@@ -10,21 +10,34 @@ const fusion_extension_1 = require("./fusion-extension");
|
|
|
10
10
|
const auction_details_1 = require("./auction-details");
|
|
11
11
|
const settlement_post_interaction_data_1 = require("./settlement-post-interaction-data");
|
|
12
12
|
const auction_calculator_1 = require("../auction-calculator");
|
|
13
|
-
const utils_1 = require("../utils");
|
|
14
13
|
const constants_1 = require("../constants");
|
|
14
|
+
const amounts_1 = require("../utils/amounts");
|
|
15
|
+
const time_1 = require("../utils/time");
|
|
15
16
|
class FusionOrder {
|
|
16
|
-
constructor(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
constructor(
|
|
18
|
+
/**
|
|
19
|
+
* Fusion extension address
|
|
20
|
+
* @see https://github.com/1inch/limit-order-settlement
|
|
21
|
+
*/
|
|
22
|
+
settlementExtensionContract, orderInfo, auctionDetails, postInteractionData, extra = FusionOrder.defaultExtra) {
|
|
23
|
+
this.settlementExtensionContract = settlementExtensionContract;
|
|
24
|
+
const allowPartialFills = extra.allowPartialFills ??
|
|
25
|
+
FusionOrder.defaultExtra.allowPartialFills;
|
|
26
|
+
const allowMultipleFills = extra.allowMultipleFills ??
|
|
27
|
+
FusionOrder.defaultExtra.allowMultipleFills;
|
|
28
|
+
const unwrapWETH = extra.unwrapWETH ?? FusionOrder.defaultExtra.unwrapWETH;
|
|
29
|
+
const enablePermit2 = extra.enablePermit2 ?? FusionOrder.defaultExtra.enablePermit2;
|
|
30
|
+
const orderExpirationDelay = extra.orderExpirationDelay ??
|
|
31
|
+
FusionOrder.defaultExtra.orderExpirationDelay;
|
|
32
|
+
const { nonce, permit } = extra;
|
|
21
33
|
const deadline = auctionDetails.startTime +
|
|
22
34
|
auctionDetails.duration +
|
|
23
35
|
orderExpirationDelay;
|
|
24
36
|
const makerTraits = limit_order_sdk_1.MakerTraits.default()
|
|
25
37
|
.withExpiration(deadline)
|
|
26
38
|
.setPartialFills(allowPartialFills)
|
|
27
|
-
.setMultipleFills(allowMultipleFills)
|
|
39
|
+
.setMultipleFills(allowMultipleFills)
|
|
40
|
+
.enablePostInteraction();
|
|
28
41
|
if (makerTraits.isBitInvalidatorMode()) {
|
|
29
42
|
(0, assert_1.default)(nonce !== undefined, 'Nonce required, when partial fill or multiple fill disallowed');
|
|
30
43
|
}
|
|
@@ -37,13 +50,20 @@ class FusionOrder {
|
|
|
37
50
|
if (nonce !== undefined) {
|
|
38
51
|
makerTraits.withNonce(nonce);
|
|
39
52
|
}
|
|
40
|
-
|
|
53
|
+
/**
|
|
54
|
+
* @see https://github.com/1inch/limit-order-settlement/blob/0afb4785cb825fe959c534ff4f1a771d4d33cdf4/contracts/extensions/IntegratorFeeExtension.sol#L65
|
|
55
|
+
*/
|
|
56
|
+
const receiver = postInteractionData.integratorFee?.ratio
|
|
57
|
+
? settlementExtensionContract
|
|
58
|
+
: orderInfo.receiver;
|
|
59
|
+
const extension = new fusion_extension_1.FusionExtension(settlementExtensionContract, auctionDetails, postInteractionData);
|
|
41
60
|
if (permit) {
|
|
42
61
|
extension.withMakerPermit(orderInfo.makerAsset, permit);
|
|
43
62
|
}
|
|
44
63
|
const builtExtension = extension.build();
|
|
45
64
|
this.inner = new limit_order_sdk_1.LimitOrder({
|
|
46
65
|
...orderInfo,
|
|
66
|
+
receiver,
|
|
47
67
|
salt: limit_order_sdk_1.LimitOrder.buildSalt(builtExtension, orderInfo.salt)
|
|
48
68
|
}, makerTraits, builtExtension);
|
|
49
69
|
this.fusionExtension = extension;
|
|
@@ -51,26 +71,82 @@ class FusionOrder {
|
|
|
51
71
|
get extension() {
|
|
52
72
|
return this.inner.extension;
|
|
53
73
|
}
|
|
54
|
-
|
|
74
|
+
get maker() {
|
|
75
|
+
return this.inner.maker;
|
|
76
|
+
}
|
|
77
|
+
get takerAsset() {
|
|
78
|
+
return this.inner.takerAsset;
|
|
79
|
+
}
|
|
80
|
+
get makerAsset() {
|
|
81
|
+
return this.inner.makerAsset;
|
|
82
|
+
}
|
|
83
|
+
get takingAmount() {
|
|
84
|
+
return this.inner.takingAmount;
|
|
85
|
+
}
|
|
86
|
+
get makingAmount() {
|
|
87
|
+
return this.inner.makingAmount;
|
|
88
|
+
}
|
|
89
|
+
get receiver() {
|
|
90
|
+
return this.inner.receiver;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Timestamp in sec
|
|
94
|
+
*/
|
|
95
|
+
get deadline() {
|
|
96
|
+
return this.inner.makerTraits.expiration() || 0n;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Timestamp in sec
|
|
100
|
+
*/
|
|
101
|
+
get auctionStartTime() {
|
|
102
|
+
return this.fusionExtension.auctionDetails.startTime;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Timestamp in sec
|
|
106
|
+
*/
|
|
107
|
+
get auctionEndTime() {
|
|
108
|
+
const { startTime, duration } = this.fusionExtension.auctionDetails;
|
|
109
|
+
return startTime + duration;
|
|
110
|
+
}
|
|
111
|
+
get partialFillAllowed() {
|
|
112
|
+
return this.inner.makerTraits.isPartialFillAllowed();
|
|
113
|
+
}
|
|
114
|
+
get multipleFillsAllowed() {
|
|
115
|
+
return this.inner.makerTraits.isMultipleFillsAllowed();
|
|
116
|
+
}
|
|
117
|
+
static new(
|
|
118
|
+
/**
|
|
119
|
+
* Fusion extension address
|
|
120
|
+
* @see https://github.com/1inch/limit-order-settlement
|
|
121
|
+
*/
|
|
122
|
+
settlementExtension, orderInfo, details, extra) {
|
|
55
123
|
return new FusionOrder(settlementExtension, orderInfo, details.auction, settlement_post_interaction_data_1.SettlementPostInteractionData.new({
|
|
56
124
|
bankFee: details.fees?.bankFee || 0n,
|
|
57
125
|
integratorFee: details.fees?.integratorFee,
|
|
58
126
|
whitelist: details.whitelist,
|
|
59
|
-
|
|
127
|
+
resolvingStartTime: details.resolvingStartTime ?? (0, time_1.now)(),
|
|
128
|
+
customReceiver: orderInfo.receiver
|
|
60
129
|
}), extra);
|
|
61
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Create FusionOrder from order data and extension
|
|
133
|
+
*
|
|
134
|
+
*/
|
|
62
135
|
static fromDataAndExtension(order, extension) {
|
|
63
136
|
const settlementContract = limit_order_sdk_1.Address.fromFirstBytes(extension.makingAmountData);
|
|
64
137
|
(0, assert_1.default)(limit_order_sdk_1.Address.fromFirstBytes(extension.takingAmountData).equal(settlementContract) &&
|
|
65
138
|
limit_order_sdk_1.Address.fromFirstBytes(extension.postInteraction).equal(settlementContract), 'Invalid extension, all calls should be to the same address');
|
|
66
139
|
const makerTraits = new limit_order_sdk_1.MakerTraits(BigInt(order.makerTraits));
|
|
67
|
-
|
|
68
|
-
|
|
140
|
+
(0, assert_1.default)(!makerTraits.isPrivate(), 'fusion order can not be private');
|
|
141
|
+
(0, assert_1.default)(makerTraits.hasPostInteraction(), 'post-interaction must be enabled');
|
|
142
|
+
const auctionDetails = auction_details_1.AuctionDetails.fromExtension(extension);
|
|
143
|
+
const postInteractionData = settlement_post_interaction_data_1.SettlementPostInteractionData.fromExtension(extension);
|
|
69
144
|
const deadline = makerTraits.expiration();
|
|
70
145
|
const orderExpirationDelay = deadline === null
|
|
71
146
|
? undefined
|
|
72
147
|
: deadline - auctionDetails.startTime - auctionDetails.duration;
|
|
73
148
|
return new FusionOrder(settlementContract, {
|
|
149
|
+
// shift because of how LimitOrder.buildSalt works
|
|
74
150
|
salt: BigInt(order.salt) >> 160n,
|
|
75
151
|
maker: new limit_order_sdk_1.Address(order.maker),
|
|
76
152
|
receiver: new limit_order_sdk_1.Address(order.receiver),
|
|
@@ -93,17 +169,68 @@ class FusionOrder {
|
|
|
93
169
|
build() {
|
|
94
170
|
return this.inner.build();
|
|
95
171
|
}
|
|
96
|
-
getOrderHash(
|
|
97
|
-
return this.inner.getOrderHash(
|
|
172
|
+
getOrderHash(chainId) {
|
|
173
|
+
return this.inner.getOrderHash(chainId);
|
|
98
174
|
}
|
|
99
|
-
getTypedData(
|
|
100
|
-
return this.inner.getTypedData(
|
|
175
|
+
getTypedData(chainId) {
|
|
176
|
+
return this.inner.getTypedData(chainId);
|
|
101
177
|
}
|
|
102
178
|
getCalculator() {
|
|
103
|
-
return auction_calculator_1.AuctionCalculator.fromAuctionData(this.fusionExtension.postInteractionData, this.fusionExtension.
|
|
179
|
+
return auction_calculator_1.AuctionCalculator.fromAuctionData(this.fusionExtension.postInteractionData, this.fusionExtension.auctionDetails);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Calculates required taking amount for passed `makingAmount` at block time `time`
|
|
183
|
+
*
|
|
184
|
+
* @param makingAmount maker swap amount
|
|
185
|
+
* @param time execution time in sec
|
|
186
|
+
* @param blockBaseFee block fee in wei.
|
|
187
|
+
* */
|
|
188
|
+
calcTakingAmount(makingAmount, time, blockBaseFee = 0n) {
|
|
189
|
+
const takingAmount = (0, amounts_1.calcTakingAmount)(makingAmount, this.makingAmount, this.takingAmount);
|
|
190
|
+
const calculator = this.getCalculator();
|
|
191
|
+
const bump = calculator.calcRateBump(time, blockBaseFee);
|
|
192
|
+
return calculator.calcAuctionTakingAmount(takingAmount, bump);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Check whether address allowed to execute order at the given time
|
|
196
|
+
*
|
|
197
|
+
* @param executor address of executor
|
|
198
|
+
* @param executionTime timestamp in sec at which order planning to execute
|
|
199
|
+
*/
|
|
200
|
+
canExecuteAt(executor, executionTime) {
|
|
201
|
+
return this.fusionExtension.postInteractionData.canExecuteAt(executor, executionTime);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Check is order expired at a given time
|
|
205
|
+
*
|
|
206
|
+
* @param time timestamp in seconds
|
|
207
|
+
*/
|
|
208
|
+
isExpiredAt(time) {
|
|
209
|
+
return time > this.deadline;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Returns how much fee will be credited from a resolver deposit account
|
|
213
|
+
* Token of fee set in Settlement extension constructor
|
|
214
|
+
* Actual deployments can be found at https://github.com/1inch/limit-order-settlement/tree/master/deployments
|
|
215
|
+
*
|
|
216
|
+
* @param filledMakingAmount which resolver fills
|
|
217
|
+
* @see https://github.com/1inch/limit-order-settlement/blob/0e3cae3653092ebb4ea5d2a338c87a54351ad883/contracts/extensions/ResolverFeeExtension.sol#L29
|
|
218
|
+
*/
|
|
219
|
+
getResolverFee(filledMakingAmount) {
|
|
220
|
+
return ((this.fusionExtension.postInteractionData.bankFee *
|
|
221
|
+
FusionOrder._ORDER_FEE_BASE_POINTS *
|
|
222
|
+
filledMakingAmount) /
|
|
223
|
+
this.makingAmount);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Check if `wallet` can fill order before other
|
|
227
|
+
*/
|
|
228
|
+
isExclusiveResolver(wallet) {
|
|
229
|
+
return this.fusionExtension.postInteractionData.isExclusiveResolver(wallet);
|
|
104
230
|
}
|
|
105
231
|
}
|
|
106
232
|
exports.FusionOrder = FusionOrder;
|
|
233
|
+
FusionOrder._ORDER_FEE_BASE_POINTS = 10n ** 15n;
|
|
107
234
|
FusionOrder.defaultExtra = {
|
|
108
235
|
allowPartialFills: true,
|
|
109
236
|
allowMultipleFills: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fusion-order.js","sourceRoot":"","sources":["../../src/fusion-order/fusion-order.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"fusion-order.js","sourceRoot":"","sources":["../../src/fusion-order/fusion-order.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const limit_order_sdk_1 = require("@1inch/limit-order-sdk");
|
|
4
|
+
const ethers_1 = require("ethers");
|
|
4
5
|
const fusion_order_1 = require("./fusion-order");
|
|
5
6
|
const auction_details_1 = require("./auction-details");
|
|
6
7
|
describe('Fusion Order', () => {
|
|
@@ -28,9 +29,10 @@ describe('Fusion Order', () => {
|
|
|
28
29
|
whitelist: [
|
|
29
30
|
{
|
|
30
31
|
address: new limit_order_sdk_1.Address('0x00000000219ab540356cbb839cbe05303d7705fa'),
|
|
31
|
-
|
|
32
|
+
allowFrom: 0n
|
|
32
33
|
}
|
|
33
|
-
]
|
|
34
|
+
],
|
|
35
|
+
resolvingStartTime: 1673548139n
|
|
34
36
|
});
|
|
35
37
|
const builtOrder = order.build();
|
|
36
38
|
expect(builtOrder).toStrictEqual({
|
|
@@ -40,8 +42,8 @@ describe('Fusion Order', () => {
|
|
|
40
42
|
receiver: '0x0000000000000000000000000000000000000000',
|
|
41
43
|
takerAsset: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
|
42
44
|
takingAmount: '1420000000',
|
|
43
|
-
makerTraits: '
|
|
44
|
-
salt: '
|
|
45
|
+
makerTraits: '33471150795161712739625987854073848363835856965607525350783622537007396290560',
|
|
46
|
+
salt: '14969955465678758833706505435513058355190519874774'
|
|
45
47
|
});
|
|
46
48
|
const makerTraits = new limit_order_sdk_1.MakerTraits(BigInt(builtOrder.makerTraits));
|
|
47
49
|
expect(makerTraits.isNativeUnwrapEnabled()).toEqual(false);
|
|
@@ -72,11 +74,39 @@ describe('Fusion Order', () => {
|
|
|
72
74
|
whitelist: [
|
|
73
75
|
{
|
|
74
76
|
address: new limit_order_sdk_1.Address('0x00000000219ab540356cbb839cbe05303d7705fa'),
|
|
75
|
-
|
|
77
|
+
allowFrom: 0n
|
|
76
78
|
}
|
|
77
79
|
]
|
|
78
80
|
});
|
|
79
81
|
expect(fusion_order_1.FusionOrder.fromDataAndExtension(order.build(), order.extension)).toStrictEqual(order);
|
|
80
82
|
});
|
|
83
|
+
it('Should calculate taking amount', () => {
|
|
84
|
+
const now = 10000n;
|
|
85
|
+
const order = fusion_order_1.FusionOrder.new(new limit_order_sdk_1.Address('0x8273f37417da37c4a6c3995e82cf442f87a25d9c'), {
|
|
86
|
+
makerAsset: new limit_order_sdk_1.Address('0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48' // USDC
|
|
87
|
+
),
|
|
88
|
+
takerAsset: new limit_order_sdk_1.Address('0x111111111117dc0aa78b770fa6a738034120c302' // 1INCH
|
|
89
|
+
),
|
|
90
|
+
maker: limit_order_sdk_1.Address.fromBigInt(1n),
|
|
91
|
+
makingAmount: (0, ethers_1.parseUnits)('150', 6),
|
|
92
|
+
takingAmount: (0, ethers_1.parseUnits)('200')
|
|
93
|
+
}, {
|
|
94
|
+
auction: new auction_details_1.AuctionDetails({
|
|
95
|
+
startTime: now,
|
|
96
|
+
duration: 120n,
|
|
97
|
+
initialRateBump: 10000000,
|
|
98
|
+
points: []
|
|
99
|
+
}),
|
|
100
|
+
whitelist: [
|
|
101
|
+
{
|
|
102
|
+
address: new limit_order_sdk_1.Address('0x00000000219ab540356cbb839cbe05303d7705fa'),
|
|
103
|
+
allowFrom: 0n
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
resolvingStartTime: 0n
|
|
107
|
+
});
|
|
108
|
+
expect(order.calcTakingAmount(order.makingAmount, now)).toEqual(2n * order.takingAmount // because init rate bump is 100%
|
|
109
|
+
);
|
|
110
|
+
});
|
|
81
111
|
});
|
|
82
112
|
//# sourceMappingURL=fusion-order.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fusion-order.spec.js","sourceRoot":"","sources":["../../src/fusion-order/fusion-order.spec.ts"],"names":[],"mappings":";;AAAA,4DAA2D;AAC3D,iDAA0C;AAC1C,uDAAgD;AAEhD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAClC,MAAM,iBAAiB,GAAG,IAAI,yBAAO,CACjC,4CAA4C,CAC/C,CAAA;QAED,MAAM,KAAK,GAAG,0BAAW,CAAC,GAAG,CACzB,iBAAiB,EACjB;YACI,UAAU,EAAE,IAAI,yBAAO,CACnB,4CAA4C,CAC/C;YACD,UAAU,EAAE,IAAI,yBAAO,CACnB,4CAA4C,CAC/C;YACD,YAAY,EAAE,oBAAoB;YAClC,YAAY,EAAE,WAAW;YACzB,KAAK,EAAE,IAAI,yBAAO,CACd,4CAA4C,CAC/C;YACD,IAAI,EAAE,GAAG;SACZ,EACD;YACI,OAAO,EAAE,IAAI,gCAAc,CAAC;gBACxB,QAAQ,EAAE,IAAI;gBACd,SAAS,EAAE,WAAW;gBACtB,eAAe,EAAE,KAAK;gBACtB,MAAM,EAAE;oBACJ;wBACI,WAAW,EAAE,KAAK;wBAClB,KAAK,EAAE,EAAE;qBACZ;iBACJ;aACJ,CAAC;YACF,SAAS,EAAE;gBACP;oBACI,OAAO,EAAE,IAAI,yBAAO,CAChB,4CAA4C,CAC/C;oBACD,
|
|
1
|
+
{"version":3,"file":"fusion-order.spec.js","sourceRoot":"","sources":["../../src/fusion-order/fusion-order.spec.ts"],"names":[],"mappings":"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"}
|
package/dist/fusion-order/settlement-post-interaction-data/settlement-post-interaction-data.d.ts
CHANGED
|
@@ -1,16 +1,53 @@
|
|
|
1
|
+
import { Address, Extension } from '@1inch/limit-order-sdk';
|
|
1
2
|
import { IntegratorFee, SettlementSuffixData } from './types';
|
|
2
3
|
export declare class SettlementPostInteractionData {
|
|
3
4
|
readonly whitelist: WhitelistItem[];
|
|
4
5
|
readonly integratorFee?: IntegratorFee;
|
|
5
6
|
readonly bankFee: bigint;
|
|
6
|
-
readonly
|
|
7
|
+
readonly resolvingStartTime: bigint;
|
|
8
|
+
readonly customReceiver?: Address;
|
|
7
9
|
private constructor();
|
|
8
10
|
static new(data: SettlementSuffixData): SettlementPostInteractionData;
|
|
11
|
+
/**
|
|
12
|
+
* Construct `SettlementPostInteractionData` from bytes
|
|
13
|
+
* @param data bytes with 0x prefix in next format:
|
|
14
|
+
* - [uint32 feeBank] only when first bit of `bitMask` enabled
|
|
15
|
+
* - [uint16 integratorFeeRation, uint160 integratorFeeReceiver, [uint160 customReceiver]] only when second bit of `bitMask` enabled
|
|
16
|
+
* - uint32 auctionStartTime
|
|
17
|
+
* - (bytes10 last10bytesOfAddress, uint16 auctionDelay) * N whitelist info
|
|
18
|
+
* - uint8 bitMask:
|
|
19
|
+
* 0b0000_0001 - fee bank mask
|
|
20
|
+
* 0b0000_0010 - integrator fee mask
|
|
21
|
+
* 0b0000_0100 - is custom receiver present (only used when integrator fee enabled)
|
|
22
|
+
* 0b1111_1000 - resolvers count mask
|
|
23
|
+
*
|
|
24
|
+
* All data is tight packed
|
|
25
|
+
* @see SettlementPostInteractionData.encode
|
|
26
|
+
*/
|
|
9
27
|
static decode(data: string): SettlementPostInteractionData;
|
|
28
|
+
static fromExtension(extension: Extension): SettlementPostInteractionData;
|
|
29
|
+
/**
|
|
30
|
+
* Serialize post-interaction data to bytes
|
|
31
|
+
*/
|
|
10
32
|
encode(): string;
|
|
33
|
+
/**
|
|
34
|
+
* Check whether address allowed to execute order at the given time
|
|
35
|
+
*
|
|
36
|
+
* @param executor address of executor
|
|
37
|
+
* @param executionTime timestamp in sec at which order planning to execute
|
|
38
|
+
*/
|
|
39
|
+
canExecuteAt(executor: Address, executionTime: bigint): boolean;
|
|
40
|
+
isExclusiveResolver(wallet: Address): boolean;
|
|
11
41
|
}
|
|
12
42
|
type WhitelistItem = {
|
|
43
|
+
/**
|
|
44
|
+
* last 10 bytes of address, no 0x prefix
|
|
45
|
+
*/
|
|
13
46
|
addressHalf: string;
|
|
47
|
+
/**
|
|
48
|
+
* Delay from previous resolver in seconds
|
|
49
|
+
* For first resolver delay from `resolvingStartTime`
|
|
50
|
+
*/
|
|
14
51
|
delay: bigint;
|
|
15
52
|
};
|
|
16
53
|
export {};
|
package/dist/fusion-order/settlement-post-interaction-data/settlement-post-interaction-data.js
CHANGED
|
@@ -4,102 +4,181 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.SettlementPostInteractionData = void 0;
|
|
7
|
-
const ethers_1 = require("ethers");
|
|
8
7
|
const limit_order_sdk_1 = require("@1inch/limit-order-sdk");
|
|
9
8
|
const byte_utils_1 = require("@1inch/byte-utils");
|
|
10
9
|
const assert_1 = __importDefault(require("assert"));
|
|
11
10
|
const validations_1 = require("../../validations");
|
|
12
11
|
const utils_1 = require("../../utils");
|
|
12
|
+
const constants_1 = require("../../constants");
|
|
13
13
|
class SettlementPostInteractionData {
|
|
14
14
|
constructor(data) {
|
|
15
15
|
this.whitelist = data.whitelist;
|
|
16
16
|
this.integratorFee = data?.integratorFee;
|
|
17
|
-
this.bankFee = data.bankFee;
|
|
18
|
-
this.
|
|
17
|
+
this.bankFee = data.bankFee || 0n;
|
|
18
|
+
this.resolvingStartTime = data.resolvingStartTime;
|
|
19
|
+
this.customReceiver = data.customReceiver;
|
|
20
|
+
if (this.integratorFee?.ratio) {
|
|
21
|
+
(0, assert_1.default)(!this.integratorFee.receiver.isZero(), 'Fee receiver can not be zero when fee set');
|
|
22
|
+
}
|
|
19
23
|
}
|
|
20
24
|
static new(data) {
|
|
25
|
+
(0, assert_1.default)(data.whitelist.length, 'Whitelist can not be empty');
|
|
26
|
+
// transform timestamps to cumulative delays
|
|
27
|
+
let sumDelay = 0n;
|
|
28
|
+
const whitelist = data.whitelist
|
|
29
|
+
.map((d) => ({
|
|
30
|
+
addressHalf: d.address.toString().slice(-20),
|
|
31
|
+
allowFrom: d.allowFrom < data.resolvingStartTime
|
|
32
|
+
? data.resolvingStartTime
|
|
33
|
+
: d.allowFrom
|
|
34
|
+
}))
|
|
35
|
+
.sort((a, b) => Number(a.allowFrom - b.allowFrom)) // ASC
|
|
36
|
+
.map((val) => {
|
|
37
|
+
const delay = val.allowFrom - data.resolvingStartTime - sumDelay;
|
|
38
|
+
sumDelay += delay;
|
|
39
|
+
(0, assert_1.default)(delay < constants_1.UINT_16_MAX, 'Too big diff between timestamps');
|
|
40
|
+
return {
|
|
41
|
+
delay,
|
|
42
|
+
addressHalf: val.addressHalf
|
|
43
|
+
};
|
|
44
|
+
});
|
|
21
45
|
return new SettlementPostInteractionData({
|
|
22
46
|
...data,
|
|
23
|
-
whitelist
|
|
24
|
-
addressHalf: d.address.toString().slice(-20),
|
|
25
|
-
delay: d.delay
|
|
26
|
-
}))
|
|
47
|
+
whitelist
|
|
27
48
|
});
|
|
28
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Construct `SettlementPostInteractionData` from bytes
|
|
52
|
+
* @param data bytes with 0x prefix in next format:
|
|
53
|
+
* - [uint32 feeBank] only when first bit of `bitMask` enabled
|
|
54
|
+
* - [uint16 integratorFeeRation, uint160 integratorFeeReceiver, [uint160 customReceiver]] only when second bit of `bitMask` enabled
|
|
55
|
+
* - uint32 auctionStartTime
|
|
56
|
+
* - (bytes10 last10bytesOfAddress, uint16 auctionDelay) * N whitelist info
|
|
57
|
+
* - uint8 bitMask:
|
|
58
|
+
* 0b0000_0001 - fee bank mask
|
|
59
|
+
* 0b0000_0010 - integrator fee mask
|
|
60
|
+
* 0b0000_0100 - is custom receiver present (only used when integrator fee enabled)
|
|
61
|
+
* 0b1111_1000 - resolvers count mask
|
|
62
|
+
*
|
|
63
|
+
* All data is tight packed
|
|
64
|
+
* @see SettlementPostInteractionData.encode
|
|
65
|
+
*/
|
|
29
66
|
static decode(data) {
|
|
30
67
|
(0, assert_1.default)((0, validations_1.isHexBytes)(data), 'Post interaction data must be valid bytes string');
|
|
31
68
|
const iter = byte_utils_1.BytesIter.BigInt(data);
|
|
32
|
-
const
|
|
69
|
+
const flags = new byte_utils_1.BN(iter.nextByte(byte_utils_1.BytesIter.SIDE.Back));
|
|
33
70
|
let bankFee = 0n;
|
|
34
71
|
let integratorFee;
|
|
35
|
-
|
|
72
|
+
let customReceiver;
|
|
73
|
+
// fee bank presented
|
|
74
|
+
if (flags.getBit(0n)) {
|
|
36
75
|
bankFee = iter.nextUint32();
|
|
37
76
|
}
|
|
38
|
-
|
|
77
|
+
// integrator fee presented
|
|
78
|
+
if (flags.getBit(1n)) {
|
|
79
|
+
const integratorFeeRatio = iter.nextUint16();
|
|
39
80
|
const integratorAddress = iter.nextUint160();
|
|
40
|
-
const integratorFeeRatio = iter.nextUint32();
|
|
41
81
|
integratorFee = {
|
|
42
82
|
ratio: integratorFeeRatio,
|
|
43
83
|
receiver: limit_order_sdk_1.Address.fromBigInt(integratorAddress)
|
|
44
84
|
};
|
|
85
|
+
// custom receiver presented
|
|
86
|
+
if (flags.getBit(2n)) {
|
|
87
|
+
customReceiver = limit_order_sdk_1.Address.fromBigInt(iter.nextUint160());
|
|
88
|
+
}
|
|
45
89
|
}
|
|
46
|
-
const
|
|
90
|
+
const resolvingStartTime = iter.nextUint32();
|
|
47
91
|
const whitelist = [];
|
|
48
92
|
while (!iter.isEmpty()) {
|
|
49
93
|
const addressHalf = iter
|
|
50
94
|
.nextBytes(10)
|
|
51
95
|
.toString(16)
|
|
52
96
|
.padStart(20, '0');
|
|
53
|
-
const
|
|
97
|
+
const delay = iter.nextUint16();
|
|
54
98
|
whitelist.push({
|
|
55
99
|
addressHalf,
|
|
56
|
-
delay
|
|
100
|
+
delay
|
|
57
101
|
});
|
|
58
102
|
}
|
|
59
103
|
return new SettlementPostInteractionData({
|
|
60
104
|
integratorFee,
|
|
61
105
|
bankFee,
|
|
62
|
-
|
|
63
|
-
whitelist
|
|
106
|
+
resolvingStartTime,
|
|
107
|
+
whitelist,
|
|
108
|
+
customReceiver
|
|
64
109
|
});
|
|
65
110
|
}
|
|
111
|
+
static fromExtension(extension) {
|
|
112
|
+
return SettlementPostInteractionData.decode((0, utils_1.add0x)(extension.postInteraction.slice(42)));
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Serialize post-interaction data to bytes
|
|
116
|
+
*/
|
|
66
117
|
encode() {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
118
|
+
/**
|
|
119
|
+
* 0b0000_0001 - fee bank mask
|
|
120
|
+
* 0b0000_0010 - integrator fee mask
|
|
121
|
+
* 0b0000_0100 - is custom receiver present
|
|
122
|
+
* 0b1111_1000 - resolvers count mask
|
|
123
|
+
*/
|
|
124
|
+
let bitMask = new byte_utils_1.BN(0n);
|
|
125
|
+
const bytes = new byte_utils_1.BytesBuilder();
|
|
126
|
+
// Add bank fee if exists
|
|
72
127
|
if (this.bankFee) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
type: 'uint32',
|
|
76
|
-
value: ethers_1.ethers.solidityPacked(['uint32'], [this.bankFee])
|
|
77
|
-
});
|
|
128
|
+
bitMask = bitMask.setBit(0n, 1);
|
|
129
|
+
bytes.addUint32(this.bankFee);
|
|
78
130
|
}
|
|
131
|
+
// add integrator fee if exists
|
|
79
132
|
if (this.integratorFee?.ratio) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
133
|
+
bitMask = bitMask.setBit(1n, 1);
|
|
134
|
+
bytes
|
|
135
|
+
.addUint16(this.integratorFee.ratio)
|
|
136
|
+
.addAddress(this.integratorFee.receiver.toString());
|
|
137
|
+
if (this.customReceiver && !this.customReceiver.isZero()) {
|
|
138
|
+
bitMask = bitMask.setBit(2n, 1);
|
|
139
|
+
bytes.addAddress(this.customReceiver.toString());
|
|
140
|
+
}
|
|
88
141
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
value: this.auctionStartTime
|
|
92
|
-
});
|
|
142
|
+
bytes.addUint32(this.resolvingStartTime);
|
|
143
|
+
// whitelist data
|
|
93
144
|
for (const wl of this.whitelist) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
145
|
+
bytes.addBytes((0, utils_1.add0x)(wl.addressHalf)).addUint16(wl.delay);
|
|
146
|
+
}
|
|
147
|
+
bitMask = bitMask.setMask(new byte_utils_1.BitMask(3n, 8n), BigInt(this.whitelist.length));
|
|
148
|
+
bytes.addUint8(bitMask.value);
|
|
149
|
+
return bytes.asHex();
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Check whether address allowed to execute order at the given time
|
|
153
|
+
*
|
|
154
|
+
* @param executor address of executor
|
|
155
|
+
* @param executionTime timestamp in sec at which order planning to execute
|
|
156
|
+
*/
|
|
157
|
+
canExecuteAt(executor, executionTime) {
|
|
158
|
+
const addressHalf = executor.toString().slice(-20);
|
|
159
|
+
let allowedFrom = this.resolvingStartTime;
|
|
160
|
+
for (const whitelist of this.whitelist) {
|
|
161
|
+
allowedFrom += whitelist.delay;
|
|
162
|
+
if (addressHalf === whitelist.addressHalf) {
|
|
163
|
+
return executionTime >= allowedFrom;
|
|
164
|
+
}
|
|
165
|
+
else if (executionTime < allowedFrom) {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
isExclusiveResolver(wallet) {
|
|
172
|
+
const addressHalf = wallet.toString().slice(-20);
|
|
173
|
+
// only one resolver, so check if it is the passed address
|
|
174
|
+
if (this.whitelist.length === 1) {
|
|
175
|
+
return addressHalf === this.whitelist[0].addressHalf;
|
|
176
|
+
}
|
|
177
|
+
// more than 1 address can fill at the same time, no exclusivity
|
|
178
|
+
if (this.whitelist[0].delay === this.whitelist[1].delay) {
|
|
179
|
+
return false;
|
|
101
180
|
}
|
|
102
|
-
return
|
|
181
|
+
return addressHalf === this.whitelist[0].addressHalf;
|
|
103
182
|
}
|
|
104
183
|
}
|
|
105
184
|
exports.SettlementPostInteractionData = SettlementPostInteractionData;
|