Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/interfaces/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ export type RelayData = interfaces.RelayData;
export type Deposit = interfaces.Deposit;
export type DepositWithBlock = interfaces.DepositWithBlock;
export type Fill = interfaces.Fill;
export type RelayExecutionEventInfo = interfaces.RelayExecutionEventInfo;
export type FillWithBlock = interfaces.FillWithBlock;
export type SpeedUp = interfaces.SpeedUp;
export type SlowFillRequest = interfaces.SlowFillRequest;
Expand Down
33 changes: 6 additions & 27 deletions test/Dataworker.loadData.slowFill.ts
Original file line number Diff line number Diff line change
Expand Up @@ -576,7 +576,7 @@ describe("Dataworker: Load bundle data: Computing slow fills", async function ()

it("Slow fill request for deposit that isn't eligible for slow fill", async function () {
const invalidOutputToken = erc20_1;
const _depositObject = await depositV3(
const depositObject = await depositV3(
spokePool_1,
destinationChainId,
depositor,
Expand All @@ -585,14 +585,7 @@ describe("Dataworker: Load bundle data: Computing slow fills", async function ()
invalidOutputToken.address,
amountToDeposit
);
const depositObject = {
..._depositObject,
inputToken: toAddressType(_depositObject.inputToken, originChainId),
outputToken: toAddressType(_depositObject.outputToken, destinationChainId),
depositor: toAddressType(_depositObject.depositor, originChainId),
recipient: toAddressType(_depositObject.recipient, destinationChainId),
exclusiveRelayer: toAddressType(_depositObject.exclusiveRelayer, destinationChainId),
};

await spokePoolClient_1.update();

await requestSlowFill(spokePool_2, relayer, depositObject);
Expand Down Expand Up @@ -621,7 +614,7 @@ describe("Dataworker: Load bundle data: Computing slow fills", async function ()
await mockConfigStore.update();
(spokePoolClient_1 as any).configStoreClient = mockConfigStore;
(spokePoolClient_2 as any).configStoreClient = mockConfigStore;
const _depositObject = await depositV3(
const depositObject = await depositV3(
spokePool_1,
destinationChainId,
depositor,
Expand All @@ -630,14 +623,7 @@ describe("Dataworker: Load bundle data: Computing slow fills", async function ()
erc20_2.address,
amountToDeposit
);
const depositObject = {
..._depositObject,
inputToken: toAddressType(_depositObject.inputToken, originChainId),
outputToken: toAddressType(_depositObject.outputToken, destinationChainId),
depositor: toAddressType(_depositObject.depositor, originChainId),
recipient: toAddressType(_depositObject.recipient, destinationChainId),
exclusiveRelayer: toAddressType(_depositObject.exclusiveRelayer, destinationChainId),
};

await spokePoolClient_1.update();
expect(mockConfigStore.liteChainIndicesUpdates.length).to.equal(1);
expect(mockConfigStore.liteChainIndicesUpdates[0].timestamp).to.be.lt(depositObject.quoteTimestamp);
Expand Down Expand Up @@ -667,7 +653,7 @@ describe("Dataworker: Load bundle data: Computing slow fills", async function ()
await mockConfigStore.update();
(spokePoolClient_1 as any).configStoreClient = mockConfigStore;
(spokePoolClient_2 as any).configStoreClient = mockConfigStore;
const _depositObject = await depositV3(
const depositObject = await depositV3(
spokePool_1,
destinationChainId,
depositor,
Expand All @@ -676,14 +662,7 @@ describe("Dataworker: Load bundle data: Computing slow fills", async function ()
erc20_2.address,
amountToDeposit
);
const depositObject = {
..._depositObject,
inputToken: toAddressType(_depositObject.inputToken, originChainId),
outputToken: toAddressType(_depositObject.outputToken, destinationChainId),
depositor: toAddressType(_depositObject.depositor, originChainId),
recipient: toAddressType(_depositObject.recipient, destinationChainId),
exclusiveRelayer: toAddressType(_depositObject.exclusiveRelayer, destinationChainId),
};

await spokePoolClient_1.update();
expect(mockConfigStore.liteChainIndicesUpdates.length).to.equal(1);
expect(mockConfigStore.liteChainIndicesUpdates[0].timestamp).to.be.lt(depositObject.quoteTimestamp);
Expand Down
6 changes: 4 additions & 2 deletions test/Dataworker.loadData.unexecutableSlowFill.ts
Original file line number Diff line number Diff line change
Expand Up @@ -238,8 +238,10 @@ describe("Dataworker: Load bundle data: Computing unexecutable slow fills", asyn
await spokePoolClient_1.update();
const deposits = spokePoolClient_1.getDeposits();
expect(deposits.length).to.equal(3);
const eligibleSlowFills = depositsWithSlowFillRequests.filter((x) => erc20_2.address === x.outputToken);
const ineligibleSlowFills = depositsWithSlowFillRequests.filter((x) => erc20_2.address !== x.outputToken);
const eligibleSlowFills = depositsWithSlowFillRequests.filter((x) => erc20_2.address === x.outputToken.toNative());
const ineligibleSlowFills = depositsWithSlowFillRequests.filter(
(x) => erc20_2.address !== x.outputToken.toNative()
);

// Generate slow fill requests for the slow fill-eligible deposits
await requestSlowFill(spokePool_2, relayer, eligibleSlowFills[0]);
Expand Down
39 changes: 18 additions & 21 deletions test/Relayer.BasicFill.ts
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,7 @@ describe("Relayer: Check for Unfilled Deposits and Fill", async function () {

// Make two deposits - one with the relayer as exclusiveRelayer, and one with a random address.
// Verify that the relayer can immediately fill the first deposit, and both after the exclusivity window.
for (const exclusiveRelayer of [randomAddress(), relayerAddress]) {
for (const exclusiveRelayer of [randomAddress(), relayerAddress.toNative()]) {
const deposit = await depositV3(
spokePool_1,
destinationChainId,
Expand All @@ -463,18 +463,15 @@ describe("Relayer: Check for Unfilled Deposits and Fill", async function () {

deposits.forEach((deposit) => {
const depositHash = spokePoolClients[deposit.destinationChainId].getDepositHash(deposit);
const status =
deposit.exclusiveRelayer === relayerAddress.toEvmAddress() ? FillStatus.Filled : FillStatus.Unfilled;
const status = deposit.exclusiveRelayer.eq(relayerAddress) ? FillStatus.Filled : FillStatus.Unfilled;
expect(fillStatus[depositHash] ?? FillStatus.Unfilled).to.equal(status);
});

txnReceipts = await relayerInstance.checkForUnfilledDepositsAndFill();
expect((await txnReceipts[destinationChainId]).length).to.equal(0);
expect(lastSpyLogIncludes(spy, "0 unfilled deposits found")).to.be.true;

const exclusiveDeposit = deposits.find(
({ exclusiveRelayer }) => exclusiveRelayer !== relayerAddress.toEvmAddress()
);
const exclusiveDeposit = deposits.find(({ exclusiveRelayer }) => exclusiveRelayer.eq(relayerAddress));
expect(exclusiveDeposit).to.exist;
await spokePool_2.setCurrentTime(exclusiveDeposit!.exclusivityDeadline + 1);
await updateAllClients();
Expand Down Expand Up @@ -591,10 +588,7 @@ describe("Relayer: Check for Unfilled Deposits and Fill", async function () {
outputToken,
outputAmount
);
const fillAmount = profitClient.getFillAmountInUsd({
...deposit1,
outputToken: toAddressType(deposit1.outputToken, destinationChainId),
})!;
const fillAmount = profitClient.getFillAmountInUsd(deposit1)!;
expect(fillAmount).to.exist;

// Simple escalating confirmation requirements; cap off with a default upper limit.
Expand Down Expand Up @@ -644,14 +638,7 @@ describe("Relayer: Check for Unfilled Deposits and Fill", async function () {
await updateAllClients();

originChainCommitment = relayerInstance.computeOriginChainCommitment(originChainId, 0, Number.MAX_SAFE_INTEGER);
expect(
originChainCommitment.eq(
getFillAmount(
{ ...deposit1, outputToken: toAddressType(deposit1.outputToken, destinationChainId) },
tokenPrice
)
)
).to.be.true;
expect(originChainCommitment.eq(getFillAmount(deposit1, tokenPrice))).to.be.true;

let originChainLimits = relayerInstance.computeOriginChainLimits(originChainId);
expect(isChainOvercommitted(originChainLimits)).to.be.false;
Expand Down Expand Up @@ -955,7 +942,7 @@ describe("Relayer: Check for Unfilled Deposits and Fill", async function () {
spokePool_1,
{
...deposit,
updatedRecipient: update.recipient,
updatedRecipient: toAddressType(update.recipient, destinationChainId),
updatedOutputAmount: update.outputAmount,
updatedMessage: update.message,
},
Expand Down Expand Up @@ -1022,7 +1009,12 @@ describe("Relayer: Check for Unfilled Deposits and Fill", async function () {
const updatedRecipient = randomAddress();
await updateDeposit(
spokePool_1,
{ ...deposit, updatedRecipient, updatedOutputAmount, updatedMessage },
{
...deposit,
updatedRecipient: toAddressType(updatedRecipient, destinationChainId),
updatedOutputAmount,
updatedMessage,
},
depositor
);

Expand All @@ -1039,7 +1031,12 @@ describe("Relayer: Check for Unfilled Deposits and Fill", async function () {
updatedMessage = EMPTY_MESSAGE;
await updateDeposit(
spokePool_1,
{ ...deposit, updatedRecipient, updatedOutputAmount, updatedMessage },
{
...deposit,
updatedRecipient: toAddressType(updatedRecipient, destinationChainId),
updatedOutputAmount,
updatedMessage,
},
depositor
);

Expand Down
11 changes: 2 additions & 9 deletions test/Relayer.SlowFill.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ import {
winston,
deployMulticall3,
} from "./utils";
import { SvmAddress, EvmAddress, toAddressType } from "../src/utils";
import { SvmAddress, EvmAddress } from "../src/utils";

import { Relayer } from "../src/relayer/Relayer";
import { RelayerConfig } from "../src/relayer/RelayerConfig"; // Tested
Expand Down Expand Up @@ -241,14 +241,7 @@ describe("Relayer: Initiates slow fill requests", async function () {

// Verify that the slowFill request was received by the destination SpokePoolClient.
await Promise.all([spokePoolClient_1.update(), spokePoolClient_2.update(), hubPoolClient.update()]);
const slowFillRequest = spokePoolClient_2.getSlowFillRequest({
...deposit,
inputToken: toAddressType(inputToken, originChainId),
outputToken: toAddressType(outputToken, destinationChainId),
depositor: toAddressType(deposit.depositor, originChainId),
recipient: toAddressType(deposit.recipient, destinationChainId),
exclusiveRelayer: toAddressType(deposit.exclusiveRelayer, destinationChainId),
});
const slowFillRequest = spokePoolClient_2.getSlowFillRequest(deposit);
expect(slowFillRequest).to.exist;

const txnReceipts = await relayerInstance.checkForUnfilledDepositsAndFill();
Expand Down
51 changes: 14 additions & 37 deletions test/Relayer.UnfilledDeposits.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ import {
randomAddress,
setupTokensForWallet,
deployMulticall3,
depositIntoPrimitiveTypes,
fillIntoPrimitiveTypes,
} from "./utils";
// Tested
import { Relayer } from "../src/relayer/Relayer";
Expand Down Expand Up @@ -233,14 +235,7 @@ describe("Relayer: Unfilled Deposits", async function () {
unfilledDeposits.map((unfilledDeposit) => {
return {
...unfilledDeposit,
deposit: {
...unfilledDeposit.deposit,
inputToken: unfilledDeposit.deposit.inputToken.toEvmAddress(),
outputToken: unfilledDeposit.deposit.outputToken.toEvmAddress(),
depositor: unfilledDeposit.deposit.depositor.toEvmAddress(),
recipient: unfilledDeposit.deposit.recipient.toEvmAddress(),
exclusiveRelayer: unfilledDeposit.deposit.exclusiveRelayer.toEvmAddress(),
},
deposit: depositIntoPrimitiveTypes(unfilledDeposit.deposit),
};
})
)
Expand All @@ -249,7 +244,7 @@ describe("Relayer: Unfilled Deposits", async function () {
[...deposits]
.sort((a, b) => (a.destinationChainId > b.destinationChainId ? 1 : -1))
.map((deposit) => ({
deposit,
deposit: depositIntoPrimitiveTypes(deposit),
unfilledAmount: deposit.outputAmount,
invalidFills: [],
version: configStoreClient.configStoreVersion,
Expand Down Expand Up @@ -287,14 +282,7 @@ describe("Relayer: Unfilled Deposits", async function () {
unfilledDeposits.map((unfilledDeposit) => {
return {
...unfilledDeposit,
deposit: {
...unfilledDeposit.deposit,
inputToken: unfilledDeposit.deposit.inputToken.toEvmAddress(),
outputToken: unfilledDeposit.deposit.outputToken.toEvmAddress(),
depositor: unfilledDeposit.deposit.depositor.toEvmAddress(),
recipient: unfilledDeposit.deposit.recipient.toEvmAddress(),
exclusiveRelayer: unfilledDeposit.deposit.exclusiveRelayer.toEvmAddress(),
},
deposit: depositIntoPrimitiveTypes(unfilledDeposit.deposit),
};
})
)
Expand All @@ -303,7 +291,7 @@ describe("Relayer: Unfilled Deposits", async function () {
deposits
.filter(({ depositId }) => depositId !== filledDeposit!.depositId)
.map((deposit) => ({
deposit,
deposit: depositIntoPrimitiveTypes(deposit),
unfilledAmount: deposit.outputAmount,
invalidFills: [],
version: configStoreClient.configStoreVersion,
Expand Down Expand Up @@ -333,15 +321,12 @@ describe("Relayer: Unfilled Deposits", async function () {
unfilledDeposits = _getAllUnfilledDeposits();
expect(
unfilledDeposits.map((unfilledDeposit) => {
const depositV3PrimitiveEvmArgs = depositIntoPrimitiveTypes(unfilledDeposit.deposit);
return {
...unfilledDeposit,
deposit: {
...unfilledDeposit.deposit,
inputToken: unfilledDeposit.deposit.inputToken.toEvmAddress(),
outputToken: unfilledDeposit.deposit.outputToken.toEvmAddress(),
depositor: unfilledDeposit.deposit.depositor.toEvmAddress(),
recipient: unfilledDeposit.deposit.recipient.toEvmAddress(),
exclusiveRelayer: unfilledDeposit.deposit.exclusiveRelayer.toEvmAddress(),
...depositV3PrimitiveEvmArgs,
},
invalidFills: [
{
Expand All @@ -366,12 +351,14 @@ describe("Relayer: Unfilled Deposits", async function () {
{
deposit: {
...deposit,
...depositIntoPrimitiveTypes(deposit),
depositId: sdkUtils.toBN(deposit.depositId),
},
unfilledAmount: deposit.outputAmount,
invalidFills: [
{
...invalidFill,
...fillIntoPrimitiveTypes(invalidFill),
depositId: sdkUtils.toBN(invalidFill.depositId),
},
],
Expand Down Expand Up @@ -516,14 +503,7 @@ describe("Relayer: Unfilled Deposits", async function () {
outputAmount,
{ quoteTimestamp }
);
deposits.push({
...deposit,
inputToken: toAddressType(deposit.inputToken, originChainId),
outputToken: toAddressType(deposit.outputToken, destinationChainId),
depositor: toAddressType(deposit.depositor, originChainId),
recipient: toAddressType(deposit.recipient, destinationChainId),
exclusiveRelayer: toAddressType(deposit.exclusiveRelayer, destinationChainId),
});
deposits.push(deposit);

// Modify the HubPool LP balance to ensure that subsequent deposits will receive a different LP fee.
const lpTokenBalance = await lpToken.balanceOf(owner.address);
Expand Down Expand Up @@ -621,11 +601,7 @@ describe("Relayer: Unfilled Deposits", async function () {
...unfilledDeposit,
deposit: {
...unfilledDeposit.deposit,
inputToken: unfilledDeposit.deposit.inputToken.toEvmAddress(),
outputToken: unfilledDeposit.deposit.outputToken.toEvmAddress(),
depositor: unfilledDeposit.deposit.depositor.toEvmAddress(),
recipient: unfilledDeposit.deposit.recipient.toEvmAddress(),
exclusiveRelayer: unfilledDeposit.deposit.exclusiveRelayer.toEvmAddress(),
...depositIntoPrimitiveTypes(unfilledDeposit.deposit),
},
invalidFills: [
{
Expand All @@ -649,13 +625,14 @@ describe("Relayer: Unfilled Deposits", async function () {
.to.deep.equal([
{
deposit: {
...deposit,
...depositIntoPrimitiveTypes(deposit),
depositId: sdkUtils.toBN(deposit.depositId),
},
unfilledAmount: deposit.outputAmount,
invalidFills: [
{
...invalidFill,
...fillIntoPrimitiveTypes(invalidFill),
depositId: sdkUtils.toBN(invalidFill.depositId),
},
],
Expand Down
Loading