Skip to content
RugWard
☰ Menu

RugWard Pay

The Base fee splitter (0.5%)

How ETH and USDC payments on Base are split on-chain between you (99.5%) and RugWard (0.5%) in the buyer's own transaction, and how to check the contract yourself.

On this page

What it is#

On Base, ETH and USDC payments go through a small, immutable contract: the RugWard Pay splitter. In the buyer's single transaction it sends 99.5% to your address and 0.5% to the RugWard fee wallet. The money moves straight from the buyer to you; the contract never keeps a balance.

NetworkBase (chain id 8453)
Splitter0x476EB0fECACA54d1311DB81bD3523cB0Dc66Dfab
Fee wallet0xd3651425E1942f6b81dE2602093BbaEac466c666
FeeFEE_BPS = 50 (0.5%), rounded down
Runtime code hash0xfbeadea59a5f03449a5e59bf11709160e03040568062bb2f0ba8fa779b8fd64d
Assets routed through itETH-8453 and USDC-8453 only

Only Base uses a splitter. On every other network (Bitcoin, Monero, Solana, Ethereum, Arbitrum, BNB Chain, Polygon) payments go directly to your address with no on-chain split and no RugWard fee (launch promo). USDT is not offered on Base.

Why a splitter#

The fee is taken transparently, on-chain, at the moment of payment, without RugWard ever holding your money. You and your buyer can see both transfers on BaseScan, and nobody can change the percentage: it is a constant in immutable code.

The contract#

RugWardPaySplitter (public interface)
uint256 public constant FEE_BPS = 50;        // 0.5 %
address public immutable feeWallet;          // 0xd3651425E1942f6b81dE2602093BbaEac466c666

event Paid(bytes32 indexed ref, address indexed merchant, address indexed token,
           address payer, uint256 amount, uint256 fee);   // token = 0x0 for ETH

function feeOf(uint256 amount) public pure returns (uint256);   // amount * 50 / 10000, rounded down
function payNative(address merchant, bytes32 ref) external payable;
function payToken(IERC20 token, address merchant, uint256 amount, bytes32 ref) external;
  • payNative: the buyer sends ETH; the contract forwards value − fee to you and fee to the fee wallet in the same call.
  • payToken: after the buyer approves the splitter for exactly the amount, it moves amount − fee from the buyer to you and fee to the fee wallet with transferFrom. Tokens never sit in the contract.
  • Paid is emitted with the quote's random 32-byte ref; that event is how RugWard matches the payment to the invoice.
  • There is no owner, no admin function, no pause, no upgrade and no way to withdraw anything: the five public functions above are the whole contract. Payments to the zero address or to the splitter itself revert.

What the checkout does#

Base checkout
The Base checkout shows the total, your 99.5%, the 0.5% fee and the splitter address
  1. The quote contains a fresh random ref, your address and the splitter address.
  2. Before anything is signed, the buyer's browser reads the splitter's code from Base and compares its hash with the reviewed build. On a mismatch it stops.
  3. ETH: one transaction, payNative(merchant, ref). USDC: the wallet asks twice: approve exactly the amount for the splitter, then payToken(USDC, merchant, amount, ref).
  4. RugWard credits the payment only when a Paid event comes from the registered splitter (code hash re-checked on-chain, cached for 10 minutes), carries this quote's ref, your address and the right token, and its fee equals exactly feeOf(amount). The amount credited is what reached you.
  5. 30 block confirmations later the invoice is paid.

Important consequences:

  • A plain transfer of ETH or USDC to your address for a Base quote is not detected automatically. If a buyer does that by mistake, the money is in your wallet; settle it by hand (see Unmatched payments).
  • The invoice is paid when 99.5% of the quoted amount reaches you (the buyer pays the full 100%).
  • If your receiving address is a smart-contract wallet, it must accept plain ETH transfers (a normal Safe or smart account does).
  • If a buyer approves USDC and then abandons the payment, an allowance for that exact amount stays on the splitter. It is harmless (only the buyer can spend it through payToken, and only to pay a merchant), and the buyer can remove it with Approvals.

Check it yourself#

Anyone can verify the deployment with public tools, for example Foundry's cast:

Check the contract yourself (Foundry cast)
RPC=https://mainnet.base.org
SPLITTER=0x476EB0fECACA54d1311DB81bD3523cB0Dc66Dfab

cast keccak $(cast code $SPLITTER --rpc-url $RPC)
# expected: 0xfbeadea59a5f03449a5e59bf11709160e03040568062bb2f0ba8fa779b8fd64d

cast call $SPLITTER "feeWallet()(address)" --rpc-url $RPC
# 0xd3651425E1942f6b81dE2602093BbaEac466c666
cast call $SPLITTER "FEE_BPS()(uint256)" --rpc-url $RPC
# 50
cast call $SPLITTER "feeOf(uint256)(uint256)" 25000000 --rpc-url $RPC
# 125000  (0.125 USDC of a 25 USDC payment)

Or open the address on BaseScan and look at the Paid events and internal transfers.

Test it on Sepolia#

The same contract build is deployed on Ethereum Sepolia at 0xbcb045fba82ce46ac073ac609cb227d20c450ce5 with the same 99.5% / 0.5% split. Dashboard test invoices use it with free test ETH and test USDC, so you can watch the exact flow before taking real money.

Status of the review#

The splitter is internally reviewed by RugWard and covered by our own Foundry tests (unit and fuzz). It has not been reviewed by an independent firm. Its source and behaviour are small enough to read in a few minutes; the interface above is complete.

Last updated: October 30, 2026

The Base fee splitter (0.5%) · RugWard Documentation | RugWard