@@ -2,7 +2,7 @@ import { BigNumber, ethers } from "ethers";
2
2
import invariant from "tiny-invariant" ;
3
3
4
4
import { OrderType } from "../constants" ;
5
- import { CosignedV3DutchOrder , CosignedV3DutchOrderInfo , UnsignedV3DutchOrder , V3CosignerData } from "../order/V3DutchOrder" ;
5
+ import { CosignedV3DutchOrder , CosignedV3DutchOrderInfo , UnsignedV3DutchOrder , UnsignedV3DutchOrderInfo , V3CosignerData } from "../order/V3DutchOrder" ;
6
6
import { V3DutchInput , V3DutchOutput } from "../order/types" ;
7
7
import { getPermit2 , getReactor , isCosigned } from "../utils" ;
8
8
@@ -40,56 +40,9 @@ export class V3DutchOrderBuilder extends OrderBuilder {
40
40
}
41
41
42
42
build ( ) : CosignedV3DutchOrder {
43
- invariant ( this . info . cosigner !== undefined , "cosigner not set" ) ;
44
43
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 ) ;
93
46
return new CosignedV3DutchOrder (
94
47
Object . assign ( this . getOrderInfo ( ) , {
95
48
cosignerData : this . info . cosignerData ,
@@ -101,7 +54,6 @@ export class V3DutchOrderBuilder extends OrderBuilder {
101
54
this . chainId ,
102
55
this . permit2Address
103
56
) ;
104
-
105
57
}
106
58
private permit2Address : string ;
107
59
private info : Partial < CosignedV3DutchOrderInfo > ;
@@ -142,12 +94,12 @@ export class V3DutchOrderBuilder extends OrderBuilder {
142
94
143
95
private initializeCosignerData ( data : Partial < V3CosignerData > ) : void {
144
96
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 ,
151
103
} ;
152
104
}
153
105
@@ -162,6 +114,61 @@ export class V3DutchOrderBuilder extends OrderBuilder {
162
114
return true ;
163
115
}
164
116
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
+
165
172
input ( input : V3DutchInput ) : this {
166
173
this . info . input = input ;
167
174
return this ;
@@ -171,7 +178,7 @@ export class V3DutchOrderBuilder extends OrderBuilder {
171
178
this . info . outputs ?. push ( output ) ;
172
179
return this ;
173
180
}
174
-
181
+
175
182
inputOverride ( inputOverride : BigNumber ) : this {
176
183
if ( ! this . info . cosignerData ) {
177
184
this . initializeCosignerData ( { inputOverride } ) ;
@@ -183,9 +190,9 @@ export class V3DutchOrderBuilder extends OrderBuilder {
183
190
184
191
outputOverrides ( outputOverrides : BigNumber [ ] ) : this {
185
192
if ( ! this . info . cosignerData ) {
186
- this . initializeCosignerData ( { outputOverrides } ) ;
193
+ this . initializeCosignerData ( { outputOverrides } ) ;
187
194
} else {
188
- this . info . cosignerData . outputOverrides = outputOverrides ;
195
+ this . info . cosignerData . outputOverrides = outputOverrides ;
189
196
}
190
197
return this ;
191
198
}
@@ -199,7 +206,7 @@ export class V3DutchOrderBuilder extends OrderBuilder {
199
206
super . swapper ( swapper ) ;
200
207
return this ;
201
208
}
202
-
209
+
203
210
nonce ( nonce : BigNumber ) : this {
204
211
super . nonce ( nonce ) ;
205
212
return this ;
@@ -235,8 +242,8 @@ export class V3DutchOrderBuilder extends OrderBuilder {
235
242
// ensures that we only change non fee outputs
236
243
nonFeeRecipient ( newRecipient : string , feeRecipient ?: string ) : this {
237
244
invariant (
238
- newRecipient !== feeRecipient ,
239
- `newRecipient must be different from feeRecipient: ${ newRecipient } `
245
+ newRecipient !== feeRecipient ,
246
+ `newRecipient must be different from feeRecipient: ${ newRecipient } `
240
247
) ;
241
248
if ( ! this . info . outputs ) {
242
249
return this ;
@@ -259,15 +266,7 @@ export class V3DutchOrderBuilder extends OrderBuilder {
259
266
}
260
267
261
268
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 ) ;
271
270
return new UnsignedV3DutchOrder (
272
271
Object . assign ( this . getOrderInfo ( ) , {
273
272
input : this . info . input ,
0 commit comments