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.
| Network | Base (chain id 8453) |
| Splitter | 0x476EB0fECACA54d1311DB81bD3523cB0Dc66Dfab |
| Fee wallet | 0xd3651425E1942f6b81dE2602093BbaEac466c666 |
| Fee | FEE_BPS = 50 (0.5%), rounded down |
| Runtime code hash | 0xfbeadea59a5f03449a5e59bf11709160e03040568062bb2f0ba8fa779b8fd64d |
| Assets routed through it | ETH-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#
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 forwardsvalue − feeto you andfeeto the fee wallet in the same call.payToken: after the buyer approves the splitter for exactly the amount, it movesamount − feefrom the buyer to you andfeeto the fee wallet withtransferFrom. Tokens never sit in the contract.Paidis emitted with the quote's random 32-byteref; 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#

- The quote contains a fresh random
ref, your address and the splitter address. - 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.
- ETH: one transaction,
payNative(merchant, ref). USDC: the wallet asks twice: approve exactly the amount for the splitter, thenpayToken(USDC, merchant, amount, ref). - RugWard credits the payment only when a
Paidevent comes from the registered splitter (code hash re-checked on-chain, cached for 10 minutes), carries this quote'sref, your address and the right token, and its fee equals exactlyfeeOf(amount). The amount credited is what reached you. - 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:
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