diff --git a/packages/asset-swapper/src/constants.ts b/packages/asset-swapper/src/constants.ts index 496a76fe49..3cd262b4c8 100644 --- a/packages/asset-swapper/src/constants.ts +++ b/packages/asset-swapper/src/constants.ts @@ -52,6 +52,7 @@ const DEFAULT_SWAP_QUOTER_OPTS: SwapQuoterOpts = { rfqt: { takerApiKeyWhitelist: [], makerAssetOfferings: {}, + txOriginBlacklist: new Set(), }, tokenAdjacencyGraph: DEFAULT_TOKEN_ADJACENCY_GRAPH, }; diff --git a/packages/asset-swapper/src/swap_quoter.ts b/packages/asset-swapper/src/swap_quoter.ts index a514d78609..692da34b5f 100644 --- a/packages/asset-swapper/src/swap_quoter.ts +++ b/packages/asset-swapper/src/swap_quoter.ts @@ -410,6 +410,14 @@ export class SwapQuoter { return whitelistedApiKeys.includes(apiKey); } + private _isTxOriginBlacklisted(txOrigin: string | undefined): boolean { + if (!txOrigin) { + return false; + } + const blacklistedTxOrigins = this._rfqtOptions ? this._rfqtOptions.txOriginBlacklist : new Set(); + return blacklistedTxOrigins.has(txOrigin.toLowerCase()); + } + private _validateRfqtOpts( sourceFilters: SourceFilters, rfqt: RfqtRequestOpts | undefined, @@ -438,6 +446,19 @@ export class SwapQuoter { return undefined; } + // If the requested tx origin is blacklisted, raise a warning and disable RFQ + if (this._isTxOriginBlacklisted(txOrigin)) { + if (this._rfqtOptions && this._rfqtOptions.warningLogger) { + this._rfqtOptions.warningLogger( + { + txOrigin, + }, + 'Attempt at using a tx Origin that is blacklisted. Disabling RFQ for the request lifetime.', + ); + } + return undefined; + } + // Otherwise check other RFQ options if ( intentOnFilling && // The requestor is asking for a firm quote diff --git a/packages/asset-swapper/src/types.ts b/packages/asset-swapper/src/types.ts index 306ea4e8dd..2a83b33b33 100644 --- a/packages/asset-swapper/src/types.ts +++ b/packages/asset-swapper/src/types.ts @@ -286,6 +286,7 @@ export interface RfqtFirmQuoteValidator { export interface SwapQuoterRfqtOpts { takerApiKeyWhitelist: string[]; makerAssetOfferings: RfqtMakerAssetOfferings; + txOriginBlacklist: Set; altRfqCreds?: { altRfqApiKey: string; altRfqProfile: string;