Jump anywhere, copy an address, change the theme.
PayXTipping v2 on Arc mainnet: addresses, parameters, events and how to integrate.
Escrow payment contract: holds balances per handle, verifies EIP-712 claim authorizations, links wallets. One instance per asset (the escrow token is immutable).
tip(handle, amount, message)Send a payment. amount is in the instance's token units (USDC: 6 decimals, min 100000 = 0.1). Requires a prior approve of that token to the instance.
claimTips(handle, wallet, nonce, signature)Claim the full pending balance with an oracle EIP-712 signature. First claim links the wallet.
getHandleInfo(handle)pendingBalance, linkedWallet, isRegistered, totalReceived, totalClaimed, tipCount
getPendingBalance(handle)Pending (unclaimed) balance for a handle
getTipHistory(handle, offset, limit)Paginated Tip[] {tipper, amount, timestamp, message}
getLinkedWallet(handle)Wallet the handle claims to (zero if never claimed)
platformFeeBps / minTipAmount / paused()Live protocol parameters
domainSeparator()EIP-712 domain separator for offchain signer verification
| Parameter | Value |
|---|---|
| USDC token | 0x3600000000000000000000000000000000000000 6 decimals |
| Platform fee | 100 bps (1%) · max 500 |
| Minimum payment | 100000 (0.1 USDC) |
| Max message | 280 bytes |
| Oracle signer | published at launch (XYLO-ORACLE-01) |
| Owner | 0xFD3A6DEE167C9B519fE7f646F91e9D80ba51Ed96 Admin Safe, 2-of-3 (Ownable2Step) |
| Fee recipient | 0x7EF8Aa263E3Bb8a151702108bD29932e50409990 Treasury Safe |
| EIP-712 domain | name "PayX" · version "2" · chainId 5042 · verifyingContract |
Circle's USDC is Arc's native asset. Its ERC-20 interface lives at the system predeploy and uses 6 decimals; PayX amounts are always in those units.
event TipSent(
string indexed handleHash, // keccak256 of the normalized handle
string handle, // normalized lowercase handle
address indexed tipper,
uint256 amount, // NET amount credited to the handle
uint256 fee, // platform fee taken
string message,
uint256 timestamp
);event TipsClaimed(
string indexed handleHash,
string handle,
address indexed wallet,
uint256 amount,
uint256 timestamp
);event WalletLinked(string indexed handleHash, string handle, address indexed wallet);
event WalletRelinked(string indexed handleHash, string handle, address indexed oldWallet, address indexed newWallet);event Paused(address account);
event Unpaused(address account);The v2 source is verified on the Arc explorer as part of the deployment ceremony. Compare the onchain bytecode against the published source before interacting from your own code.
View verified sourceRead from PayX with viem. Define Arc as a custom chain (id 5042) and point it at any Arc mainnet RPC:
import { createPublicClient, defineChain, formatUnits, http } from 'viem';
const arc = defineChain({
id: 5042,
name: 'Arc',
nativeCurrency: { name: 'USDC', symbol: 'USDC', decimals: 18 },
rpcUrls: { default: { http: ['https://arc.drpc.org'] } },
blockExplorers: { default: { name: 'Arc Explorer', url: 'https://explorer.arc.io' } },
});
const client = createPublicClient({ chain: arc, transport: http() });
const info = await client.readContract({
address: '0x47d4164F2f65afc00c7ba932cbEC9858b5FDAf0A',
abi: PayXTippingABI, // v2 ABI
functionName: 'getHandleInfo',
args: ['username'],
});
console.log(formatUnits(info.pendingBalance, 6), 'USDC pending');Handles are normalized onchain (lowercase, a–z 0–9 _, 1–15 chars); pass them without the @.