diff --git a/schema/tables.ts b/schema/tables.ts index ae58d1d..dc4501d 100644 --- a/schema/tables.ts +++ b/schema/tables.ts @@ -11,6 +11,9 @@ export const orderTypeEnum = onchainEnum("order_type", [ "CirclesBackingOrder", "SwapOrderHandler", "ERC4626CowSwapFeeBurner", + "CurveCowSwapBurner", + "BalancerCowSwapFeeBurner", + "CowAmmConstantProduct", "Unknown", ]); diff --git a/src/application/handlers/blockHandler.ts b/src/application/handlers/blockHandler.ts index dc5c822..1da89ed 100644 --- a/src/application/handlers/blockHandler.ts +++ b/src/application/handlers/blockHandler.ts @@ -46,7 +46,7 @@ import { log } from "../helpers/logger"; import { type OrderType } from "../../utils/order-types"; type DiscreteStatus = (typeof discreteOrderStatusEnum.enumValues)[number]; -const NON_DETERMINISTIC_TYPES: readonly OrderType[] = ["PerpetualSwap", "GoodAfterTime", "TradeAboveThreshold", "Unknown"]; +const NON_DETERMINISTIC_TYPES: readonly OrderType[] = ["PerpetualSwap", "GoodAfterTime", "TradeAboveThreshold", "CurveCowSwapBurner", "BalancerCowSwapFeeBurner", "CowAmmConstantProduct", "Unknown"]; const SINGLE_SHOT_NON_DETERMINISTIC: readonly OrderType[] = ["GoodAfterTime", "TradeAboveThreshold"]; const BLOCK_NEVER = 2n ** 63n - 1n; // sentinel for epoch-scheduled generators (PollTryAtEpoch) const VALID_DISCRETE_STATUSES = new Set(["fulfilled", "unfilled", "expired", "cancelled"]); diff --git a/src/utils/order-types.ts b/src/utils/order-types.ts index 93cd1b3..d40db60 100644 --- a/src/utils/order-types.ts +++ b/src/utils/order-types.ts @@ -21,6 +21,9 @@ export type OrderType = | "CirclesBackingOrder" | "SwapOrderHandler" | "ERC4626CowSwapFeeBurner" + | "CurveCowSwapBurner" + | "BalancerCowSwapFeeBurner" + | "CowAmmConstantProduct" | "Unknown"; /** @@ -43,12 +46,27 @@ export const HANDLER_ADDRESS_TO_TYPE: Record = { const MAINNET_ONLY_HANDLERS: Record = { "0xd506fe0b3ddf9e685c16e000514a835d3a511b26": "SwapOrderHandler", "0x816e90dc85bf016455017a76bc09cc0451eeb308": "ERC4626CowSwapFeeBurner", + // Curve Finance fee-burn handler: converts protocol fees → target token via CoW swap. + // Source: https://docs.curve.finance/fees/CowSwapBurner/ — Vyper 0.3.10, verified. + "0xc0fc3ddfec95ca45a0d2393f518d3ea1ccf44f8b": "CurveCowSwapBurner", + // Balancer v3 CowSwapFeeBurner: burns protocol fees via CoW swap. + // v2 (current): deployed via 20250530-v3-cow-swap-fee-burner-v2 task. + "0x9958317b80ee5f10457017d54c2484d722059157": "BalancerCowSwapFeeBurner", + // v1 (deprecated): deployed via 20250221-v3-cow-swap-fee-burner (now in deprecated/). + "0x0e800d8d2e8b4694610aedc385aa6d763492b106": "BalancerCowSwapFeeBurner", }; const GNOSIS_ONLY_HANDLERS: Record = { "0x43866c5602b0e3b3272424396e88b849796dc608": "CirclesBackingOrder", "0x7a77934d32d78bfe8dc1e23415b5679960a1c610": "SwapOrderHandler", "0x5915dea04ce390f0f44ca0806f7c6dd99ce2f941": "ERC4626CowSwapFeeBurner", + // Balancer v3 CowSwapFeeBurner v2 on Gnosis. + // Deployed via 20250530-v3-cow-swap-fee-burner-v2 task. + "0x254f3a2974b97dc2e675f6115c845567c55f83b0": "BalancerCowSwapFeeBurner", + // CoW AMM ConstantProduct pool (verified). Each pool instance IS its own handler — + // the pool address equals the handler address. Factory: ConstantProductFactory. + // Source: https://github.com/cowprotocol/cow-amm + "0xb148f40fff05b5ce6b22752cf8e454b556f7a851": "CowAmmConstantProduct", }; const HANDLER_MAP: Record> = { @@ -86,5 +104,8 @@ export const DETERMINISTIC_ORDER_TYPE: Record = { TradeAboveThreshold: false, SwapOrderHandler: false, ERC4626CowSwapFeeBurner: false, + CurveCowSwapBurner: false, + BalancerCowSwapFeeBurner: false, + CowAmmConstantProduct: false, Unknown: false, }; diff --git a/tests/utils/order-types.test.ts b/tests/utils/order-types.test.ts index 46e39d0..ce92226 100644 --- a/tests/utils/order-types.test.ts +++ b/tests/utils/order-types.test.ts @@ -25,6 +25,9 @@ describe("DETERMINISTIC_ORDER_TYPE", () => { expect(DETERMINISTIC_ORDER_TYPE["TradeAboveThreshold"]).toBe(false); expect(DETERMINISTIC_ORDER_TYPE["SwapOrderHandler"]).toBe(false); expect(DETERMINISTIC_ORDER_TYPE["ERC4626CowSwapFeeBurner"]).toBe(false); + expect(DETERMINISTIC_ORDER_TYPE["CurveCowSwapBurner"]).toBe(false); + expect(DETERMINISTIC_ORDER_TYPE["BalancerCowSwapFeeBurner"]).toBe(false); + expect(DETERMINISTIC_ORDER_TYPE["CowAmmConstantProduct"]).toBe(false); expect(DETERMINISTIC_ORDER_TYPE["Unknown"]).toBe(false); }); });