mirror of
https://github.com/haveno-dex/haveno-ts.git
synced 2025-02-08 18:48:26 -05:00
test random trade amounts, fix conversion utils using decimal.js
This commit is contained in:
parent
b4a5749378
commit
b304139779
15
dist/HavenoClient.js
vendored
15
dist/HavenoClient.js
vendored
@ -1,4 +1,19 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
/*
|
||||||
|
* Copyright Haveno
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||||
};
|
};
|
||||||
|
2
dist/HavenoClient.js.map
vendored
2
dist/HavenoClient.js.map
vendored
File diff suppressed because one or more lines are too long
40
dist/protobuf/grpc_pb.d.ts
vendored
40
dist/protobuf/grpc_pb.d.ts
vendored
@ -1603,11 +1603,14 @@ export class OfferInfo extends jspb.Message {
|
|||||||
getMinAmount(): string;
|
getMinAmount(): string;
|
||||||
setMinAmount(value: string): OfferInfo;
|
setMinAmount(value: string): OfferInfo;
|
||||||
|
|
||||||
getVolume(): string;
|
getMakerFeePct(): number;
|
||||||
setVolume(value: string): OfferInfo;
|
setMakerFeePct(value: number): OfferInfo;
|
||||||
|
|
||||||
getMinVolume(): string;
|
getTakerFeePct(): number;
|
||||||
setMinVolume(value: string): OfferInfo;
|
setTakerFeePct(value: number): OfferInfo;
|
||||||
|
|
||||||
|
getPenaltyFeePct(): number;
|
||||||
|
setPenaltyFeePct(value: number): OfferInfo;
|
||||||
|
|
||||||
getBuyerSecurityDepositPct(): number;
|
getBuyerSecurityDepositPct(): number;
|
||||||
setBuyerSecurityDepositPct(value: number): OfferInfo;
|
setBuyerSecurityDepositPct(value: number): OfferInfo;
|
||||||
@ -1615,6 +1618,12 @@ export class OfferInfo extends jspb.Message {
|
|||||||
getSellerSecurityDepositPct(): number;
|
getSellerSecurityDepositPct(): number;
|
||||||
setSellerSecurityDepositPct(value: number): OfferInfo;
|
setSellerSecurityDepositPct(value: number): OfferInfo;
|
||||||
|
|
||||||
|
getVolume(): string;
|
||||||
|
setVolume(value: string): OfferInfo;
|
||||||
|
|
||||||
|
getMinVolume(): string;
|
||||||
|
setMinVolume(value: string): OfferInfo;
|
||||||
|
|
||||||
getTriggerPrice(): string;
|
getTriggerPrice(): string;
|
||||||
setTriggerPrice(value: string): OfferInfo;
|
setTriggerPrice(value: string): OfferInfo;
|
||||||
|
|
||||||
@ -1639,9 +1648,6 @@ export class OfferInfo extends jspb.Message {
|
|||||||
getState(): string;
|
getState(): string;
|
||||||
setState(value: string): OfferInfo;
|
setState(value: string): OfferInfo;
|
||||||
|
|
||||||
getMakerFee(): string;
|
|
||||||
setMakerFee(value: string): OfferInfo;
|
|
||||||
|
|
||||||
getIsActivated(): boolean;
|
getIsActivated(): boolean;
|
||||||
setIsActivated(value: boolean): OfferInfo;
|
setIsActivated(value: boolean): OfferInfo;
|
||||||
|
|
||||||
@ -1686,10 +1692,13 @@ export namespace OfferInfo {
|
|||||||
marketPriceMarginPct: number,
|
marketPriceMarginPct: number,
|
||||||
amount: string,
|
amount: string,
|
||||||
minAmount: string,
|
minAmount: string,
|
||||||
volume: string,
|
makerFeePct: number,
|
||||||
minVolume: string,
|
takerFeePct: number,
|
||||||
|
penaltyFeePct: number,
|
||||||
buyerSecurityDepositPct: number,
|
buyerSecurityDepositPct: number,
|
||||||
sellerSecurityDepositPct: number,
|
sellerSecurityDepositPct: number,
|
||||||
|
volume: string,
|
||||||
|
minVolume: string,
|
||||||
triggerPrice: string,
|
triggerPrice: string,
|
||||||
paymentAccountId: string,
|
paymentAccountId: string,
|
||||||
paymentMethodId: string,
|
paymentMethodId: string,
|
||||||
@ -1698,7 +1707,6 @@ export namespace OfferInfo {
|
|||||||
counterCurrencyCode: string,
|
counterCurrencyCode: string,
|
||||||
date: number,
|
date: number,
|
||||||
state: string,
|
state: string,
|
||||||
makerFee: string,
|
|
||||||
isActivated: boolean,
|
isActivated: boolean,
|
||||||
isMyOffer: boolean,
|
isMyOffer: boolean,
|
||||||
ownerNodeAddress: string,
|
ownerNodeAddress: string,
|
||||||
@ -2647,12 +2655,15 @@ export class TradeInfo extends jspb.Message {
|
|||||||
getRole(): string;
|
getRole(): string;
|
||||||
setRole(value: string): TradeInfo;
|
setRole(value: string): TradeInfo;
|
||||||
|
|
||||||
getTakerFee(): string;
|
|
||||||
setTakerFee(value: string): TradeInfo;
|
|
||||||
|
|
||||||
getAmount(): string;
|
getAmount(): string;
|
||||||
setAmount(value: string): TradeInfo;
|
setAmount(value: string): TradeInfo;
|
||||||
|
|
||||||
|
getMakerFee(): string;
|
||||||
|
setMakerFee(value: string): TradeInfo;
|
||||||
|
|
||||||
|
getTakerFee(): string;
|
||||||
|
setTakerFee(value: string): TradeInfo;
|
||||||
|
|
||||||
getBuyerSecurityDeposit(): string;
|
getBuyerSecurityDeposit(): string;
|
||||||
setBuyerSecurityDeposit(value: string): TradeInfo;
|
setBuyerSecurityDeposit(value: string): TradeInfo;
|
||||||
|
|
||||||
@ -2763,8 +2774,9 @@ export namespace TradeInfo {
|
|||||||
shortId: string,
|
shortId: string,
|
||||||
date: number,
|
date: number,
|
||||||
role: string,
|
role: string,
|
||||||
takerFee: string,
|
|
||||||
amount: string,
|
amount: string,
|
||||||
|
makerFee: string,
|
||||||
|
takerFee: string,
|
||||||
buyerSecurityDeposit: string,
|
buyerSecurityDeposit: string,
|
||||||
sellerSecurityDeposit: string,
|
sellerSecurityDeposit: string,
|
||||||
buyerDepositTxFee: string,
|
buyerDepositTxFee: string,
|
||||||
|
1038
dist/protobuf/grpc_pb.js
vendored
1038
dist/protobuf/grpc_pb.js
vendored
File diff suppressed because it is too large
Load Diff
2
dist/protobuf/grpc_pb.js.map
vendored
2
dist/protobuf/grpc_pb.js.map
vendored
File diff suppressed because one or more lines are too long
95
dist/protobuf/pb_pb.d.ts
vendored
95
dist/protobuf/pb_pb.d.ts
vendored
@ -191,6 +191,11 @@ export class NetworkEnvelope extends jspb.Message {
|
|||||||
hasMediatedPayoutTxPublishedMessage(): boolean;
|
hasMediatedPayoutTxPublishedMessage(): boolean;
|
||||||
clearMediatedPayoutTxPublishedMessage(): NetworkEnvelope;
|
clearMediatedPayoutTxPublishedMessage(): NetworkEnvelope;
|
||||||
|
|
||||||
|
getFileTransferPart(): FileTransferPart | undefined;
|
||||||
|
setFileTransferPart(value?: FileTransferPart): NetworkEnvelope;
|
||||||
|
hasFileTransferPart(): boolean;
|
||||||
|
clearFileTransferPart(): NetworkEnvelope;
|
||||||
|
|
||||||
getMessageCase(): NetworkEnvelope.MessageCase;
|
getMessageCase(): NetworkEnvelope.MessageCase;
|
||||||
|
|
||||||
serializeBinary(): Uint8Array;
|
serializeBinary(): Uint8Array;
|
||||||
@ -241,6 +246,7 @@ export namespace NetworkEnvelope {
|
|||||||
chatMessage?: ChatMessage.AsObject,
|
chatMessage?: ChatMessage.AsObject,
|
||||||
mediatedPayoutTxSignatureMessage?: MediatedPayoutTxSignatureMessage.AsObject,
|
mediatedPayoutTxSignatureMessage?: MediatedPayoutTxSignatureMessage.AsObject,
|
||||||
mediatedPayoutTxPublishedMessage?: MediatedPayoutTxPublishedMessage.AsObject,
|
mediatedPayoutTxPublishedMessage?: MediatedPayoutTxPublishedMessage.AsObject,
|
||||||
|
fileTransferPart?: FileTransferPart.AsObject,
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum MessageCase {
|
export enum MessageCase {
|
||||||
@ -282,6 +288,7 @@ export namespace NetworkEnvelope {
|
|||||||
CHAT_MESSAGE = 36,
|
CHAT_MESSAGE = 36,
|
||||||
MEDIATED_PAYOUT_TX_SIGNATURE_MESSAGE = 37,
|
MEDIATED_PAYOUT_TX_SIGNATURE_MESSAGE = 37,
|
||||||
MEDIATED_PAYOUT_TX_PUBLISHED_MESSAGE = 38,
|
MEDIATED_PAYOUT_TX_PUBLISHED_MESSAGE = 38,
|
||||||
|
FILE_TRANSFER_PART = 39,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -417,6 +424,48 @@ export namespace GetUpdatedDataRequest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class FileTransferPart extends jspb.Message {
|
||||||
|
getSenderNodeAddress(): NodeAddress | undefined;
|
||||||
|
setSenderNodeAddress(value?: NodeAddress): FileTransferPart;
|
||||||
|
hasSenderNodeAddress(): boolean;
|
||||||
|
clearSenderNodeAddress(): FileTransferPart;
|
||||||
|
|
||||||
|
getUid(): string;
|
||||||
|
setUid(value: string): FileTransferPart;
|
||||||
|
|
||||||
|
getTradeId(): string;
|
||||||
|
setTradeId(value: string): FileTransferPart;
|
||||||
|
|
||||||
|
getTraderId(): number;
|
||||||
|
setTraderId(value: number): FileTransferPart;
|
||||||
|
|
||||||
|
getSeqNumOrFileLength(): number;
|
||||||
|
setSeqNumOrFileLength(value: number): FileTransferPart;
|
||||||
|
|
||||||
|
getMessageData(): Uint8Array | string;
|
||||||
|
getMessageData_asU8(): Uint8Array;
|
||||||
|
getMessageData_asB64(): string;
|
||||||
|
setMessageData(value: Uint8Array | string): FileTransferPart;
|
||||||
|
|
||||||
|
serializeBinary(): Uint8Array;
|
||||||
|
toObject(includeInstance?: boolean): FileTransferPart.AsObject;
|
||||||
|
static toObject(includeInstance: boolean, msg: FileTransferPart): FileTransferPart.AsObject;
|
||||||
|
static serializeBinaryToWriter(message: FileTransferPart, writer: jspb.BinaryWriter): void;
|
||||||
|
static deserializeBinary(bytes: Uint8Array): FileTransferPart;
|
||||||
|
static deserializeBinaryFromReader(message: FileTransferPart, reader: jspb.BinaryReader): FileTransferPart;
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace FileTransferPart {
|
||||||
|
export type AsObject = {
|
||||||
|
senderNodeAddress?: NodeAddress.AsObject,
|
||||||
|
uid: string,
|
||||||
|
tradeId: string,
|
||||||
|
traderId: number,
|
||||||
|
seqNumOrFileLength: number,
|
||||||
|
messageData: Uint8Array | string,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class GetPeersRequest extends jspb.Message {
|
export class GetPeersRequest extends jspb.Message {
|
||||||
getSenderNodeAddress(): NodeAddress | undefined;
|
getSenderNodeAddress(): NodeAddress | undefined;
|
||||||
setSenderNodeAddress(value?: NodeAddress): GetPeersRequest;
|
setSenderNodeAddress(value?: NodeAddress): GetPeersRequest;
|
||||||
@ -962,8 +1011,8 @@ export namespace PrefixedSealedAndSignedMessage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class InitTradeRequest extends jspb.Message {
|
export class InitTradeRequest extends jspb.Message {
|
||||||
getTradeId(): string;
|
getOfferId(): string;
|
||||||
setTradeId(value: string): InitTradeRequest;
|
setOfferId(value: string): InitTradeRequest;
|
||||||
|
|
||||||
getSenderNodeAddress(): NodeAddress | undefined;
|
getSenderNodeAddress(): NodeAddress | undefined;
|
||||||
setSenderNodeAddress(value?: NodeAddress): InitTradeRequest;
|
setSenderNodeAddress(value?: NodeAddress): InitTradeRequest;
|
||||||
@ -981,9 +1030,6 @@ export class InitTradeRequest extends jspb.Message {
|
|||||||
getTradePrice(): number;
|
getTradePrice(): number;
|
||||||
setTradePrice(value: number): InitTradeRequest;
|
setTradePrice(value: number): InitTradeRequest;
|
||||||
|
|
||||||
getTradeFee(): number;
|
|
||||||
setTradeFee(value: number): InitTradeRequest;
|
|
||||||
|
|
||||||
getAccountId(): string;
|
getAccountId(): string;
|
||||||
setAccountId(value: string): InitTradeRequest;
|
setAccountId(value: string): InitTradeRequest;
|
||||||
|
|
||||||
@ -1046,12 +1092,11 @@ export class InitTradeRequest extends jspb.Message {
|
|||||||
|
|
||||||
export namespace InitTradeRequest {
|
export namespace InitTradeRequest {
|
||||||
export type AsObject = {
|
export type AsObject = {
|
||||||
tradeId: string,
|
offerId: string,
|
||||||
senderNodeAddress?: NodeAddress.AsObject,
|
senderNodeAddress?: NodeAddress.AsObject,
|
||||||
pubKeyRing?: PubKeyRing.AsObject,
|
pubKeyRing?: PubKeyRing.AsObject,
|
||||||
tradeAmount: number,
|
tradeAmount: number,
|
||||||
tradePrice: number,
|
tradePrice: number,
|
||||||
tradeFee: number,
|
|
||||||
accountId: string,
|
accountId: string,
|
||||||
paymentAccountId: string,
|
paymentAccountId: string,
|
||||||
paymentMethodId: string,
|
paymentMethodId: string,
|
||||||
@ -2736,6 +2781,21 @@ export class OfferPayload extends jspb.Message {
|
|||||||
getMinAmount(): number;
|
getMinAmount(): number;
|
||||||
setMinAmount(value: number): OfferPayload;
|
setMinAmount(value: number): OfferPayload;
|
||||||
|
|
||||||
|
getMakerFeePct(): number;
|
||||||
|
setMakerFeePct(value: number): OfferPayload;
|
||||||
|
|
||||||
|
getTakerFeePct(): number;
|
||||||
|
setTakerFeePct(value: number): OfferPayload;
|
||||||
|
|
||||||
|
getPenaltyFeePct(): number;
|
||||||
|
setPenaltyFeePct(value: number): OfferPayload;
|
||||||
|
|
||||||
|
getBuyerSecurityDepositPct(): number;
|
||||||
|
setBuyerSecurityDepositPct(value: number): OfferPayload;
|
||||||
|
|
||||||
|
getSellerSecurityDepositPct(): number;
|
||||||
|
setSellerSecurityDepositPct(value: number): OfferPayload;
|
||||||
|
|
||||||
getBaseCurrencyCode(): string;
|
getBaseCurrencyCode(): string;
|
||||||
setBaseCurrencyCode(value: string): OfferPayload;
|
setBaseCurrencyCode(value: string): OfferPayload;
|
||||||
|
|
||||||
@ -2770,15 +2830,6 @@ export class OfferPayload extends jspb.Message {
|
|||||||
getBlockHeightAtOfferCreation(): number;
|
getBlockHeightAtOfferCreation(): number;
|
||||||
setBlockHeightAtOfferCreation(value: number): OfferPayload;
|
setBlockHeightAtOfferCreation(value: number): OfferPayload;
|
||||||
|
|
||||||
getMakerFee(): number;
|
|
||||||
setMakerFee(value: number): OfferPayload;
|
|
||||||
|
|
||||||
getBuyerSecurityDepositPct(): number;
|
|
||||||
setBuyerSecurityDepositPct(value: number): OfferPayload;
|
|
||||||
|
|
||||||
getSellerSecurityDepositPct(): number;
|
|
||||||
setSellerSecurityDepositPct(value: number): OfferPayload;
|
|
||||||
|
|
||||||
getMaxTradeLimit(): number;
|
getMaxTradeLimit(): number;
|
||||||
setMaxTradeLimit(value: number): OfferPayload;
|
setMaxTradeLimit(value: number): OfferPayload;
|
||||||
|
|
||||||
@ -2844,6 +2895,11 @@ export namespace OfferPayload {
|
|||||||
useMarketBasedPrice: boolean,
|
useMarketBasedPrice: boolean,
|
||||||
amount: number,
|
amount: number,
|
||||||
minAmount: number,
|
minAmount: number,
|
||||||
|
makerFeePct: number,
|
||||||
|
takerFeePct: number,
|
||||||
|
penaltyFeePct: number,
|
||||||
|
buyerSecurityDepositPct: number,
|
||||||
|
sellerSecurityDepositPct: number,
|
||||||
baseCurrencyCode: string,
|
baseCurrencyCode: string,
|
||||||
counterCurrencyCode: string,
|
counterCurrencyCode: string,
|
||||||
paymentMethodId: string,
|
paymentMethodId: string,
|
||||||
@ -2854,9 +2910,6 @@ export namespace OfferPayload {
|
|||||||
acceptedBankIdsList: Array<string>,
|
acceptedBankIdsList: Array<string>,
|
||||||
versionNr: string,
|
versionNr: string,
|
||||||
blockHeightAtOfferCreation: number,
|
blockHeightAtOfferCreation: number,
|
||||||
makerFee: number,
|
|
||||||
buyerSecurityDepositPct: number,
|
|
||||||
sellerSecurityDepositPct: number,
|
|
||||||
maxTradeLimit: number,
|
maxTradeLimit: number,
|
||||||
maxTradePeriod: number,
|
maxTradePeriod: number,
|
||||||
useAutoClose: boolean,
|
useAutoClose: boolean,
|
||||||
@ -6027,9 +6080,6 @@ export class Trade extends jspb.Message {
|
|||||||
getAmount(): number;
|
getAmount(): number;
|
||||||
setAmount(value: number): Trade;
|
setAmount(value: number): Trade;
|
||||||
|
|
||||||
getTakerFee(): number;
|
|
||||||
setTakerFee(value: number): Trade;
|
|
||||||
|
|
||||||
getTakeOfferDate(): number;
|
getTakeOfferDate(): number;
|
||||||
setTakeOfferDate(value: number): Trade;
|
setTakeOfferDate(value: number): Trade;
|
||||||
|
|
||||||
@ -6124,7 +6174,6 @@ export namespace Trade {
|
|||||||
payoutTxHex: string,
|
payoutTxHex: string,
|
||||||
payoutTxKey: string,
|
payoutTxKey: string,
|
||||||
amount: number,
|
amount: number,
|
||||||
takerFee: number,
|
|
||||||
takeOfferDate: number,
|
takeOfferDate: number,
|
||||||
price: number,
|
price: number,
|
||||||
state: Trade.State,
|
state: Trade.State,
|
||||||
|
1563
dist/protobuf/pb_pb.js
vendored
1563
dist/protobuf/pb_pb.js
vendored
File diff suppressed because it is too large
Load Diff
2
dist/protobuf/pb_pb.js.map
vendored
2
dist/protobuf/pb_pb.js.map
vendored
File diff suppressed because one or more lines are too long
15
dist/types/HavenoError.js
vendored
15
dist/types/HavenoError.js
vendored
@ -1,4 +1,19 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
/*
|
||||||
|
* Copyright Haveno
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
/**
|
/**
|
||||||
* Haveno error with message and code.
|
* Haveno error with message and code.
|
||||||
|
2
dist/types/HavenoError.js.map
vendored
2
dist/types/HavenoError.js.map
vendored
@ -1 +1 @@
|
|||||||
{"version":3,"file":"HavenoError.js","sourceRoot":"","sources":["../../src/types/HavenoError.ts"],"names":[],"mappings":";;AAAA;;GAEG;AACH,MAAqB,WAAY,SAAQ,KAAK;IAI5C;;;;;OAKG;IACH,YAAY,GAAW,EAAE,IAAa;QACpC,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAdD,8BAcC"}
|
{"version":3,"file":"HavenoError.js","sourceRoot":"","sources":["../../src/types/HavenoError.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AAGH;;GAEG;AACH,MAAqB,WAAY,SAAQ,KAAK;IAI5C;;;;;OAKG;IACH,YAAY,GAAW,EAAE,IAAa;QACpC,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAdD,8BAcC"}
|
18
dist/utils/HavenoUtils.js
vendored
18
dist/utils/HavenoUtils.js
vendored
@ -1,10 +1,26 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
/*
|
||||||
|
* Copyright Haveno
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const assert_1 = __importDefault(require("assert"));
|
const assert_1 = __importDefault(require("assert"));
|
||||||
const console_1 = __importDefault(require("console"));
|
const console_1 = __importDefault(require("console"));
|
||||||
|
const decimal_js_1 = __importDefault(require("decimal.js"));
|
||||||
const pb_pb_1 = require("../protobuf/pb_pb");
|
const pb_pb_1 = require("../protobuf/pb_pb");
|
||||||
/**
|
/**
|
||||||
* Collection of utilities for working with Haveno.
|
* Collection of utilities for working with Haveno.
|
||||||
@ -132,7 +148,7 @@ class HavenoUtils {
|
|||||||
amountAtomicUnits = BigInt(amountAtomicUnits);
|
amountAtomicUnits = BigInt(amountAtomicUnits);
|
||||||
const quotient = amountAtomicUnits / HavenoUtils.AU_PER_XMR;
|
const quotient = amountAtomicUnits / HavenoUtils.AU_PER_XMR;
|
||||||
const remainder = amountAtomicUnits % HavenoUtils.AU_PER_XMR;
|
const remainder = amountAtomicUnits % HavenoUtils.AU_PER_XMR;
|
||||||
return Number(quotient) + Number(remainder) / Number(HavenoUtils.AU_PER_XMR);
|
return new decimal_js_1.default(quotient.toString()).plus(new decimal_js_1.default(remainder.toString()).div(HavenoUtils.AU_PER_XMR.toString())).toNumber();
|
||||||
}
|
}
|
||||||
// ------------------------- PAYMENT ACCOUNT FORMS --------------------------
|
// ------------------------- PAYMENT ACCOUNT FORMS --------------------------
|
||||||
/**
|
/**
|
||||||
|
2
dist/utils/HavenoUtils.js.map
vendored
2
dist/utils/HavenoUtils.js.map
vendored
File diff suppressed because one or more lines are too long
15
dist/utils/TaskLooper.js
vendored
15
dist/utils/TaskLooper.js
vendored
@ -1,4 +1,19 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
/*
|
||||||
|
* Copyright Haveno
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
/**
|
/**
|
||||||
* Run a task in a fixed period loop.
|
* Run a task in a fixed period loop.
|
||||||
|
2
dist/utils/TaskLooper.js.map
vendored
2
dist/utils/TaskLooper.js.map
vendored
@ -1 +1 @@
|
|||||||
{"version":3,"file":"TaskLooper.js","sourceRoot":"","sources":["../../src/utils/TaskLooper.ts"],"names":[],"mappings":";;AAAA;;GAEG;AACH,MAAqB,UAAU;IAO7B;;;;OAIG;IACH,YAAY,EAAuB;QACjC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAkB;QACtB,IAAI,UAAU,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAChF,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACzF,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,YAAY,CAAC,IAAI,CAAC,QAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,UAAkB;QAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,OAAO,IAAI,CAAC,UAAU,EAAE;YACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;YACjB,IAAI,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACtI;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;CACF;AAjDD,6BAiDC"}
|
{"version":3,"file":"TaskLooper.js","sourceRoot":"","sources":["../../src/utils/TaskLooper.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AAGH;;GAEG;AACH,MAAqB,UAAU;IAO7B;;;;OAIG;IACH,YAAY,EAAuB;QACjC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAkB;QACtB,IAAI,UAAU,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAChF,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACzF,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,YAAY,CAAC,IAAI,CAAC,QAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,UAAkB;QAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,OAAO,IAAI,CAAC,UAAU,EAAE;YACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;YACjB,IAAI,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACtI;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;CACF;AAjDD,6BAiDC"}
|
1
package-lock.json
generated
1
package-lock.json
generated
@ -22,6 +22,7 @@
|
|||||||
"@typescript-eslint/eslint-plugin": "5.53.0",
|
"@typescript-eslint/eslint-plugin": "5.53.0",
|
||||||
"@typescript-eslint/parser": "^5.53.0",
|
"@typescript-eslint/parser": "^5.53.0",
|
||||||
"babel-jest": "^29.4.3",
|
"babel-jest": "^29.4.3",
|
||||||
|
"decimal.js": "^10.4.3",
|
||||||
"eslint": "^8.35.0",
|
"eslint": "^8.35.0",
|
||||||
"eslint-config-prettier": "^8.6.0",
|
"eslint-config-prettier": "^8.6.0",
|
||||||
"eslint-import-resolver-typescript": "^3.5.3",
|
"eslint-import-resolver-typescript": "^3.5.3",
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
"@typescript-eslint/eslint-plugin": "5.53.0",
|
"@typescript-eslint/eslint-plugin": "5.53.0",
|
||||||
"@typescript-eslint/parser": "^5.53.0",
|
"@typescript-eslint/parser": "^5.53.0",
|
||||||
"babel-jest": "^29.4.3",
|
"babel-jest": "^29.4.3",
|
||||||
|
"decimal.js": "^10.4.3",
|
||||||
"eslint": "^8.35.0",
|
"eslint": "^8.35.0",
|
||||||
"eslint-config-prettier": "^8.6.0",
|
"eslint-config-prettier": "^8.6.0",
|
||||||
"eslint-import-resolver-typescript": "^3.5.3",
|
"eslint-import-resolver-typescript": "^3.5.3",
|
||||||
|
@ -125,7 +125,7 @@ const defaultTradeConfig: Partial<TradeContext> = {
|
|||||||
takeOffer: true,
|
takeOffer: true,
|
||||||
awaitFundsToMakeOffer: true,
|
awaitFundsToMakeOffer: true,
|
||||||
direction: OfferDirection.BUY, // buy or sell xmr
|
direction: OfferDirection.BUY, // buy or sell xmr
|
||||||
offerAmount: HavenoUtils.xmrToAtomicUnits(.2), // amount of xmr to trade
|
offerAmount: 193312996088n,
|
||||||
offerMinAmount: undefined,
|
offerMinAmount: undefined,
|
||||||
assetCode: "usd", // counter asset to trade
|
assetCode: "usd", // counter asset to trade
|
||||||
makerPaymentAccountId: undefined,
|
makerPaymentAccountId: undefined,
|
||||||
@ -309,8 +309,12 @@ class TradeContext {
|
|||||||
str += "\nSecurity deposit percent: " + this.securityDepositPct;
|
str += "\nSecurity deposit percent: " + this.securityDepositPct;
|
||||||
str += "\nMaker balance before offer: " + this.maker.balancesBeforeOffer?.getBalance();
|
str += "\nMaker balance before offer: " + this.maker.balancesBeforeOffer?.getBalance();
|
||||||
str += "\nMaker split output tx fee: " + this.maker.splitOutputTxFee;
|
str += "\nMaker split output tx fee: " + this.maker.splitOutputTxFee;
|
||||||
if (this.offer) str += "\nMaker trade fee: " + this.offer!.getMakerFee();
|
if (this.offer) {
|
||||||
|
str += "\nMaker fee percent: " + this.offer!.getMakerFeePct();
|
||||||
|
str += "\nTaker fee percent: " + this.offer!.getTakerFeePct();
|
||||||
|
}
|
||||||
if (this.arbitrator && this.arbitrator!.trade) {
|
if (this.arbitrator && this.arbitrator!.trade) {
|
||||||
|
str += "\nMaker trade fee: " + this.arbitrator?.trade?.getMakerFee();
|
||||||
str += "\nMaker deposit tx id: " + this.arbitrator!.trade!.getMakerDepositTxId();
|
str += "\nMaker deposit tx id: " + this.arbitrator!.trade!.getMakerDepositTxId();
|
||||||
if (this.arbitrator!.trade!.getMakerDepositTxId()) {
|
if (this.arbitrator!.trade!.getMakerDepositTxId()) {
|
||||||
let tx = await monerod.getTx(this.arbitrator!.trade!.getMakerDepositTxId());
|
let tx = await monerod.getTx(this.arbitrator!.trade!.getMakerDepositTxId());
|
||||||
@ -1612,11 +1616,14 @@ test("Can complete a trade within a range", async () => {
|
|||||||
let takerPaymentAccount = await createPaymentAccount(user2, assetCode, paymentMethodId);
|
let takerPaymentAccount = await createPaymentAccount(user2, assetCode, paymentMethodId);
|
||||||
|
|
||||||
// execute trade
|
// execute trade
|
||||||
|
const offerAmount = HavenoUtils.xmrToAtomicUnits(2);
|
||||||
|
const offerMinAmount = HavenoUtils.xmrToAtomicUnits(.15);
|
||||||
|
const tradeAmount = getRandomBigIntWithinRange(offerMinAmount, offerAmount);
|
||||||
await executeTrade({
|
await executeTrade({
|
||||||
price: 142.23,
|
price: 142.23,
|
||||||
offerAmount: HavenoUtils.xmrToAtomicUnits(2),
|
offerAmount: offerAmount,
|
||||||
offerMinAmount: HavenoUtils.xmrToAtomicUnits(.15),
|
offerMinAmount: offerMinAmount,
|
||||||
tradeAmount: HavenoUtils.xmrToAtomicUnits(1),
|
tradeAmount: tradeAmount,
|
||||||
testPayoutUnlocked: true, // override to test unlock
|
testPayoutUnlocked: true, // override to test unlock
|
||||||
makerPaymentAccountId: makerPaymentAccount.getId(),
|
makerPaymentAccountId: makerPaymentAccount.getId(),
|
||||||
takerPaymentAccountId: takerPaymentAccount.getId(),
|
takerPaymentAccountId: takerPaymentAccount.getId(),
|
||||||
@ -1627,10 +1634,11 @@ test("Can complete a trade within a range", async () => {
|
|||||||
|
|
||||||
test("Can complete trades at the same time (CI, sanity check)", async () => {
|
test("Can complete trades at the same time (CI, sanity check)", async () => {
|
||||||
|
|
||||||
// create trade contexts with customized payment methods
|
// create trade contexts with customized payment methods and random amounts
|
||||||
const ctxs = getTradeContexts(TestConfig.assetCodes.length);
|
const ctxs = getTradeContexts(TestConfig.assetCodes.length);
|
||||||
for (let i = 0; i < ctxs.length; i++) {
|
for (let i = 0; i < ctxs.length; i++) {
|
||||||
ctxs[i].assetCode = TestConfig.assetCodes[i]; // test each asset code
|
ctxs[i].assetCode = TestConfig.assetCodes[i]; // test each asset code
|
||||||
|
ctxs[i].offerAmount = getRandomBigIntWithinPercent(TestConfig.trade.offerAmount!, 0.15);
|
||||||
let paymentMethodId;
|
let paymentMethodId;
|
||||||
if (ctxs[i].assetCode === "USD") paymentMethodId = "zelle";
|
if (ctxs[i].assetCode === "USD") paymentMethodId = "zelle";
|
||||||
if (ctxs[i].assetCode === "EUR") paymentMethodId = "revolut";
|
if (ctxs[i].assetCode === "EUR") paymentMethodId = "revolut";
|
||||||
@ -1666,7 +1674,8 @@ test("Can complete all trade combinations (stress)", async () => {
|
|||||||
buyerDisputeContext: BUYER_DISPUTE_OPTS[k],
|
buyerDisputeContext: BUYER_DISPUTE_OPTS[k],
|
||||||
sellerDisputeContext: SELLER_DISPUTE_OPTS[l],
|
sellerDisputeContext: SELLER_DISPUTE_OPTS[l],
|
||||||
disputeWinner: DISPUTE_WINNER_OPTS[m],
|
disputeWinner: DISPUTE_WINNER_OPTS[m],
|
||||||
disputeSummary: "After much deliberation, " + (DISPUTE_WINNER_OPTS[m] === DisputeResult.Winner.BUYER ? "buyer" : "seller") + " is winner"
|
disputeSummary: "After much deliberation, " + (DISPUTE_WINNER_OPTS[m] === DisputeResult.Winner.BUYER ? "buyer" : "seller") + " is winner",
|
||||||
|
offerAmount: getRandomBigIntWithinPercent(TestConfig.trade.offerAmount!, 0.15)
|
||||||
};
|
};
|
||||||
ctxs.push(Object.assign({}, new TradeContext(TestConfig.trade), ctx));
|
ctxs.push(Object.assign({}, new TradeContext(TestConfig.trade), ctx));
|
||||||
}
|
}
|
||||||
@ -2768,7 +2777,7 @@ async function takeOffer(ctxP: Partial<TradeContext>): Promise<TradeInfo> {
|
|||||||
ctx.taker.balancesAfterTake = await ctx.taker.havenod!.getBalances();
|
ctx.taker.balancesAfterTake = await ctx.taker.havenod!.getBalances();
|
||||||
ctx.maker.depositTxFee = BigInt(ctx.maker.depositTx!.getFee());
|
ctx.maker.depositTxFee = BigInt(ctx.maker.depositTx!.getFee());
|
||||||
ctx.taker.depositTxFee = BigInt(ctx.taker.depositTx!.getFee());
|
ctx.taker.depositTxFee = BigInt(ctx.taker.depositTx!.getFee());
|
||||||
ctx.maker.tradeFee = BigInt(trade.getOffer()!.getMakerFee());
|
ctx.maker.tradeFee = BigInt(trade.getMakerFee());
|
||||||
ctx.taker.tradeFee = BigInt(trade.getTakerFee());
|
ctx.taker.tradeFee = BigInt(trade.getTakerFee());
|
||||||
ctx.getBuyer().securityDepositActual = BigInt(trade.getBuyerSecurityDeposit()!);
|
ctx.getBuyer().securityDepositActual = BigInt(trade.getBuyerSecurityDeposit()!);
|
||||||
ctx.getSeller().securityDepositActual = BigInt(trade.getSellerSecurityDeposit()!);
|
ctx.getSeller().securityDepositActual = BigInt(trade.getSellerSecurityDeposit()!);
|
||||||
@ -2832,7 +2841,7 @@ async function testTrade(trade: TradeInfo, ctx: TradeContext) {
|
|||||||
expect(BigInt(trade.getAmount())).toEqual(ctx!.tradeAmount);
|
expect(BigInt(trade.getAmount())).toEqual(ctx!.tradeAmount);
|
||||||
|
|
||||||
// test security deposit = max(.1, trade amount * security deposit pct)
|
// test security deposit = max(.1, trade amount * security deposit pct)
|
||||||
const expectedSecurityDeposit = HavenoUtils.xmrToAtomicUnits(Math.max(.1, HavenoUtils.atomicUnitsToXmr(ctx.tradeAmount!) * ctx.securityDepositPct!));
|
const expectedSecurityDeposit = HavenoUtils.max(HavenoUtils.xmrToAtomicUnits(.1), HavenoUtils.multiply(ctx.tradeAmount!, ctx.securityDepositPct!));
|
||||||
expect(BigInt(trade.getBuyerSecurityDeposit())).toEqual(expectedSecurityDeposit - ctx.getBuyer().depositTxFee);
|
expect(BigInt(trade.getBuyerSecurityDeposit())).toEqual(expectedSecurityDeposit - ctx.getBuyer().depositTxFee);
|
||||||
expect(BigInt(trade.getSellerSecurityDeposit())).toEqual(expectedSecurityDeposit - ctx.getSeller().depositTxFee);
|
expect(BigInt(trade.getSellerSecurityDeposit())).toEqual(expectedSecurityDeposit - ctx.getSeller().depositTxFee);
|
||||||
|
|
||||||
@ -3772,6 +3781,18 @@ function testDestination(destination: XmrDestination) {
|
|||||||
expect(BigInt(destination.getAmount())).toBeGreaterThan(0n);
|
expect(BigInt(destination.getAmount())).toBeGreaterThan(0n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getRandomBigIntWithinPercent(base: bigint, percent: number): bigint {
|
||||||
|
return getRandomBigIntWithinRange(base - multiply(base, percent), base + multiply(base, percent));
|
||||||
|
}
|
||||||
|
|
||||||
|
function multiply(amount: bigint, multiplier: number): bigint {
|
||||||
|
return BigInt(Math.round(Number(amount) * multiplier));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRandomBigIntWithinRange(min: bigint, max: bigint): bigint {
|
||||||
|
return BigInt(Math.floor(Math.random() * (Number(max) - Number(min))) + Number(min));
|
||||||
|
}
|
||||||
|
|
||||||
function getRandomAssetCode() {
|
function getRandomAssetCode() {
|
||||||
return TestConfig.assetCodes[moneroTs.GenUtils.getRandomInt(0, TestConfig.assetCodes.length - 1)];
|
return TestConfig.assetCodes[moneroTs.GenUtils.getRandomInt(0, TestConfig.assetCodes.length - 1)];
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
import assert from "assert";
|
import assert from "assert";
|
||||||
import console from "console";
|
import console from "console";
|
||||||
|
import Decimal from 'decimal.js';
|
||||||
import { PaymentAccountForm, PaymentAccountFormField } from "../protobuf/pb_pb";
|
import { PaymentAccountForm, PaymentAccountFormField } from "../protobuf/pb_pb";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -96,19 +97,50 @@ export default class HavenoUtils {
|
|||||||
*
|
*
|
||||||
* @param {number} durationMs - the duration to wait for in milliseconds
|
* @param {number} durationMs - the duration to wait for in milliseconds
|
||||||
*/
|
*/
|
||||||
static async waitFor(durationMs: number) {
|
static async waitFor(durationMs: number) {
|
||||||
return new Promise(function(resolve) { setTimeout(resolve, durationMs); });
|
return new Promise(function(resolve) { setTimeout(resolve, durationMs); });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Divide one bigint by another.
|
* Convert XMR to atomic units.
|
||||||
*
|
*
|
||||||
* @param {bigint} a dividend
|
* @param {number | string} amountXmr - amount in XMR to convert to atomic units
|
||||||
* @param {bigint} b divisor
|
* @return {bigint} amount in atomic units
|
||||||
|
*/
|
||||||
|
static xmrToAtomicUnits(amountXmr: number | string): bigint {
|
||||||
|
return BigInt(new Decimal(amountXmr).mul(HavenoUtils.AU_PER_XMR.toString()).toFixed(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert atomic units to XMR.
|
||||||
|
*
|
||||||
|
* @param {bigint | string} amountAtomicUnits - amount in atomic units to convert to XMR
|
||||||
|
* @return {number} amount in XMR
|
||||||
|
*/
|
||||||
|
static atomicUnitsToXmr(amountAtomicUnits: bigint | string): number {
|
||||||
|
return new Decimal(amountAtomicUnits.toString()).div(HavenoUtils.AU_PER_XMR.toString()).toNumber();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Divide one atomic units by another.
|
||||||
|
*
|
||||||
|
* @param {bigint} au1 dividend
|
||||||
|
* @param {bigint} au2 divisor
|
||||||
* @returns {number} the result
|
* @returns {number} the result
|
||||||
*/
|
*/
|
||||||
static divideBI(a: bigint, b: bigint): number {
|
static divide(au1: bigint, au2: bigint): number {
|
||||||
return Number(a * 10000000000000n / b) / 10000000000000;
|
return this.atomicUnitsToXmr(au1) / this.atomicUnitsToXmr(au2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Multiply a bigint by a number or bigint.
|
||||||
|
*
|
||||||
|
* @param a bigint to multiply
|
||||||
|
* @param b bigint or number to multiply by
|
||||||
|
* @returns the product as a bigint
|
||||||
|
*/
|
||||||
|
static multiply(a: bigint, b: number | bigint): bigint {
|
||||||
|
return BigInt((new Decimal(a.toString()).mul(new Decimal(b.toString())).toFixed(0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -119,7 +151,7 @@ export default class HavenoUtils {
|
|||||||
* @returns {number} the percentage difference as a float
|
* @returns {number} the percentage difference as a float
|
||||||
*/
|
*/
|
||||||
static percentageDiff(a: bigint, b: bigint): number {
|
static percentageDiff(a: bigint, b: bigint): number {
|
||||||
return HavenoUtils.divideBI(a - b, a);
|
return HavenoUtils.divide(a - b, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -133,33 +165,14 @@ export default class HavenoUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert XMR to atomic units.
|
* Return the maximum of two bigints.
|
||||||
*
|
*
|
||||||
* @param {number | string} amountXmr - amount in XMR to convert to atomic units
|
* @param {bigint} bi1 first bigint
|
||||||
* @return {bigint} amount in atomic units
|
* @param {bigint} bi2 second bigint
|
||||||
|
* @returns {bigint} the maximum of the two bigints
|
||||||
*/
|
*/
|
||||||
static xmrToAtomicUnits(amountXmr: number | string): bigint {
|
static max(bi1: bigint, bi2: bigint): bigint {
|
||||||
if (typeof amountXmr === "number") amountXmr = "" + amountXmr;
|
return bi1 > bi2 ? bi1 : bi2;
|
||||||
let decimalDivisor = 1;
|
|
||||||
let decimalIdx = amountXmr.indexOf('.');
|
|
||||||
if (decimalIdx > -1) {
|
|
||||||
decimalDivisor = Math.pow(10, amountXmr.length - decimalIdx - 1);
|
|
||||||
amountXmr = amountXmr.slice(0, decimalIdx) + amountXmr.slice(decimalIdx + 1);
|
|
||||||
}
|
|
||||||
return BigInt(amountXmr) * BigInt(HavenoUtils.AU_PER_XMR) / BigInt(decimalDivisor);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert atomic units to XMR.
|
|
||||||
*
|
|
||||||
* @param {bigint | string} amountAtomicUnits - amount in atomic units to convert to XMR
|
|
||||||
* @return {number} amount in XMR
|
|
||||||
*/
|
|
||||||
static atomicUnitsToXmr(amountAtomicUnits: bigint | string) {
|
|
||||||
if (typeof amountAtomicUnits === "string") amountAtomicUnits = BigInt(amountAtomicUnits);
|
|
||||||
const quotient: bigint = amountAtomicUnits / HavenoUtils.AU_PER_XMR;
|
|
||||||
const remainder: bigint = amountAtomicUnits % HavenoUtils.AU_PER_XMR;
|
|
||||||
return Number(quotient) + Number(remainder) / Number(HavenoUtils.AU_PER_XMR);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------- PAYMENT ACCOUNT FORMS --------------------------
|
// ------------------------- PAYMENT ACCOUNT FORMS --------------------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user