Probably like an `contractInvoke(Invocations[] invocations)` method which uses `msg.sender` instead of signature recovery.