Skip to content

Commit

Permalink
Merge branch 'master' into develop
Browse files Browse the repository at this point in the history
# Conflicts:
#	.eslintrc
#	.github/workflows/e2e.yml
#	.github/workflows/test.yml
#	.github/workflows/validate.yml
#	Gemfile.lock
#	android/app/build.gradle
#	android/build.gradle
#	ios/Podfile.lock
#	ios/PrivacyInfo.xcprivacy
#	ios/Xaman.xcodeproj/project.pbxproj
#	package-lock.json
#	package.json
#	src/common/libs/ledger/factory/explainer.ts
#	src/common/libs/ledger/factory/object.ts
#	src/common/libs/ledger/factory/transaction.ts
#	src/common/libs/ledger/factory/validation.ts
#	src/common/libs/ledger/objects/BaseLedgerObject.ts
#	src/common/libs/ledger/objects/Check/CheckClass.ts
#	src/common/libs/ledger/objects/Escrow/EscrowClass.ts
#	src/common/libs/ledger/objects/NFTokenOffer/NFTokenOfferClass.ts
#	src/common/libs/ledger/objects/Offer/OfferClass.ts
#	src/common/libs/ledger/objects/PayChannel/PayChannelClass.ts
#	src/common/libs/ledger/objects/Ticket/TicketClass.ts
#	src/common/libs/ledger/parser/common/flag.ts
#	src/common/libs/ledger/parser/common/flags/objectFlags.ts
#	src/common/libs/ledger/parser/common/flags/txFlags.ts
#	src/common/libs/ledger/parser/entry.ts
#	src/common/libs/ledger/parser/meta.ts
#	src/common/libs/ledger/parser/types.ts
#	src/common/libs/ledger/pathFinding.ts
#	src/common/libs/ledger/transactions/genuine/AMMBid/index.ts
#	src/common/libs/ledger/transactions/genuine/AMMCreate/index.ts
#	src/common/libs/ledger/transactions/genuine/AMMDelete/index.ts
#	src/common/libs/ledger/transactions/genuine/AMMDeposit/index.ts
#	src/common/libs/ledger/transactions/genuine/AMMVote/index.ts
#	src/common/libs/ledger/transactions/genuine/AMMWithdraw/index.ts
#	src/common/libs/ledger/transactions/genuine/AccountDelete/AccountDelete.validation.ts
#	src/common/libs/ledger/transactions/genuine/AccountDelete/AccountDeleteClass.ts
#	src/common/libs/ledger/transactions/genuine/AccountSet/AccountSetClass.ts
#	src/common/libs/ledger/transactions/genuine/BaseTransaction.ts
#	src/common/libs/ledger/transactions/genuine/CheckCancel/CheckCancelClass.ts
#	src/common/libs/ledger/transactions/genuine/CheckCash/CheckCashClass.ts
#	src/common/libs/ledger/transactions/genuine/CheckCreate/CheckCreate.validation.ts
#	src/common/libs/ledger/transactions/genuine/CheckCreate/CheckCreateClass.ts
#	src/common/libs/ledger/transactions/genuine/CheckCreate/CheckCreateInfo.ts
#	src/common/libs/ledger/transactions/genuine/ClaimReward/ClaimRewardClass.ts
#	src/common/libs/ledger/transactions/genuine/Clawback/index.ts
#	src/common/libs/ledger/transactions/genuine/DepositPreauth/DepositPreauthClass.ts
#	src/common/libs/ledger/transactions/genuine/EnableAmendment/EnableAmendmentClass.ts
#	src/common/libs/ledger/transactions/genuine/EscrowCancel/EscrowCancelClass.ts
#	src/common/libs/ledger/transactions/genuine/EscrowCreate/EscrowCreateClass.ts
#	src/common/libs/ledger/transactions/genuine/EscrowCreate/EscrowCreateInfo.ts
#	src/common/libs/ledger/transactions/genuine/EscrowFinish/EscrowFinishClass.ts
#	src/common/libs/ledger/transactions/genuine/GenesisMint/GenesisMintClass.ts
#	src/common/libs/ledger/transactions/genuine/Import/ImportClass.ts
#	src/common/libs/ledger/transactions/genuine/Invoke/InvokeClass.ts
#	src/common/libs/ledger/transactions/genuine/NFTokenAcceptOffer/NFTokenAcceptOfferClass.ts
#	src/common/libs/ledger/transactions/genuine/NFTokenBurn/NFTokenBurnClass.ts
#	src/common/libs/ledger/transactions/genuine/NFTokenCancelOffer/NFTokenCancelOfferClass.ts
#	src/common/libs/ledger/transactions/genuine/NFTokenCreateOffer/NFTokenCreateOfferClass.ts
#	src/common/libs/ledger/transactions/genuine/NFTokenCreateOffer/NFTokenCreateOfferInfo.ts
#	src/common/libs/ledger/transactions/genuine/NFTokenMint/NFTokenMintClass.ts
#	src/common/libs/ledger/transactions/genuine/NFTokenMint/NFTokenMintInfo.ts
#	src/common/libs/ledger/transactions/genuine/OfferCancel/OfferCancelClass.ts
#	src/common/libs/ledger/transactions/genuine/OfferCreate/OfferCreateClass.ts
#	src/common/libs/ledger/transactions/genuine/Payment/Payment.validation.ts
#	src/common/libs/ledger/transactions/genuine/Payment/PaymentClass.ts
#	src/common/libs/ledger/transactions/genuine/Payment/PaymentInfo.ts
#	src/common/libs/ledger/transactions/genuine/PaymentChannelClaim/PaymentChannelClaimClass.ts
#	src/common/libs/ledger/transactions/genuine/PaymentChannelCreate/PaymentChannelCreateClass.ts
#	src/common/libs/ledger/transactions/genuine/PaymentChannelCreate/PaymentChannelCreateInfo.ts
#	src/common/libs/ledger/transactions/genuine/PaymentChannelFund/PaymentChannelFundClass.ts
#	src/common/libs/ledger/transactions/genuine/Remit/index.ts
#	src/common/libs/ledger/transactions/genuine/SetHook/SetHookClass.ts
#	src/common/libs/ledger/transactions/genuine/SetRegularKey/SetRegularKeyClass.ts
#	src/common/libs/ledger/transactions/genuine/SignerListSet/SignerListSetClass.ts
#	src/common/libs/ledger/transactions/genuine/TicketCreate/TicketCreateClass.ts
#	src/common/libs/ledger/transactions/genuine/TrustSet/TrustSetClass.ts
#	src/common/libs/ledger/transactions/genuine/TrustSet/TrustSetInfo.ts
#	src/common/libs/ledger/transactions/genuine/URITokenBurn/URITokenBurnClass.ts
#	src/common/libs/ledger/transactions/genuine/URITokenBuy/URITokenBuyClass.ts
#	src/common/libs/ledger/transactions/genuine/URITokenCancelSellOffer/URITokenCancelSellOfferClass.ts
#	src/common/libs/ledger/transactions/genuine/URITokenCreateSellOffer/URITokenCreateSellOfferClass.ts
#	src/common/libs/ledger/transactions/genuine/URITokenMint/URITokenMintClass.ts
#	src/common/libs/ledger/transactions/genuine/__tests__/base.test.ts
#	src/common/libs/ledger/transactions/genuine/__tests__/offerCreate.test.ts
#	src/common/libs/ledger/transactions/genuine/__tests__/payment.test.ts
#	src/common/libs/ledger/transactions/genuine/index.ts
#	src/common/libs/ledger/transactions/pseudo/BasePseudo.ts
#	src/common/libs/ledger/transactions/pseudo/PaymentChannelAuthorize/PaymentChannelAuthorizeClass.ts
#	src/common/libs/ledger/transactions/types.ts
#	src/common/libs/ledger/types/common/index.ts
#	src/common/libs/ledger/types/enums.ts
#	src/common/libs/ledger/types/ledger/AccountRoot.ts
#	src/common/libs/ledger/types/ledger/Check.ts
#	src/common/libs/ledger/types/ledger/LedgerEntry.ts
#	src/common/libs/ledger/types/ledger/NFTokenOffer.ts
#	src/common/libs/ledger/types/ledger/Offer.ts
#	src/common/libs/ledger/types/ledger/RippleState.ts
#	src/common/libs/ledger/types/ledger/index.ts
#	src/common/libs/ledger/types/methods/accountLines.ts
#	src/common/libs/ledger/types/methods/accountOffers.ts
#	src/common/libs/ledger/types/methods/accountTx.ts
#	src/common/libs/ledger/types/methods/ammInfo.ts
#	src/common/libs/ledger/types/methods/baseMethod.ts
#	src/common/libs/ledger/types/methods/bookOffers.ts
#	src/common/libs/ledger/types/methods/index.ts
#	src/common/libs/ledger/types/methods/pathFind.ts
#	src/common/libs/ledger/types/methods/serverDefinitions.ts
#	src/common/libs/ledger/types/methods/subscribe.ts
#	src/common/libs/ledger/types/transaction/common.ts
#	src/common/libs/ledger/types/transaction/metadata.ts
#	src/common/libs/payload/digest/codec.ts
#	src/common/libs/payload/object.ts
#	src/common/libs/payload/types.ts
#	src/common/utils/__tests__/fee.test.ts
#	src/common/utils/codec.ts
#	src/components/General/AmountText/AmountText.tsx
#	src/components/General/Header/Header.tsx
#	src/components/General/TokenAvatar/TokenAvatar.tsx
#	src/components/Modules/AccountSwitchElement/AccountSwitchElement.tsx
#	src/components/Modules/AssetsList/Tokens/TokenItem/TokenItem.tsx
#	src/components/Modules/CurrencyElement/CurrencyElement.tsx
#	src/components/Modules/EventsList/EventListItems/LedgerObject.tsx
#	src/components/Modules/EventsList/EventListItems/Transaction.tsx
#	src/components/Modules/EventsList/EventsList.tsx
#	src/components/Modules/PaymentOptionsPicker/PaymentOptionsPicker.tsx
#	src/components/Modules/XAppStore/AppsList/AppItem/styles.tsx
#	src/locale/en.json
#	src/locale/translations/af.json
#	src/locale/translations/ar.json
#	src/locale/translations/bg.json
#	src/locale/translations/bn-BD.json
#	src/locale/translations/ca.json
#	src/locale/translations/cs.json
#	src/locale/translations/da.json
#	src/locale/translations/de.json
#	src/locale/translations/el.json
#	src/locale/translations/en-AU.json
#	src/locale/translations/es-419.json
#	src/locale/translations/es.json
#	src/locale/translations/et.json
#	src/locale/translations/eu.json
#	src/locale/translations/fi.json
#	src/locale/translations/fil.json
#	src/locale/translations/fr.json
#	src/locale/translations/gl-ES.json
#	src/locale/translations/gu.json
#	src/locale/translations/he.json
#	src/locale/translations/hi-IN.json
#	src/locale/translations/hr.json
#	src/locale/translations/ht.json
#	src/locale/translations/hu.json
#	src/locale/translations/id.json
#	src/locale/translations/it.json
#	src/locale/translations/ja.json
#	src/locale/translations/ka.json
#	src/locale/translations/kk.json
#	src/locale/translations/kn.json
#	src/locale/translations/ko.json
#	src/locale/translations/lt.json
#	src/locale/translations/lv.json
#	src/locale/translations/ml.json
#	src/locale/translations/mr.json
#	src/locale/translations/nl.json
#	src/locale/translations/no-NO.json
#	src/locale/translations/pa.json
#	src/locale/translations/pl.json
#	src/locale/translations/pt-BR.json
#	src/locale/translations/pt.json
#	src/locale/translations/ro.json
#	src/locale/translations/ru.json
#	src/locale/translations/sd.json
#	src/locale/translations/sk.json
#	src/locale/translations/sl.json
#	src/locale/translations/sr.json
#	src/locale/translations/sv.json
#	src/locale/translations/sw.json
#	src/locale/translations/ta-IN.json
#	src/locale/translations/te-IN.json
#	src/locale/translations/tr.json
#	src/locale/translations/uk.json
#	src/locale/translations/ur.json
#	src/locale/translations/uz.json
#	src/locale/translations/vi.json
#	src/locale/translations/zh-TW.json
#	src/locale/translations/zh.json
#	src/screens/Events/Details/DetailsView.tsx
#	src/screens/Events/EventsView.tsx
#	src/screens/Exchange/ExchangeView.tsx
#	src/screens/Modal/ReviewTransaction/ReviewTransactionModal.tsx
#	src/screens/Modal/ReviewTransaction/Steps/Preflight/PreflightStep.tsx
#	src/screens/Modal/ReviewTransaction/Steps/Result/ResultStep.tsx
#	src/screens/Modal/ReviewTransaction/Steps/Review/ReviewStep.tsx
#	src/screens/Modal/ReviewTransaction/Steps/Review/Templates/genuine/Global.tsx
#	src/screens/Modal/ReviewTransaction/Steps/Review/Templates/genuine/Payment.tsx
#	src/screens/Modal/ReviewTransaction/Steps/Review/Templates/genuine/index.ts
#	src/screens/Modal/ReviewTransaction/Steps/Review/Templates/objects/NFTokenOffer.tsx
#	src/screens/Modal/TransactionLoader/TransactionLoaderModal.tsx
#	src/screens/Modal/XAppBrowser/XAppBrowserModal.tsx
#	src/screens/Overlay/AddToken/AddTokenOverlay.tsx
#	src/screens/Overlay/ExplainBalance/ExplainBalanceOverlay.tsx
#	src/screens/Overlay/TokenSettings/TokenSettingsOverlay.tsx
#	src/screens/Settings/AddressBook/Add/AddContactView.tsx
#	src/services/AccountService.ts
#	src/services/AppService.ts
#	src/services/BackendService.ts
#	src/services/LedgerService.ts
#	src/services/LoggerService.ts
#	src/services/NetworkService.ts
#	src/services/__tests__/NetworkService.test.ts
#	src/store/models/objects/trustLine.ts
#	src/store/models/schemas/v14/core.ts
#	src/store/repositories/currency.ts
#	tsconfig.json
  • Loading branch information
