From 8d4adef16a65d174c36f2fe600d116b437d95add Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Thu, 12 Dec 2024 16:44:59 +0000 Subject: [PATCH 1/4] Tweak storage format --- api/_exclusivity/cache.ts | 18 +++++++++++++----- api/_exclusivity/utils.ts | 8 ++++++++ api/_types/exclusivity.types.ts | 8 ++++++++ api/relayer-config.ts | 18 ++++++++++++++++-- test/api/relayer-config.test.ts | 8 ++++---- 5 files changed, 49 insertions(+), 11 deletions(-) diff --git a/api/_exclusivity/cache.ts b/api/_exclusivity/cache.ts index d9431c4e1..2aa21b277 100644 --- a/api/_exclusivity/cache.ts +++ b/api/_exclusivity/cache.ts @@ -67,11 +67,19 @@ export async function getCachedRelayerFillLimit( * Sets a series of relayer fill limits in the cache. * * @param {string} relayer - The unique identifier for the relayer. + * @param {originChainId} originChainId - The origin chain of the route. + * @param {inputToken} inputToken - The input token on the origin chain. + * @param {destinationChainId} destinationChainId - The destination chain of the route. + * @param {outputToken} outputToken - The output token on the destination chain. * @param {RelayerFillLimit[]} entries - An array of relayer fill limit entries to store. * @returns {Promise} A promise that resolves when the operation is complete. */ export async function setCachedRelayerFillLimit( relayer: string, + originChainId: number, + inputToken: string, + destinationChainId: number, + outputToken: string, entries: RelayerFillLimit[] ): Promise { // Confirm what we're about to push to the cache is formatted properly @@ -81,13 +89,13 @@ export async function setCachedRelayerFillLimit( redisCache.set( buildRelayerFillLimitCacheKey( relayer, - entry.originChainId, - entry.destinationChainId, - entry.inputToken, - entry.outputToken + originChainId, + destinationChainId, + inputToken, + outputToken ), entry, - 120 + 600 ) ) ); diff --git a/api/_exclusivity/utils.ts b/api/_exclusivity/utils.ts index ca7b9ad37..29dbeb3c0 100644 --- a/api/_exclusivity/utils.ts +++ b/api/_exclusivity/utils.ts @@ -26,6 +26,10 @@ export const isTimestampValid = ( export async function updateLimits( relayer: string, + originChainId: number, + inputToken: string, + destinationChainId: number, + outputToken: string, limits: RelayerFillLimit[] ): Promise { const sortedLimits = limits @@ -51,6 +55,10 @@ export async function updateLimits( await setCachedRelayerFillLimit( relayer, + originChainId, + inputToken, + destinationChainId, + outputToken, sortedLimits.map(({ minOutputAmount, maxOutputAmount, ...rest }) => ({ minOutputAmount: minOutputAmount.toString(), // @todo: Less bodge maxOutputAmount: maxOutputAmount.toString(), // @todo: Less bodge diff --git a/api/_types/exclusivity.types.ts b/api/_types/exclusivity.types.ts index 17f1cba62..8352f1412 100644 --- a/api/_types/exclusivity.types.ts +++ b/api/_types/exclusivity.types.ts @@ -16,11 +16,19 @@ export const RelayerFillLimitSchema = object({ }); export const RelayerFillLimitArraySchema = array(RelayerFillLimitSchema); +export const RelayerRouteUpdateSchema = object({ + RelayerRoute, + RelayerFillLimitArraySchema, +}); export type RelayerFillLimit = Infer; export type RelayerConfigUpdate = { timestamp: number; + originChainId: number; + inputToken: string; + destinationChainId: number; + outputToken: string; relayerFillLimits: RelayerFillLimit[]; }; diff --git a/api/relayer-config.ts b/api/relayer-config.ts index 52fc8e837..305e11655 100644 --- a/api/relayer-config.ts +++ b/api/relayer-config.ts @@ -22,7 +22,14 @@ const handler = async ( const body = request.body as RelayerConfigUpdate; const { authorization } = request.headers; - const { relayerFillLimits, timestamp } = body; + const { + originChainId, + destinationChainId, + inputToken, + outputToken, + relayerFillLimits, + timestamp, + } = body; if (!isTimestampValid(timestamp, MAX_MESSAGE_AGE_SECONDS)) { return response.status(400).json({ message: "Message too old" }); } @@ -42,7 +49,14 @@ const handler = async ( .json({ message: "Invalid configuration payload" }); } - await updateLimits(relayer, relayerFillLimits); + await updateLimits( + relayer, + originChainId, + inputToken, + destinationChainId, + outputToken, + relayerFillLimits + ); return response.status(200).json({ message: "POST request received" }); }; diff --git a/test/api/relayer-config.test.ts b/test/api/relayer-config.test.ts index 24852dad8..a24522a9c 100644 --- a/test/api/relayer-config.test.ts +++ b/test/api/relayer-config.test.ts @@ -31,12 +31,12 @@ describe("Relayer Config API", () => { test("POST request with valid timestamp", async () => { const message: RelayerConfigUpdate = { timestamp: Date.now() / 1000, + originChainId: "1", + inputToken: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + destinationChainId: "42161", + outputToken: "0x82af49447d8a07e3bd95bd0d56f35241523fbab1", relayerFillLimits: [ { - originChainId: "1", - inputToken: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - destinationChainId: "42161", - outputToken: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", minOutputAmount: "1", maxOutputAmount: "2", balanceMultiplier: "1", From c0ba044603b50f55a284a4ee2d24b050b992129d Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Thu, 12 Dec 2024 18:46:39 +0000 Subject: [PATCH 2/4] fixes --- api/_types/exclusivity.types.ts | 11 +++++++---- test/api/relayer-config.test.ts | 8 ++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/api/_types/exclusivity.types.ts b/api/_types/exclusivity.types.ts index 8352f1412..83280e41e 100644 --- a/api/_types/exclusivity.types.ts +++ b/api/_types/exclusivity.types.ts @@ -2,11 +2,14 @@ import { array, boolean, Infer, object, optional } from "superstruct"; import { positiveFloatStr, positiveIntStr, validAddress } from "../_utils"; import { TypedVercelRequest } from "./generic.types"; -export const RelayerFillLimitSchema = object({ +export const RelayerRoute = object({ originChainId: positiveIntStr(), - destinationChainId: positiveIntStr(), inputToken: validAddress(), + destinationChainId: positiveIntStr(), outputToken: validAddress(), +}); + +export const RelayerFillLimitSchema = object({ minOutputAmount: positiveIntStr(), maxOutputAmount: positiveIntStr(), minProfitThreshold: positiveFloatStr(), @@ -25,9 +28,9 @@ export type RelayerFillLimit = Infer; export type RelayerConfigUpdate = { timestamp: number; - originChainId: number; + originChainId: string; inputToken: string; - destinationChainId: number; + destinationChainId: string; outputToken: string; relayerFillLimits: RelayerFillLimit[]; }; diff --git a/test/api/relayer-config.test.ts b/test/api/relayer-config.test.ts index a24522a9c..053f2f066 100644 --- a/test/api/relayer-config.test.ts +++ b/test/api/relayer-config.test.ts @@ -64,6 +64,10 @@ describe("Relayer Config API", () => { test("POST request with invalid timestamp", async () => { const message: RelayerConfigUpdate = { timestamp: Date.now() / 1000 - MAX_MESSAGE_AGE_SECONDS - 1, + originChainId: "1", + inputToken: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + destinationChainId: "10", + outputToken: "0x82af49447d8a07e3bd95bd0d56f35241523fbab1", relayerFillLimits: [], }; const signature = await whitelistedRelayer.signMessage( @@ -87,6 +91,10 @@ describe("Relayer Config API", () => { test("POST request with invalid signature", async () => { const message: RelayerConfigUpdate = { timestamp: Date.now() / 1000, + originChainId: "1", + inputToken: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + destinationChainId: "10", + outputToken: "0x82af49447d8a07e3bd95bd0d56f35241523fbab1", relayerFillLimits: [], }; const signature = await unauthorizedRelayer.signMessage( From a3e75f6db8dbbd183a9558d447fa08eb6c9a3d4e Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Thu, 12 Dec 2024 19:14:27 +0000 Subject: [PATCH 3/4] fix --- api/relayer-config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/relayer-config.ts b/api/relayer-config.ts index 0bc63162a..9670c6fad 100644 --- a/api/relayer-config.ts +++ b/api/relayer-config.ts @@ -90,9 +90,9 @@ const handlePost = async ( await updateLimits( relayer, - originChainId, + Number(originChainId), inputToken, - destinationChainId, + Number(destinationChainId), outputToken, relayerFillLimits ); From a6ba4195cb8d1bfc116ac7c8627547c6493dc1ff Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Thu, 12 Dec 2024 19:36:28 +0000 Subject: [PATCH 4/4] fix --- test/api/relayer-config.test.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/api/relayer-config.test.ts b/test/api/relayer-config.test.ts index de349ba81..f30d0e508 100644 --- a/test/api/relayer-config.test.ts +++ b/test/api/relayer-config.test.ts @@ -141,10 +141,6 @@ describe("Relayer Config API", () => { // Mock getLimits to return some test data const limits: RelayerFillLimit[] = [ { - originChainId: "1", - destinationChainId: "42161", - inputToken: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - outputToken: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", minOutputAmount: "1", maxOutputAmount: "2", balanceMultiplier: "1",