Repository navigation
v11.9.0
-
XrplNumberis the value type of the XRPLNumberfields (#214, part of #211). It lives inXrpl.BinaryCodec.Numbersand holds a value the way rippled'sNumberclass does on the large mantissa scale: a sign, a mantissa in [10^18, 10^19 - 1] and an exponent in [-32768, 32768].Parse/TryParseread decimal and scientific text;ToString()writes what rippled'sto_string(Number)writes,1e13for 10^13;Mantissa/Exponentgive the wire pair ofNumber::mantissa()/Number::exponent()- equality and ordering by value; implicit conversion from
int, explicit fromlonganddecimal, explicit todecimalandTryToDecimal, which rounds to nearest (ties to even) past 28 fractional digits and fails on overflow XrplNumberJsonConverteris applied to the type itself: reads a JSON string or number, writes the stringTestUXrplNumbercarries theto_stringvectors of rippled'sNumberTest.to_stringand the text vectors of xrpl.jsst-number.test.ts;TestUNumberFieldschecks model JSON and the encoded bytes
-
A
Numbervalue the ledger cannot hold exactly is refused instead of rounded.NumberType.FromStringrounded9223372036854775895to9223372036854775900and signed that; it now throwsFormatException, as rippled'snumberFromJsonrefuses the value with "number cannot be represented". The limit is 19 significant digits, and 18 above 9223372036854775807 -
NumberTypeis built onXrplNumber.NumberType.Valuereturns it andNumberType(XrplNumber)creates the canonical wire pair.ToJson()andToString()now write rippled's text, so the codec decodesPrincipalRequested10000000000000 as"1e13", not"10000000000000".FromParseraccepts the wire exponent 32769 that rippled produces for a mantissa above int64 (9223372036854775810e32768), and refuses a mantissa oflong.MinValue -
Breaking: the Number fields of the vault and lending models are
XrplNumber?instead ofstring:LOVault:AssetsTotal,AssetsAvailable,AssetsMaximum,LossUnrealizedLOLoanBroker:DebtTotal,DebtMaximum,CoverAvailableLOLoan:PrincipalOutstanding,TotalValueOutstanding,PeriodicPayment,ManagementFeeOutstanding,LoanOriginationFee,LoanServiceFee,LatePaymentFee,ClosePaymentFeeILoanSet/LoanSet/LoanSetResponse:PrincipalRequested,LoanOriginationFee,LoanServiceFee,LatePaymentFee,ClosePaymentFeeILoanBrokerSet/LoanBrokerSet/LoanBrokerSetResponse:DebtMaximumIVaultCreate/VaultCreate/VaultCreateResponseandIVaultSet/VaultSet/VaultSetResponse:AssetsMaximum
Migration: add
using Xrpl.BinaryCodec.Numbers;. Assign anintdirectly (PrincipalRequested = 10000000), anything else throughXrplNumber.Parse("...")or a cast fromlongordecimal. Read values withToString(), which is rippled's text, compare them with==and<, and convert withTryToDecimalor(decimal). Code that parsed the string withdecimal.Parsemust handle the scientific form or switch toTryToDecimal -
An unreadable Number costs one field, not the object.
LenientXrplNumberConverteris applied to the Number fields ofLOVault,LOLoanBroker,LOLoanand the four*Responsemodels above: a value this version refuses reads asnulland the rest of the entry, anaccount_objectspage or a transaction still deserializes. -
XrplNumber.Parseworks in time linear in the length of the text: it accumulates at most 19 significant digits and carries leading and trailing zeros as an exponent (Parse_StaysLinearOnMegabyteInput). The written exponent may reach ±10^9; whether the value fits is decided after the fraction digits are counted, so"0e100001"is zero -
new NumberType(0, exponent)with an exponent other thanint.MinValueor 0 throwsArgumentOutOfRangeException;FromParseralready refused those bytes and reports them asFormatException -
AutofillreadsLOLoan.PeriodicPaymentandLoanServiceFeethroughTryToDecimalwhen it estimates theLoanPayfee -
LendingProtocol-GuideandVault-Guide(both languages) assign Number fields as numbers, and the lending guide describesXrplNumber -
Previews through
simulate(#215, part of #211).PreviewSugaraddsPreviewLoanPay,PreviewVaultDeposit,PreviewVaultWithdraw,PreviewAMMDeposit,PreviewAMMWithdrawandPreviewBalanceChangestoIXrplClient. Each autofills the transaction, runs it throughsimulateand returns aTransactionPreview<TOutcome>:EngineResult,WouldSucceed, the simulatedMetadata, the autofilledTransaction, and anOutcomeread from the metadata.LoanPaymentOutcomegivesPaymentsMade,PrincipalPaid,PaidToVault,InterestToVault,PaidToBroker,TotalPaidandLoanAfterof aLoanPay. The split follows the money: the vault receives principal and interest, and the broker receives the restVaultOutcomegivesAccountAssetChange,AccountShareChange,VaultAssetChangeandVaultAfterof a vault deposit or withdrawalAmmOutcomegivesAssetChange,Asset2Change,LpTokenChangeandAmmAfterof an AMM deposit or withdrawal- each outcome also has a
FromMetadata, which reads the same figures from a validated transaction - for an account that issues the asset, the change sums every trust line in that currency
VaultOutcome.FromMetadatareads the vault named by the transaction'sVaultIDand refuses a transaction other thanVaultDeposit,VaultWithdraworVaultClawbackTestIPreviewLoanVaultandTestIPreviewAmmpreview a transaction, submit the previewed transaction unchanged, and compare the two outcomes field by field: an XRPLoanPay, an MPTLoanPay, a vault deposit and withdrawal, and a single-sided AMM deposit and withdrawal
-
PreviewLoanSetshows a loan's terms before the borrower signs (#217, part of #211). It simulates theLoanSetwith an emptyCounterpartySignature, whichsimulateaccepts unverified, and returns aLoanSetOutcome:LoanId, the createdLoan,BorrowerReceives,PaidFromVault,InterestTotal,ServiceFeesTotalandTotalToRepay.LoanSetOutcome.FromMetadatareads the same from a validatedLoanSetTestIPreviewLoanVault.TestPreviewLoanSet_MatchesTheLoanTheSignedTransactionCreatespreviews a loan unsigned, creates it with the borrower's signature, and compares the two loans field by field
-
LoanSchedule.Projectprojects a loan's regular payments (#217, #220, part of #211). It starts from aLoanentry - from the ledger or fromPreviewLoanSet- and repeats rippled'scomputePaymentComponentsfor each payment in rippled's own arithmetic -XrplNumberin theNumberContextthe amendments select, withroundToAssetcomputed asSTAmountcomputes it, 16 significant digits and then the loan's scale for an issued currency: the step from the rounded state to the rounded theoretical state after it, capped at the roundedPeriodicPayment, with the final payment clearing the rest. EachLoanScheduleRowhasDueDate,Principal,Interest,ManagementFee,ServiceFee,Totaland the outstanding amounts after itLedgerRules.FixCleanup3_2_0selects the rounding of the target state andFixCleanup3_3_0theNumberscale;LedgerRules.FromNodeAsyncreads both from the nodeTestIPreviewLoanVault.TestLoanSchedule_MatchesEveryPaymentTheNodeTakes(XRP, 6 payments, 10% management fee) andTestLoanSchedule_Mpt_MatchesEveryPaymentTheNodeTakes(MPT, 5 payments) andTestLoanSchedule_Iou_MatchesEveryPaymentTheNodeTakes(USD: 7, 3 and 12 payments with fractional principals, management fees and service fees) project a loan, pay every payment and compare each with its row;TestULoanSchedulepins the recorded splits
-
The Blazor test client (
Tests/TestsClients/Blazor-WebAssembly) has a Loan preview tab next to the connection page. It shows a new loan's terms fromPreviewLoanSetand its schedule fromLoanSchedule.Project, or the remaining schedule of an existing loan, and checks the terms againstLoanSet's preflight limits first. On a test network its Full flow mode runs the whole cycle: it funds a broker and a borrower, creates a vault and broker, previews the terms, co-signs and submits theLoanSet, and pays each payment next to its projected row -
The Blazor test client has an AMM preview tab (
Pages/AmmPreview.razor, #225). It loads a pool withamm_info- an account's LP tokens and its trading fee, the auction slot's discount included, when an account is given - and quotes any modeAmmLiquiditycovers next to the node'ssimulateanswer, with the pool the ledger will hold afterwards -
The Blazor test client has a Vault preview tab (
Pages/VaultPreview.razor) that quotesVaultSharesnext tosimulate, the phase of a closed-ended vault judged at the validated close time. The Loan preview tab showsLoanOrigination.Computenext to the node'sLoanSet, and previews a payment on an existing loan -LoanPayments.PaymentForAmountwith or withouttfLoanOverpayment,LatePaymentDue,FullPaymentDue- next tosimulate; its full flow can create a loan that allows overpayments. The AMM preview tab gains the effective-price and empty-pool modes, and its asset selector binds to a string -
LendingProtocol-Guide(both languages) showsPreviewLoanSetandLoanSchedule -
ServerFeatures.GetByNamereturns null for a name the node does not list; it returned an empty pair whoseValuewas null (GetByName_UnknownName_IsNull) -
LoanPaymentsreads aLoanentry without asking the node:RegularPaymentCap:PeriodicPaymentrounded up to the asset, plusLoanServiceFee; on the final payment,TotalValueOutstandingplusLoanServiceFee. Each part is rounded up on theXrplNumberbefore it becomes adecimal, with a step finer than 10^-28 rounded up to 10^-28; a cap beyonddecimalreturns nullIsPaymentLateandIsPastGracePeriod, with an inclusive or exclusive boundary, comparing in UTC: a local time is converted, and an unspecified one is taken as UTCAutofillrounds the periodic payment through the same helper when it estimates theLoanPayfee
-
LoanPayments.LatePaymentDueandLoanPayments.FullPaymentDue(#221, part of #211) compute what a late payment and an early full payment cost at a given parent close time, as rippled'scomputeLatePaymentandcomputeFullPaymentdo, and return aLoanPaymentDue:Principal,InterestToVault,PaidToBrokerandTotal. Each returns null where the node refuses that payment: not yet late (tecTOO_SOON), already late (tecEXPIRED), or one payment left (tecKILLED)- the lending formulas moved from
LoanScheduleinto the internalLendingMath, which both use LedgerRules.FixCleanup3_4_0selects whether a payment exactly atNextPaymentDueDateis late;FromNodeAsyncreads itTestLatePaymentDue_MatchesWhatTheNodeCharges,TestFullPaymentDue_MatchesWhatTheNodeChargesandTestFullPaymentDue_Iou_MatchesWhatTheNodeChargespay a loan late or close it early and compare the node's split with the computed one
- the lending formulas moved from
-
LoanOrigination.Compute(#222, part of #211) computes theLoanaLoanSetwould create, offline, from the transaction, the vault and the broker, as rippled'sLoanSetandcomputeLoanPropertiesdo:PeriodicPayment,TotalValueOutstanding,ManagementFeeOutstanding,LoanScaleand the copied terms, in aLoanOriginationTerms. It repeats the checks that depend on the amounts and reports the node's result inRefusalandRefusalReason: fewer assets available than requested (tecINSUFFICIENT_FUNDS), a value the asset cannot hold, a value finer than the loan's scale, and the amortization guards (tecPRECISION_LOSS)- the internal
AssetRoundinggainsSTAmount's conversion, exponent,scale()andisRounded - the internal
LendingMathgainsPeriodicPayment(loanPeriodicPayment);PaymentFactortakes the rate, the payment count,fixCleanup3_2_0and the context instead ofLoanTerms;LoanTerms.Createbuilds terms from their parts LendingProtocol-Guide(both languages) showsLoanOrigination.ComputeTestLoanOrigination_MatchesWhatTheNodeWouldCreatecompares eleven XRP and USD terms withPreviewLoanSet: seven created loans field by field, with the schedules projected from each, and four refusals by result
- the internal
-
LoanPayments.PaymentForAmountcomputes what a regularLoanPaydoes with itsAmount, as rippled'smakeRegularPaymentdoes: as many regular payments as the amount covers, up to 100, then, withtfLoanOverpaymenton a loan created with it, the rest as an overpayment (computeOverpaymentComponents,tryOverpayment,doOverpayment) that repays principal and re-amortizes the loan. It returns aLoanAmountPayment: the split inDue(LoanPaymentDue),PaymentsMade,IsOverpaid, theLoanas the payment leaves it inLoanAfter, or the node's result inRefusalandRefusalReason(temBAD_AMOUNT,tecNO_PERMISSION,tecKILLED,tecEXPIRED,tecINSUFFICIENT_PAYMENT)LedgerRules.FixCleanup3_1_3selects whether the amount is truncated to the loan's scale before the overpayment is taken from it;FromNodeAsyncreads itcomputeLoanPropertiesandcheckLoanGuardsmoved fromLoanOriginationinto the internalLendingMath(ComputeLoanProperties,LoanGuards,LoanProperties), which the overpayment reuses;LendingMath.Overpayports the overpaymentLendingProtocol-Guide(both languages) showsLoanPayments.PaymentForAmountLendingMath.LoanGuardsreturns the node's result with the reason: a zero-rate loan that comes out with interest istecINTERNAL, as incheckLoanGuards, andLoanOrigination.Computereports it instead oftecPRECISION_LOSSTestPaymentForAmount_MatchesWhatTheNodeTakespays an XRP loan three payments and a half without the flag and two and a half with it, and previews two refusals;TestPaymentForAmount_Iou_Overpayment_MatchesWhatTheNodeTakesoverpays a USD loan; both compare the split, the payment count and the loan left with the node's
-
VaultShares(#223, part of #211) computes vault deposits and withdrawals offline from theVaultentry and the share count, as rippled'sVaultDeposit,VaultWithdrawandVaultHelpers.cppdo:Deposit,WithdrawAssetsandRedeemSharesreturn aVaultQuotewith theSharesminted or burned and theAssetsmoved, or the node's result inRefusalandRefusalReason(tecPRECISION_LOSS,tecINSUFFICIENT_FUNDS,tecLIMIT_EXCEEDED, andtecPATH_DRYwhere the conversion overflows, a vault with assets and no shares outstanding included)- the conversions follow
assetsToSharesDeposit,sharesToAssetsDeposit,assetsToSharesWithdrawandsharesToAssetsWithdraw, withroundToVaultScale,clampToAssetsTotalScale, the dust checks, the sole shareholder's waived unrealized loss and the final withdrawal of all available assets LedgerRules(Xrpl/Sugar/LedgerRules.cs) carries the amendment flags for both the lending and the vault helpersVault-Guide(both languages) showsVaultSharesTestUVaultSharespins the empty vault's first deposit and thetecPATH_DRYof redeeming shares when none are outstandingTestIVaultSharesquotes every step of XRP, USD and MPT vaults offline, compares it withPreviewVaultDepositorPreviewVaultWithdrawand submits it: deposits, withdrawals by assets and by shares, final withdrawals, and refusals for dust and for more than the vault or the holder hasTestVaultShares_WithUnrealizedLoss_MatchWhatTheNodeMovesimpairs a loan so the vault carriesLossUnrealized, then compares withdrawals by assets and by shares in the redemption phase with the node;TestILoanBase.BuildBrokerVaultAsynctakes the investment windowDeposit,WithdrawAssetsandRedeemSharestake an optionalparentCloseTimeand, underLendingProtocolV1_1, repeatgetVaultPhasefor a closed-ended vault: a deposit outside the subscription phase istecEXPIRED, a withdrawal in the investment phasetecTOO_SOON;LedgerRules.LendingProtocolV1_1selects it andFromNodeAsyncreads it.TestUVaultSharespins the phase boundaries;TestIVaultSharesquotes every step at the validated close time and compares the investment-phase refusals with the node;Vault-Guide(both languages) describes the check
- the conversions follow
-
AmmLiquidity(#224, part of #211) computes AMM deposits and withdrawals exactly, as rippled'sAMMDepositandAMMWithdrawdo underfixAMMv1_3, from anAmmPoolread withAmmPool.FromAmmInfo. AnAmmQuotecarriesAsset1,Asset2,LpTokensandPoolAfter- the balances and LP token balance the ledger will hold - or the node's result inRefusalandRefusalReason(tecAMM_INVALID_TOKENS,tecAMM_FAILED,tecAMM_BALANCE,tecPRECISION_LOSS)- deposits:
DepositForTokens(tfLPToken),DepositBoth(tfTwoAsset),DepositSingle(tfSingleAsset),DepositSingleForTokens(tfOneAssetLPToken),DepositWithEffectivePrice(tfLimitLPToken),DepositIntoEmptyPool(tfTwoAssetIfEmpty); withdrawals:WithdrawForTokens(tfLPToken),WithdrawAll(tfWithdrawAll),WithdrawBoth(tfTwoAsset),WithdrawSingle(tfSingleAsset),WithdrawSingleForTokens(tfOneAssetLPToken),WithdrawAllOfAsset(tfOneAssetWithdrawAll),WithdrawWithEffectivePrice(tfLimitLPToken, itsEPricein LP tokens per unit of the asset);InitialLpTokensgives the LP tokensAMMCreateissues AmmPool.FromAmmInfotakes the account's trading fee asgetTradingFeedoes: the auction slot's discounted fee for its holder and authorized accounts until it expires- the internal
AmmFormulasports equations 3 to 8,adjustLPTokens,adjustAssetInByTokens,adjustAssetOutByTokensandcheckAMMPrecisionLoss; the internalAmountMathportsSTAmount'sdivide,multiply, addition andtoSTAmount LedgerRulesgainsLargeNumbers,FixAMMv1_1,FixAMMv1_3andMPTokensV2AmmMathpoints toAmmLiquidityfor exact figuresTestIAmmLiquidityruns a token/XRP pool through every covered mode, the discounted fee, the only liquidity provider, the effective-price modes - a deposit taken whole, one capped by the price, one refused - and the withdrawal that deletes the pool: each step is quoted, compared withPreviewAMMDepositorPreviewAMMWithdrawfor acceptance or the refusal, submitted, and the pool is compared withamm_infoto the last digit;TestInitialLpTokens_MatchWhatAMMCreateIssuescomparesInitialLpTokensandDepositIntoEmptyPoolwith the LP tokens of a new poolDepositWithEffectivePriceandWithdrawWithEffectivePricerefuse anEPricethat is not positive and a negativeAmountwithtemBAD_AMOUNT, asinvalidAMMAmountdoes in preflight;TestUAmmLiquiditypins it
- deposits:
-
BalanceChanges.GetBalanceChangesreports MPT balances. It reports a holder's change inMPTAmountand, like a trust line issuer, the issuer's side as the opposite of the change inOutstandingAmount, as aCurrencywithMPTokenIssuanceID. A holder whose modifiedMPTokenlists no previousMPTAmountis resolved against the change in the issuance'sOutstandingAmount, taken as zero when the issuance node is absent.TestUBalanceChangesMptcovers a vault deposit and withdrawal recorded from a node, and both outcomes of the ambiguous case -
Tests/Xrpl.Tests/Fixtures/Simulateholds the recordedsimulateresponses, and its README says where each one comes from -
LendingProtocol-GuideandVault-Guide(both languages) show the payment cap and the previews -
RawJsonandXrplResponse<T>.Rawdocument the cost of a large response (#213): why the frame is allocated per message and cannot be pooled, and that a largeresultread withUtf8JsonReaderoverRawJson.Spanavoids the second message-sized copy aJsonElementresult makes -
XrplNumberarithmetic, bit-exact with rippled'sNumber(#218, part of #211).Add,Subtract,Multiply,Divide,Power,Root2,Truncate,ToInt64andAbsround as rippled'sNumber.cppdoes under aNumberContext;+,-,*,/and unary-useNumberContext.DefaultNumberContextnames the mantissa scale (NumberMantissaScale:Small,LargeLegacy,Large320,Large330) and the rounding mode (NumberRounding:ToNearest,TowardsZero,Downward,Upward);DefaultisLarge330rounding to nearest,ForAmendmentsmaps SingleAssetVault / LendingProtocol,fixCleanup3_2_0andfixCleanup3_3_0to the scale,WithRoundingchanges the mode- the engine is
NumberCore(internal), a statement-for-statement port of the parts ofNumber.cppthat rippled's transaction processing calls, with 128-bit intermediates Root2throwsArithmeticExceptionon an input where rippled's Newton-Raphson loop would cycle with a period longer than two and never returnTestUNumberVectorsreplays 15,935 results printed by rippled'sNumber.cppat 00606bec1 across all scales, rounding modes and operations;Tests/Xrpl.BinaryCodec.Test/Fixtures/Numberholds the vectors, the generator and how to rebuild them.TestUXrplNumberArithmeticcovers the public APIXrpl.BinaryCodecexposes its internals toXrpl.BinaryCodec.Test
-
Twelve
Xrpl.BinaryCodec.Testclasses take theTestUprefix that CI's unit-test filter matches (#218):TestUBinarySerializer,TestUEnumParity,TestUFieldDispatch,TestUAmount,TestUInt32Type,TestUInt64Type,TestUIouValueTrailingDot,TestUIssueMpt,TestULoanSetEncode,TestUNumberType,TestUXChainBridgeTypeandTestUXrplNumber -
Breaking:
AMMBid.AuthAccountschanges fromList<AuthAccount>toList<AuthAccountWrapper>(#219). Entries inAMMBid,IAMMBidandAMMBidResponseserialize as{"AuthAccount": {"Account": ...}}- migration:
new AuthAccount { Account = address }becomesnew AuthAccountWrapper(address); read the address asentry.AuthAccount.Account TestUAMMBidAuthAccountssigns anAMMBidwith an authorized account and decodes the blob, and reads both shapes;TestAMMBid_AuthAccounts_TradeAtTheDiscountedFeesubmits the bid, finds the account inamm_infoand compares its deposit at the discounted fee with the node
- migration:
-
XrplErrorCodescovers rippled 3.4.0's error table (#231): 27 constants added, each mapped byXrplErrorClassifier:slowDown(429) andjson_rpcareTemporaryServerProblemand retryable;highFeeis retryable and user-fixableunlBlocked,wrongNetwork,internalanddbDeserializationareServerState, not retryableforbiddenisUnsupportedRequest;delegateActNotFoundandnoPathRequestareNotFound;masterDisabled,badCredentials,badSecret,badSeed,badKeyType,badIssuer,badFeature,channelMalformed,channelAmtMalformed,domainMalformedandoracleMalformedareInvalidInput;alreadyMultisig,alreadySingleSig,signingMalformed,transactionSigned,badSyntaxandmalformedStreamareBadRequest- an error response without
statusis rejected withRippledException, carrying theErrorResponse, instead of a plainXrplException TestUXrplErrorCodeschecks every code of rippled 3.4.0's table has a constant, that no constant classifies asUnknown, and the status-less path
-
Breaking:
VaultCreateno longer declares anAmountfield (#208). The property is removed fromIVaultCreate,VaultCreateandVaultCreateResponse- migration: create the vault without an amount and fund it with
VaultDeposit TestUTransactionModelFieldsConformancechecks every wire property a transaction request or response model declares against the fields the vendoredtransactions.macrogives its type.VaultCreate.Amountwas the only violation
- migration: create the vault without an amount and fund it with
-
Lending rates are documented in their actual unit, 1/10th of a basis point, where 100000 = 100% (#209)
LoanSet:InterestRate,LateInterestRate,CloseInterestRate,OverpaymentInterestRateandOverpaymentFeesaid 1/100th of a basis point.LoanBrokerSet:CoverRateMinimumandCoverRateLiquidationsaid the sameLOLoanBroker.ManagementFeeRategave its range as 0-100000; it is 0-10000, up to 10%.LOLoanBroker.CoverRateLiquidationnow states its unit- every rate comment on
LoanSet,LoanBrokerSet,LOLoanandLOLoanBrokercarries a worked example (100000 = 100%, 5000 = 5%) LendingProtocol-Guide(both languages): the broker example labelled15000as 150%,12000as 120% and100as 1%. They are 15%, 12% and 0.1%. The step that presented the rates as an update to an existing broker now sets them on the creatingLoanBrokerSet, since rippled refuses them on a modification withtemINVALID. The LoanBroker field table listedAsset,Asset2,AssetsAvailableandAssetsTotal, which the object does not have, and now matchesledger_entries.macroLendingProtocol-Guide(both languages) now creates a closed-ended vault in its walkthrough, whichLoanBrokerSetrequires underLendingProtocolV1_1(tecNO_PERMISSIONon an open-ended one). It states which phase admits the vault deposit (subscription) and the loan (investment), and liststecTOO_SOON,tecEXPIREDand the newtecNO_PERMISSIONcauses under Common ErrorsTestILoan.TestLoanSet_InterestRateIsInTenthBasisPointscreates a loan atInterestRate = 50000and checks that the node charges 50% a year on it
-
Hashes.HashOfferIdreturns the index the node assigns to anOffer: the namespace is hashed as rippled'suint16(00 6F), not three bytes.HashOfferId(string, uint)added; theintoverload delegates to it -
Hashes.HashTrustlinereturns the index the node assigns to aRippleState- a 3-character currency code is encoded as the 20-byte code with the ISO letters at bytes 12-14
- the two AccountIDs are ordered as unsigned bytes, as rippled does, instead of through
BigInteger.Parse XRP, as the ISO code or the all-zero hex code, throwsArgumentException
-
TestUHashescovers every ledger-object helper -HashAccountRoot(re-enabled),HashOfferId,HashTrustlinewith ISO and hex codes,HashSignerListId,HashEscrow- with the xrpl.js vectors and two node-assigned offer indices.TestILedgerObjectIdscreates an account, offer, trust line, escrow and signer list on the stand and checks each helper against the indexaccount_info/account_objectsreport