- Which address? -
TriggerSourceContract(one-time) orRecurringSourceContract(recurring) - On which network? -
TriggerChainIDorRecurringChainID
What activities does address tracking detect?
Address tracking detects several types of on-chain activity. Transactions involving the address Address tracking captures any transaction where the tracked address is the receiver (to == trackedAddress), including contract calls and direct transfers. It also detects transactions where the tracked address is the sender (from == trackedAddress), capturing all outbound activity.
Logs and events emitted by the contract
The tracker listens for any event emitted by the tracked contract, even without filtering by a specific event name. This essentially acts as a catch-all for any event emitted by this contract.”
State and balance changes
Although less common, address tracking can also detect native token balance changes and token balance changes for the address.
Address tracking vs event triggers
Kwala supports monitoring on-chain activity using event triggers and address tracking. Event triggers are more precise as they listen for specific contract events, while address tracking provides broader coverage by capturing all activity involving an address. The following table highlights the key differences:| Aspect | Event Trigger | Address Tracking |
|---|---|---|
| Specificity | Requires EventName and optional ABI | No EventName needed |
| Scope | Specific event only | Any activity for the address |
| Use case | Known, well-defined events | Unknown events, general monitoring |
| Configuration | TriggerEventName: Transfer(...) | ExecuteAfter: address_tracking |
Configuration scenarios
Address tracking can be combined with differentExecuteAfter and RepeatEvery values to create various monitoring patterns:
| ExecuteAfter | RepeatEvery | Meaning |
|---|---|---|
address_tracking | address_tracking | One-time tracking then recurring address tracking |
address_tracking | NA | One-time address tracking only |
address_tracking | event | One-time address tracking and recurring event listening |
address_tracking | timestamp | One-time address tracking and recurring schedule |
address_tracking | oraclePrice | One-time address tracking and recurring oracle price checks |
event | address_tracking | One-time event tracking and recurring address tracking |
timestamp | address_tracking | One-time schedule and recurring address tracking |
oraclePrice | address_tracking | One-time oracle price and recurring address tracking |
Trigger fields, while subsequent activity continues to trigger runs using the Recurring fields.
Address tracking runtime payload
When address tracking triggers your workflow, it passes a transaction receipt as input. This receipt contains details about the transaction that activated the trigger. A receipt contains the following key fields:| Field | Description |
|---|---|
from | Transaction sender (who initiated or signed the transaction) |
to | Contract/EOA being called or sent to (empty for contract deployments) |
contractAddress | Set only for contract deployments; otherwise null |
transactionHash | Unique identifier for the transaction |
chainId | Network identifier |
blockNumber | Block where the transaction was included |
logs | Array of events emitted during the transaction |
When
to is empty and contractAddress is set, this indicates a contract deployment transaction.transactionHash: Verify the activity on a block explorerchainId: Identify the networkblockNumber: Reference the specific blockfromorto: Identify the parties involved in the transactionlogs[]: Decode emitted events for advanced use cases
Using receipt data in dynamic actions
Dynamic actions can extract values from the runtime receipt using there.event(index) function, which maps to specific fields in Kwala’s runtime payload. While you can reference individual fields by index, the most reliable approach is to send the entire receipt to your backend for parsing.
transactionHash, chainId, blockNumber, from, to, and logs, then enrich notifications with explorer links and decoded details.
Parse receipt data
The receipt payload contains fields likefrom, to, logs, chainId, and topics that you can use in your downstream processing. For reliable parsing, send the raw receipt JSON to a smart contract or Web2 backend rather than extracting fields directly in the workflow.
Recommended parsing format (Go)
The following Go structs can be used to parse the receipt JSON in your Web2 service:
receipt.TransactionHash— Build explorer links and verify activityreceipt.ChainID— Identify the networkreceipt.ContractAddress— Identify the contract involved (if present)receipt.Logs— Inspect emitted eventslog.Address— Determine which contract emitted the loglog.Topics[]— Access event signatures and indexed parameterslog.Data— Access non-indexed event data
Example receipts
EOA to contract transfer The following example shows a receipt when a user wallet transfers ERC-20 tokens to a staking contractcontractAddress is null or 0x000... because this is not a contract deployment. The logs capture a standard ERC-20 Transfer event:
topics[0]= ERC-20 Transfer event signaturetopics[1]=fromaddress (EOA)topics[2]=toaddress (contract)data= transfer amount (here0x0de0b6b3a7640000= 1e18, or 1 token with 18 decimals)
Transfer events as assets move between addresses, while the pool contract emits a Swap event. The to field points to the DEX router contract, and the logs array captures all emitted events:
- Log #1:
Transfer— User → Pool, amount =0x2faf080(50 × 10⁶) - Log #2:
Transfer— Pool → User, amount =0x58d15e17628000(~0.025 × 10¹⁸) - Log #3:
Swap— Emitted by the pool contract
Many RPCs return
contractAddress as null, "", or 0x000...000 for non-deployment transactions where no contract is created.Example workflows
The following example shows a complete address tracking workflow that demonstrates both static and dynamic notification patterns. This workflow monitors an address on Polygon Amoy (chain ID80002) and fires two actions whenever activity is detected:
- NotifyStatic: Sends the same fixed message every time, useful for simple alerts
- NotifyDynamic: Sends transaction details extracted from the runtime payload using
re.event(index), where the index maps to specific fields from the activity event
Testing address tracking
To test your address tracking workflow:Deploy or pick a contract address
Use an existing contract address on chain
80002 (Polygon Amoy) or deploy a new one. The example workflow uses 0x18fcd17b107348bd54c05da39cf53621b892bcac.Trigger on-chain activity
Initiate any call or transaction involving that address. This could be a token transfer, a contract function call, or any other on-chain interaction.
Confirm your notification endpoint receives the payloads
Your webhook should receive two payloads:
- NotifyStatic: A fixed message (
"Address tracking triggered") sent every time - NotifyDynamic: Transaction details like
txHashandblockNumberpopulated fromre.event(index), where the index corresponds to the position of the value in the activity event data
Verify against a block explorer
Cross-reference the
txHash and blockNumber values from the dynamic payload against PolygonScan Amoy or your target chain’s explorer to confirm accuracy.Real-world use cases
The following examples demonstrate how address tracking solves common blockchain monitoring challenges where you need to capture activities involving an address, not just specific events.Treasury and multisig movement alerts
DAOs and organizations managing on-chain treasuries need instant visibility when funds move, regardless of how the transaction was initiated. The challenge: Treasury wallets can be accessed through various methods, including direct transfers, multisig executions, delegate calls, or contract interactions. Each method emits different events (or sometimes no events at all), making it impractical to configure individual event triggers for every possible scenario. A Gnosis Safe execution emits different logs than a simple EOA transfer, and proxy contracts add another layer of complexity. The solution: Address tracking monitors the treasury address for any on-chain activity, ensuring you’re notified whether funds move after a simple transfer, a Gnosis Safe execution, or any other mechanism. To configure this workflow, setExecuteAfter: address_tracking and RepeatEvery: address_tracking to continuously monitor the address for all activity. The goal is to enable instant alerts when treasury funds move or any transaction associated with the treasury wallet or contract.
Actions:
- Static: Send a fixed alert message like
"Treasury activity detected"to your security channel - Dynamic (using
re.event(0)): Extractfrom,to,value(if available), andtxHashfrom the receipt for detailed logging
Deposit notifications for payment platforms
Exchanges, payment processors, and DeFi protocols need to notify users when deposits arrive at their assigned addresses. The challenge: Users can deposit various token types (native tokens, ERC-20s, NFTs) using different methods. Tracking specificTransfer events requires knowing every token contract your users might deposit, which is impractical at scale.
The solution: Address tracking monitors each user’s deposit address and fires when any incoming transaction is detected. The goal is to notify customers when their deposit address is touched by an incoming transfer or interaction. Your backend receives the full receipt and can parse the token type, amount, and sender.
Set ExecuteAfter: address_tracking and RepeatEvery: address_tracking to continuously monitor the deposit address.
Actions:
- Static: Send a fixed notification like
"Deposit detected"to trigger user alerts - Dynamic: Extract
txHashso customers can verify on explorer,chainId, andsourceContractfrom the receipt
Whale wallet tracking for trading signals
Trading desks and analytics platforms monitor high-value wallets (“whales”) to detect market-moving activity before it impacts prices. The challenge: Whale wallets interact with dozens of protocols including DEXs, lending platforms, bridges, and more. Each protocol has different event signatures, and new DeFi protocols launch constantly. Maintaining event triggers for every possible interaction is unsustainable. By the time you’ve configured triggers for one protocol, others have launched. The solution: Address tracking monitors the whale’s wallet address and fires on any outbound or inbound activity. The goal is to track a whale wallet or contract and trigger your analytics or strategy pipeline on movement. You don’t need the event name; you just need to know “whale moved.” To do this, setExecuteAfter: address_tracking and RepeatEvery: address_tracking to continuously monitor whale activity.
Actions:
- Dynamic (using
re.event(0)): POST the dynamic event to your strategy service, which decides whether to buy, sell, or do nothing based on the transaction context
