1
Monitor the source chain
Subscribe to
UserLocked events to detect any locks made to your address with a hashlock.2
Lock funds on the destination chain
- When a lock is detected, call
solverLock()on the destination chain and pass the samehashlockwithtimelockof , along with the reward andrewardTimelock. - Solver locks are keyed by (hashlock, your solver address) — you get exactly one slot per hashlock, ever. A blind retry reverts with
SolverLockAlreadyExistsinstead of double-funding the swap; if your lock was refunded (e.g. a botched fill), re-filling the same hashlock requires a different solver address.
3
Verify the lock on source chain
- Monitor the source chain for the
UserLockedevent details (or use thegetUserLock(hashlock)function) on the detected lock. - Verify that the
hashlockmatches what the user used. - Verify that the
timelockprovides sufficient time to act, ensuring it is at least . - Verify that the
payoutCurveis one you recognize (only fill locks whose curve you trust — the curve determines the redeem payout).
4
Receive secret from user
The user will sign and transmit the derived secret to you via off-chain channels. Verify that when hashed, this secret matches the hashlock on both chains.
5
Complete the exchange
- Once you receive the secret, call
redeemSolver()on the destination chain to unlock the user’s funds. You are incentivized to do this quickly: before therewardTimelockexpires, the reward routes to you; after it expires, any actor can redeem and claim the reward instead. - Call
redeemUser()on the source chain to claim your primary fee/reward. - Pass in the secret value received from the user.