@velocity-exchange/sdk 0.4.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/lib/browser/adminClient.d.ts +52 -0
- package/lib/browser/adminClient.js +97 -0
- package/lib/browser/config.js +6 -7
- package/lib/browser/constants/numericConstants.d.ts +1 -1
- package/lib/browser/constants/numericConstants.js +1 -1
- package/lib/browser/decode/user.js +5 -1
- package/lib/browser/idl/velocity.d.ts +191 -15
- package/lib/browser/idl/velocity.json +192 -16
- package/lib/browser/orderSubscriber/OrderSubscriber.d.ts +1 -0
- package/lib/browser/orderSubscriber/OrderSubscriber.js +10 -4
- package/lib/browser/pyth/pythLazerSubscriber.js +37 -27
- package/lib/browser/types.d.ts +6 -0
- package/lib/browser/user.d.ts +20 -3
- package/lib/browser/user.js +52 -4
- package/lib/browser/velocityClient.d.ts +46 -10
- package/lib/browser/velocityClient.js +107 -35
- package/lib/node/adminClient.d.ts +52 -0
- package/lib/node/adminClient.d.ts.map +1 -1
- package/lib/node/adminClient.js +97 -0
- package/lib/node/config.d.ts.map +1 -1
- package/lib/node/config.js +6 -7
- package/lib/node/constants/numericConstants.d.ts +1 -1
- package/lib/node/constants/numericConstants.d.ts.map +1 -1
- package/lib/node/constants/numericConstants.js +1 -1
- package/lib/node/decode/user.d.ts.map +1 -1
- package/lib/node/decode/user.js +5 -1
- package/lib/node/idl/velocity.d.ts +191 -15
- package/lib/node/idl/velocity.d.ts.map +1 -1
- package/lib/node/idl/velocity.json +192 -16
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts +1 -0
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts.map +1 -1
- package/lib/node/orderSubscriber/OrderSubscriber.js +10 -4
- package/lib/node/pyth/pythLazerSubscriber.d.ts.map +1 -1
- package/lib/node/pyth/pythLazerSubscriber.js +37 -27
- package/lib/node/types.d.ts +6 -0
- package/lib/node/types.d.ts.map +1 -1
- package/lib/node/user.d.ts +20 -3
- package/lib/node/user.d.ts.map +1 -1
- package/lib/node/user.js +52 -4
- package/lib/node/velocityClient.d.ts +46 -10
- package/lib/node/velocityClient.d.ts.map +1 -1
- package/lib/node/velocityClient.js +107 -35
- package/package.json +7 -3
- package/.prettierignore +0 -1
- package/CHANGELOG.md +0 -132
- package/build-browser.js +0 -58
- package/bunfig.toml +0 -3
- package/esbuild-shims.js +0 -12
- package/scripts/deposit-isolated-positions.ts +0 -110
- package/scripts/find-flagged-users.ts +0 -213
- package/scripts/grpc-client-test-comparison.ts +0 -372
- package/scripts/grpc-multiuser-client-test-comparison.ts +0 -158
- package/scripts/postbuild.js +0 -95
- package/scripts/single-grpc-client-test.ts +0 -284
- package/scripts/withdraw-isolated-positions.ts +0 -174
- package/src/accounts/README_WebSocketAccountSubscriberV2.md +0 -95
- package/src/accounts/README_WebSocketProgramAccountSubscriberV2.md +0 -135
- package/src/accounts/basicUserAccountSubscriber.ts +0 -79
- package/src/accounts/basicUserStatsAccountSubscriber.ts +0 -87
- package/src/accounts/bulkAccountLoader.ts +0 -358
- package/src/accounts/bulkUserStatsSubscription.ts +0 -40
- package/src/accounts/bulkUserSubscription.ts +0 -39
- package/src/accounts/customizedCadenceBulkAccountLoader.ts +0 -250
- package/src/accounts/fetch.ts +0 -200
- package/src/accounts/grpcAccountSubscriber.ts +0 -225
- package/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +0 -73
- package/src/accounts/grpcMultiAccountSubscriber.ts +0 -566
- package/src/accounts/grpcMultiUserAccountSubscriber.ts +0 -328
- package/src/accounts/grpcProgramAccountSubscriber.ts +0 -264
- package/src/accounts/grpcUserAccountSubscriber.ts +0 -63
- package/src/accounts/grpcUserStatsAccountSubscriber.ts +0 -65
- package/src/accounts/grpcVelocityClientAccountSubscriber.ts +0 -257
- package/src/accounts/grpcVelocityClientAccountSubscriberV2.ts +0 -941
- package/src/accounts/laserProgramAccountSubscriber.ts +0 -266
- package/src/accounts/oneShotUserAccountSubscriber.ts +0 -88
- package/src/accounts/oneShotUserStatsAccountSubscriber.ts +0 -94
- package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +0 -223
- package/src/accounts/pollingOracleAccountSubscriber.ts +0 -151
- package/src/accounts/pollingTokenAccountSubscriber.ts +0 -147
- package/src/accounts/pollingUserAccountSubscriber.ts +0 -198
- package/src/accounts/pollingUserStatsAccountSubscriber.ts +0 -180
- package/src/accounts/pollingVelocityClientAccountSubscriber.ts +0 -774
- package/src/accounts/testBulkAccountLoader.ts +0 -59
- package/src/accounts/types.ts +0 -428
- package/src/accounts/utils.ts +0 -90
- package/src/accounts/webSocketAccountSubscriber.ts +0 -304
- package/src/accounts/webSocketAccountSubscriberV2.ts +0 -536
- package/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +0 -171
- package/src/accounts/webSocketProgramAccountSubscriber.ts +0 -244
- package/src/accounts/webSocketProgramAccountSubscriberV2.ts +0 -1048
- package/src/accounts/webSocketProgramAccountsSubscriberV2.ts +0 -1042
- package/src/accounts/webSocketUserAccountSubscriber.ts +0 -139
- package/src/accounts/webSocketUserStatsAccountSubsriber.ts +0 -131
- package/src/accounts/webSocketVelocityClientAccountSubscriber.ts +0 -865
- package/src/accounts/webSocketVelocityClientAccountSubscriberV2.ts +0 -897
- package/src/accounts/websocketProgramUserAccountSubscriber.ts +0 -127
- package/src/addresses/marketAddresses.ts +0 -28
- package/src/addresses/pda.ts +0 -620
- package/src/adminClient.ts +0 -8136
- package/src/assert/assert.ts +0 -5
- package/src/auctionSubscriber/auctionSubscriber.ts +0 -86
- package/src/auctionSubscriber/auctionSubscriberGrpc.ts +0 -99
- package/src/auctionSubscriber/index.ts +0 -9
- package/src/auctionSubscriber/types.ts +0 -30
- package/src/bankrun/bankrunConnection.ts +0 -630
- package/src/blockhashSubscriber/BlockhashSubscriber.ts +0 -160
- package/src/blockhashSubscriber/index.ts +0 -6
- package/src/blockhashSubscriber/types.ts +0 -13
- package/src/clock/clockSubscriber.ts +0 -146
- package/src/config.ts +0 -312
- package/src/constants/index.ts +0 -9
- package/src/constants/numericConstants.ts +0 -194
- package/src/constants/perpMarkets.ts +0 -127
- package/src/constants/spotMarkets.ts +0 -104
- package/src/constants/txConstants.ts +0 -2
- package/src/constituentMap/constituentMap.ts +0 -305
- package/src/constituentMap/pollingConstituentAccountSubscriber.ts +0 -99
- package/src/constituentMap/webSocketConstituentAccountSubscriber.ts +0 -121
- package/src/core/VelocityCore.ts +0 -606
- package/src/core/index.ts +0 -12
- package/src/core/instructions/deposit.ts +0 -64
- package/src/core/instructions/fill.ts +0 -51
- package/src/core/instructions/funding.ts +0 -33
- package/src/core/instructions/liquidation.ts +0 -55
- package/src/core/instructions/orders.ts +0 -84
- package/src/core/instructions/perpOrders.ts +0 -312
- package/src/core/instructions/settlement.ts +0 -40
- package/src/core/instructions/trigger.ts +0 -41
- package/src/core/instructions/withdraw.ts +0 -65
- package/src/core/remainingAccounts.ts +0 -320
- package/src/core/signedMsg.ts +0 -109
- package/src/decode/customCoder.ts +0 -148
- package/src/decode/user.ts +0 -401
- package/src/dlob/DLOB.ts +0 -2793
- package/src/dlob/DLOBNode.ts +0 -305
- package/src/dlob/DLOBSubscriber.ts +0 -269
- package/src/dlob/NodeList.ts +0 -244
- package/src/dlob/orderBookLevels.ts +0 -695
- package/src/dlob/types.ts +0 -37
- package/src/events/eventList.ts +0 -114
- package/src/events/eventSubscriber.ts +0 -521
- package/src/events/eventsServerLogProvider.ts +0 -189
- package/src/events/fetchLogs.ts +0 -219
- package/src/events/parse.ts +0 -271
- package/src/events/pollingLogProvider.ts +0 -113
- package/src/events/sort.ts +0 -51
- package/src/events/txEventCache.ts +0 -92
- package/src/events/types.ts +0 -337
- package/src/events/webSocketLogProvider.ts +0 -152
- package/src/factory/bigNum.ts +0 -709
- package/src/factory/oracleClient.ts +0 -73
- package/src/idl/pyth.json +0 -142
- package/src/idl/pyth.ts +0 -97
- package/src/idl/pyth_solana_receiver.json +0 -628
- package/src/idl/token_faucet.json +0 -229
- package/src/idl/token_faucet.ts +0 -197
- package/src/idl/velocity.json +0 -23974
- package/src/idl/velocity.ts +0 -23980
- package/src/index.ts +0 -150
- package/src/indicative-quotes/indicativeQuotesSender.ts +0 -233
- package/src/isomorphic/README.md +0 -19
- package/src/isomorphic/anchor.browser.ts +0 -44
- package/src/isomorphic/anchor.node.ts +0 -1
- package/src/isomorphic/anchor.ts +0 -1
- package/src/isomorphic/anchor29.browser.ts +0 -24
- package/src/isomorphic/anchor29.node.ts +0 -1
- package/src/isomorphic/anchor29.ts +0 -1
- package/src/isomorphic/grpc.browser.ts +0 -4
- package/src/isomorphic/grpc.node.ts +0 -130
- package/src/isomorphic/grpc.ts +0 -1
- package/src/jupiter/jupiterClient.ts +0 -502
- package/src/keypair.ts +0 -32
- package/src/margin/README.md +0 -138
- package/src/marginCalculation.ts +0 -407
- package/src/marinade/idl/idl.json +0 -1962
- package/src/marinade/index.ts +0 -73
- package/src/marinade/types.ts +0 -3925
- package/src/math/amm.ts +0 -1758
- package/src/math/auction.ts +0 -480
- package/src/math/bankruptcy.ts +0 -138
- package/src/math/builder.ts +0 -130
- package/src/math/conversion.ts +0 -45
- package/src/math/exchangeStatus.ts +0 -261
- package/src/math/funding.ts +0 -498
- package/src/math/insurance.ts +0 -171
- package/src/math/liquidation.ts +0 -433
- package/src/math/margin.ts +0 -327
- package/src/math/market.ts +0 -487
- package/src/math/oracles.ts +0 -477
- package/src/math/orders.ts +0 -500
- package/src/math/position.ts +0 -381
- package/src/math/repeg.ts +0 -223
- package/src/math/spotBalance.ts +0 -996
- package/src/math/spotMarket.ts +0 -115
- package/src/math/spotPosition.ts +0 -263
- package/src/math/state.ts +0 -71
- package/src/math/superStake.ts +0 -602
- package/src/math/tiers.ts +0 -73
- package/src/math/trade.ts +0 -879
- package/src/math/utils.ts +0 -183
- package/src/memcmp.ts +0 -279
- package/src/oracles/oracleClientCache.ts +0 -41
- package/src/oracles/oracleId.ts +0 -99
- package/src/oracles/prelaunchOracleClient.ts +0 -63
- package/src/oracles/pythClient.ts +0 -125
- package/src/oracles/pythLazerClient.ts +0 -141
- package/src/oracles/quoteAssetOracleClient.ts +0 -43
- package/src/oracles/strictOraclePrice.ts +0 -40
- package/src/oracles/types.ts +0 -82
- package/src/oracles/utils.ts +0 -45
- package/src/orderParams.ts +0 -117
- package/src/orderSubscriber/OrderSubscriber.ts +0 -378
- package/src/orderSubscriber/PollingSubscription.ts +0 -50
- package/src/orderSubscriber/WebsocketSubscription.ts +0 -137
- package/src/orderSubscriber/grpcSubscription.ts +0 -155
- package/src/orderSubscriber/index.ts +0 -7
- package/src/orderSubscriber/types.ts +0 -64
- package/src/priorityFee/averageOverSlotsStrategy.ts +0 -17
- package/src/priorityFee/averageStrategy.ts +0 -13
- package/src/priorityFee/ewmaStrategy.ts +0 -51
- package/src/priorityFee/heliusPriorityFeeMethod.ts +0 -68
- package/src/priorityFee/index.ts +0 -16
- package/src/priorityFee/maxOverSlotsStrategy.ts +0 -18
- package/src/priorityFee/maxStrategy.ts +0 -8
- package/src/priorityFee/priorityFeeSubscriber.ts +0 -328
- package/src/priorityFee/priorityFeeSubscriberMap.ts +0 -134
- package/src/priorityFee/solanaPriorityFeeMethod.ts +0 -46
- package/src/priorityFee/types.ts +0 -82
- package/src/priorityFee/velocityPriorityFeeMethod.ts +0 -53
- package/src/pyth/constants.ts +0 -9
- package/src/pyth/index.ts +0 -15
- package/src/pyth/pythLazerSubscriber.ts +0 -365
- package/src/pyth/types.ts +0 -4451
- package/src/pyth/utils.ts +0 -13
- package/src/slot/SlotSubscriber.ts +0 -126
- package/src/slot/SlothashSubscriber.ts +0 -163
- package/src/swap/UnifiedSwapClient.ts +0 -315
- package/src/swift/grpcSignedMsgUserAccountSubscriber.ts +0 -81
- package/src/swift/index.ts +0 -10
- package/src/swift/signedMsgUserAccountSubscriber.ts +0 -251
- package/src/swift/swiftOrderSubscriber.ts +0 -351
- package/src/testClient.ts +0 -42
- package/src/titan/titanClient.ts +0 -438
- package/src/token/index.ts +0 -13
- package/src/tokenFaucet.ts +0 -296
- package/src/tx/baseTxSender.ts +0 -651
- package/src/tx/blockhashFetcher/baseBlockhashFetcher.ts +0 -31
- package/src/tx/blockhashFetcher/cachedBlockhashFetcher.ts +0 -105
- package/src/tx/blockhashFetcher/types.ts +0 -9
- package/src/tx/fastSingleTxSender.ts +0 -200
- package/src/tx/forwardOnlyTxSender.ts +0 -193
- package/src/tx/priorityFeeCalculator.ts +0 -117
- package/src/tx/reportTransactionError.ts +0 -176
- package/src/tx/retryTxSender.ts +0 -177
- package/src/tx/txHandler.ts +0 -1009
- package/src/tx/txParamProcessor.ts +0 -225
- package/src/tx/types.ts +0 -117
- package/src/tx/utils.ts +0 -133
- package/src/tx/whileValidTxSender.ts +0 -377
- package/src/types.ts +0 -2575
- package/src/user.ts +0 -5316
- package/src/userConfig.ts +0 -38
- package/src/userMap/PollingSubscription.ts +0 -61
- package/src/userMap/WebsocketSubscription.ts +0 -93
- package/src/userMap/grpcSubscription.ts +0 -93
- package/src/userMap/referrerMap.ts +0 -360
- package/src/userMap/revenueShareEscrowMap.ts +0 -342
- package/src/userMap/userMap.ts +0 -784
- package/src/userMap/userMapConfig.ts +0 -82
- package/src/userMap/userStatsMap.ts +0 -393
- package/src/userName.ts +0 -37
- package/src/userStats.ts +0 -159
- package/src/userStatsConfig.ts +0 -35
- package/src/util/TransactionConfirmationManager.ts +0 -333
- package/src/util/chainClock.ts +0 -65
- package/src/util/computeUnits.ts +0 -101
- package/src/util/digest.ts +0 -33
- package/src/util/ed25519Utils.ts +0 -95
- package/src/util/promiseTimeout.ts +0 -23
- package/src/velocityClient.ts +0 -14802
- package/src/velocityClientConfig.ts +0 -119
- package/src/wallet.ts +0 -91
- package/tests/VelocityCore/builder_escrow.test.ts +0 -121
- package/tests/VelocityCore/decode.test.ts +0 -16
- package/tests/VelocityCore/fill_trigger.test.ts +0 -73
- package/tests/VelocityCore/instructions.test.ts +0 -46
- package/tests/VelocityCore/pdas.test.ts +0 -30
- package/tests/VelocityCore/perp_orders.test.ts +0 -205
- package/tests/VelocityCore/remainingAccounts.test.ts +0 -72
- package/tests/VelocityCore/settlement_liquidation.test.ts +0 -69
- package/tests/accounts/customizedCadenceBulkAccountLoader.test.ts +0 -211
- package/tests/amm/test.ts +0 -2402
- package/tests/auctions/test.ts +0 -81
- package/tests/bn/test.ts +0 -355
- package/tests/builder/builderFee.test.ts +0 -42
- package/tests/ci/verifyConstants.ts +0 -393
- package/tests/decode/test.ts +0 -262
- package/tests/decode/userAccountBufferStrings.ts +0 -102
- package/tests/dlob/helpers.ts +0 -748
- package/tests/dlob/test.ts +0 -6969
- package/tests/dlob/tickSizeStandardization.ts +0 -545
- package/tests/events/parseLogsForCuUsage.ts +0 -139
- package/tests/exchangeStatus/test.ts +0 -45
- package/tests/insurance/test.ts +0 -40
- package/tests/liquidation/test.ts +0 -125
- package/tests/oracles/mmOracleGate.test.ts +0 -379
- package/tests/oracles/pythPegSnap.test.ts +0 -76
- package/tests/sdkParity/enumParity.test.ts +0 -84
- package/tests/sdkParity/marginCategoryFill.test.ts +0 -143
- package/tests/sdkParity/memcmpOffsets.test.ts +0 -139
- package/tests/spot/test.ts +0 -281
- package/tests/tx/TransactionConfirmationManager.test.ts +0 -312
- package/tests/tx/cachedBlockhashFetcher.test.ts +0 -96
- package/tests/tx/priorityFeeCalculator.ts +0 -77
- package/tests/tx/priorityFeeStrategy.ts +0 -95
- package/tests/user/bankruptcy.ts +0 -165
- package/tests/user/feeAndWithdrawLimits.ts +0 -284
- package/tests/user/getMarginCalculation.ts +0 -586
- package/tests/user/helpers.ts +0 -184
- package/tests/user/liquidations.ts +0 -129
- package/tests/user/marginCalculations.test.ts +0 -321
- package/tests/user/test.ts +0 -833
- package/tsconfig.browser.json +0 -18
- package/tsconfig.json +0 -36
package/src/factory/bigNum.ts
DELETED
|
@@ -1,709 +0,0 @@
|
|
|
1
|
-
import { BN } from '../isomorphic/anchor';
|
|
2
|
-
import { assert } from '../assert/assert';
|
|
3
|
-
import { ZERO } from './../constants/numericConstants';
|
|
4
|
-
|
|
5
|
-
export class BigNum {
|
|
6
|
-
val: BN;
|
|
7
|
-
precision: BN;
|
|
8
|
-
|
|
9
|
-
static delim = '.';
|
|
10
|
-
static spacer = ',';
|
|
11
|
-
|
|
12
|
-
public static setLocale(locale: string): void {
|
|
13
|
-
BigNum.delim = (1.1).toLocaleString(locale).slice(1, 2) || '.';
|
|
14
|
-
BigNum.spacer = (1000).toLocaleString(locale).slice(1, 2) || ',';
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
constructor(
|
|
18
|
-
val: BN | number | string,
|
|
19
|
-
precisionVal: BN | number | string = new BN(0)
|
|
20
|
-
) {
|
|
21
|
-
this.val = new BN(val);
|
|
22
|
-
this.precision = new BN(precisionVal);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
private bigNumFromParam(bn: BigNum | BN) {
|
|
26
|
-
return BN.isBN(bn) ? BigNum.from(bn) : bn;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
public add(bn: BigNum): BigNum {
|
|
30
|
-
assert(bn.precision.eq(this.precision), 'Adding unequal precisions');
|
|
31
|
-
|
|
32
|
-
return BigNum.from(this.val.add(bn.val), this.precision);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
public sub(bn: BigNum): BigNum {
|
|
36
|
-
assert(bn.precision.eq(this.precision), 'Subtracting unequal precisions');
|
|
37
|
-
|
|
38
|
-
return BigNum.from(this.val.sub(bn.val), this.precision);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
public mul(bn: BigNum | BN): BigNum {
|
|
42
|
-
const mulVal = this.bigNumFromParam(bn);
|
|
43
|
-
|
|
44
|
-
return BigNum.from(
|
|
45
|
-
this.val.mul(mulVal.val),
|
|
46
|
-
this.precision.add(mulVal.precision)
|
|
47
|
-
);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Multiplies by another big number then scales the result down by the big number's precision so that we're in the same precision space
|
|
52
|
-
* @param bn
|
|
53
|
-
* @returns
|
|
54
|
-
*/
|
|
55
|
-
public scalarMul(bn: BigNum | BN): BigNum {
|
|
56
|
-
if (BN.isBN(bn)) return BigNum.from(this.val.mul(bn), this.precision);
|
|
57
|
-
|
|
58
|
-
return BigNum.from(
|
|
59
|
-
this.val.mul(bn.val),
|
|
60
|
-
this.precision.add(bn.precision)
|
|
61
|
-
).shift(bn.precision.neg());
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
public div(bn: BigNum | BN): BigNum {
|
|
65
|
-
if (BN.isBN(bn)) return BigNum.from(this.val.div(bn), this.precision);
|
|
66
|
-
|
|
67
|
-
return BigNum.from(this.val.div(bn.val), this.precision.sub(bn.precision));
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Shift precision up or down
|
|
72
|
-
* @param exponent
|
|
73
|
-
* @param skipAdjustingPrecision
|
|
74
|
-
* @returns
|
|
75
|
-
*/
|
|
76
|
-
public shift(exponent: BN | number, skipAdjustingPrecision = false): BigNum {
|
|
77
|
-
const shiftVal = typeof exponent === 'number' ? new BN(exponent) : exponent;
|
|
78
|
-
|
|
79
|
-
return BigNum.from(
|
|
80
|
-
shiftVal.isNeg()
|
|
81
|
-
? this.val.div(new BN(10).pow(shiftVal))
|
|
82
|
-
: this.val.mul(new BN(10).pow(shiftVal)),
|
|
83
|
-
skipAdjustingPrecision ? this.precision : this.precision.add(shiftVal)
|
|
84
|
-
);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Shift to a target precision
|
|
89
|
-
* @param targetPrecision
|
|
90
|
-
* @returns
|
|
91
|
-
*/
|
|
92
|
-
public shiftTo(targetPrecision: BN): BigNum {
|
|
93
|
-
return this.shift(targetPrecision.sub(this.precision));
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Scale the number by a fraction
|
|
98
|
-
* @param numerator
|
|
99
|
-
* @param denominator
|
|
100
|
-
* @returns
|
|
101
|
-
*/
|
|
102
|
-
public scale(numerator: BN | number, denominator: BN | number): BigNum {
|
|
103
|
-
return this.mul(BigNum.from(new BN(numerator))).div(new BN(denominator));
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
public toPercentage(denominator: BigNum, precision: number): string {
|
|
107
|
-
return this.shift(precision)
|
|
108
|
-
.shift(2, true)
|
|
109
|
-
.div(denominator)
|
|
110
|
-
.toPrecision(precision);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
public gt(bn: BigNum | BN, ignorePrecision?: boolean): boolean {
|
|
114
|
-
const comparisonVal = this.bigNumFromParam(bn);
|
|
115
|
-
|
|
116
|
-
if (!ignorePrecision && !comparisonVal.eq(ZERO)) {
|
|
117
|
-
assert(
|
|
118
|
-
comparisonVal.precision.eq(this.precision),
|
|
119
|
-
'Trying to compare numbers with different precision. Yo can opt to ignore precision using the ignorePrecision parameter'
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return this.val.gt(comparisonVal.val);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
public lt(bn: BigNum | BN, ignorePrecision?: boolean): boolean {
|
|
127
|
-
const comparisonVal = this.bigNumFromParam(bn);
|
|
128
|
-
|
|
129
|
-
if (!ignorePrecision && !comparisonVal.val.eq(ZERO)) {
|
|
130
|
-
assert(
|
|
131
|
-
comparisonVal.precision.eq(this.precision),
|
|
132
|
-
'Trying to compare numbers with different precision. Yo can opt to ignore precision using the ignorePrecision parameter'
|
|
133
|
-
);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return this.val.lt(comparisonVal.val);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
public gte(bn: BigNum | BN, ignorePrecision?: boolean): boolean {
|
|
140
|
-
const comparisonVal = this.bigNumFromParam(bn);
|
|
141
|
-
|
|
142
|
-
if (!ignorePrecision && !comparisonVal.val.eq(ZERO)) {
|
|
143
|
-
assert(
|
|
144
|
-
comparisonVal.precision.eq(this.precision),
|
|
145
|
-
'Trying to compare numbers with different precision. Yo can opt to ignore precision using the ignorePrecision parameter'
|
|
146
|
-
);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
return this.val.gte(comparisonVal.val);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
public lte(bn: BigNum | BN, ignorePrecision?: boolean): boolean {
|
|
153
|
-
const comparisonVal = this.bigNumFromParam(bn);
|
|
154
|
-
|
|
155
|
-
if (!ignorePrecision && !comparisonVal.val.eq(ZERO)) {
|
|
156
|
-
assert(
|
|
157
|
-
comparisonVal.precision.eq(this.precision),
|
|
158
|
-
'Trying to compare numbers with different precision. Yo can opt to ignore precision using the ignorePrecision parameter'
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
return this.val.lte(comparisonVal.val);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
public eq(bn: BigNum | BN, ignorePrecision?: boolean): boolean {
|
|
166
|
-
const comparisonVal = this.bigNumFromParam(bn);
|
|
167
|
-
|
|
168
|
-
if (!ignorePrecision && !comparisonVal.val.eq(ZERO)) {
|
|
169
|
-
assert(
|
|
170
|
-
comparisonVal.precision.eq(this.precision),
|
|
171
|
-
'Trying to compare numbers with different precision. Yo can opt to ignore precision using the ignorePrecision parameter'
|
|
172
|
-
);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
return this.val.eq(comparisonVal.val);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
public eqZero() {
|
|
179
|
-
return this.val.eq(ZERO);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
public gtZero() {
|
|
183
|
-
return this.val.gt(ZERO);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
public ltZero() {
|
|
187
|
-
return this.val.lt(ZERO);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
public gteZero() {
|
|
191
|
-
return this.val.gte(ZERO);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
public lteZero() {
|
|
195
|
-
return this.val.lte(ZERO);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
public abs(): BigNum {
|
|
199
|
-
return new BigNum(this.val.abs(), this.precision);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
public neg(): BigNum {
|
|
203
|
-
return new BigNum(this.val.neg(), this.precision);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
public toString = (base?: number | 'hex', length?: number): string =>
|
|
207
|
-
this.val.toString(base, length);
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* Pretty print the underlying value in human-readable form. Depends on precision being correct for the output string to be correct
|
|
211
|
-
* @returns
|
|
212
|
-
*/
|
|
213
|
-
public print(): string {
|
|
214
|
-
assert(
|
|
215
|
-
this.precision.gte(ZERO),
|
|
216
|
-
'Tried to print a BN with precision lower than zero'
|
|
217
|
-
);
|
|
218
|
-
|
|
219
|
-
const isNeg = this.isNeg();
|
|
220
|
-
const plainString = this.abs().toString();
|
|
221
|
-
const precisionNum = this.precision.toNumber();
|
|
222
|
-
|
|
223
|
-
// make a string with at least the precisionNum number of zeroes
|
|
224
|
-
let printString = [
|
|
225
|
-
...Array(this.precision.toNumber()).fill(0),
|
|
226
|
-
...plainString.split(''),
|
|
227
|
-
].join('');
|
|
228
|
-
|
|
229
|
-
// inject decimal
|
|
230
|
-
printString =
|
|
231
|
-
printString.substring(0, printString.length - precisionNum) +
|
|
232
|
-
BigNum.delim +
|
|
233
|
-
printString.substring(printString.length - precisionNum);
|
|
234
|
-
|
|
235
|
-
// remove leading zeroes
|
|
236
|
-
printString = printString.replace(/^0+/, '');
|
|
237
|
-
|
|
238
|
-
// add zero if leading delim
|
|
239
|
-
if (printString[0] === BigNum.delim) printString = `0${printString}`;
|
|
240
|
-
|
|
241
|
-
// Add minus if negative
|
|
242
|
-
if (isNeg) printString = `-${printString}`;
|
|
243
|
-
|
|
244
|
-
// remove trailing delim
|
|
245
|
-
if (printString[printString.length - 1] === BigNum.delim)
|
|
246
|
-
printString = printString.slice(0, printString.length - 1);
|
|
247
|
-
|
|
248
|
-
return printString;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
public prettyPrint(
|
|
252
|
-
useTradePrecision?: boolean,
|
|
253
|
-
precisionOverride?: number,
|
|
254
|
-
decimalOverride?: number
|
|
255
|
-
): string {
|
|
256
|
-
const [leftSide, rightSide] = this.printShort(
|
|
257
|
-
useTradePrecision,
|
|
258
|
-
precisionOverride
|
|
259
|
-
).split(BigNum.delim);
|
|
260
|
-
|
|
261
|
-
let formattedLeftSide = leftSide;
|
|
262
|
-
let formattedRightSide: string | undefined = rightSide;
|
|
263
|
-
|
|
264
|
-
// Apply decimal override if specified
|
|
265
|
-
if (decimalOverride !== undefined) {
|
|
266
|
-
if (decimalOverride === 0) {
|
|
267
|
-
formattedRightSide = undefined;
|
|
268
|
-
} else {
|
|
269
|
-
// If no decimal part exists, create one with zeros
|
|
270
|
-
const currentRightSide = rightSide || '';
|
|
271
|
-
// Pad with zeros if needed or truncate if too long
|
|
272
|
-
formattedRightSide = currentRightSide
|
|
273
|
-
.padEnd(decimalOverride, '0')
|
|
274
|
-
.substring(0, decimalOverride);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
const isNeg = formattedLeftSide.includes('-');
|
|
279
|
-
if (isNeg) {
|
|
280
|
-
formattedLeftSide = formattedLeftSide.replace('-', '');
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
let index = formattedLeftSide.length - 3;
|
|
284
|
-
|
|
285
|
-
while (index >= 1) {
|
|
286
|
-
const formattedLeftSideArray = formattedLeftSide.split('');
|
|
287
|
-
|
|
288
|
-
formattedLeftSideArray.splice(index, 0, BigNum.spacer);
|
|
289
|
-
|
|
290
|
-
formattedLeftSide = formattedLeftSideArray.join('');
|
|
291
|
-
|
|
292
|
-
index -= 3;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
return `${isNeg ? '-' : ''}${formattedLeftSide}${
|
|
296
|
-
formattedRightSide ? `${BigNum.delim}${formattedRightSide}` : ''
|
|
297
|
-
}`;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
/**
|
|
301
|
-
* Print and remove unnecessary trailing zeroes
|
|
302
|
-
* @returns
|
|
303
|
-
*/
|
|
304
|
-
public printShort(
|
|
305
|
-
useTradePrecision?: boolean,
|
|
306
|
-
precisionOverride?: number
|
|
307
|
-
): string {
|
|
308
|
-
const printVal = precisionOverride
|
|
309
|
-
? this.toPrecision(precisionOverride)
|
|
310
|
-
: useTradePrecision
|
|
311
|
-
? this.toTradePrecision()
|
|
312
|
-
: this.print();
|
|
313
|
-
|
|
314
|
-
if (!printVal.includes(BigNum.delim)) return printVal;
|
|
315
|
-
|
|
316
|
-
return printVal.replace(/0+$/g, '').replace(/\.$/, '').replace(/,$/, '');
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
public debug() {
|
|
320
|
-
console.log(
|
|
321
|
-
`${this.toString()} | ${this.print()} | ${this.precision.toString()}`
|
|
322
|
-
);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Pretty print with the specified number of decimal places
|
|
327
|
-
* @param fixedPrecision
|
|
328
|
-
* @returns
|
|
329
|
-
*/
|
|
330
|
-
public toFixed(fixedPrecision: number, rounded = false): string {
|
|
331
|
-
if (rounded) {
|
|
332
|
-
return this.toRounded(fixedPrecision).toFixed(fixedPrecision);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
const printString = this.print();
|
|
336
|
-
|
|
337
|
-
const [leftSide, rightSide] = printString.split(BigNum.delim);
|
|
338
|
-
|
|
339
|
-
const filledRightSide = [
|
|
340
|
-
...(rightSide ?? '').slice(0, fixedPrecision),
|
|
341
|
-
...Array(fixedPrecision).fill('0'),
|
|
342
|
-
]
|
|
343
|
-
.slice(0, fixedPrecision)
|
|
344
|
-
.join('');
|
|
345
|
-
|
|
346
|
-
return `${leftSide}${BigNum.delim}${filledRightSide}`;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
private getZeroes(count: number) {
|
|
350
|
-
return new Array(Math.max(count, 0)).fill('0').join('');
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
public toRounded(roundingPrecision: number) {
|
|
354
|
-
const printString = this.toString();
|
|
355
|
-
|
|
356
|
-
let shouldRoundUp = false;
|
|
357
|
-
|
|
358
|
-
const roundingDigitChar = printString[roundingPrecision];
|
|
359
|
-
|
|
360
|
-
if (roundingDigitChar) {
|
|
361
|
-
const roundingDigitVal = Number(roundingDigitChar);
|
|
362
|
-
if (roundingDigitVal >= 5) shouldRoundUp = true;
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
if (shouldRoundUp) {
|
|
366
|
-
const valueWithRoundedPrecisionAdded = this.add(
|
|
367
|
-
BigNum.from(
|
|
368
|
-
new BN(10).pow(new BN(printString.length - roundingPrecision)),
|
|
369
|
-
this.precision
|
|
370
|
-
)
|
|
371
|
-
);
|
|
372
|
-
|
|
373
|
-
const roundedUpPrintString =
|
|
374
|
-
valueWithRoundedPrecisionAdded.toString().slice(0, roundingPrecision) +
|
|
375
|
-
this.getZeroes(printString.length - roundingPrecision);
|
|
376
|
-
|
|
377
|
-
return BigNum.from(roundedUpPrintString, this.precision);
|
|
378
|
-
} else {
|
|
379
|
-
const roundedDownPrintString =
|
|
380
|
-
printString.slice(0, roundingPrecision) +
|
|
381
|
-
this.getZeroes(printString.length - roundingPrecision);
|
|
382
|
-
|
|
383
|
-
return BigNum.from(roundedDownPrintString, this.precision);
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
/**
|
|
388
|
-
* Pretty print to the specified number of significant figures
|
|
389
|
-
* @param fixedPrecision
|
|
390
|
-
* @returns
|
|
391
|
-
*/
|
|
392
|
-
public toPrecision(
|
|
393
|
-
fixedPrecision: number,
|
|
394
|
-
trailingZeroes = false,
|
|
395
|
-
rounded = false
|
|
396
|
-
): string {
|
|
397
|
-
if (rounded) {
|
|
398
|
-
return this.toRounded(fixedPrecision).toPrecision(
|
|
399
|
-
fixedPrecision,
|
|
400
|
-
trailingZeroes
|
|
401
|
-
);
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
const isNeg = this.isNeg();
|
|
405
|
-
const printString = this.abs().print();
|
|
406
|
-
const thisString = this.abs().toString();
|
|
407
|
-
|
|
408
|
-
// Handle small numbers (those with leading zeros after decimal)
|
|
409
|
-
if (printString.includes(BigNum.delim)) {
|
|
410
|
-
const [leftSide, rightSide] = printString.split(BigNum.delim);
|
|
411
|
-
if (leftSide === '0' && rightSide) {
|
|
412
|
-
// Count leading zeros
|
|
413
|
-
let leadingZeros = 0;
|
|
414
|
-
for (let i = 0; i < rightSide.length; i++) {
|
|
415
|
-
if (rightSide[i] === '0') {
|
|
416
|
-
leadingZeros++;
|
|
417
|
-
} else {
|
|
418
|
-
break;
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
// Get significant digits starting after leading zeros
|
|
422
|
-
const significantPart = rightSide.slice(leadingZeros);
|
|
423
|
-
let significantDigits = significantPart.slice(0, fixedPrecision);
|
|
424
|
-
|
|
425
|
-
// Remove trailing zeros if not requested
|
|
426
|
-
if (!trailingZeroes) {
|
|
427
|
-
significantDigits = significantDigits.replace(/0+$/, '');
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
// Only return result if we have significant digits
|
|
431
|
-
if (significantDigits.length > 0) {
|
|
432
|
-
const result = `${isNeg ? '-' : ''}0${BigNum.delim}${rightSide.slice(
|
|
433
|
-
0,
|
|
434
|
-
leadingZeros
|
|
435
|
-
)}${significantDigits}`;
|
|
436
|
-
return result;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
let precisionPrintString = printString.slice(0, fixedPrecision + 1);
|
|
442
|
-
|
|
443
|
-
if (
|
|
444
|
-
!printString.includes(BigNum.delim) &&
|
|
445
|
-
thisString.length < fixedPrecision
|
|
446
|
-
) {
|
|
447
|
-
const precisionMismatch = fixedPrecision - thisString.length;
|
|
448
|
-
return BigNum.from(
|
|
449
|
-
(isNeg ? '-' : '') + thisString + this.getZeroes(precisionMismatch),
|
|
450
|
-
precisionMismatch
|
|
451
|
-
).toPrecision(fixedPrecision, trailingZeroes);
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
if (
|
|
455
|
-
!precisionPrintString.includes(BigNum.delim) ||
|
|
456
|
-
precisionPrintString[precisionPrintString.length - 1] === BigNum.delim
|
|
457
|
-
) {
|
|
458
|
-
precisionPrintString = printString.slice(0, fixedPrecision);
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
const pointsOfPrecision = precisionPrintString.replace(
|
|
462
|
-
BigNum.delim,
|
|
463
|
-
''
|
|
464
|
-
).length;
|
|
465
|
-
|
|
466
|
-
if (pointsOfPrecision < fixedPrecision) {
|
|
467
|
-
precisionPrintString = [
|
|
468
|
-
...precisionPrintString.split(''),
|
|
469
|
-
...Array(fixedPrecision - pointsOfPrecision).fill('0'),
|
|
470
|
-
].join('');
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
if (!precisionPrintString.includes(BigNum.delim)) {
|
|
474
|
-
const delimFullStringLocation = printString.indexOf(BigNum.delim);
|
|
475
|
-
|
|
476
|
-
let skipExponent = false;
|
|
477
|
-
|
|
478
|
-
if (delimFullStringLocation === -1) {
|
|
479
|
-
// no decimal, not missing any precision
|
|
480
|
-
skipExponent = true;
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
if (
|
|
484
|
-
precisionPrintString[precisionPrintString.length - 1] === BigNum.delim
|
|
485
|
-
) {
|
|
486
|
-
// decimal is at end of string, not missing any precision, do nothing
|
|
487
|
-
skipExponent = true;
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
if (printString.indexOf(BigNum.delim) === fixedPrecision) {
|
|
491
|
-
// decimal is at end of string, not missing any precision, do nothing
|
|
492
|
-
skipExponent = true;
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
if (!skipExponent) {
|
|
496
|
-
const exponent = delimFullStringLocation - fixedPrecision;
|
|
497
|
-
if (trailingZeroes) {
|
|
498
|
-
precisionPrintString = `${precisionPrintString}${Array(exponent)
|
|
499
|
-
.fill('0')
|
|
500
|
-
.join('')}`;
|
|
501
|
-
} else {
|
|
502
|
-
precisionPrintString = `${precisionPrintString}e${exponent}`;
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
return `${isNeg ? '-' : ''}${precisionPrintString}`;
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
public toTradePrecision(rounded = false): string {
|
|
511
|
-
return this.toPrecision(6, true, rounded);
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
/**
|
|
515
|
-
* Print dollar formatted value. Defaults to fixed decimals two unless a given precision is given.
|
|
516
|
-
* @param useTradePrecision
|
|
517
|
-
* @param precisionOverride
|
|
518
|
-
* @returns
|
|
519
|
-
*/
|
|
520
|
-
public toNotional(
|
|
521
|
-
useTradePrecision?: boolean,
|
|
522
|
-
precisionOverride?: number,
|
|
523
|
-
decimalOverride?: number
|
|
524
|
-
): string {
|
|
525
|
-
const prefix = `${this.lt(BigNum.zero()) ? `-` : ``}$`;
|
|
526
|
-
|
|
527
|
-
const usingCustomPrecision =
|
|
528
|
-
true && (useTradePrecision || precisionOverride || decimalOverride);
|
|
529
|
-
|
|
530
|
-
let val = usingCustomPrecision
|
|
531
|
-
? this.prettyPrint(useTradePrecision, precisionOverride, decimalOverride)
|
|
532
|
-
: BigNum.fromPrint(this.toFixed(2), new BN(2)).prettyPrint();
|
|
533
|
-
|
|
534
|
-
// Append trailing zeroes out to 2 decimal places if not using custom precision
|
|
535
|
-
if (!usingCustomPrecision) {
|
|
536
|
-
const [_, rightSide] = val.split(BigNum.delim);
|
|
537
|
-
const trailingLength = rightSide?.length ?? 0;
|
|
538
|
-
|
|
539
|
-
if (trailingLength === 0) {
|
|
540
|
-
val = `${val}${BigNum.delim}00`;
|
|
541
|
-
} else if (trailingLength === 1) {
|
|
542
|
-
val = `${val}0`;
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
return `${prefix}${val.replace('-', '')}`;
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
public toMillified(
|
|
550
|
-
precision = 3,
|
|
551
|
-
rounded = false,
|
|
552
|
-
type: 'financial' | 'scientific' = 'financial'
|
|
553
|
-
): string {
|
|
554
|
-
if (rounded) {
|
|
555
|
-
return this.toRounded(precision).toMillified(precision);
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
const isNeg = this.isNeg();
|
|
559
|
-
|
|
560
|
-
const stringVal = this.abs().print();
|
|
561
|
-
|
|
562
|
-
const [leftSide] = stringVal.split(BigNum.delim);
|
|
563
|
-
|
|
564
|
-
if (!leftSide) {
|
|
565
|
-
return this.shift(new BN(precision)).toPrecision(precision, true);
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
if (leftSide.length <= precision) {
|
|
569
|
-
return this.toPrecision(precision);
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
if (leftSide.length <= 3) {
|
|
573
|
-
return this.shift(new BN(precision)).toPrecision(precision, true);
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
const unitTicks =
|
|
577
|
-
type === 'financial'
|
|
578
|
-
? ['', 'K', 'M', 'B', 'T', 'Q']
|
|
579
|
-
: ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];
|
|
580
|
-
// TODO -- handle nubers which are larger than the max unit tick
|
|
581
|
-
|
|
582
|
-
const unitNumber = Math.floor((leftSide.length - 1) / 3);
|
|
583
|
-
const unit = unitTicks[unitNumber];
|
|
584
|
-
|
|
585
|
-
let leadDigits = leftSide.slice(0, precision);
|
|
586
|
-
|
|
587
|
-
if (leadDigits.length < precision) {
|
|
588
|
-
leadDigits = [
|
|
589
|
-
...leadDigits.split(''),
|
|
590
|
-
...Array(precision - leadDigits.length).fill('0'),
|
|
591
|
-
].join('');
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
const decimalLocation = leftSide.length - 3 * unitNumber;
|
|
595
|
-
|
|
596
|
-
let leadString = '';
|
|
597
|
-
|
|
598
|
-
if (decimalLocation >= precision) {
|
|
599
|
-
leadString = `${leadDigits}`;
|
|
600
|
-
} else {
|
|
601
|
-
leadString = `${leadDigits.slice(0, decimalLocation)}${
|
|
602
|
-
BigNum.delim
|
|
603
|
-
}${leadDigits.slice(decimalLocation)}`;
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
return `${isNeg ? '-' : ''}${leadString}${unit}`;
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
public toJSON() {
|
|
610
|
-
return {
|
|
611
|
-
val: this.val.toString(),
|
|
612
|
-
precision: this.precision.toString(),
|
|
613
|
-
};
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
public isNeg() {
|
|
617
|
-
return this.lt(ZERO, true);
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
public isPos() {
|
|
621
|
-
return !this.isNeg();
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
/**
|
|
625
|
-
* Get the numerical value of the BigNum. This can break if the BigNum is too large.
|
|
626
|
-
* @returns
|
|
627
|
-
*/
|
|
628
|
-
public toNum() {
|
|
629
|
-
let printedValue = this.print();
|
|
630
|
-
|
|
631
|
-
// Must convert any non-US delimiters and spacers to US format before using parseFloat
|
|
632
|
-
if (BigNum.delim !== '.' || BigNum.spacer !== ',') {
|
|
633
|
-
printedValue = printedValue
|
|
634
|
-
.split('')
|
|
635
|
-
.map((char) => {
|
|
636
|
-
if (char === BigNum.delim) return '.';
|
|
637
|
-
if (char === BigNum.spacer) return ',';
|
|
638
|
-
return char;
|
|
639
|
-
})
|
|
640
|
-
.join('');
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
return parseFloat(printedValue);
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
static fromJSON(json: { val: string; precision: string }) {
|
|
647
|
-
return BigNum.from(new BN(json.val), new BN(json.precision));
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
/**
|
|
651
|
-
* Create a BigNum instance
|
|
652
|
-
* @param val
|
|
653
|
-
* @param precision
|
|
654
|
-
* @returns
|
|
655
|
-
*/
|
|
656
|
-
static from(
|
|
657
|
-
val: BN | number | string = ZERO,
|
|
658
|
-
precision?: BN | number | string
|
|
659
|
-
): BigNum {
|
|
660
|
-
assert(
|
|
661
|
-
new BN(precision ?? 0).lt(new BN(100)),
|
|
662
|
-
'Tried to create a bignum with precision higher than 10^100'
|
|
663
|
-
);
|
|
664
|
-
return new BigNum(val, precision);
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
/**
|
|
668
|
-
* Create a BigNum instance from a printed BigNum
|
|
669
|
-
* @param val
|
|
670
|
-
* @param precisionOverride
|
|
671
|
-
* @returns
|
|
672
|
-
*/
|
|
673
|
-
static fromPrint(val: string, precisionShift?: BN): BigNum {
|
|
674
|
-
// Handle empty number edge cases
|
|
675
|
-
if (!val) return BigNum.from(ZERO, precisionShift);
|
|
676
|
-
if (!val.replace(BigNum.delim, '')) {
|
|
677
|
-
return BigNum.from(ZERO, precisionShift);
|
|
678
|
-
}
|
|
679
|
-
if (val.includes('e'))
|
|
680
|
-
val = (+val).toFixed(precisionShift?.toNumber() ?? 9); // prevent small numbers e.g. 3.1e-8, use assume max precision 9 as default
|
|
681
|
-
|
|
682
|
-
const sides = val.split(BigNum.delim);
|
|
683
|
-
const rightSide = sides[1];
|
|
684
|
-
const leftSide = sides[0].replace(/\s/g, '');
|
|
685
|
-
const bnInput = `${leftSide ?? ''}${rightSide ?? ''}`;
|
|
686
|
-
|
|
687
|
-
const rawBn = new BN(bnInput);
|
|
688
|
-
|
|
689
|
-
const rightSideLength = rightSide?.length ?? 0;
|
|
690
|
-
|
|
691
|
-
const totalShift = precisionShift
|
|
692
|
-
? precisionShift.sub(new BN(rightSideLength))
|
|
693
|
-
: ZERO;
|
|
694
|
-
|
|
695
|
-
return BigNum.from(rawBn, precisionShift).shift(totalShift, true);
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
static max(a: BigNum, b: BigNum): BigNum {
|
|
699
|
-
return a.gt(b) ? a : b;
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
static min(a: BigNum, b: BigNum): BigNum {
|
|
703
|
-
return a.lt(b) ? a : b;
|
|
704
|
-
}
|
|
705
|
-
|
|
706
|
-
static zero(precision?: BN | number): BigNum {
|
|
707
|
-
return BigNum.from(0, precision);
|
|
708
|
-
}
|
|
709
|
-
}
|