Skip to content

Commit 7c8d8c4

Browse files
committed
refactor: clean invariants
1 parent 0cec87d commit 7c8d8c4

File tree

1 file changed

+71
-72
lines changed

1 file changed

+71
-72
lines changed

sdks/uniswapx-sdk/src/builder/V3DutchOrderBuilder.ts

Lines changed: 71 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { BigNumber, ethers } from "ethers";
22
import invariant from "tiny-invariant";
33

44
import { OrderType } from "../constants";
5-
import { CosignedV3DutchOrder, CosignedV3DutchOrderInfo, UnsignedV3DutchOrder, V3CosignerData } from "../order/V3DutchOrder";
5+
import { CosignedV3DutchOrder, CosignedV3DutchOrderInfo, UnsignedV3DutchOrder, UnsignedV3DutchOrderInfo, V3CosignerData } from "../order/V3DutchOrder";
66
import { V3DutchInput, V3DutchOutput } from "../order/types";
77
import { getPermit2, getReactor, isCosigned } from "../utils";
88

@@ -40,56 +40,9 @@ export class V3DutchOrderBuilder extends OrderBuilder {
4040
}
4141

4242
build(): CosignedV3DutchOrder {
43-
invariant(this.info.cosigner !== undefined, "cosigner not set");
4443
invariant(this.info.cosignature !== undefined, "cosignature not set");
45-
invariant(this.info.input !== undefined, "input not set");
46-
invariant(
47-
this.info.outputs && this.info.outputs.length > 0,
48-
"outputs not set"
49-
);
50-
// Check if input curve is valid
51-
invariant(this.info.input.curve.relativeAmounts.length === this.info.input.curve.relativeBlocks.length, "relativeBlocks and relativeAmounts length mismatch");
52-
invariant(this.isRelativeBlocksIncreasing(this.info.input.curve.relativeBlocks), "relativeBlocks not strictly increasing");
53-
// For each output's curve, we need to make sure relativeBlocks is strictly increasing
54-
this.info.outputs.forEach((output) => {
55-
invariant(
56-
output.curve.relativeBlocks.length === output.curve.relativeAmounts.length,
57-
"relativeBlocks and relativeAmounts length mismatch"
58-
);
59-
// For each output's curve, we need to make sure relativeBlocks is strictly increasing
60-
invariant(this.isRelativeBlocksIncreasing(output.curve.relativeBlocks), "relativeBlocks not strictly increasing");
61-
});
62-
// In V3, we are not enforcing that the startAmount is greater than the endAmount
63-
invariant(this.info.cosignerData !== undefined, "cosignerData not set");
64-
invariant(this.info.cosignerData.decayStartBlock !== undefined, "decayStartBlock not set");
65-
// In V3, we don't have a decayEndTime field and use OrderInfo.deadline field for Permit2
66-
invariant(this.orderInfo.deadline !== undefined, "deadline not set");
67-
invariant(
68-
this.info.cosignerData.exclusiveFiller !== undefined,
69-
"exclusiveFiller not set"
70-
);
71-
invariant(
72-
this.info.cosignerData.exclusivityOverrideBps !== undefined,
73-
"exclusivityOverrideBps not set"
74-
);
75-
invariant(
76-
this.info.cosignerData.inputOverride.lte(this.info.input.startAmount),
77-
"inputOverride larger than original input"
78-
);
79-
invariant(
80-
this.info.cosignerData.outputOverrides.length > 0,
81-
"outputOverrides not set"
82-
);
83-
this.info.cosignerData.outputOverrides.forEach((override, idx) => {
84-
invariant(
85-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
86-
override.gte(this.info.outputs![idx].startAmount),
87-
"outputOverride smaller than original output"
88-
);
89-
});
90-
invariant(this.info.input !== undefined, "original input not set");
91-
// We are not checking if the decayStartTime is before the deadline because it is not enforced in the smart contract
92-
44+
this.checkUnsignedInvariants(this.info);
45+
this.checkCosignedInvariants(this.info);
9346
return new CosignedV3DutchOrder(
9447
Object.assign(this.getOrderInfo(), {
9548
cosignerData: this.info.cosignerData,
@@ -101,7 +54,6 @@ export class V3DutchOrderBuilder extends OrderBuilder {
10154
this.chainId,
10255
this.permit2Address
10356
);
104-
10557
}
10658
private permit2Address: string;
10759
private info: Partial<CosignedV3DutchOrderInfo>;
@@ -142,12 +94,12 @@ export class V3DutchOrderBuilder extends OrderBuilder {
14294

14395
private initializeCosignerData(data: Partial<V3CosignerData>): void {
14496
this.info.cosignerData = {
145-
decayStartBlock: 0,
146-
exclusiveFiller: ethers.constants.AddressZero,
147-
exclusivityOverrideBps: BigNumber.from(0),
148-
inputOverride: BigNumber.from(0),
149-
outputOverrides: [],
150-
...data,
97+
decayStartBlock: 0,
98+
exclusiveFiller: ethers.constants.AddressZero,
99+
exclusivityOverrideBps: BigNumber.from(0),
100+
inputOverride: BigNumber.from(0),
101+
outputOverrides: [],
102+
...data,
151103
};
152104
}
153105

@@ -162,6 +114,61 @@ export class V3DutchOrderBuilder extends OrderBuilder {
162114
return true;
163115
}
164116

117+
private checkUnsignedInvariants(info: Partial<CosignedV3DutchOrderInfo>): asserts info is UnsignedV3DutchOrderInfo {
118+
invariant(info.cosigner !== undefined, "cosigner not set");
119+
invariant(info.input !== undefined, "input not set");
120+
invariant(
121+
info.outputs && info.outputs.length > 0,
122+
"outputs not set"
123+
);
124+
// Check if input curve is valid
125+
invariant(info.input.curve.relativeAmounts.length === info.input.curve.relativeBlocks.length, "relativeBlocks and relativeAmounts length mismatch");
126+
invariant(this.isRelativeBlocksIncreasing(info.input.curve.relativeBlocks), "relativeBlocks not strictly increasing");
127+
// For each output's curve, we need to make sure relativeBlocks is strictly increasing
128+
info.outputs.forEach((output) => {
129+
invariant(
130+
output.curve.relativeBlocks.length === output.curve.relativeAmounts.length,
131+
"relativeBlocks and relativeAmounts length mismatch"
132+
);
133+
// For each output's curve, we need to make sure relativeBlocks is strictly increasing
134+
invariant(this.isRelativeBlocksIncreasing(output.curve.relativeBlocks), "relativeBlocks not strictly increasing");
135+
});
136+
// In V3, we don't have a decayEndTime field and use OrderInfo.deadline field for Permit2
137+
invariant(this.orderInfo.deadline !== undefined, "deadline not set");
138+
invariant(this.orderInfo.swapper !== undefined, "swapper not set");
139+
}
140+
141+
private checkCosignedInvariants(info: Partial<CosignedV3DutchOrderInfo>): asserts info is CosignedV3DutchOrderInfo {
142+
// In V3, we are not enforcing that the startAmount is greater than the endAmount
143+
invariant(info.cosignerData !== undefined, "cosignerData not set");
144+
invariant(info.cosignerData.decayStartBlock !== undefined, "decayStartBlock not set");
145+
invariant(
146+
info.cosignerData.exclusiveFiller !== undefined,
147+
"exclusiveFiller not set"
148+
);
149+
invariant(
150+
info.cosignerData.exclusivityOverrideBps !== undefined,
151+
"exclusivityOverrideBps not set"
152+
);
153+
invariant(
154+
info.cosignerData.outputOverrides.length > 0,
155+
"outputOverrides not set"
156+
);
157+
invariant(
158+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
159+
info.cosignerData.inputOverride.lte(this.info.input!.startAmount),
160+
"inputOverride larger than original input"
161+
);
162+
info.cosignerData.outputOverrides.forEach((override, idx) => {
163+
invariant(
164+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
165+
override.gte(this.info.outputs![idx].startAmount),
166+
"outputOverride smaller than original output"
167+
);
168+
});
169+
// We are not checking if the decayStartTime is before the deadline because it is not enforced in the smart contract
170+
}
171+
165172
input(input: V3DutchInput): this {
166173
this.info.input = input;
167174
return this;
@@ -171,7 +178,7 @@ export class V3DutchOrderBuilder extends OrderBuilder {
171178
this.info.outputs?.push(output);
172179
return this;
173180
}
174-
181+
175182
inputOverride(inputOverride: BigNumber): this {
176183
if (!this.info.cosignerData) {
177184
this.initializeCosignerData({ inputOverride });
@@ -183,9 +190,9 @@ export class V3DutchOrderBuilder extends OrderBuilder {
183190

184191
outputOverrides(outputOverrides: BigNumber[]): this {
185192
if (!this.info.cosignerData) {
186-
this.initializeCosignerData({ outputOverrides });
193+
this.initializeCosignerData({ outputOverrides });
187194
} else {
188-
this.info.cosignerData.outputOverrides = outputOverrides;
195+
this.info.cosignerData.outputOverrides = outputOverrides;
189196
}
190197
return this;
191198
}
@@ -199,7 +206,7 @@ export class V3DutchOrderBuilder extends OrderBuilder {
199206
super.swapper(swapper);
200207
return this;
201208
}
202-
209+
203210
nonce(nonce: BigNumber): this {
204211
super.nonce(nonce);
205212
return this;
@@ -235,8 +242,8 @@ export class V3DutchOrderBuilder extends OrderBuilder {
235242
// ensures that we only change non fee outputs
236243
nonFeeRecipient(newRecipient: string, feeRecipient?: string): this {
237244
invariant(
238-
newRecipient !== feeRecipient,
239-
`newRecipient must be different from feeRecipient: ${newRecipient}`
245+
newRecipient !== feeRecipient,
246+
`newRecipient must be different from feeRecipient: ${newRecipient}`
240247
);
241248
if (!this.info.outputs) {
242249
return this;
@@ -259,15 +266,7 @@ export class V3DutchOrderBuilder extends OrderBuilder {
259266
}
260267

261268
buildPartial(): UnsignedV3DutchOrder { //build an unsigned order
262-
invariant(this.info.cosigner !== undefined, "cosigner not set");
263-
invariant(this.info.input !== undefined, "input not set");
264-
invariant(
265-
this.info.outputs && this.info.outputs.length > 0,
266-
"outputs not set"
267-
);
268-
invariant(this.info.input !== undefined, "original input not set");
269-
invariant(!this.info.deadline, "deadline not set");
270-
invariant(!this.info.swapper, "swapper not set");
269+
this.checkUnsignedInvariants(this.info);
271270
return new UnsignedV3DutchOrder(
272271
Object.assign(this.getOrderInfo(), {
273272
input: this.info.input,

0 commit comments

Comments
 (0)