RugWard Pay
Le répartiteur de frais Base (0,5 %)
Comment les paiements en ETH et USDC sur Base sont répartis on-chain entre vous (99,5 %) et RugWard (0,5 %) dans la transaction même de l'acheteur, et comment vérifier le contrat vous-même.
Sur cette page
De quoi s'agit-il#
Sur Base, les paiements en ETH et USDC passent par un petit contrat immuable : le répartiteur RugWard Pay (splitter). Dans l'unique transaction de l'acheteur, il envoie 99,5 % à votre adresse et 0,5 % au portefeuille de frais RugWard. L'argent va directement de l'acheteur à vous ; le contrat ne conserve jamais de solde.
| Réseau | Base (chain id 8453) |
| Répartiteur | 0x476EB0fECACA54d1311DB81bD3523cB0Dc66Dfab |
| Portefeuille de frais | 0xd3651425E1942f6b81dE2602093BbaEac466c666 |
| Frais | FEE_BPS = 50 (0,5 %), arrondis à l'inférieur |
| Hash du code d'exécution | 0xfbeadea59a5f03449a5e59bf11709160e03040568062bb2f0ba8fa779b8fd64d |
| Actifs qui y transitent | ETH-8453 et USDC-8453 uniquement |
Seul Base utilise un répartiteur. Sur tous les autres réseaux (Bitcoin, Monero, Solana, Ethereum, Arbitrum, BNB Chain, Polygon), les paiements vont directement à votre adresse, sans répartition on-chain ni frais RugWard (offre de lancement). L'USDT n'est pas proposé sur Base.
Pourquoi un répartiteur#
Les frais sont prélevés de façon transparente, on-chain, au moment du paiement, sans que RugWard ne détienne jamais votre argent. Vous et votre acheteur voyez les deux transferts sur BaseScan, et personne ne peut modifier le pourcentage : c'est une constante dans un code immuable.
Le contrat#
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: l'acheteur envoie de l'ETH ; le contrat transfèrevalue − feeà vous etfeeau portefeuille de frais dans le même appel.payToken: après que l'acheteur a approuvé le répartiteur pour exactement le montant, il déplaceamount − feede l'acheteur vers vous etfeevers le portefeuille de frais avectransferFrom. Les jetons ne restent jamais dans le contrat.Paidest émis avec lerefaléatoire de 32 octets du devis ; c'est grâce à cet événement que RugWard associe le paiement à la facture.- Il n'y a ni propriétaire, ni fonction d'administration, ni pause, ni mise à niveau, ni moyen de retirer quoi que ce soit : les cinq fonctions publiques ci-dessus constituent tout le contrat. Les paiements vers l'adresse zéro ou vers le répartiteur lui-même sont annulés (revert).
Ce que fait le checkout#

- Le devis contient un nouveau
refaléatoire, votre adresse et l'adresse du répartiteur. - Avant toute signature, le navigateur de l'acheteur lit le code du répartiteur sur Base et compare son hash avec la version revue. En cas de différence, il s'arrête.
- ETH : une transaction,
payNative(merchant, ref). USDC : le portefeuille demande deux fois : approuver exactement le montant pour le répartiteur, puispayToken(USDC, merchant, amount, ref). - RugWard ne crédite le paiement que si un événement
Paidprovient du répartiteur enregistré (hash du code revérifié on-chain, mis en cache 10 minutes), porte lerefde ce devis, votre adresse et le bon jeton, et que ses frais valent exactementfeeOf(amount). Le montant crédité est celui qui vous est parvenu. - Après 30 confirmations de bloc, la facture est paid.
Conséquences importantes :
- Un simple transfert d'ETH ou d'USDC vers votre adresse pour un devis Base n'est pas détecté automatiquement. Si un acheteur le fait par erreur, l'argent est sur votre portefeuille ; réglez-le à la main (voir Paiements non associés).
- La facture est payée lorsque 99,5 % du montant du devis vous parvient (l'acheteur paie 100 %).
- Si votre adresse de réception est un portefeuille smart contract, il doit accepter les simples transferts d'ETH (un Safe ou un smart account classique le fait).
- Si un acheteur approuve de l'USDC puis abandonne le paiement, une autorisation de ce montant exact reste sur le répartiteur. Elle est sans danger (seul l'acheteur peut la dépenser via
payToken, et uniquement pour payer un marchand), et l'acheteur peut la retirer avec Approvals.
Vérifiez par vous-même#
Tout le monde peut vérifier le déploiement avec des outils publics, par exemple cast de Foundry :
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)Ou ouvrez l'adresse sur BaseScan et consultez les événements Paid et les transferts internes.
Testez sur Sepolia#
La même version du contrat est déployée sur Ethereum Sepolia à 0xbcb045fba82ce46ac073ac609cb227d20c450ce5, avec la même répartition 99,5 % / 0,5 %. Les factures de test du tableau de bord l'utilisent avec de l'ETH et de l'USDC de test gratuits, pour observer le flux exact avant d'encaisser de l'argent réel.
État de la revue#
Le répartiteur a été revu en interne par RugWard et est couvert par nos propres tests Foundry (unitaires et fuzz). Il n'a pas été revu par une société indépendante. Son code et son comportement sont assez courts pour être lus en quelques minutes ; l'interface ci-dessus est complète.
Dernière mise à jour: 30 octobre 2026