function testIfImplementationCanBeEOA() public {
assertEq(MockERC20(jpycv2Address).balanceOf(user1), 0 ether);
assertEq(MockERC20(jpycv2Address).balanceOf(stadiumAddress), 0 ether);
bytes32 randomId_ = keccak256(abi.encode("Jason", "001"));
address[] memory tokens_ = new address[](1);
tokens_[0] = jpycv2Address;
address[] memory winners = new address[](1);
winners[0] = user1;
uint256[] memory percentages_ = new uint256[](1);
percentages_[0] = 9500;
bytes memory data = abi.encodeWithSelector(Distributor.distribute.selector, jpycv2Address, winners, percentages_, "");
vm.startPrank(factoryAdmin);
bytes32 randomId = keccak256(abi.encode("Jason", "001"));
proxyFactory.setContest(organizer, randomId, block.timestamp + 8 days, user2);
vm.stopPrank();
bytes32 salt = keccak256(abi.encode(organizer, randomId, user2));
address proxyAddress = proxyFactory.getProxyAddress(salt, user2);
vm.startPrank(sponsor);
MockERC20(jpycv2Address).transfer(proxyAddress, 10000 ether);
vm.stopPrank();
assertEq(MockERC20(jpycv2Address).balanceOf(proxyAddress), 10000 ether);
vm.warp(9 days);
vm.startPrank(organizer);
proxyFactory.deployProxyAndDistribute(randomId_, user2, data);
vm.stopPrank();
console.log("balance of user after distribute",MockERC20(jpycv2Address).balanceOf(user1));
assertEq(MockERC20(jpycv2Address).balanceOf(user1), 0);
assertEq(MockERC20(jpycv2Address).balanceOf(stadiumAddress), 0);
}
Add a codesize check for the implementation & optionally a view method on the implementation can be called to check for right interface or make it adhere to the erc165 standard(https://eips.ethereum.org/EIPS/eip-165)