载入中...
搜索中...
未找到
EconomyLedgerResourceAccount.cpp
浏览该文件的文档.
52 eve::Diagnostic::error(eve::DiagnosticCode::PreconditionViolation, "resource cost exceeds available balance",
59 eve::Diagnostic::error(eve::DiagnosticCode::NotFound, "resource reservation does not belong to this account",
66 eve::Diagnostic::error(eve::DiagnosticCode::Conflict, "resource reservation belongs to a different account",
84 return eve::Status::failure(eve::StatusCode::Failed, invariantFailure("resource receipt id exhausted", "receipt"));
94EconomyLedgerResourceAccount::EconomyLedgerResourceAccount(EconomyLedger& ledger) : ledger_(ledger) {
102eve::Result<std::int64_t> EconomyLedgerResourceAccount::balanceOf(const ResourceId& resource) const {
110eve::Result<std::int64_t> EconomyLedgerResourceAccount::activeReservationsFor(const ResourceId& resource) const {
126eve::Result<void> EconomyLedgerResourceAccount::validateLedgerRange(const CostSpec& cost, bool debit) const {
155 if (accountNonce_.isZero()) return eve::Result<Affordability>::failure(accountIdentityUnavailableStatus());
167 const std::int64_t available = balance.value() >= reserved.value() ? balance.value() - reserved.value() : 0;
177 std::string("canAfford") + " failed while staging an atomic ledger candidate: " + exception.what(),
181 eve::DiagnosticCode::Failed, std::string("canAfford") + " failed while staging an atomic ledger candidate",
195 eve::StatusCode::Failed, invariantFailure("resource reservation id exhausted", "reservation")));
198 const auto [it, inserted] = reservations_.emplace(id, ReservationRecord{cost, ReservationState::Active});
201 eve::StatusCode::Conflict, conflict("resource reservation id was already used", "reservation")));
208 std::string("reserve") + " failed while staging an atomic ledger candidate: " + exception.what(),
212 eve::DiagnosticCode::Failed, std::string("reserve") + " failed while staging an atomic ledger candidate",
241 std::string("applyDelta") + " failed while staging an atomic ledger candidate: " + exception.what(),
245 eve::DiagnosticCode::Failed, std::string("applyDelta") + " failed while staging an atomic ledger candidate",
263 return eve::Result<Receipt>::success(std::move(receipt), eve::Status::success(eve::StatusCode::Applied));
271 eve::DiagnosticCode::Failed, std::string("debit") + " failed while staging an atomic ledger candidate",
278 if (accountNonce_.isZero()) return eve::Result<Receipt>::failure(accountIdentityUnavailableStatus());
288 return eve::Result<Receipt>::success(std::move(receipt), eve::Status::success(eve::StatusCode::Applied));
292 std::string("credit") + " failed while staging an atomic ledger candidate: " + exception.what(),
296 eve::DiagnosticCode::Failed, std::string("credit") + " failed while staging an atomic ledger candidate",
334 if (accountNonce_.isZero()) return eve::Result<Receipt>::failure(accountIdentityUnavailableStatus());
336 return eve::Result<Receipt>::failure(invalidArgument("resource reservation is invalid", "reservation"));
337 if (reservation.account != accountNonce_) return eve::Result<Receipt>::failure(foreignReservationStatus());
339 if (it == reservations_.end()) return eve::Result<Receipt>::failure(unknownReservationStatus());
340 if (it->second.cost != reservation.cost) return eve::Result<Receipt>::failure(mismatchedReservationStatus());
351 Receipt receipt{accountNonce_, nextReceipt_, reservation.id, ReceiptOperation::Debit, it->second.cost};
356 return eve::Result<Receipt>::success(std::move(receipt), eve::Status::success(eve::StatusCode::Applied));
360 std::string("commit") + " failed while staging an atomic ledger candidate: " + exception.what(),
364 eve::DiagnosticCode::Failed, std::string("commit") + " failed while staging an atomic ledger candidate",
371 if (accountNonce_.isZero()) return eve::Result<void>::failure(accountIdentityUnavailableStatus());
373 return eve::Result<void>::failure(invalidArgument("resource reservation is invalid", "reservation"));
374 if (reservation.account != accountNonce_) return eve::Result<void>::failure(foreignReservationStatus());
377 if (it->second.cost != reservation.cost) return eve::Result<void>::failure(mismatchedReservationStatus());
385 std::string("rollback") + " failed while staging an atomic ledger candidate: " + exception.what(),
389 eve::DiagnosticCode::Failed, std::string("rollback") + " failed while staging an atomic ledger candidate",
Resource-account adapter backed by an EconomyLedger.
A structured explanation of a failed, degraded, or noteworthy result.
Definition Diagnostic.h:94
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Status failure(StatusCode code, Diagnostic diagnostic)
Construct a failed status with one diagnostic.
Definition Status.h:84
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
constexpr std::uint64_t value() const noexcept
Returns the underlying value at an explicit protocol boundary.
Definition StrongUint64.h:26
eve::Result< eve::resource::Receipt > debit(const eve::resource::CostSpec &cost) override
Atomically debit all items immediately.
Definition EconomyLedgerResourceAccount.cpp:250
EconomyLedgerResourceAccount(EconomyLedger &ledger)
Bind an account adapter to an existing caller-owned ledger.
Definition EconomyLedgerResourceAccount.cpp:94
eve::Result< void > rollback(const eve::resource::Reservation &reservation) override
Release one active reservation without changing balances.
Definition EconomyLedgerResourceAccount.cpp:369
eve::Result< eve::resource::Affordability > canAfford(const eve::resource::CostSpec &cost) const override
Query whether a cost can be paid from currently available funds.
Definition EconomyLedgerResourceAccount.cpp:153
eve::Result< eve::resource::Receipt > credit(const eve::resource::CostSpec &cost) override
Atomically credit all items immediately.
Definition EconomyLedgerResourceAccount.cpp:276
eve::Result< eve::resource::Reservation > reserve(const eve::resource::CostSpec &cost) override
Reserve all items of a cost without changing visible balances.
Definition EconomyLedgerResourceAccount.cpp:186
eve::Result< eve::resource::Receipt > commit(const eve::resource::Reservation &reservation) override
Commit one active reservation as an atomic debit.
Definition EconomyLedgerResourceAccount.cpp:332
void swap(EconomyLedger &other) noexcept
Swap two ledgers without exposing an intermediate partial state.
Definition EconomyLedger.cpp:64
bool debit(const std::string &type, int amount)
出账 amount;余额不足时返回 false 且不扣款。
Definition EconomyLedger.cpp:23
constexpr bool isZero() const noexcept
Whether this nonce is invalid/zero.
Definition ResourceAccount.h:246
Non-negative integral quantity used by resource accounts.
Definition ResourceAccount.h:75
const std::vector< ResourceCost > & items() const noexcept
Return canonical items as a read-only borrowed view.
Definition ResourceAccount.h:185
bool isValid() const noexcept
Whether this value contains a validated non-empty cost.
Definition ResourceAccount.h:175
Strong identity of a resource kind, such as mana or gold.
Definition ResourceAccount.h:40
Definition IEconomy.h:5
constexpr HexDirection next(HexDirection d) noexcept
The next direction clockwise (NW wraps to NE).
Definition HexMetrics.h:76
eve::Result< AccountNonce > allocateAccountNonce()
Allocate a process-local account identity for a credential issuer.
Definition ResourceAccount.cpp:27
eve::detail::StrongUint64< eve::detail::ResourceReceiptIdTag > ReceiptId
Process-local id of an applied resource operation.
Definition ResourceAccount.h:261
ReceiptOperation
Operation represented by a receipt returned from an account.
Definition ResourceAccount.h:221
std::vector< DiagnosticDetail > DiagnosticDetails
Owning collection of diagnostic details with stable insertion order.
Definition Diagnostic.h:88
@ InvalidArgument
@ NotFound
@ PreconditionViolation
@ Unsupported
@ InvariantViolation
@ Failed
@ Conflict
@ NotFound
@ Applied
@ Unsupported
@ Rejected
@ Failed
@ Conflict
Receipt proving one atomic debit or credit was applied.
Definition ResourceAccount.h:294
Reservation credential returned by a successful reserve operation.
Definition ResourceAccount.h:279