// Copyright 2015 Stellar Development Foundation and contributors. Licensed // under the Apache License, Version 2.0. See the COPYING file at the root // of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 typedef PublicKey AccountID; typedef opaque Thresholds[4]; typedef string string32<32>; typedef string string64<64>; typedef int64 SequenceNumber; typedef uint64 TimePoint; typedef opaque DataValue<64>; enum AssetType { ASSET_TYPE_NATIVE = 0, ASSET_TYPE_CREDIT_ALPHANUM4 = 1, ASSET_TYPE_CREDIT_ALPHANUM12 = 2 }; struct AssetAlphanum4 { opaque assetCode[4]; // 1 to 4 characters AccountID issuer; }; struct AssetAlphanum12 { opaque assetCode[12]; // 5 to 12 characters AccountID issuer; }; union Asset switch (AssetType type) { case ASSET_TYPE_NATIVE: // Not credit void; case ASSET_TYPE_CREDIT_ALPHANUM4: AssetAlphanum4 alphaNum4; case ASSET_TYPE_CREDIT_ALPHANUM12: AssetAlphanum12 alphaNum12; // add other asset types here in the future }; // price in fractional representation struct Price { int32 n; // numerator int32 d; // denominator }; struct Liabilities { int64 buying; int64 selling; }; // the 'Thresholds' type is packed uint8_t values // defined by these indexes enum ThresholdIndexes { THRESHOLD_MASTER_WEIGHT = 0, THRESHOLD_LOW = 1, THRESHOLD_MED = 2, THRESHOLD_HIGH = 3 }; enum LedgerEntryType { ACCOUNT = 0, TRUSTLINE = 1, OFFER = 2, DATA = 3 }; struct Signer { SignerKey key; uint32 weight; // really only need 1byte }; enum AccountFlags { // masks for each flag // Flags set on issuer accounts // TrustLines are created with authorized set to "false" requiring // the issuer to set it for each TrustLine AUTH_REQUIRED_FLAG = 0x1, // If set, the authorized flag in TrustLines can be cleared // otherwise, authorization cannot be revoked AUTH_REVOCABLE_FLAG = 0x2, // Once set, causes all AUTH_* flags to be read-only AUTH_IMMUTABLE_FLAG = 0x4 }; // mask for all valid flags const MASK_ACCOUNT_FLAGS = 0x7; /* AccountEntry Main entry representing a user in Stellar. All transactions are performed using an account. Other ledger entries created require an account. */ union AccountEntryExtV1Ext switch (int v) { case 0: void; }; struct AccountEntryExtV1 { Liabilities liabilities; AccountEntryExtV1Ext ext; }; union AccountEntryExt switch (int v) { case 0: void; case 1: AccountEntryExtV1 v1; }; struct AccountEntry { AccountID accountID; // master public key for this account int64 balance; // in stroops SequenceNumber seqNum; // last sequence number used for this account uint32 numSubEntries; // number of sub-entries this account has // drives the reserve AccountID* inflationDest; // Account to vote for during inflation uint32 flags; // see AccountFlags string32 homeDomain; // can be used for reverse federation and memo lookup // fields used for signatures // thresholds stores unsigned bytes: [weight of master|low|medium|high] Thresholds thresholds; Signer signers<20>; // possible signers for this account // reserved for future use AccountEntryExt ext; }; /* TrustLineEntry A trust line represents a specific trust relationship with a credit/issuer (limit, authorization) as well as the balance. */ enum TrustLineFlags { // issuer has authorized account to perform transactions with its credit AUTHORIZED_FLAG = 1 }; // mask for all trustline flags const MASK_TRUSTLINE_FLAGS = 1; union TrustLineEntryExtV1Ext switch (int v) { case 0: void; }; struct TrustLineEntryExtV1 { Liabilities liabilities; TrustLineEntryExtV1Ext ext; }; union TrustLineEntryExt switch (int v) { case 0: void; case 1: TrustLineEntryExtV1 v1; }; struct TrustLineEntry { AccountID accountID; // account this trustline belongs to Asset asset; // type of asset (with issuer) int64 balance; // how much of this asset the user has. // Asset defines the unit for this; int64 limit; // balance cannot be above this uint32 flags; // see TrustLineFlags // reserved for future use TrustLineEntryExt ext; }; enum OfferEntryFlags { // issuer has authorized account to perform transactions with its credit PASSIVE_FLAG = 1 }; // Mask for OfferEntry flags const MASK_OFFERENTRY_FLAGS = 1; /* OfferEntry An offer is the building block of the offer book, they are automatically claimed by payments when the price set by the owner is met. For example an Offer is selling 10A where 1A is priced at 1.5B */ union OfferEntryExt switch (int v) { case 0: void; }; struct OfferEntry { AccountID sellerID; int64 offerID; Asset selling; // A Asset buying; // B int64 amount; // amount of A /* price for this offer: price of A in terms of B price=AmountB/AmountA=priceNumerator/priceDenominator price is after fees */ Price price; uint32 flags; // see OfferEntryFlags // reserved for future use OfferEntryExt ext; }; /* DataEntry Data can be attached to accounts. */ union DataEntryExt switch (int v) { case 0: void; }; struct DataEntry { AccountID accountID; // account this data belongs to string64 dataName; DataValue dataValue; // reserved for future use DataEntryExt ext; }; union LedgerEntryData switch (LedgerEntryType type) { case ACCOUNT: AccountEntry account; case TRUSTLINE: TrustLineEntry trustLine; case OFFER: OfferEntry offer; case DATA: DataEntry data; }; union LedgerEntryExt switch (int v) { case 0: void; }; struct LedgerEntry { uint32 lastModifiedLedgerSeq; // ledger the LedgerEntry was last changed LedgerEntryData data; // reserved for future use LedgerEntryExt ext; }; // list of all envelope types used in the application // those are prefixes used when building signatures for // the respective envelopes enum EnvelopeType { ENVELOPE_TYPE_SCP = 1, ENVELOPE_TYPE_TX = 2, ENVELOPE_TYPE_AUTH = 3, ENVELOPE_TYPE_SCPVALUE = 4 };