Since 2021, many more contracts in EVM have adopted the usage of "complex functions" such as multicall(), execute(), executeBatch(), etc.

These are functions that "proxy" the user-requested action to another method in the same (or different) contract.

For example, Uniswap v3 swaps, liquidity adds, liquidity removes, all go through the same multicall() function. But the user intent is completely different in each case.

Similarly, Gnosis Safe transactions all go through an execTransaction() function call. But the underlying transaction type in each case is different.

Our design philosophy is to eliminate this technical complexity for users of our API.

We have an extensive decoding capability that will see through these complex functions, and figure out what is the set of actions being performed underneath.

We'll report a transaction type based on the decoded user intent behind each complex function call.

Following on the Uniswap v3 example, we'll classify those multicalls to a swap, an addLiquidity, or a removeLiquidity, depending in each case.

Similarly, Gnosis Safe transactions will be classified to their underlying type (for example, a claimRewards) when the classification is done from the perspective of the Gnosis Safe contract. From the perspective of the signers of the Safe, the transactions will be classified as signMultisig. Perspective matters in our classification (see our related doc on this here).