ManaSettlement.sol


Обзор

ManaSettlement.sol — это смарт-контракт на языке Solidity, реализующий систему расчётов и управления состоянием игроков в игровой экономике с использованием токена MANA. Контракт обеспечивает хранение и обновление индивидуальных профилей игроков, балансов MANA, а также поддерживает партии обновлений для оптимизации работы. В основе лежит роль-ориентированный контроль доступа, что позволяет разграничить права между игровым менеджером и администраторами.

Это автономный модуль, предназначенный для интеграции с игровыми системами и потенциальной интеграции с Symbiotic Settlement, обеспечивающий безопасное, эффективное и прозрачное управление экономикой игры.


Основные возможности


Классы и структуры

ManaSettlement (контракт)

Наследует: AccessControl (OpenZeppelin)

Роли

Структуры

struct PlayerProfile {
    uint256 level;
    uint256 experience;
    uint256 totalManaEarned;
    uint256 totalManaSpent;
    uint256 lastActionTimestamp;
    uint256 wins;
    uint256 losses;
    uint256 rating;
    uint256 itemsCrafted;
    bytes32[] achievements;
}
struct PlayerStateUpdate {
    address player;
    uint256 newManaBalance;
    PlayerProfile newProfile;
}

Функции и методы

Конструктор и инициализация

constructor(address _manaToken)
function initialize(address defaultAdmin, address gameManager)
manaSettlement.initialize(adminAddress, gameManagerAddress);

Управление состоянием игроков

function updatePlayerState(address player, uint256 newManaBalance, PlayerProfile calldata newProfile)
manaSettlement.updatePlayerState(playerAddress, 500, newProfileData);
function batchUpdatePlayerStates(PlayerStateUpdate[] calldata updates)
PlayerStateUpdate[] memory batch = new PlayerStateUpdate[](2);
batch[0] = PlayerStateUpdate(player1, 300, profile1);
batch[1] = PlayerStateUpdate(player2, 450, profile2);
manaSettlement.batchUpdatePlayerStates(batch);
function getPlayerState(address player) external view returns (uint256 manaBalance, PlayerProfile memory profile, bool isRegistered)
function getMultiplePlayerStates(address[] calldata players) external view returns (PlayerStateUpdate[] memory states)

Работа с балансом MANA

function getPlayerManaBalances(address player) external view returns (uint256 settlementBalance, uint256 tokenBalance)
function updatePlayerManaBalance(address player, uint256 newBalance)

Управление профилями и достижениями

function addPlayerAchievement(address player, bytes32 achievement)
function getPlayerProfile(address player) external view returns (PlayerProfile memory profile)
function getPlayerAchievements(address player) external view returns (bytes32[] memory achievements)

Регистрация игроков

function registerPlayer(address player)
manaSettlement.registerPlayer(newPlayerAddress);
function isPlayerRegistered(address player) external view returns (bool isRegistered)

Управление состоянием контракта

function pause() external onlyRole(PAUSER_ROLE)
function unpause() external onlyRole(PAUSER_ROLE)
function paused() public view returns (bool)

Дополнительные функции

function getTotalStats() external view returns (uint256 totalRegisteredPlayers, uint256 totalBatches)
function supportsInterface(bytes4 interfaceId) public view override returns (bool)

Важные детали реализации


Взаимодействие с другими частями системы


Пример использования

// Инициализация
manaSettlement.initialize(adminAddress, gameManagerAddress);

// Регистрация нового игрока
manaSettlement.registerPlayer(playerAddress);

// Обновление состояния игрока
ManaSettlement.PlayerProfile memory newProfile = ManaSettlement.PlayerProfile({
    level: 5,
    experience: 1500,
    totalManaEarned: 10000,
    totalManaSpent: 5000,
    lastActionTimestamp: block.timestamp,
    wins: 10,
    losses: 3,
    rating: 1200,
    itemsCrafted: 7,
    achievements: new bytes32[](0)
});

manaSettlement.updatePlayerState(playerAddress, 800, newProfile);

// Добавление достижения
manaSettlement.addPlayerAchievement(playerAddress, keccak256(abi.encodePacked("FirstWin")));

Диаграмма структуры контракта

classDiagram
    class ManaSettlement {
        <<contract>>
        +bytes32 GAME_MANAGER_ROLE
        +bytes32 PAUSER_ROLE
        -uint256 _status
        -bool _paused
        +ManaToken manaToken
        +mapping(address => uint256) manaBalances
        +mapping(address => PlayerProfile) playerProfiles
        +mapping(address => bool) registeredPlayers
        +uint256 totalPlayers
        +uint256 batchCounter

        +constructor(address _manaToken)
        +initialize(address defaultAdmin, address gameManager)
        +updatePlayerState(address player, uint256 newManaBalance, PlayerProfile newProfile)
        +batchUpdatePlayerStates(PlayerStateUpdate[] updates)
        +getPlayerState(address player) returns (uint256, PlayerProfile, bool)
        +getPlayerManaBalances(address player) returns (uint256, uint256)
        +getPlayerProfile(address player) returns PlayerProfile
        +getPlayerAchievements(address player) returns bytes32[]
        +addPlayerAchievement(address player, bytes32 achievement)
        +updatePlayerManaBalance(address player, uint256 newBalance)
        +registerPlayer(address player)
        +getTotalStats() returns (uint256, uint256)
        +pause()
        +unpause()
        +paused() returns bool
        +isPlayerRegistered(address player) returns bool
        +getMultiplePlayerStates(address[] players) returns PlayerStateUpdate[]
        +supportsInterface(bytes4 interfaceId) returns bool
    }

    class PlayerProfile {
        +uint256 level
        +uint256 experience
        +uint256 totalManaEarned
        +uint256 totalManaSpent
        +uint256 lastActionTimestamp
        +uint256 wins
        +uint256 losses
        +uint256 rating
        +uint256 itemsCrafted
        +bytes32[] achievements
    }

    class PlayerStateUpdate {
        +address player
        +uint256 newManaBalance
        +PlayerProfile newProfile
    }

    ManaSettlement --> ManaToken : uses
    ManaSettlement o-- PlayerProfile : manages
    ManaSettlement o-- PlayerStateUpdate : manages

Заключение

ManaSettlement.sol — ключевой модуль управления состоянием игроков и их экономикой в игровой экосистеме, обеспечивающий безопасность, масштабируемость и прозрачность. Контракт построен с использованием проверенных стандартов и паттернов, что позволяет легко интегрировать его в более крупные системы и обеспечивать надёжное управление игровыми активами и статистикой.