have to change the owner to the contract?

no {} after interface function declaration

address[] memory ETHarray = new address[](2);
        ETHarray[0] = ETH;
        ETHarray[1] = ETH;
        
        uint[] memory values = new uint[](2);
        values[0] = 2 ether;
        values[1] = 2 ether; 

... 

OKAY MAYBE NO as the modern ans do it this way too…

bytes memory data = abi.encodeWithSelector(token.approve.selector, address(this), totalAmount);

Have a look at this: Replace abi.encodeWithSelector by abi.encodeCall

🧐 Motivation

Since 0.8.11, abi.encodeCall provide type-safe encode utility comparing with abi.encodeWithSelector.