Events
All Aruvi state changes emit events. Arc has no reorgs, so an event you've seen is final - index with confidence at one confirmation.
Payments
event PaymentSent(
bytes32 indexed paymentId,
address indexed from,
address indexed to,
address token,
uint256 amount,
string memo
);
event PaymentRefunded(bytes32 indexed paymentId, uint256 amount);
PaymentSent fires for direct sends, multi-send items (one per recipient), request fulfillments, and subscription charges - one event type covers all money movement.
Requests
event RequestCreated(
bytes32 indexed requestId,
address indexed requester,
address token,
uint256 amount, // 0 = payer chooses
uint256 expiresAt, // 0 = never
string memo
);
event RequestFulfilled(bytes32 indexed requestId, bytes32 indexed paymentId, address indexed payer);
event RequestCancelled(bytes32 indexed requestId);
Subscriptions
event SubscriptionCreated(
bytes32 indexed subscriptionId,
address indexed subscriber,
address indexed recipient,
address token,
uint256 amount,
uint256 interval
);
event SubscriptionPaid(bytes32 indexed subscriptionId, bytes32 indexed paymentId);
event SubscriptionCancelled(bytes32 indexed subscriptionId);
Admin
event TokenSupportUpdated(address indexed token, bool supported);
event DefaultTokenChanged(address indexed previousToken, address indexed newToken);
Indexing example (viem)
import { parseAbiItem } from 'viem';
const logs = await client.getLogs({
address: GATEWAY_ADDRESS,
event: parseAbiItem(
'event PaymentSent(bytes32 indexed paymentId, address indexed from, address indexed to, address token, uint256 amount, string memo)'
),
args: { to: merchantAddress }, // all payments received by a merchant
fromBlock: deployBlock,
});
Amounts are in the events
Unlike Aruvi's original FHE version, amounts and memos now live directly in the logs - no extra eth_calls needed to build rich payment history.