https://docs.metamask.io/wallet/reference/json-rpc-api/
window.web3 is no longer injected by metamask, instead it is window.ethereum, but loads of methods are missing. It used to be very simple, just:
contract = new window.web3.eth.Contract(abi, address);
...
const a = await contract.methods.testCall().call();
I don't understand how to do this now, there is no Contract method. There is a request({"method": "eth_call"...) but I don't understand how to use it.
It seems like they took something very simple that was working and broke it.