@oceanprotocol/lib 0.20.1 → 1.0.0-next.10
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 +139 -0
- package/README.md +1 -1
- package/dist/lib.js +2 -0
- package/dist/lib.js.map +1 -0
- package/dist/lib.modern.js +2 -0
- package/dist/lib.modern.js.map +1 -0
- package/dist/lib.module.js +2 -0
- package/dist/lib.module.js.map +1 -0
- package/dist/lib.umd.js +2 -0
- package/dist/lib.umd.js.map +1 -0
- package/dist/src/@types/Asset.d.ts +36 -0
- package/dist/{node/ocean/interfaces → src/@types}/Compute.d.ts +13 -9
- package/dist/src/@types/DDO/Credentials.d.ts +8 -0
- package/dist/src/@types/DDO/DDO.d.ts +15 -0
- package/dist/src/@types/DDO/Event.d.ts +7 -0
- package/dist/src/@types/DDO/Metadata.d.ts +38 -0
- package/dist/src/@types/DDO/Service.d.ts +28 -0
- package/dist/src/@types/DownloadResponse.d.ts +4 -0
- package/dist/src/@types/FileMetadata.d.ts +9 -0
- package/dist/src/@types/Provider.d.ts +16 -0
- package/dist/src/@types/index.d.ts +8 -0
- package/dist/src/aquarius/Aquarius.d.ts +10 -0
- package/dist/src/aquarius/index.d.ts +1 -0
- package/dist/src/factories/NFTFactory.d.ts +66 -0
- package/dist/src/factories/index.d.ts +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/interfaces/DispenserInterface.d.ts +7 -0
- package/dist/src/interfaces/Erc20Interface.d.ts +11 -0
- package/dist/src/interfaces/Erc721Interface.d.ts +12 -0
- package/dist/src/interfaces/FixedRateInterface.d.ts +19 -0
- package/dist/src/interfaces/PoolInterface.d.ts +36 -0
- package/dist/src/interfaces/RouterInterface.d.ts +12 -0
- package/dist/src/interfaces/index.d.ts +5 -0
- package/dist/{node → src}/models/Config.d.ts +14 -7
- package/dist/src/models/index.d.ts +1 -0
- package/dist/src/pools/Router.d.ts +47 -0
- package/dist/src/pools/balancer/Pool.d.ts +70 -0
- package/dist/src/pools/balancer/index.d.ts +1 -0
- package/dist/src/pools/dispenser/Dispenser.d.ts +38 -0
- package/dist/src/pools/dispenser/index.d.ts +1 -0
- package/dist/src/pools/fixedRate/FixedRateExchange.d.ts +96 -0
- package/dist/src/pools/fixedRate/index.d.ts +1 -0
- package/dist/src/pools/index.d.ts +3 -0
- package/dist/src/pools/ssContracts/SideStaking.d.ts +30 -0
- package/dist/src/pools/ssContracts/index.d.ts +1 -0
- package/dist/src/provider/Provider.d.ts +35 -0
- package/dist/src/provider/index.d.ts +1 -0
- package/dist/src/tokens/Datatoken.d.ts +73 -0
- package/dist/src/tokens/NFT.d.ts +62 -0
- package/dist/src/tokens/index.d.ts +2 -0
- package/dist/src/utils/ConfigHelper.d.ts +6 -0
- package/dist/src/utils/Constants.d.ts +2 -0
- package/dist/src/utils/ContractUtils.d.ts +11 -0
- package/dist/src/utils/ConversionTypeHelper.d.ts +3 -0
- package/dist/{node/utils/Datatokens.d.ts → src/utils/DatatokenName.d.ts} +1 -1
- package/dist/src/utils/DdoHelpers.d.ts +2 -0
- package/dist/src/utils/FetchHelper.d.ts +6 -0
- package/dist/{node → src}/utils/Logger.d.ts +0 -0
- package/dist/src/utils/SignatureUtils.d.ts +8 -0
- package/dist/src/utils/TokenUtils.d.ts +7 -0
- package/dist/src/utils/index.d.ts +9 -0
- package/dist/src/utils/minAbi.d.ts +2 -0
- package/dist/test/TestContractHandler.d.ts +44 -0
- package/dist/test/integration/ComputeFlow.test.d.ts +1 -0
- package/dist/test/integration/Provider.test.d.ts +1 -0
- package/dist/test/integration/PublishFlows.test.d.ts +1 -0
- package/dist/test/integration/SimplePublishConsumeFlow.test.d.ts +1 -0
- package/dist/test/integration/config.d.ts +3 -0
- package/dist/test/unit/NftFactory.test.d.ts +1 -0
- package/dist/test/unit/config.d.ts +3 -0
- package/dist/test/unit/pools/Router.test.d.ts +1 -0
- package/dist/test/unit/pools/balancer/Pool.test.d.ts +1 -0
- package/dist/test/unit/pools/dispenser/Dispenser.test.d.ts +1 -0
- package/dist/test/unit/pools/fixedRate/FixedRateExchange.test.d.ts +1 -0
- package/dist/test/unit/pools/ssContracts/SideStaking.test.d.ts +1 -0
- package/dist/test/unit/tokens/Datatoken.test.d.ts +1 -0
- package/dist/test/unit/tokens/Nft.test.d.ts +1 -0
- package/docs/beginners_guide.md +4 -4
- package/docs/overview.md +100 -9
- package/docs/quickstart_marketplace.md +34 -33
- package/docs/quickstart_simple.md +18 -16
- package/package.json +37 -29
- package/dist/node/Instantiable.abstract.d.ts +0 -25
- package/dist/node/balancer/OceanPool.d.ts +0 -95
- package/dist/node/balancer/Pool.d.ts +0 -56
- package/dist/node/balancer/PoolFactory.d.ts +0 -15
- package/dist/node/datatokens/ContractEvent.d.ts +0 -19
- package/dist/node/datatokens/ContractHandler.d.ts +0 -12
- package/dist/node/datatokens/Datatokens.d.ts +0 -44
- package/dist/node/datatokens/EventHandler.d.ts +0 -19
- package/dist/node/datatokens/Network.d.ts +0 -5
- package/dist/node/datatokens/Web3Provider.d.ts +0 -5
- package/dist/node/datatokens/contracts/ContractBase.d.ts +0 -27
- package/dist/node/ddo/DDO.d.ts +0 -36
- package/dist/node/ddo/interfaces/AdditionalInformation.d.ts +0 -16
- package/dist/node/ddo/interfaces/Authentication.d.ts +0 -4
- package/dist/node/ddo/interfaces/BestPrice.d.ts +0 -10
- package/dist/node/ddo/interfaces/Consumable.d.ts +0 -5
- package/dist/node/ddo/interfaces/Credentials.d.ts +0 -9
- package/dist/node/ddo/interfaces/Curation.d.ts +0 -6
- package/dist/node/ddo/interfaces/DataTokenInfo.d.ts +0 -10
- package/dist/node/ddo/interfaces/EditableMetadata.d.ts +0 -9
- package/dist/node/ddo/interfaces/EditableMetadataLinks.d.ts +0 -5
- package/dist/node/ddo/interfaces/Event.d.ts +0 -7
- package/dist/node/ddo/interfaces/File.d.ts +0 -13
- package/dist/node/ddo/interfaces/Metadata.d.ts +0 -15
- package/dist/node/ddo/interfaces/MetadataAlgorithm.d.ts +0 -12
- package/dist/node/ddo/interfaces/MetadataMain.d.ts +0 -12
- package/dist/node/ddo/interfaces/Proof.d.ts +0 -6
- package/dist/node/ddo/interfaces/PublicKey.d.ts +0 -8
- package/dist/node/ddo/interfaces/PurgatoryData.d.ts +0 -4
- package/dist/node/ddo/interfaces/Service.d.ts +0 -99
- package/dist/node/ddo/interfaces/ServicePrices.d.ts +0 -4
- package/dist/node/ddo/interfaces/Status.d.ts +0 -5
- package/dist/node/ddo/interfaces/index.d.ts +0 -17
- package/dist/node/dispenser/Dispenser.d.ts +0 -44
- package/dist/node/exchange/FixedRateExchange.d.ts +0 -59
- package/dist/node/index.d.ts +0 -1
- package/dist/node/lib.d.ts +0 -15
- package/dist/node/lib.js +0 -2
- package/dist/node/lib.js.map +0 -1
- package/dist/node/lib.module.js +0 -2
- package/dist/node/lib.module.js.map +0 -1
- package/dist/node/lib.umd.js +0 -2
- package/dist/node/lib.umd.js.map +0 -1
- package/dist/node/metadatacache/MetadataCache.d.ts +0 -41
- package/dist/node/metadatacache/OnChainMetaData.d.ts +0 -31
- package/dist/node/ocean/Account.d.ts +0 -16
- package/dist/node/ocean/Accounts.d.ts +0 -9
- package/dist/node/ocean/Assets.d.ts +0 -56
- package/dist/node/ocean/AssetsCredential.d.ts +0 -6
- package/dist/node/ocean/Compute.d.ts +0 -75
- package/dist/node/ocean/DID.d.ts +0 -8
- package/dist/node/ocean/EventAccessControl.d.ts +0 -9
- package/dist/node/ocean/Ocean.d.ts +0 -34
- package/dist/node/ocean/OceanAuth.d.ts +0 -15
- package/dist/node/ocean/Versions.d.ts +0 -25
- package/dist/node/ocean/utils/SignatureUtils.d.ts +0 -13
- package/dist/node/ocean/utils/Utils.d.ts +0 -8
- package/dist/node/ocean/utils/WebServiceConnector.d.ts +0 -16
- package/dist/node/provider/Provider.d.ts +0 -56
- package/dist/node/utils/AssetResolverHelper.d.ts +0 -8
- package/dist/node/utils/ConfigHelper.d.ts +0 -17
- package/dist/node/utils/ContractUtils.d.ts +0 -5
- package/dist/node/utils/ConversionTypeHelpers.d.ts +0 -8
- package/dist/node/utils/GeneratorHelpers.d.ts +0 -1
- package/dist/node/utils/PromiseResolver.d.ts +0 -3
- package/dist/node/utils/SubscribableObserver.d.ts +0 -12
- package/dist/node/utils/SubscribablePromise.d.ts +0 -14
- package/dist/node/utils/Timeout.d.ts +0 -1
- package/dist/node/utils/index.d.ts +0 -9
package/dist/node/lib.umd.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lib.umd.js","sources":["../../src/utils/Logger.ts","../../src/utils/ConversionTypeHelpers.ts","../../src/utils/SubscribableObserver.ts","../../src/utils/SubscribablePromise.ts","../../node_modules/bignumber.js/bignumber.mjs","../../src/utils/ContractUtils.ts","../../src/utils/AssetResolverHelper.ts","../../src/utils/Datatokens.ts","../../src/utils/PromiseResolver.ts","../../src/utils/GeneratorHelpers.ts","../../src/Instantiable.abstract.ts","../../src/ocean/Account.ts","../../src/ocean/DID.ts","../../src/ocean/Accounts.ts","../../src/datatokens/Web3Provider.ts","../../src/ddo/DDO.ts","../../src/utils/Timeout.ts","../../src/ocean/utils/WebServiceConnector.ts","../../src/provider/Provider.ts","../../node_modules/ethjs-unit/node_modules/bn.js/lib/bn.js","../../node_modules/number-to-bn/node_modules/bn.js/lib/bn.js","../../node_modules/strip-hex-prefix/src/index.js","../../node_modules/is-hex-prefixed/src/index.js","../../node_modules/number-to-bn/src/index.js","../../node_modules/ethjs-unit/lib/index.js","../../node_modules/bn.js/lib/bn.js","../../node_modules/utf8/utf8.js","../../node_modules/web3-utils/node_modules/eth-lib/lib/hash.js","../../node_modules/js-sha3/src/sha3.js","../../node_modules/ethereum-bloom-filters/dist/utils.js","../../node_modules/ethereum-bloom-filters/dist/index.js","../../node_modules/web3-utils/lib/utils.js","../../src/ocean/Assets.ts","../../src/ocean/Versions.ts","../../node_modules/web3-utils/lib/soliditySha3.js","../../node_modules/randombytes/index.js","../../node_modules/web3-utils/lib/index.js","../../src/ocean/AssetsCredential.ts","../../src/ocean/EventAccessControl.ts","../../src/ocean/utils/SignatureUtils.ts","../../src/ocean/utils/Utils.ts","../../src/metadatacache/MetadataCache.ts","../../src/metadatacache/OnChainMetaData.ts","../../src/datatokens/Datatokens.ts","../../src/datatokens/Network.ts","../../src/ocean/Compute.ts","../../src/balancer/Pool.ts","../../src/balancer/OceanPool.ts","../../src/exchange/FixedRateExchange.ts","../../src/dispenser/Dispenser.ts","../../src/balancer/PoolFactory.ts","../../src/ocean/Ocean.ts","../../src/utils/ConfigHelper.ts","../../src/models/Config.ts"],"sourcesContent":["export enum LogLevel {\n None = -1,\n Error = 0,\n Warn = 1,\n Log = 2,\n Verbose = 3\n}\n\nexport class Logger {\n constructor(private logLevel: LogLevel = LogLevel.Error) {}\n\n public setLevel(logLevel: LogLevel): void {\n this.logLevel = logLevel\n }\n\n public bypass(...args: any[]): void {\n this.dispatch('log', -Infinity as any, ...args)\n }\n\n public debug(...args: any[]): void {\n this.dispatch('debug', LogLevel.Verbose, ...args)\n }\n\n public log(...args: any[]): void {\n this.dispatch('log', LogLevel.Log, ...args)\n }\n\n public warn(...args: any[]): void {\n this.dispatch('warn', LogLevel.Warn, ...args)\n }\n\n public error(...args: any[]): void {\n this.dispatch('error', LogLevel.Error, ...args)\n }\n\n private dispatch(verb: string, level: LogLevel, ...args: any[]) {\n if (this.logLevel >= level) {\n console[verb](...args)\n }\n }\n}\n\nexport const LoggerInstance = new Logger()\nexport default LoggerInstance\n","import { LoggerInstance } from './Logger'\n\n// Ox transformer\nexport const zeroX = (input: string): string => zeroXTransformer(input, true)\nexport const noZeroX = (input: string): string => zeroXTransformer(input, false)\nexport function zeroXTransformer(input = '', zeroOutput: boolean): string {\n const { valid, output } = inputMatch(input, /^(?:0x)*([a-f0-9]+)$/i, 'zeroXTransformer')\n return (zeroOutput && valid ? '0x' : '') + output\n}\n\n// did:op: transformer\nexport const didPrefixed = (input: string): string => didTransformer(input, true)\nexport const noDidPrefixed = (input: string): string => didTransformer(input, false)\nexport function didTransformer(input = '', prefixOutput: boolean): string {\n const { valid, output } = inputMatch(\n input,\n /^(?:0x|did:op:)*([a-f0-9]{40})$/i,\n 'didTransformer'\n )\n return (prefixOutput && valid ? 'did:op:' : '') + output\n}\n\n// 0x + did:op: transformer\nexport const didZeroX = (input: string): string => zeroX(didTransformer(input, false))\nexport const didNoZeroX = (input: string): string => noZeroX(didTransformer(input, false))\n\n// Shared functions\nfunction inputMatch(\n input: string,\n regexp: RegExp,\n conversorName: string\n): { valid: boolean; output: string } {\n if (typeof input !== 'string') {\n LoggerInstance.debug('Not input string:')\n LoggerInstance.debug(input)\n throw new Error(`[${conversorName}] Expected string, input type: ${typeof input}`)\n }\n const match = input.match(regexp)\n if (!match) {\n LoggerInstance.warn(`[${conversorName}] Input transformation failed.`)\n return { valid: false, output: input }\n }\n return { valid: true, output: match[1] }\n}\n","export class SubscribableObserver<T, P> {\n public completed = false\n\n private subscriptions = new Set<{\n onNext?: (next: T) => void\n onComplete?: (complete: P) => void\n onError?: (error: any) => void\n }>()\n\n public subscribe(\n onNext?: (next: T) => void,\n onComplete?: (complete: P) => void,\n onError?: (error: any) => void\n ) {\n if (this.completed) {\n throw new Error('Observer completed.')\n }\n const subscription = { onNext, onComplete, onError }\n this.subscriptions.add(subscription)\n\n return {\n unsubscribe: () => this.subscriptions.delete(subscription)\n }\n }\n\n public next(next?: T): void {\n this.emit('onNext', next)\n }\n\n public complete(resolve?: P): void {\n this.emit('onComplete', resolve)\n this.unsubscribe()\n }\n\n public error(error?: any): void {\n this.emit('onError', error)\n this.unsubscribe()\n }\n\n private emit(type: 'onNext' | 'onComplete' | 'onError', value: any) {\n Array.from(this.subscriptions)\n .map((subscription) => subscription[type])\n .filter((callback: any) => callback && typeof callback === 'function')\n .forEach((callback: any) => callback(value))\n }\n\n private unsubscribe() {\n this.completed = true\n this.subscriptions.clear()\n }\n}\n","import { SubscribableObserver } from './SubscribableObserver'\n\nexport class SubscribablePromise<T extends any, P extends any> {\n private observer = new SubscribableObserver<T, P>()\n\n private promise = Object.assign(\n new Promise<P>((resolve, reject) => {\n setTimeout(() => {\n this.observer.subscribe(undefined, resolve, reject)\n }, 0)\n }),\n this\n )\n\n constructor(executor: (observer: SubscribableObserver<T, P>) => void | Promise<P>) {\n // Defear\n setTimeout(() => this.init(executor), 1)\n }\n\n public subscribe(onNext: (next: T) => void): {\n unsubscribe: () => boolean\n } {\n return this.observer.subscribe(onNext)\n }\n\n public next(onNext: (next: T) => void) {\n this.observer.subscribe(onNext)\n return this\n }\n\n public then(onfulfilled?: (value: P) => any, onrejected?: (error: any) => any) {\n return Object.assign(this.promise.then(onfulfilled, onrejected), this)\n }\n\n public catch(onrejected?: (error: any) => any) {\n return Object.assign(this.promise.catch(onrejected), this)\n }\n\n public finally(onfinally?: () => any) {\n return Object.assign(this.promise.finally(onfinally), this)\n }\n\n private init(executor: (observer: SubscribableObserver<T, P>) => void | Promise<P>) {\n const execution = executor(this.observer)\n\n Promise.resolve(execution as any)\n .then((result) => {\n if (typeof (execution as any).then === 'function') {\n this.observer.complete(result)\n }\n })\n .catch((result) => {\n if (typeof (execution as any).then === 'function') {\n this.observer.error(result)\n }\n })\n }\n}\n","/*\r\n * bignumber.js v9.0.1\r\n * A JavaScript library for arbitrary-precision arithmetic.\r\n * https://github.com/MikeMcl/bignumber.js\r\n * Copyright (c) 2020 Michael Mclaughlin <M8ch88l@gmail.com>\r\n * MIT Licensed.\r\n *\r\n * BigNumber.prototype methods | BigNumber methods\r\n * |\r\n * absoluteValue abs | clone\r\n * comparedTo | config set\r\n * decimalPlaces dp | DECIMAL_PLACES\r\n * dividedBy div | ROUNDING_MODE\r\n * dividedToIntegerBy idiv | EXPONENTIAL_AT\r\n * exponentiatedBy pow | RANGE\r\n * integerValue | CRYPTO\r\n * isEqualTo eq | MODULO_MODE\r\n * isFinite | POW_PRECISION\r\n * isGreaterThan gt | FORMAT\r\n * isGreaterThanOrEqualTo gte | ALPHABET\r\n * isInteger | isBigNumber\r\n * isLessThan lt | maximum max\r\n * isLessThanOrEqualTo lte | minimum min\r\n * isNaN | random\r\n * isNegative | sum\r\n * isPositive |\r\n * isZero |\r\n * minus |\r\n * modulo mod |\r\n * multipliedBy times |\r\n * negated |\r\n * plus |\r\n * precision sd |\r\n * shiftedBy |\r\n * squareRoot sqrt |\r\n * toExponential |\r\n * toFixed |\r\n * toFormat |\r\n * toFraction |\r\n * toJSON |\r\n * toNumber |\r\n * toPrecision |\r\n * toString |\r\n * valueOf |\r\n *\r\n */\r\n\r\n\r\nvar\r\n isNumeric = /^-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i,\r\n\r\n mathceil = Math.ceil,\r\n mathfloor = Math.floor,\r\n\r\n bignumberError = '[BigNumber Error] ',\r\n tooManyDigits = bignumberError + 'Number primitive has more than 15 significant digits: ',\r\n\r\n BASE = 1e14,\r\n LOG_BASE = 14,\r\n MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1\r\n // MAX_INT32 = 0x7fffffff, // 2^31 - 1\r\n POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13],\r\n SQRT_BASE = 1e7,\r\n\r\n // EDITABLE\r\n // The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and\r\n // the arguments to toExponential, toFixed, toFormat, and toPrecision.\r\n MAX = 1E9; // 0 to MAX_INT32\r\n\r\n\r\n/*\r\n * Create and return a BigNumber constructor.\r\n */\r\nfunction clone(configObject) {\r\n var div, convertBase, parseNumeric,\r\n P = BigNumber.prototype = { constructor: BigNumber, toString: null, valueOf: null },\r\n ONE = new BigNumber(1),\r\n\r\n\r\n //----------------------------- EDITABLE CONFIG DEFAULTS -------------------------------\r\n\r\n\r\n // The default values below must be integers within the inclusive ranges stated.\r\n // The values can also be changed at run-time using BigNumber.set.\r\n\r\n // The maximum number of decimal places for operations involving division.\r\n DECIMAL_PLACES = 20, // 0 to MAX\r\n\r\n // The rounding mode used when rounding to the above decimal places, and when using\r\n // toExponential, toFixed, toFormat and toPrecision, and round (default value).\r\n // UP 0 Away from zero.\r\n // DOWN 1 Towards zero.\r\n // CEIL 2 Towards +Infinity.\r\n // FLOOR 3 Towards -Infinity.\r\n // HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n ROUNDING_MODE = 4, // 0 to 8\r\n\r\n // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS]\r\n\r\n // The exponent value at and beneath which toString returns exponential notation.\r\n // Number type: -7\r\n TO_EXP_NEG = -7, // 0 to -MAX\r\n\r\n // The exponent value at and above which toString returns exponential notation.\r\n // Number type: 21\r\n TO_EXP_POS = 21, // 0 to MAX\r\n\r\n // RANGE : [MIN_EXP, MAX_EXP]\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // Number type: -324 (5e-324)\r\n MIN_EXP = -1e7, // -1 to -MAX\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // Number type: 308 (1.7976931348623157e+308)\r\n // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow.\r\n MAX_EXP = 1e7, // 1 to MAX\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n CRYPTO = false, // true or false\r\n\r\n // The modulo mode used when calculating the modulus: a mod n.\r\n // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n // The remainder (r) is calculated as: r = a - n * q.\r\n //\r\n // UP 0 The remainder is positive if the dividend is negative, else is negative.\r\n // DOWN 1 The remainder has the same sign as the dividend.\r\n // This modulo mode is commonly known as 'truncated division' and is\r\n // equivalent to (a % n) in JavaScript.\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)).\r\n // The remainder is always positive.\r\n //\r\n // The truncated division, floored division, Euclidian division and IEEE 754 remainder\r\n // modes are commonly used for the modulus operation.\r\n // Although the other rounding modes can also be used, they may not give useful results.\r\n MODULO_MODE = 1, // 0 to 9\r\n\r\n // The maximum number of significant digits of the result of the exponentiatedBy operation.\r\n // If POW_PRECISION is 0, there will be unlimited significant digits.\r\n POW_PRECISION = 0, // 0 to MAX\r\n\r\n // The format specification used by the BigNumber.prototype.toFormat method.\r\n FORMAT = {\r\n prefix: '',\r\n groupSize: 3,\r\n secondaryGroupSize: 0,\r\n groupSeparator: ',',\r\n decimalSeparator: '.',\r\n fractionGroupSize: 0,\r\n fractionGroupSeparator: '\\xA0', // non-breaking space\r\n suffix: ''\r\n },\r\n\r\n // The alphabet used for base conversion. It must be at least 2 characters long, with no '+',\r\n // '-', '.', whitespace, or repeated character.\r\n // '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'\r\n ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz';\r\n\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n\r\n // CONSTRUCTOR\r\n\r\n\r\n /*\r\n * The BigNumber constructor and exported function.\r\n * Create and return a new instance of a BigNumber object.\r\n *\r\n * v {number|string|BigNumber} A numeric value.\r\n * [b] {number} The base of v. Integer, 2 to ALPHABET.length inclusive.\r\n */\r\n function BigNumber(v, b) {\r\n var alphabet, c, caseChanged, e, i, isNum, len, str,\r\n x = this;\r\n\r\n // Enable constructor call without `new`.\r\n if (!(x instanceof BigNumber)) return new BigNumber(v, b);\r\n\r\n if (b == null) {\r\n\r\n if (v && v._isBigNumber === true) {\r\n x.s = v.s;\r\n\r\n if (!v.c || v.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else if (v.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = v.e;\r\n x.c = v.c.slice();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if ((isNum = typeof v == 'number') && v * 0 == 0) {\r\n\r\n // Use `1 / n` to handle minus zero also.\r\n x.s = 1 / v < 0 ? (v = -v, -1) : 1;\r\n\r\n // Fast path for integers, where n < 2147483648 (2**31).\r\n if (v === ~~v) {\r\n for (e = 0, i = v; i >= 10; i /= 10, e++);\r\n\r\n if (e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else {\r\n x.e = e;\r\n x.c = [v];\r\n }\r\n\r\n return;\r\n }\r\n\r\n str = String(v);\r\n } else {\r\n\r\n if (!isNumeric.test(str = String(v))) return parseNumeric(x, str, isNum);\r\n\r\n x.s = str.charCodeAt(0) == 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n\r\n // Allow exponential notation to be used with base 10 argument, while\r\n // also rounding to DECIMAL_PLACES as with other bases.\r\n if (b == 10) {\r\n x = new BigNumber(v);\r\n return round(x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE);\r\n }\r\n\r\n str = String(v);\r\n\r\n if (isNum = typeof v == 'number') {\r\n\r\n // Avoid potential interpretation of Infinity and NaN as base 44+ values.\r\n if (v * 0 != 0) return parseNumeric(x, str, isNum, b);\r\n\r\n x.s = 1 / v < 0 ? (str = str.slice(1), -1) : 1;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (BigNumber.DEBUG && str.replace(/^0\\.0*|\\./, '').length > 15) {\r\n throw Error\r\n (tooManyDigits + v);\r\n }\r\n } else {\r\n x.s = str.charCodeAt(0) === 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n alphabet = ALPHABET.slice(0, b);\r\n e = i = 0;\r\n\r\n // Check that str is a valid base b number.\r\n // Don't use RegExp, so alphabet can contain special characters.\r\n for (len = str.length; i < len; i++) {\r\n if (alphabet.indexOf(c = str.charAt(i)) < 0) {\r\n if (c == '.') {\r\n\r\n // If '.' is not the first character and it has not be found before.\r\n if (i > e) {\r\n e = len;\r\n continue;\r\n }\r\n } else if (!caseChanged) {\r\n\r\n // Allow e.g. hexadecimal 'FF' as well as 'ff'.\r\n if (str == str.toUpperCase() && (str = str.toLowerCase()) ||\r\n str == str.toLowerCase() && (str = str.toUpperCase())) {\r\n caseChanged = true;\r\n i = -1;\r\n e = 0;\r\n continue;\r\n }\r\n }\r\n\r\n return parseNumeric(x, String(v), isNum, b);\r\n }\r\n }\r\n\r\n // Prevent later check for length on converted number.\r\n isNum = false;\r\n str = convertBase(str, b, 10, x.s);\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n else e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(--len) === 48;);\r\n\r\n if (str = str.slice(i, ++len)) {\r\n len -= i;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (isNum && BigNumber.DEBUG &&\r\n len > 15 && (v > MAX_SAFE_INTEGER || v !== mathfloor(v))) {\r\n throw Error\r\n (tooManyDigits + (x.s * v));\r\n }\r\n\r\n // Overflow?\r\n if ((e = e - i - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n x.c = x.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = e;\r\n x.c = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first element of the coefficient array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE; // i < 1\r\n\r\n if (i < len) {\r\n if (i) x.c.push(+str.slice(0, i));\r\n\r\n for (len -= LOG_BASE; i < len;) {\r\n x.c.push(+str.slice(i, i += LOG_BASE));\r\n }\r\n\r\n i = LOG_BASE - (str = str.slice(i)).length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--; str += '0');\r\n x.c.push(+str);\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n\r\n // CONSTRUCTOR PROPERTIES\r\n\r\n\r\n BigNumber.clone = clone;\r\n\r\n BigNumber.ROUND_UP = 0;\r\n BigNumber.ROUND_DOWN = 1;\r\n BigNumber.ROUND_CEIL = 2;\r\n BigNumber.ROUND_FLOOR = 3;\r\n BigNumber.ROUND_HALF_UP = 4;\r\n BigNumber.ROUND_HALF_DOWN = 5;\r\n BigNumber.ROUND_HALF_EVEN = 6;\r\n BigNumber.ROUND_HALF_CEIL = 7;\r\n BigNumber.ROUND_HALF_FLOOR = 8;\r\n BigNumber.EUCLID = 9;\r\n\r\n\r\n /*\r\n * Configure infrequently-changing library-wide settings.\r\n *\r\n * Accept an object with the following optional properties (if the value of a property is\r\n * a number, it must be an integer within the inclusive range stated):\r\n *\r\n * DECIMAL_PLACES {number} 0 to MAX\r\n * ROUNDING_MODE {number} 0 to 8\r\n * EXPONENTIAL_AT {number|number[]} -MAX to MAX or [-MAX to 0, 0 to MAX]\r\n * RANGE {number|number[]} -MAX to MAX (not zero) or [-MAX to -1, 1 to MAX]\r\n * CRYPTO {boolean} true or false\r\n * MODULO_MODE {number} 0 to 9\r\n * POW_PRECISION {number} 0 to MAX\r\n * ALPHABET {string} A string of two or more unique characters which does\r\n * not contain '.'.\r\n * FORMAT {object} An object with some of the following properties:\r\n * prefix {string}\r\n * groupSize {number}\r\n * secondaryGroupSize {number}\r\n * groupSeparator {string}\r\n * decimalSeparator {string}\r\n * fractionGroupSize {number}\r\n * fractionGroupSeparator {string}\r\n * suffix {string}\r\n *\r\n * (The values assigned to the above FORMAT object properties are not checked for validity.)\r\n *\r\n * E.g.\r\n * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 })\r\n *\r\n * Ignore properties/parameters set to null or undefined, except for ALPHABET.\r\n *\r\n * Return an object with the properties current values.\r\n */\r\n BigNumber.config = BigNumber.set = function (obj) {\r\n var p, v;\r\n\r\n if (obj != null) {\r\n\r\n if (typeof obj == 'object') {\r\n\r\n // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] DECIMAL_PLACES {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'DECIMAL_PLACES')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n DECIMAL_PLACES = v;\r\n }\r\n\r\n // ROUNDING_MODE {number} Integer, 0 to 8 inclusive.\r\n // '[BigNumber Error] ROUNDING_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'ROUNDING_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 8, p);\r\n ROUNDING_MODE = v;\r\n }\r\n\r\n // EXPONENTIAL_AT {number|number[]}\r\n // Integer, -MAX to MAX inclusive or\r\n // [integer -MAX to 0 inclusive, 0 to MAX inclusive].\r\n // '[BigNumber Error] EXPONENTIAL_AT {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'EXPONENTIAL_AT')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, 0, p);\r\n intCheck(v[1], 0, MAX, p);\r\n TO_EXP_NEG = v[0];\r\n TO_EXP_POS = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n TO_EXP_NEG = -(TO_EXP_POS = v < 0 ? -v : v);\r\n }\r\n }\r\n\r\n // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or\r\n // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive].\r\n // '[BigNumber Error] RANGE {not a primitive number|not an integer|out of range|cannot be zero}: {v}'\r\n if (obj.hasOwnProperty(p = 'RANGE')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, -1, p);\r\n intCheck(v[1], 1, MAX, p);\r\n MIN_EXP = v[0];\r\n MAX_EXP = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n if (v) {\r\n MIN_EXP = -(MAX_EXP = v < 0 ? -v : v);\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' cannot be zero: ' + v);\r\n }\r\n }\r\n }\r\n\r\n // CRYPTO {boolean} true or false.\r\n // '[BigNumber Error] CRYPTO not true or false: {v}'\r\n // '[BigNumber Error] crypto unavailable'\r\n if (obj.hasOwnProperty(p = 'CRYPTO')) {\r\n v = obj[p];\r\n if (v === !!v) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n CRYPTO = v;\r\n } else {\r\n CRYPTO = !v;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n } else {\r\n CRYPTO = v;\r\n }\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' not true or false: ' + v);\r\n }\r\n }\r\n\r\n // MODULO_MODE {number} Integer, 0 to 9 inclusive.\r\n // '[BigNumber Error] MODULO_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'MODULO_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 9, p);\r\n MODULO_MODE = v;\r\n }\r\n\r\n // POW_PRECISION {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] POW_PRECISION {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'POW_PRECISION')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n POW_PRECISION = v;\r\n }\r\n\r\n // FORMAT {object}\r\n // '[BigNumber Error] FORMAT not an object: {v}'\r\n if (obj.hasOwnProperty(p = 'FORMAT')) {\r\n v = obj[p];\r\n if (typeof v == 'object') FORMAT = v;\r\n else throw Error\r\n (bignumberError + p + ' not an object: ' + v);\r\n }\r\n\r\n // ALPHABET {string}\r\n // '[BigNumber Error] ALPHABET invalid: {v}'\r\n if (obj.hasOwnProperty(p = 'ALPHABET')) {\r\n v = obj[p];\r\n\r\n // Disallow if only one character,\r\n // or if it contains '+', '-', '.', whitespace, or a repeated character.\r\n if (typeof v == 'string' && !/^.$|[+-.\\s]|(.).*\\1/.test(v)) {\r\n ALPHABET = v;\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' invalid: ' + v);\r\n }\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Object expected: {v}'\r\n throw Error\r\n (bignumberError + 'Object expected: ' + obj);\r\n }\r\n }\r\n\r\n return {\r\n DECIMAL_PLACES: DECIMAL_PLACES,\r\n ROUNDING_MODE: ROUNDING_MODE,\r\n EXPONENTIAL_AT: [TO_EXP_NEG, TO_EXP_POS],\r\n RANGE: [MIN_EXP, MAX_EXP],\r\n CRYPTO: CRYPTO,\r\n MODULO_MODE: MODULO_MODE,\r\n POW_PRECISION: POW_PRECISION,\r\n FORMAT: FORMAT,\r\n ALPHABET: ALPHABET\r\n };\r\n };\r\n\r\n\r\n /*\r\n * Return true if v is a BigNumber instance, otherwise return false.\r\n *\r\n * If BigNumber.DEBUG is true, throw if a BigNumber instance is not well-formed.\r\n *\r\n * v {any}\r\n *\r\n * '[BigNumber Error] Invalid BigNumber: {v}'\r\n */\r\n BigNumber.isBigNumber = function (v) {\r\n if (!v || v._isBigNumber !== true) return false;\r\n if (!BigNumber.DEBUG) return true;\r\n\r\n var i, n,\r\n c = v.c,\r\n e = v.e,\r\n s = v.s;\r\n\r\n out: if ({}.toString.call(c) == '[object Array]') {\r\n\r\n if ((s === 1 || s === -1) && e >= -MAX && e <= MAX && e === mathfloor(e)) {\r\n\r\n // If the first element is zero, the BigNumber value must be zero.\r\n if (c[0] === 0) {\r\n if (e === 0 && c.length === 1) return true;\r\n break out;\r\n }\r\n\r\n // Calculate number of digits that c[0] should have, based on the exponent.\r\n i = (e + 1) % LOG_BASE;\r\n if (i < 1) i += LOG_BASE;\r\n\r\n // Calculate number of digits of c[0].\r\n //if (Math.ceil(Math.log(c[0] + 1) / Math.LN10) == i) {\r\n if (String(c[0]).length == i) {\r\n\r\n for (i = 0; i < c.length; i++) {\r\n n = c[i];\r\n if (n < 0 || n >= BASE || n !== mathfloor(n)) break out;\r\n }\r\n\r\n // Last element cannot be zero, unless it is the only element.\r\n if (n !== 0) return true;\r\n }\r\n }\r\n\r\n // Infinity/NaN\r\n } else if (c === null && e === null && (s === null || s === 1 || s === -1)) {\r\n return true;\r\n }\r\n\r\n throw Error\r\n (bignumberError + 'Invalid BigNumber: ' + v);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.maximum = BigNumber.max = function () {\r\n return maxOrMin(arguments, P.lt);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.minimum = BigNumber.min = function () {\r\n return maxOrMin(arguments, P.gt);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber with a random value equal to or greater than 0 and less than 1,\r\n * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing\r\n * zeros are produced).\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp}'\r\n * '[BigNumber Error] crypto unavailable'\r\n */\r\n BigNumber.random = (function () {\r\n var pow2_53 = 0x20000000000000;\r\n\r\n // Return a 53 bit integer n, where 0 <= n < 9007199254740992.\r\n // Check if Math.random() produces more than 32 bits of randomness.\r\n // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits.\r\n // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1.\r\n var random53bitInt = (Math.random() * pow2_53) & 0x1fffff\r\n ? function () { return mathfloor(Math.random() * pow2_53); }\r\n : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) +\r\n (Math.random() * 0x800000 | 0); };\r\n\r\n return function (dp) {\r\n var a, b, e, k, v,\r\n i = 0,\r\n c = [],\r\n rand = new BigNumber(ONE);\r\n\r\n if (dp == null) dp = DECIMAL_PLACES;\r\n else intCheck(dp, 0, MAX);\r\n\r\n k = mathceil(dp / LOG_BASE);\r\n\r\n if (CRYPTO) {\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n if (crypto.getRandomValues) {\r\n\r\n a = crypto.getRandomValues(new Uint32Array(k *= 2));\r\n\r\n for (; i < k;) {\r\n\r\n // 53 bits:\r\n // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2)\r\n // 11111 11111111 11111111 11111111 11100000 00000000 00000000\r\n // ((Math.pow(2, 32) - 1) >>> 11).toString(2)\r\n // 11111 11111111 11111111\r\n // 0x20000 is 2^21.\r\n v = a[i] * 0x20000 + (a[i + 1] >>> 11);\r\n\r\n // Rejection sampling:\r\n // 0 <= v < 9007199254740992\r\n // Probability that v >= 9e15, is\r\n // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251\r\n if (v >= 9e15) {\r\n b = crypto.getRandomValues(new Uint32Array(2));\r\n a[i] = b[0];\r\n a[i + 1] = b[1];\r\n } else {\r\n\r\n // 0 <= v <= 8999999999999999\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 2;\r\n }\r\n }\r\n i = k / 2;\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n a = crypto.randomBytes(k *= 7);\r\n\r\n for (; i < k;) {\r\n\r\n // 0x1000000000000 is 2^48, 0x10000000000 is 2^40\r\n // 0x100000000 is 2^32, 0x1000000 is 2^24\r\n // 11111 11111111 11111111 11111111 11111111 11111111 11111111\r\n // 0 <= v < 9007199254740992\r\n v = ((a[i] & 31) * 0x1000000000000) + (a[i + 1] * 0x10000000000) +\r\n (a[i + 2] * 0x100000000) + (a[i + 3] * 0x1000000) +\r\n (a[i + 4] << 16) + (a[i + 5] << 8) + a[i + 6];\r\n\r\n if (v >= 9e15) {\r\n crypto.randomBytes(7).copy(a, i);\r\n } else {\r\n\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 7;\r\n }\r\n }\r\n i = k / 7;\r\n } else {\r\n CRYPTO = false;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n }\r\n\r\n // Use Math.random.\r\n if (!CRYPTO) {\r\n\r\n for (; i < k;) {\r\n v = random53bitInt();\r\n if (v < 9e15) c[i++] = v % 1e14;\r\n }\r\n }\r\n\r\n k = c[--i];\r\n dp %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to dp.\r\n if (k && dp) {\r\n v = POWS_TEN[LOG_BASE - dp];\r\n c[i] = mathfloor(k / v) * v;\r\n }\r\n\r\n // Remove trailing elements which are zero.\r\n for (; c[i] === 0; c.pop(), i--);\r\n\r\n // Zero?\r\n if (i < 0) {\r\n c = [e = 0];\r\n } else {\r\n\r\n // Remove leading elements which are zero and adjust exponent accordingly.\r\n for (e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE);\r\n\r\n // Count the digits of the first element of c to determine leading zeros, and...\r\n for (i = 1, v = c[0]; v >= 10; v /= 10, i++);\r\n\r\n // adjust the exponent accordingly.\r\n if (i < LOG_BASE) e -= LOG_BASE - i;\r\n }\r\n\r\n rand.e = e;\r\n rand.c = c;\r\n return rand;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the sum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.sum = function () {\r\n var i = 1,\r\n args = arguments,\r\n sum = new BigNumber(args[0]);\r\n for (; i < args.length;) sum = sum.plus(args[i++]);\r\n return sum;\r\n };\r\n\r\n\r\n // PRIVATE FUNCTIONS\r\n\r\n\r\n // Called by BigNumber and BigNumber.prototype.toString.\r\n convertBase = (function () {\r\n var decimal = '0123456789';\r\n\r\n /*\r\n * Convert string of baseIn to an array of numbers of baseOut.\r\n * Eg. toBaseOut('255', 10, 16) returns [15, 15].\r\n * Eg. toBaseOut('ff', 16, 10) returns [2, 5, 5].\r\n */\r\n function toBaseOut(str, baseIn, baseOut, alphabet) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n len = str.length;\r\n\r\n for (; i < len;) {\r\n for (arrL = arr.length; arrL--; arr[arrL] *= baseIn);\r\n\r\n arr[0] += alphabet.indexOf(str.charAt(i++));\r\n\r\n for (j = 0; j < arr.length; j++) {\r\n\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] == null) arr[j + 1] = 0;\r\n arr[j + 1] += arr[j] / baseOut | 0;\r\n arr[j] %= baseOut;\r\n }\r\n }\r\n }\r\n\r\n return arr.reverse();\r\n }\r\n\r\n // Convert a numeric string of baseIn to a numeric string of baseOut.\r\n // If the caller is toString, we are converting from base 10 to baseOut.\r\n // If the caller is BigNumber, we are converting from baseIn to base 10.\r\n return function (str, baseIn, baseOut, sign, callerIsToString) {\r\n var alphabet, d, e, k, r, x, xc, y,\r\n i = str.indexOf('.'),\r\n dp = DECIMAL_PLACES,\r\n rm = ROUNDING_MODE;\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n k = POW_PRECISION;\r\n\r\n // Unlimited precision.\r\n POW_PRECISION = 0;\r\n str = str.replace('.', '');\r\n y = new BigNumber(baseIn);\r\n x = y.pow(str.length - i);\r\n POW_PRECISION = k;\r\n\r\n // Convert str as if an integer, then restore the fraction part by dividing the\r\n // result by its base raised to a power.\r\n\r\n y.c = toBaseOut(toFixedPoint(coeffToString(x.c), x.e, '0'),\r\n 10, baseOut, decimal);\r\n y.e = y.c.length;\r\n }\r\n\r\n // Convert the number as integer.\r\n\r\n xc = toBaseOut(str, baseIn, baseOut, callerIsToString\r\n ? (alphabet = ALPHABET, decimal)\r\n : (alphabet = decimal, ALPHABET));\r\n\r\n // xc now represents str as an integer and converted to baseOut. e is the exponent.\r\n e = k = xc.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xc[--k] == 0; xc.pop());\r\n\r\n // Zero?\r\n if (!xc[0]) return alphabet.charAt(0);\r\n\r\n // Does str represent an integer? If so, no need for the division.\r\n if (i < 0) {\r\n --e;\r\n } else {\r\n x.c = xc;\r\n x.e = e;\r\n\r\n // The sign is needed for correct rounding.\r\n x.s = sign;\r\n x = div(x, y, dp, rm, baseOut);\r\n xc = x.c;\r\n r = x.r;\r\n e = x.e;\r\n }\r\n\r\n // xc now represents str converted to baseOut.\r\n\r\n // THe index of the rounding digit.\r\n d = e + dp + 1;\r\n\r\n // The rounding digit: the digit to the right of the digit that may be rounded up.\r\n i = xc[d];\r\n\r\n // Look at the rounding digits and mode to determine whether to round up.\r\n\r\n k = baseOut / 2;\r\n r = r || d < 0 || xc[d + 1] != null;\r\n\r\n r = rm < 4 ? (i != null || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : i > k || i == k &&(rm == 4 || r || rm == 6 && xc[d - 1] & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n // If the index of the rounding digit is not greater than zero, or xc represents\r\n // zero, then the result of the base conversion is zero or, if rounding up, a value\r\n // such as 0.00001.\r\n if (d < 1 || !xc[0]) {\r\n\r\n // 1^-dp or 0\r\n str = r ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0)) : alphabet.charAt(0);\r\n } else {\r\n\r\n // Truncate xc to the required number of decimal places.\r\n xc.length = d;\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (--baseOut; ++xc[--d] > baseOut;) {\r\n xc[d] = 0;\r\n\r\n if (!d) {\r\n ++e;\r\n xc = [1].concat(xc);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (k = xc.length; !xc[--k];);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i <= k; str += alphabet.charAt(xc[i++]));\r\n\r\n // Add leading zeros, decimal point and trailing zeros as required.\r\n str = toFixedPoint(str, e, alphabet.charAt(0));\r\n }\r\n\r\n // The caller will add the sign.\r\n return str;\r\n };\r\n })();\r\n\r\n\r\n // Perform division in the specified base. Called by div and convertBase.\r\n div = (function () {\r\n\r\n // Assume non-zero x and k.\r\n function multiply(x, k, base) {\r\n var m, temp, xlo, xhi,\r\n carry = 0,\r\n i = x.length,\r\n klo = k % SQRT_BASE,\r\n khi = k / SQRT_BASE | 0;\r\n\r\n for (x = x.slice(); i--;) {\r\n xlo = x[i] % SQRT_BASE;\r\n xhi = x[i] / SQRT_BASE | 0;\r\n m = khi * xlo + xhi * klo;\r\n temp = klo * xlo + ((m % SQRT_BASE) * SQRT_BASE) + carry;\r\n carry = (temp / base | 0) + (m / SQRT_BASE | 0) + khi * xhi;\r\n x[i] = temp % base;\r\n }\r\n\r\n if (carry) x = [carry].concat(x);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, cmp;\r\n\r\n if (aL != bL) {\r\n cmp = aL > bL ? 1 : -1;\r\n } else {\r\n\r\n for (i = cmp = 0; i < aL; i++) {\r\n\r\n if (a[i] != b[i]) {\r\n cmp = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return cmp;\r\n }\r\n\r\n function subtract(a, b, aL, base) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * base + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1; a.splice(0, 1));\r\n }\r\n\r\n // x: dividend, y: divisor.\r\n return function (x, y, dp, rm, base) {\r\n var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0,\r\n yL, yz,\r\n s = x.s == y.s ? 1 : -1,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xc || !xc[0] || !yc || !yc[0]) {\r\n\r\n return new BigNumber(\r\n\r\n // Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xc ? yc && xc[0] == yc[0] : !yc) ? NaN :\r\n\r\n // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0.\r\n xc && xc[0] == 0 || !yc ? s * 0 : s / 0\r\n );\r\n }\r\n\r\n q = new BigNumber(s);\r\n qc = q.c = [];\r\n e = x.e - y.e;\r\n s = dp + e + 1;\r\n\r\n if (!base) {\r\n base = BASE;\r\n e = bitFloor(x.e / LOG_BASE) - bitFloor(y.e / LOG_BASE);\r\n s = s / LOG_BASE | 0;\r\n }\r\n\r\n // Result exponent may be one less then the current value of e.\r\n // The coefficients of the BigNumbers from convertBase may have trailing zeros.\r\n for (i = 0; yc[i] == (xc[i] || 0); i++);\r\n\r\n if (yc[i] > (xc[i] || 0)) e--;\r\n\r\n if (s < 0) {\r\n qc.push(1);\r\n more = true;\r\n } else {\r\n xL = xc.length;\r\n yL = yc.length;\r\n i = 0;\r\n s += 2;\r\n\r\n // Normalise xc and yc so highest order digit of yc is >= base / 2.\r\n\r\n n = mathfloor(base / (yc[0] + 1));\r\n\r\n // Not necessary, but to handle odd bases where yc[0] == (base / 2) - 1.\r\n // if (n > 1 || n++ == 1 && yc[0] < base / 2) {\r\n if (n > 1) {\r\n yc = multiply(yc, n, base);\r\n xc = multiply(xc, n, base);\r\n yL = yc.length;\r\n xL = xc.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xc.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL; rem[remL++] = 0);\r\n yz = yc.slice();\r\n yz = [0].concat(yz);\r\n yc0 = yc[0];\r\n if (yc[1] >= base / 2) yc0++;\r\n // Not necessary, but to prevent trial digit n > base, when using base 3.\r\n // else if (base == 3 && yc0 == 1) yc0 = 1 + 1e-15;\r\n\r\n do {\r\n n = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yc, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, n.\r\n\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // n is how many times the divisor goes into the current remainder.\r\n n = mathfloor(rem0 / yc0);\r\n\r\n // Algorithm:\r\n // product = divisor multiplied by trial digit (n).\r\n // Compare product and remainder.\r\n // If product is greater than remainder:\r\n // Subtract divisor from product, decrement trial digit.\r\n // Subtract product from remainder.\r\n // If product was less than remainder at the last compare:\r\n // Compare new remainder and divisor.\r\n // If remainder is greater than divisor:\r\n // Subtract divisor from remainder, increment trial digit.\r\n\r\n if (n > 1) {\r\n\r\n // n may be > base only when base is 3.\r\n if (n >= base) n = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiply(yc, n, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n // If product > remainder then trial digit n too high.\r\n // n is 1 too high about 5% of the time, and is not known to have\r\n // ever been more than 1 too high.\r\n while (compare(prod, rem, prodL, remL) == 1) {\r\n n--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yc, prodL, base);\r\n prodL = prod.length;\r\n cmp = 1;\r\n }\r\n } else {\r\n\r\n // n is 0 or 1, cmp is -1.\r\n // If n is 0, there is no need to compare yc and rem again below,\r\n // so change cmp to 1 to avoid it.\r\n // If n is 1, leave cmp as -1, so yc and rem are compared again.\r\n if (n == 0) {\r\n\r\n // divisor < remainder, so n must be at least 1.\r\n cmp = n = 1;\r\n }\r\n\r\n // product = divisor\r\n prod = yc.slice();\r\n prodL = prod.length;\r\n }\r\n\r\n if (prodL < remL) prod = [0].concat(prod);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n remL = rem.length;\r\n\r\n // If product was < remainder.\r\n if (cmp == -1) {\r\n\r\n // Compare divisor and new remainder.\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n // Trial digit n too low.\r\n // n is 1 too low about 5% of the time, and very rarely 2 too low.\r\n while (compare(yc, rem, yL, remL) < 1) {\r\n n++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yc, remL, base);\r\n remL = rem.length;\r\n }\r\n }\r\n } else if (cmp === 0) {\r\n n++;\r\n rem = [0];\r\n } // else cmp === 1 and n will be 0\r\n\r\n // Add the next digit, n, to the result array.\r\n qc[i++] = n;\r\n\r\n // Update the remainder.\r\n if (rem[0]) {\r\n rem[remL++] = xc[xi] || 0;\r\n } else {\r\n rem = [xc[xi]];\r\n remL = 1;\r\n }\r\n } while ((xi++ < xL || rem[0] != null) && s--);\r\n\r\n more = rem[0] != null;\r\n\r\n // Leading zero?\r\n if (!qc[0]) qc.splice(0, 1);\r\n }\r\n\r\n if (base == BASE) {\r\n\r\n // To calculate q.e, first get the number of digits of qc[0].\r\n for (i = 1, s = qc[0]; s >= 10; s /= 10, i++);\r\n\r\n round(q, dp + (q.e = i + e * LOG_BASE - 1) + 1, rm, more);\r\n\r\n // Caller is convertBase.\r\n } else {\r\n q.e = e;\r\n q.r = +more;\r\n }\r\n\r\n return q;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a string representing the value of BigNumber n in fixed-point or exponential\r\n * notation rounded to the specified decimal places or significant digits.\r\n *\r\n * n: a BigNumber.\r\n * i: the index of the last digit required (i.e. the digit that may be rounded up).\r\n * rm: the rounding mode.\r\n * id: 1 (toExponential) or 2 (toPrecision).\r\n */\r\n function format(n, i, rm, id) {\r\n var c0, e, ne, len, str;\r\n\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n if (!n.c) return n.toString();\r\n\r\n c0 = n.c[0];\r\n ne = n.e;\r\n\r\n if (i == null) {\r\n str = coeffToString(n.c);\r\n str = id == 1 || id == 2 && (ne <= TO_EXP_NEG || ne >= TO_EXP_POS)\r\n ? toExponential(str, ne)\r\n : toFixedPoint(str, ne, '0');\r\n } else {\r\n n = round(new BigNumber(n), i, rm);\r\n\r\n // n.e may have changed if the value was rounded up.\r\n e = n.e;\r\n\r\n str = coeffToString(n.c);\r\n len = str.length;\r\n\r\n // toPrecision returns exponential notation if the number of significant digits\r\n // specified is less than the number of digits necessary to represent the integer\r\n // part of the value in fixed-point notation.\r\n\r\n // Exponential notation.\r\n if (id == 1 || id == 2 && (i <= e || e <= TO_EXP_NEG)) {\r\n\r\n // Append zeros?\r\n for (; len < i; str += '0', len++);\r\n str = toExponential(str, e);\r\n\r\n // Fixed-point notation.\r\n } else {\r\n i -= ne;\r\n str = toFixedPoint(str, e, '0');\r\n\r\n // Append zeros?\r\n if (e + 1 > len) {\r\n if (--i > 0) for (str += '.'; i--; str += '0');\r\n } else {\r\n i += e - len;\r\n if (i > 0) {\r\n if (e + 1 == len) str += '.';\r\n for (; i--; str += '0');\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n.s < 0 && c0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // Handle BigNumber.max and BigNumber.min.\r\n function maxOrMin(args, method) {\r\n var n,\r\n i = 1,\r\n m = new BigNumber(args[0]);\r\n\r\n for (; i < args.length; i++) {\r\n n = new BigNumber(args[i]);\r\n\r\n // If any number is NaN, return NaN.\r\n if (!n.s) {\r\n m = n;\r\n break;\r\n } else if (method.call(m, n)) {\r\n m = n;\r\n }\r\n }\r\n\r\n return m;\r\n }\r\n\r\n\r\n /*\r\n * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP.\r\n * Called by minus, plus and times.\r\n */\r\n function normalise(n, c, e) {\r\n var i = 1,\r\n j = c.length;\r\n\r\n // Remove trailing zeros.\r\n for (; !c[--j]; c.pop());\r\n\r\n // Calculate the base 10 exponent. First get the number of digits of c[0].\r\n for (j = c[0]; j >= 10; j /= 10, i++);\r\n\r\n // Overflow?\r\n if ((e = i + e * LOG_BASE - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n n.c = n.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n n.c = [n.e = 0];\r\n } else {\r\n n.e = e;\r\n n.c = c;\r\n }\r\n\r\n return n;\r\n }\r\n\r\n\r\n // Handle values that fail the validity test in BigNumber.\r\n parseNumeric = (function () {\r\n var basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i,\r\n dotAfter = /^([^.]+)\\.$/,\r\n dotBefore = /^\\.([^.]+)$/,\r\n isInfinityOrNaN = /^-?(Infinity|NaN)$/,\r\n whitespaceOrPlus = /^\\s*\\+(?=[\\w.])|^\\s+|\\s+$/g;\r\n\r\n return function (x, str, isNum, b) {\r\n var base,\r\n s = isNum ? str : str.replace(whitespaceOrPlus, '');\r\n\r\n // No exception on ±Infinity or NaN.\r\n if (isInfinityOrNaN.test(s)) {\r\n x.s = isNaN(s) ? null : s < 0 ? -1 : 1;\r\n } else {\r\n if (!isNum) {\r\n\r\n // basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i\r\n s = s.replace(basePrefix, function (m, p1, p2) {\r\n base = (p2 = p2.toLowerCase()) == 'x' ? 16 : p2 == 'b' ? 2 : 8;\r\n return !b || b == base ? p1 : m;\r\n });\r\n\r\n if (b) {\r\n base = b;\r\n\r\n // E.g. '1.' to '1', '.1' to '0.1'\r\n s = s.replace(dotAfter, '$1').replace(dotBefore, '0.$1');\r\n }\r\n\r\n if (str != s) return new BigNumber(s, base);\r\n }\r\n\r\n // '[BigNumber Error] Not a number: {n}'\r\n // '[BigNumber Error] Not a base {b} number: {n}'\r\n if (BigNumber.DEBUG) {\r\n throw Error\r\n (bignumberError + 'Not a' + (b ? ' base ' + b : '') + ' number: ' + str);\r\n }\r\n\r\n // NaN\r\n x.s = null;\r\n }\r\n\r\n x.c = x.e = null;\r\n }\r\n })();\r\n\r\n\r\n /*\r\n * Round x to sd significant digits using rounding mode rm. Check for over/under-flow.\r\n * If r is truthy, it is known that there are more digits after the rounding digit.\r\n */\r\n function round(x, sd, rm, r) {\r\n var d, i, j, k, n, ni, rd,\r\n xc = x.c,\r\n pows10 = POWS_TEN;\r\n\r\n // if x is not Infinity or NaN...\r\n if (xc) {\r\n\r\n // rd is the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // n is a base 1e14 number, the value of the element of array x.c containing rd.\r\n // ni is the index of n within x.c.\r\n // d is the number of digits of n.\r\n // i is the index of rd within n including leading zeros.\r\n // j is the actual index of rd within n (if < 0, rd is a leading zero).\r\n out: {\r\n\r\n // Get the number of digits of the first element of xc.\r\n for (d = 1, k = xc[0]; k >= 10; k /= 10, d++);\r\n i = sd - d;\r\n\r\n // If the rounding digit is in the first element of xc...\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n n = xc[ni = 0];\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = n / pows10[d - j - 1] % 10 | 0;\r\n } else {\r\n ni = mathceil((i + 1) / LOG_BASE);\r\n\r\n if (ni >= xc.length) {\r\n\r\n if (r) {\r\n\r\n // Needed by sqrt.\r\n for (; xc.length <= ni; xc.push(0));\r\n n = rd = 0;\r\n d = 1;\r\n i %= LOG_BASE;\r\n j = i - LOG_BASE + 1;\r\n } else {\r\n break out;\r\n }\r\n } else {\r\n n = k = xc[ni];\r\n\r\n // Get the number of digits of n.\r\n for (d = 1; k >= 10; k /= 10, d++);\r\n\r\n // Get the index of rd within n.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within n, adjusted for leading zeros.\r\n // The number of leading zeros of n is given by LOG_BASE - d.\r\n j = i - LOG_BASE + d;\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = j < 0 ? 0 : n / pows10[d - j - 1] % 10 | 0;\r\n }\r\n }\r\n\r\n r = r || sd < 0 ||\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n // The expression n % pows10[d - j - 1] returns all digits of n to the right\r\n // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714.\r\n xc[ni + 1] != null || (j < 0 ? n : n % pows10[d - j - 1]);\r\n\r\n r = rm < 4\r\n ? (rd || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || r || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? n / pows10[d - j] : 0 : xc[ni - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xc[0]) {\r\n xc.length = 0;\r\n\r\n if (r) {\r\n\r\n // Convert sd to decimal places.\r\n sd -= x.e + 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xc[0] = pows10[(LOG_BASE - sd % LOG_BASE) % LOG_BASE];\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xc[0] = x.e = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xc.length = ni;\r\n k = 1;\r\n ni--;\r\n } else {\r\n xc.length = ni + 1;\r\n k = pows10[LOG_BASE - i];\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of n.\r\n xc[ni] = j > 0 ? mathfloor(n / pows10[d - j] % pows10[j]) * k : 0;\r\n }\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n for (; ;) {\r\n\r\n // If the digit to be rounded up is in the first element of xc...\r\n if (ni == 0) {\r\n\r\n // i will be the length of xc[0] before k is added.\r\n for (i = 1, j = xc[0]; j >= 10; j /= 10, i++);\r\n j = xc[0] += k;\r\n for (k = 1; j >= 10; j /= 10, k++);\r\n\r\n // if i != k the length has increased.\r\n if (i != k) {\r\n x.e++;\r\n if (xc[0] == BASE) xc[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xc[ni] += k;\r\n if (xc[ni] != BASE) break;\r\n xc[ni--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xc.length; xc[--i] === 0; xc.pop());\r\n }\r\n\r\n // Overflow? Infinity.\r\n if (x.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n\r\n // Underflow? Zero.\r\n } else if (x.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n function valueOf(n) {\r\n var str,\r\n e = n.e;\r\n\r\n if (e === null) return n.toString();\r\n\r\n str = coeffToString(n.c);\r\n\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(str, e)\r\n : toFixedPoint(str, e, '0');\r\n\r\n return n.s < 0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // PROTOTYPE/INSTANCE METHODS\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the absolute value of this BigNumber.\r\n */\r\n P.absoluteValue = P.abs = function () {\r\n var x = new BigNumber(this);\r\n if (x.s < 0) x.s = 1;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return\r\n * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * -1 if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * 0 if they have the same value,\r\n * or null if the value of either is NaN.\r\n */\r\n P.comparedTo = function (y, b) {\r\n return compare(this, new BigNumber(y, b));\r\n };\r\n\r\n\r\n /*\r\n * If dp is undefined or null or true or false, return the number of decimal places of the\r\n * value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n *\r\n * Otherwise, if dp is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of dp decimal places using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * [dp] {number} Decimal places: integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.decimalPlaces = P.dp = function (dp, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), dp + x.e + 1, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n n = ((v = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last number.\r\n if (v = c[v]) for (; v % 10 == 0; v /= 10, n--);\r\n if (n < 0) n = 0;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * n / 0 = I\r\n * n / N = N\r\n * n / I = 0\r\n * 0 / n = 0\r\n * 0 / 0 = N\r\n * 0 / N = N\r\n * 0 / I = 0\r\n * N / n = N\r\n * N / 0 = N\r\n * N / N = N\r\n * N / I = N\r\n * I / n = I\r\n * I / 0 = I\r\n * I / N = N\r\n * I / I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber divided by the value of\r\n * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.dividedBy = P.div = function (y, b) {\r\n return div(this, new BigNumber(y, b), DECIMAL_PLACES, ROUNDING_MODE);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the integer part of dividing the value of this\r\n * BigNumber by the value of BigNumber(y, b).\r\n */\r\n P.dividedToIntegerBy = P.idiv = function (y, b) {\r\n return div(this, new BigNumber(y, b), 0, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the value of this BigNumber exponentiated by n.\r\n *\r\n * If m is present, return the result modulo m.\r\n * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE.\r\n * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using ROUNDING_MODE.\r\n *\r\n * The modular power operation works efficiently when x, n, and m are integers, otherwise it\r\n * is equivalent to calculating x.exponentiatedBy(n).modulo(m) with a POW_PRECISION of 0.\r\n *\r\n * n {number|string|BigNumber} The exponent. An integer.\r\n * [m] {number|string|BigNumber} The modulus.\r\n *\r\n * '[BigNumber Error] Exponent not an integer: {n}'\r\n */\r\n P.exponentiatedBy = P.pow = function (n, m) {\r\n var half, isModExp, i, k, more, nIsBig, nIsNeg, nIsOdd, y,\r\n x = this;\r\n\r\n n = new BigNumber(n);\r\n\r\n // Allow NaN and ±Infinity, but not other non-integers.\r\n if (n.c && !n.isInteger()) {\r\n throw Error\r\n (bignumberError + 'Exponent not an integer: ' + valueOf(n));\r\n }\r\n\r\n if (m != null) m = new BigNumber(m);\r\n\r\n // Exponent of MAX_SAFE_INTEGER is 15.\r\n nIsBig = n.e > 14;\r\n\r\n // If x is NaN, ±Infinity, ±0 or ±1, or n is ±Infinity, NaN or ±0.\r\n if (!x.c || !x.c[0] || x.c[0] == 1 && !x.e && x.c.length == 1 || !n.c || !n.c[0]) {\r\n\r\n // The sign of the result of pow when x is negative depends on the evenness of n.\r\n // If +n overflows to ±Infinity, the evenness of n would be not be known.\r\n y = new BigNumber(Math.pow(+valueOf(x), nIsBig ? 2 - isOdd(n) : +valueOf(n)));\r\n return m ? y.mod(m) : y;\r\n }\r\n\r\n nIsNeg = n.s < 0;\r\n\r\n if (m) {\r\n\r\n // x % m returns NaN if abs(m) is zero, or m is NaN.\r\n if (m.c ? !m.c[0] : !m.s) return new BigNumber(NaN);\r\n\r\n isModExp = !nIsNeg && x.isInteger() && m.isInteger();\r\n\r\n if (isModExp) x = x.mod(m);\r\n\r\n // Overflow to ±Infinity: >=2**1e10 or >=1.0000024**1e15.\r\n // Underflow to ±0: <=0.79**1e10 or <=0.9999975**1e15.\r\n } else if (n.e > 9 && (x.e > 0 || x.e < -1 || (x.e == 0\r\n // [1, 240000000]\r\n ? x.c[0] > 1 || nIsBig && x.c[1] >= 24e7\r\n // [80000000000000] [99999750000000]\r\n : x.c[0] < 8e13 || nIsBig && x.c[0] <= 9999975e7))) {\r\n\r\n // If x is negative and n is odd, k = -0, else k = 0.\r\n k = x.s < 0 && isOdd(n) ? -0 : 0;\r\n\r\n // If x >= 1, k = ±Infinity.\r\n if (x.e > -1) k = 1 / k;\r\n\r\n // If n is negative return ±0, else return ±Infinity.\r\n return new BigNumber(nIsNeg ? 1 / k : k);\r\n\r\n } else if (POW_PRECISION) {\r\n\r\n // Truncating each coefficient array to a length of k after each multiplication\r\n // equates to truncating significant digits to POW_PRECISION + [28, 41],\r\n // i.e. there will be a minimum of 28 guard digits retained.\r\n k = mathceil(POW_PRECISION / LOG_BASE + 2);\r\n }\r\n\r\n if (nIsBig) {\r\n half = new BigNumber(0.5);\r\n if (nIsNeg) n.s = 1;\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = Math.abs(+valueOf(n));\r\n nIsOdd = i % 2;\r\n }\r\n\r\n y = new BigNumber(ONE);\r\n\r\n // Performs 54 loop iterations for n of 9007199254740991.\r\n for (; ;) {\r\n\r\n if (nIsOdd) {\r\n y = y.times(x);\r\n if (!y.c) break;\r\n\r\n if (k) {\r\n if (y.c.length > k) y.c.length = k;\r\n } else if (isModExp) {\r\n y = y.mod(m); //y = y.minus(div(y, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (i) {\r\n i = mathfloor(i / 2);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n } else {\r\n n = n.times(half);\r\n round(n, n.e + 1, 1);\r\n\r\n if (n.e > 14) {\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = +valueOf(n);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n }\r\n }\r\n\r\n x = x.times(x);\r\n\r\n if (k) {\r\n if (x.c && x.c.length > k) x.c.length = k;\r\n } else if (isModExp) {\r\n x = x.mod(m); //x = x.minus(div(x, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (isModExp) return y;\r\n if (nIsNeg) y = ONE.div(y);\r\n\r\n return m ? y.mod(m) : k ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber rounded to an integer\r\n * using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {rm}'\r\n */\r\n P.integerValue = function (rm) {\r\n var n = new BigNumber(this);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n return round(n, n.e + 1, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isEqualTo = P.eq = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is a finite number, otherwise return false.\r\n */\r\n P.isFinite = function () {\r\n return !!this.c;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isGreaterThan = P.gt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isGreaterThanOrEqualTo = P.gte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === 1 || b === 0;\r\n\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is an integer, otherwise return false.\r\n */\r\n P.isInteger = function () {\r\n return !!this.c && bitFloor(this.e / LOG_BASE) > this.c.length - 2;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isLessThan = P.lt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isLessThanOrEqualTo = P.lte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === -1 || b === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is NaN, otherwise return false.\r\n */\r\n P.isNaN = function () {\r\n return !this.s;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is negative, otherwise return false.\r\n */\r\n P.isNegative = function () {\r\n return this.s < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is positive, otherwise return false.\r\n */\r\n P.isPositive = function () {\r\n return this.s > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is 0 or -0, otherwise return false.\r\n */\r\n P.isZero = function () {\r\n return !!this.c && this.c[0] == 0;\r\n };\r\n\r\n\r\n /*\r\n * n - 0 = n\r\n * n - N = N\r\n * n - I = -I\r\n * 0 - n = -n\r\n * 0 - 0 = 0\r\n * 0 - N = N\r\n * 0 - I = -I\r\n * N - n = N\r\n * N - 0 = N\r\n * N - N = N\r\n * N - I = N\r\n * I - n = I\r\n * I - 0 = I\r\n * I - N = N\r\n * I - I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber minus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.minus = function (y, b) {\r\n var i, j, t, xLTy,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.plus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return xc ? (y.s = -b, y) : new BigNumber(yc ? x : NaN);\r\n\r\n // Either zero?\r\n if (!xc[0] || !yc[0]) {\r\n\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n return yc[0] ? (y.s = -b, y) : new BigNumber(xc[0] ? x :\r\n\r\n // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity\r\n ROUNDING_MODE == 3 ? -0 : 0);\r\n }\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Determine which is the bigger number.\r\n if (a = xe - ye) {\r\n\r\n if (xLTy = a < 0) {\r\n a = -a;\r\n t = xc;\r\n } else {\r\n ye = xe;\r\n t = yc;\r\n }\r\n\r\n t.reverse();\r\n\r\n // Prepend zeros to equalise exponents.\r\n for (b = a; b--; t.push(0));\r\n t.reverse();\r\n } else {\r\n\r\n // Exponents equal. Check digit by digit.\r\n j = (xLTy = (a = xc.length) < (b = yc.length)) ? a : b;\r\n\r\n for (a = b = 0; b < j; b++) {\r\n\r\n if (xc[b] != yc[b]) {\r\n xLTy = xc[b] < yc[b];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // x < y? Point xc to the array of the bigger number.\r\n if (xLTy) t = xc, xc = yc, yc = t, y.s = -y.s;\r\n\r\n b = (j = yc.length) - (i = xc.length);\r\n\r\n // Append zeros to xc if shorter.\r\n // No need to add zeros to yc if shorter as subtract only needs to start at yc.length.\r\n if (b > 0) for (; b--; xc[i++] = 0);\r\n b = BASE - 1;\r\n\r\n // Subtract yc from xc.\r\n for (; j > a;) {\r\n\r\n if (xc[--j] < yc[j]) {\r\n for (i = j; i && !xc[--i]; xc[i] = b);\r\n --xc[i];\r\n xc[j] += BASE;\r\n }\r\n\r\n xc[j] -= yc[j];\r\n }\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xc[0] == 0; xc.splice(0, 1), --ye);\r\n\r\n // Zero?\r\n if (!xc[0]) {\r\n\r\n // Following IEEE 754 (2008) 6.3,\r\n // n - n = +0 but n - n = -0 when rounding towards -Infinity.\r\n y.s = ROUNDING_MODE == 3 ? -1 : 1;\r\n y.c = [y.e = 0];\r\n return y;\r\n }\r\n\r\n // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity\r\n // for finite x and y.\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * n % 0 = N\r\n * n % N = N\r\n * n % I = n\r\n * 0 % n = 0\r\n * -0 % n = -0\r\n * 0 % 0 = N\r\n * 0 % N = N\r\n * 0 % I = 0\r\n * N % n = N\r\n * N % 0 = N\r\n * N % N = N\r\n * N % I = N\r\n * I % n = N\r\n * I % 0 = N\r\n * I % N = N\r\n * I % I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber modulo the value of\r\n * BigNumber(y, b). The result depends on the value of MODULO_MODE.\r\n */\r\n P.modulo = P.mod = function (y, b) {\r\n var q, s,\r\n x = this;\r\n\r\n y = new BigNumber(y, b);\r\n\r\n // Return NaN if x is Infinity or NaN, or y is NaN or zero.\r\n if (!x.c || !y.s || y.c && !y.c[0]) {\r\n return new BigNumber(NaN);\r\n\r\n // Return x if y is Infinity or x is zero.\r\n } else if (!y.c || x.c && !x.c[0]) {\r\n return new BigNumber(x);\r\n }\r\n\r\n if (MODULO_MODE == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // r = x - qy where 0 <= r < abs(y)\r\n s = y.s;\r\n y.s = 1;\r\n q = div(x, y, 0, 3);\r\n y.s = s;\r\n q.s *= s;\r\n } else {\r\n q = div(x, y, 0, MODULO_MODE);\r\n }\r\n\r\n y = x.minus(q.times(y));\r\n\r\n // To match JavaScript %, ensure sign of zero is sign of dividend.\r\n if (!y.c[0] && MODULO_MODE == 1) y.s = x.s;\r\n\r\n return y;\r\n };\r\n\r\n\r\n /*\r\n * n * 0 = 0\r\n * n * N = N\r\n * n * I = I\r\n * 0 * n = 0\r\n * 0 * 0 = 0\r\n * 0 * N = N\r\n * 0 * I = N\r\n * N * n = N\r\n * N * 0 = N\r\n * N * N = N\r\n * N * I = N\r\n * I * n = I\r\n * I * 0 = N\r\n * I * N = N\r\n * I * I = I\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber multiplied by the value\r\n * of BigNumber(y, b).\r\n */\r\n P.multipliedBy = P.times = function (y, b) {\r\n var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc,\r\n base, sqrtBase,\r\n x = this,\r\n xc = x.c,\r\n yc = (y = new BigNumber(y, b)).c;\r\n\r\n // Either NaN, ±Infinity or ±0?\r\n if (!xc || !yc || !xc[0] || !yc[0]) {\r\n\r\n // Return NaN if either is NaN, or one is 0 and the other is Infinity.\r\n if (!x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc) {\r\n y.c = y.e = y.s = null;\r\n } else {\r\n y.s *= x.s;\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n if (!xc || !yc) {\r\n y.c = y.e = null;\r\n\r\n // Return ±0 if either is ±0.\r\n } else {\r\n y.c = [0];\r\n y.e = 0;\r\n }\r\n }\r\n\r\n return y;\r\n }\r\n\r\n e = bitFloor(x.e / LOG_BASE) + bitFloor(y.e / LOG_BASE);\r\n y.s *= x.s;\r\n xcL = xc.length;\r\n ycL = yc.length;\r\n\r\n // Ensure xc points to longer array and xcL to its length.\r\n if (xcL < ycL) zc = xc, xc = yc, yc = zc, i = xcL, xcL = ycL, ycL = i;\r\n\r\n // Initialise the result array with zeros.\r\n for (i = xcL + ycL, zc = []; i--; zc.push(0));\r\n\r\n base = BASE;\r\n sqrtBase = SQRT_BASE;\r\n\r\n for (i = ycL; --i >= 0;) {\r\n c = 0;\r\n ylo = yc[i] % sqrtBase;\r\n yhi = yc[i] / sqrtBase | 0;\r\n\r\n for (k = xcL, j = i + k; j > i;) {\r\n xlo = xc[--k] % sqrtBase;\r\n xhi = xc[k] / sqrtBase | 0;\r\n m = yhi * xlo + xhi * ylo;\r\n xlo = ylo * xlo + ((m % sqrtBase) * sqrtBase) + zc[j] + c;\r\n c = (xlo / base | 0) + (m / sqrtBase | 0) + yhi * xhi;\r\n zc[j--] = xlo % base;\r\n }\r\n\r\n zc[j] = c;\r\n }\r\n\r\n if (c) {\r\n ++e;\r\n } else {\r\n zc.splice(0, 1);\r\n }\r\n\r\n return normalise(y, zc, e);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber negated,\r\n * i.e. multiplied by -1.\r\n */\r\n P.negated = function () {\r\n var x = new BigNumber(this);\r\n x.s = -x.s || null;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * n + 0 = n\r\n * n + N = N\r\n * n + I = I\r\n * 0 + n = n\r\n * 0 + 0 = 0\r\n * 0 + N = N\r\n * 0 + I = I\r\n * N + n = N\r\n * N + 0 = N\r\n * N + N = N\r\n * N + I = N\r\n * I + n = I\r\n * I + 0 = I\r\n * I + N = N\r\n * I + I = I\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber plus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.plus = function (y, b) {\r\n var t,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.minus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Return ±Infinity if either ±Infinity.\r\n if (!xc || !yc) return new BigNumber(a / 0);\r\n\r\n // Either zero?\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n if (!xc[0] || !yc[0]) return yc[0] ? y : new BigNumber(xc[0] ? x : a * 0);\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts.\r\n if (a = xe - ye) {\r\n if (a > 0) {\r\n ye = xe;\r\n t = yc;\r\n } else {\r\n a = -a;\r\n t = xc;\r\n }\r\n\r\n t.reverse();\r\n for (; a--; t.push(0));\r\n t.reverse();\r\n }\r\n\r\n a = xc.length;\r\n b = yc.length;\r\n\r\n // Point xc to the longer array, and b to the shorter length.\r\n if (a - b < 0) t = yc, yc = xc, xc = t, b = a;\r\n\r\n // Only start adding at yc.length - 1 as the further digits of xc can be ignored.\r\n for (a = 0; b;) {\r\n a = (xc[--b] = xc[b] + yc[b] + a) / BASE | 0;\r\n xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE;\r\n }\r\n\r\n if (a) {\r\n xc = [a].concat(xc);\r\n ++ye;\r\n }\r\n\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n // ye = MAX_EXP + 1 possible\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * If sd is undefined or null or true or false, return the number of significant digits of\r\n * the value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n * If sd is true include integer-part trailing zeros in the count.\r\n *\r\n * Otherwise, if sd is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of sd significant digits using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * sd {number|boolean} number: significant digits: integer, 1 to MAX inclusive.\r\n * boolean: whether to count integer-part trailing zeros: true or false.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.precision = P.sd = function (sd, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (sd != null && sd !== !!sd) {\r\n intCheck(sd, 1, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), sd, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n v = c.length - 1;\r\n n = v * LOG_BASE + 1;\r\n\r\n if (v = c[v]) {\r\n\r\n // Subtract the number of trailing zeros of the last element.\r\n for (; v % 10 == 0; v /= 10, n--);\r\n\r\n // Add the number of digits of the first element.\r\n for (v = c[0]; v >= 10; v /= 10, n++);\r\n }\r\n\r\n if (sd && x.e + 1 > n) n = x.e + 1;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber shifted by k places\r\n * (powers of 10). Shift to the right if n > 0, and to the left if n < 0.\r\n *\r\n * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {k}'\r\n */\r\n P.shiftedBy = function (k) {\r\n intCheck(k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER);\r\n return this.times('1e' + k);\r\n };\r\n\r\n\r\n /*\r\n * sqrt(-n) = N\r\n * sqrt(N) = N\r\n * sqrt(-I) = N\r\n * sqrt(I) = I\r\n * sqrt(0) = 0\r\n * sqrt(-0) = -0\r\n *\r\n * Return a new BigNumber whose value is the square root of the value of this BigNumber,\r\n * rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.squareRoot = P.sqrt = function () {\r\n var m, n, r, rep, t,\r\n x = this,\r\n c = x.c,\r\n s = x.s,\r\n e = x.e,\r\n dp = DECIMAL_PLACES + 4,\r\n half = new BigNumber('0.5');\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !c || !c[0]) {\r\n return new BigNumber(!s || s < 0 && (!c || c[0]) ? NaN : c ? x : 1 / 0);\r\n }\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+valueOf(x));\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = coeffToString(c);\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(+n);\r\n e = bitFloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new BigNumber(n);\r\n } else {\r\n r = new BigNumber(s + '');\r\n }\r\n\r\n // Check for zero.\r\n // r could be zero if MIN_EXP is changed after the this value was created.\r\n // This would cause a division by zero (x/t) and hence Infinity below, which would cause\r\n // coeffToString to throw.\r\n if (r.c[0]) {\r\n e = r.e;\r\n s = e + dp;\r\n if (s < 3) s = 0;\r\n\r\n // Newton-Raphson iteration.\r\n for (; ;) {\r\n t = r;\r\n r = half.times(t.plus(div(x, t, dp, 1)));\r\n\r\n if (coeffToString(t.c).slice(0, s) === (n = coeffToString(r.c)).slice(0, s)) {\r\n\r\n // The exponent of r may here be one less than the final result exponent,\r\n // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits\r\n // are indexed correctly.\r\n if (r.e < e) --s;\r\n n = n.slice(s - 3, s + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits\r\n // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the\r\n // iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the\r\n // exact result as the nines may infinitely repeat.\r\n if (!rep) {\r\n round(t, t.e + DECIMAL_PLACES + 2, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n dp += 4;\r\n s += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact\r\n // result. If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n round(r, r.e + DECIMAL_PLACES + 2, 1);\r\n m = !r.times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return round(r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in exponential notation and\r\n * rounded using ROUNDING_MODE to dp fixed decimal places.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toExponential = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp++;\r\n }\r\n return format(this, dp, rm, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounding\r\n * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * Note: as with JavaScript's number type, (-0).toFixed(0) is '0',\r\n * but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toFixed = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp = dp + this.e + 1;\r\n }\r\n return format(this, dp, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounded\r\n * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties\r\n * of the format or FORMAT object (see BigNumber.set).\r\n *\r\n * The formatting object may contain some or all of the properties shown below.\r\n *\r\n * FORMAT = {\r\n * prefix: '',\r\n * groupSize: 3,\r\n * secondaryGroupSize: 0,\r\n * groupSeparator: ',',\r\n * decimalSeparator: '.',\r\n * fractionGroupSize: 0,\r\n * fractionGroupSeparator: '\\xA0', // non-breaking space\r\n * suffix: ''\r\n * };\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n * [format] {object} Formatting options. See FORMAT pbject above.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n * '[BigNumber Error] Argument not an object: {format}'\r\n */\r\n P.toFormat = function (dp, rm, format) {\r\n var str,\r\n x = this;\r\n\r\n if (format == null) {\r\n if (dp != null && rm && typeof rm == 'object') {\r\n format = rm;\r\n rm = null;\r\n } else if (dp && typeof dp == 'object') {\r\n format = dp;\r\n dp = rm = null;\r\n } else {\r\n format = FORMAT;\r\n }\r\n } else if (typeof format != 'object') {\r\n throw Error\r\n (bignumberError + 'Argument not an object: ' + format);\r\n }\r\n\r\n str = x.toFixed(dp, rm);\r\n\r\n if (x.c) {\r\n var i,\r\n arr = str.split('.'),\r\n g1 = +format.groupSize,\r\n g2 = +format.secondaryGroupSize,\r\n groupSeparator = format.groupSeparator || '',\r\n intPart = arr[0],\r\n fractionPart = arr[1],\r\n isNeg = x.s < 0,\r\n intDigits = isNeg ? intPart.slice(1) : intPart,\r\n len = intDigits.length;\r\n\r\n if (g2) i = g1, g1 = g2, g2 = i, len -= i;\r\n\r\n if (g1 > 0 && len > 0) {\r\n i = len % g1 || g1;\r\n intPart = intDigits.substr(0, i);\r\n for (; i < len; i += g1) intPart += groupSeparator + intDigits.substr(i, g1);\r\n if (g2 > 0) intPart += groupSeparator + intDigits.slice(i);\r\n if (isNeg) intPart = '-' + intPart;\r\n }\r\n\r\n str = fractionPart\r\n ? intPart + (format.decimalSeparator || '') + ((g2 = +format.fractionGroupSize)\r\n ? fractionPart.replace(new RegExp('\\\\d{' + g2 + '}\\\\B', 'g'),\r\n '$&' + (format.fractionGroupSeparator || ''))\r\n : fractionPart)\r\n : intPart;\r\n }\r\n\r\n return (format.prefix || '') + str + (format.suffix || '');\r\n };\r\n\r\n\r\n /*\r\n * Return an array of two BigNumbers representing the value of this BigNumber as a simple\r\n * fraction with an integer numerator and an integer denominator.\r\n * The denominator will be a positive non-zero value less than or equal to the specified\r\n * maximum denominator. If a maximum denominator is not specified, the denominator will be\r\n * the lowest value necessary to represent the number exactly.\r\n *\r\n * [md] {number|string|BigNumber} Integer >= 1, or Infinity. The maximum denominator.\r\n *\r\n * '[BigNumber Error] Argument {not an integer|out of range} : {md}'\r\n */\r\n P.toFraction = function (md) {\r\n var d, d0, d1, d2, e, exp, n, n0, n1, q, r, s,\r\n x = this,\r\n xc = x.c;\r\n\r\n if (md != null) {\r\n n = new BigNumber(md);\r\n\r\n // Throw if md is less than one or is not an integer, unless it is Infinity.\r\n if (!n.isInteger() && (n.c || n.s !== 1) || n.lt(ONE)) {\r\n throw Error\r\n (bignumberError + 'Argument ' +\r\n (n.isInteger() ? 'out of range: ' : 'not an integer: ') + valueOf(n));\r\n }\r\n }\r\n\r\n if (!xc) return new BigNumber(x);\r\n\r\n d = new BigNumber(ONE);\r\n n1 = d0 = new BigNumber(ONE);\r\n d1 = n0 = new BigNumber(ONE);\r\n s = coeffToString(xc);\r\n\r\n // Determine initial denominator.\r\n // d is a power of 10 and the minimum max denominator that specifies the value exactly.\r\n e = d.e = s.length - x.e - 1;\r\n d.c[0] = POWS_TEN[(exp = e % LOG_BASE) < 0 ? LOG_BASE + exp : exp];\r\n md = !md || n.comparedTo(d) > 0 ? (e > 0 ? d : n1) : n;\r\n\r\n exp = MAX_EXP;\r\n MAX_EXP = 1 / 0;\r\n n = new BigNumber(s);\r\n\r\n // n0 = d1 = 0\r\n n0.c[0] = 0;\r\n\r\n for (; ;) {\r\n q = div(n, d, 0, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.comparedTo(md) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n n1 = n0.plus(q.times(d2 = n1));\r\n n0 = d2;\r\n d = n.minus(q.times(d2 = d));\r\n n = d2;\r\n }\r\n\r\n d2 = div(md.minus(d0), d1, 0, 1);\r\n n0 = n0.plus(d2.times(n1));\r\n d0 = d0.plus(d2.times(d1));\r\n n0.s = n1.s = x.s;\r\n e = e * 2;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1\r\n r = div(n1, d1, e, ROUNDING_MODE).minus(x).abs().comparedTo(\r\n div(n0, d0, e, ROUNDING_MODE).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0];\r\n\r\n MAX_EXP = exp;\r\n\r\n return r;\r\n };\r\n\r\n\r\n /*\r\n * Return the value of this BigNumber converted to a number primitive.\r\n */\r\n P.toNumber = function () {\r\n return +valueOf(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber rounded to sd significant digits\r\n * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits\r\n * necessary to represent the integer part of the value in fixed-point notation, then use\r\n * exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.toPrecision = function (sd, rm) {\r\n if (sd != null) intCheck(sd, 1, MAX);\r\n return format(this, sd, rm, 2);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in base b, or base 10 if b is\r\n * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and\r\n * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent\r\n * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than\r\n * TO_EXP_NEG, return exponential notation.\r\n *\r\n * [b] {number} Integer, 2 to ALPHABET.length inclusive.\r\n *\r\n * '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n */\r\n P.toString = function (b) {\r\n var str,\r\n n = this,\r\n s = n.s,\r\n e = n.e;\r\n\r\n // Infinity or NaN?\r\n if (e === null) {\r\n if (s) {\r\n str = 'Infinity';\r\n if (s < 0) str = '-' + str;\r\n } else {\r\n str = 'NaN';\r\n }\r\n } else {\r\n if (b == null) {\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(coeffToString(n.c), e)\r\n : toFixedPoint(coeffToString(n.c), e, '0');\r\n } else if (b === 10) {\r\n n = round(new BigNumber(n), DECIMAL_PLACES + e + 1, ROUNDING_MODE);\r\n str = toFixedPoint(coeffToString(n.c), n.e, '0');\r\n } else {\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n str = convertBase(toFixedPoint(coeffToString(n.c), e, '0'), 10, b, s, true);\r\n }\r\n\r\n if (s < 0 && n.c[0]) str = '-' + str;\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return as toString, but do not accept a base argument, and include the minus sign for\r\n * negative zero.\r\n */\r\n P.valueOf = P.toJSON = function () {\r\n return valueOf(this);\r\n };\r\n\r\n\r\n P._isBigNumber = true;\r\n\r\n P[Symbol.toStringTag] = 'BigNumber';\r\n\r\n // Node.js v10.12.0+\r\n P[Symbol.for('nodejs.util.inspect.custom')] = P.valueOf;\r\n\r\n if (configObject != null) BigNumber.set(configObject);\r\n\r\n return BigNumber;\r\n}\r\n\r\n\r\n// PRIVATE HELPER FUNCTIONS\r\n\r\n// These functions don't need access to variables,\r\n// e.g. DECIMAL_PLACES, in the scope of the `clone` function above.\r\n\r\n\r\nfunction bitFloor(n) {\r\n var i = n | 0;\r\n return n > 0 || n === i ? i : i - 1;\r\n}\r\n\r\n\r\n// Return a coefficient array as a string of base 10 digits.\r\nfunction coeffToString(a) {\r\n var s, z,\r\n i = 1,\r\n j = a.length,\r\n r = a[0] + '';\r\n\r\n for (; i < j;) {\r\n s = a[i++] + '';\r\n z = LOG_BASE - s.length;\r\n for (; z--; s = '0' + s);\r\n r += s;\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (j = r.length; r.charCodeAt(--j) === 48;);\r\n\r\n return r.slice(0, j + 1 || 1);\r\n}\r\n\r\n\r\n// Compare the value of BigNumbers x and y.\r\nfunction compare(x, y) {\r\n var a, b,\r\n xc = x.c,\r\n yc = y.c,\r\n i = x.s,\r\n j = y.s,\r\n k = x.e,\r\n l = y.e;\r\n\r\n // Either NaN?\r\n if (!i || !j) return null;\r\n\r\n a = xc && !xc[0];\r\n b = yc && !yc[0];\r\n\r\n // Either zero?\r\n if (a || b) return a ? b ? 0 : -j : i;\r\n\r\n // Signs differ?\r\n if (i != j) return i;\r\n\r\n a = i < 0;\r\n b = k == l;\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return b ? 0 : !xc ^ a ? 1 : -1;\r\n\r\n // Compare exponents.\r\n if (!b) return k > l ^ a ? 1 : -1;\r\n\r\n j = (k = xc.length) < (l = yc.length) ? k : l;\r\n\r\n // Compare digit by digit.\r\n for (i = 0; i < j; i++) if (xc[i] != yc[i]) return xc[i] > yc[i] ^ a ? 1 : -1;\r\n\r\n // Compare lengths.\r\n return k == l ? 0 : k > l ^ a ? 1 : -1;\r\n}\r\n\r\n\r\n/*\r\n * Check that n is a primitive number, an integer, and in range, otherwise throw.\r\n */\r\nfunction intCheck(n, min, max, name) {\r\n if (n < min || n > max || n !== mathfloor(n)) {\r\n throw Error\r\n (bignumberError + (name || 'Argument') + (typeof n == 'number'\r\n ? n < min || n > max ? ' out of range: ' : ' not an integer: '\r\n : ' not a primitive number: ') + String(n));\r\n }\r\n}\r\n\r\n\r\n// Assumes finite n.\r\nfunction isOdd(n) {\r\n var k = n.c.length - 1;\r\n return bitFloor(n.e / LOG_BASE) == k && n.c[k] % 2 != 0;\r\n}\r\n\r\n\r\nfunction toExponential(str, e) {\r\n return (str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str) +\r\n (e < 0 ? 'e' : 'e+') + e;\r\n}\r\n\r\n\r\nfunction toFixedPoint(str, e, z) {\r\n var len, zs;\r\n\r\n // Negative exponent?\r\n if (e < 0) {\r\n\r\n // Prepend zeros.\r\n for (zs = z + '.'; ++e; zs += z);\r\n str = zs + str;\r\n\r\n // Positive exponent\r\n } else {\r\n len = str.length;\r\n\r\n // Append zeros.\r\n if (++e > len) {\r\n for (zs = z, e -= len; --e; zs += z);\r\n str += zs;\r\n } else if (e < len) {\r\n str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// EXPORT\r\n\r\n\r\nexport var BigNumber = clone();\r\n\r\nexport default BigNumber;\r\n","import BigNumber from 'bignumber.js'\nimport Web3 from 'web3'\nimport { Contract } from 'web3-eth-contract'\nimport { ConfigHelperConfig } from './ConfigHelper'\n\nexport async function getFairGasPrice(\n web3: Web3,\n config: ConfigHelperConfig\n): Promise<string> {\n const x = new BigNumber(await web3.eth.getGasPrice())\n if (config && config.gasFeeMultiplier)\n return x\n .multipliedBy(config.gasFeeMultiplier)\n .integerValue(BigNumber.ROUND_DOWN)\n .toString(10)\n else return x.toString(10)\n}\n\nexport function setContractDefaults(\n contract: Contract,\n config: ConfigHelperConfig\n): Contract {\n if (config) {\n contract.transactionBlockTimeout = config.transactionBlockTimeout\n contract.transactionConfirmationBlocks = config.transactionConfirmationBlocks\n contract.transactionPollingTimeout = config.transactionPollingTimeout\n }\n return contract\n}\n","import { DDO } from '../ddo/DDO'\nimport { Ocean } from '../ocean/Ocean'\n\nexport interface AssetResolved {\n did: string\n ddo: DDO\n}\n\nexport function isDdo(arg: any): arg is DDO {\n return arg.id !== undefined\n}\n\nexport async function assetResolve(\n asset: DDO | string,\n ocean: Ocean\n): Promise<AssetResolved> {\n if (isDdo(asset)) {\n const did = asset.id\n const ddo = asset\n return { did, ddo }\n } else {\n const ddo = await ocean.assets.resolve(asset)\n const did = ddo.id\n return { did, ddo }\n }\n}\n","import wordListDefault from '../data/words.json'\n\n/**\n * Generate new datatoken name & symbol from a word list\n * @return {<{ name: String; symbol: String }>} datatoken name & symbol. Produces e.g. \"Endemic Jellyfish Token\" & \"ENDJEL-45\"\n */\nexport function generateDatatokenName(wordList?: {\n nouns: string[]\n adjectives: string[]\n}): {\n name: string\n symbol: string\n} {\n const list = wordList || wordListDefault\n const random1 = Math.floor(Math.random() * list.adjectives.length)\n const random2 = Math.floor(Math.random() * list.nouns.length)\n const indexNumber = Math.floor(Math.random() * 100)\n\n // Capitalized adjective & noun\n const adjective = list.adjectives[random1].replace(/^\\w/, (c) => c.toUpperCase())\n const noun = list.nouns[random2].replace(/^\\w/, (c) => c.toUpperCase())\n\n const name = `${adjective} ${noun} Token`\n // use first 3 letters of name, uppercase it, and add random number\n const symbol = `${(\n adjective.substring(0, 3) + noun.substring(0, 3)\n ).toUpperCase()}-${indexNumber}`\n\n return { name, symbol }\n}\n","const zipObject = (keys = [], values = []) => {\n return keys.reduce(\n (acc, key, index) => ({\n ...acc,\n [key]: values[index]\n }),\n {}\n )\n}\n\nexport const objectPromiseAll = async (obj: { [key: string]: Promise<any> }) => {\n const keys = Object.keys(obj)\n const result = await Promise.all(Object.values(obj))\n return zipObject(keys, result)\n}\n","import { v4 } from 'uuid'\n\nexport function generateId(length = 64): string {\n let id = ''\n while (id.length < length) {\n id += v4().replace(/-/g, '')\n }\n return id.substr(0, length)\n}\n","import Web3 from 'web3'\nimport Config from './models/Config'\nimport { Logger, LoggerInstance } from './utils'\nimport { Ocean } from './ocean/Ocean'\n\nexport interface InstantiableConfig {\n ocean: Ocean\n config?: Config\n web3?: Web3\n logger?: Logger\n}\n\nexport function generateIntantiableConfigFromConfig(\n config: Config\n): Partial<InstantiableConfig> {\n return {\n config,\n web3: config.web3Provider,\n logger: LoggerInstance\n }\n}\n\nexport abstract class Instantiable {\n protected get ocean(): Ocean {\n if (!this._ocean) {\n LoggerInstance.error('Ocean instance is not defined.')\n }\n return this._ocean\n }\n\n protected get web3(): Web3 {\n if (!this._web3) {\n LoggerInstance.error('Web3 instance is not defined.')\n }\n return this._web3\n }\n\n protected get config(): Config {\n if (!this._config) {\n LoggerInstance.error('Config instance is not defined.')\n }\n return this._config\n }\n\n protected get logger(): Logger {\n return LoggerInstance\n }\n\n protected get instanceConfig(): InstantiableConfig {\n const { ocean, web3, config, logger } = this\n return { ocean, web3, config, logger }\n }\n\n public static async getInstance(...args: any[]): Promise<any>\n\n public static async getInstance(config: InstantiableConfig): Promise<any> {\n LoggerInstance.warn('getInstance() methods has needs to be added to child class.')\n }\n\n protected static setInstanceConfig<T extends Instantiable>(\n instance: T,\n { ocean, config, web3, logger }: InstantiableConfig\n ) {\n instance._ocean = ocean\n instance._config = config\n instance._web3 = web3\n instance._logger = logger\n }\n\n private _ocean: Ocean\n\n private _web3: Web3\n\n private _config: Config\n\n private _logger: Logger\n\n protected setInstanceConfig(config: InstantiableConfig) {\n Instantiable.setInstanceConfig(this, config)\n }\n}\n","import { Instantiable, InstantiableConfig } from '../Instantiable.abstract'\nimport { AbiItem } from 'web3-utils/types'\nimport Decimal from 'decimal.js'\n/**\n * Account information.\n */\nexport default class Account extends Instantiable {\n private password?: string\n\n private token?: string\n\n constructor(private id: string = '0x0', config?: InstantiableConfig) {\n super()\n if (config) {\n this.setInstanceConfig(config)\n }\n }\n\n public getId(): string {\n return this.id\n }\n\n public setId(id: string): void {\n this.id = id\n }\n\n /**\n * Set account password.\n * @param {string} password Password for account.\n */\n public setPassword(password: string): void {\n this.password = password\n }\n\n /**\n * Returns account password.\n * @return {string} Account password.\n */\n public getPassword(): string {\n return this.password\n }\n\n // TODO - Check with Samer if authentificate is still needed or we can use sign\n\n /**\n * Set account token.\n * @param {string} token Token for account.\n \n public setToken(token: string): void {\n this.token = token\n }\n */\n /**\n * Returns account token.\n * @return {Promise<string>} Account token.\n \n public async getToken(): Promise<string> {\n return this.token || this.ocean.auth.restore(this)\n }\n */\n\n /**\n * Returns if account token is stored.\n * @return {Promise<boolean>} Is stored.\n \n public isTokenStored(): Promise<boolean> {\n return this.ocean.auth.isStored(this)\n }\n */\n /**\n * Authenticate the account.\n \n public authenticate() {\n return this.ocean.auth.store(this)\n }\n */\n\n /**\n * Balance of Any Token (converted from wei).\n * @return {Promise<string>}\n */\n public async getTokenBalance(TokenAdress: string): Promise<string> {\n if (TokenAdress === null) return null\n const minABI = [\n {\n constant: true,\n inputs: [\n {\n name: '_owner',\n type: 'address'\n }\n ],\n name: 'balanceOf',\n outputs: [\n {\n name: 'balance',\n type: 'uint256'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n }\n ] as AbiItem[]\n\n let result = null\n const decimals = await this.getTokenDecimals(TokenAdress)\n try {\n const token = new this.web3.eth.Contract(minABI, TokenAdress, {\n from: this.id\n })\n const balance = await token.methods.balanceOf(this.id).call()\n result = new Decimal(balance).div(10 ** decimals).toString()\n } catch (e) {\n this.logger.error(`ERROR: Failed to get the balance: ${e.message}`)\n }\n return result\n }\n\n /**\n * Decimals of Any Token\n * @return {Promise<number>}\n */\n public async getTokenDecimals(TokenAdress: string): Promise<number> {\n let decimals = 18\n if (TokenAdress === null) return decimals\n const minABI = [\n {\n constant: true,\n inputs: [],\n name: 'decimals',\n outputs: [{ name: '', type: 'uint8' }],\n type: 'function'\n }\n ] as AbiItem[]\n\n try {\n const token = new this.web3.eth.Contract(minABI, TokenAdress, {\n from: this.id\n })\n decimals = await token.methods.decimals().call()\n } catch (e) {\n this.logger.error(`ERROR: Failed to get decimals : ${e.message}`)\n }\n return decimals\n }\n\n /**\n * Balance of Ocean Token. (converted from wei).\n * @return {Promise<string>}\n */\n public async getOceanBalance(): Promise<string> {\n return this.getTokenBalance(this.config.oceanTokenAddress)\n }\n\n /**\n * Symbol of a Token\n * @return {Promise<string>}\n */\n public async getTokenSymbol(TokenAdress: string): Promise<string> {\n // TO DO\n return ''\n }\n\n /**\n * Balance of Ether.(converted from wei).\n * @return {Promise<string>}\n */\n public async getEtherBalance(): Promise<string> {\n const result = await this.web3.eth.getBalance(this.id, 'latest')\n return this.web3.utils.fromWei(result)\n }\n}\n","import { noZeroX } from '../utils'\nconst prefix = 'did:op:'\n\n/**\n * Decentralized ID.\n */\nexport default class DID {\n /**\n * Parses a DID from a string.\n * @param {string} didString DID in string.\n * @return {DID}\n */\n public static parse(didString: string | DID): DID {\n if (didString instanceof DID) {\n didString = didString.getDid()\n }\n let did: DID\n const didMatch = didString.match(/^did:op:([a-f0-9]{40})$/i)\n if (didMatch) {\n did = new DID(didMatch[1])\n }\n\n if (!did) {\n throw new Error(`Parsing DID failed, ${didString}`)\n }\n\n return did\n }\n\n /**\n * Generate a new DID.\n * @param {string} dataTokenAddress Address of data token to use for DID.\n * @return {DID}\n */\n public static generate(dataTokenAddress: string): DID {\n return new DID(noZeroX(dataTokenAddress))\n }\n\n /**\n * ID.\n * @type {string}\n */\n private id: string\n\n private constructor(id: string) {\n this.id = id\n }\n\n /**\n * Returns the DID.\n * @return {string}\n */\n public getDid(): string {\n return `${prefix}${this.id}`\n }\n\n /**\n * Returns the ID.\n * @return {string}\n */\n public getId(): string {\n return this.id\n }\n}\n","import Account from './Account'\nimport { Instantiable, InstantiableConfig } from '../Instantiable.abstract'\n\n/**\n * Account submodule of Ocean Protocol.\n */\nexport class Accounts extends Instantiable {\n /**\n * Returns the instance of OceanAccounts.\n * @return {Promise<OceanAccounts>}\n */\n public static async getInstance(config: InstantiableConfig): Promise<Accounts> {\n const instance = new Accounts()\n instance.setInstanceConfig(config)\n\n return instance\n }\n\n /**\n * Returns the list of accounts.\n * @return {Promise<Account[]>}\n */\n public async list(): Promise<Account[]> {\n // retrieve eth accounts\n const ethAccounts: string[] = await this.web3.eth.getAccounts()\n\n const accountPromises = ethAccounts.map(\n (address) => new Account(address, this.instanceConfig)\n )\n return Promise.all(accountPromises)\n }\n\n /**\n * Return account balance for a given ERC20 token\n * @param {String} TokenAddress .\n * @param {Account} account Account instance.\n * @return {Promise<String>} Token balance.\n */\n public getTokenBalance(TokenAddress: string, account: Account): Promise<string> {\n return account.getTokenBalance(TokenAddress)\n }\n\n /**\n * Return account balance for a Ocean Tokens\n * @param {Account} account Account instance.\n * @return {Promise<String>} Ocean Token balance.\n */\n public getOceanBalance(account: Account): Promise<string> {\n return account.getOceanBalance()\n }\n\n /**\n * Return account balance in ETH\n * @param {Account} account Account instance.\n * @return {Promise<String>} Ether balance.\n */\n public getEtherBalance(account: Account): Promise<string> {\n return account.getEtherBalance()\n }\n}\n","import Web3 from 'web3'\nimport Config from '../models/Config'\n\nexport default class Web3Provider {\n /**\n * Returns Web3 instance.\n * @return {Web3}\n */\n public static getWeb3(config: Partial<Config> = {}): Web3 {\n return new Web3(\n config.web3Provider ||\n Web3.givenProvider ||\n new Web3.providers.HttpProvider(config.nodeUri)\n )\n }\n}\n","import { Ocean } from '../ocean/Ocean'\nimport { Authentication } from './interfaces/Authentication'\nimport { Proof } from './interfaces/Proof'\nimport { PublicKey } from './interfaces/PublicKey'\nimport { Service, ServiceType } from './interfaces/Service'\nimport Web3Provider from '../datatokens/Web3Provider'\nimport { BestPrice } from './interfaces/BestPrice'\nimport { DataTokenInfo } from './interfaces/DataTokenInfo'\nimport { PurgatoryData } from './interfaces/PurgatoryData'\nimport { Credentials } from './interfaces/Credentials'\nimport { Event } from './interfaces/Event'\n/**\n * DID Descriptor Object.\n * Contains all the data related to an asset.\n */\nexport class DDO {\n /**\n * Serializes the DDO object.\n * @param {DDO} DDO to be serialized.\n * @return {string} DDO serialized.\n */\n public static serialize(ddo: DDO): string {\n return JSON.stringify(ddo, null, 2)\n }\n\n /**\n * Deserializes the DDO object.\n * @param {DDO} DDO to be deserialized.\n * @return {string} DDO deserialized.\n */\n public static deserialize(ddoString: string): DDO {\n const ddo = JSON.parse(ddoString)\n\n return new DDO(ddo)\n }\n\n public '@context' = 'https://w3id.org/did/v1'\n\n /**\n * DID, descentralized ID.\n * @type {string}\n */\n public id: string = null\n\n public created: string\n\n public updated: string\n\n public dataToken: string\n\n public publicKey: PublicKey[] = []\n\n public authentication: Authentication[] = []\n\n public service: Service[] = []\n\n public proof: Proof\n\n public price: BestPrice\n\n public isInPurgatory: 'false' | 'true'\n\n public purgatoryData?: PurgatoryData\n\n public dataTokenInfo?: DataTokenInfo\n\n public credentials?: Credentials\n\n public chainId?: number\n\n public event?: Event\n\n public constructor(ddo: Partial<DDO> = {}) {\n Object.assign(this, ddo, {\n created: (ddo && ddo.created) || new Date().toISOString().replace(/\\.[0-9]{3}/, '')\n })\n }\n\n public shortId(): string {\n return this.id.replace('did:op:', '')\n }\n\n /**\n * Finds a service of a DDO by index.\n * @param {number} Service index.\n * @return {Service} Service.\n */\n public findServiceById<T extends ServiceType>(index: number): Service<T> {\n if (isNaN(index)) {\n throw new Error('index is not set')\n }\n\n const service = this.service.find((s) => s.index === index)\n\n return service as Service<T>\n }\n\n /**\n * Finds a service of a DDO by type.\n * @param {string} serviceType Service type.\n * @return {Service} Service.\n */\n public findServiceByType<T extends ServiceType>(serviceType: T): Service<T> {\n if (!serviceType) {\n throw new Error('serviceType not set')\n }\n\n return this.service.find((s) => s.type === serviceType) as Service<T>\n }\n\n /**\n * Generate the checksum using the current content.\n * @return {string[]} DDO checksum.\n */\n public getChecksum(): string {\n const { attributes } = this.findServiceByType('metadata')\n const { files, name, author, license } = attributes.main\n\n const values = [\n ...(files || []).map(({ checksum }) => checksum).filter((_) => !!_),\n name,\n author,\n license,\n this.id\n ]\n\n return (\n Web3Provider.getWeb3()\n .utils.sha3(values.join(''))\n // TODO: security/detect-unsafe-regex\n .replace(/^0x([a-f0-9]{64})(:!.+)?$/i, '0x$1')\n )\n }\n\n /**\n * Generates and adds a simple hash proof on publicKey\n * @param {Ocean} ocean Ocean instance.\n * @param {string} publicKey Public key to be used on personal sign.\n * @return {Promise<void>}\n */\n public async addProof(\n ocean: Ocean,\n publicKey: string,\n password?: string\n ): Promise<void> {\n if (this.proof) {\n throw new Error('Proof already exists')\n }\n this.proof = {\n created: new Date().toISOString().replace(/\\.[0-9]{3}/, ''),\n creator: publicKey,\n type: 'AddressHash',\n signatureValue: Web3Provider.getWeb3()\n .utils.sha3(publicKey)\n // TODO: security/detect-unsafe-regex\n .replace(/^0x([a-f0-9]{64})(:!.+)?$/i, '0x$1')\n }\n }\n}\n","import AbortController from 'node-abort-controller'\n\nexport default function timeoutSignal(timeout: number) {\n if (!Number.isInteger(timeout)) {\n throw new TypeError(`Expected an integer, got ${typeof timeout}`)\n }\n const signalMap = new WeakMap()\n const controller = new AbortController()\n\n const timeoutId = setTimeout(() => {\n controller.abort()\n }, timeout)\n\n signalMap.set(controller.signal, timeoutId)\n // any is needed due to some type incompatibility\n return controller.signal as any\n}\n","import { Response } from 'node-fetch'\nimport fs from 'fs'\nimport { Logger } from '../../utils'\nimport save from 'save-file'\nimport timeoutSignal from '../../utils/Timeout'\nconst fetch = require('cross-fetch')\n\n/**\n * Provides a common interface to web services.\n */\nexport class WebServiceConnector {\n public logger: Logger\n public requestTimeout: number = 5000\n constructor(logger: Logger, requestTimeout?: number) {\n this.logger = logger\n this.requestTimeout = requestTimeout || this.requestTimeout\n }\n\n public post(url: string, payload: BodyInit): Promise<Response> {\n const headers = {\n 'Content-type': 'application/json'\n }\n return this.postWithHeaders(url, payload, headers)\n }\n\n public postWithOctet(url: string, payload: BodyInit): Promise<Response> {\n const headers = {\n 'Content-type': 'application/octet-stream'\n }\n return this.postWithHeaders(url, payload, headers)\n }\n\n public postWithHeaders(\n url: string,\n payload: BodyInit,\n headers: any\n ): Promise<Response> {\n if (payload != null) {\n return this.fetch(url, {\n method: 'POST',\n body: payload,\n headers,\n signal: timeoutSignal(this.requestTimeout)\n })\n } else {\n return this.fetch(url, {\n method: 'POST',\n signal: timeoutSignal(this.requestTimeout)\n })\n }\n }\n\n public get(url: string): Promise<Response> {\n return this.fetch(url, {\n method: 'GET',\n headers: {\n 'Content-type': 'application/json'\n },\n signal: timeoutSignal(this.requestTimeout)\n })\n }\n\n public put(url: string, payload: BodyInit): Promise<Response> {\n if (payload != null) {\n return this.fetch(url, {\n method: 'PUT',\n body: payload,\n headers: {\n 'Content-type': 'application/json'\n },\n signal: timeoutSignal(this.requestTimeout)\n })\n } else {\n return this.fetch(url, {\n method: 'PUT',\n headers: {\n 'Content-type': 'application/json'\n },\n signal: timeoutSignal(this.requestTimeout)\n })\n }\n }\n\n public delete(url: string, payload?: BodyInit): Promise<Response> {\n if (payload != null) {\n return this.fetch(url, {\n method: 'DELETE',\n body: payload,\n headers: {\n 'Content-type': 'application/json'\n },\n signal: timeoutSignal(this.requestTimeout)\n })\n } else {\n return this.fetch(url, {\n method: 'DELETE',\n headers: {\n 'Content-type': 'application/json'\n },\n signal: timeoutSignal(this.requestTimeout)\n })\n }\n }\n\n public async downloadFile(\n url: string,\n destination?: string,\n index?: number\n ): Promise<string> {\n const response = await this.get(url)\n if (!response.ok) {\n throw new Error('Response error.')\n }\n let filename: string\n try {\n filename = response.headers\n .get('content-disposition')\n .match(/attachment;filename=(.+)/)[1]\n } catch {\n try {\n filename = url.split('/').pop()\n } catch {\n filename = `file${index}`\n }\n }\n\n if (destination) {\n // eslint-disable-next-line no-async-promise-executor\n await new Promise(async (resolve, reject) => {\n fs.mkdirSync(destination, { recursive: true })\n const fileStream = fs.createWriteStream(`${destination}${filename}`)\n response.body.pipe(fileStream)\n response.body.on('error', reject)\n fileStream.on('finish', resolve)\n })\n\n return destination\n } else {\n save(await response.arrayBuffer(), filename)\n }\n }\n\n public async downloadFileBrowser(url: string): Promise<void> {\n const anchor = document.createElement('a')\n anchor.download = ''\n anchor.href = url\n anchor.click()\n }\n\n private async fetch(url: string, opts: RequestInit): Promise<Response> {\n const result = await fetch(url, opts)\n if (!result.ok) {\n this.logger.error(`Error requesting [${opts.method}] ${url}`)\n this.logger.error(`Response message: \\n${await result.text()}`)\n throw result\n }\n return result\n }\n}\n","import Account from '../ocean/Account'\nimport { noZeroX, assetResolve } from '../utils'\nimport { Instantiable, InstantiableConfig } from '../Instantiable.abstract'\nimport { File } from '../ddo/interfaces/File'\nimport {\n ComputeJob,\n ComputeInput,\n ComputeOutput,\n ComputeAlgorithm\n} from '../ocean/interfaces/Compute'\nimport { DDO } from '../ddo/DDO'\nimport DID from '../ocean/DID'\nimport { Service } from '../ddo/interfaces'\n\nexport interface ServiceEndpoint {\n serviceName: string\n method: string\n urlPath: string\n}\n\nexport interface ComputeLimits {\n algoTimeLimit?: string\n storageExpiry?: string\n}\n\nexport interface UserCustomParameters {\n [key: string]: any\n}\n\n/**\n * Provides an interface for provider service.\n * Provider service is the technical component executed\n * by the Publishers allowing to them to provide extended\n * data services.\n */\nexport class Provider extends Instantiable {\n public nonce: string\n private baseUrl: string\n public servicesEndpoints: ServiceEndpoint[]\n public computeAddress: string\n public providerAddress: string\n public providerVersion: string\n public computeLimits: ComputeLimits\n /**\n * Returns the instance of Provider.\n * @return {Promise<Assets>}\n */\n public static async getInstance(config: InstantiableConfig): Promise<Provider> {\n const instance = new Provider()\n instance.setInstanceConfig(config)\n instance.nonce = '0'\n await instance.setBaseUrl(config.config.providerUri)\n return instance\n }\n\n public async setBaseUrl(url: string): Promise<boolean> {\n this.baseUrl = url\n this.servicesEndpoints = await this.getServiceEndpoints()\n return true\n }\n\n public get url(): string {\n return this.baseUrl\n }\n\n /**\n * Returns the service endpoints that exist\n * in provider.\n * @return {Promise<ServiceEndpoint[]>}\n */\n\n public async getServiceEndpoints(): Promise<ServiceEndpoint[]> {\n const serviceEndpoints: ServiceEndpoint[] = []\n try {\n const result = await (await this.ocean.utils.fetch.get(this.url)).json()\n this.providerAddress = result.providerAddress\n if ('computeAddress' in result) this.computeAddress = result.computeAddress\n if ('version' in result) this.providerVersion = result.version\n if ('computeLimits' in result) this.computeLimits = result.computeLimits\n for (const i in result.serviceEndpoints) {\n const endpoint: ServiceEndpoint = {\n serviceName: i,\n method: result.serviceEndpoints[i][0],\n urlPath: this.url + result.serviceEndpoints[i][1]\n }\n serviceEndpoints.push(endpoint)\n }\n return serviceEndpoints\n } catch (e) {\n this.logger.error('Finding the service endpoints failed:', e)\n\n return null\n }\n }\n\n public getEndpointURL(serviceName: string): ServiceEndpoint {\n if (!this.servicesEndpoints) return null\n return this.servicesEndpoints.find(\n (s) => s.serviceName === serviceName\n ) as ServiceEndpoint\n }\n\n public async createSignature(account: Account, agreementId: string): Promise<string> {\n const signature = await this.ocean.utils.signature.signText(\n noZeroX(agreementId),\n account.getId()\n )\n\n return signature\n }\n\n public async createHashSignature(account: Account, message: string): Promise<string> {\n const signature = await this.ocean.utils.signature.signWithHash(\n message,\n account.getId()\n )\n\n return signature\n }\n\n public async encrypt(did: string, document: any, account: Account): Promise<string> {\n await this.getNonce(account.getId())\n const args = {\n documentId: did,\n document: JSON.stringify(document),\n publisherAddress: account.getId()\n }\n const path = this.getEncryptEndpoint() ? this.getEncryptEndpoint().urlPath : null\n if (!path) return null\n try {\n const response = await this.ocean.utils.fetch.post(\n path,\n decodeURI(JSON.stringify(args))\n )\n return (await response.json()).encryptedDocument\n } catch (e) {\n this.logger.error(e)\n throw new Error('HTTP request failed')\n }\n }\n\n /** Get URL details (if possible)\n * @param {String | DID} url or did\n * @return {Promise<File[]>} urlDetails\n */\n public async fileinfo(url: string): Promise<File[]> {\n const args = { url }\n const files: File[] = []\n const path = this.getFileinfoEndpoint() ? this.getFileinfoEndpoint().urlPath : null\n if (!path) return null\n try {\n const response = await this.ocean.utils.fetch.post(path, JSON.stringify(args))\n const results: File[] = await response.json()\n for (const result of results) {\n files.push(result)\n }\n return files\n } catch (e) {\n return null\n }\n }\n\n public async isFileConsumable(did: DID, serviceIndex: number): Promise<boolean> {\n const args = { did: did.getDid() }\n const ddo = await this.ocean.metadataCache.retrieveDDO(did)\n if (!ddo) return false\n const service: Service = ddo.findServiceById(serviceIndex)\n if (!service) return false\n const path = service.serviceEndpoint + '/api/v1/services/fileinfo'\n try {\n const response = await this.ocean.utils.fetch.post(path, JSON.stringify(args))\n const results = await response.json()\n return results[0].valid\n } catch (e) {\n return false\n }\n }\n\n /** Get nonce from provider\n * @param {String} consumerAddress\n * @return {Promise<string>} string\n */\n public async getNonce(consumerAddress: string): Promise<string> {\n const path = this.getNonceEndpoint() ? this.getNonceEndpoint().urlPath : null\n if (!path) return null\n try {\n const response = await this.ocean.utils.fetch.get(\n path + `?userAddress=${consumerAddress}`\n )\n this.nonce = String((await response.json()).nonce)\n return this.nonce\n } catch (e) {\n this.logger.error(e)\n throw new Error('HTTP request failed')\n }\n }\n\n public async initialize(\n asset: DDO | string,\n serviceIndex: number,\n serviceType: string,\n consumerAddress: string,\n userCustomParameters?: UserCustomParameters\n ): Promise<string> {\n const { did, ddo } = await assetResolve(asset, this.ocean)\n let initializeUrl = this.getInitializeEndpoint()\n ? this.getInitializeEndpoint().urlPath\n : null\n if (!initializeUrl) return null\n initializeUrl += `?documentId=${did}`\n initializeUrl += `&serviceId=${serviceIndex}`\n initializeUrl += `&serviceType=${serviceType}`\n initializeUrl += `&dataToken=${ddo.dataToken}`\n initializeUrl += `&consumerAddress=${consumerAddress}`\n if (userCustomParameters)\n initializeUrl += '&userdata=' + encodeURI(JSON.stringify(userCustomParameters))\n try {\n const response = await this.ocean.utils.fetch.get(initializeUrl)\n return await response.text()\n } catch (e) {\n this.logger.error(e)\n throw new Error('Asset URL not found or not available.')\n }\n }\n\n public async download(\n did: string,\n txId: string,\n tokenAddress: string,\n serviceType: string,\n serviceIndex: string,\n destination: string,\n account: Account,\n files: File[],\n index = -1,\n userCustomParameters?: UserCustomParameters\n ): Promise<any> {\n await this.getNonce(account.getId())\n const signature = await this.createSignature(account, did + this.nonce)\n const path = this.getDownloadEndpoint() ? this.getDownloadEndpoint().urlPath : null\n if (!path) return null\n const filesPromises = files\n .filter((_, i) => index === -1 || i === index)\n .map(async ({ index: i }) => {\n let consumeUrl = path\n consumeUrl += `?fileIndex=${i}`\n consumeUrl += `&documentId=${did}`\n consumeUrl += `&serviceId=${serviceIndex}`\n consumeUrl += `&serviceType=${serviceType}`\n consumeUrl += `&dataToken=${tokenAddress}`\n consumeUrl += `&transferTxId=${txId}`\n consumeUrl += `&consumerAddress=${account.getId()}`\n consumeUrl += `&signature=${signature}`\n if (userCustomParameters)\n consumeUrl += '&userdata=' + encodeURI(JSON.stringify(userCustomParameters))\n try {\n !destination\n ? await this.ocean.utils.fetch.downloadFileBrowser(consumeUrl)\n : await this.ocean.utils.fetch.downloadFile(consumeUrl, destination, i)\n } catch (e) {\n this.logger.error('Error consuming assets')\n this.logger.error(e)\n throw e\n }\n })\n await Promise.all(filesPromises)\n return destination\n }\n\n /** Instruct the provider to start a compute job\n */\n public async computeStart(\n did: string,\n consumerAccount: Account,\n algorithm: ComputeAlgorithm,\n output?: ComputeOutput,\n txId?: string,\n serviceIndex?: string,\n serviceType?: string,\n tokenAddress?: string,\n additionalInputs?: ComputeInput[],\n userCustomParameters?: UserCustomParameters\n ): Promise<ComputeJob | ComputeJob[]> {\n const address = consumerAccount.getId()\n await this.getNonce(consumerAccount.getId())\n const payload = Object()\n payload.documentId = noZeroX(did)\n\n let signatureMessage = address\n signatureMessage += (did && `${noZeroX(did)}`) || ''\n signatureMessage += this.nonce\n const signature = await this.createHashSignature(consumerAccount, signatureMessage)\n payload.signature = signature\n\n // continue to construct Provider URL\n if (output) payload.output = output\n if (algorithm.did) payload.algorithmDid = algorithm.did\n if (algorithm.meta) payload.algorithmMeta = algorithm.meta\n payload.consumerAddress = address\n if (txId) payload.transferTxId = txId\n if (algorithm.transferTxId) payload.algorithmTransferTxId = algorithm.transferTxId\n if (algorithm.dataToken) payload.algorithmDataToken = algorithm.dataToken\n\n if (serviceIndex) payload.serviceId = serviceIndex\n\n if (serviceType) payload.serviceType = serviceType\n\n if (tokenAddress) payload.dataToken = tokenAddress\n\n if (additionalInputs) payload.additionalInputs = additionalInputs\n if (userCustomParameters) payload.userData = userCustomParameters\n if (algorithm.algoCustomParameters)\n payload.algouserdata = algorithm.algoCustomParameters\n const path = this.getComputeStartEndpoint()\n ? this.getComputeStartEndpoint().urlPath\n : null\n if (!path) return null\n try {\n const response = await this.ocean.utils.fetch.post(path, JSON.stringify(payload))\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n console.error('Compute start failed:', response.status, response.statusText)\n this.logger.error('Payload was:', payload)\n return null\n } catch (e) {\n this.logger.error('Compute start failed:')\n this.logger.error(e)\n this.logger.error('Payload was:', payload)\n return null\n }\n }\n\n /** Instruct the provider to stop a compute job\n */\n public async computeStop(\n did: string,\n consumerAccount: Account,\n jobId: string\n ): Promise<ComputeJob | ComputeJob[]> {\n const address = consumerAccount.getId()\n await this.getNonce(consumerAccount.getId())\n const payload = Object()\n payload.documentId = noZeroX(did)\n let signatureMessage = address\n signatureMessage += jobId || ''\n signatureMessage += (did && `${noZeroX(did)}`) || ''\n signatureMessage += this.nonce\n const signature = await this.createHashSignature(consumerAccount, signatureMessage)\n payload.signature = signature\n payload.jobId = jobId\n payload.consumerAddress = address\n const path = this.getComputeStopEndpoint()\n ? this.getComputeStopEndpoint().urlPath\n : null\n if (!path) return null\n try {\n const response = await this.ocean.utils.fetch.put(path, JSON.stringify(payload))\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n this.logger.error('Compute stop failed:', response.status, response.statusText)\n this.logger.error('Payload was:', payload)\n return null\n } catch (e) {\n this.logger.error('Compute stop failed:')\n this.logger.error(e)\n this.logger.error('Payload was:', payload)\n return null\n }\n }\n\n /** Instruct the provider to stop & delete all resources for a compute job\n */\n public async computeDelete(\n did: string,\n consumerAccount: Account,\n jobId: string\n ): Promise<ComputeJob | ComputeJob[]> {\n const address = consumerAccount.getId()\n await this.getNonce(consumerAccount.getId())\n const payload = Object()\n payload.documentId = noZeroX(did)\n let signatureMessage = address\n signatureMessage += jobId || ''\n signatureMessage += (did && `${noZeroX(did)}`) || ''\n signatureMessage += this.nonce\n const signature = await this.createHashSignature(consumerAccount, signatureMessage)\n payload.signature = signature\n payload.jobId = jobId\n payload.consumerAddress = address\n const path = this.getComputeDeleteEndpoint()\n ? this.getComputeDeleteEndpoint().urlPath\n : null\n if (!path) return null\n try {\n const response = await this.ocean.utils.fetch.delete(path, JSON.stringify(payload))\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n this.logger.error(\n 'Delete compute job failed:',\n response.status,\n response.statusText\n )\n this.logger.error('Payload was:', payload)\n return null\n } catch (e) {\n this.logger.error('Delete compute job failed:')\n this.logger.error(e)\n this.logger.error('Payload was:', payload)\n return null\n }\n }\n\n public async computeStatus(\n did: string,\n consumerAccount: Account,\n jobId?: string,\n txId?: string\n ): Promise<ComputeJob | ComputeJob[]> {\n const address = consumerAccount.getId()\n await this.getNonce(consumerAccount.getId())\n let url = '?documentId=' + noZeroX(did)\n url += (jobId && `&jobId=${jobId}`) || ''\n url += `&consumerAddress=${address}`\n url += (txId && `&transferTxId=${txId}`) || ''\n const path = this.getComputeStatusEndpoint()\n ? this.getComputeStatusEndpoint().urlPath\n : null\n if (!path) return null\n try {\n const response = await this.ocean.utils.fetch.get(path + url)\n /* response = await fetch(this.getComputeEndpoint() + url, {\n method: 'GET',\n timeout: 5000\n })\n */\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n this.logger.error(\n 'Get compute status failed:',\n response.status,\n response.statusText\n )\n return null\n } catch (e) {\n this.logger.error('Get compute status failed')\n this.logger.error(e)\n return null\n }\n }\n\n public async computeResult(\n jobId: string,\n index: number,\n destination: string,\n account: Account\n ): Promise<any> {\n await this.getNonce(account.getId())\n let signatureMessage = account.getId()\n signatureMessage += jobId\n signatureMessage += String(index)\n signatureMessage += this.nonce\n const signature = await this.createHashSignature(account, signatureMessage)\n const path = this.getComputeResultEndpoint()\n ? this.getComputeResultEndpoint().urlPath\n : null\n if (!path) return null\n let consumeUrl = path\n consumeUrl += `?jobId=${jobId}`\n consumeUrl += `&index=${String(index)}`\n consumeUrl += `&signature=${signature}`\n consumeUrl += `&consumerAddress=${account.getId()}`\n\n try {\n !destination\n ? await this.ocean.utils.fetch.downloadFileBrowser(consumeUrl)\n : await this.ocean.utils.fetch.downloadFile(consumeUrl, destination, index)\n } catch (e) {\n this.logger.error('Error getting job result')\n this.logger.error(e)\n throw e\n }\n return destination\n }\n\n public getInitializeEndpoint(): ServiceEndpoint {\n return this.getEndpointURL('initialize')\n }\n\n public getNonceEndpoint(): ServiceEndpoint {\n return this.getEndpointURL('nonce')\n }\n\n public getEncryptEndpoint(): ServiceEndpoint {\n return this.getEndpointURL('encrypt')\n }\n\n public getFileinfoEndpoint(): ServiceEndpoint {\n return this.getEndpointURL('fileinfo')\n }\n\n public getComputeStartEndpoint(): ServiceEndpoint {\n return this.getEndpointURL('computeStart')\n }\n\n public getComputeStopEndpoint(): ServiceEndpoint {\n return this.getEndpointURL('computeStop')\n }\n\n public getComputeStatusEndpoint(): ServiceEndpoint {\n return this.getEndpointURL('computeStatus')\n }\n\n public getComputeDeleteEndpoint(): ServiceEndpoint {\n return this.getEndpointURL('computeDelete')\n }\n\n public getComputeResultEndpoint(): ServiceEndpoint {\n return this.getEndpointURL('computeResult')\n }\n\n public getDownloadEndpoint(): ServiceEndpoint {\n return this.getEndpointURL('download')\n }\n\n /** Check for a valid provider at URL\n * @param {String} url\n * @return {Promise<boolean>} string\n */\n public async isValidProvider(url: string): Promise<boolean> {\n try {\n const response = await this.ocean.utils.fetch.get(url)\n if (response?.ok) {\n const params = await response.json()\n if (params && params.providerAddress) return true\n }\n return false\n } catch (error) {\n this.logger.error(`Error validating provider: ${error.message}`)\n return false\n }\n }\n}\n","(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n Buffer = require('buf' + 'fer').Buffer;\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n }\n\n if (base === 16) {\n this._parseHex(number, start);\n } else {\n this._parseBase(number, base, start);\n }\n\n if (number[0] === '-') {\n this.negative = 1;\n }\n\n this.strip();\n\n if (endian !== 'le') return;\n\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [ number & 0x3ffffff ];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [ 0 ];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this.strip();\n };\n\n function parseHex (str, start, end) {\n var r = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r <<= 4;\n\n // 'a' - 'f'\n if (c >= 49 && c <= 54) {\n r |= c - 49 + 0xa;\n\n // 'A' - 'F'\n } else if (c >= 17 && c <= 22) {\n r |= c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n r |= c & 0xf;\n }\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n // Scan 24-bit chunks and add them to the number\n var off = 0;\n for (i = number.length - 6, j = 0; i >= start; i -= 6) {\n w = parseHex(number, i, i + 6);\n this.words[j] |= (w << off) & 0x3ffffff;\n // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb\n this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n if (i + 6 !== start) {\n w = parseHex(number, start, i + 6);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;\n }\n this.strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n r += c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n r += c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n r += c;\n }\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [ 0 ];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype.strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n BN.prototype.inspect = function inspect () {\n return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n };\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16);\n };\n\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n assert(typeof Buffer !== 'undefined');\n return this.toArrayLike(Buffer, endian, length);\n };\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n this.strip();\n var littleEndian = endian === 'le';\n var res = new ArrayType(reqLength);\n\n var b, i;\n var q = this.clone();\n if (!littleEndian) {\n // Assume big-endian\n for (i = 0; i < reqLength - byteLength; i++) {\n res[i] = 0;\n }\n\n for (i = 0; !q.isZero(); i++) {\n b = q.andln(0xff);\n q.iushrn(8);\n\n res[reqLength - i - 1] = b;\n }\n } else {\n for (i = 0; !q.isZero(); i++) {\n b = q.andln(0xff);\n q.iushrn(8);\n\n res[i] = b;\n }\n\n for (; i < reqLength; i++) {\n res[i] = 0;\n }\n }\n\n return res;\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] & (1 << wbit)) >>> wbit;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this.strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this.strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this.strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this.strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this.strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this.strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out.strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out.strip();\n }\n\n function jumboMulTo (self, num, out) {\n var fftm = new FFTM();\n return fftm.mulp(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out.strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n\n return this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this.strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this.strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n return this.strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) < num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this.strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this.strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this.strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q.strip();\n }\n a.strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modn = function modn (num) {\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return acc;\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n return this.strip();\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this.strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n r.strip();\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n return a.umod(this.m)._forceRed(this);\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n","(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n Buffer = require('buf' + 'fer').Buffer;\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n }\n\n if (base === 16) {\n this._parseHex(number, start);\n } else {\n this._parseBase(number, base, start);\n }\n\n if (number[0] === '-') {\n this.negative = 1;\n }\n\n this.strip();\n\n if (endian !== 'le') return;\n\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [ number & 0x3ffffff ];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [ 0 ];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this.strip();\n };\n\n function parseHex (str, start, end) {\n var r = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r <<= 4;\n\n // 'a' - 'f'\n if (c >= 49 && c <= 54) {\n r |= c - 49 + 0xa;\n\n // 'A' - 'F'\n } else if (c >= 17 && c <= 22) {\n r |= c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n r |= c & 0xf;\n }\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n // Scan 24-bit chunks and add them to the number\n var off = 0;\n for (i = number.length - 6, j = 0; i >= start; i -= 6) {\n w = parseHex(number, i, i + 6);\n this.words[j] |= (w << off) & 0x3ffffff;\n // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb\n this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n if (i + 6 !== start) {\n w = parseHex(number, start, i + 6);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;\n }\n this.strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n r += c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n r += c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n r += c;\n }\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [ 0 ];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype.strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n BN.prototype.inspect = function inspect () {\n return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n };\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16);\n };\n\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n assert(typeof Buffer !== 'undefined');\n return this.toArrayLike(Buffer, endian, length);\n };\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n this.strip();\n var littleEndian = endian === 'le';\n var res = new ArrayType(reqLength);\n\n var b, i;\n var q = this.clone();\n if (!littleEndian) {\n // Assume big-endian\n for (i = 0; i < reqLength - byteLength; i++) {\n res[i] = 0;\n }\n\n for (i = 0; !q.isZero(); i++) {\n b = q.andln(0xff);\n q.iushrn(8);\n\n res[reqLength - i - 1] = b;\n }\n } else {\n for (i = 0; !q.isZero(); i++) {\n b = q.andln(0xff);\n q.iushrn(8);\n\n res[i] = b;\n }\n\n for (; i < reqLength; i++) {\n res[i] = 0;\n }\n }\n\n return res;\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] & (1 << wbit)) >>> wbit;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this.strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this.strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this.strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this.strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this.strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this.strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out.strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out.strip();\n }\n\n function jumboMulTo (self, num, out) {\n var fftm = new FFTM();\n return fftm.mulp(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out.strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n\n return this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this.strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this.strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n return this.strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) < num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this.strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this.strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this.strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q.strip();\n }\n a.strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modn = function modn (num) {\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return acc;\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n return this.strip();\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this.strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n r.strip();\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n return a.umod(this.m)._forceRed(this);\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n","var isHexPrefixed = require('is-hex-prefixed');\n\n/**\n * Removes '0x' from a given `String` is present\n * @param {String} str the string value\n * @return {String|Optional} a string by pass if necessary\n */\nmodule.exports = function stripHexPrefix(str) {\n if (typeof str !== 'string') {\n return str;\n }\n\n return isHexPrefixed(str) ? str.slice(2) : str;\n}\n","/**\n * Returns a `Boolean` on whether or not the a `String` starts with '0x'\n * @param {String} str the string input value\n * @return {Boolean} a boolean if it is or is not hex prefixed\n * @throws if the str input is not a string\n */\nmodule.exports = function isHexPrefixed(str) {\n if (typeof str !== 'string') {\n throw new Error(\"[is-hex-prefixed] value must be type 'string', is currently type \" + (typeof str) + \", while checking isHexPrefixed.\");\n }\n\n return str.slice(0, 2) === '0x';\n}\n","var BN = require('bn.js');\nvar stripHexPrefix = require('strip-hex-prefix');\n\n/**\n * Returns a BN object, converts a number value to a BN\n * @param {String|Number|Object} `arg` input a string number, hex string number, number, BigNumber or BN object\n * @return {Object} `output` BN object of the number\n * @throws if the argument is not an array, object that isn't a bignumber, not a string number or number\n */\nmodule.exports = function numberToBN(arg) {\n if (typeof arg === 'string' || typeof arg === 'number') {\n var multiplier = new BN(1); // eslint-disable-line\n var formattedString = String(arg).toLowerCase().trim();\n var isHexPrefixed = formattedString.substr(0, 2) === '0x' || formattedString.substr(0, 3) === '-0x';\n var stringArg = stripHexPrefix(formattedString); // eslint-disable-line\n if (stringArg.substr(0, 1) === '-') {\n stringArg = stripHexPrefix(stringArg.slice(1));\n multiplier = new BN(-1, 10);\n }\n stringArg = stringArg === '' ? '0' : stringArg;\n\n if ((!stringArg.match(/^-?[0-9]+$/) && stringArg.match(/^[0-9A-Fa-f]+$/))\n || stringArg.match(/^[a-fA-F]+$/)\n || (isHexPrefixed === true && stringArg.match(/^[0-9A-Fa-f]+$/))) {\n return new BN(stringArg, 16).mul(multiplier);\n }\n\n if ((stringArg.match(/^-?[0-9]+$/) || stringArg === '') && isHexPrefixed === false) {\n return new BN(stringArg, 10).mul(multiplier);\n }\n } else if (typeof arg === 'object' && arg.toString && (!arg.pop && !arg.push)) {\n if (arg.toString(10).match(/^-?[0-9]+$/) && (arg.mul || arg.dividedToIntegerBy)) {\n return new BN(arg.toString(10), 10);\n }\n }\n\n throw new Error('[number-to-bn] while converting number ' + JSON.stringify(arg) + ' to BN.js instance, error: invalid number value. Value must be an integer, hex string, BN or BigNumber instance. Note, decimals are not supported.');\n}\n","'use strict';\n\nvar BN = require('bn.js');\nvar numberToBN = require('number-to-bn');\n\nvar zero = new BN(0);\nvar negative1 = new BN(-1);\n\n// complete ethereum unit map\nvar unitMap = {\n 'noether': '0', // eslint-disable-line\n 'wei': '1', // eslint-disable-line\n 'kwei': '1000', // eslint-disable-line\n 'Kwei': '1000', // eslint-disable-line\n 'babbage': '1000', // eslint-disable-line\n 'femtoether': '1000', // eslint-disable-line\n 'mwei': '1000000', // eslint-disable-line\n 'Mwei': '1000000', // eslint-disable-line\n 'lovelace': '1000000', // eslint-disable-line\n 'picoether': '1000000', // eslint-disable-line\n 'gwei': '1000000000', // eslint-disable-line\n 'Gwei': '1000000000', // eslint-disable-line\n 'shannon': '1000000000', // eslint-disable-line\n 'nanoether': '1000000000', // eslint-disable-line\n 'nano': '1000000000', // eslint-disable-line\n 'szabo': '1000000000000', // eslint-disable-line\n 'microether': '1000000000000', // eslint-disable-line\n 'micro': '1000000000000', // eslint-disable-line\n 'finney': '1000000000000000', // eslint-disable-line\n 'milliether': '1000000000000000', // eslint-disable-line\n 'milli': '1000000000000000', // eslint-disable-line\n 'ether': '1000000000000000000', // eslint-disable-line\n 'kether': '1000000000000000000000', // eslint-disable-line\n 'grand': '1000000000000000000000', // eslint-disable-line\n 'mether': '1000000000000000000000000', // eslint-disable-line\n 'gether': '1000000000000000000000000000', // eslint-disable-line\n 'tether': '1000000000000000000000000000000' };\n\n/**\n * Returns value of unit in Wei\n *\n * @method getValueOfUnit\n * @param {String} unit the unit to convert to, default ether\n * @returns {BigNumber} value of the unit (in Wei)\n * @throws error if the unit is not correct:w\n */\nfunction getValueOfUnit(unitInput) {\n var unit = unitInput ? unitInput.toLowerCase() : 'ether';\n var unitValue = unitMap[unit]; // eslint-disable-line\n\n if (typeof unitValue !== 'string') {\n throw new Error('[ethjs-unit] the unit provided ' + unitInput + ' doesn\\'t exists, please use the one of the following units ' + JSON.stringify(unitMap, null, 2));\n }\n\n return new BN(unitValue, 10);\n}\n\nfunction numberToString(arg) {\n if (typeof arg === 'string') {\n if (!arg.match(/^-?[0-9.]+$/)) {\n throw new Error('while converting number to string, invalid number value \\'' + arg + '\\', should be a number matching (^-?[0-9.]+).');\n }\n return arg;\n } else if (typeof arg === 'number') {\n return String(arg);\n } else if (typeof arg === 'object' && arg.toString && (arg.toTwos || arg.dividedToIntegerBy)) {\n if (arg.toPrecision) {\n return String(arg.toPrecision());\n } else {\n // eslint-disable-line\n return arg.toString(10);\n }\n }\n throw new Error('while converting number to string, invalid number value \\'' + arg + '\\' type ' + typeof arg + '.');\n}\n\nfunction fromWei(weiInput, unit, optionsInput) {\n var wei = numberToBN(weiInput); // eslint-disable-line\n var negative = wei.lt(zero); // eslint-disable-line\n var base = getValueOfUnit(unit);\n var baseLength = unitMap[unit].length - 1 || 1;\n var options = optionsInput || {};\n\n if (negative) {\n wei = wei.mul(negative1);\n }\n\n var fraction = wei.mod(base).toString(10); // eslint-disable-line\n\n while (fraction.length < baseLength) {\n fraction = '0' + fraction;\n }\n\n if (!options.pad) {\n fraction = fraction.match(/^([0-9]*[1-9]|0)(0*)/)[1];\n }\n\n var whole = wei.div(base).toString(10); // eslint-disable-line\n\n if (options.commify) {\n whole = whole.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n }\n\n var value = '' + whole + (fraction == '0' ? '' : '.' + fraction); // eslint-disable-line\n\n if (negative) {\n value = '-' + value;\n }\n\n return value;\n}\n\nfunction toWei(etherInput, unit) {\n var ether = numberToString(etherInput); // eslint-disable-line\n var base = getValueOfUnit(unit);\n var baseLength = unitMap[unit].length - 1 || 1;\n\n // Is it negative?\n var negative = ether.substring(0, 1) === '-'; // eslint-disable-line\n if (negative) {\n ether = ether.substring(1);\n }\n\n if (ether === '.') {\n throw new Error('[ethjs-unit] while converting number ' + etherInput + ' to wei, invalid value');\n }\n\n // Split it into a whole and fractional part\n var comps = ether.split('.'); // eslint-disable-line\n if (comps.length > 2) {\n throw new Error('[ethjs-unit] while converting number ' + etherInput + ' to wei, too many decimal points');\n }\n\n var whole = comps[0],\n fraction = comps[1]; // eslint-disable-line\n\n if (!whole) {\n whole = '0';\n }\n if (!fraction) {\n fraction = '0';\n }\n if (fraction.length > baseLength) {\n throw new Error('[ethjs-unit] while converting number ' + etherInput + ' to wei, too many decimal places');\n }\n\n while (fraction.length < baseLength) {\n fraction += '0';\n }\n\n whole = new BN(whole);\n fraction = new BN(fraction);\n var wei = whole.mul(base).add(fraction); // eslint-disable-line\n\n if (negative) {\n wei = wei.mul(negative1);\n }\n\n return new BN(wei.toString(10), 10);\n}\n\nmodule.exports = {\n unitMap: unitMap,\n numberToString: numberToString,\n getValueOfUnit: getValueOfUnit,\n fromWei: fromWei,\n toWei: toWei\n};","(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n Buffer = require('buffer').Buffer;\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n }\n\n if (base === 16) {\n this._parseHex(number, start);\n } else {\n this._parseBase(number, base, start);\n }\n\n if (number[0] === '-') {\n this.negative = 1;\n }\n\n this.strip();\n\n if (endian !== 'le') return;\n\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [ number & 0x3ffffff ];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [ 0 ];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this.strip();\n };\n\n function parseHex (str, start, end) {\n var r = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r <<= 4;\n\n // 'a' - 'f'\n if (c >= 49 && c <= 54) {\n r |= c - 49 + 0xa;\n\n // 'A' - 'F'\n } else if (c >= 17 && c <= 22) {\n r |= c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n r |= c & 0xf;\n }\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n // Scan 24-bit chunks and add them to the number\n var off = 0;\n for (i = number.length - 6, j = 0; i >= start; i -= 6) {\n w = parseHex(number, i, i + 6);\n this.words[j] |= (w << off) & 0x3ffffff;\n // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb\n this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n if (i + 6 !== start) {\n w = parseHex(number, start, i + 6);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;\n }\n this.strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n r += c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n r += c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n r += c;\n }\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [ 0 ];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype.strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n BN.prototype.inspect = function inspect () {\n return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n };\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16);\n };\n\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n assert(typeof Buffer !== 'undefined');\n return this.toArrayLike(Buffer, endian, length);\n };\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n this.strip();\n var littleEndian = endian === 'le';\n var res = new ArrayType(reqLength);\n\n var b, i;\n var q = this.clone();\n if (!littleEndian) {\n // Assume big-endian\n for (i = 0; i < reqLength - byteLength; i++) {\n res[i] = 0;\n }\n\n for (i = 0; !q.isZero(); i++) {\n b = q.andln(0xff);\n q.iushrn(8);\n\n res[reqLength - i - 1] = b;\n }\n } else {\n for (i = 0; !q.isZero(); i++) {\n b = q.andln(0xff);\n q.iushrn(8);\n\n res[i] = b;\n }\n\n for (; i < reqLength; i++) {\n res[i] = 0;\n }\n }\n\n return res;\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] & (1 << wbit)) >>> wbit;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this.strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this.strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this.strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this.strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this.strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this.strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out.strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out.strip();\n }\n\n function jumboMulTo (self, num, out) {\n var fftm = new FFTM();\n return fftm.mulp(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out.strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n\n return this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this.strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this.strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n return this.strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) < num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this.strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this.strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this.strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q.strip();\n }\n a.strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modn = function modn (num) {\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return acc;\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n return this.strip();\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this.strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n if (r.strip !== undefined) {\n // r is BN v4 instance\n r.strip();\n } else {\n // r is BN v5 instance\n r._strip();\n }\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n return a.umod(this.m)._forceRed(this);\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1).toRed(this);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n","/*! https://mths.be/utf8js v3.0.0 by @mathias */\n;(function(root) {\n\n\tvar stringFromCharCode = String.fromCharCode;\n\n\t// Taken from https://mths.be/punycode\n\tfunction ucs2decode(string) {\n\t\tvar output = [];\n\t\tvar counter = 0;\n\t\tvar length = string.length;\n\t\tvar value;\n\t\tvar extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t// Taken from https://mths.be/punycode\n\tfunction ucs2encode(array) {\n\t\tvar length = array.length;\n\t\tvar index = -1;\n\t\tvar value;\n\t\tvar output = '';\n\t\twhile (++index < length) {\n\t\t\tvalue = array[index];\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t}\n\t\treturn output;\n\t}\n\n\tfunction checkScalarValue(codePoint) {\n\t\tif (codePoint >= 0xD800 && codePoint <= 0xDFFF) {\n\t\t\tthrow Error(\n\t\t\t\t'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +\n\t\t\t\t' is not a scalar value'\n\t\t\t);\n\t\t}\n\t}\n\t/*--------------------------------------------------------------------------*/\n\n\tfunction createByte(codePoint, shift) {\n\t\treturn stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);\n\t}\n\n\tfunction encodeCodePoint(codePoint) {\n\t\tif ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence\n\t\t\treturn stringFromCharCode(codePoint);\n\t\t}\n\t\tvar symbol = '';\n\t\tif ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);\n\t\t}\n\t\telse if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence\n\t\t\tcheckScalarValue(codePoint);\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);\n\t\t\tsymbol += createByte(codePoint, 6);\n\t\t}\n\t\telse if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);\n\t\t\tsymbol += createByte(codePoint, 12);\n\t\t\tsymbol += createByte(codePoint, 6);\n\t\t}\n\t\tsymbol += stringFromCharCode((codePoint & 0x3F) | 0x80);\n\t\treturn symbol;\n\t}\n\n\tfunction utf8encode(string) {\n\t\tvar codePoints = ucs2decode(string);\n\t\tvar length = codePoints.length;\n\t\tvar index = -1;\n\t\tvar codePoint;\n\t\tvar byteString = '';\n\t\twhile (++index < length) {\n\t\t\tcodePoint = codePoints[index];\n\t\t\tbyteString += encodeCodePoint(codePoint);\n\t\t}\n\t\treturn byteString;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tfunction readContinuationByte() {\n\t\tif (byteIndex >= byteCount) {\n\t\t\tthrow Error('Invalid byte index');\n\t\t}\n\n\t\tvar continuationByte = byteArray[byteIndex] & 0xFF;\n\t\tbyteIndex++;\n\n\t\tif ((continuationByte & 0xC0) == 0x80) {\n\t\t\treturn continuationByte & 0x3F;\n\t\t}\n\n\t\t// If we end up here, it’s not a continuation byte\n\t\tthrow Error('Invalid continuation byte');\n\t}\n\n\tfunction decodeSymbol() {\n\t\tvar byte1;\n\t\tvar byte2;\n\t\tvar byte3;\n\t\tvar byte4;\n\t\tvar codePoint;\n\n\t\tif (byteIndex > byteCount) {\n\t\t\tthrow Error('Invalid byte index');\n\t\t}\n\n\t\tif (byteIndex == byteCount) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Read first byte\n\t\tbyte1 = byteArray[byteIndex] & 0xFF;\n\t\tbyteIndex++;\n\n\t\t// 1-byte sequence (no continuation bytes)\n\t\tif ((byte1 & 0x80) == 0) {\n\t\t\treturn byte1;\n\t\t}\n\n\t\t// 2-byte sequence\n\t\tif ((byte1 & 0xE0) == 0xC0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x1F) << 6) | byte2;\n\t\t\tif (codePoint >= 0x80) {\n\t\t\t\treturn codePoint;\n\t\t\t} else {\n\t\t\t\tthrow Error('Invalid continuation byte');\n\t\t\t}\n\t\t}\n\n\t\t// 3-byte sequence (may include unpaired surrogates)\n\t\tif ((byte1 & 0xF0) == 0xE0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tbyte3 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;\n\t\t\tif (codePoint >= 0x0800) {\n\t\t\t\tcheckScalarValue(codePoint);\n\t\t\t\treturn codePoint;\n\t\t\t} else {\n\t\t\t\tthrow Error('Invalid continuation byte');\n\t\t\t}\n\t\t}\n\n\t\t// 4-byte sequence\n\t\tif ((byte1 & 0xF8) == 0xF0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tbyte3 = readContinuationByte();\n\t\t\tbyte4 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |\n\t\t\t\t(byte3 << 0x06) | byte4;\n\t\t\tif (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {\n\t\t\t\treturn codePoint;\n\t\t\t}\n\t\t}\n\n\t\tthrow Error('Invalid UTF-8 detected');\n\t}\n\n\tvar byteArray;\n\tvar byteCount;\n\tvar byteIndex;\n\tfunction utf8decode(byteString) {\n\t\tbyteArray = ucs2decode(byteString);\n\t\tbyteCount = byteArray.length;\n\t\tbyteIndex = 0;\n\t\tvar codePoints = [];\n\t\tvar tmp;\n\t\twhile ((tmp = decodeSymbol()) !== false) {\n\t\t\tcodePoints.push(tmp);\n\t\t}\n\t\treturn ucs2encode(codePoints);\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\troot.version = '3.0.0';\n\troot.encode = utf8encode;\n\troot.decode = utf8decode;\n\n}(typeof exports === 'undefined' ? this.utf8 = {} : exports));\n","// This was ported from https://github.com/emn178/js-sha3, with some minor\n// modifications and pruning. It is licensed under MIT:\n//\n// Copyright 2015-2016 Chen, Yi-Cyuan\n// \n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to\n// the following conditions:\n// \n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nconst HEX_CHARS = '0123456789abcdef'.split('');\nconst KECCAK_PADDING = [1, 256, 65536, 16777216];\nconst SHIFT = [0, 8, 16, 24];\nconst RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649, 0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0, 2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771, 2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648, 2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648];\n\nconst Keccak = bits => ({\n blocks: [],\n reset: true,\n block: 0,\n start: 0,\n blockCount: 1600 - (bits << 1) >> 5,\n outputBlocks: bits >> 5,\n s: (s => [].concat(s, s, s, s, s))([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n});\n\nconst update = (state, message) => {\n var length = message.length,\n blocks = state.blocks,\n byteCount = state.blockCount << 2,\n blockCount = state.blockCount,\n outputBlocks = state.outputBlocks,\n s = state.s,\n index = 0,\n i,\n code;\n\n // update\n while (index < length) {\n if (state.reset) {\n state.reset = false;\n blocks[0] = state.block;\n for (i = 1; i < blockCount + 1; ++i) {\n blocks[i] = 0;\n }\n }\n if (typeof message !== \"string\") {\n for (i = state.start; index < length && i < byteCount; ++index) {\n blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];\n }\n } else {\n for (i = state.start; index < length && i < byteCount; ++index) {\n code = message.charCodeAt(index);\n if (code < 0x80) {\n blocks[i >> 2] |= code << SHIFT[i++ & 3];\n } else if (code < 0x800) {\n blocks[i >> 2] |= (0xc0 | code >> 6) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | code & 0x3f) << SHIFT[i++ & 3];\n } else if (code < 0xd800 || code >= 0xe000) {\n blocks[i >> 2] |= (0xe0 | code >> 12) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | code >> 6 & 0x3f) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | code & 0x3f) << SHIFT[i++ & 3];\n } else {\n code = 0x10000 + ((code & 0x3ff) << 10 | message.charCodeAt(++index) & 0x3ff);\n blocks[i >> 2] |= (0xf0 | code >> 18) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | code >> 12 & 0x3f) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | code >> 6 & 0x3f) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | code & 0x3f) << SHIFT[i++ & 3];\n }\n }\n }\n state.lastByteIndex = i;\n if (i >= byteCount) {\n state.start = i - byteCount;\n state.block = blocks[blockCount];\n for (i = 0; i < blockCount; ++i) {\n s[i] ^= blocks[i];\n }\n f(s);\n state.reset = true;\n } else {\n state.start = i;\n }\n }\n\n // finalize\n i = state.lastByteIndex;\n blocks[i >> 2] |= KECCAK_PADDING[i & 3];\n if (state.lastByteIndex === byteCount) {\n blocks[0] = blocks[blockCount];\n for (i = 1; i < blockCount + 1; ++i) {\n blocks[i] = 0;\n }\n }\n blocks[blockCount - 1] |= 0x80000000;\n for (i = 0; i < blockCount; ++i) {\n s[i] ^= blocks[i];\n }\n f(s);\n\n // toString\n var hex = '',\n i = 0,\n j = 0,\n block;\n while (j < outputBlocks) {\n for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) {\n block = s[i];\n hex += HEX_CHARS[block >> 4 & 0x0F] + HEX_CHARS[block & 0x0F] + HEX_CHARS[block >> 12 & 0x0F] + HEX_CHARS[block >> 8 & 0x0F] + HEX_CHARS[block >> 20 & 0x0F] + HEX_CHARS[block >> 16 & 0x0F] + HEX_CHARS[block >> 28 & 0x0F] + HEX_CHARS[block >> 24 & 0x0F];\n }\n if (j % blockCount === 0) {\n f(s);\n i = 0;\n }\n }\n return \"0x\" + hex;\n};\n\nconst f = s => {\n var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49;\n\n for (n = 0; n < 48; n += 2) {\n c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];\n c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];\n c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];\n c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43];\n c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44];\n c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45];\n c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46];\n c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47];\n c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48];\n c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];\n\n h = c8 ^ (c2 << 1 | c3 >>> 31);\n l = c9 ^ (c3 << 1 | c2 >>> 31);\n s[0] ^= h;\n s[1] ^= l;\n s[10] ^= h;\n s[11] ^= l;\n s[20] ^= h;\n s[21] ^= l;\n s[30] ^= h;\n s[31] ^= l;\n s[40] ^= h;\n s[41] ^= l;\n h = c0 ^ (c4 << 1 | c5 >>> 31);\n l = c1 ^ (c5 << 1 | c4 >>> 31);\n s[2] ^= h;\n s[3] ^= l;\n s[12] ^= h;\n s[13] ^= l;\n s[22] ^= h;\n s[23] ^= l;\n s[32] ^= h;\n s[33] ^= l;\n s[42] ^= h;\n s[43] ^= l;\n h = c2 ^ (c6 << 1 | c7 >>> 31);\n l = c3 ^ (c7 << 1 | c6 >>> 31);\n s[4] ^= h;\n s[5] ^= l;\n s[14] ^= h;\n s[15] ^= l;\n s[24] ^= h;\n s[25] ^= l;\n s[34] ^= h;\n s[35] ^= l;\n s[44] ^= h;\n s[45] ^= l;\n h = c4 ^ (c8 << 1 | c9 >>> 31);\n l = c5 ^ (c9 << 1 | c8 >>> 31);\n s[6] ^= h;\n s[7] ^= l;\n s[16] ^= h;\n s[17] ^= l;\n s[26] ^= h;\n s[27] ^= l;\n s[36] ^= h;\n s[37] ^= l;\n s[46] ^= h;\n s[47] ^= l;\n h = c6 ^ (c0 << 1 | c1 >>> 31);\n l = c7 ^ (c1 << 1 | c0 >>> 31);\n s[8] ^= h;\n s[9] ^= l;\n s[18] ^= h;\n s[19] ^= l;\n s[28] ^= h;\n s[29] ^= l;\n s[38] ^= h;\n s[39] ^= l;\n s[48] ^= h;\n s[49] ^= l;\n\n b0 = s[0];\n b1 = s[1];\n b32 = s[11] << 4 | s[10] >>> 28;\n b33 = s[10] << 4 | s[11] >>> 28;\n b14 = s[20] << 3 | s[21] >>> 29;\n b15 = s[21] << 3 | s[20] >>> 29;\n b46 = s[31] << 9 | s[30] >>> 23;\n b47 = s[30] << 9 | s[31] >>> 23;\n b28 = s[40] << 18 | s[41] >>> 14;\n b29 = s[41] << 18 | s[40] >>> 14;\n b20 = s[2] << 1 | s[3] >>> 31;\n b21 = s[3] << 1 | s[2] >>> 31;\n b2 = s[13] << 12 | s[12] >>> 20;\n b3 = s[12] << 12 | s[13] >>> 20;\n b34 = s[22] << 10 | s[23] >>> 22;\n b35 = s[23] << 10 | s[22] >>> 22;\n b16 = s[33] << 13 | s[32] >>> 19;\n b17 = s[32] << 13 | s[33] >>> 19;\n b48 = s[42] << 2 | s[43] >>> 30;\n b49 = s[43] << 2 | s[42] >>> 30;\n b40 = s[5] << 30 | s[4] >>> 2;\n b41 = s[4] << 30 | s[5] >>> 2;\n b22 = s[14] << 6 | s[15] >>> 26;\n b23 = s[15] << 6 | s[14] >>> 26;\n b4 = s[25] << 11 | s[24] >>> 21;\n b5 = s[24] << 11 | s[25] >>> 21;\n b36 = s[34] << 15 | s[35] >>> 17;\n b37 = s[35] << 15 | s[34] >>> 17;\n b18 = s[45] << 29 | s[44] >>> 3;\n b19 = s[44] << 29 | s[45] >>> 3;\n b10 = s[6] << 28 | s[7] >>> 4;\n b11 = s[7] << 28 | s[6] >>> 4;\n b42 = s[17] << 23 | s[16] >>> 9;\n b43 = s[16] << 23 | s[17] >>> 9;\n b24 = s[26] << 25 | s[27] >>> 7;\n b25 = s[27] << 25 | s[26] >>> 7;\n b6 = s[36] << 21 | s[37] >>> 11;\n b7 = s[37] << 21 | s[36] >>> 11;\n b38 = s[47] << 24 | s[46] >>> 8;\n b39 = s[46] << 24 | s[47] >>> 8;\n b30 = s[8] << 27 | s[9] >>> 5;\n b31 = s[9] << 27 | s[8] >>> 5;\n b12 = s[18] << 20 | s[19] >>> 12;\n b13 = s[19] << 20 | s[18] >>> 12;\n b44 = s[29] << 7 | s[28] >>> 25;\n b45 = s[28] << 7 | s[29] >>> 25;\n b26 = s[38] << 8 | s[39] >>> 24;\n b27 = s[39] << 8 | s[38] >>> 24;\n b8 = s[48] << 14 | s[49] >>> 18;\n b9 = s[49] << 14 | s[48] >>> 18;\n\n s[0] = b0 ^ ~b2 & b4;\n s[1] = b1 ^ ~b3 & b5;\n s[10] = b10 ^ ~b12 & b14;\n s[11] = b11 ^ ~b13 & b15;\n s[20] = b20 ^ ~b22 & b24;\n s[21] = b21 ^ ~b23 & b25;\n s[30] = b30 ^ ~b32 & b34;\n s[31] = b31 ^ ~b33 & b35;\n s[40] = b40 ^ ~b42 & b44;\n s[41] = b41 ^ ~b43 & b45;\n s[2] = b2 ^ ~b4 & b6;\n s[3] = b3 ^ ~b5 & b7;\n s[12] = b12 ^ ~b14 & b16;\n s[13] = b13 ^ ~b15 & b17;\n s[22] = b22 ^ ~b24 & b26;\n s[23] = b23 ^ ~b25 & b27;\n s[32] = b32 ^ ~b34 & b36;\n s[33] = b33 ^ ~b35 & b37;\n s[42] = b42 ^ ~b44 & b46;\n s[43] = b43 ^ ~b45 & b47;\n s[4] = b4 ^ ~b6 & b8;\n s[5] = b5 ^ ~b7 & b9;\n s[14] = b14 ^ ~b16 & b18;\n s[15] = b15 ^ ~b17 & b19;\n s[24] = b24 ^ ~b26 & b28;\n s[25] = b25 ^ ~b27 & b29;\n s[34] = b34 ^ ~b36 & b38;\n s[35] = b35 ^ ~b37 & b39;\n s[44] = b44 ^ ~b46 & b48;\n s[45] = b45 ^ ~b47 & b49;\n s[6] = b6 ^ ~b8 & b0;\n s[7] = b7 ^ ~b9 & b1;\n s[16] = b16 ^ ~b18 & b10;\n s[17] = b17 ^ ~b19 & b11;\n s[26] = b26 ^ ~b28 & b20;\n s[27] = b27 ^ ~b29 & b21;\n s[36] = b36 ^ ~b38 & b30;\n s[37] = b37 ^ ~b39 & b31;\n s[46] = b46 ^ ~b48 & b40;\n s[47] = b47 ^ ~b49 & b41;\n s[8] = b8 ^ ~b0 & b2;\n s[9] = b9 ^ ~b1 & b3;\n s[18] = b18 ^ ~b10 & b12;\n s[19] = b19 ^ ~b11 & b13;\n s[28] = b28 ^ ~b20 & b22;\n s[29] = b29 ^ ~b21 & b23;\n s[38] = b38 ^ ~b30 & b32;\n s[39] = b39 ^ ~b31 & b33;\n s[48] = b48 ^ ~b40 & b42;\n s[49] = b49 ^ ~b41 & b43;\n\n s[0] ^= RC[n];\n s[1] ^= RC[n + 1];\n }\n};\n\nconst keccak = bits => str => {\n var msg;\n if (str.slice(0, 2) === \"0x\") {\n msg = [];\n for (var i = 2, l = str.length; i < l; i += 2) msg.push(parseInt(str.slice(i, i + 2), 16));\n } else {\n msg = str;\n }\n return update(Keccak(bits, bits), msg);\n};\n\nmodule.exports = {\n keccak256: keccak(256),\n keccak512: keccak(512),\n keccak256s: keccak(256),\n keccak512s: keccak(512)\n};","/**\n * [js-sha3]{@link https://github.com/emn178/js-sha3}\n *\n * @version 0.8.0\n * @author Chen, Yi-Cyuan [emn178@gmail.com]\n * @copyright Chen, Yi-Cyuan 2015-2018\n * @license MIT\n */\n/*jslint bitwise: true */\n(function () {\n 'use strict';\n\n var INPUT_ERROR = 'input is invalid type';\n var FINALIZE_ERROR = 'finalize already called';\n var WINDOW = typeof window === 'object';\n var root = WINDOW ? window : {};\n if (root.JS_SHA3_NO_WINDOW) {\n WINDOW = false;\n }\n var WEB_WORKER = !WINDOW && typeof self === 'object';\n var NODE_JS = !root.JS_SHA3_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;\n if (NODE_JS) {\n root = global;\n } else if (WEB_WORKER) {\n root = self;\n }\n var COMMON_JS = !root.JS_SHA3_NO_COMMON_JS && typeof module === 'object' && module.exports;\n var AMD = typeof define === 'function' && define.amd;\n var ARRAY_BUFFER = !root.JS_SHA3_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';\n var HEX_CHARS = '0123456789abcdef'.split('');\n var SHAKE_PADDING = [31, 7936, 2031616, 520093696];\n var CSHAKE_PADDING = [4, 1024, 262144, 67108864];\n var KECCAK_PADDING = [1, 256, 65536, 16777216];\n var PADDING = [6, 1536, 393216, 100663296];\n var SHIFT = [0, 8, 16, 24];\n var RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649,\n 0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0,\n 2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771,\n 2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648,\n 2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648];\n var BITS = [224, 256, 384, 512];\n var SHAKE_BITS = [128, 256];\n var OUTPUT_TYPES = ['hex', 'buffer', 'arrayBuffer', 'array', 'digest'];\n var CSHAKE_BYTEPAD = {\n '128': 168,\n '256': 136\n };\n\n if (root.JS_SHA3_NO_NODE_JS || !Array.isArray) {\n Array.isArray = function (obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n };\n }\n\n if (ARRAY_BUFFER && (root.JS_SHA3_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {\n ArrayBuffer.isView = function (obj) {\n return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;\n };\n }\n\n var createOutputMethod = function (bits, padding, outputType) {\n return function (message) {\n return new Keccak(bits, padding, bits).update(message)[outputType]();\n };\n };\n\n var createShakeOutputMethod = function (bits, padding, outputType) {\n return function (message, outputBits) {\n return new Keccak(bits, padding, outputBits).update(message)[outputType]();\n };\n };\n\n var createCshakeOutputMethod = function (bits, padding, outputType) {\n return function (message, outputBits, n, s) {\n return methods['cshake' + bits].update(message, outputBits, n, s)[outputType]();\n };\n };\n\n var createKmacOutputMethod = function (bits, padding, outputType) {\n return function (key, message, outputBits, s) {\n return methods['kmac' + bits].update(key, message, outputBits, s)[outputType]();\n };\n };\n\n var createOutputMethods = function (method, createMethod, bits, padding) {\n for (var i = 0; i < OUTPUT_TYPES.length; ++i) {\n var type = OUTPUT_TYPES[i];\n method[type] = createMethod(bits, padding, type);\n }\n return method;\n };\n\n var createMethod = function (bits, padding) {\n var method = createOutputMethod(bits, padding, 'hex');\n method.create = function () {\n return new Keccak(bits, padding, bits);\n };\n method.update = function (message) {\n return method.create().update(message);\n };\n return createOutputMethods(method, createOutputMethod, bits, padding);\n };\n\n var createShakeMethod = function (bits, padding) {\n var method = createShakeOutputMethod(bits, padding, 'hex');\n method.create = function (outputBits) {\n return new Keccak(bits, padding, outputBits);\n };\n method.update = function (message, outputBits) {\n return method.create(outputBits).update(message);\n };\n return createOutputMethods(method, createShakeOutputMethod, bits, padding);\n };\n\n var createCshakeMethod = function (bits, padding) {\n var w = CSHAKE_BYTEPAD[bits];\n var method = createCshakeOutputMethod(bits, padding, 'hex');\n method.create = function (outputBits, n, s) {\n if (!n && !s) {\n return methods['shake' + bits].create(outputBits);\n } else {\n return new Keccak(bits, padding, outputBits).bytepad([n, s], w);\n }\n };\n method.update = function (message, outputBits, n, s) {\n return method.create(outputBits, n, s).update(message);\n };\n return createOutputMethods(method, createCshakeOutputMethod, bits, padding);\n };\n\n var createKmacMethod = function (bits, padding) {\n var w = CSHAKE_BYTEPAD[bits];\n var method = createKmacOutputMethod(bits, padding, 'hex');\n method.create = function (key, outputBits, s) {\n return new Kmac(bits, padding, outputBits).bytepad(['KMAC', s], w).bytepad([key], w);\n };\n method.update = function (key, message, outputBits, s) {\n return method.create(key, outputBits, s).update(message);\n };\n return createOutputMethods(method, createKmacOutputMethod, bits, padding);\n };\n\n var algorithms = [\n { name: 'keccak', padding: KECCAK_PADDING, bits: BITS, createMethod: createMethod },\n { name: 'sha3', padding: PADDING, bits: BITS, createMethod: createMethod },\n { name: 'shake', padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod },\n { name: 'cshake', padding: CSHAKE_PADDING, bits: SHAKE_BITS, createMethod: createCshakeMethod },\n { name: 'kmac', padding: CSHAKE_PADDING, bits: SHAKE_BITS, createMethod: createKmacMethod }\n ];\n\n var methods = {}, methodNames = [];\n\n for (var i = 0; i < algorithms.length; ++i) {\n var algorithm = algorithms[i];\n var bits = algorithm.bits;\n for (var j = 0; j < bits.length; ++j) {\n var methodName = algorithm.name + '_' + bits[j];\n methodNames.push(methodName);\n methods[methodName] = algorithm.createMethod(bits[j], algorithm.padding);\n if (algorithm.name !== 'sha3') {\n var newMethodName = algorithm.name + bits[j];\n methodNames.push(newMethodName);\n methods[newMethodName] = methods[methodName];\n }\n }\n }\n\n function Keccak(bits, padding, outputBits) {\n this.blocks = [];\n this.s = [];\n this.padding = padding;\n this.outputBits = outputBits;\n this.reset = true;\n this.finalized = false;\n this.block = 0;\n this.start = 0;\n this.blockCount = (1600 - (bits << 1)) >> 5;\n this.byteCount = this.blockCount << 2;\n this.outputBlocks = outputBits >> 5;\n this.extraBytes = (outputBits & 31) >> 3;\n\n for (var i = 0; i < 50; ++i) {\n this.s[i] = 0;\n }\n }\n\n Keccak.prototype.update = function (message) {\n if (this.finalized) {\n throw new Error(FINALIZE_ERROR);\n }\n var notString, type = typeof message;\n if (type !== 'string') {\n if (type === 'object') {\n if (message === null) {\n throw new Error(INPUT_ERROR);\n } else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {\n message = new Uint8Array(message);\n } else if (!Array.isArray(message)) {\n if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {\n throw new Error(INPUT_ERROR);\n }\n }\n } else {\n throw new Error(INPUT_ERROR);\n }\n notString = true;\n }\n var blocks = this.blocks, byteCount = this.byteCount, length = message.length,\n blockCount = this.blockCount, index = 0, s = this.s, i, code;\n\n while (index < length) {\n if (this.reset) {\n this.reset = false;\n blocks[0] = this.block;\n for (i = 1; i < blockCount + 1; ++i) {\n blocks[i] = 0;\n }\n }\n if (notString) {\n for (i = this.start; index < length && i < byteCount; ++index) {\n blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];\n }\n } else {\n for (i = this.start; index < length && i < byteCount; ++index) {\n code = message.charCodeAt(index);\n if (code < 0x80) {\n blocks[i >> 2] |= code << SHIFT[i++ & 3];\n } else if (code < 0x800) {\n blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n } else if (code < 0xd800 || code >= 0xe000) {\n blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n } else {\n code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));\n blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n }\n }\n }\n this.lastByteIndex = i;\n if (i >= byteCount) {\n this.start = i - byteCount;\n this.block = blocks[blockCount];\n for (i = 0; i < blockCount; ++i) {\n s[i] ^= blocks[i];\n }\n f(s);\n this.reset = true;\n } else {\n this.start = i;\n }\n }\n return this;\n };\n\n Keccak.prototype.encode = function (x, right) {\n var o = x & 255, n = 1;\n var bytes = [o];\n x = x >> 8;\n o = x & 255;\n while (o > 0) {\n bytes.unshift(o);\n x = x >> 8;\n o = x & 255;\n ++n;\n }\n if (right) {\n bytes.push(n);\n } else {\n bytes.unshift(n);\n }\n this.update(bytes);\n return bytes.length;\n };\n\n Keccak.prototype.encodeString = function (str) {\n var notString, type = typeof str;\n if (type !== 'string') {\n if (type === 'object') {\n if (str === null) {\n throw new Error(INPUT_ERROR);\n } else if (ARRAY_BUFFER && str.constructor === ArrayBuffer) {\n str = new Uint8Array(str);\n } else if (!Array.isArray(str)) {\n if (!ARRAY_BUFFER || !ArrayBuffer.isView(str)) {\n throw new Error(INPUT_ERROR);\n }\n }\n } else {\n throw new Error(INPUT_ERROR);\n }\n notString = true;\n }\n var bytes = 0, length = str.length;\n if (notString) {\n bytes = length;\n } else {\n for (var i = 0; i < str.length; ++i) {\n var code = str.charCodeAt(i);\n if (code < 0x80) {\n bytes += 1;\n } else if (code < 0x800) {\n bytes += 2;\n } else if (code < 0xd800 || code >= 0xe000) {\n bytes += 3;\n } else {\n code = 0x10000 + (((code & 0x3ff) << 10) | (str.charCodeAt(++i) & 0x3ff));\n bytes += 4;\n }\n }\n }\n bytes += this.encode(bytes * 8);\n this.update(str);\n return bytes;\n };\n\n Keccak.prototype.bytepad = function (strs, w) {\n var bytes = this.encode(w);\n for (var i = 0; i < strs.length; ++i) {\n bytes += this.encodeString(strs[i]);\n }\n var paddingBytes = w - bytes % w;\n var zeros = [];\n zeros.length = paddingBytes;\n this.update(zeros);\n return this;\n };\n\n Keccak.prototype.finalize = function () {\n if (this.finalized) {\n return;\n }\n this.finalized = true;\n var blocks = this.blocks, i = this.lastByteIndex, blockCount = this.blockCount, s = this.s;\n blocks[i >> 2] |= this.padding[i & 3];\n if (this.lastByteIndex === this.byteCount) {\n blocks[0] = blocks[blockCount];\n for (i = 1; i < blockCount + 1; ++i) {\n blocks[i] = 0;\n }\n }\n blocks[blockCount - 1] |= 0x80000000;\n for (i = 0; i < blockCount; ++i) {\n s[i] ^= blocks[i];\n }\n f(s);\n };\n\n Keccak.prototype.toString = Keccak.prototype.hex = function () {\n this.finalize();\n\n var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,\n extraBytes = this.extraBytes, i = 0, j = 0;\n var hex = '', block;\n while (j < outputBlocks) {\n for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) {\n block = s[i];\n hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F] +\n HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F] +\n HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F] +\n HEX_CHARS[(block >> 28) & 0x0F] + HEX_CHARS[(block >> 24) & 0x0F];\n }\n if (j % blockCount === 0) {\n f(s);\n i = 0;\n }\n }\n if (extraBytes) {\n block = s[i];\n hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F];\n if (extraBytes > 1) {\n hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F];\n }\n if (extraBytes > 2) {\n hex += HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F];\n }\n }\n return hex;\n };\n\n Keccak.prototype.arrayBuffer = function () {\n this.finalize();\n\n var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,\n extraBytes = this.extraBytes, i = 0, j = 0;\n var bytes = this.outputBits >> 3;\n var buffer;\n if (extraBytes) {\n buffer = new ArrayBuffer((outputBlocks + 1) << 2);\n } else {\n buffer = new ArrayBuffer(bytes);\n }\n var array = new Uint32Array(buffer);\n while (j < outputBlocks) {\n for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) {\n array[j] = s[i];\n }\n if (j % blockCount === 0) {\n f(s);\n }\n }\n if (extraBytes) {\n array[i] = s[i];\n buffer = buffer.slice(0, bytes);\n }\n return buffer;\n };\n\n Keccak.prototype.buffer = Keccak.prototype.arrayBuffer;\n\n Keccak.prototype.digest = Keccak.prototype.array = function () {\n this.finalize();\n\n var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,\n extraBytes = this.extraBytes, i = 0, j = 0;\n var array = [], offset, block;\n while (j < outputBlocks) {\n for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) {\n offset = j << 2;\n block = s[i];\n array[offset] = block & 0xFF;\n array[offset + 1] = (block >> 8) & 0xFF;\n array[offset + 2] = (block >> 16) & 0xFF;\n array[offset + 3] = (block >> 24) & 0xFF;\n }\n if (j % blockCount === 0) {\n f(s);\n }\n }\n if (extraBytes) {\n offset = j << 2;\n block = s[i];\n array[offset] = block & 0xFF;\n if (extraBytes > 1) {\n array[offset + 1] = (block >> 8) & 0xFF;\n }\n if (extraBytes > 2) {\n array[offset + 2] = (block >> 16) & 0xFF;\n }\n }\n return array;\n };\n\n function Kmac(bits, padding, outputBits) {\n Keccak.call(this, bits, padding, outputBits);\n }\n\n Kmac.prototype = new Keccak();\n\n Kmac.prototype.finalize = function () {\n this.encode(this.outputBits, true);\n return Keccak.prototype.finalize.call(this);\n };\n\n var f = function (s) {\n var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9,\n b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17,\n b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33,\n b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49;\n for (n = 0; n < 48; n += 2) {\n c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];\n c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];\n c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];\n c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43];\n c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44];\n c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45];\n c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46];\n c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47];\n c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48];\n c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];\n\n h = c8 ^ ((c2 << 1) | (c3 >>> 31));\n l = c9 ^ ((c3 << 1) | (c2 >>> 31));\n s[0] ^= h;\n s[1] ^= l;\n s[10] ^= h;\n s[11] ^= l;\n s[20] ^= h;\n s[21] ^= l;\n s[30] ^= h;\n s[31] ^= l;\n s[40] ^= h;\n s[41] ^= l;\n h = c0 ^ ((c4 << 1) | (c5 >>> 31));\n l = c1 ^ ((c5 << 1) | (c4 >>> 31));\n s[2] ^= h;\n s[3] ^= l;\n s[12] ^= h;\n s[13] ^= l;\n s[22] ^= h;\n s[23] ^= l;\n s[32] ^= h;\n s[33] ^= l;\n s[42] ^= h;\n s[43] ^= l;\n h = c2 ^ ((c6 << 1) | (c7 >>> 31));\n l = c3 ^ ((c7 << 1) | (c6 >>> 31));\n s[4] ^= h;\n s[5] ^= l;\n s[14] ^= h;\n s[15] ^= l;\n s[24] ^= h;\n s[25] ^= l;\n s[34] ^= h;\n s[35] ^= l;\n s[44] ^= h;\n s[45] ^= l;\n h = c4 ^ ((c8 << 1) | (c9 >>> 31));\n l = c5 ^ ((c9 << 1) | (c8 >>> 31));\n s[6] ^= h;\n s[7] ^= l;\n s[16] ^= h;\n s[17] ^= l;\n s[26] ^= h;\n s[27] ^= l;\n s[36] ^= h;\n s[37] ^= l;\n s[46] ^= h;\n s[47] ^= l;\n h = c6 ^ ((c0 << 1) | (c1 >>> 31));\n l = c7 ^ ((c1 << 1) | (c0 >>> 31));\n s[8] ^= h;\n s[9] ^= l;\n s[18] ^= h;\n s[19] ^= l;\n s[28] ^= h;\n s[29] ^= l;\n s[38] ^= h;\n s[39] ^= l;\n s[48] ^= h;\n s[49] ^= l;\n\n b0 = s[0];\n b1 = s[1];\n b32 = (s[11] << 4) | (s[10] >>> 28);\n b33 = (s[10] << 4) | (s[11] >>> 28);\n b14 = (s[20] << 3) | (s[21] >>> 29);\n b15 = (s[21] << 3) | (s[20] >>> 29);\n b46 = (s[31] << 9) | (s[30] >>> 23);\n b47 = (s[30] << 9) | (s[31] >>> 23);\n b28 = (s[40] << 18) | (s[41] >>> 14);\n b29 = (s[41] << 18) | (s[40] >>> 14);\n b20 = (s[2] << 1) | (s[3] >>> 31);\n b21 = (s[3] << 1) | (s[2] >>> 31);\n b2 = (s[13] << 12) | (s[12] >>> 20);\n b3 = (s[12] << 12) | (s[13] >>> 20);\n b34 = (s[22] << 10) | (s[23] >>> 22);\n b35 = (s[23] << 10) | (s[22] >>> 22);\n b16 = (s[33] << 13) | (s[32] >>> 19);\n b17 = (s[32] << 13) | (s[33] >>> 19);\n b48 = (s[42] << 2) | (s[43] >>> 30);\n b49 = (s[43] << 2) | (s[42] >>> 30);\n b40 = (s[5] << 30) | (s[4] >>> 2);\n b41 = (s[4] << 30) | (s[5] >>> 2);\n b22 = (s[14] << 6) | (s[15] >>> 26);\n b23 = (s[15] << 6) | (s[14] >>> 26);\n b4 = (s[25] << 11) | (s[24] >>> 21);\n b5 = (s[24] << 11) | (s[25] >>> 21);\n b36 = (s[34] << 15) | (s[35] >>> 17);\n b37 = (s[35] << 15) | (s[34] >>> 17);\n b18 = (s[45] << 29) | (s[44] >>> 3);\n b19 = (s[44] << 29) | (s[45] >>> 3);\n b10 = (s[6] << 28) | (s[7] >>> 4);\n b11 = (s[7] << 28) | (s[6] >>> 4);\n b42 = (s[17] << 23) | (s[16] >>> 9);\n b43 = (s[16] << 23) | (s[17] >>> 9);\n b24 = (s[26] << 25) | (s[27] >>> 7);\n b25 = (s[27] << 25) | (s[26] >>> 7);\n b6 = (s[36] << 21) | (s[37] >>> 11);\n b7 = (s[37] << 21) | (s[36] >>> 11);\n b38 = (s[47] << 24) | (s[46] >>> 8);\n b39 = (s[46] << 24) | (s[47] >>> 8);\n b30 = (s[8] << 27) | (s[9] >>> 5);\n b31 = (s[9] << 27) | (s[8] >>> 5);\n b12 = (s[18] << 20) | (s[19] >>> 12);\n b13 = (s[19] << 20) | (s[18] >>> 12);\n b44 = (s[29] << 7) | (s[28] >>> 25);\n b45 = (s[28] << 7) | (s[29] >>> 25);\n b26 = (s[38] << 8) | (s[39] >>> 24);\n b27 = (s[39] << 8) | (s[38] >>> 24);\n b8 = (s[48] << 14) | (s[49] >>> 18);\n b9 = (s[49] << 14) | (s[48] >>> 18);\n\n s[0] = b0 ^ (~b2 & b4);\n s[1] = b1 ^ (~b3 & b5);\n s[10] = b10 ^ (~b12 & b14);\n s[11] = b11 ^ (~b13 & b15);\n s[20] = b20 ^ (~b22 & b24);\n s[21] = b21 ^ (~b23 & b25);\n s[30] = b30 ^ (~b32 & b34);\n s[31] = b31 ^ (~b33 & b35);\n s[40] = b40 ^ (~b42 & b44);\n s[41] = b41 ^ (~b43 & b45);\n s[2] = b2 ^ (~b4 & b6);\n s[3] = b3 ^ (~b5 & b7);\n s[12] = b12 ^ (~b14 & b16);\n s[13] = b13 ^ (~b15 & b17);\n s[22] = b22 ^ (~b24 & b26);\n s[23] = b23 ^ (~b25 & b27);\n s[32] = b32 ^ (~b34 & b36);\n s[33] = b33 ^ (~b35 & b37);\n s[42] = b42 ^ (~b44 & b46);\n s[43] = b43 ^ (~b45 & b47);\n s[4] = b4 ^ (~b6 & b8);\n s[5] = b5 ^ (~b7 & b9);\n s[14] = b14 ^ (~b16 & b18);\n s[15] = b15 ^ (~b17 & b19);\n s[24] = b24 ^ (~b26 & b28);\n s[25] = b25 ^ (~b27 & b29);\n s[34] = b34 ^ (~b36 & b38);\n s[35] = b35 ^ (~b37 & b39);\n s[44] = b44 ^ (~b46 & b48);\n s[45] = b45 ^ (~b47 & b49);\n s[6] = b6 ^ (~b8 & b0);\n s[7] = b7 ^ (~b9 & b1);\n s[16] = b16 ^ (~b18 & b10);\n s[17] = b17 ^ (~b19 & b11);\n s[26] = b26 ^ (~b28 & b20);\n s[27] = b27 ^ (~b29 & b21);\n s[36] = b36 ^ (~b38 & b30);\n s[37] = b37 ^ (~b39 & b31);\n s[46] = b46 ^ (~b48 & b40);\n s[47] = b47 ^ (~b49 & b41);\n s[8] = b8 ^ (~b0 & b2);\n s[9] = b9 ^ (~b1 & b3);\n s[18] = b18 ^ (~b10 & b12);\n s[19] = b19 ^ (~b11 & b13);\n s[28] = b28 ^ (~b20 & b22);\n s[29] = b29 ^ (~b21 & b23);\n s[38] = b38 ^ (~b30 & b32);\n s[39] = b39 ^ (~b31 & b33);\n s[48] = b48 ^ (~b40 & b42);\n s[49] = b49 ^ (~b41 & b43);\n\n s[0] ^= RC[n];\n s[1] ^= RC[n + 1];\n }\n };\n\n if (COMMON_JS) {\n module.exports = methods;\n } else {\n for (i = 0; i < methodNames.length; ++i) {\n root[methodNames[i]] = methods[methodNames[i]];\n }\n if (AMD) {\n define(function () {\n return methods;\n });\n }\n }\n})();\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst sha3 = require(\"js-sha3\");\r\n/**\r\n * Keccak256 hash\r\n * @param data The data\r\n */\r\nfunction keccak256(data) {\r\n return '0x' + sha3.keccak_256(toByteArray(data));\r\n}\r\nexports.keccak256 = keccak256;\r\n/**\r\n * Adding padding to string on the left\r\n * @param value The value\r\n * @param chars The chars\r\n */\r\nexports.padLeft = (value, chars) => {\r\n const hasPrefix = /^0x/i.test(value) || typeof value === 'number';\r\n value = value.toString().replace(/^0x/i, '');\r\n const padding = chars - value.length + 1 >= 0 ? chars - value.length + 1 : 0;\r\n return (hasPrefix ? '0x' : '') + new Array(padding).join('0') + value;\r\n};\r\n/**\r\n * Convert bytes to hex\r\n * @param bytes The bytes\r\n */\r\nfunction bytesToHex(bytes) {\r\n const hex = [];\r\n for (let i = 0; i < bytes.length; i++) {\r\n hex.push((bytes[i] >>> 4).toString(16));\r\n hex.push((bytes[i] & 0xf).toString(16));\r\n }\r\n return `0x${hex.join('').replace(/^0+/, '')}`;\r\n}\r\nexports.bytesToHex = bytesToHex;\r\n/**\r\n * To byte array\r\n * @param value The value\r\n */\r\nfunction toByteArray(value) {\r\n if (value == null) {\r\n throw new Error('cannot convert null value to array');\r\n }\r\n if (typeof value === 'string') {\r\n const match = value.match(/^(0x)?[0-9a-fA-F]*$/);\r\n if (!match) {\r\n throw new Error('invalid hexidecimal string');\r\n }\r\n if (match[1] !== '0x') {\r\n throw new Error('hex string must have 0x prefix');\r\n }\r\n value = value.substring(2);\r\n if (value.length % 2) {\r\n value = '0' + value;\r\n }\r\n const result = [];\r\n for (let i = 0; i < value.length; i += 2) {\r\n result.push(parseInt(value.substr(i, 2), 16));\r\n }\r\n return addSlice(new Uint8Array(result));\r\n }\r\n if (isByteArray(value)) {\r\n return addSlice(new Uint8Array(value));\r\n }\r\n throw new Error('invalid arrayify value');\r\n}\r\nexports.toByteArray = toByteArray;\r\n/**\r\n * Is byte array\r\n * @param value The value\r\n */\r\nfunction isByteArray(value) {\r\n if (!value ||\r\n // tslint:disable-next-line: radix\r\n parseInt(String(value.length)) != value.length ||\r\n typeof value === 'string') {\r\n return false;\r\n }\r\n for (let i = 0; i < value.length; i++) {\r\n const v = value[i];\r\n // tslint:disable-next-line: radix\r\n if (v < 0 || v >= 256 || parseInt(String(v)) != v) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n/**\r\n * Add slice to array\r\n * @param array The array\r\n */\r\nfunction addSlice(array) {\r\n if (array.slice !== undefined) {\r\n return array;\r\n }\r\n array.slice = () => {\r\n const args = Array.prototype.slice.call(arguments);\r\n return addSlice(new Uint8Array(Array.prototype.slice.apply(array, args)));\r\n };\r\n return array;\r\n}\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst utils_1 = require(\"./utils\");\r\n/**\r\n * Returns true if the bloom is a valid bloom\r\n * @param bloom The bloom\r\n */\r\nfunction isBloom(bloom) {\r\n if (typeof bloom !== 'string') {\r\n return false;\r\n }\r\n if (!/^(0x)?[0-9a-f]{512}$/i.test(bloom)) {\r\n return false;\r\n }\r\n if (/^(0x)?[0-9a-f]{512}$/.test(bloom) ||\r\n /^(0x)?[0-9A-F]{512}$/.test(bloom)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\nexports.isBloom = isBloom;\r\n/**\r\n * Returns true if the value is part of the given bloom\r\n * note: false positives are possible.\r\n * @param bloom encoded bloom\r\n * @param value The value\r\n */\r\nfunction isInBloom(bloom, value) {\r\n if (typeof value === 'object' && value.constructor === Uint8Array) {\r\n value = utils_1.bytesToHex(value);\r\n }\r\n const hash = utils_1.keccak256(value).replace('0x', '');\r\n for (let i = 0; i < 12; i += 4) {\r\n // calculate bit position in bloom filter that must be active\r\n const bitpos = ((parseInt(hash.substr(i, 2), 16) << 8) +\r\n parseInt(hash.substr(i + 2, 2), 16)) &\r\n 2047;\r\n // test if bitpos in bloom is active\r\n const code = codePointToInt(bloom.charCodeAt(bloom.length - 1 - Math.floor(bitpos / 4)));\r\n const offset = 1 << bitpos % 4;\r\n if ((code & offset) !== offset) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nexports.isInBloom = isInBloom;\r\n/**\r\n * Code points to int\r\n * @param codePoint The code point\r\n */\r\nfunction codePointToInt(codePoint) {\r\n if (codePoint >= 48 && codePoint <= 57) {\r\n /* ['0'..'9'] -> [0..9] */\r\n return codePoint - 48;\r\n }\r\n if (codePoint >= 65 && codePoint <= 70) {\r\n /* ['A'..'F'] -> [10..15] */\r\n return codePoint - 55;\r\n }\r\n if (codePoint >= 97 && codePoint <= 102) {\r\n /* ['a'..'f'] -> [10..15] */\r\n return codePoint - 87;\r\n }\r\n throw new Error('invalid bloom');\r\n}\r\n/**\r\n * Returns true if the ethereum users address is part of the given bloom.\r\n * note: false positives are possible.\r\n * @param bloom encoded bloom\r\n * @param address the address to test\r\n */\r\nfunction isUserEthereumAddressInBloom(bloom, ethereumAddress) {\r\n if (!isBloom(bloom)) {\r\n throw new Error('Invalid bloom given');\r\n }\r\n if (!isAddress(ethereumAddress)) {\r\n throw new Error(`Invalid ethereum address given: \"${ethereumAddress}\"`);\r\n }\r\n // you have to pad the ethereum address to 32 bytes\r\n // else the bloom filter does not work\r\n // this is only if your matching the USERS\r\n // ethereum address. Contract address do not need this\r\n // hence why we have 2 methods\r\n // (0x is not in the 2nd parameter of padleft so 64 chars is fine)\r\n const address = utils_1.padLeft(ethereumAddress, 64);\r\n return isInBloom(bloom, address);\r\n}\r\nexports.isUserEthereumAddressInBloom = isUserEthereumAddressInBloom;\r\n/**\r\n * Returns true if the contract address is part of the given bloom.\r\n * note: false positives are possible.\r\n * @param bloom encoded bloom\r\n * @param contractAddress the contract address to test\r\n */\r\nfunction isContractAddressInBloom(bloom, contractAddress) {\r\n if (!isBloom(bloom)) {\r\n throw new Error('Invalid bloom given');\r\n }\r\n if (!isAddress(contractAddress)) {\r\n throw new Error(`Invalid contract address given: \"${contractAddress}\"`);\r\n }\r\n return isInBloom(bloom, contractAddress);\r\n}\r\nexports.isContractAddressInBloom = isContractAddressInBloom;\r\n/**\r\n * Returns true if the topic is part of the given bloom.\r\n * note: false positives are possible.\r\n * @param bloom encoded bloom\r\n * @param topic the topic encoded hex\r\n */\r\nfunction isTopicInBloom(bloom, topic) {\r\n if (!isBloom(bloom)) {\r\n throw new Error('Invalid bloom given');\r\n }\r\n if (!isTopic(topic)) {\r\n throw new Error('Invalid topic');\r\n }\r\n return isInBloom(bloom, topic);\r\n}\r\nexports.isTopicInBloom = isTopicInBloom;\r\n/**\r\n * Checks if its a valid topic\r\n * @param topic encoded hex topic\r\n */\r\nfunction isTopic(topic) {\r\n if (typeof topic !== 'string') {\r\n return false;\r\n }\r\n if (!/^(0x)?[0-9a-f]{64}$/i.test(topic)) {\r\n return false;\r\n }\r\n else if (/^(0x)?[0-9a-f]{64}$/.test(topic) ||\r\n /^(0x)?[0-9A-F]{64}$/.test(topic)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\nexports.isTopic = isTopic;\r\n/**\r\n * Is valid address\r\n * @param address The address\r\n */\r\nfunction isAddress(address) {\r\n if (typeof address !== 'string') {\r\n return false;\r\n }\r\n if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) {\r\n return true;\r\n }\r\n if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\nexports.isAddress = isAddress;\r\n","/*\n This file is part of web3.js.\n\n web3.js is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n web3.js is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with web3.js. If not, see <http://www.gnu.org/licenses/>.\n */\n/**\n * @file utils.js\n * @author Fabian Vogelsteller <fabian@ethereum.org>\n * @date 2017\n */\nvar BN = require('bn.js');\nvar numberToBN = require('number-to-bn');\nvar utf8 = require('utf8');\nvar Hash = require(\"eth-lib/lib/hash\");\nvar ethereumBloomFilters = require('ethereum-bloom-filters');\n/**\n * Returns true if object is BN, otherwise false\n *\n * @method isBN\n * @param {Object} object\n * @return {Boolean}\n */\nvar isBN = function (object) {\n return BN.isBN(object);\n};\n/**\n * Returns true if object is BigNumber, otherwise false\n *\n * @method isBigNumber\n * @param {Object} object\n * @return {Boolean}\n */\nvar isBigNumber = function (object) {\n return object && object.constructor && object.constructor.name === 'BigNumber';\n};\n/**\n * Takes an input and transforms it into an BN\n *\n * @method toBN\n * @param {Number|String|BN} number, string, HEX string or BN\n * @return {BN} BN\n */\nvar toBN = function (number) {\n try {\n return numberToBN.apply(null, arguments);\n }\n catch (e) {\n throw new Error(e + ' Given value: \"' + number + '\"');\n }\n};\n/**\n * Takes and input transforms it into BN and if it is negative value, into two's complement\n *\n * @method toTwosComplement\n * @param {Number|String|BN} number\n * @return {String}\n */\nvar toTwosComplement = function (number) {\n return '0x' + toBN(number).toTwos(256).toString(16, 64);\n};\n/**\n * Checks if the given string is an address\n *\n * @method isAddress\n * @param {String} address the given HEX address\n * @return {Boolean}\n */\nvar isAddress = function (address) {\n // check if it has the basic requirements of an address\n if (!/^(0x)?[0-9a-f]{40}$/i.test(address)) {\n return false;\n // If it's ALL lowercase or ALL upppercase\n }\n else if (/^(0x|0X)?[0-9a-f]{40}$/.test(address) || /^(0x|0X)?[0-9A-F]{40}$/.test(address)) {\n return true;\n // Otherwise check each case\n }\n else {\n return checkAddressChecksum(address);\n }\n};\n/**\n * Checks if the given string is a checksummed address\n *\n * @method checkAddressChecksum\n * @param {String} address the given HEX address\n * @return {Boolean}\n */\nvar checkAddressChecksum = function (address) {\n // Check each case\n address = address.replace(/^0x/i, '');\n var addressHash = sha3(address.toLowerCase()).replace(/^0x/i, '');\n for (var i = 0; i < 40; i++) {\n // the nth letter should be uppercase if the nth digit of casemap is 1\n if ((parseInt(addressHash[i], 16) > 7 && address[i].toUpperCase() !== address[i]) || (parseInt(addressHash[i], 16) <= 7 && address[i].toLowerCase() !== address[i])) {\n return false;\n }\n }\n return true;\n};\n/**\n * Should be called to pad string to expected length\n *\n * @method leftPad\n * @param {String} string to be padded\n * @param {Number} chars that result string should have\n * @param {String} sign, by default 0\n * @returns {String} right aligned string\n */\nvar leftPad = function (string, chars, sign) {\n var hasPrefix = /^0x/i.test(string) || typeof string === 'number';\n string = string.toString(16).replace(/^0x/i, '');\n var padding = (chars - string.length + 1 >= 0) ? chars - string.length + 1 : 0;\n return (hasPrefix ? '0x' : '') + new Array(padding).join(sign ? sign : \"0\") + string;\n};\n/**\n * Should be called to pad string to expected length\n *\n * @method rightPad\n * @param {String} string to be padded\n * @param {Number} chars that result string should have\n * @param {String} sign, by default 0\n * @returns {String} right aligned string\n */\nvar rightPad = function (string, chars, sign) {\n var hasPrefix = /^0x/i.test(string) || typeof string === 'number';\n string = string.toString(16).replace(/^0x/i, '');\n var padding = (chars - string.length + 1 >= 0) ? chars - string.length + 1 : 0;\n return (hasPrefix ? '0x' : '') + string + (new Array(padding).join(sign ? sign : \"0\"));\n};\n/**\n * Should be called to get hex representation (prefixed by 0x) of utf8 string\n *\n * @method utf8ToHex\n * @param {String} str\n * @returns {String} hex representation of input string\n */\nvar utf8ToHex = function (str) {\n str = utf8.encode(str);\n var hex = \"\";\n // remove \\u0000 padding from either side\n str = str.replace(/^(?:\\u0000)*/, '');\n str = str.split(\"\").reverse().join(\"\");\n str = str.replace(/^(?:\\u0000)*/, '');\n str = str.split(\"\").reverse().join(\"\");\n for (var i = 0; i < str.length; i++) {\n var code = str.charCodeAt(i);\n // if (code !== 0) {\n var n = code.toString(16);\n hex += n.length < 2 ? '0' + n : n;\n // }\n }\n return \"0x\" + hex;\n};\n/**\n * Should be called to get utf8 from it's hex representation\n *\n * @method hexToUtf8\n * @param {String} hex\n * @returns {String} ascii string representation of hex value\n */\nvar hexToUtf8 = function (hex) {\n if (!isHexStrict(hex))\n throw new Error('The parameter \"' + hex + '\" must be a valid HEX string.');\n var str = \"\";\n var code = 0;\n hex = hex.replace(/^0x/i, '');\n // remove 00 padding from either side\n hex = hex.replace(/^(?:00)*/, '');\n hex = hex.split(\"\").reverse().join(\"\");\n hex = hex.replace(/^(?:00)*/, '');\n hex = hex.split(\"\").reverse().join(\"\");\n var l = hex.length;\n for (var i = 0; i < l; i += 2) {\n code = parseInt(hex.substr(i, 2), 16);\n // if (code !== 0) {\n str += String.fromCharCode(code);\n // }\n }\n return utf8.decode(str);\n};\n/**\n * Converts value to it's number representation\n *\n * @method hexToNumber\n * @param {String|Number|BN} value\n * @return {String}\n */\nvar hexToNumber = function (value) {\n if (!value) {\n return value;\n }\n if (typeof value === 'string' && !isHexStrict(value)) {\n throw new Error('Given value \"' + value + '\" is not a valid hex string.');\n }\n return toBN(value).toNumber();\n};\n/**\n * Converts value to it's decimal representation in string\n *\n * @method hexToNumberString\n * @param {String|Number|BN} value\n * @return {String}\n */\nvar hexToNumberString = function (value) {\n if (!value)\n return value;\n if (typeof value === 'string' && !isHexStrict(value)) {\n throw new Error('Given value \"' + value + '\" is not a valid hex string.');\n }\n return toBN(value).toString(10);\n};\n/**\n * Converts value to it's hex representation\n *\n * @method numberToHex\n * @param {String|Number|BN} value\n * @return {String}\n */\nvar numberToHex = function (value) {\n if ((value === null || value === undefined)) {\n return value;\n }\n if (!isFinite(value) && !isHexStrict(value)) {\n throw new Error('Given input \"' + value + '\" is not a number.');\n }\n var number = toBN(value);\n var result = number.toString(16);\n return number.lt(new BN(0)) ? '-0x' + result.substr(1) : '0x' + result;\n};\n/**\n * Convert a byte array to a hex string\n *\n * Note: Implementation from crypto-js\n *\n * @method bytesToHex\n * @param {Array} bytes\n * @return {String} the hex string\n */\nvar bytesToHex = function (bytes) {\n for (var hex = [], i = 0; i < bytes.length; i++) {\n /* jshint ignore:start */\n hex.push((bytes[i] >>> 4).toString(16));\n hex.push((bytes[i] & 0xF).toString(16));\n /* jshint ignore:end */\n }\n return '0x' + hex.join(\"\");\n};\n/**\n * Convert a hex string to a byte array\n *\n * Note: Implementation from crypto-js\n *\n * @method hexToBytes\n * @param {string} hex\n * @return {Array} the byte array\n */\nvar hexToBytes = function (hex) {\n hex = hex.toString(16);\n if (!isHexStrict(hex)) {\n throw new Error('Given value \"' + hex + '\" is not a valid hex string.');\n }\n hex = hex.replace(/^0x/i, '');\n for (var bytes = [], c = 0; c < hex.length; c += 2)\n bytes.push(parseInt(hex.substr(c, 2), 16));\n return bytes;\n};\n/**\n * Auto converts any given value into it's hex representation.\n *\n * And even stringifys objects before.\n *\n * @method toHex\n * @param {String|Number|BN|Object|Buffer} value\n * @param {Boolean} returnType\n * @return {String}\n */\nvar toHex = function (value, returnType) {\n /*jshint maxcomplexity: false */\n if (isAddress(value)) {\n return returnType ? 'address' : '0x' + value.toLowerCase().replace(/^0x/i, '');\n }\n if (typeof value === 'boolean') {\n return returnType ? 'bool' : value ? '0x01' : '0x00';\n }\n if (Buffer.isBuffer(value)) {\n return '0x' + value.toString('hex');\n }\n if (typeof value === 'object' && !!value && !isBigNumber(value) && !isBN(value)) {\n return returnType ? 'string' : utf8ToHex(JSON.stringify(value));\n }\n // if its a negative number, pass it through numberToHex\n if (typeof value === 'string') {\n if (value.indexOf('-0x') === 0 || value.indexOf('-0X') === 0) {\n return returnType ? 'int256' : numberToHex(value);\n }\n else if (value.indexOf('0x') === 0 || value.indexOf('0X') === 0) {\n return returnType ? 'bytes' : value;\n }\n else if (!isFinite(value)) {\n return returnType ? 'string' : utf8ToHex(value);\n }\n }\n return returnType ? (value < 0 ? 'int256' : 'uint256') : numberToHex(value);\n};\n/**\n * Check if string is HEX, requires a 0x in front\n *\n * @method isHexStrict\n * @param {String} hex to be checked\n * @returns {Boolean}\n */\nvar isHexStrict = function (hex) {\n return ((typeof hex === 'string' || typeof hex === 'number') && /^(-)?0x[0-9a-f]*$/i.test(hex));\n};\n/**\n * Check if string is HEX\n *\n * @method isHex\n * @param {String} hex to be checked\n * @returns {Boolean}\n */\nvar isHex = function (hex) {\n return ((typeof hex === 'string' || typeof hex === 'number') && /^(-0x|0x)?[0-9a-f]*$/i.test(hex));\n};\n/**\n * Remove 0x prefix from string\n *\n * @method stripHexPrefix\n * @param {String} str to be checked\n * @returns {String}\n */\nvar stripHexPrefix = function (str) {\n if (str !== 0 && isHex(str))\n return str.replace(/^(-)?0x/i, '$1');\n return str;\n};\n/**\n * Returns true if given string is a valid Ethereum block header bloom.\n *\n * @method isBloom\n * @param {String} bloom encoded bloom filter\n * @return {Boolean}\n */\nvar isBloom = function (bloom) {\n return ethereumBloomFilters.isBloom(bloom);\n};\n/**\n * Returns true if the ethereum users address is part of the given bloom\n * note: false positives are possible.\n *\n * @method isUserEthereumAddressInBloom\n * @param {String} ethereumAddress encoded bloom filter\n * @param {String} bloom ethereum addresss\n * @return {Boolean}\n */\nvar isUserEthereumAddressInBloom = function (bloom, ethereumAddress) {\n return ethereumBloomFilters.isUserEthereumAddressInBloom(bloom, ethereumAddress);\n};\n/**\n * Returns true if the contract address is part of the given bloom\n * note: false positives are possible.\n *\n * @method isUserEthereumAddressInBloom\n * @param {String} bloom encoded bloom filter\n * @param {String} contractAddress contract addresss\n * @return {Boolean}\n */\nvar isContractAddressInBloom = function (bloom, contractAddress) {\n return ethereumBloomFilters.isContractAddressInBloom(bloom, contractAddress);\n};\n/**\n * Returns true if given string is a valid log topic.\n *\n * @method isTopic\n * @param {String} topic encoded topic\n * @return {Boolean}\n */\nvar isTopic = function (topic) {\n return ethereumBloomFilters.isTopic(topic);\n};\n/**\n * Returns true if the topic is part of the given bloom\n * note: false positives are possible.\n *\n * @method isTopicInBloom\n * @param {String} bloom encoded bloom filter\n * @param {String} topic encoded topic\n * @return {Boolean}\n */\nvar isTopicInBloom = function (bloom, topic) {\n return ethereumBloomFilters.isTopicInBloom(bloom, topic);\n};\n/**\n * Returns true if the value is part of the given bloom\n * note: false positives are possible.\n *\n * @method isInBloom\n * @param {String} bloom encoded bloom filter\n * @param {String | Uint8Array} topic encoded value\n * @return {Boolean}\n */\nvar isInBloom = function (bloom, topic) {\n return ethereumBloomFilters.isInBloom(bloom, topic);\n};\n/**\n * Hashes values to a sha3 hash using keccak 256\n *\n * To hash a HEX string the hex must have 0x in front.\n *\n * @method sha3\n * @return {String} the sha3 string\n */\nvar SHA3_NULL_S = '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470';\nvar sha3 = function (value) {\n if (isBN(value)) {\n value = value.toString();\n }\n if (isHexStrict(value) && /^0x/i.test((value).toString())) {\n value = hexToBytes(value);\n }\n var returnValue = Hash.keccak256(value); // jshint ignore:line\n if (returnValue === SHA3_NULL_S) {\n return null;\n }\n else {\n return returnValue;\n }\n};\n// expose the under the hood keccak256\nsha3._Hash = Hash;\n/**\n * @method sha3Raw\n *\n * @param value\n *\n * @returns {string}\n */\nvar sha3Raw = function (value) {\n value = sha3(value);\n if (value === null) {\n return SHA3_NULL_S;\n }\n return value;\n};\n/**\n * Auto converts any given value into it's hex representation,\n * then converts hex to number.\n *\n * @method toNumber\n * @param {String|Number|BN} value\n * @return {Number}\n */\nvar toNumber = function (value) {\n return typeof value === 'number' ? value : hexToNumber(toHex(value));\n};\nmodule.exports = {\n BN: BN,\n isBN: isBN,\n isBigNumber: isBigNumber,\n toBN: toBN,\n isAddress: isAddress,\n isBloom: isBloom,\n isUserEthereumAddressInBloom: isUserEthereumAddressInBloom,\n isContractAddressInBloom: isContractAddressInBloom,\n isTopic: isTopic,\n isTopicInBloom: isTopicInBloom,\n isInBloom: isInBloom,\n checkAddressChecksum: checkAddressChecksum,\n utf8ToHex: utf8ToHex,\n hexToUtf8: hexToUtf8,\n hexToNumber: hexToNumber,\n hexToNumberString: hexToNumberString,\n numberToHex: numberToHex,\n toHex: toHex,\n hexToBytes: hexToBytes,\n bytesToHex: bytesToHex,\n isHex: isHex,\n isHexStrict: isHexStrict,\n stripHexPrefix: stripHexPrefix,\n leftPad: leftPad,\n rightPad: rightPad,\n toTwosComplement: toTwosComplement,\n sha3: sha3,\n sha3Raw: sha3Raw,\n toNumber: toNumber\n};\n","import { DDO } from '../ddo/DDO'\nimport { Metadata } from '../ddo/interfaces/Metadata'\nimport {\n Service,\n ServiceAccess,\n ServiceCustomParameter,\n ServiceCustomParametersRequired\n} from '../ddo/interfaces/Service'\nimport { SearchQuery } from '../metadatacache/MetadataCache'\nimport { EditableMetadata } from '../ddo/interfaces/EditableMetadata'\nimport Account from './Account'\nimport DID from './DID'\nimport { SubscribablePromise, didNoZeroX, didPrefixed, assetResolve } from '../utils'\nimport { Instantiable, InstantiableConfig } from '../Instantiable.abstract'\nimport { WebServiceConnector } from './utils/WebServiceConnector'\nimport BigNumber from 'bignumber.js'\nimport { Provider, UserCustomParameters } from '../provider/Provider'\nimport { isAddress } from 'web3-utils'\nimport { MetadataMain } from '../ddo/interfaces'\nimport { TransactionReceipt } from 'web3-core'\nimport { updateCredentialDetail, removeCredentialDetail } from './AssetsCredential'\nimport { Consumable } from '../ddo/interfaces/Consumable'\nimport { EventAccessControl } from './EventAccessControl'\n\nexport enum CreateProgressStep {\n CreatingDataToken,\n DataTokenCreated,\n EncryptingFiles,\n FilesEncrypted,\n StoringDdo,\n DdoStored\n}\n\nexport enum OrderProgressStep {\n TransferDataToken\n}\n\nexport interface Order {\n dtAddress: string\n amount: string\n timestamp: number\n transactionHash: string\n consumer: string\n payer: string\n did?: string\n serviceId?: number\n serviceType?: string\n}\n\n/**\n * Assets submodule of Ocean Protocol.\n */\nexport class Assets extends Instantiable {\n /**\n * Returns the instance of Assets.\n * @return {Promise<Assets>}\n */\n public static async getInstance(config: InstantiableConfig): Promise<Assets> {\n const instance = new Assets()\n instance.setInstanceConfig(config)\n\n return instance\n }\n\n /**\n * Creates a new DDO. After this, Call ocean.onChainMetadata.to publish\n * @param {Metadata} metadata DDO metadata.\n * @param {Account} publisher Publisher account.\n * @param {list} services list of Service description documents\n * @param {String} dtAddress existing Data Token Address\n * @param {String} cap Maximum cap (Number) - will be converted to wei\n * @param {String} name Token name\n * @param {String} symbol Token symbol\n * @param {String} providerUri\n * @return {SubscribablePromise<CreateProgressStep, DDO>}\n */\n public create(\n metadata: Metadata,\n publisher: Account,\n services: Service[] = [],\n dtAddress?: string,\n cap?: string,\n name?: string,\n symbol?: string,\n providerUri?: string\n ): SubscribablePromise<CreateProgressStep, DDO> {\n if (dtAddress && !isAddress(dtAddress)) {\n this.logger.error(\n `Passed Data Token address ${dtAddress} is not valid. Aborting publishing.`\n )\n return null\n }\n this.logger.log('Creating asset')\n return new SubscribablePromise(async (observer) => {\n if (services.length === 0) {\n this.logger.log('You have no services. Are you sure about this?')\n }\n const { datatokens } = this.ocean\n if (!dtAddress) {\n this.logger.log('Creating datatoken')\n observer.next(CreateProgressStep.CreatingDataToken)\n // const metadataCacheUri = this.ocean.metadataCache.getURI()\n // const jsonBlob = { t: 1, url: metadataCacheUri }\n dtAddress = await datatokens.create('', publisher.getId(), cap, name, symbol)\n\n if (!isAddress(dtAddress)) {\n this.logger.error(\n `Created Data Token address ${dtAddress} is not valid. Aborting publishing.`\n )\n return null\n }\n\n this.logger.log(`DataToken ${dtAddress} created`)\n observer.next(CreateProgressStep.DataTokenCreated)\n }\n\n const did: DID = DID.generate(dtAddress)\n\n this.logger.log('Encrypting files')\n observer.next(CreateProgressStep.EncryptingFiles)\n let provider: Provider\n\n if (providerUri) {\n provider = await Provider.getInstance(this.instanceConfig)\n await provider.setBaseUrl(providerUri)\n } else provider = this.ocean.provider\n const encryptedFiles = await provider.encrypt(\n did.getDid(),\n metadata.main.files,\n publisher\n )\n this.logger.log('Files encrypted')\n observer.next(CreateProgressStep.FilesEncrypted)\n\n let indexCount = 0\n // create ddo itself\n const ddo: DDO = new DDO({\n id: did.getDid(),\n dataToken: dtAddress,\n authentication: [\n {\n type: 'RsaSignatureAuthentication2018',\n publicKey: did.getDid()\n }\n ],\n publicKey: [\n {\n id: did.getDid(),\n type: 'EthereumECDSAKey',\n owner: publisher.getId()\n }\n ],\n service: [\n {\n type: 'metadata',\n attributes: {\n // Default values\n status: {\n isListed: true,\n isRetired: false,\n isOrderDisabled: false\n },\n // Overwrites defaults\n ...metadata,\n encryptedFiles,\n // Cleaning not needed information\n main: {\n ...metadata.main,\n files: metadata.main.files.map((file, index) => ({\n ...file,\n index,\n url: undefined\n }))\n } as MetadataMain\n }\n },\n ...services\n ]\n // Remove duplications\n .reverse()\n .filter(\n ({ type }, i, list) => list.findIndex(({ type: t }) => t === type) === i\n )\n .reverse()\n // Adding index\n .map((_) => ({\n ..._,\n index: indexCount++\n })) as Service[]\n })\n await ddo.addProof(this.ocean, publisher.getId())\n ddo.dataTokenInfo = {\n name: await datatokens.getName(dtAddress),\n symbol: await datatokens.getSymbol(dtAddress),\n address: dtAddress,\n cap: parseFloat(await datatokens.getCap(dtAddress))\n }\n return ddo\n /* Remeber to call ocean.onChainMetadata.publish after creating the DDO.\n \n this.logger.log('Storing DDO')\n observer.next(CreateProgressStep.StoringDdo)\n const storeTx = await this.ocean.onChainMetadata.publish(\n ddo.id,\n ddo,\n publisher.getId()\n )\n this.logger.log('DDO stored ' + ddo.id)\n observer.next(CreateProgressStep.DdoStored)\n if (storeTx) return ddo\n else return null\n */\n })\n }\n\n /**\n * Returns a DDO by DID.\n * @param {string} did Decentralized ID.\n * @return {Promise<DDO>}\n */\n public async resolve(did: string): Promise<DDO> {\n return this.ocean.metadataCache.retrieveDDO(did)\n }\n\n /** Metadata updates\n * Don't forget to call ocean.OnChainmetadataCache.update after using this functions\n * ie: ocean.OnChainmetadataCache.update(ddo.id,ddo,account.getId())\n */\n\n /**\n * Edit Metadata for a DID.\n * @param {ddo} DDO\n * @param {newMetadata} EditableMetadata Metadata fields & new values.\n * @return {Promise<DDO>} the new DDO\n */\n public async editMetadata(ddo: DDO, newMetadata: EditableMetadata): Promise<DDO> {\n if (!ddo) return null\n for (let i = 0; i < ddo.service.length; i++) {\n if (ddo.service[i].type !== 'metadata') continue\n if (newMetadata.title) ddo.service[i].attributes.main.name = newMetadata.title\n if (newMetadata.author) ddo.service[i].attributes.main.author = newMetadata.author\n if (!ddo.service[i].attributes.additionalInformation)\n ddo.service[i].attributes.additionalInformation = Object()\n if (newMetadata.description)\n ddo.service[i].attributes.additionalInformation.description =\n newMetadata.description\n if (newMetadata.links) {\n ddo.service[i].attributes.additionalInformation.links = newMetadata.links\n } else {\n ddo.service[i].attributes.additionalInformation.links = []\n }\n\n if (newMetadata.status?.isOrderDisabled !== undefined) {\n !ddo.service[i].attributes.status\n ? (ddo.service[i].attributes.status = {\n isOrderDisabled: newMetadata.status.isOrderDisabled\n })\n : (ddo.service[i].attributes.status.isOrderDisabled =\n newMetadata.status.isOrderDisabled)\n }\n }\n return ddo\n }\n\n /**\n * Update Credentials attribute in DDO\n * @param {ddo} DDO\n * @param {credentialType} string e.g. address / credentail3Box\n * @param {allowList} string[] List of allow credential\n * @param {denyList} string[] List of deny credential\n * @return {Promise<DDO>} Updated DDO\n */\n public async updateCredentials(\n ddo: DDO,\n credentialType: string,\n allowList: string[],\n denyList: string[]\n ): Promise<DDO> {\n let newDDo\n if (allowList && allowList.length > 0) {\n newDDo = updateCredentialDetail(ddo, credentialType, allowList, 'allow')\n } else {\n newDDo = removeCredentialDetail(ddo, credentialType, 'allow')\n }\n if (denyList && denyList.length > 0) {\n newDDo = updateCredentialDetail(ddo, credentialType, denyList, 'deny')\n } else {\n newDDo = removeCredentialDetail(ddo, credentialType, 'deny')\n }\n return newDDo\n }\n\n /**\n * check if a credential can consume a dataset\n * @param {ddo} DDO\n * @param {credentialType} string e.g. address / credentail3Box\n * @param {value} string credential\n * @return {Consumable} allowed 0 = OK , 2 - Credential not in allow list, 3 - Credential in deny list\n */\n public checkCredential(ddo: DDO, credentialType: string, value: string): Consumable {\n let status = 0\n let message = 'All good'\n let result = true\n if (ddo.credentials) {\n if (ddo.credentials.allow && ddo.credentials.allow.length > 0) {\n const allowList = ddo.credentials.allow.find(\n (credentail) => credentail.type === credentialType\n )\n if (allowList && !allowList.values.includes(value)) {\n status = 2\n message = 'Access is denied, your wallet address is not found on allow list'\n result = false\n }\n }\n if (ddo.credentials.deny && ddo.credentials.deny.length > 0) {\n const denyList = ddo.credentials.deny.find(\n (credentail) => credentail.type === credentialType\n )\n if (denyList && denyList.values.includes(value)) {\n status = 3\n message = 'Access is denied, your wallet address is found on deny list'\n result = false\n }\n }\n }\n return { status, message, result }\n }\n\n /**\n * Publish DDO on chain.\n * @param {ddo} DDO\n * @param {String} consumerAccount\n * @param {boolean} encrypt\n * @return {Promise<TransactionReceipt>} transaction\n */\n public async publishDdo(\n ddo: DDO,\n consumerAccount: string,\n encrypt: boolean = false\n ): Promise<TransactionReceipt> {\n return await this.ocean.onChainMetadata.publish(ddo.id, ddo, consumerAccount, encrypt)\n }\n\n /**\n * Update Metadata on chain.\n * @param {ddo} DDO\n * @param {String} consumerAccount\n * @return {Promise<TransactionReceipt>} transaction\n */\n public async updateMetadata(\n ddo: DDO,\n consumerAccount: string\n ): Promise<TransactionReceipt> {\n return await this.ocean.onChainMetadata.update(ddo.id, ddo, consumerAccount)\n }\n\n /**\n * Edit Service Timeouts\n * @param {ddo} DDO if empty, will trigger a retrieve\n * @param {number} serviceIndex Index of the compute service in the DDO.\n * @param {number} timeout New timeout setting\n * @return {Promise<DDO>}\n */\n public async editServiceTimeout(\n ddo: DDO,\n serviceIndex: number,\n timeout: number\n ): Promise<DDO> {\n if (!ddo) return null\n if (typeof ddo.service[serviceIndex] === 'undefined') return null\n if (timeout < 0) return null\n ddo.service[serviceIndex].attributes.main.timeout = parseInt(timeout.toFixed())\n return ddo\n }\n /** End metadata updates */\n\n /**\n * Returns the creator of a asset.\n * @param {DDO|string} asset DID Descriptor Object containing all the data related to an asset or a Decentralized identifier.\n * @return {Promise<string>} Returns eth address\n */\n public async creator(asset: DDO | string): Promise<string> {\n const { did, ddo } = await assetResolve(asset, this.ocean)\n const checksum = ddo.getChecksum()\n const { creator, signatureValue } = ddo.proof\n const signer = await this.ocean.utils.signature.verifyText(checksum, signatureValue)\n\n if (signer.toLowerCase() !== creator.toLowerCase()) {\n this.logger.warn(\n `Owner of ${did} doesn't match. Expected ${creator} instead of ${signer}.`\n )\n }\n\n return creator\n }\n\n public async getServiceByType(\n asset: DDO | string,\n serviceType: string\n ): Promise<Service> {\n const { ddo } = await assetResolve(asset, this.ocean)\n let service: Service\n const services: Service[] = ddo.service\n\n services.forEach((serv) => {\n if (serv.type.toString() === serviceType) {\n service = serv\n }\n })\n return service\n }\n\n public async getServiceByIndex(\n asset: DDO | string,\n serviceIndex: number\n ): Promise<Service> {\n const { ddo } = await assetResolve(asset, this.ocean)\n let service: Service\n const services: Service[] = ddo.service\n\n services.forEach((serv) => {\n if (serv.index === serviceIndex) {\n service = serv\n }\n })\n return service\n }\n\n /**\n * Search over the assets using a query.\n * @param {SearchQuery} query Query to filter the assets.\n * @return {Promise<QueryResult>}\n */\n public async query(query: SearchQuery): Promise<any> {\n return this.ocean.metadataCache.queryMetadata(query)\n }\n /**\n * Creates an access service\n * @param {Account} creator\n * @param {String} cost number of datatokens needed for this service\n * @param {String} datePublished\n * @param {Number} timeout\n * @param {String} providerUri\n * @param {ServiceCustomParametersRequired} requiredParameters\n * @return {Promise<ServiceAccess>} service\n */\n\n public async createAccessServiceAttributes(\n creator: Account,\n cost: string,\n datePublished: string,\n timeout: number = 0,\n providerUri?: string,\n requiredParameters?: ServiceCustomParametersRequired\n ): Promise<ServiceAccess> {\n const service: ServiceAccess = {\n type: 'access',\n index: 2,\n serviceEndpoint: providerUri || this.ocean.provider.url,\n attributes: {\n main: {\n creator: creator.getId(),\n datePublished,\n cost,\n timeout: timeout,\n name: 'dataAssetAccess'\n }\n }\n }\n if (requiredParameters?.userCustomParameters)\n service.attributes.userCustomParameters = requiredParameters.userCustomParameters\n if (requiredParameters?.algoCustomParameters)\n service.attributes.algoCustomParameters = requiredParameters.algoCustomParameters\n return service\n }\n\n /**\n * Initialize a service\n * Can be used to compute totalCost for ordering a service\n * @param {DDO|string} asset DID Descriptor Object containing all the data related to an asset or a Decentralized identifier.\n * @param {String} serviceType\n * @param {String} consumerAddress\n * @param {Number} serviceIndex\n * @param {String} serviceEndpoint\n * @param {UserCustomParameters} userCustomParameters\n * @return {Promise<any>} Order details\n */\n public async initialize(\n asset: DDO | string,\n serviceType: string,\n consumerAddress: string,\n serviceIndex: number = -1,\n serviceEndpoint: string,\n userCustomParameters?: UserCustomParameters\n ): Promise<any> {\n const provider = await Provider.getInstance(this.instanceConfig)\n await provider.setBaseUrl(serviceEndpoint)\n const res = await provider.initialize(\n asset,\n serviceIndex,\n serviceType,\n consumerAddress,\n userCustomParameters\n )\n if (res === null) return null\n const providerData = JSON.parse(res)\n return providerData\n }\n\n /**\n * Orders & pays for a service\n * @param {DDO|string} asset DID Descriptor Object containing all the data related to an asset or a Decentralized identifier.\n * @param {String} serviceType\n * @param {String} payerAddress\n * @param {Number} serviceIndex\n * @param {String} mpAddress Marketplace fee collector address\n * @param {String} consumerAddress Optionally, if the consumer is another address than payer\n * @param {UserCustomParameters} userCustomParameters\n * @return {Promise<String>} transactionHash of the payment\n */\n public async order(\n asset: DDO | string,\n serviceType: string,\n payerAddress: string,\n serviceIndex: number = -1,\n mpAddress?: string,\n consumerAddress?: string,\n userCustomParameters?: UserCustomParameters,\n authService = 'json',\n searchPreviousOrders = true\n ): Promise<string> {\n let service: Service\n const { ddo } = await assetResolve(asset, this.ocean)\n const consumable = await this.isConsumable(ddo, payerAddress, 'address', authService)\n if (!consumable.result) {\n throw new Error(`Order asset failed, ` + consumable.message)\n }\n\n if (!consumerAddress) consumerAddress = payerAddress\n if (serviceIndex === -1) {\n service = await this.getServiceByType(ddo, serviceType)\n serviceIndex = service.index\n } else {\n service = await this.getServiceByIndex(ddo, serviceIndex)\n serviceType = service.type\n }\n // TODO validate userCustomParameters\n if (\n !(await this.isUserCustomParametersValid(\n service.attributes.userCustomParameters,\n userCustomParameters\n ))\n ) {\n throw new Error(\n `Order asset failed, Missing required fiels in userCustomParameters`\n )\n }\n try {\n const providerData = await this.initialize(\n ddo,\n serviceType,\n payerAddress,\n serviceIndex,\n service.serviceEndpoint,\n userCustomParameters\n )\n if (!providerData)\n throw new Error(\n `Order asset failed, Failed to initialize service to compute totalCost for ordering`\n )\n if (searchPreviousOrders) {\n const previousOrder = await this.ocean.datatokens.getPreviousValidOrders(\n providerData.dataToken,\n providerData.numTokens,\n serviceIndex,\n service.attributes.main.timeout,\n consumerAddress\n )\n if (previousOrder) return previousOrder\n }\n const balance = new BigNumber(\n await this.ocean.datatokens.balance(providerData.dataToken, payerAddress)\n )\n const totalCost = new BigNumber(String(providerData.numTokens))\n if (balance.isLessThan(totalCost)) {\n this.logger.error(\n 'ERROR: Not enough funds Needed ' +\n totalCost.toString() +\n ' but balance is ' +\n balance.toString()\n )\n throw new Error(\n 'ERROR: Not enough funds Needed ' +\n totalCost.toString() +\n ' but balance is ' +\n balance.toString()\n )\n }\n const txid = await this.ocean.datatokens.startOrder(\n providerData.dataToken,\n consumerAddress,\n String(providerData.numTokens),\n serviceIndex,\n mpAddress,\n payerAddress\n )\n if (txid) return txid.transactionHash\n } catch (e) {\n this.logger.error(`ERROR: Failed to order a service : ${e.message}`)\n throw new Error(`${e.message}`)\n }\n }\n\n // marketplace flow\n public async download(\n asset: DDO | string,\n txId: string,\n tokenAddress: string,\n consumerAccount: Account,\n destination: string\n ): Promise<string | true> {\n const { did, ddo } = await assetResolve(asset, this.ocean)\n const { attributes } = ddo.findServiceByType('metadata')\n const service = ddo.findServiceByType('access')\n const { files } = attributes.main\n const { serviceEndpoint } = service\n\n if (!serviceEndpoint) {\n throw new Error(\n 'Consume asset failed, service definition is missing the `serviceEndpoint`.'\n )\n }\n\n this.logger.log('Consuming files')\n\n destination = destination\n ? `${destination}/datafile.${ddo.shortId()}.${service.index}/`\n : undefined\n const provider = await Provider.getInstance(this.instanceConfig)\n await provider.setBaseUrl(serviceEndpoint)\n await provider.download(\n did,\n txId,\n tokenAddress,\n service.type,\n service.index.toString(),\n destination,\n consumerAccount,\n files\n )\n return true\n }\n\n // simple flow\n public async simpleDownload(\n dtAddress: string,\n serviceEndpoint: string,\n txId: string,\n account: string\n ): Promise<string> {\n let consumeUrl = serviceEndpoint\n consumeUrl += `?consumerAddress=${account}`\n consumeUrl += `&tokenAddress=${dtAddress}`\n consumeUrl += `&transferTxId=${txId}`\n const serviceConnector = new WebServiceConnector(\n this.logger,\n this.instanceConfig?.config?.requestTimeout\n )\n try {\n await serviceConnector.downloadFile(consumeUrl)\n } catch (e) {\n this.logger.error('Error consuming assets')\n this.logger.error(e)\n throw e\n }\n return serviceEndpoint\n }\n\n /**\n * get Order History\n * @param {Account} account\n * @param {string} serviceType Optional, filter by\n * @param {number} fromBlock Optional, start at block\n * @return {Promise<OrderHistory[]>} transactionHash of the payment\n */\n public async getOrderHistory(\n account: Account,\n serviceType?: string,\n fromBlock?: number\n ): Promise<Order[]> {\n const results: Order[] = []\n const address = account.getId().toLowerCase()\n const { datatokens } = this.ocean\n const topic1 = '0x000000000000000000000000' + address.substring(2)\n const topic0 = datatokens.getStartOrderEventSignature()\n const events = await this.web3.eth.getPastLogs({\n topics: [topic0, null, topic1],\n fromBlock: fromBlock || 0,\n toBlock: 'latest'\n })\n\n for (let i = 0; i < events.length; i++) {\n const order: Order = {\n dtAddress: events[i].address,\n timestamp: 0,\n transactionHash: events[i].transactionHash,\n amount: null,\n consumer: '0x' + events[i].topics[1].substring(events[i].topics[1].length - 40),\n payer: '0x' + events[i].topics[2].substring(events[i].topics[2].length - 40)\n }\n try {\n const params = this.web3.eth.abi.decodeParameters(\n ['uint256', 'uint256', 'uint256', 'uint256'],\n events[i].data\n )\n order.serviceId = parseInt(params[1])\n order.timestamp = parseInt(params[2])\n order.amount = this.web3.utils.fromWei(params[0])\n order.did = didPrefixed(didNoZeroX(order.dtAddress))\n const service = await this.getServiceByIndex(order.did, order.serviceId)\n order.serviceType = service.type\n if (!serviceType || (serviceType && serviceType === service.type))\n results.push(order)\n } catch (e) {}\n }\n return results\n }\n\n /**\n *\n * @param {DDO} ddo\n * @param {consumer} string\n * @return {Promise<Consumable>}\n */\n public async isConsumable(\n ddo: DDO,\n consumer?: string,\n credentialsType?: string,\n authService?: string\n ): Promise<Consumable> {\n if (!ddo) throw new Error('ERROR: DDO does not exist')\n const allowedConsume = { status: 0, message: 'All good', result: true }\n const orderDisabled = {\n status: 1,\n message: 'Ordering this asset has been temporarily disabled by the publisher.',\n result: false\n }\n const denyConsume = {\n status: 2,\n message: 'Consume access is denied.',\n result: false\n }\n\n const metadata = ddo.findServiceByType('metadata')\n if (metadata.attributes.status?.isOrderDisabled) return orderDisabled\n\n const config = this.instanceConfig\n if (consumer && config?.config?.rbacUri) {\n const eventAccessControl = await EventAccessControl.getInstance(this.instanceConfig)\n const isPermit = await eventAccessControl.isPermit(\n 'market',\n 'consume',\n authService,\n consumer,\n credentialsType,\n ddo.id\n )\n if (!isPermit) return denyConsume\n }\n return allowedConsume\n }\n\n /**\n * Validate custom user parameters (user & algorithms)\n * @param {ServiceCustomParameter[]} serviceCustomParameters\n * @param {UserCustomParameters} userCustomParameters\n * @return {Promise<Boolean>}\n */\n public async isUserCustomParametersValid(\n serviceCustomParameters: ServiceCustomParameter[],\n userCustomParameters?: UserCustomParameters\n ): Promise<boolean> {\n if (serviceCustomParameters)\n for (const data of serviceCustomParameters) {\n const keyname = data.name\n if (data.required && (!userCustomParameters || !userCustomParameters[keyname])) {\n this.logger.error('Missing key: ' + keyname + ' from customData')\n return false\n }\n }\n return true\n }\n}\n","import metadata from '../metadata.json'\n\nimport { Instantiable, InstantiableConfig } from '../Instantiable.abstract'\n\nexport enum OceanPlatformTechStatus {\n Loading = 'Loading',\n Unknown = 'Unknown',\n Stopped = 'Stopped',\n Working = 'Working'\n}\n\nexport interface OceanPlatformTech {\n name: string\n version?: string\n commit?: string\n status: OceanPlatformTechStatus\n}\n\nexport interface OceanPlatformVersions {\n lib: OceanPlatformTech\n metadataCache: OceanPlatformTech\n provider: OceanPlatformTech\n status: {\n ok: boolean\n }\n}\n\n/**\n * Versions submodule of Ocean Protocol.\n */\nexport class Versions extends Instantiable {\n /**\n * Returns the instance of Ocean Stack Versions.\n * @return {Promise<Versions>}\n */\n public static async getInstance(config: InstantiableConfig): Promise<Versions> {\n const instance = new Versions()\n instance.setInstanceConfig(config)\n return instance\n }\n\n public async get(): Promise<OceanPlatformVersions> {\n const versions = {} as OceanPlatformVersions\n\n versions.lib = {\n name: 'Lib',\n version: metadata.version,\n commit: metadata.commit,\n status: OceanPlatformTechStatus.Working\n }\n\n // MetadataCache\n try {\n const { software: name, version } = await this.ocean.metadataCache.getVersionInfo()\n versions.metadataCache = {\n name,\n status: OceanPlatformTechStatus.Working,\n version\n }\n } catch {\n versions.metadataCache = {\n name: 'MetadataCache',\n status: OceanPlatformTechStatus.Stopped\n }\n }\n\n // Status\n const techs: OceanPlatformTech[] = Object.values(versions as any)\n\n versions.status = {\n ok: !techs.find(({ status }) => status !== OceanPlatformTechStatus.Working)\n }\n\n return versions\n }\n}\n","/*\n This file is part of web3.js.\n\n web3.js is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n web3.js is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with web3.js. If not, see <http://www.gnu.org/licenses/>.\n */\n/**\n * @file soliditySha3.js\n * @author Fabian Vogelsteller <fabian@ethereum.org>\n * @date 2017\n */\nvar BN = require('bn.js');\nvar utils = require('./utils.js');\nvar _elementaryName = function (name) {\n /*jshint maxcomplexity:false */\n if (name.startsWith('int[')) {\n return 'int256' + name.slice(3);\n }\n else if (name === 'int') {\n return 'int256';\n }\n else if (name.startsWith('uint[')) {\n return 'uint256' + name.slice(4);\n }\n else if (name === 'uint') {\n return 'uint256';\n }\n else if (name.startsWith('fixed[')) {\n return 'fixed128x128' + name.slice(5);\n }\n else if (name === 'fixed') {\n return 'fixed128x128';\n }\n else if (name.startsWith('ufixed[')) {\n return 'ufixed128x128' + name.slice(6);\n }\n else if (name === 'ufixed') {\n return 'ufixed128x128';\n }\n return name;\n};\n// Parse N from type<N>\nvar _parseTypeN = function (type) {\n var typesize = /^\\D+(\\d+).*$/.exec(type);\n return typesize ? parseInt(typesize[1], 10) : null;\n};\n// Parse N from type[<N>]\nvar _parseTypeNArray = function (type) {\n var arraySize = /^\\D+\\d*\\[(\\d+)\\]$/.exec(type);\n return arraySize ? parseInt(arraySize[1], 10) : null;\n};\nvar _parseNumber = function (arg) {\n var type = typeof arg;\n if (type === 'string') {\n if (utils.isHexStrict(arg)) {\n return new BN(arg.replace(/0x/i, ''), 16);\n }\n else {\n return new BN(arg, 10);\n }\n }\n else if (type === 'number') {\n return new BN(arg);\n }\n else if (utils.isBigNumber(arg)) {\n return new BN(arg.toString(10));\n }\n else if (utils.isBN(arg)) {\n return arg;\n }\n else {\n throw new Error(arg + ' is not a number');\n }\n};\nvar _solidityPack = function (type, value, arraySize) {\n /*jshint maxcomplexity:false */\n var size, num;\n type = _elementaryName(type);\n if (type === 'bytes') {\n if (value.replace(/^0x/i, '').length % 2 !== 0) {\n throw new Error('Invalid bytes characters ' + value.length);\n }\n return value;\n }\n else if (type === 'string') {\n return utils.utf8ToHex(value);\n }\n else if (type === 'bool') {\n return value ? '01' : '00';\n }\n else if (type.startsWith('address')) {\n if (arraySize) {\n size = 64;\n }\n else {\n size = 40;\n }\n if (!utils.isAddress(value)) {\n throw new Error(value + ' is not a valid address, or the checksum is invalid.');\n }\n return utils.leftPad(value.toLowerCase(), size);\n }\n size = _parseTypeN(type);\n if (type.startsWith('bytes')) {\n if (!size) {\n throw new Error('bytes[] not yet supported in solidity');\n }\n // must be 32 byte slices when in an array\n if (arraySize) {\n size = 32;\n }\n if (size < 1 || size > 32 || size < value.replace(/^0x/i, '').length / 2) {\n throw new Error('Invalid bytes' + size + ' for ' + value);\n }\n return utils.rightPad(value, size * 2);\n }\n else if (type.startsWith('uint')) {\n if ((size % 8) || (size < 8) || (size > 256)) {\n throw new Error('Invalid uint' + size + ' size');\n }\n num = _parseNumber(value);\n if (num.bitLength() > size) {\n throw new Error('Supplied uint exceeds width: ' + size + ' vs ' + num.bitLength());\n }\n if (num.lt(new BN(0))) {\n throw new Error('Supplied uint ' + num.toString() + ' is negative');\n }\n return size ? utils.leftPad(num.toString('hex'), size / 8 * 2) : num;\n }\n else if (type.startsWith('int')) {\n if ((size % 8) || (size < 8) || (size > 256)) {\n throw new Error('Invalid int' + size + ' size');\n }\n num = _parseNumber(value);\n if (num.bitLength() > size) {\n throw new Error('Supplied int exceeds width: ' + size + ' vs ' + num.bitLength());\n }\n if (num.lt(new BN(0))) {\n return num.toTwos(size).toString('hex');\n }\n else {\n return size ? utils.leftPad(num.toString('hex'), size / 8 * 2) : num;\n }\n }\n else {\n // FIXME: support all other types\n throw new Error('Unsupported or invalid type: ' + type);\n }\n};\nvar _processSolidityEncodePackedArgs = function (arg) {\n /*jshint maxcomplexity:false */\n if (Array.isArray(arg)) {\n throw new Error('Autodetection of array types is not supported.');\n }\n var type, value = '';\n var hexArg, arraySize;\n // if type is given\n if (!!arg && typeof arg === 'object' && (arg.hasOwnProperty('v') || arg.hasOwnProperty('t') || arg.hasOwnProperty('value') || arg.hasOwnProperty('type'))) {\n type = arg.hasOwnProperty('t') ? arg.t : arg.type;\n value = arg.hasOwnProperty('v') ? arg.v : arg.value;\n // otherwise try to guess the type\n }\n else {\n type = utils.toHex(arg, true);\n value = utils.toHex(arg);\n if (!type.startsWith('int') && !type.startsWith('uint')) {\n type = 'bytes';\n }\n }\n if ((type.startsWith('int') || type.startsWith('uint')) && typeof value === 'string' && !/^(-)?0x/i.test(value)) {\n value = new BN(value);\n }\n // get the array size\n if (Array.isArray(value)) {\n arraySize = _parseTypeNArray(type);\n if (arraySize && value.length !== arraySize) {\n throw new Error(type + ' is not matching the given array ' + JSON.stringify(value));\n }\n else {\n arraySize = value.length;\n }\n }\n if (Array.isArray(value)) {\n hexArg = value.map(function (val) {\n return _solidityPack(type, val, arraySize).toString('hex').replace('0x', '');\n });\n return hexArg.join('');\n }\n else {\n hexArg = _solidityPack(type, value, arraySize);\n return hexArg.toString('hex').replace('0x', '');\n }\n};\n/**\n * Hashes solidity values to a sha3 hash using keccak 256\n *\n * @method soliditySha3\n * @return {Object} the sha3\n */\nvar soliditySha3 = function () {\n /*jshint maxcomplexity:false */\n var args = Array.prototype.slice.call(arguments);\n var hexArgs = args.map(_processSolidityEncodePackedArgs);\n // console.log(args, hexArgs);\n // console.log('0x'+ hexArgs.join(''));\n return utils.sha3('0x' + hexArgs.join(''));\n};\n/**\n * Hashes solidity values to a sha3 hash using keccak 256 but does return the hash of value `null` instead of `null`\n *\n * @method soliditySha3Raw\n * @return {Object} the sha3\n */\nvar soliditySha3Raw = function () {\n return utils.sha3Raw('0x' + Array.prototype.slice.call(arguments).map(_processSolidityEncodePackedArgs).join(''));\n};\n/**\n * Encode packed args to hex\n *\n * @method encodePacked\n * @return {String} the hex encoded arguments\n */\nvar encodePacked = function () {\n /*jshint maxcomplexity:false */\n var args = Array.prototype.slice.call(arguments);\n var hexArgs = args.map(_processSolidityEncodePackedArgs);\n return '0x' + hexArgs.join('').toLowerCase();\n};\nmodule.exports = {\n soliditySha3: soliditySha3,\n soliditySha3Raw: soliditySha3Raw,\n encodePacked: encodePacked\n};\n","module.exports = require('crypto').randomBytes\n","/*\n This file is part of web3.js.\n\n web3.js is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n web3.js is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with web3.js. If not, see <http://www.gnu.org/licenses/>.\n */\n/**\n * @file utils.js\n * @author Marek Kotewicz <marek@parity.io>\n * @author Fabian Vogelsteller <fabian@ethereum.org>\n * @date 2017\n */\nvar ethjsUnit = require('ethjs-unit');\nvar utils = require('./utils.js');\nvar soliditySha3 = require('./soliditySha3.js');\nvar randombytes = require('randombytes');\nvar BN = require('bn.js');\n/**\n * Fires an error in an event emitter and callback and returns the eventemitter\n *\n * @method _fireError\n * @param {Object} error a string, a error, or an object with {message, data}\n * @param {Object} emitter\n * @param {Function} reject\n * @param {Function} callback\n * @param {any} optionalData\n * @return {Object} the emitter\n */\nvar _fireError = function (error, emitter, reject, callback, optionalData) {\n /*jshint maxcomplexity: 10 */\n // add data if given\n if (!!error && typeof error === 'object' && !(error instanceof Error) && error.data) {\n if (!!error.data && typeof error.data === 'object' || Array.isArray(error.data)) {\n error.data = JSON.stringify(error.data, null, 2);\n }\n error = error.message + \"\\n\" + error.data;\n }\n if (typeof error === 'string') {\n error = new Error(error);\n }\n if (typeof callback === 'function') {\n callback(error, optionalData);\n }\n if (typeof reject === 'function') {\n // suppress uncatched error if an error listener is present\n // OR suppress uncatched error if an callback listener is present\n if (emitter &&\n (typeof emitter.listeners === 'function' &&\n emitter.listeners('error').length) || typeof callback === 'function') {\n emitter.catch(function () { });\n }\n // reject later, to be able to return emitter\n setTimeout(function () {\n reject(error);\n }, 1);\n }\n if (emitter && typeof emitter.emit === 'function') {\n // emit later, to be able to return emitter\n setTimeout(function () {\n emitter.emit('error', error, optionalData);\n emitter.removeAllListeners();\n }, 1);\n }\n return emitter;\n};\n/**\n * Should be used to create full function/event name from json abi\n *\n * @method _jsonInterfaceMethodToString\n * @param {Object} json\n * @return {String} full function/event name\n */\nvar _jsonInterfaceMethodToString = function (json) {\n if (!!json && typeof json === 'object' && json.name && json.name.indexOf('(') !== -1) {\n return json.name;\n }\n return json.name + '(' + _flattenTypes(false, json.inputs).join(',') + ')';\n};\n/**\n * Should be used to flatten json abi inputs/outputs into an array of type-representing-strings\n *\n * @method _flattenTypes\n * @param {bool} includeTuple\n * @param {Object} puts\n * @return {Array} parameters as strings\n */\nvar _flattenTypes = function (includeTuple, puts) {\n // console.log(\"entered _flattenTypes. inputs/outputs: \" + puts)\n var types = [];\n puts.forEach(function (param) {\n if (typeof param.components === 'object') {\n if (param.type.substring(0, 5) !== 'tuple') {\n throw new Error('components found but type is not tuple; report on GitHub');\n }\n var suffix = '';\n var arrayBracket = param.type.indexOf('[');\n if (arrayBracket >= 0) {\n suffix = param.type.substring(arrayBracket);\n }\n var result = _flattenTypes(includeTuple, param.components);\n // console.log(\"result should have things: \" + result)\n if (Array.isArray(result) && includeTuple) {\n // console.log(\"include tuple word, and its an array. joining...: \" + result.types)\n types.push('tuple(' + result.join(',') + ')' + suffix);\n }\n else if (!includeTuple) {\n // console.log(\"don't include tuple, but its an array. joining...: \" + result)\n types.push('(' + result.join(',') + ')' + suffix);\n }\n else {\n // console.log(\"its a single type within a tuple: \" + result.types)\n types.push('(' + result + ')');\n }\n }\n else {\n // console.log(\"its a type and not directly in a tuple: \" + param.type)\n types.push(param.type);\n }\n });\n return types;\n};\n/**\n * Returns a random hex string by the given bytes size\n *\n * @param {Number} size\n * @returns {string}\n */\nvar randomHex = function (size) {\n return '0x' + randombytes(size).toString('hex');\n};\n/**\n * Should be called to get ascii from it's hex representation\n *\n * @method hexToAscii\n * @param {String} hex\n * @returns {String} ascii string representation of hex value\n */\nvar hexToAscii = function (hex) {\n if (!utils.isHexStrict(hex))\n throw new Error('The parameter must be a valid HEX string.');\n var str = \"\";\n var i = 0, l = hex.length;\n if (hex.substring(0, 2) === '0x') {\n i = 2;\n }\n for (; i < l; i += 2) {\n var code = parseInt(hex.substr(i, 2), 16);\n str += String.fromCharCode(code);\n }\n return str;\n};\n/**\n * Should be called to get hex representation (prefixed by 0x) of ascii string\n *\n * @method asciiToHex\n * @param {String} str\n * @returns {String} hex representation of input string\n */\nvar asciiToHex = function (str) {\n if (!str)\n return \"0x00\";\n var hex = \"\";\n for (var i = 0; i < str.length; i++) {\n var code = str.charCodeAt(i);\n var n = code.toString(16);\n hex += n.length < 2 ? '0' + n : n;\n }\n return \"0x\" + hex;\n};\n/**\n * Returns value of unit in Wei\n *\n * @method getUnitValue\n * @param {String} unit the unit to convert to, default ether\n * @returns {BN} value of the unit (in Wei)\n * @throws error if the unit is not correct:w\n */\nvar getUnitValue = function (unit) {\n unit = unit ? unit.toLowerCase() : 'ether';\n if (!ethjsUnit.unitMap[unit]) {\n throw new Error('This unit \"' + unit + '\" doesn\\'t exist, please use the one of the following units' + JSON.stringify(ethjsUnit.unitMap, null, 2));\n }\n return unit;\n};\n/**\n * Takes a number of wei and converts it to any other ether unit.\n *\n * Possible units are:\n * SI Short SI Full Effigy Other\n * - kwei femtoether babbage\n * - mwei picoether lovelace\n * - gwei nanoether shannon nano\n * - -- microether szabo micro\n * - -- milliether finney milli\n * - ether -- --\n * - kether -- grand\n * - mether\n * - gether\n * - tether\n *\n * @method fromWei\n * @param {Number|String} number can be a number, number string or a HEX of a decimal\n * @param {String} unit the unit to convert to, default ether\n * @return {String|Object} When given a BN object it returns one as well, otherwise a number\n */\nvar fromWei = function (number, unit) {\n unit = getUnitValue(unit);\n if (!utils.isBN(number) && !(typeof number === 'string')) {\n throw new Error('Please pass numbers as strings or BN objects to avoid precision errors.');\n }\n return utils.isBN(number) ? ethjsUnit.fromWei(number, unit) : ethjsUnit.fromWei(number, unit).toString(10);\n};\n/**\n * Takes a number of a unit and converts it to wei.\n *\n * Possible units are:\n * SI Short SI Full Effigy Other\n * - kwei femtoether babbage\n * - mwei picoether lovelace\n * - gwei nanoether shannon nano\n * - -- microether szabo micro\n * - -- microether szabo micro\n * - -- milliether finney milli\n * - ether -- --\n * - kether -- grand\n * - mether\n * - gether\n * - tether\n *\n * @method toWei\n * @param {Number|String|BN} number can be a number, number string or a HEX of a decimal\n * @param {String} unit the unit to convert from, default ether\n * @return {String|Object} When given a BN object it returns one as well, otherwise a number\n */\nvar toWei = function (number, unit) {\n unit = getUnitValue(unit);\n if (!utils.isBN(number) && !(typeof number === 'string')) {\n throw new Error('Please pass numbers as strings or BN objects to avoid precision errors.');\n }\n return utils.isBN(number) ? ethjsUnit.toWei(number, unit) : ethjsUnit.toWei(number, unit).toString(10);\n};\n/**\n * Converts to a checksum address\n *\n * @method toChecksumAddress\n * @param {String} address the given HEX address\n * @return {String}\n */\nvar toChecksumAddress = function (address) {\n if (typeof address === 'undefined')\n return '';\n if (!/^(0x)?[0-9a-f]{40}$/i.test(address))\n throw new Error('Given address \"' + address + '\" is not a valid Ethereum address.');\n address = address.toLowerCase().replace(/^0x/i, '');\n var addressHash = utils.sha3(address).replace(/^0x/i, '');\n var checksumAddress = '0x';\n for (var i = 0; i < address.length; i++) {\n // If ith character is 8 to f then make it uppercase\n if (parseInt(addressHash[i], 16) > 7) {\n checksumAddress += address[i].toUpperCase();\n }\n else {\n checksumAddress += address[i];\n }\n }\n return checksumAddress;\n};\n/**\n * Returns -1 if a<b, 1 if a>b; 0 if a == b.\n * For more details on this type of function, see\n * developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort\n *\n * @method compareBlockNumbers\n *\n * @param {String|Number|BN} a\n *\n * @param {String|Number|BN} b\n *\n * @returns {Number} -1, 0, or 1\n */\nvar compareBlockNumbers = function (a, b) {\n if (a == b) {\n return 0;\n }\n else if ((\"genesis\" == a || \"earliest\" == a || 0 == a) && (\"genesis\" == b || \"earliest\" == b || 0 == b)) {\n return 0;\n }\n else if (\"genesis\" == a || \"earliest\" == a) {\n // b !== a, thus a < b\n return -1;\n }\n else if (\"genesis\" == b || \"earliest\" == b) {\n // b !== a, thus a > b\n return 1;\n }\n else if (a == \"latest\") {\n if (b == \"pending\") {\n return -1;\n }\n else {\n // b !== (\"pending\" OR \"latest\"), thus a > b\n return 1;\n }\n }\n else if (b === \"latest\") {\n if (a == \"pending\") {\n return 1;\n }\n else {\n // b !== (\"pending\" OR \"latest\"), thus a > b\n return -1;\n }\n }\n else if (a == \"pending\") {\n // b (== OR <) \"latest\", thus a > b\n return 1;\n }\n else if (b == \"pending\") {\n return -1;\n }\n else {\n let bnA = new BN(a);\n let bnB = new BN(b);\n if (bnA.lt(bnB)) {\n return -1;\n }\n else if (bnA.eq(bnB)) {\n return 0;\n }\n else {\n return 1;\n }\n }\n};\nmodule.exports = {\n _fireError: _fireError,\n _jsonInterfaceMethodToString: _jsonInterfaceMethodToString,\n _flattenTypes: _flattenTypes,\n // extractDisplayName: extractDisplayName,\n // extractTypeName: extractTypeName,\n randomHex: randomHex,\n BN: utils.BN,\n isBN: utils.isBN,\n isBigNumber: utils.isBigNumber,\n isHex: utils.isHex,\n isHexStrict: utils.isHexStrict,\n sha3: utils.sha3,\n sha3Raw: utils.sha3Raw,\n keccak256: utils.sha3,\n soliditySha3: soliditySha3.soliditySha3,\n soliditySha3Raw: soliditySha3.soliditySha3Raw,\n encodePacked: soliditySha3.encodePacked,\n isAddress: utils.isAddress,\n checkAddressChecksum: utils.checkAddressChecksum,\n toChecksumAddress: toChecksumAddress,\n toHex: utils.toHex,\n toBN: utils.toBN,\n bytesToHex: utils.bytesToHex,\n hexToBytes: utils.hexToBytes,\n hexToNumberString: utils.hexToNumberString,\n hexToNumber: utils.hexToNumber,\n toDecimal: utils.hexToNumber,\n numberToHex: utils.numberToHex,\n fromDecimal: utils.numberToHex,\n hexToUtf8: utils.hexToUtf8,\n hexToString: utils.hexToUtf8,\n toUtf8: utils.hexToUtf8,\n stripHexPrefix: utils.stripHexPrefix,\n utf8ToHex: utils.utf8ToHex,\n stringToHex: utils.utf8ToHex,\n fromUtf8: utils.utf8ToHex,\n hexToAscii: hexToAscii,\n toAscii: hexToAscii,\n asciiToHex: asciiToHex,\n fromAscii: asciiToHex,\n unitMap: ethjsUnit.unitMap,\n toWei: toWei,\n fromWei: fromWei,\n padLeft: utils.leftPad,\n leftPad: utils.leftPad,\n padRight: utils.rightPad,\n rightPad: utils.rightPad,\n toTwosComplement: utils.toTwosComplement,\n isBloom: utils.isBloom,\n isUserEthereumAddressInBloom: utils.isUserEthereumAddressInBloom,\n isContractAddressInBloom: utils.isContractAddressInBloom,\n isTopic: utils.isTopic,\n isTopicInBloom: utils.isTopicInBloom,\n isInBloom: utils.isInBloom,\n compareBlockNumbers: compareBlockNumbers,\n toNumber: utils.toNumber\n};\n","import { DDO } from '../ddo/DDO'\nimport { Credentials, Credential, CredentialAction } from '../ddo/interfaces/Credentials'\n\n/**\n * checks if a credential list exists for a specific action\n * @param {credentials} Credentials list of crentials from ddo\n * @param {credentialType} string e.g. address / credential3Box\n * @param {credentialAction} CredentialAction allow or deny\n * @return {boolean}\n */\nexport function checkCredentialExist(\n credentials: Credentials,\n credentialType: string,\n credentialAction: CredentialAction\n): boolean {\n let isExist = false\n if (credentialAction === 'allow') {\n if (credentials && credentials.allow) {\n const allowList = credentials.allow.find(\n (credential) => credential.type === credentialType\n )\n isExist = allowList && allowList.values.length > 0\n }\n return isExist\n } else {\n if (credentials && credentials.deny) {\n const dennyList = credentials.deny.find(\n (credential) => credential.type === credentialType\n )\n isExist = dennyList && dennyList.values.length > 0\n }\n return isExist\n }\n}\n\n/**\n * Removes all credentials of a certain type for a specific action\n * @param {ddo} DDO\n * @param {credentialType} string e.g. address / credential3Box\n * @param {credentialAction} CredentialAction allow or deny\n * @return {DDO}\n */\nexport function removeCredentialDetail(\n ddo: DDO,\n credentialType: string,\n credentialAction: CredentialAction\n): DDO {\n const exists = checkCredentialExist(ddo.credentials, credentialType, credentialAction)\n if (credentialAction === 'allow') {\n if (exists) {\n ddo.credentials.allow = ddo.credentials.allow.filter(\n (credential) => credential.type !== credentialType\n )\n }\n if (ddo.credentials && !ddo.credentials.allow) {\n ddo.credentials = {\n deny: ddo.credentials && ddo.credentials.deny\n }\n }\n } else {\n if (exists) {\n ddo.credentials.deny = ddo.credentials.deny.filter(\n (credential) => credential.type !== credentialType\n )\n }\n if (ddo.credentials && !ddo.credentials.deny) {\n ddo.credentials = {\n allow: ddo.credentials && ddo.credentials.allow\n }\n }\n }\n return ddo\n}\n\n/**\n * Updates credentials of a certain type for a specific action\n * @param {ddo} DDO\n * @param {credentialType} string e.g. address / credential3Box\n * @param {list} string[] list of values\n * @param {credentialAction} CredentialAction allow or deny\n * @return {DDO}\n */\n\nexport function updateCredentialDetail(\n ddo: DDO,\n credentialType: string,\n list: string[],\n credentialAction: CredentialAction\n): DDO {\n const exists = checkCredentialExist(ddo.credentials, credentialType, credentialAction)\n if (credentialAction === 'allow') {\n if (exists) {\n ddo.credentials.allow.find((credential) => {\n if (credential.type === credentialType) {\n credential.values = list\n }\n })\n } else {\n ddo = addCredentialDetail(ddo, credentialType, list, credentialAction)\n }\n } else {\n if (exists) {\n ddo.credentials.deny.find((credential) => {\n if (credential.type === credentialType) {\n credential.values = list\n }\n })\n } else {\n ddo = addCredentialDetail(ddo, credentialType, list, credentialAction)\n }\n }\n return ddo\n}\n\n/**\n * Adds values to credentials of a certain type for a specific action\n * @param {ddo} DDO\n * @param {credentialType} string e.g. address / credential3Box\n * @param {list} string[] list of values\n * @param {credentialAction} CredentialAction allow or deny\n * @return {DDO}\n */\n\nexport function addCredentialDetail(\n ddo: DDO,\n credentialType: string,\n list: string[],\n credentialAction: CredentialAction\n) {\n const newCredentialDetail: Credential = {\n type: credentialType,\n values: list\n }\n if (credentialAction === 'allow') {\n if (ddo.credentials && ddo.credentials.allow) {\n ddo.credentials.allow.push(newCredentialDetail)\n } else {\n const newCredentials: Credentials = {\n allow: [newCredentialDetail],\n deny: ddo.credentials && ddo.credentials.deny\n }\n ddo.credentials = newCredentials\n }\n } else {\n if (ddo.credentials && ddo.credentials.deny) {\n ddo.credentials.deny.push(newCredentialDetail)\n } else {\n const newCredential: Credentials = {\n allow: ddo.credentials && ddo.credentials.allow,\n deny: [newCredentialDetail]\n }\n ddo.credentials = newCredential\n }\n }\n return ddo\n}\n","import { Instantiable, InstantiableConfig } from '../Instantiable.abstract'\n\n/**\n * Provides an interface for Event access control service.\n */\nexport class EventAccessControl extends Instantiable {\n private baseUrl: string\n /**\n * Returns the instance of Event access Control.\n * @return {Promise<EventAccessControl>}\n */\n public static async getInstance(\n config: InstantiableConfig\n ): Promise<EventAccessControl> {\n const instance = new EventAccessControl()\n instance.setInstanceConfig(config)\n await instance.setBaseUrl(config.config?.rbacUri)\n return instance\n }\n\n public async setBaseUrl(url: string) {\n this.baseUrl = url\n }\n\n public get url(): string {\n return this.baseUrl\n }\n\n private getIsPermitArgs(\n component: string,\n eventType: string,\n authService: string,\n credentials: string,\n credentialsType: string,\n did?: string\n ) {\n if (eventType === 'consume') {\n return {\n component,\n eventType,\n authService,\n did,\n credentials: {\n type: credentialsType,\n value: credentials\n }\n }\n }\n return {\n component,\n eventType,\n authService,\n credentials: {\n type: credentialsType,\n value: credentials\n }\n }\n }\n\n public async isPermit(\n component: string,\n eventType: string,\n authService: string,\n credentials: string,\n credentialsType: string,\n did?: string\n ): Promise<boolean> {\n if (!this.url) return true\n const args = this.getIsPermitArgs(\n component,\n eventType,\n authService,\n credentials,\n credentialsType,\n did\n )\n\n try {\n const response = await this.ocean.utils.fetch.post(this.url, JSON.stringify(args))\n let results = await response.json()\n results = JSON.stringify(results)\n return results === 'true'\n } catch (e) {\n this.logger.error(e)\n throw new Error('ERROR: Asset URL not found or not available.')\n }\n }\n}\n","import Web3 from 'web3'\nimport { Logger } from '../../utils'\nimport { Account } from '../../lib'\n\nexport class SignatureUtils {\n private web3: Web3\n private logger: Logger\n\n constructor(web3: Web3, logger: Logger) {\n this.web3 = web3\n this.logger = logger\n }\n\n public async signText(\n text: string,\n publicKey: string,\n password?: string\n ): Promise<string> {\n const isMetaMask =\n this.web3 &&\n this.web3.currentProvider &&\n (this.web3.currentProvider as any).isMetaMask\n try {\n return await this.web3.eth.personal.sign(text, publicKey, password)\n } catch (e) {\n if (isMetaMask) {\n throw e\n }\n this.logger.warn('Error on personal sign.')\n this.logger.warn(e)\n try {\n return await this.web3.eth.sign(text, publicKey)\n } catch (e2) {\n this.logger.error('Error on sign.')\n this.logger.error(e2)\n throw new Error('Error executing personal sign')\n }\n }\n }\n\n public async signWithHash(\n text: string,\n publicKey: string,\n password?: string\n ): Promise<string> {\n const hash = this.web3.utils.utf8ToHex(text)\n const isMetaMask =\n this.web3 &&\n this.web3.currentProvider &&\n (this.web3.currentProvider as any).isMetaMask\n try {\n return await this.web3.eth.personal.sign(hash, publicKey, password)\n } catch (e) {\n if (isMetaMask) {\n throw e\n }\n this.logger.warn('Error on personal sign.')\n this.logger.warn(e)\n try {\n return await this.web3.eth.sign(hash, publicKey)\n } catch (e2) {\n this.logger.error('Error on sign.')\n this.logger.error(e2)\n throw new Error('Error executing personal sign')\n }\n }\n }\n\n public async verifyText(text: string, signature: string): Promise<string> {\n return this.web3.eth.personal.ecRecover(text, signature)\n }\n\n public async getHash(message: string): Promise<string> {\n let hex = ''\n for (let i = 0; i < message.length; i++) {\n hex += '' + message.charCodeAt(i).toString(16)\n }\n const hexMessage = '0x' + hex\n return hexMessage as string\n }\n\n public async signForAquarius(message: string, account: Account): Promise<string> {\n const hash = await this.getHash(message)\n const isMetaMask =\n this.web3 &&\n this.web3.currentProvider &&\n (this.web3.currentProvider as any).isMetaMask\n try {\n return this.web3.eth.personal.sign(hash, account.getId(), account.getPassword())\n } catch (e) {\n if (isMetaMask) {\n throw e\n }\n this.logger.warn('Error on personal sign.')\n this.logger.warn(e)\n return null\n }\n }\n}\n","import { Instantiable, InstantiableConfig } from '../../Instantiable.abstract'\n\nimport { SignatureUtils } from './SignatureUtils'\nimport { WebServiceConnector } from './WebServiceConnector'\n/**\n * Utils internal submodule of Ocean Protocol.\n */\nexport class OceanUtils extends Instantiable {\n /**\n * Returns the instance of OceanUtils.\n * @return {Promise<OceanUtils>}\n */\n public static async getInstance(config: InstantiableConfig): Promise<OceanUtils> {\n const instance = new OceanUtils()\n instance.setInstanceConfig(config)\n\n instance.signature = new SignatureUtils(config.web3, config.logger)\n instance.fetch = new WebServiceConnector(config.logger, config.config?.requestTimeout)\n\n return instance\n }\n\n /**\n * Signature utils.\n * @type {SignatureUtils}\n */\n public signature: SignatureUtils\n\n /**\n * Fetch utils.\n * @type {WebServiceConnector}\n */\n public fetch: WebServiceConnector\n}\n","import { DDO } from '../ddo/DDO'\nimport DID from '../ocean/DID'\nimport { Logger, isDdo } from '../utils'\nimport { WebServiceConnector } from '../ocean/utils/WebServiceConnector'\nimport { Response } from 'node-fetch'\nimport { Metadata, ValidateMetadata } from '../ddo/interfaces'\nimport { fetch as fetchLibrary } from 'cross-fetch'\n\nconst apiPath = '/api/v1/aquarius/assets/ddo'\n\nexport interface SearchQuery {\n from?: number\n size?: number\n query: {\n match?: {\n [property: string]:\n | string\n | number\n | boolean\n | Record<string, string | number | boolean>\n }\n // eslint-disable-next-line camelcase\n query_string?: {\n [property: string]: string | number | string[] | number[] | boolean\n }\n // eslint-disable-next-line camelcase\n simple_query_string?: {\n [property: string]: string | number | string[] | number[] | boolean\n }\n }\n sort?: { [jsonPath: string]: string }\n}\n\n/**\n * Provides an interface with Metadata Cache.\n * Metadata Cache provides an off-chain database cache for on-chain metadata about data assets.\n */\nexport class MetadataCache {\n public fetch: WebServiceConnector\n private logger: Logger\n private metadataCacheUri: string\n\n private get url() {\n return this.metadataCacheUri\n }\n\n /**\n * Instantiate Metadata Cache (independently of Ocean) for off-chain interaction.\n * @param {String} metadataCacheUri\n * @param {Logger} logger\n */\n constructor(metadataCacheUri: string, logger: Logger, requestTimeout?: number) {\n this.fetch = new WebServiceConnector(logger, requestTimeout)\n this.logger = logger\n this.metadataCacheUri = metadataCacheUri\n }\n\n public async getVersionInfo(): Promise<any> {\n return (await this.fetch.get(this.url)).json()\n }\n\n public async getAccessUrl(accessToken: any, payload: any): Promise<string> {\n const accessUrl: string = await this.fetch\n .post(`${accessToken.service_endpoint}/${accessToken.resource_id}`, payload)\n .then((response: Response) => {\n if (response.ok) {\n return response.text()\n }\n this.logger.error('Failed: ', response.status, response.statusText)\n return null\n })\n .then((consumptionUrl: string): string => {\n this.logger.error('Success accessing consume endpoint: ', consumptionUrl)\n return consumptionUrl\n })\n .catch((error) => {\n this.logger.error('Error fetching the data asset consumption url: ', error)\n return null\n })\n\n return accessUrl\n }\n\n /**\n * Search over the DDOs using a query.\n * @param {SearchQuery} query Query to filter the DDOs.\n * @return {Promise<QueryResult>}\n */\n public async queryMetadata(query: SearchQuery): Promise<any> {\n const result = await this.fetch\n .post(`${this.url}/api/v1/aquarius/assets/query`, JSON.stringify(query))\n .then((response: Response) => {\n if (response.ok) {\n return response.json()\n }\n this.logger.error('queryMetadata failed:', response.status, response.statusText)\n return null\n })\n .then((results) => {\n return results\n })\n .catch((error) => {\n this.logger.error('Error fetching querying metadata: ', error)\n return null\n })\n\n return result\n }\n\n /**\n * Encrypts a DDO\n * @param {any} ddo bytes to be encrypted.\n * @return {Promise<String>} Hex encoded encrypted DDO.\n */\n public async encryptDDO(ddo: any): Promise<any> {\n const fullUrl = `${this.url}/api/v1/aquarius/assets/ddo/encryptashex `\n const result = await this.fetch\n .postWithOctet(fullUrl, ddo)\n .then((response: Response) => {\n if (response.ok) {\n return response.text()\n }\n this.logger.error('encryptDDO failed:', response.status, response.statusText, ddo)\n return null\n })\n .catch((error) => {\n this.logger.error('Error encryptDDO: ', error)\n return null\n })\n\n return result\n }\n\n /**\n * Validate Metadata\n * @param {Metadata} metadata metadata to be validated. If it's a Metadata, it will be validated agains the local schema. Else, it's validated agains the remote schema\n * @return {Promise<Boolean|Object>} Result.\n */\n\n public async validateMetadata(metadata: Metadata | DDO): Promise<ValidateMetadata> {\n const status: ValidateMetadata = {\n valid: false\n }\n const path = isDdo(metadata) ? '/validate-remote' : '/validate'\n try {\n const response = await this.fetch.post(\n `${this.url}${apiPath}${path}`,\n JSON.stringify(metadata)\n )\n if (response.ok) {\n const errors = await response.json()\n if (errors === true) status.valid = true\n else status.errors = errors\n } else {\n this.logger.error(\n 'validate Metadata failed:',\n response.status,\n response.statusText\n )\n }\n } catch (error) {\n this.logger.error('Error validating metadata: ', error)\n }\n return status\n }\n\n /**\n * Retrieves a DDO by DID.\n * @param {DID | string} did DID of the asset.\n * @return {Promise<DDO>} DDO of the asset.\n */\n public async retrieveDDO(\n did: DID | string,\n metadataServiceEndpoint?: string\n ): Promise<DDO> {\n did = did && DID.parse(did)\n const fullUrl = metadataServiceEndpoint || `${this.url}${apiPath}/${did.getDid()}`\n const result = await this.fetch\n .get(fullUrl)\n .then((response: Response) => {\n if (response.ok) {\n return response.json()\n }\n this.logger.log('retrieveDDO failed:', response.status, response.statusText, did)\n return null as DDO\n })\n .then((response: DDO) => {\n return new DDO(response) as DDO\n })\n .catch((error) => {\n this.logger.error('Error fetching querying metadata: ', error)\n return null as DDO\n })\n\n return result\n }\n\n public async retrieveDDOByUrl(metadataServiceEndpoint?: string): Promise<DDO> {\n return this.retrieveDDO(undefined, metadataServiceEndpoint)\n }\n\n public getServiceEndpoint(did: DID): string {\n return `${this.url}/api/v1/aquarius/assets/ddo/did:op:${did.getId()}`\n }\n\n public getURI(): string {\n return `${this.url}`\n }\n\n /**\n * Simple blocking sleep function\n */\n public sleep(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms)\n })\n }\n\n /**\n * Blocks until Aqua will cache the did (or the update for that did) or timeouts\n * @param {string} did DID of the asset.\n * @param {string} txid used when the did exists and we expect an update with that txid.\n * @return {Promise<DDO>} DDO of the asset.\n */\n public async waitForAqua(did: string, txid?: string) {\n const apiPath = '/api/v1/aquarius/assets/ddo'\n let tries = 0\n do {\n try {\n const result = await fetchLibrary(this.getURI() + apiPath + '/' + did)\n if (result.ok) {\n if (txid) {\n // check tx\n const ddo = await result.json()\n if (ddo.event && ddo.event.txid === txid) break\n } else break\n }\n } catch (e) {\n // do nothing\n }\n await this.sleep(1500)\n tries++\n } while (tries < 100)\n }\n}\n","import { DDO } from '../ddo/DDO'\nimport { TransactionReceipt } from 'web3-core'\nimport { Contract } from 'web3-eth-contract'\nimport { AbiItem } from 'web3-utils/types'\nimport Web3 from 'web3'\nimport defaultDDOContractABI from '@oceanprotocol/contracts/artifacts/Metadata.json'\nimport { didZeroX, Logger, getFairGasPrice, setContractDefaults } from '../utils'\nimport { ConfigHelperConfig } from '../utils/ConfigHelper'\nimport { MetadataCache } from '../metadatacache/MetadataCache'\n// Using limited, compress-only version\n// See https://github.com/LZMA-JS/LZMA-JS#but-i-dont-want-to-use-web-workers\nimport { LZMA } from 'lzma/src/lzma-c'\nimport { Response } from 'node-fetch'\n\nexport interface rawMetadata {\n flags: number\n data: any\n}\n/**\n * Provides an interface with Metadata Cache.\n * Metadata Cache provides an off-chain database store for metadata about data assets.\n */\nexport class OnChainMetadata {\n public GASLIMIT_DEFAULT = 1000000\n public DDOContractAddress: string\n public DDOContractABI: AbiItem | AbiItem[]\n public web3: Web3\n public DDOContract: Contract = null\n private logger: Logger\n public metadataCache: MetadataCache\n private config: ConfigHelperConfig\n /**\n * Instantiate OnChainMetadata Store for on-chain interaction.\n */\n constructor(\n web3: Web3,\n logger: Logger,\n DDOContractAddress: string = null,\n DDOContractABI: AbiItem | AbiItem[] = null,\n metadataCache: MetadataCache,\n config?: ConfigHelperConfig\n ) {\n this.web3 = web3\n this.config = config\n this.DDOContractAddress = DDOContractAddress\n this.DDOContractABI = DDOContractABI || (defaultDDOContractABI.abi as AbiItem[])\n if (web3)\n this.DDOContract = setContractDefaults(\n new this.web3.eth.Contract(this.DDOContractABI, this.DDOContractAddress),\n this.config\n )\n this.logger = logger\n this.metadataCache = metadataCache\n }\n\n /**\n * Compress DDO using xz/lzma2\n */\n\n public async compressDDO(data: any): Promise<string> {\n // see https://github.com/LZMA-JS/LZMA-JS/issues/44\n LZMA.disableEndMark = true\n const compressed = LZMA.compress(data, 9)\n // return this.getHex(compressed)\n return compressed\n }\n\n /**\n * Publish a new DDO\n * @param {String} did\n * @param {DDO} ddo\n * @param {String} consumerAccount\n * @param {Boolean} encrypt If the DDO should be encrypted\n * @param {Boolean} validate If the DDO should be validated against Aqua prior to publish\n * @return {Promise<TransactionReceipt>} exchangeId\n */\n public async publish(\n did: string,\n ddo: DDO,\n consumerAccount: string,\n encrypt: boolean = false,\n validate: boolean = true\n ): Promise<TransactionReceipt> {\n if (validate) {\n const valid = await this.metadataCache.validateMetadata(ddo)\n if (!valid.valid) {\n throw new Error(`DDO has failed validation`)\n }\n }\n const rawData = await this.prepareRawData(ddo, encrypt)\n if (!rawData) {\n throw new Error(`Could not prepare raw data for publish`)\n } else\n return this.publishRaw(didZeroX(did), rawData.flags, rawData.data, consumerAccount)\n }\n\n /**\n * Update DDO\n * @param {String} did\n * @param {DDO} ddo\n * @param {String} consumerAccount\n * @param {Boolean} encrypt If the DDO should be encrypted\n * @param {Boolean} validate If the DDO should be validated against Aqua prior to publish\n * @return {Promise<TransactionReceipt>} exchangeId\n */\n public async update(\n did: string,\n ddo: DDO,\n consumerAccount: string,\n encrypt: boolean = false,\n validate: boolean = true\n ): Promise<TransactionReceipt> {\n if (validate) {\n const valid = await this.metadataCache.validateMetadata(ddo)\n if (!valid.valid) {\n throw new Error(`DDO has failed validation`)\n }\n }\n const rawData = await this.prepareRawData(ddo, encrypt)\n if (!rawData) {\n throw new Error(`Could not prepare raw data for udate`)\n } else\n return this.updateRaw(didZeroX(did), rawData.flags, rawData.data, consumerAccount)\n }\n\n /**\n * Prepare onchain data\n * @param {Any} ddo\n * @param {Boolean} encrypt Should encrypt the ddo\n * @return {Promise<rawMetadata>} Raw metadata bytes\n */\n public async prepareRawData(ddo: DDO, encrypt: boolean = false): Promise<rawMetadata> {\n let flags = 0\n let data = DDO.serialize(ddo)\n if (encrypt === false) {\n data = await this.compressDDO(data)\n flags = flags | 1\n data = this.getHex(data)\n } else {\n data = await this.metadataCache.encryptDDO(data)\n if (!data) return null\n flags = flags | 2\n }\n return { flags, data } as rawMetadata\n }\n\n /**\n * Raw publish ddo\n * @param {String} did\n * @param {Any} flags\n * @param {Any} ddo\n * @param {String} consumerAccount\n * @return {Promise<TransactionReceipt>} exchangeId\n */\n public async publishRaw(\n did: string,\n flags: any,\n data: any,\n consumerAccount: string\n ): Promise<TransactionReceipt> {\n if (!this.DDOContract) {\n this.logger.error('ERROR: Missing DDOContract')\n return null\n }\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await this.DDOContract.methods\n .create(didZeroX(did), flags, data)\n .estimateGas({ from: consumerAccount }, (err, estGas) =>\n err ? gasLimitDefault : estGas\n )\n } catch (e) {\n estGas = gasLimitDefault\n }\n try {\n const trxReceipt = await this.DDOContract.methods\n .create(didZeroX(did), flags, data)\n .send({\n from: consumerAccount,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n return trxReceipt\n } catch (e) {\n this.logger.error(`ERROR: Failed to publish raw DDO : ${e.message}`)\n return null\n }\n }\n\n /**\n * Raw update of a ddo\n * @param {String} did\n * @param {Any} flags\n * @param {Any} ddo\n * @param {String} consumerAccount\n * @return {Promise<TransactionReceipt>} exchangeId\n */\n public async updateRaw(\n did: string,\n flags: any,\n data: any,\n consumerAccount: string\n ): Promise<TransactionReceipt> {\n if (!this.DDOContract) {\n this.logger.error('ERROR: Missing DDOContract')\n return null\n }\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await this.DDOContract.methods\n .update(didZeroX(did), flags, data)\n .estimateGas({ from: consumerAccount }, (err, estGas) =>\n err ? gasLimitDefault : estGas\n )\n } catch (e) {\n estGas = gasLimitDefault\n }\n try {\n const trxReceipt = await this.DDOContract.methods\n .update(didZeroX(did), flags, data)\n .send({\n from: consumerAccount,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n return trxReceipt\n } catch (e) {\n this.logger.error(`ERROR: Failed to update raw DDO : ${e.message}`)\n return null\n }\n }\n\n /**\n * Transfer Ownership of a DDO\n * @param {String} did\n * @param {String} newOwner\n * @param {String} consumerAccount\n * @return {Promise<TransactionReceipt>} exchangeId\n */\n public async transferOwnership(\n did: string,\n newOwner: string,\n consumerAccount: string\n ): Promise<TransactionReceipt> {\n if (!this.DDOContract) return null\n try {\n const trxReceipt = await this.DDOContract.methods\n .transferOwnership(didZeroX(did), newOwner)\n .send({\n from: consumerAccount\n })\n return trxReceipt\n } catch (e) {\n this.logger.error(`ERROR: Failed to transfer DDO ownership : ${e.message}`)\n return null\n }\n }\n\n public getHex(message: any) {\n const hexChar = [\n '0',\n '1',\n '2',\n '3',\n '4',\n '5',\n '6',\n '7',\n '8',\n '9',\n 'A',\n 'B',\n 'C',\n 'D',\n 'E',\n 'F'\n ]\n let hex = ''\n try {\n for (let i = 0; i < message.length; i++) {\n hex += '' + hexChar[(message[i] >> 4) & 0x0f] + hexChar[message[i] & 0x0f]\n }\n } catch (e) {\n this.logger.error(`ERROR: Failed to get hex message value : ${e.message}`)\n }\n const hexMessage = '0x' + hex\n return hexMessage\n }\n}\n","import Web3 from 'web3'\nimport { AbiItem } from 'web3-utils/types'\nimport { ConfigHelperConfig } from '../utils/ConfigHelper'\nimport defaultFactoryABI from '@oceanprotocol/contracts/artifacts/DTFactory.json'\nimport defaultDatatokensABI from '@oceanprotocol/contracts/artifacts/DataTokenTemplate.json'\nimport { Logger, getFairGasPrice, setContractDefaults } from '../utils'\nimport { TransactionReceipt } from 'web3-core'\nimport BigNumber from 'bignumber.js'\nimport Decimal from 'decimal.js'\nimport { generateDatatokenName } from '../utils/Datatokens'\n\n/**\n * Provides an interface to DataTokens\n */\nexport class DataTokens {\n public GASLIMIT_DEFAULT = 1000000\n public factoryAddress: string\n public factoryABI: AbiItem | AbiItem[]\n public datatokensABI: AbiItem | AbiItem[]\n public web3: Web3\n private logger: Logger\n public startBlock: number\n private config: ConfigHelperConfig\n /**\n * Instantiate DataTokens (independently of Ocean).\n * @param {String} factoryAddress\n * @param {AbiItem | AbiItem[]} factoryABI\n * @param {AbiItem | AbiItem[]} datatokensABI\n * @param {Web3} web3\n */\n constructor(\n factoryAddress: string,\n factoryABI: AbiItem | AbiItem[],\n datatokensABI: AbiItem | AbiItem[],\n web3: Web3,\n logger: Logger,\n config?: ConfigHelperConfig\n ) {\n this.factoryAddress = factoryAddress\n this.factoryABI = factoryABI || (defaultFactoryABI.abi as AbiItem[])\n this.datatokensABI = datatokensABI || (defaultDatatokensABI.abi as AbiItem[])\n this.web3 = web3\n this.logger = logger\n this.config = config\n this.startBlock = (config && config.startBlock) || 0\n }\n\n /**\n * Generate new datatoken name & symbol from a word list\n * @return {<{ name: String; symbol: String }>} datatoken name & symbol. Produces e.g. \"Endemic Jellyfish Token\" & \"ENDJEL-45\"\n */\n public generateDtName(wordList?: { nouns: string[]; adjectives: string[] }): {\n name: string\n symbol: string\n } {\n const { name, symbol } = generateDatatokenName(wordList)\n return { name, symbol }\n }\n\n /**\n * Create new datatoken\n * @param {String} metadataCacheUri\n * @param {String} address\n * @param {String} cap Maximum cap (Number) - will be converted to wei\n * @param {String} name Token name\n * @param {String} symbol Token symbol\n * @return {Promise<string>} datatoken address\n */\n public async create(\n metadataCacheUri: string,\n address: string,\n cap?: string,\n name?: string,\n symbol?: string\n ): Promise<string> {\n if (!cap) cap = '1000'\n\n // Generate name & symbol if not present\n if (!name || !symbol) {\n ;({ name, symbol } = this.generateDtName())\n }\n\n // Create factory contract object\n const factory = setContractDefaults(\n new this.web3.eth.Contract(this.factoryABI, this.factoryAddress, {\n from: address\n }),\n this.config\n )\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await factory.methods\n .createToken(metadataCacheUri, name, symbol, this.web3.utils.toWei(cap))\n .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n\n // Invoke createToken function of the contract\n const trxReceipt = await factory.methods\n .createToken(metadataCacheUri, name, symbol, this.web3.utils.toWei(cap))\n .send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n\n let tokenAddress = null\n try {\n tokenAddress = trxReceipt.events.TokenCreated.returnValues[0]\n } catch (e) {\n this.logger.error(`ERROR: Failed to create datatoken : ${e.message}`)\n }\n return tokenAddress\n }\n\n /**\n * Approve\n * @param {String} dataTokenAddress\n * @param {String} toAddress\n * @param {string} amount Number of datatokens, as number. Will be converted to wei\n * @param {String} address\n * @return {Promise<TransactionReceipt>} transactionId\n */\n public async approve(\n dataTokenAddress: string,\n spender: string,\n amount: string,\n address: string\n ): Promise<TransactionReceipt> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress, {\n from: address\n }),\n this.config\n )\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await datatoken.methods\n .approve(spender, this.web3.utils.toWei(amount))\n .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n const trxReceipt = await datatoken.methods\n .approve(spender, this.web3.utils.toWei(amount))\n .send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n return trxReceipt\n }\n\n /**\n * Mint\n * @param {String} dataTokenAddress\n * @param {String} address\n * @param {String} amount Number of datatokens, as number. Will be converted to wei\n * @param {String} toAddress - only if toAddress is different from the minter\n * @return {Promise<TransactionReceipt>} transactionId\n */\n public async mint(\n dataTokenAddress: string,\n address: string,\n amount: string,\n toAddress?: string\n ): Promise<TransactionReceipt> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress, {\n from: address\n }),\n this.config\n )\n const capAvailble = await this.getCap(dataTokenAddress)\n if (new Decimal(capAvailble).gte(amount)) {\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await datatoken.methods\n .mint(toAddress || address, this.web3.utils.toWei(amount))\n .estimateGas({ from: address }, (err, estGas) =>\n err ? gasLimitDefault : estGas\n )\n } catch (e) {\n estGas = gasLimitDefault\n }\n const trxReceipt = await datatoken.methods\n .mint(toAddress || address, this.web3.utils.toWei(amount))\n .send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n return trxReceipt\n } else {\n throw new Error(`Mint amount exceeds cap available`)\n }\n }\n\n /**\n * Transfer as number from address to toAddress\n * @param {String} dataTokenAddress\n * @param {String} toAddress\n * @param {String} amount Number of datatokens, as number. Will be converted to wei\n * @param {String} address\n * @return {Promise<TransactionReceipt>} transactionId\n */\n public async transfer(\n dataTokenAddress: string,\n toAddress: string,\n amount: string,\n address: string\n ): Promise<TransactionReceipt> {\n return this.transferToken(dataTokenAddress, toAddress, amount, address)\n }\n\n /**\n * Transfer as number from address to toAddress\n * @param {String} dataTokenAddress\n * @param {String} toAddress\n * @param {String} amount Number of datatokens, as number. Will be converted to wei\n * @param {String} address\n * @return {Promise<TransactionReceipt>} transactionId\n */\n public async transferToken(\n dataTokenAddress: string,\n toAddress: string,\n amount: string,\n address: string\n ): Promise<TransactionReceipt> {\n const weiAmount = this.web3.utils.toWei(amount)\n return this.transferWei(dataTokenAddress, toAddress, weiAmount, address)\n }\n\n /**\n * Transfer in wei from address to toAddress\n * @param {String} dataTokenAddress\n * @param {String} toAddress\n * @param {String} amount Number of datatokens, as number. Expressed as wei\n * @param {String} address\n * @return {Promise<TransactionReceipt>} transactionId\n */\n public async transferWei(\n dataTokenAddress: string,\n toAddress: string,\n amount: string,\n address: string\n ): Promise<TransactionReceipt> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress, {\n from: address\n }),\n this.config\n )\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await datatoken.methods\n .transfer(toAddress, amount)\n .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n const trxReceipt = await datatoken.methods.transfer(toAddress, amount).send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n return trxReceipt\n }\n\n /**\n * Transfer from fromAddress to address (needs an Approve operation before)\n * @param {String} dataTokenAddress\n * @param {String} fromAddress\n * @param {String} amount Number of datatokens, as number. Will be converted to wei\n * @param {String} address\n * @return {Promise<string>} transactionId\n */\n public async transferFrom(\n dataTokenAddress: string,\n fromAddress: string,\n amount: string,\n address: string\n ): Promise<string> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress, {\n from: address\n }),\n this.config\n )\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await datatoken.methods\n .transferFrom(fromAddress, address, this.web3.utils.toWei(amount))\n .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n const trxReceipt = await datatoken.methods\n .transferFrom(fromAddress, address, this.web3.utils.toWei(amount))\n .send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n return trxReceipt\n }\n\n /**\n * Get Address Balance for datatoken\n * @param {String} dataTokenAddress\n * @param {String} address\n * @return {Promise<String>} balance Number of datatokens. Will be converted from wei\n */\n public async balance(dataTokenAddress: string, address: string): Promise<string> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress, {\n from: address\n }),\n this.config\n )\n const balance = await datatoken.methods.balanceOf(address).call()\n return this.web3.utils.fromWei(balance)\n }\n\n /**\n * Get Alloance\n * @param {String } dataTokenAddress\n * @param {String} owner\n * @param {String} spender\n */\n public async allowance(\n dataTokenAddress: string,\n owner: string,\n spender: string\n ): Promise<string> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress, {\n from: spender\n }),\n this.config\n )\n const trxReceipt = await datatoken.methods.allowance(owner, spender).call()\n return this.web3.utils.fromWei(trxReceipt)\n }\n\n /** Get Blob\n * @param {String} dataTokenAddress\n * @return {Promise<string>} string\n */\n public async getBlob(dataTokenAddress: string): Promise<string> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress),\n this.config\n )\n const trxReceipt = await datatoken.methods.blob().call()\n return trxReceipt\n }\n\n /** Get Name\n * @param {String} dataTokenAddress\n * @return {Promise<string>} string\n */\n public async getName(dataTokenAddress: string): Promise<string> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress),\n this.config\n )\n const trxReceipt = await datatoken.methods.name().call()\n return trxReceipt\n }\n\n /** Get Symbol\n * @param {String} dataTokenAddress\n * @return {Promise<string>} string\n */\n public async getSymbol(dataTokenAddress: string): Promise<string> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress),\n this.config\n )\n const trxReceipt = await datatoken.methods.symbol().call()\n return trxReceipt\n }\n\n /** Get Cap\n * @param {String} dataTokenAddress\n * @return {Promise<string>} string\n */\n public async getCap(dataTokenAddress: string): Promise<string> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress),\n this.config\n )\n const trxReceipt = await datatoken.methods.cap().call()\n return this.web3.utils.fromWei(trxReceipt)\n }\n\n /** Convert to wei\n * @param {String} amount\n * @return {Promise<string>} string\n */\n public toWei(amount: string): string {\n return this.web3.utils.toWei(amount)\n }\n\n /** Convert from wei\n * @param {String} amount\n * @return {Promise<string>} string\n */\n public fromWei(amount: string): string {\n return this.web3.utils.fromWei(amount)\n }\n\n /** Start Order\n * @param {String} dataTokenAddress\n * @param {String} consumer consumer Address\n * @param {String} amount\n * @param {Number} serviceId\n * @param {String} mpFeeAddress\n * @param {String} address consumer Address\n * @return {Promise<string>} string\n */\n public async startOrder(\n dataTokenAddress: string,\n consumer: string,\n amount: string,\n serviceId: number,\n mpFeeAddress: string,\n address: string\n ): Promise<TransactionReceipt> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress, {\n from: address\n }),\n this.config\n )\n if (!mpFeeAddress) mpFeeAddress = '0x0000000000000000000000000000000000000000'\n try {\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await datatoken.methods\n .startOrder(\n consumer,\n this.web3.utils.toWei(amount),\n String(serviceId),\n mpFeeAddress\n )\n .estimateGas({ from: address }, (err, estGas) =>\n err ? gasLimitDefault : estGas\n )\n } catch (e) {\n estGas = gasLimitDefault\n }\n const trxReceipt = await datatoken.methods\n .startOrder(\n consumer,\n this.web3.utils.toWei(amount),\n String(serviceId),\n mpFeeAddress\n )\n .send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n return trxReceipt\n } catch (e) {\n this.logger.error(`ERROR: Failed to start order : ${e.message}`)\n throw new Error(`Failed to start order: ${e.message}`)\n }\n }\n\n /** Search and return txid for a previous valid order with the same params\n * @param {String} dataTokenAddress\n * @param {String} amount\n * @param {String} did\n * @param {Number} serviceId\n * @param {Number} timeout service timeout\n * @param {String} address consumer Address\n * @return {Promise<string>} string\n */\n // Note that getPreviousValidOrders() only works on Eth (see: https://github.com/oceanprotocol/ocean.js/issues/741)\n public async getPreviousValidOrders(\n dataTokenAddress: string,\n amount: string,\n serviceId: number,\n timeout: number,\n address: string\n ): Promise<string> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress, {\n from: address\n }),\n this.config\n )\n let fromBlock\n if (timeout > 0) {\n const lastBlock = await this.web3.eth.getBlockNumber()\n fromBlock = lastBlock - timeout\n if (fromBlock < this.startBlock) fromBlock = this.startBlock\n } else {\n fromBlock = this.startBlock\n }\n const events = await datatoken.getPastEvents('OrderStarted', {\n filter: { consumer: address },\n fromBlock,\n toBlock: 'latest'\n })\n for (let i = 0; i < events.length; i++) {\n if (\n String(events[i].returnValues.amount) === this.web3.utils.toWei(String(amount)) &&\n String(events[i].returnValues.serviceId) === String(serviceId) &&\n events[i].returnValues.consumer.toLowerCase() === address.toLowerCase()\n ) {\n if (timeout === 0) return events[i].transactionHash\n const blockDetails = await this.web3.eth.getBlock(events[i].blockHash)\n const expiry = new BigNumber(blockDetails.timestamp).plus(timeout)\n const unixTime = new BigNumber(Math.floor(Date.now() / 1000))\n if (unixTime.isLessThan(expiry)) return events[i].transactionHash\n }\n }\n return null\n }\n\n public getStartOrderEventSignature(): string {\n const abi = this.datatokensABI as AbiItem[]\n const eventdata = abi.find(function (o) {\n if (o.name === 'OrderStarted' && o.type === 'event') return o\n })\n const topic = this.web3.eth.abi.encodeEventSignature(eventdata as any)\n return topic\n }\n\n /**\n * Purpose a new minter\n * @param {String} dataTokenAddress\n * @param {String} newMinter\n * @param {String} address - only current minter can call this\n * @return {Promise<string>} transactionId\n */\n public async proposeMinter(\n dataTokenAddress: string,\n newMinterAddress: string,\n address: string\n ): Promise<TransactionReceipt> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress, {\n from: address\n }),\n this.config\n )\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await datatoken.methods\n .proposeMinter(newMinterAddress)\n .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n try {\n const trxReceipt = await datatoken.methods.proposeMinter(newMinterAddress).send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n return trxReceipt\n } catch (e) {\n this.logger.error('ERROR: Propose minter failed')\n return null\n }\n }\n\n /**\n * Approve minter role\n * @param {String} dataTokenAddress\n * @param {String} address - only proposad minter can call this\n * @return {Promise<string>} transactionId\n */\n public async approveMinter(\n dataTokenAddress: string,\n address: string\n ): Promise<TransactionReceipt> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress, {\n from: address\n }),\n this.config\n )\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await datatoken.methods\n .approveMinter()\n .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n try {\n const trxReceipt = await datatoken.methods.approveMinter().send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n return trxReceipt\n } catch (e) {\n return null\n }\n }\n\n /** Check if an address has the minter role\n * @param {String} dataTokenAddress\n * * @param {String} address\n * @return {Promise<string>} string\n */\n public async isMinter(dataTokenAddress: string, address: string): Promise<boolean> {\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress),\n this.config\n )\n const trxReceipt = await datatoken.methods.isMinter(address).call()\n return trxReceipt\n }\n}\n","import { lookup } from '@ethereum-navigator/navigator'\nimport { Instantiable } from '../Instantiable.abstract'\n\nexport class Network extends Instantiable {\n /**\n * Returns network id.\n * @return {Promise<number>} Network ID.\n */\n public getNetworkId(): Promise<number> {\n return this.web3.eth.net.getId()\n }\n\n /**\n * Returns the network by name.\n * @return {Promise<string>} Network name.\n */\n public async getNetworkName(): Promise<string> {\n return this.web3.eth.net.getId().then((networkId: number) => {\n const network = lookup(networkId)\n return network && network.name ? network.name : 'Development'\n })\n }\n}\n","import { DDO } from '../ddo/DDO'\nimport {\n Service,\n ServiceComputePrivacy,\n ServiceCompute,\n publisherTrustedAlgorithm,\n ServiceCustomParametersRequired\n} from '../ddo/interfaces/Service'\nimport Account from './Account'\nimport { SubscribablePromise, assetResolve, AssetResolved } from '../utils'\nimport { Instantiable, InstantiableConfig } from '../Instantiable.abstract'\nimport {\n ComputeOutput,\n ComputeJob,\n ComputeInput,\n ComputeAlgorithm\n} from './interfaces/Compute'\nimport { Provider, UserCustomParameters } from '../provider/Provider'\nimport { SHA256 } from 'crypto-js'\n\nexport enum OrderProgressStep {\n TransferDataToken\n}\n\nexport interface Cluster {\n type: string\n url: string\n}\n\nexport interface Container {\n image: string\n tag: string\n checksum: string\n}\n\nexport interface Server {\n serverId: string\n serverType: string\n cost: string\n cpu: string\n gpu: string\n memory: string\n disk: string\n maxExecutionTime: number\n}\n\nexport const ComputeJobStatus = Object.freeze({\n WarmingUp: 1,\n Started: 10,\n ConfiguringVolumes: 20,\n ProvisioningSuccess: 30,\n DataProvisioningFailed: 31,\n AlgorithmProvisioningFailed: 32,\n RunningAlgorithm: 40,\n FilteringResults: 50,\n PublishingResult: 60,\n Completed: 70,\n Stopped: 80,\n Deleted: 90\n})\n\n/**\n * Compute submodule of Ocean Protocol.\n */\nexport class Compute extends Instantiable {\n /**\n * Returns the instance of Compute.\n * @return {Promise<Assets>}\n */\n public static async getInstance(config: InstantiableConfig): Promise<Compute> {\n const instance = new Compute()\n instance.setInstanceConfig(config)\n\n return instance\n }\n\n /**\n * Gets the compute address for ordering compute assets\n * @param {string} did Decentralized identifer of the primary asset (this will determine where compute happens)\n * @param {number} serviceIndex If asset has multiple compute services\n * @return {Promise<String>} Returns compute address\n */\n public async getComputeAddress(did: string, serviceIndex = -1): Promise<string> {\n let service: Service\n let serviceType = 'compute'\n if (serviceIndex === -1) {\n service = await this.ocean.assets.getServiceByType(did, serviceType)\n serviceIndex = service.index\n } else {\n service = await this.ocean.assets.getServiceByIndex(did, serviceIndex)\n serviceType = service.type\n }\n const { serviceEndpoint } = service\n const provider = await Provider.getInstance(this.instanceConfig)\n await provider.setBaseUrl(serviceEndpoint)\n return provider.computeAddress\n }\n\n /**\n * Start the execution of a compute job.\n * @param {DDO|string} asset DID Descriptor Object containing all the data related to an asset or a Decentralized identifier.\n * @param {string} txId\n * @param {string} tokenAddress\n * @param {Account} consumerAccount The account of the consumer ordering the service.\n * @param {string} algorithmDid The DID of the algorithm asset (of type `algorithm`) to run on the asset.\n * @param {MetaData} algorithmMeta Metadata about the algorithm being run if `algorithm` is being used. This is ignored when `algorithmDid` is specified.\n * @param {Output} output Define algorithm output publishing. Publishing the result of a compute job is turned off by default.\n * @return {Promise<ComputeJob>} Returns compute job ID under status.jobId\n */\n public async start(\n asset: DDO | string,\n txId: string,\n tokenAddress: string,\n consumerAccount: Account,\n algorithm: ComputeAlgorithm,\n output?: ComputeOutput,\n serviceIndex?: string,\n serviceType?: string,\n additionalInputs?: ComputeInput[]\n ): Promise<ComputeJob> {\n output = this.checkOutput(consumerAccount, output)\n const { did, ddo } = await assetResolve(asset, this.ocean)\n const service = ddo.findServiceByType('compute')\n const { serviceEndpoint } = service\n if (algorithm.serviceIndex) {\n const { ddo } = await assetResolve(algorithm.did, this.ocean)\n const algoService: Service = ddo.findServiceById(algorithm.serviceIndex)\n if (\n !(await this.ocean.assets.isUserCustomParametersValid(\n algoService.attributes.algoCustomParameters,\n algorithm.algoCustomParameters\n ))\n ) {\n return null\n }\n }\n if (did && txId) {\n const provider = await Provider.getInstance(this.instanceConfig)\n await provider.setBaseUrl(serviceEndpoint)\n const computeJobsList = await provider.computeStart(\n did,\n consumerAccount,\n algorithm,\n output,\n txId,\n serviceIndex,\n serviceType,\n tokenAddress,\n additionalInputs\n )\n if (computeJobsList) return computeJobsList[0] as ComputeJob\n else return null\n }\n return null\n }\n\n /**\n * Ends a running compute job.\n * @param {Account} consumerAccount The account of the consumer ordering the service.\n * @param {DDO|string} asset DID Descriptor Object containing all the data related to an asset or a Decentralized identifier.\n * @param {string} jobId The ID of the compute job to be stopped\n * @return {Promise<ComputeJob>} Returns the new status of a job\n */\n public async stop(\n consumerAccount: Account,\n asset: DDO | string,\n jobId: string\n ): Promise<ComputeJob> {\n const { did, ddo } = await assetResolve(asset, this.ocean)\n const service = ddo.findServiceByType('compute')\n const { serviceEndpoint } = service\n const provider = await Provider.getInstance(this.instanceConfig)\n await provider.setBaseUrl(serviceEndpoint)\n const computeJobsList = await provider.computeStop(did, consumerAccount, jobId)\n if (computeJobsList) return computeJobsList[0] as ComputeJob\n return null\n }\n\n /**\n * Deletes a compute job and all resources associated with the job. If job is running it will be stopped first.\n * @param {Account} consumerAccount The account of the consumer ordering the service.\n * @param {DDO|string} asset DID Descriptor Object containing all the data related to an asset or a Decentralized identifier.\n * @param {string} jobId The ID of the compute job to be stopped\n * @param {DDO} ddo If undefined then the ddo will be fetched by did\n * @return {Promise<ComputeJob>} Returns the new status of a job\n */\n public async delete(\n consumerAccount: Account,\n asset: DDO | string,\n jobId: string\n ): Promise<ComputeJob> {\n const { did, ddo } = await assetResolve(asset, this.ocean)\n const service = ddo.findServiceByType('compute')\n const { serviceEndpoint } = service\n const provider = await Provider.getInstance(this.instanceConfig)\n await provider.setBaseUrl(serviceEndpoint)\n const computeJobsList = await provider.computeDelete(did, consumerAccount, jobId)\n if (computeJobsList) return computeJobsList[0] as ComputeJob\n return null\n }\n\n /**\n * Returns information about the status of all compute jobs, or a single compute job.\n * @param {Account} consumerAccount The account of the consumer ordering the service.\n * @param {string} did Decentralized identifier.\n * @param {DDO} ddo If undefined then the ddo will be fetched by did, this is just to optimize network calls\n * @param {ServiceCompute} service If undefined then we get the service from the ddo\n * @param {string} jobId The Order transaction id\n * @param {string} txId The transaction id of ordering the main asset (asset with compute service)\n * @param {boolean} sign If the provider request is going to be signed(default) (full status) or not (short status)\n * @return {Promise<ComputeJob[]>} Returns the status\n */\n public async status(\n consumerAccount: Account,\n did?: string,\n ddo?: DDO,\n service?: ServiceCompute,\n jobId?: string,\n txId?: string\n ): Promise<ComputeJob[]> {\n let provider: Provider\n\n if (did || service || ddo) {\n if (!service) {\n if (!ddo) {\n ddo = await this.ocean.assets.resolve(did)\n if (!ddo) throw new Error(`Couldn't resolve the did ${did}`)\n }\n service = ddo.findServiceByType('compute')\n if (!service)\n throw new Error(`Couldn't find a compute service on the asset with did ${did}`)\n }\n\n const { serviceEndpoint } = service\n provider = await Provider.getInstance(this.instanceConfig)\n\n await provider.setBaseUrl(serviceEndpoint)\n } else {\n provider = this.ocean.provider\n }\n\n const computeJobsList = await provider.computeStatus(\n did,\n consumerAccount,\n jobId,\n txId\n )\n\n return computeJobsList as ComputeJob[]\n }\n\n /**\n * Downloads compute job result\n * @param {Account} consumerAccount The account of the consumer ordering the service.\n * @param {string} jobId JobId\n * @param {number} index Compute Result index\n * @param {string} destination: destination folder\n * @param {string} did Decentralized identifier.\n * @param {DDO} ddo If undefined then the ddo will be fetched by did, this is just to optimize network calls\n * @param {ServiceCompute} service If undefined then we get the service from the ddo\n */\n public async getResult(\n consumerAccount: Account,\n jobId: string,\n index: number,\n destination: string,\n did?: string,\n ddo?: DDO,\n service?: ServiceCompute\n ): Promise<any> {\n let provider: Provider\n\n if (did || service || ddo) {\n if (!service) {\n if (!ddo) {\n ddo = await this.ocean.assets.resolve(did)\n if (!ddo) throw new Error(`Couldn't resolve the did ${did}`)\n }\n service = ddo.findServiceByType('compute')\n if (!service)\n throw new Error(`Couldn't find a compute service on the asset with did ${did}`)\n }\n\n const { serviceEndpoint } = service\n provider = await Provider.getInstance(this.instanceConfig)\n\n await provider.setBaseUrl(serviceEndpoint)\n } else {\n provider = this.ocean.provider\n }\n\n const result = await provider.computeResult(\n jobId,\n index,\n destination,\n consumerAccount\n )\n\n return result\n }\n\n public createServerAttributes(\n serverId: string,\n serverType: string,\n cost: string,\n cpu: string,\n gpu: string,\n memory: string,\n disk: string,\n maxExecutionTime: number\n ): Server {\n return {\n serverId,\n serverType,\n cost,\n cpu,\n gpu,\n memory,\n disk,\n maxExecutionTime\n }\n }\n\n public createContainerAttributes(\n image: string,\n tag: string,\n checksum: string\n ): Container {\n return { image, tag, checksum }\n }\n\n public createClusterAttributes(type: string, url: string): Cluster {\n return { type, url }\n }\n\n public createProviderAttributes(\n type: string,\n description: string,\n cluster: Cluster,\n containers: Container[],\n servers: Server[]\n ): {\n type: string\n description: string\n environment: {\n cluster: Cluster\n supportedServers: Server[]\n supportedContainers: Container[]\n }\n } {\n return {\n type,\n description,\n environment: {\n cluster: cluster,\n supportedServers: servers,\n supportedContainers: containers\n }\n }\n }\n\n /**\n * Creates a compute service\n * @param {Account} consumerAccount\n * @param {String} cost number of datatokens needed for this service, expressed in wei\n * @param {String} datePublished\n * @param {Object} providerAttributes\n * @param {Object} computePrivacy\n * @param {Number} timeout\n * @return {Promise<string>} service\n */\n public createComputeService(\n consumerAccount: Account,\n cost: string,\n datePublished: string,\n providerAttributes: any,\n computePrivacy?: ServiceComputePrivacy,\n timeout?: number,\n providerUri?: string,\n requiredCustomParameters?: ServiceCustomParametersRequired\n ): ServiceCompute {\n const name = 'dataAssetComputingService'\n if (!timeout) timeout = 3600\n const service: ServiceCompute = {\n type: 'compute',\n index: 3,\n serviceEndpoint: providerUri || this.ocean.provider.url,\n attributes: {\n main: {\n name,\n creator: consumerAccount.getId(),\n datePublished,\n cost,\n timeout: timeout,\n provider: providerAttributes,\n privacy: {}\n }\n }\n }\n\n if (computePrivacy) service.attributes.main.privacy = computePrivacy\n if (requiredCustomParameters?.userCustomParameters)\n service.attributes.userCustomParameters =\n requiredCustomParameters.userCustomParameters\n if (requiredCustomParameters?.algoCustomParameters)\n service.attributes.algoCustomParameters =\n requiredCustomParameters.algoCustomParameters\n return service as ServiceCompute\n }\n\n /**\n * Check the output object and add default properties if needed\n * @param {Account} consumerAccount The account of the consumer ordering the service.\n * @param {Output} output Output section used for publishing the result.\n * @return {Promise<Output>} Returns output object\n */\n private checkOutput(consumerAccount: Account, output?: ComputeOutput): ComputeOutput {\n const isDefault = !output || (!output.publishAlgorithmLog && !output.publishOutput)\n\n if (isDefault) {\n return {\n publishAlgorithmLog: false,\n publishOutput: false\n }\n }\n\n return {\n publishAlgorithmLog: output.publishAlgorithmLog,\n publishOutput: output.publishOutput,\n providerAddress: output.providerAddress || this.config.providerAddress,\n providerUri: output.providerUri || this.config.providerUri,\n metadataUri: output.metadataUri || this.config.metadataCacheUri,\n nodeUri: output.nodeUri || this.config.nodeUri,\n owner: output.owner || consumerAccount.getId()\n }\n }\n\n /**\n * Checks if an asset is orderable with a specific algorithm\n * @param {DDO|string} dataset DID Descriptor Object containing all the data related to an asset or a Decentralized identifier of the asset (of type `dataset`) to run the algorithm on.\n * @param {string} serviceIndex The Service index\n * @param {ComputeAlgorithm} algorithm\n * @param {DDO} algorithmDDO Algorithm DDO object. If undefined then the ddo will be fetched by did\n * @return {Promise<boolean>} True is you can order this\n *\n * Note: algorithmDid and algorithmMeta are optional, but if they are not passed,\n * you can end up in the situation that you are ordering and paying for your compute job,\n * but provider will not allow the compute, due to privacy settings of the ddo\n */\n public async isOrderable(\n dataset: DDO | string,\n serviceIndex: number,\n algorithm: ComputeAlgorithm,\n algorithmDDO?: DDO\n ): Promise<boolean> {\n const datasetResolved: AssetResolved = await assetResolve(dataset, this.ocean)\n const service: Service = datasetResolved.ddo.findServiceById(serviceIndex)\n if (!service) return false\n if (service.type === 'compute') {\n if (algorithm.meta) {\n // check if raw algo is allowed\n if (service.attributes.main.privacy)\n if (service.attributes.main.privacy.allowRawAlgorithm) return true\n this.logger.error('ERROR: This service does not allow raw algorithm')\n return false\n }\n if (algorithm.did) {\n // check if both have compute services and then if they are served by the same provider\n if (algorithm.serviceIndex) {\n if (!algorithmDDO) {\n algorithmDDO = await this.ocean.assets.resolve(algorithm.did)\n if (!algorithmDDO)\n throw new Error(`Couldn't resolve the did ${algorithm.did}`)\n }\n const algoService: Service = algorithmDDO.findServiceById(\n algorithm.serviceIndex\n )\n if (algoService && algoService.type === 'compute') {\n // since both dataset & algo services are compute, we need to check if they are served by the same provider\n const algoProvider = await Provider.getInstance(this.instanceConfig)\n await algoProvider.setBaseUrl(algoService.serviceEndpoint)\n const datasetProvider = await Provider.getInstance(this.instanceConfig)\n await datasetProvider.setBaseUrl(service.serviceEndpoint)\n if (algoProvider.providerAddress !== datasetProvider.providerAddress) {\n this.logger.error(\n 'ERROR: Both assets with compute service are not served by the same provider'\n )\n return false\n }\n }\n }\n // check if did is in trusted list\n if (service.attributes.main.privacy) {\n if (service.attributes.main.privacy.allowAllPublishedAlgorithms) return true\n if (!service.attributes.main.privacy.publisherTrustedAlgorithms) return false\n let algo: publisherTrustedAlgorithm\n for (algo of service.attributes.main.privacy.publisherTrustedAlgorithms) {\n if (algo.did === algorithm.did) {\n // compute checkusms and compare them\n const trustedAlgorithm = await this.createPublisherTrustedAlgorithmfromDID(\n algorithm.did\n )\n if (\n algo.containerSectionChecksum &&\n algo.containerSectionChecksum !==\n trustedAlgorithm.containerSectionChecksum\n ) {\n this.logger.error(\n 'ERROR: Algorithm container section was altered since it was added as trusted by ' +\n datasetResolved.did\n )\n return false\n }\n if (\n algo.filesChecksum &&\n algo.filesChecksum !== trustedAlgorithm.filesChecksum\n ) {\n this.logger.error(\n 'ERROR: Algorithm files section was altered since it was added as trusted by ' +\n datasetResolved.ddo\n )\n return false\n }\n // all conditions are meet\n return true\n }\n }\n // algorithmDid was not found\n this.logger.error(\n 'ERROR: Algorithm ' +\n algorithm.did +\n ' is not allowed by ' +\n datasetResolved.did\n )\n return false\n }\n console.error('Algo Index:' + algorithm.serviceIndex)\n }\n }\n return true // not a compute asset\n }\n\n /**\n * Starts an order of a compute or access service for a compute job\n * @param {String} consumerAccount The account of the consumer ordering the service.\n * @param {DDO|string} dataset DID Descriptor Object containing all the data related to an asset or a Decentralized identifier of the asset (of type `dataset`) to run the algorithm on.\n * @param {string} serviceIndex The Service index\n * @param {string} algorithmDid The DID of the algorithm asset (of type `algorithm`) to run on the asset.\n * @param {string} algorithmServiceIndex The index of the service in the algorithm\n * @param {MetaData} algorithmMeta Metadata about the algorithm being run if `algorithm` is being used. This is ignored when `algorithmDid` is specified.\n * @return {SubscribablePromise<OrderProgressStep, string>} Returns the transaction details\n *\n * Note: algorithmDid and algorithmMeta are optional, but if they are not passed,\n * you can end up in the situation that you are ordering and paying for your compute job,\n * but provider will not allow the compute, due to privacy settings of the ddo\n */\n public orderAsset(\n consumerAccount: string,\n dataset: DDO | string,\n serviceIndex: number,\n algorithm: ComputeAlgorithm,\n mpAddress?: string,\n computeAddress?: string,\n userCustomParameters?: UserCustomParameters,\n authService = 'json',\n searchPreviousOrders = true\n ): SubscribablePromise<OrderProgressStep, string> {\n return new SubscribablePromise(async (observer) => {\n const { ddo } = await assetResolve(dataset, this.ocean)\n // first check if we can order this\n const allowed = await this.isOrderable(ddo, serviceIndex, algorithm)\n if (!allowed)\n throw new Error(\n `Dataset order failed, dataset is not orderable with the specified algorithm`\n )\n // const service: Service = ddo.findServiceByType('compute')\n const service: Service = ddo.findServiceById(serviceIndex)\n if (!service)\n throw new Error(`Dataset order failed, Could not find service for the DDO`)\n try {\n const order = await this.ocean.assets.order(\n ddo,\n service.type,\n consumerAccount,\n -1,\n mpAddress,\n computeAddress,\n userCustomParameters,\n authService,\n searchPreviousOrders\n )\n return order\n } catch (error) {\n this.logger.error(`ERROR: Failed to order: ${error.message}`)\n throw new Error(`Failed to order dataset: ${error.message}`)\n }\n })\n }\n\n /**\n * Orders & pays for a algorithm\n * @param {DDO|string} asset DID Descriptor Object containing all the data related to an asset or a Decentralized identifier.\n * @param {String} serviceType\n * @param {String} payerAddress\n * @param {Number} serviceIndex\n * @param {String} mpAddress Marketplace fee collector address\n * @param {String} consumerAddress Optionally, if the consumer is another address than payer\n * @return {Promise<String>} transactionHash of the payment\n */\n public async orderAlgorithm(\n asset: DDO | string,\n serviceType: string,\n payerAddress: string,\n serviceIndex = -1,\n mpAddress?: string,\n consumerAddress?: string,\n userCustomParameters?: UserCustomParameters,\n authService = 'json',\n searchPreviousOrders = true\n ): Promise<string> {\n // this is only a convienince function, which calls ocean.assets.order\n try {\n return await this.ocean.assets.order(\n asset,\n serviceType,\n payerAddress,\n serviceIndex,\n mpAddress,\n consumerAddress,\n userCustomParameters,\n authService,\n searchPreviousOrders\n )\n } catch (error) {\n this.logger.error(`ERROR: Failed to orderAlgorithm: ${error.message}`)\n throw new Error(`Failed to order algorithm: ${error.message}`)\n }\n }\n\n /**\n * Edit Compute Privacy\n * @param {ddo} DDO\n * @param {number} serviceIndex Index of the compute service in the DDO. If -1, will try to find it\n * @param {ServiceComputePrivacy} computePrivacy ComputePrivacy fields & new values.\n * @param {Account} account Ethereum account of owner to sign and prove the ownership.\n * @return {Promise<DDO>}\n */\n public async editComputePrivacy(\n ddo: DDO,\n serviceIndex: number,\n computePrivacy: ServiceComputePrivacy\n ): Promise<DDO> {\n if (!ddo) return null\n if (serviceIndex === -1) {\n const service = ddo.findServiceByType('compute')\n if (!service) return null\n serviceIndex = service.index\n }\n if (typeof ddo.service[serviceIndex] === 'undefined') return null\n if (ddo.service[serviceIndex].type !== 'compute') return null\n ddo.service[serviceIndex].attributes.main.privacy.allowRawAlgorithm =\n computePrivacy.allowRawAlgorithm\n ddo.service[serviceIndex].attributes.main.privacy.allowAllPublishedAlgorithms =\n computePrivacy.allowAllPublishedAlgorithms\n ddo.service[serviceIndex].attributes.main.privacy.allowNetworkAccess =\n computePrivacy.allowNetworkAccess\n ddo.service[serviceIndex].attributes.main.privacy.publisherTrustedAlgorithms =\n computePrivacy.publisherTrustedAlgorithms\n return ddo\n }\n\n /**\n * Toogle allowAllPublishedAlgorithms\n * @param {ddo} DDO\n * @param {number} serviceIndex Index of the compute service in the DDO. If -1, will try to find it\n * @param {boolean} newState\n * @return {Promise<DDDO>} Returns the new DDO\n */\n public async toggleAllowAllPublishedAlgorithms(\n ddo: DDO,\n serviceIndex: number,\n newState: boolean\n ): Promise<DDO> {\n if (!ddo) return null\n if (serviceIndex === -1) {\n const service = ddo.findServiceByType('compute')\n if (!service) return null\n serviceIndex = service.index\n }\n if (typeof ddo.service[serviceIndex] === 'undefined') return null\n if (ddo.service[serviceIndex].type !== 'compute') return null\n ddo.service[serviceIndex].attributes.main.privacy.allowAllPublishedAlgorithms =\n newState\n return ddo\n }\n\n /**\n * Generates a publisherTrustedAlgorithm object from a algorithm did\n * @param {did} string DID. You can leave this empty if you already have the DDO\n * @param {ddo} DDO if empty, will trigger a retrieve\n * @return {Promise<publisherTrustedAlgorithm>}\n */\n public async createPublisherTrustedAlgorithmfromDID(\n did: string,\n ddo?: DDO\n ): Promise<publisherTrustedAlgorithm> {\n if (!ddo) {\n ddo = await this.ocean.assets.resolve(did)\n if (!ddo) return null\n }\n const service = ddo.findServiceByType('metadata')\n if (!service) return null\n if (!service.attributes.main.algorithm) return null\n if (!service.attributes.encryptedFiles) return null\n if (!service.attributes.main.files) return null\n return {\n did,\n containerSectionChecksum: SHA256(\n JSON.stringify(service.attributes.main.algorithm.container)\n ).toString(),\n filesChecksum: SHA256(\n service.attributes.encryptedFiles + JSON.stringify(service.attributes.main.files)\n ).toString()\n }\n }\n\n /**\n * Adds a trusted algorithm to an asset\n * @param {ddo} DDO\n * @param {number} serviceIndex Index of the compute service in the DDO. If -1, will try to find it\n * @param {algoDid} string Algorithm DID to be added\n * @return {Promise<DDDO>} Returns the new DDO\n */\n public async addTrustedAlgorithmtoAsset(\n ddo: DDO,\n serviceIndex: number,\n algoDid: string\n ): Promise<DDO> {\n if (!ddo) return null\n if (serviceIndex === -1) {\n const service = ddo.findServiceByType('compute')\n if (!service) return null\n serviceIndex = service.index\n }\n if (typeof ddo.service[serviceIndex] === 'undefined') return null\n if (ddo.service[serviceIndex].type !== 'compute') return null\n if (!ddo.service[serviceIndex].attributes.main.privacy.publisherTrustedAlgorithms)\n ddo.service[serviceIndex].attributes.main.privacy.publisherTrustedAlgorithms = []\n const trustedAlgorithm = await this.createPublisherTrustedAlgorithmfromDID(algoDid)\n if (trustedAlgorithm)\n ddo.service[serviceIndex].attributes.main.privacy.publisherTrustedAlgorithms.push(\n trustedAlgorithm\n )\n return ddo\n }\n\n /**\n * Check is an algo is trusted\n * @param {ddo} DDO\n * @param {number} serviceIndex Index of the compute service in the DDO. If -1, will try to find it\n * @param {algoDid} string Algorithm DID to be added\n * @return {Promise<DDDO>} Returns the new DDO\n */\n public async isAlgorithmTrusted(\n ddo: DDO,\n serviceIndex: number,\n algoDid: string\n ): Promise<boolean> {\n if (!ddo) return false\n if (serviceIndex === -1) {\n const service = ddo.findServiceByType('compute')\n if (!service) return false\n serviceIndex = service.index\n }\n if (typeof ddo.service[serviceIndex] === 'undefined') return false\n if (ddo.service[serviceIndex].type !== 'compute') return false\n if (ddo.service[serviceIndex].attributes.main.privacy.allowAllPublishedAlgorithms)\n return true\n let algo: publisherTrustedAlgorithm\n for (algo of ddo.service[serviceIndex].attributes.main.privacy\n .publisherTrustedAlgorithms)\n if (algo.did === algoDid) return true\n return false\n }\n\n /**\n * Removes a trusted algorithm from an asset\n * @param {ddo} DDO\n * @param {number} serviceIndex Index of the compute service in the DDO. If -1, will try to find it\n * @param {algoDid} string Algorithm DID to be removed\n * @return {Promise<DDDO>} Returns the new DDO\n */\n public async removeTrustedAlgorithmFromAsset(\n ddo: DDO,\n serviceIndex: number,\n algoDid: string\n ): Promise<DDO> {\n if (!ddo) return null\n if (serviceIndex === -1) {\n const service = ddo.findServiceByType('compute')\n if (!service) return ddo\n serviceIndex = service.index\n }\n if (typeof ddo.service[serviceIndex] === 'undefined') return ddo\n if (ddo.service[serviceIndex].type !== 'compute') return ddo\n if (!ddo.service[serviceIndex].attributes.main.privacy.publisherTrustedAlgorithms)\n return ddo\n ddo.service[serviceIndex].attributes.main.privacy.publisherTrustedAlgorithms =\n ddo.service[serviceIndex].attributes.main.privacy.publisherTrustedAlgorithms.filter(\n function (el) {\n return el.did !== algoDid\n }\n )\n return ddo\n }\n}\n","import Web3 from 'web3'\nimport { AbiItem } from 'web3-utils/types'\nimport { TransactionReceipt } from 'web3-core'\nimport { Logger, getFairGasPrice, setContractDefaults } from '../utils'\nimport BigNumber from 'bignumber.js'\nimport jsonpoolABI from '@oceanprotocol/contracts/artifacts/BPool.json'\nimport defaultDatatokensABI from '@oceanprotocol/contracts/artifacts/DataTokenTemplate.json'\nimport { PoolFactory } from './PoolFactory'\nimport Decimal from 'decimal.js'\nimport { ConfigHelperConfig } from '../utils/ConfigHelper'\n\nconst MaxUint256 =\n '115792089237316195423570985008687907853269984665640564039457584007913129639934'\n/**\n * Provides an interface to Balancer BPool & BFactory\n */\nexport interface TokensToAdd {\n address: string\n amount: string\n weight: string\n}\n\nexport class Pool extends PoolFactory {\n public poolABI: AbiItem | AbiItem[]\n\n constructor(\n web3: Web3,\n logger: Logger,\n factoryABI: AbiItem | AbiItem[] = null,\n poolABI: AbiItem | AbiItem[] = null,\n factoryAddress: string = null,\n config?: ConfigHelperConfig\n ) {\n super(web3, logger, factoryABI, factoryAddress, config)\n if (poolABI) this.poolABI = poolABI\n else this.poolABI = jsonpoolABI.abi as AbiItem[]\n }\n\n /**\n * Creates a new pool\n */\n async createPool(account: string): Promise<TransactionReceipt> {\n return await super.createPool(account)\n }\n\n /**\n * Setup a new pool by setting datatoken, base token, swap fee and\n * finalizing the pool to make it public.\n *\n * @param {String} account ethereum address to use for sending this transaction\n * @param {String} poolAddress address of new Balancer Pool\n * @param {String} dataToken address of datatoken ERC20 contract\n * @param {String} dataTokenAmount in wei\n * @param {String} dataTokenWeight in wei\n * @param {String} baseToken address of base token ERC20 contract\n * @param {String} baseTokenAmount in wei\n * @param {String} baseTokenWeight in wei\n * @param {String} swapFee in wei\n */\n async setup(\n account: string,\n poolAddress: string,\n dataToken: string,\n dataTokenAmount: string,\n dataTokenWeight: string,\n baseToken: string,\n baseTokenAmount: string,\n baseTokenWeight: string,\n swapFee: string\n ): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress, {\n from: account\n }),\n this.config\n )\n let result = null\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await pool.methods\n .setup(\n dataToken,\n dataTokenAmount,\n dataTokenWeight,\n baseToken,\n baseTokenAmount,\n baseTokenWeight,\n swapFee\n )\n .estimateGas({ from: account }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n try {\n result = await pool.methods\n .setup(\n dataToken,\n dataTokenAmount,\n dataTokenWeight,\n baseToken,\n baseTokenAmount,\n baseTokenWeight,\n swapFee\n )\n .send({\n from: account,\n gas: estGas,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to setup a pool: ${e.message}`)\n }\n return result\n }\n\n /**\n * Get Alloance for both DataToken and Ocean\n * @param {String } tokenAdress\n * @param {String} owner\n * @param {String} spender\n */\n public async allowance(\n tokenAdress: string,\n owner: string,\n spender: string\n ): Promise<string> {\n const tokenAbi = defaultDatatokensABI.abi as AbiItem[]\n const datatoken = setContractDefaults(\n new this.web3.eth.Contract(tokenAbi, tokenAdress, {\n from: spender\n }),\n this.config\n )\n const trxReceipt = await datatoken.methods.allowance(owner, spender).call()\n return this.web3.utils.fromWei(trxReceipt)\n }\n\n /**\n * Approve spender to spent amount tokens\n * @param {String} account\n * @param {String} tokenAddress\n * @param {String} spender\n * @param {String} amount (always expressed as wei)\n * @param {String} force if true, will overwrite any previous allowence. Else, will check if allowence is enough and will not send a transaction if it's not needed\n */\n async approve(\n account: string,\n tokenAddress: string,\n spender: string,\n amount: string,\n force = false\n ): Promise<TransactionReceipt | string> {\n const minABI = [\n {\n constant: false,\n inputs: [\n {\n name: '_spender',\n type: 'address'\n },\n {\n name: '_value',\n type: 'uint256'\n }\n ],\n name: 'approve',\n outputs: [\n {\n name: '',\n type: 'bool'\n }\n ],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function'\n }\n ] as AbiItem[]\n const token = setContractDefaults(\n new this.web3.eth.Contract(minABI, tokenAddress, {\n from: account\n }),\n this.config\n )\n if (!force) {\n const currentAllowence = await this.allowance(tokenAddress, account, spender)\n if (\n new Decimal(this.web3.utils.toWei(currentAllowence)).greaterThanOrEqualTo(amount)\n ) {\n return currentAllowence\n }\n }\n let result = null\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await token.methods\n .approve(spender, amount)\n .estimateGas({ from: account }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n\n try {\n result = await token.methods.approve(spender, amount).send({\n from: account,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERRPR: Failed to approve spender to spend tokens : ${e.message}`)\n }\n return result\n }\n\n /**\n * Get user shares of pool tokens\n * @param {String} account\n * @param {String} poolAddress\n * @return {String}\n */\n async sharesBalance(account: string, poolAddress: string): Promise<string> {\n let result = null\n try {\n const token = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n const balance = await token.methods.balanceOf(account).call()\n result = this.web3.utils.fromWei(balance)\n } catch (e) {\n this.logger.error(`ERROR: Failed to get shares of pool : ${e.message}`)\n }\n return result\n }\n\n /**\n * Adds tokens to pool\n * @param {String} account\n * @param {String} poolAddress\n * @param {Array} tokens Array of token object { address,amount,weight}\n */\n async addToPool(\n account: string,\n poolAddress: string,\n tokens: TokensToAdd[]\n ): Promise<void> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress, {\n from: account\n }),\n this.config\n )\n\n let token\n for (token of tokens) {\n try {\n // approve spending first\n await this.approve(\n account,\n token.address,\n poolAddress,\n this.web3.utils.toWei(`${token.amount}`)\n )\n await pool.methods\n .bind(\n token.address,\n this.web3.utils.toWei(token.amount),\n this.web3.utils.toWei(token.weight)\n )\n .send({\n from: account,\n gas: this.GASLIMIT_DEFAULT,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to add tokens to pool: ${e.message}`)\n }\n }\n }\n\n /**\n * Set pool fee\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} fee 0.1=10% fee(max allowed)\n */\n async setSwapFee(\n account: string,\n poolAddress: string,\n fee: string\n ): Promise<TransactionReceipt> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress, {\n from: account\n }),\n this.config\n )\n let result = null\n try {\n result = await pool.methods.setSwapFee(this.web3.utils.toWei(fee)).send({\n from: account,\n gas: this.GASLIMIT_DEFAULT,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to set pool swap fee: ${e.message}`)\n }\n return result\n }\n\n /**\n * Finalize a pool\n * @param {String} account\n * @param {String} poolAddress\n */\n async finalize(account: string, poolAddress: string): Promise<TransactionReceipt> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress, {\n from: account\n }),\n this.config\n )\n let result = null\n try {\n result = await pool.methods.finalize().send({\n from: account,\n gas: this.GASLIMIT_DEFAULT,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to finalize pool: ${e.message}`)\n }\n return result\n }\n\n /**\n * Get number of tokens composing this pool\n * @param {String} poolAddress\n * @return {String}\n */\n async getNumTokens(poolAddress: string): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let result = null\n try {\n result = await pool.methods.getNumTokens().call()\n } catch (e) {\n this.logger.error(`ERROR: Failed to get number of tokens: ${e.message}`)\n }\n return result\n }\n\n /**\n * Get total supply of pool shares\n * @param {String} poolAddress\n * @return {String}\n */\n async getPoolSharesTotalSupply(poolAddress: string): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let amount = null\n try {\n const result = await pool.methods.totalSupply().call()\n amount = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error(`ERROR: Failed to get total supply of pool shares: ${e.message}`)\n }\n return amount\n }\n\n /**\n * Get tokens composing this pool\n * @param {String} poolAddress\n * @return {String[]}\n */\n async getCurrentTokens(poolAddress: string): Promise<string[]> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let result = null\n try {\n result = await pool.methods.getCurrentTokens().call()\n } catch (e) {\n this.logger.error(`ERROR: Failed to get tokens composing this pool: ${e.message}`)\n }\n return result\n }\n\n /**\n * Get the final tokens composing this pool\n * @param {String} poolAddress\n * @return {String[]}\n */\n async getFinalTokens(poolAddress: string): Promise<string[]> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let result = null\n try {\n result = await pool.methods.getFinalTokens().call()\n } catch (e) {\n this.logger.error(`ERROR: Failed to get the final tokens composing this pool`)\n }\n return result\n }\n\n /**\n * Get controller address of this pool\n * @param {String} poolAddress\n * @return {String}\n */\n async getController(poolAddress: string): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let result = null\n try {\n result = await pool.methods.getController().call()\n } catch (e) {\n this.logger.error(`ERROR: Failed to get pool controller address: ${e.message}`)\n }\n return result\n }\n\n /**\n * Set controller address of this pool\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} controllerAddress\n * @return {String}\n */\n async setController(\n account: string,\n poolAddress: string,\n controllerAddress: string\n ): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress, {\n from: account\n }),\n this.config\n )\n let result = null\n try {\n result = await pool.methods\n .setController(controllerAddress)\n .send({ from: account, gas: this.GASLIMIT_DEFAULT })\n } catch (e) {\n this.logger.error(`ERROR: Failed to set pool controller: ${e.message}`)\n }\n return result\n }\n\n /**\n * Get if a token is bounded to a pool\n * @param {String} poolAddress\n * @param {String} token Address of the token\n * @return {Boolean}\n */\n async isBound(poolAddress: string, token: string): Promise<boolean> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let result = null\n try {\n result = await pool.methods.isBound(token).call()\n } catch (e) {\n this.logger.error(`ERROR: Failed to check whether a token \\\n bounded to a pool. ${e.message}`)\n }\n return result\n }\n\n /**\n * Get how many tokens are in the pool\n * @param {String} poolAddress\n * @param {String} token Address of the token\n * @return {String}\n */\n async getReserve(poolAddress: string, token: string): Promise<string> {\n let amount = null\n try {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n const result = await pool.methods.getBalance(token).call()\n amount = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error(`ERROR: Failed to get how many tokens \\\n are in the pool: ${e.message}`)\n }\n return amount\n }\n\n /**\n * Get if a pool is finalized\n * @param {String} poolAddress\n * @return {Boolean}\n */\n async isFinalized(poolAddress: string): Promise<boolean> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let result = null\n try {\n result = await pool.methods.isFinalized().call()\n } catch (e) {\n this.logger.error(`ERROR: Failed to check whether pool is finalized: ${e.message}`)\n }\n return result\n }\n\n /**\n * Get pool fee\n * @param {String} poolAddress\n * @return {String} Swap fee. To get the percentage value, substract by 100. E.g. `0.1` represents a 10% swap fee.\n */\n async getSwapFee(poolAddress: string): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let fee = null\n try {\n const result = await pool.methods.getSwapFee().call()\n fee = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error(`ERROR: Failed to get pool fee: ${e.message}`)\n }\n return fee\n }\n\n /**\n * The normalized weight of a token. The combined normalized weights of all tokens will sum up to 1. (Note: the actual sum may be 1 plus or minus a few wei due to division precision loss)\n * @param {String} poolAddress\n * @param {String} token\n * @return {String}\n */\n async getNormalizedWeight(poolAddress: string, token: string): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let weight = null\n try {\n const result = await pool.methods.getNormalizedWeight(token).call()\n weight = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error(`ERROR: Failed to get normalized weight of a token: ${e.message}`)\n }\n return weight\n }\n\n /**\n * getDenormalizedWeight of a token in pool\n * @param {String} poolAddress\n * @param {String} token\n * @return {String}\n */\n async getDenormalizedWeight(poolAddress: string, token: string): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let weight = null\n try {\n const result = await pool.methods.getDenormalizedWeight(token).call()\n weight = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error('ERROR: Failed to get denormalized weight of a token in pool')\n }\n return weight\n }\n\n /**\n * getTotalDenormalizedWeight in pool\n * @param {String} poolAddress\n * @return {String}\n */\n async getTotalDenormalizedWeight(poolAddress: string): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let weight = null\n try {\n const result = await pool.methods.getTotalDenormalizedWeight().call()\n weight = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error('ERROR: Failed to get total denormalized weight in pool')\n }\n return weight\n }\n\n /**\n * swapExactAmountIn - Trades an exact tokenAmountIn of tokenIn taken from the caller by the pool, in exchange for at least minAmountOut of tokenOut given to the caller from the pool, with a maximum marginal price of maxPrice. Returns (tokenAmountOut, spotPriceAfter), where tokenAmountOut is the amount of token that came out of the pool, and spotPriceAfter is the new marginal spot price, ie, the result of getSpotPrice after the call. (These values are what are limited by the arguments; you are guaranteed tokenAmountOut >= minAmountOut and spotPriceAfter <= maxPrice).\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} tokenIn\n * @param {String} tokenAmountIn will be converted to wei\n * @param {String} tokenOut\n * @param {String} minAmountOut will be converted to wei\n * @param {String} maxPrice will be converted to wei\n * @return {TransactionReceipt}\n */\n async swapExactAmountIn(\n account: string,\n poolAddress: string,\n tokenIn: string,\n tokenAmountIn: string,\n tokenOut: string,\n minAmountOut: string,\n maxPrice?: string\n ): Promise<TransactionReceipt> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress, {\n from: account\n }),\n this.config\n )\n let result = null\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await pool.methods\n .swapExactAmountIn(\n tokenIn,\n this.web3.utils.toWei(tokenAmountIn),\n tokenOut,\n this.web3.utils.toWei(minAmountOut),\n maxPrice ? this.web3.utils.toWei(maxPrice) : MaxUint256\n )\n .estimateGas({ from: account }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n this.logger.log('Error estimate gas swapExactAmountIn')\n this.logger.log(e)\n estGas = gasLimitDefault\n }\n try {\n result = await pool.methods\n .swapExactAmountIn(\n tokenIn,\n this.web3.utils.toWei(tokenAmountIn),\n tokenOut,\n this.web3.utils.toWei(minAmountOut),\n maxPrice ? this.web3.utils.toWei(maxPrice) : MaxUint256\n )\n .send({\n from: account,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to swap exact amount in : ${e.message}`)\n }\n return result\n }\n\n /**\n * swapExactAmountOut\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} tokenIn\n * @param {String} maxAmountIn will be converted to wei\n * @param {String} tokenOut\n * @param {String} minAmountOut will be converted to wei\n * @param {String} maxPrice will be converted to wei\n * @return {TransactionReceipt}\n */\n async swapExactAmountOut(\n account: string,\n poolAddress: string,\n tokenIn: string,\n maxAmountIn: string,\n tokenOut: string,\n minAmountOut: string,\n maxPrice?: string\n ): Promise<TransactionReceipt> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress, {\n from: account\n }),\n this.config\n )\n let result = null\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await pool.methods\n .swapExactAmountOut(\n tokenIn,\n this.web3.utils.toWei(maxAmountIn),\n tokenOut,\n this.web3.utils.toWei(minAmountOut),\n maxPrice ? this.web3.utils.toWei(maxPrice) : MaxUint256\n )\n .estimateGas({ from: account }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n this.logger.log('Error estimate gas swapExactAmountIn')\n this.logger.log(e)\n }\n try {\n result = await pool.methods\n .swapExactAmountOut(\n tokenIn,\n this.web3.utils.toWei(maxAmountIn),\n tokenOut,\n this.web3.utils.toWei(minAmountOut),\n maxPrice ? this.web3.utils.toWei(maxPrice) : MaxUint256\n )\n .send({\n from: account,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to swap exact amount out: ${e.message}`)\n }\n return result\n }\n\n /**\n * Join the pool, getting poolAmountOut pool tokens. This will pull some of each of the currently trading tokens in the pool, meaning you must have called approve for each token for this pool. These values are limited by the array of maxAmountsIn in the order of the pool tokens.\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} poolAmountOut will be converted to wei\n * @param {String[]} maxAmountsIn array holding maxAmount per each token, will be converted to wei\n * @return {TransactionReceipt}\n */\n async joinPool(\n account: string,\n poolAddress: string,\n poolAmountOut: string,\n maxAmountsIn: string[]\n ): Promise<TransactionReceipt> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress, {\n from: account\n }),\n this.config\n )\n const weiMaxAmountsIn = []\n\n let amount: string\n\n for (amount of maxAmountsIn) {\n weiMaxAmountsIn.push(this.web3.utils.toWei(amount))\n }\n\n let result = null\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await pool.methods\n .joinPool(this.web3.utils.toWei(poolAmountOut), weiMaxAmountsIn)\n .estimateGas({ from: account }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n try {\n result = await pool.methods\n .joinPool(this.web3.utils.toWei(poolAmountOut), weiMaxAmountsIn)\n .send({\n from: account,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to join pool: ${e.message}`)\n }\n return result\n }\n\n /**\n * Exit the pool, paying poolAmountIn pool tokens and getting some of each of the currently trading tokens in return. These values are limited by the array of minAmountsOut in the order of the pool tokens.\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} poolAmountIn will be converted to wei\n * @param {String[]} minAmountsOut array holding minAmount per each token, will be converted to wei\n * @return {TransactionReceipt}\n */\n async exitPool(\n account: string,\n poolAddress: string,\n poolAmountIn: string,\n minAmountsOut: string[]\n ): Promise<TransactionReceipt> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress, {\n from: account\n }),\n this.config\n )\n const weiMinAmountsOut = []\n let amount: string\n\n for (amount of minAmountsOut) {\n weiMinAmountsOut.push(this.web3.utils.toWei(amount))\n }\n let result = null\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await pool.methods\n .exitPool(this.web3.utils.toWei(poolAmountIn), weiMinAmountsOut)\n .estimateGas({ from: account }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n try {\n result = await pool.methods\n .exitPool(this.web3.utils.toWei(poolAmountIn), weiMinAmountsOut)\n .send({\n from: account,\n gas: estGas,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to exit pool: ${e.message}`)\n }\n return result\n }\n\n /**\n * Pay tokenAmountIn of token tokenIn to join the pool, getting poolAmountOut of the pool shares.\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} tokenIn\n * @param {String} tokenAmountIn will be converted to wei\n * @param {String} minPoolAmountOut will be converted to wei\n * @return {TransactionReceipt}\n */\n async joinswapExternAmountIn(\n account: string,\n poolAddress: string,\n tokenIn: string,\n tokenAmountIn: string,\n minPoolAmountOut: string\n ): Promise<TransactionReceipt> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress, {\n from: account\n }),\n this.config\n )\n let result = null\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await pool.methods\n .joinswapExternAmountIn(\n tokenIn,\n this.web3.utils.toWei(tokenAmountIn),\n this.web3.utils.toWei(minPoolAmountOut)\n )\n .estimateGas({ from: account }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n try {\n result = await pool.methods\n .joinswapExternAmountIn(\n tokenIn,\n this.web3.utils.toWei(tokenAmountIn),\n this.web3.utils.toWei(minPoolAmountOut)\n )\n .send({\n from: account,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to pay tokens in order to \\\n join the pool: ${e.message}`)\n }\n return result\n }\n\n /**\n * Specify poolAmountOut pool shares that you want to get, and a token tokenIn to pay with. This costs tokenAmountIn tokens (these went into the pool).\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} tokenIn\n * @param {String} poolAmountOut will be converted to wei\n * @param {String} maxAmountIn will be converted to wei\n * @return {TransactionReceipt}\n */\n async joinswapPoolAmountOut(\n account: string,\n poolAddress: string,\n tokenIn: string,\n poolAmountOut: string,\n maxAmountIn: string\n ): Promise<TransactionReceipt> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress, {\n from: account\n }),\n this.config\n )\n let result = null\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await pool.methods\n .joinswapPoolAmountOut(\n tokenIn,\n this.web3.utils.toWei(poolAmountOut),\n this.web3.utils.toWei(maxAmountIn)\n )\n .estimateGas({ from: account }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n try {\n result = await pool.methods\n .joinswapPoolAmountOut(\n tokenIn,\n this.web3.utils.toWei(poolAmountOut),\n this.web3.utils.toWei(maxAmountIn)\n )\n .send({\n from: account,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error('ERROR: Failed to join swap pool amount out')\n }\n return result\n }\n\n /**\n * Pay poolAmountIn pool shares into the pool, getting minTokenAmountOut of the given token tokenOut out of the pool.\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} tokenOut\n * @param {String} poolAmountIn will be converted to wei\n * @param {String} minTokenAmountOut will be converted to wei\n * @return {TransactionReceipt}\n */\n async exitswapPoolAmountIn(\n account: string,\n poolAddress: string,\n tokenOut: string,\n poolAmountIn: string,\n minTokenAmountOut: string\n ): Promise<TransactionReceipt> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress, {\n from: account\n }),\n this.config\n )\n let result = null\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await pool.methods\n .exitswapPoolAmountIn(\n tokenOut,\n this.web3.utils.toWei(poolAmountIn),\n this.web3.utils.toWei(minTokenAmountOut)\n )\n .estimateGas({ from: account }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n try {\n result = await pool.methods\n .exitswapPoolAmountIn(\n tokenOut,\n this.web3.utils.toWei(poolAmountIn),\n this.web3.utils.toWei(minTokenAmountOut)\n )\n .send({\n from: account,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to pay pool shares into the pool: ${e.message}`)\n }\n return result\n }\n\n /**\n * Specify tokenAmountOut of token tokenOut that you want to get out of the pool. This costs poolAmountIn pool shares (these went into the pool).\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} tokenOut\n * @param {String} tokenAmountOut will be converted to wei\n * @param {String} maxPoolAmountIn will be converted to wei\n * @return {TransactionReceipt}\n */\n async exitswapExternAmountOut(\n account: string,\n poolAddress: string,\n tokenOut: string,\n tokenAmountOut: string,\n maxPoolAmountIn: string\n ): Promise<TransactionReceipt> {\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress, {\n from: account\n }),\n this.config\n )\n let result = null\n let estGas\n\n try {\n estGas = await pool.methods\n .exitswapExternAmountOut(\n tokenOut,\n this.web3.utils.toWei(tokenAmountOut),\n this.web3.utils.toWei(maxPoolAmountIn)\n )\n .estimateGas({ from: account }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n\n try {\n result = await pool.methods\n .exitswapExternAmountOut(\n tokenOut,\n this.web3.utils.toWei(tokenAmountOut),\n this.web3.utils.toWei(maxPoolAmountIn)\n )\n .send({\n from: account,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error('ERROR: Failed to exitswapExternAmountOut')\n }\n return result\n }\n\n /**\n * Get Spot Price of swaping tokenIn to tokenOut\n * @param {String} poolAddress\n * @param {String} tokenIn\n * @param {String} tokenOut\n * @return {String}\n */\n async getSpotPrice(\n poolAddress: string,\n tokenIn: string,\n tokenOut: string\n ): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let price = null\n try {\n const result = await pool.methods.getSpotPrice(tokenIn, tokenOut).call()\n price = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error('ERROR: Failed to get spot price of swapping tokenIn to tokenOut')\n }\n return price\n }\n\n /**\n * Get Spot Price of swaping tokenIn to tokenOut without fees\n * @param {String} poolAddress\n * @param {String} tokenIn\n * @param {String} tokenOut\n * @return {String}\n */\n async getSpotPriceSansFee(\n poolAddress: string,\n tokenIn: string,\n tokenOut: string\n ): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let price = null\n try {\n const result = await pool.methods.getSpotPriceSansFee(tokenIn, tokenOut).call()\n price = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error('ERROR: Failed to getSpotPriceSansFee')\n }\n return price\n }\n\n public async calcSpotPrice(\n poolAddress: string,\n tokenBalanceIn: string,\n tokenWeightIn: string,\n tokenBalanceOut: string,\n tokenWeightOut: string,\n swapFee: string\n ): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let amount = '0'\n try {\n const result = await pool.methods\n .calcSpotPrice(\n this.web3.utils.toWei(tokenBalanceIn),\n this.web3.utils.toWei(tokenWeightIn),\n this.web3.utils.toWei(tokenBalanceOut),\n this.web3.utils.toWei(tokenWeightOut),\n this.web3.utils.toWei(swapFee)\n )\n .call()\n amount = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error('ERROR: Failed to call calcSpotPrice')\n }\n return amount\n }\n\n public async calcInGivenOut(\n poolAddress: string,\n tokenBalanceIn: string,\n tokenWeightIn: string,\n tokenBalanceOut: string,\n tokenWeightOut: string,\n tokenAmountOut: string,\n swapFee: string\n ): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let amount = null\n if (new Decimal(tokenAmountOut).gte(tokenBalanceOut)) return null\n try {\n const result = await pool.methods\n .calcInGivenOut(\n this.web3.utils.toWei(tokenBalanceIn),\n this.web3.utils.toWei(tokenWeightIn),\n this.web3.utils.toWei(tokenBalanceOut),\n this.web3.utils.toWei(tokenWeightOut),\n this.web3.utils.toWei(tokenAmountOut),\n this.web3.utils.toWei(swapFee)\n )\n .call()\n amount = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error('ERROR: Failed to calcInGivenOut')\n }\n return amount\n }\n\n public async calcOutGivenIn(\n poolAddress: string,\n tokenBalanceIn: string,\n tokenWeightIn: string,\n tokenBalanceOut: string,\n tokenWeightOut: string,\n tokenAmountIn: string,\n swapFee: string\n ): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let amount = null\n try {\n const result = await pool.methods\n .calcOutGivenIn(\n this.web3.utils.toWei(tokenBalanceIn),\n this.web3.utils.toWei(tokenWeightIn),\n this.web3.utils.toWei(tokenBalanceOut),\n this.web3.utils.toWei(tokenWeightOut),\n this.web3.utils.toWei(tokenAmountIn),\n this.web3.utils.toWei(swapFee)\n )\n .call()\n amount = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error('ERROR: Failed to calcOutGivenIn')\n }\n return amount\n }\n\n public async calcPoolOutGivenSingleIn(\n poolAddress: string,\n tokenBalanceIn: string,\n tokenWeightIn: string,\n poolSupply: string,\n totalWeight: string,\n tokenAmountIn: string,\n swapFee: string\n ): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let amount = null\n try {\n const result = await pool.methods\n .calcPoolOutGivenSingleIn(\n this.web3.utils.toWei(tokenBalanceIn),\n this.web3.utils.toWei(tokenWeightIn),\n this.web3.utils.toWei(poolSupply),\n this.web3.utils.toWei(totalWeight),\n this.web3.utils.toWei(tokenAmountIn),\n this.web3.utils.toWei(swapFee)\n )\n .call()\n amount = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error(`ERROR: Failed to calculate PoolOutGivenSingleIn : ${e.message}`)\n }\n return amount\n }\n\n public async calcSingleInGivenPoolOut(\n poolAddress: string,\n tokenBalanceIn: string,\n tokenWeightIn: string,\n poolSupply: string,\n totalWeight: string,\n poolAmountOut: string,\n swapFee: string\n ): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let amount = null\n try {\n const result = await pool.methods\n .calcSingleInGivenPoolOut(\n this.web3.utils.toWei(tokenBalanceIn),\n this.web3.utils.toWei(tokenWeightIn),\n this.web3.utils.toWei(poolSupply),\n this.web3.utils.toWei(totalWeight),\n this.web3.utils.toWei(poolAmountOut),\n this.web3.utils.toWei(swapFee)\n )\n .call()\n amount = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error(`ERROR: Failed to calculate SingleInGivenPoolOut : ${e.message}`)\n }\n return amount\n }\n\n public async calcSingleOutGivenPoolIn(\n poolAddress: string,\n tokenBalanceOut: string,\n tokenWeightOut: string,\n poolSupply: string,\n totalWeight: string,\n poolAmountIn: string,\n swapFee: string\n ): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let amount = null\n try {\n const result = await pool.methods\n .calcSingleOutGivenPoolIn(\n this.web3.utils.toWei(tokenBalanceOut),\n this.web3.utils.toWei(tokenWeightOut),\n this.web3.utils.toWei(poolSupply),\n this.web3.utils.toWei(totalWeight),\n this.web3.utils.toWei(poolAmountIn),\n this.web3.utils.toWei(swapFee)\n )\n .call()\n amount = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error(`ERROR: Failed to calculate SingleOutGivenPoolIn : ${e.message}`)\n }\n return amount\n }\n\n public async calcPoolInGivenSingleOut(\n poolAddress: string,\n tokenBalanceOut: string,\n tokenWeightOut: string,\n poolSupply: string,\n totalWeight: string,\n tokenAmountOut: string,\n swapFee: string\n ): Promise<string> {\n const pool = setContractDefaults(\n new this.web3.eth.Contract(this.poolABI, poolAddress),\n this.config\n )\n let amount = null\n try {\n const result = await pool.methods\n .calcPoolInGivenSingleOut(\n this.web3.utils.toWei(tokenBalanceOut),\n this.web3.utils.toWei(tokenWeightOut),\n this.web3.utils.toWei(poolSupply),\n this.web3.utils.toWei(totalWeight),\n this.web3.utils.toWei(tokenAmountOut),\n this.web3.utils.toWei(swapFee)\n )\n .call()\n amount = this.web3.utils.fromWei(result)\n } catch (e) {\n this.logger.error(`ERROR: Failed to calculate PoolInGivenSingleOut : ${e.message}`)\n }\n return amount\n }\n\n /**\n * Get LOG_SWAP encoded topic\n * @return {String}\n */\n public getSwapEventSignature(): string {\n const abi = this.poolABI as AbiItem[]\n const eventdata = abi.find(function (o) {\n if (o.name === 'LOG_SWAP' && o.type === 'event') return o\n })\n const topic = this.web3.eth.abi.encodeEventSignature(eventdata as any)\n return topic\n }\n\n /**\n * Get LOG_JOIN encoded topic\n * @return {String}\n */\n public getJoinEventSignature(): string {\n const abi = this.poolABI as AbiItem[]\n const eventdata = abi.find(function (o) {\n if (o.name === 'LOG_JOIN' && o.type === 'event') return o\n })\n const topic = this.web3.eth.abi.encodeEventSignature(eventdata as any)\n return topic\n }\n\n /**\n * Get LOG_EXIT encoded topic\n * @return {String}\n */\n public getExitEventSignature(): string {\n const abi = this.poolABI as AbiItem[]\n const eventdata = abi.find(function (o) {\n if (o.name === 'LOG_EXIT' && o.type === 'event') return o\n })\n const topic = this.web3.eth.abi.encodeEventSignature(eventdata as any)\n return topic\n }\n}\n","import Web3 from 'web3'\nimport { AbiItem } from 'web3-utils/types'\nimport { TransactionReceipt, Log } from 'web3-core'\nimport { Pool } from './Pool'\nimport { EventData, Filter } from 'web3-eth-contract'\nimport BigNumber from 'bignumber.js'\nimport {\n SubscribablePromise,\n Logger,\n didNoZeroX,\n didPrefixed,\n setContractDefaults\n} from '../utils'\nimport Decimal from 'decimal.js'\nimport { ConfigHelperConfig } from '../utils/ConfigHelper'\n\ndeclare type PoolTransactionType = 'swap' | 'join' | 'exit'\n\nconst POOL_MAX_AMOUNT_IN_LIMIT = 0.25 // maximum 1/4 of the pool reserve\nconst POOL_MAX_AMOUNT_OUT_LIMIT = 0.25 // maximum 1/4 of the pool reserve\nconst BPFACTORY_DEPLOY_BLOCK = 0\nconst MAX_AWAIT_PROMISES = 10 // infura has a limit of 10 requests/sec\nexport interface PoolDetails {\n poolAddress: string\n tokens: string[]\n}\n\nexport interface PoolShare {\n poolAddress: string\n shares: string\n did: string\n}\n\nexport interface TokensReceived {\n dtAmount: string\n oceanAmount: string\n}\n\nexport interface PoolTransaction {\n poolAddress: string\n dtAddress: string\n caller: string\n transactionHash: string\n blockNumber: number\n timestamp: number\n tokenIn?: string\n tokenOut?: string\n tokenAmountIn?: string\n tokenAmountOut?: string\n type: PoolTransactionType\n}\n\nexport enum PoolCreateProgressStep {\n CreatingPool,\n ApprovingDatatoken,\n ApprovingOcean,\n SetupPool\n}\n\n/**\n * Ocean Pools submodule exposed under ocean.pool\n */\nexport class OceanPool extends Pool {\n public oceanAddress: string = null\n public dtAddress: string = null\n public startBlock: number\n\n constructor(\n web3: Web3,\n logger: Logger,\n factoryABI: AbiItem | AbiItem[] = null,\n poolABI: AbiItem | AbiItem[] = null,\n factoryAddress: string = null,\n oceanAddress: string = null,\n config?: ConfigHelperConfig\n ) {\n super(web3, logger, factoryABI, poolABI, factoryAddress, config)\n if (oceanAddress) {\n this.oceanAddress = oceanAddress\n }\n this.startBlock = (config && config.startBlock) || 0\n }\n\n /**\n * Create DataToken pool\n @param {String} account\n * @param {String} dtAddress DataToken address\n * @param {String} dtAmount DataToken amount\n * @param {String} dtWeight DataToken weight\n * @param {String} oceanAmount Ocean amount\n * @param {String} fee Swap fee. E.g. to get a 0.1% swapFee use `0.001`. The maximum allowed swapFee is `0.1` (10%).\n * @return {String}\n */\n public create(\n account: string,\n dtAddress: string,\n dtAmount: string,\n dtWeight: string,\n oceanAmount: string,\n fee: string\n ): SubscribablePromise<PoolCreateProgressStep, TransactionReceipt> {\n if (this.oceanAddress == null) {\n this.logger.error('ERROR: oceanAddress is not defined')\n throw new Error('ERROR: oceanAddress is not defined')\n }\n if (parseFloat(fee) > 0.1) {\n this.logger.error('ERROR: Swap fee too high. The maximum allowed swapFee is 10%')\n throw new Error('ERROR: Swap fee too high. The maximum allowed swapFee is 10%')\n }\n if (parseFloat(dtAmount) < 2) {\n this.logger.error('ERROR: Amount of DT is too low')\n throw new Error('ERROR: Amount of DT is too low')\n }\n if (parseFloat(dtWeight) > 9 || parseFloat(dtWeight) < 1) {\n this.logger.error('ERROR: Weight out of bounds (min 1, max9)')\n throw new Error('ERROR: Weight out of bounds (min 1, max9)')\n }\n return new SubscribablePromise(async (observer) => {\n observer.next(PoolCreateProgressStep.CreatingPool)\n const createTxid = await super.createPool(account)\n if (!createTxid) {\n this.logger.error('ERROR: Failed to call create pool')\n throw new Error('ERROR: Failed to call create pool')\n }\n const address = createTxid.events.BPoolRegistered.returnValues[0]\n const oceanWeight = 10 - parseFloat(dtWeight)\n this.dtAddress = dtAddress\n let txid\n\n observer.next(PoolCreateProgressStep.ApprovingDatatoken)\n txid = await this.approve(\n account,\n dtAddress,\n address,\n this.web3.utils.toWei(String(dtAmount))\n )\n if (!txid) {\n this.logger.error('ERROR: Failed to call approve DT token')\n throw new Error('ERROR: Failed to call approve DT token')\n }\n\n observer.next(PoolCreateProgressStep.ApprovingOcean)\n txid = await this.approve(\n account,\n this.oceanAddress,\n address,\n this.web3.utils.toWei(String(oceanAmount))\n )\n if (!txid) {\n this.logger.error('ERROR: Failed to call approve OCEAN token')\n throw new Error('ERROR: Failed to call approve OCEAN token')\n }\n\n observer.next(PoolCreateProgressStep.SetupPool)\n txid = await super.setup(\n account,\n address,\n dtAddress,\n this.web3.utils.toWei(String(dtAmount)),\n this.web3.utils.toWei(String(dtWeight)),\n this.oceanAddress,\n this.web3.utils.toWei(String(oceanAmount)),\n this.web3.utils.toWei(String(oceanWeight)),\n this.web3.utils.toWei(fee)\n )\n if (!txid) {\n this.logger.error('ERROR: Failed to create a new pool')\n throw new Error('ERROR: Failed to create a new pool')\n }\n return createTxid\n })\n }\n\n /**\n * Get DataToken address of token in this pool\n * @param {String} account\n * @param {String} poolAddress\n * @return {string}\n */\n public async getDTAddress(poolAddress: string): Promise<string> {\n this.dtAddress = null\n const tokens = await this.getCurrentTokens(poolAddress)\n let token: string\n\n if (tokens != null)\n for (token of tokens) {\n // TODO: Potential timing attack, left side: true\n if (token.toLowerCase() !== this.oceanAddress.toLowerCase())\n this.dtAddress = token\n }\n return this.dtAddress\n }\n\n /**\n * Get Ocean Token balance of a pool\n * @param {String} poolAddress\n * @return {String}\n */\n public async getOceanReserve(poolAddress: string): Promise<string> {\n if (this.oceanAddress == null) {\n this.logger.error('ERROR: oceanAddress is not defined')\n return null\n }\n return super.getReserve(poolAddress, this.oceanAddress)\n }\n\n /**\n * Get datatoken balance of a pool\n * @param {String} poolAddress\n * @return {String}\n */\n public async getDTReserve(poolAddress: string): Promise<string> {\n const dtAddress = await this.getDTAddress(poolAddress)\n return super.getReserve(poolAddress, dtAddress)\n }\n\n /**\n * Returns max amount that you can buy.\n * @param poolAddress\n * @param tokenAddress\n */\n public async getMaxBuyQuantity(\n poolAddress: string,\n tokenAddress: string\n ): Promise<string> {\n const balance = await super.getReserve(poolAddress, tokenAddress)\n return new Decimal(balance).div(3).toString()\n }\n\n /**\n * Returns max amount of OCEAN that you can buy.\n * @param poolAddress\n * @param tokenAddress\n */\n public async getOceanMaxBuyQuantity(poolAddress: string): Promise<string> {\n return this.getMaxBuyQuantity(poolAddress, this.oceanAddress)\n }\n\n /**\n * Returns max amount of DT that you can buy.\n * @param poolAddress\n * @param tokenAddress\n */\n public async getDTMaxBuyQuantity(poolAddress: string): Promise<string> {\n return this.getMaxBuyQuantity(poolAddress, await this.getDTAddress(poolAddress))\n }\n\n /**\n * Returns tokenInAmount required to get tokenOutAmount\n * @param poolAddress\n * @param tokenInAddress\n * @param tokenOutAddress\n * @param tokenOutAmount\n */\n public async calcInGivenOut(\n poolAddress: string,\n tokenInAddress: string,\n tokenOutAddress: string,\n tokenOutAmount: string\n ): Promise<string> {\n const result = await super.calcInGivenOut(\n poolAddress,\n await super.getReserve(poolAddress, tokenInAddress),\n await super.getDenormalizedWeight(poolAddress, tokenInAddress),\n await super.getReserve(poolAddress, tokenOutAddress),\n await super.getDenormalizedWeight(poolAddress, tokenOutAddress),\n tokenOutAmount,\n await this.getSwapFee(poolAddress)\n )\n\n return result\n }\n\n /**\n * Returns tokenOutAmount given tokenInAmount\n * @param poolAddress\n * @param tokenInAddress\n * @param tokenOutAddress\n * @param tokenInAmount\n */\n public async calcOutGivenIn(\n poolAddress: string,\n tokenInAddress: string,\n tokenOutAddress: string,\n tokenInAmount: string\n ): Promise<string> {\n const result = await super.calcOutGivenIn(\n poolAddress,\n await super.getReserve(poolAddress, tokenInAddress),\n await super.getDenormalizedWeight(poolAddress, tokenInAddress),\n await super.getReserve(poolAddress, tokenOutAddress),\n await super.getDenormalizedWeight(poolAddress, tokenOutAddress),\n tokenInAmount,\n await super.getSwapFee(poolAddress)\n )\n\n return result\n }\n\n /**\n * Returns no of shares receved for adding a token to the pool\n * @param poolAddress\n * @param tokenInAddress\n * @param tokenInAmount\n */\n public async calcPoolOutGivenSingleIn(\n poolAddress: string,\n tokenInAddress: string,\n tokenInAmount: string\n ): Promise<string> {\n const result = super.calcPoolOutGivenSingleIn(\n poolAddress,\n await super.getReserve(poolAddress, tokenInAddress),\n await super.getDenormalizedWeight(poolAddress, tokenInAddress),\n await super.getPoolSharesTotalSupply(poolAddress),\n await super.getTotalDenormalizedWeight(poolAddress),\n tokenInAmount,\n await super.getSwapFee(poolAddress)\n )\n return result\n }\n\n /**\n * Returns no of tokens required to get a specific no of poolShares\n * @param poolAddress\n * @param tokenInAddress\n * @param poolShares\n */\n public async calcSingleInGivenPoolOut(\n poolAddress: string,\n tokenInAddress: string,\n poolShares: string\n ): Promise<string> {\n const result = super.calcSingleInGivenPoolOut(\n poolAddress,\n await super.getReserve(poolAddress, tokenInAddress),\n await super.getDenormalizedWeight(poolAddress, tokenInAddress),\n await super.getPoolSharesTotalSupply(poolAddress),\n await super.getTotalDenormalizedWeight(poolAddress),\n poolShares,\n await super.getSwapFee(poolAddress)\n )\n return result\n }\n\n /**\n * Returns no of tokens received for spending a specific no of poolShares\n * @param poolAddress\n * @param tokenOutAddress\n * @param poolShares\n */\n public async calcSingleOutGivenPoolIn(\n poolAddress: string,\n tokenOutAddress: string,\n poolShares: string\n ): Promise<string> {\n const result = super.calcSingleOutGivenPoolIn(\n poolAddress,\n await super.getReserve(poolAddress, tokenOutAddress),\n await super.getDenormalizedWeight(poolAddress, tokenOutAddress),\n await super.getPoolSharesTotalSupply(poolAddress),\n await super.getTotalDenormalizedWeight(poolAddress),\n poolShares,\n await super.getSwapFee(poolAddress)\n )\n return result\n }\n\n /**\n * Returns no of pool shares required to receive a specified amount of tokens\n * @param poolAddress\n * @param tokenOutAddress\n * @param tokenOutAmount\n */\n public async calcPoolInGivenSingleOut(\n poolAddress: string,\n tokenOutAddress: string,\n tokenOutAmount: string\n ): Promise<string> {\n const result = super.calcPoolInGivenSingleOut(\n poolAddress,\n await super.getReserve(poolAddress, tokenOutAddress),\n await super.getDenormalizedWeight(poolAddress, tokenOutAddress),\n await super.getPoolSharesTotalSupply(poolAddress),\n await super.getTotalDenormalizedWeight(poolAddress),\n tokenOutAmount,\n await super.getSwapFee(poolAddress)\n )\n return result\n }\n\n /**\n * Returns no of pool shares required to receive specified amount of DT\n * @param poolAddress\n * @param dtAmount\n */\n public async getPoolSharesRequiredToRemoveDT(\n poolAddress: string,\n dtAmount: string\n ): Promise<string> {\n const dtAddress = await this.getDTAddress(poolAddress)\n return this.calcPoolInGivenSingleOut(poolAddress, dtAddress, dtAmount)\n }\n\n /**\n * Returns DT amnount received after spending poolShares\n * @param poolAddress\n * @param poolShares\n */\n public async getDTRemovedforPoolShares(\n poolAddress: string,\n poolShares: string\n ): Promise<string> {\n const dtAddress = await this.getDTAddress(poolAddress)\n return this.calcSingleOutGivenPoolIn(poolAddress, dtAddress, poolShares)\n }\n\n /**\n * Returns no of pool shares required to receive specified amount of DT\n * @param poolAddress\n * @param dtAmount\n */\n public async getPoolSharesRequiredToRemoveOcean(\n poolAddress: string,\n oceanAmount: string\n ): Promise<string> {\n return this.calcPoolInGivenSingleOut(poolAddress, this.oceanAddress, oceanAmount)\n }\n\n /**\n * Returns Ocean amnount received after spending poolShares\n * @param poolAddress\n * @param poolShares\n */\n public async getOceanRemovedforPoolShares(\n poolAddress: string,\n poolShares: string\n ): Promise<string> {\n return this.calcSingleOutGivenPoolIn(poolAddress, this.oceanAddress, poolShares)\n }\n\n /**\n * Returns Datatoken & Ocean amounts received after spending poolShares\n * @param {String} poolAddress\n * @param {String} poolShares\n * @return {TokensReceived}\n */\n public async getTokensRemovedforPoolShares(\n poolAddress: string,\n poolShares: string\n ): Promise<TokensReceived> {\n try {\n const totalPoolTokens = await this.getPoolSharesTotalSupply(poolAddress)\n const dtReserve = await this.getDTReserve(poolAddress)\n const oceanReserve = await this.getOceanReserve(poolAddress)\n const dtAmount = new Decimal(poolShares)\n .div(totalPoolTokens)\n .mul(dtReserve)\n .toString()\n const oceanAmount = new Decimal(poolShares)\n .div(totalPoolTokens)\n .mul(oceanReserve)\n .toString()\n return { dtAmount, oceanAmount }\n } catch (e) {\n this.logger.error(`ERROR: Unable to get token info. ${e.message}`)\n }\n }\n\n /**\n * Returns max DT amount that you can add to the pool\n * @param poolAddress\n */\n public async getDTMaxAddLiquidity(poolAddress: string): Promise<string> {\n const dtAddress = await this.getDTAddress(poolAddress)\n return this.getMaxAddLiquidity(poolAddress, dtAddress)\n }\n\n /**\n * Returns max Ocean amount that you can add to the pool\n * @param poolAddress\n */\n public async getOceanMaxAddLiquidity(poolAddress: string): Promise<string> {\n return this.getMaxAddLiquidity(poolAddress, this.oceanAddress)\n }\n\n /**\n * Returns max amount of tokens that you can add to the pool\n * @param poolAddress\n * @param tokenAddress\n */\n public async getMaxAddLiquidity(\n poolAddress: string,\n tokenAddress: string\n ): Promise<string> {\n const balance = await super.getReserve(poolAddress, tokenAddress)\n if (parseFloat(balance) > 0) {\n return new Decimal(balance).mul(POOL_MAX_AMOUNT_IN_LIMIT).toString()\n } else return '0'\n }\n\n /**\n * Returns max amount of tokens that you can withdraw from the pool\n * @param poolAddress\n * @param tokenAddress\n */\n public async getMaxRemoveLiquidity(\n poolAddress: string,\n tokenAddress: string\n ): Promise<string> {\n const balance = await super.getReserve(poolAddress, tokenAddress)\n if (parseFloat(balance) > 0) {\n return new Decimal(balance).mul(POOL_MAX_AMOUNT_OUT_LIMIT).toString()\n } else return '0'\n }\n\n /**\n * Returns max amount of DT that you can withdraw from the pool\n * @param poolAddress\n * @param tokenAddress\n */\n public async getDTMaxRemoveLiquidity(poolAddress: string): Promise<string> {\n const dtAddress = await this.getDTAddress(poolAddress)\n return this.getMaxRemoveLiquidity(poolAddress, dtAddress)\n }\n\n /**\n * Returns max amount of Ocean that you can withdraw from the pool\n * @param poolAddress\n * @param tokenAddress\n */\n public async getOceanMaxRemoveLiquidity(poolAddress: string): Promise<string> {\n return this.getMaxRemoveLiquidity(poolAddress, this.oceanAddress)\n }\n\n /**\n * Buy datatoken from a pool\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} amount datatoken amount\n * @param {String} oceanAmount Ocean Token amount payed\n * @param {String} maxPrice Maximum price to pay\n * @return {TransactionReceipt}\n */\n public async buyDT(\n account: string,\n poolAddress: string,\n dtAmountWanted: string,\n maxOceanAmount: string,\n maxPrice?: string\n ): Promise<TransactionReceipt> {\n if (this.oceanAddress == null) {\n this.logger.error('ERROR: undefined ocean token contract address')\n return null\n }\n const dtAddress = await this.getDTAddress(poolAddress)\n if (\n new Decimal(dtAmountWanted).greaterThan(await this.getDTMaxBuyQuantity(poolAddress))\n ) {\n this.logger.error('ERROR: Buy quantity exceeds quantity allowed')\n return null\n }\n const calcInGivenOut = await this.getOceanNeeded(poolAddress, dtAmountWanted)\n if (new Decimal(calcInGivenOut).greaterThan(maxOceanAmount)) {\n this.logger.error('ERROR: Not enough Ocean Tokens')\n return null\n }\n\n const txid = await super.approve(\n account,\n this.oceanAddress,\n poolAddress,\n this.web3.utils.toWei(maxOceanAmount)\n )\n if (!txid) {\n this.logger.error('ERROR: Failed to call approve OCEAN token')\n throw new Error('ERROR: Failed to call approve OCEAN token')\n }\n\n const tx = await super.swapExactAmountOut(\n account,\n poolAddress,\n this.oceanAddress,\n maxOceanAmount,\n dtAddress,\n dtAmountWanted,\n maxPrice\n )\n return tx\n }\n\n /**\n * Buy at least datatoken from a pool for a fixed Ocean amount\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} amount datatoken amount\n * @param {String} oceanAmount Ocean Token amount payed\n * @param {String} maxPrice Maximum price to pay\n * @return {TransactionReceipt}\n */\n public async buyDTWithExactOcean(\n account: string,\n poolAddress: string,\n minimumdtAmountWanted: string,\n oceanAmount: string,\n maxPrice?: string\n ): Promise<TransactionReceipt> {\n if (this.oceanAddress == null) {\n this.logger.error('ERROR: undefined ocean token contract address')\n return null\n }\n const dtAddress = await this.getDTAddress(poolAddress)\n if (\n new Decimal(minimumdtAmountWanted).greaterThan(\n await this.getDTMaxBuyQuantity(poolAddress)\n )\n ) {\n this.logger.error('ERROR: Buy quantity exceeds quantity allowed')\n return null\n }\n const calcInGivenOut = await this.getOceanNeeded(poolAddress, minimumdtAmountWanted)\n if (new Decimal(calcInGivenOut).greaterThan(oceanAmount)) {\n this.logger.error('ERROR: Not enough Ocean Tokens')\n return null\n }\n\n const txid = await super.approve(\n account,\n this.oceanAddress,\n poolAddress,\n this.web3.utils.toWei(oceanAmount)\n )\n if (!txid) {\n this.logger.error('ERROR: Failed to call approve OCEAN token')\n throw new Error('ERROR: Failed to call approve OCEAN token')\n }\n\n const tx = await super.swapExactAmountIn(\n account,\n poolAddress,\n this.oceanAddress,\n oceanAmount,\n dtAddress,\n minimumdtAmountWanted,\n maxPrice\n )\n return tx\n }\n\n /**\n * Sell a specific amount of datatoken to get some ocean tokens\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} amount datatoken amount to be sold\n * @param {String} oceanAmount Ocean Token amount expected\n * @param {String} maxPrice Minimum price to sell\n * @return {TransactionReceipt}\n */\n public async sellDT(\n account: string,\n poolAddress: string,\n dtAmount: string,\n oceanAmountWanted: string,\n maxPrice?: string\n ): Promise<TransactionReceipt> {\n if (this.oceanAddress == null) {\n this.logger.error('ERROR: oceanAddress is not defined')\n return null\n }\n const dtAddress = await this.getDTAddress(poolAddress)\n if (\n new Decimal(oceanAmountWanted).greaterThan(\n await this.getOceanMaxBuyQuantity(poolAddress)\n )\n ) {\n this.logger.error('ERROR: Buy quantity exceeds quantity allowed')\n return null\n }\n const calcOutGivenIn = await this.getOceanReceived(poolAddress, dtAmount)\n if (new Decimal(calcOutGivenIn).lessThan(oceanAmountWanted)) {\n this.logger.error('ERROR: Not enough datatokens')\n return null\n }\n\n const txid = await super.approve(\n account,\n dtAddress,\n poolAddress,\n this.web3.utils.toWei(dtAmount)\n )\n if (!txid) {\n this.logger.error('ERROR: Failed to call approve DT token')\n throw new Error('ERROR: Failed to call approve DT token')\n }\n\n const tx = await super.swapExactAmountIn(\n account,\n poolAddress,\n dtAddress,\n dtAmount,\n this.oceanAddress,\n oceanAmountWanted,\n maxPrice\n )\n return tx\n }\n\n /**\n * Add datatoken amount to pool liquidity\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} amount datatoken amount\n * @return {TransactionReceipt}\n */\n public async addDTLiquidity(\n account: string,\n poolAddress: string,\n amount: string\n ): Promise<TransactionReceipt> {\n const dtAddress = await this.getDTAddress(poolAddress)\n const maxAmount = await this.getMaxAddLiquidity(poolAddress, dtAddress)\n if (new Decimal(amount).greaterThan(maxAmount)) {\n this.logger.error('ERROR: Too much reserve to add')\n return null\n }\n\n const txid = await super.approve(\n account,\n dtAddress,\n poolAddress,\n this.web3.utils.toWei(amount)\n )\n if (!txid) {\n this.logger.error('ERROR: Failed to call approve DT token')\n throw new Error('ERROR: Failed to call approve DT token')\n }\n\n const result = await super.joinswapExternAmountIn(\n account,\n poolAddress,\n dtAddress,\n amount,\n '0'\n )\n return result\n }\n\n /**\n * Remove datatoken amount from pool liquidity\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} amount datatoken amount\n * @param {String} maximumPoolShares\n * @return {TransactionReceipt}\n */\n public async removeDTLiquidity(\n account: string,\n poolAddress: string,\n amount: string,\n maximumPoolShares: string\n ): Promise<TransactionReceipt> {\n const dtAddress = await this.getDTAddress(poolAddress)\n const maxAmount = await this.getDTMaxRemoveLiquidity(poolAddress)\n if (new Decimal(amount).greaterThan(maxAmount)) {\n this.logger.error('ERROR: Too much reserve to remove')\n return null\n }\n const usershares = await this.sharesBalance(account, poolAddress)\n if (new Decimal(usershares).lessThan(maximumPoolShares)) {\n this.logger.error('ERROR: Not enough poolShares')\n return null\n }\n const sharesRequired = await this.getPoolSharesRequiredToRemoveDT(poolAddress, amount)\n if (new Decimal(maximumPoolShares).lessThan(sharesRequired)) {\n this.logger.error('ERROR: Not enough poolShares')\n return null\n }\n // Balancer bug fix\n if (new Decimal(maximumPoolShares).lessThan(sharesRequired))\n maximumPoolShares = new Decimal(maximumPoolShares).mul(0.9999).toString()\n // Balance bug fix\n return this.exitswapExternAmountOut(\n account,\n poolAddress,\n dtAddress,\n amount,\n maximumPoolShares\n )\n }\n\n /**\n * Add Ocean Token amount to pool liquidity\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} amount Ocean Token amount in OCEAN\n * @return {TransactionReceipt}\n */\n public async addOceanLiquidity(\n account: string,\n poolAddress: string,\n amount: string\n ): Promise<TransactionReceipt> {\n if (this.oceanAddress == null) {\n this.logger.error('ERROR: oceanAddress is not defined')\n return null\n }\n const maxAmount = await this.getOceanMaxAddLiquidity(poolAddress)\n if (new Decimal(amount).greaterThan(maxAmount)) {\n this.logger.error('ERROR: Too much reserve to add')\n return null\n }\n\n const txid = await super.approve(\n account,\n this.oceanAddress,\n poolAddress,\n this.web3.utils.toWei(amount)\n )\n if (!txid) {\n this.logger.error('ERROR: Failed to call approve OCEAN token')\n throw new Error('ERROR: Failed to call approve OCEAN token')\n }\n\n const result = await super.joinswapExternAmountIn(\n account,\n poolAddress,\n this.oceanAddress,\n amount,\n '0'\n )\n return result\n }\n\n /**\n * Remove Ocean Token amount from pool liquidity based on the minimum allowed of Ocean Tokens received\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} poolShares pool shares\n * @param {String} minOcean minimum amount of OCEAN received\n * @return {TransactionReceipt}\n */\n public async removeOceanLiquidityWithMinimum(\n account: string,\n poolAddress: string,\n poolShares: string,\n minOcean: string\n ): Promise<TransactionReceipt> {\n if (this.oceanAddress == null) {\n this.logger.error('ERROR: oceanAddress is not defined')\n return null\n }\n const usershares = await this.sharesBalance(account, poolAddress)\n if (new Decimal(usershares).lessThan(poolShares)) {\n this.logger.error('ERROR: Not enough poolShares')\n return null\n }\n\n return super.exitswapPoolAmountIn(\n account,\n poolAddress,\n this.oceanAddress,\n poolShares,\n minOcean\n )\n }\n\n /**\n * Remove Ocean Token amount from pool liquidity based on the maximum pool shares allowed to be spent\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} amount Ocean Token amount in OCEAN\n * @param {String} maximumPoolShares maximum pool shares allowed to be spent\n * @return {TransactionReceipt}\n */\n public async removeOceanLiquidity(\n account: string,\n poolAddress: string,\n amount: string,\n maximumPoolShares: string\n ): Promise<TransactionReceipt> {\n if (this.oceanAddress == null) {\n this.logger.error('ERROR: oceanAddress is not defined')\n return null\n }\n const maxAmount = await this.getOceanMaxRemoveLiquidity(poolAddress)\n if (new Decimal(amount).greaterThan(maxAmount)) {\n this.logger.error('ERROR: Too much reserve to remove')\n return null\n }\n const usershares = await this.sharesBalance(account, poolAddress)\n if (new Decimal(usershares).lessThan(maximumPoolShares)) {\n this.logger.error('ERROR: Not enough poolShares')\n return null\n }\n const sharesRequired = await this.getPoolSharesRequiredToRemoveOcean(\n poolAddress,\n amount\n )\n if (new Decimal(maximumPoolShares).lessThan(sharesRequired)) {\n this.logger.error('ERROR: Not enough poolShares')\n return null\n }\n // Balancer bug fix\n if (new Decimal(maximumPoolShares).lessThan(sharesRequired))\n maximumPoolShares = new Decimal(maximumPoolShares).mul(0.9999).toString()\n // Balance bug fix\n return super.exitswapExternAmountOut(\n account,\n poolAddress,\n this.oceanAddress,\n amount,\n maximumPoolShares\n )\n }\n\n /**\n * Remove pool liquidity\n * @param {String} account\n * @param {String} poolAddress\n * @param {String} poolShares\n * @param {String} minDT Minimum DT expected (defaults 0)\n * @param {String} poolShares Minim Ocean expected (defaults 0)\n * @return {TransactionReceipt}\n */\n public async removePoolLiquidity(\n account: string,\n poolAddress: string,\n poolShares: string,\n minDT = '0',\n minOcean = '0'\n ): Promise<TransactionReceipt> {\n const usershares = await this.sharesBalance(account, poolAddress)\n if (new Decimal(usershares).lessThan(poolShares)) {\n this.logger.error('ERROR: Not enough poolShares')\n return null\n }\n // Balancer bug fix\n if (new Decimal(usershares).equals(poolShares))\n poolShares = new Decimal(poolShares).mul(0.9999).toString()\n // Balance bug fix\n return this.exitPool(account, poolAddress, poolShares, [minDT, minOcean])\n }\n\n /**\n * Get datatoken price from pool\n * @param {String} poolAddress\n * @return {String}\n */\n public async getDTPrice(poolAddress: string): Promise<string> {\n if (this.oceanAddress == null) {\n this.logger.error('ERROR: oceanAddress is not defined')\n return '0'\n }\n return this.getOceanNeeded(poolAddress, '1')\n }\n\n /**\n * Search all pools that have datatoken in their composition\n * @param {String} dtAddress\n * @return {String[]}\n */\n public async searchPoolforDT(dtAddress: string): Promise<string[]> {\n const result: string[] = []\n const factory = setContractDefaults(\n new this.web3.eth.Contract(this.factoryABI, this.factoryAddress),\n this.config\n )\n const events = await factory.getPastEvents('BPoolRegistered', {\n filter: {},\n fromBlock: this.startBlock,\n toBlock: 'latest'\n })\n events.sort((a, b) => (a.blockNumber > b.blockNumber ? 1 : -1))\n for (let i = 0; i < events.length; i++) {\n const constituents = await super.getCurrentTokens(events[i].returnValues[0])\n if (constituents.includes(dtAddress)) result.push(events[i].returnValues[0])\n }\n return result\n }\n\n public async getOceanNeeded(poolAddress: string, dtRequired: string): Promise<string> {\n const dtAddress = await this.getDTAddress(poolAddress)\n if (\n new Decimal(dtRequired).greaterThan(await this.getDTMaxBuyQuantity(poolAddress))\n ) {\n return '0'\n }\n return this.calcInGivenOut(poolAddress, this.oceanAddress, dtAddress, dtRequired)\n }\n\n /**\n * Calculate how many Ocean Tokens are you going to receive for selling a specific dtAmount (selling DT)\n * @param {String} poolAddress\n * @param {String} dtAmount\n * @return {String[]} - amount of ocean tokens received\n */\n public async getOceanReceived(poolAddress: string, dtAmount: string): Promise<string> {\n const dtAddress = await this.getDTAddress(poolAddress)\n return this.calcOutGivenIn(poolAddress, dtAddress, this.oceanAddress, dtAmount)\n }\n\n /**\n * Calculate how many data token are you going to receive for selling a specific oceanAmount (buying DT)\n * @param {String} poolAddress\n * @param {String} oceanAmount\n * @return {String[]} - amount of ocean tokens received\n */\n public async getDTReceived(poolAddress: string, oceanAmount: string): Promise<string> {\n const dtAddress = await this.getDTAddress(poolAddress)\n return this.calcOutGivenIn(poolAddress, this.oceanAddress, dtAddress, oceanAmount)\n }\n\n public async getDTNeeded(poolAddress: string, OceanRequired: string): Promise<string> {\n const dtAddress = await this.getDTAddress(poolAddress)\n if (\n new Decimal(OceanRequired).greaterThan(\n await this.getOceanMaxBuyQuantity(poolAddress)\n )\n ) {\n return '0'\n }\n return this.calcInGivenOut(poolAddress, dtAddress, this.oceanAddress, OceanRequired)\n }\n\n /**\n * Search all pools created by an address\n * @param {String} account If empty, will return all pools ever created by anybody\n * @return {PoolDetails[]}\n */\n public async getPoolsbyCreator(account?: string): Promise<PoolDetails[]> {\n const result: PoolDetails[] = []\n const factory = setContractDefaults(\n new this.web3.eth.Contract(this.factoryABI, this.factoryAddress),\n this.config\n )\n\n const events = await factory.getPastEvents('BPoolRegistered', {\n filter: account ? { registeredBy: account } : {},\n fromBlock: this.startBlock,\n toBlock: 'latest'\n })\n for (let i = 0; i < events.length; i++) {\n if (!account || events[i].returnValues[1].toLowerCase() === account.toLowerCase())\n result.push(await this.getPoolDetails(events[i].returnValues[0]))\n }\n return result\n }\n\n private async getResult(account: string, event: EventData): Promise<PoolShare> {\n const shares = await super.sharesBalance(account, event.returnValues[0])\n if (parseFloat(shares) > 0) {\n const dtAddress = await this.getDTAddress(event.returnValues[0])\n if (dtAddress) {\n const onePool: PoolShare = {\n shares,\n poolAddress: event.returnValues[0],\n did: didPrefixed(didNoZeroX(dtAddress))\n }\n return onePool\n }\n }\n }\n\n /**\n * Search all pools in which a user has shares\n * @param {String} account\n * @return {AllPoolsShares[]}\n */\n public async getPoolSharesByAddress(account: string): Promise<PoolShare[]> {\n const result: PoolShare[] = []\n const factory = setContractDefaults(\n new this.web3.eth.Contract(this.factoryABI, this.factoryAddress),\n this.config\n )\n const events = await factory.getPastEvents('BPoolRegistered', {\n filter: {},\n fromBlock: this.startBlock,\n toBlock: 'latest'\n })\n let promises = []\n for (let i = 0; i < events.length; i++) {\n promises.push(this.getResult(account, events[i]))\n if (promises.length > MAX_AWAIT_PROMISES) {\n const results = await Promise.all(promises)\n for (let j = 0; j < results.length; j++) {\n result.push(results[j])\n }\n promises = []\n }\n }\n if (promises.length > 0) {\n const results = await Promise.all(promises)\n for (let j = 0; j < results.length; j++) {\n result.push(results[j])\n }\n promises = []\n }\n\n const filteredResult = result.filter((share) => {\n return share !== undefined\n })\n return filteredResult\n }\n\n /**\n * Get pool details\n * @param {String} poolAddress Pool address\n * @return {PoolDetails}\n */\n public async getPoolDetails(poolAddress: string): Promise<PoolDetails> {\n const tokens = await super.getFinalTokens(poolAddress)\n const details: PoolDetails = { poolAddress, tokens }\n return details\n }\n\n /**\n * Get all actions from a pool (join,exit,swap)\n * @param {String} poolAddress Pool address\n * @param {String} account Optional, filter for this address\n * @return {PoolTransaction[]}\n */\n public async getPoolLogs(\n poolAddress: string,\n startBlock = 0,\n account?: string\n ): Promise<PoolTransaction[]> {\n const results: PoolTransaction[] = []\n const dtAddress = await this.getDTAddress(poolAddress)\n if (startBlock === 0) startBlock = this.startBlock\n const swapTopic = super.getSwapEventSignature()\n const joinTopic = super.getJoinEventSignature()\n const exitTopic = super.getExitEventSignature()\n let addressTopic\n if (account)\n addressTopic = '0x000000000000000000000000' + account.substring(2).toLowerCase()\n else addressTopic = null\n const events = await this.web3.eth.getPastLogs({\n address: poolAddress,\n topics: [[swapTopic, joinTopic, exitTopic], addressTopic],\n fromBlock: startBlock,\n toBlock: 'latest'\n })\n\n let promises = []\n for (let i = 0; i < events.length; i++) {\n promises.push(this.getEventData(poolAddress, dtAddress, events[i]))\n if (promises.length > MAX_AWAIT_PROMISES) {\n const data = await Promise.all(promises)\n for (let j = 0; j < data.length; j++) {\n results.push(data[j])\n }\n promises = []\n }\n }\n if (promises.length > 0) {\n const data = await Promise.all(promises)\n for (let j = 0; j < data.length; j++) {\n results.push(data[j])\n }\n promises = []\n }\n\n // for (let i = 0; i < events.length; i++) {\n // switch (events[i].topics[0]) {\n // case swapTopic:\n // results.push(await this.getEventData('swap', poolAddress, dtAddress, events[i]))\n // break\n // case joinTopic:\n // results.push(await this.getEventData('join', poolAddress, dtAddress, events[i]))\n // break\n // case exitTopic:\n // results.push(await this.getEventData('exit', poolAddress, dtAddress, events[i]))\n // break\n // }\n // }\n const eventResults = results.filter((share) => {\n return share !== undefined\n })\n return eventResults\n }\n\n /**\n * Get all logs on all pools for a specific address\n * @param {String} account\n * @return {PoolTransaction[]}\n */\n public async getAllPoolLogs(account: string): Promise<PoolTransaction[]> {\n const results: PoolTransaction[][] = []\n const factory = setContractDefaults(\n new this.web3.eth.Contract(this.factoryABI, this.factoryAddress),\n this.config\n )\n const events = await factory.getPastEvents('BPoolRegistered', {\n filter: {},\n fromBlock: this.startBlock,\n toBlock: 'latest'\n })\n\n let promises = []\n for (let i = 0; i < events.length; i++) {\n promises.push(\n this.getPoolLogs(events[i].returnValues[0], events[i].blockNumber, account)\n )\n if (promises.length > MAX_AWAIT_PROMISES) {\n const data = await Promise.all(promises)\n for (let j = 0; j < data.length; j++) {\n results.push(data[j])\n }\n promises = []\n }\n }\n if (promises.length > 0) {\n const data = await Promise.all(promises)\n for (let j = 0; j < data.length; j++) {\n results.push(data[j])\n }\n promises = []\n }\n\n const concatResults = results.reduce((elem1, elem2) => elem1.concat(elem2))\n\n return concatResults\n }\n\n private async getEventData(\n poolAddress: string,\n dtAddress: string,\n data: Log\n ): Promise<PoolTransaction> {\n const blockDetails = await this.web3.eth.getBlock(data.blockNumber)\n const swapTopic = super.getSwapEventSignature()\n const joinTopic = super.getJoinEventSignature()\n const exitTopic = super.getExitEventSignature()\n let type: PoolTransactionType\n switch (data.topics[0]) {\n case swapTopic:\n type = 'swap'\n break\n case joinTopic:\n type = 'join'\n break\n case exitTopic:\n type = 'exit'\n break\n }\n let result: PoolTransaction = {\n poolAddress,\n dtAddress,\n caller: data.topics[1],\n transactionHash: data.transactionHash,\n blockNumber: data.blockNumber,\n timestamp: parseInt(String(blockDetails.timestamp)),\n type\n }\n let params\n switch (type) {\n case 'swap':\n params = this.web3.eth.abi.decodeParameters(['uint256', 'uint256'], data.data)\n result = {\n ...result,\n tokenIn: '0x' + data.topics[2].substring(data.topics[2].length - 40),\n tokenOut: '0x' + data.topics[3].substring(data.topics[3].length - 40),\n tokenAmountIn: this.web3.utils.fromWei(params[0]),\n tokenAmountOut: this.web3.utils.fromWei(params[1])\n }\n break\n case 'join':\n params = this.web3.eth.abi.decodeParameters(['uint256'], data.data)\n result = {\n ...result,\n tokenIn: '0x' + data.topics[2].substring(data.topics[2].length - 40),\n tokenAmountIn: this.web3.utils.fromWei(params[0])\n }\n break\n case 'exit':\n params = this.web3.eth.abi.decodeParameters(['uint256'], data.data)\n result = {\n ...result,\n tokenOut: '0x' + data.topics[2].substring(data.topics[2].length - 40),\n tokenAmountOut: this.web3.utils.fromWei(params[0])\n }\n break\n }\n return result\n }\n\n private async computeSlippage(\n poolAddress: string,\n tokenInBalance: string,\n tokenInWeight: string,\n tokenOutBalance: string,\n tokenOutWeight: string,\n newTokenInBalance: string,\n newTokenOutBalance: string,\n swapfee: string\n ) {\n const initialPrice = await super.calcSpotPrice(\n poolAddress,\n tokenInBalance,\n tokenInWeight,\n tokenOutBalance,\n tokenOutWeight,\n swapfee\n )\n\n const newPrice = await super.calcSpotPrice(\n poolAddress,\n newTokenInBalance,\n tokenInWeight,\n newTokenOutBalance,\n tokenOutWeight,\n swapfee\n )\n return new Decimal(newPrice).mul(100).div(initialPrice).minus(100).toString()\n }\n\n /* Get slippage for buying some datatokens while spending exactly oceanAmount ocean tokens */\n public async computeBuySlippage(\n poolAddress: string,\n oceanAmount: string\n ): Promise<string> {\n const dtAddress = await this.getDTAddress(poolAddress)\n const dtWeight = await super.getDenormalizedWeight(poolAddress, dtAddress)\n const oceanWeight = await super.getDenormalizedWeight(poolAddress, this.oceanAddress)\n const dtReserve = await super.getReserve(poolAddress, dtAddress)\n const oceanReserve = await super.getReserve(poolAddress, dtAddress)\n const swapFee = await super.getSwapFee(poolAddress)\n const dtReceived = await super.calcOutGivenIn(\n poolAddress,\n oceanReserve,\n oceanWeight,\n dtReserve,\n dtWeight,\n oceanAmount,\n swapFee\n )\n const newDtReserve = new BigNumber(this.web3.utils.toWei(dtReserve)).minus(\n this.web3.utils.toWei(dtReceived)\n )\n const newOceanReserve = new BigNumber(this.web3.utils.toWei(oceanReserve)).plus(\n this.web3.utils.toWei(oceanAmount)\n )\n const slippage = await this.computeSlippage(\n poolAddress,\n oceanReserve,\n oceanWeight,\n dtReserve,\n dtWeight,\n this.web3.utils.fromWei(newOceanReserve.toString()),\n this.web3.utils.fromWei(newDtReserve.toString()),\n swapFee\n )\n return slippage\n }\n\n /* Get slippage for selling an exact amount of datatokens to get some ocean tokens */\n public async computeSellSlippage(\n poolAddress: string,\n dtAmount: string\n ): Promise<string> {\n const dtAddress = await this.getDTAddress(poolAddress)\n const dtWeight = await super.getDenormalizedWeight(poolAddress, dtAddress)\n const oceanWeight = await super.getDenormalizedWeight(poolAddress, this.oceanAddress)\n const dtReserve = await super.getReserve(poolAddress, dtAddress)\n const oceanReserve = await super.getReserve(poolAddress, dtAddress)\n const swapFee = await super.getSwapFee(poolAddress)\n const oceanReceived = await super.calcOutGivenIn(\n poolAddress,\n dtReserve,\n dtWeight,\n oceanReserve,\n oceanWeight,\n dtAmount,\n swapFee\n )\n const newDtReserve = new BigNumber(this.web3.utils.toWei(dtReserve)).plus(\n this.web3.utils.toWei(dtAmount)\n )\n const newOceanReserve = new BigNumber(this.web3.utils.toWei(oceanReserve)).minus(\n this.web3.utils.toWei(oceanReceived)\n )\n const slippage = await this.computeSlippage(\n poolAddress,\n dtReserve,\n dtWeight,\n oceanReserve,\n oceanWeight,\n this.web3.utils.fromWei(newDtReserve.toString()),\n this.web3.utils.fromWei(newOceanReserve.toString()),\n swapFee\n )\n return slippage\n }\n}\n","import defaultFixedRateExchangeABI from '@oceanprotocol/contracts/artifacts/FixedRateExchange.json'\nimport BigNumber from 'bignumber.js'\nimport { TransactionReceipt } from 'web3-core'\nimport { Contract, EventData } from 'web3-eth-contract'\nimport { AbiItem } from 'web3-utils/types'\nimport Web3 from 'web3'\nimport {\n SubscribablePromise,\n Logger,\n getFairGasPrice,\n setContractDefaults\n} from '../utils'\nimport { DataTokens } from '../datatokens/Datatokens'\nimport { ConfigHelperConfig } from '../utils/ConfigHelper'\n\nconst MAX_AWAIT_PROMISES = 10\n\nexport interface FixedPriceExchange {\n exchangeID?: string\n exchangeOwner: string\n dataToken: string\n baseToken: string\n fixedRate: string\n active: boolean\n supply: string\n}\n\nexport interface FixedPriceSwap {\n exchangeID: string\n caller: string\n baseTokenAmount: string\n dataTokenAmount: string\n}\n\nexport enum FixedRateCreateProgressStep {\n CreatingExchange,\n ApprovingDatatoken\n}\n\nexport class OceanFixedRateExchange {\n public GASLIMIT_DEFAULT = 1000000\n /** Ocean related functions */\n public oceanAddress: string = null\n public fixedRateExchangeAddress: string\n public fixedRateExchangeABI: AbiItem | AbiItem[]\n public web3: Web3\n public contract: Contract = null\n private logger: Logger\n public datatokens: DataTokens\n public startBlock: number\n private config: ConfigHelperConfig\n\n /**\n * Instantiate FixedRateExchange\n * @param {any} web3\n * @param {String} fixedRateExchangeAddress\n * @param {any} fixedRateExchangeABI\n * @param {String} oceanAddress\n */\n constructor(\n web3: Web3,\n logger: Logger,\n fixedRateExchangeAddress: string = null,\n fixedRateExchangeABI: AbiItem | AbiItem[] = null,\n oceanAddress: string = null,\n datatokens: DataTokens,\n config?: ConfigHelperConfig\n ) {\n this.web3 = web3\n this.fixedRateExchangeAddress = fixedRateExchangeAddress\n this.config = config\n this.startBlock = (config && config.startBlock) || 0\n this.fixedRateExchangeABI =\n fixedRateExchangeABI || (defaultFixedRateExchangeABI.abi as AbiItem[])\n this.oceanAddress = oceanAddress\n this.datatokens = datatokens\n if (web3)\n this.contract = setContractDefaults(\n new this.web3.eth.Contract(\n this.fixedRateExchangeABI,\n this.fixedRateExchangeAddress\n ),\n this.config\n )\n this.logger = logger\n }\n\n /**\n * Creates new exchange pair between Ocean Token and data token.\n * @param {String} dataToken Data Token Contract Address\n * @param {Number} rate exchange rate\n * @param {String} address User address\n * @param {String} amount Optional, amount of datatokens to be approved for the exchange\n * @return {Promise<TransactionReceipt>} TransactionReceipt\n */\n public create(\n dataToken: string,\n rate: string,\n address: string,\n amount?: string\n ): SubscribablePromise<FixedRateCreateProgressStep, TransactionReceipt> {\n return this.createExchange(this.oceanAddress, dataToken, rate, address, amount)\n }\n\n /**\n * Creates new exchange pair between Ocean Token and data token.\n * @param {String} dataToken Data Token Contract Address\n * @param {Number} rate exchange rate\n * @param {String} address User address\n * @param {String} amount Optional, amount of datatokens to be approved for the exchange\n * @return {Promise<TransactionReceipt>} TransactionReceipt\n */\n public createExchange(\n baseToken: string,\n dataToken: string,\n rate: string,\n address: string,\n amount?: string\n ): SubscribablePromise<FixedRateCreateProgressStep, TransactionReceipt> {\n return new SubscribablePromise(async (observer) => {\n observer.next(FixedRateCreateProgressStep.CreatingExchange)\n let estGas\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n try {\n estGas = await this.contract.methods\n .create(baseToken, dataToken, this.web3.utils.toWei(rate))\n .estimateGas({ from: address }, (err, estGas) =>\n err ? gasLimitDefault : estGas\n )\n } catch (e) {\n estGas = gasLimitDefault\n }\n let exchangeId = null\n let trxReceipt = null\n try {\n trxReceipt = await this.contract.methods\n .create(baseToken, dataToken, this.web3.utils.toWei(rate))\n .send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n exchangeId = trxReceipt.events.ExchangeCreated.returnValues[0]\n } catch (e) {\n this.logger.error(`ERROR: Failed to create new exchange: ${e.message}`)\n }\n if (amount && exchangeId) {\n observer.next(FixedRateCreateProgressStep.ApprovingDatatoken)\n this.datatokens.approve(dataToken, this.fixedRateExchangeAddress, amount, address)\n }\n return trxReceipt\n })\n }\n\n /**\n * Creates unique exchange identifier.\n * @param {String} dataToken Data Token Contract Address\n * @param {String} owner Owner of the exchange\n * @return {Promise<string>} exchangeId\n */\n public async generateExchangeId(dataToken: string, owner: string): Promise<string> {\n const exchangeId = await this.contract.methods\n .generateExchangeId(this.oceanAddress, dataToken, owner)\n .call()\n return exchangeId\n }\n\n /**\n * Atomic swap\n * @param {String} exchangeId ExchangeId\n * @param {Number} dataTokenAmount Amount of Data Tokens\n * @param {String} address User address\n * @return {Promise<TransactionReceipt>} transaction receipt\n */\n public async buyDT(\n exchangeId: string,\n dataTokenAmount: string,\n address: string\n ): Promise<TransactionReceipt> {\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await this.contract.methods\n .swap(exchangeId, this.web3.utils.toWei(String(dataTokenAmount)))\n .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n try {\n const trxReceipt = await this.contract.methods\n .swap(exchangeId, this.web3.utils.toWei(String(dataTokenAmount)))\n .send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n return trxReceipt\n } catch (e) {\n this.logger.error(`ERROR: Failed to buy datatokens: ${e.message}`)\n return null\n }\n }\n\n /**\n * Gets total number of exchanges\n * @param {String} exchangeId ExchangeId\n * @param {Number} dataTokenAmount Amount of Data Tokens\n * @return {Promise<Number>} no of available exchanges\n */\n public async getNumberOfExchanges(): Promise<number> {\n const numExchanges = await this.contract.methods.getNumberOfExchanges().call()\n return numExchanges\n }\n\n /**\n * Set new rate\n * @param {String} exchangeId ExchangeId\n * @param {Number} newRate New rate\n * @param {String} address User account\n * @return {Promise<TransactionReceipt>} transaction receipt\n */\n public async setRate(\n exchangeId: string,\n newRate: number,\n address: string\n ): Promise<TransactionReceipt> {\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await this.contract.methods\n .setRate(exchangeId, this.web3.utils.toWei(String(newRate)))\n .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n const trxReceipt = await this.contract.methods\n .setRate(exchangeId, this.web3.utils.toWei(String(newRate)))\n .send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n return trxReceipt\n }\n\n /**\n * Activate an exchange\n * @param {String} exchangeId ExchangeId\n * @param {String} address User address\n * @return {Promise<TransactionReceipt>} transaction receipt\n */\n public async activate(\n exchangeId: string,\n address: string\n ): Promise<TransactionReceipt> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n if (exchange.active === true) return null\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await this.contract.methods\n .toggleExchangeState(exchangeId)\n .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n const trxReceipt = await this.contract.methods.toggleExchangeState(exchangeId).send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n return trxReceipt\n }\n\n /**\n * Deactivate an exchange\n * @param {String} exchangeId ExchangeId\n * @param {String} address User address\n * @return {Promise<TransactionReceipt>} transaction receipt\n */\n public async deactivate(\n exchangeId: string,\n address: string\n ): Promise<TransactionReceipt> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n if (exchange.active === false) return null\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await this.contract.methods\n .toggleExchangeState(exchangeId)\n .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n const trxReceipt = await this.contract.methods.toggleExchangeState(exchangeId).send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n return trxReceipt\n }\n\n /**\n * Get Rate\n * @param {String} exchangeId ExchangeId\n * @return {Promise<string>} Rate (converted from wei)\n */\n public async getRate(exchangeId: string): Promise<string> {\n const weiRate = await this.contract.methods.getRate(exchangeId).call()\n return this.web3.utils.fromWei(weiRate)\n }\n\n /**\n * Get Supply\n * @param {String} exchangeId ExchangeId\n * @return {Promise<string>} Rate (converted from wei)\n */\n public async getSupply(exchangeId: string): Promise<string> {\n const weiRate = await this.contract.methods.getSupply(exchangeId).call()\n return this.web3.utils.fromWei(weiRate)\n }\n\n /**\n * getOceanNeeded\n * @param {String} exchangeId ExchangeId\n * @param {Number} dataTokenAmount Amount of Data Tokens\n * @return {Promise<string>} Ocean amount needed\n */\n public async getOceanNeeded(\n exchangeId: string,\n dataTokenAmount: string\n ): Promise<string> {\n const weiRate = await this.contract.methods\n .CalcInGivenOut(exchangeId, this.web3.utils.toWei(dataTokenAmount))\n .call()\n return this.web3.utils.fromWei(weiRate)\n }\n\n /**\n * Get exchange details\n * @param {String} exchangeId ExchangeId\n * @return {Promise<FixedPricedExchange>} Exchange details\n */\n public async getExchange(exchangeId: string): Promise<FixedPriceExchange> {\n const result: FixedPriceExchange = await this.contract.methods\n .getExchange(exchangeId)\n .call()\n result.fixedRate = this.web3.utils.fromWei(result.fixedRate)\n result.supply = this.web3.utils.fromWei(result.supply)\n result.exchangeID = exchangeId\n return result\n }\n\n /**\n * Get all exchanges\n * @param {String} exchangeId ExchangeId\n * @return {Promise<String[]>} Exchanges list\n */\n public async getExchanges(): Promise<string[]> {\n return await this.contract.methods.getExchanges().call()\n }\n\n /**\n * Check if an exchange is active\n * @param {String} exchangeId ExchangeId\n * @return {Promise<Boolean>} Result\n */\n public async isActive(exchangeId: string): Promise<boolean> {\n const result = await this.contract.methods.isActive(exchangeId).call()\n return result\n }\n\n /**\n * Calculates how many basetokens are needed to get specifyed amount of datatokens\n * @param {String} exchangeId ExchangeId\n * @param {String} dataTokenAmount dataTokenAmount\n * @return {Promise<String>} Result\n */\n public async CalcInGivenOut(\n exchangeId: string,\n dataTokenAmount: string\n ): Promise<string> {\n const result = await this.contract.methods\n .CalcInGivenOut(exchangeId, this.web3.utils.toWei(dataTokenAmount))\n .call()\n return this.web3.utils.fromWei(result)\n }\n\n public async searchforDT(\n dataTokenAddress: string,\n minSupply: string\n ): Promise<FixedPriceExchange[]> {\n const result: FixedPriceExchange[] = []\n const events = await this.contract.getPastEvents('ExchangeCreated', {\n filter: { datatoken: dataTokenAddress.toLowerCase() },\n fromBlock: this.startBlock,\n toBlock: 'latest'\n })\n let promises = []\n for (let i = 0; i < events.length; i++) {\n promises.push(this.getExchange(events[i].returnValues[0]))\n if (promises.length > MAX_AWAIT_PROMISES || i === events.length - 1) {\n const results = await Promise.all(promises)\n for (let j = 0; j < results.length; j++) {\n const constituents = results[j]\n if (\n constituents.active === true &&\n constituents.dataToken.toLowerCase() === dataTokenAddress.toLowerCase()\n ) {\n const supply = new BigNumber(constituents.supply)\n const required = new BigNumber(minSupply)\n if (supply.gte(required)) {\n result.push(constituents)\n }\n }\n }\n promises = []\n }\n }\n return result\n }\n\n /**\n * Get all exchanges, filtered by creator(if any)\n * @param {String} account\n * @return {Promise<FixedPricedExchange[]>}\n */\n public async getExchangesbyCreator(account?: string): Promise<FixedPriceExchange[]> {\n const result: FixedPriceExchange[] = []\n const events = await this.contract.getPastEvents('ExchangeCreated', {\n filter: {},\n fromBlock: this.startBlock,\n toBlock: 'latest'\n })\n for (let i = 0; i < events.length; i++) {\n if (!account || events[i].returnValues[3].toLowerCase() === account.toLowerCase())\n result.push(await this.getExchange(events[i].returnValues[0]))\n }\n return result\n }\n\n /**\n * Get all swaps for an exchange, filtered by account(if any)\n * @param {String} exchangeId\n * @param {String} account\n * @return {Promise<FixedPricedSwap[]>}\n */\n public async getExchangeSwaps(\n exchangeId: string,\n account?: string\n ): Promise<FixedPriceSwap[]> {\n const result: FixedPriceSwap[] = []\n const events = await this.contract.getPastEvents('Swapped', {\n filter: { exchangeId: exchangeId },\n fromBlock: this.startBlock,\n toBlock: 'latest'\n })\n for (let i = 0; i < events.length; i++) {\n if (!account || events[i].returnValues[1].toLowerCase() === account.toLowerCase())\n result.push(this.getEventData(events[i]))\n }\n return result\n }\n\n /**\n * Get all swaps for an account\n * @param {String} account\n * @return {Promise<FixedPricedSwap[]>}\n */\n public async getAllExchangesSwaps(account: string): Promise<FixedPriceSwap[]> {\n const result: FixedPriceSwap[] = []\n const events = await this.contract.getPastEvents('ExchangeCreated', {\n filter: {},\n fromBlock: this.startBlock,\n toBlock: 'latest'\n })\n for (let i = 0; i < events.length; i++) {\n const swaps: FixedPriceSwap[] = await this.getExchangeSwaps(\n events[i].returnValues[0],\n account\n )\n swaps.forEach((swap) => {\n result.push(swap)\n })\n }\n return result\n }\n\n private getEventData(data: EventData): FixedPriceSwap {\n const result: FixedPriceSwap = {\n exchangeID: data.returnValues[0],\n caller: data.returnValues[1],\n baseTokenAmount: this.web3.utils.fromWei(data.returnValues[2]),\n dataTokenAmount: this.web3.utils.fromWei(data.returnValues[3])\n }\n return result\n }\n}\n","import defaultDispenserABI from '@oceanprotocol/contracts/artifacts/Dispenser.json'\nimport { TransactionReceipt } from 'web3-core'\nimport { Contract } from 'web3-eth-contract'\nimport { AbiItem } from 'web3-utils/types'\nimport Web3 from 'web3'\nimport {\n SubscribablePromise,\n Logger,\n getFairGasPrice,\n setContractDefaults\n} from '../utils'\nimport { DataTokens } from '../datatokens/Datatokens'\nimport Decimal from 'decimal.js'\nimport { ConfigHelperConfig } from '../utils/ConfigHelper'\n\nexport interface DispenserToken {\n active: boolean\n owner: string\n minterApproved: boolean\n isTrueMinter: boolean\n maxTokens: string\n maxBalance: string\n balance: string\n}\n\nexport enum DispenserMakeMinterProgressStep {\n // eslint-disable-next-line no-unused-vars\n MakeDispenserMinter,\n // eslint-disable-next-line no-unused-vars\n AcceptingNewMinter\n}\n\nexport enum DispenserCancelMinterProgressStep {\n // eslint-disable-next-line no-unused-vars\n MakeOwnerMinter,\n // eslint-disable-next-line no-unused-vars\n AcceptingNewMinter\n}\n\nexport class OceanDispenser {\n public GASLIMIT_DEFAULT = 1000000\n /** Ocean related functions */\n public dispenserAddress: string\n public dispenserABI: AbiItem | AbiItem[]\n public web3: Web3\n public contract: Contract = null\n private logger: Logger\n public datatokens: DataTokens\n public startBlock: number\n private config: ConfigHelperConfig\n\n /**\n * Instantiate Dispenser\n * @param {any} web3\n * @param {String} dispenserAddress\n * @param {any} dispenserABI\n */\n constructor(\n web3: Web3,\n logger: Logger,\n dispenserAddress: string = null,\n dispenserABI: AbiItem | AbiItem[] = null,\n datatokens: DataTokens,\n config?: ConfigHelperConfig\n ) {\n this.web3 = web3\n this.config = config\n this.dispenserAddress = dispenserAddress\n this.startBlock = (config && config.startBlock) || 0\n this.dispenserABI = dispenserABI || (defaultDispenserABI.abi as AbiItem[])\n this.datatokens = datatokens\n if (web3)\n this.contract = setContractDefaults(\n new this.web3.eth.Contract(this.dispenserABI, this.dispenserAddress),\n this.config\n )\n this.logger = logger\n }\n\n /**\n * Get dispenser status for a datatoken\n * @param {String} dataTokenAddress\n * @return {Promise<FixedPricedExchange>} Exchange details\n */\n public async status(dataTokenAddress: string): Promise<DispenserToken> {\n try {\n const result: DispenserToken = await this.contract.methods\n .status(dataTokenAddress)\n .call()\n result.maxTokens = this.web3.utils.fromWei(result.maxTokens)\n result.maxBalance = this.web3.utils.fromWei(result.maxBalance)\n result.balance = this.web3.utils.fromWei(result.balance)\n return result\n } catch (e) {\n this.logger.warn(`No dispenser available for data token: ${dataTokenAddress}`)\n }\n return null\n }\n\n /**\n * Activates a new dispener.\n * @param {String} dataToken\n * @param {Number} maxTokens max amount of tokens to dispense\n * @param {Number} maxBalance max balance of user. If user balance is >, then dispense will be rejected\n * @param {String} address User address (must be owner of the dataToken)\n * @return {Promise<TransactionReceipt>} TransactionReceipt\n */\n public async activate(\n dataToken: string,\n maxTokens: string,\n maxBalance: string,\n address: string\n ): Promise<TransactionReceipt> {\n let estGas\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n try {\n estGas = await this.contract.methods\n .activate(\n dataToken,\n this.web3.utils.toWei(maxTokens),\n this.web3.utils.toWei(maxBalance)\n )\n .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n let trxReceipt = null\n try {\n trxReceipt = await this.contract.methods\n .activate(\n dataToken,\n this.web3.utils.toWei(maxTokens),\n this.web3.utils.toWei(maxBalance)\n )\n .send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to activate dispenser: ${e.message}`)\n }\n return trxReceipt\n }\n\n /**\n * Deactivates a dispener.\n * @param {String} dataToken\n * @param {String} address User address (must be owner of the dispenser)\n * @return {Promise<TransactionReceipt>} TransactionReceipt\n */\n public async deactivate(\n dataToken: string,\n address: string\n ): Promise<TransactionReceipt> {\n let estGas\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n try {\n estGas = await this.contract.methods\n .deactivate(dataToken)\n .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n let trxReceipt = null\n try {\n trxReceipt = await this.contract.methods.deactivate(dataToken).send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to deactivate dispenser: ${e.message}`)\n }\n return trxReceipt\n }\n\n /**\n * Make the dispenser minter of the datatoken\n * @param {String} dataToken\n * @param {String} address User address (must be owner of the datatoken)\n * @return {Promise<TransactionReceipt>} TransactionReceipt\n */\n public makeMinter(\n dataToken: string,\n address: string\n ): SubscribablePromise<DispenserMakeMinterProgressStep, TransactionReceipt> {\n return new SubscribablePromise(async (observer) => {\n observer.next(DispenserMakeMinterProgressStep.MakeDispenserMinter)\n let estGas\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n const minterTx = await this.datatokens.proposeMinter(\n dataToken,\n this.dispenserAddress,\n address\n )\n if (!minterTx) {\n return null\n }\n observer.next(DispenserMakeMinterProgressStep.AcceptingNewMinter)\n try {\n estGas = await this.contract.methods\n .acceptMinter(dataToken)\n .estimateGas({ from: address }, (err, estGas) =>\n err ? gasLimitDefault : estGas\n )\n } catch (e) {\n estGas = gasLimitDefault\n }\n let trxReceipt = null\n try {\n trxReceipt = await this.contract.methods.acceptMinter(dataToken).send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to accept minter role: ${e.message}`)\n }\n return trxReceipt\n })\n }\n\n /**\n * Cancel minter role of dispenser and make the owner minter of the datatoken\n * @param {String} dataToken\n * @param {String} address User address (must be owner of the dispenser)\n * @return {Promise<TransactionReceipt>} TransactionReceipt\n */\n public cancelMinter(\n dataToken: string,\n address: string\n ): SubscribablePromise<DispenserCancelMinterProgressStep, TransactionReceipt> {\n return new SubscribablePromise(async (observer) => {\n observer.next(DispenserCancelMinterProgressStep.MakeOwnerMinter)\n let estGas\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n try {\n estGas = await this.contract.methods\n .removeMinter(dataToken)\n .estimateGas({ from: address }, (err, estGas) =>\n err ? gasLimitDefault : estGas\n )\n } catch (e) {\n estGas = gasLimitDefault\n }\n let trxReceipt = null\n try {\n trxReceipt = await this.contract.methods.removeMinter(dataToken).send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to remove minter role: ${e.message}`)\n }\n if (!trxReceipt) {\n return null\n }\n observer.next(DispenserCancelMinterProgressStep.AcceptingNewMinter)\n const minterTx = await this.datatokens.approveMinter(dataToken, address)\n return minterTx\n })\n }\n\n /**\n * Request tokens from dispenser\n * @param {String} dataToken\n * @param {String} amount\n * @param {String} address User address\n * @return {Promise<TransactionReceipt>} TransactionReceipt\n */\n public async dispense(\n dataToken: string,\n address: string,\n amount: string = '1'\n ): Promise<TransactionReceipt> {\n let estGas\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n try {\n estGas = await this.contract.methods\n .dispense(dataToken, this.web3.utils.toWei(amount))\n .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n let trxReceipt = null\n try {\n trxReceipt = await this.contract.methods\n .dispense(dataToken, this.web3.utils.toWei(amount))\n .send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to dispense tokens: ${e.message}`)\n }\n return trxReceipt\n }\n\n /**\n * Withdraw all tokens from the dispenser (if any)\n * @param {String} dataToken\n * @param {String} address User address (must be owner of the dispenser)\n * @return {Promise<TransactionReceipt>} TransactionReceipt\n */\n public async ownerWithdraw(\n dataToken: string,\n address: string\n ): Promise<TransactionReceipt> {\n let estGas\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n try {\n estGas = await this.contract.methods\n .ownerWithdraw(dataToken)\n .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n estGas = gasLimitDefault\n }\n let trxReceipt = null\n try {\n trxReceipt = await this.contract.methods.ownerWithdraw(dataToken).send({\n from: address,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n } catch (e) {\n this.logger.error(`ERROR: Failed to withdraw tokens: ${e.message}`)\n }\n return trxReceipt\n }\n\n /**\n * Check if tokens can be dispensed\n * @param {String} dataToken\n * @param {String} address User address that will receive datatokens\n * @return {Promise<Boolean>}\n */\n public async isDispensable(\n dataToken: string,\n address: string,\n amount: string = '1'\n ): Promise<Boolean> {\n const status = await this.status(dataToken)\n if (!status) return false\n // check active\n if (status.active === false) return false\n // check maxBalance\n const userBalance = new Decimal(await this.datatokens.balance(dataToken, address))\n if (userBalance.greaterThanOrEqualTo(status.maxBalance)) return false\n // check maxAmount\n if (new Decimal(String(amount)).greaterThan(status.maxTokens)) return false\n // check dispenser balance\n const contractBalance = new Decimal(status.balance)\n if (contractBalance.greaterThanOrEqualTo(amount) || status.isTrueMinter === true)\n return true\n return false\n }\n}\n","import Web3 from 'web3'\nimport { AbiItem } from 'web3-utils/types'\nimport { Logger, setContractDefaults, getFairGasPrice } from '../utils'\nimport jsonFactoryABI from '@oceanprotocol/contracts/artifacts/BFactory.json'\nimport { TransactionReceipt } from 'web3-core'\nimport { ConfigHelperConfig } from '../utils/ConfigHelper'\n\nexport class PoolFactory {\n public GASLIMIT_DEFAULT = 1000000\n public web3: Web3 = null\n public factoryABI: AbiItem | AbiItem[]\n public factoryAddress: string\n public logger: Logger\n public config: ConfigHelperConfig\n\n constructor(\n web3: Web3,\n logger: Logger,\n factoryABI: AbiItem | AbiItem[] = null,\n factoryAddress: string = null,\n config?: ConfigHelperConfig\n ) {\n this.web3 = web3\n\n if (factoryABI) this.factoryABI = factoryABI\n else this.factoryABI = jsonFactoryABI.abi as AbiItem[]\n if (factoryAddress) {\n this.factoryAddress = factoryAddress\n }\n this.logger = logger\n this.config = config\n }\n\n /**\n * Creates a new pool\n */\n async createPool(account: string): Promise<TransactionReceipt> {\n if (this.web3 === null) {\n this.logger.error('ERROR: Web3 object is null')\n return null\n }\n\n if (this.factoryAddress === null) {\n this.logger.error('ERROR: bfactoryAddress is null')\n return null\n }\n\n const factory = setContractDefaults(\n new this.web3.eth.Contract(this.factoryABI, this.factoryAddress, {\n from: account\n }),\n this.config\n )\n let txid = null\n const gasLimitDefault = this.GASLIMIT_DEFAULT\n let estGas\n try {\n estGas = await factory.methods\n .newBPool()\n .estimateGas({ from: account }, (err, estGas) => (err ? gasLimitDefault : estGas))\n } catch (e) {\n this.logger.log('Error estimate gas newBPool')\n this.logger.log(e)\n estGas = gasLimitDefault\n }\n try {\n txid = await factory.methods.newBPool().send({\n from: account,\n gas: estGas + 1,\n gasPrice: await getFairGasPrice(this.web3, this.config)\n })\n // pooladdress = transactiondata.events.BPoolRegistered.returnValues[0]\n } catch (e) {\n this.logger.error(`ERROR: Failed to create new pool: ${e.message}`)\n }\n return txid\n }\n}\n","import { Accounts } from './Accounts'\nimport { Assets } from './Assets'\nimport { Versions } from './Versions'\nimport { OceanUtils } from './utils/Utils'\nimport { MetadataCache } from '../metadatacache/MetadataCache'\nimport { OnChainMetadata } from '../metadatacache/OnChainMetaData'\nimport { Provider } from '../provider/Provider'\nimport { DataTokens } from '../datatokens/Datatokens'\nimport { Network } from '../datatokens/Network'\nimport { Config } from '../models/Config'\nimport {\n Instantiable,\n generateIntantiableConfigFromConfig\n} from '../Instantiable.abstract'\nimport { Compute } from './Compute'\nimport { OceanPool } from '../balancer/OceanPool'\nimport { OceanFixedRateExchange } from '../exchange/FixedRateExchange'\nimport { OceanDispenser } from '../dispenser/Dispenser'\nimport { ConfigHelperConfig } from '..'\nimport { EventAccessControl } from './EventAccessControl'\n\n/**\n * Main interface for Ocean Protocol.\n */\nexport class Ocean extends Instantiable {\n /**\n * Returns the instance of Ocean.\n * @param {Config} config Ocean instance configuration.\n * @return {Promise<Ocean>}\n */\n public static async getInstance(config: Config): Promise<Ocean> {\n const instance = new Ocean()\n\n const instanceConfig = {\n ...generateIntantiableConfigFromConfig(config),\n ocean: instance\n }\n instance.setInstanceConfig(instanceConfig)\n\n instance.utils = await OceanUtils.getInstance(instanceConfig)\n\n instance.provider = await Provider.getInstance(instanceConfig)\n\n instance.eventAccessControl = await EventAccessControl.getInstance(instanceConfig)\n\n instance.metadataCache = new MetadataCache(\n instanceConfig.config.metadataCacheUri,\n instanceConfig.logger,\n instanceConfig.config?.requestTimeout\n )\n\n instance.accounts = await Accounts.getInstance(instanceConfig)\n // instance.auth = await Auth.getInstance(instanceConfig)\n instance.assets = await Assets.getInstance(instanceConfig)\n instance.compute = await Compute.getInstance(instanceConfig)\n instance.datatokens = new DataTokens(\n instanceConfig.config.factoryAddress,\n instanceConfig.config.factoryABI,\n instanceConfig.config.datatokensABI,\n instanceConfig.config.web3Provider,\n instanceConfig.logger,\n instanceConfig.config as ConfigHelperConfig\n )\n instance.pool = new OceanPool(\n instanceConfig.config.web3Provider,\n instanceConfig.logger,\n instanceConfig.config.poolFactoryABI,\n instanceConfig.config.poolABI,\n instanceConfig.config.poolFactoryAddress,\n instanceConfig.config.oceanTokenAddress,\n instanceConfig.config as ConfigHelperConfig\n )\n instance.fixedRateExchange = new OceanFixedRateExchange(\n instanceConfig.config.web3Provider,\n instanceConfig.logger,\n instanceConfig.config.fixedRateExchangeAddress,\n instanceConfig.config.fixedRateExchangeAddressABI,\n instanceConfig.config.oceanTokenAddress,\n instance.datatokens,\n instanceConfig.config as ConfigHelperConfig\n )\n instance.OceanDispenser = new OceanDispenser(\n instanceConfig.config.web3Provider,\n instanceConfig.logger,\n instanceConfig.config.dispenserAddress,\n instanceConfig.config.dispenserABI,\n instance.datatokens,\n instanceConfig.config as ConfigHelperConfig\n )\n\n instance.onChainMetadata = new OnChainMetadata(\n instanceConfig.config.web3Provider,\n instanceConfig.logger,\n instanceConfig.config.metadataContractAddress,\n instanceConfig.config.metadataContractABI,\n instance.metadataCache,\n instanceConfig.config as ConfigHelperConfig\n )\n instance.versions = await Versions.getInstance(instanceConfig)\n instance.network = new Network()\n return instance\n }\n\n /**\n * Network instance\n * @type {Network}\n */\n public network: Network\n\n /**\n * Provider instance.\n * @type {Provider}\n */\n public provider: Provider\n\n /**\n * RBAC instance.\n * @type {EventAccessControl}\n */\n public eventAccessControl: EventAccessControl\n\n /**\n * Web3 provider.\n * @type {any}\n */\n public web3Provider: any\n\n /**\n * MetadataCache instance.\n * @type {MetadataCache}\n */\n public metadataCache: MetadataCache\n /**\n * OnChainMetadataCache instance.\n * @type {OnChainMetadataCache}\n */\n public onChainMetadata: OnChainMetadata\n /**\n * Ocean account submodule\n * @type {Accounts}\n */\n public accounts: Accounts\n\n /**\n * Ocean auth submodule\n * @type {OceanAuth}\n \n public auth: OceanAuth\n */\n\n /**\n * Ocean assets submodule\n * @type {Assets}\n */\n public assets: Assets\n\n /**\n * Ocean compute submodule\n * @type {Compute}\n */\n public compute: Compute\n\n /**\n * Ocean DataTokens submodule\n * @type {DataTokens}\n */\n public datatokens: DataTokens\n\n /**\n * Ocean Pools submodule\n * @type {OceanPool}\n */\n public pool: OceanPool\n\n /**\n * Ocean FixedRateExchange submodule\n * @type {OceanFixedRateExchange}\n */\n public fixedRateExchange: OceanFixedRateExchange\n\n /**\n * Ocean Dispenser submodule\n * @type {OceanDispenser}\n */\n public OceanDispenser: OceanDispenser\n\n /**\n * Ocean tokens submodule\n * @type {OceanTokens}\n \n public tokens: OceanTokens\n */\n\n /**\n * Ocean versions submodule\n * @type {Versions}\n */\n public versions: Versions\n\n /**\n * Ocean utils submodule\n * @type {OceanUtils}\n */\n public utils: OceanUtils\n}\n","import Config from '../models/Config'\nimport fs from 'fs'\nimport { homedir } from 'os'\n// eslint-disable-next-line import/no-named-default\nimport { default as DefaultContractsAddresses } from '@oceanprotocol/contracts/artifacts/address.json'\nimport Logger from './Logger'\n\nexport interface ConfigHelperConfig extends Config {\n networkId: number\n network: string\n subgraphUri: string\n explorerUri: string\n oceanTokenSymbol: string\n transactionBlockTimeout: number\n transactionConfirmationBlocks: number\n transactionPollingTimeout: number\n gasFeeMultiplier: number\n}\n\nconst configHelperNetworksBase: ConfigHelperConfig = {\n networkId: null,\n network: 'unknown',\n metadataCacheUri: 'https://aquarius.oceanprotocol.com',\n nodeUri: 'http://localhost:8545',\n providerUri: 'http://127.0.0.1:8030',\n subgraphUri: null,\n explorerUri: null,\n oceanTokenAddress: null,\n oceanTokenSymbol: 'OCEAN',\n factoryAddress: '0x1234',\n poolFactoryAddress: null,\n fixedRateExchangeAddress: null,\n dispenserAddress: null,\n metadataContractAddress: null,\n startBlock: 0,\n transactionBlockTimeout: 50,\n transactionConfirmationBlocks: 1,\n transactionPollingTimeout: 750,\n gasFeeMultiplier: 1\n}\n\nexport const configHelperNetworks: ConfigHelperConfig[] = [\n {\n ...configHelperNetworksBase\n },\n {\n // barge\n ...configHelperNetworksBase,\n networkId: 8996,\n network: 'development',\n metadataCacheUri: 'http://127.0.0.1:5000',\n rbacUri: 'http://127.0.0.1:3000'\n },\n {\n ...configHelperNetworksBase,\n networkId: 3,\n network: 'ropsten',\n nodeUri: 'https://ropsten.infura.io/v3',\n providerUri: 'https://provider.ropsten.oceanprotocol.com',\n subgraphUri: 'https://subgraph.ropsten.oceanprotocol.com',\n explorerUri: 'https://ropsten.etherscan.io',\n startBlock: 9227563\n },\n {\n ...configHelperNetworksBase,\n networkId: 4,\n network: 'rinkeby',\n nodeUri: 'https://rinkeby.infura.io/v3',\n providerUri: 'https://provider.rinkeby.oceanprotocol.com',\n subgraphUri: 'https://subgraph.rinkeby.oceanprotocol.com',\n explorerUri: 'https://rinkeby.etherscan.io',\n startBlock: 7294090\n },\n {\n ...configHelperNetworksBase,\n networkId: 1,\n network: 'mainnet',\n nodeUri: 'https://mainnet.infura.io/v3',\n providerUri: 'https://provider.mainnet.oceanprotocol.com',\n subgraphUri: 'https://subgraph.mainnet.oceanprotocol.com',\n explorerUri: 'https://etherscan.io',\n startBlock: 11105459,\n transactionBlockTimeout: 150,\n transactionConfirmationBlocks: 5,\n transactionPollingTimeout: 1750,\n gasFeeMultiplier: 1.05\n },\n {\n ...configHelperNetworksBase,\n networkId: 137,\n network: 'polygon',\n nodeUri: 'https://polygon-mainnet.infura.io/v3',\n providerUri: 'https://provider.polygon.oceanprotocol.com',\n subgraphUri: 'https://subgraph.polygon.oceanprotocol.com',\n explorerUri: 'https://polygonscan.com',\n oceanTokenSymbol: 'mOCEAN',\n startBlock: 11005222,\n gasFeeMultiplier: 1.05\n },\n {\n ...configHelperNetworksBase,\n networkId: 1287,\n network: 'moonbeamalpha',\n nodeUri: 'https://rpc.testnet.moonbeam.network',\n providerUri: 'https://provider.moonbeamalpha.oceanprotocol.com',\n subgraphUri: 'https://subgraph.moonbeamalpha.oceanprotocol.com',\n explorerUri: 'https://moonbase-blockscout.testnet.moonbeam.network/',\n startBlock: 90707\n },\n {\n ...configHelperNetworksBase,\n networkId: 2021000,\n network: 'gaiaxtestnet',\n nodeUri: 'https://rpc.gaiaxtestnet.oceanprotocol.com',\n providerUri: 'https://provider.gaiaxtestnet.oceanprotocol.com',\n subgraphUri: 'https://subgraph.gaiaxtestnet.oceanprotocol.com',\n explorerUri: 'https://blockscout.gaiaxtestnet.oceanprotocol.com'\n },\n {\n ...configHelperNetworksBase,\n networkId: 2021001,\n network: 'catenaxtestnet',\n nodeUri: 'https://rpc.catenaxtestnet.oceanprotocol.com',\n providerUri: 'https://provider.catenaxtestnet.oceanprotocol.com',\n subgraphUri: 'https://subgraph.catenaxtestnet.oceanprotocol.com',\n explorerUri: 'https://blockscout.catenaxtestnet.oceanprotocol.com',\n metadataCacheUri: 'https://aquarius.catenaxtestnet.oceanprotocol.com'\n },\n {\n ...configHelperNetworksBase,\n networkId: 80001,\n network: 'mumbai',\n nodeUri: 'https://polygon-mumbai.infura.io/v3',\n providerUri: 'https://provider.mumbai.oceanprotocol.com',\n subgraphUri: 'https://subgraph.mumbai.oceanprotocol.com',\n explorerUri: 'https://mumbai.polygonscan.com'\n },\n {\n ...configHelperNetworksBase,\n networkId: 56,\n network: 'bsc',\n nodeUri: 'https://bsc-dataseed.binance.org',\n providerUri: 'https://provider.bsc.oceanprotocol.com',\n subgraphUri: 'https://subgraph.bsc.oceanprotocol.com',\n explorerUri: 'https://bscscan.com/',\n gasFeeMultiplier: 1.05\n },\n {\n ...configHelperNetworksBase,\n networkId: 44787,\n network: 'celoalfajores',\n nodeUri: 'https://alfajores-forno.celo-testnet.org',\n providerUri: 'https://provider.celoalfajores.oceanprotocol.com',\n subgraphUri: 'https://subgraph.celoalfajores.oceanprotocol.com',\n explorerUri: 'https://alfajores-blockscout.celo-testnet.org'\n },\n {\n ...configHelperNetworksBase,\n networkId: 246,\n network: 'energyweb',\n nodeUri: 'https://rpc.energyweb.org',\n providerUri: 'https://provider.energyweb.oceanprotocol.com',\n subgraphUri: 'https://subgraph.energyweb.oceanprotocol.com',\n explorerUri: 'https://explorer.energyweb.org',\n gasFeeMultiplier: 1.05\n },\n {\n ...configHelperNetworksBase,\n networkId: 1285,\n network: 'moonriver',\n nodeUri: 'https://moonriver.api.onfinality.io/public',\n providerUri: 'https://provider.moonriver.oceanprotocol.com',\n subgraphUri: 'https://subgraph.moonriver.oceanprotocol.com',\n explorerUri: 'https://blockscout.moonriver.moonbeam.network',\n gasFeeMultiplier: 1.05\n }\n]\n\nexport class ConfigHelper {\n /* Load contract addresses from env ADDRESS_FILE (generated by ocean-contracts) */\n public getAddressesFromEnv(network: string): Partial<ConfigHelperConfig> {\n // use the defaults first\n let configAddresses: Partial<ConfigHelperConfig>\n if (DefaultContractsAddresses[network]) {\n const {\n DTFactory,\n BFactory,\n FixedRateExchange,\n Dispenser,\n Metadata,\n Ocean,\n chainId,\n startBlock\n } = DefaultContractsAddresses[network]\n configAddresses = {\n factoryAddress: DTFactory,\n poolFactoryAddress: BFactory,\n fixedRateExchangeAddress: FixedRateExchange,\n dispenserAddress: Dispenser,\n metadataContractAddress: Metadata,\n oceanTokenAddress: Ocean,\n networkId: chainId,\n startBlock: startBlock,\n ...(process.env.AQUARIUS_URI && { metadataCacheUri: process.env.AQUARIUS_URI })\n }\n }\n // try ADDRESS_FILE env\n if (fs && process.env.ADDRESS_FILE) {\n try {\n const data = JSON.parse(\n fs.readFileSync(\n process.env.ADDRESS_FILE ||\n `${homedir}/.ocean/ocean-contracts/artifacts/address.json`,\n 'utf8'\n )\n )\n const {\n DTFactory,\n BFactory,\n FixedRateExchange,\n Dispenser,\n Metadata,\n Ocean,\n chainId,\n startBlock\n } = data[network]\n configAddresses = {\n factoryAddress: DTFactory,\n poolFactoryAddress: BFactory,\n fixedRateExchangeAddress: FixedRateExchange,\n dispenserAddress: Dispenser,\n metadataContractAddress: Metadata,\n oceanTokenAddress: Ocean,\n networkId: chainId,\n startBlock: startBlock,\n ...(process.env.AQUARIUS_URI && { metadataCacheUri: process.env.AQUARIUS_URI })\n }\n } catch (e) {\n // console.error(`ERROR: Could not load local contract address file: ${e.message}`)\n // return null\n }\n }\n return configAddresses\n }\n\n public getConfig(network: string | number, infuraProjectId?: string): Config {\n const filterBy = typeof network === 'string' ? 'network' : 'networkId'\n let config = configHelperNetworks.find((c) => c[filterBy] === network)\n\n if (!config) {\n Logger.error(`No config found for given network '${network}'`)\n return null\n }\n\n const contractAddressesConfig = this.getAddressesFromEnv(config.network)\n config = { ...config, ...contractAddressesConfig }\n\n const nodeUri = infuraProjectId\n ? `${config.nodeUri}/${infuraProjectId}`\n : config.nodeUri\n\n return { ...config, nodeUri }\n }\n}\n","import { LogLevel } from '../utils/Logger'\nimport { AbiItem } from 'web3-utils/types'\n\nexport class Config {\n /**\n * Ethereum node URL.\n * @type {string}\n */\n public nodeUri?: string\n\n /**\n * Address of Provider.\n * @type {string}\n */\n public providerAddress?: string\n\n /**\n * Metadata Store URL.\n * @type {string}\n */\n public metadataCacheUri?: string\n\n /**\n * Provider URL.\n * @type {string}\n */\n public providerUri?: string\n\n /**\n * Role-based access control URL.\n * @type {string}\n */\n public rbacUri?: string\n\n /**\n * Web3 Provider.\n * @type {any}\n */\n public web3Provider?: any\n\n /**\n * Ocean Token address\n * @type {string}\n */\n public oceanTokenAddress?: string\n\n /**\n * Factory address\n * @type {string}\n */\n public factoryAddress?: string\n\n /**\n * Factory ABI\n * @type {string}\n */\n public factoryABI?: AbiItem | AbiItem[]\n\n /**\n * datatokens ABI\n * @type {string}\n */\n public datatokensABI?: AbiItem | AbiItem[]\n\n /**\n * Pool Factory address\n * @type {string}\n */\n public poolFactoryAddress?: string\n\n /**\n * Pool Factory ABI\n * @type {string}\n */\n public poolFactoryABI?: AbiItem | AbiItem[]\n\n /**\n * Pool ABI\n * @type {string}\n */\n public poolABI?: AbiItem | AbiItem[]\n\n /**\n * FixedRateExchangeAddress\n * @type {string}\n */\n public fixedRateExchangeAddress?: string\n\n /**\n * FixedRateExchangeAddressABI\n * @type {any}\n */\n public fixedRateExchangeAddressABI?: AbiItem | AbiItem[]\n\n /**\n * DispenserAddress\n * @type {string}\n */\n public dispenserAddress?: string\n\n /**\n * DispenserABI\n * @type {any}\n */\n public dispenserABI?: AbiItem | AbiItem[]\n\n /**\n * DDOContractAddress\n * @type {string}\n */\n public metadataContractAddress?: string\n\n /**\n * DDOContractABI\n * @type {any}\n */\n public metadataContractABI?: AbiItem | AbiItem[]\n /**\n * block number of the deployment\n * @type {number}\n */\n public startBlock?: number\n /**\n * Log level.\n * @type {boolean | LogLevel}\n */\n public verbose?: boolean | LogLevel\n\n /**\n * Message shown when the user creates its own token.\n * @type {string}\n */\n public authMessage?: string\n\n /**\n * Token expiration time in ms.\n * @type {number}\n */\n public authTokenExpiration?: number\n\n // Parity config\n public parityUri?: string\n\n public threshold?: number\n\n /**\n * HTTP request timeout\n * @type {number}\n */\n public requestTimeout?: number\n}\n\nexport default Config\n"],"names":["LogLevel","Logger","constructor","logLevel","Error","this","setLevel","bypass","args","dispatch","Infinity","debug","Verbose","log","Log","warn","Warn","error","verb","level","console","LoggerInstance","zeroX","input","zeroXTransformer","noZeroX","zeroOutput","valid","output","inputMatch","didPrefixed","didTransformer","prefixOutput","didZeroX","didNoZeroX","regexp","conversorName","match","SubscribableObserver","completed","subscriptions","Set","subscribe","onNext","onComplete","onError","subscription","add","unsubscribe","delete","next","emit","complete","resolve","type","value","Array","from","map","filter","callback","forEach","clear","SubscribablePromise","executor","observer","promise","Object","assign","Promise","reject","setTimeout","undefined","init","then","onfulfilled","onrejected","catch","finally","onfinally","execution","result","isNumeric","mathceil","Math","ceil","mathfloor","floor","bignumberError","tooManyDigits","BASE","LOG_BASE","MAX_SAFE_INTEGER","POWS_TEN","SQRT_BASE","MAX","bitFloor","n","i","coeffToString","a","s","z","j","length","r","charCodeAt","slice","compare","x","y","b","xc","c","yc","k","e","l","intCheck","min","max","name","String","isOdd","toExponential","str","charAt","toFixedPoint","len","zs","BigNumber","clone","configObject","div","convertBase","parseNumeric","pow2_53","random53bitInt","basePrefix","dotAfter","dotBefore","isInfinityOrNaN","whitespaceOrPlus","P","prototype","toString","valueOf","ONE","DECIMAL_PLACES","ROUNDING_MODE","TO_EXP_NEG","TO_EXP_POS","MIN_EXP","MAX_EXP","CRYPTO","MODULO_MODE","POW_PRECISION","FORMAT","prefix","groupSize","secondaryGroupSize","groupSeparator","decimalSeparator","fractionGroupSize","fractionGroupSeparator","suffix","ALPHABET","v","alphabet","caseChanged","isNum","_isBigNumber","test","indexOf","replace","search","substring","round","DEBUG","toUpperCase","toLowerCase","push","format","rm","id","c0","ne","maxOrMin","method","m","call","normalise","pop","sd","d","ni","rd","pows10","out","ROUND_UP","ROUND_DOWN","ROUND_CEIL","ROUND_FLOOR","ROUND_HALF_UP","ROUND_HALF_DOWN","ROUND_HALF_EVEN","ROUND_HALF_CEIL","ROUND_HALF_FLOOR","EUCLID","config","set","obj","p","hasOwnProperty","crypto","getRandomValues","randomBytes","EXPONENTIAL_AT","RANGE","isBigNumber","maximum","arguments","lt","minimum","gt","random","dp","rand","Uint32Array","copy","splice","sum","plus","decimal","toBaseOut","baseIn","baseOut","arrL","arr","reverse","sign","callerIsToString","pow","concat","multiply","base","temp","xlo","xhi","carry","klo","khi","aL","bL","cmp","subtract","more","prod","prodL","q","qc","rem","remL","rem0","xi","xL","yc0","yL","yz","NaN","isNaN","p1","p2","absoluteValue","abs","comparedTo","decimalPlaces","dividedBy","dividedToIntegerBy","idiv","exponentiatedBy","half","isModExp","nIsBig","nIsNeg","nIsOdd","isInteger","mod","times","integerValue","isEqualTo","eq","isFinite","isGreaterThan","isGreaterThanOrEqualTo","gte","isLessThan","isLessThanOrEqualTo","lte","isNegative","isPositive","isZero","minus","t","xLTy","xe","ye","modulo","multipliedBy","xcL","ycL","ylo","yhi","zc","sqrtBase","negated","precision","shiftedBy","squareRoot","sqrt","rep","toFixed","toFormat","split","g1","g2","intPart","fractionPart","isNeg","intDigits","substr","RegExp","toFraction","md","d0","d1","d2","exp","n0","n1","toNumber","toPrecision","toJSON","Symbol","toStringTag","for","getFairGasPrice","web3","eth","getGasPrice","gasFeeMultiplier","setContractDefaults","contract","transactionBlockTimeout","transactionConfirmationBlocks","transactionPollingTimeout","isDdo","arg","assetResolve","asset","ocean","did","ddo","assets","generateDatatokenName","wordList","list","wordListDefault","random1","adjectives","random2","nouns","indexNumber","adjective","noun","symbol","async","keys","values","reduce","acc","key","index","[object Object]","zipObject","all","v4","Instantiable","_ocean","_web3","_config","_logger","logger","instanceConfig","instance","setInstanceConfig","Account","super","password","token","getId","setId","setPassword","getPassword","TokenAdress","minABI","constant","inputs","outputs","payable","stateMutability","decimals","getTokenDecimals","Contract","balance","methods","balanceOf","Decimal","message","getTokenBalance","oceanTokenAddress","getBalance","utils","fromWei","DID","didString","getDid","didMatch","dataTokenAddress","Accounts","accountPromises","getAccounts","address","TokenAddress","account","getOceanBalance","getEtherBalance","Web3Provider","Web3","web3Provider","givenProvider","providers","HttpProvider","nodeUri","DDO","JSON","stringify","ddoString","parse","created","updated","dataToken","publicKey","authentication","service","proof","price","isInPurgatory","purgatoryData","dataTokenInfo","credentials","chainId","event","Date","toISOString","shortId","findServiceById","find","findServiceByType","serviceType","getChecksum","attributes","files","author","license","main","checksum","_","getWeb3","sha3","join","creator","signatureValue","timeoutSignal","timeout","Number","TypeError","signalMap","WeakMap","controller","AbortController","timeoutId","abort","signal","fetch","require","WebServiceConnector","requestTimeout","post","url","payload","postWithHeaders","Content-type","postWithOctet","headers","body","get","put","destination","response","ok","filename","fs","mkdirSync","recursive","fileStream","createWriteStream","pipe","on","save","arrayBuffer","anchor","document","createElement","download","href","click","opts","text","Provider","nonce","baseUrl","servicesEndpoints","computeAddress","providerAddress","providerVersion","computeLimits","setBaseUrl","providerUri","getServiceEndpoints","serviceEndpoints","json","version","serviceName","urlPath","getEndpointURL","agreementId","signature","signText","signWithHash","getNonce","documentId","publisherAddress","path","getEncryptEndpoint","decodeURI","encryptedDocument","getFileinfoEndpoint","results","serviceIndex","metadataCache","retrieveDDO","serviceEndpoint","consumerAddress","getNonceEndpoint","userCustomParameters","initializeUrl","getInitializeEndpoint","encodeURI","txId","tokenAddress","createSignature","getDownloadEndpoint","filesPromises","consumeUrl","downloadFile","downloadFileBrowser","consumerAccount","algorithm","additionalInputs","signatureMessage","createHashSignature","algorithmDid","meta","algorithmMeta","transferTxId","algorithmTransferTxId","algorithmDataToken","serviceId","userData","algoCustomParameters","algouserdata","getComputeStartEndpoint","status","statusText","jobId","getComputeStopEndpoint","getComputeDeleteEndpoint","getComputeStatusEndpoint","getComputeResultEndpoint","params","module","exports","assert","val","msg","inherits","ctor","superCtor","super_","TempCtor","BN","number","endian","isBN","negative","words","red","_init","Buffer","wordSize","parseHex","start","end","parseBase","mul","num","isArray","left","right","_initNumber","_initArray","_parseHex","_parseBase","strip","toArray","w","off","limbLen","limbPow","total","word","imuln","_iaddn","dest","_expand","size","_normSign","inspect","zeros","groupSizes","groupBases","smallMulTo","self","ncarry","rword","maxJ","padding","groupBase","modn","idivn","ret","toBuffer","toArrayLike","ArrayType","byteLength","reqLength","littleEndian","res","andln","iushrn","_countBits","clz32","_zeroBits","bitLength","hi","zeroBits","toTwos","width","inotn","iaddn","fromTwos","testn","notn","ineg","neg","iuor","ior","or","uor","iuand","iand","and","uand","iuxor","ixor","xor","uxor","bytesNeeded","bitsLeft","setn","bit","wbit","iadd","isub","sub","comb10MulTo","lo","mid","o","a0","al0","ah0","a1","al1","ah1","a2","al2","ah2","a3","al3","ah3","a4","al4","ah4","a5","al5","ah5","a6","al6","ah6","a7","al7","ah7","a8","al8","ah8","a9","al9","ah9","b0","bl0","bh0","b1","bl1","bh1","b2","bl2","bh2","b3","bl3","bh3","b4","bl4","bh4","b5","bl5","bh5","b6","bl6","bh6","b7","bl7","bh7","b8","bl8","bh8","b9","bl9","bh9","w0","imul","w1","w2","w3","w4","w5","w6","w7","w8","w9","w10","w11","w12","w13","w14","w15","w16","w17","w18","jumboMulTo","FFTM","mulp","mulTo","hncarry","bigMulTo","makeRBT","N","revBin","rb","permute","rbt","rws","iws","rtws","itws","transform","rtwdf","cos","PI","itwdf","sin","rtwdf_","itwdf_","re","ie","ro","io","rx","guessLen13b","odd","conjugate","normalize13b","ws","convert13b","stub","ph","rwst","iwst","nrws","nrwst","niwst","rmws","mulf","muln","sqr","isqr","toBitArray","iushln","bits","carryMask","newCarry","ishln","hint","extended","h","mask","maskedWords","ishrn","shln","ushln","shrn","ushrn","imaskn","maskn","isubn","addn","subn","iabs","_ishlnsubmul","shift","_wordDiv","mode","bhi","diff","qj","divmod","positive","divn","umod","divRound","dm","r2","egcd","A","B","C","D","g","isEven","yp","xp","im","jm","gcd","_invmp","x1","x2","delta","cmpn","invm","bincn","ucmp","gtn","gten","ltn","lten","eqn","Red","toRed","ctx","convertTo","_forceRed","fromRed","convertFrom","forceRed","redAdd","redIAdd","redSub","redISub","redShl","shl","redMul","_verify2","redIMul","redSqr","_verify1","redISqr","redSqrt","redInvm","redNeg","redPow","primes","k256","p224","p192","p25519","MPrime","tmp","_tmp","K256","P224","P192","P25519","prime","_prime","Mont","imod","rinv","minv","ireduce","rlen","imulK","outLen","prev","mod3","one","nOne","lpow","inv","wnd","current","currentLen","mont","u","isHexPrefixed","multiplier","formattedString","trim","stringArg","stripHexPrefix","zero","negative1","unitMap","noether","wei","kwei","Kwei","babbage","femtoether","mwei","Mwei","lovelace","picoether","gwei","Gwei","shannon","nanoether","nano","szabo","microether","micro","finney","milliether","milli","ether","kether","grand","mether","gether","tether","getValueOfUnit","unitInput","unit","unitValue","numberToString","weiInput","optionsInput","numberToBN","baseLength","options","fraction","pad","whole","commify","toWei","etherInput","comps","require$$0","_strip","root","byteArray","byteCount","byteIndex","stringFromCharCode","fromCharCode","ucs2decode","string","extra","counter","checkScalarValue","codePoint","createByte","encodeCodePoint","readContinuationByte","continuationByte","decodeSymbol","byte1","encode","codePoints","byteString","decode","array","ucs2encode","HEX_CHARS","KECCAK_PADDING","SHIFT","RC","f","c1","c2","c3","c4","c5","c6","c7","c8","c9","b10","b11","b12","b13","b14","b15","b16","b17","b18","b19","b20","b21","b22","b23","b24","b25","b26","b27","b28","b29","b30","b31","b32","b33","b34","b35","b36","b37","b38","b39","b40","b41","b42","b43","b44","b45","b46","b47","b48","b49","keccak","parseInt","state","code","blocks","blockCount","outputBlocks","reset","block","lastByteIndex","hex","update","Keccak","keccak256","keccak512","keccak256s","keccak512s","INPUT_ERROR","WINDOW","window","JS_SHA3_NO_WINDOW","WEB_WORKER","JS_SHA3_NO_NODE_JS","process","versions","node","global","COMMON_JS","JS_SHA3_NO_COMMON_JS","ARRAY_BUFFER","JS_SHA3_NO_ARRAY_BUFFER","ArrayBuffer","CSHAKE_PADDING","BITS","SHAKE_BITS","OUTPUT_TYPES","CSHAKE_BYTEPAD","128","256","JS_SHA3_NO_ARRAY_BUFFER_IS_VIEW","isView","buffer","createOutputMethod","outputType","createShakeOutputMethod","outputBits","createCshakeOutputMethod","createKmacOutputMethod","createOutputMethods","createMethod","create","algorithms","bytepad","Kmac","methodNames","methodName","newMethodName","finalized","extraBytes","notString","Uint8Array","bytes","unshift","encodeString","strs","finalize","digest","offset","toByteArray","addSlice","isByteArray","apply","data","keccak_256","chars","hasPrefix","isBloom","bloom","isInBloom","utils_1","bytesToHex","hash","bitpos","codePointToInt","isTopic","topic","isAddress","ethereumAddress","padLeft","contractAddress","object","toBN","checkAddressChecksum","addressHash","utf8ToHex","utf8","hexToNumber","isHexStrict","numberToHex","hexToBytes","toHex","returnType","isBuffer","isHex","SHA3_NULL_S","returnValue","Hash","_Hash","CreateProgressStep","OceanPlatformTechStatus","ethereumBloomFilters","isUserEthereumAddressInBloom","isContractAddressInBloom","isTopicInBloom","hexToUtf8","hexToNumberString","leftPad","rightPad","toTwosComplement","sha3Raw","_parseNumber","_solidityPack","arraySize","startsWith","typesize","exec","_parseTypeN","_processSolidityEncodePackedArgs","_parseTypeNArray","soliditySha3","hexArgs","soliditySha3Raw","encodePacked","_flattenTypes","includeTuple","puts","types","param","components","arrayBracket","hexToAscii","asciiToHex","getUnitValue","ethjsUnit","_fireError","emitter","optionalData","listeners","removeAllListeners","_jsonInterfaceMethodToString","randomHex","randombytes","toChecksumAddress","checksumAddress","toDecimal","fromDecimal","hexToString","toUtf8","stringToHex","fromUtf8","toAscii","fromAscii","padRight","compareBlockNumbers","bnA","bnB","checkCredentialExist","credentialType","credentialAction","isExist","allow","allowList","credential","deny","dennyList","removeCredentialDetail","exists","updateCredentialDetail","addCredentialDetail","newCredentialDetail","EventAccessControl","_config$config","rbacUri","getIsPermitArgs","component","eventType","authService","credentialsType","OrderProgressStep","Assets","metadata","publisher","services","dtAddress","cap","datatokens","CreatingDataToken","DataTokenCreated","generate","provider","EncryptingFiles","getInstance","encryptedFiles","encrypt","FilesEncrypted","indexCount","owner","isListed","isRetired","isOrderDisabled","file","findIndex","addProof","getName","getSymbol","parseFloat","getCap","newMetadata","title","additionalInformation","description","links","denyList","newDDo","checkCredential","credentail","includes","onChainMetadata","publish","signer","verifyText","serv","query","queryMetadata","cost","datePublished","requiredParameters","initialize","payerAddress","mpAddress","searchPreviousOrders","consumable","isConsumable","getServiceByType","getServiceByIndex","isUserCustomParametersValid","providerData","previousOrder","getPreviousValidOrders","numTokens","totalCost","txid","startOrder","transactionHash","serviceConnector","_this$instanceConfig","_this$instanceConfig$","fromBlock","topic1","topic0","getStartOrderEventSignature","events","getPastLogs","topics","toBlock","order","timestamp","amount","consumer","payer","abi","decodeParameters","denyConsume","_metadata$attributes$","eventAccessControl","isPermit","serviceCustomParameters","keyname","required","Versions","lib","commit","Working","software","getVersionInfo","Stopped","techs","SignatureUtils","isMetaMask","currentProvider","personal","e2","ecRecover","getHash","OceanUtils","apiPath","MetadataCache","metadataCacheUri","accessToken","service_endpoint","resource_id","consumptionUrl","fullUrl","errors","metadataServiceEndpoint","getServiceEndpoint","getURI","sleep","ms","tries","fetchLibrary","OnChainMetadata","DDOContractAddress","DDOContractABI","GASLIMIT_DEFAULT","DDOContract","defaultDDOContractABI","LZMA","disableEndMark","compress","validate","validateMetadata","rawData","prepareRawData","publishRaw","flags","updateRaw","serialize","compressDDO","getHex","encryptDDO","gasLimitDefault","estGas","estimateGas","err","send","gas","gasPrice","newOwner","transferOwnership","hexChar","DataTokens","factoryAddress","factoryABI","datatokensABI","startBlock","defaultFactoryABI","defaultDatatokensABI","generateDtName","factory","createToken","trxReceipt","TokenCreated","returnValues","spender","datatoken","approve","toAddress","capAvailble","mint","transferToken","weiAmount","transferWei","transfer","fromAddress","transferFrom","allowance","blob","mpFeeAddress","getBlockNumber","getPastEvents","blockDetails","getBlock","blockHash","expiry","now","eventdata","encodeEventSignature","newMinterAddress","proposeMinter","approveMinter","isMinter","Network","getNetworkId","net","networkId","network","lookup","freeze","WarmingUp","Started","ConfiguringVolumes","ProvisioningSuccess","DataProvisioningFailed","AlgorithmProvisioningFailed","RunningAlgorithm","FilteringResults","PublishingResult","Completed","Deleted","Compute","checkOutput","algoService","computeJobsList","computeStart","computeStop","computeDelete","computeStatus","computeResult","createServerAttributes","serverId","serverType","cpu","gpu","memory","disk","maxExecutionTime","createContainerAttributes","image","tag","createClusterAttributes","createProviderAttributes","cluster","containers","servers","environment","supportedServers","supportedContainers","createComputeService","providerAttributes","computePrivacy","requiredCustomParameters","privacy","publishAlgorithmLog","publishOutput","metadataUri","dataset","algorithmDDO","datasetResolved","allowRawAlgorithm","algoProvider","datasetProvider","allowAllPublishedAlgorithms","publisherTrustedAlgorithms","algo","trustedAlgorithm","createPublisherTrustedAlgorithmfromDID","containerSectionChecksum","filesChecksum","orderAsset","isOrderable","allowNetworkAccess","newState","SHA256","container","algoDid","el","MaxUint256","PoolCreateProgressStep","FixedRateCreateProgressStep","DispenserMakeMinterProgressStep","DispenserCancelMinterProgressStep","OceanPool","jsonFactoryABI","newBPool","poolABI","jsonpoolABI","createPool","poolAddress","dataTokenAmount","dataTokenWeight","baseToken","baseTokenAmount","baseTokenWeight","swapFee","pool","setup","tokenAdress","force","currentAllowence","greaterThanOrEqualTo","tokens","bind","weight","fee","setSwapFee","getNumTokens","totalSupply","getCurrentTokens","getFinalTokens","getController","controllerAddress","setController","isBound","isFinalized","getSwapFee","getNormalizedWeight","getDenormalizedWeight","getTotalDenormalizedWeight","tokenIn","tokenAmountIn","tokenOut","minAmountOut","maxPrice","swapExactAmountIn","maxAmountIn","swapExactAmountOut","poolAmountOut","maxAmountsIn","weiMaxAmountsIn","joinPool","poolAmountIn","minAmountsOut","weiMinAmountsOut","exitPool","minPoolAmountOut","joinswapExternAmountIn","joinswapPoolAmountOut","minTokenAmountOut","exitswapPoolAmountIn","tokenAmountOut","maxPoolAmountIn","exitswapExternAmountOut","getSpotPrice","getSpotPriceSansFee","tokenBalanceIn","tokenWeightIn","tokenBalanceOut","tokenWeightOut","calcSpotPrice","calcInGivenOut","calcOutGivenIn","poolSupply","totalWeight","calcPoolOutGivenSingleIn","calcSingleInGivenPoolOut","calcSingleOutGivenPoolIn","calcPoolInGivenSingleOut","getSwapEventSignature","getJoinEventSignature","getExitEventSignature","oceanAddress","dtAmount","dtWeight","oceanAmount","CreatingPool","createTxid","BPoolRegistered","oceanWeight","ApprovingDatatoken","ApprovingOcean","SetupPool","getReserve","getDTAddress","getMaxBuyQuantity","tokenInAddress","tokenOutAddress","tokenOutAmount","tokenInAmount","getPoolSharesTotalSupply","poolShares","totalPoolTokens","dtReserve","getDTReserve","oceanReserve","getOceanReserve","getMaxAddLiquidity","getMaxRemoveLiquidity","dtAmountWanted","maxOceanAmount","greaterThan","getDTMaxBuyQuantity","getOceanNeeded","minimumdtAmountWanted","oceanAmountWanted","getOceanMaxBuyQuantity","getOceanReceived","lessThan","maxAmount","maximumPoolShares","getDTMaxRemoveLiquidity","usershares","sharesBalance","sharesRequired","getPoolSharesRequiredToRemoveDT","getOceanMaxAddLiquidity","minOcean","getOceanMaxRemoveLiquidity","getPoolSharesRequiredToRemoveOcean","minDT","equals","sort","blockNumber","dtRequired","OceanRequired","registeredBy","getPoolDetails","shares","promises","getResult","share","swapTopic","joinTopic","exitTopic","addressTopic","getEventData","getPoolLogs","elem1","elem2","caller","tokenInBalance","tokenInWeight","tokenOutBalance","tokenOutWeight","newTokenInBalance","newTokenOutBalance","swapfee","initialPrice","newPrice","dtReceived","newDtReserve","newOceanReserve","computeSlippage","oceanReceived","OceanFixedRateExchange","fixedRateExchangeAddress","fixedRateExchangeABI","defaultFixedRateExchangeABI","rate","createExchange","CreatingExchange","exchangeId","ExchangeCreated","generateExchangeId","swap","getNumberOfExchanges","newRate","setRate","exchange","getExchange","active","toggleExchangeState","weiRate","getRate","getSupply","CalcInGivenOut","fixedRate","supply","exchangeID","getExchanges","isActive","minSupply","constituents","getExchangeSwaps","OceanDispenser","dispenserAddress","dispenserABI","defaultDispenserABI","maxTokens","maxBalance","activate","deactivate","makeMinter","MakeDispenserMinter","AcceptingNewMinter","acceptMinter","cancelMinter","MakeOwnerMinter","removeMinter","dispense","ownerWithdraw","isTrueMinter","Ocean","accounts","compute","fixedRateExchange","generateIntantiableConfigFromConfig","_instanceConfig$confi","poolFactoryABI","poolFactoryAddress","fixedRateExchangeAddressABI","metadataContractAddress","metadataContractABI","configHelperNetworksBase","subgraphUri","explorerUri","oceanTokenSymbol","configHelperNetworks","verbose","authMessage","authTokenExpiration","parityUri","threshold","getAddressesFromEnv","configAddresses","DefaultContractsAddresses","DTFactory","BFactory","FixedRateExchange","Dispenser","Metadata","env","AQUARIUS_URI","ADDRESS_FILE","readFileSync","homedir","getConfig","infuraProjectId","filterBy"],"mappings":"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"}
|