syntax = "proto3";
package solana_messages;

message Account {
    bytes Address = 1;
    bool IsSigner = 2;
    bool IsWritable = 3;

    optional TokenInfo Token = 4;
}

message TokenInfo {
    bytes Mint = 1;
    bytes Owner = 2;
    uint32 Decimals = 3;
    bytes ProgramId = 4;
    uint64 Supply = 5;
}

message BalanceUpdate {
    uint64 PreBalance = 1;
    uint64 PostBalance = 2;
    uint32 AccountIndex = 3;
}


message Instruction {
    uint32 ProgramAccountIndex = 1;
    uint64 CallerIndex = 2;
    uint64 InnerIndex = 3;
    uint64 NestingLevel = 4;
    bytes  Data = 5;
    repeated uint32 AccountIndexes = 6;
    repeated BalanceUpdate BalanceUpdates = 7;
    repeated BalanceUpdate TokenBalanceUpdates = 8;
    repeated BalanceUpdate TokenSupplyUpdates = 9;
}

message TransactionHeader {
    uint64 Fee = 1;
    bytes FeePayer = 2;
    bytes RecentBlockhash = 3;
    bytes Signer = 4;
    repeated bytes Signatures = 5;
    repeated Account Accounts = 6;
}

enum RewardType {
    RewardTypeUnknown = 0;
    Fee = 1;
    Rent = 2;
    Staking = 3;
    Voting = 4;
}

message Reward {
    bytes Address = 1;
    int64 Amount = 2;
    uint64 PostBalance = 3;
    RewardType RewardType = 4;
    uint64 Commission = 5;
}

message TransactionStatus {
    bool Success = 1;
    string ErrorMessage = 2;
}

message Transaction {
    bytes Signature = 1;
    TransactionStatus Status = 2;
    TransactionHeader Header = 3;
    repeated BalanceUpdate TotalBalanceUpdates = 4;
    repeated BalanceUpdate TotalTokenBalanceUpdates = 5;
    repeated Instruction Instructions = 7;
    repeated string Logs = 8;
    uint64 Index = 9;
}

message BlockHeader {
    uint64 Slot = 1;
    bytes Hash = 2;
    uint64 ParentSlot = 4;
    uint64 Height = 5;
    int64 Timestamp = 6;
    bytes ParentHash = 7;
}

message BlockMessage {
    BlockHeader Header = 1;
    repeated Reward Rewards = 2;
    repeated Transaction Transactions = 3;
}

