LootBox - Unprotected selfdestruct in proxy implementation
When the `LootBoxController` is deployed, it also deploys an instance of `LootBox`. When someone calls `LootBoxController.plunder()` or `LootBoxController.executeCall()` the controller actually deploys a temporary proxy contract to a deterministic address using `create2`, then calls out to it to collect the loot.\\nThe `LootBox` implementation contract is completely unprotected, exposing all its functionality to any actor on the blockchain. The most critical functionality is actually the `LootBox.destroy()` method that calls `selfdestruct()` on the implementation contract.\\nTherefore, an unauthenticated user can `selfdestruct` the `LootBox` proxy implementation and cause the complete system to become dysfunctional. As an effect, none of the AirDrops that were delivered based on this contract will be redeemable (Note: `create2` deploy address is calculated from the current contract address and salt). Funds may be lost.\\n```\\nconstructor () public {\\n  lootBoxActionInstance = new LootBox();\\n  lootBoxActionBytecode = MinimalProxyLibrary.minimalProxy(address(lootBoxActionInstance));\\n}\\n```\\n\\n```\\n/// @notice Destroys this contract using `selfdestruct`\\n/// @param to The address to send remaining Ether to\\nfunction destroy(address payable to) external {\\n  selfdestruct(to);\\n}\\n```\\n\\nnot in scope but listed for completeness\\n```\\ncontract CounterfactualAction {\\n  function depositTo(address payable user, PrizePool prizePool, address output, address referrer) external {\\n    IERC20 token = IERC20(prizePool.token());\\n    uint256 amount = token.balanceOf(address(this));\\n    token.approve(address(prizePool), amount);\\n    prizePool.depositTo(user, amount, output, referrer);\\n    selfdestruct(user);\\n  }\\n\\n  function cancel(address payable user, PrizePool prizePool) external {\\n    IERC20 token = IERC20(prizePool.token());\\n    token.transfer(user, token.balanceOf(address(this)));\\n    selfdestruct(user);\\n  }\\n```\\n
Enforce that only the deployer of the contract can call functionality in the contract. Make sure that nobody can destroy the implementation of proxy contracts.
```\\nconstructor () public {\\n  lootBoxActionInstance = new LootBox();\\n  lootBoxActionBytecode = MinimalProxyLibrary.minimalProxy(address(lootBoxActionInstance));\\n}\\n```\\n