pragma solidity ^0.5.0; // base data contract contract PureData { address owner; struct game { address logicContract; mapping(address => uint) highscores; } mapping (uint => game) gamedata; } // master contract for web3 // Q.1 use inherit for common data segment, is it ok? contract MasterContract is PureData { modifier onlyOwner () { require(msg.sender == owner); _; } constructor() public payable { owner = msg.sender; } function setLogicContract(uint gameid, address addr) onlyOwner public { gamedata[gameid].logicContract = addr; } function getHighscore(uint gameid) public view returns(uint) { return gamedata[gameid].highscores[msg.sender]; } // Q.2 payable here? or in logic contract? function() external payable { // decode msg.data first // Q.3 am I corrected decode? uint32 func; uint gameid; (func, gameid) = abi.decode(msg.data, (uint32,uint)); gamedata[gameid].logicContract.delegatecall(msg.data); } } // contract which shares common function name and parameters contract BaseballLogic is PureData { modifier isBaseball(uint gameid) { require(gameid == 0); _; } function setHighscore (uint gameid, uint score, uint[64] ingameresponse) public isBaseball(gameid) returns (uint) { // based on baseball game, validate in-game response data gamedata[gameid].highscores[msg.sender] = score; } } // contract which shares common function name and parameters contract FatboyLogic is PureData { modifier isFatboy(uint gameid) { require(gameid == 1); _; } function setHighscore (uint gameid, uint score, uint[64] ingameresponse) public returns (uint) { // based on fatboy game, validate in-game response data gamedata[gameid].highscores[msg.sender] = score; } } // contract which has different function names contract ZapAliensLogic is PureData { function setZapAiensHighscore (uint gameid, uint score, uint[32] ingameresponse) public returns (uint) { // based on zap aliens game, validate in-game response data gamedata[2].highscores[msg.sender] = score; } } // contract which has different function names contract PinballLogic is PureData { function setPinballHighscore (uint gameid, uint score, uint[512] ingameresponse) public isFatboy(gameid) returns (uint) { // based on pinball game, validate in-game response data gamedata[3].highscores[msg.sender] = score; } }
0.5.0