diff --git a/VaultCreate_8cpp_source.html b/VaultCreate_8cpp_source.html index 3e4d3be28b..8b95c1828a 100644 --- a/VaultCreate_8cpp_source.html +++ b/VaultCreate_8cpp_source.html @@ -168,170 +168,162 @@ $(document).ready(function() { init_codefold(0); });
80}
81
-
82XRPAmount
+
82TER
-
83VaultCreate::calculateBaseFee(ReadView const& view, STTx const& tx)
+
83VaultCreate::preclaim(PreclaimContext const& ctx)
84{
-
85 // One reserve increment is typically much greater than one base fee.
-
86 return calculateOwnerReserveFee(view, tx);
-
87}
-
-
88
-
89TER
-
-
90VaultCreate::preclaim(PreclaimContext const& ctx)
-
91{
-
92 auto const vaultAsset = ctx.tx[sfAsset];
-
93 auto const account = ctx.tx[sfAccount];
-
94
-
95 if (auto const ter = canAddHolding(ctx.view, vaultAsset))
-
96 return ter;
-
97
-
98 // Check for pseudo-account issuers - we do not want a vault to hold such
-
99 // assets (e.g. MPT shares to other vaults or AMM LPTokens) as they would be
-
100 // impossible to clawback (should the need arise)
-
101 if (!vaultAsset.native())
-
102 {
-
103 if (isPseudoAccount(ctx.view, vaultAsset.getIssuer()))
-
104 return tecWRONG_ASSET;
-
105 }
-
106
-
107 // Cannot create Vault for an Asset frozen for the vault owner
-
108 if (isFrozen(ctx.view, account, vaultAsset))
-
109 return vaultAsset.holds<Issue>() ? tecFROZEN : tecLOCKED;
-
110
-
111 if (auto const domain = ctx.tx[~sfDomainID])
-
112 {
-
113 auto const sleDomain =
-
114 ctx.view.read(keylet::permissionedDomain(*domain));
-
115 if (!sleDomain)
-
116 return tecOBJECT_NOT_FOUND;
-
117 }
-
118
-
119 auto const sequence = ctx.tx.getSeqValue();
-
120 if (auto const accountId = pseudoAccountAddress(
-
121 ctx.view, keylet::vault(account, sequence).key);
-
122 accountId == beast::zero)
-
123 return terADDRESS_COLLISION;
-
124
-
125 return tesSUCCESS;
-
126}
+
85 auto const vaultAsset = ctx.tx[sfAsset];
+
86 auto const account = ctx.tx[sfAccount];
+
87
+
88 if (auto const ter = canAddHolding(ctx.view, vaultAsset))
+
89 return ter;
+
90
+
91 // Check for pseudo-account issuers - we do not want a vault to hold such
+
92 // assets (e.g. MPT shares to other vaults or AMM LPTokens) as they would be
+
93 // impossible to clawback (should the need arise)
+
94 if (!vaultAsset.native())
+
95 {
+
96 if (isPseudoAccount(ctx.view, vaultAsset.getIssuer()))
+
97 return tecWRONG_ASSET;
+
98 }
+
99
+
100 // Cannot create Vault for an Asset frozen for the vault owner
+
101 if (isFrozen(ctx.view, account, vaultAsset))
+
102 return vaultAsset.holds<Issue>() ? tecFROZEN : tecLOCKED;
+
103
+
104 if (auto const domain = ctx.tx[~sfDomainID])
+
105 {
+
106 auto const sleDomain =
+
107 ctx.view.read(keylet::permissionedDomain(*domain));
+
108 if (!sleDomain)
+
109 return tecOBJECT_NOT_FOUND;
+
110 }
+
111
+
112 auto const sequence = ctx.tx.getSeqValue();
+
113 if (auto const accountId = pseudoAccountAddress(
+
114 ctx.view, keylet::vault(account, sequence).key);
+
115 accountId == beast::zero)
+
116 return terADDRESS_COLLISION;
+
117
+
118 return tesSUCCESS;
+
119}
+
120
+
121TER
+
+
122VaultCreate::doApply()
+
123{
+
124 // All return codes in `doApply` must be `tec`, `ter`, or `tes`.
+
125 // As we move checks into `preflight` and `preclaim`,
+
126 // we can consider downgrading them to `tef` or `tem`.
127
-
128TER
-
- -
130{
-
131 // All return codes in `doApply` must be `tec`, `ter`, or `tes`.
-
132 // As we move checks into `preflight` and `preclaim`,
-
133 // we can consider downgrading them to `tef` or `tem`.
-
134
-
135 auto const& tx = ctx_.tx;
-
136 auto const sequence = tx.getSeqValue();
-
137 auto const owner = view().peek(keylet::account(account_));
-
138 if (owner == nullptr)
-
139 return tefINTERNAL; // LCOV_EXCL_LINE
-
140
-
141 auto vault = std::make_shared<SLE>(keylet::vault(account_, sequence));
-
142
-
143 if (auto ter = dirLink(view(), account_, vault))
-
144 return ter;
-
145 adjustOwnerCount(view(), owner, 1, j_);
-
146 auto ownerCount = owner->at(sfOwnerCount);
-
147 if (mPriorBalance < view().fees().accountReserve(ownerCount))
- -
149
-
150 auto maybePseudo = createPseudoAccount(view(), vault->key(), sfVaultID);
-
151 if (!maybePseudo)
-
152 return maybePseudo.error(); // LCOV_EXCL_LINE
-
153 auto& pseudo = *maybePseudo;
-
154 auto pseudoId = pseudo->at(sfAccount);
-
155 auto asset = tx[sfAsset];
-
156
-
157 if (auto ter = addEmptyHolding(view(), pseudoId, mPriorBalance, asset, j_);
-
158 !isTesSuccess(ter))
-
159 return ter;
-
160
-
161 std::uint8_t const scale = (asset.holds<MPTIssue>() || asset.native())
-
162 ? 0
-
163 : ctx_.tx[~sfScale].value_or(vaultDefaultIOUScale);
-
164
-
165 auto txFlags = tx.getFlags();
-
166 std::uint32_t mptFlags = 0;
-
167 if ((txFlags & tfVaultShareNonTransferable) == 0)
- -
169 if (txFlags & tfVaultPrivate)
-
170 mptFlags |= lsfMPTRequireAuth;
-
171
-
172 // Note, here we are **not** creating an MPToken for the assets held in
-
173 // the vault. That MPToken or TrustLine/RippleState is created above, in
-
174 // addEmptyHolding. Here we are creating MPTokenIssuance for the shares
-
175 // in the vault
-
176 auto maybeShare = MPTokenIssuanceCreate::create(
-
177 view(),
-
178 j_,
-
179 {
-
180 .priorBalance = std::nullopt,
-
181 .account = pseudoId->value(),
-
182 .sequence = 1,
-
183 .flags = mptFlags,
-
184 .assetScale = scale,
-
185 .metadata = tx[~sfMPTokenMetadata],
-
186 .domainId = tx[~sfDomainID],
-
187 });
-
188 if (!maybeShare)
-
189 return maybeShare.error(); // LCOV_EXCL_LINE
-
190 auto const& mptIssuanceID = *maybeShare;
-
191
-
192 vault->setFieldIssue(sfAsset, STIssue{sfAsset, asset});
-
193 vault->at(sfFlags) = txFlags & tfVaultPrivate;
-
194 vault->at(sfSequence) = sequence;
-
195 vault->at(sfOwner) = account_;
-
196 vault->at(sfAccount) = pseudoId;
-
197 vault->at(sfAssetsTotal) = Number(0);
-
198 vault->at(sfAssetsAvailable) = Number(0);
-
199 vault->at(sfLossUnrealized) = Number(0);
-
200 // Leave default values for AssetTotal and AssetAvailable, both zero.
-
201 if (auto value = tx[~sfAssetsMaximum])
-
202 vault->at(sfAssetsMaximum) = *value;
-
203 vault->at(sfShareMPTID) = mptIssuanceID;
-
204 if (auto value = tx[~sfData])
-
205 vault->at(sfData) = *value;
-
206 // Required field, default to vaultStrategyFirstComeFirstServe
-
207 if (auto value = tx[~sfWithdrawalPolicy])
-
208 vault->at(sfWithdrawalPolicy) = *value;
-
209 else
-
210 vault->at(sfWithdrawalPolicy) = vaultStrategyFirstComeFirstServe;
-
211 if (scale)
-
212 vault->at(sfScale) = scale;
-
213 view().insert(vault);
+
128 auto const& tx = ctx_.tx;
+
129 auto const sequence = tx.getSeqValue();
+
130 auto const owner = view().peek(keylet::account(account_));
+
131 if (owner == nullptr)
+
132 return tefINTERNAL; // LCOV_EXCL_LINE
+
133
+
134 auto vault = std::make_shared<SLE>(keylet::vault(account_, sequence));
+
135
+
136 if (auto ter = dirLink(view(), account_, vault))
+
137 return ter;
+
138 // We will create Vault and PseudoAccount, hence increase OwnerCount by 2
+
139 adjustOwnerCount(view(), owner, 2, j_);
+
140 auto const ownerCount = owner->at(sfOwnerCount);
+
141 if (mPriorBalance < view().fees().accountReserve(ownerCount))
+ +
143
+
144 auto maybePseudo = createPseudoAccount(view(), vault->key(), sfVaultID);
+
145 if (!maybePseudo)
+
146 return maybePseudo.error(); // LCOV_EXCL_LINE
+
147 auto& pseudo = *maybePseudo;
+
148 auto pseudoId = pseudo->at(sfAccount);
+
149 auto asset = tx[sfAsset];
+
150
+
151 if (auto ter = addEmptyHolding(view(), pseudoId, mPriorBalance, asset, j_);
+
152 !isTesSuccess(ter))
+
153 return ter;
+
154
+
155 std::uint8_t const scale = (asset.holds<MPTIssue>() || asset.native())
+
156 ? 0
+
157 : ctx_.tx[~sfScale].value_or(vaultDefaultIOUScale);
+
158
+
159 auto txFlags = tx.getFlags();
+
160 std::uint32_t mptFlags = 0;
+
161 if ((txFlags & tfVaultShareNonTransferable) == 0)
+ +
163 if (txFlags & tfVaultPrivate)
+
164 mptFlags |= lsfMPTRequireAuth;
+
165
+
166 // Note, here we are **not** creating an MPToken for the assets held in
+
167 // the vault. That MPToken or TrustLine/RippleState is created above, in
+
168 // addEmptyHolding. Here we are creating MPTokenIssuance for the shares
+
169 // in the vault
+
170 auto maybeShare = MPTokenIssuanceCreate::create(
+
171 view(),
+
172 j_,
+
173 {
+
174 .priorBalance = std::nullopt,
+
175 .account = pseudoId->value(),
+
176 .sequence = 1,
+
177 .flags = mptFlags,
+
178 .assetScale = scale,
+
179 .metadata = tx[~sfMPTokenMetadata],
+
180 .domainId = tx[~sfDomainID],
+
181 });
+
182 if (!maybeShare)
+
183 return maybeShare.error(); // LCOV_EXCL_LINE
+
184 auto const& mptIssuanceID = *maybeShare;
+
185
+
186 vault->setFieldIssue(sfAsset, STIssue{sfAsset, asset});
+
187 vault->at(sfFlags) = txFlags & tfVaultPrivate;
+
188 vault->at(sfSequence) = sequence;
+
189 vault->at(sfOwner) = account_;
+
190 vault->at(sfAccount) = pseudoId;
+
191 vault->at(sfAssetsTotal) = Number(0);
+
192 vault->at(sfAssetsAvailable) = Number(0);
+
193 vault->at(sfLossUnrealized) = Number(0);
+
194 // Leave default values for AssetTotal and AssetAvailable, both zero.
+
195 if (auto value = tx[~sfAssetsMaximum])
+
196 vault->at(sfAssetsMaximum) = *value;
+
197 vault->at(sfShareMPTID) = mptIssuanceID;
+
198 if (auto value = tx[~sfData])
+
199 vault->at(sfData) = *value;
+
200 // Required field, default to vaultStrategyFirstComeFirstServe
+
201 if (auto value = tx[~sfWithdrawalPolicy])
+
202 vault->at(sfWithdrawalPolicy) = *value;
+
203 else
+
204 vault->at(sfWithdrawalPolicy) = vaultStrategyFirstComeFirstServe;
+
205 if (scale)
+
206 vault->at(sfScale) = scale;
+
207 view().insert(vault);
+
208
+
209 // Explicitly create MPToken for the vault owner
+
210 if (auto const err = authorizeMPToken(
+
211 view(), mPriorBalance, mptIssuanceID, account_, ctx_.journal);
+
212 !isTesSuccess(err))
+
213 return err;
214
-
215 // Explicitly create MPToken for the vault owner
-
216 if (auto const err = authorizeMPToken(
-
217 view(), mPriorBalance, mptIssuanceID, account_, ctx_.journal);
-
218 !isTesSuccess(err))
-
219 return err;
-
220
-
221 // If the vault is private, set the authorized flag for the vault owner
-
222 if (txFlags & tfVaultPrivate)
-
223 {
-
224 if (auto const err = authorizeMPToken(
-
225 view(),
- -
227 mptIssuanceID,
-
228 pseudoId,
- -
230 {},
-
231 account_);
-
232 !isTesSuccess(err))
-
233 return err;
-
234 }
-
235
-
236 return tesSUCCESS;
-
237}
+
215 // If the vault is private, set the authorized flag for the vault owner
+
216 if (txFlags & tfVaultPrivate)
+
217 {
+
218 if (auto const err = authorizeMPToken(
+
219 view(),
+ +
221 mptIssuanceID,
+
222 pseudoId,
+ +
224 {},
+
225 account_);
+
226 !isTesSuccess(err))
+
227 return err;
+
228 }
+
229
+
230 return tesSUCCESS;
+
231}
-
238
-
239} // namespace ripple
+
232
+
233} // namespace ripple
beast::Journal const journal
STTx const & tx
virtual void insert(std::shared_ptr< SLE > const &sle)=0
Insert a new state SLE.
@@ -341,29 +333,24 @@ $(document).ready(function() { init_codefold(0); });
bool native() const
Definition MPTIssue.h:45
static Expected< MPTID, TER > create(ApplyView &view, beast::Journal journal, MPTCreateArgs const &args)
Definition Number.h:17
-
A view into a ledger.
Definition ReadView.h:32
virtual std::shared_ptr< SLE const > read(Keylet const &k) const =0
Return the state item associated with a key.
bool enabled(uint256 const &feature) const
Returns true if a feature is enabled.
Definition Rules.cpp:111
Definition STIssue.h:13
bool isFieldPresent(SField const &field) const
Definition STObject.cpp:465
std::uint32_t getFlags() const
Definition STObject.cpp:518
-
Definition STTx.h:29
std::uint32_t getSeqValue() const
Returns the first non-zero value of (Sequence, TicketSequence).
Definition STTx.cpp:212
Definition TER.h:396
AccountID const account_
Definition Transactor.h:128
ApplyView & view()
Definition Transactor.h:144
-
static XRPAmount calculateOwnerReserveFee(ReadView const &view, STTx const &tx)
beast::Journal const j_
Definition Transactor.h:126
XRPAmount mPriorBalance
Definition Transactor.h:129
static bool validDataLength(std::optional< Slice > const &slice, std::size_t maxLength)
ApplyContext & ctx_
Definition Transactor.h:124
-
TER doApply() override
-
static TER preclaim(PreclaimContext const &ctx)
+
TER doApply() override
+
static TER preclaim(PreclaimContext const &ctx)
static NotTEC preflight(PreflightContext const &ctx)
static bool checkExtraFeatures(PreflightContext const &ctx)
static std::uint32_t getFlagsMask(PreflightContext const &ctx)
-
static XRPAmount calculateBaseFee(ReadView const &view, STTx const &tx)
-
Definition XRPAmount.h:24
T is_same_v
Keylet permissionedDomain(AccountID const &account, std::uint32_t seq) noexcept
Definition Indexes.cpp:551
diff --git a/VaultCreate_8h_source.html b/VaultCreate_8h_source.html index aa74c3fdbb..76b7141441 100644 --- a/VaultCreate_8h_source.html +++ b/VaultCreate_8h_source.html @@ -109,38 +109,30 @@ $(document).ready(function() { init_codefold(0); });
23 static NotTEC
24 preflight(PreflightContext const& ctx);
25
-
26 static XRPAmount
-
27 calculateBaseFee(ReadView const& view, STTx const& tx);
+
26 static TER
+
27 preclaim(PreclaimContext const& ctx);
28
-
29 static TER
-
30 preclaim(PreclaimContext const& ctx);
-
31
-
32 TER
-
33 doApply() override;
-
34};
+
29 TER
+
30 doApply() override;
+
31};
-
35
-
36} // namespace ripple
-
37
-
38#endif
+
32
+
33} // namespace ripple
+
34
+
35#endif
ripple::ApplyContext
State information when applying a tx.
Definition ApplyContext.h:18
-
ripple::ReadView
A view into a ledger.
Definition ReadView.h:32
-
ripple::STTx
Definition STTx.h:29
ripple::TERSubset
Definition TER.h:396
ripple::Transactor
Definition Transactor.h:122
ripple::Transactor::ConsequencesFactoryType
ConsequencesFactoryType
Definition Transactor.h:138
ripple::Transactor::Normal
@ Normal
Definition Transactor.h:138
-
ripple::Transactor::view
ApplyView & view()
Definition Transactor.h:144
ripple::VaultCreate
Definition VaultCreate.h:9
ripple::VaultCreate::VaultCreate
VaultCreate(ApplyContext &ctx)
Definition VaultCreate.h:13
-
ripple::VaultCreate::doApply
TER doApply() override
Definition VaultCreate.cpp:129
-
ripple::VaultCreate::preclaim
static TER preclaim(PreclaimContext const &ctx)
Definition VaultCreate.cpp:90
+
ripple::VaultCreate::doApply
TER doApply() override
Definition VaultCreate.cpp:122
+
ripple::VaultCreate::preclaim
static TER preclaim(PreclaimContext const &ctx)
Definition VaultCreate.cpp:83
ripple::VaultCreate::preflight
static NotTEC preflight(PreflightContext const &ctx)
Definition VaultCreate.cpp:36
ripple::VaultCreate::checkExtraFeatures
static bool checkExtraFeatures(PreflightContext const &ctx)
Definition VaultCreate.cpp:20
ripple::VaultCreate::getFlagsMask
static std::uint32_t getFlagsMask(PreflightContext const &ctx)
Definition VaultCreate.cpp:30
ripple::VaultCreate::ConsequencesFactory
static constexpr ConsequencesFactoryType ConsequencesFactory
Definition VaultCreate.h:11
-
ripple::VaultCreate::calculateBaseFee
static XRPAmount calculateBaseFee(ReadView const &view, STTx const &tx)
Definition VaultCreate.cpp:83
-
ripple::XRPAmount
Definition XRPAmount.h:24
std::uint32_t
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
ripple::PreclaimContext
State information when determining if a tx is likely to claim a fee.
Definition Transactor.h:61
diff --git a/VaultDelete_8cpp_source.html b/VaultDelete_8cpp_source.html index 84a2d0f460..04af1b93d9 100644 --- a/VaultDelete_8cpp_source.html +++ b/VaultDelete_8cpp_source.html @@ -234,40 +234,70 @@ $(document).ready(function() { init_codefold(0); });
146 return tecHAS_OBLIGATIONS; // LCOV_EXCL_LINE
147
148 // Destroy the pseudo-account.
-
149 view().erase(view().peek(keylet::account(pseudoID)));
-
150
-
151 // Remove the vault from its owner's directory.
-
152 auto const ownerID = vault->at(sfOwner);
-
153 if (!view().dirRemove(
-
154 keylet::ownerDir(ownerID),
-
155 vault->at(sfOwnerNode),
-
156 vault->key(),
-
157 false))
-
158 {
-
159 // LCOV_EXCL_START
-
160 JLOG(j_.error()) << "VaultDelete: failed to delete vault object.";
-
161 return tefBAD_LEDGER;
-
162 // LCOV_EXCL_STOP
-
163 }
-
164
-
165 auto const owner = view().peek(keylet::account(ownerID));
-
166 if (!owner)
-
167 {
-
168 // LCOV_EXCL_START
-
169 JLOG(j_.error()) << "VaultDelete: missing vault owner account.";
-
170 return tefBAD_LEDGER;
-
171 // LCOV_EXCL_STOP
-
172 }
-
173 adjustOwnerCount(view(), owner, -1, j_);
-
174
-
175 // Destroy the vault.
-
176 view().erase(vault);
-
177
-
178 return tesSUCCESS;
-
179}
+
149 auto vaultPseudoSLE = view().peek(keylet::account(pseudoID));
+
150 if (!vaultPseudoSLE || vaultPseudoSLE->at(~sfVaultID) != vault->key())
+
151 return tefBAD_LEDGER; // LCOV_EXCL_LINE
+
152
+
153 // Making the payment and removing the empty holding should have deleted any
+
154 // obligations associated with the vault or vault pseudo-account.
+
155 if (*vaultPseudoSLE->at(sfBalance))
+
156 {
+
157 // LCOV_EXCL_START
+
158 JLOG(j_.error()) << "VaultDelete: pseudo-account has a balance";
+
159 return tecHAS_OBLIGATIONS;
+
160 // LCOV_EXCL_STOP
+
161 }
+
162 if (vaultPseudoSLE->at(sfOwnerCount) != 0)
+
163 {
+
164 // LCOV_EXCL_START
+
165 JLOG(j_.error()) << "VaultDelete: pseudo-account still owns objects";
+
166 return tecHAS_OBLIGATIONS;
+
167 // LCOV_EXCL_STOP
+
168 }
+
169 if (view().exists(keylet::ownerDir(pseudoID)))
+
170 {
+
171 // LCOV_EXCL_START
+
172 JLOG(j_.error()) << "VaultDelete: pseudo-account has a directory";
+
173 return tecHAS_OBLIGATIONS;
+
174 // LCOV_EXCL_STOP
+
175 }
+
176
+
177 view().erase(vaultPseudoSLE);
+
178
+
179 // Remove the vault from its owner's directory.
+
180 auto const ownerID = vault->at(sfOwner);
+
181 if (!view().dirRemove(
+
182 keylet::ownerDir(ownerID),
+
183 vault->at(sfOwnerNode),
+
184 vault->key(),
+
185 false))
+
186 {
+
187 // LCOV_EXCL_START
+
188 JLOG(j_.error()) << "VaultDelete: failed to delete vault object.";
+
189 return tefBAD_LEDGER;
+
190 // LCOV_EXCL_STOP
+
191 }
+
192
+
193 auto const owner = view().peek(keylet::account(ownerID));
+
194 if (!owner)
+
195 {
+
196 // LCOV_EXCL_START
+
197 JLOG(j_.error()) << "VaultDelete: missing vault owner account.";
+
198 return tefBAD_LEDGER;
+
199 // LCOV_EXCL_STOP
+
200 }
+
201
+
202 // We are destroying Vault and PseudoAccount, hence decrease by 2
+
203 adjustOwnerCount(view(), owner, -2, j_);
+
204
+
205 // Destroy the vault.
+
206 view().erase(vault);
+
207
+
208 return tesSUCCESS;
+
209}
-
180
-
181} // namespace ripple
+
210
+
211} // namespace ripple
beast::Journal::error
Stream error() const
Definition Journal.h:327
beast::Journal::debug
Stream debug() const
Definition Journal.h:309
ripple::ApplyContext::tx
STTx const & tx
Definition ApplyContext.h:53
diff --git a/Vault__test_8cpp_source.html b/Vault__test_8cpp_source.html index 9660610ca2..5749146e09 100644 --- a/Vault__test_8cpp_source.html +++ b/Vault__test_8cpp_source.html @@ -1420,7 +1420,7 @@ $(document).ready(function() { init_codefold(0); });
1329 Vault& vault) {
1330 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
1331 testcase("insufficient fee");
-
1332 env(tx, fee(env.current()->fees().base), ter(telINSUF_FEE_P));
+
1332 env(tx, fee(env.current()->fees().base - 1), ter(telINSUF_FEE_P));
1333 });
1334
1335 testCase([this](
@@ -2173,3024 +2173,3030 @@ $(document).ready(function() { init_codefold(0); });
2074 auto const sleMPT = env.le(mptoken);
2075 BEAST_EXPECT(sleMPT == nullptr);
2076
-
2077 // No reserve to create MPToken for asset in VaultWithdraw
-
2078 tx = vault.withdraw(
-
2079 {.depositor = owner,
-
2080 .id = keylet.key,
-
2081 .amount = asset(100)});
-
2082 env(tx, ter{tecINSUFFICIENT_RESERVE});
-
2083 env.close();
-
2084
-
2085 env(pay(depositor, owner, XRP(incReserve)));
-
2086 env.close();
-
2087
-
2088 // Withdraw can now create asset MPToken, tx will succeed
-
2089 env(tx);
+
2077 // Use one reserve so the next transaction fails
+
2078 env(ticket::create(owner, 1));
+
2079 env.close();
+
2080
+
2081 // No reserve to create MPToken for asset in VaultWithdraw
+
2082 tx = vault.withdraw(
+
2083 {.depositor = owner,
+
2084 .id = keylet.key,
+
2085 .amount = asset(100)});
+
2086 env(tx, ter{tecINSUFFICIENT_RESERVE});
+
2087 env.close();
+
2088
+
2089 env(pay(depositor, owner, XRP(incReserve)));
2090 env.close();
-
2091 }
-
2092 },
-
2093 {.requireAuth = false,
-
2094 .initialXRP = acctReserve + incReserve * 4 - 1});
-
2095
-
2096 testCase([this](
-
2097 Env& env,
-
2098 Account const& issuer,
-
2099 Account const& owner,
-
2100 Account const& depositor,
-
2101 PrettyAsset const& asset,
-
2102 Vault& vault,
-
2103 MPTTester& mptt) {
-
2104 testcase("MPT issuance deleted");
-
2105
-
2106 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
-
2107 env(tx);
-
2108 env.close();
+
2091
+
2092 // Withdraw can now create asset MPToken, tx will succeed
+
2093 env(tx);
+
2094 env.close();
+
2095 }
+
2096 },
+
2097 {.requireAuth = false,
+
2098 .initialXRP = acctReserve + incReserve * 4 + 1});
+
2099
+
2100 testCase([this](
+
2101 Env& env,
+
2102 Account const& issuer,
+
2103 Account const& owner,
+
2104 Account const& depositor,
+
2105 PrettyAsset const& asset,
+
2106 Vault& vault,
+
2107 MPTTester& mptt) {
+
2108 testcase("MPT issuance deleted");
2109
-
2110 tx = vault.deposit(
-
2111 {.depositor = depositor,
-
2112 .id = keylet.key,
-
2113 .amount = asset(1000)});
-
2114 env(tx);
-
2115 env.close();
-
2116
-
2117 {
-
2118 auto tx = vault.clawback(
-
2119 {.issuer = issuer,
-
2120 .id = keylet.key,
-
2121 .holder = depositor,
-
2122 .amount = asset(0)});
-
2123 env(tx);
-
2124 }
-
2125
-
2126 mptt.destroy({.issuer = issuer, .id = mptt.issuanceID()});
-
2127 env.close();
-
2128
-
2129 {
-
2130 auto [tx, keylet] =
-
2131 vault.create({.owner = depositor, .asset = asset});
-
2132 env(tx, ter{tecOBJECT_NOT_FOUND});
-
2133 }
-
2134
-
2135 {
-
2136 auto tx = vault.deposit(
-
2137 {.depositor = depositor,
-
2138 .id = keylet.key,
-
2139 .amount = asset(10)});
-
2140 env(tx, ter{tecOBJECT_NOT_FOUND});
-
2141 }
-
2142
-
2143 {
-
2144 auto tx = vault.withdraw(
-
2145 {.depositor = depositor,
-
2146 .id = keylet.key,
-
2147 .amount = asset(10)});
-
2148 env(tx, ter{tecOBJECT_NOT_FOUND});
-
2149 }
-
2150
-
2151 {
-
2152 auto tx = vault.clawback(
-
2153 {.issuer = issuer,
-
2154 .id = keylet.key,
-
2155 .holder = depositor,
-
2156 .amount = asset(0)});
-
2157 env(tx, ter{tecOBJECT_NOT_FOUND});
-
2158 }
-
2159
-
2160 env(vault.del({.owner = owner, .id = keylet.key}));
-
2161 });
-
2162
-
2163 testCase([this](
-
2164 Env& env,
-
2165 Account const& issuer,
-
2166 Account const& owner,
-
2167 Account const& depositor,
-
2168 PrettyAsset const& asset,
-
2169 Vault& vault,
-
2170 MPTTester& mptt) {
-
2171 testcase("MPT vault owner can receive shares unless unauthorized");
-
2172
-
2173 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
-
2174 env(tx);
-
2175 env.close();
+
2110 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
+
2111 env(tx);
+
2112 env.close();
+
2113
+
2114 tx = vault.deposit(
+
2115 {.depositor = depositor,
+
2116 .id = keylet.key,
+
2117 .amount = asset(1000)});
+
2118 env(tx);
+
2119 env.close();
+
2120
+
2121 {
+
2122 auto tx = vault.clawback(
+
2123 {.issuer = issuer,
+
2124 .id = keylet.key,
+
2125 .holder = depositor,
+
2126 .amount = asset(0)});
+
2127 env(tx);
+
2128 }
+
2129
+
2130 mptt.destroy({.issuer = issuer, .id = mptt.issuanceID()});
+
2131 env.close();
+
2132
+
2133 {
+
2134 auto [tx, keylet] =
+
2135 vault.create({.owner = depositor, .asset = asset});
+
2136 env(tx, ter{tecOBJECT_NOT_FOUND});
+
2137 }
+
2138
+
2139 {
+
2140 auto tx = vault.deposit(
+
2141 {.depositor = depositor,
+
2142 .id = keylet.key,
+
2143 .amount = asset(10)});
+
2144 env(tx, ter{tecOBJECT_NOT_FOUND});
+
2145 }
+
2146
+
2147 {
+
2148 auto tx = vault.withdraw(
+
2149 {.depositor = depositor,
+
2150 .id = keylet.key,
+
2151 .amount = asset(10)});
+
2152 env(tx, ter{tecOBJECT_NOT_FOUND});
+
2153 }
+
2154
+
2155 {
+
2156 auto tx = vault.clawback(
+
2157 {.issuer = issuer,
+
2158 .id = keylet.key,
+
2159 .holder = depositor,
+
2160 .amount = asset(0)});
+
2161 env(tx, ter{tecOBJECT_NOT_FOUND});
+
2162 }
+
2163
+
2164 env(vault.del({.owner = owner, .id = keylet.key}));
+
2165 });
+
2166
+
2167 testCase([this](
+
2168 Env& env,
+
2169 Account const& issuer,
+
2170 Account const& owner,
+
2171 Account const& depositor,
+
2172 PrettyAsset const& asset,
+
2173 Vault& vault,
+
2174 MPTTester& mptt) {
+
2175 testcase("MPT vault owner can receive shares unless unauthorized");
2176
-
2177 tx = vault.deposit(
-
2178 {.depositor = depositor,
-
2179 .id = keylet.key,
-
2180 .amount = asset(1000)});
-
2181 env(tx);
-
2182 env.close();
-
2183
-
2184 auto const issuanceId = [&env](ripple::Keylet keylet) -> MPTID {
-
2185 auto const vault = env.le(keylet);
-
2186 return vault->at(sfShareMPTID);
-
2187 }(keylet);
-
2188 PrettyAsset shares = MPTIssue(issuanceId);
-
2189
-
2190 {
-
2191 // owner has MPToken for shares they did not explicitly create
-
2192 env(pay(depositor, owner, shares(1)));
-
2193 env.close();
-
2194
-
2195 tx = vault.withdraw(
-
2196 {.depositor = owner,
-
2197 .id = keylet.key,
-
2198 .amount = shares(1)});
-
2199 env(tx);
-
2200 env.close();
-
2201
-
2202 // owner's MPToken for vault shares not destroyed by withdraw
-
2203 env(pay(depositor, owner, shares(1)));
+
2177 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
+
2178 env(tx);
+
2179 env.close();
+
2180
+
2181 tx = vault.deposit(
+
2182 {.depositor = depositor,
+
2183 .id = keylet.key,
+
2184 .amount = asset(1000)});
+
2185 env(tx);
+
2186 env.close();
+
2187
+
2188 auto const issuanceId = [&env](ripple::Keylet keylet) -> MPTID {
+
2189 auto const vault = env.le(keylet);
+
2190 return vault->at(sfShareMPTID);
+
2191 }(keylet);
+
2192 PrettyAsset shares = MPTIssue(issuanceId);
+
2193
+
2194 {
+
2195 // owner has MPToken for shares they did not explicitly create
+
2196 env(pay(depositor, owner, shares(1)));
+
2197 env.close();
+
2198
+
2199 tx = vault.withdraw(
+
2200 {.depositor = owner,
+
2201 .id = keylet.key,
+
2202 .amount = shares(1)});
+
2203 env(tx);
2204 env.close();
2205
-
2206 tx = vault.clawback(
-
2207 {.issuer = issuer,
-
2208 .id = keylet.key,
-
2209 .holder = owner,
-
2210 .amount = asset(0)});
-
2211 env(tx);
-
2212 env.close();
-
2213
-
2214 // owner's MPToken for vault shares not destroyed by clawback
-
2215 env(pay(depositor, owner, shares(1)));
+
2206 // owner's MPToken for vault shares not destroyed by withdraw
+
2207 env(pay(depositor, owner, shares(1)));
+
2208 env.close();
+
2209
+
2210 tx = vault.clawback(
+
2211 {.issuer = issuer,
+
2212 .id = keylet.key,
+
2213 .holder = owner,
+
2214 .amount = asset(0)});
+
2215 env(tx);
2216 env.close();
2217
-
2218 // pay back, so we can destroy owner's MPToken now
-
2219 env(pay(owner, depositor, shares(1)));
+
2218 // owner's MPToken for vault shares not destroyed by clawback
+
2219 env(pay(depositor, owner, shares(1)));
2220 env.close();
2221
-
2222 {
-
2223 // explicitly destroy vault owners MPToken with zero balance
-
2224 Json::Value jv;
-
2225 jv[sfAccount] = owner.human();
-
2226 jv[sfMPTokenIssuanceID] = to_string(issuanceId);
-
2227 jv[sfFlags] = tfMPTUnauthorize;
-
2228 jv[sfTransactionType] = jss::MPTokenAuthorize;
-
2229 env(jv);
-
2230 env.close();
-
2231 }
-
2232
-
2233 // owner no longer has MPToken for vault shares
-
2234 tx = pay(depositor, owner, shares(1));
-
2235 env(tx, ter{tecNO_AUTH});
-
2236 env.close();
-
2237
-
2238 // destroy all remaining shares, so we can delete vault
-
2239 tx = vault.clawback(
-
2240 {.issuer = issuer,
-
2241 .id = keylet.key,
-
2242 .holder = depositor,
-
2243 .amount = asset(0)});
-
2244 env(tx);
-
2245 env.close();
-
2246
-
2247 // will soft fail destroying MPToken for vault owner
-
2248 env(vault.del({.owner = owner, .id = keylet.key}));
+
2222 // pay back, so we can destroy owner's MPToken now
+
2223 env(pay(owner, depositor, shares(1)));
+
2224 env.close();
+
2225
+
2226 {
+
2227 // explicitly destroy vault owners MPToken with zero balance
+
2228 Json::Value jv;
+
2229 jv[sfAccount] = owner.human();
+
2230 jv[sfMPTokenIssuanceID] = to_string(issuanceId);
+
2231 jv[sfFlags] = tfMPTUnauthorize;
+
2232 jv[sfTransactionType] = jss::MPTokenAuthorize;
+
2233 env(jv);
+
2234 env.close();
+
2235 }
+
2236
+
2237 // owner no longer has MPToken for vault shares
+
2238 tx = pay(depositor, owner, shares(1));
+
2239 env(tx, ter{tecNO_AUTH});
+
2240 env.close();
+
2241
+
2242 // destroy all remaining shares, so we can delete vault
+
2243 tx = vault.clawback(
+
2244 {.issuer = issuer,
+
2245 .id = keylet.key,
+
2246 .holder = depositor,
+
2247 .amount = asset(0)});
+
2248 env(tx);
2249 env.close();
-
2250 }
-
2251 });
-
2252
-
2253 testCase(
-
2254 [this](
-
2255 Env& env,
-
2256 Account const& issuer,
-
2257 Account const& owner,
-
2258 Account const& depositor,
-
2259 PrettyAsset const& asset,
-
2260 Vault& vault,
-
2261 MPTTester& mptt) {
-
2262 testcase("MPT clawback disabled");
-
2263
-
2264 auto [tx, keylet] =
-
2265 vault.create({.owner = owner, .asset = asset});
-
2266 env(tx);
-
2267 env.close();
-
2268
-
2269 tx = vault.deposit(
-
2270 {.depositor = depositor,
-
2271 .id = keylet.key,
-
2272 .amount = asset(1000)});
-
2273 env(tx);
-
2274 env.close();
-
2275
-
2276 {
-
2277 auto tx = vault.clawback(
-
2278 {.issuer = issuer,
-
2279 .id = keylet.key,
-
2280 .holder = depositor,
-
2281 .amount = asset(0)});
-
2282 env(tx, ter{tecNO_PERMISSION});
-
2283 }
-
2284 },
-
2285 {.enableClawback = false});
-
2286
-
2287 testCase([this](
-
2288 Env& env,
-
2289 Account const& issuer,
-
2290 Account const& owner,
-
2291 Account const& depositor,
-
2292 Asset const& asset,
-
2293 Vault& vault,
-
2294 MPTTester& mptt) {
-
2295 testcase("MPT un-authorization");
-
2296 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
-
2297 env(tx);
-
2298 env.close();
-
2299 tx = vault.deposit(
-
2300 {.depositor = depositor,
-
2301 .id = keylet.key,
-
2302 .amount = asset(1000)});
-
2303 env(tx);
-
2304 env.close();
-
2305
-
2306 mptt.authorize(
-
2307 {.account = issuer,
-
2308 .holder = depositor,
-
2309 .flags = tfMPTUnauthorize});
-
2310 env.close();
-
2311
-
2312 {
-
2313 auto tx = vault.withdraw(
-
2314 {.depositor = depositor,
-
2315 .id = keylet.key,
-
2316 .amount = asset(100)});
-
2317 env(tx, ter(tecNO_AUTH));
-
2318
-
2319 // Withdrawal to other (authorized) accounts works
-
2320 tx[sfDestination] = issuer.human();
-
2321 env(tx);
-
2322 env.close();
-
2323
-
2324 tx[sfDestination] = owner.human();
+
2250
+
2251 // will soft fail destroying MPToken for vault owner
+
2252 env(vault.del({.owner = owner, .id = keylet.key}));
+
2253 env.close();
+
2254 }
+
2255 });
+
2256
+
2257 testCase(
+
2258 [this](
+
2259 Env& env,
+
2260 Account const& issuer,
+
2261 Account const& owner,
+
2262 Account const& depositor,
+
2263 PrettyAsset const& asset,
+
2264 Vault& vault,
+
2265 MPTTester& mptt) {
+
2266 testcase("MPT clawback disabled");
+
2267
+
2268 auto [tx, keylet] =
+
2269 vault.create({.owner = owner, .asset = asset});
+
2270 env(tx);
+
2271 env.close();
+
2272
+
2273 tx = vault.deposit(
+
2274 {.depositor = depositor,
+
2275 .id = keylet.key,
+
2276 .amount = asset(1000)});
+
2277 env(tx);
+
2278 env.close();
+
2279
+
2280 {
+
2281 auto tx = vault.clawback(
+
2282 {.issuer = issuer,
+
2283 .id = keylet.key,
+
2284 .holder = depositor,
+
2285 .amount = asset(0)});
+
2286 env(tx, ter{tecNO_PERMISSION});
+
2287 }
+
2288 },
+
2289 {.enableClawback = false});
+
2290
+
2291 testCase([this](
+
2292 Env& env,
+
2293 Account const& issuer,
+
2294 Account const& owner,
+
2295 Account const& depositor,
+
2296 Asset const& asset,
+
2297 Vault& vault,
+
2298 MPTTester& mptt) {
+
2299 testcase("MPT un-authorization");
+
2300 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
+
2301 env(tx);
+
2302 env.close();
+
2303 tx = vault.deposit(
+
2304 {.depositor = depositor,
+
2305 .id = keylet.key,
+
2306 .amount = asset(1000)});
+
2307 env(tx);
+
2308 env.close();
+
2309
+
2310 mptt.authorize(
+
2311 {.account = issuer,
+
2312 .holder = depositor,
+
2313 .flags = tfMPTUnauthorize});
+
2314 env.close();
+
2315
+
2316 {
+
2317 auto tx = vault.withdraw(
+
2318 {.depositor = depositor,
+
2319 .id = keylet.key,
+
2320 .amount = asset(100)});
+
2321 env(tx, ter(tecNO_AUTH));
+
2322
+
2323 // Withdrawal to other (authorized) accounts works
+
2324 tx[sfDestination] = issuer.human();
2325 env(tx);
2326 env.close();
-
2327 }
-
2328
-
2329 {
-
2330 // Cannot deposit some more
-
2331 auto tx = vault.deposit(
-
2332 {.depositor = depositor,
-
2333 .id = keylet.key,
-
2334 .amount = asset(100)});
-
2335 env(tx, ter(tecNO_AUTH));
-
2336 }
-
2337
-
2338 // Clawback works
-
2339 tx = vault.clawback(
-
2340 {.issuer = issuer,
-
2341 .id = keylet.key,
-
2342 .holder = depositor,
-
2343 .amount = asset(800)});
-
2344 env(tx);
-
2345 env.close();
-
2346
-
2347 env(vault.del({.owner = owner, .id = keylet.key}));
-
2348 });
-
2349
-
2350 testCase([this](
-
2351 Env& env,
-
2352 Account const& issuer,
-
2353 Account const& owner,
-
2354 Account const& depositor,
-
2355 Asset const& asset,
-
2356 Vault& vault,
-
2357 MPTTester& mptt) {
-
2358 testcase("MPT lock of vault pseudo-account");
-
2359 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
-
2360 env(tx);
-
2361 env.close();
-
2362
-
2363 auto const vaultAccount =
-
2364 [&env, keylet = keylet, this]() -> AccountID {
-
2365 auto const vault = env.le(keylet);
-
2366 BEAST_EXPECT(vault != nullptr);
-
2367 return vault->at(sfAccount);
-
2368 }();
-
2369
-
2370 tx = vault.deposit(
-
2371 {.depositor = depositor,
-
2372 .id = keylet.key,
-
2373 .amount = asset(100)});
-
2374 env(tx);
-
2375 env.close();
-
2376
-
2377 tx = [&]() {
-
2378 Json::Value jv;
-
2379 jv[jss::Account] = issuer.human();
-
2380 jv[sfMPTokenIssuanceID] =
-
2381 to_string(asset.get<MPTIssue>().getMptID());
-
2382 jv[jss::Holder] = toBase58(vaultAccount);
-
2383 jv[jss::TransactionType] = jss::MPTokenIssuanceSet;
-
2384 jv[jss::Flags] = tfMPTLock;
-
2385 return jv;
-
2386 }();
-
2387 env(tx);
-
2388 env.close();
-
2389
-
2390 tx = vault.deposit(
-
2391 {.depositor = depositor,
-
2392 .id = keylet.key,
-
2393 .amount = asset(100)});
-
2394 env(tx, ter(tecLOCKED));
-
2395
-
2396 tx = vault.withdraw(
-
2397 {.depositor = depositor,
-
2398 .id = keylet.key,
-
2399 .amount = asset(100)});
-
2400 env(tx, ter(tecLOCKED));
-
2401
-
2402 // Clawback works, even when locked
-
2403 tx = vault.clawback(
-
2404 {.issuer = issuer,
-
2405 .id = keylet.key,
-
2406 .holder = depositor,
-
2407 .amount = asset(100)});
-
2408 env(tx);
-
2409
-
2410 // Can delete an empty vault even when asset is locked.
-
2411 tx = vault.del({.owner = owner, .id = keylet.key});
+
2327
+
2328 tx[sfDestination] = owner.human();
+
2329 env(tx);
+
2330 env.close();
+
2331 }
+
2332
+
2333 {
+
2334 // Cannot deposit some more
+
2335 auto tx = vault.deposit(
+
2336 {.depositor = depositor,
+
2337 .id = keylet.key,
+
2338 .amount = asset(100)});
+
2339 env(tx, ter(tecNO_AUTH));
+
2340 }
+
2341
+
2342 // Clawback works
+
2343 tx = vault.clawback(
+
2344 {.issuer = issuer,
+
2345 .id = keylet.key,
+
2346 .holder = depositor,
+
2347 .amount = asset(800)});
+
2348 env(tx);
+
2349 env.close();
+
2350
+
2351 env(vault.del({.owner = owner, .id = keylet.key}));
+
2352 });
+
2353
+
2354 testCase([this](
+
2355 Env& env,
+
2356 Account const& issuer,
+
2357 Account const& owner,
+
2358 Account const& depositor,
+
2359 Asset const& asset,
+
2360 Vault& vault,
+
2361 MPTTester& mptt) {
+
2362 testcase("MPT lock of vault pseudo-account");
+
2363 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
+
2364 env(tx);
+
2365 env.close();
+
2366
+
2367 auto const vaultAccount =
+
2368 [&env, keylet = keylet, this]() -> AccountID {
+
2369 auto const vault = env.le(keylet);
+
2370 BEAST_EXPECT(vault != nullptr);
+
2371 return vault->at(sfAccount);
+
2372 }();
+
2373
+
2374 tx = vault.deposit(
+
2375 {.depositor = depositor,
+
2376 .id = keylet.key,
+
2377 .amount = asset(100)});
+
2378 env(tx);
+
2379 env.close();
+
2380
+
2381 tx = [&]() {
+
2382 Json::Value jv;
+
2383 jv[jss::Account] = issuer.human();
+
2384 jv[sfMPTokenIssuanceID] =
+
2385 to_string(asset.get<MPTIssue>().getMptID());
+
2386 jv[jss::Holder] = toBase58(vaultAccount);
+
2387 jv[jss::TransactionType] = jss::MPTokenIssuanceSet;
+
2388 jv[jss::Flags] = tfMPTLock;
+
2389 return jv;
+
2390 }();
+
2391 env(tx);
+
2392 env.close();
+
2393
+
2394 tx = vault.deposit(
+
2395 {.depositor = depositor,
+
2396 .id = keylet.key,
+
2397 .amount = asset(100)});
+
2398 env(tx, ter(tecLOCKED));
+
2399
+
2400 tx = vault.withdraw(
+
2401 {.depositor = depositor,
+
2402 .id = keylet.key,
+
2403 .amount = asset(100)});
+
2404 env(tx, ter(tecLOCKED));
+
2405
+
2406 // Clawback works, even when locked
+
2407 tx = vault.clawback(
+
2408 {.issuer = issuer,
+
2409 .id = keylet.key,
+
2410 .holder = depositor,
+
2411 .amount = asset(100)});
2412 env(tx);
-
2413 });
-
2414
-
2415 {
-
2416 testcase("MPT shares to a vault");
-
2417
-
2418 Env env{*this, testable_amendments() | featureSingleAssetVault};
-
2419 Account owner{"owner"};
-
2420 Account issuer{"issuer"};
-
2421 env.fund(XRP(1000000), owner, issuer);
-
2422 env.close();
-
2423 Vault vault{env};
-
2424
-
2425 MPTTester mptt{env, issuer, mptInitNoFund};
-
2426 mptt.create(
-
2427 {.flags = tfMPTCanTransfer | tfMPTCanLock | lsfMPTCanClawback |
-
2428 tfMPTRequireAuth});
-
2429 mptt.authorize({.account = owner});
-
2430 mptt.authorize({.account = issuer, .holder = owner});
-
2431 PrettyAsset asset = mptt.issuanceID();
-
2432 env(pay(issuer, owner, asset(100)));
-
2433 auto [tx1, k1] = vault.create({.owner = owner, .asset = asset});
-
2434 env(tx1);
-
2435 env.close();
-
2436
-
2437 auto const shares = [&env, keylet = k1, this]() -> Asset {
-
2438 auto const vault = env.le(keylet);
-
2439 BEAST_EXPECT(vault != nullptr);
-
2440 return MPTIssue(vault->at(sfShareMPTID));
-
2441 }();
-
2442
-
2443 auto [tx2, k2] = vault.create({.owner = owner, .asset = shares});
-
2444 env(tx2, ter{tecWRONG_ASSET});
-
2445 env.close();
-
2446 }
-
2447 }
+
2413
+
2414 // Can delete an empty vault even when asset is locked.
+
2415 tx = vault.del({.owner = owner, .id = keylet.key});
+
2416 env(tx);
+
2417 });
+
2418
+
2419 {
+
2420 testcase("MPT shares to a vault");
+
2421
+
2422 Env env{*this, testable_amendments() | featureSingleAssetVault};
+
2423 Account owner{"owner"};
+
2424 Account issuer{"issuer"};
+
2425 env.fund(XRP(1000000), owner, issuer);
+
2426 env.close();
+
2427 Vault vault{env};
+
2428
+
2429 MPTTester mptt{env, issuer, mptInitNoFund};
+
2430 mptt.create(
+
2431 {.flags = tfMPTCanTransfer | tfMPTCanLock | lsfMPTCanClawback |
+
2432 tfMPTRequireAuth});
+
2433 mptt.authorize({.account = owner});
+
2434 mptt.authorize({.account = issuer, .holder = owner});
+
2435 PrettyAsset asset = mptt.issuanceID();
+
2436 env(pay(issuer, owner, asset(100)));
+
2437 auto [tx1, k1] = vault.create({.owner = owner, .asset = asset});
+
2438 env(tx1);
+
2439 env.close();
+
2440
+
2441 auto const shares = [&env, keylet = k1, this]() -> Asset {
+
2442 auto const vault = env.le(keylet);
+
2443 BEAST_EXPECT(vault != nullptr);
+
2444 return MPTIssue(vault->at(sfShareMPTID));
+
2445 }();
+
2446
+
2447 auto [tx2, k2] = vault.create({.owner = owner, .asset = shares});
+
2448 env(tx2, ter{tecWRONG_ASSET});
+
2449 env.close();
+
2450 }
+
2451 }
-
2448
-
2449 void
-
-
2450 testWithIOU()
-
2451 {
-
2452 using namespace test::jtx;
-
2453
-
2454 struct CaseArgs
-
2455 {
-
2456 int initialXRP = 1000;
-
2457 Number initialIOU = 200;
-
2458 double transferRate = 1.0;
-
2459 };
-
2460
-
2461 auto testCase =
-
2462 [&, this](
-
2463 std::function<void(
-
2464 Env & env,
-
2465 Account const& owner,
-
2466 Account const& issuer,
-
2467 Account const& charlie,
-
2468 std::function<Account(ripple::Keylet)> vaultAccount,
-
2469 Vault& vault,
-
2470 PrettyAsset const& asset,
-
2471 std::function<MPTID(ripple::Keylet)> issuanceId)> test,
-
2472 CaseArgs args = {}) {
-
2473 Env env{*this, testable_amendments() | featureSingleAssetVault};
-
2474 Account const owner{"owner"};
-
2475 Account const issuer{"issuer"};
-
2476 Account const charlie{"charlie"};
-
2477 Vault vault{env};
-
2478 env.fund(XRP(args.initialXRP), issuer, owner, charlie);
-
2479 env(fset(issuer, asfAllowTrustLineClawback));
-
2480 env.close();
-
2481
-
2482 PrettyAsset const asset = issuer["IOU"];
-
2483 env.trust(asset(1000), owner);
-
2484 env.trust(asset(1000), charlie);
-
2485 env(pay(issuer, owner, asset(args.initialIOU)));
-
2486 env(rate(issuer, args.transferRate));
-
2487 env.close();
-
2488
-
2489 auto const vaultAccount =
-
2490 [&env](ripple::Keylet keylet) -> Account {
-
2491 return Account("vault", env.le(keylet)->at(sfAccount));
-
2492 };
-
2493 auto const issuanceId = [&env](ripple::Keylet keylet) -> MPTID {
-
2494 return env.le(keylet)->at(sfShareMPTID);
-
2495 };
-
2496
-
2497 test(
-
2498 env,
-
2499 owner,
-
2500 issuer,
-
2501 charlie,
-
2502 vaultAccount,
-
2503 vault,
-
2504 asset,
-
2505 issuanceId);
-
2506 };
-
2507
-
2508 testCase([&, this](
-
2509 Env& env,
-
2510 Account const& owner,
-
2511 Account const& issuer,
-
2512 Account const&,
-
2513 auto vaultAccount,
-
2514 Vault& vault,
-
2515 PrettyAsset const& asset,
-
2516 auto&&...) {
-
2517 testcase("IOU cannot use different asset");
-
2518 PrettyAsset const foo = issuer["FOO"];
-
2519
-
2520 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
-
2521 env(tx);
-
2522 env.close();
+
2452
+
2453 void
+
+ +
2455 {
+
2456 using namespace test::jtx;
+
2457
+
2458 struct CaseArgs
+
2459 {
+
2460 int initialXRP = 1000;
+
2461 Number initialIOU = 200;
+
2462 double transferRate = 1.0;
+
2463 };
+
2464
+
2465 auto testCase =
+
2466 [&, this](
+
2467 std::function<void(
+
2468 Env & env,
+
2469 Account const& owner,
+
2470 Account const& issuer,
+
2471 Account const& charlie,
+
2472 std::function<Account(ripple::Keylet)> vaultAccount,
+
2473 Vault& vault,
+
2474 PrettyAsset const& asset,
+
2475 std::function<MPTID(ripple::Keylet)> issuanceId)> test,
+
2476 CaseArgs args = {}) {
+
2477 Env env{*this, testable_amendments() | featureSingleAssetVault};
+
2478 Account const owner{"owner"};
+
2479 Account const issuer{"issuer"};
+
2480 Account const charlie{"charlie"};
+
2481 Vault vault{env};
+
2482 env.fund(XRP(args.initialXRP), issuer, owner, charlie);
+
2483 env(fset(issuer, asfAllowTrustLineClawback));
+
2484 env.close();
+
2485
+
2486 PrettyAsset const asset = issuer["IOU"];
+
2487 env.trust(asset(1000), owner);
+
2488 env.trust(asset(1000), charlie);
+
2489 env(pay(issuer, owner, asset(args.initialIOU)));
+
2490 env(rate(issuer, args.transferRate));
+
2491 env.close();
+
2492
+
2493 auto const vaultAccount =
+
2494 [&env](ripple::Keylet keylet) -> Account {
+
2495 return Account("vault", env.le(keylet)->at(sfAccount));
+
2496 };
+
2497 auto const issuanceId = [&env](ripple::Keylet keylet) -> MPTID {
+
2498 return env.le(keylet)->at(sfShareMPTID);
+
2499 };
+
2500
+
2501 test(
+
2502 env,
+
2503 owner,
+
2504 issuer,
+
2505 charlie,
+
2506 vaultAccount,
+
2507 vault,
+
2508 asset,
+
2509 issuanceId);
+
2510 };
+
2511
+
2512 testCase([&, this](
+
2513 Env& env,
+
2514 Account const& owner,
+
2515 Account const& issuer,
+
2516 Account const&,
+
2517 auto vaultAccount,
+
2518 Vault& vault,
+
2519 PrettyAsset const& asset,
+
2520 auto&&...) {
+
2521 testcase("IOU cannot use different asset");
+
2522 PrettyAsset const foo = issuer["FOO"];
2523
-
2524 {
-
2525 // Cannot create new trustline to a vault
-
2526 auto tx = [&, account = vaultAccount(keylet)]() {
-
2527 Json::Value jv;
-
2528 jv[jss::Account] = issuer.human();
-
2529 {
-
2530 auto& ja = jv[jss::LimitAmount] =
-
2531 foo(0).value().getJson(JsonOptions::none);
-
2532 ja[jss::issuer] = toBase58(account);
-
2533 }
-
2534 jv[jss::TransactionType] = jss::TrustSet;
-
2535 jv[jss::Flags] = tfSetFreeze;
-
2536 return jv;
-
2537 }();
-
2538 env(tx, ter{tecNO_PERMISSION});
-
2539 env.close();
-
2540 }
-
2541
-
2542 {
-
2543 auto tx = vault.deposit(
-
2544 {.depositor = issuer, .id = keylet.key, .amount = foo(20)});
-
2545 env(tx, ter{tecWRONG_ASSET});
-
2546 env.close();
-
2547 }
-
2548
-
2549 {
-
2550 auto tx = vault.withdraw(
-
2551 {.depositor = issuer, .id = keylet.key, .amount = foo(20)});
-
2552 env(tx, ter{tecWRONG_ASSET});
-
2553 env.close();
-
2554 }
-
2555
-
2556 env(vault.del({.owner = owner, .id = keylet.key}));
-
2557 env.close();
-
2558 });
+
2524 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
+
2525 env(tx);
+
2526 env.close();
+
2527
+
2528 {
+
2529 // Cannot create new trustline to a vault
+
2530 auto tx = [&, account = vaultAccount(keylet)]() {
+
2531 Json::Value jv;
+
2532 jv[jss::Account] = issuer.human();
+
2533 {
+
2534 auto& ja = jv[jss::LimitAmount] =
+
2535 foo(0).value().getJson(JsonOptions::none);
+
2536 ja[jss::issuer] = toBase58(account);
+
2537 }
+
2538 jv[jss::TransactionType] = jss::TrustSet;
+
2539 jv[jss::Flags] = tfSetFreeze;
+
2540 return jv;
+
2541 }();
+
2542 env(tx, ter{tecNO_PERMISSION});
+
2543 env.close();
+
2544 }
+
2545
+
2546 {
+
2547 auto tx = vault.deposit(
+
2548 {.depositor = issuer, .id = keylet.key, .amount = foo(20)});
+
2549 env(tx, ter{tecWRONG_ASSET});
+
2550 env.close();
+
2551 }
+
2552
+
2553 {
+
2554 auto tx = vault.withdraw(
+
2555 {.depositor = issuer, .id = keylet.key, .amount = foo(20)});
+
2556 env(tx, ter{tecWRONG_ASSET});
+
2557 env.close();
+
2558 }
2559
-
2560 testCase([&, this](
-
2561 Env& env,
-
2562 Account const& owner,
-
2563 Account const& issuer,
-
2564 Account const& charlie,
-
2565 auto vaultAccount,
-
2566 Vault& vault,
-
2567 PrettyAsset const& asset,
-
2568 auto issuanceId) {
-
2569 testcase("IOU frozen trust line to vault account");
-
2570
-
2571 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
-
2572 env(tx);
-
2573 env.close();
+
2560 env(vault.del({.owner = owner, .id = keylet.key}));
+
2561 env.close();
+
2562 });
+
2563
+
2564 testCase([&, this](
+
2565 Env& env,
+
2566 Account const& owner,
+
2567 Account const& issuer,
+
2568 Account const& charlie,
+
2569 auto vaultAccount,
+
2570 Vault& vault,
+
2571 PrettyAsset const& asset,
+
2572 auto issuanceId) {
+
2573 testcase("IOU frozen trust line to vault account");
2574
-
2575 env(vault.deposit(
-
2576 {.depositor = owner, .id = keylet.key, .amount = asset(100)}));
+
2575 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
+
2576 env(tx);
2577 env.close();
2578
-
2579 Asset const share = Asset(issuanceId(keylet));
-
2580
-
2581 // Freeze the trustline to the vault
-
2582 auto trustSet = [&, account = vaultAccount(keylet)]() {
-
2583 Json::Value jv;
-
2584 jv[jss::Account] = issuer.human();
-
2585 {
-
2586 auto& ja = jv[jss::LimitAmount] =
-
2587 asset(0).value().getJson(JsonOptions::none);
-
2588 ja[jss::issuer] = toBase58(account);
-
2589 }
-
2590 jv[jss::TransactionType] = jss::TrustSet;
-
2591 jv[jss::Flags] = tfSetFreeze;
-
2592 return jv;
-
2593 }();
-
2594 env(trustSet);
-
2595 env.close();
-
2596
-
2597 {
-
2598 // Note, the "frozen" state of the trust line to vault account
-
2599 // is reported as "locked" state of the vault shares, because
-
2600 // this state is attached to shares by means of the transitive
-
2601 // isFrozen.
-
2602 auto tx = vault.deposit(
-
2603 {.depositor = owner,
-
2604 .id = keylet.key,
-
2605 .amount = asset(80)});
-
2606 env(tx, ter{tecLOCKED});
-
2607 }
-
2608
-
2609 {
-
2610 auto tx = vault.withdraw(
-
2611 {.depositor = owner,
-
2612 .id = keylet.key,
-
2613 .amount = asset(100)});
-
2614 env(tx, ter{tecLOCKED});
-
2615
-
2616 // also when trying to withdraw to a 3rd party
-
2617 tx[sfDestination] = charlie.human();
+
2579 env(vault.deposit(
+
2580 {.depositor = owner, .id = keylet.key, .amount = asset(100)}));
+
2581 env.close();
+
2582
+
2583 Asset const share = Asset(issuanceId(keylet));
+
2584
+
2585 // Freeze the trustline to the vault
+
2586 auto trustSet = [&, account = vaultAccount(keylet)]() {
+
2587 Json::Value jv;
+
2588 jv[jss::Account] = issuer.human();
+
2589 {
+
2590 auto& ja = jv[jss::LimitAmount] =
+
2591 asset(0).value().getJson(JsonOptions::none);
+
2592 ja[jss::issuer] = toBase58(account);
+
2593 }
+
2594 jv[jss::TransactionType] = jss::TrustSet;
+
2595 jv[jss::Flags] = tfSetFreeze;
+
2596 return jv;
+
2597 }();
+
2598 env(trustSet);
+
2599 env.close();
+
2600
+
2601 {
+
2602 // Note, the "frozen" state of the trust line to vault account
+
2603 // is reported as "locked" state of the vault shares, because
+
2604 // this state is attached to shares by means of the transitive
+
2605 // isFrozen.
+
2606 auto tx = vault.deposit(
+
2607 {.depositor = owner,
+
2608 .id = keylet.key,
+
2609 .amount = asset(80)});
+
2610 env(tx, ter{tecLOCKED});
+
2611 }
+
2612
+
2613 {
+
2614 auto tx = vault.withdraw(
+
2615 {.depositor = owner,
+
2616 .id = keylet.key,
+
2617 .amount = asset(100)});
2618 env(tx, ter{tecLOCKED});
-
2619 env.close();
-
2620 }
-
2621
-
2622 {
-
2623 // Clawback works, even when locked
-
2624 auto tx = vault.clawback(
-
2625 {.issuer = issuer,
-
2626 .id = keylet.key,
-
2627 .holder = owner,
-
2628 .amount = asset(50)});
-
2629 env(tx);
-
2630 env.close();
-
2631 }
-
2632
-
2633 // Clear the frozen state
-
2634 trustSet[jss::Flags] = tfClearFreeze;
-
2635 env(trustSet);
-
2636 env.close();
-
2637
-
2638 env(vault.withdraw(
-
2639 {.depositor = owner,
-
2640 .id = keylet.key,
-
2641 .amount = share(50'000'000)}));
-
2642
-
2643 env(vault.del({.owner = owner, .id = keylet.key}));
-
2644 env.close();
-
2645 });
+
2619
+
2620 // also when trying to withdraw to a 3rd party
+
2621 tx[sfDestination] = charlie.human();
+
2622 env(tx, ter{tecLOCKED});
+
2623 env.close();
+
2624 }
+
2625
+
2626 {
+
2627 // Clawback works, even when locked
+
2628 auto tx = vault.clawback(
+
2629 {.issuer = issuer,
+
2630 .id = keylet.key,
+
2631 .holder = owner,
+
2632 .amount = asset(50)});
+
2633 env(tx);
+
2634 env.close();
+
2635 }
+
2636
+
2637 // Clear the frozen state
+
2638 trustSet[jss::Flags] = tfClearFreeze;
+
2639 env(trustSet);
+
2640 env.close();
+
2641
+
2642 env(vault.withdraw(
+
2643 {.depositor = owner,
+
2644 .id = keylet.key,
+
2645 .amount = share(50'000'000)}));
2646
-
2647 testCase(
-
2648 [&, this](
-
2649 Env& env,
-
2650 Account const& owner,
-
2651 Account const& issuer,
-
2652 Account const& charlie,
-
2653 auto vaultAccount,
-
2654 Vault& vault,
-
2655 PrettyAsset const& asset,
-
2656 auto issuanceId) {
-
2657 testcase("IOU transfer fees not applied");
-
2658
-
2659 auto [tx, keylet] =
-
2660 vault.create({.owner = owner, .asset = asset});
-
2661 env(tx);
-
2662 env.close();
-
2663
-
2664 env(vault.deposit(
-
2665 {.depositor = owner,
-
2666 .id = keylet.key,
-
2667 .amount = asset(100)}));
-
2668 env.close();
-
2669
-
2670 auto const issue = asset.raw().get<Issue>();
-
2671 Asset const share = Asset(issuanceId(keylet));
-
2672
-
2673 // transfer fees ignored on deposit
-
2674 BEAST_EXPECT(env.balance(owner, issue) == asset(100));
-
2675 BEAST_EXPECT(
-
2676 env.balance(vaultAccount(keylet), issue) == asset(100));
-
2677
-
2678 {
-
2679 auto tx = vault.clawback(
-
2680 {.issuer = issuer,
-
2681 .id = keylet.key,
-
2682 .holder = owner,
-
2683 .amount = asset(50)});
-
2684 env(tx);
-
2685 env.close();
-
2686 }
-
2687
-
2688 // transfer fees ignored on clawback
-
2689 BEAST_EXPECT(env.balance(owner, issue) == asset(100));
-
2690 BEAST_EXPECT(
-
2691 env.balance(vaultAccount(keylet), issue) == asset(50));
-
2692
-
2693 env(vault.withdraw(
-
2694 {.depositor = owner,
-
2695 .id = keylet.key,
-
2696 .amount = share(20'000'000)}));
-
2697
-
2698 // transfer fees ignored on withdraw
-
2699 BEAST_EXPECT(env.balance(owner, issue) == asset(120));
-
2700 BEAST_EXPECT(
-
2701 env.balance(vaultAccount(keylet), issue) == asset(30));
-
2702
-
2703 {
-
2704 auto tx = vault.withdraw(
-
2705 {.depositor = owner,
-
2706 .id = keylet.key,
-
2707 .amount = share(30'000'000)});
-
2708 tx[sfDestination] = charlie.human();
-
2709 env(tx);
-
2710 }
-
2711
-
2712 // transfer fees ignored on withdraw to 3rd party
-
2713 BEAST_EXPECT(env.balance(owner, issue) == asset(120));
-
2714 BEAST_EXPECT(env.balance(charlie, issue) == asset(30));
-
2715 BEAST_EXPECT(
-
2716 env.balance(vaultAccount(keylet), issue) == asset(0));
-
2717
-
2718 env(vault.del({.owner = owner, .id = keylet.key}));
-
2719 env.close();
-
2720 },
-
2721 CaseArgs{.transferRate = 1.25});
-
2722
-
2723 testCase([&, this](
-
2724 Env& env,
-
2725 Account const& owner,
-
2726 Account const& issuer,
-
2727 Account const& charlie,
-
2728 auto,
-
2729 Vault& vault,
-
2730 PrettyAsset const& asset,
-
2731 auto&&...) {
-
2732 testcase("IOU frozen trust line to depositor");
-
2733
-
2734 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
-
2735 env(tx);
-
2736 env.close();
+
2647 env(vault.del({.owner = owner, .id = keylet.key}));
+
2648 env.close();
+
2649 });
+
2650
+
2651 testCase(
+
2652 [&, this](
+
2653 Env& env,
+
2654 Account const& owner,
+
2655 Account const& issuer,
+
2656 Account const& charlie,
+
2657 auto vaultAccount,
+
2658 Vault& vault,
+
2659 PrettyAsset const& asset,
+
2660 auto issuanceId) {
+
2661 testcase("IOU transfer fees not applied");
+
2662
+
2663 auto [tx, keylet] =
+
2664 vault.create({.owner = owner, .asset = asset});
+
2665 env(tx);
+
2666 env.close();
+
2667
+
2668 env(vault.deposit(
+
2669 {.depositor = owner,
+
2670 .id = keylet.key,
+
2671 .amount = asset(100)}));
+
2672 env.close();
+
2673
+
2674 auto const issue = asset.raw().get<Issue>();
+
2675 Asset const share = Asset(issuanceId(keylet));
+
2676
+
2677 // transfer fees ignored on deposit
+
2678 BEAST_EXPECT(env.balance(owner, issue) == asset(100));
+
2679 BEAST_EXPECT(
+
2680 env.balance(vaultAccount(keylet), issue) == asset(100));
+
2681
+
2682 {
+
2683 auto tx = vault.clawback(
+
2684 {.issuer = issuer,
+
2685 .id = keylet.key,
+
2686 .holder = owner,
+
2687 .amount = asset(50)});
+
2688 env(tx);
+
2689 env.close();
+
2690 }
+
2691
+
2692 // transfer fees ignored on clawback
+
2693 BEAST_EXPECT(env.balance(owner, issue) == asset(100));
+
2694 BEAST_EXPECT(
+
2695 env.balance(vaultAccount(keylet), issue) == asset(50));
+
2696
+
2697 env(vault.withdraw(
+
2698 {.depositor = owner,
+
2699 .id = keylet.key,
+
2700 .amount = share(20'000'000)}));
+
2701
+
2702 // transfer fees ignored on withdraw
+
2703 BEAST_EXPECT(env.balance(owner, issue) == asset(120));
+
2704 BEAST_EXPECT(
+
2705 env.balance(vaultAccount(keylet), issue) == asset(30));
+
2706
+
2707 {
+
2708 auto tx = vault.withdraw(
+
2709 {.depositor = owner,
+
2710 .id = keylet.key,
+
2711 .amount = share(30'000'000)});
+
2712 tx[sfDestination] = charlie.human();
+
2713 env(tx);
+
2714 }
+
2715
+
2716 // transfer fees ignored on withdraw to 3rd party
+
2717 BEAST_EXPECT(env.balance(owner, issue) == asset(120));
+
2718 BEAST_EXPECT(env.balance(charlie, issue) == asset(30));
+
2719 BEAST_EXPECT(
+
2720 env.balance(vaultAccount(keylet), issue) == asset(0));
+
2721
+
2722 env(vault.del({.owner = owner, .id = keylet.key}));
+
2723 env.close();
+
2724 },
+
2725 CaseArgs{.transferRate = 1.25});
+
2726
+
2727 testCase([&, this](
+
2728 Env& env,
+
2729 Account const& owner,
+
2730 Account const& issuer,
+
2731 Account const& charlie,
+
2732 auto,
+
2733 Vault& vault,
+
2734 PrettyAsset const& asset,
+
2735 auto&&...) {
+
2736 testcase("IOU frozen trust line to depositor");
2737
-
2738 env(vault.deposit(
-
2739 {.depositor = owner, .id = keylet.key, .amount = asset(100)}));
+
2738 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
+
2739 env(tx);
2740 env.close();
2741
-
2742 // Withdraw to 3rd party works
-
2743 auto const withdrawToCharlie = [&](ripple::Keylet keylet) {
-
2744 auto tx = vault.withdraw(
-
2745 {.depositor = owner,
-
2746 .id = keylet.key,
-
2747 .amount = asset(10)});
-
2748 tx[sfDestination] = charlie.human();
-
2749 return tx;
-
2750 }(keylet);
-
2751 env(withdrawToCharlie);
-
2752
-
2753 // Freeze the owner
-
2754 env(trust(issuer, asset(0), owner, tfSetFreeze));
-
2755 env.close();
+
2742 env(vault.deposit(
+
2743 {.depositor = owner, .id = keylet.key, .amount = asset(100)}));
+
2744 env.close();
+
2745
+
2746 // Withdraw to 3rd party works
+
2747 auto const withdrawToCharlie = [&](ripple::Keylet keylet) {
+
2748 auto tx = vault.withdraw(
+
2749 {.depositor = owner,
+
2750 .id = keylet.key,
+
2751 .amount = asset(10)});
+
2752 tx[sfDestination] = charlie.human();
+
2753 return tx;
+
2754 }(keylet);
+
2755 env(withdrawToCharlie);
2756
-
2757 // Cannot withdraw
-
2758 auto const withdraw = vault.withdraw(
-
2759 {.depositor = owner, .id = keylet.key, .amount = asset(10)});
-
2760 env(withdraw, ter{tecFROZEN});
-
2761
-
2762 // Cannot withdraw to 3rd party
-
2763 env(withdrawToCharlie, ter{tecLOCKED});
-
2764 env.close();
+
2757 // Freeze the owner
+
2758 env(trust(issuer, asset(0), owner, tfSetFreeze));
+
2759 env.close();
+
2760
+
2761 // Cannot withdraw
+
2762 auto const withdraw = vault.withdraw(
+
2763 {.depositor = owner, .id = keylet.key, .amount = asset(10)});
+
2764 env(withdraw, ter{tecFROZEN});
2765
-
2766 {
-
2767 // Cannot deposit some more
-
2768 auto tx = vault.deposit(
-
2769 {.depositor = owner,
-
2770 .id = keylet.key,
-
2771 .amount = asset(10)});
-
2772 env(tx, ter{tecFROZEN});
-
2773 }
-
2774
-
2775 {
-
2776 // Clawback still works
-
2777 auto tx = vault.clawback(
-
2778 {.issuer = issuer,
-
2779 .id = keylet.key,
-
2780 .holder = owner,
-
2781 .amount = asset(0)});
-
2782 env(tx);
-
2783 env.close();
-
2784 }
-
2785
-
2786 env(vault.del({.owner = owner, .id = keylet.key}));
-
2787 env.close();
-
2788 });
+
2766 // Cannot withdraw to 3rd party
+
2767 env(withdrawToCharlie, ter{tecLOCKED});
+
2768 env.close();
+
2769
+
2770 {
+
2771 // Cannot deposit some more
+
2772 auto tx = vault.deposit(
+
2773 {.depositor = owner,
+
2774 .id = keylet.key,
+
2775 .amount = asset(10)});
+
2776 env(tx, ter{tecFROZEN});
+
2777 }
+
2778
+
2779 {
+
2780 // Clawback still works
+
2781 auto tx = vault.clawback(
+
2782 {.issuer = issuer,
+
2783 .id = keylet.key,
+
2784 .holder = owner,
+
2785 .amount = asset(0)});
+
2786 env(tx);
+
2787 env.close();
+
2788 }
2789
-
2790 testCase([&, this](
-
2791 Env& env,
-
2792 Account const& owner,
-
2793 Account const& issuer,
-
2794 Account const& charlie,
-
2795 auto,
-
2796 Vault& vault,
-
2797 PrettyAsset const& asset,
-
2798 auto&&...) {
-
2799 testcase("IOU no trust line to 3rd party");
-
2800
-
2801 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
-
2802 env(tx);
-
2803 env.close();
+
2790 env(vault.del({.owner = owner, .id = keylet.key}));
+
2791 env.close();
+
2792 });
+
2793
+
2794 testCase([&, this](
+
2795 Env& env,
+
2796 Account const& owner,
+
2797 Account const& issuer,
+
2798 Account const& charlie,
+
2799 auto,
+
2800 Vault& vault,
+
2801 PrettyAsset const& asset,
+
2802 auto&&...) {
+
2803 testcase("IOU no trust line to 3rd party");
2804
-
2805 env(vault.deposit(
-
2806 {.depositor = owner, .id = keylet.key, .amount = asset(100)}));
+
2805 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
+
2806 env(tx);
2807 env.close();
2808
-
2809 Account const erin{"erin"};
-
2810 env.fund(XRP(1000), erin);
+
2809 env(vault.deposit(
+
2810 {.depositor = owner, .id = keylet.key, .amount = asset(100)}));
2811 env.close();
2812
-
2813 // Withdraw to 3rd party without trust line
-
2814 auto const tx1 = [&](ripple::Keylet keylet) {
-
2815 auto tx = vault.withdraw(
-
2816 {.depositor = owner,
-
2817 .id = keylet.key,
-
2818 .amount = asset(10)});
-
2819 tx[sfDestination] = erin.human();
-
2820 return tx;
-
2821 }(keylet);
-
2822 env(tx1, ter{tecNO_LINE});
-
2823 });
-
2824
-
2825 testCase([&, this](
-
2826 Env& env,
-
2827 Account const& owner,
-
2828 Account const& issuer,
-
2829 Account const& charlie,
-
2830 auto,
-
2831 Vault& vault,
-
2832 PrettyAsset const& asset,
-
2833 auto&&...) {
-
2834 testcase("IOU no trust line to depositor");
-
2835
-
2836 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
-
2837 env(tx);
-
2838 env.close();
+
2813 Account const erin{"erin"};
+
2814 env.fund(XRP(1000), erin);
+
2815 env.close();
+
2816
+
2817 // Withdraw to 3rd party without trust line
+
2818 auto const tx1 = [&](ripple::Keylet keylet) {
+
2819 auto tx = vault.withdraw(
+
2820 {.depositor = owner,
+
2821 .id = keylet.key,
+
2822 .amount = asset(10)});
+
2823 tx[sfDestination] = erin.human();
+
2824 return tx;
+
2825 }(keylet);
+
2826 env(tx1, ter{tecNO_LINE});
+
2827 });
+
2828
+
2829 testCase([&, this](
+
2830 Env& env,
+
2831 Account const& owner,
+
2832 Account const& issuer,
+
2833 Account const& charlie,
+
2834 auto,
+
2835 Vault& vault,
+
2836 PrettyAsset const& asset,
+
2837 auto&&...) {
+
2838 testcase("IOU no trust line to depositor");
2839
-
2840 // reset limit, so deposit of all funds will delete the trust line
-
2841 env.trust(asset(0), owner);
+
2840 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
+
2841 env(tx);
2842 env.close();
2843
-
2844 env(vault.deposit(
-
2845 {.depositor = owner, .id = keylet.key, .amount = asset(200)}));
+
2844 // reset limit, so deposit of all funds will delete the trust line
+
2845 env.trust(asset(0), owner);
2846 env.close();
2847
-
2848 auto trustline =
-
2849 env.le(keylet::line(owner, asset.raw().get<Issue>()));
-
2850 BEAST_EXPECT(trustline == nullptr);
+
2848 env(vault.deposit(
+
2849 {.depositor = owner, .id = keylet.key, .amount = asset(200)}));
+
2850 env.close();
2851
-
2852 // Withdraw without trust line, will succeed
-
2853 auto const tx1 = [&](ripple::Keylet keylet) {
-
2854 auto tx = vault.withdraw(
-
2855 {.depositor = owner,
-
2856 .id = keylet.key,
-
2857 .amount = asset(10)});
-
2858 return tx;
-
2859 }(keylet);
-
2860 env(tx1);
-
2861 });
-
2862
-
2863 testCase(
-
2864 [&, this](
-
2865 Env& env,
-
2866 Account const& owner,
-
2867 Account const& issuer,
-
2868 Account const& charlie,
-
2869 auto const& vaultAccount,
-
2870 Vault& vault,
-
2871 PrettyAsset const& asset,
-
2872 auto&&...) {
-
2873 testcase("IOU calculation rounding");
-
2874
-
2875 auto [tx, keylet] =
-
2876 vault.create({.owner = owner, .asset = asset});
-
2877 tx[sfScale] = 1;
-
2878 env(tx);
-
2879 env.close();
-
2880
-
2881 auto const startingOwnerBalance = env.balance(owner, asset);
-
2882 BEAST_EXPECT(
-
2883 (startingOwnerBalance.value() ==
-
2884 STAmount{asset, 11875, -2}));
-
2885
-
2886 // This operation (first deposit 100, then 3.75 x 5) is known to
-
2887 // have triggered calculation rounding errors in Number
-
2888 // (addition and division), causing the last deposit to be
-
2889 // blocked by Vault invariants.
-
2890 env(vault.deposit(
-
2891 {.depositor = owner,
-
2892 .id = keylet.key,
-
2893 .amount = asset(100)}));
-
2894
-
2895 auto const tx1 = vault.deposit(
-
2896 {.depositor = owner,
-
2897 .id = keylet.key,
-
2898 .amount = asset(Number(375, -2))});
-
2899 for (auto i = 0; i < 5; ++i)
-
2900 {
-
2901 env(tx1);
-
2902 }
-
2903 env.close();
-
2904
-
2905 {
-
2906 STAmount const xfer{asset, 1185, -1};
-
2907 BEAST_EXPECT(
-
2908 env.balance(owner, asset) ==
-
2909 startingOwnerBalance.value() - xfer);
-
2910 BEAST_EXPECT(
-
2911 env.balance(vaultAccount(keylet), asset) == xfer);
-
2912
-
2913 auto const vault = env.le(keylet);
-
2914 BEAST_EXPECT(vault->at(sfAssetsAvailable) == xfer);
-
2915 BEAST_EXPECT(vault->at(sfAssetsTotal) == xfer);
-
2916 }
-
2917
-
2918 // Total vault balance should be 118.5 IOU. Withdraw and delete
-
2919 // the vault to verify this exact amount was deposited and the
-
2920 // owner has matching shares
-
2921 env(vault.withdraw(
-
2922 {.depositor = owner,
-
2923 .id = keylet.key,
-
2924 .amount = asset(Number(1000 + 37 * 5, -1))}));
-
2925
-
2926 {
-
2927 BEAST_EXPECT(
-
2928 env.balance(owner, asset) ==
-
2929 startingOwnerBalance.value());
-
2930 BEAST_EXPECT(
-
2931 env.balance(vaultAccount(keylet), asset) ==
-
2932 beast::zero);
-
2933 auto const vault = env.le(keylet);
-
2934 BEAST_EXPECT(vault->at(sfAssetsAvailable) == beast::zero);
-
2935 BEAST_EXPECT(vault->at(sfAssetsTotal) == beast::zero);
-
2936 }
-
2937
-
2938 env(vault.del({.owner = owner, .id = keylet.key}));
-
2939 env.close();
-
2940 },
-
2941 {.initialIOU = Number(11875, -2)});
-
2942
-
2943 auto const [acctReserve, incReserve] = [this]() -> std::pair<int, int> {
-
2944 Env env{*this, testable_amendments()};
-
2945 return {
-
2946 env.current()->fees().accountReserve(0).drops() /
- -
2948 env.current()->fees().increment.drops() /
- -
2950 }();
-
2951
-
2952 testCase(
-
2953 [&, this](
-
2954 Env& env,
-
2955 Account const& owner,
-
2956 Account const& issuer,
-
2957 Account const& charlie,
-
2958 auto,
-
2959 Vault& vault,
-
2960 PrettyAsset const& asset,
-
2961 auto&&...) {
-
2962 testcase("IOU no trust line to depositor no reserve");
-
2963 auto [tx, keylet] =
-
2964 vault.create({.owner = owner, .asset = asset});
-
2965 env(tx);
-
2966 env.close();
-
2967
-
2968 // reset limit, so deposit of all funds will delete the trust
-
2969 // line
-
2970 env.trust(asset(0), owner);
-
2971 env.close();
-
2972
-
2973 env(vault.deposit(
-
2974 {.depositor = owner,
-
2975 .id = keylet.key,
-
2976 .amount = asset(200)}));
-
2977 env.close();
-
2978
-
2979 auto trustline =
-
2980 env.le(keylet::line(owner, asset.raw().get<Issue>()));
-
2981 BEAST_EXPECT(trustline == nullptr);
+
2852 auto trustline =
+
2853 env.le(keylet::line(owner, asset.raw().get<Issue>()));
+
2854 BEAST_EXPECT(trustline == nullptr);
+
2855
+
2856 // Withdraw without trust line, will succeed
+
2857 auto const tx1 = [&](ripple::Keylet keylet) {
+
2858 auto tx = vault.withdraw(
+
2859 {.depositor = owner,
+
2860 .id = keylet.key,
+
2861 .amount = asset(10)});
+
2862 return tx;
+
2863 }(keylet);
+
2864 env(tx1);
+
2865 });
+
2866
+
2867 testCase(
+
2868 [&, this](
+
2869 Env& env,
+
2870 Account const& owner,
+
2871 Account const& issuer,
+
2872 Account const& charlie,
+
2873 auto const& vaultAccount,
+
2874 Vault& vault,
+
2875 PrettyAsset const& asset,
+
2876 auto&&...) {
+
2877 testcase("IOU calculation rounding");
+
2878
+
2879 auto [tx, keylet] =
+
2880 vault.create({.owner = owner, .asset = asset});
+
2881 tx[sfScale] = 1;
+
2882 env(tx);
+
2883 env.close();
+
2884
+
2885 auto const startingOwnerBalance = env.balance(owner, asset);
+
2886 BEAST_EXPECT(
+
2887 (startingOwnerBalance.value() ==
+
2888 STAmount{asset, 11875, -2}));
+
2889
+
2890 // This operation (first deposit 100, then 3.75 x 5) is known to
+
2891 // have triggered calculation rounding errors in Number
+
2892 // (addition and division), causing the last deposit to be
+
2893 // blocked by Vault invariants.
+
2894 env(vault.deposit(
+
2895 {.depositor = owner,
+
2896 .id = keylet.key,
+
2897 .amount = asset(100)}));
+
2898
+
2899 auto const tx1 = vault.deposit(
+
2900 {.depositor = owner,
+
2901 .id = keylet.key,
+
2902 .amount = asset(Number(375, -2))});
+
2903 for (auto i = 0; i < 5; ++i)
+
2904 {
+
2905 env(tx1);
+
2906 }
+
2907 env.close();
+
2908
+
2909 {
+
2910 STAmount const xfer{asset, 1185, -1};
+
2911 BEAST_EXPECT(
+
2912 env.balance(owner, asset) ==
+
2913 startingOwnerBalance.value() - xfer);
+
2914 BEAST_EXPECT(
+
2915 env.balance(vaultAccount(keylet), asset) == xfer);
+
2916
+
2917 auto const vault = env.le(keylet);
+
2918 BEAST_EXPECT(vault->at(sfAssetsAvailable) == xfer);
+
2919 BEAST_EXPECT(vault->at(sfAssetsTotal) == xfer);
+
2920 }
+
2921
+
2922 // Total vault balance should be 118.5 IOU. Withdraw and delete
+
2923 // the vault to verify this exact amount was deposited and the
+
2924 // owner has matching shares
+
2925 env(vault.withdraw(
+
2926 {.depositor = owner,
+
2927 .id = keylet.key,
+
2928 .amount = asset(Number(1000 + 37 * 5, -1))}));
+
2929
+
2930 {
+
2931 BEAST_EXPECT(
+
2932 env.balance(owner, asset) ==
+
2933 startingOwnerBalance.value());
+
2934 BEAST_EXPECT(
+
2935 env.balance(vaultAccount(keylet), asset) ==
+
2936 beast::zero);
+
2937 auto const vault = env.le(keylet);
+
2938 BEAST_EXPECT(vault->at(sfAssetsAvailable) == beast::zero);
+
2939 BEAST_EXPECT(vault->at(sfAssetsTotal) == beast::zero);
+
2940 }
+
2941
+
2942 env(vault.del({.owner = owner, .id = keylet.key}));
+
2943 env.close();
+
2944 },
+
2945 {.initialIOU = Number(11875, -2)});
+
2946
+
2947 auto const [acctReserve, incReserve] = [this]() -> std::pair<int, int> {
+
2948 Env env{*this, testable_amendments()};
+
2949 return {
+
2950 env.current()->fees().accountReserve(0).drops() /
+ +
2952 env.current()->fees().increment.drops() /
+ +
2954 }();
+
2955
+
2956 testCase(
+
2957 [&, this](
+
2958 Env& env,
+
2959 Account const& owner,
+
2960 Account const& issuer,
+
2961 Account const& charlie,
+
2962 auto,
+
2963 Vault& vault,
+
2964 PrettyAsset const& asset,
+
2965 auto&&...) {
+
2966 testcase("IOU no trust line to depositor no reserve");
+
2967 auto [tx, keylet] =
+
2968 vault.create({.owner = owner, .asset = asset});
+
2969 env(tx);
+
2970 env.close();
+
2971
+
2972 // reset limit, so deposit of all funds will delete the trust
+
2973 // line
+
2974 env.trust(asset(0), owner);
+
2975 env.close();
+
2976
+
2977 env(vault.deposit(
+
2978 {.depositor = owner,
+
2979 .id = keylet.key,
+
2980 .amount = asset(200)}));
+
2981 env.close();
2982
-
2983 // Fail because not enough reserve to create trust line
-
2984 tx = vault.withdraw(
-
2985 {.depositor = owner,
-
2986 .id = keylet.key,
-
2987 .amount = asset(10)});
-
2988 env(tx, ter{tecNO_LINE_INSUF_RESERVE});
-
2989 env.close();
-
2990
-
2991 env(pay(charlie, owner, XRP(incReserve)));
-
2992 env.close();
-
2993
-
2994 // Withdraw can now create trust line, will succeed
-
2995 env(tx);
+
2983 auto trustline =
+
2984 env.le(keylet::line(owner, asset.raw().get<Issue>()));
+
2985 BEAST_EXPECT(trustline == nullptr);
+
2986
+
2987 env(ticket::create(owner, 1));
+
2988 env.close();
+
2989
+
2990 // Fail because not enough reserve to create trust line
+
2991 tx = vault.withdraw(
+
2992 {.depositor = owner,
+
2993 .id = keylet.key,
+
2994 .amount = asset(10)});
+
2995 env(tx, ter{tecNO_LINE_INSUF_RESERVE});
2996 env.close();
-
2997 },
-
2998 CaseArgs{.initialXRP = acctReserve + incReserve * 4 - 1});
-
2999
-
3000 testCase(
-
3001 [&, this](
-
3002 Env& env,
-
3003 Account const& owner,
-
3004 Account const& issuer,
-
3005 Account const& charlie,
-
3006 auto,
-
3007 Vault& vault,
-
3008 PrettyAsset const& asset,
-
3009 auto&&...) {
-
3010 testcase("IOU no reserve for share MPToken");
-
3011 auto [tx, keylet] =
-
3012 vault.create({.owner = owner, .asset = asset});
-
3013 env(tx);
-
3014 env.close();
-
3015
-
3016 env(pay(owner, charlie, asset(100)));
-
3017 env.close();
-
3018
-
3019 // Use up some reserve on tickets
-
3020 env(ticket::create(charlie, 2));
+
2997
+
2998 env(pay(charlie, owner, XRP(incReserve)));
+
2999 env.close();
+
3000
+
3001 // Withdraw can now create trust line, will succeed
+
3002 env(tx);
+
3003 env.close();
+
3004 },
+
3005 CaseArgs{.initialXRP = acctReserve + incReserve * 4 + 1});
+
3006
+
3007 testCase(
+
3008 [&, this](
+
3009 Env& env,
+
3010 Account const& owner,
+
3011 Account const& issuer,
+
3012 Account const& charlie,
+
3013 auto,
+
3014 Vault& vault,
+
3015 PrettyAsset const& asset,
+
3016 auto&&...) {
+
3017 testcase("IOU no reserve for share MPToken");
+
3018 auto [tx, keylet] =
+
3019 vault.create({.owner = owner, .asset = asset});
+
3020 env(tx);
3021 env.close();
3022
-
3023 // Fail because not enough reserve to create MPToken for shares
-
3024 tx = vault.deposit(
-
3025 {.depositor = charlie,
-
3026 .id = keylet.key,
-
3027 .amount = asset(100)});
-
3028 env(tx, ter{tecINSUFFICIENT_RESERVE});
-
3029 env.close();
-
3030
-
3031 env(pay(issuer, charlie, XRP(incReserve)));
-
3032 env.close();
-
3033
-
3034 // Deposit can now create MPToken, will succeed
-
3035 env(tx);
-
3036 env.close();
-
3037 },
-
3038 CaseArgs{.initialXRP = acctReserve + incReserve * 4 - 1});
+
3023 env(pay(owner, charlie, asset(100)));
+
3024 env.close();
+
3025
+
3026 env(ticket::create(charlie, 3));
+
3027 env.close();
+
3028
+
3029 // Fail because not enough reserve to create MPToken for shares
+
3030 tx = vault.deposit(
+
3031 {.depositor = charlie,
+
3032 .id = keylet.key,
+
3033 .amount = asset(100)});
+
3034 env(tx, ter{tecINSUFFICIENT_RESERVE});
+
3035 env.close();
+
3036
+
3037 env(pay(issuer, charlie, XRP(incReserve)));
+
3038 env.close();
3039
-
3040 testCase([&, this](
-
3041 Env& env,
-
3042 Account const& owner,
-
3043 Account const& issuer,
-
3044 Account const& charlie,
-
3045 auto,
-
3046 Vault& vault,
-
3047 PrettyAsset const& asset,
-
3048 auto&&...) {
-
3049 testcase("IOU frozen trust line to 3rd party");
-
3050
-
3051 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
-
3052 env(tx);
-
3053 env.close();
-
3054
-
3055 env(vault.deposit(
-
3056 {.depositor = owner, .id = keylet.key, .amount = asset(100)}));
-
3057 env.close();
-
3058
-
3059 // Withdraw to 3rd party works
-
3060 auto const withdrawToCharlie = [&](ripple::Keylet keylet) {
-
3061 auto tx = vault.withdraw(
-
3062 {.depositor = owner,
-
3063 .id = keylet.key,
-
3064 .amount = asset(10)});
-
3065 tx[sfDestination] = charlie.human();
-
3066 return tx;
-
3067 }(keylet);
-
3068 env(withdrawToCharlie);
-
3069
-
3070 // Freeze the 3rd party
-
3071 env(trust(issuer, asset(0), charlie, tfSetFreeze));
-
3072 env.close();
-
3073
-
3074 // Can withdraw
-
3075 auto const withdraw = vault.withdraw(
-
3076 {.depositor = owner, .id = keylet.key, .amount = asset(10)});
-
3077 env(withdraw);
+
3040 // Deposit can now create MPToken, will succeed
+
3041 env(tx);
+
3042 env.close();
+
3043 },
+
3044 CaseArgs{.initialXRP = acctReserve + incReserve * 4 + 1});
+
3045
+
3046 testCase([&, this](
+
3047 Env& env,
+
3048 Account const& owner,
+
3049 Account const& issuer,
+
3050 Account const& charlie,
+
3051 auto,
+
3052 Vault& vault,
+
3053 PrettyAsset const& asset,
+
3054 auto&&...) {
+
3055 testcase("IOU frozen trust line to 3rd party");
+
3056
+
3057 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
+
3058 env(tx);
+
3059 env.close();
+
3060
+
3061 env(vault.deposit(
+
3062 {.depositor = owner, .id = keylet.key, .amount = asset(100)}));
+
3063 env.close();
+
3064
+
3065 // Withdraw to 3rd party works
+
3066 auto const withdrawToCharlie = [&](ripple::Keylet keylet) {
+
3067 auto tx = vault.withdraw(
+
3068 {.depositor = owner,
+
3069 .id = keylet.key,
+
3070 .amount = asset(10)});
+
3071 tx[sfDestination] = charlie.human();
+
3072 return tx;
+
3073 }(keylet);
+
3074 env(withdrawToCharlie);
+
3075
+
3076 // Freeze the 3rd party
+
3077 env(trust(issuer, asset(0), charlie, tfSetFreeze));
3078 env.close();
3079
-
3080 // Cannot withdraw to 3rd party
-
3081 env(withdrawToCharlie, ter{tecFROZEN});
-
3082 env.close();
-
3083
-
3084 env(vault.clawback(
-
3085 {.issuer = issuer,
-
3086 .id = keylet.key,
-
3087 .holder = owner,
-
3088 .amount = asset(0)}));
-
3089 env.close();
-
3090
-
3091 env(vault.del({.owner = owner, .id = keylet.key}));
-
3092 env.close();
-
3093 });
-
3094
-
3095 testCase([&, this](
-
3096 Env& env,
-
3097 Account const& owner,
-
3098 Account const& issuer,
-
3099 Account const& charlie,
-
3100 auto,
-
3101 Vault& vault,
-
3102 PrettyAsset const& asset,
-
3103 auto&&...) {
-
3104 testcase("IOU global freeze");
-
3105
-
3106 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
-
3107 env(tx);
-
3108 env.close();
-
3109
-
3110 env(vault.deposit(
-
3111 {.depositor = owner, .id = keylet.key, .amount = asset(100)}));
-
3112 env.close();
-
3113
-
3114 env(fset(issuer, asfGlobalFreeze));
-
3115 env.close();
-
3116
-
3117 {
-
3118 // Cannot withdraw
-
3119 auto tx = vault.withdraw(
-
3120 {.depositor = owner,
-
3121 .id = keylet.key,
-
3122 .amount = asset(10)});
-
3123 env(tx, ter{tecFROZEN});
-
3124
-
3125 // Cannot withdraw to 3rd party
-
3126 tx[sfDestination] = charlie.human();
-
3127 env(tx, ter{tecFROZEN});
-
3128 env.close();
-
3129
-
3130 // Cannot deposit some more
-
3131 tx = vault.deposit(
-
3132 {.depositor = owner,
-
3133 .id = keylet.key,
-
3134 .amount = asset(10)});
+
3080 // Can withdraw
+
3081 auto const withdraw = vault.withdraw(
+
3082 {.depositor = owner, .id = keylet.key, .amount = asset(10)});
+
3083 env(withdraw);
+
3084 env.close();
+
3085
+
3086 // Cannot withdraw to 3rd party
+
3087 env(withdrawToCharlie, ter{tecFROZEN});
+
3088 env.close();
+
3089
+
3090 env(vault.clawback(
+
3091 {.issuer = issuer,
+
3092 .id = keylet.key,
+
3093 .holder = owner,
+
3094 .amount = asset(0)}));
+
3095 env.close();
+
3096
+
3097 env(vault.del({.owner = owner, .id = keylet.key}));
+
3098 env.close();
+
3099 });
+
3100
+
3101 testCase([&, this](
+
3102 Env& env,
+
3103 Account const& owner,
+
3104 Account const& issuer,
+
3105 Account const& charlie,
+
3106 auto,
+
3107 Vault& vault,
+
3108 PrettyAsset const& asset,
+
3109 auto&&...) {
+
3110 testcase("IOU global freeze");
+
3111
+
3112 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
+
3113 env(tx);
+
3114 env.close();
+
3115
+
3116 env(vault.deposit(
+
3117 {.depositor = owner, .id = keylet.key, .amount = asset(100)}));
+
3118 env.close();
+
3119
+
3120 env(fset(issuer, asfGlobalFreeze));
+
3121 env.close();
+
3122
+
3123 {
+
3124 // Cannot withdraw
+
3125 auto tx = vault.withdraw(
+
3126 {.depositor = owner,
+
3127 .id = keylet.key,
+
3128 .amount = asset(10)});
+
3129 env(tx, ter{tecFROZEN});
+
3130
+
3131 // Cannot withdraw to 3rd party
+
3132 tx[sfDestination] = charlie.human();
+
3133 env(tx, ter{tecFROZEN});
+
3134 env.close();
3135
-
3136 env(tx, ter{tecFROZEN});
-
3137 }
-
3138
-
3139 // Clawback is permitted
-
3140 env(vault.clawback(
-
3141 {.issuer = issuer,
-
3142 .id = keylet.key,
-
3143 .holder = owner,
-
3144 .amount = asset(0)}));
-
3145 env.close();
-
3146
-
3147 env(vault.del({.owner = owner, .id = keylet.key}));
-
3148 env.close();
-
3149 });
-
3150 }
+
3136 // Cannot deposit some more
+
3137 tx = vault.deposit(
+
3138 {.depositor = owner,
+
3139 .id = keylet.key,
+
3140 .amount = asset(10)});
+
3141
+
3142 env(tx, ter{tecFROZEN});
+
3143 }
+
3144
+
3145 // Clawback is permitted
+
3146 env(vault.clawback(
+
3147 {.issuer = issuer,
+
3148 .id = keylet.key,
+
3149 .holder = owner,
+
3150 .amount = asset(0)}));
+
3151 env.close();
+
3152
+
3153 env(vault.del({.owner = owner, .id = keylet.key}));
+
3154 env.close();
+
3155 });
+
3156 }
-
3151
-
3152 void
-
- -
3154 {
-
3155 using namespace test::jtx;
-
3156
-
3157 testcase("private vault");
-
3158
-
3159 Env env{*this, testable_amendments() | featureSingleAssetVault};
-
3160 Account issuer{"issuer"};
-
3161 Account owner{"owner"};
-
3162 Account depositor{"depositor"};
-
3163 Account charlie{"charlie"};
-
3164 Account pdOwner{"pdOwner"};
-
3165 Account credIssuer1{"credIssuer1"};
-
3166 Account credIssuer2{"credIssuer2"};
-
3167 std::string const credType = "credential";
-
3168 Vault vault{env};
-
3169 env.fund(
-
3170 XRP(1000),
-
3171 issuer,
-
3172 owner,
-
3173 depositor,
-
3174 charlie,
-
3175 pdOwner,
-
3176 credIssuer1,
-
3177 credIssuer2);
-
3178 env.close();
-
3179 env(fset(issuer, asfAllowTrustLineClawback));
-
3180 env.close();
-
3181 env.require(flags(issuer, asfAllowTrustLineClawback));
-
3182
-
3183 PrettyAsset asset = issuer["IOU"];
-
3184 env.trust(asset(1000), owner);
-
3185 env(pay(issuer, owner, asset(500)));
-
3186 env.trust(asset(1000), depositor);
-
3187 env(pay(issuer, depositor, asset(500)));
-
3188 env.trust(asset(1000), charlie);
-
3189 env(pay(issuer, charlie, asset(5)));
-
3190 env.close();
-
3191
-
3192 auto [tx, keylet] = vault.create(
-
3193 {.owner = owner, .asset = asset, .flags = tfVaultPrivate});
-
3194 env(tx);
-
3195 env.close();
-
3196 BEAST_EXPECT(env.le(keylet));
+
3157
+
3158 void
+
+ +
3160 {
+
3161 using namespace test::jtx;
+
3162
+
3163 testcase("private vault");
+
3164
+
3165 Env env{*this, testable_amendments() | featureSingleAssetVault};
+
3166 Account issuer{"issuer"};
+
3167 Account owner{"owner"};
+
3168 Account depositor{"depositor"};
+
3169 Account charlie{"charlie"};
+
3170 Account pdOwner{"pdOwner"};
+
3171 Account credIssuer1{"credIssuer1"};
+
3172 Account credIssuer2{"credIssuer2"};
+
3173 std::string const credType = "credential";
+
3174 Vault vault{env};
+
3175 env.fund(
+
3176 XRP(1000),
+
3177 issuer,
+
3178 owner,
+
3179 depositor,
+
3180 charlie,
+
3181 pdOwner,
+
3182 credIssuer1,
+
3183 credIssuer2);
+
3184 env.close();
+
3185 env(fset(issuer, asfAllowTrustLineClawback));
+
3186 env.close();
+
3187 env.require(flags(issuer, asfAllowTrustLineClawback));
+
3188
+
3189 PrettyAsset asset = issuer["IOU"];
+
3190 env.trust(asset(1000), owner);
+
3191 env(pay(issuer, owner, asset(500)));
+
3192 env.trust(asset(1000), depositor);
+
3193 env(pay(issuer, depositor, asset(500)));
+
3194 env.trust(asset(1000), charlie);
+
3195 env(pay(issuer, charlie, asset(5)));
+
3196 env.close();
3197
-
3198 {
-
3199 testcase("private vault owner can deposit");
-
3200 auto tx = vault.deposit(
-
3201 {.depositor = owner, .id = keylet.key, .amount = asset(50)});
-
3202 env(tx);
-
3203 }
-
3204
-
3205 {
-
3206 testcase("private vault depositor not authorized yet");
-
3207 auto tx = vault.deposit(
-
3208 {.depositor = depositor,
-
3209 .id = keylet.key,
-
3210 .amount = asset(50)});
-
3211 env(tx, ter{tecNO_AUTH});
-
3212 }
-
3213
-
3214 {
-
3215 testcase("private vault cannot set non-existing domain");
-
3216 auto tx = vault.set({.owner = owner, .id = keylet.key});
-
3217 tx[sfDomainID] = to_string(base_uint<256>(42ul));
-
3218 env(tx, ter{tecOBJECT_NOT_FOUND});
-
3219 }
-
3220
-
3221 {
-
3222 testcase("private vault set domainId");
-
3223
-
3224 {
-
3225 pdomain::Credentials const credentials1{
-
3226 {.issuer = credIssuer1, .credType = credType}};
-
3227
-
3228 env(pdomain::setTx(pdOwner, credentials1));
-
3229 auto const domainId1 = [&]() {
-
3230 auto tx = env.tx()->getJson(JsonOptions::none);
-
3231 return pdomain::getNewDomain(env.meta());
-
3232 }();
+
3198 auto [tx, keylet] = vault.create(
+
3199 {.owner = owner, .asset = asset, .flags = tfVaultPrivate});
+
3200 env(tx);
+
3201 env.close();
+
3202 BEAST_EXPECT(env.le(keylet));
+
3203
+
3204 {
+
3205 testcase("private vault owner can deposit");
+
3206 auto tx = vault.deposit(
+
3207 {.depositor = owner, .id = keylet.key, .amount = asset(50)});
+
3208 env(tx);
+
3209 }
+
3210
+
3211 {
+
3212 testcase("private vault depositor not authorized yet");
+
3213 auto tx = vault.deposit(
+
3214 {.depositor = depositor,
+
3215 .id = keylet.key,
+
3216 .amount = asset(50)});
+
3217 env(tx, ter{tecNO_AUTH});
+
3218 }
+
3219
+
3220 {
+
3221 testcase("private vault cannot set non-existing domain");
+
3222 auto tx = vault.set({.owner = owner, .id = keylet.key});
+
3223 tx[sfDomainID] = to_string(base_uint<256>(42ul));
+
3224 env(tx, ter{tecOBJECT_NOT_FOUND});
+
3225 }
+
3226
+
3227 {
+
3228 testcase("private vault set domainId");
+
3229
+
3230 {
+
3231 pdomain::Credentials const credentials1{
+
3232 {.issuer = credIssuer1, .credType = credType}};
3233
-
3234 auto tx = vault.set({.owner = owner, .id = keylet.key});
-
3235 tx[sfDomainID] = to_string(domainId1);
-
3236 env(tx);
-
3237 env.close();
-
3238
-
3239 // Update domain second time, should be harmless
-
3240 env(tx);
-
3241 env.close();
-
3242 }
-
3243
-
3244 {
-
3245 pdomain::Credentials const credentials{
-
3246 {.issuer = credIssuer1, .credType = credType},
-
3247 {.issuer = credIssuer2, .credType = credType}};
-
3248
-
3249 env(pdomain::setTx(pdOwner, credentials));
-
3250 auto const domainId = [&]() {
-
3251 auto tx = env.tx()->getJson(JsonOptions::none);
-
3252 return pdomain::getNewDomain(env.meta());
-
3253 }();
+
3234 env(pdomain::setTx(pdOwner, credentials1));
+
3235 auto const domainId1 = [&]() {
+
3236 auto tx = env.tx()->getJson(JsonOptions::none);
+
3237 return pdomain::getNewDomain(env.meta());
+
3238 }();
+
3239
+
3240 auto tx = vault.set({.owner = owner, .id = keylet.key});
+
3241 tx[sfDomainID] = to_string(domainId1);
+
3242 env(tx);
+
3243 env.close();
+
3244
+
3245 // Update domain second time, should be harmless
+
3246 env(tx);
+
3247 env.close();
+
3248 }
+
3249
+
3250 {
+
3251 pdomain::Credentials const credentials{
+
3252 {.issuer = credIssuer1, .credType = credType},
+
3253 {.issuer = credIssuer2, .credType = credType}};
3254
-
3255 auto tx = vault.set({.owner = owner, .id = keylet.key});
-
3256 tx[sfDomainID] = to_string(domainId);
-
3257 env(tx);
-
3258 env.close();
-
3259
-
3260 // Should be idempotent
-
3261 tx = vault.set({.owner = owner, .id = keylet.key});
+
3255 env(pdomain::setTx(pdOwner, credentials));
+
3256 auto const domainId = [&]() {
+
3257 auto tx = env.tx()->getJson(JsonOptions::none);
+
3258 return pdomain::getNewDomain(env.meta());
+
3259 }();
+
3260
+
3261 auto tx = vault.set({.owner = owner, .id = keylet.key});
3262 tx[sfDomainID] = to_string(domainId);
3263 env(tx);
3264 env.close();
-
3265 }
-
3266 }
-
3267
-
3268 {
-
3269 testcase("private vault depositor still not authorized");
-
3270 auto tx = vault.deposit(
-
3271 {.depositor = depositor,
-
3272 .id = keylet.key,
-
3273 .amount = asset(50)});
-
3274 env(tx, ter{tecNO_AUTH});
-
3275 env.close();
-
3276 }
-
3277
-
3278 auto const credKeylet =
-
3279 credentials::keylet(depositor, credIssuer1, credType);
-
3280 {
-
3281 testcase("private vault depositor now authorized");
-
3282 env(credentials::create(depositor, credIssuer1, credType));
-
3283 env(credentials::accept(depositor, credIssuer1, credType));
-
3284 env(credentials::create(charlie, credIssuer1, credType));
-
3285 // charlie's credential not accepted
-
3286 env.close();
-
3287 auto credSle = env.le(credKeylet);
-
3288 BEAST_EXPECT(credSle != nullptr);
-
3289
-
3290 auto tx = vault.deposit(
-
3291 {.depositor = depositor,
-
3292 .id = keylet.key,
-
3293 .amount = asset(50)});
-
3294 env(tx);
-
3295 env.close();
-
3296
-
3297 tx = vault.deposit(
-
3298 {.depositor = charlie, .id = keylet.key, .amount = asset(50)});
-
3299 env(tx, ter{tecNO_AUTH});
-
3300 env.close();
-
3301 }
+
3265
+
3266 // Should be idempotent
+
3267 tx = vault.set({.owner = owner, .id = keylet.key});
+
3268 tx[sfDomainID] = to_string(domainId);
+
3269 env(tx);
+
3270 env.close();
+
3271 }
+
3272 }
+
3273
+
3274 {
+
3275 testcase("private vault depositor still not authorized");
+
3276 auto tx = vault.deposit(
+
3277 {.depositor = depositor,
+
3278 .id = keylet.key,
+
3279 .amount = asset(50)});
+
3280 env(tx, ter{tecNO_AUTH});
+
3281 env.close();
+
3282 }
+
3283
+
3284 auto const credKeylet =
+
3285 credentials::keylet(depositor, credIssuer1, credType);
+
3286 {
+
3287 testcase("private vault depositor now authorized");
+
3288 env(credentials::create(depositor, credIssuer1, credType));
+
3289 env(credentials::accept(depositor, credIssuer1, credType));
+
3290 env(credentials::create(charlie, credIssuer1, credType));
+
3291 // charlie's credential not accepted
+
3292 env.close();
+
3293 auto credSle = env.le(credKeylet);
+
3294 BEAST_EXPECT(credSle != nullptr);
+
3295
+
3296 auto tx = vault.deposit(
+
3297 {.depositor = depositor,
+
3298 .id = keylet.key,
+
3299 .amount = asset(50)});
+
3300 env(tx);
+
3301 env.close();
3302
-
3303 {
-
3304 testcase("private vault depositor lost authorization");
-
3305 env(credentials::deleteCred(
-
3306 credIssuer1, depositor, credIssuer1, credType));
-
3307 env(credentials::deleteCred(
-
3308 credIssuer1, charlie, credIssuer1, credType));
-
3309 env.close();
-
3310 auto credSle = env.le(credKeylet);
-
3311 BEAST_EXPECT(credSle == nullptr);
-
3312
-
3313 auto tx = vault.deposit(
-
3314 {.depositor = depositor,
-
3315 .id = keylet.key,
-
3316 .amount = asset(50)});
-
3317 env(tx, ter{tecNO_AUTH});
-
3318 env.close();
-
3319 }
-
3320
-
3321 auto const shares = [&env, keylet = keylet, this]() -> Asset {
-
3322 auto const vault = env.le(keylet);
-
3323 BEAST_EXPECT(vault != nullptr);
-
3324 return MPTIssue(vault->at(sfShareMPTID));
-
3325 }();
+
3303 tx = vault.deposit(
+
3304 {.depositor = charlie, .id = keylet.key, .amount = asset(50)});
+
3305 env(tx, ter{tecNO_AUTH});
+
3306 env.close();
+
3307 }
+
3308
+
3309 {
+
3310 testcase("private vault depositor lost authorization");
+
3311 env(credentials::deleteCred(
+
3312 credIssuer1, depositor, credIssuer1, credType));
+
3313 env(credentials::deleteCred(
+
3314 credIssuer1, charlie, credIssuer1, credType));
+
3315 env.close();
+
3316 auto credSle = env.le(credKeylet);
+
3317 BEAST_EXPECT(credSle == nullptr);
+
3318
+
3319 auto tx = vault.deposit(
+
3320 {.depositor = depositor,
+
3321 .id = keylet.key,
+
3322 .amount = asset(50)});
+
3323 env(tx, ter{tecNO_AUTH});
+
3324 env.close();
+
3325 }
3326
-
3327 {
-
3328 testcase("private vault expired authorization");
-
3329 uint32_t const closeTime = env.current()
-
3330 ->info()
-
3331 .parentCloseTime.time_since_epoch()
-
3332 .count();
-
3333 {
-
3334 auto tx0 =
-
3335 credentials::create(depositor, credIssuer2, credType);
-
3336 tx0[sfExpiration] = closeTime + 20;
-
3337 env(tx0);
-
3338 tx0 = credentials::create(charlie, credIssuer2, credType);
-
3339 tx0[sfExpiration] = closeTime + 20;
-
3340 env(tx0);
-
3341 env.close();
-
3342
-
3343 env(credentials::accept(depositor, credIssuer2, credType));
-
3344 env(credentials::accept(charlie, credIssuer2, credType));
-
3345 env.close();
-
3346 }
-
3347
-
3348 {
-
3349 auto tx1 = vault.deposit(
-
3350 {.depositor = depositor,
-
3351 .id = keylet.key,
-
3352 .amount = asset(50)});
-
3353 env(tx1);
-
3354 env.close();
-
3355
-
3356 auto const tokenKeylet = keylet::mptoken(
-
3357 shares.get<MPTIssue>().getMptID(), depositor.id());
-
3358 BEAST_EXPECT(env.le(tokenKeylet) != nullptr);
-
3359 }
-
3360
-
3361 {
-
3362 // time advance
-
3363 env.close();
-
3364 env.close();
-
3365 env.close();
+
3327 auto const shares = [&env, keylet = keylet, this]() -> Asset {
+
3328 auto const vault = env.le(keylet);
+
3329 BEAST_EXPECT(vault != nullptr);
+
3330 return MPTIssue(vault->at(sfShareMPTID));
+
3331 }();
+
3332
+
3333 {
+
3334 testcase("private vault expired authorization");
+
3335 uint32_t const closeTime = env.current()
+
3336 ->info()
+
3337 .parentCloseTime.time_since_epoch()
+
3338 .count();
+
3339 {
+
3340 auto tx0 =
+
3341 credentials::create(depositor, credIssuer2, credType);
+
3342 tx0[sfExpiration] = closeTime + 20;
+
3343 env(tx0);
+
3344 tx0 = credentials::create(charlie, credIssuer2, credType);
+
3345 tx0[sfExpiration] = closeTime + 20;
+
3346 env(tx0);
+
3347 env.close();
+
3348
+
3349 env(credentials::accept(depositor, credIssuer2, credType));
+
3350 env(credentials::accept(charlie, credIssuer2, credType));
+
3351 env.close();
+
3352 }
+
3353
+
3354 {
+
3355 auto tx1 = vault.deposit(
+
3356 {.depositor = depositor,
+
3357 .id = keylet.key,
+
3358 .amount = asset(50)});
+
3359 env(tx1);
+
3360 env.close();
+
3361
+
3362 auto const tokenKeylet = keylet::mptoken(
+
3363 shares.get<MPTIssue>().getMptID(), depositor.id());
+
3364 BEAST_EXPECT(env.le(tokenKeylet) != nullptr);
+
3365 }
3366
-
3367 auto const credsKeylet =
-
3368 credentials::keylet(depositor, credIssuer2, credType);
-
3369 BEAST_EXPECT(env.le(credsKeylet) != nullptr);
-
3370
-
3371 auto tx2 = vault.deposit(
-
3372 {.depositor = depositor,
-
3373 .id = keylet.key,
-
3374 .amount = asset(1)});
-
3375 env(tx2, ter{tecEXPIRED});
-
3376 env.close();
-
3377
-
3378 BEAST_EXPECT(env.le(credsKeylet) == nullptr);
-
3379 }
-
3380
-
3381 {
-
3382 auto const credsKeylet =
-
3383 credentials::keylet(charlie, credIssuer2, credType);
-
3384 BEAST_EXPECT(env.le(credsKeylet) != nullptr);
-
3385 auto const tokenKeylet = keylet::mptoken(
-
3386 shares.get<MPTIssue>().getMptID(), charlie.id());
-
3387 BEAST_EXPECT(env.le(tokenKeylet) == nullptr);
-
3388
-
3389 auto tx3 = vault.deposit(
-
3390 {.depositor = charlie,
-
3391 .id = keylet.key,
-
3392 .amount = asset(2)});
-
3393 env(tx3, ter{tecEXPIRED});
+
3367 {
+
3368 // time advance
+
3369 env.close();
+
3370 env.close();
+
3371 env.close();
+
3372
+
3373 auto const credsKeylet =
+
3374 credentials::keylet(depositor, credIssuer2, credType);
+
3375 BEAST_EXPECT(env.le(credsKeylet) != nullptr);
+
3376
+
3377 auto tx2 = vault.deposit(
+
3378 {.depositor = depositor,
+
3379 .id = keylet.key,
+
3380 .amount = asset(1)});
+
3381 env(tx2, ter{tecEXPIRED});
+
3382 env.close();
+
3383
+
3384 BEAST_EXPECT(env.le(credsKeylet) == nullptr);
+
3385 }
+
3386
+
3387 {
+
3388 auto const credsKeylet =
+
3389 credentials::keylet(charlie, credIssuer2, credType);
+
3390 BEAST_EXPECT(env.le(credsKeylet) != nullptr);
+
3391 auto const tokenKeylet = keylet::mptoken(
+
3392 shares.get<MPTIssue>().getMptID(), charlie.id());
+
3393 BEAST_EXPECT(env.le(tokenKeylet) == nullptr);
3394
-
3395 env.close();
-
3396 BEAST_EXPECT(env.le(credsKeylet) == nullptr);
-
3397 BEAST_EXPECT(env.le(tokenKeylet) == nullptr);
-
3398 }
-
3399 }
+
3395 auto tx3 = vault.deposit(
+
3396 {.depositor = charlie,
+
3397 .id = keylet.key,
+
3398 .amount = asset(2)});
+
3399 env(tx3, ter{tecEXPIRED});
3400
-
3401 {
-
3402 testcase("private vault reset domainId");
-
3403 auto tx = vault.set({.owner = owner, .id = keylet.key});
-
3404 tx[sfDomainID] = "0";
-
3405 env(tx);
-
3406 env.close();
-
3407
-
3408 tx = vault.deposit(
-
3409 {.depositor = depositor,
-
3410 .id = keylet.key,
-
3411 .amount = asset(50)});
-
3412 env(tx, ter{tecNO_AUTH});
-
3413 env.close();
-
3414
-
3415 tx = vault.withdraw(
-
3416 {.depositor = depositor,
-
3417 .id = keylet.key,
-
3418 .amount = asset(50)});
-
3419 env(tx);
-
3420 env.close();
-
3421
-
3422 tx = vault.clawback(
-
3423 {.issuer = issuer,
-
3424 .id = keylet.key,
-
3425 .holder = depositor,
-
3426 .amount = asset(0)});
-
3427 env(tx);
-
3428
-
3429 tx = vault.clawback(
-
3430 {.issuer = issuer,
-
3431 .id = keylet.key,
-
3432 .holder = owner,
-
3433 .amount = asset(0)});
-
3434 env(tx);
-
3435 env.close();
-
3436
-
3437 tx = vault.del({
-
3438 .owner = owner,
-
3439 .id = keylet.key,
-
3440 });
-
3441 env(tx);
-
3442 }
-
3443 }
+
3401 env.close();
+
3402 BEAST_EXPECT(env.le(credsKeylet) == nullptr);
+
3403 BEAST_EXPECT(env.le(tokenKeylet) == nullptr);
+
3404 }
+
3405 }
+
3406
+
3407 {
+
3408 testcase("private vault reset domainId");
+
3409 auto tx = vault.set({.owner = owner, .id = keylet.key});
+
3410 tx[sfDomainID] = "0";
+
3411 env(tx);
+
3412 env.close();
+
3413
+
3414 tx = vault.deposit(
+
3415 {.depositor = depositor,
+
3416 .id = keylet.key,
+
3417 .amount = asset(50)});
+
3418 env(tx, ter{tecNO_AUTH});
+
3419 env.close();
+
3420
+
3421 tx = vault.withdraw(
+
3422 {.depositor = depositor,
+
3423 .id = keylet.key,
+
3424 .amount = asset(50)});
+
3425 env(tx);
+
3426 env.close();
+
3427
+
3428 tx = vault.clawback(
+
3429 {.issuer = issuer,
+
3430 .id = keylet.key,
+
3431 .holder = depositor,
+
3432 .amount = asset(0)});
+
3433 env(tx);
+
3434
+
3435 tx = vault.clawback(
+
3436 {.issuer = issuer,
+
3437 .id = keylet.key,
+
3438 .holder = owner,
+
3439 .amount = asset(0)});
+
3440 env(tx);
+
3441 env.close();
+
3442
+
3443 tx = vault.del({
+
3444 .owner = owner,
+
3445 .id = keylet.key,
+
3446 });
+
3447 env(tx);
+
3448 }
+
3449 }
-
3444
-
3445 void
-
- -
3447 {
-
3448 using namespace test::jtx;
-
3449
-
3450 testcase("private XRP vault");
-
3451
-
3452 Env env{*this, testable_amendments() | featureSingleAssetVault};
-
3453 Account owner{"owner"};
-
3454 Account depositor{"depositor"};
-
3455 Account alice{"charlie"};
-
3456 std::string const credType = "credential";
-
3457 Vault vault{env};
-
3458 env.fund(XRP(100000), owner, depositor, alice);
-
3459 env.close();
-
3460
-
3461 PrettyAsset asset = xrpIssue();
-
3462 auto [tx, keylet] = vault.create(
-
3463 {.owner = owner, .asset = asset, .flags = tfVaultPrivate});
-
3464 env(tx);
+
3450
+
3451 void
+
+ +
3453 {
+
3454 using namespace test::jtx;
+
3455
+
3456 testcase("private XRP vault");
+
3457
+
3458 Env env{*this, testable_amendments() | featureSingleAssetVault};
+
3459 Account owner{"owner"};
+
3460 Account depositor{"depositor"};
+
3461 Account alice{"charlie"};
+
3462 std::string const credType = "credential";
+
3463 Vault vault{env};
+
3464 env.fund(XRP(100000), owner, depositor, alice);
3465 env.close();
3466
-
3467 auto const [vaultAccount, issuanceId] =
-
3468 [&env, keylet = keylet, this]() -> std::tuple<AccountID, uint192> {
-
3469 auto const vault = env.le(keylet);
-
3470 BEAST_EXPECT(vault != nullptr);
-
3471 return {vault->at(sfAccount), vault->at(sfShareMPTID)};
-
3472 }();
-
3473 BEAST_EXPECT(env.le(keylet::account(vaultAccount)));
-
3474 BEAST_EXPECT(env.le(keylet::mptIssuance(issuanceId)));
-
3475 PrettyAsset shares{issuanceId};
-
3476
-
3477 {
-
3478 testcase("private XRP vault owner can deposit");
-
3479 auto tx = vault.deposit(
-
3480 {.depositor = owner, .id = keylet.key, .amount = asset(50)});
-
3481 env(tx);
-
3482 env.close();
-
3483 }
-
3484
-
3485 {
-
3486 testcase("private XRP vault cannot pay shares to depositor yet");
-
3487 env(pay(owner, depositor, shares(1)), ter{tecNO_AUTH});
-
3488 }
-
3489
-
3490 {
-
3491 testcase("private XRP vault depositor not authorized yet");
-
3492 auto tx = vault.deposit(
-
3493 {.depositor = depositor,
-
3494 .id = keylet.key,
-
3495 .amount = asset(50)});
-
3496 env(tx, ter{tecNO_AUTH});
-
3497 }
-
3498
-
3499 {
-
3500 testcase("private XRP vault set DomainID");
-
3501 pdomain::Credentials const credentials{
-
3502 {.issuer = owner, .credType = credType}};
-
3503
-
3504 env(pdomain::setTx(owner, credentials));
-
3505 auto const domainId = [&]() {
-
3506 auto tx = env.tx()->getJson(JsonOptions::none);
-
3507 return pdomain::getNewDomain(env.meta());
-
3508 }();
+
3467 PrettyAsset asset = xrpIssue();
+
3468 auto [tx, keylet] = vault.create(
+
3469 {.owner = owner, .asset = asset, .flags = tfVaultPrivate});
+
3470 env(tx);
+
3471 env.close();
+
3472
+
3473 auto const [vaultAccount, issuanceId] =
+
3474 [&env, keylet = keylet, this]() -> std::tuple<AccountID, uint192> {
+
3475 auto const vault = env.le(keylet);
+
3476 BEAST_EXPECT(vault != nullptr);
+
3477 return {vault->at(sfAccount), vault->at(sfShareMPTID)};
+
3478 }();
+
3479 BEAST_EXPECT(env.le(keylet::account(vaultAccount)));
+
3480 BEAST_EXPECT(env.le(keylet::mptIssuance(issuanceId)));
+
3481 PrettyAsset shares{issuanceId};
+
3482
+
3483 {
+
3484 testcase("private XRP vault owner can deposit");
+
3485 auto tx = vault.deposit(
+
3486 {.depositor = owner, .id = keylet.key, .amount = asset(50)});
+
3487 env(tx);
+
3488 env.close();
+
3489 }
+
3490
+
3491 {
+
3492 testcase("private XRP vault cannot pay shares to depositor yet");
+
3493 env(pay(owner, depositor, shares(1)), ter{tecNO_AUTH});
+
3494 }
+
3495
+
3496 {
+
3497 testcase("private XRP vault depositor not authorized yet");
+
3498 auto tx = vault.deposit(
+
3499 {.depositor = depositor,
+
3500 .id = keylet.key,
+
3501 .amount = asset(50)});
+
3502 env(tx, ter{tecNO_AUTH});
+
3503 }
+
3504
+
3505 {
+
3506 testcase("private XRP vault set DomainID");
+
3507 pdomain::Credentials const credentials{
+
3508 {.issuer = owner, .credType = credType}};
3509
-
3510 auto tx = vault.set({.owner = owner, .id = keylet.key});
-
3511 tx[sfDomainID] = to_string(domainId);
-
3512 env(tx);
-
3513 env.close();
-
3514 }
+
3510 env(pdomain::setTx(owner, credentials));
+
3511 auto const domainId = [&]() {
+
3512 auto tx = env.tx()->getJson(JsonOptions::none);
+
3513 return pdomain::getNewDomain(env.meta());
+
3514 }();
3515
-
3516 auto const credKeylet = credentials::keylet(depositor, owner, credType);
-
3517 {
-
3518 testcase("private XRP vault depositor now authorized");
-
3519 env(credentials::create(depositor, owner, credType));
-
3520 env(credentials::accept(depositor, owner, credType));
-
3521 env.close();
-
3522
-
3523 BEAST_EXPECT(env.le(credKeylet));
-
3524 auto tx = vault.deposit(
-
3525 {.depositor = depositor,
-
3526 .id = keylet.key,
-
3527 .amount = asset(50)});
-
3528 env(tx);
-
3529 env.close();
-
3530 }
-
3531
-
3532 {
-
3533 testcase("private XRP vault can pay shares to depositor");
-
3534 env(pay(owner, depositor, shares(1)));
-
3535 }
-
3536
-
3537 {
-
3538 testcase("private XRP vault cannot pay shares to 3rd party");
-
3539 Json::Value jv;
-
3540 jv[sfAccount] = alice.human();
-
3541 jv[sfTransactionType] = jss::MPTokenAuthorize;
-
3542 jv[sfMPTokenIssuanceID] = to_string(issuanceId);
-
3543 env(jv);
-
3544 env.close();
-
3545
-
3546 env(pay(owner, alice, shares(1)), ter{tecNO_AUTH});
-
3547 }
-
3548 }
+
3516 auto tx = vault.set({.owner = owner, .id = keylet.key});
+
3517 tx[sfDomainID] = to_string(domainId);
+
3518 env(tx);
+
3519 env.close();
+
3520 }
+
3521
+
3522 auto const credKeylet = credentials::keylet(depositor, owner, credType);
+
3523 {
+
3524 testcase("private XRP vault depositor now authorized");
+
3525 env(credentials::create(depositor, owner, credType));
+
3526 env(credentials::accept(depositor, owner, credType));
+
3527 env.close();
+
3528
+
3529 BEAST_EXPECT(env.le(credKeylet));
+
3530 auto tx = vault.deposit(
+
3531 {.depositor = depositor,
+
3532 .id = keylet.key,
+
3533 .amount = asset(50)});
+
3534 env(tx);
+
3535 env.close();
+
3536 }
+
3537
+
3538 {
+
3539 testcase("private XRP vault can pay shares to depositor");
+
3540 env(pay(owner, depositor, shares(1)));
+
3541 }
+
3542
+
3543 {
+
3544 testcase("private XRP vault cannot pay shares to 3rd party");
+
3545 Json::Value jv;
+
3546 jv[sfAccount] = alice.human();
+
3547 jv[sfTransactionType] = jss::MPTokenAuthorize;
+
3548 jv[sfMPTokenIssuanceID] = to_string(issuanceId);
+
3549 env(jv);
+
3550 env.close();
+
3551
+
3552 env(pay(owner, alice, shares(1)), ter{tecNO_AUTH});
+
3553 }
+
3554 }
-
3549
-
3550 void
-
- -
3552 {
-
3553 using namespace test::jtx;
-
3554
-
3555 testcase("fail pseudo-account allocation");
-
3556 Env env{*this, testable_amendments() | featureSingleAssetVault};
-
3557 Account const owner{"owner"};
-
3558 Vault vault{env};
-
3559 env.fund(XRP(1000), owner);
+
3555
+
3556 void
+
+ +
3558 {
+
3559 using namespace test::jtx;
3560
-
3561 auto const keylet = keylet::vault(owner.id(), env.seq(owner));
-
3562 for (int i = 0; i < 256; ++i)
-
3563 {
-
3564 AccountID const accountId =
-
3565 ripple::pseudoAccountAddress(*env.current(), keylet.key);
+
3561 testcase("fail pseudo-account allocation");
+
3562 Env env{*this, testable_amendments() | featureSingleAssetVault};
+
3563 Account const owner{"owner"};
+
3564 Vault vault{env};
+
3565 env.fund(XRP(1000), owner);
3566
-
3567 env(pay(env.master.id(), accountId, XRP(1000)),
-
3568 seq(autofill),
-
3569 fee(autofill),
-
3570 sig(autofill));
-
3571 }
+
3567 auto const keylet = keylet::vault(owner.id(), env.seq(owner));
+
3568 for (int i = 0; i < 256; ++i)
+
3569 {
+
3570 AccountID const accountId =
+
3571 ripple::pseudoAccountAddress(*env.current(), keylet.key);
3572
-
3573 auto [tx, keylet1] =
-
3574 vault.create({.owner = owner, .asset = xrpIssue()});
-
3575 BEAST_EXPECT(keylet.key == keylet1.key);
-
3576 env(tx, ter{terADDRESS_COLLISION});
-
3577 }
-
+
3573 env(pay(env.master.id(), accountId, XRP(1000)),
+
3574 seq(autofill),
+
3575 fee(autofill),
+
3576 sig(autofill));
+
3577 }
3578
-
3579 void
-
- -
3581 {
-
3582 using namespace test::jtx;
-
3583
-
3584 struct Data
-
3585 {
-
3586 Account const& owner;
-
3587 Account const& issuer;
-
3588 Account const& depositor;
-
3589 Account const& vaultAccount;
-
3590 MPTIssue shares;
-
3591 PrettyAsset const& share;
-
3592 Vault& vault;
-
3593 ripple::Keylet keylet;
-
3594 Issue assets;
-
3595 PrettyAsset const& asset;
-
3596 std::function<bool(std::function<bool(SLE&, SLE&)>)> peek;
-
3597 };
-
3598
-
3599 auto testCase = [&, this](
-
3600 std::uint8_t scale,
-
3601 std::function<void(Env & env, Data data)> test) {
-
3602 Env env{*this, testable_amendments() | featureSingleAssetVault};
-
3603 Account const owner{"owner"};
-
3604 Account const issuer{"issuer"};
-
3605 Account const depositor{"depositor"};
-
3606 Vault vault{env};
-
3607 env.fund(XRP(1000), issuer, owner, depositor);
-
3608 env(fset(issuer, asfAllowTrustLineClawback));
-
3609 env.close();
-
3610
-
3611 PrettyAsset const asset = issuer["IOU"];
-
3612 env.trust(asset(1000), owner);
-
3613 env.trust(asset(1000), depositor);
-
3614 env(pay(issuer, owner, asset(200)));
-
3615 env(pay(issuer, depositor, asset(200)));
-
3616 env.close();
-
3617
-
3618 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
-
3619 tx[sfScale] = scale;
-
3620 env(tx);
-
3621
-
3622 auto const [vaultAccount, issuanceId] =
-
3623 [&env](ripple::Keylet keylet) -> std::tuple<Account, MPTID> {
-
3624 auto const vault = env.le(keylet);
-
3625 return {
-
3626 Account("vault", vault->at(sfAccount)),
-
3627 vault->at(sfShareMPTID)};
-
3628 }(keylet);
-
3629 MPTIssue shares(issuanceId);
-
3630 env.memoize(vaultAccount);
-
3631
-
3632 auto const peek =
-
3633 [=, &env, this](std::function<bool(SLE&, SLE&)> fn) -> bool {
-
3634 return env.app().openLedger().modify(
-
3635 [&](OpenView& view, beast::Journal j) -> bool {
-
3636 Sandbox sb(&view, tapNONE);
-
3637 auto vault = sb.peek(keylet::vault(keylet.key));
-
3638 if (!BEAST_EXPECT(vault != nullptr))
-
3639 return false;
-
3640 auto shares = sb.peek(
-
3641 keylet::mptIssuance(vault->at(sfShareMPTID)));
-
3642 if (!BEAST_EXPECT(shares != nullptr))
-
3643 return false;
-
3644 if (fn(*vault, *shares))
-
3645 {
-
3646 sb.update(vault);
-
3647 sb.update(shares);
-
3648 sb.apply(view);
-
3649 return true;
-
3650 }
-
3651 return false;
-
3652 });
-
3653 };
-
3654
-
3655 test(
-
3656 env,
-
3657 {.owner = owner,
-
3658 .issuer = issuer,
-
3659 .depositor = depositor,
-
3660 .vaultAccount = vaultAccount,
-
3661 .shares = shares,
-
3662 .share = PrettyAsset(shares),
-
3663 .vault = vault,
-
3664 .keylet = keylet,
-
3665 .assets = asset.raw().get<Issue>(),
-
3666 .asset = asset,
-
3667 .peek = peek});
-
3668 };
-
3669
-
3670 testCase(18, [&, this](Env& env, Data d) {
-
3671 testcase("Scale deposit overflow on first deposit");
-
3672 auto tx = d.vault.deposit(
-
3673 {.depositor = d.depositor,
-
3674 .id = d.keylet.key,
-
3675 .amount = d.asset(10)});
-
3676 env(tx, ter{tecPATH_DRY});
-
3677 env.close();
-
3678 });
-
3679
-
3680 testCase(18, [&, this](Env& env, Data d) {
-
3681 testcase("Scale deposit overflow on second deposit");
-
3682
-
3683 {
-
3684 auto tx = d.vault.deposit(
-
3685 {.depositor = d.depositor,
-
3686 .id = d.keylet.key,
-
3687 .amount = d.asset(5)});
-
3688 env(tx);
-
3689 env.close();
-
3690 }
-
3691
-
3692 {
-
3693 auto tx = d.vault.deposit(
-
3694 {.depositor = d.depositor,
-
3695 .id = d.keylet.key,
-
3696 .amount = d.asset(10)});
-
3697 env(tx, ter{tecPATH_DRY});
-
3698 env.close();
-
3699 }
-
3700 });
-
3701
-
3702 testCase(18, [&, this](Env& env, Data d) {
-
3703 testcase("Scale deposit overflow on total shares");
-
3704
-
3705 {
-
3706 auto tx = d.vault.deposit(
-
3707 {.depositor = d.depositor,
-
3708 .id = d.keylet.key,
-
3709 .amount = d.asset(5)});
-
3710 env(tx);
-
3711 env.close();
-
3712 }
-
3713
-
3714 {
-
3715 auto tx = d.vault.deposit(
-
3716 {.depositor = d.depositor,
-
3717 .id = d.keylet.key,
-
3718 .amount = d.asset(5)});
-
3719 env(tx, ter{tecPATH_DRY});
-
3720 env.close();
-
3721 }
-
3722 });
-
3723
-
3724 testCase(1, [&, this](Env& env, Data d) {
-
3725 testcase("Scale deposit exact");
-
3726
-
3727 auto const start = env.balance(d.depositor, d.assets).number();
-
3728 auto tx = d.vault.deposit(
-
3729 {.depositor = d.depositor,
-
3730 .id = d.keylet.key,
-
3731 .amount = d.asset(1)});
-
3732 env(tx);
-
3733 env.close();
-
3734 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(10));
-
3735 BEAST_EXPECT(
-
3736 env.balance(d.depositor, d.assets) ==
-
3737 STAmount(d.asset, start - 1));
-
3738 });
-
3739
-
3740 testCase(1, [&, this](Env& env, Data d) {
-
3741 testcase("Scale deposit insignificant amount");
-
3742
-
3743 auto tx = d.vault.deposit(
-
3744 {.depositor = d.depositor,
-
3745 .id = d.keylet.key,
-
3746 .amount = STAmount(d.asset, Number(9, -2))});
-
3747 env(tx, ter{tecPRECISION_LOSS});
-
3748 });
-
3749
-
3750 testCase(1, [&, this](Env& env, Data d) {
-
3751 testcase("Scale deposit exact, using full precision");
-
3752
-
3753 auto const start = env.balance(d.depositor, d.assets).number();
-
3754 auto tx = d.vault.deposit(
-
3755 {.depositor = d.depositor,
-
3756 .id = d.keylet.key,
-
3757 .amount = STAmount(d.asset, Number(15, -1))});
-
3758 env(tx);
-
3759 env.close();
-
3760 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(15));
-
3761 BEAST_EXPECT(
-
3762 env.balance(d.depositor, d.assets) ==
-
3763 STAmount(d.asset, start - Number(15, -1)));
-
3764 });
-
3765
-
3766 testCase(1, [&, this](Env& env, Data d) {
-
3767 testcase("Scale deposit exact, truncating from .5");
-
3768
-
3769 auto const start = env.balance(d.depositor, d.assets).number();
-
3770 // Each of the cases below will transfer exactly 1.2 IOU to the
-
3771 // vault and receive 12 shares in exchange
-
3772 {
-
3773 auto tx = d.vault.deposit(
-
3774 {.depositor = d.depositor,
-
3775 .id = d.keylet.key,
-
3776 .amount = STAmount(d.asset, Number(125, -2))});
-
3777 env(tx);
-
3778 env.close();
-
3779 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(12));
-
3780 BEAST_EXPECT(
-
3781 env.balance(d.depositor, d.assets) ==
-
3782 STAmount(d.asset, start - Number(12, -1)));
-
3783 }
-
3784
-
3785 {
-
3786 auto tx = d.vault.deposit(
-
3787 {.depositor = d.depositor,
-
3788 .id = d.keylet.key,
-
3789 .amount = STAmount(d.asset, Number(1201, -3))});
-
3790 env(tx);
-
3791 env.close();
-
3792 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(24));
-
3793 BEAST_EXPECT(
-
3794 env.balance(d.depositor, d.assets) ==
-
3795 STAmount(d.asset, start - Number(24, -1)));
-
3796 }
-
3797
-
3798 {
-
3799 auto tx = d.vault.deposit(
-
3800 {.depositor = d.depositor,
-
3801 .id = d.keylet.key,
-
3802 .amount = STAmount(d.asset, Number(1299, -3))});
-
3803 env(tx);
-
3804 env.close();
-
3805 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(36));
-
3806 BEAST_EXPECT(
-
3807 env.balance(d.depositor, d.assets) ==
-
3808 STAmount(d.asset, start - Number(36, -1)));
-
3809 }
-
3810 });
-
3811
-
3812 testCase(1, [&, this](Env& env, Data d) {
-
3813 testcase("Scale deposit exact, truncating from .01");
-
3814
-
3815 auto const start = env.balance(d.depositor, d.assets).number();
-
3816 // round to 12
-
3817 auto tx = d.vault.deposit(
-
3818 {.depositor = d.depositor,
-
3819 .id = d.keylet.key,
-
3820 .amount = STAmount(d.asset, Number(1201, -3))});
-
3821 env(tx);
-
3822 env.close();
-
3823 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(12));
-
3824 BEAST_EXPECT(
-
3825 env.balance(d.depositor, d.assets) ==
-
3826 STAmount(d.asset, start - Number(12, -1)));
-
3827
-
3828 {
-
3829 // round to 6
-
3830 auto tx = d.vault.deposit(
-
3831 {.depositor = d.depositor,
-
3832 .id = d.keylet.key,
-
3833 .amount = STAmount(d.asset, Number(69, -2))});
-
3834 env(tx);
-
3835 env.close();
-
3836 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(18));
-
3837 BEAST_EXPECT(
-
3838 env.balance(d.depositor, d.assets) ==
-
3839 STAmount(d.asset, start - Number(18, -1)));
-
3840 }
-
3841 });
-
3842
-
3843 testCase(1, [&, this](Env& env, Data d) {
-
3844 testcase("Scale deposit exact, truncating from .99");
-
3845
-
3846 auto const start = env.balance(d.depositor, d.assets).number();
-
3847 // round to 12
-
3848 auto tx = d.vault.deposit(
-
3849 {.depositor = d.depositor,
-
3850 .id = d.keylet.key,
-
3851 .amount = STAmount(d.asset, Number(1299, -3))});
-
3852 env(tx);
-
3853 env.close();
-
3854 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(12));
-
3855 BEAST_EXPECT(
-
3856 env.balance(d.depositor, d.assets) ==
-
3857 STAmount(d.asset, start - Number(12, -1)));
-
3858
-
3859 {
-
3860 // round to 6
-
3861 auto tx = d.vault.deposit(
-
3862 {.depositor = d.depositor,
-
3863 .id = d.keylet.key,
-
3864 .amount = STAmount(d.asset, Number(62, -2))});
-
3865 env(tx);
-
3866 env.close();
-
3867 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(18));
-
3868 BEAST_EXPECT(
-
3869 env.balance(d.depositor, d.assets) ==
-
3870 STAmount(d.asset, start - Number(18, -1)));
-
3871 }
-
3872 });
-
3873
-
3874 testCase(1, [&, this](Env& env, Data d) {
-
3875 // initial setup: deposit 100 IOU, receive 1000 shares
-
3876 auto const start = env.balance(d.depositor, d.assets).number();
-
3877 auto tx = d.vault.deposit(
-
3878 {.depositor = d.depositor,
-
3879 .id = d.keylet.key,
-
3880 .amount = STAmount(d.asset, Number(100, 0))});
-
3881 env(tx);
-
3882 env.close();
-
3883 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(1000));
-
3884 BEAST_EXPECT(
-
3885 env.balance(d.depositor, d.assets) ==
-
3886 STAmount(d.asset, start - Number(100, 0)));
-
3887 BEAST_EXPECT(
-
3888 env.balance(d.vaultAccount, d.assets) ==
-
3889 STAmount(d.asset, Number(100, 0)));
-
3890 BEAST_EXPECT(
-
3891 env.balance(d.vaultAccount, d.shares) ==
-
3892 STAmount(d.share, Number(-1000, 0)));
-
3893
-
3894 {
-
3895 testcase("Scale redeem exact");
-
3896 // sharesToAssetsWithdraw:
-
3897 // assets = assetsTotal * (shares / sharesTotal)
-
3898 // assets = 100 * 100 / 1000 = 100 * 0.1 = 10
-
3899
-
3900 auto const start = env.balance(d.depositor, d.assets).number();
-
3901 auto tx = d.vault.withdraw(
-
3902 {.depositor = d.depositor,
-
3903 .id = d.keylet.key,
-
3904 .amount = STAmount(d.share, Number(100, 0))});
-
3905 env(tx);
-
3906 env.close();
-
3907 BEAST_EXPECT(
-
3908 env.balance(d.depositor, d.shares) == d.share(900));
-
3909 BEAST_EXPECT(
-
3910 env.balance(d.depositor, d.assets) ==
-
3911 STAmount(d.asset, start + Number(10, 0)));
-
3912 BEAST_EXPECT(
-
3913 env.balance(d.vaultAccount, d.assets) ==
-
3914 STAmount(d.asset, Number(90, 0)));
-
3915 BEAST_EXPECT(
-
3916 env.balance(d.vaultAccount, d.shares) ==
-
3917 STAmount(d.share, Number(-900, 0)));
-
3918 }
-
3919
-
3920 {
-
3921 testcase("Scale redeem with rounding");
-
3922 // sharesToAssetsWithdraw:
-
3923 // assets = assetsTotal * (shares / sharesTotal)
-
3924 // assets = 90 * 25 / 900 = 90 * 0.02777... = 2.5
-
3925
-
3926 auto const start = env.balance(d.depositor, d.assets).number();
-
3927 d.peek([](SLE& vault, auto&) -> bool {
-
3928 vault[sfAssetsAvailable] = Number(1);
-
3929 return true;
-
3930 });
-
3931
-
3932 // Note, this transaction fails first (because of above change
-
3933 // in the open ledger) but then succeeds when the ledger is
-
3934 // closed (because a modification like above is not persistent),
-
3935 // which is why the checks below are expected to pass.
-
3936 auto tx = d.vault.withdraw(
-
3937 {.depositor = d.depositor,
-
3938 .id = d.keylet.key,
-
3939 .amount = STAmount(d.share, Number(25, 0))});
-
3940 env(tx, ter{tecINSUFFICIENT_FUNDS});
-
3941 env.close();
-
3942 BEAST_EXPECT(
-
3943 env.balance(d.depositor, d.shares) == d.share(900 - 25));
-
3944 BEAST_EXPECT(
-
3945 env.balance(d.depositor, d.assets) ==
-
3946 STAmount(d.asset, start + Number(25, -1)));
-
3947 BEAST_EXPECT(
-
3948 env.balance(d.vaultAccount, d.assets) ==
-
3949 STAmount(d.asset, Number(900 - 25, -1)));
-
3950 BEAST_EXPECT(
-
3951 env.balance(d.vaultAccount, d.shares) ==
-
3952 STAmount(d.share, -Number(900 - 25, 0)));
-
3953 }
-
3954
-
3955 {
-
3956 testcase("Scale redeem exact");
-
3957 // sharesToAssetsWithdraw:
-
3958 // assets = assetsTotal * (shares / sharesTotal)
-
3959 // assets = 87.5 * 21 / 875 = 87.5 * 0.024 = 2.1
-
3960
-
3961 auto const start = env.balance(d.depositor, d.assets).number();
-
3962
-
3963 tx = d.vault.withdraw(
-
3964 {.depositor = d.depositor,
-
3965 .id = d.keylet.key,
-
3966 .amount = STAmount(d.share, Number(21, 0))});
-
3967 env(tx);
-
3968 env.close();
-
3969 BEAST_EXPECT(
-
3970 env.balance(d.depositor, d.shares) == d.share(875 - 21));
-
3971 BEAST_EXPECT(
-
3972 env.balance(d.depositor, d.assets) ==
-
3973 STAmount(d.asset, start + Number(21, -1)));
-
3974 BEAST_EXPECT(
-
3975 env.balance(d.vaultAccount, d.assets) ==
-
3976 STAmount(d.asset, Number(875 - 21, -1)));
-
3977 BEAST_EXPECT(
-
3978 env.balance(d.vaultAccount, d.shares) ==
-
3979 STAmount(d.share, -Number(875 - 21, 0)));
-
3980 }
-
3981
-
3982 {
-
3983 testcase("Scale redeem rest");
-
3984 auto const rest = env.balance(d.depositor, d.shares).number();
-
3985
-
3986 tx = d.vault.withdraw(
-
3987 {.depositor = d.depositor,
-
3988 .id = d.keylet.key,
-
3989 .amount = STAmount(d.share, rest)});
-
3990 env(tx);
-
3991 env.close();
-
3992 BEAST_EXPECT(env.balance(d.depositor, d.shares).number() == 0);
-
3993 BEAST_EXPECT(
-
3994 env.balance(d.vaultAccount, d.assets).number() == 0);
-
3995 BEAST_EXPECT(
-
3996 env.balance(d.vaultAccount, d.shares).number() == 0);
-
3997 }
-
3998 });
-
3999
-
4000 testCase(18, [&, this](Env& env, Data d) {
-
4001 testcase("Scale withdraw overflow");
-
4002
-
4003 {
-
4004 auto tx = d.vault.deposit(
-
4005 {.depositor = d.depositor,
-
4006 .id = d.keylet.key,
-
4007 .amount = d.asset(5)});
-
4008 env(tx);
-
4009 env.close();
-
4010 }
-
4011
-
4012 {
-
4013 auto tx = d.vault.withdraw(
-
4014 {.depositor = d.depositor,
-
4015 .id = d.keylet.key,
-
4016 .amount = STAmount(d.asset, Number(10, 0))});
-
4017 env(tx, ter{tecPATH_DRY});
-
4018 env.close();
-
4019 }
-
4020 });
-
4021
-
4022 testCase(1, [&, this](Env& env, Data d) {
-
4023 // initial setup: deposit 100 IOU, receive 1000 shares
-
4024 auto const start = env.balance(d.depositor, d.assets).number();
-
4025 auto tx = d.vault.deposit(
-
4026 {.depositor = d.depositor,
-
4027 .id = d.keylet.key,
-
4028 .amount = STAmount(d.asset, Number(100, 0))});
-
4029 env(tx);
-
4030 env.close();
-
4031 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(1000));
-
4032 BEAST_EXPECT(
-
4033 env.balance(d.depositor, d.assets) ==
-
4034 STAmount(d.asset, start - Number(100, 0)));
-
4035 BEAST_EXPECT(
-
4036 env.balance(d.vaultAccount, d.assets) ==
-
4037 STAmount(d.asset, Number(100, 0)));
-
4038 BEAST_EXPECT(
-
4039 env.balance(d.vaultAccount, d.shares) ==
-
4040 STAmount(d.share, Number(-1000, 0)));
-
4041
-
4042 {
-
4043 testcase("Scale withdraw exact");
-
4044 // assetsToSharesWithdraw:
-
4045 // shares = sharesTotal * (assets / assetsTotal)
-
4046 // shares = 1000 * 10 / 100 = 1000 * 0.1 = 100
-
4047 // sharesToAssetsWithdraw:
-
4048 // assets = assetsTotal * (shares / sharesTotal)
-
4049 // assets = 100 * 100 / 1000 = 100 * 0.1 = 10
-
4050
-
4051 auto const start = env.balance(d.depositor, d.assets).number();
-
4052 auto tx = d.vault.withdraw(
-
4053 {.depositor = d.depositor,
-
4054 .id = d.keylet.key,
-
4055 .amount = STAmount(d.asset, Number(10, 0))});
-
4056 env(tx);
-
4057 env.close();
-
4058 BEAST_EXPECT(
-
4059 env.balance(d.depositor, d.shares) == d.share(900));
-
4060 BEAST_EXPECT(
-
4061 env.balance(d.depositor, d.assets) ==
-
4062 STAmount(d.asset, start + Number(10, 0)));
-
4063 BEAST_EXPECT(
-
4064 env.balance(d.vaultAccount, d.assets) ==
-
4065 STAmount(d.asset, Number(90, 0)));
-
4066 BEAST_EXPECT(
-
4067 env.balance(d.vaultAccount, d.shares) ==
-
4068 STAmount(d.share, Number(-900, 0)));
-
4069 }
-
4070
-
4071 {
-
4072 testcase("Scale withdraw insignificant amount");
-
4073 auto tx = d.vault.withdraw(
-
4074 {.depositor = d.depositor,
-
4075 .id = d.keylet.key,
-
4076 .amount = STAmount(d.asset, Number(4, -2))});
-
4077 env(tx, ter{tecPRECISION_LOSS});
-
4078 }
-
4079
-
4080 {
-
4081 testcase("Scale withdraw with rounding assets");
-
4082 // assetsToSharesWithdraw:
-
4083 // shares = sharesTotal * (assets / assetsTotal)
-
4084 // shares = 900 * 2.5 / 90 = 900 * 0.02777... = 25
-
4085 // sharesToAssetsWithdraw:
-
4086 // assets = assetsTotal * (shares / sharesTotal)
-
4087 // assets = 90 * 25 / 900 = 90 * 0.02777... = 2.5
-
4088
-
4089 auto const start = env.balance(d.depositor, d.assets).number();
-
4090 d.peek([](SLE& vault, auto&) -> bool {
-
4091 vault[sfAssetsAvailable] = Number(1);
-
4092 return true;
-
4093 });
-
4094
-
4095 // Note, this transaction fails first (because of above change
-
4096 // in the open ledger) but then succeeds when the ledger is
-
4097 // closed (because a modification like above is not persistent),
-
4098 // which is why the checks below are expected to pass.
-
4099 auto tx = d.vault.withdraw(
-
4100 {.depositor = d.depositor,
-
4101 .id = d.keylet.key,
-
4102 .amount = STAmount(d.asset, Number(25, -1))});
-
4103 env(tx, ter{tecINSUFFICIENT_FUNDS});
-
4104 env.close();
-
4105 BEAST_EXPECT(
-
4106 env.balance(d.depositor, d.shares) == d.share(900 - 25));
-
4107 BEAST_EXPECT(
-
4108 env.balance(d.depositor, d.assets) ==
-
4109 STAmount(d.asset, start + Number(25, -1)));
-
4110 BEAST_EXPECT(
-
4111 env.balance(d.vaultAccount, d.assets) ==
-
4112 STAmount(d.asset, Number(900 - 25, -1)));
-
4113 BEAST_EXPECT(
-
4114 env.balance(d.vaultAccount, d.shares) ==
-
4115 STAmount(d.share, -Number(900 - 25, 0)));
-
4116 }
-
4117
-
4118 {
-
4119 testcase("Scale withdraw with rounding shares up");
-
4120 // assetsToSharesWithdraw:
-
4121 // shares = sharesTotal * (assets / assetsTotal)
-
4122 // shares = 875 * 3.75 / 87.5 = 875 * 0.042857... = 37.5
-
4123 // sharesToAssetsWithdraw:
-
4124 // assets = assetsTotal * (shares / sharesTotal)
-
4125 // assets = 87.5 * 38 / 875 = 87.5 * 0.043428... = 3.8
-
4126
-
4127 auto const start = env.balance(d.depositor, d.assets).number();
-
4128 auto tx = d.vault.withdraw(
-
4129 {.depositor = d.depositor,
-
4130 .id = d.keylet.key,
-
4131 .amount = STAmount(d.asset, Number(375, -2))});
-
4132 env(tx);
-
4133 env.close();
-
4134 BEAST_EXPECT(
-
4135 env.balance(d.depositor, d.shares) == d.share(875 - 38));
-
4136 BEAST_EXPECT(
-
4137 env.balance(d.depositor, d.assets) ==
-
4138 STAmount(d.asset, start + Number(38, -1)));
-
4139 BEAST_EXPECT(
-
4140 env.balance(d.vaultAccount, d.assets) ==
-
4141 STAmount(d.asset, Number(875 - 38, -1)));
-
4142 BEAST_EXPECT(
-
4143 env.balance(d.vaultAccount, d.shares) ==
-
4144 STAmount(d.share, -Number(875 - 38, 0)));
-
4145 }
-
4146
-
4147 {
-
4148 testcase("Scale withdraw with rounding shares down");
-
4149 // assetsToSharesWithdraw:
-
4150 // shares = sharesTotal * (assets / assetsTotal)
-
4151 // shares = 837 * 3.72 / 83.7 = 837 * 0.04444... = 37.2
-
4152 // sharesToAssetsWithdraw:
-
4153 // assets = assetsTotal * (shares / sharesTotal)
-
4154 // assets = 83.7 * 37 / 837 = 83.7 * 0.044205... = 3.7
-
4155
-
4156 auto const start = env.balance(d.depositor, d.assets).number();
-
4157 auto tx = d.vault.withdraw(
-
4158 {.depositor = d.depositor,
-
4159 .id = d.keylet.key,
-
4160 .amount = STAmount(d.asset, Number(372, -2))});
-
4161 env(tx);
-
4162 env.close();
-
4163 BEAST_EXPECT(
-
4164 env.balance(d.depositor, d.shares) == d.share(837 - 37));
-
4165 BEAST_EXPECT(
-
4166 env.balance(d.depositor, d.assets) ==
-
4167 STAmount(d.asset, start + Number(37, -1)));
-
4168 BEAST_EXPECT(
-
4169 env.balance(d.vaultAccount, d.assets) ==
-
4170 STAmount(d.asset, Number(837 - 37, -1)));
-
4171 BEAST_EXPECT(
-
4172 env.balance(d.vaultAccount, d.shares) ==
-
4173 STAmount(d.share, -Number(837 - 37, 0)));
-
4174 }
-
4175
-
4176 {
-
4177 testcase("Scale withdraw tiny amount");
-
4178
-
4179 auto const start = env.balance(d.depositor, d.assets).number();
-
4180 auto tx = d.vault.withdraw(
-
4181 {.depositor = d.depositor,
-
4182 .id = d.keylet.key,
-
4183 .amount = STAmount(d.asset, Number(9, -2))});
-
4184 env(tx);
-
4185 env.close();
-
4186 BEAST_EXPECT(
-
4187 env.balance(d.depositor, d.shares) == d.share(800 - 1));
-
4188 BEAST_EXPECT(
-
4189 env.balance(d.depositor, d.assets) ==
-
4190 STAmount(d.asset, start + Number(1, -1)));
-
4191 BEAST_EXPECT(
-
4192 env.balance(d.vaultAccount, d.assets) ==
-
4193 STAmount(d.asset, Number(800 - 1, -1)));
-
4194 BEAST_EXPECT(
-
4195 env.balance(d.vaultAccount, d.shares) ==
-
4196 STAmount(d.share, -Number(800 - 1, 0)));
-
4197 }
-
4198
-
4199 {
-
4200 testcase("Scale withdraw rest");
-
4201 auto const rest =
-
4202 env.balance(d.vaultAccount, d.assets).number();
-
4203
-
4204 tx = d.vault.withdraw(
-
4205 {.depositor = d.depositor,
-
4206 .id = d.keylet.key,
-
4207 .amount = STAmount(d.asset, rest)});
-
4208 env(tx);
-
4209 env.close();
-
4210 BEAST_EXPECT(env.balance(d.depositor, d.shares).number() == 0);
-
4211 BEAST_EXPECT(
-
4212 env.balance(d.vaultAccount, d.assets).number() == 0);
-
4213 BEAST_EXPECT(
-
4214 env.balance(d.vaultAccount, d.shares).number() == 0);
-
4215 }
-
4216 });
-
4217
-
4218 testCase(18, [&, this](Env& env, Data d) {
-
4219 testcase("Scale clawback overflow");
-
4220
-
4221 {
-
4222 auto tx = d.vault.deposit(
-
4223 {.depositor = d.depositor,
-
4224 .id = d.keylet.key,
-
4225 .amount = d.asset(5)});
-
4226 env(tx);
-
4227 env.close();
-
4228 }
-
4229
-
4230 {
-
4231 auto tx = d.vault.clawback(
-
4232 {.issuer = d.issuer,
-
4233 .id = d.keylet.key,
-
4234 .holder = d.depositor,
-
4235 .amount = STAmount(d.asset, Number(10, 0))});
-
4236 env(tx, ter{tecPATH_DRY});
-
4237 env.close();
-
4238 }
-
4239 });
-
4240
-
4241 testCase(1, [&, this](Env& env, Data d) {
-
4242 // initial setup: deposit 100 IOU, receive 1000 shares
-
4243 auto const start = env.balance(d.depositor, d.assets).number();
-
4244 auto tx = d.vault.deposit(
-
4245 {.depositor = d.depositor,
-
4246 .id = d.keylet.key,
-
4247 .amount = STAmount(d.asset, Number(100, 0))});
-
4248 env(tx);
-
4249 env.close();
-
4250 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(1000));
-
4251 BEAST_EXPECT(
-
4252 env.balance(d.depositor, d.assets) ==
-
4253 STAmount(d.asset, start - Number(100, 0)));
-
4254 BEAST_EXPECT(
-
4255 env.balance(d.vaultAccount, d.assets) ==
-
4256 STAmount(d.asset, Number(100, 0)));
-
4257 BEAST_EXPECT(
-
4258 env.balance(d.vaultAccount, d.shares) ==
-
4259 STAmount(d.share, -Number(1000, 0)));
-
4260 {
-
4261 testcase("Scale clawback exact");
-
4262 // assetsToSharesWithdraw:
-
4263 // shares = sharesTotal * (assets / assetsTotal)
-
4264 // shares = 1000 * 10 / 100 = 1000 * 0.1 = 100
-
4265 // sharesToAssetsWithdraw:
-
4266 // assets = assetsTotal * (shares / sharesTotal)
-
4267 // assets = 100 * 100 / 1000 = 100 * 0.1 = 10
-
4268
-
4269 auto const start = env.balance(d.depositor, d.assets).number();
-
4270 auto tx = d.vault.clawback(
-
4271 {.issuer = d.issuer,
-
4272 .id = d.keylet.key,
-
4273 .holder = d.depositor,
-
4274 .amount = STAmount(d.asset, Number(10, 0))});
-
4275 env(tx);
-
4276 env.close();
-
4277 BEAST_EXPECT(
-
4278 env.balance(d.depositor, d.shares) == d.share(900));
-
4279 BEAST_EXPECT(
-
4280 env.balance(d.depositor, d.assets) ==
-
4281 STAmount(d.asset, start));
-
4282 BEAST_EXPECT(
-
4283 env.balance(d.vaultAccount, d.assets) ==
-
4284 STAmount(d.asset, Number(90, 0)));
-
4285 BEAST_EXPECT(
-
4286 env.balance(d.vaultAccount, d.shares) ==
-
4287 STAmount(d.share, -Number(900, 0)));
-
4288 }
-
4289
-
4290 {
-
4291 testcase("Scale clawback insignificant amount");
-
4292 auto tx = d.vault.clawback(
-
4293 {.issuer = d.issuer,
-
4294 .id = d.keylet.key,
-
4295 .holder = d.depositor,
-
4296 .amount = STAmount(d.asset, Number(4, -2))});
-
4297 env(tx, ter{tecPRECISION_LOSS});
-
4298 }
-
4299
-
4300 {
-
4301 testcase("Scale clawback with rounding assets");
-
4302 // assetsToSharesWithdraw:
-
4303 // shares = sharesTotal * (assets / assetsTotal)
-
4304 // shares = 900 * 2.5 / 90 = 900 * 0.02777... = 25
-
4305 // sharesToAssetsWithdraw:
-
4306 // assets = assetsTotal * (shares / sharesTotal)
-
4307 // assets = 90 * 25 / 900 = 90 * 0.02777... = 2.5
-
4308
-
4309 auto const start = env.balance(d.depositor, d.assets).number();
-
4310 auto tx = d.vault.clawback(
-
4311 {.issuer = d.issuer,
-
4312 .id = d.keylet.key,
-
4313 .holder = d.depositor,
-
4314 .amount = STAmount(d.asset, Number(25, -1))});
-
4315 env(tx);
-
4316 env.close();
-
4317 BEAST_EXPECT(
-
4318 env.balance(d.depositor, d.shares) == d.share(900 - 25));
-
4319 BEAST_EXPECT(
-
4320 env.balance(d.depositor, d.assets) ==
-
4321 STAmount(d.asset, start));
-
4322 BEAST_EXPECT(
-
4323 env.balance(d.vaultAccount, d.assets) ==
-
4324 STAmount(d.asset, Number(900 - 25, -1)));
-
4325 BEAST_EXPECT(
-
4326 env.balance(d.vaultAccount, d.shares) ==
-
4327 STAmount(d.share, -Number(900 - 25, 0)));
-
4328 }
-
4329
-
4330 {
-
4331 testcase("Scale clawback with rounding shares up");
-
4332 // assetsToSharesWithdraw:
-
4333 // shares = sharesTotal * (assets / assetsTotal)
-
4334 // shares = 875 * 3.75 / 87.5 = 875 * 0.042857... = 37.5
-
4335 // sharesToAssetsWithdraw:
-
4336 // assets = assetsTotal * (shares / sharesTotal)
-
4337 // assets = 87.5 * 38 / 875 = 87.5 * 0.043428... = 3.8
-
4338
-
4339 auto const start = env.balance(d.depositor, d.assets).number();
-
4340 auto tx = d.vault.clawback(
-
4341 {.issuer = d.issuer,
-
4342 .id = d.keylet.key,
-
4343 .holder = d.depositor,
-
4344 .amount = STAmount(d.asset, Number(375, -2))});
-
4345 env(tx);
-
4346 env.close();
-
4347 BEAST_EXPECT(
-
4348 env.balance(d.depositor, d.shares) == d.share(875 - 38));
-
4349 BEAST_EXPECT(
-
4350 env.balance(d.depositor, d.assets) ==
-
4351 STAmount(d.asset, start));
-
4352 BEAST_EXPECT(
-
4353 env.balance(d.vaultAccount, d.assets) ==
-
4354 STAmount(d.asset, Number(875 - 38, -1)));
-
4355 BEAST_EXPECT(
-
4356 env.balance(d.vaultAccount, d.shares) ==
-
4357 STAmount(d.share, -Number(875 - 38, 0)));
-
4358 }
-
4359
-
4360 {
-
4361 testcase("Scale clawback with rounding shares down");
-
4362 // assetsToSharesWithdraw:
-
4363 // shares = sharesTotal * (assets / assetsTotal)
-
4364 // shares = 837 * 3.72 / 83.7 = 837 * 0.04444... = 37.2
-
4365 // sharesToAssetsWithdraw:
-
4366 // assets = assetsTotal * (shares / sharesTotal)
-
4367 // assets = 83.7 * 37 / 837 = 83.7 * 0.044205... = 3.7
-
4368
-
4369 auto const start = env.balance(d.depositor, d.assets).number();
-
4370 auto tx = d.vault.clawback(
-
4371 {.issuer = d.issuer,
-
4372 .id = d.keylet.key,
-
4373 .holder = d.depositor,
-
4374 .amount = STAmount(d.asset, Number(372, -2))});
-
4375 env(tx);
-
4376 env.close();
-
4377 BEAST_EXPECT(
-
4378 env.balance(d.depositor, d.shares) == d.share(837 - 37));
-
4379 BEAST_EXPECT(
-
4380 env.balance(d.depositor, d.assets) ==
-
4381 STAmount(d.asset, start));
-
4382 BEAST_EXPECT(
-
4383 env.balance(d.vaultAccount, d.assets) ==
-
4384 STAmount(d.asset, Number(837 - 37, -1)));
-
4385 BEAST_EXPECT(
-
4386 env.balance(d.vaultAccount, d.shares) ==
-
4387 STAmount(d.share, -Number(837 - 37, 0)));
-
4388 }
-
4389
-
4390 {
-
4391 testcase("Scale clawback tiny amount");
-
4392
-
4393 auto const start = env.balance(d.depositor, d.assets).number();
-
4394 auto tx = d.vault.clawback(
-
4395 {.issuer = d.issuer,
-
4396 .id = d.keylet.key,
-
4397 .holder = d.depositor,
-
4398 .amount = STAmount(d.asset, Number(9, -2))});
-
4399 env(tx);
-
4400 env.close();
-
4401 BEAST_EXPECT(
-
4402 env.balance(d.depositor, d.shares) == d.share(800 - 1));
-
4403 BEAST_EXPECT(
-
4404 env.balance(d.depositor, d.assets) ==
-
4405 STAmount(d.asset, start));
-
4406 BEAST_EXPECT(
-
4407 env.balance(d.vaultAccount, d.assets) ==
-
4408 STAmount(d.asset, Number(800 - 1, -1)));
-
4409 BEAST_EXPECT(
-
4410 env.balance(d.vaultAccount, d.shares) ==
-
4411 STAmount(d.share, -Number(800 - 1, 0)));
-
4412 }
-
4413
-
4414 {
-
4415 testcase("Scale clawback rest");
-
4416 auto const rest =
-
4417 env.balance(d.vaultAccount, d.assets).number();
-
4418 d.peek([](SLE& vault, auto&) -> bool {
-
4419 vault[sfAssetsAvailable] = Number(5);
-
4420 return true;
-
4421 });
-
4422
-
4423 // Note, this transaction yields two different results:
-
4424 // * in the open ledger, with AssetsAvailable = 5
-
4425 // * when the ledger is closed with unmodified AssetsAvailable
-
4426 // because a modification like above is not persistent.
-
4427 tx = d.vault.clawback(
-
4428 {.issuer = d.issuer,
-
4429 .id = d.keylet.key,
-
4430 .holder = d.depositor,
-
4431 .amount = STAmount(d.asset, rest)});
-
4432 env(tx);
-
4433 env.close();
-
4434 BEAST_EXPECT(env.balance(d.depositor, d.shares).number() == 0);
-
4435 BEAST_EXPECT(
-
4436 env.balance(d.vaultAccount, d.assets).number() == 0);
-
4437 BEAST_EXPECT(
-
4438 env.balance(d.vaultAccount, d.shares).number() == 0);
-
4439 }
-
4440 });
-
4441 }
+
3579 auto [tx, keylet1] =
+
3580 vault.create({.owner = owner, .asset = xrpIssue()});
+
3581 BEAST_EXPECT(keylet.key == keylet1.key);
+
3582 env(tx, ter{terADDRESS_COLLISION});
+
3583 }
-
4442
-
4443 void
-
- -
4445 {
-
4446 using namespace test::jtx;
-
4447
-
4448 testcase("RPC");
-
4449 Env env{*this, testable_amendments() | featureSingleAssetVault};
-
4450 Account const owner{"owner"};
-
4451 Account const issuer{"issuer"};
-
4452 Vault vault{env};
-
4453 env.fund(XRP(1000), issuer, owner);
-
4454 env.close();
-
4455
-
4456 PrettyAsset asset = issuer["IOU"];
-
4457 env.trust(asset(1000), owner);
-
4458 env(pay(issuer, owner, asset(200)));
-
4459 env.close();
-
4460
-
4461 auto const sequence = env.seq(owner);
-
4462 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
-
4463 env(tx);
-
4464 env.close();
-
4465
-
4466 // Set some fields
-
4467 {
-
4468 auto tx1 = vault.deposit(
-
4469 {.depositor = owner, .id = keylet.key, .amount = asset(50)});
-
4470 env(tx1);
+
3584
+
3585 void
+
+ +
3587 {
+
3588 using namespace test::jtx;
+
3589
+
3590 struct Data
+
3591 {
+
3592 Account const& owner;
+
3593 Account const& issuer;
+
3594 Account const& depositor;
+
3595 Account const& vaultAccount;
+
3596 MPTIssue shares;
+
3597 PrettyAsset const& share;
+
3598 Vault& vault;
+
3599 ripple::Keylet keylet;
+
3600 Issue assets;
+
3601 PrettyAsset const& asset;
+
3602 std::function<bool(std::function<bool(SLE&, SLE&)>)> peek;
+
3603 };
+
3604
+
3605 auto testCase = [&, this](
+
3606 std::uint8_t scale,
+
3607 std::function<void(Env & env, Data data)> test) {
+
3608 Env env{*this, testable_amendments() | featureSingleAssetVault};
+
3609 Account const owner{"owner"};
+
3610 Account const issuer{"issuer"};
+
3611 Account const depositor{"depositor"};
+
3612 Vault vault{env};
+
3613 env.fund(XRP(1000), issuer, owner, depositor);
+
3614 env(fset(issuer, asfAllowTrustLineClawback));
+
3615 env.close();
+
3616
+
3617 PrettyAsset const asset = issuer["IOU"];
+
3618 env.trust(asset(1000), owner);
+
3619 env.trust(asset(1000), depositor);
+
3620 env(pay(issuer, owner, asset(200)));
+
3621 env(pay(issuer, depositor, asset(200)));
+
3622 env.close();
+
3623
+
3624 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
+
3625 tx[sfScale] = scale;
+
3626 env(tx);
+
3627
+
3628 auto const [vaultAccount, issuanceId] =
+
3629 [&env](ripple::Keylet keylet) -> std::tuple<Account, MPTID> {
+
3630 auto const vault = env.le(keylet);
+
3631 return {
+
3632 Account("vault", vault->at(sfAccount)),
+
3633 vault->at(sfShareMPTID)};
+
3634 }(keylet);
+
3635 MPTIssue shares(issuanceId);
+
3636 env.memoize(vaultAccount);
+
3637
+
3638 auto const peek =
+
3639 [=, &env, this](std::function<bool(SLE&, SLE&)> fn) -> bool {
+
3640 return env.app().openLedger().modify(
+
3641 [&](OpenView& view, beast::Journal j) -> bool {
+
3642 Sandbox sb(&view, tapNONE);
+
3643 auto vault = sb.peek(keylet::vault(keylet.key));
+
3644 if (!BEAST_EXPECT(vault != nullptr))
+
3645 return false;
+
3646 auto shares = sb.peek(
+
3647 keylet::mptIssuance(vault->at(sfShareMPTID)));
+
3648 if (!BEAST_EXPECT(shares != nullptr))
+
3649 return false;
+
3650 if (fn(*vault, *shares))
+
3651 {
+
3652 sb.update(vault);
+
3653 sb.update(shares);
+
3654 sb.apply(view);
+
3655 return true;
+
3656 }
+
3657 return false;
+
3658 });
+
3659 };
+
3660
+
3661 test(
+
3662 env,
+
3663 {.owner = owner,
+
3664 .issuer = issuer,
+
3665 .depositor = depositor,
+
3666 .vaultAccount = vaultAccount,
+
3667 .shares = shares,
+
3668 .share = PrettyAsset(shares),
+
3669 .vault = vault,
+
3670 .keylet = keylet,
+
3671 .assets = asset.raw().get<Issue>(),
+
3672 .asset = asset,
+
3673 .peek = peek});
+
3674 };
+
3675
+
3676 testCase(18, [&, this](Env& env, Data d) {
+
3677 testcase("Scale deposit overflow on first deposit");
+
3678 auto tx = d.vault.deposit(
+
3679 {.depositor = d.depositor,
+
3680 .id = d.keylet.key,
+
3681 .amount = d.asset(10)});
+
3682 env(tx, ter{tecPATH_DRY});
+
3683 env.close();
+
3684 });
+
3685
+
3686 testCase(18, [&, this](Env& env, Data d) {
+
3687 testcase("Scale deposit overflow on second deposit");
+
3688
+
3689 {
+
3690 auto tx = d.vault.deposit(
+
3691 {.depositor = d.depositor,
+
3692 .id = d.keylet.key,
+
3693 .amount = d.asset(5)});
+
3694 env(tx);
+
3695 env.close();
+
3696 }
+
3697
+
3698 {
+
3699 auto tx = d.vault.deposit(
+
3700 {.depositor = d.depositor,
+
3701 .id = d.keylet.key,
+
3702 .amount = d.asset(10)});
+
3703 env(tx, ter{tecPATH_DRY});
+
3704 env.close();
+
3705 }
+
3706 });
+
3707
+
3708 testCase(18, [&, this](Env& env, Data d) {
+
3709 testcase("Scale deposit overflow on total shares");
+
3710
+
3711 {
+
3712 auto tx = d.vault.deposit(
+
3713 {.depositor = d.depositor,
+
3714 .id = d.keylet.key,
+
3715 .amount = d.asset(5)});
+
3716 env(tx);
+
3717 env.close();
+
3718 }
+
3719
+
3720 {
+
3721 auto tx = d.vault.deposit(
+
3722 {.depositor = d.depositor,
+
3723 .id = d.keylet.key,
+
3724 .amount = d.asset(5)});
+
3725 env(tx, ter{tecPATH_DRY});
+
3726 env.close();
+
3727 }
+
3728 });
+
3729
+
3730 testCase(1, [&, this](Env& env, Data d) {
+
3731 testcase("Scale deposit exact");
+
3732
+
3733 auto const start = env.balance(d.depositor, d.assets).number();
+
3734 auto tx = d.vault.deposit(
+
3735 {.depositor = d.depositor,
+
3736 .id = d.keylet.key,
+
3737 .amount = d.asset(1)});
+
3738 env(tx);
+
3739 env.close();
+
3740 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(10));
+
3741 BEAST_EXPECT(
+
3742 env.balance(d.depositor, d.assets) ==
+
3743 STAmount(d.asset, start - 1));
+
3744 });
+
3745
+
3746 testCase(1, [&, this](Env& env, Data d) {
+
3747 testcase("Scale deposit insignificant amount");
+
3748
+
3749 auto tx = d.vault.deposit(
+
3750 {.depositor = d.depositor,
+
3751 .id = d.keylet.key,
+
3752 .amount = STAmount(d.asset, Number(9, -2))});
+
3753 env(tx, ter{tecPRECISION_LOSS});
+
3754 });
+
3755
+
3756 testCase(1, [&, this](Env& env, Data d) {
+
3757 testcase("Scale deposit exact, using full precision");
+
3758
+
3759 auto const start = env.balance(d.depositor, d.assets).number();
+
3760 auto tx = d.vault.deposit(
+
3761 {.depositor = d.depositor,
+
3762 .id = d.keylet.key,
+
3763 .amount = STAmount(d.asset, Number(15, -1))});
+
3764 env(tx);
+
3765 env.close();
+
3766 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(15));
+
3767 BEAST_EXPECT(
+
3768 env.balance(d.depositor, d.assets) ==
+
3769 STAmount(d.asset, start - Number(15, -1)));
+
3770 });
+
3771
+
3772 testCase(1, [&, this](Env& env, Data d) {
+
3773 testcase("Scale deposit exact, truncating from .5");
+
3774
+
3775 auto const start = env.balance(d.depositor, d.assets).number();
+
3776 // Each of the cases below will transfer exactly 1.2 IOU to the
+
3777 // vault and receive 12 shares in exchange
+
3778 {
+
3779 auto tx = d.vault.deposit(
+
3780 {.depositor = d.depositor,
+
3781 .id = d.keylet.key,
+
3782 .amount = STAmount(d.asset, Number(125, -2))});
+
3783 env(tx);
+
3784 env.close();
+
3785 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(12));
+
3786 BEAST_EXPECT(
+
3787 env.balance(d.depositor, d.assets) ==
+
3788 STAmount(d.asset, start - Number(12, -1)));
+
3789 }
+
3790
+
3791 {
+
3792 auto tx = d.vault.deposit(
+
3793 {.depositor = d.depositor,
+
3794 .id = d.keylet.key,
+
3795 .amount = STAmount(d.asset, Number(1201, -3))});
+
3796 env(tx);
+
3797 env.close();
+
3798 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(24));
+
3799 BEAST_EXPECT(
+
3800 env.balance(d.depositor, d.assets) ==
+
3801 STAmount(d.asset, start - Number(24, -1)));
+
3802 }
+
3803
+
3804 {
+
3805 auto tx = d.vault.deposit(
+
3806 {.depositor = d.depositor,
+
3807 .id = d.keylet.key,
+
3808 .amount = STAmount(d.asset, Number(1299, -3))});
+
3809 env(tx);
+
3810 env.close();
+
3811 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(36));
+
3812 BEAST_EXPECT(
+
3813 env.balance(d.depositor, d.assets) ==
+
3814 STAmount(d.asset, start - Number(36, -1)));
+
3815 }
+
3816 });
+
3817
+
3818 testCase(1, [&, this](Env& env, Data d) {
+
3819 testcase("Scale deposit exact, truncating from .01");
+
3820
+
3821 auto const start = env.balance(d.depositor, d.assets).number();
+
3822 // round to 12
+
3823 auto tx = d.vault.deposit(
+
3824 {.depositor = d.depositor,
+
3825 .id = d.keylet.key,
+
3826 .amount = STAmount(d.asset, Number(1201, -3))});
+
3827 env(tx);
+
3828 env.close();
+
3829 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(12));
+
3830 BEAST_EXPECT(
+
3831 env.balance(d.depositor, d.assets) ==
+
3832 STAmount(d.asset, start - Number(12, -1)));
+
3833
+
3834 {
+
3835 // round to 6
+
3836 auto tx = d.vault.deposit(
+
3837 {.depositor = d.depositor,
+
3838 .id = d.keylet.key,
+
3839 .amount = STAmount(d.asset, Number(69, -2))});
+
3840 env(tx);
+
3841 env.close();
+
3842 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(18));
+
3843 BEAST_EXPECT(
+
3844 env.balance(d.depositor, d.assets) ==
+
3845 STAmount(d.asset, start - Number(18, -1)));
+
3846 }
+
3847 });
+
3848
+
3849 testCase(1, [&, this](Env& env, Data d) {
+
3850 testcase("Scale deposit exact, truncating from .99");
+
3851
+
3852 auto const start = env.balance(d.depositor, d.assets).number();
+
3853 // round to 12
+
3854 auto tx = d.vault.deposit(
+
3855 {.depositor = d.depositor,
+
3856 .id = d.keylet.key,
+
3857 .amount = STAmount(d.asset, Number(1299, -3))});
+
3858 env(tx);
+
3859 env.close();
+
3860 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(12));
+
3861 BEAST_EXPECT(
+
3862 env.balance(d.depositor, d.assets) ==
+
3863 STAmount(d.asset, start - Number(12, -1)));
+
3864
+
3865 {
+
3866 // round to 6
+
3867 auto tx = d.vault.deposit(
+
3868 {.depositor = d.depositor,
+
3869 .id = d.keylet.key,
+
3870 .amount = STAmount(d.asset, Number(62, -2))});
+
3871 env(tx);
+
3872 env.close();
+
3873 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(18));
+
3874 BEAST_EXPECT(
+
3875 env.balance(d.depositor, d.assets) ==
+
3876 STAmount(d.asset, start - Number(18, -1)));
+
3877 }
+
3878 });
+
3879
+
3880 testCase(1, [&, this](Env& env, Data d) {
+
3881 // initial setup: deposit 100 IOU, receive 1000 shares
+
3882 auto const start = env.balance(d.depositor, d.assets).number();
+
3883 auto tx = d.vault.deposit(
+
3884 {.depositor = d.depositor,
+
3885 .id = d.keylet.key,
+
3886 .amount = STAmount(d.asset, Number(100, 0))});
+
3887 env(tx);
+
3888 env.close();
+
3889 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(1000));
+
3890 BEAST_EXPECT(
+
3891 env.balance(d.depositor, d.assets) ==
+
3892 STAmount(d.asset, start - Number(100, 0)));
+
3893 BEAST_EXPECT(
+
3894 env.balance(d.vaultAccount, d.assets) ==
+
3895 STAmount(d.asset, Number(100, 0)));
+
3896 BEAST_EXPECT(
+
3897 env.balance(d.vaultAccount, d.shares) ==
+
3898 STAmount(d.share, Number(-1000, 0)));
+
3899
+
3900 {
+
3901 testcase("Scale redeem exact");
+
3902 // sharesToAssetsWithdraw:
+
3903 // assets = assetsTotal * (shares / sharesTotal)
+
3904 // assets = 100 * 100 / 1000 = 100 * 0.1 = 10
+
3905
+
3906 auto const start = env.balance(d.depositor, d.assets).number();
+
3907 auto tx = d.vault.withdraw(
+
3908 {.depositor = d.depositor,
+
3909 .id = d.keylet.key,
+
3910 .amount = STAmount(d.share, Number(100, 0))});
+
3911 env(tx);
+
3912 env.close();
+
3913 BEAST_EXPECT(
+
3914 env.balance(d.depositor, d.shares) == d.share(900));
+
3915 BEAST_EXPECT(
+
3916 env.balance(d.depositor, d.assets) ==
+
3917 STAmount(d.asset, start + Number(10, 0)));
+
3918 BEAST_EXPECT(
+
3919 env.balance(d.vaultAccount, d.assets) ==
+
3920 STAmount(d.asset, Number(90, 0)));
+
3921 BEAST_EXPECT(
+
3922 env.balance(d.vaultAccount, d.shares) ==
+
3923 STAmount(d.share, Number(-900, 0)));
+
3924 }
+
3925
+
3926 {
+
3927 testcase("Scale redeem with rounding");
+
3928 // sharesToAssetsWithdraw:
+
3929 // assets = assetsTotal * (shares / sharesTotal)
+
3930 // assets = 90 * 25 / 900 = 90 * 0.02777... = 2.5
+
3931
+
3932 auto const start = env.balance(d.depositor, d.assets).number();
+
3933 d.peek([](SLE& vault, auto&) -> bool {
+
3934 vault[sfAssetsAvailable] = Number(1);
+
3935 return true;
+
3936 });
+
3937
+
3938 // Note, this transaction fails first (because of above change
+
3939 // in the open ledger) but then succeeds when the ledger is
+
3940 // closed (because a modification like above is not persistent),
+
3941 // which is why the checks below are expected to pass.
+
3942 auto tx = d.vault.withdraw(
+
3943 {.depositor = d.depositor,
+
3944 .id = d.keylet.key,
+
3945 .amount = STAmount(d.share, Number(25, 0))});
+
3946 env(tx, ter{tecINSUFFICIENT_FUNDS});
+
3947 env.close();
+
3948 BEAST_EXPECT(
+
3949 env.balance(d.depositor, d.shares) == d.share(900 - 25));
+
3950 BEAST_EXPECT(
+
3951 env.balance(d.depositor, d.assets) ==
+
3952 STAmount(d.asset, start + Number(25, -1)));
+
3953 BEAST_EXPECT(
+
3954 env.balance(d.vaultAccount, d.assets) ==
+
3955 STAmount(d.asset, Number(900 - 25, -1)));
+
3956 BEAST_EXPECT(
+
3957 env.balance(d.vaultAccount, d.shares) ==
+
3958 STAmount(d.share, -Number(900 - 25, 0)));
+
3959 }
+
3960
+
3961 {
+
3962 testcase("Scale redeem exact");
+
3963 // sharesToAssetsWithdraw:
+
3964 // assets = assetsTotal * (shares / sharesTotal)
+
3965 // assets = 87.5 * 21 / 875 = 87.5 * 0.024 = 2.1
+
3966
+
3967 auto const start = env.balance(d.depositor, d.assets).number();
+
3968
+
3969 tx = d.vault.withdraw(
+
3970 {.depositor = d.depositor,
+
3971 .id = d.keylet.key,
+
3972 .amount = STAmount(d.share, Number(21, 0))});
+
3973 env(tx);
+
3974 env.close();
+
3975 BEAST_EXPECT(
+
3976 env.balance(d.depositor, d.shares) == d.share(875 - 21));
+
3977 BEAST_EXPECT(
+
3978 env.balance(d.depositor, d.assets) ==
+
3979 STAmount(d.asset, start + Number(21, -1)));
+
3980 BEAST_EXPECT(
+
3981 env.balance(d.vaultAccount, d.assets) ==
+
3982 STAmount(d.asset, Number(875 - 21, -1)));
+
3983 BEAST_EXPECT(
+
3984 env.balance(d.vaultAccount, d.shares) ==
+
3985 STAmount(d.share, -Number(875 - 21, 0)));
+
3986 }
+
3987
+
3988 {
+
3989 testcase("Scale redeem rest");
+
3990 auto const rest = env.balance(d.depositor, d.shares).number();
+
3991
+
3992 tx = d.vault.withdraw(
+
3993 {.depositor = d.depositor,
+
3994 .id = d.keylet.key,
+
3995 .amount = STAmount(d.share, rest)});
+
3996 env(tx);
+
3997 env.close();
+
3998 BEAST_EXPECT(env.balance(d.depositor, d.shares).number() == 0);
+
3999 BEAST_EXPECT(
+
4000 env.balance(d.vaultAccount, d.assets).number() == 0);
+
4001 BEAST_EXPECT(
+
4002 env.balance(d.vaultAccount, d.shares).number() == 0);
+
4003 }
+
4004 });
+
4005
+
4006 testCase(18, [&, this](Env& env, Data d) {
+
4007 testcase("Scale withdraw overflow");
+
4008
+
4009 {
+
4010 auto tx = d.vault.deposit(
+
4011 {.depositor = d.depositor,
+
4012 .id = d.keylet.key,
+
4013 .amount = d.asset(5)});
+
4014 env(tx);
+
4015 env.close();
+
4016 }
+
4017
+
4018 {
+
4019 auto tx = d.vault.withdraw(
+
4020 {.depositor = d.depositor,
+
4021 .id = d.keylet.key,
+
4022 .amount = STAmount(d.asset, Number(10, 0))});
+
4023 env(tx, ter{tecPATH_DRY});
+
4024 env.close();
+
4025 }
+
4026 });
+
4027
+
4028 testCase(1, [&, this](Env& env, Data d) {
+
4029 // initial setup: deposit 100 IOU, receive 1000 shares
+
4030 auto const start = env.balance(d.depositor, d.assets).number();
+
4031 auto tx = d.vault.deposit(
+
4032 {.depositor = d.depositor,
+
4033 .id = d.keylet.key,
+
4034 .amount = STAmount(d.asset, Number(100, 0))});
+
4035 env(tx);
+
4036 env.close();
+
4037 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(1000));
+
4038 BEAST_EXPECT(
+
4039 env.balance(d.depositor, d.assets) ==
+
4040 STAmount(d.asset, start - Number(100, 0)));
+
4041 BEAST_EXPECT(
+
4042 env.balance(d.vaultAccount, d.assets) ==
+
4043 STAmount(d.asset, Number(100, 0)));
+
4044 BEAST_EXPECT(
+
4045 env.balance(d.vaultAccount, d.shares) ==
+
4046 STAmount(d.share, Number(-1000, 0)));
+
4047
+
4048 {
+
4049 testcase("Scale withdraw exact");
+
4050 // assetsToSharesWithdraw:
+
4051 // shares = sharesTotal * (assets / assetsTotal)
+
4052 // shares = 1000 * 10 / 100 = 1000 * 0.1 = 100
+
4053 // sharesToAssetsWithdraw:
+
4054 // assets = assetsTotal * (shares / sharesTotal)
+
4055 // assets = 100 * 100 / 1000 = 100 * 0.1 = 10
+
4056
+
4057 auto const start = env.balance(d.depositor, d.assets).number();
+
4058 auto tx = d.vault.withdraw(
+
4059 {.depositor = d.depositor,
+
4060 .id = d.keylet.key,
+
4061 .amount = STAmount(d.asset, Number(10, 0))});
+
4062 env(tx);
+
4063 env.close();
+
4064 BEAST_EXPECT(
+
4065 env.balance(d.depositor, d.shares) == d.share(900));
+
4066 BEAST_EXPECT(
+
4067 env.balance(d.depositor, d.assets) ==
+
4068 STAmount(d.asset, start + Number(10, 0)));
+
4069 BEAST_EXPECT(
+
4070 env.balance(d.vaultAccount, d.assets) ==
+
4071 STAmount(d.asset, Number(90, 0)));
+
4072 BEAST_EXPECT(
+
4073 env.balance(d.vaultAccount, d.shares) ==
+
4074 STAmount(d.share, Number(-900, 0)));
+
4075 }
+
4076
+
4077 {
+
4078 testcase("Scale withdraw insignificant amount");
+
4079 auto tx = d.vault.withdraw(
+
4080 {.depositor = d.depositor,
+
4081 .id = d.keylet.key,
+
4082 .amount = STAmount(d.asset, Number(4, -2))});
+
4083 env(tx, ter{tecPRECISION_LOSS});
+
4084 }
+
4085
+
4086 {
+
4087 testcase("Scale withdraw with rounding assets");
+
4088 // assetsToSharesWithdraw:
+
4089 // shares = sharesTotal * (assets / assetsTotal)
+
4090 // shares = 900 * 2.5 / 90 = 900 * 0.02777... = 25
+
4091 // sharesToAssetsWithdraw:
+
4092 // assets = assetsTotal * (shares / sharesTotal)
+
4093 // assets = 90 * 25 / 900 = 90 * 0.02777... = 2.5
+
4094
+
4095 auto const start = env.balance(d.depositor, d.assets).number();
+
4096 d.peek([](SLE& vault, auto&) -> bool {
+
4097 vault[sfAssetsAvailable] = Number(1);
+
4098 return true;
+
4099 });
+
4100
+
4101 // Note, this transaction fails first (because of above change
+
4102 // in the open ledger) but then succeeds when the ledger is
+
4103 // closed (because a modification like above is not persistent),
+
4104 // which is why the checks below are expected to pass.
+
4105 auto tx = d.vault.withdraw(
+
4106 {.depositor = d.depositor,
+
4107 .id = d.keylet.key,
+
4108 .amount = STAmount(d.asset, Number(25, -1))});
+
4109 env(tx, ter{tecINSUFFICIENT_FUNDS});
+
4110 env.close();
+
4111 BEAST_EXPECT(
+
4112 env.balance(d.depositor, d.shares) == d.share(900 - 25));
+
4113 BEAST_EXPECT(
+
4114 env.balance(d.depositor, d.assets) ==
+
4115 STAmount(d.asset, start + Number(25, -1)));
+
4116 BEAST_EXPECT(
+
4117 env.balance(d.vaultAccount, d.assets) ==
+
4118 STAmount(d.asset, Number(900 - 25, -1)));
+
4119 BEAST_EXPECT(
+
4120 env.balance(d.vaultAccount, d.shares) ==
+
4121 STAmount(d.share, -Number(900 - 25, 0)));
+
4122 }
+
4123
+
4124 {
+
4125 testcase("Scale withdraw with rounding shares up");
+
4126 // assetsToSharesWithdraw:
+
4127 // shares = sharesTotal * (assets / assetsTotal)
+
4128 // shares = 875 * 3.75 / 87.5 = 875 * 0.042857... = 37.5
+
4129 // sharesToAssetsWithdraw:
+
4130 // assets = assetsTotal * (shares / sharesTotal)
+
4131 // assets = 87.5 * 38 / 875 = 87.5 * 0.043428... = 3.8
+
4132
+
4133 auto const start = env.balance(d.depositor, d.assets).number();
+
4134 auto tx = d.vault.withdraw(
+
4135 {.depositor = d.depositor,
+
4136 .id = d.keylet.key,
+
4137 .amount = STAmount(d.asset, Number(375, -2))});
+
4138 env(tx);
+
4139 env.close();
+
4140 BEAST_EXPECT(
+
4141 env.balance(d.depositor, d.shares) == d.share(875 - 38));
+
4142 BEAST_EXPECT(
+
4143 env.balance(d.depositor, d.assets) ==
+
4144 STAmount(d.asset, start + Number(38, -1)));
+
4145 BEAST_EXPECT(
+
4146 env.balance(d.vaultAccount, d.assets) ==
+
4147 STAmount(d.asset, Number(875 - 38, -1)));
+
4148 BEAST_EXPECT(
+
4149 env.balance(d.vaultAccount, d.shares) ==
+
4150 STAmount(d.share, -Number(875 - 38, 0)));
+
4151 }
+
4152
+
4153 {
+
4154 testcase("Scale withdraw with rounding shares down");
+
4155 // assetsToSharesWithdraw:
+
4156 // shares = sharesTotal * (assets / assetsTotal)
+
4157 // shares = 837 * 3.72 / 83.7 = 837 * 0.04444... = 37.2
+
4158 // sharesToAssetsWithdraw:
+
4159 // assets = assetsTotal * (shares / sharesTotal)
+
4160 // assets = 83.7 * 37 / 837 = 83.7 * 0.044205... = 3.7
+
4161
+
4162 auto const start = env.balance(d.depositor, d.assets).number();
+
4163 auto tx = d.vault.withdraw(
+
4164 {.depositor = d.depositor,
+
4165 .id = d.keylet.key,
+
4166 .amount = STAmount(d.asset, Number(372, -2))});
+
4167 env(tx);
+
4168 env.close();
+
4169 BEAST_EXPECT(
+
4170 env.balance(d.depositor, d.shares) == d.share(837 - 37));
+
4171 BEAST_EXPECT(
+
4172 env.balance(d.depositor, d.assets) ==
+
4173 STAmount(d.asset, start + Number(37, -1)));
+
4174 BEAST_EXPECT(
+
4175 env.balance(d.vaultAccount, d.assets) ==
+
4176 STAmount(d.asset, Number(837 - 37, -1)));
+
4177 BEAST_EXPECT(
+
4178 env.balance(d.vaultAccount, d.shares) ==
+
4179 STAmount(d.share, -Number(837 - 37, 0)));
+
4180 }
+
4181
+
4182 {
+
4183 testcase("Scale withdraw tiny amount");
+
4184
+
4185 auto const start = env.balance(d.depositor, d.assets).number();
+
4186 auto tx = d.vault.withdraw(
+
4187 {.depositor = d.depositor,
+
4188 .id = d.keylet.key,
+
4189 .amount = STAmount(d.asset, Number(9, -2))});
+
4190 env(tx);
+
4191 env.close();
+
4192 BEAST_EXPECT(
+
4193 env.balance(d.depositor, d.shares) == d.share(800 - 1));
+
4194 BEAST_EXPECT(
+
4195 env.balance(d.depositor, d.assets) ==
+
4196 STAmount(d.asset, start + Number(1, -1)));
+
4197 BEAST_EXPECT(
+
4198 env.balance(d.vaultAccount, d.assets) ==
+
4199 STAmount(d.asset, Number(800 - 1, -1)));
+
4200 BEAST_EXPECT(
+
4201 env.balance(d.vaultAccount, d.shares) ==
+
4202 STAmount(d.share, -Number(800 - 1, 0)));
+
4203 }
+
4204
+
4205 {
+
4206 testcase("Scale withdraw rest");
+
4207 auto const rest =
+
4208 env.balance(d.vaultAccount, d.assets).number();
+
4209
+
4210 tx = d.vault.withdraw(
+
4211 {.depositor = d.depositor,
+
4212 .id = d.keylet.key,
+
4213 .amount = STAmount(d.asset, rest)});
+
4214 env(tx);
+
4215 env.close();
+
4216 BEAST_EXPECT(env.balance(d.depositor, d.shares).number() == 0);
+
4217 BEAST_EXPECT(
+
4218 env.balance(d.vaultAccount, d.assets).number() == 0);
+
4219 BEAST_EXPECT(
+
4220 env.balance(d.vaultAccount, d.shares).number() == 0);
+
4221 }
+
4222 });
+
4223
+
4224 testCase(18, [&, this](Env& env, Data d) {
+
4225 testcase("Scale clawback overflow");
+
4226
+
4227 {
+
4228 auto tx = d.vault.deposit(
+
4229 {.depositor = d.depositor,
+
4230 .id = d.keylet.key,
+
4231 .amount = d.asset(5)});
+
4232 env(tx);
+
4233 env.close();
+
4234 }
+
4235
+
4236 {
+
4237 auto tx = d.vault.clawback(
+
4238 {.issuer = d.issuer,
+
4239 .id = d.keylet.key,
+
4240 .holder = d.depositor,
+
4241 .amount = STAmount(d.asset, Number(10, 0))});
+
4242 env(tx, ter{tecPATH_DRY});
+
4243 env.close();
+
4244 }
+
4245 });
+
4246
+
4247 testCase(1, [&, this](Env& env, Data d) {
+
4248 // initial setup: deposit 100 IOU, receive 1000 shares
+
4249 auto const start = env.balance(d.depositor, d.assets).number();
+
4250 auto tx = d.vault.deposit(
+
4251 {.depositor = d.depositor,
+
4252 .id = d.keylet.key,
+
4253 .amount = STAmount(d.asset, Number(100, 0))});
+
4254 env(tx);
+
4255 env.close();
+
4256 BEAST_EXPECT(env.balance(d.depositor, d.shares) == d.share(1000));
+
4257 BEAST_EXPECT(
+
4258 env.balance(d.depositor, d.assets) ==
+
4259 STAmount(d.asset, start - Number(100, 0)));
+
4260 BEAST_EXPECT(
+
4261 env.balance(d.vaultAccount, d.assets) ==
+
4262 STAmount(d.asset, Number(100, 0)));
+
4263 BEAST_EXPECT(
+
4264 env.balance(d.vaultAccount, d.shares) ==
+
4265 STAmount(d.share, -Number(1000, 0)));
+
4266 {
+
4267 testcase("Scale clawback exact");
+
4268 // assetsToSharesWithdraw:
+
4269 // shares = sharesTotal * (assets / assetsTotal)
+
4270 // shares = 1000 * 10 / 100 = 1000 * 0.1 = 100
+
4271 // sharesToAssetsWithdraw:
+
4272 // assets = assetsTotal * (shares / sharesTotal)
+
4273 // assets = 100 * 100 / 1000 = 100 * 0.1 = 10
+
4274
+
4275 auto const start = env.balance(d.depositor, d.assets).number();
+
4276 auto tx = d.vault.clawback(
+
4277 {.issuer = d.issuer,
+
4278 .id = d.keylet.key,
+
4279 .holder = d.depositor,
+
4280 .amount = STAmount(d.asset, Number(10, 0))});
+
4281 env(tx);
+
4282 env.close();
+
4283 BEAST_EXPECT(
+
4284 env.balance(d.depositor, d.shares) == d.share(900));
+
4285 BEAST_EXPECT(
+
4286 env.balance(d.depositor, d.assets) ==
+
4287 STAmount(d.asset, start));
+
4288 BEAST_EXPECT(
+
4289 env.balance(d.vaultAccount, d.assets) ==
+
4290 STAmount(d.asset, Number(90, 0)));
+
4291 BEAST_EXPECT(
+
4292 env.balance(d.vaultAccount, d.shares) ==
+
4293 STAmount(d.share, -Number(900, 0)));
+
4294 }
+
4295
+
4296 {
+
4297 testcase("Scale clawback insignificant amount");
+
4298 auto tx = d.vault.clawback(
+
4299 {.issuer = d.issuer,
+
4300 .id = d.keylet.key,
+
4301 .holder = d.depositor,
+
4302 .amount = STAmount(d.asset, Number(4, -2))});
+
4303 env(tx, ter{tecPRECISION_LOSS});
+
4304 }
+
4305
+
4306 {
+
4307 testcase("Scale clawback with rounding assets");
+
4308 // assetsToSharesWithdraw:
+
4309 // shares = sharesTotal * (assets / assetsTotal)
+
4310 // shares = 900 * 2.5 / 90 = 900 * 0.02777... = 25
+
4311 // sharesToAssetsWithdraw:
+
4312 // assets = assetsTotal * (shares / sharesTotal)
+
4313 // assets = 90 * 25 / 900 = 90 * 0.02777... = 2.5
+
4314
+
4315 auto const start = env.balance(d.depositor, d.assets).number();
+
4316 auto tx = d.vault.clawback(
+
4317 {.issuer = d.issuer,
+
4318 .id = d.keylet.key,
+
4319 .holder = d.depositor,
+
4320 .amount = STAmount(d.asset, Number(25, -1))});
+
4321 env(tx);
+
4322 env.close();
+
4323 BEAST_EXPECT(
+
4324 env.balance(d.depositor, d.shares) == d.share(900 - 25));
+
4325 BEAST_EXPECT(
+
4326 env.balance(d.depositor, d.assets) ==
+
4327 STAmount(d.asset, start));
+
4328 BEAST_EXPECT(
+
4329 env.balance(d.vaultAccount, d.assets) ==
+
4330 STAmount(d.asset, Number(900 - 25, -1)));
+
4331 BEAST_EXPECT(
+
4332 env.balance(d.vaultAccount, d.shares) ==
+
4333 STAmount(d.share, -Number(900 - 25, 0)));
+
4334 }
+
4335
+
4336 {
+
4337 testcase("Scale clawback with rounding shares up");
+
4338 // assetsToSharesWithdraw:
+
4339 // shares = sharesTotal * (assets / assetsTotal)
+
4340 // shares = 875 * 3.75 / 87.5 = 875 * 0.042857... = 37.5
+
4341 // sharesToAssetsWithdraw:
+
4342 // assets = assetsTotal * (shares / sharesTotal)
+
4343 // assets = 87.5 * 38 / 875 = 87.5 * 0.043428... = 3.8
+
4344
+
4345 auto const start = env.balance(d.depositor, d.assets).number();
+
4346 auto tx = d.vault.clawback(
+
4347 {.issuer = d.issuer,
+
4348 .id = d.keylet.key,
+
4349 .holder = d.depositor,
+
4350 .amount = STAmount(d.asset, Number(375, -2))});
+
4351 env(tx);
+
4352 env.close();
+
4353 BEAST_EXPECT(
+
4354 env.balance(d.depositor, d.shares) == d.share(875 - 38));
+
4355 BEAST_EXPECT(
+
4356 env.balance(d.depositor, d.assets) ==
+
4357 STAmount(d.asset, start));
+
4358 BEAST_EXPECT(
+
4359 env.balance(d.vaultAccount, d.assets) ==
+
4360 STAmount(d.asset, Number(875 - 38, -1)));
+
4361 BEAST_EXPECT(
+
4362 env.balance(d.vaultAccount, d.shares) ==
+
4363 STAmount(d.share, -Number(875 - 38, 0)));
+
4364 }
+
4365
+
4366 {
+
4367 testcase("Scale clawback with rounding shares down");
+
4368 // assetsToSharesWithdraw:
+
4369 // shares = sharesTotal * (assets / assetsTotal)
+
4370 // shares = 837 * 3.72 / 83.7 = 837 * 0.04444... = 37.2
+
4371 // sharesToAssetsWithdraw:
+
4372 // assets = assetsTotal * (shares / sharesTotal)
+
4373 // assets = 83.7 * 37 / 837 = 83.7 * 0.044205... = 3.7
+
4374
+
4375 auto const start = env.balance(d.depositor, d.assets).number();
+
4376 auto tx = d.vault.clawback(
+
4377 {.issuer = d.issuer,
+
4378 .id = d.keylet.key,
+
4379 .holder = d.depositor,
+
4380 .amount = STAmount(d.asset, Number(372, -2))});
+
4381 env(tx);
+
4382 env.close();
+
4383 BEAST_EXPECT(
+
4384 env.balance(d.depositor, d.shares) == d.share(837 - 37));
+
4385 BEAST_EXPECT(
+
4386 env.balance(d.depositor, d.assets) ==
+
4387 STAmount(d.asset, start));
+
4388 BEAST_EXPECT(
+
4389 env.balance(d.vaultAccount, d.assets) ==
+
4390 STAmount(d.asset, Number(837 - 37, -1)));
+
4391 BEAST_EXPECT(
+
4392 env.balance(d.vaultAccount, d.shares) ==
+
4393 STAmount(d.share, -Number(837 - 37, 0)));
+
4394 }
+
4395
+
4396 {
+
4397 testcase("Scale clawback tiny amount");
+
4398
+
4399 auto const start = env.balance(d.depositor, d.assets).number();
+
4400 auto tx = d.vault.clawback(
+
4401 {.issuer = d.issuer,
+
4402 .id = d.keylet.key,
+
4403 .holder = d.depositor,
+
4404 .amount = STAmount(d.asset, Number(9, -2))});
+
4405 env(tx);
+
4406 env.close();
+
4407 BEAST_EXPECT(
+
4408 env.balance(d.depositor, d.shares) == d.share(800 - 1));
+
4409 BEAST_EXPECT(
+
4410 env.balance(d.depositor, d.assets) ==
+
4411 STAmount(d.asset, start));
+
4412 BEAST_EXPECT(
+
4413 env.balance(d.vaultAccount, d.assets) ==
+
4414 STAmount(d.asset, Number(800 - 1, -1)));
+
4415 BEAST_EXPECT(
+
4416 env.balance(d.vaultAccount, d.shares) ==
+
4417 STAmount(d.share, -Number(800 - 1, 0)));
+
4418 }
+
4419
+
4420 {
+
4421 testcase("Scale clawback rest");
+
4422 auto const rest =
+
4423 env.balance(d.vaultAccount, d.assets).number();
+
4424 d.peek([](SLE& vault, auto&) -> bool {
+
4425 vault[sfAssetsAvailable] = Number(5);
+
4426 return true;
+
4427 });
+
4428
+
4429 // Note, this transaction yields two different results:
+
4430 // * in the open ledger, with AssetsAvailable = 5
+
4431 // * when the ledger is closed with unmodified AssetsAvailable
+
4432 // because a modification like above is not persistent.
+
4433 tx = d.vault.clawback(
+
4434 {.issuer = d.issuer,
+
4435 .id = d.keylet.key,
+
4436 .holder = d.depositor,
+
4437 .amount = STAmount(d.asset, rest)});
+
4438 env(tx);
+
4439 env.close();
+
4440 BEAST_EXPECT(env.balance(d.depositor, d.shares).number() == 0);
+
4441 BEAST_EXPECT(
+
4442 env.balance(d.vaultAccount, d.assets).number() == 0);
+
4443 BEAST_EXPECT(
+
4444 env.balance(d.vaultAccount, d.shares).number() == 0);
+
4445 }
+
4446 });
+
4447 }
+
+
4448
+
4449 void
+
+ +
4451 {
+
4452 using namespace test::jtx;
+
4453
+
4454 testcase("RPC");
+
4455 Env env{*this, testable_amendments() | featureSingleAssetVault};
+
4456 Account const owner{"owner"};
+
4457 Account const issuer{"issuer"};
+
4458 Vault vault{env};
+
4459 env.fund(XRP(1000), issuer, owner);
+
4460 env.close();
+
4461
+
4462 PrettyAsset asset = issuer["IOU"];
+
4463 env.trust(asset(1000), owner);
+
4464 env(pay(issuer, owner, asset(200)));
+
4465 env.close();
+
4466
+
4467 auto const sequence = env.seq(owner);
+
4468 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
+
4469 env(tx);
+
4470 env.close();
4471
-
4472 auto tx2 = vault.set({.owner = owner, .id = keylet.key});
-
4473 tx2[sfAssetsMaximum] = asset(1000).number();
-
4474 env(tx2);
-
4475 env.close();
-
4476 }
+
4472 // Set some fields
+
4473 {
+
4474 auto tx1 = vault.deposit(
+
4475 {.depositor = owner, .id = keylet.key, .amount = asset(50)});
+
4476 env(tx1);
4477
-
4478 auto const sleVault = [&env, keylet = keylet, this]() {
-
4479 auto const vault = env.le(keylet);
-
4480 BEAST_EXPECT(vault != nullptr);
-
4481 return vault;
-
4482 }();
+
4478 auto tx2 = vault.set({.owner = owner, .id = keylet.key});
+
4479 tx2[sfAssetsMaximum] = asset(1000).number();
+
4480 env(tx2);
+
4481 env.close();
+
4482 }
4483
-
4484 auto const check = [&, keylet = keylet, sle = sleVault, this](
-
4485 Json::Value const& vault,
-
4486 Json::Value const& issuance = Json::nullValue) {
-
4487 BEAST_EXPECT(vault.isObject());
-
4488
-
4489 constexpr auto checkString =
-
4490 [](auto& node, SField const& field, std::string v) -> bool {
-
4491 return node.isMember(field.fieldName) &&
-
4492 node[field.fieldName].isString() &&
-
4493 node[field.fieldName] == v;
-
4494 };
-
4495 constexpr auto checkObject =
-
4496 [](auto& node, SField const& field, Json::Value v) -> bool {
+
4484 auto const sleVault = [&env, keylet = keylet, this]() {
+
4485 auto const vault = env.le(keylet);
+
4486 BEAST_EXPECT(vault != nullptr);
+
4487 return vault;
+
4488 }();
+
4489
+
4490 auto const check = [&, keylet = keylet, sle = sleVault, this](
+
4491 Json::Value const& vault,
+
4492 Json::Value const& issuance = Json::nullValue) {
+
4493 BEAST_EXPECT(vault.isObject());
+
4494
+
4495 constexpr auto checkString =
+
4496 [](auto& node, SField const& field, std::string v) -> bool {
4497 return node.isMember(field.fieldName) &&
-
4498 node[field.fieldName].isObject() &&
+
4498 node[field.fieldName].isString() &&
4499 node[field.fieldName] == v;
4500 };
-
4501 constexpr auto checkInt =
-
4502 [](auto& node, SField const& field, int v) -> bool {
+
4501 constexpr auto checkObject =
+
4502 [](auto& node, SField const& field, Json::Value v) -> bool {
4503 return node.isMember(field.fieldName) &&
-
4504 ((node[field.fieldName].isInt() &&
-
4505 node[field.fieldName] == Json::Int(v)) ||
-
4506 (node[field.fieldName].isUInt() &&
-
4507 node[field.fieldName] == Json::UInt(v)));
-
4508 };
-
4509
-
4510 BEAST_EXPECT(vault["LedgerEntryType"].asString() == "Vault");
-
4511 BEAST_EXPECT(vault[jss::index].asString() == strHex(keylet.key));
-
4512 BEAST_EXPECT(checkInt(vault, sfFlags, 0));
-
4513 // Ignore all other standard fields, this test doesn't care
-
4514
-
4515 BEAST_EXPECT(
-
4516 checkString(vault, sfAccount, toBase58(sle->at(sfAccount))));
-
4517 BEAST_EXPECT(
-
4518 checkObject(vault, sfAsset, to_json(sle->at(sfAsset))));
-
4519 BEAST_EXPECT(checkString(vault, sfAssetsAvailable, "50"));
-
4520 BEAST_EXPECT(checkString(vault, sfAssetsMaximum, "1000"));
-
4521 BEAST_EXPECT(checkString(vault, sfAssetsTotal, "50"));
-
4522 BEAST_EXPECT(checkString(vault, sfLossUnrealized, "0"));
-
4523
-
4524 auto const strShareID = strHex(sle->at(sfShareMPTID));
-
4525 BEAST_EXPECT(checkString(vault, sfShareMPTID, strShareID));
-
4526 BEAST_EXPECT(checkString(vault, sfOwner, toBase58(owner.id())));
-
4527 BEAST_EXPECT(checkInt(vault, sfSequence, sequence));
-
4528 BEAST_EXPECT(checkInt(
-
4529 vault, sfWithdrawalPolicy, vaultStrategyFirstComeFirstServe));
-
4530
-
4531 if (issuance.isObject())
-
4532 {
-
4533 BEAST_EXPECT(
-
4534 issuance["LedgerEntryType"].asString() ==
-
4535 "MPTokenIssuance");
-
4536 BEAST_EXPECT(
-
4537 issuance[jss::mpt_issuance_id].asString() == strShareID);
-
4538 BEAST_EXPECT(checkInt(issuance, sfSequence, 1));
-
4539 BEAST_EXPECT(checkInt(
-
4540 issuance,
-
4541 sfFlags,
- -
4543 BEAST_EXPECT(
-
4544 checkString(issuance, sfOutstandingAmount, "50000000"));
-
4545 }
-
4546 };
-
4547
-
4548 {
-
4549 testcase("RPC ledger_entry selected by key");
-
4550 Json::Value jvParams;
-
4551 jvParams[jss::ledger_index] = jss::validated;
-
4552 jvParams[jss::vault] = strHex(keylet.key);
-
4553 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
4554
-
4555 BEAST_EXPECT(!jvVault[jss::result].isMember(jss::error));
-
4556 BEAST_EXPECT(jvVault[jss::result].isMember(jss::node));
-
4557 check(jvVault[jss::result][jss::node]);
-
4558 }
-
4559
-
4560 {
-
4561 testcase("RPC ledger_entry selected by owner and seq");
-
4562 Json::Value jvParams;
-
4563 jvParams[jss::ledger_index] = jss::validated;
-
4564 jvParams[jss::vault][jss::owner] = owner.human();
-
4565 jvParams[jss::vault][jss::seq] = sequence;
-
4566 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
4567
-
4568 BEAST_EXPECT(!jvVault[jss::result].isMember(jss::error));
-
4569 BEAST_EXPECT(jvVault[jss::result].isMember(jss::node));
-
4570 check(jvVault[jss::result][jss::node]);
-
4571 }
-
4572
-
4573 {
-
4574 testcase("RPC ledger_entry cannot find vault by key");
-
4575 Json::Value jvParams;
-
4576 jvParams[jss::ledger_index] = jss::validated;
-
4577 jvParams[jss::vault] = to_string(uint256(42));
-
4578 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
4579 BEAST_EXPECT(
-
4580 jvVault[jss::result][jss::error].asString() == "entryNotFound");
-
4581 }
-
4582
-
4583 {
-
4584 testcase("RPC ledger_entry cannot find vault by owner and seq");
-
4585 Json::Value jvParams;
-
4586 jvParams[jss::ledger_index] = jss::validated;
-
4587 jvParams[jss::vault][jss::owner] = issuer.human();
-
4588 jvParams[jss::vault][jss::seq] = 1'000'000;
-
4589 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
4590 BEAST_EXPECT(
-
4591 jvVault[jss::result][jss::error].asString() == "entryNotFound");
-
4592 }
-
4593
-
4594 {
-
4595 testcase("RPC ledger_entry malformed key");
-
4596 Json::Value jvParams;
-
4597 jvParams[jss::ledger_index] = jss::validated;
-
4598 jvParams[jss::vault] = 42;
-
4599 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
4600 BEAST_EXPECT(
-
4601 jvVault[jss::result][jss::error].asString() ==
-
4602 "malformedRequest");
-
4603 }
-
4604
-
4605 {
-
4606 testcase("RPC ledger_entry malformed owner");
-
4607 Json::Value jvParams;
-
4608 jvParams[jss::ledger_index] = jss::validated;
-
4609 jvParams[jss::vault][jss::owner] = 42;
-
4610 jvParams[jss::vault][jss::seq] = sequence;
-
4611 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
4612 BEAST_EXPECT(
-
4613 jvVault[jss::result][jss::error].asString() ==
-
4614 "malformedOwner");
-
4615 }
-
4616
-
4617 {
-
4618 testcase("RPC ledger_entry malformed seq");
-
4619 Json::Value jvParams;
-
4620 jvParams[jss::ledger_index] = jss::validated;
-
4621 jvParams[jss::vault][jss::owner] = issuer.human();
-
4622 jvParams[jss::vault][jss::seq] = "foo";
-
4623 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
4624 BEAST_EXPECT(
-
4625 jvVault[jss::result][jss::error].asString() ==
-
4626 "malformedRequest");
-
4627 }
-
4628
-
4629 {
-
4630 testcase("RPC ledger_entry negative seq");
-
4631 Json::Value jvParams;
-
4632 jvParams[jss::ledger_index] = jss::validated;
-
4633 jvParams[jss::vault][jss::owner] = issuer.human();
-
4634 jvParams[jss::vault][jss::seq] = -1;
-
4635 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
4636 BEAST_EXPECT(
-
4637 jvVault[jss::result][jss::error].asString() ==
-
4638 "malformedRequest");
-
4639 }
-
4640
-
4641 {
-
4642 testcase("RPC ledger_entry oversized seq");
-
4643 Json::Value jvParams;
-
4644 jvParams[jss::ledger_index] = jss::validated;
-
4645 jvParams[jss::vault][jss::owner] = issuer.human();
-
4646 jvParams[jss::vault][jss::seq] = 1e20;
-
4647 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
4648 BEAST_EXPECT(
-
4649 jvVault[jss::result][jss::error].asString() ==
-
4650 "malformedRequest");
-
4651 }
-
4652
-
4653 {
-
4654 testcase("RPC ledger_entry bool seq");
-
4655 Json::Value jvParams;
-
4656 jvParams[jss::ledger_index] = jss::validated;
-
4657 jvParams[jss::vault][jss::owner] = issuer.human();
-
4658 jvParams[jss::vault][jss::seq] = true;
-
4659 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
4660 BEAST_EXPECT(
-
4661 jvVault[jss::result][jss::error].asString() ==
-
4662 "malformedRequest");
-
4663 }
-
4664
-
4665 {
-
4666 testcase("RPC account_objects");
-
4667
-
4668 Json::Value jvParams;
-
4669 jvParams[jss::account] = owner.human();
-
4670 jvParams[jss::type] = jss::vault;
-
4671 auto jv = env.rpc(
-
4672 "json", "account_objects", to_string(jvParams))[jss::result];
+
4504 node[field.fieldName].isObject() &&
+
4505 node[field.fieldName] == v;
+
4506 };
+
4507 constexpr auto checkInt =
+
4508 [](auto& node, SField const& field, int v) -> bool {
+
4509 return node.isMember(field.fieldName) &&
+
4510 ((node[field.fieldName].isInt() &&
+
4511 node[field.fieldName] == Json::Int(v)) ||
+
4512 (node[field.fieldName].isUInt() &&
+
4513 node[field.fieldName] == Json::UInt(v)));
+
4514 };
+
4515
+
4516 BEAST_EXPECT(vault["LedgerEntryType"].asString() == "Vault");
+
4517 BEAST_EXPECT(vault[jss::index].asString() == strHex(keylet.key));
+
4518 BEAST_EXPECT(checkInt(vault, sfFlags, 0));
+
4519 // Ignore all other standard fields, this test doesn't care
+
4520
+
4521 BEAST_EXPECT(
+
4522 checkString(vault, sfAccount, toBase58(sle->at(sfAccount))));
+
4523 BEAST_EXPECT(
+
4524 checkObject(vault, sfAsset, to_json(sle->at(sfAsset))));
+
4525 BEAST_EXPECT(checkString(vault, sfAssetsAvailable, "50"));
+
4526 BEAST_EXPECT(checkString(vault, sfAssetsMaximum, "1000"));
+
4527 BEAST_EXPECT(checkString(vault, sfAssetsTotal, "50"));
+
4528 BEAST_EXPECT(checkString(vault, sfLossUnrealized, "0"));
+
4529
+
4530 auto const strShareID = strHex(sle->at(sfShareMPTID));
+
4531 BEAST_EXPECT(checkString(vault, sfShareMPTID, strShareID));
+
4532 BEAST_EXPECT(checkString(vault, sfOwner, toBase58(owner.id())));
+
4533 BEAST_EXPECT(checkInt(vault, sfSequence, sequence));
+
4534 BEAST_EXPECT(checkInt(
+
4535 vault, sfWithdrawalPolicy, vaultStrategyFirstComeFirstServe));
+
4536
+
4537 if (issuance.isObject())
+
4538 {
+
4539 BEAST_EXPECT(
+
4540 issuance["LedgerEntryType"].asString() ==
+
4541 "MPTokenIssuance");
+
4542 BEAST_EXPECT(
+
4543 issuance[jss::mpt_issuance_id].asString() == strShareID);
+
4544 BEAST_EXPECT(checkInt(issuance, sfSequence, 1));
+
4545 BEAST_EXPECT(checkInt(
+
4546 issuance,
+
4547 sfFlags,
+ +
4549 BEAST_EXPECT(
+
4550 checkString(issuance, sfOutstandingAmount, "50000000"));
+
4551 }
+
4552 };
+
4553
+
4554 {
+
4555 testcase("RPC ledger_entry selected by key");
+
4556 Json::Value jvParams;
+
4557 jvParams[jss::ledger_index] = jss::validated;
+
4558 jvParams[jss::vault] = strHex(keylet.key);
+
4559 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
4560
+
4561 BEAST_EXPECT(!jvVault[jss::result].isMember(jss::error));
+
4562 BEAST_EXPECT(jvVault[jss::result].isMember(jss::node));
+
4563 check(jvVault[jss::result][jss::node]);
+
4564 }
+
4565
+
4566 {
+
4567 testcase("RPC ledger_entry selected by owner and seq");
+
4568 Json::Value jvParams;
+
4569 jvParams[jss::ledger_index] = jss::validated;
+
4570 jvParams[jss::vault][jss::owner] = owner.human();
+
4571 jvParams[jss::vault][jss::seq] = sequence;
+
4572 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
4573
+
4574 BEAST_EXPECT(!jvVault[jss::result].isMember(jss::error));
+
4575 BEAST_EXPECT(jvVault[jss::result].isMember(jss::node));
+
4576 check(jvVault[jss::result][jss::node]);
+
4577 }
+
4578
+
4579 {
+
4580 testcase("RPC ledger_entry cannot find vault by key");
+
4581 Json::Value jvParams;
+
4582 jvParams[jss::ledger_index] = jss::validated;
+
4583 jvParams[jss::vault] = to_string(uint256(42));
+
4584 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
4585 BEAST_EXPECT(
+
4586 jvVault[jss::result][jss::error].asString() == "entryNotFound");
+
4587 }
+
4588
+
4589 {
+
4590 testcase("RPC ledger_entry cannot find vault by owner and seq");
+
4591 Json::Value jvParams;
+
4592 jvParams[jss::ledger_index] = jss::validated;
+
4593 jvParams[jss::vault][jss::owner] = issuer.human();
+
4594 jvParams[jss::vault][jss::seq] = 1'000'000;
+
4595 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
4596 BEAST_EXPECT(
+
4597 jvVault[jss::result][jss::error].asString() == "entryNotFound");
+
4598 }
+
4599
+
4600 {
+
4601 testcase("RPC ledger_entry malformed key");
+
4602 Json::Value jvParams;
+
4603 jvParams[jss::ledger_index] = jss::validated;
+
4604 jvParams[jss::vault] = 42;
+
4605 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
4606 BEAST_EXPECT(
+
4607 jvVault[jss::result][jss::error].asString() ==
+
4608 "malformedRequest");
+
4609 }
+
4610
+
4611 {
+
4612 testcase("RPC ledger_entry malformed owner");
+
4613 Json::Value jvParams;
+
4614 jvParams[jss::ledger_index] = jss::validated;
+
4615 jvParams[jss::vault][jss::owner] = 42;
+
4616 jvParams[jss::vault][jss::seq] = sequence;
+
4617 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
4618 BEAST_EXPECT(
+
4619 jvVault[jss::result][jss::error].asString() ==
+
4620 "malformedOwner");
+
4621 }
+
4622
+
4623 {
+
4624 testcase("RPC ledger_entry malformed seq");
+
4625 Json::Value jvParams;
+
4626 jvParams[jss::ledger_index] = jss::validated;
+
4627 jvParams[jss::vault][jss::owner] = issuer.human();
+
4628 jvParams[jss::vault][jss::seq] = "foo";
+
4629 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
4630 BEAST_EXPECT(
+
4631 jvVault[jss::result][jss::error].asString() ==
+
4632 "malformedRequest");
+
4633 }
+
4634
+
4635 {
+
4636 testcase("RPC ledger_entry negative seq");
+
4637 Json::Value jvParams;
+
4638 jvParams[jss::ledger_index] = jss::validated;
+
4639 jvParams[jss::vault][jss::owner] = issuer.human();
+
4640 jvParams[jss::vault][jss::seq] = -1;
+
4641 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
4642 BEAST_EXPECT(
+
4643 jvVault[jss::result][jss::error].asString() ==
+
4644 "malformedRequest");
+
4645 }
+
4646
+
4647 {
+
4648 testcase("RPC ledger_entry oversized seq");
+
4649 Json::Value jvParams;
+
4650 jvParams[jss::ledger_index] = jss::validated;
+
4651 jvParams[jss::vault][jss::owner] = issuer.human();
+
4652 jvParams[jss::vault][jss::seq] = 1e20;
+
4653 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
4654 BEAST_EXPECT(
+
4655 jvVault[jss::result][jss::error].asString() ==
+
4656 "malformedRequest");
+
4657 }
+
4658
+
4659 {
+
4660 testcase("RPC ledger_entry bool seq");
+
4661 Json::Value jvParams;
+
4662 jvParams[jss::ledger_index] = jss::validated;
+
4663 jvParams[jss::vault][jss::owner] = issuer.human();
+
4664 jvParams[jss::vault][jss::seq] = true;
+
4665 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
4666 BEAST_EXPECT(
+
4667 jvVault[jss::result][jss::error].asString() ==
+
4668 "malformedRequest");
+
4669 }
+
4670
+
4671 {
+
4672 testcase("RPC account_objects");
4673
-
4674 BEAST_EXPECT(jv[jss::account_objects].size() == 1);
-
4675 check(jv[jss::account_objects][0u]);
-
4676 }
-
4677
-
4678 {
-
4679 testcase("RPC ledger_data");
-
4680
-
4681 Json::Value jvParams;
-
4682 jvParams[jss::ledger_index] = jss::validated;
-
4683 jvParams[jss::binary] = false;
-
4684 jvParams[jss::type] = jss::vault;
-
4685 Json::Value jv =
-
4686 env.rpc("json", "ledger_data", to_string(jvParams));
-
4687 BEAST_EXPECT(jv[jss::result][jss::state].size() == 1);
-
4688 check(jv[jss::result][jss::state][0u]);
-
4689 }
-
4690
-
4691 {
-
4692 testcase("RPC vault_info command line");
-
4693 Json::Value jv =
-
4694 env.rpc("vault_info", strHex(keylet.key), "validated");
-
4695
-
4696 BEAST_EXPECT(!jv[jss::result].isMember(jss::error));
-
4697 BEAST_EXPECT(jv[jss::result].isMember(jss::vault));
-
4698 check(
-
4699 jv[jss::result][jss::vault],
-
4700 jv[jss::result][jss::vault][jss::shares]);
-
4701 }
-
4702
-
4703 {
-
4704 testcase("RPC vault_info json");
-
4705 Json::Value jvParams;
-
4706 jvParams[jss::ledger_index] = jss::validated;
-
4707 jvParams[jss::vault_id] = strHex(keylet.key);
-
4708 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4709
-
4710 BEAST_EXPECT(!jv[jss::result].isMember(jss::error));
-
4711 BEAST_EXPECT(jv[jss::result].isMember(jss::vault));
-
4712 check(
-
4713 jv[jss::result][jss::vault],
-
4714 jv[jss::result][jss::vault][jss::shares]);
-
4715 }
-
4716
-
4717 {
-
4718 testcase("RPC vault_info invalid vault_id");
-
4719 Json::Value jvParams;
-
4720 jvParams[jss::ledger_index] = jss::validated;
-
4721 jvParams[jss::vault_id] = "foobar";
-
4722 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4723 BEAST_EXPECT(
-
4724 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4725 }
-
4726
-
4727 {
-
4728 testcase("RPC vault_info json invalid index");
-
4729 Json::Value jvParams;
-
4730 jvParams[jss::ledger_index] = jss::validated;
-
4731 jvParams[jss::vault_id] = 0;
-
4732 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4733 BEAST_EXPECT(
-
4734 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4735 }
-
4736
-
4737 {
-
4738 testcase("RPC vault_info json by owner and sequence");
-
4739 Json::Value jvParams;
-
4740 jvParams[jss::ledger_index] = jss::validated;
-
4741 jvParams[jss::owner] = owner.human();
-
4742 jvParams[jss::seq] = sequence;
-
4743 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4744
-
4745 BEAST_EXPECT(!jv[jss::result].isMember(jss::error));
-
4746 BEAST_EXPECT(jv[jss::result].isMember(jss::vault));
-
4747 check(
-
4748 jv[jss::result][jss::vault],
-
4749 jv[jss::result][jss::vault][jss::shares]);
-
4750 }
-
4751
-
4752 {
-
4753 testcase("RPC vault_info json malformed sequence");
-
4754 Json::Value jvParams;
-
4755 jvParams[jss::ledger_index] = jss::validated;
-
4756 jvParams[jss::owner] = owner.human();
-
4757 jvParams[jss::seq] = "foobar";
-
4758 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4759 BEAST_EXPECT(
-
4760 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4761 }
-
4762
-
4763 {
-
4764 testcase("RPC vault_info json invalid sequence");
-
4765 Json::Value jvParams;
-
4766 jvParams[jss::ledger_index] = jss::validated;
-
4767 jvParams[jss::owner] = owner.human();
-
4768 jvParams[jss::seq] = 0;
-
4769 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4770 BEAST_EXPECT(
-
4771 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4772 }
-
4773
-
4774 {
-
4775 testcase("RPC vault_info json negative sequence");
-
4776 Json::Value jvParams;
-
4777 jvParams[jss::ledger_index] = jss::validated;
-
4778 jvParams[jss::owner] = owner.human();
-
4779 jvParams[jss::seq] = -1;
-
4780 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4781 BEAST_EXPECT(
-
4782 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4783 }
-
4784
-
4785 {
-
4786 testcase("RPC vault_info json oversized sequence");
-
4787 Json::Value jvParams;
-
4788 jvParams[jss::ledger_index] = jss::validated;
-
4789 jvParams[jss::owner] = owner.human();
-
4790 jvParams[jss::seq] = 1e20;
-
4791 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4792 BEAST_EXPECT(
-
4793 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4794 }
-
4795
-
4796 {
-
4797 testcase("RPC vault_info json bool sequence");
-
4798 Json::Value jvParams;
-
4799 jvParams[jss::ledger_index] = jss::validated;
-
4800 jvParams[jss::owner] = owner.human();
-
4801 jvParams[jss::seq] = true;
-
4802 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4803 BEAST_EXPECT(
-
4804 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4805 }
-
4806
-
4807 {
-
4808 testcase("RPC vault_info json malformed owner");
-
4809 Json::Value jvParams;
-
4810 jvParams[jss::ledger_index] = jss::validated;
-
4811 jvParams[jss::owner] = "foobar";
-
4812 jvParams[jss::seq] = sequence;
-
4813 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4814 BEAST_EXPECT(
-
4815 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4816 }
-
4817
-
4818 {
-
4819 testcase("RPC vault_info json invalid combination only owner");
-
4820 Json::Value jvParams;
-
4821 jvParams[jss::ledger_index] = jss::validated;
-
4822 jvParams[jss::owner] = owner.human();
-
4823 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4824 BEAST_EXPECT(
-
4825 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4826 }
-
4827
-
4828 {
-
4829 testcase("RPC vault_info json invalid combination only seq");
-
4830 Json::Value jvParams;
-
4831 jvParams[jss::ledger_index] = jss::validated;
-
4832 jvParams[jss::seq] = sequence;
-
4833 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4834 BEAST_EXPECT(
-
4835 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4836 }
-
4837
-
4838 {
-
4839 testcase("RPC vault_info json invalid combination seq vault_id");
-
4840 Json::Value jvParams;
-
4841 jvParams[jss::ledger_index] = jss::validated;
-
4842 jvParams[jss::vault_id] = strHex(keylet.key);
-
4843 jvParams[jss::seq] = sequence;
-
4844 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4845 BEAST_EXPECT(
-
4846 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4847 }
-
4848
-
4849 {
-
4850 testcase("RPC vault_info json invalid combination owner vault_id");
-
4851 Json::Value jvParams;
-
4852 jvParams[jss::ledger_index] = jss::validated;
-
4853 jvParams[jss::vault_id] = strHex(keylet.key);
-
4854 jvParams[jss::owner] = owner.human();
-
4855 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4856 BEAST_EXPECT(
-
4857 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4858 }
-
4859
-
4860 {
-
4861 testcase(
-
4862 "RPC vault_info json invalid combination owner seq "
-
4863 "vault_id");
-
4864 Json::Value jvParams;
-
4865 jvParams[jss::ledger_index] = jss::validated;
-
4866 jvParams[jss::vault_id] = strHex(keylet.key);
-
4867 jvParams[jss::seq] = sequence;
-
4868 jvParams[jss::owner] = owner.human();
-
4869 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4870 BEAST_EXPECT(
-
4871 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4872 }
-
4873
-
4874 {
-
4875 testcase("RPC vault_info json no input");
-
4876 Json::Value jvParams;
-
4877 jvParams[jss::ledger_index] = jss::validated;
-
4878 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
4879 BEAST_EXPECT(
-
4880 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4881 }
-
4882
-
4883 {
-
4884 testcase("RPC vault_info command line invalid index");
-
4885 Json::Value jv = env.rpc("vault_info", "foobar", "validated");
-
4886 BEAST_EXPECT(jv[jss::error].asString() == "invalidParams");
+
4674 Json::Value jvParams;
+
4675 jvParams[jss::account] = owner.human();
+
4676 jvParams[jss::type] = jss::vault;
+
4677 auto jv = env.rpc(
+
4678 "json", "account_objects", to_string(jvParams))[jss::result];
+
4679
+
4680 BEAST_EXPECT(jv[jss::account_objects].size() == 1);
+
4681 check(jv[jss::account_objects][0u]);
+
4682 }
+
4683
+
4684 {
+
4685 testcase("RPC ledger_data");
+
4686
+
4687 Json::Value jvParams;
+
4688 jvParams[jss::ledger_index] = jss::validated;
+
4689 jvParams[jss::binary] = false;
+
4690 jvParams[jss::type] = jss::vault;
+
4691 Json::Value jv =
+
4692 env.rpc("json", "ledger_data", to_string(jvParams));
+
4693 BEAST_EXPECT(jv[jss::result][jss::state].size() == 1);
+
4694 check(jv[jss::result][jss::state][0u]);
+
4695 }
+
4696
+
4697 {
+
4698 testcase("RPC vault_info command line");
+
4699 Json::Value jv =
+
4700 env.rpc("vault_info", strHex(keylet.key), "validated");
+
4701
+
4702 BEAST_EXPECT(!jv[jss::result].isMember(jss::error));
+
4703 BEAST_EXPECT(jv[jss::result].isMember(jss::vault));
+
4704 check(
+
4705 jv[jss::result][jss::vault],
+
4706 jv[jss::result][jss::vault][jss::shares]);
+
4707 }
+
4708
+
4709 {
+
4710 testcase("RPC vault_info json");
+
4711 Json::Value jvParams;
+
4712 jvParams[jss::ledger_index] = jss::validated;
+
4713 jvParams[jss::vault_id] = strHex(keylet.key);
+
4714 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4715
+
4716 BEAST_EXPECT(!jv[jss::result].isMember(jss::error));
+
4717 BEAST_EXPECT(jv[jss::result].isMember(jss::vault));
+
4718 check(
+
4719 jv[jss::result][jss::vault],
+
4720 jv[jss::result][jss::vault][jss::shares]);
+
4721 }
+
4722
+
4723 {
+
4724 testcase("RPC vault_info invalid vault_id");
+
4725 Json::Value jvParams;
+
4726 jvParams[jss::ledger_index] = jss::validated;
+
4727 jvParams[jss::vault_id] = "foobar";
+
4728 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4729 BEAST_EXPECT(
+
4730 jv[jss::result][jss::error].asString() == "malformedRequest");
+
4731 }
+
4732
+
4733 {
+
4734 testcase("RPC vault_info json invalid index");
+
4735 Json::Value jvParams;
+
4736 jvParams[jss::ledger_index] = jss::validated;
+
4737 jvParams[jss::vault_id] = 0;
+
4738 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4739 BEAST_EXPECT(
+
4740 jv[jss::result][jss::error].asString() == "malformedRequest");
+
4741 }
+
4742
+
4743 {
+
4744 testcase("RPC vault_info json by owner and sequence");
+
4745 Json::Value jvParams;
+
4746 jvParams[jss::ledger_index] = jss::validated;
+
4747 jvParams[jss::owner] = owner.human();
+
4748 jvParams[jss::seq] = sequence;
+
4749 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4750
+
4751 BEAST_EXPECT(!jv[jss::result].isMember(jss::error));
+
4752 BEAST_EXPECT(jv[jss::result].isMember(jss::vault));
+
4753 check(
+
4754 jv[jss::result][jss::vault],
+
4755 jv[jss::result][jss::vault][jss::shares]);
+
4756 }
+
4757
+
4758 {
+
4759 testcase("RPC vault_info json malformed sequence");
+
4760 Json::Value jvParams;
+
4761 jvParams[jss::ledger_index] = jss::validated;
+
4762 jvParams[jss::owner] = owner.human();
+
4763 jvParams[jss::seq] = "foobar";
+
4764 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4765 BEAST_EXPECT(
+
4766 jv[jss::result][jss::error].asString() == "malformedRequest");
+
4767 }
+
4768
+
4769 {
+
4770 testcase("RPC vault_info json invalid sequence");
+
4771 Json::Value jvParams;
+
4772 jvParams[jss::ledger_index] = jss::validated;
+
4773 jvParams[jss::owner] = owner.human();
+
4774 jvParams[jss::seq] = 0;
+
4775 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4776 BEAST_EXPECT(
+
4777 jv[jss::result][jss::error].asString() == "malformedRequest");
+
4778 }
+
4779
+
4780 {
+
4781 testcase("RPC vault_info json negative sequence");
+
4782 Json::Value jvParams;
+
4783 jvParams[jss::ledger_index] = jss::validated;
+
4784 jvParams[jss::owner] = owner.human();
+
4785 jvParams[jss::seq] = -1;
+
4786 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4787 BEAST_EXPECT(
+
4788 jv[jss::result][jss::error].asString() == "malformedRequest");
+
4789 }
+
4790
+
4791 {
+
4792 testcase("RPC vault_info json oversized sequence");
+
4793 Json::Value jvParams;
+
4794 jvParams[jss::ledger_index] = jss::validated;
+
4795 jvParams[jss::owner] = owner.human();
+
4796 jvParams[jss::seq] = 1e20;
+
4797 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4798 BEAST_EXPECT(
+
4799 jv[jss::result][jss::error].asString() == "malformedRequest");
+
4800 }
+
4801
+
4802 {
+
4803 testcase("RPC vault_info json bool sequence");
+
4804 Json::Value jvParams;
+
4805 jvParams[jss::ledger_index] = jss::validated;
+
4806 jvParams[jss::owner] = owner.human();
+
4807 jvParams[jss::seq] = true;
+
4808 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4809 BEAST_EXPECT(
+
4810 jv[jss::result][jss::error].asString() == "malformedRequest");
+
4811 }
+
4812
+
4813 {
+
4814 testcase("RPC vault_info json malformed owner");
+
4815 Json::Value jvParams;
+
4816 jvParams[jss::ledger_index] = jss::validated;
+
4817 jvParams[jss::owner] = "foobar";
+
4818 jvParams[jss::seq] = sequence;
+
4819 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4820 BEAST_EXPECT(
+
4821 jv[jss::result][jss::error].asString() == "malformedRequest");
+
4822 }
+
4823
+
4824 {
+
4825 testcase("RPC vault_info json invalid combination only owner");
+
4826 Json::Value jvParams;
+
4827 jvParams[jss::ledger_index] = jss::validated;
+
4828 jvParams[jss::owner] = owner.human();
+
4829 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4830 BEAST_EXPECT(
+
4831 jv[jss::result][jss::error].asString() == "malformedRequest");
+
4832 }
+
4833
+
4834 {
+
4835 testcase("RPC vault_info json invalid combination only seq");
+
4836 Json::Value jvParams;
+
4837 jvParams[jss::ledger_index] = jss::validated;
+
4838 jvParams[jss::seq] = sequence;
+
4839 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4840 BEAST_EXPECT(
+
4841 jv[jss::result][jss::error].asString() == "malformedRequest");
+
4842 }
+
4843
+
4844 {
+
4845 testcase("RPC vault_info json invalid combination seq vault_id");
+
4846 Json::Value jvParams;
+
4847 jvParams[jss::ledger_index] = jss::validated;
+
4848 jvParams[jss::vault_id] = strHex(keylet.key);
+
4849 jvParams[jss::seq] = sequence;
+
4850 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4851 BEAST_EXPECT(
+
4852 jv[jss::result][jss::error].asString() == "malformedRequest");
+
4853 }
+
4854
+
4855 {
+
4856 testcase("RPC vault_info json invalid combination owner vault_id");
+
4857 Json::Value jvParams;
+
4858 jvParams[jss::ledger_index] = jss::validated;
+
4859 jvParams[jss::vault_id] = strHex(keylet.key);
+
4860 jvParams[jss::owner] = owner.human();
+
4861 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4862 BEAST_EXPECT(
+
4863 jv[jss::result][jss::error].asString() == "malformedRequest");
+
4864 }
+
4865
+
4866 {
+
4867 testcase(
+
4868 "RPC vault_info json invalid combination owner seq "
+
4869 "vault_id");
+
4870 Json::Value jvParams;
+
4871 jvParams[jss::ledger_index] = jss::validated;
+
4872 jvParams[jss::vault_id] = strHex(keylet.key);
+
4873 jvParams[jss::seq] = sequence;
+
4874 jvParams[jss::owner] = owner.human();
+
4875 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4876 BEAST_EXPECT(
+
4877 jv[jss::result][jss::error].asString() == "malformedRequest");
+
4878 }
+
4879
+
4880 {
+
4881 testcase("RPC vault_info json no input");
+
4882 Json::Value jvParams;
+
4883 jvParams[jss::ledger_index] = jss::validated;
+
4884 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
4885 BEAST_EXPECT(
+
4886 jv[jss::result][jss::error].asString() == "malformedRequest");
4887 }
4888
4889 {
4890 testcase("RPC vault_info command line invalid index");
-
4891 Json::Value jv = env.rpc("vault_info", "0", "validated");
-
4892 BEAST_EXPECT(
-
4893 jv[jss::result][jss::error].asString() == "malformedRequest");
-
4894 }
-
4895
-
4896 {
-
4897 testcase("RPC vault_info command line invalid index");
-
4898 Json::Value jv =
-
4899 env.rpc("vault_info", strHex(uint256(42)), "validated");
-
4900 BEAST_EXPECT(
-
4901 jv[jss::result][jss::error].asString() == "entryNotFound");
-
4902 }
-
4903
-
4904 {
-
4905 testcase("RPC vault_info command line invalid ledger");
-
4906 Json::Value jv = env.rpc("vault_info", strHex(keylet.key), "0");
-
4907 BEAST_EXPECT(
-
4908 jv[jss::result][jss::error].asString() == "lgrNotFound");
-
4909 }
-
4910 }
+
4891 Json::Value jv = env.rpc("vault_info", "foobar", "validated");
+
4892 BEAST_EXPECT(jv[jss::error].asString() == "invalidParams");
+
4893 }
+
4894
+
4895 {
+
4896 testcase("RPC vault_info command line invalid index");
+
4897 Json::Value jv = env.rpc("vault_info", "0", "validated");
+
4898 BEAST_EXPECT(
+
4899 jv[jss::result][jss::error].asString() == "malformedRequest");
+
4900 }
+
4901
+
4902 {
+
4903 testcase("RPC vault_info command line invalid index");
+
4904 Json::Value jv =
+
4905 env.rpc("vault_info", strHex(uint256(42)), "validated");
+
4906 BEAST_EXPECT(
+
4907 jv[jss::result][jss::error].asString() == "entryNotFound");
+
4908 }
+
4909
+
4910 {
+
4911 testcase("RPC vault_info command line invalid ledger");
+
4912 Json::Value jv = env.rpc("vault_info", strHex(keylet.key), "0");
+
4913 BEAST_EXPECT(
+
4914 jv[jss::result][jss::error].asString() == "lgrNotFound");
+
4915 }
+
4916 }
-
4911
-
4912 void
-
- -
4914 {
-
4915 using namespace test::jtx;
-
4916
-
4917 Env env(*this, testable_amendments());
-
4918 Account alice{"alice"};
-
4919 Account bob{"bob"};
-
4920 Account carol{"carol"};
-
4921
-
4922 struct CaseArgs
-
4923 {
-
4924 PrettyAsset asset = xrpIssue();
-
4925 };
-
4926
-
4927 auto const xrpBalance =
-
4928 [this](
-
4929 Env const& env, Account const& account) -> std::optional<long> {
-
4930 auto sle = env.le(keylet::account(account.id()));
-
4931 if (BEAST_EXPECT(sle != nullptr))
-
4932 return sle->getFieldAmount(sfBalance).xrp().drops();
-
4933 return std::nullopt;
-
4934 };
-
4935
-
4936 auto testCase = [&, this](auto test, CaseArgs args = {}) {
-
4937 Env env{*this, testable_amendments() | featureSingleAssetVault};
-
4938
-
4939 Vault vault{env};
-
4940
-
4941 // use different initial amount to distinguish the source balance
-
4942 env.fund(XRP(10000), alice);
-
4943 env.fund(XRP(20000), bob);
-
4944 env.fund(XRP(30000), carol);
-
4945 env.close();
+
4917
+
4918 void
+
+ +
4920 {
+
4921 using namespace test::jtx;
+
4922
+
4923 Env env(*this, testable_amendments());
+
4924 Account alice{"alice"};
+
4925 Account bob{"bob"};
+
4926 Account carol{"carol"};
+
4927
+
4928 struct CaseArgs
+
4929 {
+
4930 PrettyAsset asset = xrpIssue();
+
4931 };
+
4932
+
4933 auto const xrpBalance =
+
4934 [this](
+
4935 Env const& env, Account const& account) -> std::optional<long> {
+
4936 auto sle = env.le(keylet::account(account.id()));
+
4937 if (BEAST_EXPECT(sle != nullptr))
+
4938 return sle->getFieldAmount(sfBalance).xrp().drops();
+
4939 return std::nullopt;
+
4940 };
+
4941
+
4942 auto testCase = [&, this](auto test, CaseArgs args = {}) {
+
4943 Env env{*this, testable_amendments() | featureSingleAssetVault};
+
4944
+
4945 Vault vault{env};
4946
-
4947 env(delegate::set(
-
4948 carol,
-
4949 alice,
-
4950 {"Payment",
-
4951 "VaultCreate",
-
4952 "VaultSet",
-
4953 "VaultDelete",
-
4954 "VaultDeposit",
-
4955 "VaultWithdraw",
-
4956 "VaultClawback"}));
-
4957
-
4958 test(env, vault, args.asset);
-
4959 };
-
4960
-
4961 testCase([&, this](Env& env, Vault& vault, PrettyAsset const& asset) {
-
4962 testcase("delegated vault creation");
-
4963 auto startBalance = xrpBalance(env, carol);
-
4964 if (!BEAST_EXPECT(startBalance.has_value()))
-
4965 return;
+
4947 // use different initial amount to distinguish the source balance
+
4948 env.fund(XRP(10000), alice);
+
4949 env.fund(XRP(20000), bob);
+
4950 env.fund(XRP(30000), carol);
+
4951 env.close();
+
4952
+
4953 env(delegate::set(
+
4954 carol,
+
4955 alice,
+
4956 {"Payment",
+
4957 "VaultCreate",
+
4958 "VaultSet",
+
4959 "VaultDelete",
+
4960 "VaultDeposit",
+
4961 "VaultWithdraw",
+
4962 "VaultClawback"}));
+
4963
+
4964 test(env, vault, args.asset);
+
4965 };
4966
-
4967 auto [tx, keylet] = vault.create({.owner = carol, .asset = asset});
-
4968 env(tx, delegate::as(alice));
-
4969 env.close();
-
4970 BEAST_EXPECT(xrpBalance(env, carol) == *startBalance);
-
4971 });
+
4967 testCase([&, this](Env& env, Vault& vault, PrettyAsset const& asset) {
+
4968 testcase("delegated vault creation");
+
4969 auto startBalance = xrpBalance(env, carol);
+
4970 if (!BEAST_EXPECT(startBalance.has_value()))
+
4971 return;
4972
-
4973 testCase([&, this](Env& env, Vault& vault, PrettyAsset const& asset) {
-
4974 testcase("delegated deposit and withdrawal");
-
4975 auto [tx, keylet] = vault.create({.owner = carol, .asset = asset});
-
4976 env(tx);
-
4977 env.close();
+
4973 auto [tx, keylet] = vault.create({.owner = carol, .asset = asset});
+
4974 env(tx, delegate::as(alice));
+
4975 env.close();
+
4976 BEAST_EXPECT(xrpBalance(env, carol) == *startBalance);
+
4977 });
4978
-
4979 auto const amount = 1513;
-
4980 auto const baseFee = env.current()->fees().base;
-
4981
-
4982 auto startBalance = xrpBalance(env, carol);
-
4983 if (!BEAST_EXPECT(startBalance.has_value()))
-
4984 return;
-
4985
-
4986 tx = vault.deposit(
-
4987 {.depositor = carol,
-
4988 .id = keylet.key,
-
4989 .amount = asset(amount)});
-
4990 env(tx, delegate::as(alice));
-
4991 env.close();
-
4992 BEAST_EXPECT(xrpBalance(env, carol) == *startBalance - amount);
-
4993
-
4994 tx = vault.withdraw(
-
4995 {.depositor = carol,
-
4996 .id = keylet.key,
-
4997 .amount = asset(amount - 1)});
-
4998 env(tx, delegate::as(alice));
-
4999 env.close();
-
5000 BEAST_EXPECT(xrpBalance(env, carol) == *startBalance - 1);
-
5001
-
5002 tx = vault.withdraw(
-
5003 {.depositor = carol, .id = keylet.key, .amount = asset(1)});
-
5004 env(tx);
+
4979 testCase([&, this](Env& env, Vault& vault, PrettyAsset const& asset) {
+
4980 testcase("delegated deposit and withdrawal");
+
4981 auto [tx, keylet] = vault.create({.owner = carol, .asset = asset});
+
4982 env(tx);
+
4983 env.close();
+
4984
+
4985 auto const amount = 1513;
+
4986 auto const baseFee = env.current()->fees().base;
+
4987
+
4988 auto startBalance = xrpBalance(env, carol);
+
4989 if (!BEAST_EXPECT(startBalance.has_value()))
+
4990 return;
+
4991
+
4992 tx = vault.deposit(
+
4993 {.depositor = carol,
+
4994 .id = keylet.key,
+
4995 .amount = asset(amount)});
+
4996 env(tx, delegate::as(alice));
+
4997 env.close();
+
4998 BEAST_EXPECT(xrpBalance(env, carol) == *startBalance - amount);
+
4999
+
5000 tx = vault.withdraw(
+
5001 {.depositor = carol,
+
5002 .id = keylet.key,
+
5003 .amount = asset(amount - 1)});
+
5004 env(tx, delegate::as(alice));
5005 env.close();
-
5006 BEAST_EXPECT(xrpBalance(env, carol) == *startBalance - baseFee);
-
5007 });
-
5008
-
5009 testCase([&, this](Env& env, Vault& vault, PrettyAsset const& asset) {
-
5010 testcase("delegated withdrawal same as base fee and deletion");
-
5011 auto [tx, keylet] = vault.create({.owner = carol, .asset = asset});
-
5012 env(tx);
-
5013 env.close();
+
5006 BEAST_EXPECT(xrpBalance(env, carol) == *startBalance - 1);
+
5007
+
5008 tx = vault.withdraw(
+
5009 {.depositor = carol, .id = keylet.key, .amount = asset(1)});
+
5010 env(tx);
+
5011 env.close();
+
5012 BEAST_EXPECT(xrpBalance(env, carol) == *startBalance - baseFee);
+
5013 });
5014
-
5015 auto const amount = 25537;
-
5016 auto const baseFee = env.current()->fees().base;
-
5017
-
5018 auto startBalance = xrpBalance(env, carol);
-
5019 if (!BEAST_EXPECT(startBalance.has_value()))
-
5020 return;
-
5021
-
5022 tx = vault.deposit(
-
5023 {.depositor = carol,
-
5024 .id = keylet.key,
-
5025 .amount = asset(amount)});
-
5026 env(tx);
-
5027 env.close();
-
5028 BEAST_EXPECT(
-
5029 xrpBalance(env, carol) == *startBalance - amount - baseFee);
-
5030
-
5031 tx = vault.withdraw(
-
5032 {.depositor = carol,
-
5033 .id = keylet.key,
-
5034 .amount = asset(baseFee)});
-
5035 env(tx, delegate::as(alice));
-
5036 env.close();
-
5037 BEAST_EXPECT(xrpBalance(env, carol) == *startBalance - amount);
-
5038
-
5039 tx = vault.withdraw(
-
5040 {.depositor = carol,
-
5041 .id = keylet.key,
-
5042 .amount = asset(amount - baseFee)});
-
5043 env(tx, delegate::as(alice));
-
5044 env.close();
-
5045 BEAST_EXPECT(xrpBalance(env, carol) == *startBalance - baseFee);
-
5046
-
5047 tx = vault.del({.owner = carol, .id = keylet.key});
-
5048 env(tx, delegate::as(alice));
-
5049 env.close();
-
5050 });
-
5051 }
-
+
5015 testCase([&, this](Env& env, Vault& vault, PrettyAsset const& asset) {
+
5016 testcase("delegated withdrawal same as base fee and deletion");
+
5017 auto [tx, keylet] = vault.create({.owner = carol, .asset = asset});
+
5018 env(tx);
+
5019 env.close();
+
5020
+
5021 auto const amount = 25537;
+
5022 auto const baseFee = env.current()->fees().base;
+
5023
+
5024 auto startBalance = xrpBalance(env, carol);
+
5025 if (!BEAST_EXPECT(startBalance.has_value()))
+
5026 return;
+
5027
+
5028 tx = vault.deposit(
+
5029 {.depositor = carol,
+
5030 .id = keylet.key,
+
5031 .amount = asset(amount)});
+
5032 env(tx);
+
5033 env.close();
+
5034 BEAST_EXPECT(
+
5035 xrpBalance(env, carol) == *startBalance - amount - baseFee);
+
5036
+
5037 tx = vault.withdraw(
+
5038 {.depositor = carol,
+
5039 .id = keylet.key,
+
5040 .amount = asset(baseFee)});
+
5041 env(tx, delegate::as(alice));
+
5042 env.close();
+
5043 BEAST_EXPECT(xrpBalance(env, carol) == *startBalance - amount);
+
5044
+
5045 tx = vault.withdraw(
+
5046 {.depositor = carol,
+
5047 .id = keylet.key,
+
5048 .amount = asset(amount - baseFee)});
+
5049 env(tx, delegate::as(alice));
+
5050 env.close();
+
5051 BEAST_EXPECT(xrpBalance(env, carol) == *startBalance - baseFee);
5052
-
5053public:
-
5054 void
-
-
5055 run() override
-
5056 {
-
5057 testSequences();
-
5058 testPreflight();
- - - -
5062 testWithMPT();
-
5063 testWithIOU();
- - - - -
5068 testScaleIOU();
-
5069 testRPC();
-
5070 testDelegate();
-
5071 }
+
5053 tx = vault.del({.owner = carol, .id = keylet.key});
+
5054 env(tx, delegate::as(alice));
+
5055 env.close();
+
5056 });
+
5057 }
-
5072};
+
5058
+
5059public:
+
5060 void
+
+
5061 run() override
+
5062 {
+
5063 testSequences();
+
5064 testPreflight();
+ + + +
5068 testWithMPT();
+
5069 testWithIOU();
+ + + + +
5074 testScaleIOU();
+
5075 testRPC();
+
5076 testDelegate();
+
5077 }
-
5073
-
5074BEAST_DEFINE_TESTSUITE_PRIO(Vault, app, ripple, 1);
-
5075
-
5076} // namespace ripple
+
5078};
+
+
5079
+
5080BEAST_DEFINE_TESTSUITE_PRIO(Vault, app, ripple, 1);
+
5081
+
5082} // namespace ripple
Represents a JSON value.
Definition json_value.h:131
A generic endpoint for log messages.
Definition Journal.h:41
@@ -5214,20 +5220,20 @@ $(document).ready(function() { init_codefold(0); }); - +
ripple::test::jtx::PrettyAsset PrettyAsset
- + - - + +
void testNonTransferableShares()
- +
static auto constexpr negativeAmount
-
void run() override
Runs the suite.
- +
void run() override
Runs the suite.
+ - +
constexpr value_type drops() const
Returns the number of drops.
Definition XRPAmount.h:158
Integers of any length that is a multiple of 32-bits.
Definition base_uint.h:67
diff --git a/classripple_1_1VaultCreate-members.html b/classripple_1_1VaultCreate-members.html index 7ebe4ba9ed..4ea437ac27 100644 --- a/classripple_1_1VaultCreate-members.html +++ b/classripple_1_1VaultCreate-members.html @@ -82,7 +82,7 @@ $(function() { account_ripple::Transactorprotected apply()ripple::Transactorprotected Blocker enum valueripple::Transactor - calculateBaseFee(ReadView const &view, STTx const &tx)ripple::VaultCreatestatic + calculateBaseFee(ReadView const &view, STTx const &tx)ripple::Transactorstatic calculateOwnerReserveFee(ReadView const &view, STTx const &tx)ripple::Transactorprotectedstatic checkBatchSign(PreclaimContext const &ctx)ripple::Transactorstatic checkExtraFeatures(PreflightContext const &ctx)ripple::VaultCreatestatic diff --git a/classripple_1_1VaultCreate.html b/classripple_1_1VaultCreate.html index 5dfd65e344..785d96904b 100644 --- a/classripple_1_1VaultCreate.html +++ b/classripple_1_1VaultCreate.html @@ -255,8 +255,6 @@ Static Public Member Functions   static NotTEC preflight (PreflightContext const &ctx)   -static XRPAmount calculateBaseFee (ReadView const &view, STTx const &tx) -  static TER preclaim (PreclaimContext const &ctx)   static NotTEC checkSeqProxy (ReadView const &view, STTx const &tx, beast::Journal j) @@ -269,6 +267,8 @@ Static Public Member Functions   static NotTEC checkBatchSign (PreclaimContext const &ctx)   +static XRPAmount calculateBaseFee (ReadView const &view, STTx const &tx) +  template<class T > static NotTEC invokePreflight (PreflightContext const &ctx)   @@ -500,44 +500,6 @@ Static Private Member Functions

Definition at line 36 of file VaultCreate.cpp.

-
-
- -

◆ calculateBaseFee()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
XRPAmount ripple::VaultCreate::calculateBaseFee (ReadView const & view,
STTx const & tx 
)
-
-static
-
- -

Definition at line 83 of file VaultCreate.cpp.

-
@@ -564,7 +526,7 @@ Static Private Member Functions
-

Definition at line 90 of file VaultCreate.cpp.

+

Definition at line 83 of file VaultCreate.cpp.

@@ -593,7 +555,7 @@ Static Private Member Functions

Implements ripple::Transactor.

-

Definition at line 129 of file VaultCreate.cpp.

+

Definition at line 122 of file VaultCreate.cpp.

@@ -900,6 +862,44 @@ Static Private Member Functions

Definition at line 708 of file Transactor.cpp.

+ + + +

◆ calculateBaseFee()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
XRPAmount ripple::Transactor::calculateBaseFee (ReadView const & view,
STTx const & tx 
)
+
+staticinherited
+
+ +

Definition at line 266 of file Transactor.cpp.

+
diff --git a/classripple_1_1Vault__test.html b/classripple_1_1Vault__test.html index 9091c87e27..02f17bf42e 100644 --- a/classripple_1_1Vault__test.html +++ b/classripple_1_1Vault__test.html @@ -545,7 +545,7 @@ Static Private Attributes
-

Definition at line 2450 of file Vault_test.cpp.

+

Definition at line 2454 of file Vault_test.cpp.

@@ -572,7 +572,7 @@ Static Private Attributes
-

Definition at line 3153 of file Vault_test.cpp.

+

Definition at line 3159 of file Vault_test.cpp.

@@ -599,7 +599,7 @@ Static Private Attributes
-

Definition at line 3446 of file Vault_test.cpp.

+

Definition at line 3452 of file Vault_test.cpp.

@@ -626,7 +626,7 @@ Static Private Attributes
-

Definition at line 3551 of file Vault_test.cpp.

+

Definition at line 3557 of file Vault_test.cpp.

@@ -653,7 +653,7 @@ Static Private Attributes
-

Definition at line 3580 of file Vault_test.cpp.

+

Definition at line 3586 of file Vault_test.cpp.

@@ -680,7 +680,7 @@ Static Private Attributes
-

Definition at line 4444 of file Vault_test.cpp.

+

Definition at line 4450 of file Vault_test.cpp.

@@ -707,7 +707,7 @@ Static Private Attributes
-

Definition at line 4913 of file Vault_test.cpp.

+

Definition at line 4919 of file Vault_test.cpp.

@@ -738,7 +738,7 @@ Static Private Attributes

Implements beast::unit_test::suite.

-

Definition at line 5055 of file Vault_test.cpp.

+

Definition at line 5061 of file Vault_test.cpp.

diff --git a/functions_c.html b/functions_c.html index 09cd9a7104..9c5011d1e5 100644 --- a/functions_c.html +++ b/functions_c.html @@ -85,23 +85,23 @@ $(function() {
  • cachedSLEs() : ripple::Application, ripple::ApplicationImp
  • cachedSLEs_ : ripple::ApplicationImp
  • CachedView() : ripple::CachedView< Base >
  • -
  • CachedViewImpl() : ripple::detail::CachedViewImpl
  • +
  • CachedViewImpl() : ripple::detail::CachedViewImpl
  • cacheLookup() : ripple::SHAMap
  • cacheSize() : ripple::InboundLedgers, ripple::InboundLedgersImp, ripple::test::MagicInboundLedgers
  • CacheType : ripple::detail::BasicFullBelowCache
  • cacheValidatorFile() : ripple::ValidatorList
  • caClaimID() : ripple::test::SEnv< T >
  • calcID() : ripple::test::csf::TxSet
  • -
  • calcMedFeeLevel() : ripple::test::TxQPosNegFlows_test
  • +
  • calcMedFeeLevel() : ripple::test::TxQPosNegFlows_test
  • calcOutPeers() : ripple::PeerFinder::Config
  • calculateBalanceChange() : ripple::TransfersNotFrozen
  • -
  • calculateBaseFee() : ripple::AMMCreate, ripple::Batch, ripple::Change, ripple::DeleteAccount, ripple::EscrowFinish, ripple::LedgerStateFix, ripple::SetRegularKey, ripple::Transactor, ripple::VaultCreate
  • +
  • calculateBaseFee() : ripple::AMMCreate, ripple::Batch, ripple::Change, ripple::DeleteAccount, ripple::EscrowFinish, ripple::LedgerStateFix, ripple::SetRegularKey, ripple::Transactor
  • calculateOwnerReserveFee() : ripple::Transactor
  • calculateQuorum() : ripple::ValidatorList
  • calculateTweak() : ripple::detail::Generator
  • calculationResult_ : ripple::path::RippleCalc::Output
  • callback : AutoSocket
  • -
  • Callback() : ripple::NodeStore::BatchWriter::Callback, ripple::Workers::Callback
  • +
  • Callback() : ripple::NodeStore::BatchWriter::Callback, ripple::Workers::Callback
  • callback_type : ripple::detail::WorkBase< Impl >, ripple::detail::WorkFile
  • CallData() : ripple::GRPCServerImpl::CallData< Request, Response >
  • callRPCHandler() : ripple::RPCCallImp
  • @@ -160,7 +160,7 @@ $(function() {
  • Char : Json::Reader
  • char_type : beast::basic_logstream< CharT, Traits >
  • charge() : ripple::Peer, ripple::PeerImp
  • -
  • Charge() : ripple::Resource::Charge
  • +
  • Charge() : ripple::Resource::Charge
  • charge() : ripple::Resource::Consumer, ripple::Resource::Logic, ripple::test::PeerPartial, ripple::test::TestPeer
  • CharT : beast::divider
  • check() : beast::SemanticVersion_test, ripple::BookStep< TIn, TOut, TDerived >, ripple::DirectIOfferCrossingStep, ripple::DirectIPaymentStep, ripple::DirectStepI< TDerived >, ripple::hardened_hash_test, ripple::Keylet, ripple::ProtocolVersion_test, ripple::PublicKey_test, ripple::RCLCensorshipDetector< TxID, Sequence >, ripple::RPC::LedgerHandler, ripple::RPC::VersionHandler, ripple::XRPEndpointStep< TDerived >
  • @@ -241,8 +241,8 @@ $(function() {
  • checkResult() : ripple::test::ValidatorList_test
  • checkSanity() : ripple::test::AccountTx_test
  • checkSeqProxy() : ripple::Transactor
  • -
  • checkSign() : ripple::Batch, ripple::RCLCxPeerPos, ripple::STTx, ripple::Transactor
  • -
  • checkSigs() : ripple::Application, ripple::ApplicationImp
  • +
  • checkSign() : ripple::Batch, ripple::RCLCxPeerPos, ripple::STTx, ripple::Transactor
  • +
  • checkSigs() : ripple::Application, ripple::ApplicationImp
  • checkSigs_ : ripple::ApplicationImp
  • checkSingleSign() : ripple::STTx, ripple::Transactor
  • checksOnAccount() : ripple::Check_test
  • @@ -250,11 +250,11 @@ $(function() {
  • checkStrongMaxValue : ripple::IntrusiveRefCounts::RefCountPair
  • checkTicketConsumeMeta() : ripple::Ticket_test
  • checkTicketCreateMeta() : ripple::Ticket_test
  • -
  • checkTracking() : ripple::Overlay, ripple::OverlayImpl, ripple::PeerImp
  • +
  • checkTracking() : ripple::Overlay, ripple::OverlayImpl, ripple::PeerImp
  • checkTransaction() : ripple::AccountTxPaging_test, ripple::PeerImp
  • checkTransferFee() : ripple::test::jtx::MPTTester
  • checkTxn() : ripple::test::CheckDeliveredAmount
  • -
  • checkUnorderedContentsRefRef() : beast::aged_associative_container_test_base
  • +
  • checkUnorderedContentsRefRef() : beast::aged_associative_container_test_base
  • checkUpdate() : ripple::PeerFinder::Bootcache
  • checkValidation() : ripple::PeerImp
  • checkValues() : beast::SemanticVersion_test
  • @@ -287,7 +287,7 @@ $(function() {
  • cleanup() : ripple::detail::LocalValues, ripple::test::WSClientImpl
  • cleanupDatabaseDir() : ripple::SociDB_test, ripple::test::Manifest_test
  • cleanupOldOffers() : ripple::test::ReducedOffer_test
  • -
  • clear() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::Buckets, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::List< T, Tag >, Json::Value, ripple::AMMContext, ripple::Buffer, ripple::detail::BasicFullBelowCache, ripple::partitioned_unordered_map< Key, Value, Hash, Pred, Alloc >, ripple::PeerFinder::Bootcache, ripple::STAmount, ripple::STArray, ripple::STVector256, ripple::TaggedCache< Key, T, IsKeyCache, SharedWeakUnionPointerType, SharedPointerType, Hash, KeyEqual, Mutex >, ripple::test::OverlaySim, ripple::test::Validator, ripple::Transaction::SubmitResult
  • +
  • clear() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::Buckets, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::List< T, Tag >, Json::Value, ripple::AMMContext, ripple::Buffer, ripple::detail::BasicFullBelowCache, ripple::partitioned_unordered_map< Key, Value, Hash, Pred, Alloc >, ripple::PeerFinder::Bootcache, ripple::STAmount, ripple::STArray, ripple::STVector256, ripple::TaggedCache< Key, T, IsKeyCache, SharedWeakUnionPointerType, SharedPointerType, Hash, KeyEqual, Mutex >, ripple::test::OverlaySim, ripple::test::Validator, ripple::Transaction::SubmitResult
  • clearAmendmentWarned() : ripple::NetworkOPs, ripple::NetworkOPsImp
  • clearApplying() : ripple::Transaction
  • clearCaches() : ripple::SHAMapStoreImp
  • @@ -312,12 +312,12 @@ $(function() {
  • clientIsUnlimited() : ripple::GRPCServerImpl::CallData< Request, Response >
  • clientMsgHandler : ripple::test::LedgerReplayClient
  • Clock : beast::aged_associative_container_test_base::TestTraitsBase, beast::basic_seconds_clock
  • -
  • clock() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::config_t, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::config_t, ripple::detail::BasicFullBelowCache, ripple::path::detail::FlowDebugInfo, ripple::Resource::ResourceManager_test::TestLogic, ripple::TaggedCache< Key, T, IsKeyCache, SharedWeakUnionPointerType, SharedPointerType, Hash, KeyEqual, Mutex >, ripple::test::csf::Scheduler, ripple::test::csf::Validations_test::TestHarness, ripple::tests::TestNodeFamily
  • +
  • clock() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::config_t, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::config_t, ripple::detail::BasicFullBelowCache, ripple::path::detail::FlowDebugInfo, ripple::Resource::ResourceManager_test::TestLogic, ripple::TaggedCache< Key, T, IsKeyCache, SharedWeakUnionPointerType, SharedPointerType, Hash, KeyEqual, Mutex >, ripple::test::csf::Scheduler, ripple::test::csf::Validations_test::TestHarness, ripple::tests::TestNodeFamily
  • clock_ : ripple::Consensus< Adaptor >, ripple::PeerFinder::Livecache_test, ripple::test::csf::BasicSink, ripple::test::csf::Scheduler, ripple::test::csf::Validations_test::TestHarness, ripple::tests::TestNodeFamily
  • clock_type : beast::abstract_clock< Clock >, beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::unit_test::detail::reporter< class >, ripple::BaseHTTPPeer< Handler, Impl >, ripple::BasePeer< Handler, Impl >, ripple::BaseWSPeer< Handler, Impl >, ripple::Consensus< Adaptor >, ripple::detail::BasicFullBelowCache, ripple::Door< Handler >, ripple::InboundLedger, ripple::InboundLedgers, ripple::InboundTransactions, ripple::Job, ripple::metrics::SingleMetrics, ripple::NetworkOPs, ripple::NodeStore::progress, ripple::NodeStore::Timing_test, ripple::OverlayImpl, ripple::PeerImp, ripple::PlainWSPeer< Handler >, ripple::Resource::Logic, ripple::Resource::ResourceManager_test::TestLogic, ripple::ServerImpl< Handler >, ripple::SSLWSPeer< Handler >, ripple::TaggedCache< Key, T, IsKeyCache, SharedWeakUnionPointerType, SharedPointerType, Hash, KeyEqual, Mutex >, ripple::test::csf::BasicNetwork< Peer >, ripple::test::csf::Scheduler, ripple::test::csf::Validations_test, ripple::test::OverlaySim, ripple::ValidatorSite
  • clockSkew : ripple::test::csf::Peer
  • clone() : ripple::GRPCServerImpl::CallData< Request, Response >, ripple::Processor, ripple::SHAMapAccountStateLeafNode, ripple::SHAMapInnerNode, ripple::SHAMapTreeNode, ripple::SHAMapTxLeafNode, ripple::SHAMapTxPlusMetaLeafNode, ripple::test::jtx::basic_prop, ripple::test::jtx::prop_type< T >, ripple::test::Manifest_test
  • -
  • close() : ripple::BaseHTTPPeer< Handler, Impl >, ripple::BasePeer< Handler, Impl >, ripple::BaseWSPeer< Handler, Impl >, ripple::ConnectAttempt, ripple::detail::WorkBase< Impl >, ripple::Door< Handler >, ripple::Door< Handler >::Detector, ripple::io_list, ripple::io_list::work, ripple::Logs::File, ripple::NodeStore::Backend, ripple::NodeStore::MemoryBackend, ripple::NodeStore::NuDBBackend, ripple::NodeStore::NullBackend, ripple::PeerImp, ripple::Server, ripple::ServerImpl< Handler >, ripple::Session, ripple::short_read_test::Base::Child, ripple::short_read_test::Base, ripple::short_read_test::Client::Connection, ripple::short_read_test::Server::Acceptor, ripple::short_read_test::Server::Connection, ripple::test::jtx::CreateArg, ripple::test::jtx::Env, ripple::test::jtx::MPTInit, ripple::test::jtx::oracle::CreateArg, ripple::test::SEnv< T >, ripple::WSSession
  • +
  • close() : ripple::BaseHTTPPeer< Handler, Impl >, ripple::BasePeer< Handler, Impl >, ripple::BaseWSPeer< Handler, Impl >, ripple::ConnectAttempt, ripple::detail::WorkBase< Impl >, ripple::Door< Handler >, ripple::Door< Handler >::Detector, ripple::io_list, ripple::io_list::work, ripple::Logs::File, ripple::NodeStore::Backend, ripple::NodeStore::MemoryBackend, ripple::NodeStore::NuDBBackend, ripple::NodeStore::NullBackend, ripple::PeerImp, ripple::Server, ripple::ServerImpl< Handler >, ripple::Session, ripple::short_read_test::Base::Child, ripple::short_read_test::Base, ripple::short_read_test::Client::Connection, ripple::short_read_test::Server::Acceptor, ripple::short_read_test::Server::Connection, ripple::test::jtx::CreateArg, ripple::test::jtx::Env, ripple::test::jtx::MPTInit, ripple::test::jtx::oracle::CreateArg, ripple::test::SEnv< T >, ripple::WSSession
  • close_ : ripple::test::jtx::MPTTester
  • close_on_timer_ : ripple::BaseWSPeer< Handler, Impl >
  • closeAgree() : ripple::RCLCxLedger, ripple::test::csf::Ledger
  • @@ -348,7 +348,7 @@ $(function() {
  • cluster() : ripple::Peer, ripple::PeerImp, ripple::test::PeerPartial, ripple::test::TestPeer, ripple::TrafficCount
  • cluster_ : ripple::ApplicationImp
  • cluster_test() : ripple::tests::cluster_test
  • -
  • ClusterNode() : ripple::ClusterNode
  • +
  • ClusterNode() : ripple::ClusterNode
  • clusterTimer_ : ripple::NetworkOPsImp
  • clusterTxnLoadFee_ : ripple::LoadFeeTrack
  • cMaxNative : ripple::STAmount
  • @@ -401,7 +401,7 @@ $(function() {
  • compression_test() : ripple::test::compression_test
  • compressionEnabled() : ripple::Peer, ripple::PeerImp, ripple::test::PeerPartial, ripple::test::TestPeer
  • compressionEnabled_ : ripple::PeerImp
  • -
  • CompT() : beast::aged_associative_container_test_base::CompT< T >
  • +
  • CompT() : beast::aged_associative_container_test_base::CompT< T >
  • computeDistance() : Json::ValueIteratorBase
  • computePathRanks() : ripple::Pathfinder
  • computeReserveReduction() : ripple::XRPEndpointOfferCrossingStep
  • @@ -418,7 +418,7 @@ $(function() {
  • config_ : ripple::ApplicationImp, ripple::detail::RippledCfgGuard, ripple::PeerFinder::Logic< Checker >
  • CONFIG_DIR : ripple::Config
  • CONFIG_FILE : ripple::Config
  • -
  • config_t() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::config_t, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::config_t
  • +
  • config_t() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::config_t, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::config_t
  • configFile() : ripple::detail::RippledCfgGuard
  • configFileExists() : ripple::detail::RippledCfgGuard
  • configFileName : ripple::Config
  • @@ -426,7 +426,7 @@ $(function() {
  • configInvalid_ : ripple::ValidatorKeys
  • ConfigSection() : ripple::ConfigSection
  • confuseMap() : ripple::tests::SHAMapSync_test
  • -
  • connect() : ripple::Overlay, ripple::OverlayImpl, ripple::PeerFinder::Slot, ripple::test::csf::BasicNetwork< Peer >, ripple::test::csf::Digraph< Vertex, EdgeData >, ripple::test::csf::Peer, ripple::test::csf::PeerGroup, ripple::test::Server_test
  • +
  • connect() : ripple::Overlay, ripple::OverlayImpl, ripple::PeerFinder::Slot, ripple::test::csf::BasicNetwork< Peer >, ripple::test::csf::Digraph< Vertex, EdgeData >, ripple::test::csf::Peer, ripple::test::csf::PeerGroup, ripple::test::Server_test
  • ConnectAttempt() : ripple::ConnectAttempt
  • connectCount() : ripple::PeerFinder::Counts
  • connected : ripple::PeerFinder::Slot, ripple::test::csf::Digraph< Vertex, EdgeData >
  • @@ -462,10 +462,10 @@ $(function() {
  • ConsequencesFactory : ripple::AMMBid, ripple::AMMClawback, ripple::AMMCreate, ripple::AMMDelete, ripple::AMMDeposit, ripple::AMMVote, ripple::AMMWithdraw, ripple::Batch, ripple::BridgeModify, ripple::CancelCheck, ripple::CancelOffer, ripple::CashCheck, ripple::Change, ripple::Clawback, ripple::CreateCheck, ripple::CreateOffer, ripple::CreateTicket, ripple::CredentialAccept, ripple::CredentialCreate, ripple::CredentialDelete, ripple::DelegateSet, ripple::DeleteAccount, ripple::DeleteOracle, ripple::DepositPreauth, ripple::DIDDelete, ripple::DIDSet, ripple::EscrowCancel, ripple::EscrowCreate, ripple::EscrowFinish, ripple::LedgerStateFix, ripple::MPTokenAuthorize, ripple::MPTokenIssuanceCreate, ripple::MPTokenIssuanceDestroy, ripple::MPTokenIssuanceSet, ripple::NFTokenAcceptOffer, ripple::NFTokenBurn, ripple::NFTokenCancelOffer, ripple::NFTokenCreateOffer, ripple::NFTokenMint, ripple::NFTokenModify, ripple::PayChanClaim, ripple::PayChanCreate, ripple::PayChanFund, ripple::Payment, ripple::PermissionedDomainDelete, ripple::PermissionedDomainSet, ripple::SetAccount, ripple::SetOracle, ripple::SetRegularKey, ripple::SetSignerList, ripple::SetTrust, ripple::VaultClawback, ripple::VaultCreate, ripple::VaultDelete, ripple::VaultDeposit, ripple::VaultSet, ripple::VaultWithdraw, ripple::XChainAddAccountCreateAttestation, ripple::XChainAddClaimAttestation, ripple::XChainClaim, ripple::XChainCommit, ripple::XChainCreateAccountCommit, ripple::XChainCreateBridge, ripple::XChainCreateClaimID
  • ConsequencesFactoryType : ripple::Transactor
  • considered_ : ripple::reduce_relay::Slot< clock_type >
  • -
  • console() : beast::Journal::Sink, beast::NullJournalSink, beast::WrappedSink
  • +
  • console() : beast::Journal::Sink, beast::NullJournalSink, beast::WrappedSink
  • const_buffer : ripple::ZeroCopyInputStream< Buffers >
  • const_buffers_type : ripple::json_body::reader, ripple::json_body::writer
  • -
  • const_iterator : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::chronological_t, beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::chronological_t, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::List< T, Tag >, beast::LockFreeStack< Element, Tag >, beast::unit_test::detail::const_container< Container >, Json::Value, ripple::base_uint< Bits, Tag >, ripple::BookDirs::const_iterator, ripple::Buffer, ripple::CanonicalTXSet, ripple::detail::ReadViewFwdRange< ValueType >, ripple::Dir::const_iterator, ripple::JobTypes, ripple::partitioned_unordered_map< Key, Value, Hash, Pred, Alloc >::const_iterator, ripple::PeerFinder::Bootcache, ripple::PeerFinder::detail::LivecacheBase::Hop< IsConst >, ripple::PeerFinder::Livecache< Allocator >::hops_t, ripple::PublicKey, ripple::SecretKey, ripple::Section, ripple::Seed, ripple::SHAMap::const_iterator, ripple::Slice, ripple::STArray, ripple::test::csf::PeerGroup
  • +
  • const_iterator : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::chronological_t, beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::chronological_t, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::List< T, Tag >, beast::LockFreeStack< Element, Tag >, beast::unit_test::detail::const_container< Container >, Json::Value, ripple::base_uint< Bits, Tag >, ripple::BookDirs::const_iterator, ripple::Buffer, ripple::CanonicalTXSet, ripple::detail::ReadViewFwdRange< ValueType >, ripple::Dir::const_iterator, ripple::JobTypes, ripple::partitioned_unordered_map< Key, Value, Hash, Pred, Alloc >::const_iterator, ripple::PeerFinder::Bootcache, ripple::PeerFinder::detail::LivecacheBase::Hop< IsConst >, ripple::PeerFinder::Livecache< Allocator >::hops_t, ripple::PublicKey, ripple::SecretKey, ripple::Section, ripple::Seed, ripple::SHAMap::const_iterator, ripple::Slice, ripple::STArray, ripple::test::csf::PeerGroup
  • const_iterator_to() : beast::List< T, Tag >
  • const_local_iterator : beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >
  • const_pointer : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::List< T, Tag >, beast::LockFreeStack< Element, Tag >, ripple::base_uint< Bits, Tag >, ripple::partitioned_unordered_map< Key, Value, Hash, Pred, Alloc >, ripple::STLedgerEntry
  • @@ -483,9 +483,9 @@ $(function() {
  • consumer_ : ripple::PathRequest
  • consumeSeqProxy() : ripple::Transactor
  • Cont : beast::aged_associative_container_test_base::ContType< Base, IsUnordered >, beast::aged_associative_container_test_base::ContType< Base, true >
  • -
  • cont() : beast::unit_test::detail::const_container< Container >
  • +
  • cont() : beast::unit_test::detail::const_container< Container >
  • cont_type : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::unit_test::detail::const_container< Container >
  • -
  • contains() : ripple::PeerReservationTable, ripple::test::csf::PeerGroup
  • +
  • contains() : ripple::PeerReservationTable, ripple::test::csf::PeerGroup
  • context() : ripple::AMMLiquidity< TIn, TOut >, ripple::HTTPClientSSLContext, ripple::LedgerFill, ripple::Overlay::Setup, ripple::PeerImp::ChargeWithContext, ripple::Port, ripple::test::GRPCTestClientBase
  • context_ : ripple::detail::WorkSSL, ripple::RPC::LedgerHandler, ripple::short_read_test, ripple::test::tx_reduce_relay_test
  • continue_keep_alive_ : ripple::test::multi_runner_child
  • @@ -507,7 +507,7 @@ $(function() {
  • Coro_create_t() : ripple::Coro_create_t
  • correct_order() : ripple::test::Coroutine_test
  • cost : ripple::cryptoconditions::Condition, ripple::cryptoconditions::Fulfillment, ripple::cryptoconditions::PreimageSha256, ripple::Resource::Charge
  • -
  • count() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::Journal_test::TestSink, ripple::ClosureCounter< Ret_t, Args_t >, ripple::LoadMonitor::Stats, ripple::path::detail::FlowDebugInfo, ripple::reduce_relay::Slot< clock_type >::PeerInfo, ripple::test::csf::Rate, ripple::test::ElementComboIter, ripple::tests::Barrier, ripple::TOfferStreamBase< TIn, TOut >::StepCounter, ripple::ValidatorList, ripple::Workers_test::TestCallback
  • +
  • count() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::Journal_test::TestSink, ripple::ClosureCounter< Ret_t, Args_t >, ripple::LoadMonitor::Stats, ripple::path::detail::FlowDebugInfo, ripple::reduce_relay::Slot< clock_type >::PeerInfo, ripple::test::csf::Rate, ripple::test::ElementComboIter, ripple::tests::Barrier, ripple::TOfferStreamBase< TIn, TOut >::StepCounter, ripple::ValidatorList, ripple::Workers_test::TestCallback
  • count_ : ripple::CountedObjects::Counter, ripple::ServerHandler, ripple::TOfferStreamBase< TIn, TOut >::StepCounter, ripple::ZeroCopyInputStream< Buffers >, ripple::ZeroCopyOutputStream< Streambuf >
  • countDeltas() : ripple::test::LedgerReplayClient
  • CountedObject() : ripple::CountedObject< Object >
  • @@ -587,7 +587,7 @@ $(function() {
  • crend() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::chronological_t, beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::chronological_t, ripple::PeerFinder::detail::LivecacheBase::Hop< IsConst >, ripple::PeerFinder::Livecache< Allocator >::hops_t
  • cryptoconditions_error_category() : ripple::cryptoconditions::detail::cryptoconditions_error_category
  • cs : ripple::test::csf::Collectors< Cs >
  • -
  • csprng_engine() : ripple::csprng_engine
  • +
  • csprng_engine() : ripple::csprng_engine
  • cstr_ : Json::Value::CZString
  • csv() : ripple::test::csf::LedgerCollector, ripple::test::csf::TxCollector
  • ctid : ripple::TxArgs, ripple::TxResult
  • diff --git a/functions_func_c.html b/functions_func_c.html index a55af6d484..45040dcd0a 100644 --- a/functions_func_c.html +++ b/functions_func_c.html @@ -79,7 +79,7 @@ $(function() {
  • cachedIn() : ripple::BookStep< TIn, TOut, TDerived >, ripple::DirectStepI< TDerived >, ripple::Step, ripple::XRPEndpointStep< TDerived >
  • cachedOut() : ripple::BookStep< TIn, TOut, TDerived >, ripple::DirectStepI< TDerived >, ripple::Step, ripple::XRPEndpointStep< TDerived >
  • cachedSLEs() : ripple::Application, ripple::ApplicationImp
  • -
  • CachedView() : ripple::CachedView< Base >
  • +
  • CachedView() : ripple::CachedView< Base >
  • CachedViewImpl() : ripple::detail::CachedViewImpl
  • cacheLookup() : ripple::SHAMap
  • cacheSize() : ripple::InboundLedgers, ripple::InboundLedgersImp, ripple::test::MagicInboundLedgers
  • @@ -89,17 +89,17 @@ $(function() {
  • calcMedFeeLevel() : ripple::test::TxQPosNegFlows_test
  • calcOutPeers() : ripple::PeerFinder::Config
  • calculateBalanceChange() : ripple::TransfersNotFrozen
  • -
  • calculateBaseFee() : ripple::AMMCreate, ripple::Batch, ripple::Change, ripple::DeleteAccount, ripple::EscrowFinish, ripple::LedgerStateFix, ripple::SetRegularKey, ripple::Transactor, ripple::VaultCreate
  • +
  • calculateBaseFee() : ripple::AMMCreate, ripple::Batch, ripple::Change, ripple::DeleteAccount, ripple::EscrowFinish, ripple::LedgerStateFix, ripple::SetRegularKey, ripple::Transactor
  • calculateOwnerReserveFee() : ripple::Transactor
  • calculateQuorum() : ripple::ValidatorList
  • calculateTweak() : ripple::detail::Generator
  • -
  • Callback() : ripple::NodeStore::BatchWriter::Callback, ripple::Workers::Callback
  • +
  • Callback() : ripple::NodeStore::BatchWriter::Callback, ripple::Workers::Callback
  • CallData() : ripple::GRPCServerImpl::CallData< Request, Response >
  • callRPCHandler() : ripple::RPCCallImp
  • can_activate() : ripple::PeerFinder::Counts
  • canBeCurrent() : ripple::LedgerMaster
  • canBeHeld() : ripple::TxQ
  • -
  • cancel() : AutoSocket, beast::io_latency_probe< Clock >, ripple::ApplicationImp::io_latency_sampler, ripple::detail::Work, ripple::detail::WorkBase< Impl >, ripple::detail::WorkFile, ripple::PeerFinder::Source, ripple::test::csf::Scheduler, ripple::TimeoutCounter
  • +
  • cancel() : AutoSocket, beast::io_latency_probe< Clock >, ripple::ApplicationImp::io_latency_sampler, ripple::detail::Work, ripple::detail::WorkBase< Impl >, ripple::detail::WorkFile, ripple::PeerFinder::Source, ripple::test::csf::Scheduler, ripple::TimeoutCounter
  • cancel_async() : beast::io_latency_probe< Clock >, ripple::ApplicationImp::io_latency_sampler
  • cancel_timer() : ripple::BaseHTTPPeer< Handler, Impl >, ripple::BaseWSPeer< Handler, Impl >
  • cancel_token() : ripple::test::csf::Scheduler::cancel_token
  • @@ -122,7 +122,7 @@ $(function() {
  • cases() : beast::unit_test::results
  • CashCheck() : ripple::CashCheck
  • categorize() : ripple::TrafficCount
  • -
  • cbegin() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::chronological_t, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::chronological_t, beast::List< T, Tag >, beast::LockFreeStack< Element, Tag >, beast::unit_test::detail::const_container< Container >, ripple::base_uint< Bits, Tag >, ripple::Buffer, ripple::JobTypes, ripple::partitioned_unordered_map< Key, Value, Hash, Pred, Alloc >, ripple::PeerFinder::Bootcache, ripple::PeerFinder::detail::LivecacheBase::Hop< IsConst >, ripple::PeerFinder::Livecache< Allocator >::hops_t, ripple::PublicKey, ripple::SecretKey, ripple::Section, ripple::Seed, ripple::Slice, ripple::SOTemplate
  • +
  • cbegin() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::chronological_t, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::chronological_t, beast::List< T, Tag >, beast::LockFreeStack< Element, Tag >, beast::unit_test::detail::const_container< Container >, ripple::base_uint< Bits, Tag >, ripple::Buffer, ripple::JobTypes, ripple::partitioned_unordered_map< Key, Value, Hash, Pred, Alloc >, ripple::PeerFinder::Bootcache, ripple::PeerFinder::detail::LivecacheBase::Hop< IsConst >, ripple::PeerFinder::Livecache< Allocator >::hops_t, ripple::PublicKey, ripple::SecretKey, ripple::Section, ripple::Seed, ripple::Slice, ripple::SOTemplate
  • ceil_in() : ripple::Quality_test
  • ceil_log2() : ripple::ServerImpl< Handler >
  • ceil_out() : ripple::Quality_test
  • @@ -136,7 +136,7 @@ $(function() {
  • channelExpiration() : ripple::test::PayChan_test
  • channelKeyAndSle() : ripple::test::PayChan_test
  • charge() : ripple::Peer, ripple::PeerImp
  • -
  • Charge() : ripple::Resource::Charge
  • +
  • Charge() : ripple::Resource::Charge
  • charge() : ripple::Resource::Consumer, ripple::Resource::Logic, ripple::test::PeerPartial, ripple::test::TestPeer
  • check() : beast::SemanticVersion_test, ripple::BookStep< TIn, TOut, TDerived >, ripple::DirectIOfferCrossingStep, ripple::DirectIPaymentStep, ripple::DirectStepI< TDerived >, ripple::hardened_hash_test, ripple::Keylet, ripple::ProtocolVersion_test, ripple::PublicKey_test, ripple::RCLCensorshipDetector< TxID, Sequence >, ripple::RPC::LedgerHandler, ripple::RPC::VersionHandler, ripple::XRPEndpointStep< TDerived >
  • check_container() : ripple::hardened_hash_test
  • @@ -152,7 +152,7 @@ $(function() {
  • checkBatchSingleSign() : ripple::STTx
  • checkCandidateSizes() : ripple::test::NegativeUNLVoteInternal_test
  • checkComplete() : ripple::PeerFinder::Logic< Checker >
  • -
  • checkContents() : beast::aged_associative_container_test_base
  • +
  • checkContents() : beast::aged_associative_container_test_base
  • checkContentsRefRef() : beast::aged_associative_container_test_base
  • checkCounting() : ripple::test::reduce_relay_test
  • checkCredentialsResponse() : ripple::test::DepositAuthorized_test
  • @@ -211,7 +211,7 @@ $(function() {
  • checkSanity() : ripple::test::AccountTx_test
  • checkSeqProxy() : ripple::Transactor
  • checkSign() : ripple::Batch, ripple::RCLCxPeerPos, ripple::STTx, ripple::Transactor
  • -
  • checkSigs() : ripple::Application, ripple::ApplicationImp
  • +
  • checkSigs() : ripple::Application, ripple::ApplicationImp
  • checkSingleSign() : ripple::STTx, ripple::Transactor
  • checksOnAccount() : ripple::Check_test
  • checkStatus() : ripple::test::LedgerReplayClient
  • @@ -233,7 +233,7 @@ $(function() {
  • ci_equal_pred() : beast::rfc2616::detail::ci_equal_pred
  • claim() : ripple::test::XChainSim_test::SmTransfer
  • claimCount() : ripple::test::SEnv< T >
  • -
  • claimID() : ripple::test::SEnv< T >
  • +
  • claimID() : ripple::test::SEnv< T >
  • clamp() : ripple::ledger_trie_detail::Span< Ledger >
  • clampFetchDepth() : ripple::SHAMapStore, ripple::SHAMapStoreImp
  • claw() : ripple::test::jtx::MPTTester
  • @@ -243,7 +243,7 @@ $(function() {
  • cleanup() : ripple::detail::LocalValues, ripple::test::WSClientImpl
  • cleanupDatabaseDir() : ripple::SociDB_test, ripple::test::Manifest_test
  • cleanupOldOffers() : ripple::test::ReducedOffer_test
  • -
  • clear() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::Buckets, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::List< T, Tag >, Json::Value, ripple::AMMContext, ripple::Buffer, ripple::detail::BasicFullBelowCache, ripple::partitioned_unordered_map< Key, Value, Hash, Pred, Alloc >, ripple::PeerFinder::Bootcache, ripple::STAmount, ripple::STArray, ripple::STVector256, ripple::TaggedCache< Key, T, IsKeyCache, SharedWeakUnionPointerType, SharedPointerType, Hash, KeyEqual, Mutex >, ripple::test::OverlaySim, ripple::test::Validator, ripple::Transaction::SubmitResult
  • +
  • clear() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::Buckets, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, beast::List< T, Tag >, Json::Value, ripple::AMMContext, ripple::Buffer, ripple::detail::BasicFullBelowCache, ripple::partitioned_unordered_map< Key, Value, Hash, Pred, Alloc >, ripple::PeerFinder::Bootcache, ripple::STAmount, ripple::STArray, ripple::STVector256, ripple::TaggedCache< Key, T, IsKeyCache, SharedWeakUnionPointerType, SharedPointerType, Hash, KeyEqual, Mutex >, ripple::test::OverlaySim, ripple::test::Validator, ripple::Transaction::SubmitResult
  • clearAmendmentWarned() : ripple::NetworkOPs, ripple::NetworkOPsImp
  • clearApplying() : ripple::Transaction
  • clearCaches() : ripple::SHAMapStoreImp
  • @@ -266,7 +266,7 @@ $(function() {
  • clientIsUnlimited() : ripple::GRPCServerImpl::CallData< Request, Response >
  • clock() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >, ripple::detail::BasicFullBelowCache, ripple::Resource::ResourceManager_test::TestLogic, ripple::TaggedCache< Key, T, IsKeyCache, SharedWeakUnionPointerType, SharedPointerType, Hash, KeyEqual, Mutex >, ripple::test::csf::Scheduler, ripple::test::csf::Validations_test::TestHarness, ripple::tests::TestNodeFamily
  • clone() : ripple::GRPCServerImpl::CallData< Request, Response >, ripple::Processor, ripple::SHAMapAccountStateLeafNode, ripple::SHAMapInnerNode, ripple::SHAMapTreeNode, ripple::SHAMapTxLeafNode, ripple::SHAMapTxPlusMetaLeafNode, ripple::test::jtx::basic_prop, ripple::test::jtx::prop_type< T >, ripple::test::Manifest_test
  • -
  • close() : ripple::BaseHTTPPeer< Handler, Impl >, ripple::BasePeer< Handler, Impl >, ripple::BaseWSPeer< Handler, Impl >, ripple::ConnectAttempt, ripple::detail::WorkBase< Impl >, ripple::Door< Handler >, ripple::Door< Handler >::Detector, ripple::io_list, ripple::io_list::work, ripple::Logs::File, ripple::NodeStore::Backend, ripple::NodeStore::MemoryBackend, ripple::NodeStore::NuDBBackend, ripple::NodeStore::NullBackend, ripple::PeerImp, ripple::Server, ripple::ServerImpl< Handler >, ripple::Session, ripple::short_read_test::Base::Child, ripple::short_read_test::Base, ripple::short_read_test::Client::Connection, ripple::short_read_test::Server::Acceptor, ripple::short_read_test::Server::Connection, ripple::test::jtx::Env, ripple::test::SEnv< T >, ripple::WSSession
  • +
  • close() : ripple::BaseHTTPPeer< Handler, Impl >, ripple::BasePeer< Handler, Impl >, ripple::BaseWSPeer< Handler, Impl >, ripple::ConnectAttempt, ripple::detail::WorkBase< Impl >, ripple::Door< Handler >, ripple::Door< Handler >::Detector, ripple::io_list, ripple::io_list::work, ripple::Logs::File, ripple::NodeStore::Backend, ripple::NodeStore::MemoryBackend, ripple::NodeStore::NuDBBackend, ripple::NodeStore::NullBackend, ripple::PeerImp, ripple::Server, ripple::ServerImpl< Handler >, ripple::Session, ripple::short_read_test::Base::Child, ripple::short_read_test::Base, ripple::short_read_test::Client::Connection, ripple::short_read_test::Server::Acceptor, ripple::short_read_test::Server::Connection, ripple::test::jtx::Env, ripple::test::SEnv< T >, ripple::WSSession
  • closeAgree() : ripple::RCLCxLedger, ripple::test::csf::Ledger
  • closeAndReopen() : ripple::Logs::File
  • closed() : ripple::io_list, ripple::ServerImpl< Handler >, ripple::test::jtx::Env
  • @@ -299,7 +299,7 @@ $(function() {
  • commonPragma() : ripple::DatabaseCon::Setup
  • Compact() : Json::Compact
  • Comparator() : ripple::Cluster::Comparator
  • -
  • compare() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::config_t, beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::KeyValueCompare, ripple::RCLTxSet, ripple::SField, ripple::SHAMap, ripple::test::csf::TxSet
  • +
  • compare() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::config_t, beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::KeyValueCompare, ripple::RCLTxSet, ripple::SField, ripple::SHAMap, ripple::test::csf::TxSet
  • complete() : ripple::BaseHTTPPeer< Handler, Impl >, ripple::BaseWSPeer< Handler, Impl >, ripple::Session, ripple::SimpleWriter, ripple::Writer, ripple::WSSession
  • completeTrustCompleteConnectFixedDelay() : ripple::test::DistributedValidators_test
  • completeTrustScaleFreeConnectFixedDelay() : ripple::test::DistributedValidators_test
  • @@ -307,24 +307,24 @@ $(function() {
  • compress() : ripple::Message
  • compression_test() : ripple::test::compression_test
  • compressionEnabled() : ripple::Peer, ripple::PeerImp, ripple::test::PeerPartial, ripple::test::TestPeer
  • -
  • CompT() : beast::aged_associative_container_test_base::CompT< T >
  • +
  • CompT() : beast::aged_associative_container_test_base::CompT< T >
  • computeDistance() : Json::ValueIteratorBase
  • computePathRanks() : ripple::Pathfinder
  • computeReserveReduction() : ripple::XRPEndpointOfferCrossingStep
  • -
  • Condition() : ripple::cryptoconditions::Condition
  • +
  • Condition() : ripple::cryptoconditions::Condition
  • condition() : ripple::cryptoconditions::Fulfillment, ripple::cryptoconditions::PreimageSha256
  • config() : ripple::Application, ripple::ApplicationImp
  • Config() : ripple::Config
  • config() : ripple::detail::RippledCfgGuard
  • Config() : ripple::PeerFinder::Config
  • config() : ripple::PeerFinder::Logic< Checker >, ripple::PeerFinder::Manager, ripple::PeerFinder::ManagerImp
  • -
  • config_t() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::config_t, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::config_t
  • +
  • config_t() : beast::detail::aged_ordered_container< IsMulti, IsMap, Key, T, Clock, Compare, Allocator >::config_t, beast::detail::aged_unordered_container< IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator >::config_t
  • configFile() : ripple::detail::RippledCfgGuard
  • configFileExists() : ripple::detail::RippledCfgGuard
  • configInvalid() : ripple::ValidatorKeys
  • ConfigSection() : ripple::ConfigSection
  • confuseMap() : ripple::tests::SHAMapSync_test
  • -
  • connect() : ripple::Overlay, ripple::OverlayImpl, ripple::test::csf::BasicNetwork< Peer >, ripple::test::csf::Digraph< Vertex, EdgeData >, ripple::test::csf::Peer, ripple::test::csf::PeerGroup, ripple::test::Server_test
  • +
  • connect() : ripple::Overlay, ripple::OverlayImpl, ripple::test::csf::BasicNetwork< Peer >, ripple::test::csf::Digraph< Vertex, EdgeData >, ripple::test::csf::Peer, ripple::test::csf::PeerGroup, ripple::test::Server_test
  • ConnectAttempt() : ripple::ConnectAttempt
  • connectCount() : ripple::PeerFinder::Counts
  • connected() : ripple::test::csf::Digraph< Vertex, EdgeData >
  • @@ -332,7 +332,7 @@ $(function() {
  • ConnectHandouts() : ripple::PeerFinder::ConnectHandouts
  • Connection() : ripple::short_read_test::Client::Connection, ripple::short_read_test::Server::Connection
  • connectionString() : ripple::DBConfig
  • -
  • Consensus() : ripple::Consensus< Adaptor >
  • +
  • Consensus() : ripple::Consensus< Adaptor >
  • Consensus_test() : ripple::test::Consensus_test
  • consensusBuilt() : ripple::LedgerMaster
  • ConsensusCloseTimes() : ripple::ConsensusCloseTimes
  • @@ -342,8 +342,8 @@ $(function() {
  • ConsensusTransSetSF() : ripple::ConsensusTransSetSF
  • consensusViewChange() : ripple::NetworkOPs, ripple::NetworkOPsImp
  • consequences() : ripple::TxQ::MaybeTx
  • -
  • console() : beast::Journal::Sink, beast::NullJournalSink, beast::WrappedSink
  • -
  • const_iterator() : ripple::BookDirs::const_iterator, ripple::Dir::const_iterator, ripple::partitioned_unordered_map< Key, Value, Hash, Pred, Alloc >::const_iterator, ripple::SHAMap::const_iterator
  • +
  • console() : beast::Journal::Sink, beast::NullJournalSink, beast::WrappedSink
  • +
  • const_iterator() : ripple::BookDirs::const_iterator, ripple::Dir::const_iterator, ripple::partitioned_unordered_map< Key, Value, Hash, Pred, Alloc >::const_iterator, ripple::SHAMap::const_iterator
  • const_iterator_to() : beast::List< T, Tag >
  • ConstantDistribution() : ripple::test::csf::ConstantDistribution
  • construct() : ripple::detail::STVar, ripple::STAmount, ripple::STCurrency, ripple::STXChainBridge
  • @@ -353,7 +353,7 @@ $(function() {
  • Consumer() : ripple::Resource::Consumer
  • consumeSeqProxy() : ripple::Transactor
  • cont() : beast::unit_test::detail::const_container< Container >
  • -
  • contains() : ripple::PeerReservationTable, ripple::test::csf::PeerGroup
  • +
  • contains() : ripple::PeerReservationTable, ripple::test::csf::PeerGroup
  • context() : ripple::AMMLiquidity< TIn, TOut >, ripple::HTTPClientSSLContext
  • convertToStrong() : ripple::SharedWeakCachePointer< T >, ripple::SharedWeakUnion< T >
  • convertToWeak() : ripple::SharedWeakCachePointer< T >, ripple::SharedWeakUnion< T >
  • @@ -391,7 +391,7 @@ $(function() {
  • createGossip() : ripple::Resource::ResourceManager_test
  • createGroup() : ripple::test::csf::Sim
  • createID() : ripple::SHAMapNodeID
  • -
  • createInstance() : ripple::NodeStore::Factory, ripple::NodeStore::MemoryFactory, ripple::NodeStore::NuDBFactory, ripple::NodeStore::NullFactory
  • +
  • createInstance() : ripple::NodeStore::Factory, ripple::NodeStore::MemoryFactory, ripple::NodeStore::NuDBFactory, ripple::NodeStore::NullFactory
  • createLedgerHistory() : ripple::test::LedgerServer, ripple::test::NetworkHistory
  • createMcBridgeObjects() : ripple::test::jtx::XChainBridgeObjects
  • createMPToken() : ripple::MPTokenAuthorize
  • @@ -425,7 +425,7 @@ $(function() {
  • current() : ripple::detail::VotableValue, ripple::OpenLedger, ripple::test::jtx::Env, ripple::Validations< Adaptor >
  • currentJson() : ripple::perf::PerfLog, ripple::perf::PerfLogImp::Counters, ripple::perf::PerfLogImp, ripple::perf::PerfLogTest
  • CurrentLedgerState() : ripple::Transaction::CurrentLedgerState
  • -
  • CurrentTransactionRulesGuard() : ripple::CurrentTransactionRulesGuard
  • +
  • CurrentTransactionRulesGuard() : ripple::CurrentTransactionRulesGuard
  • currentTrusted() : ripple::Validations< Adaptor >
  • currentValue() : Json::Reader
  • currKey() : ripple::test::csf::Validations_test::Node
  • diff --git a/search/all_a.js b/search/all_a.js index 713e979c43..2a0b5286b1 100644 --- a/search/all_a.js +++ b/search/all_a.js @@ -33,7 +33,7 @@ var searchData= ['calcnodeid_30',['calcNodeID',['../namespaceripple.html#aa2a27f242f6d150ff52f2ad0b2e2a512',1,'ripple']]], ['calcoutpeers_31',['calcOutPeers',['../structripple_1_1PeerFinder_1_1Config.html#af22578657f9b42b4c0b66cb6289761aa',1,'ripple::PeerFinder::Config']]], ['calculatebalancechange_32',['calculateBalanceChange',['../classripple_1_1TransfersNotFrozen.html#a8ddbeaaeb7db0580dd5e4c3dbe3690d4',1,'ripple::TransfersNotFrozen']]], - ['calculatebasefee_33',['calculatebasefee',['../classripple_1_1Change.html#a115bd4d8f9f908afc75c5b15a34f1e2e',1,'ripple::Change::calculateBaseFee()'],['../namespaceripple.html#a3deb4c69ca598c60e6502a3be527835e',1,'ripple::calculateBaseFee()'],['../classripple_1_1VaultCreate.html#af9ccabf01c1d6bd7694249c7c0a8716c',1,'ripple::VaultCreate::calculateBaseFee()'],['../classripple_1_1Transactor.html#a428581db1f9eea2f41cf9e371a1e557d',1,'ripple::Transactor::calculateBaseFee()'],['../classripple_1_1SetRegularKey.html#a0094d5dbd069870b1d20c3318b76dda7',1,'ripple::SetRegularKey::calculateBaseFee()'],['../classripple_1_1LedgerStateFix.html#a014a07d44ccb1669fae8cad27c9f232d',1,'ripple::LedgerStateFix::calculateBaseFee()'],['../classripple_1_1EscrowFinish.html#ade982a23b9e5024f0cc518a26a16b85b',1,'ripple::EscrowFinish::calculateBaseFee()'],['../classripple_1_1AMMCreate.html#aacbb467211f50a54170c9934f65f7e12',1,'ripple::AMMCreate::calculateBaseFee()'],['../classripple_1_1Batch.html#ad1cbb14e4ee9d4b5b59104f5d571230a',1,'ripple::Batch::calculateBaseFee()'],['../classripple_1_1DeleteAccount.html#aad1cbce6f2cb51d12962972fb83e3749',1,'ripple::DeleteAccount::calculateBaseFee()']]], + ['calculatebasefee_33',['calculatebasefee',['../classripple_1_1Batch.html#ad1cbb14e4ee9d4b5b59104f5d571230a',1,'ripple::Batch::calculateBaseFee()'],['../namespaceripple.html#a3deb4c69ca598c60e6502a3be527835e',1,'ripple::calculateBaseFee()'],['../classripple_1_1Transactor.html#a428581db1f9eea2f41cf9e371a1e557d',1,'ripple::Transactor::calculateBaseFee()'],['../classripple_1_1SetRegularKey.html#a0094d5dbd069870b1d20c3318b76dda7',1,'ripple::SetRegularKey::calculateBaseFee()'],['../classripple_1_1LedgerStateFix.html#a014a07d44ccb1669fae8cad27c9f232d',1,'ripple::LedgerStateFix::calculateBaseFee()'],['../classripple_1_1EscrowFinish.html#ade982a23b9e5024f0cc518a26a16b85b',1,'ripple::EscrowFinish::calculateBaseFee()'],['../classripple_1_1DeleteAccount.html#aad1cbce6f2cb51d12962972fb83e3749',1,'ripple::DeleteAccount::calculateBaseFee()'],['../classripple_1_1AMMCreate.html#aacbb467211f50a54170c9934f65f7e12',1,'ripple::AMMCreate::calculateBaseFee()'],['../classripple_1_1Change.html#a115bd4d8f9f908afc75c5b15a34f1e2e',1,'ripple::Change::calculateBaseFee()']]], ['calculatedefaultbasefee_34',['calculateDefaultBaseFee',['../namespaceripple.html#ae89924d6641e992f08233d811f17f6f3',1,'ripple']]], ['calculateledgerhash_35',['calculateLedgerHash',['../namespaceripple.html#a71f5c3f4baec0e09c5eab4d6f5b5efcb',1,'ripple']]], ['calculateownerreservefee_36',['calculateOwnerReserveFee',['../classripple_1_1Transactor.html#aae7d5ad05a7074eabf7ede735de264d7',1,'ripple::Transactor']]], @@ -56,7 +56,7 @@ var searchData= ['canaddholding_53',['canaddholding',['../namespaceripple.html#aeb939f9e373534507258567fdccb72c8',1,'ripple::canAddHolding(ReadView const &view, MPTIssue const &mptIssue)'],['../namespaceripple.html#ad1fbb782b6c9bbc9a709ebf1ddbedfdb',1,'ripple::canAddHolding(ReadView const &view, Issue const &issue)'],['../namespaceripple.html#ad85034a45d52efca26f2084a0f2f41f1',1,'ripple::canAddHolding(ReadView const &view, Asset const &asset)']]], ['canbecurrent_54',['canBeCurrent',['../classripple_1_1LedgerMaster.html#a45c5a3a1dea7c20d829dededf270ebc7',1,'ripple::LedgerMaster']]], ['canbeheld_55',['canBeHeld',['../classripple_1_1TxQ.html#a5809a0ba90f44da94b1b9f73f5247434',1,'ripple::TxQ']]], - ['cancel_56',['cancel',['../namespaceripple_1_1test_1_1jtx_1_1check.html#a2d3a894a7ac4d177a05437a83718d0ac',1,'ripple::test::jtx::check::cancel()'],['../classbeast_1_1io__latency__probe.html#abb9c67df3d6e343c2712618752c6ad5f',1,'beast::io_latency_probe::cancel()'],['../classAutoSocket.html#adb778dd03c4b2527ecbbe146a6c2c22b',1,'AutoSocket::cancel()'],['../classbeast_1_1io__latency__probe.html#a3aacab2155a327714b711dc3dbc8c69c',1,'beast::io_latency_probe::cancel()'],['../namespaceripple_1_1test_1_1jtx_1_1escrow.html#ae41b2bb960334c8184b2486a00feae30',1,'ripple::test::jtx::escrow::cancel(Account const &account, Account const &from, std::uint32_t seq)'],['../namespaceripple_1_1test_1_1jtx_1_1escrow.html#a9a4c6814d8c3806defac9610bbc6244a',1,'ripple::test::jtx::escrow::cancel(AccountID const &account, Account const &from, std::uint32_t seq)'],['../classripple_1_1test_1_1csf_1_1Scheduler.html#ad756895de45f26b19be6e98c20ed2d60',1,'ripple::test::csf::Scheduler::cancel()'],['../classripple_1_1TimeoutCounter.html#ac9f8538b7f73ebcda116c33d5541d16d',1,'ripple::TimeoutCounter::cancel()'],['../classripple_1_1ApplicationImp_1_1io__latency__sampler.html#a3ac8d0ec61a9e506030a3acf7a84e2cc',1,'ripple::ApplicationImp::io_latency_sampler::cancel()'],['../classripple_1_1detail_1_1Work.html#a157da65c7565e5016a6f9481bc045770',1,'ripple::detail::Work::cancel()'],['../classripple_1_1detail_1_1WorkBase.html#a83354ff3793e2f3d29cf218ade9bb23e',1,'ripple::detail::WorkBase::cancel()'],['../classripple_1_1detail_1_1WorkFile.html#a2a9d9e06a386412345c1f644309a7031',1,'ripple::detail::WorkFile::cancel()'],['../classripple_1_1PeerFinder_1_1Source.html#a94789f59b098d37b35bf8d9b9dcdb46f',1,'ripple::PeerFinder::Source::cancel()']]], + ['cancel_56',['cancel',['../namespaceripple_1_1test_1_1jtx_1_1check.html#a2d3a894a7ac4d177a05437a83718d0ac',1,'ripple::test::jtx::check::cancel()'],['../classbeast_1_1io__latency__probe.html#a3aacab2155a327714b711dc3dbc8c69c',1,'beast::io_latency_probe::cancel()'],['../classbeast_1_1io__latency__probe.html#abb9c67df3d6e343c2712618752c6ad5f',1,'beast::io_latency_probe::cancel(std::unique_lock< decltype(m_mutex)> &lock, bool wait)'],['../classAutoSocket.html#adb778dd03c4b2527ecbbe146a6c2c22b',1,'AutoSocket::cancel()'],['../namespaceripple_1_1test_1_1jtx_1_1escrow.html#ae41b2bb960334c8184b2486a00feae30',1,'ripple::test::jtx::escrow::cancel(Account const &account, Account const &from, std::uint32_t seq)'],['../namespaceripple_1_1test_1_1jtx_1_1escrow.html#a9a4c6814d8c3806defac9610bbc6244a',1,'ripple::test::jtx::escrow::cancel(AccountID const &account, Account const &from, std::uint32_t seq)'],['../classripple_1_1test_1_1csf_1_1Scheduler.html#ad756895de45f26b19be6e98c20ed2d60',1,'ripple::test::csf::Scheduler::cancel()'],['../classripple_1_1TimeoutCounter.html#ac9f8538b7f73ebcda116c33d5541d16d',1,'ripple::TimeoutCounter::cancel()'],['../classripple_1_1ApplicationImp_1_1io__latency__sampler.html#a3ac8d0ec61a9e506030a3acf7a84e2cc',1,'ripple::ApplicationImp::io_latency_sampler::cancel()'],['../classripple_1_1detail_1_1Work.html#a157da65c7565e5016a6f9481bc045770',1,'ripple::detail::Work::cancel()'],['../classripple_1_1detail_1_1WorkBase.html#a83354ff3793e2f3d29cf218ade9bb23e',1,'ripple::detail::WorkBase::cancel()'],['../classripple_1_1detail_1_1WorkFile.html#a2a9d9e06a386412345c1f644309a7031',1,'ripple::detail::WorkFile::cancel()'],['../classripple_1_1PeerFinder_1_1Source.html#a94789f59b098d37b35bf8d9b9dcdb46f',1,'ripple::PeerFinder::Source::cancel()']]], ['cancel_5fasync_57',['cancel_async',['../classripple_1_1ApplicationImp_1_1io__latency__sampler.html#a6e6c55b35ab3229ee4e307c78d6ad372',1,'ripple::ApplicationImp::io_latency_sampler::cancel_async()'],['../classbeast_1_1io__latency__probe.html#adaee7525295db67f85573a6b73eff113',1,'beast::io_latency_probe::cancel_async()']]], ['cancel_5ftime_58',['cancel_time',['../namespaceripple_1_1test_1_1jtx_1_1escrow.html#abd4ed8192d36e430dec2c61f12b27081',1,'ripple::test::jtx::escrow']]], ['cancel_5ftimer_59',['cancel_timer',['../classripple_1_1BaseHTTPPeer.html#ac3c9ac193c8189da5a77603624849c82',1,'ripple::BaseHTTPPeer::cancel_timer()'],['../classripple_1_1BaseWSPeer.html#ad7b7bf280347bf04fd91b4aad40a7cbe',1,'ripple::BaseWSPeer::cancel_timer()']]], @@ -91,7 +91,7 @@ var searchData= ['canhavenftokenofferid_88',['canHaveNFTokenOfferID',['../namespaceripple.html#a24dd77739d6bb105b5085085045d1d6a',1,'ripple']]], ['canmergeinto_89',['canMergeInto',['../classripple_1_1LedgerReplayTask_1_1TaskParameter.html#a3c2b56668a4a6a767dd2763a52553bd6',1,'ripple::LedgerReplayTask::TaskParameter']]], ['canmutateflag_90',['canMutateFlag',['../structripple_1_1MPTMutabilityFlags.html#a0a67de51e08b722a9f849aad281c946f',1,'ripple::MPTMutabilityFlags']]], - ['canonical_91',['canonical',['http://en.cppreference.com/w/cpp/filesystem/canonical.html',1,'std::filesystem::canonical()'],['http://en.cppreference.com/w/cpp/experimental/fs/canonical.html',1,'std::experimental::filesystem::canonical()'],['../namespaceripple.html#a286745fec5429abb3893001b4982522ba9f3fda2fef6dda85970e12ce9a9b8cbe',1,'ripple::canonical']]], + ['canonical_91',['canonical',['http://en.cppreference.com/w/cpp/experimental/fs/canonical.html',1,'std::experimental::filesystem::canonical()'],['http://en.cppreference.com/w/cpp/filesystem/canonical.html',1,'std::filesystem::canonical()'],['../namespaceripple.html#a286745fec5429abb3893001b4982522ba9f3fda2fef6dda85970e12ce9a9b8cbe',1,'ripple::canonical']]], ['canonicalize_92',['canonicalize',['../md__2____w_2rippled_2rippled_2include_2xrpl_2shamap_2README.html#autotoc_md205',1,'Canonicalize'],['../classripple_1_1TaggedCache.html#a00d05194ed006bf9fe6bff120fb4aac4',1,'ripple::TaggedCache::canonicalize()'],['../classripple_1_1STAmount.html#a104f16b3dcb68a0b317788706c347809',1,'ripple::STAmount::canonicalize()'],['../classripple_1_1SHAMap.html#a5e0309dab2d67386ce24c8b80ff085d3',1,'ripple::SHAMap::canonicalize()'],['../classripple_1_1TransactionMaster.html#adfb688396e9aed123c909f739e44a0cf',1,'ripple::TransactionMaster::canonicalize()']]], ['canonicalize_5freplace_5fcache_93',['canonicalize_replace_cache',['../classripple_1_1TaggedCache.html#a7a47e5a8377efd3ba562a2fa4e25137c',1,'ripple::TaggedCache']]], ['canonicalize_5freplace_5fclient_94',['canonicalize_replace_client',['../classripple_1_1TaggedCache.html#a1e2ed25e1eca853619f5213ac43b184a',1,'ripple::TaggedCache']]], @@ -103,11 +103,11 @@ var searchData= ['cansubtract_100',['canSubtract',['../namespaceripple.html#a2f2f22330db2c109956e5c4e6be0249c',1,'ripple']]], ['cantransfer_101',['canTransfer',['../namespaceripple.html#a8a00fd8661aff4a0a94c7343a5158eca',1,'ripple']]], ['canvalidateseq_102',['canValidateSeq',['../classripple_1_1Validations.html#ae0fc73211431010b6343e0e2bc095cde',1,'ripple::Validations']]], - ['capacity_103',['capacity',['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::basic_string::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::pmr::u16string::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::pmr::string::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::u8string::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::pmr::u32string::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::pmr::u8string::capacity()'],['http://en.cppreference.com/w/cpp/container/vector/capacity.html',1,'std::pmr::vector::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::pmr::wstring::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::string::capacity()'],['http://en.cppreference.com/w/cpp/filesystem/space_info.html',1,'std::filesystem::space_info::capacity'],['http://en.cppreference.com/w/cpp/experimental/fs/space_info.html',1,'std::experimental::filesystem::space_info::capacity'],['../classripple_1_1Serializer.html#a359344852440b797e5bb5edc3208dfa0',1,'ripple::Serializer::capacity()'],['../classripple_1_1TaggedPointer.html#aa3fcb13ead97c21651ae2ea0f60e8909',1,'ripple::TaggedPointer::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::u16string::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::u32string::capacity()'],['http://en.cppreference.com/w/cpp/container/vector/capacity.html',1,'std::vector::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::wstring::capacity()']]], + ['capacity_103',['capacity',['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::pmr::u8string::capacity()'],['http://en.cppreference.com/w/cpp/filesystem/space_info.html',1,'std::filesystem::space_info::capacity'],['http://en.cppreference.com/w/cpp/container/vector/capacity.html',1,'std::pmr::vector::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::pmr::wstring::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::string::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::u16string::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::u32string::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::u8string::capacity()'],['http://en.cppreference.com/w/cpp/container/vector/capacity.html',1,'std::vector::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::wstring::capacity()'],['../classripple_1_1Serializer.html#a359344852440b797e5bb5edc3208dfa0',1,'ripple::Serializer::capacity()'],['../classripple_1_1TaggedPointer.html#aa3fcb13ead97c21651ae2ea0f60e8909',1,'ripple::TaggedPointer::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::pmr::u32string::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::pmr::u16string::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::pmr::string::capacity()'],['http://en.cppreference.com/w/cpp/string/basic_string/capacity.html',1,'std::basic_string::capacity()'],['http://en.cppreference.com/w/cpp/experimental/fs/space_info.html',1,'std::experimental::filesystem::space_info::capacity']]], ['capturelogs_104',['capturelogs',['../classripple_1_1test_1_1CaptureLogs.html#a84d06b7256b00484a54982cc27e28078',1,'ripple::test::CaptureLogs::CaptureLogs()'],['../classripple_1_1test_1_1CaptureLogs.html',1,'ripple::test::CaptureLogs']]], ['capturesink_105',['capturesink',['../classripple_1_1test_1_1CaptureLogs_1_1CaptureSink.html',1,'ripple::test::CaptureLogs::CaptureSink'],['../classripple_1_1test_1_1CaptureLogs_1_1CaptureSink.html#a5034de50c690e04bb19e185d3e3908d0',1,'ripple::test::CaptureLogs::CaptureSink::CaptureSink()']]], - ['carol_106',['carol',['../classripple_1_1test_1_1jtx_1_1AMMTestBase.html#aeedbd0d6402d225e41bd10251a7a0127',1,'ripple::test::jtx::AMMTestBase::carol'],['../classripple_1_1test_1_1jtx_1_1PermissionedDEX.html#a033a60d479ca98871685b45c56b49118',1,'ripple::test::jtx::PermissionedDEX::carol']]], - ['case_5fresults_107',['case_results',['../structripple_1_1detail_1_1case__results.html',1,'ripple::detail::case_results'],['../structbeast_1_1unit__test_1_1detail_1_1reporter_1_1case__results.html',1,'beast::unit_test::detail::reporter< class >::case_results'],['../classbeast_1_1unit__test_1_1case__results.html',1,'beast::unit_test::case_results'],['../structripple_1_1detail_1_1case__results.html#ac2d76ff685abec476c216e836ca62bb7',1,'ripple::detail::case_results::case_results()'],['../classbeast_1_1unit__test_1_1case__results.html#a6e347dacedc07f36dedf7b25aad6dee9',1,'beast::unit_test::case_results::case_results()'],['../structbeast_1_1unit__test_1_1detail_1_1reporter_1_1case__results.html#a86567a7e03b1f63e4b5d581774058e59',1,'beast::unit_test::detail::reporter::case_results::case_results()']]], + ['carol_106',['carol',['../classripple_1_1test_1_1jtx_1_1PermissionedDEX.html#a033a60d479ca98871685b45c56b49118',1,'ripple::test::jtx::PermissionedDEX::carol'],['../classripple_1_1test_1_1jtx_1_1AMMTestBase.html#aeedbd0d6402d225e41bd10251a7a0127',1,'ripple::test::jtx::AMMTestBase::carol']]], + ['case_5fresults_107',['case_results',['../structbeast_1_1unit__test_1_1detail_1_1reporter_1_1case__results.html#a86567a7e03b1f63e4b5d581774058e59',1,'beast::unit_test::detail::reporter::case_results::case_results()'],['../structripple_1_1detail_1_1case__results.html#ac2d76ff685abec476c216e836ca62bb7',1,'ripple::detail::case_results::case_results()'],['../structripple_1_1detail_1_1case__results.html',1,'ripple::detail::case_results'],['../classbeast_1_1unit__test_1_1case__results.html#a6e347dacedc07f36dedf7b25aad6dee9',1,'beast::unit_test::case_results::case_results()'],['../classbeast_1_1unit__test_1_1case__results.html',1,'beast::unit_test::case_results'],['../structbeast_1_1unit__test_1_1detail_1_1reporter_1_1case__results.html',1,'beast::unit_test::detail::reporter< class >::case_results']]], ['case_5fresults_5f_108',['case_results_',['../classripple_1_1test_1_1multi__runner__child.html#a07ec20cef34bbc2d7b4694ef4a838385',1,'ripple::test::multi_runner_child::case_results_'],['../classbeast_1_1unit__test_1_1detail_1_1reporter.html#a71fe340eb1d8ef25bd09a5d94daa8c1e',1,'beast::unit_test::detail::reporter::case_results_']]], ['cases_109',['cases',['../classbeast_1_1unit__test_1_1results.html#a489eb70dcf3c5a9c061b03f5c3893604',1,'beast::unit_test::results::cases()'],['../structripple_1_1detail_1_1results.html#a7acaed6d13b459089c4bfe67591e6661',1,'ripple::detail::results::cases'],['../structripple_1_1detail_1_1suite__results.html#ad9d16fd1d15802d999dbabd9e85e6d63',1,'ripple::detail::suite_results::cases'],['../structbeast_1_1unit__test_1_1detail_1_1reporter_1_1results.html#a3a866332aafaae5da96d0928e2fae598',1,'beast::unit_test::detail::reporter::results::cases'],['../structbeast_1_1unit__test_1_1detail_1_1reporter_1_1suite__results.html#a29070f21e2f8443af7040819393e7954',1,'beast::unit_test::detail::reporter::suite_results::cases']]], ['cases_3a_20point_20releases_20hotfixes_20etc_110',['Special cases: point releases, hotfixes, etc.',['../md__2____w_2rippled_2rippled_2CONTRIBUTING.html#autotoc_md84',1,'']]], @@ -116,16 +116,16 @@ var searchData= ['cassert_113',['cassert',['http://en.cppreference.com/w/cpp/header/cassert.html',1,'']]], ['catalog_114',['catalog',['http://en.cppreference.com/w/cpp/locale/messages_base.html',1,'std::messages::catalog'],['http://en.cppreference.com/w/cpp/locale/messages_base.html',1,'std::messages_base::catalog'],['http://en.cppreference.com/w/cpp/locale/messages_base.html',1,'std::messages_byname::catalog']]], ['categorize_115',['categorize',['../classripple_1_1TrafficCount.html#a48b1f14d718684397f7aae2e7c9e74eb',1,'ripple::TrafficCount']]], - ['category_116',['category',['../classripple_1_1TrafficCount.html#adbaee77c7a063c9aac783e54594aeda7',1,'ripple::TrafficCount::category'],['http://en.cppreference.com/w/cpp/error/error_code/category.html',1,'std::error_code::category()'],['http://en.cppreference.com/w/cpp/error/error_condition/category.html',1,'std::error_condition::category()'],['../classripple_1_1TxConsequences.html#af40159818c89963a904c9c4c0848cae9',1,'ripple::TxConsequences::Category']]], + ['category_116',['category',['http://en.cppreference.com/w/cpp/error/error_condition/category.html',1,'std::error_condition::category()'],['../classripple_1_1TxConsequences.html#af40159818c89963a904c9c4c0848cae9',1,'ripple::TxConsequences::Category'],['http://en.cppreference.com/w/cpp/error/error_code/category.html',1,'std::error_code::category()'],['../classripple_1_1TrafficCount.html#adbaee77c7a063c9aac783e54594aeda7',1,'ripple::TrafficCount::category']]], ['category_5f_117',['category_',['../classripple_1_1Message.html#a0b12f602dfea3a708efc0b0138a0c510',1,'ripple::Message']]], - ['cauchy_5fdistribution_118',['cauchy_distribution',['http://en.cppreference.com/w/cpp/numeric/random/cauchy_distribution/cauchy_distribution.html',1,'std::cauchy_distribution::cauchy_distribution()'],['http://en.cppreference.com/w/cpp/numeric/random/cauchy_distribution.html',1,'std::cauchy_distribution']]], + ['cauchy_5fdistribution_118',['cauchy_distribution',['http://en.cppreference.com/w/cpp/numeric/random/cauchy_distribution.html',1,'std::cauchy_distribution'],['http://en.cppreference.com/w/cpp/numeric/random/cauchy_distribution/cauchy_distribution.html',1,'std::cauchy_distribution::cauchy_distribution()']]], ['cb1_119',['cb1',['../namespaceripple_1_1test_1_1jtx_1_1escrow.html#a3c601d61c219f235ee614e1fb24c3248',1,'ripple::test::jtx::escrow']]], ['cb2_120',['cb2',['../namespaceripple_1_1test_1_1jtx_1_1escrow.html#aadba0417dbaab42d797a44b2a600fbc5',1,'ripple::test::jtx::escrow']]], ['cb3_121',['cb3',['../namespaceripple_1_1test_1_1jtx_1_1escrow.html#a3df8c3b232afbec6fb51e8a385f056ce',1,'ripple::test::jtx::escrow']]], - ['cb_5f_122',['cb_',['../classripple_1_1test_1_1jtx_1_1requireAny.html#a9db239e9341cb9d772f5bdae5f094b14',1,'ripple::test::jtx::requireAny::cb_'],['../classripple_1_1detail_1_1WorkFile.html#a408980864c84e4565788f90928f6e038',1,'ripple::detail::WorkFile::cb_'],['../classripple_1_1detail_1_1WorkBase.html#a1dd5dd5f7c26e61b444a5e2118d2b4b7',1,'ripple::detail::WorkBase::cb_']]], + ['cb_5f_122',['cb_',['../classripple_1_1detail_1_1WorkFile.html#a408980864c84e4565788f90928f6e038',1,'ripple::detail::WorkFile::cb_'],['../classripple_1_1detail_1_1WorkBase.html#a1dd5dd5f7c26e61b444a5e2118d2b4b7',1,'ripple::detail::WorkBase::cb_'],['../classripple_1_1test_1_1jtx_1_1requireAny.html#a9db239e9341cb9d772f5bdae5f094b14',1,'ripple::test::jtx::requireAny::cb_']]], ['cbefore_5fbegin_123',['cbefore_begin',['http://en.cppreference.com/w/cpp/container/forward_list/before_begin.html',1,'std::pmr::forward_list::cbefore_begin()'],['http://en.cppreference.com/w/cpp/container/forward_list/before_begin.html',1,'std::forward_list::cbefore_begin()']]], - ['cbegin_124',['cbegin',['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::u16string::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_map/begin.html',1,'std::pmr::unordered_map::cbegin()'],['../classripple_1_1Section.html#a88ca1a9596da50ea3593b5cc34d01940',1,'ripple::Section::cbegin()'],['../classripple_1_1Buffer.html#a0425ae189aabad52bf1171511d041e1f',1,'ripple::Buffer::cbegin()'],['../classripple_1_1partitioned__unordered__map.html#a78e5ac79c523d29a68fe16d7a02ec3ef',1,'ripple::partitioned_unordered_map::cbegin()'],['../classripple_1_1Slice.html#a6bd58d1949a0ff8d1ff226f1a8a82fc6',1,'ripple::Slice::cbegin()'],['../classbeast_1_1detail_1_1aged__ordered__container_1_1chronological__t.html#a335cdd3cce7e32d0a25691b5cca4028c',1,'beast::detail::aged_ordered_container::chronological_t::cbegin()'],['../classbeast_1_1List.html#ad3ec5127cf5bd832781d3f827f7194ad',1,'beast::List::cbegin()'],['../classbeast_1_1detail_1_1aged__ordered__container.html#a71d3a23b1fb56caffc9a9f677b1c4b4a',1,'beast::detail::aged_ordered_container::cbegin()'],['../classbeast_1_1detail_1_1aged__unordered__container_1_1chronological__t.html#a90ad198f55f3735beaa015a6c7686fa7',1,'beast::detail::aged_unordered_container::chronological_t::cbegin()'],['../classbeast_1_1detail_1_1aged__unordered__container.html#a602d9a545135a60a01f334f22f0d39c1',1,'beast::detail::aged_unordered_container::cbegin() const'],['../classbeast_1_1detail_1_1aged__unordered__container.html#a792cb2116564500cf72de228a5f70d73',1,'beast::detail::aged_unordered_container::cbegin(size_type n) const'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::u32string_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::wstring_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::wstring::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::wsmatch::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::wcmatch::cbegin()'],['http://en.cppreference.com/w/cpp/container/vector/begin.html',1,'std::vector::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_set/begin.html',1,'std::unordered_set::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/begin.html',1,'std::unordered_multiset::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/begin.html',1,'std::unordered_multimap::cbegin()'],['../classripple_1_1base__uint.html#a5278a66b4c638992010ed51471ca7d5d',1,'ripple::base_uint::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_map/begin.html',1,'std::unordered_map::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::u8string_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::u8string::cbegin()'],['../classbeast_1_1LockFreeStack.html#a5e0d6da45e9fe049347962d309204314',1,'beast::LockFreeStack::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::u32string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::u16string_view::cbegin()'],['../classripple_1_1PeerFinder_1_1Livecache_1_1hops__t.html#a90d9557dbb0ad7941ca187a9dbe1ddf8',1,'ripple::PeerFinder::Livecache::hops_t::cbegin()'],['../classripple_1_1PeerFinder_1_1detail_1_1LivecacheBase_1_1Hop.html#a3928bbe64f60531ad3160eff8114c449',1,'ripple::PeerFinder::detail::LivecacheBase::Hop::cbegin()'],['../classripple_1_1PeerFinder_1_1Bootcache.html#a2af4b38d2c56f03120d3920b80afa4eb',1,'ripple::PeerFinder::Bootcache::cbegin()'],['../classripple_1_1JobTypes.html#af27c9ba16b1eb1047e34b4b0786e132e',1,'ripple::JobTypes::cbegin()'],['../classripple_1_1SOTemplate.html#a2daffdbe601520f4b9d85b1d088d03c9',1,'ripple::SOTemplate::cbegin()'],['../classripple_1_1Seed.html#a98072616ae53e8067f40ab73d4d2ea9c',1,'ripple::Seed::cbegin()'],['../classripple_1_1SecretKey.html#ac399f5930d6a751726b4c0b23bde02c8',1,'ripple::SecretKey::cbegin()'],['../classripple_1_1PublicKey.html#a86b86a467a0c144b409fdc2a898f4dd4',1,'ripple::PublicKey::cbegin()'],['../classbeast_1_1unit__test_1_1detail_1_1const__container.html#a2825d279f04c7d966f38f0ef097ec781',1,'beast::unit_test::detail::const_container::cbegin()'],['http://en.cppreference.com/w/cpp/container/multiset/begin.html',1,'std::multiset::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::string_view::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/begin.html',1,'std::pmr::unordered_multimap::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::u8string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::u32string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::u16string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::string::cbegin()'],['http://en.cppreference.com/w/cpp/container/set/begin.html',1,'std::pmr::set::cbegin()'],['http://en.cppreference.com/w/cpp/container/multiset/begin.html',1,'std::pmr::multiset::cbegin()'],['http://en.cppreference.com/w/cpp/container/multimap/begin.html',1,'std::pmr::multimap::cbegin()'],['http://en.cppreference.com/w/cpp/container/map/begin.html',1,'std::pmr::map::cbegin()'],['http://en.cppreference.com/w/cpp/container/list/begin.html',1,'std::pmr::list::cbegin()'],['http://en.cppreference.com/w/cpp/container/forward_list/begin.html',1,'std::pmr::forward_list::cbegin()'],['http://en.cppreference.com/w/cpp/container/deque/begin.html',1,'std::pmr::deque::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::string::cbegin()'],['http://en.cppreference.com/w/cpp/container/multimap/begin.html',1,'std::multimap::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::match_results::cbegin()'],['http://en.cppreference.com/w/cpp/container/map/begin.html',1,'std::map::cbegin()'],['http://en.cppreference.com/w/cpp/container/list/begin.html',1,'std::list::cbegin()'],['http://en.cppreference.com/w/cpp/container/forward_list/begin.html',1,'std::forward_list::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::wstring_view::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::u32string_view::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::u16string_view::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::string_view::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::basic_string_view::cbegin()'],['http://en.cppreference.com/w/cpp/container/deque/begin.html',1,'std::deque::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::cmatch::cbegin()'],['http://en.cppreference.com/w/cpp/chrono/tzdb_list/begin.html',1,'std::chrono::tzdb_list::cbegin()'],['http://en.cppreference.com/w/cpp/container/span/begin.html',1,'std::span::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::smatch::cbegin()'],['http://en.cppreference.com/w/cpp/container/set/begin.html',1,'std::set::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::wstring::cbegin()'],['http://en.cppreference.com/w/cpp/container/vector/begin.html',1,'std::pmr::vector::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_set/begin.html',1,'std::pmr::unordered_set::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/begin.html',1,'std::pmr::unordered_multiset::cbegin()'],['http://en.cppreference.com/w/cpp/iterator/begin.html',1,'std::cbegin()'],['http://en.cppreference.com/w/cpp/ranges/begin.html',1,'std::ranges::cbegin()'],['http://en.cppreference.com/w/cpp/container/array/begin.html',1,'std::array::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::basic_string_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::basic_string::cbegin()']]], - ['cbegin_28int_29_125',['cbegin(int)',['http://en.cppreference.com/w/cpp/container/unordered_set/begin2.html',1,'std::unordered_set::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_set/begin2.html',1,'std::pmr::unordered_set::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/begin2.html',1,'std::unordered_multiset::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/begin2.html',1,'std::unordered_multimap::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_map/begin2.html',1,'std::unordered_map::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/begin2.html',1,'std::pmr::unordered_multiset::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/begin2.html',1,'std::pmr::unordered_multimap::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_map/begin2.html',1,'std::pmr::unordered_map::cbegin(int)()']]], + ['cbegin_124',['cbegin',['../classripple_1_1base__uint.html#a5278a66b4c638992010ed51471ca7d5d',1,'ripple::base_uint::cbegin()'],['../classripple_1_1PeerFinder_1_1Livecache_1_1hops__t.html#a90d9557dbb0ad7941ca187a9dbe1ddf8',1,'ripple::PeerFinder::Livecache::hops_t::cbegin()'],['../classripple_1_1PeerFinder_1_1detail_1_1LivecacheBase_1_1Hop.html#a3928bbe64f60531ad3160eff8114c449',1,'ripple::PeerFinder::detail::LivecacheBase::Hop::cbegin()'],['../classripple_1_1PeerFinder_1_1Bootcache.html#a2af4b38d2c56f03120d3920b80afa4eb',1,'ripple::PeerFinder::Bootcache::cbegin()'],['../classripple_1_1partitioned__unordered__map.html#a78e5ac79c523d29a68fe16d7a02ec3ef',1,'ripple::partitioned_unordered_map::cbegin()'],['../classripple_1_1JobTypes.html#af27c9ba16b1eb1047e34b4b0786e132e',1,'ripple::JobTypes::cbegin()'],['../classripple_1_1SOTemplate.html#a2daffdbe601520f4b9d85b1d088d03c9',1,'ripple::SOTemplate::cbegin()'],['../classripple_1_1Seed.html#a98072616ae53e8067f40ab73d4d2ea9c',1,'ripple::Seed::cbegin()'],['http://en.cppreference.com/w/cpp/container/set/begin.html',1,'std::set::cbegin()'],['../classripple_1_1SecretKey.html#ac399f5930d6a751726b4c0b23bde02c8',1,'ripple::SecretKey::cbegin()'],['../classripple_1_1PublicKey.html#a86b86a467a0c144b409fdc2a898f4dd4',1,'ripple::PublicKey::cbegin()'],['../classbeast_1_1unit__test_1_1detail_1_1const__container.html#a2825d279f04c7d966f38f0ef097ec781',1,'beast::unit_test::detail::const_container::cbegin()'],['../classbeast_1_1List.html#ad3ec5127cf5bd832781d3f827f7194ad',1,'beast::List::cbegin()'],['../classbeast_1_1detail_1_1aged__unordered__container.html#a792cb2116564500cf72de228a5f70d73',1,'beast::detail::aged_unordered_container::cbegin(size_type n) const'],['../classbeast_1_1detail_1_1aged__unordered__container.html#a602d9a545135a60a01f334f22f0d39c1',1,'beast::detail::aged_unordered_container::cbegin() const'],['../classbeast_1_1detail_1_1aged__unordered__container_1_1chronological__t.html#a90ad198f55f3735beaa015a6c7686fa7',1,'beast::detail::aged_unordered_container::chronological_t::cbegin()'],['../classbeast_1_1detail_1_1aged__ordered__container.html#a71d3a23b1fb56caffc9a9f677b1c4b4a',1,'beast::detail::aged_ordered_container::cbegin()'],['../classbeast_1_1detail_1_1aged__ordered__container_1_1chronological__t.html#a335cdd3cce7e32d0a25691b5cca4028c',1,'beast::detail::aged_ordered_container::chronological_t::cbegin()'],['../classripple_1_1Slice.html#a6bd58d1949a0ff8d1ff226f1a8a82fc6',1,'ripple::Slice::cbegin()'],['../classbeast_1_1LockFreeStack.html#a5e0d6da45e9fe049347962d309204314',1,'beast::LockFreeStack::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::u8string_view::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::smatch::cbegin()'],['http://en.cppreference.com/w/cpp/container/span/begin.html',1,'std::span::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::string_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::u16string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::u16string_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::u32string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::u32string_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::u8string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::wstring_view::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_map/begin.html',1,'std::unordered_map::cbegin()'],['../classripple_1_1Section.html#a88ca1a9596da50ea3593b5cc34d01940',1,'ripple::Section::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/begin.html',1,'std::unordered_multimap::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/begin.html',1,'std::unordered_multiset::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_set/begin.html',1,'std::unordered_set::cbegin()'],['http://en.cppreference.com/w/cpp/container/vector/begin.html',1,'std::vector::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::wcmatch::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::wsmatch::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::wstring::cbegin()'],['http://en.cppreference.com/w/cpp/ranges/begin.html',1,'std::ranges::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::basic_string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::basic_string_view::cbegin()'],['http://en.cppreference.com/w/cpp/chrono/tzdb_list/begin.html',1,'std::chrono::tzdb_list::cbegin()'],['http://en.cppreference.com/w/cpp/container/multiset/begin.html',1,'std::multiset::cbegin()'],['http://en.cppreference.com/w/cpp/container/multimap/begin.html',1,'std::multimap::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::match_results::cbegin()'],['http://en.cppreference.com/w/cpp/container/map/begin.html',1,'std::map::cbegin()'],['http://en.cppreference.com/w/cpp/container/list/begin.html',1,'std::list::cbegin()'],['http://en.cppreference.com/w/cpp/iterator/begin.html',1,'std::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::wstring::cbegin()'],['../classripple_1_1Buffer.html#a0425ae189aabad52bf1171511d041e1f',1,'ripple::Buffer::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::cmatch::cbegin()'],['http://en.cppreference.com/w/cpp/container/deque/begin.html',1,'std::deque::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::basic_string_view::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::string_view::cbegin()'],['http://en.cppreference.com/w/cpp/container/forward_list/begin.html',1,'std::forward_list::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::wstring_view::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::u32string_view::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::u16string_view::cbegin()'],['http://en.cppreference.com/w/cpp/container/forward_list/begin.html',1,'std::pmr::forward_list::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::string::cbegin()'],['http://en.cppreference.com/w/cpp/container/set/begin.html',1,'std::pmr::set::cbegin()'],['http://en.cppreference.com/w/cpp/container/multiset/begin.html',1,'std::pmr::multiset::cbegin()'],['http://en.cppreference.com/w/cpp/container/multimap/begin.html',1,'std::pmr::multimap::cbegin()'],['http://en.cppreference.com/w/cpp/container/map/begin.html',1,'std::pmr::map::cbegin()'],['http://en.cppreference.com/w/cpp/container/list/begin.html',1,'std::pmr::list::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::u16string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::u32string::cbegin()'],['http://en.cppreference.com/w/cpp/container/deque/begin.html',1,'std::pmr::deque::cbegin()'],['http://en.cppreference.com/w/cpp/container/array/begin.html',1,'std::array::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::u8string::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_map/begin.html',1,'std::pmr::unordered_map::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/begin.html',1,'std::pmr::unordered_multimap::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/begin.html',1,'std::pmr::unordered_multiset::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_set/begin.html',1,'std::pmr::unordered_set::cbegin()'],['http://en.cppreference.com/w/cpp/container/vector/begin.html',1,'std::pmr::vector::cbegin()']]], + ['cbegin_28int_29_125',['cbegin(int)',['http://en.cppreference.com/w/cpp/container/unordered_multiset/begin2.html',1,'std::pmr::unordered_multiset::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_map/begin2.html',1,'std::pmr::unordered_map::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_set/begin2.html',1,'std::unordered_set::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/begin2.html',1,'std::unordered_multiset::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/begin2.html',1,'std::unordered_multimap::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_map/begin2.html',1,'std::unordered_map::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_set/begin2.html',1,'std::pmr::unordered_set::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/begin2.html',1,'std::pmr::unordered_multimap::cbegin(int)()']]], ['cbrt_126',['cbrt',['http://en.cppreference.com/w/cpp/numeric/math/cbrt.html',1,'std']]], ['ccomplex_127',['ccomplex',['http://en.cppreference.com/w/cpp/header/ccomplex.html',1,'']]], ['cctype_128',['cctype',['http://en.cppreference.com/w/cpp/header/cctype.html',1,'']]], @@ -137,7 +137,7 @@ var searchData= ['ceil_5flog2_134',['ceil_log2',['../classripple_1_1ServerImpl.html#adc9d584f90e323f1e0fd59df96729e76',1,'ripple::ServerImpl']]], ['ceil_5fout_135',['ceil_out',['../classripple_1_1Quality__test.html#a3e01307c4713dc19ca9b5f4517bae539',1,'ripple::Quality_test']]], ['ceil_5fout_5fimpl_136',['ceil_out_impl',['../namespaceripple.html#a00a9bb5ffdc23b323ac5c9382eee534c',1,'ripple']]], - ['cend_137',['cend',['http://en.cppreference.com/w/cpp/regex/match_results/end.html',1,'std::wsmatch::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::wstring::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/end.html',1,'std::wstring_view::cend()'],['../classripple_1_1base__uint.html#a7466966dd532bb1be84c325a3b085adb',1,'ripple::base_uint::cend()'],['../classripple_1_1Section.html#a4906292d5ca9524e9abfb42c01c697b2',1,'ripple::Section::cend()'],['../classripple_1_1Buffer.html#a3bede84d7458d2e67ce31e38eb5aa3ba',1,'ripple::Buffer::cend()'],['../classripple_1_1partitioned__unordered__map.html#a9dcc5030f6663176c4183fc6283d5fa8',1,'ripple::partitioned_unordered_map::cend()'],['../classripple_1_1Slice.html#a3dfd26fc868ea74a200ef6ad27298b9a',1,'ripple::Slice::cend()'],['../classbeast_1_1detail_1_1aged__ordered__container_1_1chronological__t.html#aa42ee86e9059d178463518c644087d38',1,'beast::detail::aged_ordered_container::chronological_t::cend()'],['../classbeast_1_1detail_1_1aged__ordered__container.html#a2f75ce243105441e86d2663e29140569',1,'beast::detail::aged_ordered_container::cend()'],['../classbeast_1_1detail_1_1aged__unordered__container.html#a820fcd764ec975eb45bd33c4b063520e',1,'beast::detail::aged_unordered_container::cend() const'],['../classbeast_1_1detail_1_1aged__unordered__container.html#a244775e01d811e1d5e54b09518991342',1,'beast::detail::aged_unordered_container::cend(size_type n) const'],['../classbeast_1_1List.html#a16c1ce8b06e47e2566355e039e666623',1,'beast::List::cend()'],['../classbeast_1_1LockFreeStack.html#a05f4144c95b980440fa49b2e24dfddc2',1,'beast::LockFreeStack::cend()'],['../classbeast_1_1unit__test_1_1detail_1_1const__container.html#aa2acd2875a47b140e4dde2dbb13512e1',1,'beast::unit_test::detail::const_container::cend()'],['../classripple_1_1PublicKey.html#aa79acc9aeab9e2ac37722c15f6cbe768',1,'ripple::PublicKey::cend()'],['../classripple_1_1SecretKey.html#ab42ae9ec0bce6d623a43b03ef0f6c035',1,'ripple::SecretKey::cend()'],['../classripple_1_1Seed.html#a2d433f145c9dbca75331ed4bde44dcd7',1,'ripple::Seed::cend()'],['../classripple_1_1SOTemplate.html#a0552d8a6f36ecf0d2fed55bc1af26c63',1,'ripple::SOTemplate::cend()'],['../classripple_1_1JobTypes.html#a0a6ed77ebfc73f438e335d66e43b551c',1,'ripple::JobTypes::cend()'],['../classripple_1_1PeerFinder_1_1Bootcache.html#a5074b1be3771d7f6e1d487cafbbc313b',1,'ripple::PeerFinder::Bootcache::cend()'],['../classripple_1_1PeerFinder_1_1detail_1_1LivecacheBase_1_1Hop.html#a51b62bca738517174e3b377c887fb0f5',1,'ripple::PeerFinder::detail::LivecacheBase::Hop::cend()'],['../classripple_1_1PeerFinder_1_1Livecache_1_1hops__t.html#ae0b3bde4959568e40b5a2a4d491a4d11',1,'ripple::PeerFinder::Livecache::hops_t::cend()'],['../classbeast_1_1detail_1_1aged__unordered__container_1_1chronological__t.html#af72893b6a86fe09c0831f2f95b914f3d',1,'beast::detail::aged_unordered_container::chronological_t::cend()'],['http://en.cppreference.com/w/cpp/container/list/end.html',1,'std::list::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::pmr::string::cend()'],['http://en.cppreference.com/w/cpp/container/set/end.html',1,'std::pmr::set::cend()'],['http://en.cppreference.com/w/cpp/container/multiset/end.html',1,'std::pmr::multiset::cend()'],['http://en.cppreference.com/w/cpp/container/multimap/end.html',1,'std::pmr::multimap::cend()'],['http://en.cppreference.com/w/cpp/container/map/end.html',1,'std::pmr::map::cend()'],['http://en.cppreference.com/w/cpp/container/list/end.html',1,'std::pmr::list::cend()'],['http://en.cppreference.com/w/cpp/container/forward_list/end.html',1,'std::pmr::forward_list::cend()'],['http://en.cppreference.com/w/cpp/container/deque/end.html',1,'std::pmr::deque::cend()'],['http://en.cppreference.com/w/cpp/container/multiset/end.html',1,'std::multiset::cend()'],['http://en.cppreference.com/w/cpp/container/multimap/end.html',1,'std::multimap::cend()'],['http://en.cppreference.com/w/cpp/regex/match_results/end.html',1,'std::match_results::cend()'],['http://en.cppreference.com/w/cpp/container/map/end.html',1,'std::map::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::pmr::u16string::cend()'],['http://en.cppreference.com/w/cpp/container/forward_list/end.html',1,'std::forward_list::cend()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/end.html',1,'std::experimental::wstring_view::cend()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/end.html',1,'std::experimental::u32string_view::cend()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/end.html',1,'std::experimental::u16string_view::cend()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/end.html',1,'std::experimental::string_view::cend()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/end.html',1,'std::experimental::basic_string_view::cend()'],['http://en.cppreference.com/w/cpp/container/deque/end.html',1,'std::deque::cend()'],['http://en.cppreference.com/w/cpp/regex/match_results/end.html',1,'std::cmatch::cend()'],['http://en.cppreference.com/w/cpp/chrono/tzdb_list/end.html',1,'std::chrono::tzdb_list::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/end.html',1,'std::basic_string_view::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::basic_string::cend()'],['http://en.cppreference.com/w/cpp/container/array/end.html',1,'std::array::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::string::cend()'],['http://en.cppreference.com/w/cpp/container/vector/end.html',1,'std::vector::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_set/end.html',1,'std::unordered_set::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/end.html',1,'std::unordered_multiset::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/end.html',1,'std::unordered_multimap::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_map/end.html',1,'std::unordered_map::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/end.html',1,'std::u8string_view::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::u8string::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/end.html',1,'std::u32string_view::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::u32string::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/end.html',1,'std::u16string_view::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::u16string::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/end.html',1,'std::string_view::cend()'],['http://en.cppreference.com/w/cpp/regex/match_results/end.html',1,'std::wcmatch::cend()'],['http://en.cppreference.com/w/cpp/container/span/end.html',1,'std::span::cend()'],['http://en.cppreference.com/w/cpp/regex/match_results/end.html',1,'std::smatch::cend()'],['http://en.cppreference.com/w/cpp/container/set/end.html',1,'std::set::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::pmr::wstring::cend()'],['http://en.cppreference.com/w/cpp/container/vector/end.html',1,'std::pmr::vector::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_set/end.html',1,'std::pmr::unordered_set::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/end.html',1,'std::pmr::unordered_multiset::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/end.html',1,'std::pmr::unordered_multimap::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_map/end.html',1,'std::pmr::unordered_map::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::pmr::u8string::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::pmr::u32string::cend()'],['http://en.cppreference.com/w/cpp/iterator/end.html',1,'std::cend()']]], + ['cend_137',['cend',['../classbeast_1_1detail_1_1aged__unordered__container.html#a244775e01d811e1d5e54b09518991342',1,'beast::detail::aged_unordered_container::cend()'],['http://en.cppreference.com/w/cpp/regex/match_results/end.html',1,'std::wsmatch::cend()'],['../classbeast_1_1detail_1_1aged__unordered__container_1_1chronological__t.html#af72893b6a86fe09c0831f2f95b914f3d',1,'beast::detail::aged_unordered_container::chronological_t::cend()'],['../classbeast_1_1detail_1_1aged__ordered__container.html#a2f75ce243105441e86d2663e29140569',1,'beast::detail::aged_ordered_container::cend()'],['../classbeast_1_1detail_1_1aged__ordered__container_1_1chronological__t.html#aa42ee86e9059d178463518c644087d38',1,'beast::detail::aged_ordered_container::chronological_t::cend()'],['../classripple_1_1Slice.html#a3dfd26fc868ea74a200ef6ad27298b9a',1,'ripple::Slice::cend()'],['../classripple_1_1partitioned__unordered__map.html#a9dcc5030f6663176c4183fc6283d5fa8',1,'ripple::partitioned_unordered_map::cend()'],['../classripple_1_1Buffer.html#a3bede84d7458d2e67ce31e38eb5aa3ba',1,'ripple::Buffer::cend()'],['../classripple_1_1Section.html#a4906292d5ca9524e9abfb42c01c697b2',1,'ripple::Section::cend()'],['../classripple_1_1base__uint.html#a7466966dd532bb1be84c325a3b085adb',1,'ripple::base_uint::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/end.html',1,'std::wstring_view::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::wstring::cend()'],['../classbeast_1_1List.html#a16c1ce8b06e47e2566355e039e666623',1,'beast::List::cend()'],['../classbeast_1_1LockFreeStack.html#a05f4144c95b980440fa49b2e24dfddc2',1,'beast::LockFreeStack::cend()'],['../classbeast_1_1unit__test_1_1detail_1_1const__container.html#aa2acd2875a47b140e4dde2dbb13512e1',1,'beast::unit_test::detail::const_container::cend()'],['../classripple_1_1PublicKey.html#aa79acc9aeab9e2ac37722c15f6cbe768',1,'ripple::PublicKey::cend()'],['../classripple_1_1SecretKey.html#ab42ae9ec0bce6d623a43b03ef0f6c035',1,'ripple::SecretKey::cend()'],['../classripple_1_1Seed.html#a2d433f145c9dbca75331ed4bde44dcd7',1,'ripple::Seed::cend()'],['../classripple_1_1SOTemplate.html#a0552d8a6f36ecf0d2fed55bc1af26c63',1,'ripple::SOTemplate::cend()'],['../classripple_1_1JobTypes.html#a0a6ed77ebfc73f438e335d66e43b551c',1,'ripple::JobTypes::cend()'],['../classripple_1_1PeerFinder_1_1Bootcache.html#a5074b1be3771d7f6e1d487cafbbc313b',1,'ripple::PeerFinder::Bootcache::cend()'],['../classripple_1_1PeerFinder_1_1detail_1_1LivecacheBase_1_1Hop.html#a51b62bca738517174e3b377c887fb0f5',1,'ripple::PeerFinder::detail::LivecacheBase::Hop::cend()'],['../classripple_1_1PeerFinder_1_1Livecache_1_1hops__t.html#ae0b3bde4959568e40b5a2a4d491a4d11',1,'ripple::PeerFinder::Livecache::hops_t::cend()'],['../classbeast_1_1detail_1_1aged__unordered__container.html#a820fcd764ec975eb45bd33c4b063520e',1,'beast::detail::aged_unordered_container::cend()'],['http://en.cppreference.com/w/cpp/container/list/end.html',1,'std::list::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::pmr::string::cend()'],['http://en.cppreference.com/w/cpp/container/set/end.html',1,'std::pmr::set::cend()'],['http://en.cppreference.com/w/cpp/container/multiset/end.html',1,'std::pmr::multiset::cend()'],['http://en.cppreference.com/w/cpp/container/multimap/end.html',1,'std::pmr::multimap::cend()'],['http://en.cppreference.com/w/cpp/container/map/end.html',1,'std::pmr::map::cend()'],['http://en.cppreference.com/w/cpp/container/list/end.html',1,'std::pmr::list::cend()'],['http://en.cppreference.com/w/cpp/container/forward_list/end.html',1,'std::pmr::forward_list::cend()'],['http://en.cppreference.com/w/cpp/container/deque/end.html',1,'std::pmr::deque::cend()'],['http://en.cppreference.com/w/cpp/container/multiset/end.html',1,'std::multiset::cend()'],['http://en.cppreference.com/w/cpp/container/multimap/end.html',1,'std::multimap::cend()'],['http://en.cppreference.com/w/cpp/regex/match_results/end.html',1,'std::match_results::cend()'],['http://en.cppreference.com/w/cpp/container/map/end.html',1,'std::map::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::pmr::u16string::cend()'],['http://en.cppreference.com/w/cpp/container/forward_list/end.html',1,'std::forward_list::cend()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/end.html',1,'std::experimental::wstring_view::cend()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/end.html',1,'std::experimental::u32string_view::cend()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/end.html',1,'std::experimental::u16string_view::cend()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/end.html',1,'std::experimental::string_view::cend()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/end.html',1,'std::experimental::basic_string_view::cend()'],['http://en.cppreference.com/w/cpp/container/deque/end.html',1,'std::deque::cend()'],['http://en.cppreference.com/w/cpp/regex/match_results/end.html',1,'std::cmatch::cend()'],['http://en.cppreference.com/w/cpp/chrono/tzdb_list/end.html',1,'std::chrono::tzdb_list::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/end.html',1,'std::basic_string_view::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::basic_string::cend()'],['http://en.cppreference.com/w/cpp/container/array/end.html',1,'std::array::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::string::cend()'],['http://en.cppreference.com/w/cpp/container/vector/end.html',1,'std::vector::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_set/end.html',1,'std::unordered_set::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/end.html',1,'std::unordered_multiset::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/end.html',1,'std::unordered_multimap::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_map/end.html',1,'std::unordered_map::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/end.html',1,'std::u8string_view::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::u8string::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/end.html',1,'std::u32string_view::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::u32string::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/end.html',1,'std::u16string_view::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::u16string::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/end.html',1,'std::string_view::cend()'],['http://en.cppreference.com/w/cpp/regex/match_results/end.html',1,'std::wcmatch::cend()'],['http://en.cppreference.com/w/cpp/container/span/end.html',1,'std::span::cend()'],['http://en.cppreference.com/w/cpp/regex/match_results/end.html',1,'std::smatch::cend()'],['http://en.cppreference.com/w/cpp/container/set/end.html',1,'std::set::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::pmr::wstring::cend()'],['http://en.cppreference.com/w/cpp/container/vector/end.html',1,'std::pmr::vector::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_set/end.html',1,'std::pmr::unordered_set::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/end.html',1,'std::pmr::unordered_multiset::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/end.html',1,'std::pmr::unordered_multimap::cend()'],['http://en.cppreference.com/w/cpp/container/unordered_map/end.html',1,'std::pmr::unordered_map::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::pmr::u8string::cend()'],['http://en.cppreference.com/w/cpp/string/basic_string/end.html',1,'std::pmr::u32string::cend()'],['http://en.cppreference.com/w/cpp/iterator/end.html',1,'std::cend()']]], ['cend_28int_29_138',['cend(int)',['http://en.cppreference.com/w/cpp/container/unordered_set/end2.html',1,'std::unordered_set::cend(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/end2.html',1,'std::unordered_multiset::cend(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/end2.html',1,'std::unordered_multimap::cend(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_map/end2.html',1,'std::unordered_map::cend(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_set/end2.html',1,'std::pmr::unordered_set::cend(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/end2.html',1,'std::pmr::unordered_multiset::cend(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/end2.html',1,'std::pmr::unordered_multimap::cend(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_map/end2.html',1,'std::pmr::unordered_map::cend(int)()']]], ['censorshipdetector_5f_139',['censorshipDetector_',['../classripple_1_1RCLConsensus_1_1Adaptor.html#a680ee42fcc8e44fb714bd82ec20b3ba3',1,'ripple::RCLConsensus::Adaptor']]], ['censorshipwarninternal_140',['censorshipWarnInternal',['../classripple_1_1RCLConsensus.html#a6a92162f62d54bf606c5fa683d7552cc',1,'ripple::RCLConsensus']]], @@ -520,7 +520,7 @@ var searchData= ['comp_5fellint_5f3l_517',['comp_ellint_3l',['http://en.cppreference.com/w/cpp/numeric/special_functions/comp_ellint_3.html',1,'std']]], ['compact_518',['compact',['../classJson_1_1Compact.html',1,'Json::Compact'],['../classJson_1_1Compact.html#a85bd6b6bc58576239cbf3691ccf91c94',1,'Json::Compact::Compact()']]], ['comparator_519',['comparator',['../structripple_1_1Cluster_1_1Comparator.html',1,'ripple::Cluster::Comparator'],['../structripple_1_1Cluster_1_1Comparator.html#a324f9259a42b47d76ef722eb346f87fe',1,'ripple::Cluster::Comparator::Comparator()']]], - ['compare_520',['compare',['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::u8string::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/compare.html',1,'std::u8string_view::compare()'],['http://en.cppreference.com/w/cpp/regex/sub_match/compare.html',1,'std::wcsub_match::compare()'],['http://en.cppreference.com/w/cpp/regex/sub_match/compare.html',1,'std::wssub_match::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::wstring::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/compare.html',1,'std::wstring_view::compare()'],['../classbeast_1_1detail_1_1aged__ordered__container_1_1KeyValueCompare.html#a1e1eaae3258f66994d49bc025d15b366',1,'beast::detail::aged_ordered_container::KeyValueCompare::compare()'],['../classbeast_1_1detail_1_1aged__ordered__container_1_1config__t.html#ae9cc699dd4008177a745ac84f23317c1',1,'beast::detail::aged_ordered_container::config_t::compare()'],['../classbeast_1_1detail_1_1aged__ordered__container_1_1config__t.html#a8b9ca948847d109dd74731365cb47017',1,'beast::detail::aged_ordered_container::config_t::compare() const'],['../classripple_1_1SField.html#ad083a48ff084f1a89427a8e412627a12',1,'ripple::SField::compare()'],['../classripple_1_1SHAMap.html#a09a39196247b7d775f001db67eb37882',1,'ripple::SHAMap::compare()'],['../classripple_1_1test_1_1csf_1_1TxSet.html#a2be91766db016c38030038facad65c70',1,'ripple::test::csf::TxSet::compare()'],['../classripple_1_1RCLTxSet.html#af1f1a3f904da003c6a75f34a52cabbf4',1,'ripple::RCLTxSet::compare()'],['../namespacebeast.html#a0dface6ceb493d6b8c3b86c47900d34f',1,'beast::compare()'],['../classbeast_1_1detail_1_1aged__ordered__container_1_1KeyValueCompare.html#a646e6954202d9bfcf5c90f3e8db5006f',1,'beast::detail::aged_ordered_container::KeyValueCompare::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::u32string::compare()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/compare.html',1,'std::experimental::wstring_view::compare()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/compare.html',1,'std::experimental::u32string_view::compare()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/compare.html',1,'std::experimental::u16string_view::compare()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/compare.html',1,'std::experimental::string_view::compare()'],['http://en.cppreference.com/w/cpp/experimental/fs/path/compare.html',1,'std::experimental::filesystem::path::compare()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/compare.html',1,'std::experimental::basic_string_view::compare()'],['http://en.cppreference.com/w/cpp/regex/sub_match/compare.html',1,'std::csub_match::compare()'],['http://en.cppreference.com/w/cpp/locale/collate/compare.html',1,'std::collate_byname::compare()'],['http://en.cppreference.com/w/cpp/locale/collate/compare.html',1,'std::collate::compare()'],['http://en.cppreference.com/w/cpp/string/char_traits/compare.html',1,'std::char_traits::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/compare.html',1,'std::basic_string_view::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::basic_string::compare()'],['http://en.cppreference.com/w/cpp/header/compare.html',1,'(Global Namespace)'],['http://en.cppreference.com/w/cpp/string/basic_string_view/compare.html',1,'std::u32string_view::compare()'],['http://en.cppreference.com/w/cpp/filesystem/path/compare.html',1,'std::filesystem::path::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::pmr::string::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::pmr::u16string::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::pmr::u32string::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::pmr::u8string::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::pmr::wstring::compare()'],['http://en.cppreference.com/w/cpp/regex/sub_match/compare.html',1,'std::ssub_match::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::string::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/compare.html',1,'std::string_view::compare()'],['http://en.cppreference.com/w/cpp/regex/sub_match/compare.html',1,'std::sub_match::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::u16string::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/compare.html',1,'std::u16string_view::compare()']]], + ['compare_520',['compare',['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::u8string::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/compare.html',1,'std::u8string_view::compare()'],['http://en.cppreference.com/w/cpp/regex/sub_match/compare.html',1,'std::wcsub_match::compare()'],['http://en.cppreference.com/w/cpp/regex/sub_match/compare.html',1,'std::wssub_match::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::wstring::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/compare.html',1,'std::wstring_view::compare()'],['../classbeast_1_1detail_1_1aged__ordered__container_1_1KeyValueCompare.html#a1e1eaae3258f66994d49bc025d15b366',1,'beast::detail::aged_ordered_container::KeyValueCompare::compare()'],['../classbeast_1_1detail_1_1aged__ordered__container_1_1KeyValueCompare.html#a646e6954202d9bfcf5c90f3e8db5006f',1,'beast::detail::aged_ordered_container::KeyValueCompare::compare() const'],['../classbeast_1_1detail_1_1aged__ordered__container_1_1config__t.html#a8b9ca948847d109dd74731365cb47017',1,'beast::detail::aged_ordered_container::config_t::compare()'],['../classripple_1_1SField.html#ad083a48ff084f1a89427a8e412627a12',1,'ripple::SField::compare()'],['../classripple_1_1SHAMap.html#a09a39196247b7d775f001db67eb37882',1,'ripple::SHAMap::compare()'],['../classripple_1_1test_1_1csf_1_1TxSet.html#a2be91766db016c38030038facad65c70',1,'ripple::test::csf::TxSet::compare()'],['../classripple_1_1RCLTxSet.html#af1f1a3f904da003c6a75f34a52cabbf4',1,'ripple::RCLTxSet::compare()'],['../namespacebeast.html#a0dface6ceb493d6b8c3b86c47900d34f',1,'beast::compare()'],['../classbeast_1_1detail_1_1aged__ordered__container_1_1config__t.html#ae9cc699dd4008177a745ac84f23317c1',1,'beast::detail::aged_ordered_container::config_t::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::u32string::compare()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/compare.html',1,'std::experimental::wstring_view::compare()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/compare.html',1,'std::experimental::u32string_view::compare()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/compare.html',1,'std::experimental::u16string_view::compare()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/compare.html',1,'std::experimental::string_view::compare()'],['http://en.cppreference.com/w/cpp/experimental/fs/path/compare.html',1,'std::experimental::filesystem::path::compare()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/compare.html',1,'std::experimental::basic_string_view::compare()'],['http://en.cppreference.com/w/cpp/regex/sub_match/compare.html',1,'std::csub_match::compare()'],['http://en.cppreference.com/w/cpp/locale/collate/compare.html',1,'std::collate_byname::compare()'],['http://en.cppreference.com/w/cpp/locale/collate/compare.html',1,'std::collate::compare()'],['http://en.cppreference.com/w/cpp/string/char_traits/compare.html',1,'std::char_traits::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/compare.html',1,'std::basic_string_view::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::basic_string::compare()'],['http://en.cppreference.com/w/cpp/header/compare.html',1,'(Global Namespace)'],['http://en.cppreference.com/w/cpp/string/basic_string_view/compare.html',1,'std::u32string_view::compare()'],['http://en.cppreference.com/w/cpp/filesystem/path/compare.html',1,'std::filesystem::path::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::pmr::string::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::pmr::u16string::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::pmr::u32string::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::pmr::u8string::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::pmr::wstring::compare()'],['http://en.cppreference.com/w/cpp/regex/sub_match/compare.html',1,'std::ssub_match::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::string::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/compare.html',1,'std::string_view::compare()'],['http://en.cppreference.com/w/cpp/regex/sub_match/compare.html',1,'std::sub_match::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string/compare.html',1,'std::u16string::compare()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/compare.html',1,'std::u16string_view::compare()']]], ['compare_5fexchange_5fstrong_521',['compare_exchange_strong',['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_least16_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uintmax_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_least32_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_least64_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_least8_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/experimental/atomic_shared_ptr/compare_exchange.html',1,'std::experimental::atomic_shared_ptr::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_fast8_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_fast64_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_fast32_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_fast16_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint8_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uintptr_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_ullong::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_ulong::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_unsigned_lock_free::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_ushort::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_wchar_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_char::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/experimental/atomic_weak_ptr/compare_exchange.html',1,'std::experimental::atomic_weak_ptr::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_bool::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint32_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int8_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_fast16_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_fast32_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_fast64_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_fast8_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_least16_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int64_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int32_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int16_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_char8_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_char32_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_char16_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint64_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_least32_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_least8_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_intmax_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_intptr_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_llong::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_long::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_ptrdiff_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic_ref/compare_exchange.html',1,'std::atomic_ref::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_schar::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_least64_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_short::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_signed_lock_free::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_size_t::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uchar::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint::compare_exchange_strong()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint16_t::compare_exchange_strong()']]], ['compare_5fexchange_5fweak_522',['compare_exchange_weak',['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_least32_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_least64_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_least8_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uintmax_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uintptr_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_ullong::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_ulong::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_unsigned_lock_free::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_ushort::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_wchar_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/experimental/atomic_shared_ptr/compare_exchange.html',1,'std::experimental::atomic_shared_ptr::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/experimental/atomic_weak_ptr/compare_exchange.html',1,'std::experimental::atomic_weak_ptr::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_fast64_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_fast8_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_bool::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_char::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_char16_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_char32_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_char8_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_fast32_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_fast16_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int8_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int64_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int32_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int16_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_fast8_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_llong::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_long::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_ptrdiff_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic_ref/compare_exchange.html',1,'std::atomic_ref::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_schar::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_intptr_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_short::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_intmax_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_signed_lock_free::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_least8_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_least64_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_least32_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_least16_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_int_least16_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_fast64_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_fast32_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint_fast16_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint8_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint64_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint32_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint16_t::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uint::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_uchar::compare_exchange_weak()'],['http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange.html',1,'std::atomic_size_t::compare_exchange_weak()']]], ['compares_523',['compares',['../structripple_1_1ConsensusResult.html#a56e409e5212229dc0fb8514350fa52b2',1,'ripple::ConsensusResult']]], diff --git a/search/functions_3.js b/search/functions_3.js index 9523519d43..103fa0f9e7 100644 --- a/search/functions_3.js +++ b/search/functions_3.js @@ -4,7 +4,7 @@ var searchData= ['c32rtomb_1',['c32rtomb',['http://en.cppreference.com/w/cpp/string/multibyte/c32rtomb.html',1,'std']]], ['c8rtomb_2',['c8rtomb',['http://en.cppreference.com/w/cpp/string/multibyte/c8rtomb.html',1,'std']]], ['c_5fencoding_3',['c_encoding',['http://en.cppreference.com/w/cpp/chrono/weekday/encoding.html',1,'std::chrono::weekday']]], - ['c_5fstr_4',['c_str',['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::basic_string::c_str()'],['../classJson_1_1Value_1_1CZString.html#acdb94e5567ddac32b9182ebb0190903c',1,'Json::Value::CZString::c_str()'],['../classJson_1_1StaticString.html#a057d6d159f7f7ec51950d3a820dcf19a',1,'Json::StaticString::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::wstring::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::u8string::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::u32string::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::string::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::pmr::string::c_str()'],['http://en.cppreference.com/w/cpp/filesystem/path/native.html',1,'std::filesystem::path::c_str()'],['http://en.cppreference.com/w/cpp/experimental/fs/path/native.html',1,'std::experimental::filesystem::path::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::u16string::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::pmr::u16string::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::pmr::u32string::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::pmr::u8string::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::pmr::wstring::c_str()']]], + ['c_5fstr_4',['c_str',['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::basic_string::c_str()'],['../classJson_1_1Value_1_1CZString.html#acdb94e5567ddac32b9182ebb0190903c',1,'Json::Value::CZString::c_str()'],['../classJson_1_1StaticString.html#a057d6d159f7f7ec51950d3a820dcf19a',1,'Json::StaticString::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::wstring::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::u8string::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::u32string::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::string::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::pmr::string::c_str()'],['http://en.cppreference.com/w/cpp/filesystem/path/native.html',1,'std::filesystem::path::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::u16string::c_str()'],['http://en.cppreference.com/w/cpp/experimental/fs/path/native.html',1,'std::experimental::filesystem::path::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::pmr::u16string::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::pmr::u32string::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::pmr::u8string::c_str()'],['http://en.cppreference.com/w/cpp/string/basic_string/c_str.html',1,'std::pmr::wstring::c_str()']]], ['ca_5fcert_5',['ca_cert',['../classripple_1_1test_1_1TrustedPublisherServer.html#a7c340c83e88fd9a83fe33002e4760ad1',1,'ripple::test::TrustedPublisherServer']]], ['cache_6',['cache',['../structripple_1_1BookStep_1_1Cache.html#a99dd72c5f6f213fabc063a6885a94a78',1,'ripple::BookStep::Cache::Cache()'],['../structripple_1_1DirectStepI_1_1Cache.html#a59e68bd24794bad8f18261169b43fc0f',1,'ripple::DirectStepI::Cache::Cache()']]], ['cached_7',['cached',['../classripple_1_1XRPEndpointStep.html#a92e85fb6a6db9bae8263316d0cf18c04',1,'ripple::XRPEndpointStep']]], @@ -24,7 +24,7 @@ var searchData= ['calcnodeid_21',['calcNodeID',['../namespaceripple.html#aa2a27f242f6d150ff52f2ad0b2e2a512',1,'ripple']]], ['calcoutpeers_22',['calcOutPeers',['../structripple_1_1PeerFinder_1_1Config.html#af22578657f9b42b4c0b66cb6289761aa',1,'ripple::PeerFinder::Config']]], ['calculatebalancechange_23',['calculateBalanceChange',['../classripple_1_1TransfersNotFrozen.html#a8ddbeaaeb7db0580dd5e4c3dbe3690d4',1,'ripple::TransfersNotFrozen']]], - ['calculatebasefee_24',['calculatebasefee',['../classripple_1_1LedgerStateFix.html#a014a07d44ccb1669fae8cad27c9f232d',1,'ripple::LedgerStateFix::calculateBaseFee()'],['../classripple_1_1EscrowFinish.html#ade982a23b9e5024f0cc518a26a16b85b',1,'ripple::EscrowFinish::calculateBaseFee()'],['../classripple_1_1AMMCreate.html#aacbb467211f50a54170c9934f65f7e12',1,'ripple::AMMCreate::calculateBaseFee()'],['../classripple_1_1Batch.html#ad1cbb14e4ee9d4b5b59104f5d571230a',1,'ripple::Batch::calculateBaseFee()'],['../classripple_1_1Change.html#a115bd4d8f9f908afc75c5b15a34f1e2e',1,'ripple::Change::calculateBaseFee()'],['../namespaceripple.html#a3deb4c69ca598c60e6502a3be527835e',1,'ripple::calculateBaseFee()'],['../classripple_1_1DeleteAccount.html#aad1cbce6f2cb51d12962972fb83e3749',1,'ripple::DeleteAccount::calculateBaseFee()'],['../classripple_1_1SetRegularKey.html#a0094d5dbd069870b1d20c3318b76dda7',1,'ripple::SetRegularKey::calculateBaseFee()'],['../classripple_1_1Transactor.html#a428581db1f9eea2f41cf9e371a1e557d',1,'ripple::Transactor::calculateBaseFee()'],['../classripple_1_1VaultCreate.html#af9ccabf01c1d6bd7694249c7c0a8716c',1,'ripple::VaultCreate::calculateBaseFee()']]], + ['calculatebasefee_24',['calculatebasefee',['../classripple_1_1LedgerStateFix.html#a014a07d44ccb1669fae8cad27c9f232d',1,'ripple::LedgerStateFix::calculateBaseFee()'],['../classripple_1_1EscrowFinish.html#ade982a23b9e5024f0cc518a26a16b85b',1,'ripple::EscrowFinish::calculateBaseFee()'],['../classripple_1_1AMMCreate.html#aacbb467211f50a54170c9934f65f7e12',1,'ripple::AMMCreate::calculateBaseFee()'],['../classripple_1_1Batch.html#ad1cbb14e4ee9d4b5b59104f5d571230a',1,'ripple::Batch::calculateBaseFee()'],['../classripple_1_1Change.html#a115bd4d8f9f908afc75c5b15a34f1e2e',1,'ripple::Change::calculateBaseFee()'],['../namespaceripple.html#a3deb4c69ca598c60e6502a3be527835e',1,'ripple::calculateBaseFee()'],['../classripple_1_1DeleteAccount.html#aad1cbce6f2cb51d12962972fb83e3749',1,'ripple::DeleteAccount::calculateBaseFee()'],['../classripple_1_1SetRegularKey.html#a0094d5dbd069870b1d20c3318b76dda7',1,'ripple::SetRegularKey::calculateBaseFee()'],['../classripple_1_1Transactor.html#a428581db1f9eea2f41cf9e371a1e557d',1,'ripple::Transactor::calculateBaseFee()']]], ['calculatedefaultbasefee_25',['calculateDefaultBaseFee',['../namespaceripple.html#ae89924d6641e992f08233d811f17f6f3',1,'ripple']]], ['calculateledgerhash_26',['calculateLedgerHash',['../namespaceripple.html#a71f5c3f4baec0e09c5eab4d6f5b5efcb',1,'ripple']]], ['calculateownerreservefee_27',['calculateOwnerReserveFee',['../classripple_1_1Transactor.html#aae7d5ad05a7074eabf7ede735de264d7',1,'ripple::Transactor']]], @@ -33,7 +33,7 @@ var searchData= ['calculatetweak_30',['calculateTweak',['../classripple_1_1detail_1_1Generator.html#a034ba31059edc745a9ef73de617c1c1f',1,'ripple::detail::Generator']]], ['call_5fonce_31',['call_once',['http://en.cppreference.com/w/cpp/thread/call_once.html',1,'std']]], ['call_5fsignum_32',['call_signum',['../namespacebeast_1_1detail_1_1zero__helper.html#a77d9500e66ee306c006acc03b2e025cd',1,'beast::detail::zero_helper']]], - ['callback_33',['callback',['../structripple_1_1Workers_1_1Callback.html#a8ea5b61a0e9ec549c6aa6d6975b0a0ac',1,'ripple::Workers::Callback::Callback()'],['../structripple_1_1NodeStore_1_1BatchWriter_1_1Callback.html#ad428f99741bfe01114cefb347671e416',1,'ripple::NodeStore::BatchWriter::Callback::Callback()'],['../structripple_1_1Workers_1_1Callback.html#ae0c6ccaf33c99f8173485201eadbb385',1,'ripple::Workers::Callback::Callback()'],['../structripple_1_1NodeStore_1_1BatchWriter_1_1Callback.html#ae26b87e799f137ffeec03bfaed515634',1,'ripple::NodeStore::BatchWriter::Callback::Callback()']]], + ['callback_33',['callback',['../structripple_1_1Workers_1_1Callback.html#ae0c6ccaf33c99f8173485201eadbb385',1,'ripple::Workers::Callback::Callback()'],['../structripple_1_1NodeStore_1_1BatchWriter_1_1Callback.html#ad428f99741bfe01114cefb347671e416',1,'ripple::NodeStore::BatchWriter::Callback::Callback()=default'],['../structripple_1_1NodeStore_1_1BatchWriter_1_1Callback.html#ae26b87e799f137ffeec03bfaed515634',1,'ripple::NodeStore::BatchWriter::Callback::Callback(Callback const &)=delete'],['../structripple_1_1Workers_1_1Callback.html#a8ea5b61a0e9ec549c6aa6d6975b0a0ac',1,'ripple::Workers::Callback::Callback()']]], ['calldata_34',['calldata',['../classripple_1_1GRPCServerImpl_1_1CallData.html#a10313cf0741778e8123cff0dfa2b8da6',1,'ripple::GRPCServerImpl::CallData::CallData(CallData const &)=delete'],['../classripple_1_1GRPCServerImpl_1_1CallData.html#ac5926b692a2bfb9811457cf49334b111',1,'ripple::GRPCServerImpl::CallData::CallData(org::xrpl::rpc::v1::XRPLedgerAPIService::AsyncService &service, grpc::ServerCompletionQueue &cq, Application &app, BindListener< Request, Response > bindListener, Handler< Request, Response > handler, Forward< Request, Response > forward, RPC::Condition requiredCondition, Resource::Charge loadType, std::vector< boost::asio::ip::address > const &secureGatewayIPs)']]], ['calloc_35',['calloc',['http://en.cppreference.com/w/cpp/memory/c/calloc.html',1,'std']]], ['callrpchandler_36',['callRPCHandler',['../structripple_1_1RPCCallImp.html#a0d0dc01bdca432ac14e8c67728199fb4',1,'ripple::RPCCallImp']]], @@ -42,7 +42,7 @@ var searchData= ['canaddholding_39',['canaddholding',['../namespaceripple.html#aeb939f9e373534507258567fdccb72c8',1,'ripple::canAddHolding(ReadView const &view, MPTIssue const &mptIssue)'],['../namespaceripple.html#ad1fbb782b6c9bbc9a709ebf1ddbedfdb',1,'ripple::canAddHolding(ReadView const &view, Issue const &issue)'],['../namespaceripple.html#ad85034a45d52efca26f2084a0f2f41f1',1,'ripple::canAddHolding(ReadView const &view, Asset const &asset)']]], ['canbecurrent_40',['canBeCurrent',['../classripple_1_1LedgerMaster.html#a45c5a3a1dea7c20d829dededf270ebc7',1,'ripple::LedgerMaster']]], ['canbeheld_41',['canBeHeld',['../classripple_1_1TxQ.html#a5809a0ba90f44da94b1b9f73f5247434',1,'ripple::TxQ']]], - ['cancel_42',['cancel',['../classripple_1_1test_1_1csf_1_1Scheduler.html#ad756895de45f26b19be6e98c20ed2d60',1,'ripple::test::csf::Scheduler::cancel()'],['../classripple_1_1TimeoutCounter.html#ac9f8538b7f73ebcda116c33d5541d16d',1,'ripple::TimeoutCounter::cancel()'],['../classripple_1_1ApplicationImp_1_1io__latency__sampler.html#a3ac8d0ec61a9e506030a3acf7a84e2cc',1,'ripple::ApplicationImp::io_latency_sampler::cancel()'],['../classripple_1_1detail_1_1Work.html#a157da65c7565e5016a6f9481bc045770',1,'ripple::detail::Work::cancel()'],['../classripple_1_1detail_1_1WorkBase.html#a83354ff3793e2f3d29cf218ade9bb23e',1,'ripple::detail::WorkBase::cancel()'],['../classripple_1_1detail_1_1WorkFile.html#a2a9d9e06a386412345c1f644309a7031',1,'ripple::detail::WorkFile::cancel()'],['../classripple_1_1PeerFinder_1_1Source.html#a94789f59b098d37b35bf8d9b9dcdb46f',1,'ripple::PeerFinder::Source::cancel()'],['../classAutoSocket.html#adb778dd03c4b2527ecbbe146a6c2c22b',1,'AutoSocket::cancel()'],['../classbeast_1_1io__latency__probe.html#abb9c67df3d6e343c2712618752c6ad5f',1,'beast::io_latency_probe::cancel()'],['../namespaceripple_1_1test_1_1jtx_1_1escrow.html#ae41b2bb960334c8184b2486a00feae30',1,'ripple::test::jtx::escrow::cancel(Account const &account, Account const &from, std::uint32_t seq)'],['../namespaceripple_1_1test_1_1jtx_1_1escrow.html#a9a4c6814d8c3806defac9610bbc6244a',1,'ripple::test::jtx::escrow::cancel(AccountID const &account, Account const &from, std::uint32_t seq)'],['../namespaceripple_1_1test_1_1jtx_1_1check.html#a2d3a894a7ac4d177a05437a83718d0ac',1,'ripple::test::jtx::check::cancel()'],['../classbeast_1_1io__latency__probe.html#a3aacab2155a327714b711dc3dbc8c69c',1,'beast::io_latency_probe::cancel()']]], + ['cancel_42',['cancel',['../classripple_1_1test_1_1csf_1_1Scheduler.html#ad756895de45f26b19be6e98c20ed2d60',1,'ripple::test::csf::Scheduler::cancel()'],['../classripple_1_1TimeoutCounter.html#ac9f8538b7f73ebcda116c33d5541d16d',1,'ripple::TimeoutCounter::cancel()'],['../classripple_1_1ApplicationImp_1_1io__latency__sampler.html#a3ac8d0ec61a9e506030a3acf7a84e2cc',1,'ripple::ApplicationImp::io_latency_sampler::cancel()'],['../classripple_1_1detail_1_1Work.html#a157da65c7565e5016a6f9481bc045770',1,'ripple::detail::Work::cancel()'],['../classripple_1_1detail_1_1WorkBase.html#a83354ff3793e2f3d29cf218ade9bb23e',1,'ripple::detail::WorkBase::cancel()'],['../classripple_1_1detail_1_1WorkFile.html#a2a9d9e06a386412345c1f644309a7031',1,'ripple::detail::WorkFile::cancel()'],['../classripple_1_1PeerFinder_1_1Source.html#a94789f59b098d37b35bf8d9b9dcdb46f',1,'ripple::PeerFinder::Source::cancel()'],['../classAutoSocket.html#adb778dd03c4b2527ecbbe146a6c2c22b',1,'AutoSocket::cancel()'],['../classbeast_1_1io__latency__probe.html#abb9c67df3d6e343c2712618752c6ad5f',1,'beast::io_latency_probe::cancel()'],['../namespaceripple_1_1test_1_1jtx_1_1escrow.html#ae41b2bb960334c8184b2486a00feae30',1,'ripple::test::jtx::escrow::cancel(Account const &account, Account const &from, std::uint32_t seq)'],['../namespaceripple_1_1test_1_1jtx_1_1escrow.html#a9a4c6814d8c3806defac9610bbc6244a',1,'ripple::test::jtx::escrow::cancel(AccountID const &account, Account const &from, std::uint32_t seq)'],['../classbeast_1_1io__latency__probe.html#a3aacab2155a327714b711dc3dbc8c69c',1,'beast::io_latency_probe::cancel()'],['../namespaceripple_1_1test_1_1jtx_1_1check.html#a2d3a894a7ac4d177a05437a83718d0ac',1,'ripple::test::jtx::check::cancel()']]], ['cancel_5fasync_43',['cancel_async',['../classripple_1_1ApplicationImp_1_1io__latency__sampler.html#a6e6c55b35ab3229ee4e307c78d6ad372',1,'ripple::ApplicationImp::io_latency_sampler::cancel_async()'],['../classbeast_1_1io__latency__probe.html#adaee7525295db67f85573a6b73eff113',1,'beast::io_latency_probe::cancel_async()']]], ['cancel_5ftimer_44',['cancel_timer',['../classripple_1_1BaseWSPeer.html#ad7b7bf280347bf04fd91b4aad40a7cbe',1,'ripple::BaseWSPeer::cancel_timer()'],['../classripple_1_1BaseHTTPPeer.html#ac3c9ac193c8189da5a77603624849c82',1,'ripple::BaseHTTPPeer::cancel_timer()']]], ['cancel_5ftoken_45',['cancel_token',['../structripple_1_1test_1_1csf_1_1Scheduler_1_1cancel__token.html#a71f6904e240c598f0d0660e4173452d3',1,'ripple::test::csf::Scheduler::cancel_token::cancel_token(typename queue_type::iterator iter)'],['../structripple_1_1test_1_1csf_1_1Scheduler_1_1cancel__token.html#abd58f186c9ee021078d316f3e240be41',1,'ripple::test::csf::Scheduler::cancel_token::cancel_token()=delete'],['../structripple_1_1test_1_1csf_1_1Scheduler_1_1cancel__token.html#ad7893252d3c4c59b47387df71c2a81a8',1,'ripple::test::csf::Scheduler::cancel_token::cancel_token(cancel_token const &)=default']]], @@ -57,7 +57,7 @@ var searchData= ['canhavenftokenofferid_54',['canHaveNFTokenOfferID',['../namespaceripple.html#a24dd77739d6bb105b5085085045d1d6a',1,'ripple']]], ['canmergeinto_55',['canMergeInto',['../classripple_1_1LedgerReplayTask_1_1TaskParameter.html#a3c2b56668a4a6a767dd2763a52553bd6',1,'ripple::LedgerReplayTask::TaskParameter']]], ['canonical_56',['canonical',['http://en.cppreference.com/w/cpp/experimental/fs/canonical.html',1,'std::experimental::filesystem::canonical()'],['http://en.cppreference.com/w/cpp/filesystem/canonical.html',1,'std::filesystem::canonical()']]], - ['canonicalize_57',['canonicalize',['../classripple_1_1STAmount.html#a104f16b3dcb68a0b317788706c347809',1,'ripple::STAmount::canonicalize()'],['../classripple_1_1TransactionMaster.html#adfb688396e9aed123c909f739e44a0cf',1,'ripple::TransactionMaster::canonicalize()'],['../classripple_1_1SHAMap.html#a5e0309dab2d67386ce24c8b80ff085d3',1,'ripple::SHAMap::canonicalize()'],['../classripple_1_1TaggedCache.html#a00d05194ed006bf9fe6bff120fb4aac4',1,'ripple::TaggedCache::canonicalize(key_type const &key, SharedPointerType &data, R &&replaceCallback)']]], + ['canonicalize_57',['canonicalize',['../classripple_1_1SHAMap.html#a5e0309dab2d67386ce24c8b80ff085d3',1,'ripple::SHAMap::canonicalize()'],['../classripple_1_1TransactionMaster.html#adfb688396e9aed123c909f739e44a0cf',1,'ripple::TransactionMaster::canonicalize()'],['../classripple_1_1STAmount.html#a104f16b3dcb68a0b317788706c347809',1,'ripple::STAmount::canonicalize()'],['../classripple_1_1TaggedCache.html#a00d05194ed006bf9fe6bff120fb4aac4',1,'ripple::TaggedCache::canonicalize(key_type const &key, SharedPointerType &data, R &&replaceCallback)']]], ['canonicalize_5freplace_5fcache_58',['canonicalize_replace_cache',['../classripple_1_1TaggedCache.html#a7a47e5a8377efd3ba562a2fa4e25137c',1,'ripple::TaggedCache']]], ['canonicalize_5freplace_5fclient_59',['canonicalize_replace_client',['../classripple_1_1TaggedCache.html#a1e2ed25e1eca853619f5213ac43b184a',1,'ripple::TaggedCache']]], ['canonicalizechild_60',['canonicalizeChild',['../classripple_1_1SHAMapInnerNode.html#aaa18f8633150d5eed464cb64ea360a84',1,'ripple::SHAMapInnerNode']]], @@ -79,7 +79,7 @@ var searchData= ['category_76',['category',['http://en.cppreference.com/w/cpp/error/error_code/category.html',1,'std::error_code::category()'],['http://en.cppreference.com/w/cpp/error/error_condition/category.html',1,'std::error_condition::category()']]], ['cauchy_5fdistribution_77',['cauchy_distribution',['http://en.cppreference.com/w/cpp/numeric/random/cauchy_distribution/cauchy_distribution.html',1,'std::cauchy_distribution']]], ['cbefore_5fbegin_78',['cbefore_begin',['http://en.cppreference.com/w/cpp/container/forward_list/before_begin.html',1,'std::forward_list::cbefore_begin()'],['http://en.cppreference.com/w/cpp/container/forward_list/before_begin.html',1,'std::pmr::forward_list::cbefore_begin()']]], - ['cbegin_79',['cbegin',['../classripple_1_1partitioned__unordered__map.html#a78e5ac79c523d29a68fe16d7a02ec3ef',1,'ripple::partitioned_unordered_map::cbegin()'],['http://en.cppreference.com/w/cpp/container/deque/begin.html',1,'std::pmr::deque::cbegin()'],['../classripple_1_1Slice.html#a6bd58d1949a0ff8d1ff226f1a8a82fc6',1,'ripple::Slice::cbegin()'],['../classbeast_1_1detail_1_1aged__ordered__container_1_1chronological__t.html#a335cdd3cce7e32d0a25691b5cca4028c',1,'beast::detail::aged_ordered_container::chronological_t::cbegin()'],['../classbeast_1_1detail_1_1aged__ordered__container.html#a71d3a23b1fb56caffc9a9f677b1c4b4a',1,'beast::detail::aged_ordered_container::cbegin()'],['../classbeast_1_1detail_1_1aged__unordered__container_1_1chronological__t.html#a90ad198f55f3735beaa015a6c7686fa7',1,'beast::detail::aged_unordered_container::chronological_t::cbegin()'],['../classbeast_1_1detail_1_1aged__unordered__container.html#a602d9a545135a60a01f334f22f0d39c1',1,'beast::detail::aged_unordered_container::cbegin() const'],['../classbeast_1_1detail_1_1aged__unordered__container.html#a792cb2116564500cf72de228a5f70d73',1,'beast::detail::aged_unordered_container::cbegin(size_type n) const'],['../classbeast_1_1List.html#ad3ec5127cf5bd832781d3f827f7194ad',1,'beast::List::cbegin()'],['../classbeast_1_1LockFreeStack.html#a5e0d6da45e9fe049347962d309204314',1,'beast::LockFreeStack::cbegin()'],['../classbeast_1_1unit__test_1_1detail_1_1const__container.html#a2825d279f04c7d966f38f0ef097ec781',1,'beast::unit_test::detail::const_container::cbegin()'],['../classripple_1_1PublicKey.html#a86b86a467a0c144b409fdc2a898f4dd4',1,'ripple::PublicKey::cbegin()'],['../classripple_1_1SecretKey.html#ac399f5930d6a751726b4c0b23bde02c8',1,'ripple::SecretKey::cbegin()'],['../classripple_1_1Seed.html#a98072616ae53e8067f40ab73d4d2ea9c',1,'ripple::Seed::cbegin()'],['../classripple_1_1SOTemplate.html#a2daffdbe601520f4b9d85b1d088d03c9',1,'ripple::SOTemplate::cbegin()'],['../classripple_1_1JobTypes.html#af27c9ba16b1eb1047e34b4b0786e132e',1,'ripple::JobTypes::cbegin()'],['../classripple_1_1PeerFinder_1_1Bootcache.html#a2af4b38d2c56f03120d3920b80afa4eb',1,'ripple::PeerFinder::Bootcache::cbegin()'],['../classripple_1_1PeerFinder_1_1detail_1_1LivecacheBase_1_1Hop.html#a3928bbe64f60531ad3160eff8114c449',1,'ripple::PeerFinder::detail::LivecacheBase::Hop::cbegin()'],['../classripple_1_1PeerFinder_1_1Livecache_1_1hops__t.html#a90d9557dbb0ad7941ca187a9dbe1ddf8',1,'ripple::PeerFinder::Livecache::hops_t::cbegin()'],['http://en.cppreference.com/w/cpp/ranges/begin.html',1,'std::ranges::cbegin()'],['http://en.cppreference.com/w/cpp/iterator/begin.html',1,'std::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_map/begin.html',1,'std::pmr::unordered_map::cbegin()'],['http://en.cppreference.com/w/cpp/container/list/begin.html',1,'std::pmr::list::cbegin()'],['http://en.cppreference.com/w/cpp/container/map/begin.html',1,'std::pmr::map::cbegin()'],['http://en.cppreference.com/w/cpp/container/multimap/begin.html',1,'std::pmr::multimap::cbegin()'],['http://en.cppreference.com/w/cpp/container/multiset/begin.html',1,'std::pmr::multiset::cbegin()'],['http://en.cppreference.com/w/cpp/container/set/begin.html',1,'std::pmr::set::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::u16string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::u32string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::u8string::cbegin()'],['http://en.cppreference.com/w/cpp/container/forward_list/begin.html',1,'std::pmr::forward_list::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/begin.html',1,'std::pmr::unordered_multimap::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/begin.html',1,'std::pmr::unordered_multiset::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_set/begin.html',1,'std::pmr::unordered_set::cbegin()'],['http://en.cppreference.com/w/cpp/container/vector/begin.html',1,'std::pmr::vector::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::wstring::cbegin()'],['http://en.cppreference.com/w/cpp/container/set/begin.html',1,'std::set::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::smatch::cbegin()'],['http://en.cppreference.com/w/cpp/container/span/begin.html',1,'std::span::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::u16string_view::cbegin()'],['http://en.cppreference.com/w/cpp/container/array/begin.html',1,'std::array::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::basic_string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::basic_string_view::cbegin()'],['http://en.cppreference.com/w/cpp/chrono/tzdb_list/begin.html',1,'std::chrono::tzdb_list::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::cmatch::cbegin()'],['http://en.cppreference.com/w/cpp/container/deque/begin.html',1,'std::deque::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::basic_string_view::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::string_view::cbegin()'],['../classripple_1_1Section.html#a88ca1a9596da50ea3593b5cc34d01940',1,'ripple::Section::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::u32string_view::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::wstring_view::cbegin()'],['http://en.cppreference.com/w/cpp/container/forward_list/begin.html',1,'std::forward_list::cbegin()'],['http://en.cppreference.com/w/cpp/container/list/begin.html',1,'std::list::cbegin()'],['http://en.cppreference.com/w/cpp/container/map/begin.html',1,'std::map::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::match_results::cbegin()'],['http://en.cppreference.com/w/cpp/container/multimap/begin.html',1,'std::multimap::cbegin()'],['http://en.cppreference.com/w/cpp/container/multiset/begin.html',1,'std::multiset::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::string::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/begin.html',1,'std::unordered_multimap::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_map/begin.html',1,'std::unordered_map::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::u8string_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::u8string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::u32string_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::u32string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::u16string_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::u16string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::string_view::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/begin.html',1,'std::unordered_multiset::cbegin()'],['../classripple_1_1Buffer.html#a0425ae189aabad52bf1171511d041e1f',1,'ripple::Buffer::cbegin()'],['../classripple_1_1base__uint.html#a5278a66b4c638992010ed51471ca7d5d',1,'ripple::base_uint::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::wstring_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::wstring::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::wsmatch::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::wcmatch::cbegin()'],['http://en.cppreference.com/w/cpp/container/vector/begin.html',1,'std::vector::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_set/begin.html',1,'std::unordered_set::cbegin(T... args)']]], + ['cbegin_79',['cbegin',['../classripple_1_1partitioned__unordered__map.html#a78e5ac79c523d29a68fe16d7a02ec3ef',1,'ripple::partitioned_unordered_map::cbegin()'],['http://en.cppreference.com/w/cpp/container/forward_list/begin.html',1,'std::pmr::forward_list::cbegin()'],['../classripple_1_1Slice.html#a6bd58d1949a0ff8d1ff226f1a8a82fc6',1,'ripple::Slice::cbegin()'],['../classbeast_1_1detail_1_1aged__ordered__container_1_1chronological__t.html#a335cdd3cce7e32d0a25691b5cca4028c',1,'beast::detail::aged_ordered_container::chronological_t::cbegin()'],['../classbeast_1_1detail_1_1aged__ordered__container.html#a71d3a23b1fb56caffc9a9f677b1c4b4a',1,'beast::detail::aged_ordered_container::cbegin()'],['../classbeast_1_1detail_1_1aged__unordered__container_1_1chronological__t.html#a90ad198f55f3735beaa015a6c7686fa7',1,'beast::detail::aged_unordered_container::chronological_t::cbegin()'],['../classbeast_1_1detail_1_1aged__unordered__container.html#a602d9a545135a60a01f334f22f0d39c1',1,'beast::detail::aged_unordered_container::cbegin() const'],['../classbeast_1_1detail_1_1aged__unordered__container.html#a792cb2116564500cf72de228a5f70d73',1,'beast::detail::aged_unordered_container::cbegin(size_type n) const'],['../classbeast_1_1List.html#ad3ec5127cf5bd832781d3f827f7194ad',1,'beast::List::cbegin()'],['../classbeast_1_1LockFreeStack.html#a5e0d6da45e9fe049347962d309204314',1,'beast::LockFreeStack::cbegin()'],['../classbeast_1_1unit__test_1_1detail_1_1const__container.html#a2825d279f04c7d966f38f0ef097ec781',1,'beast::unit_test::detail::const_container::cbegin()'],['../classripple_1_1PublicKey.html#a86b86a467a0c144b409fdc2a898f4dd4',1,'ripple::PublicKey::cbegin()'],['../classripple_1_1SecretKey.html#ac399f5930d6a751726b4c0b23bde02c8',1,'ripple::SecretKey::cbegin()'],['../classripple_1_1Seed.html#a98072616ae53e8067f40ab73d4d2ea9c',1,'ripple::Seed::cbegin()'],['../classripple_1_1SOTemplate.html#a2daffdbe601520f4b9d85b1d088d03c9',1,'ripple::SOTemplate::cbegin()'],['../classripple_1_1JobTypes.html#af27c9ba16b1eb1047e34b4b0786e132e',1,'ripple::JobTypes::cbegin()'],['../classripple_1_1PeerFinder_1_1Bootcache.html#a2af4b38d2c56f03120d3920b80afa4eb',1,'ripple::PeerFinder::Bootcache::cbegin()'],['../classripple_1_1PeerFinder_1_1detail_1_1LivecacheBase_1_1Hop.html#a3928bbe64f60531ad3160eff8114c449',1,'ripple::PeerFinder::detail::LivecacheBase::Hop::cbegin()'],['../classripple_1_1PeerFinder_1_1Livecache_1_1hops__t.html#a90d9557dbb0ad7941ca187a9dbe1ddf8',1,'ripple::PeerFinder::Livecache::hops_t::cbegin()'],['http://en.cppreference.com/w/cpp/ranges/begin.html',1,'std::ranges::cbegin()'],['http://en.cppreference.com/w/cpp/iterator/begin.html',1,'std::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_map/begin.html',1,'std::pmr::unordered_map::cbegin()'],['http://en.cppreference.com/w/cpp/container/list/begin.html',1,'std::pmr::list::cbegin()'],['http://en.cppreference.com/w/cpp/container/map/begin.html',1,'std::pmr::map::cbegin()'],['http://en.cppreference.com/w/cpp/container/multimap/begin.html',1,'std::pmr::multimap::cbegin()'],['http://en.cppreference.com/w/cpp/container/multiset/begin.html',1,'std::pmr::multiset::cbegin()'],['http://en.cppreference.com/w/cpp/container/set/begin.html',1,'std::pmr::set::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::u16string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::u32string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::u8string::cbegin()'],['http://en.cppreference.com/w/cpp/container/deque/begin.html',1,'std::pmr::deque::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/begin.html',1,'std::pmr::unordered_multimap::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/begin.html',1,'std::pmr::unordered_multiset::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_set/begin.html',1,'std::pmr::unordered_set::cbegin()'],['http://en.cppreference.com/w/cpp/container/vector/begin.html',1,'std::pmr::vector::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::pmr::wstring::cbegin()'],['http://en.cppreference.com/w/cpp/container/set/begin.html',1,'std::set::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::smatch::cbegin()'],['http://en.cppreference.com/w/cpp/container/span/begin.html',1,'std::span::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::u16string_view::cbegin()'],['http://en.cppreference.com/w/cpp/container/array/begin.html',1,'std::array::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::basic_string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::basic_string_view::cbegin()'],['http://en.cppreference.com/w/cpp/chrono/tzdb_list/begin.html',1,'std::chrono::tzdb_list::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::cmatch::cbegin()'],['http://en.cppreference.com/w/cpp/container/deque/begin.html',1,'std::deque::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::basic_string_view::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::string_view::cbegin()'],['../classripple_1_1Section.html#a88ca1a9596da50ea3593b5cc34d01940',1,'ripple::Section::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::u32string_view::cbegin()'],['http://en.cppreference.com/w/cpp/experimental/basic_string_view/begin.html',1,'std::experimental::wstring_view::cbegin()'],['http://en.cppreference.com/w/cpp/container/forward_list/begin.html',1,'std::forward_list::cbegin()'],['http://en.cppreference.com/w/cpp/container/list/begin.html',1,'std::list::cbegin()'],['http://en.cppreference.com/w/cpp/container/map/begin.html',1,'std::map::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::match_results::cbegin()'],['http://en.cppreference.com/w/cpp/container/multimap/begin.html',1,'std::multimap::cbegin()'],['http://en.cppreference.com/w/cpp/container/multiset/begin.html',1,'std::multiset::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::string::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/begin.html',1,'std::unordered_multimap::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_map/begin.html',1,'std::unordered_map::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::u8string_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::u8string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::u32string_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::u32string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::u16string_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::u16string::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::string_view::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/begin.html',1,'std::unordered_multiset::cbegin()'],['../classripple_1_1Buffer.html#a0425ae189aabad52bf1171511d041e1f',1,'ripple::Buffer::cbegin()'],['../classripple_1_1base__uint.html#a5278a66b4c638992010ed51471ca7d5d',1,'ripple::base_uint::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string_view/begin.html',1,'std::wstring_view::cbegin()'],['http://en.cppreference.com/w/cpp/string/basic_string/begin.html',1,'std::wstring::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::wsmatch::cbegin()'],['http://en.cppreference.com/w/cpp/regex/match_results/begin.html',1,'std::wcmatch::cbegin()'],['http://en.cppreference.com/w/cpp/container/vector/begin.html',1,'std::vector::cbegin()'],['http://en.cppreference.com/w/cpp/container/unordered_set/begin.html',1,'std::unordered_set::cbegin(T... args)']]], ['cbegin_28int_29_80',['cbegin(int)',['http://en.cppreference.com/w/cpp/container/unordered_set/begin2.html',1,'std::unordered_set::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_map/begin2.html',1,'std::pmr::unordered_map::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/begin2.html',1,'std::pmr::unordered_multimap::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/begin2.html',1,'std::pmr::unordered_multiset::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_set/begin2.html',1,'std::pmr::unordered_set::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_map/begin2.html',1,'std::unordered_map::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multimap/begin2.html',1,'std::unordered_multimap::cbegin(int)()'],['http://en.cppreference.com/w/cpp/container/unordered_multiset/begin2.html',1,'std::unordered_multiset::cbegin(int)()']]], ['cbrt_81',['cbrt',['http://en.cppreference.com/w/cpp/numeric/math/cbrt.html',1,'std']]], ['cdirfirst_82',['cdirFirst',['../namespaceripple.html#abf69341a7f47d773cbe1f21d8ba040f3',1,'ripple']]], @@ -209,7 +209,7 @@ var searchData= ['checktxjsonfields_206',['checkTxJsonFields',['../namespaceripple_1_1RPC_1_1detail.html#a2998743e56f4dcad557e09132debc6fd',1,'ripple::RPC::detail']]], ['checktxn_207',['checkTxn',['../classripple_1_1test_1_1CheckDeliveredAmount.html#ae237a91808c0f9f77c8683da705c50d7',1,'ripple::test::CheckDeliveredAmount']]], ['checktxpermission_208',['checkTxPermission',['../namespaceripple.html#a0af098e7cd03fc01f78bfcd791b9fdc0',1,'ripple']]], - ['checkunorderedcontentsrefref_209',['checkunorderedcontentsrefref',['../classbeast_1_1aged__associative__container__test__base.html#ab9bba0ba6ea53a54174c0d23d158a0fa',1,'beast::aged_associative_container_test_base::checkUnorderedContentsRefRef(C &&c, Values const &v)'],['../classbeast_1_1aged__associative__container__test__base.html#a04721e6b9891ff24e1f4e66d90be4f5e',1,'beast::aged_associative_container_test_base::checkUnorderedContentsRefRef(C &&, Values const &)']]], + ['checkunorderedcontentsrefref_209',['checkunorderedcontentsrefref',['../classbeast_1_1aged__associative__container__test__base.html#a04721e6b9891ff24e1f4e66d90be4f5e',1,'beast::aged_associative_container_test_base::checkUnorderedContentsRefRef(C &&, Values const &)'],['../classbeast_1_1aged__associative__container__test__base.html#ab9bba0ba6ea53a54174c0d23d158a0fa',1,'beast::aged_associative_container_test_base::checkUnorderedContentsRefRef(C &&c, Values const &v)']]], ['checkupdate_210',['checkUpdate',['../classripple_1_1PeerFinder_1_1Bootcache.html#a79aae98b4bdd1d7b94794e8bc290a77a',1,'ripple::PeerFinder::Bootcache']]], ['checkvalidation_211',['checkValidation',['../classripple_1_1PeerImp.html#af769c6748ee440046c6d69552a23cd19',1,'ripple::PeerImp']]], ['checkvalidity_212',['checkValidity',['../namespaceripple.html#adb47f5675e01882e14c2cf9cc5700648',1,'ripple']]], diff --git a/structripple_1_1test_1_1jtx_1_1Vault.html b/structripple_1_1test_1_1jtx_1_1Vault.html index ab52dc09cb..9f13e41312 100644 --- a/structripple_1_1test_1_1jtx_1_1Vault.html +++ b/structripple_1_1test_1_1jtx_1_1Vault.html @@ -286,7 +286,7 @@ Public Attributes
    -

    Definition at line 29 of file vault.cpp.

    +

    Definition at line 28 of file vault.cpp.

    @@ -306,7 +306,7 @@ Public Attributes
    -

    Definition at line 39 of file vault.cpp.

    +

    Definition at line 38 of file vault.cpp.

    @@ -326,7 +326,7 @@ Public Attributes
    -

    Definition at line 49 of file vault.cpp.

    +

    Definition at line 48 of file vault.cpp.

    @@ -346,7 +346,7 @@ Public Attributes
    -

    Definition at line 60 of file vault.cpp.

    +

    Definition at line 59 of file vault.cpp.

    @@ -366,7 +366,7 @@ Public Attributes
    -

    Definition at line 71 of file vault.cpp.

    +

    Definition at line 70 of file vault.cpp.

    diff --git a/vault_8cpp_source.html b/vault_8cpp_source.html index effd78dddc..659704c6ca 100644 --- a/vault_8cpp_source.html +++ b/vault_8cpp_source.html @@ -103,88 +103,84 @@ $(document).ready(function() { init_codefold(0); });
    19 jv[jss::TransactionType] = jss::VaultCreate;
    20 jv[jss::Account] = args.owner.human();
    21 jv[jss::Asset] = to_json(args.asset);
    -
    22 jv[jss::Fee] = STAmount(env.current()->fees().increment).getJson();
    -
    23 if (args.flags)
    -
    24 jv[jss::Flags] = *args.flags;
    -
    25 return {jv, keylet};
    -
    26}
    +
    22 if (args.flags)
    +
    23 jv[jss::Flags] = *args.flags;
    +
    24 return {jv, keylet};
    +
    25}
    -
    27
    -
    28Json::Value
    -
    -
    29Vault::set(SetArgs const& args)
    -
    30{
    -
    31 Json::Value jv;
    -
    32 jv[jss::TransactionType] = jss::VaultSet;
    -
    33 jv[jss::Account] = args.owner.human();
    -
    34 jv[sfVaultID] = to_string(args.id);
    -
    35 return jv;
    -
    36}
    +
    26
    +
    27Json::Value
    +
    +
    28Vault::set(SetArgs const& args)
    +
    29{
    +
    30 Json::Value jv;
    +
    31 jv[jss::TransactionType] = jss::VaultSet;
    +
    32 jv[jss::Account] = args.owner.human();
    +
    33 jv[sfVaultID] = to_string(args.id);
    +
    34 return jv;
    +
    35}
    -
    37
    -
    38Json::Value
    -
    - -
    40{
    -
    41 Json::Value jv;
    -
    42 jv[jss::TransactionType] = jss::VaultDelete;
    -
    43 jv[jss::Account] = args.owner.human();
    -
    44 jv[sfVaultID] = to_string(args.id);
    -
    45 return jv;
    -
    46}
    +
    36
    + +
    + +
    39{
    +
    40 Json::Value jv;
    +
    41 jv[jss::TransactionType] = jss::VaultDelete;
    +
    42 jv[jss::Account] = args.owner.human();
    +
    43 jv[sfVaultID] = to_string(args.id);
    +
    44 return jv;
    +
    45}
    -
    47
    - -
    - -
    50{
    -
    51 Json::Value jv;
    -
    52 jv[jss::TransactionType] = jss::VaultDeposit;
    -
    53 jv[jss::Account] = args.depositor.human();
    -
    54 jv[sfVaultID] = to_string(args.id);
    -
    55 jv[jss::Amount] = to_json(args.amount);
    -
    56 return jv;
    -
    57}
    +
    46
    + +
    + +
    49{
    +
    50 Json::Value jv;
    +
    51 jv[jss::TransactionType] = jss::VaultDeposit;
    +
    52 jv[jss::Account] = args.depositor.human();
    +
    53 jv[sfVaultID] = to_string(args.id);
    +
    54 jv[jss::Amount] = to_json(args.amount);
    +
    55 return jv;
    +
    56}
    -
    58
    - -
    - -
    61{
    -
    62 Json::Value jv;
    -
    63 jv[jss::TransactionType] = jss::VaultWithdraw;
    -
    64 jv[jss::Account] = args.depositor.human();
    -
    65 jv[sfVaultID] = to_string(args.id);
    -
    66 jv[jss::Amount] = to_json(args.amount);
    -
    67 return jv;
    -
    68}
    +
    57
    + +
    + +
    60{
    +
    61 Json::Value jv;
    +
    62 jv[jss::TransactionType] = jss::VaultWithdraw;
    +
    63 jv[jss::Account] = args.depositor.human();
    +
    64 jv[sfVaultID] = to_string(args.id);
    +
    65 jv[jss::Amount] = to_json(args.amount);
    +
    66 return jv;
    +
    67}
    -
    69
    - -
    - -
    72{
    -
    73 Json::Value jv;
    -
    74 jv[jss::TransactionType] = jss::VaultClawback;
    -
    75 jv[jss::Account] = args.issuer.human();
    -
    76 jv[sfVaultID] = to_string(args.id);
    -
    77 jv[jss::Holder] = args.holder.human();
    -
    78 if (args.amount)
    -
    79 jv[jss::Amount] = to_json(*args.amount);
    -
    80 return jv;
    -
    81}
    +
    68
    + +
    + +
    71{
    +
    72 Json::Value jv;
    +
    73 jv[jss::TransactionType] = jss::VaultClawback;
    +
    74 jv[jss::Account] = args.issuer.human();
    +
    75 jv[sfVaultID] = to_string(args.id);
    +
    76 jv[jss::Holder] = args.holder.human();
    +
    77 if (args.amount)
    +
    78 jv[jss::Amount] = to_json(*args.amount);
    +
    79 return jv;
    +
    80}
    -
    82
    -
    83} // namespace jtx
    -
    84} // namespace test
    -
    85} // namespace ripple
    +
    81
    +
    82} // namespace jtx
    +
    83} // namespace test
    +
    84} // namespace ripple
    Represents a JSON value.
    Definition json_value.h:131
    - -
    Json::Value getJson(JsonOptions=JsonOptions::none) const override
    Definition STAmount.cpp:753
    AccountID id() const
    Returns the Account ID.
    Definition Account.h:92
    std::string const & human() const
    Returns the human readable public key.
    Definition Account.h:99
    std::uint32_t seq(Account const &account) const
    Returns the next sequence number on account.
    Definition Env.cpp:250
    -
    std::shared_ptr< OpenView const > current() const
    Returns the current ledger.
    Definition Env.h:312
    Keylet vault(AccountID const &owner, std::uint32_t seq) noexcept
    Definition Indexes.cpp:545
    Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
    Definition algorithm.h:6
    Json::Value to_json(Asset const &asset)
    Definition Asset.h:104
    @@ -213,13 +209,13 @@ $(document).ready(function() { init_codefold(0); }); -
    Json::Value set(SetArgs const &args)
    Definition vault.cpp:29
    +
    Json::Value set(SetArgs const &args)
    Definition vault.cpp:28
    std::tuple< Json::Value, Keylet > create(CreateArgs const &args)
    Return a VaultCreate transaction and the Vault's expected keylet.
    Definition vault.cpp:15
    -
    Json::Value withdraw(WithdrawArgs const &args)
    Definition vault.cpp:60
    +
    Json::Value withdraw(WithdrawArgs const &args)
    Definition vault.cpp:59
    -
    Json::Value del(DeleteArgs const &args)
    Definition vault.cpp:39
    -
    Json::Value clawback(ClawbackArgs const &args)
    Definition vault.cpp:71
    -
    Json::Value deposit(DepositArgs const &args)
    Definition vault.cpp:49
    +
    Json::Value del(DeleteArgs const &args)
    Definition vault.cpp:38
    +
    Json::Value clawback(ClawbackArgs const &args)
    Definition vault.cpp:70
    +
    Json::Value deposit(DepositArgs const &args)
    Definition vault.cpp:48
    diff --git a/vault_8h_source.html b/vault_8h_source.html index b614a58110..acd8385c3c 100644 --- a/vault_8h_source.html +++ b/vault_8h_source.html @@ -216,13 +216,13 @@ $(document).ready(function() { init_codefold(0); }); -
    Json::Value set(SetArgs const &args)
    Definition vault.cpp:29
    +
    Json::Value set(SetArgs const &args)
    Definition vault.cpp:28
    std::tuple< Json::Value, Keylet > create(CreateArgs const &args)
    Return a VaultCreate transaction and the Vault's expected keylet.
    Definition vault.cpp:15
    -
    Json::Value withdraw(WithdrawArgs const &args)
    Definition vault.cpp:60
    +
    Json::Value withdraw(WithdrawArgs const &args)
    Definition vault.cpp:59
    -
    Json::Value del(DeleteArgs const &args)
    Definition vault.cpp:39
    -
    Json::Value clawback(ClawbackArgs const &args)
    Definition vault.cpp:71
    -
    Json::Value deposit(DepositArgs const &args)
    Definition vault.cpp:49
    +
    Json::Value del(DeleteArgs const &args)
    Definition vault.cpp:38
    +
    Json::Value clawback(ClawbackArgs const &args)
    Definition vault.cpp:70
    +
    Json::Value deposit(DepositArgs const &args)
    Definition vault.cpp:48