Jump anywhere, copy an address, change the theme.
Verify your X account and claim your balance to any wallet on Arc.
Payments stay in escrow until you prove you own the handle. Each supported asset has its own PayX contract, so the creator hub shows one balance and one Claim button per asset (one transaction each). The claim combines:
Sign in with X to prove you control the handle.
Our server authorizes handle to wallet; the contract verifies it.
Your first successful claim links that wallet to your handle onchain (WalletLinked). Linking is per contract: each asset's instance remembers its own linked wallet, so use the same wallet across assets if you want a single payout address. After that:
A claim for a different wallet reverts with WalletMismatch, even with a valid oracle signature.
If you lose the wallet, contact @Xylonet_. After verification the Admin Safe (2-of-3) calls adminRelinkWallet, which redirects future claims and emits WalletRelinked. It never moves existing funds by itself.
function claimTips(
string calldata handle, // your X handle (normalized onchain)
address wallet, // destination wallet
bytes32 nonce, // random, single-use
bytes calldata signature // oracle EIP-712 signature
) external nonReentrant whenNotPausedThe contract rebuilds the typed-data digest and checks the recovered signer against oracleSigner():
// domain: EIP712("PayX", "2") + chainId 5042 + address(this)
bytes32 CLAIM_TYPEHASH = keccak256("Claim(string handle,address wallet,bytes32 nonce)");
bytes32 structHash = keccak256(
abi.encode(CLAIM_TYPEHASH, keccak256(bytes(normalizedHandle)), wallet, nonce)
);
bytes32 digest = _hashTypedDataV4(structHash);
if (ECDSA.recover(digest, signature) != oracleSigner) revert InvalidSignature();
if (usedNonces[nonce]) revert NonceAlreadyUsed();Because the domain includes the chain id and the contract address, a signature is useless on any other chain or deployment.
Successful claims emit TipsClaimed (and WalletLinked on the first claim):
event TipsClaimed(
string indexed handleHash,
string handle,
address indexed wallet,
uint256 amount, // total claimed (token units of that instance)
uint256 timestamp
);