BoundingBox BlockDoor::boundingBox() { vec3 offset; if (on) { offset = dirToOffset(dirAdd(attachment, daClockwise)); } else { offset = dirToOffset(attachment); } double x = position().x; double y = position().y; double z = position().z; double xo = offset.x; double yo = offset.y; double zo = offset.z; return qMakePair( vec3( x + (xo ? 0.8 * (xo * 0.5 + 0.5) : 0), y + (yo ? 0.8 * (yo * 0.5 + 0.5) : 0), z + (zo ? 0.8 * (zo * 0.5 + 0.5) : 0) ), vec3( xo ? 0.2 : 1, yo ? 0.2 : 1, zo ? 0.2 : 1 ) ); }
TER SetSignerList::replaceSignerList () { auto const accountKeylet = keylet::account (account_); auto const ownerDirKeylet = keylet::ownerDir (account_); auto const signerListKeylet = keylet::signers (account_); // This may be either a create or a replace. Preemptively remove any // old signer list. May reduce the reserve, so this is done before // checking the reserve. if (TER const ter = removeSignersFromLedger ( accountKeylet, ownerDirKeylet, signerListKeylet)) return ter; auto const sle = view().peek(accountKeylet); // Compute new reserve. Verify the account has funds to meet the reserve. auto const oldOwnerCount = (*sle)[sfOwnerCount]; std::uint32_t const addedOwnerCount = ownerCountDelta (signers_.size ()); auto const newReserve = view().fees().accountReserve(oldOwnerCount + addedOwnerCount); // We check the reserve against the starting balance because we want to // allow dipping into the reserve to pay fees. This behavior is consistent // with CreateTicket. if (mPriorBalance < newReserve) return tecINSUFFICIENT_RESERVE; // Everything's ducky. Add the ltSIGNER_LIST to the ledger. auto signerList = std::make_shared<SLE>(signerListKeylet); view().insert (signerList); writeSignersToSLE (signerList); auto viewJ = ctx_.app.journal ("View"); // Add the signer list to the account's directory. std::uint64_t hint; TER result = dirAdd(ctx_.view (), hint, ownerDirKeylet.key, signerListKeylet.key, describeOwnerDir (account_), viewJ); JLOG(j_.trace) << "Create signer list for account " << toBase58(account_) << ": " << transHuman (result); if (result != tesSUCCESS) return result; signerList->setFieldU64 (sfOwnerNode, hint); // If we succeeded, the new entry counts against the creator's reserve. adjustOwnerCount(view(), sle, addedOwnerCount, viewJ); return result; }
TER CreateTicket::doApply () { auto const sle = view().peek(keylet::account(account_)); // A ticket counts against the reserve of the issuing account, but we // check the starting balance because we want to allow dipping into the // reserve to pay fees. { auto const reserve = view().fees().accountReserve( sle->getFieldU32(sfOwnerCount) + 1); if (mPriorBalance < reserve) return tecINSUFFICIENT_RESERVE; } NetClock::time_point expiration{}; if (ctx_.tx.isFieldPresent (sfExpiration)) { expiration = NetClock::time_point(NetClock::duration(ctx_.tx[sfExpiration])); if (view().parentCloseTime() >= expiration) return tesSUCCESS; } SLE::pointer sleTicket = std::make_shared<SLE>(ltTICKET, getTicketIndex (account_, ctx_.tx.getSequence ())); sleTicket->setAccountID (sfAccount, account_); sleTicket->setFieldU32 (sfSequence, ctx_.tx.getSequence ()); if (expiration != NetClock::time_point{}) sleTicket->setFieldU32 (sfExpiration, expiration.time_since_epoch().count()); view().insert (sleTicket); if (ctx_.tx.isFieldPresent (sfTarget)) { AccountID const target_account (ctx_.tx.getAccountID (sfTarget)); SLE::pointer sleTarget = view().peek (keylet::account(target_account)); // Destination account does not exist. if (!sleTarget) return tecNO_TARGET; // The issuing account is the default account to which the ticket // applies so don't bother saving it if that's what's specified. if (target_account != account_) sleTicket->setAccountID (sfTarget, target_account); } auto viewJ = ctx_.app.journal ("View"); auto const page = dirAdd(view(), keylet::ownerDir (account_), sleTicket->key(), false, describeOwnerDir (account_), viewJ); JLOG(j_.trace()) << "Creating ticket " << to_string (sleTicket->key()) << ": " << (page ? "success" : "failure"); if (!page) return tecDIR_FULL; sleTicket->setFieldU64(sfOwnerNode, *page); // If we succeeded, the new entry counts against the // creator's reserve. adjustOwnerCount(view(), sle, 1, viewJ); return tesSUCCESS; }