rippled
PayChan.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #include <ripple/app/tx/impl/PayChan.h>
21 #include <ripple/basics/Log.h>
22 #include <ripple/basics/XRPAmount.h>
23 #include <ripple/basics/chrono.h>
24 #include <ripple/ledger/ApplyView.h>
25 #include <ripple/ledger/View.h>
26 #include <ripple/protocol/Feature.h>
27 #include <ripple/protocol/Indexes.h>
28 #include <ripple/protocol/PayChan.h>
29 #include <ripple/protocol/PublicKey.h>
30 #include <ripple/protocol/TxFlags.h>
31 #include <ripple/protocol/digest.h>
32 #include <ripple/protocol/st.h>
33 
34 namespace ripple {
35 
36 /*
37  PaymentChannel
38 
39  Payment channels permit off-ledger checkpoints of XRP payments flowing
40  in a single direction. A channel sequesters the owner's XRP in its own
41  ledger entry. The owner can authorize the recipient to claim up to a
42  given balance by giving the receiver a signed message (off-ledger). The
43  recipient can use this signed message to claim any unpaid balance while
44  the channel remains open. The owner can top off the line as needed. If
45  the channel has not paid out all its funds, the owner must wait out a
46  delay to close the channel to give the recipient a chance to supply any
47  claims. The recipient can close the channel at any time. Any transaction
48  that touches the channel after the expiration time will close the
49  channel. The total amount paid increases monotonically as newer claims
50  are issued. When the channel is closed any remaining balance is returned
51  to the owner. Channels are intended to permit intermittent off-ledger
52  settlement of ILP trust lines as balances get substantial. For
53  bidirectional channels, a payment channel can be used in each direction.
54 
55  PaymentChannelCreate
56 
57  Create a unidirectional channel. The parameters are:
58  Destination
59  The recipient at the end of the channel.
60  Amount
61  The amount of XRP to deposit in the channel immediately.
62  SettleDelay
63  The amount of time everyone but the recipient must wait for a
64  superior claim.
65  PublicKey
66  The key that will sign claims against the channel.
67  CancelAfter (optional)
68  Any channel transaction that touches this channel after the
69  `CancelAfter` time will close it.
70  DestinationTag (optional)
71  Destination tags allow the different accounts inside of a Hosted
72  Wallet to be mapped back onto the Ripple ledger. The destination tag
73  tells the server to which account in the Hosted Wallet the funds are
74  intended to go to. Required if the destination has lsfRequireDestTag
75  set.
76  SourceTag (optional)
77  Source tags allow the different accounts inside of a Hosted Wallet
78  to be mapped back onto the Ripple ledger. Source tags are similar to
79  destination tags but are for the channel owner to identify their own
80  transactions.
81 
82  PaymentChannelFund
83 
84  Add additional funds to the payment channel. Only the channel owner may
85  use this transaction. The parameters are:
86  Channel
87  The 256-bit ID of the channel.
88  Amount
89  The amount of XRP to add.
90  Expiration (optional)
91  Time the channel closes. The transaction will fail if the expiration
92  times does not satisfy the SettleDelay constraints.
93 
94  PaymentChannelClaim
95 
96  Place a claim against an existing channel. The parameters are:
97  Channel
98  The 256-bit ID of the channel.
99  Balance (optional)
100  The total amount of XRP delivered after this claim is processed
101  (optional, not needed if just closing). Amount (optional) The amount of XRP
102  the signature is for (not needed if equal to Balance or just closing the
103  line). Signature (optional) Authorization for the balance above, signed by
104  the owner (optional, not needed if closing or owner is performing the
105  transaction). The signature if for the following message: CLM\0 followed by
106  the 256-bit channel ID, and a 64-bit integer drops. PublicKey (optional) The
107  public key that made the signature (optional, required if a signature is
108  present) Flags tfClose Request that the channel be closed tfRenew Request
109  that the channel's expiration be reset. Only the owner may renew a channel.
110 
111 */
112 
113 //------------------------------------------------------------------------------
114 
115 static TER
117  std::shared_ptr<SLE> const& slep,
118  ApplyView& view,
119  uint256 const& key,
120  beast::Journal j)
121 {
122  AccountID const src = (*slep)[sfAccount];
123  // Remove PayChan from owner directory
124  {
125  auto const page = (*slep)[sfOwnerNode];
126  if (!view.dirRemove(keylet::ownerDir(src), page, key, true))
127  {
128  JLOG(j.fatal())
129  << "Could not remove paychan from src owner directory";
130  return tefBAD_LEDGER;
131  }
132  }
133 
134  // Remove PayChan from recipient's owner directory, if present.
135  if (auto const page = (*slep)[~sfDestinationNode];
136  page && view.rules().enabled(fixPayChanRecipientOwnerDir))
137  {
138  auto const dst = (*slep)[sfDestination];
139  if (!view.dirRemove(keylet::ownerDir(dst), *page, key, true))
140  {
141  JLOG(j.fatal())
142  << "Could not remove paychan from dst owner directory";
143  return tefBAD_LEDGER;
144  }
145  }
146 
147  // Transfer amount back to owner, decrement owner count
148  auto const sle = view.peek(keylet::account(src));
149  if (!sle)
150  return tefINTERNAL;
151 
152  assert((*slep)[sfAmount] >= (*slep)[sfBalance]);
153  (*sle)[sfBalance] =
154  (*sle)[sfBalance] + (*slep)[sfAmount] - (*slep)[sfBalance];
155  adjustOwnerCount(view, sle, -1, j);
156  view.update(sle);
157 
158  // Remove PayChan from ledger
159  view.erase(slep);
160  return tesSUCCESS;
161 }
162 
163 //------------------------------------------------------------------------------
164 
165 TxConsequences
167 {
168  return TxConsequences{ctx.tx, ctx.tx[sfAmount].xrp()};
169 }
170 
171 NotTEC
173 {
174  if (ctx.rules.enabled(fix1543) && ctx.tx.getFlags() & tfUniversalMask)
175  return temINVALID_FLAG;
176 
177  auto const ret = preflight1(ctx);
178  if (!isTesSuccess(ret))
179  return ret;
180 
181  if (!isXRP(ctx.tx[sfAmount]) || (ctx.tx[sfAmount] <= beast::zero))
182  return temBAD_AMOUNT;
183 
184  if (ctx.tx[sfAccount] == ctx.tx[sfDestination])
185  return temDST_IS_SRC;
186 
187  if (!publicKeyType(ctx.tx[sfPublicKey]))
188  return temMALFORMED;
189 
190  return preflight2(ctx);
191 }
192 
193 TER
195 {
196  auto const account = ctx.tx[sfAccount];
197  auto const sle = ctx.view.read(keylet::account(account));
198  if (!sle)
199  return terNO_ACCOUNT;
200 
201  // Check reserve and funds availability
202  {
203  auto const balance = (*sle)[sfBalance];
204  auto const reserve =
205  ctx.view.fees().accountReserve((*sle)[sfOwnerCount] + 1);
206 
207  if (balance < reserve)
209 
210  if (balance < reserve + ctx.tx[sfAmount])
211  return tecUNFUNDED;
212  }
213 
214  auto const dst = ctx.tx[sfDestination];
215 
216  {
217  // Check destination account
218  auto const sled = ctx.view.read(keylet::account(dst));
219  if (!sled)
220  return tecNO_DST;
221  if (((*sled)[sfFlags] & lsfRequireDestTag) &&
222  !ctx.tx[~sfDestinationTag])
223  return tecDST_TAG_NEEDED;
224 
225  // Obeying the lsfDisallowXRP flag was a bug. Piggyback on
226  // featureDepositAuth to remove the bug.
227  if (!ctx.view.rules().enabled(featureDepositAuth) &&
228  ((*sled)[sfFlags] & lsfDisallowXRP))
229  return tecNO_TARGET;
230  }
231 
232  return tesSUCCESS;
233 }
234 
235 TER
237 {
238  auto const account = ctx_.tx[sfAccount];
239  auto const sle = ctx_.view().peek(keylet::account(account));
240  if (!sle)
241  return tefINTERNAL;
242 
243  auto const dst = ctx_.tx[sfDestination];
244 
245  // Create PayChan in ledger.
246  //
247  // Note that we we use the value from the sequence or ticket as the
248  // payChan sequence. For more explanation see comments in SeqProxy.h.
249  auto const slep = std::make_shared<SLE>(
250  keylet::payChan(account, dst, ctx_.tx.getSeqProxy().value()));
251  // Funds held in this channel
252  (*slep)[sfAmount] = ctx_.tx[sfAmount];
253  // Amount channel has already paid
254  (*slep)[sfBalance] = ctx_.tx[sfAmount].zeroed();
255  (*slep)[sfAccount] = account;
256  (*slep)[sfDestination] = dst;
257  (*slep)[sfSettleDelay] = ctx_.tx[sfSettleDelay];
258  (*slep)[sfPublicKey] = ctx_.tx[sfPublicKey];
259  (*slep)[~sfCancelAfter] = ctx_.tx[~sfCancelAfter];
260  (*slep)[~sfSourceTag] = ctx_.tx[~sfSourceTag];
262 
263  ctx_.view().insert(slep);
264 
265  // Add PayChan to owner directory
266  {
267  auto const page = dirAdd(
268  ctx_.view(),
269  keylet::ownerDir(account),
270  slep->key(),
271  false,
272  describeOwnerDir(account),
273  ctx_.app.journal("View"));
274  if (!page)
275  return tecDIR_FULL;
276  (*slep)[sfOwnerNode] = *page;
277  }
278 
279  // Add PayChan to the recipient's owner directory
281  {
282  auto const page = dirAdd(
283  ctx_.view(),
284  keylet::ownerDir(dst),
285  slep->key(),
286  false,
287  describeOwnerDir(dst),
288  ctx_.app.journal("View"));
289  if (!page)
290  return tecDIR_FULL;
291  (*slep)[sfDestinationNode] = *page;
292  }
293 
294  // Deduct owner's balance, increment owner count
295  (*sle)[sfBalance] = (*sle)[sfBalance] - ctx_.tx[sfAmount];
296  adjustOwnerCount(ctx_.view(), sle, 1, ctx_.journal);
297  ctx_.view().update(sle);
298 
299  return tesSUCCESS;
300 }
301 
302 //------------------------------------------------------------------------------
303 
306 {
307  return TxConsequences{ctx.tx, ctx.tx[sfAmount].xrp()};
308 }
309 
310 NotTEC
312 {
313  if (ctx.rules.enabled(fix1543) && ctx.tx.getFlags() & tfUniversalMask)
314  return temINVALID_FLAG;
315 
316  auto const ret = preflight1(ctx);
317  if (!isTesSuccess(ret))
318  return ret;
319 
320  if (!isXRP(ctx.tx[sfAmount]) || (ctx.tx[sfAmount] <= beast::zero))
321  return temBAD_AMOUNT;
322 
323  return preflight2(ctx);
324 }
325 
326 TER
328 {
329  Keylet const k(ltPAYCHAN, ctx_.tx[sfChannel]);
330  auto const slep = ctx_.view().peek(k);
331  if (!slep)
332  return tecNO_ENTRY;
333 
334  AccountID const src = (*slep)[sfAccount];
335  auto const txAccount = ctx_.tx[sfAccount];
336  auto const expiration = (*slep)[~sfExpiration];
337 
338  {
339  auto const cancelAfter = (*slep)[~sfCancelAfter];
340  auto const closeTime =
342  if ((cancelAfter && closeTime >= *cancelAfter) ||
343  (expiration && closeTime >= *expiration))
344  return closeChannel(
345  slep, ctx_.view(), k.key, ctx_.app.journal("View"));
346  }
347 
348  if (src != txAccount)
349  // only the owner can add funds or extend
350  return tecNO_PERMISSION;
351 
352  if (auto extend = ctx_.tx[~sfExpiration])
353  {
354  auto minExpiration =
356  (*slep)[sfSettleDelay];
357  if (expiration && *expiration < minExpiration)
358  minExpiration = *expiration;
359 
360  if (*extend < minExpiration)
361  return temBAD_EXPIRATION;
362  (*slep)[~sfExpiration] = *extend;
363  ctx_.view().update(slep);
364  }
365 
366  auto const sle = ctx_.view().peek(keylet::account(txAccount));
367  if (!sle)
368  return tefINTERNAL;
369 
370  {
371  // Check reserve and funds availability
372  auto const balance = (*sle)[sfBalance];
373  auto const reserve =
375 
376  if (balance < reserve)
378 
379  if (balance < reserve + ctx_.tx[sfAmount])
380  return tecUNFUNDED;
381  }
382 
383  // do not allow adding funds if dst does not exist
384  if (AccountID const dst = (*slep)[sfDestination];
385  !ctx_.view().read(keylet::account(dst)))
386  {
387  return tecNO_DST;
388  }
389 
390  (*slep)[sfAmount] = (*slep)[sfAmount] + ctx_.tx[sfAmount];
391  ctx_.view().update(slep);
392 
393  (*sle)[sfBalance] = (*sle)[sfBalance] - ctx_.tx[sfAmount];
394  ctx_.view().update(sle);
395 
396  return tesSUCCESS;
397 }
398 
399 //------------------------------------------------------------------------------
400 
401 NotTEC
403 {
404  auto const ret = preflight1(ctx);
405  if (!isTesSuccess(ret))
406  return ret;
407 
408  auto const bal = ctx.tx[~sfBalance];
409  if (bal && (!isXRP(*bal) || *bal <= beast::zero))
410  return temBAD_AMOUNT;
411 
412  auto const amt = ctx.tx[~sfAmount];
413  if (amt && (!isXRP(*amt) || *amt <= beast::zero))
414  return temBAD_AMOUNT;
415 
416  if (bal && amt && *bal > *amt)
417  return temBAD_AMOUNT;
418 
419  {
420  auto const flags = ctx.tx.getFlags();
421 
422  if (ctx.rules.enabled(fix1543) && (flags & tfPayChanClaimMask))
423  return temINVALID_FLAG;
424 
425  if ((flags & tfClose) && (flags & tfRenew))
426  return temMALFORMED;
427  }
428 
429  if (auto const sig = ctx.tx[~sfSignature])
430  {
431  if (!(ctx.tx[~sfPublicKey] && bal))
432  return temMALFORMED;
433 
434  // Check the signature
435  // The signature isn't needed if txAccount == src, but if it's
436  // present, check it
437 
438  auto const reqBalance = bal->xrp();
439  auto const authAmt = amt ? amt->xrp() : reqBalance;
440 
441  if (reqBalance > authAmt)
442  return temBAD_AMOUNT;
443 
444  Keylet const k(ltPAYCHAN, ctx.tx[sfChannel]);
445  if (!publicKeyType(ctx.tx[sfPublicKey]))
446  return temMALFORMED;
447 
448  PublicKey const pk(ctx.tx[sfPublicKey]);
449  Serializer msg;
450  serializePayChanAuthorization(msg, k.key, authAmt);
451  if (!verify(pk, msg.slice(), *sig, /*canonical*/ true))
452  return temBAD_SIGNATURE;
453  }
454 
455  return preflight2(ctx);
456 }
457 
458 TER
460 {
461  Keylet const k(ltPAYCHAN, ctx_.tx[sfChannel]);
462  auto const slep = ctx_.view().peek(k);
463  if (!slep)
464  return tecNO_TARGET;
465 
466  AccountID const src = (*slep)[sfAccount];
467  AccountID const dst = (*slep)[sfDestination];
468  AccountID const txAccount = ctx_.tx[sfAccount];
469 
470  auto const curExpiration = (*slep)[~sfExpiration];
471  {
472  auto const cancelAfter = (*slep)[~sfCancelAfter];
473  auto const closeTime =
475  if ((cancelAfter && closeTime >= *cancelAfter) ||
476  (curExpiration && closeTime >= *curExpiration))
477  return closeChannel(
478  slep, ctx_.view(), k.key, ctx_.app.journal("View"));
479  }
480 
481  if (txAccount != src && txAccount != dst)
482  return tecNO_PERMISSION;
483 
484  if (ctx_.tx[~sfBalance])
485  {
486  auto const chanBalance = slep->getFieldAmount(sfBalance).xrp();
487  auto const chanFunds = slep->getFieldAmount(sfAmount).xrp();
488  auto const reqBalance = ctx_.tx[sfBalance].xrp();
489 
490  if (txAccount == dst && !ctx_.tx[~sfSignature])
491  return temBAD_SIGNATURE;
492 
493  if (ctx_.tx[~sfSignature])
494  {
495  PublicKey const pk((*slep)[sfPublicKey]);
496  if (ctx_.tx[sfPublicKey] != pk)
497  return temBAD_SIGNER;
498  }
499 
500  if (reqBalance > chanFunds)
501  return tecUNFUNDED_PAYMENT;
502 
503  if (reqBalance <= chanBalance)
504  // nothing requested
505  return tecUNFUNDED_PAYMENT;
506 
507  auto const sled = ctx_.view().peek(keylet::account(dst));
508  if (!sled)
509  return tecNO_DST;
510 
511  // Obeying the lsfDisallowXRP flag was a bug. Piggyback on
512  // featureDepositAuth to remove the bug.
513  bool const depositAuth{ctx_.view().rules().enabled(featureDepositAuth)};
514  if (!depositAuth &&
515  (txAccount == src && (sled->getFlags() & lsfDisallowXRP)))
516  return tecNO_TARGET;
517 
518  // Check whether the destination account requires deposit authorization.
519  if (depositAuth && (sled->getFlags() & lsfDepositAuth))
520  {
521  // A destination account that requires authorization has two
522  // ways to get a Payment Channel Claim into the account:
523  // 1. If Account == Destination, or
524  // 2. If Account is deposit preauthorized by destination.
525  if (txAccount != dst)
526  {
527  if (!view().exists(keylet::depositPreauth(dst, txAccount)))
528  return tecNO_PERMISSION;
529  }
530  }
531 
532  (*slep)[sfBalance] = ctx_.tx[sfBalance];
533  XRPAmount const reqDelta = reqBalance - chanBalance;
534  assert(reqDelta >= beast::zero);
535  (*sled)[sfBalance] = (*sled)[sfBalance] + reqDelta;
536  ctx_.view().update(sled);
537  ctx_.view().update(slep);
538  }
539 
540  if (ctx_.tx.getFlags() & tfRenew)
541  {
542  if (src != txAccount)
543  return tecNO_PERMISSION;
544  (*slep)[~sfExpiration] = boost::none;
545  ctx_.view().update(slep);
546  }
547 
548  if (ctx_.tx.getFlags() & tfClose)
549  {
550  // Channel will close immediately if dry or the receiver closes
551  if (dst == txAccount || (*slep)[sfBalance] == (*slep)[sfAmount])
552  return closeChannel(
553  slep, ctx_.view(), k.key, ctx_.app.journal("View"));
554 
555  auto const settleExpiration =
557  (*slep)[sfSettleDelay];
558 
559  if (!curExpiration || *curExpiration > settleExpiration)
560  {
561  (*slep)[~sfExpiration] = settleExpiration;
562  ctx_.view().update(slep);
563  }
564  }
565 
566  return tesSUCCESS;
567 }
568 
569 } // namespace ripple
beast::Journal::fatal
Stream fatal() const
Definition: Journal.h:339
ripple::ReadView::info
virtual LedgerInfo const & info() const =0
Returns information about the ledger.
ripple::keylet::ownerDir
Keylet ownerDir(AccountID const &id) noexcept
The root page of an account's directory.
Definition: Indexes.cpp:304
ripple::sfOwnerCount
const SF_UINT32 sfOwnerCount
ripple::preflight2
NotTEC preflight2(PreflightContext const &ctx)
Checks whether the signature appears valid.
Definition: Transactor.cpp:108
ripple::sfSourceTag
const SF_UINT32 sfSourceTag
ripple::PayChanCreate::doApply
TER doApply() override
Definition: PayChan.cpp:236
ripple::Keylet
A pair of SHAMap key and LedgerEntryType.
Definition: Keylet.h:38
ripple::tecNO_TARGET
@ tecNO_TARGET
Definition: TER.h:265
ripple::tefINTERNAL
@ tefINTERNAL
Definition: TER.h:150
std::shared_ptr
STL class.
ripple::PreclaimContext::view
ReadView const & view
Definition: Transactor.h:57
ripple::sfOwnerNode
const SF_UINT64 sfOwnerNode
ripple::publicKeyType
boost::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
Definition: PublicKey.cpp:203
ripple::ApplyView::peek
virtual std::shared_ptr< SLE > peek(Keylet const &k)=0
Prepare to modify the SLE associated with key.
ripple::sfDestination
const SF_ACCOUNT sfDestination
ripple::describeOwnerDir
std::function< void(SLE::ref)> describeOwnerDir(AccountID const &account)
Definition: View.cpp:713
ripple::sfAmount
const SF_AMOUNT sfAmount
ripple::isTesSuccess
bool isTesSuccess(TER x)
Definition: TER.h:580
ripple::closeChannel
static TER closeChannel(std::shared_ptr< SLE > const &slep, ApplyView &view, uint256 const &key, beast::Journal j)
Definition: PayChan.cpp:116
ripple::tfClose
const std::uint32_t tfClose
Definition: TxFlags.h:106
ripple::ApplyView::erase
virtual void erase(std::shared_ptr< SLE > const &sle)=0
Remove a peeked SLE.
ripple::ReadView::fees
virtual Fees const & fees() const =0
Returns the fees for the base ledger.
ripple::PayChanClaim::preflight
static NotTEC preflight(PreflightContext const &ctx)
Definition: PayChan.cpp:402
ripple::PayChanClaim::doApply
TER doApply() override
Definition: PayChan.cpp:459
ripple::featureDepositAuth
const uint256 featureDepositAuth
Definition: Feature.cpp:169
ripple::tecDST_TAG_NEEDED
@ tecDST_TAG_NEEDED
Definition: TER.h:270
ripple::ApplyView::update
virtual void update(std::shared_ptr< SLE > const &sle)=0
Indicate changes to a peeked SLE.
ripple::ApplyContext::journal
const beast::Journal journal
Definition: ApplyContext.h:51
ripple::STTx::getSeqProxy
SeqProxy getSeqProxy() const
Definition: STTx.cpp:164
ripple::PayChanFund::doApply
TER doApply() override
Definition: PayChan.cpp:327
ripple::serializePayChanAuthorization
void serializePayChanAuthorization(Serializer &msg, uint256 const &key, XRPAmount const &amt)
Definition: protocol/PayChan.h:31
ripple::temDST_IS_SRC
@ temDST_IS_SRC
Definition: TER.h:103
ripple::preflight1
NotTEC preflight1(PreflightContext const &ctx)
Performs early sanity checks on the account and fee fields.
Definition: Transactor.cpp:56
ripple::lsfDepositAuth
@ lsfDepositAuth
Definition: LedgerFormats.h:114
ripple::ApplyView
Writeable view to a ledger, for applying a transaction.
Definition: ApplyView.h:140
ripple::ApplyContext::app
Application & app
Definition: ApplyContext.h:47
ripple::sfExpiration
const SF_UINT32 sfExpiration
ripple::ApplyView::dirRemove
bool dirRemove(Keylet const &directory, std::uint64_t page, uint256 const &key, bool keepRoot)
Remove an entry from a directory.
Definition: ApplyView.cpp:189
ripple::verify
bool verify(PublicKey const &publicKey, Slice const &m, Slice const &sig, bool mustBeFullyCanonical)
Verify a signature on a message.
Definition: PublicKey.cpp:268
ripple::Keylet::key
uint256 key
Definition: Keylet.h:41
ripple::base_uint
Integers of any length that is a multiple of 32-bits.
Definition: base_uint.h:73
ripple::temINVALID_FLAG
@ temINVALID_FLAG
Definition: TER.h:106
std::chrono::time_point::time_since_epoch
T time_since_epoch(T... args)
ripple::tefBAD_LEDGER
@ tefBAD_LEDGER
Definition: TER.h:147
ripple::adjustOwnerCount
void adjustOwnerCount(ApplyView &view, std::shared_ptr< SLE > const &sle, std::int32_t amount, beast::Journal j)
Adjust the owner count up or down.
Definition: View.cpp:642
ripple::sfSettleDelay
const SF_UINT32 sfSettleDelay
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
ripple::keylet::account
Keylet account(AccountID const &id) noexcept
AccountID root.
Definition: Indexes.cpp:134
ripple::temBAD_SIGNER
@ temBAD_SIGNER
Definition: TER.h:110
ripple::TERSubset
Definition: TER.h:326
ripple::tecUNFUNDED
@ tecUNFUNDED
Definition: TER.h:256
ripple::TER
TERSubset< CanCvtToTER > TER
Definition: TER.h:551
ripple::tecUNFUNDED_PAYMENT
@ tecUNFUNDED_PAYMENT
Definition: TER.h:246
ripple::Serializer::slice
Slice slice() const noexcept
Definition: Serializer.h:63
ripple::sfDestinationNode
const SF_UINT64 sfDestinationNode
ripple::fixPayChanRecipientOwnerDir
const uint256 fixPayChanRecipientOwnerDir
Definition: Feature.cpp:181
ripple::STObject::getFlags
std::uint32_t getFlags() const
Definition: STObject.cpp:454
ripple::isXRP
bool isXRP(AccountID const &c)
Definition: AccountID.h:89
ripple::temBAD_AMOUNT
@ temBAD_AMOUNT
Definition: TER.h:84
ripple::PayChanFund::preflight
static NotTEC preflight(PreflightContext const &ctx)
Definition: PayChan.cpp:311
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
ripple::temBAD_SIGNATURE
@ temBAD_SIGNATURE
Definition: TER.h:100
ripple::Rules::enabled
bool enabled(uint256 const &id) const
Returns true if a feature is enabled.
Definition: ReadView.cpp:103
ripple::ReadView::read
virtual std::shared_ptr< SLE const > read(Keylet const &k) const =0
Return the state item associated with a key.
ripple::ApplyContext::view
ApplyView & view()
Definition: ApplyContext.h:54
ripple::tfPayChanClaimMask
const std::uint32_t tfPayChanClaimMask
Definition: TxFlags.h:107
ripple::sfChannel
const SF_HASH256 sfChannel
ripple::PreclaimContext::tx
STTx const & tx
Definition: Transactor.h:59
ripple::PayChanCreate::preflight
static NotTEC preflight(PreflightContext const &ctx)
Definition: PayChan.cpp:172
ripple::lsfRequireDestTag
@ lsfRequireDestTag
Definition: LedgerFormats.h:104
ripple::fix1543
const uint256 fix1543
Definition: Feature.cpp:172
ripple::tecDIR_FULL
@ tecDIR_FULL
Definition: TER.h:248
ripple::dirAdd
boost::optional< std::uint64_t > dirAdd(ApplyView &view, Keylet const &dir, uint256 const &uLedgerIndex, bool strictOrder, std::function< void(SLE::ref)> fDescriber, beast::Journal j)
Definition: View.cpp:721
ripple::terNO_ACCOUNT
@ terNO_ACCOUNT
Definition: TER.h:192
ripple::PreclaimContext
State information when determining if a tx is likely to claim a fee.
Definition: Transactor.h:53
ripple::Serializer
Definition: Serializer.h:39
ripple::SeqProxy::value
constexpr std::uint32_t value() const
Definition: SeqProxy.h:82
ripple::ApplyView::insert
virtual void insert(std::shared_ptr< SLE > const &sle)=0
Insert a new state SLE.
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::Application::journal
virtual beast::Journal journal(std::string const &name)=0
ripple::Transactor::view
ApplyView & view()
Definition: Transactor.h:108
ripple::keylet::payChan
Keylet payChan(AccountID const &src, AccountID const &dst, std::uint32_t seq) noexcept
A PaymentChannel.
Definition: Indexes.cpp:325
ripple::Fees::accountReserve
XRPAmount accountReserve(std::size_t ownerCount) const
Returns the account reserve given the owner count, in drops.
Definition: ReadView.h:66
ripple::ReadView::rules
virtual Rules const & rules() const =0
Returns the tx processing rules.
ripple::sfFlags
const SF_UINT32 sfFlags
ripple::sfDestinationTag
const SF_UINT32 sfDestinationTag
ripple::tecNO_PERMISSION
@ tecNO_PERMISSION
Definition: TER.h:266
ripple::sfSignature
const SF_VL sfSignature
ripple::tfRenew
const std::uint32_t tfRenew
Definition: TxFlags.h:105
ripple::sfBalance
const SF_AMOUNT sfBalance
ripple::PayChanCreate::makeTxConsequences
static TxConsequences makeTxConsequences(PreflightContext const &ctx)
Definition: PayChan.cpp:166
ripple::tecINSUFFICIENT_RESERVE
@ tecINSUFFICIENT_RESERVE
Definition: TER.h:268
ripple::sfCancelAfter
const SF_UINT32 sfCancelAfter
ripple::Transactor::ctx_
ApplyContext & ctx_
Definition: Transactor.h:89
ripple::ltPAYCHAN
@ ltPAYCHAN
Definition: LedgerFormats.h:83
ripple::lsfDisallowXRP
@ lsfDisallowXRP
Definition: LedgerFormats.h:108
ripple::sfAccount
const SF_ACCOUNT sfAccount
ripple::tecNO_ENTRY
@ tecNO_ENTRY
Definition: TER.h:267
ripple::temMALFORMED
@ temMALFORMED
Definition: TER.h:82
ripple::tfUniversalMask
const std::uint32_t tfUniversalMask
Definition: TxFlags.h:50
ripple::PreflightContext::tx
STTx const & tx
Definition: Transactor.h:36
ripple::PreflightContext
State information when preflighting a tx.
Definition: Transactor.h:32
ripple::temBAD_EXPIRATION
@ temBAD_EXPIRATION
Definition: TER.h:86
ripple::PreflightContext::rules
const Rules rules
Definition: Transactor.h:37
ripple::keylet::depositPreauth
Keylet depositPreauth(AccountID const &owner, AccountID const &preauthorized) noexcept
A DepositPreauth.
Definition: Indexes.cpp:288
ripple::TxConsequences
Class describing the consequences to the account of applying a transaction if the transaction consume...
Definition: applySteps.h:45
ripple::tesSUCCESS
@ tesSUCCESS
Definition: TER.h:216
ripple::sfPublicKey
const SF_VL sfPublicKey
ripple::ApplyContext::tx
STTx const & tx
Definition: ApplyContext.h:48
ripple::tecNO_DST
@ tecNO_DST
Definition: TER.h:251
ripple::PayChanFund::makeTxConsequences
static TxConsequences makeTxConsequences(PreflightContext const &ctx)
Definition: PayChan.cpp:305
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::PayChanCreate::preclaim
static TER preclaim(PreclaimContext const &ctx)
Definition: PayChan.cpp:194
ripple::LedgerInfo::parentCloseTime
NetClock::time_point parentCloseTime
Definition: ReadView.h:93