Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/cowprotocol/solver-rewards/llms.txt

Use this file to discover all available pages before exploring further.

The pipeline supports 10 EVM networks, each configured with its own token addresses, reward thresholds, and Dune blockchain name. The active network is selected via the NETWORK environment variable using the enum value shown in the table below.

The Network enum

src/config.py
class Network(Enum):
    """Network class for networks supported by the accounting."""

    MAINNET = "mainnet"
    BASE = "base"
    ARBITRUM_ONE = "arbitrum"
    BNB = "bnb"
    AVALANCHE = "avalanche"
    POLYGON = "polygon"
    GNOSIS = "gnosis"
    LINEA = "linea"
    PLASMA = "plasma"
    INK = "ink"
Set the NETWORK environment variable to the enum’s string value to select the target chain:
export NETWORK=mainnet   # Ethereum mainnet
export NETWORK=gnosis    # Gnosis Chain
export NETWORK=arbitrum  # Arbitrum One

Network reference table

NetworkNETWORK valueDune blockchainNative tokenmin_native_token_transfermin_cow_transferquote_reward_cap_native
Ethereum mainnetmainnetethereumETH0.001 ETH (1e15)10 COW (10e18)0.0007 ETH (7e14)
Gnosis ChaingnosisgnosisxDAI0.01 xDAI (1e16)1 COW (1e18)0.15 xDAI (15e16)
Arbitrum OnearbitrumarbitrumETH0.0001 ETH (1e14)1 COW (1e18)0.00024 ETH (24e13)
BasebasebaseETH0.0001 ETH (1e14)1 COW (1e18)0.00024 ETH (24e13)
Avalancheavalancheavalanche_cAVAX0.0001 AVAX (1e14)1 COW (1e18)0.006 AVAX (6e15)
PolygonpolygonpolygonPOL0.0001 POL (1e14)1 COW (1e18)0.6 POL (6e17)
BNB Smart ChainbnbbnbBNB0.0001 BNB (1e14)1 COW (1e18)0.001 BNB (1e15)
LinealinealineaETH0.0001 ETH (1e14)1 COW (1e18)0.00003 ETH (3e13)
PlasmaplasmaplasmaXPL0.0001 XPL (1e14)1 COW (1e18)0.6 XPL (6e17)
InkinkinkETH0.0001 ETH (1e14)1 COW (1e18)0.00003 ETH (3e13)

Token addresses per network

Each network is configured with two key token addresses in PaymentConfig:
  • wrapped_native_token_address — the wrapped version of the chain’s native gas token (e.g. WETH, WAVAX). Used to check whether a WETH unwrap must be prepended to the multisend transaction.
  • wrapped_eth_address — the address of bridged/wrapped ETH on that chain. Used for price lookups via CoinPaprika.
