For flexibility, just pass an array of zapData, for now you may need to call 3 zaps, but in the future we could find a way to make it better.
The leftover is supposed to be super small, if it has, it will be in form of 2 tokens in the pool (as swaps happen) and transferred back to the caller, i.e LM contract.
For the slippage, as 3 zaps are executed sequentially, you may need to increase the slippage for the second and third zap, depends on the size of the amount. We can test out that flow to see the reasonable slippage. Slippage is a param in the API call.
just estimate 3 zaps at first and then submit the 3 zap calculation params to our LM, we'll call 3 zaps via your ZapRouter
zapIn
should be implemented on LM contract level