bool AllowTrustOpFrame::doApply(LedgerDelta& delta, LedgerManager& ledgerManager) { if (!(mSourceAccount->getAccount().flags & AUTH_REQUIRED_FLAG)) { // this account doesn't require authorization to hold credit innerResult().code(ALLOW_TRUST_TRUST_NOT_REQUIRED); return false; } if (!(mSourceAccount->getAccount().flags & AUTH_REVOCABLE_FLAG) && !mAllowTrust.authorize) { innerResult().code(ALLOW_TRUST_CANT_REVOKE); return false; } Currency ci; ci.type(CURRENCY_TYPE_ALPHANUM); ci.alphaNum().currencyCode = mAllowTrust.currency.currencyCode(); ci.alphaNum().issuer = getSourceID(); Database& db = ledgerManager.getDatabase(); TrustFrame::pointer trustLine; trustLine = TrustFrame::loadTrustLine(mAllowTrust.trustor, ci, db); if (!trustLine) { innerResult().code(ALLOW_TRUST_NO_TRUST_LINE); return false; } innerResult().code(ALLOW_TRUST_SUCCESS); trustLine->setAuthorized(mAllowTrust.authorize); trustLine->storeChange(delta, db); return true; }
bool AllowTrustOpFrame::doApply(Application& app, LedgerDelta& delta, LedgerManager& ledgerManager) { if (ledgerManager.getCurrentLedgerVersion() > 2) { if (mAllowTrust.trustor == getSourceID()) { // since version 3 it is not // allowed to use ALLOW_TRUST on // self app.getMetrics() .NewMeter({"op-allow-trust", "failure", "trust-self"}, "operation") .Mark(); innerResult().code(ALLOW_TRUST_SELF_NOT_ALLOWED); return false; } } if (!(mSourceAccount->getAccount().flags & AUTH_REQUIRED_FLAG)) { // this account doesn't require authorization to // hold credit app.getMetrics() .NewMeter({"op-allow-trust", "failure", "not-required"}, "operation") .Mark(); innerResult().code(ALLOW_TRUST_TRUST_NOT_REQUIRED); return false; } if (!(mSourceAccount->getAccount().flags & AUTH_REVOCABLE_FLAG) && !mAllowTrust.authorize) { app.getMetrics() .NewMeter({"op-allow-trust", "failure", "cant-revoke"}, "operation") .Mark(); innerResult().code(ALLOW_TRUST_CANT_REVOKE); return false; } Asset ci; ci.type(mAllowTrust.asset.type()); if (mAllowTrust.asset.type() == ASSET_TYPE_CREDIT_ALPHANUM4) { ci.alphaNum4().assetCode = mAllowTrust.asset.assetCode4(); ci.alphaNum4().issuer = getSourceID(); } else if (mAllowTrust.asset.type() == ASSET_TYPE_CREDIT_ALPHANUM12) { ci.alphaNum12().assetCode = mAllowTrust.asset.assetCode12(); ci.alphaNum12().issuer = getSourceID(); } Database& db = ledgerManager.getDatabase(); TrustFrame::pointer trustLine; trustLine = TrustFrame::loadTrustLine(mAllowTrust.trustor, ci, db, &delta); if (!trustLine) { app.getMetrics() .NewMeter({"op-allow-trust", "failure", "no-trust-line"}, "operation") .Mark(); innerResult().code(ALLOW_TRUST_NO_TRUST_LINE); return false; } app.getMetrics() .NewMeter({"op-allow-trust", "success", "apply"}, "operation") .Mark(); innerResult().code(ALLOW_TRUST_SUCCESS); trustLine->setAuthorized(mAllowTrust.authorize); trustLine->storeChange(delta, db); return true; }