@fleet-sdk/common 0.8.3 → 0.9.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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @fleet-sdk/common
2
2
 
3
+ ## 0.9.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 59018ee: No relevant changes
8
+
9
+ ## 0.8.5
10
+
11
+ ### Patch Changes
12
+
13
+ - 07bafd5: Add offset support to `startsWith`
14
+
3
15
  ## 0.8.3
4
16
 
5
17
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -273,7 +273,7 @@ declare function areEqualBy<T>(array1: ArrayLike<T>, array2: ArrayLike<T>, selec
273
273
  * startsWith(array, target2); // false
274
274
  * ```
275
275
  */
276
- declare function startsWith<T>(array: ArrayLike<T>, target: ArrayLike<T>): boolean;
276
+ declare function startsWith<T>(array: ArrayLike<T>, target: ArrayLike<T>, offset?: number): boolean;
277
277
  /**
278
278
  * Checks if the array ends with the specified target
279
279
  * @param array
@@ -648,4 +648,7 @@ declare class NotSupportedError extends FleetError {
648
648
  declare class BlockchainProviderError extends FleetError {
649
649
  }
650
650
 
651
- export { AddressType, type Amount, type Base58String, type Block, type BlockHeader, type BlockHeaderId, type BlockTransactions, BlockchainProviderError, type Box, type BoxAmounts, type BoxCandidate, type BoxId, type BoxSummary, Collection, type CollectionAddOptions, type ContextExtension, type DataInput, type EIP12UnsignedDataInput, type EIP12UnsignedInput, type EIP12UnsignedTransaction, type EnsureDefaultsOptions, type EnumConst, type ErgoTreeHeaderFlag, type ErgoTreeHex, type ErrorMessage, type FilterPredicate, FleetError, type HexString, Network, type NewToken, type NonMandatoryRegisters, NotSupportedError, type OneOrMore, type PlainObjectType, type PoWSolution, type ProverResult, type SignedInput, type SignedTransaction, type SortingDirection, type SortingSelector, type TokenAmount, type TokenId, type TokenTargetAmount, type TransactionId, type UTxOFilterParams, type UnsignedInput, type UnsignedTransaction, _0n, _10n, _127n, _128n, _1n, _2n, _63n, _7n, areEqual, areEqualBy, areRegistersDenselyPacked, assert, assertInstanceOf, assertTypeOf, at, byteSizeOf, chunk, clearUndefined, concatBytes, decimalize, depthOf, endsWith, ensureBigInt, ensureDefaults, ensureUTxOBigInt, ergoTreeHeaderFlags, first, hasDuplicates, hasDuplicatesBy, hasKey, isDefined, isEmpty, isFalsy, isHex, isTruthy, isUndefined, last, max, min, orderBy, percent, some, startsWith, sumBy, undecimalize, uniq, uniqBy, utxoDiff, utxoFilter, utxoSum };
651
+ declare const FEE_CONTRACT = "1005040004000e36100204a00b08cd0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ea02d192a39a8cc7a701730073011001020402d19683030193a38cc7b2a57300000193c2b2a57301007473027303830108cdeeac93b1a57304";
652
+ declare const RECOMMENDED_MIN_FEE_VALUE: bigint;
653
+
654
+ export { AddressType, type Amount, type Base58String, type Block, type BlockHeader, type BlockHeaderId, type BlockTransactions, BlockchainProviderError, type Box, type BoxAmounts, type BoxCandidate, type BoxId, type BoxSummary, Collection, type CollectionAddOptions, type ContextExtension, type DataInput, type EIP12UnsignedDataInput, type EIP12UnsignedInput, type EIP12UnsignedTransaction, type EnsureDefaultsOptions, type EnumConst, type ErgoTreeHeaderFlag, type ErgoTreeHex, type ErrorMessage, FEE_CONTRACT, type FilterPredicate, FleetError, type HexString, Network, type NewToken, type NonMandatoryRegisters, NotSupportedError, type OneOrMore, type PlainObjectType, type PoWSolution, type ProverResult, RECOMMENDED_MIN_FEE_VALUE, type SignedInput, type SignedTransaction, type SortingDirection, type SortingSelector, type TokenAmount, type TokenId, type TokenTargetAmount, type TransactionId, type UTxOFilterParams, type UnsignedInput, type UnsignedTransaction, _0n, _10n, _127n, _128n, _1n, _2n, _63n, _7n, areEqual, areEqualBy, areRegistersDenselyPacked, assert, assertInstanceOf, assertTypeOf, at, byteSizeOf, chunk, clearUndefined, concatBytes, decimalize, depthOf, endsWith, ensureBigInt, ensureDefaults, ensureUTxOBigInt, ergoTreeHeaderFlags, first, hasDuplicates, hasDuplicatesBy, hasKey, isDefined, isEmpty, isFalsy, isHex, isTruthy, isUndefined, last, max, min, orderBy, percent, some, startsWith, sumBy, undecimalize, uniq, uniqBy, utxoDiff, utxoFilter, utxoSum };
package/dist/index.d.ts CHANGED
@@ -273,7 +273,7 @@ declare function areEqualBy<T>(array1: ArrayLike<T>, array2: ArrayLike<T>, selec
273
273
  * startsWith(array, target2); // false
274
274
  * ```
275
275
  */
276
- declare function startsWith<T>(array: ArrayLike<T>, target: ArrayLike<T>): boolean;
276
+ declare function startsWith<T>(array: ArrayLike<T>, target: ArrayLike<T>, offset?: number): boolean;
277
277
  /**
278
278
  * Checks if the array ends with the specified target
279
279
  * @param array
@@ -648,4 +648,7 @@ declare class NotSupportedError extends FleetError {
648
648
  declare class BlockchainProviderError extends FleetError {
649
649
  }
650
650
 
651
- export { AddressType, type Amount, type Base58String, type Block, type BlockHeader, type BlockHeaderId, type BlockTransactions, BlockchainProviderError, type Box, type BoxAmounts, type BoxCandidate, type BoxId, type BoxSummary, Collection, type CollectionAddOptions, type ContextExtension, type DataInput, type EIP12UnsignedDataInput, type EIP12UnsignedInput, type EIP12UnsignedTransaction, type EnsureDefaultsOptions, type EnumConst, type ErgoTreeHeaderFlag, type ErgoTreeHex, type ErrorMessage, type FilterPredicate, FleetError, type HexString, Network, type NewToken, type NonMandatoryRegisters, NotSupportedError, type OneOrMore, type PlainObjectType, type PoWSolution, type ProverResult, type SignedInput, type SignedTransaction, type SortingDirection, type SortingSelector, type TokenAmount, type TokenId, type TokenTargetAmount, type TransactionId, type UTxOFilterParams, type UnsignedInput, type UnsignedTransaction, _0n, _10n, _127n, _128n, _1n, _2n, _63n, _7n, areEqual, areEqualBy, areRegistersDenselyPacked, assert, assertInstanceOf, assertTypeOf, at, byteSizeOf, chunk, clearUndefined, concatBytes, decimalize, depthOf, endsWith, ensureBigInt, ensureDefaults, ensureUTxOBigInt, ergoTreeHeaderFlags, first, hasDuplicates, hasDuplicatesBy, hasKey, isDefined, isEmpty, isFalsy, isHex, isTruthy, isUndefined, last, max, min, orderBy, percent, some, startsWith, sumBy, undecimalize, uniq, uniqBy, utxoDiff, utxoFilter, utxoSum };
651
+ declare const FEE_CONTRACT = "1005040004000e36100204a00b08cd0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ea02d192a39a8cc7a701730073011001020402d19683030193a38cc7b2a57300000193c2b2a57301007473027303830108cdeeac93b1a57304";
652
+ declare const RECOMMENDED_MIN_FEE_VALUE: bigint;
653
+
654
+ export { AddressType, type Amount, type Base58String, type Block, type BlockHeader, type BlockHeaderId, type BlockTransactions, BlockchainProviderError, type Box, type BoxAmounts, type BoxCandidate, type BoxId, type BoxSummary, Collection, type CollectionAddOptions, type ContextExtension, type DataInput, type EIP12UnsignedDataInput, type EIP12UnsignedInput, type EIP12UnsignedTransaction, type EnsureDefaultsOptions, type EnumConst, type ErgoTreeHeaderFlag, type ErgoTreeHex, type ErrorMessage, FEE_CONTRACT, type FilterPredicate, FleetError, type HexString, Network, type NewToken, type NonMandatoryRegisters, NotSupportedError, type OneOrMore, type PlainObjectType, type PoWSolution, type ProverResult, RECOMMENDED_MIN_FEE_VALUE, type SignedInput, type SignedTransaction, type SortingDirection, type SortingSelector, type TokenAmount, type TokenId, type TokenTargetAmount, type TransactionId, type UTxOFilterParams, type UnsignedInput, type UnsignedTransaction, _0n, _10n, _127n, _128n, _1n, _2n, _63n, _7n, areEqual, areEqualBy, areRegistersDenselyPacked, assert, assertInstanceOf, assertTypeOf, at, byteSizeOf, chunk, clearUndefined, concatBytes, decimalize, depthOf, endsWith, ensureBigInt, ensureDefaults, ensureUTxOBigInt, ergoTreeHeaderFlags, first, hasDuplicates, hasDuplicatesBy, hasKey, isDefined, isEmpty, isFalsy, isHex, isTruthy, isUndefined, last, max, min, orderBy, percent, some, startsWith, sumBy, undecimalize, uniq, uniqBy, utxoDiff, utxoFilter, utxoSum };
package/dist/index.js CHANGED
@@ -30,9 +30,7 @@ function getTypeName(value) {
30
30
  function assertInstanceOf(obj, expected) {
31
31
  const condition = obj instanceof expected;
32
32
  if (!condition) {
33
- throw new Error(
34
- `Expected an instance of '${expected.name}', got '${getTypeName(obj)}'.`
35
- );
33
+ throw new Error(`Expected an instance of '${expected.name}', got '${getTypeName(obj)}'.`);
36
34
  }
37
35
  }
38
36
  function isEmpty(target) {
@@ -131,27 +129,17 @@ function areEqualBy(array1, array2, selector) {
131
129
  }
132
130
  return true;
133
131
  }
134
- function startsWith(array, target) {
135
- if (array === target) {
136
- return true;
137
- }
138
- if (target.length > array.length) {
139
- return false;
140
- }
132
+ function startsWith(array, target, offset = 0) {
133
+ if (array === target) return true;
134
+ if (target.length > array.length) return false;
141
135
  for (let i = 0; i < target.length; i++) {
142
- if (target[i] !== array[i]) {
143
- return false;
144
- }
136
+ if (target[i] !== array[i + offset]) return false;
145
137
  }
146
138
  return true;
147
139
  }
148
140
  function endsWith(array, target) {
149
- if (array === target) {
150
- return true;
151
- }
152
- if (target.length > array.length) {
153
- return false;
154
- }
141
+ if (array === target) return true;
142
+ if (target.length > array.length) return false;
155
143
  const offset = array.length - target.length;
156
144
  for (let i = target.length - 1; i >= 0; i--) {
157
145
  if (target[i] !== array[i + offset]) {
@@ -570,12 +558,18 @@ var NotSupportedError = class extends FleetError {
570
558
  var BlockchainProviderError = class extends FleetError {
571
559
  };
572
560
 
561
+ // src/constants.ts
562
+ var FEE_CONTRACT = "1005040004000e36100204a00b08cd0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ea02d192a39a8cc7a701730073011001020402d19683030193a38cc7b2a57300000193c2b2a57301007473027303830108cdeeac93b1a57304";
563
+ var RECOMMENDED_MIN_FEE_VALUE = BigInt(11e5);
564
+
573
565
  exports.AddressType = AddressType;
574
566
  exports.BlockchainProviderError = BlockchainProviderError;
575
567
  exports.Collection = Collection;
568
+ exports.FEE_CONTRACT = FEE_CONTRACT;
576
569
  exports.FleetError = FleetError;
577
570
  exports.Network = Network;
578
571
  exports.NotSupportedError = NotSupportedError;
572
+ exports.RECOMMENDED_MIN_FEE_VALUE = RECOMMENDED_MIN_FEE_VALUE;
579
573
  exports._0n = _0n;
580
574
  exports._10n = _10n;
581
575
  exports._127n = _127n;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/assertions.ts","../src/utils/array.ts","../src/utils/bigInt.ts","../src/utils/utxo.ts","../src/utils/object.ts","../src/utils/bytes.ts","../src/types/enums.ts","../src/models/collection.ts","../src/error.ts"],"names":["min","max","tokenId","Network","AddressType"],"mappings":"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","file":"index.js","sourcesContent":["export type ErrorMessage = string | Error | (() => string);\n\n// biome-ignore lint/complexity/noBannedTypes: <explanation>\ntype Constructable = Function;\n\ntype JSPrimitive =\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"symbol\"\n | \"undefined\"\n | \"object\"\n | \"function\";\n\nexport function assert(condition: boolean, error: ErrorMessage): asserts condition {\n if (condition) return;\n\n let err: Error | undefined = undefined;\n switch (typeof error) {\n case \"string\":\n err = new Error(error);\n break;\n case \"function\":\n err = new Error(error());\n break;\n default:\n err = error;\n }\n\n throw err;\n}\n\nexport function assertTypeOf<T>(obj: T, expected: JSPrimitive): asserts obj {\n const type = typeof obj;\n\n if (type !== expected) {\n throw new Error(`Expected an object of type '${expected}', got '${type}'.`);\n }\n}\n\nfunction getTypeName(value: unknown): string {\n if (value === null) return \"null\";\n const type = typeof value;\n\n return type === \"object\" || type === \"function\"\n ? Object.prototype.toString.call(value).slice(8, -1)\n : type;\n}\n\nexport function assertInstanceOf<T>(obj: T, expected: Constructable): asserts obj {\n const condition = obj instanceof expected;\n\n if (!condition) {\n throw new Error(\n `Expected an instance of '${expected.name}', got '${getTypeName(obj)}'.`\n );\n }\n}\n\nexport function isEmpty<T>(target: T | null | undefined): target is undefined | null {\n if (!target) return true;\n\n return Array.isArray(target) ? target.length === 0 : Object.keys(target).length === 0;\n}\n\nexport function some<T>(target: T | null | undefined): target is T {\n return !isEmpty(target);\n}\n\nexport function isTruthy<T>(value?: T): value is NonNullable<T> {\n return !!value;\n}\n\nexport function isFalsy<T>(value?: T): value is undefined {\n return !value;\n}\n\nexport function isUndefined(v: unknown): v is undefined {\n return v === undefined || v === null || Number.isNaN(v);\n}\n\nexport function isDefined<T>(v: T | undefined): v is T {\n return !isUndefined(v);\n}\n\nexport function hasKey(o: unknown, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(o, key);\n}\n","import type { SortingDirection, SortingSelector } from \"../types\";\nimport { assert, isEmpty } from \"./assertions\";\n\ntype ObjectSelector<T> = (item: T) => T[keyof T];\n\n/**\n * Returns the first element of an array.\n * @param array\n * @throws an error if the array is empty.\n */\nexport function first(array: undefined): undefined;\nexport function first<T>(array: ArrayLike<T>): T;\nexport function first<T>(array: ArrayLike<T> | undefined): T | number | undefined {\n if (!array) return undefined;\n assert(array.length > 0, \"Empty array.\");\n\n return array[0];\n}\n\n/**\n * Returns the last element of an array.\n * @param array\n * @throws an error if the array is empty.\n */\nexport function last(array: undefined): undefined;\nexport function last<T>(array: ArrayLike<T>): T;\nexport function last<T>(array: ArrayLike<T> | undefined): T | undefined {\n if (!array) return undefined;\n assert(array.length > 0, \"Empty array.\");\n\n return at(array, -1);\n}\n\n/**\n * Returns the element at the specified index. Negative indices are counted from the end of the array.\n * @param array\n * @param index\n */\nexport function at(array: undefined, index: number): undefined;\nexport function at<T>(array: ArrayLike<T>, index: number): T;\nexport function at<T>(array: ArrayLike<T> | undefined, index: number): T | undefined {\n const len = array?.length;\n if (!len) return undefined;\n\n if (index < 0) {\n index += len;\n }\n\n return array[index];\n}\n\n/**\n * Check for duplicate elements using the equality operator\n */\nexport function hasDuplicates<T>(array: T[]): boolean {\n return array.some((item, index) => {\n return array.indexOf(item) !== index;\n });\n}\n\n/**\n * Check for duplicate keys in complex elements\n */\nexport function hasDuplicatesBy<T>(array: T[], selector: ObjectSelector<T>): boolean {\n return array.some((item, index) => {\n return array.findIndex((x) => selector(x) === selector(item)) !== index;\n });\n}\n\n/**\n * Turns an array into chunks of the specified size\n * @param array\n * @param size\n *\n * @example\n * ```\n * const array = [1, 2, 3, 4, 5];\n * const chunks = chunk(array, 2);\n * console.log(chunks);\n * // [[1, 2], [3, 4], [5]]\n * ```\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n if (isEmpty(array)) return [];\n if (array.length <= size) return [array];\n\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n\n return chunks;\n}\n\n/**\n * Sorts an array of objects by the specified property\n * @param array\n * @param iteratee\n * @param order\n *\n * @example\n * ```\n * const array = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }];\n * const sorted = orderBy(array, (item) => item.age, \"desc\");\n * console.log(sorted);\n * // [{ name: \"Jane\", age: 30 }, { name: \"John\", age: 25 }]\n * ```\n */\nexport function orderBy<T>(\n array: T[],\n iteratee: SortingSelector<T>,\n order: SortingDirection = \"asc\"\n): T[] {\n return [...array].sort((a: T, b: T) => {\n if (iteratee(a) > iteratee(b)) return order === \"asc\" ? 1 : -1;\n if (iteratee(a) < iteratee(b)) return order === \"asc\" ? -1 : 1;\n return 0;\n });\n}\n\n/**\n * Checks if arrays are equal\n * @param array1\n * @param array2\n *\n * @example\n * ```\n * const array1 = [1, 2, 3];\n * const array2 = [1, 2, 3];\n * const array3 = [1, 2, 4];\n * const array4 = [1, 2, 3, 4];\n * areEqual(array1, array2); // true\n * areEqual(array1, array3); // false\n * areEqual(array1, array4); // false\n * ```\n */\nexport function areEqual<T>(array1: ArrayLike<T>, array2: ArrayLike<T>): boolean {\n if (array1 === array2) {\n return true;\n }\n\n if (array1.length !== array2.length) {\n return false;\n }\n\n for (let i = 0; i < array1.length; i++) {\n if (array1[i] !== array2[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if arrays are equal by the specified property\n * @param array1\n * @param array2\n * @param selector\n *\n * @example\n * ```\n * const array1 = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }];\n * const array2 = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }];\n * const array3 = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 31 }];\n *\n * areEqualBy(array1, array2, (item) => item.age); // true\n * areEqualBy(array1, array3, (item) => item.age); // false\n * ```\n */\nexport function areEqualBy<T>(\n array1: ArrayLike<T>,\n array2: ArrayLike<T>,\n selector: ObjectSelector<T>\n): boolean {\n if (array1 === array2) {\n return true;\n }\n\n if (array1.length !== array2.length) {\n return false;\n }\n\n for (let i = 0; i < array1.length; i++) {\n if (selector(array1[i]) !== selector(array2[i])) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if the array starts with the specified target\n * @param array\n * @param target\n *\n * @example\n * ```\n * const array = [1, 2, 3, 4, 5];\n * const target1 = [1, 2];\n * const target2 = [1, 3];\n *\n * startsWith(array, target1); // true\n * startsWith(array, target2); // false\n * ```\n */\nexport function startsWith<T>(array: ArrayLike<T>, target: ArrayLike<T>): boolean {\n if (array === target) {\n return true;\n }\n\n if (target.length > array.length) {\n return false;\n }\n\n for (let i = 0; i < target.length; i++) {\n if (target[i] !== array[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if the array ends with the specified target\n * @param array\n * @param target\n *\n * @example\n * ```\n * const array = [1, 2, 3, 4, 5];\n * const target1 = [4, 5];\n * const target2 = [3, 5];\n *\n * endsWith(array, target1); // true\n * endsWith(array, target2); // false\n * ```\n */\nexport function endsWith<T>(array: ArrayLike<T>, target: ArrayLike<T>): boolean {\n if (array === target) {\n return true;\n }\n\n if (target.length > array.length) {\n return false;\n }\n\n const offset = array.length - target.length;\n\n for (let i = target.length - 1; i >= 0; i--) {\n if (target[i] !== array[i + offset]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Makes an array unique by removing duplicate elements\n * @param array\n *\n * @example\n * ```\n * const array = [1, 2, 3, 3, 4, 5, 5];\n * const unique = uniq(array);\n * console.log(unique);\n * // [1, 2, 3, 4, 5]\n * ```\n */\nexport function uniq<T>(array: Array<T>): Array<T> {\n if (isEmpty(array)) {\n return array;\n }\n\n return Array.from(new Set(array));\n}\n\n/**\n * Makes an array unique by removing duplicate elements using the specified property\n * @param array\n * @param selector\n * @param selection\n *\n * @example\n * ```\n * const array = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }, { name: \"John\", age: 30 }];\n * const unique = uniqBy(array, (item) => item.name);\n * console.log(unique);\n * // [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }]\n * ```\n */\nexport function uniqBy<T>(\n array: Array<T>,\n selector: ObjectSelector<T>,\n selection: \"keep-first\" | \"keep-last\" = \"keep-first\"\n): Array<T> {\n if (isEmpty(array)) {\n return array;\n }\n\n return Array.from(\n array\n .reduce((map, e) => {\n const key = selector(e);\n\n if (selection === \"keep-first\" && map.has(key)) {\n return map;\n }\n\n return map.set(key, e);\n }, new Map())\n .values()\n );\n}\n\n/**\n * Returns the depth of an array\n * @param array\n *\n * @example\n * ```\n * const array = [1, 2, 3, [4, 5, [6, 7]]];\n * const depth = depthOf(array);\n * console.log(depth);\n * // 3\n */\nexport function depthOf(array: unknown | unknown[]): number {\n return Array.isArray(array) ? 1 + Math.max(0, ...array.map(depthOf)) : 0;\n}\n","import type { Amount } from \"../types\";\nimport { first } from \"./array\";\nimport { isEmpty, isUndefined } from \"./assertions\";\n\ntype NumberLike = string | number | bigint | boolean;\n\nexport const _0n = BigInt(0);\nexport const _1n = BigInt(1);\nexport const _2n = BigInt(2);\nexport const _7n = BigInt(7);\nexport const _10n = BigInt(10);\nexport const _63n = BigInt(63);\nexport const _127n = BigInt(127);\nexport const _128n = BigInt(128);\n\n/**\n * Ensure that the given value is a bigint\n * @param number\n */\nexport function ensureBigInt(number: NumberLike): bigint {\n return typeof number === \"bigint\" ? number : BigInt(number);\n}\n\ntype ParsingOptions = {\n /**\n * Number of decimals.\n */\n decimals?: number;\n\n /**\n * Thousand mark char.\n * Default: `.`\n */\n decimalMark?: string;\n};\n\n/**\n * Parse a decimal string into a bigint with options\n * @param input\n * @param options\n *\n * @example\n * undecimalize(\"129.8379183\", { decimals: 9 }) // 129837918300n\n * undecimalize(\"1\", { decimals: 2 }) // 100n\n * undecimalize(\"1\", 2) // 100n\n */\nexport function undecimalize(input: string, options?: ParsingOptions | number): bigint {\n if (!input) return _0n;\n\n options = typeof options === \"number\" ? { decimals: options } : options;\n if (isUndefined(options)) {\n options = {};\n }\n\n options.decimals = options.decimals || 0;\n options.decimalMark = options.decimalMark || \".\";\n\n const fragments = input.split(options.decimalMark);\n if (fragments.length > 2) {\n throw new Error(\"Invalid numeric string.\");\n }\n\n let [integer, decimal] = fragments;\n integer = removeLeadingZeros(integer);\n const negative = integer.startsWith(\"-\") ? \"-\" : \"\";\n\n if (!decimal) {\n decimal = \"0\".repeat(options.decimals);\n } else if (decimal.length < options.decimals) {\n decimal = decimal.padEnd(options.decimals, \"0\");\n }\n\n return BigInt(negative + _stripNonDigits(integer + decimal));\n}\n\n/**\n * Strip all non-digits from a string\n * @param value\n */\nfunction _stripNonDigits(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\ntype FormattingOptions = {\n /**\n * Number of decimals.\n */\n decimals: number;\n\n /**\n * Thousand mark char.\n */\n thousandMark?: string;\n\n /**\n * Decimal mark char.\n * Default: `.`\n */\n decimalMark?: string;\n};\n\n/**\n * Format a bigint into a decimal string with options\n * @param value\n * @param options\n *\n * @example\n * decimalize(129837918300n, { decimals: 9 }) // \"129.8379183\"\n * decimalize(100n, { decimals: 2 }) // \"1\"\n */\nexport function decimalize(value: Amount, options?: FormattingOptions | number): string {\n value = ensureBigInt(value);\n if (!options) {\n return value.toString();\n }\n\n options = typeof options === \"number\" ? { decimals: options } : options;\n options.decimals = options.decimals || 0;\n options.decimalMark = options.decimalMark || \".\";\n\n const pow = _10n ** BigInt(options.decimals);\n const integer = value / pow;\n const decimal = value - integer * pow;\n\n return buildFormattedDecimal(integer.toString(10), decimal.toString(10), options);\n}\n\n/**\n * Calculates the percentage of a bigint value with a specified precision.\n *\n * @param value - The input value to calculate the percentage of\n * @param percentage - The percentage to calculate (e.g., 5n for 5%)\n * @param precision - The number of decimal places for the percentage (defaults to 2n)\n * @returns The calculated percentage of the input value\n *\n * @example\n * For 5% of 200 with 2 decimal places:\n * percent(200n, 5n) // returns 10n\n */\nexport function percent(value: bigint, percentage: bigint, precision = _2n): bigint {\n return (value * percentage) / _10n ** precision;\n}\n\nfunction buildFormattedDecimal(\n integer: string,\n decimal: string,\n options: FormattingOptions\n): string {\n const int = addThousandMarks(integer, options.thousandMark);\n const dec = stripTrailingZeros(decimal.padStart(options.decimals, \"0\"));\n if (dec) return `${int}${options.decimalMark}${dec}`;\n return int;\n}\n\nfunction addThousandMarks(value: string, mark?: string): string {\n if (!mark) {\n return value;\n }\n\n return value.replace(/\\B(?=(\\d{3})+(?!\\d))/g, mark);\n}\n\nfunction stripTrailingZeros(value: string): string {\n if (!value.endsWith(\"0\")) {\n return value;\n }\n\n return value.replace(/\\.?0+$/, \"\");\n}\n\nfunction removeLeadingZeros(value: string): string {\n if (!value.startsWith(\"0\")) {\n return value;\n }\n\n return value.replace(/^0+\\.?/, \"\");\n}\n\n/**\n * Sum a collection of numbers by a given iteratee\n * @param collection\n * @param iteratee\n * @param condition\n *\n * @example\n * ```\n * const values = [\n * { key: 1, value: 100n },\n * { key: 2, value: 200n },\n * { key: 3, value: 300n },\n * { key: 4, value: 400n },\n * ];\n *\n * sumBy(values, x => x.value) // 1000n\n * sumBy(values, x => x.value, x => x.key < 0) // 0n\n * sumBy(values, x => x.value, x => x.key % 2 === 0) // 600n\n */\nexport function sumBy<T>(\n collection: readonly T[],\n iteratee: (value: T) => bigint,\n condition?: (value: T) => boolean\n): bigint {\n let acc = _0n;\n if (isEmpty(collection)) {\n return acc;\n }\n\n for (const item of collection) {\n if (isUndefined(condition) || condition(item)) {\n acc += iteratee(item);\n }\n }\n\n return acc;\n}\n\n/**\n * Get the minimum value from a collection of numbers\n * @param numbers\n */\nexport function min<T extends bigint | number>(...numbers: T[]): T {\n let min = first(numbers);\n\n for (const num of numbers) {\n if (num < min) {\n min = num;\n }\n }\n\n return min;\n}\n\n/**\n * Get the maximum value from a collection of numbers\n * @param numbers\n */\nexport function max<T extends bigint | number>(...numbers: T[]): T {\n let max = first(numbers);\n\n for (const num of numbers) {\n if (num > max) {\n max = num;\n }\n }\n\n return max;\n}\n","import type {\n Amount,\n Box,\n BoxCandidate,\n NonMandatoryRegisters,\n TokenAmount,\n TokenId\n} from \"../types\";\nimport { isDefined, isEmpty, isUndefined } from \"./assertions\";\nimport { ensureBigInt } from \"./bigInt\";\nimport { _0n } from \"./bigInt\";\n\nconst NANOERGS_TOKEN_ID = \"nanoErgs\";\n\n/**\n * Calculates the sum of all nanoErgs and tokens in the given boxes.\n * @param boxes\n *\n * @example\n * ```\n * const boxes = [\n * { value: \"10\", assets: [{ tokenId: \"test\", amount: \"20\" }] },\n * { value: 20n, assets: [{ tokenId: \"test\", amount: 30n }] }\n * ];\n *\n * const sum = utxoSum(boxes);\n * console.log(sum);\n * // { nanoErgs: 30n, tokens: [{ tokenId: \"test\", amount: 50n }] }\n * ```\n */\nexport function utxoSum(boxes: readonly BoxAmounts[]): BoxSummary;\nexport function utxoSum(boxes: readonly BoxAmounts[], tokenId: TokenId): bigint;\nexport function utxoSum(boxes: readonly BoxAmounts[], tokenId?: TokenId) {\n const balances: { [tokenId: string]: bigint } = {};\n\n for (const box of boxes) {\n if (isUndefined(tokenId) || tokenId === NANOERGS_TOKEN_ID) {\n balances[NANOERGS_TOKEN_ID] =\n (balances[NANOERGS_TOKEN_ID] || _0n) + ensureBigInt(box.value);\n }\n\n if (tokenId !== NANOERGS_TOKEN_ID) {\n for (const token of box.assets) {\n if (isDefined(tokenId) && tokenId !== token.tokenId) {\n continue;\n }\n\n balances[token.tokenId] =\n (balances[token.tokenId] || _0n) + ensureBigInt(token.amount);\n }\n }\n }\n\n if (isDefined(tokenId)) {\n return balances[tokenId] || _0n;\n }\n\n return {\n nanoErgs: balances[NANOERGS_TOKEN_ID] || _0n,\n tokens: Object.keys(balances)\n .filter((x) => x !== NANOERGS_TOKEN_ID)\n .map((tokenId) => ({ tokenId, amount: balances[tokenId] }))\n };\n}\n\n/**\n * Calculates the difference between two utxos or utxo sets.\n * @param minuend\n * @param subtrahend\n *\n * @example\n * ```\n * const minuend = [{ nanoErgs: 30n, tokens: [{ tokenId: \"test\", amount: 50n }] }];\n * const subtrahend = [{ nanoErgs: 10n, tokens: [{ tokenId: \"test\", amount: 20n }] }];\n * const diff = utxoDiff(minuend, subtrahend);\n * console.log(diff);\n * // { nanoErgs: 20n, tokens: [{ tokenId: \"test\", amount: 30n }] }\n * ```\n */\nexport function utxoDiff(\n minuend: BoxSummary | Box<Amount>[],\n subtrahend: BoxSummary | Box<Amount>[],\n ignoreSubtrahendLeftoverTokens = false\n): BoxSummary {\n if (Array.isArray(minuend)) minuend = utxoSum(minuend);\n if (Array.isArray(subtrahend)) subtrahend = utxoSum(subtrahend);\n\n const tokens: TokenAmount<bigint>[] = [];\n const nanoErgs = minuend.nanoErgs - subtrahend.nanoErgs;\n const subtrahendTokens = new Map(subtrahend.tokens.map((t) => [t.tokenId, t.amount]));\n\n for (const token of minuend.tokens) {\n const subtrahendAmount = subtrahendTokens.get(token.tokenId) || _0n;\n const balance = token.amount - (subtrahendAmount || _0n);\n\n if (balance !== _0n) {\n tokens.push({ tokenId: token.tokenId, amount: balance });\n }\n\n if (subtrahendAmount > _0n) {\n subtrahendTokens.delete(token.tokenId);\n }\n }\n\n if (!ignoreSubtrahendLeftoverTokens && subtrahendTokens.size > 0) {\n for (const [tokenId, amount] of subtrahendTokens) {\n tokens.push({ tokenId, amount: -amount });\n }\n }\n\n return { nanoErgs, tokens };\n}\n\nconst MIN_NON_MANDATORY_REGISTER_INDEX = 4;\nconst MAX_NON_MANDATORY_REGISTER_INDEX = 9;\n\n/**\n * Checks if the given registers are densely packed.\n * @param registers\n *\n * @example\n * ```\n * const registers = {\n * R4: \"deadbeef\",\n * R6: \"cafe\",\n * };\n * const result = areRegistersDenselyPacked(registers);\n * console.log(result);\n * // false\n */\nexport function areRegistersDenselyPacked(registers: NonMandatoryRegisters): boolean {\n let lastIndex = 0;\n for (\n let i = MIN_NON_MANDATORY_REGISTER_INDEX;\n i <= MAX_NON_MANDATORY_REGISTER_INDEX;\n i++\n ) {\n const key = `R${i}` as keyof NonMandatoryRegisters;\n if (registers[key]) {\n if (i === MIN_NON_MANDATORY_REGISTER_INDEX) {\n lastIndex = i;\n continue;\n }\n\n if (i - lastIndex > 1) {\n return false;\n }\n\n lastIndex = i;\n }\n }\n\n return true;\n}\n\n/**\n * Filters the given utxos by the given filter parameters.\n * @param utxos\n * @param filterParams\n */\nexport function utxoFilter<T extends Amount>(\n utxos: Box<T>[],\n filterParams: UTxOFilterParams<T>\n) {\n if (isEmpty(filterParams) || isEmpty(utxos)) {\n return utxos;\n }\n\n const { by, max } = filterParams;\n let filtered = utxos;\n\n if (by) {\n filtered = utxos.filter(by);\n if (isEmpty(filtered)) {\n return filtered;\n }\n }\n\n if (!max) {\n return filtered;\n }\n\n if (isDefined(max.aggregatedDistinctTokens)) {\n const tokenIds = _getDistinctTokenIds(filtered, max.aggregatedDistinctTokens);\n filtered = filtered.filter(\n (utxo) =>\n isEmpty(utxo.assets) || utxo.assets.every((token) => tokenIds.has(token.tokenId))\n );\n }\n\n if (isDefined(max.count) && filtered.length > max.count) {\n filtered = filtered.slice(0, max.count);\n }\n\n return filtered;\n}\n\nfunction _getDistinctTokenIds(utxos: Box[], max: number): Set<string> {\n const tokenIds = new Set<string>();\n\n for (let i = 0; i < utxos.length && tokenIds.size < max; i++) {\n if (isEmpty(utxos[i].assets) || utxos[i].assets.length > max) {\n continue;\n }\n\n for (const token of utxos[i].assets) {\n tokenIds.add(token.tokenId);\n }\n }\n\n return tokenIds;\n}\n\n/**\n * Parameters for filtering unspent transaction outputs (UTxOs).\n */\nexport type UTxOFilterParams<T extends Amount> = {\n /**\n * A function that returns a boolean indicating whether a given UTxO should be included in the filtered results.\n */\n by?: (utxo: Box<T>) => boolean;\n /**\n * An object specifying the maximum number of UTxOs and distinct tokens to include in the filtered results.\n */\n max?: {\n /**\n * The maximum number of UTxOs to include in the filtered results.\n */\n count?: number;\n /**\n * The maximum number of distinct tokens to include in the filtered results.\n */\n aggregatedDistinctTokens?: number;\n };\n};\n\nexport type BoxSummary = {\n nanoErgs: bigint;\n tokens: TokenAmount<bigint>[];\n};\n\nexport type BoxAmounts = {\n value: Amount;\n assets: TokenAmount<Amount>[];\n};\n\n/**\n * Ensures that the value and asset amounts of a given box are represented as BigInts.\n * @returns A new box object with BigInt representation for the value and asset amounts.\n */\nexport function ensureUTxOBigInt(box: Box<Amount>): Box<bigint>;\nexport function ensureUTxOBigInt(candidate: BoxCandidate<Amount>): BoxCandidate<bigint>;\nexport function ensureUTxOBigInt(\n box: Box<Amount> | BoxCandidate<Amount>\n): BoxCandidate<bigint> | Box<bigint> {\n return {\n ...box,\n value: ensureBigInt(box.value),\n assets: box.assets.map((token) => ({\n tokenId: token.tokenId,\n amount: ensureBigInt(token.amount)\n }))\n };\n}\n","import { isEmpty, isUndefined } from \"./assertions\";\n\n/**\n * Remove undefined values from an object\n * @param value\n *\n * @example\n * ```\n * const obj = { a: 1, b: undefined };\n * const result = clearUndefined(obj);\n * console.log(result); // { a: 1 }\n * ```\n */\nexport function clearUndefined(value: Record<string, unknown>) {\n const result: Record<string, unknown> = {};\n for (const key in value) {\n const val = value[key];\n if (!isUndefined(val)) {\n result[key] = val;\n }\n }\n\n return result;\n}\n\nexport type EnsureDefaultsOptions = { keepUndefinedKeys: boolean };\n\n/**\n * Ensure that the options object has all the default values\n * @param partial\n * @param defaults\n *\n * @example\n * ```\n * const options = { a: 1 };\n * const defaults = { a: 2, b: 3 };\n * const result = ensureDefaults(options, defaults);\n * console.log(result); // { a: 1, b: 3 }\n * ```\n */\nexport function ensureDefaults<T extends object, R extends object>(\n partial: T | undefined,\n defaults: R,\n options?: EnsureDefaultsOptions\n): R & T {\n if (isEmpty(partial)) return defaults as R & T;\n if (options?.keepUndefinedKeys) return { ...defaults, ...partial };\n\n const merged = { ...defaults, ...partial } as Record<string, unknown>;\n for (const key in merged) {\n merged[key] = partial[key as keyof T] ?? defaults[key as keyof R];\n }\n\n return merged as R & T;\n}\n","import { assertInstanceOf } from \".\";\n\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0));\n\n let pad = 0;\n for (const bytes of arrays) {\n assertInstanceOf(bytes, Uint8Array);\n\n r.set(bytes, pad);\n pad += bytes.length;\n }\n\n return r;\n}\n\nexport function isHex(value?: string) {\n if (!value || value.length % 2) return false;\n return !Number.isNaN(Number(value.startsWith(\"0x\") ? value : `0x${value}`));\n}\n\n/**\n * Get hex string size in bytes\n * @param hex\n * @returns the byte size if the hex string\n */\nexport function byteSizeOf(hex: string): number {\n return hex.length / 2;\n}\n","export type EnumConst<T extends object> = T[keyof T];\n\nexport enum Network {\n Mainnet = 0x00,\n Testnet = 0x10\n}\n\nexport enum AddressType {\n P2PK = 1,\n P2SH = 2,\n P2S = 3,\n ADH = 4\n}\n\nexport const ergoTreeHeaderFlags = {\n sizeInclusion: 0x08,\n constantSegregation: 0x10\n} as const;\n\nexport type ErgoTreeHeaderFlag = EnumConst<typeof ergoTreeHeaderFlags>;\n","import type { OneOrMore } from \"../types\";\nimport { isDefined } from \"../utils\";\n\nexport type CollectionAddOptions = { index?: number };\n\n/**\n * Collection abstract model\n *\n * @example\n * Define a new collection class with internal type `number` and external type `string`\n * ```\n * class TestCollection extends Collection<number, string> {\n * protected _map(item: string | number): number {\n * return Number(item);\n * }\n * // Some other methods\n * }\n * ```\n *\n */\nexport abstract class Collection<InternalType, ExternalType>\n implements Iterable<InternalType>\n{\n protected readonly _items: InternalType[];\n\n constructor() {\n this._items = [];\n }\n\n protected _isIndexOutOfBounds(index: number): boolean {\n return index < 0 || index >= this._items.length;\n }\n\n [Symbol.iterator](): Iterator<InternalType> {\n let counter = 0;\n\n return {\n next: () => {\n return {\n done: counter >= this.length,\n value: this._items[counter++]\n };\n }\n };\n }\n\n /**\n * Number of items in the collection\n */\n public get length(): number {\n return this._items.length;\n }\n\n /**\n * True if the collection is empty\n */\n public get isEmpty(): boolean {\n return this.length === 0;\n }\n\n /**\n * Get item at index\n * @param index\n * @throws RangeError if index is out of bounds\n */\n public at(index: number): InternalType {\n if (this._isIndexOutOfBounds(index)) {\n throw new RangeError(`Index '${index}' is out of range.`);\n }\n\n return this._items[index];\n }\n\n /**\n * Add item to the collection\n * @param items\n * @param options\n * @returns The new length of the collection\n */\n public add(items: OneOrMore<ExternalType>, options?: CollectionAddOptions): number {\n return this._addOneOrMore(items, options);\n }\n\n abstract remove(item: unknown): number;\n\n /**\n * Map external type to internal type\n * @param item\n * @protected\n */\n protected abstract _map(item: ExternalType | InternalType): InternalType;\n\n protected _addOne(\n item: InternalType | ExternalType,\n options?: CollectionAddOptions\n ): number {\n if (isDefined(options) && isDefined(options.index)) {\n if (options.index === this.length) {\n this._items.push(this._map(item));\n\n return this.length;\n }\n\n if (this._isIndexOutOfBounds(options.index)) {\n throw new RangeError(`Index '${options.index}' is out of range.`);\n }\n\n this._items.splice(options.index, 0, this._map(item));\n\n return this.length;\n }\n\n this._items.push(this._map(item));\n\n return this._items.length;\n }\n\n protected _addOneOrMore(\n items: OneOrMore<ExternalType>,\n options?: CollectionAddOptions\n ): number {\n if (Array.isArray(items)) {\n if (isDefined(options) && isDefined(options.index)) {\n items = items.reverse();\n }\n\n for (const item of items) {\n this._addOne(item, options);\n }\n } else {\n this._addOne(items, options);\n }\n\n return this.length;\n }\n\n /**\n * Get the collection as an array\n */\n public toArray(): InternalType[] {\n return [...this._items];\n }\n\n public reduce<U>(\n callbackFn: (\n accumulator: U,\n currentValue: InternalType,\n currentIndex: number,\n array: InternalType[]\n ) => U,\n initialValue: U\n ): U {\n return this._items.reduce(callbackFn, initialValue);\n }\n}\n","export class FleetError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = new.target.name;\n }\n}\n\nexport class NotSupportedError extends FleetError {}\n\nexport class BlockchainProviderError extends FleetError {}\n"]}
1
+ {"version":3,"sources":["../src/utils/assertions.ts","../src/utils/array.ts","../src/utils/bigInt.ts","../src/utils/utxo.ts","../src/utils/object.ts","../src/utils/bytes.ts","../src/types/enums.ts","../src/models/collection.ts","../src/error.ts","../src/constants.ts"],"names":["min","max","tokenId","Network","AddressType"],"mappings":"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","file":"index.js","sourcesContent":["export type ErrorMessage = string | Error | (() => string);\n\n// biome-ignore lint/complexity/noBannedTypes: <explanation>\ntype Constructable = Function;\n\ntype JSPrimitive =\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"symbol\"\n | \"undefined\"\n | \"object\"\n | \"function\";\n\nexport function assert(condition: boolean, error: ErrorMessage): asserts condition {\n if (condition) return;\n\n let err: Error | undefined = undefined;\n switch (typeof error) {\n case \"string\":\n err = new Error(error);\n break;\n case \"function\":\n err = new Error(error());\n break;\n default:\n err = error;\n }\n\n throw err;\n}\n\nexport function assertTypeOf<T>(obj: T, expected: JSPrimitive): asserts obj {\n const type = typeof obj;\n\n if (type !== expected) {\n throw new Error(`Expected an object of type '${expected}', got '${type}'.`);\n }\n}\n\nfunction getTypeName(value: unknown): string {\n if (value === null) return \"null\";\n const type = typeof value;\n\n return type === \"object\" || type === \"function\"\n ? Object.prototype.toString.call(value).slice(8, -1)\n : type;\n}\n\nexport function assertInstanceOf<T>(obj: T, expected: Constructable): asserts obj {\n const condition = obj instanceof expected;\n\n if (!condition) {\n throw new Error(`Expected an instance of '${expected.name}', got '${getTypeName(obj)}'.`);\n }\n}\n\nexport function isEmpty<T>(target: T | null | undefined): target is undefined | null {\n if (!target) return true;\n\n return Array.isArray(target) ? target.length === 0 : Object.keys(target).length === 0;\n}\n\nexport function some<T>(target: T | null | undefined): target is T {\n return !isEmpty(target);\n}\n\nexport function isTruthy<T>(value?: T): value is NonNullable<T> {\n return !!value;\n}\n\nexport function isFalsy<T>(value?: T): value is undefined {\n return !value;\n}\n\nexport function isUndefined(v: unknown): v is undefined {\n return v === undefined || v === null || Number.isNaN(v);\n}\n\nexport function isDefined<T>(v: T | undefined): v is T {\n return !isUndefined(v);\n}\n\nexport function hasKey(o: unknown, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(o, key);\n}\n","import type { SortingDirection, SortingSelector } from \"../types\";\nimport { assert, isEmpty } from \"./assertions\";\n\ntype ObjectSelector<T> = (item: T) => T[keyof T];\n\n/**\n * Returns the first element of an array.\n * @param array\n * @throws an error if the array is empty.\n */\nexport function first(array: undefined): undefined;\nexport function first<T>(array: ArrayLike<T>): T;\nexport function first<T>(array: ArrayLike<T> | undefined): T | number | undefined {\n if (!array) return undefined;\n assert(array.length > 0, \"Empty array.\");\n\n return array[0];\n}\n\n/**\n * Returns the last element of an array.\n * @param array\n * @throws an error if the array is empty.\n */\nexport function last(array: undefined): undefined;\nexport function last<T>(array: ArrayLike<T>): T;\nexport function last<T>(array: ArrayLike<T> | undefined): T | undefined {\n if (!array) return undefined;\n assert(array.length > 0, \"Empty array.\");\n\n return at(array, -1);\n}\n\n/**\n * Returns the element at the specified index. Negative indices are counted from the end of the array.\n * @param array\n * @param index\n */\nexport function at(array: undefined, index: number): undefined;\nexport function at<T>(array: ArrayLike<T>, index: number): T;\nexport function at<T>(array: ArrayLike<T> | undefined, index: number): T | undefined {\n const len = array?.length;\n if (!len) return undefined;\n\n if (index < 0) {\n index += len;\n }\n\n return array[index];\n}\n\n/**\n * Check for duplicate elements using the equality operator\n */\nexport function hasDuplicates<T>(array: T[]): boolean {\n return array.some((item, index) => {\n return array.indexOf(item) !== index;\n });\n}\n\n/**\n * Check for duplicate keys in complex elements\n */\nexport function hasDuplicatesBy<T>(array: T[], selector: ObjectSelector<T>): boolean {\n return array.some((item, index) => {\n return array.findIndex((x) => selector(x) === selector(item)) !== index;\n });\n}\n\n/**\n * Turns an array into chunks of the specified size\n * @param array\n * @param size\n *\n * @example\n * ```\n * const array = [1, 2, 3, 4, 5];\n * const chunks = chunk(array, 2);\n * console.log(chunks);\n * // [[1, 2], [3, 4], [5]]\n * ```\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n if (isEmpty(array)) return [];\n if (array.length <= size) return [array];\n\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n\n return chunks;\n}\n\n/**\n * Sorts an array of objects by the specified property\n * @param array\n * @param iteratee\n * @param order\n *\n * @example\n * ```\n * const array = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }];\n * const sorted = orderBy(array, (item) => item.age, \"desc\");\n * console.log(sorted);\n * // [{ name: \"Jane\", age: 30 }, { name: \"John\", age: 25 }]\n * ```\n */\nexport function orderBy<T>(\n array: T[],\n iteratee: SortingSelector<T>,\n order: SortingDirection = \"asc\"\n): T[] {\n return [...array].sort((a: T, b: T) => {\n if (iteratee(a) > iteratee(b)) return order === \"asc\" ? 1 : -1;\n if (iteratee(a) < iteratee(b)) return order === \"asc\" ? -1 : 1;\n return 0;\n });\n}\n\n/**\n * Checks if arrays are equal\n * @param array1\n * @param array2\n *\n * @example\n * ```\n * const array1 = [1, 2, 3];\n * const array2 = [1, 2, 3];\n * const array3 = [1, 2, 4];\n * const array4 = [1, 2, 3, 4];\n * areEqual(array1, array2); // true\n * areEqual(array1, array3); // false\n * areEqual(array1, array4); // false\n * ```\n */\nexport function areEqual<T>(array1: ArrayLike<T>, array2: ArrayLike<T>): boolean {\n if (array1 === array2) {\n return true;\n }\n\n if (array1.length !== array2.length) {\n return false;\n }\n\n for (let i = 0; i < array1.length; i++) {\n if (array1[i] !== array2[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if arrays are equal by the specified property\n * @param array1\n * @param array2\n * @param selector\n *\n * @example\n * ```\n * const array1 = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }];\n * const array2 = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }];\n * const array3 = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 31 }];\n *\n * areEqualBy(array1, array2, (item) => item.age); // true\n * areEqualBy(array1, array3, (item) => item.age); // false\n * ```\n */\nexport function areEqualBy<T>(\n array1: ArrayLike<T>,\n array2: ArrayLike<T>,\n selector: ObjectSelector<T>\n): boolean {\n if (array1 === array2) {\n return true;\n }\n\n if (array1.length !== array2.length) {\n return false;\n }\n\n for (let i = 0; i < array1.length; i++) {\n if (selector(array1[i]) !== selector(array2[i])) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if the array starts with the specified target\n * @param array\n * @param target\n *\n * @example\n * ```\n * const array = [1, 2, 3, 4, 5];\n * const target1 = [1, 2];\n * const target2 = [1, 3];\n *\n * startsWith(array, target1); // true\n * startsWith(array, target2); // false\n * ```\n */\nexport function startsWith<T>(array: ArrayLike<T>, target: ArrayLike<T>, offset = 0): boolean {\n if (array === target) return true;\n if (target.length > array.length) return false;\n\n for (let i = 0; i < target.length; i++) {\n if (target[i] !== array[i + offset]) return false;\n }\n\n return true;\n}\n\n/**\n * Checks if the array ends with the specified target\n * @param array\n * @param target\n *\n * @example\n * ```\n * const array = [1, 2, 3, 4, 5];\n * const target1 = [4, 5];\n * const target2 = [3, 5];\n *\n * endsWith(array, target1); // true\n * endsWith(array, target2); // false\n * ```\n */\nexport function endsWith<T>(array: ArrayLike<T>, target: ArrayLike<T>): boolean {\n if (array === target) return true;\n if (target.length > array.length) return false;\n\n const offset = array.length - target.length;\n for (let i = target.length - 1; i >= 0; i--) {\n if (target[i] !== array[i + offset]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Makes an array unique by removing duplicate elements\n * @param array\n *\n * @example\n * ```\n * const array = [1, 2, 3, 3, 4, 5, 5];\n * const unique = uniq(array);\n * console.log(unique);\n * // [1, 2, 3, 4, 5]\n * ```\n */\nexport function uniq<T>(array: Array<T>): Array<T> {\n if (isEmpty(array)) {\n return array;\n }\n\n return Array.from(new Set(array));\n}\n\n/**\n * Makes an array unique by removing duplicate elements using the specified property\n * @param array\n * @param selector\n * @param selection\n *\n * @example\n * ```\n * const array = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }, { name: \"John\", age: 30 }];\n * const unique = uniqBy(array, (item) => item.name);\n * console.log(unique);\n * // [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }]\n * ```\n */\nexport function uniqBy<T>(\n array: Array<T>,\n selector: ObjectSelector<T>,\n selection: \"keep-first\" | \"keep-last\" = \"keep-first\"\n): Array<T> {\n if (isEmpty(array)) {\n return array;\n }\n\n return Array.from(\n array\n .reduce((map, e) => {\n const key = selector(e);\n\n if (selection === \"keep-first\" && map.has(key)) {\n return map;\n }\n\n return map.set(key, e);\n }, new Map())\n .values()\n );\n}\n\n/**\n * Returns the depth of an array\n * @param array\n *\n * @example\n * ```\n * const array = [1, 2, 3, [4, 5, [6, 7]]];\n * const depth = depthOf(array);\n * console.log(depth);\n * // 3\n */\nexport function depthOf(array: unknown | unknown[]): number {\n return Array.isArray(array) ? 1 + Math.max(0, ...array.map(depthOf)) : 0;\n}\n","import type { Amount } from \"../types\";\nimport { first } from \"./array\";\nimport { isEmpty, isUndefined } from \"./assertions\";\n\ntype NumberLike = string | number | bigint | boolean;\n\nexport const _0n = BigInt(0);\nexport const _1n = BigInt(1);\nexport const _2n = BigInt(2);\nexport const _7n = BigInt(7);\nexport const _10n = BigInt(10);\nexport const _63n = BigInt(63);\nexport const _127n = BigInt(127);\nexport const _128n = BigInt(128);\n\n/**\n * Ensure that the given value is a bigint\n * @param number\n */\nexport function ensureBigInt(number: NumberLike): bigint {\n return typeof number === \"bigint\" ? number : BigInt(number);\n}\n\ntype ParsingOptions = {\n /**\n * Number of decimals.\n */\n decimals?: number;\n\n /**\n * Thousand mark char.\n * Default: `.`\n */\n decimalMark?: string;\n};\n\n/**\n * Parse a decimal string into a bigint with options\n * @param input\n * @param options\n *\n * @example\n * undecimalize(\"129.8379183\", { decimals: 9 }) // 129837918300n\n * undecimalize(\"1\", { decimals: 2 }) // 100n\n * undecimalize(\"1\", 2) // 100n\n */\nexport function undecimalize(input: string, options?: ParsingOptions | number): bigint {\n if (!input) return _0n;\n\n options = typeof options === \"number\" ? { decimals: options } : options;\n if (isUndefined(options)) {\n options = {};\n }\n\n options.decimals = options.decimals || 0;\n options.decimalMark = options.decimalMark || \".\";\n\n const fragments = input.split(options.decimalMark);\n if (fragments.length > 2) {\n throw new Error(\"Invalid numeric string.\");\n }\n\n let [integer, decimal] = fragments;\n integer = removeLeadingZeros(integer);\n const negative = integer.startsWith(\"-\") ? \"-\" : \"\";\n\n if (!decimal) {\n decimal = \"0\".repeat(options.decimals);\n } else if (decimal.length < options.decimals) {\n decimal = decimal.padEnd(options.decimals, \"0\");\n }\n\n return BigInt(negative + _stripNonDigits(integer + decimal));\n}\n\n/**\n * Strip all non-digits from a string\n * @param value\n */\nfunction _stripNonDigits(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\ntype FormattingOptions = {\n /**\n * Number of decimals.\n */\n decimals: number;\n\n /**\n * Thousand mark char.\n */\n thousandMark?: string;\n\n /**\n * Decimal mark char.\n * Default: `.`\n */\n decimalMark?: string;\n};\n\n/**\n * Format a bigint into a decimal string with options\n * @param value\n * @param options\n *\n * @example\n * decimalize(129837918300n, { decimals: 9 }) // \"129.8379183\"\n * decimalize(100n, { decimals: 2 }) // \"1\"\n */\nexport function decimalize(value: Amount, options?: FormattingOptions | number): string {\n value = ensureBigInt(value);\n if (!options) {\n return value.toString();\n }\n\n options = typeof options === \"number\" ? { decimals: options } : options;\n options.decimals = options.decimals || 0;\n options.decimalMark = options.decimalMark || \".\";\n\n const pow = _10n ** BigInt(options.decimals);\n const integer = value / pow;\n const decimal = value - integer * pow;\n\n return buildFormattedDecimal(integer.toString(10), decimal.toString(10), options);\n}\n\n/**\n * Calculates the percentage of a bigint value with a specified precision.\n *\n * @param value - The input value to calculate the percentage of\n * @param percentage - The percentage to calculate (e.g., 5n for 5%)\n * @param precision - The number of decimal places for the percentage (defaults to 2n)\n * @returns The calculated percentage of the input value\n *\n * @example\n * For 5% of 200 with 2 decimal places:\n * percent(200n, 5n) // returns 10n\n */\nexport function percent(value: bigint, percentage: bigint, precision = _2n): bigint {\n return (value * percentage) / _10n ** precision;\n}\n\nfunction buildFormattedDecimal(\n integer: string,\n decimal: string,\n options: FormattingOptions\n): string {\n const int = addThousandMarks(integer, options.thousandMark);\n const dec = stripTrailingZeros(decimal.padStart(options.decimals, \"0\"));\n if (dec) return `${int}${options.decimalMark}${dec}`;\n return int;\n}\n\nfunction addThousandMarks(value: string, mark?: string): string {\n if (!mark) {\n return value;\n }\n\n return value.replace(/\\B(?=(\\d{3})+(?!\\d))/g, mark);\n}\n\nfunction stripTrailingZeros(value: string): string {\n if (!value.endsWith(\"0\")) {\n return value;\n }\n\n return value.replace(/\\.?0+$/, \"\");\n}\n\nfunction removeLeadingZeros(value: string): string {\n if (!value.startsWith(\"0\")) {\n return value;\n }\n\n return value.replace(/^0+\\.?/, \"\");\n}\n\n/**\n * Sum a collection of numbers by a given iteratee\n * @param collection\n * @param iteratee\n * @param condition\n *\n * @example\n * ```\n * const values = [\n * { key: 1, value: 100n },\n * { key: 2, value: 200n },\n * { key: 3, value: 300n },\n * { key: 4, value: 400n },\n * ];\n *\n * sumBy(values, x => x.value) // 1000n\n * sumBy(values, x => x.value, x => x.key < 0) // 0n\n * sumBy(values, x => x.value, x => x.key % 2 === 0) // 600n\n */\nexport function sumBy<T>(\n collection: readonly T[],\n iteratee: (value: T) => bigint,\n condition?: (value: T) => boolean\n): bigint {\n let acc = _0n;\n if (isEmpty(collection)) {\n return acc;\n }\n\n for (const item of collection) {\n if (isUndefined(condition) || condition(item)) {\n acc += iteratee(item);\n }\n }\n\n return acc;\n}\n\n/**\n * Get the minimum value from a collection of numbers\n * @param numbers\n */\nexport function min<T extends bigint | number>(...numbers: T[]): T {\n let min = first(numbers);\n\n for (const num of numbers) {\n if (num < min) {\n min = num;\n }\n }\n\n return min;\n}\n\n/**\n * Get the maximum value from a collection of numbers\n * @param numbers\n */\nexport function max<T extends bigint | number>(...numbers: T[]): T {\n let max = first(numbers);\n\n for (const num of numbers) {\n if (num > max) {\n max = num;\n }\n }\n\n return max;\n}\n","import type {\n Amount,\n Box,\n BoxCandidate,\n NonMandatoryRegisters,\n TokenAmount,\n TokenId\n} from \"../types\";\nimport { isDefined, isEmpty, isUndefined } from \"./assertions\";\nimport { ensureBigInt } from \"./bigInt\";\nimport { _0n } from \"./bigInt\";\n\nconst NANOERGS_TOKEN_ID = \"nanoErgs\";\n\n/**\n * Calculates the sum of all nanoErgs and tokens in the given boxes.\n * @param boxes\n *\n * @example\n * ```\n * const boxes = [\n * { value: \"10\", assets: [{ tokenId: \"test\", amount: \"20\" }] },\n * { value: 20n, assets: [{ tokenId: \"test\", amount: 30n }] }\n * ];\n *\n * const sum = utxoSum(boxes);\n * console.log(sum);\n * // { nanoErgs: 30n, tokens: [{ tokenId: \"test\", amount: 50n }] }\n * ```\n */\nexport function utxoSum(boxes: readonly BoxAmounts[]): BoxSummary;\nexport function utxoSum(boxes: readonly BoxAmounts[], tokenId: TokenId): bigint;\nexport function utxoSum(boxes: readonly BoxAmounts[], tokenId?: TokenId) {\n const balances: { [tokenId: string]: bigint } = {};\n\n for (const box of boxes) {\n if (isUndefined(tokenId) || tokenId === NANOERGS_TOKEN_ID) {\n balances[NANOERGS_TOKEN_ID] = (balances[NANOERGS_TOKEN_ID] || _0n) + ensureBigInt(box.value);\n }\n\n if (tokenId !== NANOERGS_TOKEN_ID) {\n for (const token of box.assets) {\n if (isDefined(tokenId) && tokenId !== token.tokenId) {\n continue;\n }\n\n balances[token.tokenId] = (balances[token.tokenId] || _0n) + ensureBigInt(token.amount);\n }\n }\n }\n\n if (isDefined(tokenId)) {\n return balances[tokenId] || _0n;\n }\n\n return {\n nanoErgs: balances[NANOERGS_TOKEN_ID] || _0n,\n tokens: Object.keys(balances)\n .filter((x) => x !== NANOERGS_TOKEN_ID)\n .map((tokenId) => ({ tokenId, amount: balances[tokenId] }))\n };\n}\n\n/**\n * Calculates the difference between two utxos or utxo sets.\n * @param minuend\n * @param subtrahend\n *\n * @example\n * ```\n * const minuend = [{ nanoErgs: 30n, tokens: [{ tokenId: \"test\", amount: 50n }] }];\n * const subtrahend = [{ nanoErgs: 10n, tokens: [{ tokenId: \"test\", amount: 20n }] }];\n * const diff = utxoDiff(minuend, subtrahend);\n * console.log(diff);\n * // { nanoErgs: 20n, tokens: [{ tokenId: \"test\", amount: 30n }] }\n * ```\n */\nexport function utxoDiff(\n minuend: BoxSummary | Box<Amount>[],\n subtrahend: BoxSummary | Box<Amount>[],\n ignoreSubtrahendLeftoverTokens = false\n): BoxSummary {\n if (Array.isArray(minuend)) minuend = utxoSum(minuend);\n if (Array.isArray(subtrahend)) subtrahend = utxoSum(subtrahend);\n\n const tokens: TokenAmount<bigint>[] = [];\n const nanoErgs = minuend.nanoErgs - subtrahend.nanoErgs;\n const subtrahendTokens = new Map(subtrahend.tokens.map((t) => [t.tokenId, t.amount]));\n\n for (const token of minuend.tokens) {\n const subtrahendAmount = subtrahendTokens.get(token.tokenId) || _0n;\n const balance = token.amount - (subtrahendAmount || _0n);\n\n if (balance !== _0n) {\n tokens.push({ tokenId: token.tokenId, amount: balance });\n }\n\n if (subtrahendAmount > _0n) {\n subtrahendTokens.delete(token.tokenId);\n }\n }\n\n if (!ignoreSubtrahendLeftoverTokens && subtrahendTokens.size > 0) {\n for (const [tokenId, amount] of subtrahendTokens) {\n tokens.push({ tokenId, amount: -amount });\n }\n }\n\n return { nanoErgs, tokens };\n}\n\nconst MIN_NON_MANDATORY_REGISTER_INDEX = 4;\nconst MAX_NON_MANDATORY_REGISTER_INDEX = 9;\n\n/**\n * Checks if the given registers are densely packed.\n * @param registers\n *\n * @example\n * ```\n * const registers = {\n * R4: \"deadbeef\",\n * R6: \"cafe\",\n * };\n * const result = areRegistersDenselyPacked(registers);\n * console.log(result);\n * // false\n */\nexport function areRegistersDenselyPacked(registers: NonMandatoryRegisters): boolean {\n let lastIndex = 0;\n for (let i = MIN_NON_MANDATORY_REGISTER_INDEX; i <= MAX_NON_MANDATORY_REGISTER_INDEX; i++) {\n const key = `R${i}` as keyof NonMandatoryRegisters;\n if (registers[key]) {\n if (i === MIN_NON_MANDATORY_REGISTER_INDEX) {\n lastIndex = i;\n continue;\n }\n\n if (i - lastIndex > 1) {\n return false;\n }\n\n lastIndex = i;\n }\n }\n\n return true;\n}\n\n/**\n * Filters the given utxos by the given filter parameters.\n * @param utxos\n * @param filterParams\n */\nexport function utxoFilter<T extends Amount>(utxos: Box<T>[], filterParams: UTxOFilterParams<T>) {\n if (isEmpty(filterParams) || isEmpty(utxos)) {\n return utxos;\n }\n\n const { by, max } = filterParams;\n let filtered = utxos;\n\n if (by) {\n filtered = utxos.filter(by);\n if (isEmpty(filtered)) {\n return filtered;\n }\n }\n\n if (!max) {\n return filtered;\n }\n\n if (isDefined(max.aggregatedDistinctTokens)) {\n const tokenIds = _getDistinctTokenIds(filtered, max.aggregatedDistinctTokens);\n filtered = filtered.filter(\n (utxo) => isEmpty(utxo.assets) || utxo.assets.every((token) => tokenIds.has(token.tokenId))\n );\n }\n\n if (isDefined(max.count) && filtered.length > max.count) {\n filtered = filtered.slice(0, max.count);\n }\n\n return filtered;\n}\n\nfunction _getDistinctTokenIds(utxos: Box[], max: number): Set<string> {\n const tokenIds = new Set<string>();\n\n for (let i = 0; i < utxos.length && tokenIds.size < max; i++) {\n if (isEmpty(utxos[i].assets) || utxos[i].assets.length > max) {\n continue;\n }\n\n for (const token of utxos[i].assets) {\n tokenIds.add(token.tokenId);\n }\n }\n\n return tokenIds;\n}\n\n/**\n * Parameters for filtering unspent transaction outputs (UTxOs).\n */\nexport type UTxOFilterParams<T extends Amount> = {\n /**\n * A function that returns a boolean indicating whether a given UTxO should be included in the filtered results.\n */\n by?: (utxo: Box<T>) => boolean;\n /**\n * An object specifying the maximum number of UTxOs and distinct tokens to include in the filtered results.\n */\n max?: {\n /**\n * The maximum number of UTxOs to include in the filtered results.\n */\n count?: number;\n /**\n * The maximum number of distinct tokens to include in the filtered results.\n */\n aggregatedDistinctTokens?: number;\n };\n};\n\nexport type BoxSummary = {\n nanoErgs: bigint;\n tokens: TokenAmount<bigint>[];\n};\n\nexport type BoxAmounts = {\n value: Amount;\n assets: TokenAmount<Amount>[];\n};\n\n/**\n * Ensures that the value and asset amounts of a given box are represented as BigInts.\n * @returns A new box object with BigInt representation for the value and asset amounts.\n */\nexport function ensureUTxOBigInt(box: Box<Amount>): Box<bigint>;\nexport function ensureUTxOBigInt(candidate: BoxCandidate<Amount>): BoxCandidate<bigint>;\nexport function ensureUTxOBigInt(\n box: Box<Amount> | BoxCandidate<Amount>\n): BoxCandidate<bigint> | Box<bigint> {\n return {\n ...box,\n value: ensureBigInt(box.value),\n assets: box.assets.map((token) => ({\n tokenId: token.tokenId,\n amount: ensureBigInt(token.amount)\n }))\n };\n}\n","import { isEmpty, isUndefined } from \"./assertions\";\n\n/**\n * Remove undefined values from an object\n * @param value\n *\n * @example\n * ```\n * const obj = { a: 1, b: undefined };\n * const result = clearUndefined(obj);\n * console.log(result); // { a: 1 }\n * ```\n */\nexport function clearUndefined(value: Record<string, unknown>) {\n const result: Record<string, unknown> = {};\n for (const key in value) {\n const val = value[key];\n if (!isUndefined(val)) {\n result[key] = val;\n }\n }\n\n return result;\n}\n\nexport type EnsureDefaultsOptions = { keepUndefinedKeys: boolean };\n\n/**\n * Ensure that the options object has all the default values\n * @param partial\n * @param defaults\n *\n * @example\n * ```\n * const options = { a: 1 };\n * const defaults = { a: 2, b: 3 };\n * const result = ensureDefaults(options, defaults);\n * console.log(result); // { a: 1, b: 3 }\n * ```\n */\nexport function ensureDefaults<T extends object, R extends object>(\n partial: T | undefined,\n defaults: R,\n options?: EnsureDefaultsOptions\n): R & T {\n if (isEmpty(partial)) return defaults as R & T;\n if (options?.keepUndefinedKeys) return { ...defaults, ...partial };\n\n const merged = { ...defaults, ...partial } as Record<string, unknown>;\n for (const key in merged) {\n merged[key] = partial[key as keyof T] ?? defaults[key as keyof R];\n }\n\n return merged as R & T;\n}\n","import { assertInstanceOf } from \".\";\n\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0));\n\n let pad = 0;\n for (const bytes of arrays) {\n assertInstanceOf(bytes, Uint8Array);\n\n r.set(bytes, pad);\n pad += bytes.length;\n }\n\n return r;\n}\n\nexport function isHex(value?: string) {\n if (!value || value.length % 2) return false;\n return !Number.isNaN(Number(value.startsWith(\"0x\") ? value : `0x${value}`));\n}\n\n/**\n * Get hex string size in bytes\n * @param hex\n * @returns the byte size if the hex string\n */\nexport function byteSizeOf(hex: string): number {\n return hex.length / 2;\n}\n","export type EnumConst<T extends object> = T[keyof T];\n\nexport enum Network {\n Mainnet = 0x00,\n Testnet = 0x10\n}\n\nexport enum AddressType {\n P2PK = 1,\n P2SH = 2,\n P2S = 3,\n ADH = 4\n}\n\nexport const ergoTreeHeaderFlags = {\n sizeInclusion: 0x08,\n constantSegregation: 0x10\n} as const;\n\nexport type ErgoTreeHeaderFlag = EnumConst<typeof ergoTreeHeaderFlags>;\n","import type { OneOrMore } from \"../types\";\nimport { isDefined } from \"../utils\";\n\nexport type CollectionAddOptions = { index?: number };\n\n/**\n * Collection abstract model\n *\n * @example\n * Define a new collection class with internal type `number` and external type `string`\n * ```\n * class TestCollection extends Collection<number, string> {\n * protected _map(item: string | number): number {\n * return Number(item);\n * }\n * // Some other methods\n * }\n * ```\n *\n */\nexport abstract class Collection<InternalType, ExternalType> implements Iterable<InternalType> {\n protected readonly _items: InternalType[];\n\n constructor() {\n this._items = [];\n }\n\n protected _isIndexOutOfBounds(index: number): boolean {\n return index < 0 || index >= this._items.length;\n }\n\n [Symbol.iterator](): Iterator<InternalType> {\n let counter = 0;\n\n return {\n next: () => {\n return {\n done: counter >= this.length,\n value: this._items[counter++]\n };\n }\n };\n }\n\n /**\n * Number of items in the collection\n */\n public get length(): number {\n return this._items.length;\n }\n\n /**\n * True if the collection is empty\n */\n public get isEmpty(): boolean {\n return this.length === 0;\n }\n\n /**\n * Get item at index\n * @param index\n * @throws RangeError if index is out of bounds\n */\n public at(index: number): InternalType {\n if (this._isIndexOutOfBounds(index)) {\n throw new RangeError(`Index '${index}' is out of range.`);\n }\n\n return this._items[index];\n }\n\n /**\n * Add item to the collection\n * @param items\n * @param options\n * @returns The new length of the collection\n */\n public add(items: OneOrMore<ExternalType>, options?: CollectionAddOptions): number {\n return this._addOneOrMore(items, options);\n }\n\n abstract remove(item: unknown): number;\n\n /**\n * Map external type to internal type\n * @param item\n * @protected\n */\n protected abstract _map(item: ExternalType | InternalType): InternalType;\n\n protected _addOne(item: InternalType | ExternalType, options?: CollectionAddOptions): number {\n if (isDefined(options) && isDefined(options.index)) {\n if (options.index === this.length) {\n this._items.push(this._map(item));\n\n return this.length;\n }\n\n if (this._isIndexOutOfBounds(options.index)) {\n throw new RangeError(`Index '${options.index}' is out of range.`);\n }\n\n this._items.splice(options.index, 0, this._map(item));\n\n return this.length;\n }\n\n this._items.push(this._map(item));\n\n return this._items.length;\n }\n\n protected _addOneOrMore(items: OneOrMore<ExternalType>, options?: CollectionAddOptions): number {\n if (Array.isArray(items)) {\n if (isDefined(options) && isDefined(options.index)) {\n items = items.reverse();\n }\n\n for (const item of items) {\n this._addOne(item, options);\n }\n } else {\n this._addOne(items, options);\n }\n\n return this.length;\n }\n\n /**\n * Get the collection as an array\n */\n public toArray(): InternalType[] {\n return [...this._items];\n }\n\n public reduce<U>(\n callbackFn: (\n accumulator: U,\n currentValue: InternalType,\n currentIndex: number,\n array: InternalType[]\n ) => U,\n initialValue: U\n ): U {\n return this._items.reduce(callbackFn, initialValue);\n }\n}\n","export class FleetError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = new.target.name;\n }\n}\n\nexport class NotSupportedError extends FleetError {}\n\nexport class BlockchainProviderError extends FleetError {}\n","export const FEE_CONTRACT =\n \"1005040004000e36100204a00b08cd0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ea02d192a39a8cc7a701730073011001020402d19683030193a38cc7b2a57300000193c2b2a57301007473027303830108cdeeac93b1a57304\";\nexport const RECOMMENDED_MIN_FEE_VALUE = BigInt(1100000);\n"]}
package/dist/index.mjs CHANGED
@@ -28,9 +28,7 @@ function getTypeName(value) {
28
28
  function assertInstanceOf(obj, expected) {
29
29
  const condition = obj instanceof expected;
30
30
  if (!condition) {
31
- throw new Error(
32
- `Expected an instance of '${expected.name}', got '${getTypeName(obj)}'.`
33
- );
31
+ throw new Error(`Expected an instance of '${expected.name}', got '${getTypeName(obj)}'.`);
34
32
  }
35
33
  }
36
34
  function isEmpty(target) {
@@ -129,27 +127,17 @@ function areEqualBy(array1, array2, selector) {
129
127
  }
130
128
  return true;
131
129
  }
132
- function startsWith(array, target) {
133
- if (array === target) {
134
- return true;
135
- }
136
- if (target.length > array.length) {
137
- return false;
138
- }
130
+ function startsWith(array, target, offset = 0) {
131
+ if (array === target) return true;
132
+ if (target.length > array.length) return false;
139
133
  for (let i = 0; i < target.length; i++) {
140
- if (target[i] !== array[i]) {
141
- return false;
142
- }
134
+ if (target[i] !== array[i + offset]) return false;
143
135
  }
144
136
  return true;
145
137
  }
146
138
  function endsWith(array, target) {
147
- if (array === target) {
148
- return true;
149
- }
150
- if (target.length > array.length) {
151
- return false;
152
- }
139
+ if (array === target) return true;
140
+ if (target.length > array.length) return false;
153
141
  const offset = array.length - target.length;
154
142
  for (let i = target.length - 1; i >= 0; i--) {
155
143
  if (target[i] !== array[i + offset]) {
@@ -568,6 +556,10 @@ var NotSupportedError = class extends FleetError {
568
556
  var BlockchainProviderError = class extends FleetError {
569
557
  };
570
558
 
571
- export { AddressType, BlockchainProviderError, Collection, FleetError, Network, NotSupportedError, _0n, _10n, _127n, _128n, _1n, _2n, _63n, _7n, areEqual, areEqualBy, areRegistersDenselyPacked, assert, assertInstanceOf, assertTypeOf, at, byteSizeOf, chunk, clearUndefined, concatBytes, decimalize, depthOf, endsWith, ensureBigInt, ensureDefaults, ensureUTxOBigInt, ergoTreeHeaderFlags, first, hasDuplicates, hasDuplicatesBy, hasKey, isDefined, isEmpty, isFalsy, isHex, isTruthy, isUndefined, last, max, min, orderBy, percent, some, startsWith, sumBy, undecimalize, uniq, uniqBy, utxoDiff, utxoFilter, utxoSum };
559
+ // src/constants.ts
560
+ var FEE_CONTRACT = "1005040004000e36100204a00b08cd0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ea02d192a39a8cc7a701730073011001020402d19683030193a38cc7b2a57300000193c2b2a57301007473027303830108cdeeac93b1a57304";
561
+ var RECOMMENDED_MIN_FEE_VALUE = BigInt(11e5);
562
+
563
+ export { AddressType, BlockchainProviderError, Collection, FEE_CONTRACT, FleetError, Network, NotSupportedError, RECOMMENDED_MIN_FEE_VALUE, _0n, _10n, _127n, _128n, _1n, _2n, _63n, _7n, areEqual, areEqualBy, areRegistersDenselyPacked, assert, assertInstanceOf, assertTypeOf, at, byteSizeOf, chunk, clearUndefined, concatBytes, decimalize, depthOf, endsWith, ensureBigInt, ensureDefaults, ensureUTxOBigInt, ergoTreeHeaderFlags, first, hasDuplicates, hasDuplicatesBy, hasKey, isDefined, isEmpty, isFalsy, isHex, isTruthy, isUndefined, last, max, min, orderBy, percent, some, startsWith, sumBy, undecimalize, uniq, uniqBy, utxoDiff, utxoFilter, utxoSum };
572
564
  //# sourceMappingURL=index.mjs.map
573
565
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/assertions.ts","../src/utils/array.ts","../src/utils/bigInt.ts","../src/utils/utxo.ts","../src/utils/object.ts","../src/utils/bytes.ts","../src/types/enums.ts","../src/models/collection.ts","../src/error.ts"],"names":["min","max","tokenId","Network","AddressType"],"mappings":"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","file":"index.mjs","sourcesContent":["export type ErrorMessage = string | Error | (() => string);\n\n// biome-ignore lint/complexity/noBannedTypes: <explanation>\ntype Constructable = Function;\n\ntype JSPrimitive =\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"symbol\"\n | \"undefined\"\n | \"object\"\n | \"function\";\n\nexport function assert(condition: boolean, error: ErrorMessage): asserts condition {\n if (condition) return;\n\n let err: Error | undefined = undefined;\n switch (typeof error) {\n case \"string\":\n err = new Error(error);\n break;\n case \"function\":\n err = new Error(error());\n break;\n default:\n err = error;\n }\n\n throw err;\n}\n\nexport function assertTypeOf<T>(obj: T, expected: JSPrimitive): asserts obj {\n const type = typeof obj;\n\n if (type !== expected) {\n throw new Error(`Expected an object of type '${expected}', got '${type}'.`);\n }\n}\n\nfunction getTypeName(value: unknown): string {\n if (value === null) return \"null\";\n const type = typeof value;\n\n return type === \"object\" || type === \"function\"\n ? Object.prototype.toString.call(value).slice(8, -1)\n : type;\n}\n\nexport function assertInstanceOf<T>(obj: T, expected: Constructable): asserts obj {\n const condition = obj instanceof expected;\n\n if (!condition) {\n throw new Error(\n `Expected an instance of '${expected.name}', got '${getTypeName(obj)}'.`\n );\n }\n}\n\nexport function isEmpty<T>(target: T | null | undefined): target is undefined | null {\n if (!target) return true;\n\n return Array.isArray(target) ? target.length === 0 : Object.keys(target).length === 0;\n}\n\nexport function some<T>(target: T | null | undefined): target is T {\n return !isEmpty(target);\n}\n\nexport function isTruthy<T>(value?: T): value is NonNullable<T> {\n return !!value;\n}\n\nexport function isFalsy<T>(value?: T): value is undefined {\n return !value;\n}\n\nexport function isUndefined(v: unknown): v is undefined {\n return v === undefined || v === null || Number.isNaN(v);\n}\n\nexport function isDefined<T>(v: T | undefined): v is T {\n return !isUndefined(v);\n}\n\nexport function hasKey(o: unknown, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(o, key);\n}\n","import type { SortingDirection, SortingSelector } from \"../types\";\nimport { assert, isEmpty } from \"./assertions\";\n\ntype ObjectSelector<T> = (item: T) => T[keyof T];\n\n/**\n * Returns the first element of an array.\n * @param array\n * @throws an error if the array is empty.\n */\nexport function first(array: undefined): undefined;\nexport function first<T>(array: ArrayLike<T>): T;\nexport function first<T>(array: ArrayLike<T> | undefined): T | number | undefined {\n if (!array) return undefined;\n assert(array.length > 0, \"Empty array.\");\n\n return array[0];\n}\n\n/**\n * Returns the last element of an array.\n * @param array\n * @throws an error if the array is empty.\n */\nexport function last(array: undefined): undefined;\nexport function last<T>(array: ArrayLike<T>): T;\nexport function last<T>(array: ArrayLike<T> | undefined): T | undefined {\n if (!array) return undefined;\n assert(array.length > 0, \"Empty array.\");\n\n return at(array, -1);\n}\n\n/**\n * Returns the element at the specified index. Negative indices are counted from the end of the array.\n * @param array\n * @param index\n */\nexport function at(array: undefined, index: number): undefined;\nexport function at<T>(array: ArrayLike<T>, index: number): T;\nexport function at<T>(array: ArrayLike<T> | undefined, index: number): T | undefined {\n const len = array?.length;\n if (!len) return undefined;\n\n if (index < 0) {\n index += len;\n }\n\n return array[index];\n}\n\n/**\n * Check for duplicate elements using the equality operator\n */\nexport function hasDuplicates<T>(array: T[]): boolean {\n return array.some((item, index) => {\n return array.indexOf(item) !== index;\n });\n}\n\n/**\n * Check for duplicate keys in complex elements\n */\nexport function hasDuplicatesBy<T>(array: T[], selector: ObjectSelector<T>): boolean {\n return array.some((item, index) => {\n return array.findIndex((x) => selector(x) === selector(item)) !== index;\n });\n}\n\n/**\n * Turns an array into chunks of the specified size\n * @param array\n * @param size\n *\n * @example\n * ```\n * const array = [1, 2, 3, 4, 5];\n * const chunks = chunk(array, 2);\n * console.log(chunks);\n * // [[1, 2], [3, 4], [5]]\n * ```\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n if (isEmpty(array)) return [];\n if (array.length <= size) return [array];\n\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n\n return chunks;\n}\n\n/**\n * Sorts an array of objects by the specified property\n * @param array\n * @param iteratee\n * @param order\n *\n * @example\n * ```\n * const array = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }];\n * const sorted = orderBy(array, (item) => item.age, \"desc\");\n * console.log(sorted);\n * // [{ name: \"Jane\", age: 30 }, { name: \"John\", age: 25 }]\n * ```\n */\nexport function orderBy<T>(\n array: T[],\n iteratee: SortingSelector<T>,\n order: SortingDirection = \"asc\"\n): T[] {\n return [...array].sort((a: T, b: T) => {\n if (iteratee(a) > iteratee(b)) return order === \"asc\" ? 1 : -1;\n if (iteratee(a) < iteratee(b)) return order === \"asc\" ? -1 : 1;\n return 0;\n });\n}\n\n/**\n * Checks if arrays are equal\n * @param array1\n * @param array2\n *\n * @example\n * ```\n * const array1 = [1, 2, 3];\n * const array2 = [1, 2, 3];\n * const array3 = [1, 2, 4];\n * const array4 = [1, 2, 3, 4];\n * areEqual(array1, array2); // true\n * areEqual(array1, array3); // false\n * areEqual(array1, array4); // false\n * ```\n */\nexport function areEqual<T>(array1: ArrayLike<T>, array2: ArrayLike<T>): boolean {\n if (array1 === array2) {\n return true;\n }\n\n if (array1.length !== array2.length) {\n return false;\n }\n\n for (let i = 0; i < array1.length; i++) {\n if (array1[i] !== array2[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if arrays are equal by the specified property\n * @param array1\n * @param array2\n * @param selector\n *\n * @example\n * ```\n * const array1 = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }];\n * const array2 = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }];\n * const array3 = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 31 }];\n *\n * areEqualBy(array1, array2, (item) => item.age); // true\n * areEqualBy(array1, array3, (item) => item.age); // false\n * ```\n */\nexport function areEqualBy<T>(\n array1: ArrayLike<T>,\n array2: ArrayLike<T>,\n selector: ObjectSelector<T>\n): boolean {\n if (array1 === array2) {\n return true;\n }\n\n if (array1.length !== array2.length) {\n return false;\n }\n\n for (let i = 0; i < array1.length; i++) {\n if (selector(array1[i]) !== selector(array2[i])) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if the array starts with the specified target\n * @param array\n * @param target\n *\n * @example\n * ```\n * const array = [1, 2, 3, 4, 5];\n * const target1 = [1, 2];\n * const target2 = [1, 3];\n *\n * startsWith(array, target1); // true\n * startsWith(array, target2); // false\n * ```\n */\nexport function startsWith<T>(array: ArrayLike<T>, target: ArrayLike<T>): boolean {\n if (array === target) {\n return true;\n }\n\n if (target.length > array.length) {\n return false;\n }\n\n for (let i = 0; i < target.length; i++) {\n if (target[i] !== array[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if the array ends with the specified target\n * @param array\n * @param target\n *\n * @example\n * ```\n * const array = [1, 2, 3, 4, 5];\n * const target1 = [4, 5];\n * const target2 = [3, 5];\n *\n * endsWith(array, target1); // true\n * endsWith(array, target2); // false\n * ```\n */\nexport function endsWith<T>(array: ArrayLike<T>, target: ArrayLike<T>): boolean {\n if (array === target) {\n return true;\n }\n\n if (target.length > array.length) {\n return false;\n }\n\n const offset = array.length - target.length;\n\n for (let i = target.length - 1; i >= 0; i--) {\n if (target[i] !== array[i + offset]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Makes an array unique by removing duplicate elements\n * @param array\n *\n * @example\n * ```\n * const array = [1, 2, 3, 3, 4, 5, 5];\n * const unique = uniq(array);\n * console.log(unique);\n * // [1, 2, 3, 4, 5]\n * ```\n */\nexport function uniq<T>(array: Array<T>): Array<T> {\n if (isEmpty(array)) {\n return array;\n }\n\n return Array.from(new Set(array));\n}\n\n/**\n * Makes an array unique by removing duplicate elements using the specified property\n * @param array\n * @param selector\n * @param selection\n *\n * @example\n * ```\n * const array = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }, { name: \"John\", age: 30 }];\n * const unique = uniqBy(array, (item) => item.name);\n * console.log(unique);\n * // [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }]\n * ```\n */\nexport function uniqBy<T>(\n array: Array<T>,\n selector: ObjectSelector<T>,\n selection: \"keep-first\" | \"keep-last\" = \"keep-first\"\n): Array<T> {\n if (isEmpty(array)) {\n return array;\n }\n\n return Array.from(\n array\n .reduce((map, e) => {\n const key = selector(e);\n\n if (selection === \"keep-first\" && map.has(key)) {\n return map;\n }\n\n return map.set(key, e);\n }, new Map())\n .values()\n );\n}\n\n/**\n * Returns the depth of an array\n * @param array\n *\n * @example\n * ```\n * const array = [1, 2, 3, [4, 5, [6, 7]]];\n * const depth = depthOf(array);\n * console.log(depth);\n * // 3\n */\nexport function depthOf(array: unknown | unknown[]): number {\n return Array.isArray(array) ? 1 + Math.max(0, ...array.map(depthOf)) : 0;\n}\n","import type { Amount } from \"../types\";\nimport { first } from \"./array\";\nimport { isEmpty, isUndefined } from \"./assertions\";\n\ntype NumberLike = string | number | bigint | boolean;\n\nexport const _0n = BigInt(0);\nexport const _1n = BigInt(1);\nexport const _2n = BigInt(2);\nexport const _7n = BigInt(7);\nexport const _10n = BigInt(10);\nexport const _63n = BigInt(63);\nexport const _127n = BigInt(127);\nexport const _128n = BigInt(128);\n\n/**\n * Ensure that the given value is a bigint\n * @param number\n */\nexport function ensureBigInt(number: NumberLike): bigint {\n return typeof number === \"bigint\" ? number : BigInt(number);\n}\n\ntype ParsingOptions = {\n /**\n * Number of decimals.\n */\n decimals?: number;\n\n /**\n * Thousand mark char.\n * Default: `.`\n */\n decimalMark?: string;\n};\n\n/**\n * Parse a decimal string into a bigint with options\n * @param input\n * @param options\n *\n * @example\n * undecimalize(\"129.8379183\", { decimals: 9 }) // 129837918300n\n * undecimalize(\"1\", { decimals: 2 }) // 100n\n * undecimalize(\"1\", 2) // 100n\n */\nexport function undecimalize(input: string, options?: ParsingOptions | number): bigint {\n if (!input) return _0n;\n\n options = typeof options === \"number\" ? { decimals: options } : options;\n if (isUndefined(options)) {\n options = {};\n }\n\n options.decimals = options.decimals || 0;\n options.decimalMark = options.decimalMark || \".\";\n\n const fragments = input.split(options.decimalMark);\n if (fragments.length > 2) {\n throw new Error(\"Invalid numeric string.\");\n }\n\n let [integer, decimal] = fragments;\n integer = removeLeadingZeros(integer);\n const negative = integer.startsWith(\"-\") ? \"-\" : \"\";\n\n if (!decimal) {\n decimal = \"0\".repeat(options.decimals);\n } else if (decimal.length < options.decimals) {\n decimal = decimal.padEnd(options.decimals, \"0\");\n }\n\n return BigInt(negative + _stripNonDigits(integer + decimal));\n}\n\n/**\n * Strip all non-digits from a string\n * @param value\n */\nfunction _stripNonDigits(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\ntype FormattingOptions = {\n /**\n * Number of decimals.\n */\n decimals: number;\n\n /**\n * Thousand mark char.\n */\n thousandMark?: string;\n\n /**\n * Decimal mark char.\n * Default: `.`\n */\n decimalMark?: string;\n};\n\n/**\n * Format a bigint into a decimal string with options\n * @param value\n * @param options\n *\n * @example\n * decimalize(129837918300n, { decimals: 9 }) // \"129.8379183\"\n * decimalize(100n, { decimals: 2 }) // \"1\"\n */\nexport function decimalize(value: Amount, options?: FormattingOptions | number): string {\n value = ensureBigInt(value);\n if (!options) {\n return value.toString();\n }\n\n options = typeof options === \"number\" ? { decimals: options } : options;\n options.decimals = options.decimals || 0;\n options.decimalMark = options.decimalMark || \".\";\n\n const pow = _10n ** BigInt(options.decimals);\n const integer = value / pow;\n const decimal = value - integer * pow;\n\n return buildFormattedDecimal(integer.toString(10), decimal.toString(10), options);\n}\n\n/**\n * Calculates the percentage of a bigint value with a specified precision.\n *\n * @param value - The input value to calculate the percentage of\n * @param percentage - The percentage to calculate (e.g., 5n for 5%)\n * @param precision - The number of decimal places for the percentage (defaults to 2n)\n * @returns The calculated percentage of the input value\n *\n * @example\n * For 5% of 200 with 2 decimal places:\n * percent(200n, 5n) // returns 10n\n */\nexport function percent(value: bigint, percentage: bigint, precision = _2n): bigint {\n return (value * percentage) / _10n ** precision;\n}\n\nfunction buildFormattedDecimal(\n integer: string,\n decimal: string,\n options: FormattingOptions\n): string {\n const int = addThousandMarks(integer, options.thousandMark);\n const dec = stripTrailingZeros(decimal.padStart(options.decimals, \"0\"));\n if (dec) return `${int}${options.decimalMark}${dec}`;\n return int;\n}\n\nfunction addThousandMarks(value: string, mark?: string): string {\n if (!mark) {\n return value;\n }\n\n return value.replace(/\\B(?=(\\d{3})+(?!\\d))/g, mark);\n}\n\nfunction stripTrailingZeros(value: string): string {\n if (!value.endsWith(\"0\")) {\n return value;\n }\n\n return value.replace(/\\.?0+$/, \"\");\n}\n\nfunction removeLeadingZeros(value: string): string {\n if (!value.startsWith(\"0\")) {\n return value;\n }\n\n return value.replace(/^0+\\.?/, \"\");\n}\n\n/**\n * Sum a collection of numbers by a given iteratee\n * @param collection\n * @param iteratee\n * @param condition\n *\n * @example\n * ```\n * const values = [\n * { key: 1, value: 100n },\n * { key: 2, value: 200n },\n * { key: 3, value: 300n },\n * { key: 4, value: 400n },\n * ];\n *\n * sumBy(values, x => x.value) // 1000n\n * sumBy(values, x => x.value, x => x.key < 0) // 0n\n * sumBy(values, x => x.value, x => x.key % 2 === 0) // 600n\n */\nexport function sumBy<T>(\n collection: readonly T[],\n iteratee: (value: T) => bigint,\n condition?: (value: T) => boolean\n): bigint {\n let acc = _0n;\n if (isEmpty(collection)) {\n return acc;\n }\n\n for (const item of collection) {\n if (isUndefined(condition) || condition(item)) {\n acc += iteratee(item);\n }\n }\n\n return acc;\n}\n\n/**\n * Get the minimum value from a collection of numbers\n * @param numbers\n */\nexport function min<T extends bigint | number>(...numbers: T[]): T {\n let min = first(numbers);\n\n for (const num of numbers) {\n if (num < min) {\n min = num;\n }\n }\n\n return min;\n}\n\n/**\n * Get the maximum value from a collection of numbers\n * @param numbers\n */\nexport function max<T extends bigint | number>(...numbers: T[]): T {\n let max = first(numbers);\n\n for (const num of numbers) {\n if (num > max) {\n max = num;\n }\n }\n\n return max;\n}\n","import type {\n Amount,\n Box,\n BoxCandidate,\n NonMandatoryRegisters,\n TokenAmount,\n TokenId\n} from \"../types\";\nimport { isDefined, isEmpty, isUndefined } from \"./assertions\";\nimport { ensureBigInt } from \"./bigInt\";\nimport { _0n } from \"./bigInt\";\n\nconst NANOERGS_TOKEN_ID = \"nanoErgs\";\n\n/**\n * Calculates the sum of all nanoErgs and tokens in the given boxes.\n * @param boxes\n *\n * @example\n * ```\n * const boxes = [\n * { value: \"10\", assets: [{ tokenId: \"test\", amount: \"20\" }] },\n * { value: 20n, assets: [{ tokenId: \"test\", amount: 30n }] }\n * ];\n *\n * const sum = utxoSum(boxes);\n * console.log(sum);\n * // { nanoErgs: 30n, tokens: [{ tokenId: \"test\", amount: 50n }] }\n * ```\n */\nexport function utxoSum(boxes: readonly BoxAmounts[]): BoxSummary;\nexport function utxoSum(boxes: readonly BoxAmounts[], tokenId: TokenId): bigint;\nexport function utxoSum(boxes: readonly BoxAmounts[], tokenId?: TokenId) {\n const balances: { [tokenId: string]: bigint } = {};\n\n for (const box of boxes) {\n if (isUndefined(tokenId) || tokenId === NANOERGS_TOKEN_ID) {\n balances[NANOERGS_TOKEN_ID] =\n (balances[NANOERGS_TOKEN_ID] || _0n) + ensureBigInt(box.value);\n }\n\n if (tokenId !== NANOERGS_TOKEN_ID) {\n for (const token of box.assets) {\n if (isDefined(tokenId) && tokenId !== token.tokenId) {\n continue;\n }\n\n balances[token.tokenId] =\n (balances[token.tokenId] || _0n) + ensureBigInt(token.amount);\n }\n }\n }\n\n if (isDefined(tokenId)) {\n return balances[tokenId] || _0n;\n }\n\n return {\n nanoErgs: balances[NANOERGS_TOKEN_ID] || _0n,\n tokens: Object.keys(balances)\n .filter((x) => x !== NANOERGS_TOKEN_ID)\n .map((tokenId) => ({ tokenId, amount: balances[tokenId] }))\n };\n}\n\n/**\n * Calculates the difference between two utxos or utxo sets.\n * @param minuend\n * @param subtrahend\n *\n * @example\n * ```\n * const minuend = [{ nanoErgs: 30n, tokens: [{ tokenId: \"test\", amount: 50n }] }];\n * const subtrahend = [{ nanoErgs: 10n, tokens: [{ tokenId: \"test\", amount: 20n }] }];\n * const diff = utxoDiff(minuend, subtrahend);\n * console.log(diff);\n * // { nanoErgs: 20n, tokens: [{ tokenId: \"test\", amount: 30n }] }\n * ```\n */\nexport function utxoDiff(\n minuend: BoxSummary | Box<Amount>[],\n subtrahend: BoxSummary | Box<Amount>[],\n ignoreSubtrahendLeftoverTokens = false\n): BoxSummary {\n if (Array.isArray(minuend)) minuend = utxoSum(minuend);\n if (Array.isArray(subtrahend)) subtrahend = utxoSum(subtrahend);\n\n const tokens: TokenAmount<bigint>[] = [];\n const nanoErgs = minuend.nanoErgs - subtrahend.nanoErgs;\n const subtrahendTokens = new Map(subtrahend.tokens.map((t) => [t.tokenId, t.amount]));\n\n for (const token of minuend.tokens) {\n const subtrahendAmount = subtrahendTokens.get(token.tokenId) || _0n;\n const balance = token.amount - (subtrahendAmount || _0n);\n\n if (balance !== _0n) {\n tokens.push({ tokenId: token.tokenId, amount: balance });\n }\n\n if (subtrahendAmount > _0n) {\n subtrahendTokens.delete(token.tokenId);\n }\n }\n\n if (!ignoreSubtrahendLeftoverTokens && subtrahendTokens.size > 0) {\n for (const [tokenId, amount] of subtrahendTokens) {\n tokens.push({ tokenId, amount: -amount });\n }\n }\n\n return { nanoErgs, tokens };\n}\n\nconst MIN_NON_MANDATORY_REGISTER_INDEX = 4;\nconst MAX_NON_MANDATORY_REGISTER_INDEX = 9;\n\n/**\n * Checks if the given registers are densely packed.\n * @param registers\n *\n * @example\n * ```\n * const registers = {\n * R4: \"deadbeef\",\n * R6: \"cafe\",\n * };\n * const result = areRegistersDenselyPacked(registers);\n * console.log(result);\n * // false\n */\nexport function areRegistersDenselyPacked(registers: NonMandatoryRegisters): boolean {\n let lastIndex = 0;\n for (\n let i = MIN_NON_MANDATORY_REGISTER_INDEX;\n i <= MAX_NON_MANDATORY_REGISTER_INDEX;\n i++\n ) {\n const key = `R${i}` as keyof NonMandatoryRegisters;\n if (registers[key]) {\n if (i === MIN_NON_MANDATORY_REGISTER_INDEX) {\n lastIndex = i;\n continue;\n }\n\n if (i - lastIndex > 1) {\n return false;\n }\n\n lastIndex = i;\n }\n }\n\n return true;\n}\n\n/**\n * Filters the given utxos by the given filter parameters.\n * @param utxos\n * @param filterParams\n */\nexport function utxoFilter<T extends Amount>(\n utxos: Box<T>[],\n filterParams: UTxOFilterParams<T>\n) {\n if (isEmpty(filterParams) || isEmpty(utxos)) {\n return utxos;\n }\n\n const { by, max } = filterParams;\n let filtered = utxos;\n\n if (by) {\n filtered = utxos.filter(by);\n if (isEmpty(filtered)) {\n return filtered;\n }\n }\n\n if (!max) {\n return filtered;\n }\n\n if (isDefined(max.aggregatedDistinctTokens)) {\n const tokenIds = _getDistinctTokenIds(filtered, max.aggregatedDistinctTokens);\n filtered = filtered.filter(\n (utxo) =>\n isEmpty(utxo.assets) || utxo.assets.every((token) => tokenIds.has(token.tokenId))\n );\n }\n\n if (isDefined(max.count) && filtered.length > max.count) {\n filtered = filtered.slice(0, max.count);\n }\n\n return filtered;\n}\n\nfunction _getDistinctTokenIds(utxos: Box[], max: number): Set<string> {\n const tokenIds = new Set<string>();\n\n for (let i = 0; i < utxos.length && tokenIds.size < max; i++) {\n if (isEmpty(utxos[i].assets) || utxos[i].assets.length > max) {\n continue;\n }\n\n for (const token of utxos[i].assets) {\n tokenIds.add(token.tokenId);\n }\n }\n\n return tokenIds;\n}\n\n/**\n * Parameters for filtering unspent transaction outputs (UTxOs).\n */\nexport type UTxOFilterParams<T extends Amount> = {\n /**\n * A function that returns a boolean indicating whether a given UTxO should be included in the filtered results.\n */\n by?: (utxo: Box<T>) => boolean;\n /**\n * An object specifying the maximum number of UTxOs and distinct tokens to include in the filtered results.\n */\n max?: {\n /**\n * The maximum number of UTxOs to include in the filtered results.\n */\n count?: number;\n /**\n * The maximum number of distinct tokens to include in the filtered results.\n */\n aggregatedDistinctTokens?: number;\n };\n};\n\nexport type BoxSummary = {\n nanoErgs: bigint;\n tokens: TokenAmount<bigint>[];\n};\n\nexport type BoxAmounts = {\n value: Amount;\n assets: TokenAmount<Amount>[];\n};\n\n/**\n * Ensures that the value and asset amounts of a given box are represented as BigInts.\n * @returns A new box object with BigInt representation for the value and asset amounts.\n */\nexport function ensureUTxOBigInt(box: Box<Amount>): Box<bigint>;\nexport function ensureUTxOBigInt(candidate: BoxCandidate<Amount>): BoxCandidate<bigint>;\nexport function ensureUTxOBigInt(\n box: Box<Amount> | BoxCandidate<Amount>\n): BoxCandidate<bigint> | Box<bigint> {\n return {\n ...box,\n value: ensureBigInt(box.value),\n assets: box.assets.map((token) => ({\n tokenId: token.tokenId,\n amount: ensureBigInt(token.amount)\n }))\n };\n}\n","import { isEmpty, isUndefined } from \"./assertions\";\n\n/**\n * Remove undefined values from an object\n * @param value\n *\n * @example\n * ```\n * const obj = { a: 1, b: undefined };\n * const result = clearUndefined(obj);\n * console.log(result); // { a: 1 }\n * ```\n */\nexport function clearUndefined(value: Record<string, unknown>) {\n const result: Record<string, unknown> = {};\n for (const key in value) {\n const val = value[key];\n if (!isUndefined(val)) {\n result[key] = val;\n }\n }\n\n return result;\n}\n\nexport type EnsureDefaultsOptions = { keepUndefinedKeys: boolean };\n\n/**\n * Ensure that the options object has all the default values\n * @param partial\n * @param defaults\n *\n * @example\n * ```\n * const options = { a: 1 };\n * const defaults = { a: 2, b: 3 };\n * const result = ensureDefaults(options, defaults);\n * console.log(result); // { a: 1, b: 3 }\n * ```\n */\nexport function ensureDefaults<T extends object, R extends object>(\n partial: T | undefined,\n defaults: R,\n options?: EnsureDefaultsOptions\n): R & T {\n if (isEmpty(partial)) return defaults as R & T;\n if (options?.keepUndefinedKeys) return { ...defaults, ...partial };\n\n const merged = { ...defaults, ...partial } as Record<string, unknown>;\n for (const key in merged) {\n merged[key] = partial[key as keyof T] ?? defaults[key as keyof R];\n }\n\n return merged as R & T;\n}\n","import { assertInstanceOf } from \".\";\n\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0));\n\n let pad = 0;\n for (const bytes of arrays) {\n assertInstanceOf(bytes, Uint8Array);\n\n r.set(bytes, pad);\n pad += bytes.length;\n }\n\n return r;\n}\n\nexport function isHex(value?: string) {\n if (!value || value.length % 2) return false;\n return !Number.isNaN(Number(value.startsWith(\"0x\") ? value : `0x${value}`));\n}\n\n/**\n * Get hex string size in bytes\n * @param hex\n * @returns the byte size if the hex string\n */\nexport function byteSizeOf(hex: string): number {\n return hex.length / 2;\n}\n","export type EnumConst<T extends object> = T[keyof T];\n\nexport enum Network {\n Mainnet = 0x00,\n Testnet = 0x10\n}\n\nexport enum AddressType {\n P2PK = 1,\n P2SH = 2,\n P2S = 3,\n ADH = 4\n}\n\nexport const ergoTreeHeaderFlags = {\n sizeInclusion: 0x08,\n constantSegregation: 0x10\n} as const;\n\nexport type ErgoTreeHeaderFlag = EnumConst<typeof ergoTreeHeaderFlags>;\n","import type { OneOrMore } from \"../types\";\nimport { isDefined } from \"../utils\";\n\nexport type CollectionAddOptions = { index?: number };\n\n/**\n * Collection abstract model\n *\n * @example\n * Define a new collection class with internal type `number` and external type `string`\n * ```\n * class TestCollection extends Collection<number, string> {\n * protected _map(item: string | number): number {\n * return Number(item);\n * }\n * // Some other methods\n * }\n * ```\n *\n */\nexport abstract class Collection<InternalType, ExternalType>\n implements Iterable<InternalType>\n{\n protected readonly _items: InternalType[];\n\n constructor() {\n this._items = [];\n }\n\n protected _isIndexOutOfBounds(index: number): boolean {\n return index < 0 || index >= this._items.length;\n }\n\n [Symbol.iterator](): Iterator<InternalType> {\n let counter = 0;\n\n return {\n next: () => {\n return {\n done: counter >= this.length,\n value: this._items[counter++]\n };\n }\n };\n }\n\n /**\n * Number of items in the collection\n */\n public get length(): number {\n return this._items.length;\n }\n\n /**\n * True if the collection is empty\n */\n public get isEmpty(): boolean {\n return this.length === 0;\n }\n\n /**\n * Get item at index\n * @param index\n * @throws RangeError if index is out of bounds\n */\n public at(index: number): InternalType {\n if (this._isIndexOutOfBounds(index)) {\n throw new RangeError(`Index '${index}' is out of range.`);\n }\n\n return this._items[index];\n }\n\n /**\n * Add item to the collection\n * @param items\n * @param options\n * @returns The new length of the collection\n */\n public add(items: OneOrMore<ExternalType>, options?: CollectionAddOptions): number {\n return this._addOneOrMore(items, options);\n }\n\n abstract remove(item: unknown): number;\n\n /**\n * Map external type to internal type\n * @param item\n * @protected\n */\n protected abstract _map(item: ExternalType | InternalType): InternalType;\n\n protected _addOne(\n item: InternalType | ExternalType,\n options?: CollectionAddOptions\n ): number {\n if (isDefined(options) && isDefined(options.index)) {\n if (options.index === this.length) {\n this._items.push(this._map(item));\n\n return this.length;\n }\n\n if (this._isIndexOutOfBounds(options.index)) {\n throw new RangeError(`Index '${options.index}' is out of range.`);\n }\n\n this._items.splice(options.index, 0, this._map(item));\n\n return this.length;\n }\n\n this._items.push(this._map(item));\n\n return this._items.length;\n }\n\n protected _addOneOrMore(\n items: OneOrMore<ExternalType>,\n options?: CollectionAddOptions\n ): number {\n if (Array.isArray(items)) {\n if (isDefined(options) && isDefined(options.index)) {\n items = items.reverse();\n }\n\n for (const item of items) {\n this._addOne(item, options);\n }\n } else {\n this._addOne(items, options);\n }\n\n return this.length;\n }\n\n /**\n * Get the collection as an array\n */\n public toArray(): InternalType[] {\n return [...this._items];\n }\n\n public reduce<U>(\n callbackFn: (\n accumulator: U,\n currentValue: InternalType,\n currentIndex: number,\n array: InternalType[]\n ) => U,\n initialValue: U\n ): U {\n return this._items.reduce(callbackFn, initialValue);\n }\n}\n","export class FleetError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = new.target.name;\n }\n}\n\nexport class NotSupportedError extends FleetError {}\n\nexport class BlockchainProviderError extends FleetError {}\n"]}
1
+ {"version":3,"sources":["../src/utils/assertions.ts","../src/utils/array.ts","../src/utils/bigInt.ts","../src/utils/utxo.ts","../src/utils/object.ts","../src/utils/bytes.ts","../src/types/enums.ts","../src/models/collection.ts","../src/error.ts","../src/constants.ts"],"names":["min","max","tokenId","Network","AddressType"],"mappings":"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","file":"index.mjs","sourcesContent":["export type ErrorMessage = string | Error | (() => string);\n\n// biome-ignore lint/complexity/noBannedTypes: <explanation>\ntype Constructable = Function;\n\ntype JSPrimitive =\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"symbol\"\n | \"undefined\"\n | \"object\"\n | \"function\";\n\nexport function assert(condition: boolean, error: ErrorMessage): asserts condition {\n if (condition) return;\n\n let err: Error | undefined = undefined;\n switch (typeof error) {\n case \"string\":\n err = new Error(error);\n break;\n case \"function\":\n err = new Error(error());\n break;\n default:\n err = error;\n }\n\n throw err;\n}\n\nexport function assertTypeOf<T>(obj: T, expected: JSPrimitive): asserts obj {\n const type = typeof obj;\n\n if (type !== expected) {\n throw new Error(`Expected an object of type '${expected}', got '${type}'.`);\n }\n}\n\nfunction getTypeName(value: unknown): string {\n if (value === null) return \"null\";\n const type = typeof value;\n\n return type === \"object\" || type === \"function\"\n ? Object.prototype.toString.call(value).slice(8, -1)\n : type;\n}\n\nexport function assertInstanceOf<T>(obj: T, expected: Constructable): asserts obj {\n const condition = obj instanceof expected;\n\n if (!condition) {\n throw new Error(`Expected an instance of '${expected.name}', got '${getTypeName(obj)}'.`);\n }\n}\n\nexport function isEmpty<T>(target: T | null | undefined): target is undefined | null {\n if (!target) return true;\n\n return Array.isArray(target) ? target.length === 0 : Object.keys(target).length === 0;\n}\n\nexport function some<T>(target: T | null | undefined): target is T {\n return !isEmpty(target);\n}\n\nexport function isTruthy<T>(value?: T): value is NonNullable<T> {\n return !!value;\n}\n\nexport function isFalsy<T>(value?: T): value is undefined {\n return !value;\n}\n\nexport function isUndefined(v: unknown): v is undefined {\n return v === undefined || v === null || Number.isNaN(v);\n}\n\nexport function isDefined<T>(v: T | undefined): v is T {\n return !isUndefined(v);\n}\n\nexport function hasKey(o: unknown, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(o, key);\n}\n","import type { SortingDirection, SortingSelector } from \"../types\";\nimport { assert, isEmpty } from \"./assertions\";\n\ntype ObjectSelector<T> = (item: T) => T[keyof T];\n\n/**\n * Returns the first element of an array.\n * @param array\n * @throws an error if the array is empty.\n */\nexport function first(array: undefined): undefined;\nexport function first<T>(array: ArrayLike<T>): T;\nexport function first<T>(array: ArrayLike<T> | undefined): T | number | undefined {\n if (!array) return undefined;\n assert(array.length > 0, \"Empty array.\");\n\n return array[0];\n}\n\n/**\n * Returns the last element of an array.\n * @param array\n * @throws an error if the array is empty.\n */\nexport function last(array: undefined): undefined;\nexport function last<T>(array: ArrayLike<T>): T;\nexport function last<T>(array: ArrayLike<T> | undefined): T | undefined {\n if (!array) return undefined;\n assert(array.length > 0, \"Empty array.\");\n\n return at(array, -1);\n}\n\n/**\n * Returns the element at the specified index. Negative indices are counted from the end of the array.\n * @param array\n * @param index\n */\nexport function at(array: undefined, index: number): undefined;\nexport function at<T>(array: ArrayLike<T>, index: number): T;\nexport function at<T>(array: ArrayLike<T> | undefined, index: number): T | undefined {\n const len = array?.length;\n if (!len) return undefined;\n\n if (index < 0) {\n index += len;\n }\n\n return array[index];\n}\n\n/**\n * Check for duplicate elements using the equality operator\n */\nexport function hasDuplicates<T>(array: T[]): boolean {\n return array.some((item, index) => {\n return array.indexOf(item) !== index;\n });\n}\n\n/**\n * Check for duplicate keys in complex elements\n */\nexport function hasDuplicatesBy<T>(array: T[], selector: ObjectSelector<T>): boolean {\n return array.some((item, index) => {\n return array.findIndex((x) => selector(x) === selector(item)) !== index;\n });\n}\n\n/**\n * Turns an array into chunks of the specified size\n * @param array\n * @param size\n *\n * @example\n * ```\n * const array = [1, 2, 3, 4, 5];\n * const chunks = chunk(array, 2);\n * console.log(chunks);\n * // [[1, 2], [3, 4], [5]]\n * ```\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n if (isEmpty(array)) return [];\n if (array.length <= size) return [array];\n\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n\n return chunks;\n}\n\n/**\n * Sorts an array of objects by the specified property\n * @param array\n * @param iteratee\n * @param order\n *\n * @example\n * ```\n * const array = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }];\n * const sorted = orderBy(array, (item) => item.age, \"desc\");\n * console.log(sorted);\n * // [{ name: \"Jane\", age: 30 }, { name: \"John\", age: 25 }]\n * ```\n */\nexport function orderBy<T>(\n array: T[],\n iteratee: SortingSelector<T>,\n order: SortingDirection = \"asc\"\n): T[] {\n return [...array].sort((a: T, b: T) => {\n if (iteratee(a) > iteratee(b)) return order === \"asc\" ? 1 : -1;\n if (iteratee(a) < iteratee(b)) return order === \"asc\" ? -1 : 1;\n return 0;\n });\n}\n\n/**\n * Checks if arrays are equal\n * @param array1\n * @param array2\n *\n * @example\n * ```\n * const array1 = [1, 2, 3];\n * const array2 = [1, 2, 3];\n * const array3 = [1, 2, 4];\n * const array4 = [1, 2, 3, 4];\n * areEqual(array1, array2); // true\n * areEqual(array1, array3); // false\n * areEqual(array1, array4); // false\n * ```\n */\nexport function areEqual<T>(array1: ArrayLike<T>, array2: ArrayLike<T>): boolean {\n if (array1 === array2) {\n return true;\n }\n\n if (array1.length !== array2.length) {\n return false;\n }\n\n for (let i = 0; i < array1.length; i++) {\n if (array1[i] !== array2[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if arrays are equal by the specified property\n * @param array1\n * @param array2\n * @param selector\n *\n * @example\n * ```\n * const array1 = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }];\n * const array2 = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }];\n * const array3 = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 31 }];\n *\n * areEqualBy(array1, array2, (item) => item.age); // true\n * areEqualBy(array1, array3, (item) => item.age); // false\n * ```\n */\nexport function areEqualBy<T>(\n array1: ArrayLike<T>,\n array2: ArrayLike<T>,\n selector: ObjectSelector<T>\n): boolean {\n if (array1 === array2) {\n return true;\n }\n\n if (array1.length !== array2.length) {\n return false;\n }\n\n for (let i = 0; i < array1.length; i++) {\n if (selector(array1[i]) !== selector(array2[i])) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if the array starts with the specified target\n * @param array\n * @param target\n *\n * @example\n * ```\n * const array = [1, 2, 3, 4, 5];\n * const target1 = [1, 2];\n * const target2 = [1, 3];\n *\n * startsWith(array, target1); // true\n * startsWith(array, target2); // false\n * ```\n */\nexport function startsWith<T>(array: ArrayLike<T>, target: ArrayLike<T>, offset = 0): boolean {\n if (array === target) return true;\n if (target.length > array.length) return false;\n\n for (let i = 0; i < target.length; i++) {\n if (target[i] !== array[i + offset]) return false;\n }\n\n return true;\n}\n\n/**\n * Checks if the array ends with the specified target\n * @param array\n * @param target\n *\n * @example\n * ```\n * const array = [1, 2, 3, 4, 5];\n * const target1 = [4, 5];\n * const target2 = [3, 5];\n *\n * endsWith(array, target1); // true\n * endsWith(array, target2); // false\n * ```\n */\nexport function endsWith<T>(array: ArrayLike<T>, target: ArrayLike<T>): boolean {\n if (array === target) return true;\n if (target.length > array.length) return false;\n\n const offset = array.length - target.length;\n for (let i = target.length - 1; i >= 0; i--) {\n if (target[i] !== array[i + offset]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Makes an array unique by removing duplicate elements\n * @param array\n *\n * @example\n * ```\n * const array = [1, 2, 3, 3, 4, 5, 5];\n * const unique = uniq(array);\n * console.log(unique);\n * // [1, 2, 3, 4, 5]\n * ```\n */\nexport function uniq<T>(array: Array<T>): Array<T> {\n if (isEmpty(array)) {\n return array;\n }\n\n return Array.from(new Set(array));\n}\n\n/**\n * Makes an array unique by removing duplicate elements using the specified property\n * @param array\n * @param selector\n * @param selection\n *\n * @example\n * ```\n * const array = [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }, { name: \"John\", age: 30 }];\n * const unique = uniqBy(array, (item) => item.name);\n * console.log(unique);\n * // [{ name: \"John\", age: 25 }, { name: \"Jane\", age: 30 }]\n * ```\n */\nexport function uniqBy<T>(\n array: Array<T>,\n selector: ObjectSelector<T>,\n selection: \"keep-first\" | \"keep-last\" = \"keep-first\"\n): Array<T> {\n if (isEmpty(array)) {\n return array;\n }\n\n return Array.from(\n array\n .reduce((map, e) => {\n const key = selector(e);\n\n if (selection === \"keep-first\" && map.has(key)) {\n return map;\n }\n\n return map.set(key, e);\n }, new Map())\n .values()\n );\n}\n\n/**\n * Returns the depth of an array\n * @param array\n *\n * @example\n * ```\n * const array = [1, 2, 3, [4, 5, [6, 7]]];\n * const depth = depthOf(array);\n * console.log(depth);\n * // 3\n */\nexport function depthOf(array: unknown | unknown[]): number {\n return Array.isArray(array) ? 1 + Math.max(0, ...array.map(depthOf)) : 0;\n}\n","import type { Amount } from \"../types\";\nimport { first } from \"./array\";\nimport { isEmpty, isUndefined } from \"./assertions\";\n\ntype NumberLike = string | number | bigint | boolean;\n\nexport const _0n = BigInt(0);\nexport const _1n = BigInt(1);\nexport const _2n = BigInt(2);\nexport const _7n = BigInt(7);\nexport const _10n = BigInt(10);\nexport const _63n = BigInt(63);\nexport const _127n = BigInt(127);\nexport const _128n = BigInt(128);\n\n/**\n * Ensure that the given value is a bigint\n * @param number\n */\nexport function ensureBigInt(number: NumberLike): bigint {\n return typeof number === \"bigint\" ? number : BigInt(number);\n}\n\ntype ParsingOptions = {\n /**\n * Number of decimals.\n */\n decimals?: number;\n\n /**\n * Thousand mark char.\n * Default: `.`\n */\n decimalMark?: string;\n};\n\n/**\n * Parse a decimal string into a bigint with options\n * @param input\n * @param options\n *\n * @example\n * undecimalize(\"129.8379183\", { decimals: 9 }) // 129837918300n\n * undecimalize(\"1\", { decimals: 2 }) // 100n\n * undecimalize(\"1\", 2) // 100n\n */\nexport function undecimalize(input: string, options?: ParsingOptions | number): bigint {\n if (!input) return _0n;\n\n options = typeof options === \"number\" ? { decimals: options } : options;\n if (isUndefined(options)) {\n options = {};\n }\n\n options.decimals = options.decimals || 0;\n options.decimalMark = options.decimalMark || \".\";\n\n const fragments = input.split(options.decimalMark);\n if (fragments.length > 2) {\n throw new Error(\"Invalid numeric string.\");\n }\n\n let [integer, decimal] = fragments;\n integer = removeLeadingZeros(integer);\n const negative = integer.startsWith(\"-\") ? \"-\" : \"\";\n\n if (!decimal) {\n decimal = \"0\".repeat(options.decimals);\n } else if (decimal.length < options.decimals) {\n decimal = decimal.padEnd(options.decimals, \"0\");\n }\n\n return BigInt(negative + _stripNonDigits(integer + decimal));\n}\n\n/**\n * Strip all non-digits from a string\n * @param value\n */\nfunction _stripNonDigits(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\ntype FormattingOptions = {\n /**\n * Number of decimals.\n */\n decimals: number;\n\n /**\n * Thousand mark char.\n */\n thousandMark?: string;\n\n /**\n * Decimal mark char.\n * Default: `.`\n */\n decimalMark?: string;\n};\n\n/**\n * Format a bigint into a decimal string with options\n * @param value\n * @param options\n *\n * @example\n * decimalize(129837918300n, { decimals: 9 }) // \"129.8379183\"\n * decimalize(100n, { decimals: 2 }) // \"1\"\n */\nexport function decimalize(value: Amount, options?: FormattingOptions | number): string {\n value = ensureBigInt(value);\n if (!options) {\n return value.toString();\n }\n\n options = typeof options === \"number\" ? { decimals: options } : options;\n options.decimals = options.decimals || 0;\n options.decimalMark = options.decimalMark || \".\";\n\n const pow = _10n ** BigInt(options.decimals);\n const integer = value / pow;\n const decimal = value - integer * pow;\n\n return buildFormattedDecimal(integer.toString(10), decimal.toString(10), options);\n}\n\n/**\n * Calculates the percentage of a bigint value with a specified precision.\n *\n * @param value - The input value to calculate the percentage of\n * @param percentage - The percentage to calculate (e.g., 5n for 5%)\n * @param precision - The number of decimal places for the percentage (defaults to 2n)\n * @returns The calculated percentage of the input value\n *\n * @example\n * For 5% of 200 with 2 decimal places:\n * percent(200n, 5n) // returns 10n\n */\nexport function percent(value: bigint, percentage: bigint, precision = _2n): bigint {\n return (value * percentage) / _10n ** precision;\n}\n\nfunction buildFormattedDecimal(\n integer: string,\n decimal: string,\n options: FormattingOptions\n): string {\n const int = addThousandMarks(integer, options.thousandMark);\n const dec = stripTrailingZeros(decimal.padStart(options.decimals, \"0\"));\n if (dec) return `${int}${options.decimalMark}${dec}`;\n return int;\n}\n\nfunction addThousandMarks(value: string, mark?: string): string {\n if (!mark) {\n return value;\n }\n\n return value.replace(/\\B(?=(\\d{3})+(?!\\d))/g, mark);\n}\n\nfunction stripTrailingZeros(value: string): string {\n if (!value.endsWith(\"0\")) {\n return value;\n }\n\n return value.replace(/\\.?0+$/, \"\");\n}\n\nfunction removeLeadingZeros(value: string): string {\n if (!value.startsWith(\"0\")) {\n return value;\n }\n\n return value.replace(/^0+\\.?/, \"\");\n}\n\n/**\n * Sum a collection of numbers by a given iteratee\n * @param collection\n * @param iteratee\n * @param condition\n *\n * @example\n * ```\n * const values = [\n * { key: 1, value: 100n },\n * { key: 2, value: 200n },\n * { key: 3, value: 300n },\n * { key: 4, value: 400n },\n * ];\n *\n * sumBy(values, x => x.value) // 1000n\n * sumBy(values, x => x.value, x => x.key < 0) // 0n\n * sumBy(values, x => x.value, x => x.key % 2 === 0) // 600n\n */\nexport function sumBy<T>(\n collection: readonly T[],\n iteratee: (value: T) => bigint,\n condition?: (value: T) => boolean\n): bigint {\n let acc = _0n;\n if (isEmpty(collection)) {\n return acc;\n }\n\n for (const item of collection) {\n if (isUndefined(condition) || condition(item)) {\n acc += iteratee(item);\n }\n }\n\n return acc;\n}\n\n/**\n * Get the minimum value from a collection of numbers\n * @param numbers\n */\nexport function min<T extends bigint | number>(...numbers: T[]): T {\n let min = first(numbers);\n\n for (const num of numbers) {\n if (num < min) {\n min = num;\n }\n }\n\n return min;\n}\n\n/**\n * Get the maximum value from a collection of numbers\n * @param numbers\n */\nexport function max<T extends bigint | number>(...numbers: T[]): T {\n let max = first(numbers);\n\n for (const num of numbers) {\n if (num > max) {\n max = num;\n }\n }\n\n return max;\n}\n","import type {\n Amount,\n Box,\n BoxCandidate,\n NonMandatoryRegisters,\n TokenAmount,\n TokenId\n} from \"../types\";\nimport { isDefined, isEmpty, isUndefined } from \"./assertions\";\nimport { ensureBigInt } from \"./bigInt\";\nimport { _0n } from \"./bigInt\";\n\nconst NANOERGS_TOKEN_ID = \"nanoErgs\";\n\n/**\n * Calculates the sum of all nanoErgs and tokens in the given boxes.\n * @param boxes\n *\n * @example\n * ```\n * const boxes = [\n * { value: \"10\", assets: [{ tokenId: \"test\", amount: \"20\" }] },\n * { value: 20n, assets: [{ tokenId: \"test\", amount: 30n }] }\n * ];\n *\n * const sum = utxoSum(boxes);\n * console.log(sum);\n * // { nanoErgs: 30n, tokens: [{ tokenId: \"test\", amount: 50n }] }\n * ```\n */\nexport function utxoSum(boxes: readonly BoxAmounts[]): BoxSummary;\nexport function utxoSum(boxes: readonly BoxAmounts[], tokenId: TokenId): bigint;\nexport function utxoSum(boxes: readonly BoxAmounts[], tokenId?: TokenId) {\n const balances: { [tokenId: string]: bigint } = {};\n\n for (const box of boxes) {\n if (isUndefined(tokenId) || tokenId === NANOERGS_TOKEN_ID) {\n balances[NANOERGS_TOKEN_ID] = (balances[NANOERGS_TOKEN_ID] || _0n) + ensureBigInt(box.value);\n }\n\n if (tokenId !== NANOERGS_TOKEN_ID) {\n for (const token of box.assets) {\n if (isDefined(tokenId) && tokenId !== token.tokenId) {\n continue;\n }\n\n balances[token.tokenId] = (balances[token.tokenId] || _0n) + ensureBigInt(token.amount);\n }\n }\n }\n\n if (isDefined(tokenId)) {\n return balances[tokenId] || _0n;\n }\n\n return {\n nanoErgs: balances[NANOERGS_TOKEN_ID] || _0n,\n tokens: Object.keys(balances)\n .filter((x) => x !== NANOERGS_TOKEN_ID)\n .map((tokenId) => ({ tokenId, amount: balances[tokenId] }))\n };\n}\n\n/**\n * Calculates the difference between two utxos or utxo sets.\n * @param minuend\n * @param subtrahend\n *\n * @example\n * ```\n * const minuend = [{ nanoErgs: 30n, tokens: [{ tokenId: \"test\", amount: 50n }] }];\n * const subtrahend = [{ nanoErgs: 10n, tokens: [{ tokenId: \"test\", amount: 20n }] }];\n * const diff = utxoDiff(minuend, subtrahend);\n * console.log(diff);\n * // { nanoErgs: 20n, tokens: [{ tokenId: \"test\", amount: 30n }] }\n * ```\n */\nexport function utxoDiff(\n minuend: BoxSummary | Box<Amount>[],\n subtrahend: BoxSummary | Box<Amount>[],\n ignoreSubtrahendLeftoverTokens = false\n): BoxSummary {\n if (Array.isArray(minuend)) minuend = utxoSum(minuend);\n if (Array.isArray(subtrahend)) subtrahend = utxoSum(subtrahend);\n\n const tokens: TokenAmount<bigint>[] = [];\n const nanoErgs = minuend.nanoErgs - subtrahend.nanoErgs;\n const subtrahendTokens = new Map(subtrahend.tokens.map((t) => [t.tokenId, t.amount]));\n\n for (const token of minuend.tokens) {\n const subtrahendAmount = subtrahendTokens.get(token.tokenId) || _0n;\n const balance = token.amount - (subtrahendAmount || _0n);\n\n if (balance !== _0n) {\n tokens.push({ tokenId: token.tokenId, amount: balance });\n }\n\n if (subtrahendAmount > _0n) {\n subtrahendTokens.delete(token.tokenId);\n }\n }\n\n if (!ignoreSubtrahendLeftoverTokens && subtrahendTokens.size > 0) {\n for (const [tokenId, amount] of subtrahendTokens) {\n tokens.push({ tokenId, amount: -amount });\n }\n }\n\n return { nanoErgs, tokens };\n}\n\nconst MIN_NON_MANDATORY_REGISTER_INDEX = 4;\nconst MAX_NON_MANDATORY_REGISTER_INDEX = 9;\n\n/**\n * Checks if the given registers are densely packed.\n * @param registers\n *\n * @example\n * ```\n * const registers = {\n * R4: \"deadbeef\",\n * R6: \"cafe\",\n * };\n * const result = areRegistersDenselyPacked(registers);\n * console.log(result);\n * // false\n */\nexport function areRegistersDenselyPacked(registers: NonMandatoryRegisters): boolean {\n let lastIndex = 0;\n for (let i = MIN_NON_MANDATORY_REGISTER_INDEX; i <= MAX_NON_MANDATORY_REGISTER_INDEX; i++) {\n const key = `R${i}` as keyof NonMandatoryRegisters;\n if (registers[key]) {\n if (i === MIN_NON_MANDATORY_REGISTER_INDEX) {\n lastIndex = i;\n continue;\n }\n\n if (i - lastIndex > 1) {\n return false;\n }\n\n lastIndex = i;\n }\n }\n\n return true;\n}\n\n/**\n * Filters the given utxos by the given filter parameters.\n * @param utxos\n * @param filterParams\n */\nexport function utxoFilter<T extends Amount>(utxos: Box<T>[], filterParams: UTxOFilterParams<T>) {\n if (isEmpty(filterParams) || isEmpty(utxos)) {\n return utxos;\n }\n\n const { by, max } = filterParams;\n let filtered = utxos;\n\n if (by) {\n filtered = utxos.filter(by);\n if (isEmpty(filtered)) {\n return filtered;\n }\n }\n\n if (!max) {\n return filtered;\n }\n\n if (isDefined(max.aggregatedDistinctTokens)) {\n const tokenIds = _getDistinctTokenIds(filtered, max.aggregatedDistinctTokens);\n filtered = filtered.filter(\n (utxo) => isEmpty(utxo.assets) || utxo.assets.every((token) => tokenIds.has(token.tokenId))\n );\n }\n\n if (isDefined(max.count) && filtered.length > max.count) {\n filtered = filtered.slice(0, max.count);\n }\n\n return filtered;\n}\n\nfunction _getDistinctTokenIds(utxos: Box[], max: number): Set<string> {\n const tokenIds = new Set<string>();\n\n for (let i = 0; i < utxos.length && tokenIds.size < max; i++) {\n if (isEmpty(utxos[i].assets) || utxos[i].assets.length > max) {\n continue;\n }\n\n for (const token of utxos[i].assets) {\n tokenIds.add(token.tokenId);\n }\n }\n\n return tokenIds;\n}\n\n/**\n * Parameters for filtering unspent transaction outputs (UTxOs).\n */\nexport type UTxOFilterParams<T extends Amount> = {\n /**\n * A function that returns a boolean indicating whether a given UTxO should be included in the filtered results.\n */\n by?: (utxo: Box<T>) => boolean;\n /**\n * An object specifying the maximum number of UTxOs and distinct tokens to include in the filtered results.\n */\n max?: {\n /**\n * The maximum number of UTxOs to include in the filtered results.\n */\n count?: number;\n /**\n * The maximum number of distinct tokens to include in the filtered results.\n */\n aggregatedDistinctTokens?: number;\n };\n};\n\nexport type BoxSummary = {\n nanoErgs: bigint;\n tokens: TokenAmount<bigint>[];\n};\n\nexport type BoxAmounts = {\n value: Amount;\n assets: TokenAmount<Amount>[];\n};\n\n/**\n * Ensures that the value and asset amounts of a given box are represented as BigInts.\n * @returns A new box object with BigInt representation for the value and asset amounts.\n */\nexport function ensureUTxOBigInt(box: Box<Amount>): Box<bigint>;\nexport function ensureUTxOBigInt(candidate: BoxCandidate<Amount>): BoxCandidate<bigint>;\nexport function ensureUTxOBigInt(\n box: Box<Amount> | BoxCandidate<Amount>\n): BoxCandidate<bigint> | Box<bigint> {\n return {\n ...box,\n value: ensureBigInt(box.value),\n assets: box.assets.map((token) => ({\n tokenId: token.tokenId,\n amount: ensureBigInt(token.amount)\n }))\n };\n}\n","import { isEmpty, isUndefined } from \"./assertions\";\n\n/**\n * Remove undefined values from an object\n * @param value\n *\n * @example\n * ```\n * const obj = { a: 1, b: undefined };\n * const result = clearUndefined(obj);\n * console.log(result); // { a: 1 }\n * ```\n */\nexport function clearUndefined(value: Record<string, unknown>) {\n const result: Record<string, unknown> = {};\n for (const key in value) {\n const val = value[key];\n if (!isUndefined(val)) {\n result[key] = val;\n }\n }\n\n return result;\n}\n\nexport type EnsureDefaultsOptions = { keepUndefinedKeys: boolean };\n\n/**\n * Ensure that the options object has all the default values\n * @param partial\n * @param defaults\n *\n * @example\n * ```\n * const options = { a: 1 };\n * const defaults = { a: 2, b: 3 };\n * const result = ensureDefaults(options, defaults);\n * console.log(result); // { a: 1, b: 3 }\n * ```\n */\nexport function ensureDefaults<T extends object, R extends object>(\n partial: T | undefined,\n defaults: R,\n options?: EnsureDefaultsOptions\n): R & T {\n if (isEmpty(partial)) return defaults as R & T;\n if (options?.keepUndefinedKeys) return { ...defaults, ...partial };\n\n const merged = { ...defaults, ...partial } as Record<string, unknown>;\n for (const key in merged) {\n merged[key] = partial[key as keyof T] ?? defaults[key as keyof R];\n }\n\n return merged as R & T;\n}\n","import { assertInstanceOf } from \".\";\n\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0));\n\n let pad = 0;\n for (const bytes of arrays) {\n assertInstanceOf(bytes, Uint8Array);\n\n r.set(bytes, pad);\n pad += bytes.length;\n }\n\n return r;\n}\n\nexport function isHex(value?: string) {\n if (!value || value.length % 2) return false;\n return !Number.isNaN(Number(value.startsWith(\"0x\") ? value : `0x${value}`));\n}\n\n/**\n * Get hex string size in bytes\n * @param hex\n * @returns the byte size if the hex string\n */\nexport function byteSizeOf(hex: string): number {\n return hex.length / 2;\n}\n","export type EnumConst<T extends object> = T[keyof T];\n\nexport enum Network {\n Mainnet = 0x00,\n Testnet = 0x10\n}\n\nexport enum AddressType {\n P2PK = 1,\n P2SH = 2,\n P2S = 3,\n ADH = 4\n}\n\nexport const ergoTreeHeaderFlags = {\n sizeInclusion: 0x08,\n constantSegregation: 0x10\n} as const;\n\nexport type ErgoTreeHeaderFlag = EnumConst<typeof ergoTreeHeaderFlags>;\n","import type { OneOrMore } from \"../types\";\nimport { isDefined } from \"../utils\";\n\nexport type CollectionAddOptions = { index?: number };\n\n/**\n * Collection abstract model\n *\n * @example\n * Define a new collection class with internal type `number` and external type `string`\n * ```\n * class TestCollection extends Collection<number, string> {\n * protected _map(item: string | number): number {\n * return Number(item);\n * }\n * // Some other methods\n * }\n * ```\n *\n */\nexport abstract class Collection<InternalType, ExternalType> implements Iterable<InternalType> {\n protected readonly _items: InternalType[];\n\n constructor() {\n this._items = [];\n }\n\n protected _isIndexOutOfBounds(index: number): boolean {\n return index < 0 || index >= this._items.length;\n }\n\n [Symbol.iterator](): Iterator<InternalType> {\n let counter = 0;\n\n return {\n next: () => {\n return {\n done: counter >= this.length,\n value: this._items[counter++]\n };\n }\n };\n }\n\n /**\n * Number of items in the collection\n */\n public get length(): number {\n return this._items.length;\n }\n\n /**\n * True if the collection is empty\n */\n public get isEmpty(): boolean {\n return this.length === 0;\n }\n\n /**\n * Get item at index\n * @param index\n * @throws RangeError if index is out of bounds\n */\n public at(index: number): InternalType {\n if (this._isIndexOutOfBounds(index)) {\n throw new RangeError(`Index '${index}' is out of range.`);\n }\n\n return this._items[index];\n }\n\n /**\n * Add item to the collection\n * @param items\n * @param options\n * @returns The new length of the collection\n */\n public add(items: OneOrMore<ExternalType>, options?: CollectionAddOptions): number {\n return this._addOneOrMore(items, options);\n }\n\n abstract remove(item: unknown): number;\n\n /**\n * Map external type to internal type\n * @param item\n * @protected\n */\n protected abstract _map(item: ExternalType | InternalType): InternalType;\n\n protected _addOne(item: InternalType | ExternalType, options?: CollectionAddOptions): number {\n if (isDefined(options) && isDefined(options.index)) {\n if (options.index === this.length) {\n this._items.push(this._map(item));\n\n return this.length;\n }\n\n if (this._isIndexOutOfBounds(options.index)) {\n throw new RangeError(`Index '${options.index}' is out of range.`);\n }\n\n this._items.splice(options.index, 0, this._map(item));\n\n return this.length;\n }\n\n this._items.push(this._map(item));\n\n return this._items.length;\n }\n\n protected _addOneOrMore(items: OneOrMore<ExternalType>, options?: CollectionAddOptions): number {\n if (Array.isArray(items)) {\n if (isDefined(options) && isDefined(options.index)) {\n items = items.reverse();\n }\n\n for (const item of items) {\n this._addOne(item, options);\n }\n } else {\n this._addOne(items, options);\n }\n\n return this.length;\n }\n\n /**\n * Get the collection as an array\n */\n public toArray(): InternalType[] {\n return [...this._items];\n }\n\n public reduce<U>(\n callbackFn: (\n accumulator: U,\n currentValue: InternalType,\n currentIndex: number,\n array: InternalType[]\n ) => U,\n initialValue: U\n ): U {\n return this._items.reduce(callbackFn, initialValue);\n }\n}\n","export class FleetError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = new.target.name;\n }\n}\n\nexport class NotSupportedError extends FleetError {}\n\nexport class BlockchainProviderError extends FleetError {}\n","export const FEE_CONTRACT =\n \"1005040004000e36100204a00b08cd0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ea02d192a39a8cc7a701730073011001020402d19683030193a38cc7b2a57300000193c2b2a57301007473027303830108cdeeac93b1a57304\";\nexport const RECOMMENDED_MIN_FEE_VALUE = BigInt(1100000);\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fleet-sdk/common",
3
- "version": "0.8.3",
3
+ "version": "0.9.1",
4
4
  "description": "Internal utility functions, constants and types shared across @fleet-sdk packages.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",