I've noticed that Calldata exposes FateApiEncoder which does the same as encode/decode SDK functions. Calldata can't depend on SDK, and SDK needs a more accurate type and a simpler interface π.
Also, ContractEncoder:decode looks like a special case of unpackTx from SDK.