Skip to content

Commit

Permalink
chore: Prepare for new v3 types
Browse files Browse the repository at this point in the history
This PR just shuffles some existing types around to make room for the
new v3 types. It also introduces some convenience functions that will be
useful for discriminating between v2 and v3 types, as well as extracting
data from them. No functional change intended.
  • Loading branch information
pxrl committed Jan 16, 2024
1 parent 26c1b27 commit f3847d0
Show file tree
Hide file tree
Showing 4 changed files with 216 additions and 27 deletions.
140 changes: 113 additions & 27 deletions src/interfaces/SpokePool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,56 @@ import { SpokePoolClient } from "../clients";

export type { FundsDepositedEvent, V3FundsDepositedEvent };

export interface Deposit {
export interface DepositCommon {
depositId: number;
originChainId: number; // appended from chainID in the client.
destinationChainId: number;
depositor: string;
recipient: string;
quoteTimestamp: number;
message: string;
speedUpSignature?: string; // appended after initialization, if deposit was speedup (not part of Deposit event).
updatedRecipient?: string;
updatedMessage?: string;
}

export interface v2Deposit extends DepositCommon {
originToken: string;
amount: BigNumber;
originChainId: number; // appended from chainID in the client.
destinationChainId: number;
relayerFeePct: BigNumber;
quoteTimestamp: number;
realizedLpFeePct?: BigNumber; // appended after initialization (not part of Deposit event).
destinationToken: string; // appended after initialization (not part of Deposit event).
message: string;
speedUpSignature?: string | undefined; // appended after initialization, if deposit was speedup (not part of Deposit event).
newRelayerFeePct?: BigNumber; // appended after initialization, if deposit was speedup (not part of Deposit event).
updatedRecipient?: string;
updatedMessage?: string;
}

export interface DepositWithBlock extends Deposit, SortableEvent {
export interface v2DepositWithBlock extends v2Deposit, SortableEvent {
blockTimestamp: number;
quoteBlockNumber: number;
}

export interface v3Deposit extends DepositCommon {
inputToken: string;
inputAmount: BigNumber;
outputToken: string;
outputAmount: BigNumber;
fillDeadline: number;
exclusiveRelayer: string;
exclusivityDeadline: number;
relayerFeePct?: BigNumber;
realizedLpFeePct?: BigNumber; // appended after initialization (not part of Deposit event).
updatedOutputAmount?: BigNumber; // appended after initialization if deposit was updated.
}

export interface v3DepositWithBlock extends v3Deposit, SortableEvent {
blockTimestamp: number;
quoteBlockNumber: number;
}

export type DepositWithBlockStringified = Omit<
DepositWithBlock,
export type Deposit = v2Deposit; // @todo: Extend with v2Deposit | v3Deposit.
export type DepositWithBlock = v2DepositWithBlock; // @todo Extend with v2DepositWithBlock | v3DepositWithBlock.

export type v2DepositWithBlockStringified = Omit<
v2DepositWithBlock,
"amount" | "relayerFeePct" | "realizedLpFeePct" | "newRelayerFeePct"
> & {
amount: string;
Expand All @@ -39,6 +63,19 @@ export type DepositWithBlockStringified = Omit<
newRelayerFeePct?: string;
};

export type v3DepositWithBlockStringified = Omit<
v3DepositWithBlock,
"inputAmount" | "outputAmount" | "realizedLpFeePct" | "newRelayerFeePct"
> & {
amount: string;
relayerFeePct: string;
realizedLpFeePct?: string;
newRelayerFeePct?: string;
};

// @todo Extend with v3DepositWithBlockStringified.
export type DepositWithBlockStringified = v2DepositWithBlockStringified;

export interface RelayExecutionInfo {
recipient: string;
message: string;
Expand All @@ -53,30 +90,51 @@ export type RelayerRefundExecutionInfoStringified = Omit<
relayerFeePct: string;
payoutAdjustmentPct: string;
};
export interface Fill {

interface FillCommon {
depositId: number;
originChainId: number;
destinationChainId: number;
depositor: string;
recipient: string;
message: string;
relayer: string;
repaymentChainId: number;
}

export interface v2Fill extends FillCommon {
destinationToken: string;
amount: BigNumber;
totalFilledAmount: BigNumber;
fillAmount: BigNumber;
repaymentChainId: number;
originChainId: number;
relayerFeePct: BigNumber;
realizedLpFeePct: BigNumber;
depositId: number;
destinationToken: string;
relayer: string;
depositor: string;
recipient: string;
message: string;
destinationChainId: number;
updatableRelayData: RelayExecutionInfo;
}

export interface FillWithBlock extends Fill, SortableEvent {
export interface v3Fill extends FillCommon {
inputToken: string;
inputAmount: BigNumber;
outputToken: string;
outputAmount: BigNumber;
executionDeadline: number;
exclusivityDeadline: number;
exclusiveRelayer: string;
}

export interface v2FillWithBlock extends v2Fill, SortableEvent {
blockTimestamp: number;
}

export interface v3FillWithBlock extends v2Fill, SortableEvent {
blockTimestamp: number;
}

export type FillWithBlockStringified = Omit<
FillWithBlock,
export type Fill = v2Fill; // @todo: Extend with v2Fill | v3Fill.
export type FillWithBlock = v2FillWithBlock; // @todo Extend with v2FillWithBlock | v3FillWithBlock.

export type v2FillWithBlockStringified = Omit<
v2FillWithBlock,
"amount" | "relayerFeePct" | "totalFilledAmount" | "fillAmount" | "realizedLpFeePct" | "updatableRelayData"
> & {
amount: string;
Expand All @@ -87,20 +145,48 @@ export type FillWithBlockStringified = Omit<
updatableRelayData: RelayerRefundExecutionInfoStringified;
};

export interface SpeedUp {
export type v3FillWithBlockStringified = Omit<
v3FillWithBlock,
"inoutAmount" | "outputAmount" | "updatableRelayData"
> & {
inputAmount: string;
outputAmount: string;
updatableRelayData: RelayerRefundExecutionInfoStringified;
};

// @todo: Extend with v2FillWithBlockStringified | v3FillWithBlockStringified.
export type FillWithBlockStringified = v2FillWithBlockStringified;

export interface SpeedUpCommon {
depositor: string;
depositorSignature: string;
newRelayerFeePct: BigNumber;
depositId: number;
originChainId: number;
updatedRecipient: string;
updatedMessage: string;
}

export type SpeedUpStringified = Omit<SpeedUp, "newRelayerFeePct"> & {
export interface v2SpeedUp extends SpeedUpCommon {
newRelayerFeePct: BigNumber;
}

export interface v3SpeedUp extends SpeedUpCommon {
updatedOutputAmount: BigNumber;
}

export type SpeedUp = v2SpeedUp; // @todo Extend with v2SpeedUp | v3SpeedUp.

export type v2SpeedUpStringified = Omit<v2SpeedUp, "newRelayerFeePct"> & {
newRelayerFeePct: string;
};

export type v3SpeedUpStringified = Omit<v3SpeedUp, "updatedOutputAmount"> & {
updatedOutputAmount: string;
};

// @todo: Extend with v2SpeedUpStringified | v3SpeedUpStringified.
export type SpeedUpStringified = v2SpeedUpStringified;

export interface SlowFill {
relayHash: string;
amount: BigNumber;
Expand Down
59 changes: 59 additions & 0 deletions src/utils/MigrationUtils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { v2Deposit, v3Deposit, v2Fill, v3Fill, v2SpeedUp, v3SpeedUp } from "../interfaces";
import { BN } from "./BigNumberUtils";
import { isDefined } from "./TypeGuards";

type Deposit = v2Deposit | v3Deposit;
type Fill = v2Fill | v3Fill;
type SpeedUp = v2SpeedUp | v3SpeedUp;

export function isV2Deposit(deposit: Deposit): deposit is v2Deposit {
return isDefined((deposit as v2Deposit).originToken);
}

export function isV2SpeedUp(speedUp: SpeedUp): speedUp is v2SpeedUp {
return isDefined((speedUp as v2SpeedUp).newRelayerFeePct);
}

export function isV3Deposit(deposit: Deposit): deposit is v3Deposit {
return isDefined((deposit as v3Deposit).inputToken);
}

export function isV3SpeedUp(speedUp: SpeedUp): speedUp is v3SpeedUp {
return isDefined((speedUp as v3SpeedUp).updatedOutputAmount);
}

export function isV2Fill(fill: Fill): fill is v2Fill {
return isDefined((fill as v2Fill).destinationToken);
}

export function isV3Fill(fill: Fill): fill is v3Fill {
return isDefined((fill as v3Fill).inputToken);
}

export function getDepositInputToken(deposit: Deposit): string {
return isV2Deposit(deposit) ? deposit.originToken : deposit.inputToken;
}

export function getDepositOutputToken(deposit: Deposit): string {
return isV2Deposit(deposit) ? deposit.destinationToken : deposit.outputToken;
}

export function getFillOutputToken(fill: Fill): string {
return isV2Fill(fill) ? fill.destinationToken : fill.outputToken;
}

export function getDepositInputAmount(deposit: Deposit): BN {
return isV2Deposit(deposit) ? deposit.amount : deposit.inputAmount;
}

export function getDepositOutputAmount(deposit: Deposit): BN {
return isV2Deposit(deposit) ? deposit.amount : deposit.outputAmount;
}

export function getFillAmount(fill: Fill): BN {
return isV2Fill(fill) ? fill.amount : fill.outputAmount;
}

export function getTotalFilledAmount(fill: Fill): BN {
return isV2Fill(fill) ? fill.totalFilledAmount : fill.outputAmount;
}
43 changes: 43 additions & 0 deletions src/utils/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,16 @@ export type UpdateDepositDetailsMessageType = {
];
};

export type UpdateV3DepositDetailsMessageType = {
UpdateDepositDetails: [
{ name: "depositId"; type: "uint32" },
{ name: "originChainId"; type: "uint256" },
{ name: "updatedOutputAmount"; type: "uint256" },
{ name: "updatedRecipient"; type: "address" },
{ name: "updatedMessage"; type: "bytes" },
];
};

/**
* Utility function to get EIP-712 compliant typed data that can be signed with the JSON-RPC method
* `eth_signedTypedDataV4` in MetaMask (https://docs.metamask.io/guide/signing-data.html). The resulting signature
Expand Down Expand Up @@ -415,6 +425,39 @@ export function getUpdateDepositTypedData(
};
}

export function getUpdateV3DepositTypedData(
depositId: number,
originChainId: number,
updatedOutputAmount: BigNumber,
updatedRecipient: string,
updatedMessage: string
): TypedMessage<UpdateV3DepositDetailsMessageType> {
return {
types: {
UpdateDepositDetails: [
{ name: "depositId", type: "uint32" },
{ name: "originChainId", type: "uint256" },
{ name: "updatedOutputAmount", type: "uint256" },
{ name: "updatedRecipient", type: "address" },
{ name: "updatedMessage", type: "bytes" },
],
},
primaryType: "UpdateDepositDetails",
domain: {
name: "ACROSS-V2",
version: "1.0.0",
chainId: originChainId,
},
message: {
depositId,
originChainId,
updatedOutputAmount,
updatedRecipient,
updatedMessage,
},
};
}

export function randomAddress() {
return ethers.utils.getAddress(ethers.utils.hexlify(ethers.utils.randomBytes(20)));
}
1 change: 1 addition & 0 deletions src/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,4 @@ export * from "./DepositUtils";
export * from "./ValidatorUtils";
export * from "./AddressUtils";
export * from "./SpokeUtils";
export * from "./MigrationUtils";

0 comments on commit f3847d0

Please sign in to comment.