N3TC4T committed Sep 24, 2024
2 parents 11d2446 + e222dca commit 6ab0636
Show file tree
Hide file tree
Showing 2 changed files with 169 additions and 42 deletions.
192 changes: 154 additions & 38 deletions src/common/utils/__tests__/fee.test.ts
Original file line number Diff line number Diff line change
@@ -1,44 +1,160 @@
import { NormalizeFeeDataSet } from '../fee';
/* eslint-disable spellcheck/spell-checker */
import { NormalizeFeeDataSet, PrepareTxForHookFee } from '../fee';

import * as AccountLib from 'xrpl-accountlib';

describe('Utils.Fee', () => {
it('Should return right values', () => {
const baseFees = {
10: ['12', '15', '25'],
12: ['12', '15', '25'],
24: ['24', '30', '45'],
100: ['100', '150', '200'],
500: ['500', '600', '900'],
1200: ['1200', '1500', '2500'],
10000: ['10000', '15000', '20000'],
50000: ['50000', '60000', '75000'],
20000: ['20000', '25000', '35000'],
800000: ['800000', '850000', '850000'],
} as any;

Object.keys(baseFees).forEach((base) => {
expect(
NormalizeFeeDataSet({
drops: { base_fee: base },
fee_hooks_feeunits: '0',
}),
).toMatchObject({
availableFees: [
{
type: 'LOW',
value: baseFees[base][0],
},
{
type: 'MEDIUM',
value: baseFees[base][1],
},
{
type: 'HIGH',
value: baseFees[base][2],
},
],
feeHooks: 0,
suggested: 'LOW',
describe('NormalizeFeeDataSet', () => {
it('Should return right values', () => {
const baseFees = {
10: ['12', '15', '25'],
12: ['12', '15', '25'],
24: ['24', '30', '45'],
100: ['100', '150', '200'],
500: ['500', '600', '900'],
1200: ['1200', '1500', '2500'],
10000: ['10000', '15000', '20000'],
50000: ['50000', '60000', '75000'],
20000: ['20000', '25000', '35000'],
800000: ['800000', '850000', '850000'],
};

Object.keys(baseFees).forEach((base) => {
expect(
NormalizeFeeDataSet({
drops: { base_fee: base },
fee_hooks_feeunits: '0',
}),
).toMatchObject({
availableFees: [
{
type: 'LOW',
value: baseFees[base][0],
},
{
type: 'MEDIUM',
value: baseFees[base][1],
},
{
type: 'HIGH',
value: baseFees[base][2],
},
],
feeHooks: 0,
suggested: 'LOW',
});
});
});
});

describe('PrepareTxForHookFee', () => {
it('Should throw an error if txJson is not a valid object', () => {
expect(() => {
PrepareTxForHookFee(undefined, {}, 0);
}).toThrowError('PrepareTxForHookFee requires a json transaction to calculate the fee for');

expect(() => {
PrepareTxForHookFee('invalid', {}, 0);
}).toThrowError('PrepareTxForHookFee requires a json transaction to calculate the fee for');
});

it('Should prepare the txJson correctly for signing', () => {
const txJson = {
Fee: '12',
SigningPubKey: 'SOME_PUB_KEY',
};

// mock and spy sign method
const signSpy = jest.spyOn(AccountLib, 'sign');

// call the method
PrepareTxForHookFee(txJson, undefined, 1);

expect(signSpy).toBeCalledWith(
{
Fee: '0',
SigningPubKey: '',
Sequence: 0,
},
expect.any(Object),
undefined,
);

signSpy.mockClear();
});

it('Should include NetworkID if necessary', () => {
const txJson = {};

const signSpy = jest.spyOn(AccountLib, 'sign');
PrepareTxForHookFee(txJson, undefined, 2337);
expect(signSpy).toBeCalledWith(
{
Fee: '0',
SigningPubKey: '',
Sequence: 0,
NetworkID: 2337,
},
expect.any(Object),
undefined,
);
signSpy.mockClear();
});

it('Should not include NetworkID if networkId is less than or equal to 1024', () => {
const txJson = {};

const signSpy = jest.spyOn(AccountLib, 'sign');
PrepareTxForHookFee(txJson, undefined, 1024);
expect(signSpy).toBeCalledWith(
{
Fee: '0',
SigningPubKey: '',
Sequence: 0,
},
expect.any(Object),
undefined,
);
signSpy.mockClear();
});

it('Should set Amount to 0 if TransactionType is Payment and Amount is not set', () => {
const txJson = {
TransactionType: 'Payment',
};

const signSpy = jest.spyOn(AccountLib, 'sign');
PrepareTxForHookFee(txJson, undefined, 0);
expect(signSpy).toBeCalledWith(
{
...txJson,
Amount: '0',
Fee: '0',
SigningPubKey: '',
Sequence: 0,
},
expect.any(Object),
undefined,
);
signSpy.mockClear();
});

it('Should set xrplDefinitions if definitions is an object', () => {
const txJson = {};

const signSpy = jest.spyOn(AccountLib, 'sign');
PrepareTxForHookFee(txJson, AccountLib.binary.DEFAULT_DEFINITIONS, 0);
expect(signSpy).toBeCalledWith(
{
...txJson,
Fee: '0',
SigningPubKey: '',
Sequence: 0,
},
expect.any(Object),
expect.any(Object),
);
signSpy.mockClear();
});
});
});
19 changes: 15 additions & 4 deletions src/common/utils/fee.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@ import { sign, derive, XrplDefinitions } from 'xrpl-accountlib';
* Prepare transaction for getting hook tx fee
* @param txJson
* @param definitions
* @param networkId
* @returns string
*/
const PrepareTxForHookFee = (txJson: any, definitions: any): string => {
const PrepareTxForHookFee = (txJson: any, definitions: any, networkId: number): string => {
if (!txJson || typeof txJson !== 'object') {
throw new Error('PrepareTxForHookFee requires a json transaction to calculate the fee for');
}

// normalize the transaction
// Shallow copy txJson
// Fee and SigningPubKey should be empty
const transaction = {
...txJson,
Expand All @@ -23,14 +24,24 @@ const PrepareTxForHookFee = (txJson: any, definitions: any): string => {

// check if we need to populate the transaction with dummy details
// set the Sequence if not set
if (!Object.prototype.hasOwnProperty.call(txJson, 'Sequence')) {
if (!Object.prototype.hasOwnProperty.call(transaction, 'Sequence')) {
Object.assign(transaction, {
Sequence: 0,
});
}

// include Network ID if necessary
if (!Object.prototype.hasOwnProperty.call(transaction, 'NetworkID')) {
// legacy networks have ids less than 1024, these networks cannot specify NetworkID in txn
if (networkId > 1024) {
Object.assign(transaction, {
NetworkID: networkId,
});
}
}

// Payment payloads can have no amount set
if (txJson.TransactionType === 'Payment' && !txJson.Amount) {
if (transaction.TransactionType === 'Payment' && !transaction.Amount) {
Object.assign(transaction, {
Amount: '0',
});
Expand Down

0 comments on commit 6ab0636

Please sign in to comment.