FieldValue
Wrapped native token (WETH)0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Wrapped ETH0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
COW token0xDEf1CA1fb7FBcDC777520aa7f396b4E015F497aB
Analytics DB namemainnet
Safe short nameeth
FieldValue
Wrapped native token (WXDAI)0xe91d153e0b41518a2ce8dd3d7944fa863463a97d
Wrapped ETH0x6a023ccd1ff6f2045c3309768ead9e68f978f6e1
COW token0xDEf1CA1fb7FBcDC777520aa7f396b4E015F497aB
Analytics DB namexdai
Safe short namegno
FieldValue
Wrapped native token (WETH)0x82af49447d8a07e3bd95bd0d56f35241523fbab1
Wrapped ETH0x82af49447d8a07e3bd95bd0d56f35241523fbab1
COW token (dummy)0x0000000000000000000000000000000000000006
Analytics DB namearbitrum-one
Safe short namearb1
FieldValue
Wrapped native token (WETH)0x4200000000000000000000000000000000000006
Wrapped ETH0x4200000000000000000000000000000000000006
COW token (dummy)0x0000000000000000000000000000000000000006
Analytics DB namebase
Safe short namebase
FieldValue
Wrapped native token (WAVAX)0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7
Wrapped ETH0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB
COW token (dummy)0x0000000000000000000000000000000000000006
Analytics DB nameavalanche
Safe short nameavax
FieldValue
Wrapped native token (WPOL)0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270
Wrapped ETH0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619
COW token (dummy)0x0000000000000000000000000000000000000006
Analytics DB namepolygon
Safe short namematic
FieldValue
Wrapped native token (WBNB)0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
Wrapped ETH0x4db5a66e937a9f4473fa95b1caf1d1e1d62e29ea
COW token (dummy)0x0000000000000000000000000000000000000006
Analytics DB namebnb
Safe short namebnb
FieldValue
Wrapped native token (WETH)0xe5d7c2a44ffddf6b295a15c148167daaaf5cf34f
Wrapped ETH0xe5d7c2a44ffddf6b295a15c148167daaaf5cf34f
COW token (dummy)0x0000000000000000000000000000000000000006
Analytics DB namelinea
Safe short namelinea
FieldValue
Wrapped native token (WXPL)0x6100e367285b01f48d07953803a2d8dca5d19873
Wrapped ETH0x9895d81bb462a195b4922ed7de0e3acd007c32cb
COW token (dummy)0x0000000000000000000000000000000000000006
Analytics DB nameplasma
Safe short nameplasma
FieldValue
Wrapped native token (WETH)0x4200000000000000000000000000000000000006
Wrapped ETH0x4200000000000000000000000000000000000006
COW token (dummy)0x0000000000000000000000000000000000000006
Analytics DB nameink
Safe short nameink
The COW token address is only real on Ethereum mainnet (0xDEf1CA1fb7FBcDC777520aa7f396b4E015F497aB) and Gnosis Chain. On all other networks it is set to the dummy address 0x0000000000000000000000000000000000000006. This is intentional: COW token transfers are always executed on Ethereum mainnet regardless of which network is being processed, so the on-chain cow_token_address for non-mainnet networks is never used in actual ERC-20 calls.

COW transfers always happen on Ethereum mainnet

The pipeline maintains two separate Safe transactions per payout run: one for native token transfers on the target network, and one for COW token transfers — the latter is always posted to Ethereum mainnet, even when processing rewards for Gnosis Chain, Arbitrum, or any other network. This means the pipeline requires a mainnet node URL (NODE_URL_MAINNET) in addition to the target-chain node URL (NODE_URL). From src/fetch/transfer_file.py:
src/fetch/transfer_file.py
nonce_cow = post_multisend(
    safe_address=config.payment_config.payment_safe_address_cow,
    transactions=transactions_cow,
    network=EthereumNetwork.MAINNET,   # always mainnet
    signing_key=signing_key,
    client=client_mainnet,
    nonce_modifier=config.payment_config.nonce_modifier,
)

Nonce modifier system

Because the pipeline proposes COW transfers for all supported networks via the same Ethereum mainnet Safe, it needs to queue multiple transactions without nonce conflicts. The nonce_modifier_dict assigns each network a unique offset from the current Safe nonce:
src/config.py
nonce_modifier_dict = {
    network: idx for idx, network in enumerate(reversed(list(Network)), start=0)
}
nonce_modifier = int(
    os.environ.get(
        "NONCE_MODIFIER",
        nonce_modifier_dict[network],
    )
)
This iterates the Network enum in reverse order and assigns start=0 to the last network (INK), incrementing toward MAINNET. The result is a stable, deterministic offset for each network’s mainnet COW transaction. The NONCE_MODIFIER environment variable can override the computed value if a specific offset is needed (for example when re-running a failed proposal).
For mainnet itself, native transfers are also posted to mainnet. To avoid a second nonce conflict between the COW transaction and the native transaction, the native-transfer call uses nonce_modifier=len(Network) — one slot beyond the last COW-transfer slot.