编译器
0.8.27+commit.40a35a09
文件 1 的 3:IPermissionsManager.sol
pragma solidity ^0.8.24;
interface IPermissionsManager{
enum Role {
ANY,
GLOBAL_ADMIN,
MINT_ADMIN,
TRANSFER_ADMIN,
SYSTEMS_ADMIN,
EXT1,
EXT2,
EXT3,
EXT4,
EXT5,
EXT6,
EXT7,
EXT8,
EXT9,
EXT10
}
function hasRole(Role role_, address account_) external view returns(bool);
function addRole(Role role_, address account_) external;
function removeRole(Role role_, address account_) external;
}
文件 2 的 3:SCPermissionedAccess.sol
pragma solidity ^0.8.24;
import "../../interfaces/IPermissionsManager.sol";
contract SCPermissionedAccess {
IPermissionsManager public immutable permissions;
modifier isGlobalAdmin() {
require(permissions.hasRole(IPermissionsManager.Role.GLOBAL_ADMIN, msg.sender), "Not a Global Admin");
_;
}
modifier isSystemsAdmin() {
require(permissions.hasRole(IPermissionsManager.Role.SYSTEMS_ADMIN, msg.sender), "Not a Systems Admin");
_;
}
constructor(address _permissions){
permissions = IPermissionsManager(_permissions);
}
}
文件 3 的 3:SCVirtualAssetEvents.sol
pragma solidity ^0.8.24;
import "../Utils/SCPermissionedAccess.sol";
contract SCVirtualAssetEvents {
ISCVirtualAssetEventsFactory _factory;
string public game;
event GameUserAsset(string user_id, string asset_id, int256 delta, string data);
event GameUserActivity(string user_id, string data);
event GameUserAssetWithSign(string user_id, string asset_id, int256 delta, string data, bytes sign);
event GameUserActivityWithSign(string user_id, string data, bytes sign);
modifier isPermissionedUser() {
require(_factory.permissions_users(msg.sender), "NOT PERMISSIONED USER");
_;
}
constructor(ISCVirtualAssetEventsFactory factory_, string memory game_) {
_factory = factory_;
game = game_;
}
function EmitGameUserAsset(string calldata user_id, string calldata asset_id, int256 delta, string calldata data) external isPermissionedUser {
emit GameUserAsset(user_id, asset_id, delta, data);
}
function EmitGameUserActivity(string calldata user_id, string calldata data) external isPermissionedUser {
emit GameUserActivity(user_id, data);
}
function EmitGameUserAssetWithSign(string calldata user_id, string calldata asset_id, int256 delta, string calldata data, bytes calldata sign) external {
emit GameUserAssetWithSign(user_id, asset_id, delta, data, sign);
}
function EmitGameUserActivityWithSign(string calldata user_id, string calldata data, bytes calldata sign) external {
emit GameUserActivityWithSign(user_id, data, sign);
}
}
interface ISCVirtualAssetEventsFactory {
function permissions_users(address user) external view returns (bool);
}
contract SCVirtualAssetEventsFactory is SCPermissionedAccess, ISCVirtualAssetEventsFactory {
mapping(address => bool) public permissions_users;
mapping(string => SCVirtualAssetEvents) public game_events;
string[] private _games;
constructor(address permissions_) SCPermissionedAccess(permissions_) {
_deployGameEvents("Bullet League");
_deployGameEvents("Racket Rampage");
_deployGameEvents("Super Champs HQ");
}
function permissionUser(address[] memory users, bool state) external isSystemsAdmin {
uint256 len = users.length;
for(uint256 i = 0; i < len; i++) {
permissions_users[users[i]] = state;
}
}
function _deployGameEvents(string memory game_id) internal {
require(game_events[game_id] == SCVirtualAssetEvents(address(0)), "GAME EXISTS");
game_events[game_id] = new SCVirtualAssetEvents(this, game_id);
_games.push(game_id);
}
function deployGameEvents(string memory game_id) external isSystemsAdmin {
_deployGameEvents(game_id);
}
function games() external view returns (string[] memory _games_) {
uint len = _games.length;
_games_ = new string[](len);
for(uint i = 0; i < len; i++) {
_games_[i] = _games[i];
}
}
}
{
"compilationTarget": {
"SuperChamps/contracts/Ecosystem/SCVirtualAssetEvents.sol": "SCVirtualAssetEvents"
},
"evmVersion": "cancun",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 20
},
"remappings": []
}
[{"inputs":[{"internalType":"contract ISCVirtualAssetEventsFactory","name":"factory_","type":"address"},{"internalType":"string","name":"game_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"user_id","type":"string"},{"indexed":false,"internalType":"string","name":"data","type":"string"}],"name":"GameUserActivity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"user_id","type":"string"},{"indexed":false,"internalType":"string","name":"data","type":"string"},{"indexed":false,"internalType":"bytes","name":"sign","type":"bytes"}],"name":"GameUserActivityWithSign","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"user_id","type":"string"},{"indexed":false,"internalType":"string","name":"asset_id","type":"string"},{"indexed":false,"internalType":"int256","name":"delta","type":"int256"},{"indexed":false,"internalType":"string","name":"data","type":"string"}],"name":"GameUserAsset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"user_id","type":"string"},{"indexed":false,"internalType":"string","name":"asset_id","type":"string"},{"indexed":false,"internalType":"int256","name":"delta","type":"int256"},{"indexed":false,"internalType":"string","name":"data","type":"string"},{"indexed":false,"internalType":"bytes","name":"sign","type":"bytes"}],"name":"GameUserAssetWithSign","type":"event"},{"inputs":[{"internalType":"string","name":"user_id","type":"string"},{"internalType":"string","name":"data","type":"string"}],"name":"EmitGameUserActivity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"user_id","type":"string"},{"internalType":"string","name":"data","type":"string"},{"internalType":"bytes","name":"sign","type":"bytes"}],"name":"EmitGameUserActivityWithSign","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"user_id","type":"string"},{"internalType":"string","name":"asset_id","type":"string"},{"internalType":"int256","name":"delta","type":"int256"},{"internalType":"string","name":"data","type":"string"}],"name":"EmitGameUserAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"user_id","type":"string"},{"internalType":"string","name":"asset_id","type":"string"},{"internalType":"int256","name":"delta","type":"int256"},{"internalType":"string","name":"data","type":"string"},{"internalType":"bytes","name":"sign","type":"bytes"}],"name":"EmitGameUserAssetWithSign","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"game","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]