Skip to content

Fees & economics

Blazpay charges in three places, and only three. Everything else a user pays is network gas or a third-party provider's own spread.

WhereRateMechanismConfigurable by
Swap & bridge settlement0.1% of input amountBlazpayRelayer.inPercentFee = 10 (denominator 10_000)Contract owner, per chain
Autopilot trades20 bps (0.2%) of output amountBlazpayAutopilotV1.feeBps = 20Contract owner
CSIP auto-claim0.00003 ETH per claimBlazpayDcaV2.autoClaimFeePerClaimContract owner

Swap and bridge — 0.1% flat

The fee is computed inside executeMetaTransactionSwap before any funds move:

solidity
uint256 fee = 0;
if (enableFees) {
    if (_metaTx.isNative) {
        fee = feeAmount != 0 ? feeAmount : (_metaTx.amount * inPercentFee) / 10_000;
    } else if (inPercentFee != 0) {
        fee = (_metaTx.amount * inPercentFee) / 10_000;
    }
}

Two knobs, and setFees enforces that only one can be non-zero at a time:

  • inPercentFee — basis points against 10_000. All 22 deployed chains run inPercentFee = 10, i.e. 0.10%.
  • feeAmount — a flat per-transaction amount, only honoured on native-input swaps. Currently zero everywhere.

For an ERC-20 input the fee is pulled as a second transferFrom on top of the swap amount, so the user's approval must cover amount + fee. That is why TradeManager.getAllowance reads inPercentFee and enableFees off the relayer before comparing the allowance — see quote → settle pipeline.

For a native-input swap the requirement is msg.value >= nativeValue + fee.

No hidden spread

Blazpay does not mark up the quote it receives from a provider. The number the user sees in the UI is the provider's own output estimate; the 0.1% is taken from the input side and shown separately. Whatever spread exists inside a given aggregator's route is that aggregator's, and comparing 21 of them is precisely how it gets competed down.

Where the fees accumulate

Fees stay in the relayer contract on each chain until an owner calls withdrawEth() or withdrawToken(token). GET /api/defi/fees/summary walks the deployment record, reads native and known-token balances per chain over RPC, prices them via CoinGecko and returns a USD total. It caches for five minutes; ?force=1 bypasses.

Only tokens with a known coingeckoId in the Token collection are checked — long-tail and spam tokens never accumulate as relayer fees, and skipping them keeps the RPC fan-out inside the timeout on big-catalogue chains.

Autopilot — 20 bps on output

Autopilot charges on the measured output of each trade, not the input:

amountOut_measured  →  fee = amountOut * feeBps / 10_000
                       credited_to_agent = amountOut - fee

Measuring the delta rather than trusting an executor-supplied number is a deliberate design decision inherited from a DCA V1 bug — see autopilot vault. Platform earnings accrue inside the vault and are swept with withdrawEarnings.

The 20 bps figure and the output-side basis are both locked decisions for v1; changing either is a product call, not an implementation detail.

CSIP auto-claim — a gas-margin fee

CSIP itself takes no percentage. Its only charge is optional: if a user enables auto-claim, the platform's executor delivers each filled buy to their wallet automatically instead of making them send a claim transaction.

  • Fee: 0.00003 ETH per claim, roughly 3× the actual gas cost on Arbitrum — the margin is the platform's.
  • It is escrowed up front: at position creation the frontend passes fee × orders as excess msg.value, and CreatePositionAutoBuy treats the excess as auto-claim escrow. That makes create-plus-opt-in a single signature.
  • disableAutoClaim refunds the unused escrow.
  • Earnings accrue to platformEarnings and are swept with withdrawEarnings.

CSIP also has a $1 minimum per order, validated server-side in create-position.

What Blazpay does not charge for

FeatureCost to user
BlazAI chatFree. Quota only on the contract auditor (default 3 audits per wallet, SystemSetting.audit_free_limit_per_wallet)
Contract audit, rug check, wallet card, approval scanFree
Limit ordersNo Blazpay fee; iZiSwap's own mechanics apply
Portfolio, history, price alertsFree
Fiat on/off-rampNo Blazpay fee. Each provider (OnRamp.money, Changelly, AlchemyPay, Transak, MoonPay) charges its own spread, and the UI compares them side by side
PerpetualsOrderly Network's fee schedule applies
dApp builderIteration quota per project; paid tiers via dappSubscriptionModel

Gas: who pays

FlowGas payer
Swap / bridgeThe user. They send executeMetaTransactionSwap themselves — the "meta-transaction" here is about signature provenance, not gas abstraction
CSIP scheduled buyThe platform's executor wallet
CSIP claim (manual)The user
CSIP claim (auto)The platform's executor, recovered via the 0.00003 ETH fee
Autopilot tradeThe platform's executor
Approval revokeThe user
dApp contract deployThe project's ZeroDev smart account, funded by the user

The executor wallet needs a gas top-up schedule

Both CSIP and Autopilot execution depend on PRIVATE_KEY_EXECUTOR (0x5935745431D1385ae1a9CE2644fb5f5d1f140459) holding native gas on each automation chain. When it empties, scheduled buys silently stop retrying. Arbitrum consumption is roughly 0.00002 ETH per batch. See monitoring.

Revenue surfaces summary

The ecosystem layer (marketplace commissions, presale, BlazPoints sinks) has its own economics documented under marketplace and rewards.

Internal + developer documentation. Usage figures are point-in-time snapshots — re-verify before publishing them.