LibProxy.proxyCall() may overwrite important memory
`LibProxy.proxyCall()` copies from call data to memory, starting at address 0:\\n```\\nassembly {\\n    // store selector of destination function\\n    let freeMemPtr := 0\\n    if gt(customEgressSelector, 0) {\\n        mstore(0x0, customEgressSelector)\\n        freeMemPtr := add(freeMemPtr, 4)\\n    }\\n\\n    // adjust the calldata offset, if we should ignore the selector\\n    let calldataOffset := 0\\n    if gt(ignoreIngressSelector, 0) {\\n        calldataOffset := 4\\n    }\\n\\n    // copy calldata to memory\\n    calldatacopy(\\n        freeMemPtr,\\n        calldataOffset,\\n        calldatasize()\\n    )\\n```\\n\\nThe first 64 bytes of memory are treated as “scratch space” by the Solidity compiler. Writing beyond that point is dangerous, as it will overwrite the free memory pointer and the “zero slot” which is where length-0 arrays point.\\nAlthough the current callers of `proxyCall()` don't appear to use any memory after calling `proxyCall()`, future changes to the code may introduce very serious and subtle bugs due to this unsafe handling of memory.
Use the actual free memory pointer to determine where it's safe to write to memory.
```\\nassembly {\\n    // store selector of destination function\\n    let freeMemPtr := 0\\n    if gt(customEgressSelector, 0) {\\n        mstore(0x0, customEgressSelector)\\n        freeMemPtr := add(freeMemPtr, 4)\\n    }\\n\\n    // adjust the calldata offset, if we should ignore the selector\\n    let calldataOffset := 0\\n    if gt(ignoreIngressSelector, 0) {\\n        calldataOffset := 4\\n    }\\n\\n    // copy calldata to memory\\n    calldatacopy(\\n        freeMemPtr,\\n        calldataOffset,\\n        calldatasize()\\n    )\\n```\\n