pragma solidity ^0.4.24; import './Ownable.sol'; import './Proxy.sol'; contract Deployer is Ownable { event StartChallenge(address player, address deployed); event ChallengeCompleted(address player, address deployed); event Contr(address); mapping (address => Proxy[5]) playersToContracts; mapping (address => bool[5]) playersToCompletion; mapping (address => string) playersToNick; address[5] challenges; constructor(address challenge1, address challenge2, address challenge3, address challenge4, address challenge5) public { challenges[0] = challenge1; challenges[1] = challenge2; challenges[2] = challenge3; challenges[3] = challenge4; challenges[4] = challenge5; } //------------------ STATE CHANGING FUNCTIONS ------------------------// function updateChallenge(address newAddress, uint256 index) public onlyOwner { challenges[index] = newAddress; } function deployChallenge(uint256 index) public payable { require(msg.value == 1 ether, "Must send 1 ether"); playersToContracts[msg.sender][index] = (new Proxy).value(msg.value)(challenges[index]); emit StartChallenge(msg.sender, address(playersToContracts[msg.sender][index])); } function setNickname(string memory name) public { playersToNick[msg.sender] = name; } function completeChallenge(uint256 index) public returns (bool) { bytes4 sig = bytes4(keccak256("isComplete()")); address _to = playersToContracts[msg.sender][index]; require(isContract(_to), "Target address must be a contract"); assembly { // move pointer to free memory spot let ptr := mload(0x40) // put function sig at memory spot mstore(ptr,sig) let result := call( gas, // gas limit _to, // to addr. append var to _slot to access storage variable 0, // not transfer any ether ptr, // Inputs are stored at location ptr 0x4, // Inputs are 4 bytes long ptr, //Store output over input 0x20) //Outputs are 32 bytes long if eq(result, 0) { revert(0, 0) } let answer := mload(ptr) // Assign output to answer var return(answer,0x20) } } //---------------------- VIEW FUNCTIONS -------------------------------// function isContract(address _addr) private view returns (bool) { uint32 size; assembly { size := extcodesize(_addr) } return (size > 0); } function getNicknameOf(address player) public view returns (string memory) { return playersToNick[player]; } function getAddressOf(address player, uint256 index) public view returns (address) { return address(playersToContracts[player][index]); } function checkCompletionOf(address player, uint256 index) public view returns (bool) { return playersToCompletion[player][index]; } }
0.4.24