@bitgo-beta/sdk-coin-sol 7.6.4-beta.677 → 7.6.4-beta.679
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/dist/cjs/src/lib/index.d.ts +1 -0
- package/dist/cjs/src/lib/index.d.ts.map +1 -1
- package/dist/cjs/src/lib/index.js +5 -2
- package/dist/cjs/src/lib/scaledUiAmount.d.ts +30 -0
- package/dist/cjs/src/lib/scaledUiAmount.d.ts.map +1 -0
- package/dist/cjs/src/lib/scaledUiAmount.js +112 -0
- package/dist/cjs/test/unit/scaledUiAmount.d.ts +2 -0
- package/dist/cjs/test/unit/scaledUiAmount.d.ts.map +1 -0
- package/dist/cjs/test/unit/scaledUiAmount.js +101 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/lib/index.d.ts +1 -0
- package/dist/esm/lib/index.d.ts.map +1 -1
- package/dist/esm/lib/index.js +2 -1
- package/dist/esm/lib/scaledUiAmount.d.ts +30 -0
- package/dist/esm/lib/scaledUiAmount.d.ts.map +1 -0
- package/dist/esm/lib/scaledUiAmount.js +108 -0
- package/package.json +7 -7
|
@@ -23,4 +23,5 @@ export { MessageBuilderFactory } from './messages';
|
|
|
23
23
|
export { explainSolTransaction, ExplainTransactionWasmOptions } from './explainTransactionWasm';
|
|
24
24
|
export { MintExtensionReadResult, extensionTypeNames, mapModeledExtensions, parseMintExtensions, readMintExtensions, } from './tokenExtensions';
|
|
25
25
|
export { ResolvePermissionlessThawResult, SolAccountFetcher, buildSolAccountConnection, resolvePermissionlessThaw, resolveTransferHookAccounts, } from './token2022Resolve';
|
|
26
|
+
export { rawToUiAmountString, uiAmountToRaw } from './scaledUiAmount';
|
|
26
27
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,+BAA+B,EAC/B,iBAAiB,EACjB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,+BAA+B,EAC/B,iBAAiB,EACjB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.resolveTransferHookAccounts = exports.resolvePermissionlessThaw = exports.buildSolAccountConnection = exports.readMintExtensions = exports.parseMintExtensions = exports.mapModeledExtensions = exports.extensionTypeNames = exports.explainSolTransaction = exports.MessageBuilderFactory = exports.Utils = exports.Interface = exports.WalletInitializationBuilder = exports.TransferBuilderV2 = exports.TransferBuilder = exports.TransactionBuilderFactory = exports.TransactionBuilder = exports.Transaction = exports.TokenTransferBuilder = exports.StakingWithdrawBuilder = exports.StakingRawMsgAuthorizeBuilder = exports.StakingDelegateBuilder = exports.StakingDeactivateBuilder = exports.StakingAuthorizeBuilder = exports.StakingActivateBuilder = exports.KeyPair = exports.CustomInstructionBuilder = exports.ConfidentialTransferBuilder = exports.CloseAtaBuilder = exports.AtaInitializationBuilder = void 0;
|
|
36
|
+
exports.uiAmountToRaw = exports.rawToUiAmountString = exports.resolveTransferHookAccounts = exports.resolvePermissionlessThaw = exports.buildSolAccountConnection = exports.readMintExtensions = exports.parseMintExtensions = exports.mapModeledExtensions = exports.extensionTypeNames = exports.explainSolTransaction = exports.MessageBuilderFactory = exports.Utils = exports.Interface = exports.WalletInitializationBuilder = exports.TransferBuilderV2 = exports.TransferBuilder = exports.TransactionBuilderFactory = exports.TransactionBuilder = exports.Transaction = exports.TokenTransferBuilder = exports.StakingWithdrawBuilder = exports.StakingRawMsgAuthorizeBuilder = exports.StakingDelegateBuilder = exports.StakingDeactivateBuilder = exports.StakingAuthorizeBuilder = exports.StakingActivateBuilder = exports.KeyPair = exports.CustomInstructionBuilder = exports.ConfidentialTransferBuilder = exports.CloseAtaBuilder = exports.AtaInitializationBuilder = void 0;
|
|
37
37
|
const Interface = __importStar(require("./iface"));
|
|
38
38
|
exports.Interface = Interface;
|
|
39
39
|
const Utils = __importStar(require("./utils"));
|
|
@@ -87,4 +87,7 @@ var token2022Resolve_1 = require("./token2022Resolve");
|
|
|
87
87
|
Object.defineProperty(exports, "buildSolAccountConnection", { enumerable: true, get: function () { return token2022Resolve_1.buildSolAccountConnection; } });
|
|
88
88
|
Object.defineProperty(exports, "resolvePermissionlessThaw", { enumerable: true, get: function () { return token2022Resolve_1.resolvePermissionlessThaw; } });
|
|
89
89
|
Object.defineProperty(exports, "resolveTransferHookAccounts", { enumerable: true, get: function () { return token2022Resolve_1.resolveTransferHookAccounts; } });
|
|
90
|
-
|
|
90
|
+
var scaledUiAmount_1 = require("./scaledUiAmount");
|
|
91
|
+
Object.defineProperty(exports, "rawToUiAmountString", { enumerable: true, get: function () { return scaledUiAmount_1.rawToUiAmountString; } });
|
|
92
|
+
Object.defineProperty(exports, "uiAmountToRaw", { enumerable: true, get: function () { return scaledUiAmount_1.uiAmountToRaw; } });
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFxQztBQXFCNUIsOEJBQVM7QUFwQmxCLCtDQUFpQztBQW9CYixzQkFBSztBQWxCekIsdUVBQXNFO0FBQTdELG9JQUFBLHdCQUF3QixPQUFBO0FBQ2pDLHFEQUFvRDtBQUEzQyxrSEFBQSxlQUFlLE9BQUE7QUFDeEIsNkVBQTRFO0FBQW5FLDBJQUFBLDJCQUEyQixPQUFBO0FBQ3BDLHVFQUFzRTtBQUE3RCxvSUFBQSx3QkFBd0IsT0FBQTtBQUNqQyxxQ0FBb0M7QUFBM0Isa0dBQUEsT0FBTyxPQUFBO0FBQ2hCLG1FQUFrRTtBQUF6RCxnSUFBQSxzQkFBc0IsT0FBQTtBQUMvQixxRUFBb0U7QUFBM0Qsa0lBQUEsdUJBQXVCLE9BQUE7QUFDaEMsdUVBQXNFO0FBQTdELG9JQUFBLHdCQUF3QixPQUFBO0FBQ2pDLG1FQUFrRTtBQUF6RCxnSUFBQSxzQkFBc0IsT0FBQTtBQUMvQixpRkFBZ0Y7QUFBdkUsOElBQUEsNkJBQTZCLE9BQUE7QUFDdEMsbUVBQWtFO0FBQXpELGdJQUFBLHNCQUFzQixPQUFBO0FBQy9CLCtEQUE4RDtBQUFyRCw0SEFBQSxvQkFBb0IsT0FBQTtBQUM3Qiw2Q0FBNEM7QUFBbkMsMEdBQUEsV0FBVyxPQUFBO0FBQ3BCLDJEQUEwRDtBQUFqRCx3SEFBQSxrQkFBa0IsT0FBQTtBQUMzQix5RUFBd0U7QUFBL0Qsc0lBQUEseUJBQXlCLE9BQUE7QUFDbEMscURBQW9EO0FBQTNDLGtIQUFBLGVBQWUsT0FBQTtBQUN4Qix5REFBd0Q7QUFBL0Msc0hBQUEsaUJBQWlCLE9BQUE7QUFDMUIsNkVBQTRFO0FBQW5FLDBJQUFBLDJCQUEyQixPQUFBO0FBRXBDLHVDQUFtRDtBQUExQyxpSEFBQSxxQkFBcUIsT0FBQTtBQUM5QixtRUFBZ0c7QUFBdkYsK0hBQUEscUJBQXFCLE9BQUE7QUFDOUIscURBTTJCO0FBSnpCLHFIQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHVIQUFBLG9CQUFvQixPQUFBO0FBQ3BCLHNIQUFBLG1CQUFtQixPQUFBO0FBQ25CLHFIQUFBLGtCQUFrQixPQUFBO0FBRXBCLHVEQU00QjtBQUgxQiw2SEFBQSx5QkFBeUIsT0FBQTtBQUN6Qiw2SEFBQSx5QkFBeUIsT0FBQTtBQUN6QiwrSEFBQSwyQkFBMkIsT0FBQTtBQUU3QixtREFBc0U7QUFBN0QscUhBQUEsbUJBQW1CLE9BQUE7QUFBRSwrR0FBQSxhQUFhLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBJbnRlcmZhY2UgZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IHsgQXRhSW5pdGlhbGl6YXRpb25CdWlsZGVyIH0gZnJvbSAnLi9hdGFJbml0aWFsaXphdGlvbkJ1aWxkZXInO1xuZXhwb3J0IHsgQ2xvc2VBdGFCdWlsZGVyIH0gZnJvbSAnLi9jbG9zZUF0YUJ1aWxkZXInO1xuZXhwb3J0IHsgQ29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi9jb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXInO1xuZXhwb3J0IHsgQ3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9jdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXInO1xuZXhwb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5leHBvcnQgeyBTdGFraW5nQWN0aXZhdGVCdWlsZGVyIH0gZnJvbSAnLi9zdGFraW5nQWN0aXZhdGVCdWlsZGVyJztcbmV4cG9ydCB7IFN0YWtpbmdBdXRob3JpemVCdWlsZGVyIH0gZnJvbSAnLi9zdGFraW5nQXV0aG9yaXplQnVpbGRlcic7XG5leHBvcnQgeyBTdGFraW5nRGVhY3RpdmF0ZUJ1aWxkZXIgfSBmcm9tICcuL3N0YWtpbmdEZWFjdGl2YXRlQnVpbGRlcic7XG5leHBvcnQgeyBTdGFraW5nRGVsZWdhdGVCdWlsZGVyIH0gZnJvbSAnLi9zdGFraW5nRGVsZWdhdGVCdWlsZGVyJztcbmV4cG9ydCB7IFN0YWtpbmdSYXdNc2dBdXRob3JpemVCdWlsZGVyIH0gZnJvbSAnLi9zdGFraW5nUmF3TXNnQXV0aG9yaXplQnVpbGRlcic7XG5leHBvcnQgeyBTdGFraW5nV2l0aGRyYXdCdWlsZGVyIH0gZnJvbSAnLi9zdGFraW5nV2l0aGRyYXdCdWlsZGVyJztcbmV4cG9ydCB7IFRva2VuVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi90b2tlblRyYW5zZmVyQnVpbGRlcic7XG5leHBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuZXhwb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuZXhwb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSc7XG5leHBvcnQgeyBUcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zZmVyQnVpbGRlcic7XG5leHBvcnQgeyBUcmFuc2ZlckJ1aWxkZXJWMiB9IGZyb20gJy4vdHJhbnNmZXJCdWlsZGVyVjInO1xuZXhwb3J0IHsgV2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyIH0gZnJvbSAnLi93YWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXInO1xuZXhwb3J0IHsgSW50ZXJmYWNlLCBVdGlscyB9O1xuZXhwb3J0IHsgTWVzc2FnZUJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9tZXNzYWdlcyc7XG5leHBvcnQgeyBleHBsYWluU29sVHJhbnNhY3Rpb24sIEV4cGxhaW5UcmFuc2FjdGlvbldhc21PcHRpb25zIH0gZnJvbSAnLi9leHBsYWluVHJhbnNhY3Rpb25XYXNtJztcbmV4cG9ydCB7XG4gIE1pbnRFeHRlbnNpb25SZWFkUmVzdWx0LFxuICBleHRlbnNpb25UeXBlTmFtZXMsXG4gIG1hcE1vZGVsZWRFeHRlbnNpb25zLFxuICBwYXJzZU1pbnRFeHRlbnNpb25zLFxuICByZWFkTWludEV4dGVuc2lvbnMsXG59IGZyb20gJy4vdG9rZW5FeHRlbnNpb25zJztcbmV4cG9ydCB7XG4gIFJlc29sdmVQZXJtaXNzaW9ubGVzc1RoYXdSZXN1bHQsXG4gIFNvbEFjY291bnRGZXRjaGVyLFxuICBidWlsZFNvbEFjY291bnRDb25uZWN0aW9uLFxuICByZXNvbHZlUGVybWlzc2lvbmxlc3NUaGF3LFxuICByZXNvbHZlVHJhbnNmZXJIb29rQWNjb3VudHMsXG59IGZyb20gJy4vdG9rZW4yMDIyUmVzb2x2ZSc7XG5leHBvcnQgeyByYXdUb1VpQW1vdW50U3RyaW5nLCB1aUFtb3VudFRvUmF3IH0gZnJvbSAnLi9zY2FsZWRVaUFtb3VudCc7XG4iXX0=
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 BitGo, Inc. All Rights Reserved.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Convert a raw base-unit amount to its scaled UI denomination.
|
|
6
|
+
*
|
|
7
|
+
* Exact by construction: the result is `raw * multiplier / 10^decimals`, whose
|
|
8
|
+
* exact decimal expansion never exceeds `multiplier scale + decimals` fraction
|
|
9
|
+
* digits, so no rounding ever occurs.
|
|
10
|
+
*
|
|
11
|
+
* @param raw Amount in raw base units (integer, >= 0)
|
|
12
|
+
* @param multiplier The mint's UiAmountMultiplier as a decimal string (> 0)
|
|
13
|
+
* @param decimals The mint's decimals (>= 0)
|
|
14
|
+
* @returns The exact UI amount as a decimal string
|
|
15
|
+
* @throws if any argument is malformed, the multiplier is not positive, or raw/decimals are negative
|
|
16
|
+
*/
|
|
17
|
+
export declare function rawToUiAmountString(raw: bigint, multiplier: string, decimals: number): string;
|
|
18
|
+
/**
|
|
19
|
+
* Convert a scaled UI denomination to raw base units. Inverse of
|
|
20
|
+
* {@link rawToUiAmountString}: flooring an exact ui string reproduces the
|
|
21
|
+
* original raw amount.
|
|
22
|
+
*
|
|
23
|
+
* @param uiAmount The UI amount as a decimal string (>= 0)
|
|
24
|
+
* @param multiplier The mint's UiAmountMultiplier as a decimal string (> 0)
|
|
25
|
+
* @param decimals The mint's decimals (>= 0)
|
|
26
|
+
* @returns The raw amount in base units, floored to the integer unit
|
|
27
|
+
* @throws if any argument is malformed, the ui amount is negative, or the multiplier is not positive
|
|
28
|
+
*/
|
|
29
|
+
export declare function uiAmountToRaw(uiAmount: string, multiplier: string, decimals: number): bigint;
|
|
30
|
+
//# sourceMappingURL=scaledUiAmount.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaledUiAmount.d.ts","sourceRoot":"","sources":["../../../../src/lib/scaledUiAmount.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2DH;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiC7F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmB5F"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright 2026 BitGo, Inc. All Rights Reserved.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.rawToUiAmountString = rawToUiAmountString;
|
|
7
|
+
exports.uiAmountToRaw = uiAmountToRaw;
|
|
8
|
+
const DECIMAL_LITERAL_PATTERN = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/;
|
|
9
|
+
/**
|
|
10
|
+
* Parse an exact decimal string into scaled-integer parts. Rejects scientific
|
|
11
|
+
* notation, empty strings, NaN/Infinity, and non-numeric input.
|
|
12
|
+
*
|
|
13
|
+
* @param value The decimal literal, e.g. "0.001"; "1e-9" must be written as "0.000000001"
|
|
14
|
+
*/
|
|
15
|
+
function parseDecimal(value, what) {
|
|
16
|
+
if (typeof value !== 'string' || !DECIMAL_LITERAL_PATTERN.test(value)) {
|
|
17
|
+
throw new Error(`Invalid ${what} '${value}': expected a finite decimal string`);
|
|
18
|
+
}
|
|
19
|
+
const negative = value.startsWith('-');
|
|
20
|
+
const unsigned = negative || value.startsWith('+') ? value.slice(1) : value;
|
|
21
|
+
const [intPart = '0', fracPart = ''] = unsigned.split('.');
|
|
22
|
+
const digits = BigInt(intPart + fracPart || '0');
|
|
23
|
+
return { negative, digits, scale: fracPart.length };
|
|
24
|
+
}
|
|
25
|
+
/** Render ±digits/10^scale as a normalized decimal string (no trailing zeros, no "-0"). */
|
|
26
|
+
function toDecimalString({ negative, digits, scale }) {
|
|
27
|
+
if (digits === 0n) {
|
|
28
|
+
return '0';
|
|
29
|
+
}
|
|
30
|
+
let s = digits.toString().padStart(scale + 1, '0');
|
|
31
|
+
if (scale > 0) {
|
|
32
|
+
s = `${s.slice(0, -scale)}.${s.slice(-scale)}`;
|
|
33
|
+
s = s.replace(/0+$/, '').replace(/\.$/, '');
|
|
34
|
+
}
|
|
35
|
+
return negative ? `-${s}` : s;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Convert a raw base-unit amount to its scaled UI denomination.
|
|
39
|
+
*
|
|
40
|
+
* Exact by construction: the result is `raw * multiplier / 10^decimals`, whose
|
|
41
|
+
* exact decimal expansion never exceeds `multiplier scale + decimals` fraction
|
|
42
|
+
* digits, so no rounding ever occurs.
|
|
43
|
+
*
|
|
44
|
+
* @param raw Amount in raw base units (integer, >= 0)
|
|
45
|
+
* @param multiplier The mint's UiAmountMultiplier as a decimal string (> 0)
|
|
46
|
+
* @param decimals The mint's decimals (>= 0)
|
|
47
|
+
* @returns The exact UI amount as a decimal string
|
|
48
|
+
* @throws if any argument is malformed, the multiplier is not positive, or raw/decimals are negative
|
|
49
|
+
*/
|
|
50
|
+
function rawToUiAmountString(raw, multiplier, decimals) {
|
|
51
|
+
if (typeof raw !== 'bigint') {
|
|
52
|
+
throw new Error(`Invalid raw amount '${String(raw)}': expected a BigInt of base units`);
|
|
53
|
+
}
|
|
54
|
+
if (raw < 0n) {
|
|
55
|
+
throw new Error(`Invalid raw amount '${raw}': must be non-negative`);
|
|
56
|
+
}
|
|
57
|
+
if (!Number.isInteger(decimals) || decimals < 0) {
|
|
58
|
+
throw new Error(`Invalid decimals '${decimals}': must be a non-negative integer`);
|
|
59
|
+
}
|
|
60
|
+
const mult = parseDecimal(multiplier, 'multiplier');
|
|
61
|
+
if (mult.negative || mult.digits === 0n) {
|
|
62
|
+
throw new Error(`Invalid multiplier '${multiplier}': must be positive`);
|
|
63
|
+
}
|
|
64
|
+
// ui = raw * (multDigits / 10^multScale) / 10^decimals
|
|
65
|
+
// = (raw * multDigits) / 10^(multScale + decimals) — exact, terminating expansion
|
|
66
|
+
const numerator = raw * mult.digits;
|
|
67
|
+
const fractionDigits = mult.scale + decimals;
|
|
68
|
+
const denominator = 10n ** BigInt(fractionDigits);
|
|
69
|
+
const quotient = numerator / denominator;
|
|
70
|
+
const remainder = numerator % denominator;
|
|
71
|
+
if (remainder === 0n) {
|
|
72
|
+
return toDecimalString({ negative: false, digits: quotient, scale: 0 });
|
|
73
|
+
}
|
|
74
|
+
// The denominator IS 10^fractionDigits, so the exact fraction digits are `remainder`
|
|
75
|
+
// zero-padded to fractionDigits — no long division needed.
|
|
76
|
+
return toDecimalString({
|
|
77
|
+
negative: false,
|
|
78
|
+
digits: quotient * 10n ** BigInt(fractionDigits) + remainder,
|
|
79
|
+
scale: fractionDigits,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Convert a scaled UI denomination to raw base units. Inverse of
|
|
84
|
+
* {@link rawToUiAmountString}: flooring an exact ui string reproduces the
|
|
85
|
+
* original raw amount.
|
|
86
|
+
*
|
|
87
|
+
* @param uiAmount The UI amount as a decimal string (>= 0)
|
|
88
|
+
* @param multiplier The mint's UiAmountMultiplier as a decimal string (> 0)
|
|
89
|
+
* @param decimals The mint's decimals (>= 0)
|
|
90
|
+
* @returns The raw amount in base units, floored to the integer unit
|
|
91
|
+
* @throws if any argument is malformed, the ui amount is negative, or the multiplier is not positive
|
|
92
|
+
*/
|
|
93
|
+
function uiAmountToRaw(uiAmount, multiplier, decimals) {
|
|
94
|
+
if (!Number.isInteger(decimals) || decimals < 0) {
|
|
95
|
+
throw new Error(`Invalid decimals '${decimals}': must be a non-negative integer`);
|
|
96
|
+
}
|
|
97
|
+
const ui = parseDecimal(uiAmount, 'uiAmount');
|
|
98
|
+
if (ui.negative) {
|
|
99
|
+
throw new Error(`Invalid uiAmount '${uiAmount}': must be non-negative`);
|
|
100
|
+
}
|
|
101
|
+
const mult = parseDecimal(multiplier, 'multiplier');
|
|
102
|
+
if (mult.negative || mult.digits === 0n) {
|
|
103
|
+
throw new Error(`Invalid multiplier '${multiplier}': must be positive`);
|
|
104
|
+
}
|
|
105
|
+
// ui = uiDigits / 10^uiScale; multiplier = multDigits / 10^multScale
|
|
106
|
+
// raw = (uiDigits / 10^uiScale) * 10^decimals * (10^multScale / multDigits)
|
|
107
|
+
// = (uiDigits * 10^(decimals + multScale)) / (multDigits * 10^uiScale)
|
|
108
|
+
const numerator = ui.digits * 10n ** BigInt(decimals + mult.scale);
|
|
109
|
+
const denominator = mult.digits * 10n ** BigInt(ui.scale);
|
|
110
|
+
return numerator / denominator; // floor — raw base units are integers
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGVkVWlBbW91bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NjYWxlZFVpQW1vdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7QUF3RUgsa0RBaUNDO0FBYUQsc0NBbUJDO0FBOUdELE1BQU0sdUJBQXVCLEdBQUcsZ0NBQWdDLENBQUM7QUFFakU7Ozs7O0dBS0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFhLEVBQUUsSUFBWTtJQUMvQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssS0FBSyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sUUFBUSxHQUFHLFFBQVEsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDNUUsTUFBTSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUUsUUFBUSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxRQUFRLElBQUksR0FBRyxDQUFDLENBQUM7SUFDakQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN0RCxDQUFDO0FBRUQsMkZBQTJGO0FBQzNGLFNBQVMsZUFBZSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxL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QU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLFFBQVEsbUNBQW1DLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBQ0QsTUFBTSxFQUFFLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM5QyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixRQUFRLHlCQUF5QixDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDcEQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsVUFBVSxxQkFBcUIsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsNEVBQTRFO0lBQzVFLDJFQUEyRTtJQUMzRSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFELE9BQU8sU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDLHNDQUFzQztBQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAyNiBCaXRHbywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICovXG5cbi8qKlxuICogU29sYW5hIFRva2VuLTIwMjIgU2NhbGVkVWlBbW91bnQgY29udmVyc2lvbiB1dGlsaXRpZXMgKENTSExELTE2ODgpLlxuICpcbiAqIEEgc2NhbGVkLVVJIG1pbnQgY2FycmllcyBhIGBVaUFtb3VudE11bHRpcGxpZXJgLiBPbi1jaGFpbiAoYW5kIHRoZXJlZm9yZSBpblxuICogZXZlcnkgc2VuZC9idWlsZCBwYXRoIG9mIHRoaXMgU0RLKSBhbW91bnRzIGFyZSByYXcgYmFzZSB1bml0czsgdGhlIFVJXG4gKiBkZW5vbWluYXRpb24gaXMgYHJhdyAqIG11bHRpcGxpZXIgLyAxMF5kZWNpbWFsc2AsIG1hdGNoaW5nIHRoZSBTUExcbiAqIHRva2VuLTIwMjIgU2NhbGVkVWlBbW91bnQgZXh0ZW5zaW9uIHNlbWFudGljcy4gVGhlc2UgdXRpbGl0aWVzIGV4aXN0IGZvclxuICogZGlzcGxheSwgcmVjb25jaWxpYXRpb24sIGFuZCBiYWxhbmNlIGNvbnZlcnNpb25zIG9ubHkg4oCUIHRoZXkgbmV2ZXIgZmVlZFxuICogdHJhbnNhY3Rpb24gYnVpbGRpbmcsIHdoaWNoIHN0YXlzIHJhdy1kZW5vbWluYXRlZC5cbiAqXG4gKiBBbGwgYXJpdGhtZXRpYyBpcyBleGFjdCBzY2FsZWQtaW50ZWdlciAoQmlnSW50KSBtYXRoIOKAlCBmbG9hdHMgYXJlIG5ldmVyIHVzZWQsXG4gKiBzbyBjb252ZXJzaW9ucyBhcmUgZGV0ZXJtaW5pc3RpYyBhY3Jvc3MgcnVudGltZXMgYW5kIGxvc2Ugbm8gcHJlY2lzaW9uOlxuICogYHJhd1RvVWlBbW91bnRTdHJpbmdgIGlzIGFsd2F5cyBleGFjdCAodGhlIGRpdmlzb3IgaXMgYSBwb3dlciBvZiB0ZW4sIHNvIHRoZVxuICogZXhhY3QgZXhwYW5zaW9uIGZpdHMgd2l0aGluIGBtdWx0aXBsaWVyU2NhbGUgKyBkZWNpbWFsc2AgZnJhY3Rpb24gZGlnaXRzKS5cbiAqIGB1aUFtb3VudFRvUmF3YCBmbG9vcnMgdG8gYW4gaW50ZWdlciBudW1iZXIgb2YgYmFzZSB1bml0cyBhbmQgaXMgdGhlIGV4YWN0XG4gKiBpbnZlcnNlIG9mIGByYXdUb1VpQW1vdW50U3RyaW5nYCB3aGVuZXZlciB0aGUgdWkgc3RyaW5nIGlzIGV4YWN0LlxuICovXG5cbi8qKiBTaWduaWZpY2FuZCBhbmQgc2NhbGUgb2YgYSBkZWNpbWFsIGxpdGVyYWw6IHZhbHVlID0gwrFkaWdpdHMgLyAxMF5zY2FsZS4gKi9cbmludGVyZmFjZSBQYXJzZWREZWNpbWFsIHtcbiAgbmVnYXRpdmU6IGJvb2xlYW47XG4gIGRpZ2l0czogYmlnaW50O1xuICBzY2FsZTogbnVtYmVyO1xufVxuXG5jb25zdCBERUNJTUFMX0xJVEVSQUxfUEFUVEVSTiA9IC9eWystXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspJC87XG5cbi8qKlxuICogUGFyc2UgYW4gZXhhY3QgZGVjaW1hbCBzdHJpbmcgaW50byBzY2FsZWQtaW50ZWdlciBwYXJ0cy4gUmVqZWN0cyBzY2llbnRpZmljXG4gKiBub3RhdGlvbiwgZW1wdHkgc3RyaW5ncywgTmFOL0luZmluaXR5LCBhbmQgbm9uLW51bWVyaWMgaW5wdXQuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSBkZWNpbWFsIGxpdGVyYWwsIGUuZy4gXCIwLjAwMVwiOyBcIjFlLTlcIiBtdXN0IGJlIHdyaXR0ZW4gYXMgXCIwLjAwMDAwMDAwMVwiXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRGVjaW1hbCh2YWx1ZTogc3RyaW5nLCB3aGF0OiBzdHJpbmcpOiBQYXJzZWREZWNpbWFsIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgIURFQ0lNQUxfTElURVJBTF9QQVRURVJOLnRlc3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7d2hhdH0gJyR7dmFsdWV9JzogZXhwZWN0ZWQgYSBmaW5pdGUgZGVjaW1hbCBzdHJpbmdgKTtcbiAgfVxuICBjb25zdCBuZWdhdGl2ZSA9IHZhbHVlLnN0YXJ0c1dpdGgoJy0nKTtcbiAgY29uc3QgdW5zaWduZWQgPSBuZWdhdGl2ZSB8fCB2YWx1ZS5zdGFydHNXaXRoKCcrJykgPyB2YWx1ZS5zbGljZSgxKSA6IHZhbHVlO1xuICBjb25zdCBbaW50UGFydCA9ICcwJywgZnJhY1BhcnQgPSAnJ10gPSB1bnNpZ25lZC5zcGxpdCgnLicpO1xuICBjb25zdCBkaWdpdHMgPSBCaWdJbnQoaW50UGFydCArIGZyYWNQYXJ0IHx8ICcwJyk7XG4gIHJldHVybiB7IG5lZ2F0aXZlLCBkaWdpdHMsIHNjYWxlOiBmcmFjUGFydC5sZW5ndGggfTtcbn1cblxuLyoqIFJlbmRlciDCsWRpZ2l0cy8xMF5zY2FsZSBhcyBhIG5vcm1hbGl6ZWQgZGVjaW1hbCBzdHJpbmcgKG5vIHRyYWlsaW5nIHplcm9zLCBubyBcIi0wXCIpLiAqL1xuZnVuY3Rpb24gdG9EZWNpbWFsU3RyaW5nKHsgbmVnYXRpdmUsIGRpZ2l0cywgc2NhbGUgfTogUGFyc2VkRGVjaW1hbCk6IHN0cmluZyB7XG4gIGlmIChkaWdpdHMgPT09IDBuKSB7XG4gICAgcmV0dXJuICcwJztcbiAgfVxuICBsZXQgcyA9IGRpZ2l0cy50b1N0cmluZygpLnBhZFN0YXJ0KHNjYWxlICsgMSwgJzAnKTtcbiAgaWYgKHNjYWxlID4gMCkge1xuICAgIHMgPSBgJHtzLnNsaWNlKDAsIC1zY2FsZSl9LiR7cy5zbGljZSgtc2NhbGUpfWA7XG4gICAgcyA9IHMucmVwbGFjZSgvMCskLywgJycpLnJlcGxhY2UoL1xcLiQvLCAnJyk7XG4gIH1cbiAgcmV0dXJuIG5lZ2F0aXZlID8gYC0ke3N9YCA6IHM7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHJhdyBiYXNlLXVuaXQgYW1vdW50IHRvIGl0cyBzY2FsZWQgVUkgZGVub21pbmF0aW9uLlxuICpcbiAqIEV4YWN0IGJ5IGNvbnN0cnVjdGlvbjogdGhlIHJlc3VsdCBpcyBgcmF3ICogbXVsdGlwbGllciAvIDEwXmRlY2ltYWxzYCwgd2hvc2VcbiAqIGV4YWN0IGRlY2ltYWwgZXhwYW5zaW9uIG5ldmVyIGV4Y2VlZHMgYG11bHRpcGxpZXIgc2NhbGUgKyBkZWNpbWFsc2AgZnJhY3Rpb25cbiAqIGRpZ2l0cywgc28gbm8gcm91bmRpbmcgZXZlciBvY2N1cnMuXG4gKlxuICogQHBhcmFtIHJhdyBBbW91bnQgaW4gcmF3IGJhc2UgdW5pdHMgKGludGVnZXIsID49IDApXG4gKiBAcGFyYW0gbXVsdGlwbGllciBUaGUgbWludCdzIFVpQW1vdW50TXVsdGlwbGllciBhcyBhIGRlY2ltYWwgc3RyaW5nICg+IDApXG4gKiBAcGFyYW0gZGVjaW1hbHMgVGhlIG1pbnQncyBkZWNpbWFscyAoPj0gMClcbiAqIEByZXR1cm5zIFRoZSBleGFjdCBVSSBhbW91bnQgYXMgYSBkZWNpbWFsIHN0cmluZ1xuICogQHRocm93cyBpZiBhbnkgYXJndW1lbnQgaXMgbWFsZm9ybWVkLCB0aGUgbXVsdGlwbGllciBpcyBub3QgcG9zaXRpdmUsIG9yIHJhdy9kZWNpbWFscyBhcmUgbmVnYXRpdmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhd1RvVWlBbW91bnRTdHJpbmcocmF3OiBiaWdpbnQsIG11bHRpcGxpZXI6IHN0cmluZywgZGVjaW1hbHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgcmF3ICE9PSAnYmlnaW50Jykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByYXcgYW1vdW50ICcke1N0cmluZyhyYXcpfSc6IGV4cGVjdGVkIGEgQmlnSW50IG9mIGJhc2UgdW5pdHNgKTtcbiAgfVxuICBpZiAocmF3IDwgMG4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmF3IGFtb3VudCAnJHtyYXd9JzogbXVzdCBiZSBub24tbmVnYXRpdmVgKTtcbiAgfVxuICBpZiAoIU51bWJlci5pc0ludGVnZXIoZGVjaW1hbHMpIHx8IGRlY2ltYWxzIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkZWNpbWFscyAnJHtkZWNpbWFsc30nOiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgfVxuICBjb25zdCBtdWx0ID0gcGFyc2VEZWNpbWFsKG11bHRpcGxpZXIsICdtdWx0aXBsaWVyJyk7XG4gIGlmIChtdWx0Lm5lZ2F0aXZlIHx8IG11bHQuZGlnaXRzID09PSAwbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtdWx0aXBsaWVyICcke211bHRpcGxpZXJ9JzogbXVzdCBiZSBwb3NpdGl2ZWApO1xuICB9XG5cbiAgLy8gdWkgPSByYXcgKiAobXVsdERpZ2l0cyAvIDEwXm11bHRTY2FsZSkgLyAxMF5kZWNpbWFsc1xuICAvLyAgICA9IChyYXcgKiBtdWx0RGlnaXRzKSAvIDEwXihtdWx0U2NhbGUgKyBkZWNpbWFscykgICDigJQgZXhhY3QsIHRlcm1pbmF0aW5nIGV4cGFuc2lvblxuICBjb25zdCBudW1lcmF0b3IgPSByYXcgKiBtdWx0LmRpZ2l0cztcbiAgY29uc3QgZnJhY3Rpb25EaWdpdHMgPSBtdWx0LnNjYWxlICsgZGVjaW1hbHM7XG4gIGNvbnN0IGRlbm9taW5hdG9yID0gMTBuICoqIEJpZ0ludChmcmFjdGlvbkRpZ2l0cyk7XG5cbiAgY29uc3QgcXVvdGllbnQgPSBudW1lcmF0b3IgLyBkZW5vbWluYXRvcjtcbiAgY29uc3QgcmVtYWluZGVyID0gbnVtZXJhdG9yICUgZGVub21pbmF0b3I7XG4gIGlmIChyZW1haW5kZXIgPT09IDBuKSB7XG4gICAgcmV0dXJuIHRvRGVjaW1hbFN0cmluZyh7IG5lZ2F0aXZlOiBmYWxzZSwgZGlnaXRzOiBxdW90aWVudCwgc2NhbGU6IDAgfSk7XG4gIH1cbiAgLy8gVGhlIGRlbm9taW5hdG9yIElTIDEwXmZyYWN0aW9uRGlnaXRzLCBzbyB0aGUgZXhhY3QgZnJhY3Rpb24gZGlnaXRzIGFyZSBgcmVtYWluZGVyYFxuICAvLyB6ZXJvLXBhZGRlZCB0byBmcmFjdGlvbkRpZ2l0cyDigJQgbm8gbG9uZyBkaXZpc2lvbiBuZWVkZWQuXG4gIHJldHVybiB0b0RlY2ltYWxTdHJpbmcoe1xuICAgIG5lZ2F0aXZlOiBmYWxzZSxcbiAgICBkaWdpdHM6IHF1b3RpZW50ICogMTBuICoqIEJpZ0ludChmcmFjdGlvbkRpZ2l0cykgKyByZW1haW5kZXIsXG4gICAgc2NhbGU6IGZyYWN0aW9uRGlnaXRzLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgc2NhbGVkIFVJIGRlbm9taW5hdGlvbiB0byByYXcgYmFzZSB1bml0cy4gSW52ZXJzZSBvZlxuICoge0BsaW5rIHJhd1RvVWlBbW91bnRTdHJpbmd9OiBmbG9vcmluZyBhbiBleGFjdCB1aSBzdHJpbmcgcmVwcm9kdWNlcyB0aGVcbiAqIG9yaWdpbmFsIHJhdyBhbW91bnQuXG4gKlxuICogQHBhcmFtIHVpQW1vdW50IFRoZSBVSSBhbW91bnQgYXMgYSBkZWNpbWFsIHN0cmluZyAoPj0gMClcbiAqIEBwYXJhbSBtdWx0aXBsaWVyIFRoZSBtaW50J3MgVWlBbW91bnRNdWx0aXBsaWVyIGFzIGEgZGVjaW1hbCBzdHJpbmcgKD4gMClcbiAqIEBwYXJhbSBkZWNpbWFscyBUaGUgbWludCdzIGRlY2ltYWxzICg+PSAwKVxuICogQHJldHVybnMgVGhlIHJhdyBhbW91bnQgaW4gYmFzZSB1bml0cywgZmxvb3JlZCB0byB0aGUgaW50ZWdlciB1bml0XG4gKiBAdGhyb3dzIGlmIGFueSBhcmd1bWVudCBpcyBtYWxmb3JtZWQsIHRoZSB1aSBhbW91bnQgaXMgbmVnYXRpdmUsIG9yIHRoZSBtdWx0aXBsaWVyIGlzIG5vdCBwb3NpdGl2ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdWlBbW91bnRUb1Jhdyh1aUFtb3VudDogc3RyaW5nLCBtdWx0aXBsaWVyOiBzdHJpbmcsIGRlY2ltYWxzOiBudW1iZXIpOiBiaWdpbnQge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIoZGVjaW1hbHMpIHx8IGRlY2ltYWxzIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkZWNpbWFscyAnJHtkZWNpbWFsc30nOiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgfVxuICBjb25zdCB1aSA9IHBhcnNlRGVjaW1hbCh1aUFtb3VudCwgJ3VpQW1vdW50Jyk7XG4gIGlmICh1aS5uZWdhdGl2ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1aUFtb3VudCAnJHt1aUFtb3VudH0nOiBtdXN0IGJlIG5vbi1uZWdhdGl2ZWApO1xuICB9XG4gIGNvbnN0IG11bHQgPSBwYXJzZURlY2ltYWwobXVsdGlwbGllciwgJ211bHRpcGxpZXInKTtcbiAgaWYgKG11bHQubmVnYXRpdmUgfHwgbXVsdC5kaWdpdHMgPT09IDBuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG11bHRpcGxpZXIgJyR7bXVsdGlwbGllcn0nOiBtdXN0IGJlIHBvc2l0aXZlYCk7XG4gIH1cblxuICAvLyB1aSA9IHVpRGlnaXRzIC8gMTBedWlTY2FsZTsgIG11bHRpcGxpZXIgPSBtdWx0RGlnaXRzIC8gMTBebXVsdFNjYWxlXG4gIC8vIHJhdyA9ICh1aURpZ2l0cyAvIDEwXnVpU2NhbGUpICogMTBeZGVjaW1hbHMgKiAoMTBebXVsdFNjYWxlIC8gbXVsdERpZ2l0cylcbiAgLy8gICAgID0gKHVpRGlnaXRzICogMTBeKGRlY2ltYWxzICsgbXVsdFNjYWxlKSkgLyAobXVsdERpZ2l0cyAqIDEwXnVpU2NhbGUpXG4gIGNvbnN0IG51bWVyYXRvciA9IHVpLmRpZ2l0cyAqIDEwbiAqKiBCaWdJbnQoZGVjaW1hbHMgKyBtdWx0LnNjYWxlKTtcbiAgY29uc3QgZGVub21pbmF0b3IgPSBtdWx0LmRpZ2l0cyAqIDEwbiAqKiBCaWdJbnQodWkuc2NhbGUpO1xuICByZXR1cm4gbnVtZXJhdG9yIC8gZGVub21pbmF0b3I7IC8vIGZsb29yIOKAlCByYXcgYmFzZSB1bml0cyBhcmUgaW50ZWdlcnNcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaledUiAmount.d.ts","sourceRoot":"","sources":["../../../../test/unit/scaledUiAmount.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require("should");
|
|
4
|
+
const scaledUiAmount_1 = require("../../src/lib/scaledUiAmount");
|
|
5
|
+
describe('Sol ScaledUiAmount conversions', function () {
|
|
6
|
+
describe('rawToUiAmountString', function () {
|
|
7
|
+
it('converts raw to UI with multiplier 1 (identity denomination)', function () {
|
|
8
|
+
(0, scaledUiAmount_1.rawToUiAmountString)(1000000000n, '1', 9).should.equal('1');
|
|
9
|
+
(0, scaledUiAmount_1.rawToUiAmountString)(1n, '1', 9).should.equal('0.000000001');
|
|
10
|
+
(0, scaledUiAmount_1.rawToUiAmountString)(0n, '1', 9).should.equal('0');
|
|
11
|
+
});
|
|
12
|
+
it('converts raw to UI with multiplier 0.001', function () {
|
|
13
|
+
// 10^9 raw * 0.001 / 10^9 = 0.001
|
|
14
|
+
(0, scaledUiAmount_1.rawToUiAmountString)(1000000000n, '0.001', 9).should.equal('0.001');
|
|
15
|
+
// 1 raw * 0.001 / 10^9 = 10^-12
|
|
16
|
+
(0, scaledUiAmount_1.rawToUiAmountString)(1n, '0.001', 9).should.equal('0.000000000001');
|
|
17
|
+
});
|
|
18
|
+
it('converts raw to UI with multiplier 1e-9 (ticket extreme)', function () {
|
|
19
|
+
// 10^9 raw * 10^-9 / 10^9 = 10^-9
|
|
20
|
+
(0, scaledUiAmount_1.rawToUiAmountString)(1000000000n, '0.000000001', 9).should.equal('0.000000001');
|
|
21
|
+
(0, scaledUiAmount_1.rawToUiAmountString)(1n, '0.000000001', 9).should.equal('0.000000000000000001');
|
|
22
|
+
});
|
|
23
|
+
it('handles multipliers greater than 1', function () {
|
|
24
|
+
// 2 raw * 1.5 / 10^2 = 0.03
|
|
25
|
+
(0, scaledUiAmount_1.rawToUiAmountString)(2n, '1.5', 2).should.equal('0.03');
|
|
26
|
+
// 100 raw * 12.5 / 10^2 = 12.5
|
|
27
|
+
(0, scaledUiAmount_1.rawToUiAmountString)(100n, '12.5', 2).should.equal('12.5');
|
|
28
|
+
});
|
|
29
|
+
it('normalizes trailing zeros', function () {
|
|
30
|
+
(0, scaledUiAmount_1.rawToUiAmountString)(500000000n, '1', 9).should.equal('0.5');
|
|
31
|
+
(0, scaledUiAmount_1.rawToUiAmountString)(1230000000n, '1', 9).should.equal('1.23');
|
|
32
|
+
});
|
|
33
|
+
it('rejects malformed inputs', function () {
|
|
34
|
+
(() => (0, scaledUiAmount_1.rawToUiAmountString)(-1n, '1', 9)).should.throw(/must be non-negative/);
|
|
35
|
+
(() => (0, scaledUiAmount_1.rawToUiAmountString)(1n, '0', 9)).should.throw(/must be positive/);
|
|
36
|
+
(() => (0, scaledUiAmount_1.rawToUiAmountString)(1n, '-0.001', 9)).should.throw(/must be positive/);
|
|
37
|
+
(() => (0, scaledUiAmount_1.rawToUiAmountString)(1n, '1e-9', 9)).should.throw(/finite decimal string/);
|
|
38
|
+
(() => (0, scaledUiAmount_1.rawToUiAmountString)(1n, 'abc', 9)).should.throw(/finite decimal string/);
|
|
39
|
+
(() => (0, scaledUiAmount_1.rawToUiAmountString)(1n, 'NaN', 9)).should.throw(/finite decimal string/);
|
|
40
|
+
(() => (0, scaledUiAmount_1.rawToUiAmountString)(1n, '1', -1)).should.throw(/non-negative integer/);
|
|
41
|
+
(() => (0, scaledUiAmount_1.rawToUiAmountString)(1n, '1', 1.5)).should.throw(/non-negative integer/);
|
|
42
|
+
// @ts-expect-error runtime guard against non-BigInt raw
|
|
43
|
+
(() => (0, scaledUiAmount_1.rawToUiAmountString)(1000, '1', 9)).should.throw(/BigInt of base units/);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('uiAmountToRaw', function () {
|
|
47
|
+
it('converts UI to raw with multiplier 1', function () {
|
|
48
|
+
(0, scaledUiAmount_1.uiAmountToRaw)('1', '1', 9).should.equal(1000000000n);
|
|
49
|
+
(0, scaledUiAmount_1.uiAmountToRaw)('0.000000001', '1', 9).should.equal(1n);
|
|
50
|
+
(0, scaledUiAmount_1.uiAmountToRaw)('0', '1', 9).should.equal(0n);
|
|
51
|
+
});
|
|
52
|
+
it('converts UI to raw with multiplier 0.001', function () {
|
|
53
|
+
(0, scaledUiAmount_1.uiAmountToRaw)('0.001', '0.001', 9).should.equal(1000000000n);
|
|
54
|
+
(0, scaledUiAmount_1.uiAmountToRaw)('0.000000000001', '0.001', 9).should.equal(1n);
|
|
55
|
+
});
|
|
56
|
+
it('converts UI to raw with multiplier 1e-9 (ticket extreme)', function () {
|
|
57
|
+
(0, scaledUiAmount_1.uiAmountToRaw)('0.000000001', '0.000000001', 9).should.equal(1000000000n);
|
|
58
|
+
(0, scaledUiAmount_1.uiAmountToRaw)('0.000000000000000001', '0.000000001', 9).should.equal(1n);
|
|
59
|
+
});
|
|
60
|
+
it('floors to integer base units', function () {
|
|
61
|
+
// 1.0000000005 UI * 10^9 = 1000000000.5 raw -> floors to 1000000000
|
|
62
|
+
(0, scaledUiAmount_1.uiAmountToRaw)('1.0000000005', '1', 9).should.equal(1000000000n);
|
|
63
|
+
});
|
|
64
|
+
it('rejects malformed inputs', function () {
|
|
65
|
+
(() => (0, scaledUiAmount_1.uiAmountToRaw)('-1', '1', 9)).should.throw(/must be non-negative/);
|
|
66
|
+
(() => (0, scaledUiAmount_1.uiAmountToRaw)('1', '0', 9)).should.throw(/must be positive/);
|
|
67
|
+
(() => (0, scaledUiAmount_1.uiAmountToRaw)('1e-9', '1', 9)).should.throw(/finite decimal string/);
|
|
68
|
+
(() => (0, scaledUiAmount_1.uiAmountToRaw)('1', '1', -1)).should.throw(/non-negative integer/);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('round-trip exactness at multiplier extremes', function () {
|
|
72
|
+
const multipliers = ['1', '0.001', '0.000000001', '1.5', '12.5'];
|
|
73
|
+
const rawAmounts = [
|
|
74
|
+
0n,
|
|
75
|
+
1n,
|
|
76
|
+
999n,
|
|
77
|
+
1000n,
|
|
78
|
+
123456789n,
|
|
79
|
+
1000000000n,
|
|
80
|
+
999999999999999999n,
|
|
81
|
+
10n ** 27n, // > u64 max supply, still exact
|
|
82
|
+
];
|
|
83
|
+
for (const multiplier of multipliers) {
|
|
84
|
+
it(`round-trips every raw amount through UI at multiplier ${multiplier}`, function () {
|
|
85
|
+
for (const raw of rawAmounts) {
|
|
86
|
+
const ui = (0, scaledUiAmount_1.rawToUiAmountString)(raw, multiplier, 9);
|
|
87
|
+
(0, scaledUiAmount_1.uiAmountToRaw)(ui, multiplier, 9).should.equal(raw);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
it('round-trips at decimals other than 9', function () {
|
|
92
|
+
for (const decimals of [0, 2, 6, 18]) {
|
|
93
|
+
for (const raw of rawAmounts) {
|
|
94
|
+
const ui = (0, scaledUiAmount_1.rawToUiAmountString)(raw, '0.001', decimals);
|
|
95
|
+
(0, scaledUiAmount_1.uiAmountToRaw)(ui, '0.001', decimals).should.equal(raw);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGVkVWlBbW91bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvc2NhbGVkVWlBbW91bnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQkFBZ0I7QUFDaEIsaUVBQWtGO0FBRWxGLFFBQVEsQ0FBQyxnQ0FBZ0MsRUFBRTtJQUN6QyxRQUFRLENBQUMscUJBQXFCLEVBQUU7UUFDOUIsRUFBRSxDQUFDLDhEQUE4RCxFQUFFO1lBQ2pFLElBQUEsb0NBQW1CLEVBQUMsV0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlELElBQUEsb0NBQW1CLEVBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzVELElBQUEsb0NBQW1CLEVBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFO1lBQzdDLGtDQUFrQztZQUNsQyxJQUFBLG9DQUFtQixFQUFDLFdBQWMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0RSxnQ0FBZ0M7WUFDaEMsSUFBQSxvQ0FBbUIsRUFBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwREFBMEQsRUFBRTtZQUM3RCxrQ0FBa0M7WUFDbEMsSUFBQSxvQ0FBbUIsRUFBQyxXQUFjLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxD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LFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNyQyxFQUFFLENBQUMseURBQXlELFVBQVUsRUFBRSxFQUFFO2dCQUN4RSxLQUFLLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO29CQUM3QixNQUFNLEVBQUUsR0FBRyxJQUFBLG9DQUFtQixFQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ25ELElBQUEsOEJBQWEsRUFBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JELENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxFQUFFLENBQUMsc0NBQXNDLEVBQUU7WUFDekMsS0FBSyxNQUFNLFFBQVEsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLEtBQUssTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7b0JBQzdCLE1BQU0sRUFBRSxHQUFHLElBQUEsb0NBQW1CLEVBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDdkQsSUFBQSw4QkFBYSxFQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDekQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyByYXdUb1VpQW1vdW50U3RyaW5nLCB1aUFtb3VudFRvUmF3IH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9zY2FsZWRVaUFtb3VudCc7XG5cbmRlc2NyaWJlKCdTb2wgU2NhbGVkVWlBbW91bnQgY29udmVyc2lvbnMnLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdyYXdUb1VpQW1vdW50U3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdjb252ZXJ0cyByYXcgdG8gVUkgd2l0aCBtdWx0aXBsaWVyIDEgKGlkZW50aXR5IGRlbm9taW5hdGlvbiknLCBmdW5jdGlvbiAoKSB7XG4gICAgICByYXdUb1VpQW1vdW50U3RyaW5nKDFfMDAwXzAwMF8wMDBuLCAnMScsIDkpLnNob3VsZC5lcXVhbCgnMScpO1xuICAgICAgcmF3VG9VaUFtb3VudFN0cmluZygxbiwgJzEnLCA5KS5zaG91bGQuZXF1YWwoJzAuMDAwMDAwMDAxJyk7XG4gICAgICByYXdUb1VpQW1vdW50U3RyaW5nKDBuLCAnMScsIDkpLnNob3VsZC5lcXVhbCgnMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvbnZlcnRzIHJhdyB0byBVSSB3aXRoIG11bHRpcGxpZXIgMC4wMDEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyAxMF45IHJhdyAqIDAuMDAxIC8gMTBeOSA9IDAuMDAxXG4gICAgICByYXdUb1VpQW1vdW50U3RyaW5nKDFfMDAwXzAwMF8wMDBuLCAnMC4wMDEnLCA5KS5zaG91bGQuZXF1YWwoJzAuMDAxJyk7XG4gICAgICAvLyAxIHJhdyAqIDAuMDAxIC8gMTBeOSA9IDEwXi0xMlxuICAgICAgcmF3VG9VaUFtb3VudFN0cmluZygxbiwgJzAuMDAxJywgOSkuc2hvdWxkLmVxdWFsKCcwLjAwMDAwMDAwMDAwMScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvbnZlcnRzIHJhdyB0byBVSSB3aXRoIG11bHRpcGxpZXIgMWUtOSAodGlja2V0IGV4dHJlbWUpJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gMTBeOSByYXcgKiAxMF4tOSAvIDEwXjkgPSAxMF4tOVxuICAgICAgcmF3VG9VaUFtb3VudFN0cmluZygxXzAwMF8wMDBfMDAwbiwgJzAuMDAwMDAwMDAxJywgOSkuc2hvdWxkLmVxdWFsKCcwLjAwMDAwMDAwMScpO1xuICAgICAgcmF3VG9VaUFtb3VudFN0cmluZygxbiwgJzAuMDAwMDAwMDAxJywgOSkuc2hvdWxkLmVxdWFsKCcwLjAwMDAwMDAwMDAwMDAwMDAwMScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbXVsdGlwbGllcnMgZ3JlYXRlciB0aGFuIDEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyAyIHJhdyAqIDEuNSAvIDEwXjIgPSAwLjAzXG4gICAgICByYXdUb1VpQW1vdW50U3RyaW5nKDJuLCAnMS41JywgMikuc2hvdWxkLmVxdWFsKCcwLjAzJyk7XG4gICAgICAvLyAxMDAgcmF3ICogMTIuNSAvIDEwXjIgPSAxMi41XG4gICAgICByYXdUb1VpQW1vdW50U3RyaW5nKDEwMG4sICcxMi41JywgMikuc2hvdWxkLmVxdWFsKCcxMi41Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnbm9ybWFsaXplcyB0cmFpbGluZyB6ZXJvcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJhd1RvVWlBbW91bnRTdHJpbmcoNTAwXzAwMF8wMDBuLCAnMScsIDkpLnNob3VsZC5lcXVhbCgnMC41Jyk7XG4gICAgICByYXdUb1VpQW1vdW50U3RyaW5nKDFfMjMwXzAwMF8wMDBuLCAnMScsIDkpLnNob3VsZC5lcXVhbCgnMS4yMycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgbWFsZm9ybWVkIGlucHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICgoKSA9PiByYXdUb1VpQW1vdW50U3RyaW5nKC0xbiwgJzEnLCA5KSkuc2hvdWxkLnRocm93KC9tdXN0IGJlIG5vbi1uZWdhdGl2ZS8pO1xuICAgICAgKCgpID0+IHJhd1RvVWlBbW91bnRTdHJpbmcoMW4sICcwJywgOSkpLnNob3VsZC50aHJvdygvbXVzdCBiZSBwb3NpdGl2ZS8pO1xuICAgICAgKCgpID0+IHJhd1RvVWlBbW91bnRTdHJpbmcoMW4sICctMC4wMDEnLCA5KSkuc2hvdWxkLnRocm93KC9tdXN0IGJlIHBvc2l0aXZlLyk7XG4gICAgICAoKCkgPT4gcmF3VG9VaUFtb3VudFN0cmluZygxbiwgJzFlLTknLCA5KSkuc2hvdWxkLnRocm93KC9maW5pdGUgZGVjaW1hbCBzdHJpbmcvKTtcbiAgICAgICgoKSA9PiByYXdUb1VpQW1vdW50U3RyaW5nKDFuLCAnYWJjJywgOSkpLnNob3VsZC50aHJvdygvZmluaXRlIGRlY2ltYWwgc3RyaW5nLyk7XG4gICAgICAoKCkgPT4gcmF3VG9VaUFtb3VudFN0cmluZygxbiwgJ05hTicsIDkpKS5zaG91bGQudGhyb3coL2Zpbml0ZSBkZWNpbWFsIHN0cmluZy8pO1xuICAgICAgKCgpID0+IHJhd1RvVWlBbW91bnRTdHJpbmcoMW4sICcxJywgLTEpKS5zaG91bGQudGhyb3coL25vbi1uZWdhdGl2ZSBpbnRlZ2VyLyk7XG4gICAgICAoKCkgPT4gcmF3VG9VaUFtb3VudFN0cmluZygxbiwgJzEnLCAxLjUpKS5zaG91bGQudGhyb3coL25vbi1uZWdhdGl2ZSBpbnRlZ2VyLyk7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJ1bnRpbWUgZ3VhcmQgYWdhaW5zdCBub24tQmlnSW50IHJhd1xuICAgICAgKCgpID0+IHJhd1RvVWlBbW91bnRTdHJpbmcoMTAwMCwgJzEnLCA5KSkuc2hvdWxkLnRocm93KC9CaWdJbnQgb2YgYmFzZSB1bml0cy8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndWlBbW91bnRUb1JhdycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnY29udmVydHMgVUkgdG8gcmF3IHdpdGggbXVsdGlwbGllciAxJywgZnVuY3Rpb24gKCkge1xuICAgICAgdWlBbW91bnRUb1JhdygnMScsICcxJywgOSkuc2hvdWxkLmVxdWFsKDFfMDAwXzAwMF8wMDBuKTtcbiAgICAgIHVpQW1vdW50VG9SYXcoJzAuMDAwMDAwMDAxJywgJzEnLCA5KS5zaG91bGQuZXF1YWwoMW4pO1xuICAgICAgdWlBbW91bnRUb1JhdygnMCcsICcxJywgOSkuc2hvdWxkLmVxdWFsKDBuKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb252ZXJ0cyBVSSB0byByYXcgd2l0aCBtdWx0aXBsaWVyIDAuMDAxJywgZnVuY3Rpb24gKCkge1xuICAgICAgdWlBbW91bnRUb1JhdygnMC4wMDEnLCAnMC4wMDEnLCA5KS5zaG91bGQuZXF1YWwoMV8wMDBfMDAwXzAwMG4pO1xuICAgICAgdWlBbW91bnRUb1JhdygnMC4wMDAwMDAwMDAwMDEnLCAnMC4wMDEnLCA5KS5zaG91bGQuZXF1YWwoMW4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvbnZlcnRzIFVJIHRvIHJhdyB3aXRoIG11bHRpcGxpZXIgMWUtOSAodGlja2V0IGV4dHJlbWUpJywgZnVuY3Rpb24gKCkge1xuICAgICAgdWlBbW91bnRUb1JhdygnMC4wMDAwMDAwMDEnLCAnMC4wMDAwMDAwMDEnLCA5KS5zaG91bGQuZXF1YWwoMV8wMDBfMDAwXzAwMG4pO1xuICAgICAgdWlBbW91bnRUb1JhdygnMC4wMDAwMDAwMDAwMDAwMDAwMDEnLCAnMC4wMDAwMDAwMDEnLCA5KS5zaG91bGQuZXF1YWwoMW4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zsb29ycyB0byBpbnRlZ2VyIGJhc2UgdW5pdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyAxLjAwMDAwMDAwMDUgVUkgKiAxMF45ID0gMTAwMDAwMDAwMC41IHJhdyAtPiBmbG9vcnMgdG8gMTAwMDAwMDAwMFxuICAgICAgdWlBbW91bnRUb1JhdygnMS4wMDAwMDAwMDA1JywgJzEnLCA5KS5zaG91bGQuZXF1YWwoMV8wMDBfMDAwXzAwMG4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgbWFsZm9ybWVkIGlucHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICgoKSA9PiB1aUFtb3VudFRvUmF3KCctMScsICcxJywgOSkpLnNob3VsZC50aHJvdygvbXVzdCBiZSBub24tbmVnYXRpdmUvKTtcbiAgICAgICgoKSA9PiB1aUFtb3VudFRvUmF3KCcxJywgJzAnLCA5KSkuc2hvdWxkLnRocm93KC9tdXN0IGJlIHBvc2l0aXZlLyk7XG4gICAgICAoKCkgPT4gdWlBbW91bnRUb1JhdygnMWUtOScsICcxJywgOSkpLnNob3VsZC50aHJvdygvZmluaXRlIGRlY2ltYWwgc3RyaW5nLyk7XG4gICAgICAoKCkgPT4gdWlBbW91bnRUb1JhdygnMScsICcxJywgLTEpKS5zaG91bGQudGhyb3coL25vbi1uZWdhdGl2ZSBpbnRlZ2VyLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyb3VuZC10cmlwIGV4YWN0bmVzcyBhdCBtdWx0aXBsaWVyIGV4dHJlbWVzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG11bHRpcGxpZXJzID0gWycxJywgJzAuMDAxJywgJzAuMDAwMDAwMDAxJywgJzEuNScsICcxMi41J107XG4gICAgY29uc3QgcmF3QW1vdW50cyA9IFtcbiAgICAgIDBuLFxuICAgICAgMW4sXG4gICAgICA5OTluLFxuICAgICAgMV8wMDBuLFxuICAgICAgMTIzXzQ1Nl83ODluLFxuICAgICAgMV8wMDBfMDAwXzAwMG4sXG4gICAgICA5OTlfOTk5Xzk5OV85OTlfOTk5Xzk5OW4sXG4gICAgICAxMG4gKiogMjduLCAvLyA+IHU2NCBtYXggc3VwcGx5LCBzdGlsbCBleGFjdFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IG11bHRpcGxpZXIgb2YgbXVsdGlwbGllcnMpIHtcbiAgICAgIGl0KGByb3VuZC10cmlwcyBldmVyeSByYXcgYW1vdW50IHRocm91Z2ggVUkgYXQgbXVsdGlwbGllciAke211bHRpcGxpZXJ9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJhdyBvZiByYXdBbW91bnRzKSB7XG4gICAgICAgICAgY29uc3QgdWkgPSByYXdUb1VpQW1vdW50U3RyaW5nKHJhdywgbXVsdGlwbGllciwgOSk7XG4gICAgICAgICAgdWlBbW91bnRUb1Jhdyh1aSwgbXVsdGlwbGllciwgOSkuc2hvdWxkLmVxdWFsKHJhdyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGl0KCdyb3VuZC10cmlwcyBhdCBkZWNpbWFscyBvdGhlciB0aGFuIDknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlY2ltYWxzIG9mIFswLCAyLCA2LCAxOF0pIHtcbiAgICAgICAgZm9yIChjb25zdCByYXcgb2YgcmF3QW1vdW50cykge1xuICAgICAgICAgIGNvbnN0IHVpID0gcmF3VG9VaUFtb3VudFN0cmluZyhyYXcsICcwLjAwMScsIGRlY2ltYWxzKTtcbiAgICAgICAgICB1aUFtb3VudFRvUmF3KHVpLCAnMC4wMDEnLCBkZWNpbWFscykuc2hvdWxkLmVxdWFsKHJhdyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|