Skip to content

Commit 361f559

Browse files
committed
feat, test: Cosigned toJSON, fromJSON
1 parent 7c8d8c4 commit 361f559

File tree

3 files changed

+178
-1
lines changed

3 files changed

+178
-1
lines changed

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

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { BigNumber, constants } from "ethers";
22

33
import { CosignedV3DutchOrder, UnsignedV3DutchOrder } from "../order/V3DutchOrder";
4+
import { encodeExclusiveFillerData } from "../order/validation";
45

56
import { V3DutchOrderBuilder } from "./V3DutchOrderBuilder";
67

@@ -564,6 +565,103 @@ describe("V3DutchOrderBuilder", () => {
564565
);
565566
});
566567

568+
it("Regenerate builder from order JSON", () => {
569+
const deadline = Math.floor(Date.now() / 1000) + 1000;
570+
const fillerAddress = "0x1111111111111111111111111111111111111111";
571+
const additionalValidationContract =
572+
"0x2222222222222222222222222222222222222222";
573+
const timestamp = Math.floor(Date.now() / 1000) + 100;
574+
const validationInfo = encodeExclusiveFillerData(
575+
fillerAddress,
576+
timestamp,
577+
1,
578+
additionalValidationContract
579+
);
580+
const order = builder
581+
.cosigner(constants.AddressZero)
582+
.cosignature("0x")
583+
.decayStartBlock(212121)
584+
.input({
585+
token: INPUT_TOKEN,
586+
startAmount: INPUT_START_AMOUNT,
587+
curve: {
588+
relativeBlocks: [1],
589+
relativeAmounts: [BigInt(0)],
590+
},
591+
maxAmount: INPUT_START_AMOUNT.add(1),
592+
})
593+
.output({
594+
token: OUTPUT_TOKEN,
595+
startAmount: OUTPUT_START_AMOUNT,
596+
curve: {
597+
relativeBlocks: [4],
598+
relativeAmounts: [BigInt(4)],
599+
},
600+
recipient: constants.AddressZero,
601+
})
602+
.inputOverride(INPUT_START_AMOUNT.mul(99).div(100))
603+
.outputOverrides([OUTPUT_START_AMOUNT])
604+
.deadline(deadline)
605+
.swapper(constants.AddressZero)
606+
.nonce(BigNumber.from(100))
607+
.validation(validationInfo)
608+
.build();
609+
610+
const json = order.toJSON();
611+
const jsonToOrder = CosignedV3DutchOrder.fromJSON(json, 1);
612+
const regeneratedBuilder = V3DutchOrderBuilder.fromOrder(jsonToOrder);
613+
const regeneratedOrder = regeneratedBuilder.build();
614+
expect(regeneratedOrder.toJSON()).toMatchObject(order.toJSON());
615+
});
616+
617+
it("Regenerate builder and modify", () => {
618+
const deadline = Math.floor(Date.now() / 1000) + 1000;
619+
const fillerAddress = "0x1111111111111111111111111111111111111111";
620+
const additionalValidationContract =
621+
"0x2222222222222222222222222222222222222222";
622+
const timestamp = Math.floor(Date.now() / 1000) + 100;
623+
const validationInfo = encodeExclusiveFillerData(
624+
fillerAddress,
625+
timestamp,
626+
1,
627+
additionalValidationContract
628+
);
629+
const order = builder
630+
.cosigner(constants.AddressZero)
631+
.cosignature("0x")
632+
.decayStartBlock(212121)
633+
.input({
634+
token: INPUT_TOKEN,
635+
startAmount: INPUT_START_AMOUNT,
636+
curve: {
637+
relativeBlocks: [1],
638+
relativeAmounts: [BigInt(0)],
639+
},
640+
maxAmount: INPUT_START_AMOUNT.add(1),
641+
})
642+
.output({
643+
token: OUTPUT_TOKEN,
644+
startAmount: OUTPUT_START_AMOUNT,
645+
curve: {
646+
relativeBlocks: [4],
647+
relativeAmounts: [BigInt(4)],
648+
},
649+
recipient: constants.AddressZero,
650+
})
651+
.inputOverride(INPUT_START_AMOUNT.mul(99).div(100))
652+
.outputOverrides([OUTPUT_START_AMOUNT])
653+
.deadline(deadline)
654+
.swapper(constants.AddressZero)
655+
.nonce(BigNumber.from(100))
656+
.validation(validationInfo)
657+
.build();
658+
659+
const regeneratedBuilder = V3DutchOrderBuilder.fromOrder(order);
660+
regeneratedBuilder.decayStartBlock(214221422142);
661+
const regeneratedOrder = regeneratedBuilder.build();
662+
expect(regeneratedOrder.info.cosignerData.decayStartBlock).toEqual(214221422142);
663+
});
664+
567665
describe("Partial order tests", () => {
568666
it("Test valid order with buildPartial", () => {
569667
const order = builder

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import invariant from "tiny-invariant";
44
import { OrderType } from "../constants";
55
import { CosignedV3DutchOrder, CosignedV3DutchOrderInfo, UnsignedV3DutchOrder, UnsignedV3DutchOrderInfo, V3CosignerData } from "../order/V3DutchOrder";
66
import { V3DutchInput, V3DutchOutput } from "../order/types";
7+
import { ValidationInfo } from "../order/validation";
78
import { getPermit2, getReactor, isCosigned } from "../utils";
89

910
import { OrderBuilder } from "./OrderBuilder";
@@ -212,6 +213,11 @@ export class V3DutchOrderBuilder extends OrderBuilder {
212213
return this;
213214
}
214215

216+
validation(info: ValidationInfo): this {
217+
super.validation(info);
218+
return this;
219+
}
220+
215221
cosignerData(cosignerData: V3CosignerData): this {
216222
this.decayStartBlock(cosignerData.decayStartBlock);
217223
this.exclusiveFiller(cosignerData.exclusiveFiller);

sdks/uniswapx-sdk/src/order/V3DutchOrder.ts

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ export type UnsignedV3DutchOrderInfo = OrderInfo & {
2828
outputs: V3DutchOutput[];
2929
};
3030

31+
export type CosignedV3DutchOrderInfoJSON = UnsignedV3DutchOrderInfoJSON & {
32+
cosignerData: V3CosignerDataJSON;
33+
cosignature: string;
34+
};
35+
3136
export type CosignedV3DutchOrderInfo = UnsignedV3DutchOrderInfo & {
3237
cosignerData: V3CosignerData;
3338
cosignature: string;
@@ -175,7 +180,10 @@ export class UnsignedV3DutchOrder implements OffChainOrder {
175180
/**
176181
* @inheritdoc order
177182
*/
178-
toJSON(): UnsignedV3DutchOrderInfoJSON {
183+
toJSON(): UnsignedV3DutchOrderInfoJSON & {
184+
permit2Address: string;
185+
chainId: number;
186+
} {
179187
return {
180188
reactor: this.info.reactor,
181189
swapper: this.info.swapper,
@@ -202,6 +210,8 @@ export class UnsignedV3DutchOrder implements OffChainOrder {
202210
},
203211
recipient: output.recipient,
204212
})),
213+
chainId: this.chainId,
214+
permit2Address: this.permit2Address,
205215
}
206216
};
207217

@@ -323,6 +333,49 @@ export class CosignedV3DutchOrder extends UnsignedV3DutchOrder {
323333
);
324334
}
325335

336+
static fromJSON(
337+
json: CosignedV3DutchOrderInfoJSON,
338+
chainId: number,
339+
_permit2Address?: string
340+
): CosignedV3DutchOrder {
341+
return new CosignedV3DutchOrder(
342+
{
343+
...json,
344+
nonce: BigNumber.from(json.nonce),
345+
input: {
346+
token: json.input.token,
347+
startAmount: BigNumber.from(json.input.startAmount),
348+
curve: {
349+
relativeBlocks: json.input.curve.relativeBlocks,
350+
relativeAmounts: json.input.curve.relativeAmounts.map(amount => BigInt(amount)),
351+
},
352+
maxAmount: BigNumber.from(json.input.maxAmount),
353+
},
354+
outputs: json.outputs.map(output => ({
355+
token: output.token,
356+
startAmount: BigNumber.from(output.startAmount),
357+
curve: {
358+
relativeBlocks: output.curve.relativeBlocks,
359+
relativeAmounts: output.curve.relativeAmounts.map(amount => BigInt(amount)),
360+
},
361+
recipient: output.recipient,
362+
})),
363+
cosignerData: {
364+
decayStartBlock: json.cosignerData.decayStartBlock,
365+
exclusiveFiller: json.cosignerData.exclusiveFiller,
366+
exclusivityOverrideBps: BigNumber.from(
367+
json.cosignerData.exclusivityOverrideBps
368+
),
369+
inputOverride: BigNumber.from(json.cosignerData.inputOverride),
370+
outputOverrides: json.cosignerData.outputOverrides.map(BigNumber.from),
371+
},
372+
cosignature: json.cosignature,
373+
},
374+
chainId,
375+
_permit2Address
376+
);
377+
}
378+
326379
constructor(
327380
public readonly info: CosignedV3DutchOrderInfo,
328381
public readonly chainId: number,
@@ -331,6 +384,26 @@ export class CosignedV3DutchOrder extends UnsignedV3DutchOrder {
331384
super(info, chainId, _permit2Address);
332385
}
333386

387+
/**
388+
* @inheritdoc order
389+
*/
390+
toJSON(): CosignedV3DutchOrderInfoJSON & {
391+
permit2Address: string;
392+
chainId: number;
393+
} {
394+
return {
395+
...super.toJSON(),
396+
cosignerData: {
397+
decayStartBlock: this.info.cosignerData.decayStartBlock,
398+
exclusiveFiller: this.info.cosignerData.exclusiveFiller,
399+
exclusivityOverrideBps: this.info.cosignerData.exclusivityOverrideBps.toNumber(),
400+
inputOverride: this.info.cosignerData.inputOverride.toString(),
401+
outputOverrides: this.info.cosignerData.outputOverrides.map(override => override.toString()),
402+
},
403+
cosignature: this.info.cosignature,
404+
};
405+
}
406+
334407
static parse(
335408
encoded: string,
336409
chainId: number,

0 commit comments

Comments
 (0)