dynamic() and self() are runtime placeholders that resolve on the destination chain at execution time. They let you write action batches that adapt to whatever funds actually arrive, without predicting bridge fees or slippage.
dynamic()
Means “use whatever balance the intent wallet has at execution time”. Accepted on any amount field of any builder except assertCondition.
The killer use case is chaining. You don’t know exactly how much USDC will arrive on the destination chain (bridge fees, slippage, price moves), but you know you want to deposit all of it:
Multi-step chaining
Each consumer marks its inputdynamic():
self()
Returns a placeholder address that resolves to the intent wallet at execution time, in case you need this address which is not known before executing.
swap picks a sensible default (self() for intermediate actions, the user’s wallet for the final action), so you rarely need it — it’s there for unusual compositions where you want to be explicit.