@t2000/cli 1.24.14 → 1.25.0

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/eventemitter3@5.0.4/node_modules/eventemitter3/index.js","../../../node_modules/.pnpm/@pythnetwork+price-service-sdk@1.9.0/node_modules/@pythnetwork/price-service-sdk/dist/cjs/schemas/PriceFeed.cjs","../../../node_modules/.pnpm/bn.js@5.2.3/node_modules/bn.js/lib/bn.js","../../../node_modules/.pnpm/@pythnetwork+price-service-sdk@1.9.0/node_modules/@pythnetwork/price-service-sdk/dist/cjs/AccumulatorUpdateData.cjs","../../../node_modules/.pnpm/@pythnetwork+price-service-sdk@1.9.0/node_modules/@pythnetwork/price-service-sdk/dist/cjs/index.cjs","../../../node_modules/.pnpm/proxy-from-env@1.1.0/node_modules/proxy-from-env/index.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/bind.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/utils.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/core/AxiosError.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/toFormData.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/AxiosURLSearchParams.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/buildURL.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/core/InterceptorManager.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/defaults/transitional.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/platform/node/classes/URLSearchParams.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/platform/node/index.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/platform/common/utils.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/platform/index.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/toURLEncodedForm.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/formDataToJSON.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/defaults/index.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/parseHeaders.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/core/AxiosHeaders.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/core/transformData.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/cancel/isCancel.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/cancel/CanceledError.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/core/settle.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/isAbsoluteURL.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/combineURLs.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/core/buildFullPath.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/env/data.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/parseProtocol.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/fromDataURI.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/AxiosTransformStream.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/readBlob.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/formDataToStream.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/callbackify.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/speedometer.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/throttle.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/progressEventReducer.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/adapters/http.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/isURLSameOrigin.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/cookies.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/core/mergeConfig.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/resolveConfig.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/adapters/xhr.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/composeSignals.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/trackStream.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/adapters/fetch.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/adapters/adapters.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/core/dispatchRequest.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/validator.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/core/Axios.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/cancel/CancelToken.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/spread.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/isAxiosError.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/helpers/HttpStatusCode.js","../../../node_modules/.pnpm/axios@1.13.6/node_modules/axios/lib/axios.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/interopRequireDefault.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/OverloadYield.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/regeneratorDefine.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/regenerator.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/regeneratorAsyncIterator.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/regeneratorAsyncGen.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/regeneratorAsync.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/regeneratorKeys.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/typeof.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/regeneratorValues.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/regeneratorRuntime.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/regenerator/index.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/asyncToGenerator.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/toPrimitive.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/toPropertyKey.js","../../../node_modules/.pnpm/@babel+runtime@7.29.2/node_modules/@babel/runtime/helpers/defineProperty.js","../../../node_modules/.pnpm/is-retry-allowed@2.2.0/node_modules/is-retry-allowed/index.js","../../../node_modules/.pnpm/axios-retry@3.9.1/node_modules/axios-retry/es/index.mjs","../../../node_modules/.pnpm/axios-retry@3.9.1/node_modules/axios-retry/index.js","../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/constants.js","../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/buffer-util.js","../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/limiter.js","../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/permessage-deflate.js","../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/validation.js","../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/receiver.js","../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/sender.js","../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/event-target.js","../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/extension.js","../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/websocket.js","../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/stream.js","../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/subprotocol.js","../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/websocket-server.js","../../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/index.js","../../../node_modules/.pnpm/isomorphic-ws@4.0.1_ws@8.20.0/node_modules/isomorphic-ws/node.js","../../../node_modules/.pnpm/@pythnetwork+price-service-client@1.9.0/node_modules/@pythnetwork/price-service-client/lib/ResillientWebSocket.js","../../../node_modules/.pnpm/@pythnetwork+price-service-client@1.9.0/node_modules/@pythnetwork/price-service-client/lib/utils.js","../../../node_modules/.pnpm/@pythnetwork+price-service-client@1.9.0/node_modules/@pythnetwork/price-service-client/lib/PriceServiceConnection.js","../../../node_modules/.pnpm/@pythnetwork+price-service-client@1.9.0/node_modules/@pythnetwork/price-service-client/lib/index.js","../../../node_modules/.pnpm/@pythnetwork+pyth-sui-js@2.2.0_typescript@5.9.3/node_modules/@pythnetwork/pyth-sui-js/lib/SuiPriceServiceConnection.js","../../../node_modules/.pnpm/@pythnetwork+pyth-sui-js@2.2.0_typescript@5.9.3/node_modules/@pythnetwork/pyth-sui-js/lib/client.js","../../../node_modules/.pnpm/@pythnetwork+pyth-sui-js@2.2.0_typescript@5.9.3/node_modules/@pythnetwork/pyth-sui-js/lib/index.js","../../../node_modules/.pnpm/eventemitter3@5.0.4/node_modules/eventemitter3/index.mjs","../../../node_modules/.pnpm/@mysten+payment-kit@0.1.6_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/payment-kit/src/error.ts","../../../node_modules/.pnpm/@mysten+payment-kit@0.1.6_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/payment-kit/src/constants.ts","../../../node_modules/.pnpm/@mysten+payment-kit@0.1.6_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/payment-kit/src/uri.ts","../../../node_modules/.pnpm/@mysten+sui@2.11.0_typescript@5.9.3/node_modules/@mysten/sui/src/cryptography/intent.ts","../../../node_modules/.pnpm/@mysten+sui@2.11.0_typescript@5.9.3/node_modules/@mysten/sui/src/cryptography/publickey.ts","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/src/sha2.ts","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/src/utils.ts","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/src/abstract/modular.ts","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/src/abstract/curve.ts","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/src/abstract/edwards.ts","../../../node_modules/.pnpm/@noble+curves@2.0.1/node_modules/@noble/curves/src/ed25519.ts","../../../node_modules/.pnpm/@mysten+sui@2.11.0_typescript@5.9.3/node_modules/@mysten/sui/src/keypairs/ed25519/publickey.ts","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/src/hmac.ts","../../../node_modules/.pnpm/@noble+hashes@2.0.1/node_modules/@noble/hashes/src/pbkdf2.ts","../../../node_modules/.pnpm/@scure+bip39@2.0.1/node_modules/@scure/bip39/index.js","../../../node_modules/.pnpm/@mysten+sui@2.11.0_typescript@5.9.3/node_modules/@mysten/sui/src/cryptography/mnemonics.ts","../../../node_modules/.pnpm/@mysten+sui@2.11.0_typescript@5.9.3/node_modules/@mysten/sui/src/cryptography/signature.ts","../../../node_modules/.pnpm/@mysten+sui@2.11.0_typescript@5.9.3/node_modules/@mysten/sui/src/cryptography/keypair.ts","../../../node_modules/.pnpm/@mysten+sui@2.11.0_typescript@5.9.3/node_modules/@mysten/sui/src/keypairs/ed25519/ed25519-hd-key.ts","../../../node_modules/.pnpm/@mysten+sui@2.11.0_typescript@5.9.3/node_modules/@mysten/sui/src/keypairs/ed25519/keypair.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/constants.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/helpers.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/utils/index.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins/domain.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins/deps/sui/vec_map.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins_payments/deps/std/type_name.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins_payments/deps/sui/vec_map.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins_payments/payments.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins/deps/std/type_name.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins/payment.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins/controller.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins_coupons/deps/sui/bag.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins_coupons/data.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins_coupons/coupon_house.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins_discounts/discounts.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins_discounts/deps/suins/pricing_config.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins_discounts/deps/sui/linked_table.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/contracts/suins_discounts/free_claims.ts","../../../node_modules/.pnpm/@mysten+suins@1.1.1_@mysten+sui@2.11.0_typescript@5.9.3_/node_modules/@mysten/suins/src/suins-transaction.ts","../../sdk/src/errors.ts","../../sdk/src/token-registry.ts","../../../node_modules/.pnpm/lodash.camelcase@4.3.0/node_modules/lodash.camelcase/index.js","../../sdk/src/protocols/volo.ts","../../sdk/src/wallet/coinSelection.ts","../../sdk/src/protocols/cetus-swap.ts","../../sdk/src/constants.ts","../../sdk/src/utils/sui.ts","../../sdk/src/wallet/keyManager.ts","../../sdk/src/wallet/keypairSigner.ts","../../sdk/src/wallet/zkLoginSigner.ts","../../sdk/src/wallet/send.ts","../../sdk/src/utils/format.ts","../../sdk/src/wallet/balance.ts","../../sdk/src/wallet/classify.ts","../../sdk/src/wallet/history.ts","../../sdk/src/t2000.ts","../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/uleb.ts","../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/reader.ts","../../../node_modules/.pnpm/@scure+base@2.0.0/node_modules/@scure/base/index.ts","../../../node_modules/.pnpm/@mysten+utils@0.3.1/node_modules/@mysten/utils/src/b58.ts","../../../node_modules/.pnpm/@mysten+utils@0.3.1/node_modules/@mysten/utils/src/b64.ts","../../../node_modules/.pnpm/@mysten+utils@0.3.1/node_modules/@mysten/utils/src/hex.ts","../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/utils.ts","../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/writer.ts","../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/bcs-type.ts","../../../node_modules/.pnpm/@mysten+bcs@2.0.2/node_modules/@mysten/bcs/src/bcs.ts","../../../node_modules/.pnpm/bignumber.js@9.1.2/node_modules/bignumber.js/bignumber.mjs","../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/bcs.ts","../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/ua.ts","../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/utils.ts","../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/pool.ts","../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/market.ts","../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/config.ts","../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/emode.ts","../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/account.ts","../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/oracle.ts","../../../node_modules/.pnpm/@naviprotocol+lending@1.4.0_patch_hash=f5361914099eac610a549dc571b1248d29f6a1f4195ed017_05ba4b180e35cb4ccd9db84691f20fcb/node_modules/@naviprotocol/lending/src/reward.ts","../../sdk/src/protocols/navi.ts","../../sdk/src/protocols/yieldTracker.ts","../../sdk/src/adapters/registry.ts","../../sdk/src/adapters/navi.ts","../../sdk/src/adapters/descriptors.ts","../../sdk/src/safeguards/types.ts","../../sdk/src/safeguards/errors.ts","../../sdk/src/safeguards/enforcer.ts","../../sdk/src/contacts.ts","../../sdk/src/index.ts","../../sdk/src/protocols/navi-harvest.ts","../../sdk/src/composeTx.ts","../../sdk/src/protocols/protocolFee.ts","../../sdk/src/protocols/financialSummary.ts","../../sdk/src/utils/simulate.ts","../../sdk/src/swap-quote.ts","../../sdk/src/protocols/suins-leaf.ts"],"sourcesContent":["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","// To parse this data:\n//\n// import { Convert, PriceFeed } from \"./file\";\n//\n// const priceFeed = Convert.toPriceFeed(json);\n//\n// These functions will throw an error if the JSON doesn't\n// match the expected interface, even if the JSON is valid.\n/**\n * Represents an aggregate price from Pyth publisher feeds.\n */ \"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"Convert\", {\n enumerable: true,\n get: function() {\n return Convert;\n }\n});\nclass Convert {\n static toPriceFeed(json) {\n return cast(json, r(\"PriceFeed\"));\n }\n static priceFeedToJson(value) {\n return uncast(value, r(\"PriceFeed\"));\n }\n static toPrice(json) {\n return cast(json, r(\"Price\"));\n }\n static priceToJson(value) {\n return uncast(value, r(\"Price\"));\n }\n static toPriceFeedMetadata(json) {\n return cast(json, r(\"PriceFeedMetadata\"));\n }\n static priceFeedMetadataToJson(value) {\n return uncast(value, r(\"PriceFeedMetadata\"));\n }\n}\nfunction invalidValue(typ, val, key = \"\") {\n if (key) {\n throw new Error(`Invalid value for key \"${key}\". Expected type ${JSON.stringify(typ)} but got ${JSON.stringify(val)}`);\n }\n throw new Error(`Invalid value ${JSON.stringify(val)} for type ${JSON.stringify(typ)}`);\n}\nfunction jsonToJSProps(typ) {\n if (typ.jsonToJS === undefined) {\n const map = {};\n typ.props.forEach((p)=>map[p.json] = {\n key: p.js,\n typ: p.typ\n });\n typ.jsonToJS = map;\n }\n return typ.jsonToJS;\n}\nfunction jsToJSONProps(typ) {\n if (typ.jsToJSON === undefined) {\n const map = {};\n typ.props.forEach((p)=>map[p.js] = {\n key: p.json,\n typ: p.typ\n });\n typ.jsToJSON = map;\n }\n return typ.jsToJSON;\n}\nfunction transform(val, typ, getProps, key = \"\") {\n function transformPrimitive(typ, val) {\n if (typeof typ === typeof val) return val;\n return invalidValue(typ, val, key);\n }\n function transformUnion(typs, val) {\n // val must validate against one typ in typs\n const l = typs.length;\n for(let i = 0; i < l; i++){\n const typ = typs[i];\n try {\n return transform(val, typ, getProps);\n } catch {}\n }\n return invalidValue(typs, val);\n }\n function transformEnum(cases, val) {\n if (cases.includes(val)) return val;\n return invalidValue(cases, val);\n }\n function transformArray(typ, val) {\n // val must be an array with no invalid elements\n if (!Array.isArray(val)) return invalidValue(\"array\", val);\n return val.map((el)=>transform(el, typ, getProps));\n }\n function transformDate(val) {\n if (val === null) {\n return null;\n }\n const d = new Date(val);\n if (isNaN(d.valueOf())) {\n return invalidValue(\"Date\", val);\n }\n return d;\n }\n function transformObject(props, additional, val) {\n if (val === null || typeof val !== \"object\" || Array.isArray(val)) {\n return invalidValue(\"object\", val);\n }\n const result = {};\n for (const key of Object.getOwnPropertyNames(props)){\n const prop = props[key];\n const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined;\n result[prop.key] = transform(v, prop.typ, getProps, prop.key);\n }\n for (const key of Object.getOwnPropertyNames(val)){\n if (!Object.prototype.hasOwnProperty.call(props, key)) {\n result[key] = transform(val[key], additional, getProps, key);\n }\n }\n return result;\n }\n if (typ === \"any\") return val;\n if (typ === null) {\n if (val === null) return val;\n return invalidValue(typ, val);\n }\n if (typ === false) return invalidValue(typ, val);\n while(typeof typ === \"object\" && typ.ref !== undefined){\n typ = typeMap[typ.ref];\n }\n if (Array.isArray(typ)) return transformEnum(typ, val);\n if (typeof typ === \"object\") {\n return typ.hasOwnProperty(\"unionMembers\") ? transformUnion(typ.unionMembers, val) : typ.hasOwnProperty(\"arrayItems\") ? transformArray(typ.arrayItems, val) : typ.hasOwnProperty(\"props\") ? transformObject(getProps(typ), typ.additional, val) : invalidValue(typ, val);\n }\n // Numbers can be parsed by Date but shouldn't be.\n if (typ === Date && typeof val !== \"number\") return transformDate(val);\n return transformPrimitive(typ, val);\n}\nfunction cast(val, typ) {\n return transform(val, typ, jsonToJSProps);\n}\nfunction uncast(val, typ) {\n return transform(val, typ, jsToJSONProps);\n}\nfunction u(...typs) {\n return {\n unionMembers: typs\n };\n}\nfunction o(props, additional) {\n return {\n props,\n additional\n };\n}\nfunction r(name) {\n return {\n ref: name\n };\n}\nconst typeMap = {\n PriceFeed: o([\n {\n json: \"ema_price\",\n js: \"ema_price\",\n typ: r(\"Price\")\n },\n {\n json: \"id\",\n js: \"id\",\n typ: \"\"\n },\n {\n json: \"metadata\",\n js: \"metadata\",\n typ: u(undefined, r(\"PriceFeedMetadata\"))\n },\n {\n json: \"price\",\n js: \"price\",\n typ: r(\"Price\")\n },\n {\n json: \"vaa\",\n js: \"vaa\",\n typ: u(undefined, \"\")\n }\n ], \"any\"),\n Price: o([\n {\n json: \"conf\",\n js: \"conf\",\n typ: \"\"\n },\n {\n json: \"expo\",\n js: \"expo\",\n typ: 0\n },\n {\n json: \"price\",\n js: \"price\",\n typ: \"\"\n },\n {\n json: \"publish_time\",\n js: \"publish_time\",\n typ: 0\n }\n ], \"any\"),\n PriceFeedMetadata: o([\n {\n json: \"attestation_time\",\n js: \"attestation_time\",\n typ: u(undefined, 0)\n },\n {\n json: \"emitter_chain\",\n js: \"emitter_chain\",\n typ: 0\n },\n {\n json: \"prev_publish_time\",\n js: \"prev_publish_time\",\n typ: u(undefined, 0)\n },\n {\n json: \"price_service_receive_time\",\n js: \"price_service_receive_time\",\n typ: u(undefined, 0)\n },\n {\n json: \"sequence_number\",\n js: \"sequence_number\",\n typ: u(undefined, 0)\n },\n {\n json: \"slot\",\n js: \"slot\",\n typ: u(undefined, 0)\n }\n ], \"any\")\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 if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {\n Buffer = window.Buffer;\n } else {\n Buffer = require('buffer').Buffer;\n }\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 this.negative = 1;\n }\n\n if (start < number.length) {\n if (base === 16) {\n this._parseHex(number, start, endian);\n } else {\n this._parseBase(number, base, start);\n if (endian === 'le') {\n this._initArray(this.toArray(), base, endian);\n }\n }\n }\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 parseHex4Bits (string, index) {\n var c = string.charCodeAt(index);\n // '0' - '9'\n if (c >= 48 && c <= 57) {\n return c - 48;\n // 'A' - 'F'\n } else if (c >= 65 && c <= 70) {\n return c - 55;\n // 'a' - 'f'\n } else if (c >= 97 && c <= 102) {\n return c - 87;\n } else {\n assert(false, 'Invalid character in ' + string);\n }\n }\n\n function parseHexByte (string, lowerBound, index) {\n var r = parseHex4Bits(string, index);\n if (index - 1 >= lowerBound) {\n r |= parseHex4Bits(string, index - 1) << 4;\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start, endian) {\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 // 24-bits chunks\n var off = 0;\n var j = 0;\n\n var w;\n if (endian === 'be') {\n for (i = number.length - 1; i >= start; i -= 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n } else {\n var parseLength = number.length - start;\n for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n }\n\n this._strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var b = 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 b = c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n b = c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n b = c;\n }\n assert(c >= 0 && b < mul, 'Invalid character');\n r += b;\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 this._strip();\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 function move (dest, src) {\n dest.words = src.words;\n dest.length = src.length;\n dest.negative = src.negative;\n dest.red = src.red;\n }\n\n BN.prototype._move = function _move (dest) {\n move(dest, this);\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 // Check Symbol.for because not everywhere where Symbol defined\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility\n if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {\n try {\n BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;\n } catch (e) {\n BN.prototype.inspect = inspect;\n }\n } else {\n BN.prototype.inspect = inspect;\n }\n\n 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 off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\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.modrn(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, 2);\n };\n\n if (Buffer) {\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n return this.toArrayLike(Buffer, endian, length);\n };\n }\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n var allocate = function allocate (ArrayType, size) {\n if (ArrayType.allocUnsafe) {\n return ArrayType.allocUnsafe(size);\n }\n return new ArrayType(size);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n this._strip();\n\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 var res = allocate(ArrayType, reqLength);\n var postfix = endian === 'le' ? 'LE' : 'BE';\n this['_toArrayLike' + postfix](res, byteLength);\n return res;\n };\n\n BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {\n var position = 0;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position++] = word & 0xff;\n if (position < res.length) {\n res[position++] = (word >> 8) & 0xff;\n }\n if (position < res.length) {\n res[position++] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position < res.length) {\n res[position++] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position < res.length) {\n res[position++] = carry;\n\n while (position < res.length) {\n res[position++] = 0;\n }\n }\n };\n\n BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {\n var position = res.length - 1;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position--] = word & 0xff;\n if (position >= 0) {\n res[position--] = (word >> 8) & 0xff;\n }\n if (position >= 0) {\n res[position--] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position >= 0) {\n res[position--] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position >= 0) {\n res[position--] = carry;\n\n while (position >= 0) {\n res[position--] = 0;\n }\n }\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] >>> wbit) & 0x01;\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 // Temporary disable, see https://github.com/indutny/bn.js/issues/211\n // var fftm = new FFTM();\n // return fftm.mulp(self, num, out);\n return bigMulTo(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 var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\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 this.length = num === 0 ? 1 : this.length;\n\n return isNegNum ? this.ineg() : 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 if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\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.modrn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modrn(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.modrn = function modrn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\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 isNegNum ? -acc : acc;\n };\n\n // WARNING: DEPRECATED\n BN.prototype.modn = function modn (num) {\n return this.modrn(num);\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\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 this._strip();\n return isNegNum ? this.ineg() : this;\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 a BN v4 instance\n r.strip();\n } else {\n // r is a 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\n move(a, a.umod(this.m)._forceRed(this));\n return a;\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","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nfunction _export(target, all) {\n for(var name in all)Object.defineProperty(target, name, {\n enumerable: true,\n get: Object.getOwnPropertyDescriptor(all, name).get\n });\n}\n_export(exports, {\n get isAccumulatorUpdateData () {\n return isAccumulatorUpdateData;\n },\n get parseAccumulatorUpdateData () {\n return parseAccumulatorUpdateData;\n },\n get parsePriceFeedMessage () {\n return parsePriceFeedMessage;\n },\n get parseTwapMessage () {\n return parseTwapMessage;\n },\n get sliceAccumulatorUpdateData () {\n return sliceAccumulatorUpdateData;\n }\n});\nconst _bn = /*#__PURE__*/ _interop_require_default(require(\"bn.js\"));\nfunction _interop_require_default(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nconst ACCUMULATOR_MAGIC = \"504e4155\";\nconst MAJOR_VERSION = 1;\nconst MINOR_VERSION = 0;\nconst KECCAK160_HASH_SIZE = 20;\nconst PRICE_FEED_MESSAGE_VARIANT = 0;\nconst TWAP_MESSAGE_VARIANT = 1;\nfunction isAccumulatorUpdateData(updateBytes) {\n return updateBytes.toString(\"hex\").startsWith(ACCUMULATOR_MAGIC) && updateBytes[4] === MAJOR_VERSION && updateBytes[5] === MINOR_VERSION;\n}\nfunction parsePriceFeedMessage(message) {\n let cursor = 0;\n const variant = message.readUInt8(cursor);\n if (variant !== PRICE_FEED_MESSAGE_VARIANT) {\n throw new Error(\"Not a price feed message\");\n }\n cursor += 1;\n const feedId = message.subarray(cursor, cursor + 32);\n cursor += 32;\n const price = new _bn.default(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n const confidence = new _bn.default(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n const exponent = message.readInt32BE(cursor);\n cursor += 4;\n const publishTime = new _bn.default(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n const prevPublishTime = new _bn.default(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n const emaPrice = new _bn.default(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n const emaConf = new _bn.default(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n return {\n feedId,\n price,\n confidence,\n exponent,\n publishTime,\n prevPublishTime,\n emaPrice,\n emaConf\n };\n}\nfunction parseTwapMessage(message) {\n let cursor = 0;\n const variant = message.readUInt8(cursor);\n if (variant !== TWAP_MESSAGE_VARIANT) {\n throw new Error(\"Not a twap message\");\n }\n cursor += 1;\n const feedId = message.subarray(cursor, cursor + 32);\n cursor += 32;\n const cumulativePrice = new _bn.default(message.subarray(cursor, cursor + 16), \"be\");\n cursor += 16;\n const cumulativeConf = new _bn.default(message.subarray(cursor, cursor + 16), \"be\");\n cursor += 16;\n const numDownSlots = new _bn.default(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n const exponent = message.readInt32BE(cursor);\n cursor += 4;\n const publishTime = new _bn.default(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n const prevPublishTime = new _bn.default(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n const publishSlot = new _bn.default(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n return {\n feedId,\n cumulativePrice,\n cumulativeConf,\n numDownSlots,\n exponent,\n publishTime,\n prevPublishTime,\n publishSlot\n };\n}\nfunction sliceAccumulatorUpdateData(data, start, end) {\n if (!isAccumulatorUpdateData(data)) {\n throw new Error(\"Invalid accumulator message\");\n }\n let cursor = 6;\n const trailingPayloadSize = data.readUint8(cursor);\n cursor += 1 + trailingPayloadSize;\n // const proofType = data.readUint8(cursor);\n cursor += 1;\n const vaaSize = data.readUint16BE(cursor);\n cursor += 2;\n cursor += vaaSize;\n const endOfVaa = cursor;\n const updates = [];\n const numUpdates = data.readUInt8(cursor);\n cursor += 1;\n for(let i = 0; i < numUpdates; i++){\n const updateStart = cursor;\n const messageSize = data.readUint16BE(cursor);\n cursor += 2;\n cursor += messageSize;\n const numProofs = data.readUInt8(cursor);\n cursor += 1;\n cursor += KECCAK160_HASH_SIZE * numProofs;\n updates.push(data.subarray(updateStart, cursor));\n }\n if (cursor !== data.length) {\n throw new Error(\"Didn't reach the end of the message\");\n }\n const sliceUpdates = updates.slice(start, end);\n return Buffer.concat([\n data.subarray(0, endOfVaa),\n Buffer.from([\n sliceUpdates.length\n ]),\n ...updates.slice(start, end)\n ]);\n}\nfunction parseAccumulatorUpdateData(data) {\n if (!isAccumulatorUpdateData(data)) {\n throw new Error(\"Invalid accumulator message\");\n }\n let cursor = 6;\n const trailingPayloadSize = data.readUint8(cursor);\n cursor += 1 + trailingPayloadSize;\n // const proofType = data.readUint8(cursor);\n cursor += 1;\n const vaaSize = data.readUint16BE(cursor);\n cursor += 2;\n const vaa = data.subarray(cursor, cursor + vaaSize);\n cursor += vaaSize;\n const numUpdates = data.readUInt8(cursor);\n const updates = [];\n cursor += 1;\n for(let i = 0; i < numUpdates; i++){\n const messageSize = data.readUint16BE(cursor);\n cursor += 2;\n const message = data.subarray(cursor, cursor + messageSize);\n cursor += messageSize;\n const numProofs = data.readUInt8(cursor);\n cursor += 1;\n const proof = [];\n for(let j = 0; j < numProofs; j++){\n proof.push([\n ...data.subarray(cursor, cursor + KECCAK160_HASH_SIZE)\n ]);\n cursor += KECCAK160_HASH_SIZE;\n }\n updates.push({\n message,\n proof\n });\n }\n if (cursor !== data.length) {\n throw new Error(\"Didn't reach the end of the message\");\n }\n return {\n vaa,\n updates\n };\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-explicit-any */ \"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nfunction _export(target, all) {\n for(var name in all)Object.defineProperty(target, name, {\n enumerable: true,\n get: Object.getOwnPropertyDescriptor(all, name).get\n });\n}\n_export(exports, {\n get Price () {\n return Price;\n },\n get PriceFeed () {\n return PriceFeed;\n },\n get PriceFeedMetadata () {\n return PriceFeedMetadata;\n },\n get isAccumulatorUpdateData () {\n return _AccumulatorUpdateData.isAccumulatorUpdateData;\n },\n get parseAccumulatorUpdateData () {\n return _AccumulatorUpdateData.parseAccumulatorUpdateData;\n },\n get parsePriceFeedMessage () {\n return _AccumulatorUpdateData.parsePriceFeedMessage;\n },\n get parseTwapMessage () {\n return _AccumulatorUpdateData.parseTwapMessage;\n },\n get sliceAccumulatorUpdateData () {\n return _AccumulatorUpdateData.sliceAccumulatorUpdateData;\n }\n});\nconst _PriceFeed = require(\"./schemas/PriceFeed.cjs\");\nconst _AccumulatorUpdateData = require(\"./AccumulatorUpdateData.cjs\");\nclass Price {\n conf;\n expo;\n price;\n publishTime;\n constructor(rawPrice){\n this.conf = rawPrice.conf;\n this.expo = rawPrice.expo;\n this.price = rawPrice.price;\n this.publishTime = rawPrice.publishTime;\n }\n /**\n * Get price as number. Warning: this conversion might result in an inaccurate number.\n * We store price and confidence values in our Oracle at 64-bit precision, but the JavaScript\n * number type can only represent numbers with 52-bit precision. So if a price or confidence\n * is larger than 52-bits, the conversion will lose the most insignificant bits.\n *\n * @returns a floating point number representing the price\n */ getPriceAsNumberUnchecked() {\n return Number(this.price) * 10 ** this.expo;\n }\n /**\n * Get price as number. Warning: this conversion might result in an inaccurate number.\n * Explanation is the same as `priceAsNumberUnchecked()` documentation.\n *\n * @returns a floating point number representing the price\n */ getConfAsNumberUnchecked() {\n return Number(this.conf) * 10 ** this.expo;\n }\n static fromJson(json) {\n const jsonPrice = _PriceFeed.Convert.toPrice(json);\n return new Price({\n conf: jsonPrice.conf,\n expo: jsonPrice.expo,\n price: jsonPrice.price,\n publishTime: jsonPrice.publish_time\n });\n }\n toJson() {\n const jsonPrice = {\n conf: this.conf,\n expo: this.expo,\n price: this.price,\n publish_time: this.publishTime\n };\n // this is done to avoid sending undefined values to the server\n return _PriceFeed.Convert.priceToJson(jsonPrice);\n }\n}\nclass PriceFeedMetadata {\n /**\n * Attestation time of the price\n */ attestationTime;\n /**\n * Chain of the emitter\n */ emitterChain;\n /**\n * The time that the price service received the price\n */ priceServiceReceiveTime;\n /**\n * Sequence number of the price\n */ sequenceNumber;\n /**\n * Pythnet slot number of the price\n */ slot;\n /**\n * The time that the previous price was published\n */ prevPublishTime;\n constructor(metadata){\n this.attestationTime = metadata.attestationTime;\n this.emitterChain = metadata.emitterChain;\n this.priceServiceReceiveTime = metadata.receiveTime;\n this.sequenceNumber = metadata.sequenceNumber;\n this.slot = metadata.slot;\n this.prevPublishTime = metadata.prevPublishTime;\n }\n static fromJson(json) {\n if (json === undefined) {\n return undefined;\n }\n const jsonFeed = _PriceFeed.Convert.toPriceFeedMetadata(json);\n return new PriceFeedMetadata({\n attestationTime: jsonFeed.attestation_time,\n emitterChain: jsonFeed.emitter_chain,\n receiveTime: jsonFeed.price_service_receive_time,\n sequenceNumber: jsonFeed.sequence_number,\n slot: jsonFeed.slot,\n prevPublishTime: jsonFeed.prev_publish_time\n });\n }\n toJson() {\n const jsonFeed = {\n attestation_time: this.attestationTime,\n emitter_chain: this.emitterChain,\n price_service_receive_time: this.priceServiceReceiveTime,\n sequence_number: this.sequenceNumber,\n slot: this.slot,\n prev_publish_time: this.prevPublishTime\n };\n // this is done to avoid sending undefined values to the server\n return _PriceFeed.Convert.priceFeedMetadataToJson(jsonFeed);\n }\n}\nclass PriceFeed {\n /**\n * Exponentially-weighted moving average Price\n */ emaPrice;\n /**\n * Unique identifier for this price.\n */ id;\n /**\n * Metadata of the price\n */ metadata;\n /**\n * VAA of the price\n */ vaa;\n /**\n * Price\n */ price;\n constructor(rawFeed){\n this.emaPrice = rawFeed.emaPrice;\n this.id = rawFeed.id;\n this.metadata = rawFeed.metadata;\n this.vaa = rawFeed.vaa;\n this.price = rawFeed.price;\n }\n static fromJson(json) {\n const jsonFeed = _PriceFeed.Convert.toPriceFeed(json);\n return new PriceFeed({\n emaPrice: Price.fromJson(jsonFeed.ema_price),\n id: jsonFeed.id,\n metadata: PriceFeedMetadata.fromJson(jsonFeed.metadata),\n vaa: jsonFeed.vaa,\n price: Price.fromJson(jsonFeed.price)\n });\n }\n toJson() {\n const jsonFeed = {\n ema_price: this.emaPrice.toJson(),\n id: this.id,\n metadata: this.metadata?.toJson(),\n price: this.price.toJson()\n };\n return _PriceFeed.Convert.priceFeedToJson(jsonFeed);\n }\n /**\n * Get the price and confidence interval as fixed-point numbers of the form a * 10^e.\n * This function returns the current best estimate of the price at the time that this `PriceFeed` was\n * published (`publishTime`). The returned price can be from arbitrarily far in the past; this function\n * makes no guarantees that the returned price is recent or useful for any particular application.\n *\n * Users of this function should check the returned `publishTime` to ensure that the returned price is\n * sufficiently recent for their application. If you are considering using this function, it may be\n * safer / easier to use `getPriceNoOlderThan` method.\n *\n * @returns a Price that contains the price and confidence interval along with\n * the exponent for them, and publish time of the price.\n */ getPriceUnchecked() {\n return this.price;\n }\n /**\n * Get the exponentially-weighted moving average (EMA) price and confidence interval.\n *\n * This function returns the current best estimate of the price at the time that this `PriceFeed` was\n * published (`publishTime`). The returned price can be from arbitrarily far in the past; this function\n * makes no guarantees that the returned price is recent or useful for any particular application.\n *\n * Users of this function should check the returned `publishTime` to ensure that the returned price is\n * sufficiently recent for their application. If you are considering using this function, it may be\n * safer / easier to use `getEmaPriceNoOlderThan` method.\n *\n * At the moment, the confidence interval returned by this method is computed in\n * a somewhat questionable way, so we do not recommend using it for high-value applications.\n *\n * @returns a Price that contains the EMA price and confidence interval along with\n * the exponent for them, and publish time of the price.\n */ getEmaPriceUnchecked() {\n return this.emaPrice;\n }\n /**\n * Get the price if it was updated no older than `age` seconds of the current time.\n *\n * This function is a sanity-checked version of `getPriceUnchecked` which is useful in\n * applications that require a sufficiently-recent price. Returns `undefined` if the price\n * is not recent enough.\n *\n * @param age - return a price as long as it has been updated within this number of seconds\n * @returns a Price struct containing the price, confidence interval along with the exponent for\n * both numbers, and its publish time, or `undefined` if no price update occurred within `age` seconds of the current time.\n */ getPriceNoOlderThan(age) {\n const price = this.getPriceUnchecked();\n const currentTime = Math.floor(Date.now() / 1000);\n // This checks the absolute difference as a sanity check\n // for the cases that the system time is behind or price\n // feed timestamp happen to be in the future (a bug).\n if (Math.abs(currentTime - price.publishTime) > age) {\n return undefined;\n }\n return price;\n }\n /**\n * Get the exponentially-weighted moving average (EMA) price if it was updated no older than\n * `age` seconds of the current time.\n *\n * This function is a sanity-checked version of `getEmaPriceUnchecked` which is useful in\n * applications that require a sufficiently-recent price. Returns `undefined` if the price\n * is not recent enough.\n *\n * At the moment, the confidence interval returned by this method is computed in\n * a somewhat questionable way, so we do not recommend using it for high-value applications.\n *\n * @param age - return a price as long as it has been updated within this number of seconds\n * @returns a Price struct containing the EMA price, confidence interval along with the exponent for\n * both numbers, and its publish time, or `undefined` if no price update occurred within `age` seconds of the current time.\n */ getEmaPriceNoOlderThan(age) {\n const emaPrice = this.getEmaPriceUnchecked();\n const currentTime = Math.floor(Date.now() / 1000);\n // This checks the absolute difference as a sanity check\n // for the cases that the system time is behind or price\n // feed timestamp happen to be in the future (a bug).\n if (Math.abs(currentTime - emaPrice.publishTime) > age) {\n return undefined;\n }\n return emaPrice;\n }\n /**\n * Get the price feed metadata.\n *\n * @returns a struct containing the attestation time, emitter chain, and the sequence number.\n * Returns `undefined` if metadata is currently unavailable.\n */ getMetadata() {\n return this.metadata;\n }\n /**\n * Get the price feed vaa.\n *\n * @returns vaa in base64.\n * Returns `undefined` if vaa is unavailable.\n */ getVAA() {\n return this.vaa;\n }\n}\n","'use strict';\n\nvar parseUrl = require('url').parse;\n\nvar DEFAULT_PORTS = {\n ftp: 21,\n gopher: 70,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443,\n};\n\nvar stringEndsWith = String.prototype.endsWith || function(s) {\n return s.length <= this.length &&\n this.indexOf(s, this.length - s.length) !== -1;\n};\n\n/**\n * @param {string|object} url - The URL, or the result from url.parse.\n * @return {string} The URL of the proxy that should handle the request to the\n * given URL. If no proxy is set, this will be an empty string.\n */\nfunction getProxyForUrl(url) {\n var parsedUrl = typeof url === 'string' ? parseUrl(url) : url || {};\n var proto = parsedUrl.protocol;\n var hostname = parsedUrl.host;\n var port = parsedUrl.port;\n if (typeof hostname !== 'string' || !hostname || typeof proto !== 'string') {\n return ''; // Don't proxy URLs without a valid scheme or host.\n }\n\n proto = proto.split(':', 1)[0];\n // Stripping ports in this way instead of using parsedUrl.hostname to make\n // sure that the brackets around IPv6 addresses are kept.\n hostname = hostname.replace(/:\\d*$/, '');\n port = parseInt(port) || DEFAULT_PORTS[proto] || 0;\n if (!shouldProxy(hostname, port)) {\n return ''; // Don't proxy URLs that match NO_PROXY.\n }\n\n var proxy =\n getEnv('npm_config_' + proto + '_proxy') ||\n getEnv(proto + '_proxy') ||\n getEnv('npm_config_proxy') ||\n getEnv('all_proxy');\n if (proxy && proxy.indexOf('://') === -1) {\n // Missing scheme in proxy, default to the requested URL's scheme.\n proxy = proto + '://' + proxy;\n }\n return proxy;\n}\n\n/**\n * Determines whether a given URL should be proxied.\n *\n * @param {string} hostname - The host name of the URL.\n * @param {number} port - The effective port of the URL.\n * @returns {boolean} Whether the given URL should be proxied.\n * @private\n */\nfunction shouldProxy(hostname, port) {\n var NO_PROXY =\n (getEnv('npm_config_no_proxy') || getEnv('no_proxy')).toLowerCase();\n if (!NO_PROXY) {\n return true; // Always proxy if NO_PROXY is not set.\n }\n if (NO_PROXY === '*') {\n return false; // Never proxy if wildcard is set.\n }\n\n return NO_PROXY.split(/[,\\s]/).every(function(proxy) {\n if (!proxy) {\n return true; // Skip zero-length hosts.\n }\n var parsedProxy = proxy.match(/^(.+):(\\d+)$/);\n var parsedProxyHostname = parsedProxy ? parsedProxy[1] : proxy;\n var parsedProxyPort = parsedProxy ? parseInt(parsedProxy[2]) : 0;\n if (parsedProxyPort && parsedProxyPort !== port) {\n return true; // Skip if ports don't match.\n }\n\n if (!/^[.*]/.test(parsedProxyHostname)) {\n // No wildcards, so stop proxying if there is an exact match.\n return hostname !== parsedProxyHostname;\n }\n\n if (parsedProxyHostname.charAt(0) === '*') {\n // Remove leading wildcard.\n parsedProxyHostname = parsedProxyHostname.slice(1);\n }\n // Stop proxying if the hostname ends with the no_proxy host.\n return !stringEndsWith.call(hostname, parsedProxyHostname);\n });\n}\n\n/**\n * Get the value for an environment variable.\n *\n * @param {string} key - The name of the environment variable.\n * @return {string} The value of the environment variable.\n * @private\n */\nfunction getEnv(key) {\n return process.env[key.toLowerCase()] || process.env[key.toUpperCase()] || '';\n}\n\nexports.getProxyForUrl = getProxyForUrl;\n","'use strict';\n\n/**\n * Create a bound version of a function with a specified `this` context\n *\n * @param {Function} fn - The function to bind\n * @param {*} thisArg - The value to be passed as the `this` parameter\n * @returns {Function} A new function that will call the original function with the specified `this` context\n */\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst { toString } = Object.prototype;\nconst { getPrototypeOf } = Object;\nconst { iterator, toStringTag } = Symbol;\n\nconst kindOf = ((cache) => (thing) => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type;\n};\n\nconst typeOfTest = (type) => (thing) => typeof thing === type;\n\n/**\n * Determine if a value is a non-null object\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst { isArray } = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return (\n val !== null &&\n !isUndefined(val) &&\n val.constructor !== null &&\n !isUndefined(val.constructor) &&\n isFunction(val.constructor.isBuffer) &&\n val.constructor.isBuffer(val)\n );\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {\n result = ArrayBuffer.isView(val);\n } else {\n result = val && val.buffer && isArrayBuffer(val.buffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = (thing) => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (\n (prototype === null ||\n prototype === Object.prototype ||\n Object.getPrototypeOf(prototype) === null) &&\n !(toStringTag in val) &&\n !(iterator in val)\n );\n};\n\n/**\n * Determine if a value is an empty object (safely handles Buffers)\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an empty object, otherwise false\n */\nconst isEmptyObject = (val) => {\n // Early return for non-objects or Buffers to prevent RangeError\n if (!isObject(val) || isBuffer(val)) {\n return false;\n }\n\n try {\n return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\n } catch (e) {\n // Fallback for any other objects that might cause RangeError with Object.keys()\n return false;\n }\n};\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a React Native Blob\n * React Native \"blob\": an object with a `uri` attribute. Optionally, it can\n * also have a `name` and `type` attribute to specify filename and content type\n *\n * @see https://github.com/facebook/react-native/blob/26684cf3adf4094eb6c405d345a75bf8c7c0bf88/Libraries/Network/FormData.js#L68-L71\n * \n * @param {*} value The value to test\n * \n * @returns {boolean} True if value is a React Native Blob, otherwise false\n */\nconst isReactNativeBlob = (value) => {\n return !!(value && typeof value.uri !== 'undefined');\n}\n\n/**\n * Determine if environment is React Native\n * ReactNative `FormData` has a non-standard `getParts()` method\n * \n * @param {*} formData The formData to test\n * \n * @returns {boolean} True if environment is React Native, otherwise false\n */\nconst isReactNative = (formData) => formData && typeof formData.getParts !== 'undefined';\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction getGlobal() {\n if (typeof globalThis !== 'undefined') return globalThis;\n if (typeof self !== 'undefined') return self;\n if (typeof window !== 'undefined') return window;\n if (typeof global !== 'undefined') return global;\n return {};\n}\n\nconst G = getGlobal();\nconst FormDataCtor = typeof G.FormData !== 'undefined' ? G.FormData : undefined;\n\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (FormDataCtor && thing instanceof FormDataCtor) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n );\n};\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = [\n 'ReadableStream',\n 'Request',\n 'Response',\n 'Headers',\n].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => {\n return str.trim ? str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n};\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array<unknown>} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Object} [options]\n * @param {Boolean} [options.allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, { allOwnKeys = false } = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Buffer check\n if (isBuffer(obj)) {\n return;\n }\n\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\n/**\n * Finds a key in an object, case-insensitive, returning the actual key name.\n * Returns null if the object is a Buffer or if no match is found.\n *\n * @param {Object} obj - The object to search.\n * @param {string} key - The key to find (case-insensitive).\n * @returns {?string} The actual key name if found, otherwise null.\n */\nfunction findKey(obj, key) {\n if (isBuffer(obj)) {\n return null;\n }\n\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== 'undefined') return globalThis;\n return typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : global;\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * const result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const { caseless, skipUndefined } = (isContextDefined(this) && this) || {};\n const result = {};\n const assignValue = (val, key) => {\n // Skip dangerous property names to prevent prototype pollution\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return;\n }\n\n const targetKey = (caseless && findKey(result, key)) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else if (!skipUndefined || !isUndefined(val)) {\n result[targetKey] = val;\n }\n };\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Object} [options]\n * @param {Boolean} [options.allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, { allOwnKeys } = {}) => {\n forEach(\n b,\n (val, key) => {\n if (thisArg && isFunction(val)) {\n Object.defineProperty(a, key, {\n value: bind(val, thisArg),\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else {\n Object.defineProperty(a, key, {\n value: val,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n },\n { allOwnKeys }\n );\n return a;\n};\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xfeff) {\n content = content.slice(1);\n }\n return content;\n};\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n Object.defineProperty(constructor.prototype, 'constructor', {\n value: constructor,\n writable: true,\n enumerable: false,\n configurable: true,\n });\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype,\n });\n props && Object.assign(constructor.prototype, props);\n};\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n};\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n};\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n};\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = ((TypedArray) => {\n // eslint-disable-next-line func-names\n return (thing) => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[iterator];\n\n const _iterator = generator.call(obj);\n\n let result;\n\n while ((result = _iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n};\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n};\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = (str) => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g, function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n });\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (\n ({ hasOwnProperty }) =>\n (obj, prop) =>\n hasOwnProperty.call(obj, prop)\n)(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n};\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error(\"Can not rewrite read-only method '\" + name + \"'\");\n };\n }\n });\n};\n\n/**\n * Converts an array or a delimited string into an object set with values as keys and true as values.\n * Useful for fast membership checks.\n *\n * @param {Array|string} arrayOrString - The array or string to convert.\n * @param {string} delimiter - The delimiter to use if input is a string.\n * @returns {Object} An object with keys from the array or string, values set to true.\n */\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach((value) => {\n obj[value] = true;\n });\n };\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n};\n\nconst noop = () => {};\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite((value = +value)) ? value : defaultValue;\n};\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(\n thing &&\n isFunction(thing.append) &&\n thing[toStringTag] === 'FormData' &&\n thing[iterator]\n );\n}\n\n/**\n * Recursively converts an object to a JSON-compatible object, handling circular references and Buffers.\n *\n * @param {Object} obj - The object to convert.\n * @returns {Object} The JSON-compatible object.\n */\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n //Buffer check\n if (isBuffer(source)) {\n return source;\n }\n\n if (!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n };\n\n return visit(obj, 0);\n};\n\n/**\n * Determines if a value is an async function.\n *\n * @param {*} thing - The value to test.\n * @returns {boolean} True if value is an async function, otherwise false.\n */\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\n/**\n * Determines if a value is thenable (has then and catch methods).\n *\n * @param {*} thing - The value to test.\n * @returns {boolean} True if value is thenable, otherwise false.\n */\nconst isThenable = (thing) =>\n thing &&\n (isObject(thing) || isFunction(thing)) &&\n isFunction(thing.then) &&\n isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\n/**\n * Provides a cross-platform setImmediate implementation.\n * Uses native setImmediate if available, otherwise falls back to postMessage or setTimeout.\n *\n * @param {boolean} setImmediateSupported - Whether setImmediate is supported.\n * @param {boolean} postMessageSupported - Whether postMessage is supported.\n * @returns {Function} A function to schedule a callback asynchronously.\n */\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported\n ? ((token, callbacks) => {\n _global.addEventListener(\n 'message',\n ({ source, data }) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n },\n false\n );\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, '*');\n };\n })(`axios@${Math.random()}`, [])\n : (cb) => setTimeout(cb);\n})(typeof setImmediate === 'function', isFunction(_global.postMessage));\n\n/**\n * Schedules a microtask or asynchronous callback as soon as possible.\n * Uses queueMicrotask if available, otherwise falls back to process.nextTick or _setImmediate.\n *\n * @type {Function}\n */\nconst asap =\n typeof queueMicrotask !== 'undefined'\n ? queueMicrotask.bind(_global)\n : (typeof process !== 'undefined' && process.nextTick) || _setImmediate;\n\n// *********************\n\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isEmptyObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isReactNativeBlob,\n isReactNative,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap,\n isIterable,\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\nclass AxiosError extends Error {\n static from(error, code, config, request, response, customProps) {\n const axiosError = new AxiosError(error.message, code || error.code, config, request, response);\n axiosError.cause = error;\n axiosError.name = error.name;\n\n // Preserve status from the original error if not already set from response\n if (error.status != null && axiosError.status == null) {\n axiosError.status = error.status;\n }\n\n customProps && Object.assign(axiosError, customProps);\n return axiosError;\n }\n\n /**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\n constructor(message, code, config, request, response) {\n super(message);\n \n // Make message enumerable to maintain backward compatibility\n // The native Error constructor sets message as non-enumerable,\n // but axios < v1.13.3 had it as enumerable\n Object.defineProperty(this, 'message', {\n value: message,\n enumerable: true,\n writable: true,\n configurable: true\n });\n \n this.name = 'AxiosError';\n this.isAxiosError = true;\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status;\n }\n }\n\n toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.status,\n };\n }\n}\n\n// This can be changed to static properties as soon as the parser options in .eslint.cjs are updated.\nAxiosError.ERR_BAD_OPTION_VALUE = 'ERR_BAD_OPTION_VALUE';\nAxiosError.ERR_BAD_OPTION = 'ERR_BAD_OPTION';\nAxiosError.ECONNABORTED = 'ECONNABORTED';\nAxiosError.ETIMEDOUT = 'ETIMEDOUT';\nAxiosError.ERR_NETWORK = 'ERR_NETWORK';\nAxiosError.ERR_FR_TOO_MANY_REDIRECTS = 'ERR_FR_TOO_MANY_REDIRECTS';\nAxiosError.ERR_DEPRECATED = 'ERR_DEPRECATED';\nAxiosError.ERR_BAD_RESPONSE = 'ERR_BAD_RESPONSE';\nAxiosError.ERR_BAD_REQUEST = 'ERR_BAD_REQUEST';\nAxiosError.ERR_CANCELED = 'ERR_CANCELED';\nAxiosError.ERR_NOT_SUPPORT = 'ERR_NOT_SUPPORT';\nAxiosError.ERR_INVALID_URL = 'ERR_INVALID_URL';\n\nexport default AxiosError;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path\n .concat(key)\n .map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n })\n .join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(\n options,\n {\n metaTokens: true,\n dots: false,\n indexes: false,\n },\n false,\n function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n }\n );\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || (typeof Blob !== 'undefined' && Blob);\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isBoolean(value)) {\n return value.toString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (utils.isReactNative(formData) && utils.isReactNativeBlob(value)) {\n formData.append(renderKey(path, key, dots), convertValue(value));\n return false;\n }\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value)))\n ) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) &&\n formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true\n ? renderKey([key], index, dots)\n : indexes === null\n ? key\n : key + '[]',\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable,\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result =\n !(utils.isUndefined(el) || el === null) &&\n visitor.call(formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers);\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00',\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder\n ? function (value) {\n return encoder.call(this, value, encode);\n }\n : encode;\n\n return this._pairs\n .map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '')\n .join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val)\n .replace(/%3A/gi, ':')\n .replace(/%24/g, '$')\n .replace(/%2C/gi, ',')\n .replace(/%20/g, '+');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n if (!params) {\n return url;\n }\n\n const _encode = (options && options.encode) || encode;\n\n const _options = utils.isFunction(options)\n ? {\n serialize: options,\n }\n : options;\n\n const serializeFn = _options && _options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, _options);\n } else {\n serializedParams = utils.isURLSearchParams(params)\n ? params.toString()\n : new AxiosURLSearchParams(params, _options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf('#');\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n * @param {Object} options The options for the interceptor, synchronous and runWhen\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null,\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {void}\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false,\n legacyInterceptorReqResOrdering: true,\n};\n","'use strict';\n\nimport url from 'url';\nexport default url.URLSearchParams;\n","import crypto from 'crypto';\nimport URLSearchParams from './classes/URLSearchParams.js';\nimport FormData from './classes/FormData.js';\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz';\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT,\n};\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const { length } = alphabet;\n const randomValues = new Uint32Array(size);\n crypto.randomFillSync(randomValues);\n for (let i = 0; i < size; i++) {\n str += alphabet[randomValues[i] % length];\n }\n\n return str;\n};\n\nexport default {\n isNode: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob: (typeof Blob !== 'undefined' && Blob) || null,\n },\n ALPHABET,\n generateString,\n protocols: ['http', 'https', 'file', 'data'],\n};\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = (typeof navigator === 'object' && navigator) || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv =\n hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = (hasBrowserEnv && window.location.href) || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n _navigator as navigator,\n origin,\n};\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform,\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), {\n visitor: function (value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n },\n ...options,\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map((match) => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [\n function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if (\n (isFileList = utils.isFileList(data)) ||\n contentType.indexOf('multipart/form-data') > -1\n ) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? { 'files[]': data } : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n },\n ],\n\n transformResponse: [\n function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (\n data &&\n utils.isString(data) &&\n ((forcedJSONParsing && !this.responseType) || JSONRequested)\n ) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data, this.parseReviver);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n },\n ],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob,\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n Accept: 'application/json, text/plain, */*',\n 'Content-Type': undefined,\n },\n },\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from '../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age',\n 'authorization',\n 'content-length',\n 'content-type',\n 'etag',\n 'expires',\n 'from',\n 'host',\n 'if-modified-since',\n 'if-unmodified-since',\n 'last-modified',\n 'location',\n 'max-forwards',\n 'proxy-authorization',\n 'referer',\n 'retry-after',\n 'user-agent',\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default (rawHeaders) => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders &&\n rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header\n .trim()\n .toLowerCase()\n .replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach((methodName) => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function (arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true,\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if (\n !key ||\n self[key] === undefined ||\n _rewrite === true ||\n (_rewrite === undefined && self[key] !== false)\n ) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite);\n } else if (utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isObject(header) && utils.isIterable(header)) {\n let obj = {},\n dest,\n key;\n for (const entry of header) {\n if (!utils.isArray(entry)) {\n throw TypeError('Object iterator must return a key-value pair');\n }\n\n obj[(key = entry[0])] = (dest = obj[key])\n ? utils.isArray(dest)\n ? [...dest, entry[1]]\n : [dest, entry[1]]\n : entry[1];\n }\n\n setHeaders(obj, valueOrRewrite);\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(\n key &&\n this[key] !== undefined &&\n (!matcher || matchHeaderValue(this, this[key], key, matcher))\n );\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if (!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null &&\n value !== false &&\n (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON())\n .map(([header, value]) => header + ': ' + value)\n .join('\\n');\n }\n\n getSetCookie() {\n return this.get('set-cookie') || [];\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals =\n (this[$internals] =\n this[$internals] =\n {\n accessors: {},\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor([\n 'Content-Type',\n 'Content-Length',\n 'Accept',\n 'Accept-Encoding',\n 'User-Agent',\n 'Authorization',\n]);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({ value }, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n },\n };\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from '../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\n\nclass CanceledError extends AxiosError {\n /**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\n constructor(message, config, request) {\n super(message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n this.__CANCEL__ = true;\n }\n}\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(\n new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][\n Math.floor(response.status / 100) - 4\n ],\n response.config,\n response.request,\n response\n )\n );\n }\n}\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n if (typeof url !== 'string') {\n return false;\n }\n\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n let isRelativeUrl = !isAbsoluteURL(requestedURL);\n if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","export const VERSION = \"1.13.6\";","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return (match && match[1]) || '';\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport parseProtocol from './parseProtocol.js';\nimport platform from '../platform/index.js';\n\nconst DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\\s\\S]*)$/;\n\n/**\n * Parse data uri to a Buffer or Blob\n *\n * @param {String} uri\n * @param {?Boolean} asBlob\n * @param {?Object} options\n * @param {?Function} options.Blob\n *\n * @returns {Buffer|Blob}\n */\nexport default function fromDataURI(uri, asBlob, options) {\n const _Blob = (options && options.Blob) || platform.classes.Blob;\n const protocol = parseProtocol(uri);\n\n if (asBlob === undefined && _Blob) {\n asBlob = true;\n }\n\n if (protocol === 'data') {\n uri = protocol.length ? uri.slice(protocol.length + 1) : uri;\n\n const match = DATA_URL_PATTERN.exec(uri);\n\n if (!match) {\n throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);\n }\n\n const mime = match[1];\n const isBase64 = match[2];\n const body = match[3];\n const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');\n\n if (asBlob) {\n if (!_Blob) {\n throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);\n }\n\n return new _Blob([buffer], { type: mime });\n }\n\n return buffer;\n }\n\n throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);\n}\n","'use strict';\n\nimport stream from 'stream';\nimport utils from '../utils.js';\n\nconst kInternals = Symbol('internals');\n\nclass AxiosTransformStream extends stream.Transform {\n constructor(options) {\n options = utils.toFlatObject(\n options,\n {\n maxRate: 0,\n chunkSize: 64 * 1024,\n minChunkSize: 100,\n timeWindow: 500,\n ticksRate: 2,\n samplesCount: 15,\n },\n null,\n (prop, source) => {\n return !utils.isUndefined(source[prop]);\n }\n );\n\n super({\n readableHighWaterMark: options.chunkSize,\n });\n\n const internals = (this[kInternals] = {\n timeWindow: options.timeWindow,\n chunkSize: options.chunkSize,\n maxRate: options.maxRate,\n minChunkSize: options.minChunkSize,\n bytesSeen: 0,\n isCaptured: false,\n notifiedBytesLoaded: 0,\n ts: Date.now(),\n bytes: 0,\n onReadCallback: null,\n });\n\n this.on('newListener', (event) => {\n if (event === 'progress') {\n if (!internals.isCaptured) {\n internals.isCaptured = true;\n }\n }\n });\n }\n\n _read(size) {\n const internals = this[kInternals];\n\n if (internals.onReadCallback) {\n internals.onReadCallback();\n }\n\n return super._read(size);\n }\n\n _transform(chunk, encoding, callback) {\n const internals = this[kInternals];\n const maxRate = internals.maxRate;\n\n const readableHighWaterMark = this.readableHighWaterMark;\n\n const timeWindow = internals.timeWindow;\n\n const divider = 1000 / timeWindow;\n const bytesThreshold = maxRate / divider;\n const minChunkSize =\n internals.minChunkSize !== false\n ? Math.max(internals.minChunkSize, bytesThreshold * 0.01)\n : 0;\n\n const pushChunk = (_chunk, _callback) => {\n const bytes = Buffer.byteLength(_chunk);\n internals.bytesSeen += bytes;\n internals.bytes += bytes;\n\n internals.isCaptured && this.emit('progress', internals.bytesSeen);\n\n if (this.push(_chunk)) {\n process.nextTick(_callback);\n } else {\n internals.onReadCallback = () => {\n internals.onReadCallback = null;\n process.nextTick(_callback);\n };\n }\n };\n\n const transformChunk = (_chunk, _callback) => {\n const chunkSize = Buffer.byteLength(_chunk);\n let chunkRemainder = null;\n let maxChunkSize = readableHighWaterMark;\n let bytesLeft;\n let passed = 0;\n\n if (maxRate) {\n const now = Date.now();\n\n if (!internals.ts || (passed = now - internals.ts) >= timeWindow) {\n internals.ts = now;\n bytesLeft = bytesThreshold - internals.bytes;\n internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;\n passed = 0;\n }\n\n bytesLeft = bytesThreshold - internals.bytes;\n }\n\n if (maxRate) {\n if (bytesLeft <= 0) {\n // next time window\n return setTimeout(() => {\n _callback(null, _chunk);\n }, timeWindow - passed);\n }\n\n if (bytesLeft < maxChunkSize) {\n maxChunkSize = bytesLeft;\n }\n }\n\n if (maxChunkSize && chunkSize > maxChunkSize && chunkSize - maxChunkSize > minChunkSize) {\n chunkRemainder = _chunk.subarray(maxChunkSize);\n _chunk = _chunk.subarray(0, maxChunkSize);\n }\n\n pushChunk(\n _chunk,\n chunkRemainder\n ? () => {\n process.nextTick(_callback, null, chunkRemainder);\n }\n : _callback\n );\n };\n\n transformChunk(chunk, function transformNextChunk(err, _chunk) {\n if (err) {\n return callback(err);\n }\n\n if (_chunk) {\n transformChunk(_chunk, transformNextChunk);\n } else {\n callback(null);\n }\n });\n }\n}\n\nexport default AxiosTransformStream;\n","const { asyncIterator } = Symbol;\n\nconst readBlob = async function* (blob) {\n if (blob.stream) {\n yield* blob.stream();\n } else if (blob.arrayBuffer) {\n yield await blob.arrayBuffer();\n } else if (blob[asyncIterator]) {\n yield* blob[asyncIterator]();\n } else {\n yield blob;\n }\n};\n\nexport default readBlob;\n","import util from 'util';\nimport { Readable } from 'stream';\nimport utils from '../utils.js';\nimport readBlob from './readBlob.js';\nimport platform from '../platform/index.js';\n\nconst BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_';\n\nconst textEncoder = typeof TextEncoder === 'function' ? new TextEncoder() : new util.TextEncoder();\n\nconst CRLF = '\\r\\n';\nconst CRLF_BYTES = textEncoder.encode(CRLF);\nconst CRLF_BYTES_COUNT = 2;\n\nclass FormDataPart {\n constructor(name, value) {\n const { escapeName } = this.constructor;\n const isStringValue = utils.isString(value);\n\n let headers = `Content-Disposition: form-data; name=\"${escapeName(name)}\"${\n !isStringValue && value.name ? `; filename=\"${escapeName(value.name)}\"` : ''\n }${CRLF}`;\n\n if (isStringValue) {\n value = textEncoder.encode(String(value).replace(/\\r?\\n|\\r\\n?/g, CRLF));\n } else {\n headers += `Content-Type: ${value.type || 'application/octet-stream'}${CRLF}`;\n }\n\n this.headers = textEncoder.encode(headers + CRLF);\n\n this.contentLength = isStringValue ? value.byteLength : value.size;\n\n this.size = this.headers.byteLength + this.contentLength + CRLF_BYTES_COUNT;\n\n this.name = name;\n this.value = value;\n }\n\n async *encode() {\n yield this.headers;\n\n const { value } = this;\n\n if (utils.isTypedArray(value)) {\n yield value;\n } else {\n yield* readBlob(value);\n }\n\n yield CRLF_BYTES;\n }\n\n static escapeName(name) {\n return String(name).replace(\n /[\\r\\n\"]/g,\n (match) =>\n ({\n '\\r': '%0D',\n '\\n': '%0A',\n '\"': '%22',\n })[match]\n );\n }\n}\n\nconst formDataToStream = (form, headersHandler, options) => {\n const {\n tag = 'form-data-boundary',\n size = 25,\n boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET),\n } = options || {};\n\n if (!utils.isFormData(form)) {\n throw TypeError('FormData instance required');\n }\n\n if (boundary.length < 1 || boundary.length > 70) {\n throw Error('boundary must be 10-70 characters long');\n }\n\n const boundaryBytes = textEncoder.encode('--' + boundary + CRLF);\n const footerBytes = textEncoder.encode('--' + boundary + '--' + CRLF);\n let contentLength = footerBytes.byteLength;\n\n const parts = Array.from(form.entries()).map(([name, value]) => {\n const part = new FormDataPart(name, value);\n contentLength += part.size;\n return part;\n });\n\n contentLength += boundaryBytes.byteLength * parts.length;\n\n contentLength = utils.toFiniteNumber(contentLength);\n\n const computedHeaders = {\n 'Content-Type': `multipart/form-data; boundary=${boundary}`,\n };\n\n if (Number.isFinite(contentLength)) {\n computedHeaders['Content-Length'] = contentLength;\n }\n\n headersHandler && headersHandler(computedHeaders);\n\n return Readable.from(\n (async function* () {\n for (const part of parts) {\n yield boundaryBytes;\n yield* part.encode();\n }\n\n yield footerBytes;\n })()\n );\n};\n\nexport default formDataToStream;\n","'use strict';\n\nimport stream from 'stream';\n\nclass ZlibHeaderTransformStream extends stream.Transform {\n __transform(chunk, encoding, callback) {\n this.push(chunk);\n callback();\n }\n\n _transform(chunk, encoding, callback) {\n if (chunk.length !== 0) {\n this._transform = this.__transform;\n\n // Add Default Compression headers if no zlib headers are present\n if (chunk[0] !== 120) {\n // Hex: 78\n const header = Buffer.alloc(2);\n header[0] = 120; // Hex: 78\n header[1] = 156; // Hex: 9C\n this.push(header, encoding);\n }\n }\n\n this.__transform(chunk, encoding, callback);\n }\n}\n\nexport default ZlibHeaderTransformStream;\n","import utils from '../utils.js';\n\nconst callbackify = (fn, reducer) => {\n return utils.isAsyncFn(fn)\n ? function (...args) {\n const cb = args.pop();\n fn.apply(this, args).then((value) => {\n try {\n reducer ? cb(null, ...reducer(value)) : cb(null, value);\n } catch (err) {\n cb(err);\n }\n }, cb);\n }\n : fn;\n};\n\nexport default callbackify;\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round((bytesCount * 1000) / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn(...args);\n };\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if (passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs);\n }, threshold - passed);\n }\n }\n };\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n","import speedometer from './speedometer.js';\nimport throttle from './throttle.js';\nimport utils from '../utils.js';\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle((e) => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? loaded / total : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true,\n };\n\n listener(data);\n }, freq);\n};\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [\n (loaded) =>\n throttled[0]({\n lengthComputable,\n total,\n loaded,\n }),\n throttled[1],\n ];\n};\n\nexport const asyncDecorator =\n (fn) =>\n (...args) =>\n utils.asap(() => fn(...args));\n","/**\n * Estimate decoded byte length of a data:// URL *without* allocating large buffers.\n * - For base64: compute exact decoded size using length and padding;\n * handle %XX at the character-count level (no string allocation).\n * - For non-base64: use UTF-8 byteLength of the encoded body as a safe upper bound.\n *\n * @param {string} url\n * @returns {number}\n */\nexport default function estimateDataURLDecodedBytes(url) {\n if (!url || typeof url !== 'string') return 0;\n if (!url.startsWith('data:')) return 0;\n\n const comma = url.indexOf(',');\n if (comma < 0) return 0;\n\n const meta = url.slice(5, comma);\n const body = url.slice(comma + 1);\n const isBase64 = /;base64/i.test(meta);\n\n if (isBase64) {\n let effectiveLen = body.length;\n const len = body.length; // cache length\n\n for (let i = 0; i < len; i++) {\n if (body.charCodeAt(i) === 37 /* '%' */ && i + 2 < len) {\n const a = body.charCodeAt(i + 1);\n const b = body.charCodeAt(i + 2);\n const isHex =\n ((a >= 48 && a <= 57) || (a >= 65 && a <= 70) || (a >= 97 && a <= 102)) &&\n ((b >= 48 && b <= 57) || (b >= 65 && b <= 70) || (b >= 97 && b <= 102));\n\n if (isHex) {\n effectiveLen -= 2;\n i += 2;\n }\n }\n }\n\n let pad = 0;\n let idx = len - 1;\n\n const tailIsPct3D = (j) =>\n j >= 2 &&\n body.charCodeAt(j - 2) === 37 && // '%'\n body.charCodeAt(j - 1) === 51 && // '3'\n (body.charCodeAt(j) === 68 || body.charCodeAt(j) === 100); // 'D' or 'd'\n\n if (idx >= 0) {\n if (body.charCodeAt(idx) === 61 /* '=' */) {\n pad++;\n idx--;\n } else if (tailIsPct3D(idx)) {\n pad++;\n idx -= 3;\n }\n }\n\n if (pad === 1 && idx >= 0) {\n if (body.charCodeAt(idx) === 61 /* '=' */) {\n pad++;\n } else if (tailIsPct3D(idx)) {\n pad++;\n }\n }\n\n const groups = Math.floor(effectiveLen / 4);\n const bytes = groups * 3 - (pad || 0);\n return bytes > 0 ? bytes : 0;\n }\n\n return Buffer.byteLength(body, 'utf8');\n}\n","import utils from '../utils.js';\nimport settle from '../core/settle.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport buildURL from '../helpers/buildURL.js';\nimport proxyFromEnv from 'proxy-from-env';\nimport http from 'http';\nimport https from 'https';\nimport http2 from 'http2';\nimport util from 'util';\nimport followRedirects from 'follow-redirects';\nimport zlib from 'zlib';\nimport { VERSION } from '../env/data.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport platform from '../platform/index.js';\nimport fromDataURI from '../helpers/fromDataURI.js';\nimport stream from 'stream';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport AxiosTransformStream from '../helpers/AxiosTransformStream.js';\nimport { EventEmitter } from 'events';\nimport formDataToStream from '../helpers/formDataToStream.js';\nimport readBlob from '../helpers/readBlob.js';\nimport ZlibHeaderTransformStream from '../helpers/ZlibHeaderTransformStream.js';\nimport callbackify from '../helpers/callbackify.js';\nimport {\n progressEventReducer,\n progressEventDecorator,\n asyncDecorator,\n} from '../helpers/progressEventReducer.js';\nimport estimateDataURLDecodedBytes from '../helpers/estimateDataURLDecodedBytes.js';\n\nconst zlibOptions = {\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n};\n\nconst brotliOptions = {\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH,\n};\n\nconst isBrotliSupported = utils.isFunction(zlib.createBrotliDecompress);\n\nconst { http: httpFollow, https: httpsFollow } = followRedirects;\n\nconst isHttps = /https:?/;\n\nconst supportedProtocols = platform.protocols.map((protocol) => {\n return protocol + ':';\n});\n\nconst flushOnFinish = (stream, [throttled, flush]) => {\n stream.on('end', flush).on('error', flush);\n\n return throttled;\n};\n\nclass Http2Sessions {\n constructor() {\n this.sessions = Object.create(null);\n }\n\n getSession(authority, options) {\n options = Object.assign(\n {\n sessionTimeout: 1000,\n },\n options\n );\n\n let authoritySessions = this.sessions[authority];\n\n if (authoritySessions) {\n let len = authoritySessions.length;\n\n for (let i = 0; i < len; i++) {\n const [sessionHandle, sessionOptions] = authoritySessions[i];\n if (\n !sessionHandle.destroyed &&\n !sessionHandle.closed &&\n util.isDeepStrictEqual(sessionOptions, options)\n ) {\n return sessionHandle;\n }\n }\n }\n\n const session = http2.connect(authority, options);\n\n let removed;\n\n const removeSession = () => {\n if (removed) {\n return;\n }\n\n removed = true;\n\n let entries = authoritySessions,\n len = entries.length,\n i = len;\n\n while (i--) {\n if (entries[i][0] === session) {\n if (len === 1) {\n delete this.sessions[authority];\n } else {\n entries.splice(i, 1);\n }\n return;\n }\n }\n };\n\n const originalRequestFn = session.request;\n\n const { sessionTimeout } = options;\n\n if (sessionTimeout != null) {\n let timer;\n let streamsCount = 0;\n\n session.request = function () {\n const stream = originalRequestFn.apply(this, arguments);\n\n streamsCount++;\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n\n stream.once('close', () => {\n if (!--streamsCount) {\n timer = setTimeout(() => {\n timer = null;\n removeSession();\n }, sessionTimeout);\n }\n });\n\n return stream;\n };\n }\n\n session.once('close', removeSession);\n\n let entry = [session, options];\n\n authoritySessions\n ? authoritySessions.push(entry)\n : (authoritySessions = this.sessions[authority] = [entry]);\n\n return session;\n }\n}\n\nconst http2Sessions = new Http2Sessions();\n\n/**\n * If the proxy or config beforeRedirects functions are defined, call them with the options\n * object.\n *\n * @param {Object<string, any>} options - The options object that was passed to the request.\n *\n * @returns {Object<string, any>}\n */\nfunction dispatchBeforeRedirect(options, responseDetails) {\n if (options.beforeRedirects.proxy) {\n options.beforeRedirects.proxy(options);\n }\n if (options.beforeRedirects.config) {\n options.beforeRedirects.config(options, responseDetails);\n }\n}\n\n/**\n * If the proxy or config afterRedirects functions are defined, call them with the options\n *\n * @param {http.ClientRequestArgs} options\n * @param {AxiosProxyConfig} configProxy configuration from Axios options object\n * @param {string} location\n *\n * @returns {http.ClientRequestArgs}\n */\nfunction setProxy(options, configProxy, location) {\n let proxy = configProxy;\n if (!proxy && proxy !== false) {\n const proxyUrl = proxyFromEnv.getProxyForUrl(location);\n if (proxyUrl) {\n proxy = new URL(proxyUrl);\n }\n }\n if (proxy) {\n // Basic proxy authorization\n if (proxy.username) {\n proxy.auth = (proxy.username || '') + ':' + (proxy.password || '');\n }\n\n if (proxy.auth) {\n // Support proxy auth object form\n const validProxyAuth = Boolean(proxy.auth.username || proxy.auth.password);\n\n if (validProxyAuth) {\n proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || '');\n } else if (typeof proxy.auth === 'object') {\n throw new AxiosError('Invalid proxy authorization', AxiosError.ERR_BAD_OPTION, { proxy });\n }\n\n const base64 = Buffer.from(proxy.auth, 'utf8').toString('base64');\n\n options.headers['Proxy-Authorization'] = 'Basic ' + base64;\n }\n\n options.headers.host = options.hostname + (options.port ? ':' + options.port : '');\n const proxyHost = proxy.hostname || proxy.host;\n options.hostname = proxyHost;\n // Replace 'host' since options is not a URL object\n options.host = proxyHost;\n options.port = proxy.port;\n options.path = location;\n if (proxy.protocol) {\n options.protocol = proxy.protocol.includes(':') ? proxy.protocol : `${proxy.protocol}:`;\n }\n }\n\n options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {\n // Configure proxy for redirected request, passing the original config proxy to apply\n // the exact same logic as if the redirected request was performed by axios directly.\n setProxy(redirectOptions, configProxy, redirectOptions.href);\n };\n}\n\nconst isHttpAdapterSupported =\n typeof process !== 'undefined' && utils.kindOf(process) === 'process';\n\n// temporary hotfix\n\nconst wrapAsync = (asyncExecutor) => {\n return new Promise((resolve, reject) => {\n let onDone;\n let isDone;\n\n const done = (value, isRejected) => {\n if (isDone) return;\n isDone = true;\n onDone && onDone(value, isRejected);\n };\n\n const _resolve = (value) => {\n done(value);\n resolve(value);\n };\n\n const _reject = (reason) => {\n done(reason, true);\n reject(reason);\n };\n\n asyncExecutor(_resolve, _reject, (onDoneHandler) => (onDone = onDoneHandler)).catch(_reject);\n });\n};\n\nconst resolveFamily = ({ address, family }) => {\n if (!utils.isString(address)) {\n throw TypeError('address must be a string');\n }\n return {\n address,\n family: family || (address.indexOf('.') < 0 ? 6 : 4),\n };\n};\n\nconst buildAddressEntry = (address, family) =>\n resolveFamily(utils.isObject(address) ? address : { address, family });\n\nconst http2Transport = {\n request(options, cb) {\n const authority =\n options.protocol +\n '//' +\n options.hostname +\n ':' +\n (options.port || (options.protocol === 'https:' ? 443 : 80));\n\n const { http2Options, headers } = options;\n\n const session = http2Sessions.getSession(authority, http2Options);\n\n const { HTTP2_HEADER_SCHEME, HTTP2_HEADER_METHOD, HTTP2_HEADER_PATH, HTTP2_HEADER_STATUS } =\n http2.constants;\n\n const http2Headers = {\n [HTTP2_HEADER_SCHEME]: options.protocol.replace(':', ''),\n [HTTP2_HEADER_METHOD]: options.method,\n [HTTP2_HEADER_PATH]: options.path,\n };\n\n utils.forEach(headers, (header, name) => {\n name.charAt(0) !== ':' && (http2Headers[name] = header);\n });\n\n const req = session.request(http2Headers);\n\n req.once('response', (responseHeaders) => {\n const response = req; //duplex\n\n responseHeaders = Object.assign({}, responseHeaders);\n\n const status = responseHeaders[HTTP2_HEADER_STATUS];\n\n delete responseHeaders[HTTP2_HEADER_STATUS];\n\n response.headers = responseHeaders;\n\n response.statusCode = +status;\n\n cb(response);\n });\n\n return req;\n },\n};\n\n/*eslint consistent-return:0*/\nexport default isHttpAdapterSupported &&\n function httpAdapter(config) {\n return wrapAsync(async function dispatchHttpRequest(resolve, reject, onDone) {\n let { data, lookup, family, httpVersion = 1, http2Options } = config;\n const { responseType, responseEncoding } = config;\n const method = config.method.toUpperCase();\n let isDone;\n let rejected = false;\n let req;\n\n httpVersion = +httpVersion;\n\n if (Number.isNaN(httpVersion)) {\n throw TypeError(`Invalid protocol version: '${config.httpVersion}' is not a number`);\n }\n\n if (httpVersion !== 1 && httpVersion !== 2) {\n throw TypeError(`Unsupported protocol version '${httpVersion}'`);\n }\n\n const isHttp2 = httpVersion === 2;\n\n if (lookup) {\n const _lookup = callbackify(lookup, (value) => (utils.isArray(value) ? value : [value]));\n // hotfix to support opt.all option which is required for node 20.x\n lookup = (hostname, opt, cb) => {\n _lookup(hostname, opt, (err, arg0, arg1) => {\n if (err) {\n return cb(err);\n }\n\n const addresses = utils.isArray(arg0)\n ? arg0.map((addr) => buildAddressEntry(addr))\n : [buildAddressEntry(arg0, arg1)];\n\n opt.all ? cb(err, addresses) : cb(err, addresses[0].address, addresses[0].family);\n });\n };\n }\n\n const abortEmitter = new EventEmitter();\n\n function abort(reason) {\n try {\n abortEmitter.emit(\n 'abort',\n !reason || reason.type ? new CanceledError(null, config, req) : reason\n );\n } catch (err) {\n console.warn('emit error', err);\n }\n }\n\n abortEmitter.once('abort', reject);\n\n const onFinished = () => {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(abort);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', abort);\n }\n\n abortEmitter.removeAllListeners();\n };\n\n if (config.cancelToken || config.signal) {\n config.cancelToken && config.cancelToken.subscribe(abort);\n if (config.signal) {\n config.signal.aborted ? abort() : config.signal.addEventListener('abort', abort);\n }\n }\n\n onDone((response, isRejected) => {\n isDone = true;\n\n if (isRejected) {\n rejected = true;\n onFinished();\n return;\n }\n\n const { data } = response;\n\n if (data instanceof stream.Readable || data instanceof stream.Duplex) {\n const offListeners = stream.finished(data, () => {\n offListeners();\n onFinished();\n });\n } else {\n onFinished();\n }\n });\n\n // Parse url\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined);\n const protocol = parsed.protocol || supportedProtocols[0];\n\n if (protocol === 'data:') {\n // Apply the same semantics as HTTP: only enforce if a finite, non-negative cap is set.\n if (config.maxContentLength > -1) {\n // Use the exact string passed to fromDataURI (config.url); fall back to fullPath if needed.\n const dataUrl = String(config.url || fullPath || '');\n const estimated = estimateDataURLDecodedBytes(dataUrl);\n\n if (estimated > config.maxContentLength) {\n return reject(\n new AxiosError(\n 'maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE,\n config\n )\n );\n }\n }\n\n let convertedData;\n\n if (method !== 'GET') {\n return settle(resolve, reject, {\n status: 405,\n statusText: 'method not allowed',\n headers: {},\n config,\n });\n }\n\n try {\n convertedData = fromDataURI(config.url, responseType === 'blob', {\n Blob: config.env && config.env.Blob,\n });\n } catch (err) {\n throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config);\n }\n\n if (responseType === 'text') {\n convertedData = convertedData.toString(responseEncoding);\n\n if (!responseEncoding || responseEncoding === 'utf8') {\n convertedData = utils.stripBOM(convertedData);\n }\n } else if (responseType === 'stream') {\n convertedData = stream.Readable.from(convertedData);\n }\n\n return settle(resolve, reject, {\n data: convertedData,\n status: 200,\n statusText: 'OK',\n headers: new AxiosHeaders(),\n config,\n });\n }\n\n if (supportedProtocols.indexOf(protocol) === -1) {\n return reject(\n new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_BAD_REQUEST, config)\n );\n }\n\n const headers = AxiosHeaders.from(config.headers).normalize();\n\n // Set User-Agent (required by some servers)\n // See https://github.com/axios/axios/issues/69\n // User-Agent is specified; handle case where no UA header is desired\n // Only set header if it hasn't been set in config\n headers.set('User-Agent', 'axios/' + VERSION, false);\n\n const { onUploadProgress, onDownloadProgress } = config;\n const maxRate = config.maxRate;\n let maxUploadRate = undefined;\n let maxDownloadRate = undefined;\n\n // support for spec compliant FormData objects\n if (utils.isSpecCompliantForm(data)) {\n const userBoundary = headers.getContentType(/boundary=([-_\\w\\d]{10,70})/i);\n\n data = formDataToStream(\n data,\n (formHeaders) => {\n headers.set(formHeaders);\n },\n {\n tag: `axios-${VERSION}-boundary`,\n boundary: (userBoundary && userBoundary[1]) || undefined,\n }\n );\n // support for https://www.npmjs.com/package/form-data api\n } else if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) {\n headers.set(data.getHeaders());\n\n if (!headers.hasContentLength()) {\n try {\n const knownLength = await util.promisify(data.getLength).call(data);\n Number.isFinite(knownLength) &&\n knownLength >= 0 &&\n headers.setContentLength(knownLength);\n /*eslint no-empty:0*/\n } catch (e) {}\n }\n } else if (utils.isBlob(data) || utils.isFile(data)) {\n data.size && headers.setContentType(data.type || 'application/octet-stream');\n headers.setContentLength(data.size || 0);\n data = stream.Readable.from(readBlob(data));\n } else if (data && !utils.isStream(data)) {\n if (Buffer.isBuffer(data)) {\n // Nothing to do...\n } else if (utils.isArrayBuffer(data)) {\n data = Buffer.from(new Uint8Array(data));\n } else if (utils.isString(data)) {\n data = Buffer.from(data, 'utf-8');\n } else {\n return reject(\n new AxiosError(\n 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream',\n AxiosError.ERR_BAD_REQUEST,\n config\n )\n );\n }\n\n // Add Content-Length header if data exists\n headers.setContentLength(data.length, false);\n\n if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {\n return reject(\n new AxiosError(\n 'Request body larger than maxBodyLength limit',\n AxiosError.ERR_BAD_REQUEST,\n config\n )\n );\n }\n }\n\n const contentLength = utils.toFiniteNumber(headers.getContentLength());\n\n if (utils.isArray(maxRate)) {\n maxUploadRate = maxRate[0];\n maxDownloadRate = maxRate[1];\n } else {\n maxUploadRate = maxDownloadRate = maxRate;\n }\n\n if (data && (onUploadProgress || maxUploadRate)) {\n if (!utils.isStream(data)) {\n data = stream.Readable.from(data, { objectMode: false });\n }\n\n data = stream.pipeline(\n [\n data,\n new AxiosTransformStream({\n maxRate: utils.toFiniteNumber(maxUploadRate),\n }),\n ],\n utils.noop\n );\n\n onUploadProgress &&\n data.on(\n 'progress',\n flushOnFinish(\n data,\n progressEventDecorator(\n contentLength,\n progressEventReducer(asyncDecorator(onUploadProgress), false, 3)\n )\n )\n );\n }\n\n // HTTP basic authentication\n let auth = undefined;\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password || '';\n auth = username + ':' + password;\n }\n\n if (!auth && parsed.username) {\n const urlUsername = parsed.username;\n const urlPassword = parsed.password;\n auth = urlUsername + ':' + urlPassword;\n }\n\n auth && headers.delete('authorization');\n\n let path;\n\n try {\n path = buildURL(\n parsed.pathname + parsed.search,\n config.params,\n config.paramsSerializer\n ).replace(/^\\?/, '');\n } catch (err) {\n const customErr = new Error(err.message);\n customErr.config = config;\n customErr.url = config.url;\n customErr.exists = true;\n return reject(customErr);\n }\n\n headers.set(\n 'Accept-Encoding',\n 'gzip, compress, deflate' + (isBrotliSupported ? ', br' : ''),\n false\n );\n\n const options = {\n path,\n method: method,\n headers: headers.toJSON(),\n agents: { http: config.httpAgent, https: config.httpsAgent },\n auth,\n protocol,\n family,\n beforeRedirect: dispatchBeforeRedirect,\n beforeRedirects: {},\n http2Options,\n };\n\n // cacheable-lookup integration hotfix\n !utils.isUndefined(lookup) && (options.lookup = lookup);\n\n if (config.socketPath) {\n options.socketPath = config.socketPath;\n } else {\n options.hostname = parsed.hostname.startsWith('[')\n ? parsed.hostname.slice(1, -1)\n : parsed.hostname;\n options.port = parsed.port;\n setProxy(\n options,\n config.proxy,\n protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path\n );\n }\n\n let transport;\n const isHttpsRequest = isHttps.test(options.protocol);\n options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;\n\n if (isHttp2) {\n transport = http2Transport;\n } else {\n if (config.transport) {\n transport = config.transport;\n } else if (config.maxRedirects === 0) {\n transport = isHttpsRequest ? https : http;\n } else {\n if (config.maxRedirects) {\n options.maxRedirects = config.maxRedirects;\n }\n if (config.beforeRedirect) {\n options.beforeRedirects.config = config.beforeRedirect;\n }\n transport = isHttpsRequest ? httpsFollow : httpFollow;\n }\n }\n\n if (config.maxBodyLength > -1) {\n options.maxBodyLength = config.maxBodyLength;\n } else {\n // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited\n options.maxBodyLength = Infinity;\n }\n\n if (config.insecureHTTPParser) {\n options.insecureHTTPParser = config.insecureHTTPParser;\n }\n\n // Create the request\n req = transport.request(options, function handleResponse(res) {\n if (req.destroyed) return;\n\n const streams = [res];\n\n const responseLength = utils.toFiniteNumber(res.headers['content-length']);\n\n if (onDownloadProgress || maxDownloadRate) {\n const transformStream = new AxiosTransformStream({\n maxRate: utils.toFiniteNumber(maxDownloadRate),\n });\n\n onDownloadProgress &&\n transformStream.on(\n 'progress',\n flushOnFinish(\n transformStream,\n progressEventDecorator(\n responseLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true, 3)\n )\n )\n );\n\n streams.push(transformStream);\n }\n\n // decompress the response body transparently if required\n let responseStream = res;\n\n // return the last request in case of redirects\n const lastRequest = res.req || req;\n\n // if decompress disabled we should not decompress\n if (config.decompress !== false && res.headers['content-encoding']) {\n // if no content, but headers still say that it is encoded,\n // remove the header not confuse downstream operations\n if (method === 'HEAD' || res.statusCode === 204) {\n delete res.headers['content-encoding'];\n }\n\n switch ((res.headers['content-encoding'] || '').toLowerCase()) {\n /*eslint default-case:0*/\n case 'gzip':\n case 'x-gzip':\n case 'compress':\n case 'x-compress':\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip(zlibOptions));\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'deflate':\n streams.push(new ZlibHeaderTransformStream());\n\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip(zlibOptions));\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'br':\n if (isBrotliSupported) {\n streams.push(zlib.createBrotliDecompress(brotliOptions));\n delete res.headers['content-encoding'];\n }\n }\n }\n\n responseStream = streams.length > 1 ? stream.pipeline(streams, utils.noop) : streams[0];\n\n const response = {\n status: res.statusCode,\n statusText: res.statusMessage,\n headers: new AxiosHeaders(res.headers),\n config,\n request: lastRequest,\n };\n\n if (responseType === 'stream') {\n response.data = responseStream;\n settle(resolve, reject, response);\n } else {\n const responseBuffer = [];\n let totalResponseBytes = 0;\n\n responseStream.on('data', function handleStreamData(chunk) {\n responseBuffer.push(chunk);\n totalResponseBytes += chunk.length;\n\n // make sure the content length is not over the maxContentLength if specified\n if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {\n // stream.destroy() emit aborted event before calling reject() on Node.js v16\n rejected = true;\n responseStream.destroy();\n abort(\n new AxiosError(\n 'maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE,\n config,\n lastRequest\n )\n );\n }\n });\n\n responseStream.on('aborted', function handlerStreamAborted() {\n if (rejected) {\n return;\n }\n\n const err = new AxiosError(\n 'stream has been aborted',\n AxiosError.ERR_BAD_RESPONSE,\n config,\n lastRequest\n );\n responseStream.destroy(err);\n reject(err);\n });\n\n responseStream.on('error', function handleStreamError(err) {\n if (req.destroyed) return;\n reject(AxiosError.from(err, null, config, lastRequest));\n });\n\n responseStream.on('end', function handleStreamEnd() {\n try {\n let responseData =\n responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);\n if (responseType !== 'arraybuffer') {\n responseData = responseData.toString(responseEncoding);\n if (!responseEncoding || responseEncoding === 'utf8') {\n responseData = utils.stripBOM(responseData);\n }\n }\n response.data = responseData;\n } catch (err) {\n return reject(AxiosError.from(err, null, config, response.request, response));\n }\n settle(resolve, reject, response);\n });\n }\n\n abortEmitter.once('abort', (err) => {\n if (!responseStream.destroyed) {\n responseStream.emit('error', err);\n responseStream.destroy();\n }\n });\n });\n\n abortEmitter.once('abort', (err) => {\n if (req.close) {\n req.close();\n } else {\n req.destroy(err);\n }\n });\n\n // Handle errors\n req.on('error', function handleRequestError(err) {\n reject(AxiosError.from(err, null, config, req));\n });\n\n // set tcp keep alive to prevent drop connection by peer\n req.on('socket', function handleRequestSocket(socket) {\n // default interval of sending ack packet is 1 minute\n socket.setKeepAlive(true, 1000 * 60);\n });\n\n // Handle request timeout\n if (config.timeout) {\n // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types.\n const timeout = parseInt(config.timeout, 10);\n\n if (Number.isNaN(timeout)) {\n abort(\n new AxiosError(\n 'error trying to parse `config.timeout` to int',\n AxiosError.ERR_BAD_OPTION_VALUE,\n config,\n req\n )\n );\n\n return;\n }\n\n // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system.\n // And timer callback will be fired, and abort() will be invoked before connection, then get \"socket hang up\" and code ECONNRESET.\n // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up.\n // And then these socket which be hang up will devouring CPU little by little.\n // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect.\n req.setTimeout(timeout, function handleRequestTimeout() {\n if (isDone) return;\n let timeoutErrorMessage = config.timeout\n ? 'timeout of ' + config.timeout + 'ms exceeded'\n : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n abort(\n new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n req\n )\n );\n });\n } else {\n // explicitly reset the socket timeout value for a possible `keep-alive` request\n req.setTimeout(0);\n }\n\n // Send the request\n if (utils.isStream(data)) {\n let ended = false;\n let errored = false;\n\n data.on('end', () => {\n ended = true;\n });\n\n data.once('error', (err) => {\n errored = true;\n req.destroy(err);\n });\n\n data.on('close', () => {\n if (!ended && !errored) {\n abort(new CanceledError('Request stream has been aborted', config, req));\n }\n });\n\n data.pipe(req);\n } else {\n data && req.write(data);\n req.end();\n }\n });\n };\n\nexport const __setProxy = setProxy;\n","import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv\n ? ((origin, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n\n return (\n origin.protocol === url.protocol &&\n origin.host === url.host &&\n (isMSIE || origin.port === url.port)\n );\n })(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n )\n : () => true;\n","import utils from '../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv\n ? // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure, sameSite) {\n if (typeof document === 'undefined') return;\n\n const cookie = [`${name}=${encodeURIComponent(value)}`];\n\n if (utils.isNumber(expires)) {\n cookie.push(`expires=${new Date(expires).toUTCString()}`);\n }\n if (utils.isString(path)) {\n cookie.push(`path=${path}`);\n }\n if (utils.isString(domain)) {\n cookie.push(`domain=${domain}`);\n }\n if (secure === true) {\n cookie.push('secure');\n }\n if (utils.isString(sameSite)) {\n cookie.push(`SameSite=${sameSite}`);\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n if (typeof document === 'undefined') return null;\n const match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));\n return match ? decodeURIComponent(match[1]) : null;\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000, '/');\n },\n }\n : // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {},\n };\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst headersToObject = (thing) => (thing instanceof AxiosHeaders ? { ...thing } : thing);\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, prop, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({ caseless }, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n function mergeDeepProperties(a, b, prop, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, prop, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, prop, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b, prop) =>\n mergeDeepProperties(headersToObject(a), headersToObject(b), prop, true),\n };\n\n utils.forEach(Object.keys({ ...config1, ...config2 }), function computeConfigValue(prop) {\n if (prop === '__proto__' || prop === 'constructor' || prop === 'prototype') return;\n const merge = utils.hasOwnProp(mergeMap, prop) ? mergeMap[prop] : mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","import platform from '../platform/index.js';\nimport utils from '../utils.js';\nimport isURLSameOrigin from './isURLSameOrigin.js';\nimport cookies from './cookies.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport mergeConfig from '../core/mergeConfig.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport buildURL from './buildURL.js';\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(\n buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls),\n config.params,\n config.paramsSerializer\n );\n\n // HTTP basic authentication\n if (auth) {\n headers.set(\n 'Authorization',\n 'Basic ' +\n btoa(\n (auth.username || '') +\n ':' +\n (auth.password ? unescape(encodeURIComponent(auth.password)) : '')\n )\n );\n }\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // browser handles it\n } else if (utils.isFunction(data.getHeaders)) {\n // Node.js FormData (like form-data package)\n const formHeaders = data.getHeaders();\n // Only set safe headers to avoid overwriting security headers\n const allowedHeaders = ['content-type', 'content-length'];\n Object.entries(formHeaders).forEach(([key, val]) => {\n if (allowedHeaders.includes(key.toLowerCase())) {\n headers.set(key, val);\n }\n });\n }\n }\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n};\n","import utils from '../utils.js';\nimport settle from '../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport { progressEventReducer } from '../helpers/progressEventReducer.js';\nimport resolveConfig from '../helpers/resolveConfig.js';\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported &&\n function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let { responseType, onUploadProgress, onDownloadProgress } = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData =\n !responseType || responseType === 'text' || responseType === 'json'\n ? request.responseText\n : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request,\n };\n\n settle(\n function _resolve(value) {\n resolve(value);\n done();\n },\n function _reject(err) {\n reject(err);\n done();\n },\n response\n );\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (\n request.status === 0 &&\n !(request.responseURL && request.responseURL.indexOf('file:') === 0)\n ) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError(event) {\n // Browsers deliver a ProgressEvent in XHR onerror\n // (message may be empty; when present, surface it)\n // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\n const msg = event && event.message ? event.message : 'Network Error';\n const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\n // attach the underlying event for consumers who want details\n err.event = event || null;\n reject(err);\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout\n ? 'timeout of ' + _config.timeout + 'ms exceeded'\n : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(\n new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request\n )\n );\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n [downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true);\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n [uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress);\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = (cancel) => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted\n ? onCanceled()\n : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(\n new AxiosError(\n 'Unsupported protocol ' + protocol + ':',\n AxiosError.ERR_BAD_REQUEST,\n config\n )\n );\n return;\n }\n\n // Send the request\n request.send(requestData || null);\n });\n };\n","import CanceledError from '../cancel/CanceledError.js';\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n const { length } = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(\n err instanceof AxiosError\n ? err\n : new CanceledError(err instanceof Error ? err.message : err)\n );\n }\n };\n\n let timer =\n timeout &&\n setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout of ${timeout}ms exceeded`, AxiosError.ETIMEDOUT));\n }, timeout);\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach((signal) => {\n signal.unsubscribe\n ? signal.unsubscribe(onabort)\n : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n };\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const { signal } = controller;\n\n signal.unsubscribe = () => utils.asap(unsubscribe);\n\n return signal;\n }\n};\n\nexport default composeSignals;\n","export const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n};\n\nexport const readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n};\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n};\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n };\n\n return new ReadableStream(\n {\n async pull(controller) {\n try {\n const { done, value } = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = (bytes += len);\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n },\n },\n {\n highWaterMark: 2,\n }\n );\n};\n","import platform from '../platform/index.js';\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport composeSignals from '../helpers/composeSignals.js';\nimport { trackStream } from '../helpers/trackStream.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {\n progressEventReducer,\n progressEventDecorator,\n asyncDecorator,\n} from '../helpers/progressEventReducer.js';\nimport resolveConfig from '../helpers/resolveConfig.js';\nimport settle from '../core/settle.js';\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst { isFunction } = utils;\n\nconst globalFetchAPI = (({ Request, Response }) => ({\n Request,\n Response,\n}))(utils.global);\n\nconst { ReadableStream, TextEncoder } = utils.global;\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false;\n }\n};\n\nconst factory = (env) => {\n env = utils.merge.call(\n {\n skipUndefined: true,\n },\n globalFetchAPI,\n env\n );\n\n const { fetch: envFetch, Request, Response } = env;\n const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';\n const isRequestSupported = isFunction(Request);\n const isResponseSupported = isFunction(Response);\n\n if (!isFetchSupported) {\n return false;\n }\n\n const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\n\n const encodeText =\n isFetchSupported &&\n (typeof TextEncoder === 'function'\n ? (\n (encoder) => (str) =>\n encoder.encode(str)\n )(new TextEncoder())\n : async (str) => new Uint8Array(await new Request(str).arrayBuffer()));\n\n const supportsRequestStream =\n isRequestSupported &&\n isReadableStreamSupported &&\n test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n });\n\n const supportsResponseStream =\n isResponseSupported &&\n isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n const resolvers = {\n stream: supportsResponseStream && ((res) => res.body),\n };\n\n isFetchSupported &&\n (() => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach((type) => {\n !resolvers[type] &&\n (resolvers[type] = (res, config) => {\n let method = res && res[type];\n\n if (method) {\n return method.call(res);\n }\n\n throw new AxiosError(\n `Response type '${type}' is not supported`,\n AxiosError.ERR_NOT_SUPPORT,\n config\n );\n });\n });\n })();\n\n const getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if (utils.isBlob(body)) {\n return body.size;\n }\n\n if (utils.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if (utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if (utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n };\n\n const resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n };\n\n return async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions,\n } = resolveConfig(config);\n\n let _fetch = envFetch || fetch;\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals(\n [signal, cancelToken && cancelToken.toAbortSignal()],\n timeout\n );\n\n let request = null;\n\n const unsubscribe =\n composedSignal &&\n composedSignal.unsubscribe &&\n (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress &&\n supportsRequestStream &&\n method !== 'get' &&\n method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: 'half',\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader);\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = isRequestSupported && 'credentials' in Request.prototype;\n\n const resolvedOptions = {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: 'half',\n credentials: isCredentialsSupported ? withCredentials : undefined,\n };\n\n request = isRequestSupported && new Request(url, resolvedOptions);\n\n let response = await (isRequestSupported\n ? _fetch(request, fetchOptions)\n : _fetch(url, resolvedOptions));\n\n const isStreamResponse =\n supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach((prop) => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] =\n (onDownloadProgress &&\n progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n )) ||\n [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](\n response,\n config\n );\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request,\n });\n });\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError(\n 'Network Error',\n AxiosError.ERR_NETWORK,\n config,\n request,\n err && err.response\n ),\n {\n cause: err.cause || err,\n }\n );\n }\n\n throw AxiosError.from(err, err && err.code, config, request, err && err.response);\n }\n };\n};\n\nconst seedCache = new Map();\n\nexport const getFetch = (config) => {\n let env = (config && config.env) || {};\n const { fetch, Request, Response } = env;\n const seeds = [Request, Response, fetch];\n\n let len = seeds.length,\n i = len,\n seed,\n target,\n map = seedCache;\n\n while (i--) {\n seed = seeds[i];\n target = map.get(seed);\n\n target === undefined && map.set(seed, (target = i ? new Map() : factory(env)));\n\n map = target;\n }\n\n return target;\n};\n\nconst adapter = getFetch();\n\nexport default adapter;\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport * as fetchAdapter from './fetch.js';\nimport AxiosError from '../core/AxiosError.js';\n\n/**\n * Known adapters mapping.\n * Provides environment-specific adapters for Axios:\n * - `http` for Node.js\n * - `xhr` for browsers\n * - `fetch` for fetch API-based requests\n *\n * @type {Object<string, Function|Object>}\n */\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: {\n get: fetchAdapter.getFetch,\n },\n};\n\n// Assign adapter names for easier debugging and identification\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', { value });\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', { value });\n }\n});\n\n/**\n * Render a rejection reason string for unknown or unsupported adapters\n *\n * @param {string} reason\n * @returns {string}\n */\nconst renderReason = (reason) => `- ${reason}`;\n\n/**\n * Check if the adapter is resolved (function, null, or false)\n *\n * @param {Function|null|false} adapter\n * @returns {boolean}\n */\nconst isResolvedHandle = (adapter) =>\n utils.isFunction(adapter) || adapter === null || adapter === false;\n\n/**\n * Get the first suitable adapter from the provided list.\n * Tries each adapter in order until a supported one is found.\n * Throws an AxiosError if no adapter is suitable.\n *\n * @param {Array<string|Function>|string|Function} adapters - Adapter(s) by name or function.\n * @param {Object} config - Axios request configuration\n * @throws {AxiosError} If no suitable adapter is available\n * @returns {Function} The resolved adapter function\n */\nfunction getAdapter(adapters, config) {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const { length } = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n const reasons = Object.entries(rejectedReasons).map(\n ([id, state]) =>\n `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length\n ? reasons.length > 1\n ? 'since :\\n' + reasons.map(renderReason).join('\\n')\n : ' ' + renderReason(reasons[0])\n : 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n}\n\n/**\n * Exports Axios adapters and utility to resolve an adapter\n */\nexport default {\n /**\n * Resolve an adapter from a list of adapter names or functions.\n * @type {Function}\n */\n getAdapter,\n\n /**\n * Exposes all known adapters\n * @type {Object<string, Function|Object>}\n */\n adapters: knownAdapters,\n};\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from '../adapters/adapters.js';\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(config, config.transformRequest);\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\n\n return adapter(config).then(\n function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(config, config.transformResponse, response);\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n },\n function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n }\n );\n}\n","'use strict';\n\nimport { VERSION } from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return (\n '[Axios v' +\n VERSION +\n \"] Transitional option '\" +\n opt +\n \"'\" +\n desc +\n (message ? '. ' + message : '')\n );\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n // eslint-disable-next-line no-console\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError(\n 'option ' + opt + ' must be ' + result,\n AxiosError.ERR_BAD_OPTION_VALUE\n );\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators,\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\nimport transitionalDefaults from '../defaults/transitional.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig || {};\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager(),\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack;\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const { transitional, paramsSerializer, headers } = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(\n transitional,\n {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean),\n legacyInterceptorReqResOrdering: validators.transitional(validators.boolean),\n },\n false\n );\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer,\n };\n } else {\n validator.assertOptions(\n paramsSerializer,\n {\n encode: validators.function,\n serialize: validators.function,\n },\n true\n );\n }\n }\n\n // Set config.allowAbsoluteUrls\n if (config.allowAbsoluteUrls !== undefined) {\n // do nothing\n } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n\n validator.assertOptions(\n config,\n {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: validators.spelling('withXSRFToken'),\n },\n true\n );\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(headers.common, headers[config.method]);\n\n headers &&\n utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], (method) => {\n delete headers[method];\n });\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n const transitional = config.transitional || transitionalDefaults;\n const legacyInterceptorReqResOrdering =\n transitional && transitional.legacyInterceptorReqResOrdering;\n\n if (legacyInterceptorReqResOrdering) {\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n } else {\n requestInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n }\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift(...requestInterceptorChain);\n chain.push(...responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function (url, config) {\n return this.request(\n mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data,\n })\n );\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(\n mergeConfig(config || {}, {\n method,\n headers: isForm\n ? {\n 'Content-Type': 'multipart/form-data',\n }\n : {},\n url,\n data,\n })\n );\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then((cancel) => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = (onfulfilled) => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise((resolve) => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel,\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * const args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && payload.isAxiosError === true;\n}\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n WebServerIsDown: 521,\n ConnectionTimedOut: 522,\n OriginIsUnreachable: 523,\n TimeoutOccurred: 524,\n SslHandshakeFailed: 525,\n InvalidSslCertificate: 526,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport { VERSION } from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from './core/AxiosHeaders.js';\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, { allOwnKeys: true });\n\n // Copy context to instance\n utils.extend(instance, context, null, { allOwnKeys: true });\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = (thing) => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios;\n","function _interopRequireDefault(e) {\n return e && e.__esModule ? e : {\n \"default\": e\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _OverloadYield(e, d) {\n this.v = e, this.k = d;\n}\nmodule.exports = _OverloadYield, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _regeneratorDefine(e, r, n, t) {\n var i = Object.defineProperty;\n try {\n i({}, \"\", {});\n } catch (e) {\n i = 0;\n }\n module.exports = _regeneratorDefine = function regeneratorDefine(e, r, n, t) {\n function o(r, n) {\n _regeneratorDefine(e, r, function (e) {\n return this._invoke(r, n, e);\n });\n }\n r ? i ? i(e, r, {\n value: n,\n enumerable: !t,\n configurable: !t,\n writable: !t\n }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2));\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _regeneratorDefine(e, r, n, t);\n}\nmodule.exports = _regeneratorDefine, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var regeneratorDefine = require(\"./regeneratorDefine.js\");\nfunction _regenerator() {\n /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */\n var e,\n t,\n r = \"function\" == typeof Symbol ? Symbol : {},\n n = r.iterator || \"@@iterator\",\n o = r.toStringTag || \"@@toStringTag\";\n function i(r, n, o, i) {\n var c = n && n.prototype instanceof Generator ? n : Generator,\n u = Object.create(c.prototype);\n return regeneratorDefine(u, \"_invoke\", function (r, n, o) {\n var i,\n c,\n u,\n f = 0,\n p = o || [],\n y = !1,\n G = {\n p: 0,\n n: 0,\n v: e,\n a: d,\n f: d.bind(e, 4),\n d: function d(t, r) {\n return i = t, c = 0, u = e, G.n = r, a;\n }\n };\n function d(r, n) {\n for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) {\n var o,\n i = p[t],\n d = G.p,\n l = i[2];\n r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0));\n }\n if (o || r > 1) return a;\n throw y = !0, n;\n }\n return function (o, p, l) {\n if (f > 1) throw TypeError(\"Generator is already running\");\n for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) {\n i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u);\n try {\n if (f = 2, i) {\n if (c || (o = \"next\"), t = i[o]) {\n if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\");\n if (!t.done) return t;\n u = t.value, c < 2 && (c = 0);\n } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1);\n i = e;\n } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break;\n } catch (t) {\n i = e, c = 1, u = t;\n } finally {\n f = 1;\n }\n }\n return {\n value: t,\n done: y\n };\n };\n }(r, o, i), !0), u;\n }\n var a = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n t = Object.getPrototypeOf;\n var c = [][n] ? t(t([][n]())) : (regeneratorDefine(t = {}, n, function () {\n return this;\n }), t),\n u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c);\n function f(e) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, regeneratorDefine(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e;\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, regeneratorDefine(u, \"constructor\", GeneratorFunctionPrototype), regeneratorDefine(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", regeneratorDefine(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), regeneratorDefine(u), regeneratorDefine(u, o, \"Generator\"), regeneratorDefine(u, n, function () {\n return this;\n }), regeneratorDefine(u, \"toString\", function () {\n return \"[object Generator]\";\n }), (module.exports = _regenerator = function _regenerator() {\n return {\n w: i,\n m: f\n };\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports)();\n}\nmodule.exports = _regenerator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var OverloadYield = require(\"./OverloadYield.js\");\nvar regeneratorDefine = require(\"./regeneratorDefine.js\");\nfunction AsyncIterator(t, e) {\n function n(r, o, i, f) {\n try {\n var c = t[r](o),\n u = c.value;\n return u instanceof OverloadYield ? e.resolve(u.v).then(function (t) {\n n(\"next\", t, i, f);\n }, function (t) {\n n(\"throw\", t, i, f);\n }) : e.resolve(u).then(function (t) {\n c.value = t, i(c);\n }, function (t) {\n return n(\"throw\", t, i, f);\n });\n } catch (t) {\n f(t);\n }\n }\n var r;\n this.next || (regeneratorDefine(AsyncIterator.prototype), regeneratorDefine(AsyncIterator.prototype, \"function\" == typeof Symbol && Symbol.asyncIterator || \"@asyncIterator\", function () {\n return this;\n })), regeneratorDefine(this, \"_invoke\", function (t, o, i) {\n function f() {\n return new e(function (e, r) {\n n(t, i, e, r);\n });\n }\n return r = r ? r.then(f, f) : f();\n }, !0);\n}\nmodule.exports = AsyncIterator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var regenerator = require(\"./regenerator.js\");\nvar regeneratorAsyncIterator = require(\"./regeneratorAsyncIterator.js\");\nfunction _regeneratorAsyncGen(r, e, t, o, n) {\n return new regeneratorAsyncIterator(regenerator().w(r, e, t, o), n || Promise);\n}\nmodule.exports = _regeneratorAsyncGen, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var regeneratorAsyncGen = require(\"./regeneratorAsyncGen.js\");\nfunction _regeneratorAsync(n, e, r, t, o) {\n var a = regeneratorAsyncGen(n, e, r, t, o);\n return a.next().then(function (n) {\n return n.done ? n.value : a.next();\n });\n}\nmodule.exports = _regeneratorAsync, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _regeneratorKeys(e) {\n var n = Object(e),\n r = [];\n for (var t in n) r.unshift(t);\n return function e() {\n for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e;\n return e.done = !0, e;\n };\n}\nmodule.exports = _regeneratorKeys, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorValues(e) {\n if (null != e) {\n var t = e[\"function\" == typeof Symbol && Symbol.iterator || \"@@iterator\"],\n r = 0;\n if (t) return t.call(e);\n if (\"function\" == typeof e.next) return e;\n if (!isNaN(e.length)) return {\n next: function next() {\n return e && r >= e.length && (e = void 0), {\n value: e && e[r++],\n done: !e\n };\n }\n };\n }\n throw new TypeError(_typeof(e) + \" is not iterable\");\n}\nmodule.exports = _regeneratorValues, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var OverloadYield = require(\"./OverloadYield.js\");\nvar regenerator = require(\"./regenerator.js\");\nvar regeneratorAsync = require(\"./regeneratorAsync.js\");\nvar regeneratorAsyncGen = require(\"./regeneratorAsyncGen.js\");\nvar regeneratorAsyncIterator = require(\"./regeneratorAsyncIterator.js\");\nvar regeneratorKeys = require(\"./regeneratorKeys.js\");\nvar regeneratorValues = require(\"./regeneratorValues.js\");\nfunction _regeneratorRuntime() {\n \"use strict\";\n\n var r = regenerator(),\n e = r.m(_regeneratorRuntime),\n t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor;\n function n(r) {\n var e = \"function\" == typeof r && r.constructor;\n return !!e && (e === t || \"GeneratorFunction\" === (e.displayName || e.name));\n }\n var o = {\n \"throw\": 1,\n \"return\": 2,\n \"break\": 3,\n \"continue\": 3\n };\n function a(r) {\n var e, t;\n return function (n) {\n e || (e = {\n stop: function stop() {\n return t(n.a, 2);\n },\n \"catch\": function _catch() {\n return n.v;\n },\n abrupt: function abrupt(r, e) {\n return t(n.a, o[r], e);\n },\n delegateYield: function delegateYield(r, o, a) {\n return e.resultName = o, t(n.d, regeneratorValues(r), a);\n },\n finish: function finish(r) {\n return t(n.f, r);\n }\n }, t = function t(r, _t, o) {\n n.p = e.prev, n.n = e.next;\n try {\n return r(_t, o);\n } finally {\n e.next = n.n;\n }\n }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n;\n try {\n return r.call(this, e);\n } finally {\n n.p = e.prev, n.n = e.next;\n }\n };\n }\n return (module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n return {\n wrap: function wrap(e, t, n, o) {\n return r.w(a(e), t, n, o && o.reverse());\n },\n isGeneratorFunction: n,\n mark: r.m,\n awrap: function awrap(r, e) {\n return new OverloadYield(r, e);\n },\n AsyncIterator: regeneratorAsyncIterator,\n async: function async(r, e, t, o, u) {\n return (n(e) ? regeneratorAsyncGen : regeneratorAsync)(a(r), e, t, o, u);\n },\n keys: regeneratorKeys,\n values: regeneratorValues\n };\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports)();\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// TODO(Babel 8): Remove this file.\n\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","function asyncGeneratorStep(n, t, e, r, o, a, c) {\n try {\n var i = n[a](c),\n u = i.value;\n } catch (n) {\n return void e(n);\n }\n i.done ? t(u) : Promise.resolve(u).then(r, o);\n}\nfunction _asyncToGenerator(n) {\n return function () {\n var t = this,\n e = arguments;\n return new Promise(function (r, o) {\n var a = n.apply(t, e);\n function _next(n) {\n asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n);\n }\n function _throw(n) {\n asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n);\n }\n _next(void 0);\n });\n };\n}\nmodule.exports = _asyncToGenerator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","'use strict';\n\nconst denyList = new Set([\n\t'ENOTFOUND',\n\t'ENETUNREACH',\n\n\t// SSL errors from https://github.com/nodejs/node/blob/fc8e3e2cdc521978351de257030db0076d79e0ab/src/crypto/crypto_common.cc#L301-L328\n\t'UNABLE_TO_GET_ISSUER_CERT',\n\t'UNABLE_TO_GET_CRL',\n\t'UNABLE_TO_DECRYPT_CERT_SIGNATURE',\n\t'UNABLE_TO_DECRYPT_CRL_SIGNATURE',\n\t'UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY',\n\t'CERT_SIGNATURE_FAILURE',\n\t'CRL_SIGNATURE_FAILURE',\n\t'CERT_NOT_YET_VALID',\n\t'CERT_HAS_EXPIRED',\n\t'CRL_NOT_YET_VALID',\n\t'CRL_HAS_EXPIRED',\n\t'ERROR_IN_CERT_NOT_BEFORE_FIELD',\n\t'ERROR_IN_CERT_NOT_AFTER_FIELD',\n\t'ERROR_IN_CRL_LAST_UPDATE_FIELD',\n\t'ERROR_IN_CRL_NEXT_UPDATE_FIELD',\n\t'OUT_OF_MEM',\n\t'DEPTH_ZERO_SELF_SIGNED_CERT',\n\t'SELF_SIGNED_CERT_IN_CHAIN',\n\t'UNABLE_TO_GET_ISSUER_CERT_LOCALLY',\n\t'UNABLE_TO_VERIFY_LEAF_SIGNATURE',\n\t'CERT_CHAIN_TOO_LONG',\n\t'CERT_REVOKED',\n\t'INVALID_CA',\n\t'PATH_LENGTH_EXCEEDED',\n\t'INVALID_PURPOSE',\n\t'CERT_UNTRUSTED',\n\t'CERT_REJECTED',\n\t'HOSTNAME_MISMATCH'\n]);\n\n// TODO: Use `error?.code` when targeting Node.js 14\nmodule.exports = error => !denyList.has(error && error.code);\n","import isRetryAllowed from 'is-retry-allowed';\n\nexport const namespace = 'axios-retry';\n\n/**\n * @param {Error} error\n * @return {boolean}\n */\nexport function isNetworkError(error) {\n const CODE_EXCLUDE_LIST = ['ERR_CANCELED', 'ECONNABORTED'];\n\n return (\n !error.response &&\n Boolean(error.code) && // Prevents retrying cancelled requests\n !CODE_EXCLUDE_LIST.includes(error.code) && // Prevents retrying timed out & cancelled requests\n isRetryAllowed(error) // Prevents retrying unsafe errors\n );\n}\n\nconst SAFE_HTTP_METHODS = ['get', 'head', 'options'];\nconst IDEMPOTENT_HTTP_METHODS = SAFE_HTTP_METHODS.concat(['put', 'delete']);\n\n/**\n * @param {Error} error\n * @return {boolean}\n */\nexport function isRetryableError(error) {\n return (\n error.code !== 'ECONNABORTED' &&\n (!error.response || (error.response.status >= 500 && error.response.status <= 599))\n );\n}\n\n/**\n * @param {Error} error\n * @return {boolean}\n */\nexport function isSafeRequestError(error) {\n if (!error.config) {\n // Cannot determine if the request can be retried\n return false;\n }\n\n return isRetryableError(error) && SAFE_HTTP_METHODS.indexOf(error.config.method) !== -1;\n}\n\n/**\n * @param {Error} error\n * @return {boolean}\n */\nexport function isIdempotentRequestError(error) {\n if (!error.config) {\n // Cannot determine if the request can be retried\n return false;\n }\n\n return isRetryableError(error) && IDEMPOTENT_HTTP_METHODS.indexOf(error.config.method) !== -1;\n}\n\n/**\n * @param {Error} error\n * @return {boolean}\n */\nexport function isNetworkOrIdempotentRequestError(error) {\n return isNetworkError(error) || isIdempotentRequestError(error);\n}\n\n/**\n * @return {number} - delay in milliseconds, always 0\n */\nfunction noDelay() {\n return 0;\n}\n\n/**\n * Set delayFactor 1000 for an exponential delay to occur on the order\n * of seconds\n * @param {number} [retryNumber=0]\n * @param {Error} error - unused; for existing API of retryDelay callback\n * @param {number} [delayFactor=100] milliseconds\n * @return {number} - delay in milliseconds\n */\nexport function exponentialDelay(retryNumber = 0, error, delayFactor = 100) {\n const delay = Math.pow(2, retryNumber) * delayFactor;\n const randomSum = delay * 0.2 * Math.random(); // 0-20% of the delay\n return delay + randomSum;\n}\n\n/** @type {IAxiosRetryConfig} */\nexport const DEFAULT_OPTIONS = {\n retries: 3,\n retryCondition: isNetworkOrIdempotentRequestError,\n retryDelay: noDelay,\n shouldResetTimeout: false,\n onRetry: () => {}\n};\n\n/**\n * Returns the axios-retry options for the current request\n * @param {AxiosRequestConfig} config\n * @param {IAxiosRetryConfig} defaultOptions\n * @return {IAxiosRetryConfigExtended}\n */\nfunction getRequestOptions(config, defaultOptions) {\n return { ...DEFAULT_OPTIONS, ...defaultOptions, ...config[namespace] };\n}\n\n/**\n * Initializes and returns the retry state for the given request/config\n * @param {AxiosRequestConfig} config\n * @param {IAxiosRetryConfig} defaultOptions\n * @return {IAxiosRetryConfigExtended}\n */\nfunction getCurrentState(config, defaultOptions) {\n const currentState = getRequestOptions(config, defaultOptions);\n currentState.retryCount = currentState.retryCount || 0;\n config[namespace] = currentState;\n return currentState;\n}\n\n/**\n * @param {Axios} axios\n * @param {AxiosRequestConfig} config\n */\nfunction fixConfig(axios, config) {\n if (axios.defaults.agent === config.agent) {\n delete config.agent;\n }\n if (axios.defaults.httpAgent === config.httpAgent) {\n delete config.httpAgent;\n }\n if (axios.defaults.httpsAgent === config.httpsAgent) {\n delete config.httpsAgent;\n }\n}\n\n/**\n * Checks retryCondition if request can be retried. Handles it's returning value or Promise.\n * @param {IAxiosRetryConfigExtended} currentState\n * @param {Error} error\n * @return {Promise<boolean>}\n */\nasync function shouldRetry(currentState, error) {\n const { retries, retryCondition } = currentState;\n const shouldRetryOrPromise = currentState.retryCount < retries && retryCondition(error);\n\n // This could be a promise\n if (typeof shouldRetryOrPromise === 'object') {\n try {\n const shouldRetryPromiseResult = await shouldRetryOrPromise;\n // keep return true unless shouldRetryPromiseResult return false for compatibility\n return shouldRetryPromiseResult !== false;\n } catch (_err) {\n return false;\n }\n }\n return shouldRetryOrPromise;\n}\n\n/**\n * Adds response interceptors to an axios instance to retry requests failed due to network issues\n *\n * @example\n *\n * import axios from 'axios';\n *\n * axiosRetry(axios, { retries: 3 });\n *\n * axios.get('http://example.com/test') // The first request fails and the second returns 'ok'\n * .then(result => {\n * result.data; // 'ok'\n * });\n *\n * // Exponential back-off retry delay between requests\n * axiosRetry(axios, { retryDelay : axiosRetry.exponentialDelay});\n *\n * // Custom retry delay\n * axiosRetry(axios, { retryDelay : (retryCount) => {\n * return retryCount * 1000;\n * }});\n *\n * // Also works with custom axios instances\n * const client = axios.create({ baseURL: 'http://example.com' });\n * axiosRetry(client, { retries: 3 });\n *\n * client.get('/test') // The first request fails and the second returns 'ok'\n * .then(result => {\n * result.data; // 'ok'\n * });\n *\n * // Allows request-specific configuration\n * client\n * .get('/test', {\n * 'axios-retry': {\n * retries: 0\n * }\n * })\n * .catch(error => { // The first request fails\n * error !== undefined\n * });\n *\n * @param {Axios} axios An axios instance (the axios object or one created from axios.create)\n * @param {Object} [defaultOptions]\n * @param {number} [defaultOptions.retries=3] Number of retries\n * @param {boolean} [defaultOptions.shouldResetTimeout=false]\n * Defines if the timeout should be reset between retries\n * @param {Function} [defaultOptions.retryCondition=isNetworkOrIdempotentRequestError]\n * A function to determine if the error can be retried\n * @param {Function} [defaultOptions.retryDelay=noDelay]\n * A function to determine the delay between retry requests\n * @param {Function} [defaultOptions.onRetry=()=>{}]\n * A function to get notified when a retry occurs\n * @return {{ requestInterceptorId: number, responseInterceptorId: number }}\n * The ids of the interceptors added to the request and to the response (so they can be ejected at a later time)\n */\nexport default function axiosRetry(axios, defaultOptions) {\n const requestInterceptorId = axios.interceptors.request.use((config) => {\n const currentState = getCurrentState(config, defaultOptions);\n currentState.lastRequestTime = Date.now();\n return config;\n });\n\n const responseInterceptorId = axios.interceptors.response.use(null, async (error) => {\n const { config } = error;\n\n // If we have no information to retry the request\n if (!config) {\n return Promise.reject(error);\n }\n\n const currentState = getCurrentState(config, defaultOptions);\n\n if (await shouldRetry(currentState, error)) {\n currentState.retryCount += 1;\n const { retryDelay, shouldResetTimeout, onRetry } = currentState;\n const delay = retryDelay(currentState.retryCount, error);\n\n // Axios fails merging this configuration to the default configuration because it has an issue\n // with circular structures: https://github.com/mzabriskie/axios/issues/370\n fixConfig(axios, config);\n\n if (!shouldResetTimeout && config.timeout && currentState.lastRequestTime) {\n const lastRequestDuration = Date.now() - currentState.lastRequestTime;\n const timeout = config.timeout - lastRequestDuration - delay;\n if (timeout <= 0) {\n return Promise.reject(error);\n }\n config.timeout = timeout;\n }\n\n config.transformRequest = [(data) => data];\n\n await onRetry(currentState.retryCount, error, config);\n\n return new Promise((resolve) => setTimeout(() => resolve(axios(config)), delay));\n }\n\n return Promise.reject(error);\n });\n\n return { requestInterceptorId, responseInterceptorId };\n}\n\n// Compatibility with CommonJS\naxiosRetry.isNetworkError = isNetworkError;\naxiosRetry.isSafeRequestError = isSafeRequestError;\naxiosRetry.isIdempotentRequestError = isIdempotentRequestError;\naxiosRetry.isNetworkOrIdempotentRequestError = isNetworkOrIdempotentRequestError;\naxiosRetry.exponentialDelay = exponentialDelay;\naxiosRetry.isRetryableError = isRetryableError;\n","const axiosRetry = require('./lib/cjs/index').default;\n\nmodule.exports = axiosRetry;\nmodule.exports.default = axiosRetry;\n","'use strict';\n\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\nconst hasBlob = typeof Blob !== 'undefined';\n\nif (hasBlob) BINARY_TYPES.push('blob');\n\nmodule.exports = {\n BINARY_TYPES,\n CLOSE_TIMEOUT: 30000,\n EMPTY_BUFFER: Buffer.alloc(0),\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n hasBlob,\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\n kListener: Symbol('kListener'),\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n NOOP: () => {}\n};\n","'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) {\n return new FastBuffer(target.buffer, target.byteOffset, offset);\n }\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.length === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = new FastBuffer(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\nmodule.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n};\n\n/* istanbul ignore else */\nif (!process.env.WS_NO_BUFFER_UTIL) {\n try {\n const bufferUtil = require('bufferutil');\n\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bufferUtil.mask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bufferUtil.unmask(buffer, mask);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n","'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {Boolean} [options.isServer=false] Create the instance in either\n * server or client mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed if context takeover is disabled\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n */\n constructor(options) {\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._maxPayload = this._options.maxPayload | 0;\n this._isServer = !!this._options.isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n !params.client_max_window_bits)\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) {\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\n }\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n\n //\n // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the\n // fact that in Node.js versions prior to 13.10.0, the callback for\n // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing\n // `zlib.reset()` ensures that either the callback is invoked or an error is\n // emitted.\n //\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n\n if (this[kError]) {\n this[kCallback](this[kError]);\n return;\n }\n\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n","'use strict';\n\nconst { isUtf8 } = require('buffer');\n\nconst { hasBlob } = require('./constants');\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Determines whether a value is a `Blob`.\n *\n * @param {*} value The value to be tested\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\n * @private\n */\nfunction isBlob(value) {\n return (\n hasBlob &&\n typeof value === 'object' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n (value[Symbol.toStringTag] === 'Blob' ||\n value[Symbol.toStringTag] === 'File')\n );\n}\n\nmodule.exports = {\n isBlob,\n isValidStatusCode,\n isValidUTF8: _isValidUTF8,\n tokenChars\n};\n\nif (isUtf8) {\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\n try {\n const isValidUTF8 = require('utf-8-validate');\n\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\nconst DEFER_EVENT = 6;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {Object} [options] Options object\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {String} [options.binaryType=nodebuffer] The type for binary data\n * @param {Object} [options.extensions] An object containing the negotiated\n * extensions\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\n * client or server mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n */\n constructor(options = {}) {\n super();\n\n this._allowSynchronousEvents =\n options.allowSynchronousEvents !== undefined\n ? options.allowSynchronousEvents\n : true;\n this._binaryType = options.binaryType || BINARY_TYPES[0];\n this._extensions = options.extensions || {};\n this._isServer = !!options.isServer;\n this._maxPayload = options.maxPayload | 0;\n this._skipUTF8Validation = !!options.skipUTF8Validation;\n this[kWebSocket] = undefined;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragments = [];\n\n this._errored = false;\n this._loop = false;\n this._state = GET_INFO;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n this.getInfo(cb);\n break;\n case GET_PAYLOAD_LENGTH_16:\n this.getPayloadLength16(cb);\n break;\n case GET_PAYLOAD_LENGTH_64:\n this.getPayloadLength64(cb);\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n this.getData(cb);\n break;\n case INFLATING:\n case DEFER_EVENT:\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n if (!this._errored) cb();\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @param {Function} cb Callback\n * @private\n */\n getInfo(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n const error = this.createError(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n\n cb(error);\n return;\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fragmented) {\n const error = this.createError(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n const error = this.createError(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n\n cb(error);\n return;\n }\n\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._payloadLength > 0x7d ||\n (this._opcode === 0x08 && this._payloadLength === 1)\n ) {\n const error = this.createError(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n } else {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n } else if (this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength16(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength64(cb) {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n const error = this.createError(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n this.haveLength(cb);\n }\n\n /**\n * Payload length has been read.\n *\n * @param {Function} cb Callback\n * @private\n */\n haveLength(cb) {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n\n if (\n this._masked &&\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\n ) {\n unmask(data, this._mask);\n }\n }\n\n if (this._opcode > 0x07) {\n this.controlMessage(data, cb);\n return;\n }\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its length is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n this.dataMessage(cb);\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._fragments.push(buf);\n }\n\n this.dataMessage(cb);\n if (this._state === GET_INFO) this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @param {Function} cb Callback\n * @private\n */\n dataMessage(cb) {\n if (!this._fin) {\n this._state = GET_INFO;\n return;\n }\n\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else if (this._binaryType === 'blob') {\n data = new Blob(fragments);\n } else {\n data = fragments;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit('message', data, true);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', data, true);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n if (this._state === INFLATING || this._allowSynchronousEvents) {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data, cb) {\n if (this._opcode === 0x08) {\n if (data.length === 0) {\n this._loop = false;\n this.emit('conclude', 1005, EMPTY_BUFFER);\n this.end();\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n const error = this.createError(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n\n cb(error);\n return;\n }\n\n const buf = new FastBuffer(\n data.buffer,\n data.byteOffset + 2,\n data.length - 2\n );\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n this._loop = false;\n this.emit('conclude', code, buf);\n this.end();\n }\n\n this._state = GET_INFO;\n return;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n\n /**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\n this._loop = false;\n this._errored = true;\n\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, this.createError);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n }\n}\n\nmodule.exports = Receiver;\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst { Duplex } = require('stream');\nconst { randomFillSync } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants');\nconst { isBlob, isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\n\nconst DEFAULT = 0;\nconst DEFLATING = 1;\nconst GET_BLOB_DATA = 2;\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {Duplex} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Function} [generateMask] The function used to generate the masking\n * key\n */\n constructor(socket, extensions, generateMask) {\n this._extensions = extensions || {};\n\n if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._queue = [];\n this._state = DEFAULT;\n this.onerror = NOOP;\n this[kWebSocket] = undefined;\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {(Buffer|String)} data The data to frame\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {(Buffer|String)[]} The framed data\n * @public\n */\n static frame(data, options) {\n let mask;\n let merge = false;\n let offset = 2;\n let skipMasking = false;\n\n if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\n\n if (options.generateMask) {\n options.generateMask(mask);\n } else {\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\n /* istanbul ignore else */\n if (randomPool === undefined) {\n //\n // This is lazily initialized because server-sent frames must not\n // be masked so it may never be used.\n //\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\n }\n\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n\n let dataLength;\n\n if (typeof data === 'string') {\n if (\n (!options.mask || skipMasking) &&\n options[kByteLength] !== undefined\n ) {\n dataLength = options[kByteLength];\n } else {\n data = Buffer.from(data);\n dataLength = data.length;\n }\n } else {\n dataLength = data.length;\n merge = options.mask && options.readOnly && !skipMasking;\n }\n\n let payloadLength = dataLength;\n\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(dataLength, 2);\n } else if (payloadLength === 127) {\n target[2] = target[3] = 0;\n target.writeUIntBE(dataLength, 4, 6);\n }\n\n if (!options.mask) return [target, data];\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (skipMasking) return [target, data];\n\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\n }\n\n applyMask(data, mask, data, 0, dataLength);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {(String|Buffer)} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || !data.length) {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else {\n buf.set(data, 2);\n }\n }\n\n const options = {\n [kByteLength]: buf.length,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x08,\n readOnly: false,\n rsv1: false\n };\n\n if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, buf, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(buf, options), cb);\n }\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x09,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x0a,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (\n rsv1 &&\n perMessageDeflate &&\n perMessageDeflate.params[\n perMessageDeflate._isServer\n ? 'server_no_context_takeover'\n : 'client_no_context_takeover'\n ]\n ) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n const opts = {\n [kByteLength]: byteLength,\n fin: options.fin,\n generateMask: this._generateMask,\n mask: options.mask,\n maskBuffer: this._maskBuffer,\n opcode,\n readOnly,\n rsv1\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\n } else {\n this.getBlobData(data, this._compress, opts, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\n } else {\n this.dispatch(data, this._compress, opts, cb);\n }\n }\n\n /**\n * Gets the contents of a blob as binary data.\n *\n * @param {Blob} blob The blob\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * the data\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n getBlobData(blob, compress, options, cb) {\n this._bufferedBytes += options[kByteLength];\n this._state = GET_BLOB_DATA;\n\n blob\n .arrayBuffer()\n .then((arrayBuffer) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while the blob was being read'\n );\n\n //\n // `callCallbacks` is called in the next tick to ensure that errors\n // that might be thrown in the callbacks behave like errors thrown\n // outside the promise chain.\n //\n process.nextTick(callCallbacks, this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\n\n if (!compress) {\n this._state = DEFAULT;\n this.sendFrame(Sender.frame(data, options), cb);\n this.dequeue();\n } else {\n this.dispatch(data, compress, options, cb);\n }\n })\n .catch((err) => {\n //\n // `onError` is called in the next tick for the same reason that\n // `callCallbacks` above is.\n //\n process.nextTick(onError, this, err, cb);\n });\n }\n\n /**\n * Dispatches a message.\n *\n * @param {(Buffer|String)} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += options[kByteLength];\n this._state = DEFLATING;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n callCallbacks(this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n this._state = DEFAULT;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (this._state === DEFAULT && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[3][kByteLength];\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[3][kByteLength];\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {(Buffer | String)[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n\n/**\n * Calls queued callbacks with an error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error to call the callbacks with\n * @param {Function} [cb] The first callback\n * @private\n */\nfunction callCallbacks(sender, err, cb) {\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\n\n if (typeof callback === 'function') callback(err);\n }\n}\n\n/**\n * Handles a `Sender` error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error\n * @param {Function} [cb] The first pending callback\n * @private\n */\nfunction onError(sender, err, cb) {\n callCallbacks(sender, err, cb);\n sender.onerror(err);\n}\n","'use strict';\n\nconst { kForOnEventAttribute, kListener } = require('./constants');\n\nconst kCode = Symbol('kCode');\nconst kData = Symbol('kData');\nconst kError = Symbol('kError');\nconst kMessage = Symbol('kMessage');\nconst kReason = Symbol('kReason');\nconst kTarget = Symbol('kTarget');\nconst kType = Symbol('kType');\nconst kWasClean = Symbol('kWasClean');\n\n/**\n * Class representing an event.\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @throws {TypeError} If the `type` argument is not specified\n */\n constructor(type) {\n this[kTarget] = null;\n this[kType] = type;\n }\n\n /**\n * @type {*}\n */\n get target() {\n return this[kTarget];\n }\n\n /**\n * @type {String}\n */\n get type() {\n return this[kType];\n }\n}\n\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {Number} [options.code=0] The status code explaining why the\n * connection was closed\n * @param {String} [options.reason=''] A human-readable string explaining why\n * the connection was closed\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\n * connection was cleanly closed\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kCode] = options.code === undefined ? 0 : options.code;\n this[kReason] = options.reason === undefined ? '' : options.reason;\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\n }\n\n /**\n * @type {Number}\n */\n get code() {\n return this[kCode];\n }\n\n /**\n * @type {String}\n */\n get reason() {\n return this[kReason];\n }\n\n /**\n * @type {Boolean}\n */\n get wasClean() {\n return this[kWasClean];\n }\n}\n\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.error=null] The error that generated this event\n * @param {String} [options.message=''] The error message\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kError] = options.error === undefined ? null : options.error;\n this[kMessage] = options.message === undefined ? '' : options.message;\n }\n\n /**\n * @type {*}\n */\n get error() {\n return this[kError];\n }\n\n /**\n * @type {String}\n */\n get message() {\n return this[kMessage];\n }\n}\n\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.data=null] The message content\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kData] = options.data === undefined ? null : options.data;\n }\n\n /**\n * @type {*}\n */\n get data() {\n return this[kData];\n }\n}\n\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {(Function|Object)} handler The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, handler, options = {}) {\n for (const listener of this.listeners(type)) {\n if (\n !options[kForOnEventAttribute] &&\n listener[kListener] === handler &&\n !listener[kForOnEventAttribute]\n ) {\n return;\n }\n }\n\n let wrapper;\n\n if (type === 'message') {\n wrapper = function onMessage(data, isBinary) {\n const event = new MessageEvent('message', {\n data: isBinary ? data : data.toString()\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'close') {\n wrapper = function onClose(code, message) {\n const event = new CloseEvent('close', {\n code,\n reason: message.toString(),\n wasClean: this._closeFrameReceived && this._closeFrameSent\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'error') {\n wrapper = function onError(error) {\n const event = new ErrorEvent('error', {\n error,\n message: error.message\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'open') {\n wrapper = function onOpen() {\n const event = new Event('open');\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else {\n return;\n }\n\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\n wrapper[kListener] = handler;\n\n if (options.once) {\n this.once(type, wrapper);\n } else {\n this.on(type, wrapper);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {(Function|Object)} handler The listener to remove\n * @public\n */\n removeEventListener(type, handler) {\n for (const listener of this.listeners(type)) {\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\n this.removeListener(type, listener);\n break;\n }\n }\n }\n};\n\nmodule.exports = {\n CloseEvent,\n ErrorEvent,\n Event,\n EventTarget,\n MessageEvent\n};\n\n/**\n * Call an event listener\n *\n * @param {(Function|Object)} listener The listener to call\n * @param {*} thisArg The value to use as `this`` when calling the listener\n * @param {Event} event The event to pass to the listener\n * @private\n */\nfunction callListener(listener, thisArg, event) {\n if (typeof listener === 'object' && listener.handleEvent) {\n listener.handleEvent.call(listener, event);\n } else {\n listener.call(thisArg, event);\n }\n}\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let code = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Duplex, Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst { isBlob } = require('./validation');\n\nconst {\n BINARY_TYPES,\n CLOSE_TIMEOUT,\n EMPTY_BUFFER,\n GUID,\n kForOnEventAttribute,\n kListener,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n EventTarget: { addEventListener, removeEventListener }\n} = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst kAborted = Symbol('kAborted');\nconst protocolVersions = [8, 13];\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = EMPTY_BUFFER;\n this._closeTimer = null;\n this._errorEmitted = false;\n this._extensions = {};\n this._paused = false;\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (protocols === undefined) {\n protocols = [];\n } else if (!Array.isArray(protocols)) {\n if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n protocols = [];\n } else {\n protocols = [protocols];\n }\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._autoPong = options.autoPong;\n this._closeTimeout = options.closeTimeout;\n this._isServer = true;\n }\n }\n\n /**\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\n * instead of \"blob\".\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Boolean}\n */\n get isPaused() {\n return this._paused;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return null;\n }\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Object} options Options object\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\n setSocket(socket, head, options) {\n const receiver = new Receiver({\n allowSynchronousEvents: options.allowSynchronousEvents,\n binaryType: this.binaryType,\n extensions: this._extensions,\n isServer: this._isServer,\n maxPayload: options.maxPayload,\n skipUTF8Validation: options.skipUTF8Validation\n });\n\n const sender = new Sender(socket, this._extensions, options.generateMask);\n\n this._receiver = receiver;\n this._sender = sender;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n sender[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n sender.onerror = senderOnError;\n\n //\n // These methods may not be available if `socket` is just a `Duplex`.\n //\n if (socket.setTimeout) socket.setTimeout(0);\n if (socket.setNoDelay) socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {(String|Buffer)} [data] The reason why the connection is\n * closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._readyState = WebSocket.CLOSING;\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n setCloseTimer(this);\n }\n\n /**\n * Pause the socket.\n *\n * @public\n */\n pause() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = true;\n this._socket.pause();\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Resume the socket.\n *\n * @public\n */\n resume() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = false;\n if (!this._receiver._writableState.needDrain) this._socket.resume();\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'isPaused',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) return listener[kListener];\n }\n\n return null;\n },\n set(handler) {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) {\n this.removeListener(method, listener);\n break;\n }\n }\n\n if (typeof handler !== 'function') return;\n\n this.addEventListener(method, handler, {\n [kForOnEventAttribute]: true\n });\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {Array} protocols The subprotocols\n * @param {Object} [options] Connection options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\n * times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to wait\n * for the closing handshake to finish after `websocket.close()` is called\n * @param {Function} [options.finishRequest] A function which can be used to\n * customize the headers of each http request before it is sent\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n allowSynchronousEvents: true,\n autoPong: true,\n closeTimeout: CLOSE_TIMEOUT,\n protocolVersion: protocolVersions[1],\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n timeout: undefined,\n method: 'GET',\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n websocket._autoPong = opts.autoPong;\n websocket._closeTimeout = opts.closeTimeout;\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n } else {\n try {\n parsedUrl = new URL(address);\n } catch {\n throw new SyntaxError(`Invalid URL: ${address}`);\n }\n }\n\n if (parsedUrl.protocol === 'http:') {\n parsedUrl.protocol = 'ws:';\n } else if (parsedUrl.protocol === 'https:') {\n parsedUrl.protocol = 'wss:';\n }\n\n websocket._url = parsedUrl.href;\n\n const isSecure = parsedUrl.protocol === 'wss:';\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\n let invalidUrlMessage;\n\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\n invalidUrlMessage =\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\n '\"http:\", \"https:\", or \"ws+unix:\"';\n } else if (isIpcUrl && !parsedUrl.pathname) {\n invalidUrlMessage = \"The URL's pathname is empty\";\n } else if (parsedUrl.hash) {\n invalidUrlMessage = 'The URL contains a fragment identifier';\n }\n\n if (invalidUrlMessage) {\n const err = new SyntaxError(invalidUrlMessage);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const request = isSecure ? https.request : http.request;\n const protocolSet = new Set();\n let perMessageDeflate;\n\n opts.createConnection =\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n ...opts.headers,\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket'\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate({\n ...opts.perMessageDeflate,\n isServer: false,\n maxPayload: opts.maxPayload\n });\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols.length) {\n for (const protocol of protocols) {\n if (\n typeof protocol !== 'string' ||\n !subprotocolRegex.test(protocol) ||\n protocolSet.has(protocol)\n ) {\n throw new SyntaxError(\n 'An invalid or duplicated subprotocol was specified'\n );\n }\n\n protocolSet.add(protocol);\n }\n\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isIpcUrl) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n let req;\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalIpc = isIpcUrl;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isIpcUrl\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else if (websocket.listenerCount('redirect') === 0) {\n const isSameHost = isIpcUrl\n ? websocket._originalIpc\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalIpc\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n\n req = websocket._req = request(opts);\n\n if (websocket._redirects) {\n //\n // Unlike what is done for the `'upgrade'` event, no early exit is\n // triggered here if the user calls `websocket.close()` or\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\n // is because the user can also call `request.destroy()` with an error\n // before calling `websocket.close()` or `websocket.terminate()` and this\n // would result in an error being emitted on the `request` object with no\n // `'error'` event listeners attached.\n //\n websocket.emit('redirect', websocket.url, req);\n }\n } else {\n req = websocket._req = request(opts);\n }\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req[kAborted]) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (e) {\n const err = new SyntaxError(`Invalid URL: ${location}`);\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the\n // `'upgrade'` event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n const upgrade = res.headers.upgrade;\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n let protError;\n\n if (serverProt !== undefined) {\n if (!protocolSet.size) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (!protocolSet.has(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n } else if (protocolSet.size) {\n protError = 'Server sent no subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message = 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n\n websocket.setSocket(socket, head, {\n allowSynchronousEvents: opts.allowSynchronousEvents,\n generateMask: opts.generateMask,\n maxPayload: opts.maxPayload,\n skipUTF8Validation: opts.skipUTF8Validation\n });\n });\n\n if (opts.finishRequest) {\n opts.finishRequest(req, websocket);\n } else {\n req.end();\n }\n}\n\n/**\n * Emit the `'error'` and `'close'` events.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n //\n // The following assignment is practically useless and is done only for\n // consistency.\n //\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream[kAborted] = true;\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n process.nextTick(emitErrorAndClose, websocket, err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = isBlob(data) ? data.size : toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n process.nextTick(cb, err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {Buffer} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n const websocket = this[kWebSocket];\n\n if (!websocket.isPaused) websocket._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\n * @param {Boolean} isBinary Specifies whether the message is binary or not\n * @private\n */\nfunction receiverOnMessage(data, isBinary) {\n this[kWebSocket].emit('message', data, isBinary);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The `Sender` error event handler.\n *\n * @param {Error} The error\n * @private\n */\nfunction senderOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket.readyState === WebSocket.CLOSED) return;\n if (websocket.readyState === WebSocket.OPEN) {\n websocket._readyState = WebSocket.CLOSING;\n setCloseTimer(websocket);\n }\n\n //\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\n // peer to finish sending queued data. There is no need to set a timer here\n // because `CLOSING` means that it is already set or not needed.\n //\n this._socket.end();\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * Set a timer to destroy the underlying raw socket of a WebSocket.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @private\n */\nfunction setCloseTimer(websocket) {\n websocket._closeTimer = setTimeout(\n websocket._socket.destroy.bind(websocket._socket),\n websocket._closeTimeout\n );\n}\n\n/**\n * The listener of the socket `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written. If instead, the\n // socket is paused, any possible buffered data will be read as a single\n // chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n this._readableState.length !== 0\n ) {\n const chunk = this.read(this._readableState.length);\n\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the socket `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the socket `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the socket `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^WebSocket$\" }] */\n'use strict';\n\nconst WebSocket = require('./websocket');\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let terminateOnDestroy = true;\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg, isBinary) {\n const data =\n !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;\n\n if (!duplex.push(data)) ws.pause();\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (ws.isPaused) ws.resume();\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.\n *\n * @param {String} header The field value of the header\n * @return {Set} The subprotocol names\n * @public\n */\nfunction parse(header) {\n const protocols = new Set();\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (i; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n\n const protocol = header.slice(start, end);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n\n if (start === -1 || end !== -1) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n const protocol = header.slice(start, i);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n return protocols;\n}\n\nmodule.exports = { parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst { Duplex } = require('stream');\nconst { createHash } = require('crypto');\n\nconst extension = require('./extension');\nconst PerMessageDeflate = require('./permessage-deflate');\nconst subprotocol = require('./subprotocol');\nconst WebSocket = require('./websocket');\nconst { CLOSE_TIMEOUT, GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to\n * wait for the closing handshake to finish after `websocket.close()` is\n * called\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`\n * class to use. It must be the `WebSocket` class or class that extends it\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n allowSynchronousEvents: true,\n autoPong: true,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n closeTimeout: CLOSE_TIMEOUT,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n WebSocket,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) {\n this.clients = new Set();\n this._shouldEmitClose = false;\n }\n\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Stop the server from accepting new connections and emit the `'close'` event\n * when all existing connections are closed.\n *\n * @param {Function} [cb] A one-time listener for the `'close'` event\n * @public\n */\n close(cb) {\n if (this._state === CLOSED) {\n if (cb) {\n this.once('close', () => {\n cb(new Error('The server is not running'));\n });\n }\n\n process.nextTick(emitClose, this);\n return;\n }\n\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n if (this.options.noServer || this.options.server) {\n if (this._server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n }\n\n if (this.clients) {\n if (!this.clients.size) {\n process.nextTick(emitClose, this);\n } else {\n this._shouldEmitClose = true;\n }\n } else {\n process.nextTick(emitClose, this);\n }\n } else {\n const server = this._server;\n\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // The HTTP/S server was created internally. Close it, and rely on its\n // `'close'` event.\n //\n server.close(() => {\n emitClose(this);\n });\n }\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key = req.headers['sec-websocket-key'];\n const upgrade = req.headers.upgrade;\n const version = +req.headers['sec-websocket-version'];\n\n if (req.method !== 'GET') {\n const message = 'Invalid HTTP method';\n abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);\n return;\n }\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n const message = 'Invalid Upgrade header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (key === undefined || !keyRegex.test(key)) {\n const message = 'Missing or invalid Sec-WebSocket-Key header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (version !== 13 && version !== 8) {\n const message = 'Missing or invalid Sec-WebSocket-Version header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {\n 'Sec-WebSocket-Version': '13, 8'\n });\n return;\n }\n\n if (!this.shouldHandle(req)) {\n abortHandshake(socket, 400);\n return;\n }\n\n const secWebSocketProtocol = req.headers['sec-websocket-protocol'];\n let protocols = new Set();\n\n if (secWebSocketProtocol !== undefined) {\n try {\n protocols = subprotocol.parse(secWebSocketProtocol);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Protocol header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n const secWebSocketExtensions = req.headers['sec-websocket-extensions'];\n const extensions = {};\n\n if (\n this.options.perMessageDeflate &&\n secWebSocketExtensions !== undefined\n ) {\n const perMessageDeflate = new PerMessageDeflate({\n ...this.options.perMessageDeflate,\n isServer: true,\n maxPayload: this.options.maxPayload\n });\n\n try {\n const offers = extension.parse(secWebSocketExtensions);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n const message =\n 'Invalid or unacceptable Sec-WebSocket-Extensions header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(\n extensions,\n key,\n protocols,\n req,\n socket,\n head,\n cb\n );\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {Object} extensions The accepted extensions\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Set} protocols The subprotocols\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(extensions, key, protocols, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new this.options.WebSocket(null, undefined, this.options);\n\n if (protocols.size) {\n //\n // Optionally call external protocol selection handler.\n //\n const protocol = this.options.handleProtocols\n ? this.options.handleProtocols(protocols, req)\n : protocols.values().next().value;\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = extension.format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, {\n allowSynchronousEvents: this.options.allowSynchronousEvents,\n maxPayload: this.options.maxPayload,\n skipUTF8Validation: this.options.skipUTF8Validation\n });\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => {\n this.clients.delete(ws);\n\n if (this._shouldEmitClose && !this.clients.size) {\n process.nextTick(emitClose, this);\n }\n });\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of <event, listener>\n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.<String, Function>} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n //\n // The socket is writable unless the user destroyed or ended it before calling\n // `server.handleUpgrade()` or in the `verifyClient` function, which is a user\n // error. Handling this does not make much sense as the worst that can happen\n // is that some of the data written by the user might be discarded due to the\n // call to `socket.end()` below, which triggers an `'error'` event that in\n // turn causes the socket to be destroyed.\n //\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.once('finish', socket.destroy);\n\n socket.end(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n}\n\n/**\n * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least\n * one listener for it, otherwise call `abortHandshake()`.\n *\n * @param {WebSocketServer} server The WebSocket server\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} message The HTTP response body\n * @param {Object} [headers] The HTTP response headers\n * @private\n */\nfunction abortHandshakeOrEmitwsClientError(\n server,\n req,\n socket,\n code,\n message,\n headers\n) {\n if (server.listenerCount('wsClientError')) {\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);\n\n server.emit('wsClientError', err, socket, req);\n } else {\n abortHandshake(socket, code, message, headers);\n }\n}\n","'use strict';\n\nconst createWebSocketStream = require('./lib/stream');\nconst extension = require('./lib/extension');\nconst PerMessageDeflate = require('./lib/permessage-deflate');\nconst Receiver = require('./lib/receiver');\nconst Sender = require('./lib/sender');\nconst subprotocol = require('./lib/subprotocol');\nconst WebSocket = require('./lib/websocket');\nconst WebSocketServer = require('./lib/websocket-server');\n\nWebSocket.createWebSocketStream = createWebSocketStream;\nWebSocket.extension = extension;\nWebSocket.PerMessageDeflate = PerMessageDeflate;\nWebSocket.Receiver = Receiver;\nWebSocket.Sender = Sender;\nWebSocket.Server = WebSocketServer;\nWebSocket.subprotocol = subprotocol;\nWebSocket.WebSocket = WebSocket;\nWebSocket.WebSocketServer = WebSocketServer;\n\nmodule.exports = WebSocket;\n","\"use strict\";\n\nmodule.exports = require('ws');","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ResilientWebSocket = void 0;\nconst isomorphic_ws_1 = __importDefault(require(\"isomorphic-ws\"));\nconst PING_TIMEOUT_DURATION = 30000 + 3000; // It is 30s on the server and 3s is added for delays\n/**\n * This class wraps websocket to provide a resilient web socket client.\n *\n * It will reconnect if connection fails with exponential backoff. Also, in node, it will reconnect\n * if it receives no ping request from server within a while as indication of timeout (assuming\n * the server sends it regularly).\n *\n * This class also logs events if logger is given and by replacing onError method you can handle\n * connection errors yourself (e.g: do not retry and close the connection).\n */\nclass ResilientWebSocket {\n endpoint;\n wsClient;\n wsUserClosed;\n wsFailedAttempts;\n pingTimeout;\n logger;\n onError;\n onMessage;\n onReconnect;\n constructor(endpoint, logger) {\n this.endpoint = endpoint;\n this.logger = logger;\n this.wsFailedAttempts = 0;\n this.onError = (error) => {\n this.logger?.error(error);\n };\n this.wsUserClosed = true;\n this.onMessage = () => { };\n this.onReconnect = () => { };\n }\n async send(data) {\n this.logger?.info(`Sending ${data}`);\n await this.waitForMaybeReadyWebSocket();\n if (this.wsClient === undefined) {\n this.logger?.error(\"Couldn't connect to the websocket server. Error callback is called.\");\n }\n else {\n this.wsClient?.send(data);\n }\n }\n async startWebSocket() {\n if (this.wsClient !== undefined) {\n return;\n }\n this.logger?.info(`Creating Web Socket client`);\n this.wsClient = new isomorphic_ws_1.default(this.endpoint);\n this.wsUserClosed = false;\n this.wsClient.onopen = () => {\n this.wsFailedAttempts = 0;\n // Ping handler is undefined in browser side so heartbeat is disabled.\n if (this.wsClient.on !== undefined) {\n this.heartbeat();\n }\n };\n this.wsClient.onerror = (event) => {\n this.onError(event.error);\n };\n this.wsClient.onmessage = (event) => {\n this.onMessage(event.data);\n };\n this.wsClient.onclose = async () => {\n if (this.pingTimeout !== undefined) {\n clearInterval(this.pingTimeout);\n }\n if (this.wsUserClosed === false) {\n this.wsFailedAttempts += 1;\n this.wsClient = undefined;\n const waitTime = expoBackoff(this.wsFailedAttempts);\n this.logger?.error(`Connection closed unexpectedly or because of timeout. Reconnecting after ${waitTime}ms.`);\n await sleep(waitTime);\n this.restartUnexpectedClosedWebsocket();\n }\n else {\n this.logger?.info(\"The connection has been closed successfully.\");\n }\n };\n if (this.wsClient.on !== undefined) {\n // Ping handler is undefined in browser side\n this.wsClient.on(\"ping\", this.heartbeat.bind(this));\n }\n }\n /**\n * Heartbeat is only enabled in node clients because they support handling\n * ping-pong events.\n *\n * This approach only works when server constantly pings the clients which.\n * Otherwise you might consider sending ping and acting on pong responses\n * yourself.\n */\n heartbeat() {\n this.logger?.info(\"Heartbeat\");\n if (this.pingTimeout !== undefined) {\n clearTimeout(this.pingTimeout);\n }\n this.pingTimeout = setTimeout(() => {\n this.logger?.warn(`Connection timed out. Reconnecting...`);\n this.wsClient?.terminate();\n this.restartUnexpectedClosedWebsocket();\n }, PING_TIMEOUT_DURATION);\n }\n async waitForMaybeReadyWebSocket() {\n let waitedTime = 0;\n while (this.wsClient !== undefined &&\n this.wsClient.readyState !== this.wsClient.OPEN) {\n if (waitedTime > 5000) {\n this.wsClient.close();\n return;\n }\n else {\n waitedTime += 10;\n await sleep(10);\n }\n }\n }\n async restartUnexpectedClosedWebsocket() {\n if (this.wsUserClosed === true) {\n return;\n }\n await this.startWebSocket();\n await this.waitForMaybeReadyWebSocket();\n if (this.wsClient === undefined) {\n this.logger?.error(\"Couldn't reconnect to websocket. Error callback is called.\");\n return;\n }\n this.onReconnect();\n }\n closeWebSocket() {\n if (this.wsClient !== undefined) {\n const client = this.wsClient;\n this.wsClient = undefined;\n client.close();\n }\n this.wsUserClosed = true;\n }\n}\nexports.ResilientWebSocket = ResilientWebSocket;\nasync function sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\nfunction expoBackoff(attempts) {\n return 2 ** attempts * 100;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.removeLeading0xIfExists = exports.makeWebsocketUrl = void 0;\n/**\n * Convert http(s) endpoint to ws(s) endpoint.\n *\n * @param endpoint Http(s) protocol endpoint\n * @returns Ws(s) protocol endpoint of the same address\n */\nfunction makeWebsocketUrl(endpoint) {\n const url = new URL(\"ws\", endpoint);\n const useHttps = url.protocol === \"https:\";\n url.protocol = useHttps ? \"wss:\" : \"ws:\";\n return url.toString();\n}\nexports.makeWebsocketUrl = makeWebsocketUrl;\nfunction removeLeading0xIfExists(id) {\n if (id.startsWith(\"0x\")) {\n return id.substring(2);\n }\n else {\n return id;\n }\n}\nexports.removeLeading0xIfExists = removeLeading0xIfExists;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PriceServiceConnection = void 0;\nconst price_service_sdk_1 = require(\"@pythnetwork/price-service-sdk\");\nconst axios_1 = __importDefault(require(\"axios\"));\nconst axios_retry_1 = __importDefault(require(\"axios-retry\"));\nconst ResillientWebSocket_1 = require(\"./ResillientWebSocket\");\nconst utils_1 = require(\"./utils\");\nclass PriceServiceConnection {\n httpClient;\n priceFeedCallbacks;\n wsClient;\n wsEndpoint;\n logger;\n priceFeedRequestConfig;\n /**\n * Custom handler for web socket errors (connection and message parsing).\n *\n * Default handler only logs the errors.\n */\n onWsError;\n /**\n * Constructs a new Connection.\n *\n * @param endpoint endpoint URL to the price service. Example: https://website/example/\n * @param config Optional PriceServiceConnectionConfig for custom configurations.\n */\n constructor(endpoint, config) {\n this.httpClient = axios_1.default.create({\n baseURL: endpoint,\n timeout: config?.timeout || 5000,\n });\n (0, axios_retry_1.default)(this.httpClient, {\n retries: config?.httpRetries || 3,\n retryDelay: axios_retry_1.default.exponentialDelay,\n });\n this.priceFeedRequestConfig = {\n binary: config?.priceFeedRequestConfig?.binary,\n verbose: config?.priceFeedRequestConfig?.verbose ?? config?.verbose,\n allowOutOfOrder: config?.priceFeedRequestConfig?.allowOutOfOrder,\n };\n this.priceFeedCallbacks = new Map();\n // Default logger is console for only warnings and errors.\n this.logger = config?.logger || {\n trace: () => { },\n debug: () => { },\n info: () => { },\n warn: console.warn,\n error: console.error,\n };\n this.onWsError = (error) => {\n this.logger.error(error);\n // Exit the process if it is running in node.\n if (typeof process !== \"undefined\" &&\n typeof process.exit === \"function\") {\n this.logger.error(\"Halting the process due to the websocket error\");\n process.exit(1);\n }\n else {\n this.logger.error(\"Cannot halt process. Please handle the websocket error.\");\n }\n };\n this.wsEndpoint = (0, utils_1.makeWebsocketUrl)(endpoint);\n }\n /**\n * Fetch Latest PriceFeeds of given price ids.\n * This will throw an axios error if there is a network problem or the price service returns a non-ok response (e.g: Invalid price ids)\n *\n * @param priceIds Array of hex-encoded price ids.\n * @returns Array of PriceFeeds\n */\n async getLatestPriceFeeds(priceIds) {\n if (priceIds.length === 0) {\n return [];\n }\n const response = await this.httpClient.get(\"/api/latest_price_feeds\", {\n params: {\n ids: priceIds,\n verbose: this.priceFeedRequestConfig.verbose,\n binary: this.priceFeedRequestConfig.binary,\n },\n });\n const priceFeedsJson = response.data;\n return priceFeedsJson.map((priceFeedJson) => price_service_sdk_1.PriceFeed.fromJson(priceFeedJson));\n }\n /**\n * Fetch latest VAA of given price ids.\n * This will throw an axios error if there is a network problem or the price service returns a non-ok response (e.g: Invalid price ids)\n *\n * This function is coupled to wormhole implemntation.\n *\n * @param priceIds Array of hex-encoded price ids.\n * @returns Array of base64 encoded VAAs.\n */\n async getLatestVaas(priceIds) {\n const response = await this.httpClient.get(\"/api/latest_vaas\", {\n params: {\n ids: priceIds,\n },\n });\n return response.data;\n }\n /**\n * Fetch the earliest VAA of the given price id that is published since the given publish time.\n * This will throw an error if the given publish time is in the future, or if the publish time\n * is old and the price service endpoint does not have a db backend for historical requests.\n * This will throw an axios error if there is a network problem or the price service returns a non-ok response (e.g: Invalid price id)\n *\n * This function is coupled to wormhole implemntation.\n *\n * @param priceId Hex-encoded price id.\n * @param publishTime Epoch timestamp in seconds.\n * @returns Tuple of VAA and publishTime.\n */\n async getVaa(priceId, publishTime) {\n const response = await this.httpClient.get(\"/api/get_vaa\", {\n params: {\n id: priceId,\n publish_time: publishTime,\n },\n });\n return [response.data.vaa, response.data.publishTime];\n }\n /**\n * Fetch the PriceFeed of the given price id that is published since the given publish time.\n * This will throw an error if the given publish time is in the future, or if the publish time\n * is old and the price service endpoint does not have a db backend for historical requests.\n * This will throw an axios error if there is a network problem or the price service returns a non-ok response (e.g: Invalid price id)\n *\n * @param priceId Hex-encoded price id.\n * @param publishTime Epoch timestamp in seconds.\n * @returns PriceFeed\n */\n async getPriceFeed(priceId, publishTime) {\n const response = await this.httpClient.get(\"/api/get_price_feed\", {\n params: {\n id: priceId,\n publish_time: publishTime,\n verbose: this.priceFeedRequestConfig.verbose,\n binary: this.priceFeedRequestConfig.binary,\n },\n });\n return price_service_sdk_1.PriceFeed.fromJson(response.data);\n }\n /**\n * Fetch the list of available price feed ids.\n * This will throw an axios error if there is a network problem or the price service returns a non-ok response.\n *\n * @returns Array of hex-encoded price ids.\n */\n async getPriceFeedIds() {\n const response = await this.httpClient.get(\"/api/price_feed_ids\");\n return response.data;\n }\n /**\n * Subscribe to updates for given price ids.\n *\n * It will start a websocket connection if it's not started yet.\n * Also, it won't throw any exception if given price ids are invalid or connection errors. Instead,\n * it calls `connection.onWsError`. If you want to handle the errors you should set the\n * `onWsError` function to your custom error handler.\n *\n * @param priceIds Array of hex-encoded price ids.\n * @param cb Callback function that is called with a PriceFeed upon updates to given price ids.\n */\n async subscribePriceFeedUpdates(priceIds, cb) {\n if (this.wsClient === undefined) {\n await this.startWebSocket();\n }\n priceIds = priceIds.map((priceId) => (0, utils_1.removeLeading0xIfExists)(priceId));\n const newPriceIds = [];\n for (const id of priceIds) {\n if (!this.priceFeedCallbacks.has(id)) {\n this.priceFeedCallbacks.set(id, new Set());\n newPriceIds.push(id);\n }\n this.priceFeedCallbacks.get(id).add(cb);\n }\n const message = {\n ids: newPriceIds,\n type: \"subscribe\",\n verbose: this.priceFeedRequestConfig.verbose,\n binary: this.priceFeedRequestConfig.binary,\n allow_out_of_order: this.priceFeedRequestConfig.allowOutOfOrder,\n };\n await this.wsClient?.send(JSON.stringify(message));\n }\n /**\n * Unsubscribe from updates for given price ids.\n *\n * It will close the websocket connection if it's not subscribed to any price feed updates anymore.\n * Also, it won't throw any exception if given price ids are invalid or connection errors. Instead,\n * it calls `connection.onWsError`. If you want to handle the errors you should set the\n * `onWsError` function to your custom error handler.\n *\n * @param priceIds Array of hex-encoded price ids.\n * @param cb Optional callback, if set it will only unsubscribe this callback from updates for given price ids.\n */\n async unsubscribePriceFeedUpdates(priceIds, cb) {\n if (this.wsClient === undefined) {\n await this.startWebSocket();\n }\n priceIds = priceIds.map((priceId) => (0, utils_1.removeLeading0xIfExists)(priceId));\n const removedPriceIds = [];\n for (const id of priceIds) {\n if (this.priceFeedCallbacks.has(id)) {\n let idRemoved = false;\n if (cb === undefined) {\n this.priceFeedCallbacks.delete(id);\n idRemoved = true;\n }\n else {\n this.priceFeedCallbacks.get(id).delete(cb);\n if (this.priceFeedCallbacks.get(id).size === 0) {\n this.priceFeedCallbacks.delete(id);\n idRemoved = true;\n }\n }\n if (idRemoved) {\n removedPriceIds.push(id);\n }\n }\n }\n const message = {\n ids: removedPriceIds,\n type: \"unsubscribe\",\n };\n await this.wsClient?.send(JSON.stringify(message));\n if (this.priceFeedCallbacks.size === 0) {\n this.closeWebSocket();\n }\n }\n /**\n * Starts connection websocket.\n *\n * This function is called automatically upon subscribing to price feed updates.\n */\n async startWebSocket() {\n if (this.wsEndpoint === undefined) {\n throw new Error(\"Websocket endpoint is undefined.\");\n }\n this.wsClient = new ResillientWebSocket_1.ResilientWebSocket(this.wsEndpoint, this.logger);\n this.wsClient.onError = this.onWsError;\n this.wsClient.onReconnect = () => {\n if (this.priceFeedCallbacks.size > 0) {\n const message = {\n ids: Array.from(this.priceFeedCallbacks.keys()),\n type: \"subscribe\",\n verbose: this.priceFeedRequestConfig.verbose,\n binary: this.priceFeedRequestConfig.binary,\n allow_out_of_order: this.priceFeedRequestConfig.allowOutOfOrder,\n };\n this.logger.info(\"Resubscribing to existing price feeds.\");\n this.wsClient?.send(JSON.stringify(message));\n }\n };\n this.wsClient.onMessage = (data) => {\n this.logger.info(`Received message ${data.toString()}`);\n let message;\n try {\n message = JSON.parse(data.toString());\n }\n catch (e) {\n this.logger.error(`Error parsing message ${data.toString()} as JSON.`);\n this.logger.error(e);\n this.onWsError(e);\n return;\n }\n if (message.type === \"response\") {\n if (message.status === \"error\") {\n this.logger.error(`Error response from the websocket server ${message.error}.`);\n this.onWsError(new Error(message.error));\n }\n }\n else if (message.type === \"price_update\") {\n let priceFeed;\n try {\n priceFeed = price_service_sdk_1.PriceFeed.fromJson(message.price_feed);\n }\n catch (e) {\n this.logger.error(`Error parsing price feeds from message ${data.toString()}.`);\n this.logger.error(e);\n this.onWsError(e);\n return;\n }\n if (this.priceFeedCallbacks.has(priceFeed.id)) {\n for (const cb of this.priceFeedCallbacks.get(priceFeed.id)) {\n cb(priceFeed);\n }\n }\n }\n else {\n this.logger.warn(`Ignoring unsupported server response ${data.toString()}.`);\n }\n };\n await this.wsClient.startWebSocket();\n }\n /**\n * Closes connection websocket.\n *\n * At termination, the websocket should be closed to finish the\n * process elegantly. It will automatically close when the connection\n * is subscribed to no price feeds.\n */\n closeWebSocket() {\n this.wsClient?.closeWebSocket();\n this.wsClient = undefined;\n this.priceFeedCallbacks.clear();\n }\n}\nexports.PriceServiceConnection = PriceServiceConnection;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseAccumulatorUpdateData = exports.isAccumulatorUpdateData = exports.Price = exports.PriceFeed = exports.PriceFeedMetadata = exports.PriceServiceConnection = void 0;\nvar PriceServiceConnection_1 = require(\"./PriceServiceConnection\");\nObject.defineProperty(exports, \"PriceServiceConnection\", { enumerable: true, get: function () { return PriceServiceConnection_1.PriceServiceConnection; } });\nvar price_service_sdk_1 = require(\"@pythnetwork/price-service-sdk\");\nObject.defineProperty(exports, \"PriceFeedMetadata\", { enumerable: true, get: function () { return price_service_sdk_1.PriceFeedMetadata; } });\nObject.defineProperty(exports, \"PriceFeed\", { enumerable: true, get: function () { return price_service_sdk_1.PriceFeed; } });\nObject.defineProperty(exports, \"Price\", { enumerable: true, get: function () { return price_service_sdk_1.Price; } });\nObject.defineProperty(exports, \"isAccumulatorUpdateData\", { enumerable: true, get: function () { return price_service_sdk_1.isAccumulatorUpdateData; } });\nObject.defineProperty(exports, \"parseAccumulatorUpdateData\", { enumerable: true, get: function () { return price_service_sdk_1.parseAccumulatorUpdateData; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SuiPriceServiceConnection = void 0;\nconst price_service_client_1 = require(\"@pythnetwork/price-service-client\");\nconst buffer_1 = require(\"buffer\");\nclass SuiPriceServiceConnection extends price_service_client_1.PriceServiceConnection {\n /**\n * Gets price update data (either batch price attestation VAAs or accumulator messages, depending on the chosen endpoint), which then\n * can be submitted to the Pyth contract to update the prices. This will throw an axios error if there is a network problem or\n * the price service returns a non-ok response (e.g: Invalid price ids)\n *\n * @param priceIds Array of hex-encoded price ids.\n * @returns Array of buffers containing the price update data.\n */\n async getPriceFeedsUpdateData(priceIds) {\n // Fetch the latest price feed update VAAs from the price service\n const latestVaas = await this.getLatestVaas(priceIds);\n return latestVaas.map((vaa) => buffer_1.Buffer.from(vaa, \"base64\"));\n }\n}\nexports.SuiPriceServiceConnection = SuiPriceServiceConnection;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SuiPythClient = void 0;\nconst utils_1 = require(\"@mysten/sui/utils\");\nconst bcs_1 = require(\"@mysten/sui/bcs\");\nconst buffer_1 = require(\"buffer\");\nconst MAX_ARGUMENT_SIZE = 16 * 1024;\nclass SuiPythClient {\n provider;\n pythStateId;\n wormholeStateId;\n pythPackageId;\n wormholePackageId;\n priceTableInfo;\n priceFeedObjectIdCache = new Map();\n baseUpdateFee;\n constructor(provider, pythStateId, wormholeStateId) {\n this.provider = provider;\n this.pythStateId = pythStateId;\n this.wormholeStateId = wormholeStateId;\n this.pythPackageId = undefined;\n this.wormholePackageId = undefined;\n }\n async getBaseUpdateFee() {\n if (this.baseUpdateFee === undefined) {\n const result = await this.provider.getObject({\n id: this.pythStateId,\n options: { showContent: true },\n });\n if (!result.data ||\n !result.data.content ||\n result.data.content.dataType !== \"moveObject\")\n throw new Error(\"Unable to fetch pyth state object\");\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.baseUpdateFee = result.data.content.fields.base_update_fee;\n }\n return this.baseUpdateFee;\n }\n /**\n * getPackageId returns the latest package id that the object belongs to. Use this to\n * fetch the latest package id for a given object id and handle package upgrades automatically.\n * @param objectId\n * @returns package id\n */\n async getPackageId(objectId) {\n const state = await this.provider\n .getObject({\n id: objectId,\n options: {\n showContent: true,\n },\n })\n .then((result) => {\n if (result.data?.content?.dataType == \"moveObject\") {\n return result.data.content.fields;\n }\n console.log(result.data?.content);\n throw new Error(`Cannot fetch package id for object ${objectId}`);\n });\n if (\"upgrade_cap\" in state) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return state.upgrade_cap.fields.package;\n }\n throw new Error(\"upgrade_cap not found\");\n }\n /**\n * Adds the commands for calling wormhole and verifying the vaas and returns the verified vaas.\n * @param vaas array of vaas to verify\n * @param tx transaction block to add commands to\n */\n async verifyVaas(vaas, tx) {\n const wormholePackageId = await this.getWormholePackageId();\n const verifiedVaas = [];\n for (const vaa of vaas) {\n const [verifiedVaa] = tx.moveCall({\n target: `${wormholePackageId}::vaa::parse_and_verify`,\n arguments: [\n tx.object(this.wormholeStateId),\n tx.pure(bcs_1.bcs\n .vector(bcs_1.bcs.U8)\n .serialize(Array.from(vaa), {\n maxSize: MAX_ARGUMENT_SIZE,\n })\n .toBytes()),\n tx.object(utils_1.SUI_CLOCK_OBJECT_ID),\n ],\n });\n verifiedVaas.push(verifiedVaa);\n }\n return verifiedVaas;\n }\n async verifyVaasAndGetHotPotato(tx, updates, packageId) {\n if (updates.length > 1) {\n throw new Error(\"SDK does not support sending multiple accumulator messages in a single transaction\");\n }\n const vaa = this.extractVaaBytesFromAccumulatorMessage(updates[0]);\n const verifiedVaas = await this.verifyVaas([vaa], tx);\n const [priceUpdatesHotPotato] = tx.moveCall({\n target: `${packageId}::pyth::create_authenticated_price_infos_using_accumulator`,\n arguments: [\n tx.object(this.pythStateId),\n tx.pure(bcs_1.bcs\n .vector(bcs_1.bcs.U8)\n .serialize(Array.from(updates[0]), {\n maxSize: MAX_ARGUMENT_SIZE,\n })\n .toBytes()),\n verifiedVaas[0],\n tx.object(utils_1.SUI_CLOCK_OBJECT_ID),\n ],\n });\n return priceUpdatesHotPotato;\n }\n async executePriceFeedUpdates(tx, packageId, feedIds, priceUpdatesHotPotato, coins) {\n const priceInfoObjects = [];\n let coinId = 0;\n for (const feedId of feedIds) {\n const priceInfoObjectId = await this.getPriceFeedObjectId(feedId);\n if (!priceInfoObjectId) {\n throw new Error(`Price feed ${feedId} not found, please create it first`);\n }\n priceInfoObjects.push(priceInfoObjectId);\n [priceUpdatesHotPotato] = tx.moveCall({\n target: `${packageId}::pyth::update_single_price_feed`,\n arguments: [\n tx.object(this.pythStateId),\n priceUpdatesHotPotato,\n tx.object(priceInfoObjectId),\n coins[coinId],\n tx.object(utils_1.SUI_CLOCK_OBJECT_ID),\n ],\n });\n coinId++;\n }\n tx.moveCall({\n target: `${packageId}::hot_potato_vector::destroy`,\n arguments: [priceUpdatesHotPotato],\n typeArguments: [`${packageId}::price_info::PriceInfo`],\n });\n return priceInfoObjects;\n }\n /**\n * Adds the necessary commands for updating the pyth price feeds to the transaction block.\n * @param tx transaction block to add commands to\n * @param updates array of price feed updates received from the price service\n * @param feedIds array of feed ids to update (in hex format)\n */\n async updatePriceFeeds(tx, updates, feedIds) {\n const packageId = await this.getPythPackageId();\n const priceUpdatesHotPotato = await this.verifyVaasAndGetHotPotato(tx, updates, packageId);\n const baseUpdateFee = await this.getBaseUpdateFee();\n const coins = tx.splitCoins(tx.gas, feedIds.map(() => tx.pure.u64(baseUpdateFee)));\n return await this.executePriceFeedUpdates(tx, packageId, feedIds, priceUpdatesHotPotato, coins);\n }\n /**\n * Updates price feeds using the coin input for payment. Coins can be generated by calling splitCoin on tx.gas.\n * @param tx transaction block to add commands to\n * @param updates array of price feed updates received from the price service\n * @param feedIds array of feed ids to update (in hex format)\n * @param coins array of Coins for payment of update operations\n */\n async updatePriceFeedsWithCoins(tx, updates, feedIds, coins) {\n const packageId = await this.getPythPackageId();\n const priceUpdatesHotPotato = await this.verifyVaasAndGetHotPotato(tx, updates, packageId);\n return await this.executePriceFeedUpdates(tx, packageId, feedIds, priceUpdatesHotPotato, coins);\n }\n async createPriceFeed(tx, updates) {\n const packageId = await this.getPythPackageId();\n if (updates.length > 1) {\n throw new Error(\"SDK does not support sending multiple accumulator messages in a single transaction\");\n }\n const vaa = this.extractVaaBytesFromAccumulatorMessage(updates[0]);\n const verifiedVaas = await this.verifyVaas([vaa], tx);\n tx.moveCall({\n target: `${packageId}::pyth::create_price_feeds_using_accumulator`,\n arguments: [\n tx.object(this.pythStateId),\n tx.pure(bcs_1.bcs\n .vector(bcs_1.bcs.U8)\n .serialize(Array.from(updates[0]), {\n maxSize: MAX_ARGUMENT_SIZE,\n })\n .toBytes()),\n verifiedVaas[0],\n tx.object(utils_1.SUI_CLOCK_OBJECT_ID),\n ],\n });\n }\n /**\n * Get the packageId for the wormhole package if not already cached\n */\n async getWormholePackageId() {\n if (!this.wormholePackageId) {\n this.wormholePackageId = await this.getPackageId(this.wormholeStateId);\n }\n return this.wormholePackageId;\n }\n /**\n * Get the packageId for the pyth package if not already cached\n */\n async getPythPackageId() {\n if (!this.pythPackageId) {\n this.pythPackageId = await this.getPackageId(this.pythStateId);\n }\n return this.pythPackageId;\n }\n /**\n * Get the priceFeedObjectId for a given feedId if not already cached\n * @param feedId\n */\n async getPriceFeedObjectId(feedId) {\n const normalizedFeedId = feedId.replace(\"0x\", \"\");\n if (!this.priceFeedObjectIdCache.has(normalizedFeedId)) {\n const { id: tableId, fieldType } = await this.getPriceTableInfo();\n const result = await this.provider.getDynamicFieldObject({\n parentId: tableId,\n name: {\n type: `${fieldType}::price_identifier::PriceIdentifier`,\n value: {\n bytes: Array.from(buffer_1.Buffer.from(normalizedFeedId, \"hex\")),\n },\n },\n });\n if (!result.data || !result.data.content) {\n return undefined;\n }\n if (result.data.content.dataType !== \"moveObject\") {\n throw new Error(\"Price feed type mismatch\");\n }\n this.priceFeedObjectIdCache.set(normalizedFeedId, \n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n result.data.content.fields.value);\n }\n return this.priceFeedObjectIdCache.get(normalizedFeedId);\n }\n /**\n * Fetches the price table object id for the current state id if not cached\n * @returns price table object id\n */\n async getPriceTableInfo() {\n if (this.priceTableInfo === undefined) {\n const result = await this.provider.getDynamicFieldObject({\n parentId: this.pythStateId,\n name: {\n type: \"vector<u8>\",\n value: \"price_info\",\n },\n });\n if (!result.data || !result.data.type) {\n throw new Error(\"Price Table not found, contract may not be initialized\");\n }\n let type = result.data.type.replace(\"0x2::table::Table<\", \"\");\n type = type.replace(\"::price_identifier::PriceIdentifier, 0x2::object::ID>\", \"\");\n this.priceTableInfo = { id: result.data.objectId, fieldType: type };\n }\n return this.priceTableInfo;\n }\n /**\n * Obtains the vaa bytes embedded in an accumulator message.\n * @param accumulatorMessage - the accumulator price update message\n * @returns vaa bytes as a uint8 array\n */\n extractVaaBytesFromAccumulatorMessage(accumulatorMessage) {\n // the first 6 bytes in the accumulator message encode the header, major, and minor bytes\n // we ignore them, since we are only interested in the VAA bytes\n const trailingPayloadSize = accumulatorMessage.readUint8(6);\n const vaaSizeOffset = 7 + // header bytes (header(4) + major(1) + minor(1) + trailing payload size(1))\n trailingPayloadSize + // trailing payload (variable number of bytes)\n 1; // proof_type (1 byte)\n const vaaSize = accumulatorMessage.readUint16BE(vaaSizeOffset);\n const vaaOffset = vaaSizeOffset + 2;\n return accumulatorMessage.subarray(vaaOffset, vaaOffset + vaaSize);\n }\n}\nexports.SuiPythClient = SuiPythClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PriceFeed = exports.Price = exports.SuiPythClient = exports.SuiPriceServiceConnection = void 0;\nvar SuiPriceServiceConnection_1 = require(\"./SuiPriceServiceConnection\");\nObject.defineProperty(exports, \"SuiPriceServiceConnection\", { enumerable: true, get: function () { return SuiPriceServiceConnection_1.SuiPriceServiceConnection; } });\nvar client_1 = require(\"./client\");\nObject.defineProperty(exports, \"SuiPythClient\", { enumerable: true, get: function () { return client_1.SuiPythClient; } });\nvar price_service_client_1 = require(\"@pythnetwork/price-service-client\");\nObject.defineProperty(exports, \"Price\", { enumerable: true, get: function () { return price_service_client_1.Price; } });\nObject.defineProperty(exports, \"PriceFeed\", { enumerable: true, get: function () { return price_service_client_1.PriceFeed; } });\n","import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport class PaymentKitClientError extends Error {}\n\nexport class PaymentKitUriError extends PaymentKitClientError {}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PaymentKitPackageConfig } from './types.js';\nimport { SUI_TYPE_ARG, normalizeStructTag } from '@mysten/sui/utils';\n\nexport const TESTNET_PAYMENT_KIT_PACKAGE_CONFIG = {\n\tpackageId: '0x7e069abe383e80d32f2aec17b3793da82aabc8c2edf84abbf68dd7b719e71497',\n\tnamespaceId: '0xa5016862fdccba7cc576b56cc5a391eda6775200aaa03a6b3c97d512312878db',\n} satisfies PaymentKitPackageConfig;\n\nexport const MAINNET_PAYMENT_KIT_PACKAGE_CONFIG = {\n\tpackageId: '0xbc126f1535fba7d641cb9150ad9eae93b104972586ba20f3c60bfe0e53b69bc6',\n\tnamespaceId: '0xccd3e4c7802921991cd9ce488c4ca0b51334ba75483702744242284ccf3ae7c2',\n} satisfies PaymentKitPackageConfig;\n\nexport const SUI_COIN_TYPE = normalizeStructTag(SUI_TYPE_ARG);\nexport const DEFAULT_REGISTRY_NAME = 'default-payment-registry';\n\nexport const SUI_PAYMENT_KIT_PROTOCOL = 'sui:pay';\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { isValidNamedType, isValidSuiAddress, isValidSuiObjectId } from '@mysten/sui/utils';\nimport type { PaymentUriParams } from './types.js';\nimport { PaymentKitUriError } from './error.js';\nimport { SUI_PAYMENT_KIT_PROTOCOL } from './constants.js';\n\nconst isValidNonce = (nonce: string) => {\n\treturn nonce.length <= 36;\n};\n\nconst isValidAmount = (amount: bigint) => {\n\treturn amount > 0n;\n};\n\nconst isValidCoinType = (coinType: string) => {\n\treturn isValidNamedType(coinType);\n};\n\n/**\n * Create a payment transaction URI from the given parameters.\n * Returns the constructed URI string.\n *\n * @example\n * ```ts\n * const uri = createPaymentTransactionUri({\n * receiverAddress: \"0x...\",\n * amount: \"10000000\", (0.01 SUI)\n * coinType: \"0x2::sui::SUI\",\n * nonce: <nonce>,\n * registryName: \"my-registry\"\n * });\n * ```\n */\nexport const createPaymentTransactionUri = (params: PaymentUriParams): string => {\n\tconst { receiverAddress, amount, coinType, nonce, registryId, registryName } = params;\n\n\tconst uri = new URL(SUI_PAYMENT_KIT_PROTOCOL);\n\n\tif (isValidSuiAddress(receiverAddress)) {\n\t\turi.searchParams.append('receiver', receiverAddress);\n\t} else {\n\t\tthrow new PaymentKitUriError('Invalid Sui address');\n\t}\n\n\tif (isValidAmount(amount)) {\n\t\turi.searchParams.append('amount', amount.toString());\n\t} else {\n\t\tthrow new PaymentKitUriError('Amount must be a positive numeric string');\n\t}\n\n\tif (isValidCoinType(coinType)) {\n\t\turi.searchParams.append('coinType', coinType);\n\t} else {\n\t\tthrow new PaymentKitUriError('Invalid Coin Type');\n\t}\n\n\tif (isValidNonce(nonce)) {\n\t\turi.searchParams.append('nonce', nonce);\n\t} else {\n\t\tthrow new PaymentKitUriError('Nonce length exceeds maximum of 36 characters');\n\t}\n\n\tif (registryId) {\n\t\tif (isValidSuiObjectId(registryId)) {\n\t\t\turi.searchParams.append('registry', registryId);\n\t\t} else {\n\t\t\tthrow new PaymentKitUriError('Invalid Sui Object Id for Registry Id');\n\t\t}\n\t}\n\n\tif (registryName) {\n\t\turi.searchParams.append('registry', registryName);\n\t}\n\n\tif (params.label) {\n\t\turi.searchParams.append('label', params.label);\n\t}\n\n\tif (params.message) {\n\t\turi.searchParams.append('message', params.message);\n\t}\n\n\tif (params.iconUrl) {\n\t\turi.searchParams.append('iconUrl', params.iconUrl);\n\t}\n\n\treturn uri.toString();\n};\n\n/**\n * Parse a payment transaction URI into its components.\n * Returns the parsed payment URI parameters.\n *\n * @example\n * ```ts\n * const params = parsePaymentTransactionUri(\"sui:0x...?amount=1000000&coinType=0x...&nonce=...\");\n * ```\n */\nexport const parsePaymentTransactionUri = (uri: string): PaymentUriParams => {\n\tif (!uri.startsWith(SUI_PAYMENT_KIT_PROTOCOL + '?')) {\n\t\tthrow new PaymentKitUriError('Invalid URI: Must start with sui:pay?');\n\t}\n\n\tconst url = new URL(uri);\n\n\t// Extract query parameters\n\tconst params = url.searchParams;\n\tconst receiver = params.get('receiver');\n\tconst amount = params.get('amount');\n\tconst coinType = params.get('coinType');\n\tconst nonce = params.get('nonce');\n\n\t// Amount and CoinType are required\n\tif (!receiver || !amount || !coinType || !nonce) {\n\t\tthrow new PaymentKitUriError('Invalid URI: Missing required parameters');\n\t}\n\n\t// Validate the receiver address\n\tif (!isValidSuiAddress(receiver)) {\n\t\tthrow new PaymentKitUriError('Invalid URI: Receiver address is not valid');\n\t}\n\n\tif (!isValidCoinType(coinType)) {\n\t\tthrow new PaymentKitUriError('Invalid URI: Coin Type is not valid');\n\t}\n\n\tif (!isValidNonce(nonce)) {\n\t\tthrow new PaymentKitUriError('Invalid URI: Nonce length exceeds maximum of 36 characters');\n\t}\n\n\t// Validate amount is a valid numeric string (int or float) and positive\n\tconst bigIntAmount = BigInt(amount);\n\tif (!isValidAmount(bigIntAmount)) {\n\t\tthrow new PaymentKitUriError('Invalid URI: Amount must be a positive number');\n\t}\n\n\t// Extract optional registry parameter\n\tconst registry = params.get('registry') ?? undefined;\n\n\t// Determine if registry is an ID or name\n\tlet registryId: string | undefined;\n\tlet registryName: string | undefined;\n\n\tif (registry) {\n\t\tif (isValidSuiObjectId(registry)) {\n\t\t\tregistryId = registry;\n\t\t} else {\n\t\t\tregistryName = registry;\n\t\t}\n\t}\n\n\tconst baseParams = {\n\t\treceiverAddress: receiver,\n\t\tamount: bigIntAmount,\n\t\tcoinType,\n\t\tnonce: nonce,\n\t\tlabel: params.get('label') ?? undefined,\n\t\tmessage: params.get('message') ?? undefined,\n\t\ticonUrl: params.get('iconUrl') ?? undefined,\n\t};\n\n\tif (registryId) {\n\t\treturn { ...baseParams, registryId };\n\t}\n\n\treturn { ...baseParams, registryName };\n};\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '../bcs/index.js';\n\nexport type IntentScope = Exclude<keyof typeof bcs.IntentScope.$inferType, '$kind'>;\n/**\n * Inserts a domain separator for a message that is being signed\n */\nexport function messageWithIntent(scope: IntentScope, message: Uint8Array) {\n\treturn bcs\n\t\t.IntentMessage(bcs.bytes(message.length))\n\t\t.serialize({\n\t\t\tintent: {\n\t\t\t\tscope: { [scope as 'PersonalMessage']: true },\n\t\t\t\tversion: { V0: true },\n\t\t\t\tappId: { Sui: true },\n\t\t\t},\n\t\t\tvalue: message,\n\t\t})\n\t\t.toBytes();\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64, toBase64 } from '@mysten/bcs';\nimport { blake2b } from '@noble/hashes/blake2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\n\nimport { bcs } from '../bcs/index.js';\nimport { normalizeSuiAddress, SUI_ADDRESS_LENGTH } from '../utils/sui-types.js';\nimport type { IntentScope } from './intent.js';\nimport { messageWithIntent } from './intent.js';\nimport { SIGNATURE_FLAG_TO_SCHEME, SIGNATURE_SCHEME_TO_SIZE } from './signature-scheme.js';\n\n/**\n * Value to be converted into public key.\n */\nexport type PublicKeyInitData = string | Uint8Array | Iterable<number>;\n\nexport function bytesEqual(a: Uint8Array, b: Uint8Array) {\n\tif (a === b) return true;\n\n\tif (a.length !== b.length) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0; i < a.length; i++) {\n\t\tif (a[i] !== b[i]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * A public key\n */\nexport abstract class PublicKey {\n\t/**\n\t * Checks if two public keys are equal\n\t */\n\tequals(publicKey: PublicKey) {\n\t\treturn bytesEqual(this.toRawBytes(), publicKey.toRawBytes());\n\t}\n\n\t/**\n\t * Return the base-64 representation of the public key\n\t */\n\ttoBase64() {\n\t\treturn toBase64(this.toRawBytes());\n\t}\n\n\ttoString(): never {\n\t\tthrow new Error(\n\t\t\t'`toString` is not implemented on public keys. Use `toBase64()` or `toRawBytes()` instead.',\n\t\t);\n\t}\n\n\t/**\n\t * Return the Sui representation of the public key encoded in\n\t * base-64. A Sui public key is formed by the concatenation\n\t * of the scheme flag with the raw bytes of the public key\n\t */\n\ttoSuiPublicKey(): string {\n\t\tconst bytes = this.toSuiBytes();\n\t\treturn toBase64(bytes);\n\t}\n\n\tverifyWithIntent(\n\t\tbytes: Uint8Array,\n\t\tsignature: Uint8Array | string,\n\t\tintent: IntentScope,\n\t): Promise<boolean> {\n\t\tconst intentMessage = messageWithIntent(intent, bytes);\n\t\tconst digest = blake2b(intentMessage, { dkLen: 32 });\n\n\t\treturn this.verify(digest, signature);\n\t}\n\n\t/**\n\t * Verifies that the signature is valid for for the provided PersonalMessage\n\t */\n\tverifyPersonalMessage(message: Uint8Array, signature: Uint8Array | string): Promise<boolean> {\n\t\treturn this.verifyWithIntent(\n\t\t\tbcs.byteVector().serialize(message).toBytes(),\n\t\t\tsignature,\n\t\t\t'PersonalMessage',\n\t\t);\n\t}\n\n\t/**\n\t * Verifies that the signature is valid for for the provided Transaction\n\t */\n\tverifyTransaction(transaction: Uint8Array, signature: Uint8Array | string): Promise<boolean> {\n\t\treturn this.verifyWithIntent(transaction, signature, 'TransactionData');\n\t}\n\n\t/**\n\t * Verifies that the public key is associated with the provided address\n\t */\n\tverifyAddress(address: string): boolean {\n\t\treturn this.toSuiAddress() === address;\n\t}\n\n\t/**\n\t * Returns the bytes representation of the public key\n\t * prefixed with the signature scheme flag\n\t */\n\ttoSuiBytes(): Uint8Array<ArrayBuffer> {\n\t\tconst rawBytes = this.toRawBytes();\n\t\tconst suiBytes = new Uint8Array(rawBytes.length + 1);\n\t\tsuiBytes.set([this.flag()]);\n\t\tsuiBytes.set(rawBytes, 1);\n\n\t\treturn suiBytes;\n\t}\n\n\t/**\n\t * Return the Sui address associated with this Ed25519 public key\n\t */\n\ttoSuiAddress(): string {\n\t\t// Each hex char represents half a byte, hence hex address doubles the length\n\t\treturn normalizeSuiAddress(\n\t\t\tbytesToHex(blake2b(this.toSuiBytes(), { dkLen: 32 })).slice(0, SUI_ADDRESS_LENGTH * 2),\n\t\t);\n\t}\n\n\t/**\n\t * Return the byte array representation of the public key\n\t */\n\tabstract toRawBytes(): Uint8Array<ArrayBuffer>;\n\n\t/**\n\t * Return signature scheme flag of the public key\n\t */\n\tabstract flag(): number;\n\n\t/**\n\t * Verifies that the signature is valid for for the provided message\n\t */\n\tabstract verify(data: Uint8Array, signature: Uint8Array | string): Promise<boolean>;\n}\n\nexport function parseSerializedKeypairSignature(serializedSignature: string) {\n\tconst bytes = fromBase64(serializedSignature);\n\n\tconst signatureScheme =\n\t\tSIGNATURE_FLAG_TO_SCHEME[bytes[0] as keyof typeof SIGNATURE_FLAG_TO_SCHEME];\n\n\tswitch (signatureScheme) {\n\t\tcase 'ED25519':\n\t\tcase 'Secp256k1':\n\t\tcase 'Secp256r1':\n\t\t\tconst size =\n\t\t\t\tSIGNATURE_SCHEME_TO_SIZE[signatureScheme as keyof typeof SIGNATURE_SCHEME_TO_SIZE];\n\t\t\tconst signature = bytes.slice(1, bytes.length - size);\n\t\t\tconst publicKey = bytes.slice(1 + signature.length);\n\n\t\t\treturn {\n\t\t\t\tserializedSignature,\n\t\t\t\tsignatureScheme,\n\t\t\t\tsignature,\n\t\t\t\tpublicKey,\n\t\t\t\tbytes,\n\t\t\t};\n\t\tdefault:\n\t\t\tthrow new Error('Unsupported signature scheme');\n\t}\n}\n","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://www.rfc-editor.org/rfc/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from './_md.ts';\nimport * as u64 from './_u64.ts';\nimport { type CHash, clean, createHasher, oidNist, rotr } from './utils.ts';\n\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\n\n/** Internal 32-byte base SHA2 hash class. */\nabstract class SHA2_32B<T extends SHA2_32B<T>> extends HashMD<T> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected abstract A: number;\n protected abstract B: number;\n protected abstract C: number;\n protected abstract D: number;\n protected abstract E: number;\n protected abstract F: number;\n protected abstract G: number;\n protected abstract H: number;\n\n constructor(outputLen: number) {\n super(64, outputLen, 8, false);\n }\n protected get(): [number, number, number, number, number, number, number, number] {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n protected set(\n A: number, B: number, C: number, D: number, E: number, F: number, G: number, H: number\n ): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n protected roundClean(): void {\n clean(SHA256_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\n/** Internal SHA2-256 hash class. */\nexport class _SHA256 extends SHA2_32B<_SHA256> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected A: number = SHA256_IV[0] | 0;\n protected B: number = SHA256_IV[1] | 0;\n protected C: number = SHA256_IV[2] | 0;\n protected D: number = SHA256_IV[3] | 0;\n protected E: number = SHA256_IV[4] | 0;\n protected F: number = SHA256_IV[5] | 0;\n protected G: number = SHA256_IV[6] | 0;\n protected H: number = SHA256_IV[7] | 0;\n constructor() {\n super(32);\n }\n}\n\n/** Internal SHA2-224 hash class. */\nexport class _SHA224 extends SHA2_32B<_SHA224> {\n protected A: number = SHA224_IV[0] | 0;\n protected B: number = SHA224_IV[1] | 0;\n protected C: number = SHA224_IV[2] | 0;\n protected D: number = SHA224_IV[3] | 0;\n protected E: number = SHA224_IV[4] | 0;\n protected F: number = SHA224_IV[5] | 0;\n protected G: number = SHA224_IV[6] | 0;\n protected H: number = SHA224_IV[7] | 0;\n constructor() {\n super(28);\n }\n}\n\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n\n/** Internal 64-byte base SHA2 hash class. */\nabstract class SHA2_64B<T extends SHA2_64B<T>> extends HashMD<T> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n protected abstract Ah: number;\n protected abstract Al: number;\n protected abstract Bh: number;\n protected abstract Bl: number;\n protected abstract Ch: number;\n protected abstract Cl: number;\n protected abstract Dh: number;\n protected abstract Dl: number;\n protected abstract Eh: number;\n protected abstract El: number;\n protected abstract Fh: number;\n protected abstract Fl: number;\n protected abstract Gh: number;\n protected abstract Gl: number;\n protected abstract Hh: number;\n protected abstract Hl: number;\n\n constructor(outputLen: number) {\n super(128, outputLen, 16, false);\n }\n // prettier-ignore\n protected get(): [\n number, number, number, number, number, number, number, number,\n number, number, number, number, number, number, number, number\n ] {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n protected set(\n Ah: number, Al: number, Bh: number, Bl: number, Ch: number, Cl: number, Dh: number, Dl: number,\n Eh: number, El: number, Fh: number, Fl: number, Gh: number, Gl: number, Hh: number, Hl: number\n ): void {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n protected roundClean(): void {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy(): void {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n\n/** Internal SHA2-512 hash class. */\nexport class _SHA512 extends SHA2_64B<_SHA512> {\n protected Ah: number = SHA512_IV[0] | 0;\n protected Al: number = SHA512_IV[1] | 0;\n protected Bh: number = SHA512_IV[2] | 0;\n protected Bl: number = SHA512_IV[3] | 0;\n protected Ch: number = SHA512_IV[4] | 0;\n protected Cl: number = SHA512_IV[5] | 0;\n protected Dh: number = SHA512_IV[6] | 0;\n protected Dl: number = SHA512_IV[7] | 0;\n protected Eh: number = SHA512_IV[8] | 0;\n protected El: number = SHA512_IV[9] | 0;\n protected Fh: number = SHA512_IV[10] | 0;\n protected Fl: number = SHA512_IV[11] | 0;\n protected Gh: number = SHA512_IV[12] | 0;\n protected Gl: number = SHA512_IV[13] | 0;\n protected Hh: number = SHA512_IV[14] | 0;\n protected Hl: number = SHA512_IV[15] | 0;\n\n constructor() {\n super(64);\n }\n}\n\n/** Internal SHA2-384 hash class. */\nexport class _SHA384 extends SHA2_64B<_SHA384> {\n protected Ah: number = SHA384_IV[0] | 0;\n protected Al: number = SHA384_IV[1] | 0;\n protected Bh: number = SHA384_IV[2] | 0;\n protected Bl: number = SHA384_IV[3] | 0;\n protected Ch: number = SHA384_IV[4] | 0;\n protected Cl: number = SHA384_IV[5] | 0;\n protected Dh: number = SHA384_IV[6] | 0;\n protected Dl: number = SHA384_IV[7] | 0;\n protected Eh: number = SHA384_IV[8] | 0;\n protected El: number = SHA384_IV[9] | 0;\n protected Fh: number = SHA384_IV[10] | 0;\n protected Fl: number = SHA384_IV[11] | 0;\n protected Gh: number = SHA384_IV[12] | 0;\n protected Gl: number = SHA384_IV[13] | 0;\n protected Hh: number = SHA384_IV[14] | 0;\n protected Hl: number = SHA384_IV[15] | 0;\n\n constructor() {\n super(48);\n }\n}\n\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n\n/** Internal SHA2-512/224 hash class. */\nexport class _SHA512_224 extends SHA2_64B<_SHA512_224> {\n protected Ah: number = T224_IV[0] | 0;\n protected Al: number = T224_IV[1] | 0;\n protected Bh: number = T224_IV[2] | 0;\n protected Bl: number = T224_IV[3] | 0;\n protected Ch: number = T224_IV[4] | 0;\n protected Cl: number = T224_IV[5] | 0;\n protected Dh: number = T224_IV[6] | 0;\n protected Dl: number = T224_IV[7] | 0;\n protected Eh: number = T224_IV[8] | 0;\n protected El: number = T224_IV[9] | 0;\n protected Fh: number = T224_IV[10] | 0;\n protected Fl: number = T224_IV[11] | 0;\n protected Gh: number = T224_IV[12] | 0;\n protected Gl: number = T224_IV[13] | 0;\n protected Hh: number = T224_IV[14] | 0;\n protected Hl: number = T224_IV[15] | 0;\n\n constructor() {\n super(28);\n }\n}\n\n/** Internal SHA2-512/256 hash class. */\nexport class _SHA512_256 extends SHA2_64B<_SHA512_256> {\n protected Ah: number = T256_IV[0] | 0;\n protected Al: number = T256_IV[1] | 0;\n protected Bh: number = T256_IV[2] | 0;\n protected Bl: number = T256_IV[3] | 0;\n protected Ch: number = T256_IV[4] | 0;\n protected Cl: number = T256_IV[5] | 0;\n protected Dh: number = T256_IV[6] | 0;\n protected Dl: number = T256_IV[7] | 0;\n protected Eh: number = T256_IV[8] | 0;\n protected El: number = T256_IV[9] | 0;\n protected Fh: number = T256_IV[10] | 0;\n protected Fl: number = T256_IV[11] | 0;\n protected Gh: number = T256_IV[12] | 0;\n protected Gl: number = T256_IV[13] | 0;\n protected Hh: number = T256_IV[14] | 0;\n protected Hl: number = T256_IV[15] | 0;\n\n constructor() {\n super(32);\n }\n}\n\n/**\n * SHA2-256 hash function from RFC 4634. In JS it's the fastest: even faster than Blake3. Some info:\n *\n * - Trying 2^128 hashes would get 50% chance of collision, using birthday attack.\n * - BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n * - Each sha256 hash is executing 2^18 bit operations.\n * - Good 2024 ASICs can do 200Th/sec with 3500 watts of power, corresponding to 2^36 hashes/joule.\n */\nexport const sha256: CHash<_SHA256> = /* @__PURE__ */ createHasher(\n () => new _SHA256(),\n /* @__PURE__ */ oidNist(0x01)\n);\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224: CHash<_SHA224> = /* @__PURE__ */ createHasher(\n () => new _SHA224(),\n /* @__PURE__ */ oidNist(0x04)\n);\n\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512: CHash<_SHA512> = /* @__PURE__ */ createHasher(\n () => new _SHA512(),\n /* @__PURE__ */ oidNist(0x03)\n);\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384: CHash<_SHA384> = /* @__PURE__ */ createHasher(\n () => new _SHA384(),\n /* @__PURE__ */ oidNist(0x02)\n);\n\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256: CHash<_SHA512_256> = /* @__PURE__ */ createHasher(\n () => new _SHA512_256(),\n /* @__PURE__ */ oidNist(0x06)\n);\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224: CHash<_SHA512_224> = /* @__PURE__ */ createHasher(\n () => new _SHA512_224(),\n /* @__PURE__ */ oidNist(0x05)\n);\n","/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes as abytes_,\n anumber,\n bytesToHex as bytesToHex_,\n concatBytes as concatBytes_,\n hexToBytes as hexToBytes_,\n} from '@noble/hashes/utils.js';\nexport {\n abytes,\n anumber,\n bytesToHex,\n concatBytes,\n hexToBytes,\n isBytes,\n randomBytes,\n} from '@noble/hashes/utils.js';\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\n\nexport type CHash = {\n (message: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create(opts?: { dkLen?: number }): any; // For shake\n};\nexport type FHash = (message: Uint8Array) => Uint8Array;\nexport function abool(value: boolean, title: string = ''): boolean {\n if (typeof value !== 'boolean') {\n const prefix = title && `\"${title}\" `;\n throw new Error(prefix + 'expected boolean, got type=' + typeof value);\n }\n return value;\n}\n\n// Used in weierstrass, der\nfunction abignumber(n: number | bigint) {\n if (typeof n === 'bigint') {\n if (!isPosBig(n)) throw new Error('positive bigint expected, got ' + n);\n } else anumber(n);\n return n;\n}\n\nexport function asafenumber(value: number, title: string = ''): void {\n if (!Number.isSafeInteger(value)) {\n const prefix = title && `\"${title}\" `;\n throw new Error(prefix + 'expected safe integer, got type=' + typeof value);\n }\n}\n\nexport function numberToHexUnpadded(num: number | bigint): string {\n const hex = abignumber(num).toString(16);\n return hex.length & 1 ? '0' + hex : hex;\n}\n\nexport function hexToNumber(hex: string): bigint {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(bytes));\n}\nexport function bytesToNumberLE(bytes: Uint8Array): bigint {\n return hexToNumber(bytesToHex_(copyBytes(abytes_(bytes)).reverse()));\n}\n\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n anumber(len);\n n = abignumber(n);\n const res = hexToBytes_(n.toString(16).padStart(len * 2, '0'));\n if (res.length !== len) throw new Error('number too large');\n return res;\n}\nexport function numberToBytesLE(n: number | bigint, len: number): Uint8Array {\n return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n: number | bigint): Uint8Array {\n return hexToBytes_(numberToHexUnpadded(abignumber(n)));\n}\n\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n\n/**\n * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer,\n * and Buffer#slice creates mutable copy. Never use Buffers!\n */\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return Uint8Array.from(bytes);\n}\n\n/**\n * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols\n * Should be safe to use for things expected to be ASCII.\n * Returns exact same result as `TextEncoder` for ASCII or throws.\n */\nexport function asciiToBytes(ascii: string): Uint8Array {\n return Uint8Array.from(ascii, (c, i) => {\n const charCode = c.charCodeAt(0);\n if (c.length !== 1 || charCode > 127) {\n throw new Error(\n `string contains non-ASCII character \"${ascii[i]}\" with code ${charCode} at position ${i}`\n );\n }\n return charCode;\n });\n}\n\n// Is positive bigint\nconst isPosBig = (n: bigint) => typeof n === 'bigint' && _0n <= n;\n\nexport function inRange(n: bigint, min: bigint, max: bigint): boolean {\n return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title: string, n: bigint, min: bigint, max: bigint): void {\n // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n // consider P=256n, min=0n, max=P\n // - a for min=0 would require -1: `inRange('x', x, -1n, P)`\n // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)`\n // - our way is the cleanest: `inRange('x', x, 0n, P)\n if (!inRange(n, min, max))\n throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n\n// Bit operations\n\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n: bigint): number {\n let len;\n for (len = 0; n > _0n; n >>= _1n, len += 1);\n return len;\n}\n\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n: bigint, pos: number): bigint {\n return (n >> BigInt(pos)) & _1n;\n}\n\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n: bigint, pos: number, value: boolean): bigint {\n return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n: number): bigint => (_1n << BigInt(n)) - _1n;\n\n// DRBG\n\ntype Pred<T> = (v: Uint8Array) => T | undefined;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n * const drbg = createHmacDRBG<Key>(32, 32, hmac);\n * drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg<T>(\n hashLen: number,\n qByteLen: number,\n hmacFn: (key: Uint8Array, message: Uint8Array) => Uint8Array\n): (seed: Uint8Array, predicate: Pred<T>) => T {\n anumber(hashLen, 'hashLen');\n anumber(qByteLen, 'qByteLen');\n if (typeof hmacFn !== 'function') throw new Error('hmacFn must be a function');\n const u8n = (len: number): Uint8Array => new Uint8Array(len); // creates Uint8Array\n const NULL = Uint8Array.of();\n const byte0 = Uint8Array.of(0x00);\n const byte1 = Uint8Array.of(0x01);\n const _maxDrbgIters = 1000;\n\n // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n let i = 0; // Iterations counter, will throw when over 1000\n const reset = () => {\n v.fill(1);\n k.fill(0);\n i = 0;\n };\n const h = (...msgs: Uint8Array[]) => hmacFn(k, concatBytes_(v, ...msgs)); // hmac(k)(v, ...values)\n const reseed = (seed: Uint8Array = NULL) => {\n // HMAC-DRBG reseed() function. Steps D-G\n k = h(byte0, seed); // k = hmac(k || v || 0x00 || seed)\n v = h(); // v = hmac(k || v)\n if (seed.length === 0) return;\n k = h(byte1, seed); // k = hmac(k || v || 0x01 || seed)\n v = h(); // v = hmac(k || v)\n };\n const gen = () => {\n // HMAC-DRBG generate() function\n if (i++ >= _maxDrbgIters) throw new Error('drbg: tried max amount of iterations');\n let len = 0;\n const out: Uint8Array[] = [];\n while (len < qByteLen) {\n v = h();\n const sl = v.slice();\n out.push(sl);\n len += v.length;\n }\n return concatBytes_(...out);\n };\n const genUntil = (seed: Uint8Array, pred: Pred<T>): T => {\n reset();\n reseed(seed); // Steps D-G\n let res: T | undefined = undefined; // Step H: grind until k is in [1..n-1]\n while (!(res = pred(gen()))) reseed();\n reset();\n return res;\n };\n return genUntil;\n}\n\nexport function validateObject(\n object: Record<string, any>,\n fields: Record<string, string> = {},\n optFields: Record<string, string> = {}\n): void {\n if (!object || typeof object !== 'object') throw new Error('expected valid options object');\n type Item = keyof typeof object;\n function checkField(fieldName: Item, expectedType: string, isOpt: boolean) {\n const val = object[fieldName];\n if (isOpt && val === undefined) return;\n const current = typeof val;\n if (current !== expectedType || val === null)\n throw new Error(`param \"${fieldName}\" is invalid: expected ${expectedType}, got ${current}`);\n }\n const iter = (f: typeof fields, isOpt: boolean) =>\n Object.entries(f).forEach(([k, v]) => checkField(k, v, isOpt));\n iter(fields, false);\n iter(optFields, true);\n}\n\n/**\n * throws not implemented error\n */\nexport const notImplemented = (): never => {\n throw new Error('not implemented');\n};\n\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized<T extends object, R, O extends any[]>(\n fn: (arg: T, ...args: O) => R\n): (arg: T, ...args: O) => R {\n const map = new WeakMap<T, R>();\n return (arg: T, ...args: O): R => {\n const val = map.get(arg);\n if (val !== undefined) return val;\n const computed = fn(arg, ...args);\n map.set(arg, computed);\n return computed;\n };\n}\n\nexport interface CryptoKeys {\n lengths: { seed?: number; public?: number; secret?: number };\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: Uint8Array) => Uint8Array;\n}\n\n/** Generic interface for signatures. Has keygen, sign and verify. */\nexport interface Signer extends CryptoKeys {\n // Interfaces are fun. We cannot just add new fields without copying old ones.\n lengths: {\n seed?: number;\n public?: number;\n secret?: number;\n signRand?: number;\n signature?: number;\n };\n sign: (msg: Uint8Array, secretKey: Uint8Array) => Uint8Array;\n verify: (sig: Uint8Array, msg: Uint8Array, publicKey: Uint8Array) => boolean;\n}\n","/**\n * Utils for modular division and fields.\n * Field over 11 is a finite (Galois) field is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abytes,\n anumber,\n bytesToNumberBE,\n bytesToNumberLE,\n numberToBytesBE,\n numberToBytesLE,\n validateObject,\n} from '../utils.ts';\n\n// Numbers aren't used in x25519 / x448 builds\n// prettier-ignore\nconst _0n = /* @__PURE__ */ BigInt(0), _1n = /* @__PURE__ */ BigInt(1), _2n = /* @__PURE__ */ BigInt(2);\n// prettier-ignore\nconst _3n = /* @__PURE__ */ BigInt(3), _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5);\n// prettier-ignore\nconst _7n = /* @__PURE__ */ BigInt(7), _8n = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9);\nconst _16n = /* @__PURE__ */ BigInt(16);\n\n// Calculates a modulo b\nexport function mod(a: bigint, b: bigint): bigint {\n const result = a % b;\n return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num: bigint, power: bigint, modulo: bigint): bigint {\n return FpPow(Field(modulo), num, power);\n}\n\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x: bigint, power: bigint, modulo: bigint): bigint {\n let res = x;\n while (power-- > _0n) {\n res *= res;\n res %= modulo;\n }\n return res;\n}\n\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number: bigint, modulo: bigint): bigint {\n if (number === _0n) throw new Error('invert: expected non-zero number');\n if (modulo <= _0n) throw new Error('invert: expected positive modulus, got ' + modulo);\n // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n let a = mod(number, modulo);\n let b = modulo;\n // prettier-ignore\n let x = _0n, y = _1n, u = _1n, v = _0n;\n while (a !== _0n) {\n // JIT applies optimization if those two lines follow each other\n const q = b / a;\n const r = b % a;\n const m = x - u * q;\n const n = y - v * q;\n // prettier-ignore\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n const gcd = b;\n if (gcd !== _1n) throw new Error('invert: does not exist');\n return mod(x, modulo);\n}\n\nfunction assertIsSquare<T>(Fp: IField<T>, root: T, n: T): void {\n if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n}\n\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4<T>(Fp: IField<T>, n: T) {\n const p1div4 = (Fp.ORDER + _1n) / _4n;\n const root = Fp.pow(n, p1div4);\n assertIsSquare(Fp, root, n);\n return root;\n}\n\nfunction sqrt5mod8<T>(Fp: IField<T>, n: T) {\n const p5div8 = (Fp.ORDER - _5n) / _8n;\n const n2 = Fp.mul(n, _2n);\n const v = Fp.pow(n2, p5div8);\n const nv = Fp.mul(n, v);\n const i = Fp.mul(Fp.mul(nv, _2n), v);\n const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n assertIsSquare(Fp, root, n);\n return root;\n}\n\n// Based on RFC9380, Kong algorithm\n// prettier-ignore\nfunction sqrt9mod16(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n const Fp_ = Field(P);\n const tn = tonelliShanks(P);\n const c1 = tn(Fp_, Fp_.neg(Fp_.ONE));// 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n const c2 = tn(Fp_, c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n const c3 = tn(Fp_, Fp_.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic\n return <T>(Fp: IField<T>, n: T) => {\n let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4\n let tv2 = Fp.mul(tv1, c1); // 2. tv2 = c1 * tv1\n const tv3 = Fp.mul(tv1, c2); // 3. tv3 = c2 * tv1\n const tv4 = Fp.mul(tv1, c3); // 4. tv4 = c3 * tv1\n const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x\n const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x\n tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x\n tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x\n const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x\n const root = Fp.cmov(tv1, tv2, e3);// 10. z = CMOV(tv1, tv2, e3) # Select sqrt from tv1 & tv2\n assertIsSquare(Fp, root, n);\n return root;\n };\n}\n\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n // Initialization (precomputation).\n // Caching initialization could boost perf by 7%.\n if (P < _3n) throw new Error('sqrt is not defined for small field');\n // Factor P - 1 = Q * 2^S, where Q is odd\n let Q = P - _1n;\n let S = 0;\n while (Q % _2n === _0n) {\n Q /= _2n;\n S++;\n }\n\n // Find the first quadratic non-residue Z >= 2\n let Z = _2n;\n const _Fp = Field(P);\n while (FpLegendre(_Fp, Z) === 1) {\n // Basic primality test for P. After x iterations, chance of\n // not finding quadratic non-residue is 2^x, so 2^1000.\n if (Z++ > 1000) throw new Error('Cannot find square root: probably non-prime P');\n }\n // Fast-path; usually done before Z, but we do \"primality test\".\n if (S === 1) return sqrt3mod4;\n\n // Slow-path\n // TODO: test on Fp2 and others\n let cc = _Fp.pow(Z, Q); // c = z^Q\n const Q1div2 = (Q + _1n) / _2n;\n return function tonelliSlow<T>(Fp: IField<T>, n: T): T {\n if (Fp.is0(n)) return n;\n // Check if n is a quadratic residue using Legendre symbol\n if (FpLegendre(Fp, n) !== 1) throw new Error('Cannot find square root');\n\n // Initialize variables for the main loop\n let M = S;\n let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n\n // Main loop\n // while t != 1\n while (!Fp.eql(t, Fp.ONE)) {\n if (Fp.is0(t)) return Fp.ZERO; // if t=0 return R=0\n let i = 1;\n\n // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n let t_tmp = Fp.sqr(t); // t^(2^1)\n while (!Fp.eql(t_tmp, Fp.ONE)) {\n i++;\n t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n if (i === M) throw new Error('Cannot find square root');\n }\n\n // Calculate the exponent for b: 2^(M - i - 1)\n const exponent = _1n << BigInt(M - i - 1); // bigint is important\n const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n\n // Update variables\n M = i;\n c = Fp.sqr(b); // c = b^2\n t = Fp.mul(t, c); // t = (t * b^2)\n R = Fp.mul(R, b); // R = R*b\n }\n return R;\n };\n}\n\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. P ≡ 9 (mod 16)\n * 4. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n if (P % _4n === _3n) return sqrt3mod4;\n // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n if (P % _8n === _5n) return sqrt5mod8;\n // P ≡ 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4)\n if (P % _16n === _9n) return sqrt9mod16(P);\n // Tonelli-Shanks algorithm\n return tonelliShanks(P);\n}\n\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num: bigint, modulo: bigint): boolean =>\n (mod(num, modulo) & _1n) === _1n;\n\n/** Field is not always over prime: for example, Fp2 has ORDER(q)=p^m. */\nexport interface IField<T> {\n ORDER: bigint;\n BYTES: number;\n BITS: number;\n isLE: boolean;\n ZERO: T;\n ONE: T;\n // 1-arg\n create: (num: T) => T;\n isValid: (num: T) => boolean;\n is0: (num: T) => boolean;\n isValidNot0: (num: T) => boolean;\n neg(num: T): T;\n inv(num: T): T;\n sqrt(num: T): T;\n sqr(num: T): T;\n // 2-args\n eql(lhs: T, rhs: T): boolean;\n add(lhs: T, rhs: T): T;\n sub(lhs: T, rhs: T): T;\n mul(lhs: T, rhs: T | bigint): T;\n pow(lhs: T, power: bigint): T;\n div(lhs: T, rhs: T | bigint): T;\n // N for NonNormalized (for now)\n addN(lhs: T, rhs: T): T;\n subN(lhs: T, rhs: T): T;\n mulN(lhs: T, rhs: T | bigint): T;\n sqrN(num: T): T;\n\n // Optional\n // Should be same as sgn0 function in\n // [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#section-4.1).\n // NOTE: sgn0 is 'negative in LE', which is same as odd. And negative in LE is kinda strange definition anyway.\n isOdd?(num: T): boolean; // Odd instead of even since we have it for Fp2\n // legendre?(num: T): T;\n invertBatch: (lst: T[]) => T[];\n toBytes(num: T): Uint8Array;\n fromBytes(bytes: Uint8Array, skipValidation?: boolean): T;\n // If c is False, CMOV returns a, otherwise it returns b.\n cmov(a: T, b: T, c: boolean): T;\n}\n// prettier-ignore\nconst FIELD_FIELDS = [\n 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n 'eql', 'add', 'sub', 'mul', 'pow', 'div',\n 'addN', 'subN', 'mulN', 'sqrN'\n] as const;\nexport function validateField<T>(field: IField<T>): IField<T> {\n const initial = {\n ORDER: 'bigint',\n BYTES: 'number',\n BITS: 'number',\n } as Record<string, string>;\n const opts = FIELD_FIELDS.reduce((map, val: string) => {\n map[val] = 'function';\n return map;\n }, initial);\n validateObject(field, opts);\n // const max = 16384;\n // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');\n // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');\n return field;\n}\n\n// Generic field functions\n\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow<T>(Fp: IField<T>, num: T, power: bigint): T {\n if (power < _0n) throw new Error('invalid exponent, negatives unsupported');\n if (power === _0n) return Fp.ONE;\n if (power === _1n) return num;\n let p = Fp.ONE;\n let d = num;\n while (power > _0n) {\n if (power & _1n) p = Fp.mul(p, d);\n d = Fp.sqr(d);\n power >>= _1n;\n }\n return p;\n}\n\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch<T>(Fp: IField<T>, nums: T[], passZero = false): T[] {\n const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n // Walk from first to last, multiply them by each other MOD p\n const multipliedAcc = nums.reduce((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = acc;\n return Fp.mul(acc, num);\n }, Fp.ONE);\n // Invert last element\n const invertedAcc = Fp.inv(multipliedAcc);\n // Walk from last to first, multiply them by inverted each other MOD p\n nums.reduceRight((acc, num, i) => {\n if (Fp.is0(num)) return acc;\n inverted[i] = Fp.mul(acc, inverted[i]);\n return Fp.mul(acc, num);\n }, invertedAcc);\n return inverted;\n}\n\n// TODO: remove\nexport function FpDiv<T>(Fp: IField<T>, lhs: T, rhs: T | bigint): T {\n return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1 if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0 if a ≡ 0 (mod p)\n */\nexport function FpLegendre<T>(Fp: IField<T>, n: T): -1 | 0 | 1 {\n // We can use 3rd argument as optional cache of this value\n // but seems unneeded for now. The operation is very fast.\n const p1mod2 = (Fp.ORDER - _1n) / _2n;\n const powered = Fp.pow(n, p1mod2);\n const yes = Fp.eql(powered, Fp.ONE);\n const zero = Fp.eql(powered, Fp.ZERO);\n const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n if (!yes && !zero && !no) throw new Error('invalid Legendre symbol result');\n return yes ? 1 : zero ? 0 : -1;\n}\n\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare<T>(Fp: IField<T>, n: T): boolean {\n const l = FpLegendre(Fp, n);\n return l === 1;\n}\n\nexport type NLength = { nByteLength: number; nBitLength: number };\n// CURVE.n lengths\nexport function nLength(n: bigint, nBitLength?: number): NLength {\n // Bit size, byte size of CURVE.n\n if (nBitLength !== undefined) anumber(nBitLength);\n const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n const nByteLength = Math.ceil(_nBitLength / 8);\n return { nBitLength: _nBitLength, nByteLength };\n}\n\ntype FpField = IField<bigint> & Required<Pick<IField<bigint>, 'isOdd'>>;\ntype SqrtFn = (n: bigint) => bigint;\ntype FieldOpts = Partial<{\n isLE: boolean;\n BITS: number;\n sqrt: SqrtFn;\n allowedLengths?: readonly number[]; // for P521 (adds padding for smaller sizes)\n modFromBytes: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n}>;\nclass _Field implements IField<bigint> {\n readonly ORDER: bigint;\n readonly BITS: number;\n readonly BYTES: number;\n readonly isLE: boolean;\n readonly ZERO = _0n;\n readonly ONE = _1n;\n readonly _lengths?: number[];\n private _sqrt: ReturnType<typeof FpSqrt> | undefined; // cached sqrt\n private readonly _mod?: boolean;\n constructor(ORDER: bigint, opts: FieldOpts = {}) {\n if (ORDER <= _0n) throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n let _nbitLength: number | undefined = undefined;\n this.isLE = false;\n if (opts != null && typeof opts === 'object') {\n if (typeof opts.BITS === 'number') _nbitLength = opts.BITS;\n if (typeof opts.sqrt === 'function') this.sqrt = opts.sqrt;\n if (typeof opts.isLE === 'boolean') this.isLE = opts.isLE;\n if (opts.allowedLengths) this._lengths = opts.allowedLengths?.slice();\n if (typeof opts.modFromBytes === 'boolean') this._mod = opts.modFromBytes;\n }\n const { nBitLength, nByteLength } = nLength(ORDER, _nbitLength);\n if (nByteLength > 2048) throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n this.ORDER = ORDER;\n this.BITS = nBitLength;\n this.BYTES = nByteLength;\n this._sqrt = undefined;\n Object.preventExtensions(this);\n }\n\n create(num: bigint) {\n return mod(num, this.ORDER);\n }\n isValid(num: bigint) {\n if (typeof num !== 'bigint')\n throw new Error('invalid field element: expected bigint, got ' + typeof num);\n return _0n <= num && num < this.ORDER; // 0 is valid element, but it's not invertible\n }\n is0(num: bigint) {\n return num === _0n;\n }\n // is valid and invertible\n isValidNot0(num: bigint) {\n return !this.is0(num) && this.isValid(num);\n }\n isOdd(num: bigint) {\n return (num & _1n) === _1n;\n }\n neg(num: bigint) {\n return mod(-num, this.ORDER);\n }\n eql(lhs: bigint, rhs: bigint) {\n return lhs === rhs;\n }\n\n sqr(num: bigint) {\n return mod(num * num, this.ORDER);\n }\n add(lhs: bigint, rhs: bigint) {\n return mod(lhs + rhs, this.ORDER);\n }\n sub(lhs: bigint, rhs: bigint) {\n return mod(lhs - rhs, this.ORDER);\n }\n mul(lhs: bigint, rhs: bigint) {\n return mod(lhs * rhs, this.ORDER);\n }\n pow(num: bigint, power: bigint): bigint {\n return FpPow(this, num, power);\n }\n div(lhs: bigint, rhs: bigint) {\n return mod(lhs * invert(rhs, this.ORDER), this.ORDER);\n }\n\n // Same as above, but doesn't normalize\n sqrN(num: bigint) {\n return num * num;\n }\n addN(lhs: bigint, rhs: bigint) {\n return lhs + rhs;\n }\n subN(lhs: bigint, rhs: bigint) {\n return lhs - rhs;\n }\n mulN(lhs: bigint, rhs: bigint) {\n return lhs * rhs;\n }\n\n inv(num: bigint) {\n return invert(num, this.ORDER);\n }\n sqrt(num: bigint): bigint {\n // Caching _sqrt speeds up sqrt9mod16 by 5x and tonneli-shanks by 10%\n if (!this._sqrt) this._sqrt = FpSqrt(this.ORDER);\n return this._sqrt(this, num);\n }\n toBytes(num: bigint) {\n return this.isLE ? numberToBytesLE(num, this.BYTES) : numberToBytesBE(num, this.BYTES);\n }\n fromBytes(bytes: Uint8Array, skipValidation = false) {\n abytes(bytes);\n const { _lengths: allowedLengths, BYTES, isLE, ORDER, _mod: modFromBytes } = this;\n if (allowedLengths) {\n if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) {\n throw new Error(\n 'Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length\n );\n }\n const padded = new Uint8Array(BYTES);\n // isLE add 0 to right, !isLE to the left.\n padded.set(bytes, isLE ? 0 : padded.length - bytes.length);\n bytes = padded;\n }\n if (bytes.length !== BYTES)\n throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n let scalar = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n if (modFromBytes) scalar = mod(scalar, ORDER);\n if (!skipValidation)\n if (!this.isValid(scalar))\n throw new Error('invalid field element: outside of range 0..ORDER');\n // NOTE: we don't validate scalar here, please use isValid. This done such way because some\n // protocol may allow non-reduced scalar that reduced later or changed some other way.\n return scalar;\n }\n // TODO: we don't need it here, move out to separate fn\n invertBatch(lst: bigint[]): bigint[] {\n return FpInvertBatch(this, lst);\n }\n // We can't move this out because Fp6, Fp12 implement it\n // and it's unclear what to return in there.\n cmov(a: bigint, b: bigint, condition: boolean) {\n return condition ? b : a;\n }\n}\n\n/**\n * Creates a finite field. Major performance optimizations:\n * * 1. Denormalized operations like mulN instead of mul.\n * * 2. Identical object shape: never add or remove keys.\n * * 3. `Object.freeze`.\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n *\n * Note about field properties:\n * * CHARACTERISTIC p = prime number, number of elements in main subgroup.\n * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.\n *\n * @param ORDER field order, probably prime, or could be composite\n * @param bitLen how many bits the field consumes\n * @param isLE (default: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(ORDER: bigint, opts: FieldOpts = {}): Readonly<FpField> {\n return new _Field(ORDER, opts);\n}\n\n// Generic random scalar, we can do same for other fields if via Fp2.mul(Fp2.ONE, Fp2.random)?\n// This allows unsafe methods like ignore bias or zero. These unsafe, but often used in different protocols (if deterministic RNG).\n// which mean we cannot force this via opts.\n// Not sure what to do with randomBytes, we can accept it inside opts if wanted.\n// Probably need to export getMinHashLength somewhere?\n// random(bytes?: Uint8Array, unsafeAllowZero = false, unsafeAllowBias = false) {\n// const LEN = !unsafeAllowBias ? getMinHashLength(ORDER) : BYTES;\n// if (bytes === undefined) bytes = randomBytes(LEN); // _opts.randomBytes?\n// const num = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n// // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n// const reduced = unsafeAllowZero ? mod(num, ORDER) : mod(num, ORDER - _1n) + _1n;\n// return reduced;\n// },\n\nexport function FpSqrtOdd<T>(Fp: IField<T>, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? root : Fp.neg(root);\n}\n\nexport function FpSqrtEven<T>(Fp: IField<T>, elm: T): T {\n if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n const root = Fp.sqrt(elm);\n return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder: bigint): number {\n if (typeof fieldOrder !== 'bigint') throw new Error('field order must be bigint');\n const bitLength = fieldOrder.toString(2).length;\n return Math.ceil(bitLength / 8);\n}\n\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder: bigint): number {\n const length = getFieldBytesLength(fieldOrder);\n return length + Math.ceil(length / 2);\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.Point.Fn.ORDER)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key: Uint8Array, fieldOrder: bigint, isLE = false): Uint8Array {\n abytes(key);\n const len = key.length;\n const fieldLen = getFieldBytesLength(fieldOrder);\n const minLen = getMinHashLength(fieldOrder);\n // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n if (len < 16 || len < minLen || len > 1024)\n throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n const reduced = mod(num, fieldOrder - _1n) + _1n;\n return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n","/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { bitLen, bitMask, type Signer } from '../utils.ts';\nimport { Field, FpInvertBatch, validateField, type IField } from './modular.ts';\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\n\nexport type AffinePoint<T> = {\n x: T;\n y: T;\n} & { Z?: never };\n\n// We can't \"abstract out\" coordinates (X, Y, Z; and T in Edwards): argument names of constructor\n// are not accessible. See Typescript gh-56093, gh-41594.\n//\n// We have to use recursive types, so it will return actual point, not constained `CurvePoint`.\n// If, at any point, P is `any`, it will erase all types and replace it\n// with `any`, because of recursion, `any implements CurvePoint`,\n// but we lose all constrains on methods.\n\n/** Base interface for all elliptic curve Points. */\nexport interface CurvePoint<F, P extends CurvePoint<F, P>> {\n /** Affine x coordinate. Different from projective / extended X coordinate. */\n x: F;\n /** Affine y coordinate. Different from projective / extended Y coordinate. */\n y: F;\n Z?: F;\n double(): P;\n negate(): P;\n add(other: P): P;\n subtract(other: P): P;\n equals(other: P): boolean;\n multiply(scalar: bigint): P;\n assertValidity(): void;\n clearCofactor(): P;\n is0(): boolean;\n isTorsionFree(): boolean;\n isSmallOrder(): boolean;\n multiplyUnsafe(scalar: bigint): P;\n /**\n * Massively speeds up `p.multiply(n)` by using precompute tables (caching). See {@link wNAF}.\n * @param isLazy calculate cache now. Default (true) ensures it's deferred to first `multiply()`\n */\n precompute(windowSize?: number, isLazy?: boolean): P;\n /** Converts point to 2D xy affine coordinates */\n toAffine(invertedZ?: F): AffinePoint<F>;\n toBytes(): Uint8Array;\n toHex(): string;\n}\n\n/** Base interface for all elliptic curve Point constructors. */\nexport interface CurvePointCons<P extends CurvePoint<any, P>> {\n [Symbol.hasInstance]: (item: unknown) => boolean;\n BASE: P;\n ZERO: P;\n /** Field for basic curve math */\n Fp: IField<P_F<P>>;\n /** Scalar field, for scalars in multiply and others */\n Fn: IField<bigint>;\n /** Creates point from x, y. Does NOT validate if the point is valid. Use `.assertValidity()`. */\n fromAffine(p: AffinePoint<P_F<P>>): P;\n fromBytes(bytes: Uint8Array): P;\n fromHex(hex: string): P;\n}\n\n// Type inference helpers: PC - PointConstructor, P - Point, Fp - Field element\n// Short names, because we use them a lot in result types:\n// * we can't do 'P = GetCurvePoint<PC>': this is default value and doesn't constrain anything\n// * we can't do 'type X = GetCurvePoint<PC>': it won't be accesible for arguments/return types\n// * `CurvePointCons<P extends CurvePoint<any, P>>` constraints from interface definition\n// won't propagate, if `PC extends CurvePointCons<any>`: the P would be 'any', which is incorrect\n// * PC could be super specific with super specific P, which implements CurvePoint<any, P>.\n// this means we need to do stuff like\n// `function test<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(`\n// if we want type safety around P, otherwise PC_P<PC> will be any\n\n/** Returns Fp type from Point (P_F<P> == P.F) */\nexport type P_F<P extends CurvePoint<any, P>> = P extends CurvePoint<infer F, P> ? F : never;\n/** Returns Fp type from PointCons (PC_F<PC> == PC.P.F) */\nexport type PC_F<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['Fp']['ZERO'];\n/** Returns Point type from PointCons (PC_P<PC> == PC.P) */\nexport type PC_P<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['ZERO'];\n\n// Ugly hack to get proper type inference, because in typescript fails to infer resursively.\n// The hack allows to do up to 10 chained operations without applying type erasure.\n//\n// Types which won't work:\n// * `CurvePointCons<CurvePoint<any, any>>`, will return `any` after 1 operation\n// * `CurvePointCons<any>: WeierstrassPointCons<bigint> extends CurvePointCons<any> = false`\n// * `P extends CurvePoint, PC extends CurvePointCons<P>`\n// * It can't infer P from PC alone\n// * Too many relations between F, P & PC\n// * It will infer P/F if `arg: CurvePointCons<F, P>`, but will fail if PC is generic\n// * It will work correctly if there is an additional argument of type P\n// * But generally, we don't want to parametrize `CurvePointCons` over `F`: it will complicate\n// types, making them un-inferable\n// prettier-ignore\nexport type PC_ANY = CurvePointCons<\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any,\n CurvePoint<any, any>\n >>>>>>>>>\n>;\n\nexport interface CurveLengths {\n secretKey?: number;\n publicKey?: number;\n publicKeyUncompressed?: number;\n publicKeyHasPrefix?: boolean;\n signature?: number;\n seed?: number;\n}\n\nexport type Mapper<T> = (i: T[]) => T[];\n\nexport function negateCt<T extends { negate: () => T }>(condition: boolean, item: T): T {\n const neg = item.negate();\n return condition ? neg : item;\n}\n\n/**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\nexport function normalizeZ<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[]\n): P[] {\n const invertedZs = FpInvertBatch(\n c.Fp,\n points.map((p) => p.Z!)\n );\n return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));\n}\n\nfunction validateW(W: number, bits: number) {\n if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\n\n/** Internal wNAF opts for specific W and scalarBits */\ntype WOpts = {\n windows: number;\n windowSize: number;\n mask: bigint;\n maxNumber: number;\n shiftBy: bigint;\n};\n\nfunction calcWOpts(W: number, scalarBits: number): WOpts {\n validateW(W, scalarBits);\n const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n const maxNumber = 2 ** W; // W=8 256\n const mask = bitMask(W); // W=8 255 == mask 0b11111111\n const shiftBy = BigInt(W); // W=8 8\n return { windows, windowSize, mask, maxNumber, shiftBy };\n}\n\nfunction calcOffsets(n: bigint, window: number, wOpts: WOpts) {\n const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n let wbits = Number(n & mask); // extract W bits.\n let nextN = n >> shiftBy; // shift number by W bits.\n\n // What actually happens here:\n // const highestBit = Number(mask ^ (mask >> 1n));\n // let wbits2 = wbits - 1; // skip zero\n // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n\n // split if bits > max: +224 => 256-32\n if (wbits > windowSize) {\n // we skip zero, which means instead of `>= size-1`, we do `> size`\n wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n nextN += _1n; // +256 (carry)\n }\n const offsetStart = window * windowSize;\n const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n const isZero = wbits === 0; // is current window slice a 0?\n const isNeg = wbits < 0; // is current window slice negative?\n const isNegF = window % 2 !== 0; // fake random statement for noise\n const offsetF = offsetStart; // fake offset for noise\n return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\n\nfunction validateMSMPoints(points: any[], c: any) {\n if (!Array.isArray(points)) throw new Error('array expected');\n points.forEach((p, i) => {\n if (!(p instanceof c)) throw new Error('invalid point at index ' + i);\n });\n}\nfunction validateMSMScalars(scalars: any[], field: any) {\n if (!Array.isArray(scalars)) throw new Error('array of scalars expected');\n scalars.forEach((s, i) => {\n if (!field.isValid(s)) throw new Error('invalid scalar at index ' + i);\n });\n}\n\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap<any, any[]>();\nconst pointWindowSizes = new WeakMap<any, number>();\n\nfunction getW(P: any): number {\n // To disable precomputes:\n // return 1;\n return pointWindowSizes.get(P) || 1;\n}\n\nfunction assert0(n: bigint): void {\n if (n !== _0n) throw new Error('invalid wNAF');\n}\n\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Table generation takes **30MB of ram and 10ms on high-end CPU**,\n * but may take much longer on slow devices. Actual generation will happen on\n * first call of `multiply()`. By default, `BASE` point is precomputed.\n *\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport class wNAF<PC extends PC_ANY> {\n private readonly BASE: PC_P<PC>;\n private readonly ZERO: PC_P<PC>;\n private readonly Fn: PC['Fn'];\n readonly bits: number;\n\n // Parametrized with a given Point class (not individual point)\n constructor(Point: PC, bits: number) {\n this.BASE = Point.BASE;\n this.ZERO = Point.ZERO;\n this.Fn = Point.Fn;\n this.bits = bits;\n }\n\n // non-const time multiplication ladder\n _unsafeLadder(elm: PC_P<PC>, n: bigint, p: PC_P<PC> = this.ZERO): PC_P<PC> {\n let d: PC_P<PC> = elm;\n while (n > _0n) {\n if (n & _1n) p = p.add(d);\n d = d.double();\n n >>= _1n;\n }\n return p;\n }\n\n /**\n * Creates a wNAF precomputation window. Used for caching.\n * Default window size is set by `utils.precompute()` and is equal to 8.\n * Number of precomputed points depends on the curve size:\n * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n * - 𝑊 is the window size\n * - 𝑛 is the bitlength of the curve order.\n * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n * @param point Point instance\n * @param W window size\n * @returns precomputed point tables flattened to a single array\n */\n private precomputeWindow(point: PC_P<PC>, W: number): PC_P<PC>[] {\n const { windows, windowSize } = calcWOpts(W, this.bits);\n const points: PC_P<PC>[] = [];\n let p: PC_P<PC> = point;\n let base = p;\n for (let window = 0; window < windows; window++) {\n base = p;\n points.push(base);\n // i=1, bc we skip 0\n for (let i = 1; i < windowSize; i++) {\n base = base.add(p);\n points.push(base);\n }\n p = base.double();\n }\n return points;\n }\n\n /**\n * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n * More compact implementation:\n * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n * @returns real and fake (for const-time) points\n */\n private wNAF(W: number, precomputes: PC_P<PC>[], n: bigint): { p: PC_P<PC>; f: PC_P<PC> } {\n // Scalar should be smaller than field order\n if (!this.Fn.isValid(n)) throw new Error('invalid scalar');\n // Accumulators\n let p = this.ZERO;\n let f = this.BASE;\n // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n // there is negate now: it is possible that negated element from low value\n // would be the same as high element, which will create carry into next window.\n // It's not obvious how this can fail, but still worth investigating later.\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // bits are 0: add garbage to fake point\n // Important part for const-time getPublicKey: add random \"noise\" point to f.\n f = f.add(negateCt(isNegF, precomputes[offsetF]));\n } else {\n // bits are 1: add to result point\n p = p.add(negateCt(isNeg, precomputes[offset]));\n }\n }\n assert0(n);\n // Return both real and fake points: JIT won't eliminate f.\n // At this point there is a way to F be infinity-point even if p is not,\n // which makes it less const-time: around 1 bigint multiply.\n return { p, f };\n }\n\n /**\n * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n * @param acc accumulator point to add result of multiplication\n * @returns point\n */\n private wNAFUnsafe(\n W: number,\n precomputes: PC_P<PC>[],\n n: bigint,\n acc: PC_P<PC> = this.ZERO\n ): PC_P<PC> {\n const wo = calcWOpts(W, this.bits);\n for (let window = 0; window < wo.windows; window++) {\n if (n === _0n) break; // Early-exit, skip 0 value\n const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n n = nextN;\n if (isZero) {\n // Window bits are 0: skip processing.\n // Move to next window.\n continue;\n } else {\n const item = precomputes[offset];\n acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n }\n }\n assert0(n);\n return acc;\n }\n\n private getPrecomputes(W: number, point: PC_P<PC>, transform?: Mapper<PC_P<PC>>): PC_P<PC>[] {\n // Calculate precomputes on a first run, reuse them after\n let comp = pointPrecomputes.get(point);\n if (!comp) {\n comp = this.precomputeWindow(point, W) as PC_P<PC>[];\n if (W !== 1) {\n // Doing transform outside of if brings 15% perf hit\n if (typeof transform === 'function') comp = transform(comp);\n pointPrecomputes.set(point, comp);\n }\n }\n return comp;\n }\n\n cached(\n point: PC_P<PC>,\n scalar: bigint,\n transform?: Mapper<PC_P<PC>>\n ): { p: PC_P<PC>; f: PC_P<PC> } {\n const W = getW(point);\n return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar);\n }\n\n unsafe(point: PC_P<PC>, scalar: bigint, transform?: Mapper<PC_P<PC>>, prev?: PC_P<PC>): PC_P<PC> {\n const W = getW(point);\n if (W === 1) return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster\n return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev);\n }\n\n // We calculate precomputes for elliptic curve point multiplication\n // using windowed method. This specifies window size and\n // stores precomputed values. Usually only base point would be precomputed.\n createCache(P: PC_P<PC>, W: number): void {\n validateW(W, this.bits);\n pointWindowSizes.set(P, W);\n pointPrecomputes.delete(P);\n }\n\n hasCache(elm: PC_P<PC>): boolean {\n return getW(elm) !== 1;\n }\n}\n\n/**\n * Endomorphism-specific multiplication for Koblitz curves.\n * Cost: 128 dbl, 0-256 adds.\n */\nexport function mulEndoUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n Point: PC,\n point: P,\n k1: bigint,\n k2: bigint\n): { p1: P; p2: P } {\n let acc = point;\n let p1 = Point.ZERO;\n let p2 = Point.ZERO;\n while (k1 > _0n || k2 > _0n) {\n if (k1 & _1n) p1 = p1.add(acc);\n if (k2 & _1n) p2 = p2.add(acc);\n acc = acc.double();\n k1 >>= _1n;\n k2 >>= _1n;\n }\n return { p1, p2 };\n}\n\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka secret keys / bigints)\n */\nexport function pippenger<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[],\n scalars: bigint[]\n): P {\n // If we split scalars by some window (let's say 8 bits), every chunk will only\n // take 256 buckets even if there are 4096 scalars, also re-uses double.\n // TODO:\n // - https://eprint.iacr.org/2024/750.pdf\n // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n // 0 is accepted in scalars\n const fieldN = c.Fn;\n validateMSMPoints(points, c);\n validateMSMScalars(scalars, fieldN);\n const plength = points.length;\n const slength = scalars.length;\n if (plength !== slength) throw new Error('arrays of points and scalars must have equal length');\n // if (plength === 0) throw new Error('array must be of length >= 2');\n const zero = c.ZERO;\n const wbits = bitLen(BigInt(plength));\n let windowSize = 1; // bits\n if (wbits > 12) windowSize = wbits - 3;\n else if (wbits > 4) windowSize = wbits - 2;\n else if (wbits > 0) windowSize = 2;\n const MASK = bitMask(windowSize);\n const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n let sum = zero;\n for (let i = lastBits; i >= 0; i -= windowSize) {\n buckets.fill(zero);\n for (let j = 0; j < slength; j++) {\n const scalar = scalars[j];\n const wbits = Number((scalar >> BigInt(i)) & MASK);\n buckets[wbits] = buckets[wbits].add(points[j]);\n }\n let resI = zero; // not using this will do small speed-up, but will lose ct\n // Skip first bucket, because it is zero\n for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n sumI = sumI.add(buckets[j]);\n resI = resI.add(sumI);\n }\n sum = sum.add(resI);\n if (i !== 0) for (let j = 0; j < windowSize; j++) sum = sum.double();\n }\n return sum as P;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n c: PC,\n points: P[],\n windowSize: number\n): (scalars: bigint[]) => P {\n /**\n * Performance Analysis of Window-based Precomputation\n *\n * Base Case (256-bit scalar, 8-bit window):\n * - Standard precomputation requires:\n * - 31 additions per scalar × 256 scalars = 7,936 ops\n * - Plus 255 summary additions = 8,191 total ops\n * Note: Summary additions can be optimized via accumulator\n *\n * Chunked Precomputation Analysis:\n * - Using 32 chunks requires:\n * - 255 additions per chunk\n * - 256 doublings\n * - Total: (255 × 32) + 256 = 8,416 ops\n *\n * Memory Usage Comparison:\n * Window Size | Standard Points | Chunked Points\n * ------------|-----------------|---------------\n * 4-bit | 520 | 15\n * 8-bit | 4,224 | 255\n * 10-bit | 13,824 | 1,023\n * 16-bit | 557,056 | 65,535\n *\n * Key Advantages:\n * 1. Enables larger window sizes due to reduced memory overhead\n * 2. More efficient for smaller scalar counts:\n * - 16 chunks: (16 × 255) + 256 = 4,336 ops\n * - ~2x faster than standard 8,191 ops\n *\n * Limitations:\n * - Not suitable for plain precomputes (requires 256 constant doublings)\n * - Performance degrades with larger scalar counts:\n * - Optimal for ~256 scalars\n * - Less efficient for 4096+ scalars (Pippenger preferred)\n */\n const fieldN = c.Fn;\n validateW(windowSize, fieldN.BITS);\n validateMSMPoints(points, c);\n const zero = c.ZERO;\n const tableSize = 2 ** windowSize - 1; // table size (without zero)\n const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n const MASK = bitMask(windowSize);\n const tables = points.map((p: P) => {\n const res = [];\n for (let i = 0, acc = p; i < tableSize; i++) {\n res.push(acc);\n acc = acc.add(p);\n }\n return res;\n });\n return (scalars: bigint[]): P => {\n validateMSMScalars(scalars, fieldN);\n if (scalars.length > points.length)\n throw new Error('array of scalars must be smaller than array of points');\n let res = zero;\n for (let i = 0; i < chunks; i++) {\n // No need to double if accumulator is still zero.\n if (res !== zero) for (let j = 0; j < windowSize; j++) res = res.double();\n const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n for (let j = 0; j < scalars.length; j++) {\n const n = scalars[j];\n const curr = Number((n >> shiftBy) & MASK);\n if (!curr) continue; // skip zero scalars chunks\n res = res.add(tables[j][curr - 1]);\n }\n }\n return res;\n };\n}\n\nexport type ValidCurveParams<T> = {\n p: bigint;\n n: bigint;\n h: bigint;\n a: T;\n b?: T;\n d?: T;\n Gx: T;\n Gy: T;\n};\n\nfunction createField<T>(order: bigint, field?: IField<T>, isLE?: boolean): IField<T> {\n if (field) {\n if (field.ORDER !== order) throw new Error('Field.ORDER must match order: Fp == p, Fn == n');\n validateField(field);\n return field;\n } else {\n return Field(order, { isLE }) as unknown as IField<T>;\n }\n}\nexport type FpFn<T> = { Fp: IField<T>; Fn: IField<bigint> };\n\n/** Validates CURVE opts and creates fields */\nexport function createCurveFields<T>(\n type: 'weierstrass' | 'edwards',\n CURVE: ValidCurveParams<T>,\n curveOpts: Partial<FpFn<T>> = {},\n FpFnLE?: boolean\n): FpFn<T> & { CURVE: ValidCurveParams<T> } {\n if (FpFnLE === undefined) FpFnLE = type === 'edwards';\n if (!CURVE || typeof CURVE !== 'object') throw new Error(`expected valid ${type} CURVE object`);\n for (const p of ['p', 'n', 'h'] as const) {\n const val = CURVE[p];\n if (!(typeof val === 'bigint' && val > _0n))\n throw new Error(`CURVE.${p} must be positive bigint`);\n }\n const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE);\n const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE);\n const _b: 'b' | 'd' = type === 'weierstrass' ? 'b' : 'd';\n const params = ['Gx', 'Gy', 'a', _b] as const;\n for (const p of params) {\n // @ts-ignore\n if (!Fp.isValid(CURVE[p]))\n throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);\n }\n CURVE = Object.freeze(Object.assign({}, CURVE));\n return { CURVE, Fp, Fn };\n}\n\ntype KeygenFn = (\n seed?: Uint8Array,\n isCompressed?: boolean\n) => { secretKey: Uint8Array; publicKey: Uint8Array };\nexport function createKeygen(\n randomSecretKey: Function,\n getPublicKey: Signer['getPublicKey']\n): KeygenFn {\n return function keygen(seed?: Uint8Array) {\n const secretKey = randomSecretKey(seed);\n return { secretKey, publicKey: getPublicKey(secretKey) };\n };\n}\n","/**\n * Twisted Edwards curve. The formula is: ax² + y² = 1 + dx²y².\n * For design rationale of types / exports, see weierstrass module documentation.\n * Untwisted Edwards curves exist, but they aren't used in real-world protocols.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n abool,\n abytes,\n aInRange,\n bytesToHex,\n bytesToNumberLE,\n concatBytes,\n copyBytes,\n hexToBytes,\n isBytes,\n memoized,\n notImplemented,\n validateObject,\n randomBytes as wcRandomBytes,\n type FHash,\n type Signer,\n} from '../utils.ts';\nimport {\n createCurveFields,\n createKeygen,\n normalizeZ,\n wNAF,\n type AffinePoint,\n type CurveLengths,\n type CurvePoint,\n type CurvePointCons,\n} from './curve.ts';\nimport { type IField } from './modular.ts';\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _8n = BigInt(8);\n\n/** Instance of Extended Point with coordinates in X, Y, Z, T. */\nexport interface EdwardsPoint extends CurvePoint<bigint, EdwardsPoint> {\n /** extended X coordinate. Different from affine x. */\n readonly X: bigint;\n /** extended Y coordinate. Different from affine y. */\n readonly Y: bigint;\n /** extended Z coordinate */\n readonly Z: bigint;\n /** extended T coordinate */\n readonly T: bigint;\n}\n/** Static methods of Extended Point with coordinates in X, Y, Z, T. */\nexport interface EdwardsPointCons extends CurvePointCons<EdwardsPoint> {\n new (X: bigint, Y: bigint, Z: bigint, T: bigint): EdwardsPoint;\n CURVE(): EdwardsOpts;\n fromBytes(bytes: Uint8Array, zip215?: boolean): EdwardsPoint;\n fromHex(hex: string, zip215?: boolean): EdwardsPoint;\n}\n\n/**\n * Twisted Edwards curve options.\n *\n * * a: formula param\n * * d: formula param\n * * p: prime characteristic (order) of finite field, in which arithmetics is done\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * h: cofactor. h*n is group order; n is subgroup order\n * * Gx: x coordinate of generator point a.k.a. base point\n * * Gy: y coordinate of generator point\n */\nexport type EdwardsOpts = Readonly<{\n p: bigint;\n n: bigint;\n h: bigint;\n a: bigint;\n d: bigint;\n Gx: bigint;\n Gy: bigint;\n}>;\n\n/**\n * Extra curve options for Twisted Edwards.\n *\n * * Fp: redefined Field over curve.p\n * * Fn: redefined Field over curve.n\n * * uvRatio: helper function for decompression, calculating √(u/v)\n */\nexport type EdwardsExtraOpts = Partial<{\n Fp: IField<bigint>;\n Fn: IField<bigint>;\n FpFnLE: boolean;\n uvRatio: (u: bigint, v: bigint) => { isValid: boolean; value: bigint };\n}>;\n\n/**\n * EdDSA (Edwards Digital Signature algorithm) options.\n *\n * * hash: hash function used to hash secret keys and messages\n * * adjustScalarBytes: clears bits to get valid field element\n * * domain: Used for hashing\n * * mapToCurve: for hash-to-curve standard\n * * prehash: RFC 8032 pre-hashing of messages to sign() / verify()\n * * randomBytes: function generating random bytes, used for randomSecretKey\n */\nexport type EdDSAOpts = Partial<{\n adjustScalarBytes: (bytes: Uint8Array) => Uint8Array;\n domain: (data: Uint8Array, ctx: Uint8Array, phflag: boolean) => Uint8Array;\n mapToCurve: (scalar: bigint[]) => AffinePoint<bigint>;\n prehash: FHash;\n randomBytes: (bytesLength?: number) => Uint8Array;\n}>;\n\n/**\n * EdDSA (Edwards Digital Signature algorithm) interface.\n *\n * Allows to create and verify signatures, create public and secret keys.\n */\nexport interface EdDSA {\n keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n getPublicKey: (secretKey: Uint8Array) => Uint8Array;\n sign: (\n message: Uint8Array,\n secretKey: Uint8Array,\n options?: { context?: Uint8Array }\n ) => Uint8Array;\n verify: (\n sig: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n options?: { context?: Uint8Array; zip215: boolean }\n ) => boolean;\n Point: EdwardsPointCons;\n utils: {\n randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n isValidSecretKey: (secretKey: Uint8Array) => boolean;\n isValidPublicKey: (publicKey: Uint8Array, zip215?: boolean) => boolean;\n\n /**\n * Converts ed public key to x public key.\n *\n * There is NO `fromMontgomery`:\n * - There are 2 valid ed25519 points for every x25519, with flipped coordinate\n * - Sometimes there are 0 valid ed25519 points, because x25519 *additionally*\n * accepts inputs on the quadratic twist, which can't be moved to ed25519\n *\n * @example\n * ```js\n * const someonesPub_ed = ed25519.getPublicKey(ed25519.utils.randomSecretKey());\n * const someonesPub = ed25519.utils.toMontgomery(someonesPub);\n * const aPriv = x25519.utils.randomSecretKey();\n * const shared = x25519.getSharedSecret(aPriv, someonesPub)\n * ```\n */\n toMontgomery: (publicKey: Uint8Array) => Uint8Array;\n /**\n * Converts ed secret key to x secret key.\n * @example\n * ```js\n * const someonesPub = x25519.getPublicKey(x25519.utils.randomSecretKey());\n * const aPriv_ed = ed25519.utils.randomSecretKey();\n * const aPriv = ed25519.utils.toMontgomerySecret(aPriv_ed);\n * const shared = x25519.getSharedSecret(aPriv, someonesPub)\n * ```\n */\n toMontgomerySecret: (secretKey: Uint8Array) => Uint8Array;\n getExtendedPublicKey: (key: Uint8Array) => {\n head: Uint8Array;\n prefix: Uint8Array;\n scalar: bigint;\n point: EdwardsPoint;\n pointBytes: Uint8Array;\n };\n };\n lengths: CurveLengths;\n}\n\nfunction isEdValidXY(Fp: IField<bigint>, CURVE: EdwardsOpts, x: bigint, y: bigint): boolean {\n const x2 = Fp.sqr(x);\n const y2 = Fp.sqr(y);\n const left = Fp.add(Fp.mul(CURVE.a, x2), y2);\n const right = Fp.add(Fp.ONE, Fp.mul(CURVE.d, Fp.mul(x2, y2)));\n return Fp.eql(left, right);\n}\n\nexport function edwards(params: EdwardsOpts, extraOpts: EdwardsExtraOpts = {}): EdwardsPointCons {\n const validated = createCurveFields('edwards', params, extraOpts, extraOpts.FpFnLE);\n const { Fp, Fn } = validated;\n let CURVE = validated.CURVE as EdwardsOpts;\n const { h: cofactor } = CURVE;\n validateObject(extraOpts, {}, { uvRatio: 'function' });\n\n // Important:\n // There are some places where Fp.BYTES is used instead of nByteLength.\n // So far, everything has been tested with curves of Fp.BYTES == nByteLength.\n // TODO: test and find curves which behave otherwise.\n const MASK = _2n << (BigInt(Fn.BYTES * 8) - _1n);\n const modP = (n: bigint) => Fp.create(n); // Function overrides\n\n // sqrt(u/v)\n const uvRatio =\n extraOpts.uvRatio ||\n ((u: bigint, v: bigint) => {\n try {\n return { isValid: true, value: Fp.sqrt(Fp.div(u, v)) };\n } catch (e) {\n return { isValid: false, value: _0n };\n }\n });\n\n // Validate whether the passed curve params are valid.\n // equation ax² + y² = 1 + dx²y² should work for generator point.\n if (!isEdValidXY(Fp, CURVE, CURVE.Gx, CURVE.Gy))\n throw new Error('bad curve params: generator point');\n\n /**\n * Asserts coordinate is valid: 0 <= n < MASK.\n * Coordinates >= Fp.ORDER are allowed for zip215.\n */\n function acoord(title: string, n: bigint, banZero = false) {\n const min = banZero ? _1n : _0n;\n aInRange('coordinate ' + title, n, min, MASK);\n return n;\n }\n\n function aedpoint(other: unknown) {\n if (!(other instanceof Point)) throw new Error('EdwardsPoint expected');\n }\n // Converts Extended point to default (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n const toAffineMemo = memoized((p: Point, iz?: bigint): AffinePoint<bigint> => {\n const { X, Y, Z } = p;\n const is0 = p.is0();\n if (iz == null) iz = is0 ? _8n : (Fp.inv(Z) as bigint); // 8 was chosen arbitrarily\n const x = modP(X * iz);\n const y = modP(Y * iz);\n const zz = Fp.mul(Z, iz);\n if (is0) return { x: _0n, y: _1n };\n if (zz !== _1n) throw new Error('invZ was invalid');\n return { x, y };\n });\n const assertValidMemo = memoized((p: Point) => {\n const { a, d } = CURVE;\n if (p.is0()) throw new Error('bad point: ZERO'); // TODO: optimize, with vars below?\n // Equation in affine coordinates: ax² + y² = 1 + dx²y²\n // Equation in projective coordinates (X/Z, Y/Z, Z): (aX² + Y²)Z² = Z⁴ + dX²Y²\n const { X, Y, Z, T } = p;\n const X2 = modP(X * X); // X²\n const Y2 = modP(Y * Y); // Y²\n const Z2 = modP(Z * Z); // Z²\n const Z4 = modP(Z2 * Z2); // Z⁴\n const aX2 = modP(X2 * a); // aX²\n const left = modP(Z2 * modP(aX2 + Y2)); // (aX² + Y²)Z²\n const right = modP(Z4 + modP(d * modP(X2 * Y2))); // Z⁴ + dX²Y²\n if (left !== right) throw new Error('bad point: equation left != right (1)');\n // In Extended coordinates we also have T, which is x*y=T/Z: check X*Y == Z*T\n const XY = modP(X * Y);\n const ZT = modP(Z * T);\n if (XY !== ZT) throw new Error('bad point: equation left != right (2)');\n return true;\n });\n\n // Extended Point works in extended coordinates: (X, Y, Z, T) ∋ (x=X/Z, y=Y/Z, T=xy).\n // https://en.wikipedia.org/wiki/Twisted_Edwards_curve#Extended_coordinates\n class Point implements EdwardsPoint {\n // base / generator point\n static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, _1n, modP(CURVE.Gx * CURVE.Gy));\n // zero / infinity / identity point\n static readonly ZERO = new Point(_0n, _1n, _1n, _0n); // 0, 1, 1, 0\n // math field\n static readonly Fp = Fp;\n // scalar field\n static readonly Fn = Fn;\n\n readonly X: bigint;\n readonly Y: bigint;\n readonly Z: bigint;\n readonly T: bigint;\n\n constructor(X: bigint, Y: bigint, Z: bigint, T: bigint) {\n this.X = acoord('x', X);\n this.Y = acoord('y', Y);\n this.Z = acoord('z', Z, true);\n this.T = acoord('t', T);\n Object.freeze(this);\n }\n\n static CURVE(): EdwardsOpts {\n return CURVE;\n }\n\n static fromAffine(p: AffinePoint<bigint>): Point {\n if (p instanceof Point) throw new Error('extended point not allowed');\n const { x, y } = p || {};\n acoord('x', x);\n acoord('y', y);\n return new Point(x, y, _1n, modP(x * y));\n }\n\n // Uses algo from RFC8032 5.1.3.\n static fromBytes(bytes: Uint8Array, zip215 = false): Point {\n const len = Fp.BYTES;\n const { a, d } = CURVE;\n bytes = copyBytes(abytes(bytes, len, 'point'));\n abool(zip215, 'zip215');\n const normed = copyBytes(bytes); // copy again, we'll manipulate it\n const lastByte = bytes[len - 1]; // select last byte\n normed[len - 1] = lastByte & ~0x80; // clear last bit\n const y = bytesToNumberLE(normed);\n\n // zip215=true is good for consensus-critical apps. =false follows RFC8032 / NIST186-5.\n // RFC8032 prohibits >= p, but ZIP215 doesn't\n // zip215=true: 0 <= y < MASK (2^256 for ed25519)\n // zip215=false: 0 <= y < P (2^255-19 for ed25519)\n const max = zip215 ? MASK : Fp.ORDER;\n aInRange('point.y', y, _0n, max);\n\n // Ed25519: x² = (y²-1)/(dy²+1) mod p. Ed448: x² = (y²-1)/(dy²-1) mod p. Generic case:\n // ax²+y²=1+dx²y² => y²-1=dx²y²-ax² => y²-1=x²(dy²-a) => x²=(y²-1)/(dy²-a)\n const y2 = modP(y * y); // denominator is always non-0 mod p.\n const u = modP(y2 - _1n); // u = y² - 1\n const v = modP(d * y2 - a); // v = d y² + 1.\n let { isValid, value: x } = uvRatio(u, v); // √(u/v)\n if (!isValid) throw new Error('bad point: invalid y coordinate');\n const isXOdd = (x & _1n) === _1n; // There are 2 square roots. Use x_0 bit to select proper\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (!zip215 && x === _0n && isLastByteOdd)\n // if x=0 and x_0 = 1, fail\n throw new Error('bad point: x=0 and x_0=1');\n if (isLastByteOdd !== isXOdd) x = modP(-x); // if x_0 != x mod 2, set x = p-x\n return Point.fromAffine({ x, y });\n }\n\n static fromHex(hex: string, zip215 = false): Point {\n return Point.fromBytes(hexToBytes(hex), zip215);\n }\n\n get x(): bigint {\n return this.toAffine().x;\n }\n get y(): bigint {\n return this.toAffine().y;\n }\n\n precompute(windowSize: number = 8, isLazy = true) {\n wnaf.createCache(this, windowSize);\n if (!isLazy) this.multiply(_2n); // random number\n return this;\n }\n\n // Useful in fromAffine() - not for fromBytes(), which always created valid points.\n assertValidity(): void {\n assertValidMemo(this);\n }\n\n // Compare one point to another.\n equals(other: Point): boolean {\n aedpoint(other);\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = other;\n const X1Z2 = modP(X1 * Z2);\n const X2Z1 = modP(X2 * Z1);\n const Y1Z2 = modP(Y1 * Z2);\n const Y2Z1 = modP(Y2 * Z1);\n return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;\n }\n\n is0(): boolean {\n return this.equals(Point.ZERO);\n }\n\n negate(): Point {\n // Flips point sign to a negative one (-x, y in affine coords)\n return new Point(modP(-this.X), this.Y, this.Z, modP(-this.T));\n }\n\n // Fast algo for doubling Extended Point.\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd\n // Cost: 4M + 4S + 1*a + 6add + 1*2.\n double(): Point {\n const { a } = CURVE;\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const A = modP(X1 * X1); // A = X12\n const B = modP(Y1 * Y1); // B = Y12\n const C = modP(_2n * modP(Z1 * Z1)); // C = 2*Z12\n const D = modP(a * A); // D = a*A\n const x1y1 = X1 + Y1;\n const E = modP(modP(x1y1 * x1y1) - A - B); // E = (X1+Y1)2-A-B\n const G = D + B; // G = D+B\n const F = G - C; // F = G-C\n const H = D - B; // H = D-B\n const X3 = modP(E * F); // X3 = E*F\n const Y3 = modP(G * H); // Y3 = G*H\n const T3 = modP(E * H); // T3 = E*H\n const Z3 = modP(F * G); // Z3 = F*G\n return new Point(X3, Y3, Z3, T3);\n }\n\n // Fast algo for adding 2 Extended Points.\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd\n // Cost: 9M + 1*a + 1*d + 7add.\n add(other: Point) {\n aedpoint(other);\n const { a, d } = CURVE;\n const { X: X1, Y: Y1, Z: Z1, T: T1 } = this;\n const { X: X2, Y: Y2, Z: Z2, T: T2 } = other;\n const A = modP(X1 * X2); // A = X1*X2\n const B = modP(Y1 * Y2); // B = Y1*Y2\n const C = modP(T1 * d * T2); // C = T1*d*T2\n const D = modP(Z1 * Z2); // D = Z1*Z2\n const E = modP((X1 + Y1) * (X2 + Y2) - A - B); // E = (X1+Y1)*(X2+Y2)-A-B\n const F = D - C; // F = D-C\n const G = D + C; // G = D+C\n const H = modP(B - a * A); // H = B-a*A\n const X3 = modP(E * F); // X3 = E*F\n const Y3 = modP(G * H); // Y3 = G*H\n const T3 = modP(E * H); // T3 = E*H\n const Z3 = modP(F * G); // Z3 = F*G\n return new Point(X3, Y3, Z3, T3);\n }\n\n subtract(other: Point): Point {\n return this.add(other.negate());\n }\n\n // Constant-time multiplication.\n multiply(scalar: bigint): Point {\n // 1 <= scalar < L\n if (!Fn.isValidNot0(scalar)) throw new Error('invalid scalar: expected 1 <= sc < curve.n');\n const { p, f } = wnaf.cached(this, scalar, (p) => normalizeZ(Point, p));\n return normalizeZ(Point, [p, f])[0];\n }\n\n // Non-constant-time multiplication. Uses double-and-add algorithm.\n // It's faster, but should only be used when you don't care about\n // an exposed private key e.g. sig verification.\n // Does NOT allow scalars higher than CURVE.n.\n // Accepts optional accumulator to merge with multiply (important for sparse scalars)\n multiplyUnsafe(scalar: bigint, acc = Point.ZERO): Point {\n // 0 <= scalar < L\n if (!Fn.isValid(scalar)) throw new Error('invalid scalar: expected 0 <= sc < curve.n');\n if (scalar === _0n) return Point.ZERO;\n if (this.is0() || scalar === _1n) return this;\n return wnaf.unsafe(this, scalar, (p) => normalizeZ(Point, p), acc);\n }\n\n // Checks if point is of small order.\n // If you add something to small order point, you will have \"dirty\"\n // point with torsion component.\n // Multiplies point by cofactor and checks if the result is 0.\n isSmallOrder(): boolean {\n return this.multiplyUnsafe(cofactor).is0();\n }\n\n // Multiplies point by curve order and checks if the result is 0.\n // Returns `false` is the point is dirty.\n isTorsionFree(): boolean {\n return wnaf.unsafe(this, CURVE.n).is0();\n }\n\n // Converts Extended point to default (x, y) coordinates.\n // Can accept precomputed Z^-1 - for example, from invertBatch.\n toAffine(invertedZ?: bigint): AffinePoint<bigint> {\n return toAffineMemo(this, invertedZ);\n }\n\n clearCofactor(): Point {\n if (cofactor === _1n) return this;\n return this.multiplyUnsafe(cofactor);\n }\n\n toBytes(): Uint8Array {\n const { x, y } = this.toAffine();\n // Fp.toBytes() allows non-canonical encoding of y (>= p).\n const bytes = Fp.toBytes(y);\n // Each y has 2 valid points: (x, y), (x,-y).\n // When compressing, it's enough to store y and use the last byte to encode sign of x\n bytes[bytes.length - 1] |= x & _1n ? 0x80 : 0;\n return bytes;\n }\n toHex(): string {\n return bytesToHex(this.toBytes());\n }\n\n toString() {\n return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n }\n }\n const wnaf = new wNAF(Point, Fn.BITS);\n Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n return Point;\n}\n\n/**\n * Base class for prime-order points like Ristretto255 and Decaf448.\n * These points eliminate cofactor issues by representing equivalence classes\n * of Edwards curve points.\n */\nexport abstract class PrimeEdwardsPoint<T extends PrimeEdwardsPoint<T>>\n implements CurvePoint<bigint, T>\n{\n static BASE: PrimeEdwardsPoint<any>;\n static ZERO: PrimeEdwardsPoint<any>;\n static Fp: IField<bigint>;\n static Fn: IField<bigint>;\n\n protected readonly ep: EdwardsPoint;\n\n constructor(ep: EdwardsPoint) {\n this.ep = ep;\n }\n\n // Abstract methods that must be implemented by subclasses\n abstract toBytes(): Uint8Array;\n abstract equals(other: T): boolean;\n\n // Static methods that must be implemented by subclasses\n static fromBytes(_bytes: Uint8Array): any {\n notImplemented();\n }\n\n static fromHex(_hex: string): any {\n notImplemented();\n }\n\n get x(): bigint {\n return this.toAffine().x;\n }\n get y(): bigint {\n return this.toAffine().y;\n }\n\n // Common implementations\n clearCofactor(): T {\n // no-op for prime-order groups\n return this as any;\n }\n\n assertValidity(): void {\n this.ep.assertValidity();\n }\n\n toAffine(invertedZ?: bigint): AffinePoint<bigint> {\n return this.ep.toAffine(invertedZ);\n }\n\n toHex(): string {\n return bytesToHex(this.toBytes());\n }\n\n toString(): string {\n return this.toHex();\n }\n\n isTorsionFree(): boolean {\n return true;\n }\n\n isSmallOrder(): boolean {\n return false;\n }\n\n add(other: T): T {\n this.assertSame(other);\n return this.init(this.ep.add(other.ep));\n }\n\n subtract(other: T): T {\n this.assertSame(other);\n return this.init(this.ep.subtract(other.ep));\n }\n\n multiply(scalar: bigint): T {\n return this.init(this.ep.multiply(scalar));\n }\n\n multiplyUnsafe(scalar: bigint): T {\n return this.init(this.ep.multiplyUnsafe(scalar));\n }\n\n double(): T {\n return this.init(this.ep.double());\n }\n\n negate(): T {\n return this.init(this.ep.negate());\n }\n\n precompute(windowSize?: number, isLazy?: boolean): T {\n return this.init(this.ep.precompute(windowSize, isLazy));\n }\n\n // Helper methods\n abstract is0(): boolean;\n protected abstract assertSame(other: T): void;\n protected abstract init(ep: EdwardsPoint): T;\n}\n\n/**\n * Initializes EdDSA signatures over given Edwards curve.\n */\nexport function eddsa(Point: EdwardsPointCons, cHash: FHash, eddsaOpts: EdDSAOpts = {}): EdDSA {\n if (typeof cHash !== 'function') throw new Error('\"hash\" function param is required');\n validateObject(\n eddsaOpts,\n {},\n {\n adjustScalarBytes: 'function',\n randomBytes: 'function',\n domain: 'function',\n prehash: 'function',\n mapToCurve: 'function',\n }\n );\n\n const { prehash } = eddsaOpts;\n const { BASE, Fp, Fn } = Point;\n\n const randomBytes = eddsaOpts.randomBytes || wcRandomBytes;\n const adjustScalarBytes = eddsaOpts.adjustScalarBytes || ((bytes: Uint8Array) => bytes);\n const domain =\n eddsaOpts.domain ||\n ((data: Uint8Array, ctx: Uint8Array, phflag: boolean) => {\n abool(phflag, 'phflag');\n if (ctx.length || phflag) throw new Error('Contexts/pre-hash are not supported');\n return data;\n }); // NOOP\n\n // Little-endian SHA512 with modulo n\n function modN_LE(hash: Uint8Array): bigint {\n return Fn.create(bytesToNumberLE(hash)); // Not Fn.fromBytes: it has length limit\n }\n\n // Get the hashed private scalar per RFC8032 5.1.5\n function getPrivateScalar(key: Uint8Array) {\n const len = lengths.secretKey;\n abytes(key, lengths.secretKey, 'secretKey');\n // Hash private key with curve's hash function to produce uniformingly random input\n // Check byte lengths: ensure(64, h(ensure(32, key)))\n const hashed = abytes(cHash(key), 2 * len, 'hashedSecretKey');\n const head = adjustScalarBytes(hashed.slice(0, len)); // clear first half bits, produce FE\n const prefix = hashed.slice(len, 2 * len); // second half is called key prefix (5.1.6)\n const scalar = modN_LE(head); // The actual private scalar\n return { head, prefix, scalar };\n }\n\n /** Convenience method that creates public key from scalar. RFC8032 5.1.5 */\n function getExtendedPublicKey(secretKey: Uint8Array) {\n const { head, prefix, scalar } = getPrivateScalar(secretKey);\n const point = BASE.multiply(scalar); // Point on Edwards curve aka public key\n const pointBytes = point.toBytes();\n return { head, prefix, scalar, point, pointBytes };\n }\n\n /** Calculates EdDSA pub key. RFC8032 5.1.5. */\n function getPublicKey(secretKey: Uint8Array): Uint8Array {\n return getExtendedPublicKey(secretKey).pointBytes;\n }\n\n // int('LE', SHA512(dom2(F, C) || msgs)) mod N\n function hashDomainToScalar(context: Uint8Array = Uint8Array.of(), ...msgs: Uint8Array[]) {\n const msg = concatBytes(...msgs);\n return modN_LE(cHash(domain(msg, abytes(context, undefined, 'context'), !!prehash)));\n }\n\n /** Signs message with secret key. RFC8032 5.1.6 */\n function sign(\n msg: Uint8Array,\n secretKey: Uint8Array,\n options: { context?: Uint8Array } = {}\n ): Uint8Array {\n msg = abytes(msg, undefined, 'message');\n if (prehash) msg = prehash(msg); // for ed25519ph etc.\n const { prefix, scalar, pointBytes } = getExtendedPublicKey(secretKey);\n const r = hashDomainToScalar(options.context, prefix, msg); // r = dom2(F, C) || prefix || PH(M)\n const R = BASE.multiply(r).toBytes(); // R = rG\n const k = hashDomainToScalar(options.context, R, pointBytes, msg); // R || A || PH(M)\n const s = Fn.create(r + k * scalar); // S = (r + k * s) mod L\n if (!Fn.isValid(s)) throw new Error('sign failed: invalid s'); // 0 <= s < L\n const rs = concatBytes(R, Fn.toBytes(s));\n return abytes(rs, lengths.signature, 'result');\n }\n\n // verification rule is either zip215 or rfc8032 / nist186-5. Consult fromHex:\n const verifyOpts: { context?: Uint8Array; zip215?: boolean } = { zip215: true };\n\n /**\n * Verifies EdDSA signature against message and public key. RFC8032 5.1.7.\n * An extended group equation is checked.\n */\n function verify(\n sig: Uint8Array,\n msg: Uint8Array,\n publicKey: Uint8Array,\n options = verifyOpts\n ): boolean {\n const { context, zip215 } = options;\n const len = lengths.signature;\n sig = abytes(sig, len, 'signature');\n msg = abytes(msg, undefined, 'message');\n publicKey = abytes(publicKey, lengths.publicKey, 'publicKey');\n if (zip215 !== undefined) abool(zip215, 'zip215');\n if (prehash) msg = prehash(msg); // for ed25519ph, etc\n\n const mid = len / 2;\n const r = sig.subarray(0, mid);\n const s = bytesToNumberLE(sig.subarray(mid, len));\n let A, R, SB;\n try {\n // zip215=true is good for consensus-critical apps. =false follows RFC8032 / NIST186-5.\n // zip215=true: 0 <= y < MASK (2^256 for ed25519)\n // zip215=false: 0 <= y < P (2^255-19 for ed25519)\n A = Point.fromBytes(publicKey, zip215);\n R = Point.fromBytes(r, zip215);\n SB = BASE.multiplyUnsafe(s); // 0 <= s < l is done inside\n } catch (error) {\n return false;\n }\n if (!zip215 && A.isSmallOrder()) return false; // zip215 allows public keys of small order\n\n const k = hashDomainToScalar(context, R.toBytes(), A.toBytes(), msg);\n const RkA = R.add(A.multiplyUnsafe(k));\n // Extended group equation\n // [8][S]B = [8]R + [8][k]A'\n return RkA.subtract(SB).clearCofactor().is0();\n }\n\n const _size = Fp.BYTES; // 32 for ed25519, 57 for ed448\n const lengths = {\n secretKey: _size,\n publicKey: _size,\n signature: 2 * _size,\n seed: _size,\n };\n function randomSecretKey(seed = randomBytes(lengths.seed)): Uint8Array {\n return abytes(seed, lengths.seed, 'seed');\n }\n\n function isValidSecretKey(key: Uint8Array): boolean {\n return isBytes(key) && key.length === Fn.BYTES;\n }\n\n function isValidPublicKey(key: Uint8Array, zip215?: boolean): boolean {\n try {\n return !!Point.fromBytes(key, zip215);\n } catch (error) {\n return false;\n }\n }\n\n const utils = {\n getExtendedPublicKey,\n randomSecretKey,\n isValidSecretKey,\n isValidPublicKey,\n /**\n * Converts ed public key to x public key. Uses formula:\n * - ed25519:\n * - `(u, v) = ((1+y)/(1-y), sqrt(-486664)*u/x)`\n * - `(x, y) = (sqrt(-486664)*u/v, (u-1)/(u+1))`\n * - ed448:\n * - `(u, v) = ((y-1)/(y+1), sqrt(156324)*u/x)`\n * - `(x, y) = (sqrt(156324)*u/v, (1+u)/(1-u))`\n */\n toMontgomery(publicKey: Uint8Array): Uint8Array {\n const { y } = Point.fromBytes(publicKey);\n const size = lengths.publicKey;\n const is25519 = size === 32;\n if (!is25519 && size !== 57) throw new Error('only defined for 25519 and 448');\n const u = is25519 ? Fp.div(_1n + y, _1n - y) : Fp.div(y - _1n, y + _1n);\n return Fp.toBytes(u);\n },\n toMontgomerySecret(secretKey: Uint8Array): Uint8Array {\n const size = lengths.secretKey;\n abytes(secretKey, size);\n const hashed = cHash(secretKey.subarray(0, size));\n return adjustScalarBytes(hashed).subarray(0, size);\n },\n };\n\n return Object.freeze({\n keygen: createKeygen(randomSecretKey, getPublicKey),\n getPublicKey,\n sign,\n verify,\n utils,\n Point,\n lengths,\n }) satisfies Signer;\n}\n","/**\n * ed25519 Twisted Edwards curve with following addons:\n * - X25519 ECDH\n * - Ristretto cofactor elimination\n * - Elligator hash-to-group / point indistinguishability\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha512 } from '@noble/hashes/sha2.js';\nimport { abytes, concatBytes, hexToBytes } from '@noble/hashes/utils.js';\nimport { type AffinePoint } from './abstract/curve.ts';\nimport {\n eddsa,\n edwards,\n PrimeEdwardsPoint,\n type EdDSA,\n type EdDSAOpts,\n type EdwardsOpts,\n type EdwardsPoint,\n type EdwardsPointCons,\n} from './abstract/edwards.ts';\nimport {\n _DST_scalar,\n createHasher,\n expand_message_xmd,\n type H2CDSTOpts,\n type H2CHasher,\n type H2CHasherBase,\n} from './abstract/hash-to-curve.ts';\nimport {\n FpInvertBatch,\n FpSqrtEven,\n isNegativeLE,\n mod,\n pow2,\n type IField,\n} from './abstract/modular.ts';\nimport { montgomery, type MontgomeryECDH } from './abstract/montgomery.ts';\nimport { createORPF, type OPRF } from './abstract/oprf.ts';\nimport { asciiToBytes, bytesToNumberLE, equalBytes } from './utils.ts';\n\n// prettier-ignore\nconst _0n = /* @__PURE__ */ BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = /* @__PURE__ */ BigInt(3);\n// prettier-ignore\nconst _5n = BigInt(5), _8n = BigInt(8);\n\n// P = 2n**255n - 19n\nconst ed25519_CURVE_p = BigInt(\n '0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed'\n);\n// N = 2n**252n + 27742317777372353535851937790883648493n\n// a = Fp.create(BigInt(-1))\n// d = -121665/121666 a.k.a. Fp.neg(121665 * Fp.inv(121666))\nconst ed25519_CURVE: EdwardsOpts = /* @__PURE__ */ (() => ({\n p: ed25519_CURVE_p,\n n: BigInt('0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed'),\n h: _8n,\n a: BigInt('0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec'),\n d: BigInt('0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3'),\n Gx: BigInt('0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a'),\n Gy: BigInt('0x6666666666666666666666666666666666666666666666666666666666666658'),\n}))();\n\nfunction ed25519_pow_2_252_3(x: bigint) {\n // prettier-ignore\n const _10n = BigInt(10), _20n = BigInt(20), _40n = BigInt(40), _80n = BigInt(80);\n const P = ed25519_CURVE_p;\n const x2 = (x * x) % P;\n const b2 = (x2 * x) % P; // x^3, 11\n const b4 = (pow2(b2, _2n, P) * b2) % P; // x^15, 1111\n const b5 = (pow2(b4, _1n, P) * x) % P; // x^31\n const b10 = (pow2(b5, _5n, P) * b5) % P;\n const b20 = (pow2(b10, _10n, P) * b10) % P;\n const b40 = (pow2(b20, _20n, P) * b20) % P;\n const b80 = (pow2(b40, _40n, P) * b40) % P;\n const b160 = (pow2(b80, _80n, P) * b80) % P;\n const b240 = (pow2(b160, _80n, P) * b80) % P;\n const b250 = (pow2(b240, _10n, P) * b10) % P;\n const pow_p_5_8 = (pow2(b250, _2n, P) * x) % P;\n // ^ To pow to (p+3)/8, multiply it by x.\n return { pow_p_5_8, b2 };\n}\n\nfunction adjustScalarBytes(bytes: Uint8Array): Uint8Array {\n // Section 5: For X25519, in order to decode 32 random bytes as an integer scalar,\n // set the three least significant bits of the first byte\n bytes[0] &= 248; // 0b1111_1000\n // and the most significant bit of the last to zero,\n bytes[31] &= 127; // 0b0111_1111\n // set the second most significant bit of the last byte to 1\n bytes[31] |= 64; // 0b0100_0000\n return bytes;\n}\n\n// √(-1) aka √(a) aka 2^((p-1)/4)\n// Fp.sqrt(Fp.neg(1))\nconst ED25519_SQRT_M1 = /* @__PURE__ */ BigInt(\n '19681161376707505956807079304988542015446066515923890162744021073123829784752'\n);\n// sqrt(u/v)\nfunction uvRatio(u: bigint, v: bigint): { isValid: boolean; value: bigint } {\n const P = ed25519_CURVE_p;\n const v3 = mod(v * v * v, P); // v³\n const v7 = mod(v3 * v3 * v, P); // v⁷\n // (p+3)/8 and (p-5)/8\n const pow = ed25519_pow_2_252_3(u * v7).pow_p_5_8;\n let x = mod(u * v3 * pow, P); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = mod(v * x * x, P); // vx²\n const root1 = x; // First root candidate\n const root2 = mod(x * ED25519_SQRT_M1, P); // Second root candidate\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === mod(-u, P); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === mod(-u * ED25519_SQRT_M1, P); // There is no valid root, vx² = -u√(-1)\n if (useRoot1) x = root1;\n if (useRoot2 || noRoot) x = root2; // We return root2 anyway, for const-time\n if (isNegativeLE(x, P)) x = mod(-x, P);\n return { isValid: useRoot1 || useRoot2, value: x };\n}\n\nconst ed25519_Point = /* @__PURE__ */ edwards(ed25519_CURVE, { uvRatio });\nconst Fp = /* @__PURE__ */ (() => ed25519_Point.Fp)();\nconst Fn = /* @__PURE__ */ (() => ed25519_Point.Fn)();\n\nfunction ed25519_domain(data: Uint8Array, ctx: Uint8Array, phflag: boolean) {\n if (ctx.length > 255) throw new Error('Context is too big');\n return concatBytes(\n asciiToBytes('SigEd25519 no Ed25519 collisions'),\n new Uint8Array([phflag ? 1 : 0, ctx.length]),\n ctx,\n data\n );\n}\n\nfunction ed(opts: EdDSAOpts) {\n return eddsa(ed25519_Point, sha512, Object.assign({ adjustScalarBytes }, opts));\n}\n\n/**\n * ed25519 curve with EdDSA signatures.\n * @example\n * ```js\n * import { ed25519 } from '@noble/curves/ed25519.js';\n * const { secretKey, publicKey } = ed25519.keygen();\n * // const publicKey = ed25519.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello noble');\n * const sig = ed25519.sign(msg, secretKey);\n * const isValid = ed25519.verify(sig, msg, pub); // ZIP215\n * // RFC8032 / FIPS 186-5\n * const isValid2 = ed25519.verify(sig, msg, pub, { zip215: false });\n * ```\n */\nexport const ed25519: EdDSA = /* @__PURE__ */ ed({});\n/** Context version of ed25519 (ctx for domain separation). See {@link ed25519} */\nexport const ed25519ctx: EdDSA = /* @__PURE__ */ ed({ domain: ed25519_domain });\n/** Prehashed version of ed25519. See {@link ed25519} */\nexport const ed25519ph: EdDSA = /* @__PURE__ */ ed({ domain: ed25519_domain, prehash: sha512 });\n\n/**\n * ECDH using curve25519 aka x25519.\n * @example\n * ```js\n * import { x25519 } from '@noble/curves/ed25519.js';\n * const alice = x25519.keygen();\n * const bob = x25519.keygen();\n * const shared = x25519.getSharedSecret(alice.secretKey, bob.publicKey);\n * ```\n */\nexport const x25519: MontgomeryECDH = /* @__PURE__ */ (() => {\n const P = ed25519_CURVE_p;\n return montgomery({\n P,\n type: 'x25519',\n powPminus2: (x: bigint): bigint => {\n // x^(p-2) aka x^(2^255-21)\n const { pow_p_5_8, b2 } = ed25519_pow_2_252_3(x);\n return mod(pow2(pow_p_5_8, _3n, P) * b2, P);\n },\n adjustScalarBytes,\n });\n})();\n\n// Hash To Curve Elligator2 Map (NOTE: different from ristretto255 elligator)\n// NOTE: very important part is usage of FpSqrtEven for ELL2_C1_EDWARDS, since\n// SageMath returns different root first and everything falls apart\nconst ELL2_C1 = /* @__PURE__ */ (() => (ed25519_CURVE_p + _3n) / _8n)(); // 1. c1 = (q + 3) / 8 # Integer arithmetic\nconst ELL2_C2 = /* @__PURE__ */ (() => Fp.pow(_2n, ELL2_C1))(); // 2. c2 = 2^c1\nconst ELL2_C3 = /* @__PURE__ */ (() => Fp.sqrt(Fp.neg(Fp.ONE)))(); // 3. c3 = sqrt(-1)\n\n/**\n * RFC 9380 method `map_to_curve_elligator2_curve25519`. Experimental name: may be renamed later.\n * @private\n */\n// prettier-ignore\nexport function _map_to_curve_elligator2_curve25519(u: bigint): {\n xMn: bigint, xMd: bigint, yMn: bigint, yMd: bigint\n} {\n const ELL2_C4 = (ed25519_CURVE_p - _5n) / _8n; // 4. c4 = (q - 5) / 8 # Integer arithmetic\n const ELL2_J = BigInt(486662);\n\n let tv1 = Fp.sqr(u); // 1. tv1 = u^2\n tv1 = Fp.mul(tv1, _2n); // 2. tv1 = 2 * tv1\n let xd = Fp.add(tv1, Fp.ONE); // 3. xd = tv1 + 1 # Nonzero: -1 is square (mod p), tv1 is not\n let x1n = Fp.neg(ELL2_J); // 4. x1n = -J # x1 = x1n / xd = -J / (1 + 2 * u^2)\n let tv2 = Fp.sqr(xd); // 5. tv2 = xd^2\n let gxd = Fp.mul(tv2, xd); // 6. gxd = tv2 * xd # gxd = xd^3\n let gx1 = Fp.mul(tv1, ELL2_J);// 7. gx1 = J * tv1 # x1n + J * xd\n gx1 = Fp.mul(gx1, x1n); // 8. gx1 = gx1 * x1n # x1n^2 + J * x1n * xd\n gx1 = Fp.add(gx1, tv2); // 9. gx1 = gx1 + tv2 # x1n^2 + J * x1n * xd + xd^2\n gx1 = Fp.mul(gx1, x1n); // 10. gx1 = gx1 * x1n # x1n^3 + J * x1n^2 * xd + x1n * xd^2\n let tv3 = Fp.sqr(gxd); // 11. tv3 = gxd^2\n tv2 = Fp.sqr(tv3); // 12. tv2 = tv3^2 # gxd^4\n tv3 = Fp.mul(tv3, gxd); // 13. tv3 = tv3 * gxd # gxd^3\n tv3 = Fp.mul(tv3, gx1); // 14. tv3 = tv3 * gx1 # gx1 * gxd^3\n tv2 = Fp.mul(tv2, tv3); // 15. tv2 = tv2 * tv3 # gx1 * gxd^7\n let y11 = Fp.pow(tv2, ELL2_C4); // 16. y11 = tv2^c4 # (gx1 * gxd^7)^((p - 5) / 8)\n y11 = Fp.mul(y11, tv3); // 17. y11 = y11 * tv3 # gx1*gxd^3*(gx1*gxd^7)^((p-5)/8)\n let y12 = Fp.mul(y11, ELL2_C3); // 18. y12 = y11 * c3\n tv2 = Fp.sqr(y11); // 19. tv2 = y11^2\n tv2 = Fp.mul(tv2, gxd); // 20. tv2 = tv2 * gxd\n let e1 = Fp.eql(tv2, gx1); // 21. e1 = tv2 == gx1\n let y1 = Fp.cmov(y12, y11, e1); // 22. y1 = CMOV(y12, y11, e1) # If g(x1) is square, this is its sqrt\n let x2n = Fp.mul(x1n, tv1); // 23. x2n = x1n * tv1 # x2 = x2n / xd = 2 * u^2 * x1n / xd\n let y21 = Fp.mul(y11, u); // 24. y21 = y11 * u\n y21 = Fp.mul(y21, ELL2_C2); // 25. y21 = y21 * c2\n let y22 = Fp.mul(y21, ELL2_C3); // 26. y22 = y21 * c3\n let gx2 = Fp.mul(gx1, tv1); // 27. gx2 = gx1 * tv1 # g(x2) = gx2 / gxd = 2 * u^2 * g(x1)\n tv2 = Fp.sqr(y21); // 28. tv2 = y21^2\n tv2 = Fp.mul(tv2, gxd); // 29. tv2 = tv2 * gxd\n let e2 = Fp.eql(tv2, gx2); // 30. e2 = tv2 == gx2\n let y2 = Fp.cmov(y22, y21, e2); // 31. y2 = CMOV(y22, y21, e2) # If g(x2) is square, this is its sqrt\n tv2 = Fp.sqr(y1); // 32. tv2 = y1^2\n tv2 = Fp.mul(tv2, gxd); // 33. tv2 = tv2 * gxd\n let e3 = Fp.eql(tv2, gx1); // 34. e3 = tv2 == gx1\n let xn = Fp.cmov(x2n, x1n, e3); // 35. xn = CMOV(x2n, x1n, e3) # If e3, x = x1, else x = x2\n let y = Fp.cmov(y2, y1, e3); // 36. y = CMOV(y2, y1, e3) # If e3, y = y1, else y = y2\n let e4 = Fp.isOdd!(y); // 37. e4 = sgn0(y) == 1 # Fix sign of y\n y = Fp.cmov(y, Fp.neg(y), e3 !== e4); // 38. y = CMOV(y, -y, e3 XOR e4)\n return { xMn: xn, xMd: xd, yMn: y, yMd: _1n }; // 39. return (xn, xd, y, 1)\n}\n\nconst ELL2_C1_EDWARDS = /* @__PURE__ */ (() => FpSqrtEven(Fp, Fp.neg(BigInt(486664))))(); // sgn0(c1) MUST equal 0\nfunction map_to_curve_elligator2_edwards25519(u: bigint) {\n const { xMn, xMd, yMn, yMd } = _map_to_curve_elligator2_curve25519(u); // 1. (xMn, xMd, yMn, yMd) =\n // map_to_curve_elligator2_curve25519(u)\n let xn = Fp.mul(xMn, yMd); // 2. xn = xMn * yMd\n xn = Fp.mul(xn, ELL2_C1_EDWARDS); // 3. xn = xn * c1\n let xd = Fp.mul(xMd, yMn); // 4. xd = xMd * yMn # xn / xd = c1 * xM / yM\n let yn = Fp.sub(xMn, xMd); // 5. yn = xMn - xMd\n let yd = Fp.add(xMn, xMd); // 6. yd = xMn + xMd # (n / d - 1) / (n / d + 1) = (n - d) / (n + d)\n let tv1 = Fp.mul(xd, yd); // 7. tv1 = xd * yd\n let e = Fp.eql(tv1, Fp.ZERO); // 8. e = tv1 == 0\n xn = Fp.cmov(xn, Fp.ZERO, e); // 9. xn = CMOV(xn, 0, e)\n xd = Fp.cmov(xd, Fp.ONE, e); // 10. xd = CMOV(xd, 1, e)\n yn = Fp.cmov(yn, Fp.ONE, e); // 11. yn = CMOV(yn, 1, e)\n yd = Fp.cmov(yd, Fp.ONE, e); // 12. yd = CMOV(yd, 1, e)\n const [xd_inv, yd_inv] = FpInvertBatch(Fp, [xd, yd], true); // batch division\n return { x: Fp.mul(xn, xd_inv), y: Fp.mul(yn, yd_inv) }; // 13. return (xn, xd, yn, yd)\n}\n\n/** Hashing to ed25519 points / field. RFC 9380 methods. */\nexport const ed25519_hasher: H2CHasher<EdwardsPointCons> = /* @__PURE__ */ (() =>\n createHasher(\n ed25519_Point,\n (scalars: bigint[]) => map_to_curve_elligator2_edwards25519(scalars[0]),\n {\n DST: 'edwards25519_XMD:SHA-512_ELL2_RO_',\n encodeDST: 'edwards25519_XMD:SHA-512_ELL2_NU_',\n p: ed25519_CURVE_p,\n m: 1,\n k: 128,\n expand: 'xmd',\n hash: sha512,\n }\n ))();\n\n// √(-1) aka √(a) aka 2^((p-1)/4)\nconst SQRT_M1 = ED25519_SQRT_M1;\n// √(ad - 1)\nconst SQRT_AD_MINUS_ONE = /* @__PURE__ */ BigInt(\n '25063068953384623474111414158702152701244531502492656460079210482610430750235'\n);\n// 1 / √(a-d)\nconst INVSQRT_A_MINUS_D = /* @__PURE__ */ BigInt(\n '54469307008909316920995813868745141605393597292927456921205312896311721017578'\n);\n// 1-d²\nconst ONE_MINUS_D_SQ = /* @__PURE__ */ BigInt(\n '1159843021668779879193775521855586647937357759715417654439879720876111806838'\n);\n// (d-1)²\nconst D_MINUS_ONE_SQ = /* @__PURE__ */ BigInt(\n '40440834346308536858101042469323190826248399146238708352240133220865137265952'\n);\n// Calculates 1/√(number)\nconst invertSqrt = (number: bigint) => uvRatio(_1n, number);\n\nconst MAX_255B = /* @__PURE__ */ BigInt(\n '0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n);\nconst bytes255ToNumberLE = (bytes: Uint8Array) => Fp.create(bytesToNumberLE(bytes) & MAX_255B);\n\n/**\n * Computes Elligator map for Ristretto255.\n * Described in [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#appendix-B) and on\n * the [website](https://ristretto.group/formulas/elligator.html).\n */\nfunction calcElligatorRistrettoMap(r0: bigint): EdwardsPoint {\n const { d } = ed25519_CURVE;\n const P = ed25519_CURVE_p;\n const mod = (n: bigint) => Fp.create(n);\n const r = mod(SQRT_M1 * r0 * r0); // 1\n const Ns = mod((r + _1n) * ONE_MINUS_D_SQ); // 2\n let c = BigInt(-1); // 3\n const D = mod((c - d * r) * mod(r + d)); // 4\n let { isValid: Ns_D_is_sq, value: s } = uvRatio(Ns, D); // 5\n let s_ = mod(s * r0); // 6\n if (!isNegativeLE(s_, P)) s_ = mod(-s_);\n if (!Ns_D_is_sq) s = s_; // 7\n if (!Ns_D_is_sq) c = r; // 8\n const Nt = mod(c * (r - _1n) * D_MINUS_ONE_SQ - D); // 9\n const s2 = s * s;\n const W0 = mod((s + s) * D); // 10\n const W1 = mod(Nt * SQRT_AD_MINUS_ONE); // 11\n const W2 = mod(_1n - s2); // 12\n const W3 = mod(_1n + s2); // 13\n return new ed25519_Point(mod(W0 * W3), mod(W2 * W1), mod(W1 * W3), mod(W0 * W2));\n}\n\n/**\n * Wrapper over Edwards Point for ristretto255.\n *\n * Each ed25519/EdwardsPoint has 8 different equivalent points. This can be\n * a source of bugs for protocols like ring signatures. Ristretto was created to solve this.\n * Ristretto point operates in X:Y:Z:T extended coordinates like EdwardsPoint,\n * but it should work in its own namespace: do not combine those two.\n * See [RFC9496](https://www.rfc-editor.org/rfc/rfc9496).\n */\nclass _RistrettoPoint extends PrimeEdwardsPoint<_RistrettoPoint> {\n // Do NOT change syntax: the following gymnastics is done,\n // because typescript strips comments, which makes bundlers disable tree-shaking.\n // prettier-ignore\n static BASE: _RistrettoPoint =\n /* @__PURE__ */ (() => new _RistrettoPoint(ed25519_Point.BASE))();\n // prettier-ignore\n static ZERO: _RistrettoPoint =\n /* @__PURE__ */ (() => new _RistrettoPoint(ed25519_Point.ZERO))();\n // prettier-ignore\n static Fp: IField<bigint> =\n /* @__PURE__ */ (() => Fp)();\n // prettier-ignore\n static Fn: IField<bigint> =\n /* @__PURE__ */ (() => Fn)();\n\n constructor(ep: EdwardsPoint) {\n super(ep);\n }\n\n static fromAffine(ap: AffinePoint<bigint>): _RistrettoPoint {\n return new _RistrettoPoint(ed25519_Point.fromAffine(ap));\n }\n\n protected assertSame(other: _RistrettoPoint): void {\n if (!(other instanceof _RistrettoPoint)) throw new Error('RistrettoPoint expected');\n }\n\n protected init(ep: EdwardsPoint): _RistrettoPoint {\n return new _RistrettoPoint(ep);\n }\n\n static fromBytes(bytes: Uint8Array): _RistrettoPoint {\n abytes(bytes, 32);\n const { a, d } = ed25519_CURVE;\n const P = ed25519_CURVE_p;\n const mod = (n: bigint) => Fp.create(n);\n const s = bytes255ToNumberLE(bytes);\n // 1. Check that s_bytes is the canonical encoding of a field element, or else abort.\n // 3. Check that s is non-negative, or else abort\n if (!equalBytes(Fp.toBytes(s), bytes) || isNegativeLE(s, P))\n throw new Error('invalid ristretto255 encoding 1');\n const s2 = mod(s * s);\n const u1 = mod(_1n + a * s2); // 4 (a is -1)\n const u2 = mod(_1n - a * s2); // 5\n const u1_2 = mod(u1 * u1);\n const u2_2 = mod(u2 * u2);\n const v = mod(a * d * u1_2 - u2_2); // 6\n const { isValid, value: I } = invertSqrt(mod(v * u2_2)); // 7\n const Dx = mod(I * u2); // 8\n const Dy = mod(I * Dx * v); // 9\n let x = mod((s + s) * Dx); // 10\n if (isNegativeLE(x, P)) x = mod(-x); // 10\n const y = mod(u1 * Dy); // 11\n const t = mod(x * y); // 12\n if (!isValid || isNegativeLE(t, P) || y === _0n)\n throw new Error('invalid ristretto255 encoding 2');\n return new _RistrettoPoint(new ed25519_Point(x, y, _1n, t));\n }\n\n /**\n * Converts ristretto-encoded string to ristretto point.\n * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-decode).\n * @param hex Ristretto-encoded 32 bytes. Not every 32-byte string is valid ristretto encoding\n */\n static fromHex(hex: string): _RistrettoPoint {\n return _RistrettoPoint.fromBytes(hexToBytes(hex));\n }\n\n /**\n * Encodes ristretto point to Uint8Array.\n * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-encode).\n */\n toBytes(): Uint8Array {\n let { X, Y, Z, T } = this.ep;\n const P = ed25519_CURVE_p;\n const mod = (n: bigint) => Fp.create(n);\n const u1 = mod(mod(Z + Y) * mod(Z - Y)); // 1\n const u2 = mod(X * Y); // 2\n // Square root always exists\n const u2sq = mod(u2 * u2);\n const { value: invsqrt } = invertSqrt(mod(u1 * u2sq)); // 3\n const D1 = mod(invsqrt * u1); // 4\n const D2 = mod(invsqrt * u2); // 5\n const zInv = mod(D1 * D2 * T); // 6\n let D: bigint; // 7\n if (isNegativeLE(T * zInv, P)) {\n let _x = mod(Y * SQRT_M1);\n let _y = mod(X * SQRT_M1);\n X = _x;\n Y = _y;\n D = mod(D1 * INVSQRT_A_MINUS_D);\n } else {\n D = D2; // 8\n }\n if (isNegativeLE(X * zInv, P)) Y = mod(-Y); // 9\n let s = mod((Z - Y) * D); // 10 (check footer's note, no sqrt(-a))\n if (isNegativeLE(s, P)) s = mod(-s);\n return Fp.toBytes(s); // 11\n }\n\n /**\n * Compares two Ristretto points.\n * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-equals).\n */\n equals(other: _RistrettoPoint): boolean {\n this.assertSame(other);\n const { X: X1, Y: Y1 } = this.ep;\n const { X: X2, Y: Y2 } = other.ep;\n const mod = (n: bigint) => Fp.create(n);\n // (x1 * y2 == y1 * x2) | (y1 * y2 == x1 * x2)\n const one = mod(X1 * Y2) === mod(Y1 * X2);\n const two = mod(Y1 * Y2) === mod(X1 * X2);\n return one || two;\n }\n\n is0(): boolean {\n return this.equals(_RistrettoPoint.ZERO);\n }\n}\n\nexport const ristretto255: {\n Point: typeof _RistrettoPoint;\n} = { Point: _RistrettoPoint };\n\n/** Hashing to ristretto255 points / field. RFC 9380 methods. */\nexport const ristretto255_hasher: H2CHasherBase<typeof _RistrettoPoint> = {\n Point: _RistrettoPoint,\n /**\n * Spec: https://www.rfc-editor.org/rfc/rfc9380.html#name-hashing-to-ristretto255. Caveats:\n * * There are no test vectors\n * * encodeToCurve / mapToCurve is undefined\n * * mapToCurve would be `calcElligatorRistrettoMap(scalars[0])`, not ristretto255_map!\n * * hashToScalar is undefined too, so we just use OPRF implementation\n * * We cannot re-use 'createHasher', because ristretto255_map is different algorithm/RFC\n (os2ip -> bytes255ToNumberLE)\n * * mapToCurve == calcElligatorRistrettoMap, hashToCurve == ristretto255_map\n * * hashToScalar is undefined in RFC9380 for ristretto, we are using version from OPRF here, using bytes255ToNumblerLE will create different result if we use bytes255ToNumberLE as os2ip\n * * current version is closest to spec.\n */\n hashToCurve(msg: Uint8Array, options?: H2CDSTOpts): _RistrettoPoint {\n // == 'hash_to_ristretto255'\n const DST = options?.DST || 'ristretto255_XMD:SHA-512_R255MAP_RO_';\n const xmd = expand_message_xmd(msg, DST, 64, sha512);\n // NOTE: RFC 9380 incorrectly calls this function 'ristretto255_map', in RFC 9496 map was function inside (per point)\n // That also lead to confustion that ristretto255_map is mapToCurve (it is not! it is old hashToCurve)\n return ristretto255_hasher.deriveToCurve!(xmd);\n },\n hashToScalar(msg: Uint8Array, options: H2CDSTOpts = { DST: _DST_scalar }) {\n const xmd = expand_message_xmd(msg, options.DST, 64, sha512);\n return Fn.create(bytesToNumberLE(xmd));\n },\n /**\n * HashToCurve-like construction based on RFC 9496 (Element Derivation).\n * Converts 64 uniform random bytes into a curve point.\n *\n * WARNING: This represents an older hash-to-curve construction, preceding the finalization of RFC 9380.\n * It was later reused as a component in the newer `hash_to_ristretto255` function defined in RFC 9380.\n */\n deriveToCurve(bytes: Uint8Array): _RistrettoPoint {\n // https://www.rfc-editor.org/rfc/rfc9496.html#name-element-derivation\n abytes(bytes, 64);\n const r1 = bytes255ToNumberLE(bytes.subarray(0, 32));\n const R1 = calcElligatorRistrettoMap(r1);\n const r2 = bytes255ToNumberLE(bytes.subarray(32, 64));\n const R2 = calcElligatorRistrettoMap(r2);\n return new _RistrettoPoint(R1.add(R2));\n },\n};\n\n/** ristretto255 OPRF, defined in RFC 9497. */\nexport const ristretto255_oprf: OPRF = /* @__PURE__ */ (() =>\n createORPF({\n name: 'ristretto255-SHA512',\n Point: _RistrettoPoint,\n hash: sha512,\n hashToGroup: ristretto255_hasher.hashToCurve,\n hashToScalar: ristretto255_hasher.hashToScalar,\n }))();\n\n/**\n * Weird / bogus points, useful for debugging.\n * All 8 ed25519 points of 8-torsion subgroup can be generated from the point\n * T = `26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05`.\n * ⟨T⟩ = { O, T, 2T, 3T, 4T, 5T, 6T, 7T }\n */\nexport const ED25519_TORSION_SUBGROUP: string[] = [\n '0100000000000000000000000000000000000000000000000000000000000000',\n 'c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a',\n '0000000000000000000000000000000000000000000000000000000000000080',\n '26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05',\n 'ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f',\n '26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85',\n '0000000000000000000000000000000000000000000000000000000000000000',\n 'c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa',\n];\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64 } from '@mysten/bcs';\nimport { ed25519 } from '@noble/curves/ed25519.js';\n\nimport {\n\tbytesEqual,\n\tparseSerializedKeypairSignature,\n\tPublicKey,\n} from '../../cryptography/publickey.js';\nimport type { PublicKeyInitData } from '../../cryptography/publickey.js';\nimport { SIGNATURE_SCHEME_TO_FLAG } from '../../cryptography/signature-scheme.js';\n\nconst PUBLIC_KEY_SIZE = 32;\n\n/**\n * An Ed25519 public key\n */\nexport class Ed25519PublicKey extends PublicKey {\n\tstatic SIZE = PUBLIC_KEY_SIZE;\n\tprivate data: Uint8Array<ArrayBuffer>;\n\n\t/**\n\t * Create a new Ed25519PublicKey object\n\t * @param value ed25519 public key as buffer or base-64 encoded string\n\t */\n\tconstructor(value: PublicKeyInitData) {\n\t\tsuper();\n\n\t\tif (typeof value === 'string') {\n\t\t\tthis.data = fromBase64(value);\n\t\t} else if (value instanceof Uint8Array) {\n\t\t\tthis.data = value as Uint8Array<ArrayBuffer>;\n\t\t} else {\n\t\t\tthis.data = Uint8Array.from(value);\n\t\t}\n\n\t\tif (this.data.length !== PUBLIC_KEY_SIZE) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid public key input. Expected ${PUBLIC_KEY_SIZE} bytes, got ${this.data.length}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Checks if two Ed25519 public keys are equal\n\t */\n\toverride equals(publicKey: Ed25519PublicKey): boolean {\n\t\treturn super.equals(publicKey);\n\t}\n\n\t/**\n\t * Return the byte array representation of the Ed25519 public key\n\t */\n\ttoRawBytes(): Uint8Array<ArrayBuffer> {\n\t\treturn this.data;\n\t}\n\n\t/**\n\t * Return the Sui address associated with this Ed25519 public key\n\t */\n\tflag(): number {\n\t\treturn SIGNATURE_SCHEME_TO_FLAG['ED25519'];\n\t}\n\n\t/**\n\t * Verifies that the signature is valid for for the provided message\n\t */\n\tasync verify(message: Uint8Array, signature: Uint8Array | string): Promise<boolean> {\n\t\tlet bytes;\n\t\tif (typeof signature === 'string') {\n\t\t\tconst parsed = parseSerializedKeypairSignature(signature);\n\t\t\tif (parsed.signatureScheme !== 'ED25519') {\n\t\t\t\tthrow new Error('Invalid signature scheme');\n\t\t\t}\n\n\t\t\tif (!bytesEqual(this.toRawBytes(), parsed.publicKey)) {\n\t\t\t\tthrow new Error('Signature does not match public key');\n\t\t\t}\n\n\t\t\tbytes = parsed.signature;\n\t\t} else {\n\t\t\tbytes = signature;\n\t\t}\n\n\t\treturn ed25519.verify(bytes, message, this.toRawBytes());\n\t}\n}\n","/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, type CHash, type Hash } from './utils.ts';\n\n/** Internal class for HMAC. */\nexport class _HMAC<T extends Hash<T>> implements Hash<_HMAC<T>> {\n oHash: T;\n iHash: T;\n blockLen: number;\n outputLen: number;\n private finished = false;\n private destroyed = false;\n\n constructor(hash: CHash, key: Uint8Array) {\n ahash(hash);\n abytes(key, undefined, 'key');\n this.iHash = hash.create() as T;\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create() as T;\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf: Uint8Array): this {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n abytes(out, this.outputLen, 'output');\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest(): Uint8Array {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to?: _HMAC<T>): _HMAC<T> {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to ||= Object.create(Object.getPrototypeOf(this), {});\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to as this;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone(): _HMAC<T> {\n return this._cloneInto();\n }\n destroy(): void {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac: {\n (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array;\n create(hash: CHash, key: Uint8Array): _HMAC<any>;\n} = (hash: CHash, key: Uint8Array, message: Uint8Array): Uint8Array =>\n new _HMAC<any>(hash, key).update(message).digest();\nhmac.create = (hash: CHash, key: Uint8Array) => new _HMAC<any>(hash, key);\n","/**\n * PBKDF (RFC 2898). Can be used to create a key from password and salt.\n * @module\n */\nimport { hmac } from './hmac.ts';\n// prettier-ignore\nimport {\n ahash, anumber,\n asyncLoop, checkOpts, clean, createView, kdfInputToBytes,\n type CHash,\n type Hash,\n type KDFInput\n} from './utils.ts';\n\n/**\n * PBKDF2 options:\n * * c: iterations, should probably be higher than 100_000\n * * dkLen: desired length of derived key in bytes\n * * asyncTick: max time in ms for which async function can block execution\n */\nexport type Pbkdf2Opt = {\n c: number;\n dkLen?: number;\n asyncTick?: number;\n};\n// Common start and end for sync/async functions\nfunction pbkdf2Init(hash: CHash, _password: KDFInput, _salt: KDFInput, _opts: Pbkdf2Opt) {\n ahash(hash);\n const opts = checkOpts({ dkLen: 32, asyncTick: 10 }, _opts);\n const { c, dkLen, asyncTick } = opts;\n anumber(c, 'c');\n anumber(dkLen, 'dkLen');\n anumber(asyncTick, 'asyncTick');\n if (c < 1) throw new Error('iterations (c) must be >= 1');\n const password = kdfInputToBytes(_password, 'password');\n const salt = kdfInputToBytes(_salt, 'salt');\n // DK = PBKDF2(PRF, Password, Salt, c, dkLen);\n const DK = new Uint8Array(dkLen);\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n const PRF = hmac.create(hash, password);\n const PRFSalt = PRF._cloneInto().update(salt);\n return { c, dkLen, asyncTick, DK, PRF, PRFSalt };\n}\n\nfunction pbkdf2Output<T extends Hash<T>>(\n PRF: Hash<T>,\n PRFSalt: Hash<T>,\n DK: Uint8Array,\n prfW: Hash<T>,\n u: Uint8Array\n) {\n PRF.destroy();\n PRFSalt.destroy();\n if (prfW) prfW.destroy();\n clean(u);\n return DK;\n}\n\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function\n * @param hash - hash function that would be used e.g. sha256\n * @param password - password from which a derived key is generated\n * @param salt - cryptographic salt\n * @param opts - {c, dkLen} where c is work factor and dkLen is output message size\n * @example\n * const key = pbkdf2(sha256, 'password', 'salt', { dkLen: 32, c: Math.pow(2, 18) });\n */\nexport function pbkdf2(\n hash: CHash,\n password: KDFInput,\n salt: KDFInput,\n opts: Pbkdf2Opt\n): Uint8Array {\n const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW: any; // Working copy\n const arr = new Uint8Array(4);\n const view = createView(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + ⋯ + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n for (let ui = 1; ui < c; ui++) {\n // Uc = PRF(Password, Uc−1)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++) Ti[i] ^= u[i];\n }\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function. Async version.\n * @example\n * await pbkdf2Async(sha256, 'password', 'salt', { dkLen: 32, c: 500_000 });\n */\nexport async function pbkdf2Async(\n hash: CHash,\n password: KDFInput,\n salt: KDFInput,\n opts: Pbkdf2Opt\n): Promise<Uint8Array> {\n const { c, dkLen, asyncTick, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW: any; // Working copy\n const arr = new Uint8Array(4);\n const view = createView(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + ⋯ + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n await asyncLoop(c - 1, asyncTick, () => {\n // Uc = PRF(Password, Uc−1)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++) Ti[i] ^= u[i];\n });\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n","/*! scure-bip39 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) */\nimport { pbkdf2, pbkdf2Async } from '@noble/hashes/pbkdf2.js';\nimport { sha256, sha512 } from '@noble/hashes/sha2.js';\nimport { abytes, anumber, randomBytes } from '@noble/hashes/utils.js';\nimport { pbkdf2 as pbkdf2web, sha512 as sha512web } from '@noble/hashes/webcrypto.js';\nimport { utils as baseUtils } from '@scure/base';\n// Japanese wordlist\nconst isJapanese = (wordlist) => wordlist[0] === '\\u3042\\u3044\\u3053\\u304f\\u3057\\u3093';\n// Normalization replaces equivalent sequences of characters\n// so that any two texts that are equivalent will be reduced\n// to the same sequence of code points, called the normal form of the original text.\n// https://tonsky.me/blog/unicode/#why-is-a----\nfunction nfkd(str) {\n if (typeof str !== 'string')\n throw new TypeError('invalid mnemonic type: ' + typeof str);\n return str.normalize('NFKD');\n}\nfunction normalize(str) {\n const norm = nfkd(str);\n const words = norm.split(' ');\n if (![12, 15, 18, 21, 24].includes(words.length))\n throw new Error('Invalid mnemonic');\n return { nfkd: norm, words };\n}\nfunction aentropy(ent) {\n abytes(ent);\n if (![16, 20, 24, 28, 32].includes(ent.length))\n throw new Error('invalid entropy length');\n}\n/**\n * Generate x random words. Uses Cryptographically-Secure Random Number Generator.\n * @param wordlist imported wordlist for specific language\n * @param strength mnemonic strength 128-256 bits\n * @example\n * generateMnemonic(wordlist, 128)\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function generateMnemonic(wordlist, strength = 128) {\n anumber(strength);\n if (strength % 32 !== 0 || strength > 256)\n throw new TypeError('Invalid entropy');\n return entropyToMnemonic(randomBytes(strength / 8), wordlist);\n}\nconst calcChecksum = (entropy) => {\n // Checksum is ent.length/4 bits long\n const bitsLeft = 8 - entropy.length / 4;\n // Zero rightmost \"bitsLeft\" bits in byte\n // For example: bitsLeft=4 val=10111101 -> 10110000\n return new Uint8Array([(sha256(entropy)[0] >> bitsLeft) << bitsLeft]);\n};\nfunction getCoder(wordlist) {\n if (!Array.isArray(wordlist) || wordlist.length !== 2048 || typeof wordlist[0] !== 'string')\n throw new Error('Wordlist: expected array of 2048 strings');\n wordlist.forEach((i) => {\n if (typeof i !== 'string')\n throw new Error('wordlist: non-string element: ' + i);\n });\n return baseUtils.chain(baseUtils.checksum(1, calcChecksum), baseUtils.radix2(11, true), baseUtils.alphabet(wordlist));\n}\n/**\n * Reversible: Converts mnemonic string to raw entropy in form of byte array.\n * @param mnemonic 12-24 words\n * @param wordlist imported wordlist for specific language\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToEntropy(mnem, wordlist)\n * // Produces\n * new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ])\n */\nexport function mnemonicToEntropy(mnemonic, wordlist) {\n const { words } = normalize(mnemonic);\n const entropy = getCoder(wordlist).decode(words);\n aentropy(entropy);\n return entropy;\n}\n/**\n * Reversible: Converts raw entropy in form of byte array to mnemonic string.\n * @param entropy byte array\n * @param wordlist imported wordlist for specific language\n * @returns 12-24 words\n * @example\n * const ent = new Uint8Array([\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,\n * 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f\n * ]);\n * entropyToMnemonic(ent, wordlist);\n * // 'legal winner thank year wave sausage worth useful legal winner thank yellow'\n */\nexport function entropyToMnemonic(entropy, wordlist) {\n aentropy(entropy);\n const words = getCoder(wordlist).encode(entropy);\n return words.join(isJapanese(wordlist) ? '\\u3000' : ' ');\n}\n/**\n * Validates mnemonic for being 12-24 words contained in `wordlist`.\n */\nexport function validateMnemonic(mnemonic, wordlist) {\n try {\n mnemonicToEntropy(mnemonic, wordlist);\n }\n catch (e) {\n return false;\n }\n return true;\n}\nconst psalt = (passphrase) => nfkd('mnemonic' + passphrase);\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * await mnemonicToSeed(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeed(mnemonic, passphrase = '') {\n return pbkdf2Async(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n/**\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToSeedSync(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeedSync(mnemonic, passphrase = '') {\n return pbkdf2(sha512, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n/**\n * Uses native, built-in functionality, provided by globalThis.crypto.\n * Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password.\n * @param mnemonic 12-24 words\n * @param passphrase string that will additionally protect the key\n * @returns 64 bytes of key data\n * @example\n * const mnem = 'legal winner thank year wave sausage worth useful legal winner thank yellow';\n * mnemonicToSeedWebcrypto(mnem, 'password');\n * // new Uint8Array([...64 bytes])\n */\nexport function mnemonicToSeedWebcrypto(mnemonic, passphrase = '') {\n return pbkdf2web(sha512web, normalize(mnemonic).nfkd, psalt(passphrase), { c: 2048, dkLen: 64 });\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport { toHex } from '@mysten/bcs';\nimport { mnemonicToSeedSync as bip39MnemonicToSeedSync } from '@scure/bip39';\n\n/**\n * Parse and validate a path that is compliant to SLIP-0010 in form m/44'/784'/{account_index}'/{change_index}'/{address_index}'.\n *\n * @param path path string (e.g. `m/44'/784'/0'/0'/0'`).\n */\nexport function isValidHardenedPath(path: string): boolean {\n\tif (!new RegExp(\"^m\\\\/44'\\\\/784'\\\\/[0-9]+'\\\\/[0-9]+'\\\\/[0-9]+'+$\").test(path)) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/**\n * Parse and validate a path that is compliant to BIP-32 in form m/54'/784'/{account_index}'/{change_index}/{address_index}\n * for Secp256k1 and m/74'/784'/{account_index}'/{change_index}/{address_index} for Secp256r1.\n *\n * Note that the purpose for Secp256k1 is registered as 54, to differentiate from Ed25519 with purpose 44.\n *\n * @param path path string (e.g. `m/54'/784'/0'/0/0`).\n */\nexport function isValidBIP32Path(path: string): boolean {\n\tif (!new RegExp(\"^m\\\\/(54|74)'\\\\/784'\\\\/[0-9]+'\\\\/[0-9]+\\\\/[0-9]+$\").test(path)) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/**\n * Uses KDF to derive 64 bytes of key data from mnemonic with empty password.\n *\n * @param mnemonics 12 words string split by spaces.\n */\nexport function mnemonicToSeed(mnemonics: string): Uint8Array {\n\treturn bip39MnemonicToSeedSync(mnemonics, '');\n}\n\n/**\n * Derive the seed in hex format from a 12-word mnemonic string.\n *\n * @param mnemonics 12 words string split by spaces.\n */\nexport function mnemonicToSeedHex(mnemonics: string): string {\n\treturn toHex(mnemonicToSeed(mnemonics));\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64, toBase64 } from '@mysten/bcs';\n\nimport { bcs } from '../bcs/index.js';\nimport { parseSerializedPasskeySignature } from '../keypairs/passkey/publickey.js';\nimport type { MultiSigStruct } from '../multisig/publickey.js';\nimport { parseSerializedZkLoginSignature } from '../zklogin/publickey.js';\nimport { parseSerializedKeypairSignature } from './publickey.js';\nimport type { PublicKey } from './publickey.js';\nimport type { SignatureScheme } from './signature-scheme.js';\nimport { SIGNATURE_FLAG_TO_SCHEME, SIGNATURE_SCHEME_TO_FLAG } from './signature-scheme.js';\n\n/**\n * Pair of signature and corresponding public key\n */\nexport type SerializeSignatureInput = {\n\tsignatureScheme: SignatureScheme;\n\t/** Base64-encoded signature */\n\tsignature: Uint8Array;\n\t/** Base64-encoded public key */\n\tpublicKey?: PublicKey;\n};\n\n/**\n * Takes in a signature, its associated signing scheme and a public key, then serializes this data\n */\nexport function toSerializedSignature({\n\tsignature,\n\tsignatureScheme,\n\tpublicKey,\n}: SerializeSignatureInput): string {\n\tif (!publicKey) {\n\t\tthrow new Error('`publicKey` is required');\n\t}\n\n\tconst pubKeyBytes = publicKey.toRawBytes();\n\tconst serializedSignature = new Uint8Array(1 + signature.length + pubKeyBytes.length);\n\tserializedSignature.set([SIGNATURE_SCHEME_TO_FLAG[signatureScheme]]);\n\tserializedSignature.set(signature, 1);\n\tserializedSignature.set(pubKeyBytes, 1 + signature.length);\n\treturn toBase64(serializedSignature);\n}\n\n/**\n * Decodes a serialized signature into its constituent components: the signature scheme, the actual signature, and the public key\n */\nexport function parseSerializedSignature(serializedSignature: string) {\n\tconst bytes = fromBase64(serializedSignature);\n\n\tconst signatureScheme =\n\t\tSIGNATURE_FLAG_TO_SCHEME[bytes[0] as keyof typeof SIGNATURE_FLAG_TO_SCHEME];\n\n\tswitch (signatureScheme) {\n\t\tcase 'Passkey':\n\t\t\treturn parseSerializedPasskeySignature(serializedSignature);\n\t\tcase 'MultiSig':\n\t\t\tconst multisig: MultiSigStruct = bcs.MultiSig.parse(bytes.slice(1));\n\t\t\treturn {\n\t\t\t\tserializedSignature,\n\t\t\t\tsignatureScheme,\n\t\t\t\tmultisig,\n\t\t\t\tbytes,\n\t\t\t\tsignature: undefined,\n\t\t\t};\n\t\tcase 'ZkLogin':\n\t\t\treturn parseSerializedZkLoginSignature(serializedSignature);\n\t\tcase 'ED25519':\n\t\tcase 'Secp256k1':\n\t\tcase 'Secp256r1':\n\t\t\treturn parseSerializedKeypairSignature(serializedSignature);\n\t\tdefault:\n\t\t\tthrow new Error('Unsupported signature scheme');\n\t}\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs, toBase64 } from '@mysten/bcs';\nimport { blake2b } from '@noble/hashes/blake2.js';\nimport { bech32 } from '@scure/base';\n\nimport type { IntentScope } from './intent.js';\nimport { messageWithIntent } from './intent.js';\nimport type { PublicKey } from './publickey.js';\nimport { SIGNATURE_FLAG_TO_SCHEME, SIGNATURE_SCHEME_TO_FLAG } from './signature-scheme.js';\nimport type { SignatureScheme } from './signature-scheme.js';\nimport { toSerializedSignature } from './signature.js';\nimport type { Transaction } from '../transactions/Transaction.js';\nimport type { ClientWithCoreApi, SuiClientTypes } from '../client/index.js';\n\nexport const PRIVATE_KEY_SIZE = 32;\nexport const LEGACY_PRIVATE_KEY_SIZE = 64;\nexport const SUI_PRIVATE_KEY_PREFIX = 'suiprivkey';\n\nexport type ParsedKeypair = {\n\tscheme: SignatureScheme;\n\tsecretKey: Uint8Array;\n};\n\nexport interface SignatureWithBytes {\n\tbytes: string;\n\tsignature: string;\n}\n\nexport interface SignAndExecuteOptions {\n\ttransaction: Transaction;\n\tclient: ClientWithCoreApi;\n}\n\n/**\n * TODO: Document\n */\nexport abstract class Signer {\n\tabstract sign(bytes: Uint8Array): Promise<Uint8Array<ArrayBuffer>>;\n\t/**\n\t * Sign messages with a specific intent. By combining the message bytes with the intent before hashing and signing,\n\t * it ensures that a signed message is tied to a specific purpose and domain separator is provided\n\t */\n\tasync signWithIntent(bytes: Uint8Array, intent: IntentScope): Promise<SignatureWithBytes> {\n\t\tconst intentMessage = messageWithIntent(intent, bytes);\n\t\tconst digest = blake2b(intentMessage, { dkLen: 32 });\n\n\t\tconst signature = toSerializedSignature({\n\t\t\tsignature: await this.sign(digest),\n\t\t\tsignatureScheme: this.getKeyScheme(),\n\t\t\tpublicKey: this.getPublicKey(),\n\t\t});\n\n\t\treturn {\n\t\t\tsignature,\n\t\t\tbytes: toBase64(bytes),\n\t\t};\n\t}\n\t/**\n\t * Signs provided transaction by calling `signWithIntent()` with a `TransactionData` provided as intent scope\n\t */\n\tasync signTransaction(bytes: Uint8Array) {\n\t\treturn this.signWithIntent(bytes, 'TransactionData');\n\t}\n\t/**\n\t * Signs provided personal message by calling `signWithIntent()` with a `PersonalMessage` provided as intent scope\n\t */\n\tasync signPersonalMessage(bytes: Uint8Array) {\n\t\tconst { signature } = await this.signWithIntent(\n\t\t\tbcs.byteVector().serialize(bytes).toBytes(),\n\t\t\t'PersonalMessage',\n\t\t);\n\n\t\treturn {\n\t\t\tbytes: toBase64(bytes),\n\t\t\tsignature,\n\t\t};\n\t}\n\n\tasync signAndExecuteTransaction({\n\t\ttransaction,\n\t\tclient,\n\t}: SignAndExecuteOptions): Promise<\n\t\tSuiClientTypes.TransactionResult<{ transaction: true; effects: true }>\n\t> {\n\t\ttransaction.setSenderIfNotSet(this.toSuiAddress());\n\t\tconst bytes = await transaction.build({ client });\n\t\tconst { signature } = await this.signTransaction(bytes);\n\n\t\treturn client.core.executeTransaction({\n\t\t\ttransaction: bytes,\n\t\t\tsignatures: [signature],\n\t\t\tinclude: { transaction: true, effects: true },\n\t\t});\n\t}\n\n\ttoSuiAddress(): string {\n\t\treturn this.getPublicKey().toSuiAddress();\n\t}\n\n\t/**\n\t * Get the key scheme of the keypair: Secp256k1 or ED25519\n\t */\n\tabstract getKeyScheme(): SignatureScheme;\n\n\t/**\n\t * The public key for this keypair\n\t */\n\tabstract getPublicKey(): PublicKey;\n}\n\nexport abstract class Keypair extends Signer {\n\t/**\n\t * This returns the Bech32 secret key string for this keypair.\n\t */\n\tabstract getSecretKey(): string;\n}\n\n/**\n * This returns an ParsedKeypair object based by validating the\n * 33-byte Bech32 encoded string starting with `suiprivkey`, and\n * parse out the signature scheme and the private key in bytes.\n */\nexport function decodeSuiPrivateKey(value: string): ParsedKeypair {\n\tconst { prefix, words } = bech32.decode(value as `${string}1${string}`);\n\tif (prefix !== SUI_PRIVATE_KEY_PREFIX) {\n\t\tthrow new Error('invalid private key prefix');\n\t}\n\tconst extendedSecretKey = new Uint8Array(bech32.fromWords(words));\n\tconst secretKey = extendedSecretKey.slice(1);\n\tconst signatureScheme =\n\t\tSIGNATURE_FLAG_TO_SCHEME[extendedSecretKey[0] as keyof typeof SIGNATURE_FLAG_TO_SCHEME];\n\n\treturn {\n\t\tscheme: signatureScheme,\n\t\tsecretKey: secretKey,\n\t};\n}\n\n/**\n * This returns a Bech32 encoded string starting with `suiprivkey`,\n * encoding 33-byte `flag || bytes` for the given the 32-byte private\n * key and its signature scheme.\n */\nexport function encodeSuiPrivateKey(bytes: Uint8Array, scheme: SignatureScheme): string {\n\tif (bytes.length !== PRIVATE_KEY_SIZE) {\n\t\tthrow new Error('Invalid bytes length');\n\t}\n\tconst flag = SIGNATURE_SCHEME_TO_FLAG[scheme];\n\tconst privKeyBytes = new Uint8Array(bytes.length + 1);\n\tprivKeyBytes.set([flag]);\n\tprivKeyBytes.set(bytes, 1);\n\treturn bech32.encode(SUI_PRIVATE_KEY_PREFIX, bech32.toWords(privKeyBytes));\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n// This is adapted from https://github.com/alepop/ed25519-hd-key replacing create-hmac\n// with @noble/hashes to be browser compatible.\n\nimport { fromHex } from '@mysten/bcs';\nimport { hmac } from '@noble/hashes/hmac.js';\nimport { sha512 } from '@noble/hashes/sha2.js';\n\ntype Hex = string;\ntype Path = string;\n\ntype Keys = {\n\tkey: Uint8Array;\n\tchainCode: Uint8Array;\n};\n\nconst ED25519_CURVE = 'ed25519 seed';\nconst HARDENED_OFFSET = 0x80000000;\n\nconst pathRegex = new RegExp(\"^m(\\\\/[0-9]+')+$\");\n\nconst replaceDerive = (val: string): string => val.replace(\"'\", '');\n\nconst getMasterKeyFromSeed = (seed: Hex): Keys => {\n\tconst h = hmac.create(sha512, new TextEncoder().encode(ED25519_CURVE));\n\tconst I = h.update(fromHex(seed)).digest();\n\tconst IL = I.slice(0, 32);\n\tconst IR = I.slice(32);\n\treturn {\n\t\tkey: IL,\n\t\tchainCode: IR,\n\t};\n};\n\nconst CKDPriv = ({ key, chainCode }: Keys, index: number): Keys => {\n\tconst indexBuffer = new ArrayBuffer(4);\n\tconst cv = new DataView(indexBuffer);\n\tcv.setUint32(0, index);\n\n\tconst data = new Uint8Array(1 + key.length + indexBuffer.byteLength);\n\tdata.set(new Uint8Array(1).fill(0));\n\tdata.set(key, 1);\n\tdata.set(new Uint8Array(indexBuffer, 0, indexBuffer.byteLength), key.length + 1);\n\n\tconst I = hmac.create(sha512, chainCode).update(data).digest();\n\tconst IL = I.slice(0, 32);\n\tconst IR = I.slice(32);\n\treturn {\n\t\tkey: IL,\n\t\tchainCode: IR,\n\t};\n};\n\nconst isValidPath = (path: string): boolean => {\n\tif (!pathRegex.test(path)) {\n\t\treturn false;\n\t}\n\treturn !path\n\t\t.split('/')\n\t\t.slice(1)\n\t\t.map(replaceDerive)\n\t\t.some(isNaN as any /* ts T_T*/);\n};\n\nexport const derivePath = (path: Path, seed: Hex, offset = HARDENED_OFFSET): Keys => {\n\tif (!isValidPath(path)) {\n\t\tthrow new Error('Invalid derivation path');\n\t}\n\n\tconst { key, chainCode } = getMasterKeyFromSeed(seed);\n\tconst segments = path\n\t\t.split('/')\n\t\t.slice(1)\n\t\t.map(replaceDerive)\n\t\t.map((el) => parseInt(el, 10));\n\n\treturn segments.reduce((parentKeys, segment) => CKDPriv(parentKeys, segment + offset), {\n\t\tkey,\n\t\tchainCode,\n\t});\n};\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { toHex } from '@mysten/bcs';\nimport { ed25519 } from '@noble/curves/ed25519.js';\n\nimport {\n\tdecodeSuiPrivateKey,\n\tencodeSuiPrivateKey,\n\tKeypair,\n\tPRIVATE_KEY_SIZE,\n} from '../../cryptography/keypair.js';\nimport { isValidHardenedPath, mnemonicToSeedHex } from '../../cryptography/mnemonics.js';\nimport type { SignatureScheme } from '../../cryptography/signature-scheme.js';\nimport { derivePath } from './ed25519-hd-key.js';\nimport { Ed25519PublicKey } from './publickey.js';\n\nexport const DEFAULT_ED25519_DERIVATION_PATH = \"m/44'/784'/0'/0'/0'\";\n\n/**\n * Ed25519 Keypair data. The publickey is the 32-byte public key and\n * the secretkey is 64-byte, where the first 32 bytes is the secret\n * key and the last 32 bytes is the public key.\n */\nexport interface Ed25519KeypairData {\n\tpublicKey: Uint8Array;\n\tsecretKey: Uint8Array;\n}\n\n/**\n * An Ed25519 Keypair used for signing transactions.\n */\nexport class Ed25519Keypair extends Keypair {\n\tprivate keypair: Ed25519KeypairData;\n\n\t/**\n\t * Create a new Ed25519 keypair instance.\n\t * Generate random keypair if no {@link Ed25519Keypair} is provided.\n\t *\n\t * @param keypair Ed25519 keypair\n\t */\n\tconstructor(keypair?: Ed25519KeypairData) {\n\t\tsuper();\n\t\tif (keypair) {\n\t\t\tthis.keypair = {\n\t\t\t\tpublicKey: keypair.publicKey,\n\t\t\t\tsecretKey: keypair.secretKey.slice(0, 32),\n\t\t\t};\n\t\t} else {\n\t\t\tconst privateKey = ed25519.utils.randomSecretKey();\n\t\t\tthis.keypair = {\n\t\t\t\tpublicKey: ed25519.getPublicKey(privateKey),\n\t\t\t\tsecretKey: privateKey,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Get the key scheme of the keypair ED25519\n\t */\n\tgetKeyScheme(): SignatureScheme {\n\t\treturn 'ED25519';\n\t}\n\n\t/**\n\t * Generate a new random Ed25519 keypair\n\t */\n\tstatic generate(): Ed25519Keypair {\n\t\tconst secretKey = ed25519.utils.randomSecretKey();\n\t\treturn new Ed25519Keypair({\n\t\t\tpublicKey: ed25519.getPublicKey(secretKey),\n\t\t\tsecretKey,\n\t\t});\n\t}\n\n\t/**\n\t * Create a Ed25519 keypair from a raw secret key byte array, also known as seed.\n\t * This is NOT the private scalar which is result of hashing and bit clamping of\n\t * the raw secret key.\n\t *\n\t * @throws error if the provided secret key is invalid and validation is not skipped.\n\t *\n\t * @param secretKey secret key as a byte array or Bech32 secret key string\n\t * @param options: skip secret key validation\n\t */\n\tstatic fromSecretKey(\n\t\tsecretKey: Uint8Array | string,\n\t\toptions?: { skipValidation?: boolean },\n\t): Ed25519Keypair {\n\t\tif (typeof secretKey === 'string') {\n\t\t\tconst decoded = decodeSuiPrivateKey(secretKey);\n\n\t\t\tif (decoded.scheme !== 'ED25519') {\n\t\t\t\tthrow new Error(`Expected a ED25519 keypair, got ${decoded.scheme}`);\n\t\t\t}\n\n\t\t\treturn this.fromSecretKey(decoded.secretKey, options);\n\t\t}\n\n\t\tconst secretKeyLength = secretKey.length;\n\t\tif (secretKeyLength !== PRIVATE_KEY_SIZE) {\n\t\t\tthrow new Error(\n\t\t\t\t`Wrong secretKey size. Expected ${PRIVATE_KEY_SIZE} bytes, got ${secretKeyLength}.`,\n\t\t\t);\n\t\t}\n\t\tconst keypair = {\n\t\t\tpublicKey: ed25519.getPublicKey(secretKey),\n\t\t\tsecretKey,\n\t\t};\n\n\t\tif (!options || !options.skipValidation) {\n\t\t\tconst encoder = new TextEncoder();\n\t\t\tconst signData = encoder.encode('sui validation');\n\t\t\tconst signature = ed25519.sign(signData, secretKey);\n\t\t\tif (!ed25519.verify(signature, signData, keypair.publicKey)) {\n\t\t\t\tthrow new Error('provided secretKey is invalid');\n\t\t\t}\n\t\t}\n\t\treturn new Ed25519Keypair(keypair);\n\t}\n\n\t/**\n\t * The public key for this Ed25519 keypair\n\t */\n\tgetPublicKey(): Ed25519PublicKey {\n\t\treturn new Ed25519PublicKey(this.keypair.publicKey);\n\t}\n\n\t/**\n\t * The Bech32 secret key string for this Ed25519 keypair\n\t */\n\tgetSecretKey(): string {\n\t\treturn encodeSuiPrivateKey(\n\t\t\tthis.keypair.secretKey.slice(0, PRIVATE_KEY_SIZE),\n\t\t\tthis.getKeyScheme(),\n\t\t);\n\t}\n\n\t/**\n\t * Return the signature for the provided data using Ed25519.\n\t */\n\tasync sign(data: Uint8Array) {\n\t\treturn ed25519.sign(data, this.keypair.secretKey) as Uint8Array<ArrayBuffer>;\n\t}\n\n\t/**\n\t * Derive Ed25519 keypair from mnemonics and path. The mnemonics must be normalized\n\t * and validated against the english wordlist.\n\t *\n\t * If path is none, it will default to m/44'/784'/0'/0'/0', otherwise the path must\n\t * be compliant to SLIP-0010 in form m/44'/784'/{account_index}'/{change_index}'/{address_index}'.\n\t */\n\tstatic deriveKeypair(mnemonics: string, path?: string): Ed25519Keypair {\n\t\tif (path == null) {\n\t\t\tpath = DEFAULT_ED25519_DERIVATION_PATH;\n\t\t}\n\t\tif (!isValidHardenedPath(path)) {\n\t\t\tthrow new Error('Invalid derivation path');\n\t\t}\n\t\tconst { key } = derivePath(path, mnemonicToSeedHex(mnemonics));\n\n\t\treturn Ed25519Keypair.fromSecretKey(key);\n\t}\n\n\t/**\n\t * Derive Ed25519 keypair from mnemonicSeed and path.\n\t *\n\t * If path is none, it will default to m/44'/784'/0'/0'/0', otherwise the path must\n\t * be compliant to SLIP-0010 in form m/44'/784'/{account_index}'/{change_index}'/{address_index}'.\n\t *\n\t * @param seed - The seed as a hex string or Uint8Array.\n\t */\n\tstatic deriveKeypairFromSeed(seed: string | Uint8Array, path?: string): Ed25519Keypair {\n\t\tif (path == null) {\n\t\t\tpath = DEFAULT_ED25519_DERIVATION_PATH;\n\t\t}\n\t\tif (!isValidHardenedPath(path)) {\n\t\t\tthrow new Error('Invalid derivation path');\n\t\t}\n\t\tconst seedHex = typeof seed === 'string' ? seed : toHex(seed);\n\t\tconst { key } = derivePath(path, seedHex);\n\n\t\treturn Ed25519Keypair.fromSecretKey(key);\n\t}\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Config } from './types.js';\n\nexport const MAX_U64 = BigInt('18446744073709551615');\n\n/**\n * Allowed keys for metadata.\n */\nexport const ALLOWED_METADATA = {\n\tcontentHash: 'content_hash',\n\tavatar: 'avatar',\n\twalrusSiteId: 'walrus_site_id',\n};\n\nexport const mainPackage: Config = {\n\tmainnet: {\n\t\tpackageId: '0x71af035413ed499710980ed8adb010bbf2cc5cacf4ab37c7710a4bb87eb58ba5',\n\t\tpackageIdV1: '0xd22b24490e0bae52676651b4f56660a5ff8022a2576e0089f79b3c88d44e08f0',\n\t\tpackageIdPricing: '0x71af035413ed499710980ed8adb010bbf2cc5cacf4ab37c7710a4bb87eb58ba5',\n\t\tsuins: '0x6e0ddefc0ad98889c04bab9639e512c21766c5e6366f89e696956d9be6952871',\n\t\tdiscountsPackage: {\n\t\t\tpackageId: '0x03f625d805339b1b0235ba8c503fa6ea62c88c02ddf14cd9d246d9e1febc0c76',\n\t\t\tdiscountHouseId: '0x4ce82dee11e6f4858509dcdba1a62985f12e5afb054df680a04f16790bfe1d04',\n\t\t},\n\t\tsubNamesPackageId: '0xe177697e191327901637f8d2c5ffbbde8b1aaac27ec1024c4b62d1ebd1cd7430',\n\t\ttempSubdomainsProxyPackageId:\n\t\t\t'0xf335dfbcb2020fc996250c0d6fd4655c5e2036b0606cac7408aa163f51340886',\n\t\tcoupons: {\n\t\t\tpackageId: '0xb162340524e0697461c307b9dc530c17e837b0f2c6d7f787da40d29d29681e5e',\n\t\t},\n\t\tpayments: {\n\t\t\tpackageId: '0xdd0a4a34152a80d7841710e916a407b2a62961eee5b2188dcfdaa24194f66286',\n\t\t},\n\t\tbbb: {\n\t\t\tpackageId: '0x6268d072063a311f6f0a1db516d06d97c06a3fa6d10e797cad578937a47b3992',\n\t\t\tvault: '0x869f5100c0ecc0b35c7edad87ba3d488fd291bdba4a7aae84b70d188f440f393',\n\t\t},\n\t\tpyth: {\n\t\t\tpythStateId: '0x1f9310238ee9298fb703c3419030b35b22bb1cc37113e3bb5007c99aec79e5b8',\n\t\t\twormholeStateId: '0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c',\n\t\t},\n\t\tcoins: {\n\t\t\tSUI: {\n\t\t\t\ttype: '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI',\n\t\t\t\tfeed: '0x23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n\t\t\t},\n\t\t\tNS: {\n\t\t\t\ttype: '0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS',\n\t\t\t\tfeed: '0xbb5ff26e47a3a6cc7ec2fce1db996c2a145300edc5acaabe43bf9ff7c5dd5d32',\n\t\t\t},\n\t\t\tUSDC: {\n\t\t\t\ttype: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n\t\t\t\tfeed: '',\n\t\t\t},\n\t\t},\n\t\tregistryTableId: '0xe64cd9db9f829c6cc405d9790bd71567ae07259855f4fba6f02c84f52298c106',\n\t},\n\ttestnet: {\n\t\tpackageId: '0x40eee27b014a872f5c3330dcd5329aa55c7fe0fcc6e70c6498852e2e3727172e',\n\t\tpackageIdV1: '0x22fa05f21b1ad71442491220bb9338f7b7095fe35000ef88d5400d28523bdd93',\n\t\tpackageIdPricing: '0x8a4df604a449ccb9ef2efb9747046b78f78ba60fc8d88df098d0dd47619df5a4',\n\t\tsuins: '0x300369e8909b9a6464da265b9a5a9ab6fe2158a040e84e808628cde7a07ee5a3',\n\t\tdiscountsPackage: {\n\t\t\tpackageId: '0x7976f9bfe81dcbdbb635efb0ecb02844cd79109d3a698d05c06ca9fd2f97d262',\n\t\t\tdiscountHouseId: '0x9f1ac0f49ddaec4fd2248ae1cc63ed91946f43a236b333439efb9126f31f8e9b',\n\t\t},\n\t\tsubNamesPackageId: '0x3c272bc45f9157b7818ece4f7411bdfa8af46303b071aca4e18c03119c9ff636',\n\t\ttempSubdomainsProxyPackageId:\n\t\t\t'0x295a0749dae0e76126757c305f218f929df0656df66a6361f8b6c6480a943f12',\n\t\tcoupons: {\n\t\t\tpackageId: '0x63029aae8abbefae4f4ac6c5e3e0021159ea93a94ba648681fd64caf5b40677a',\n\t\t},\n\t\tpayments: {\n\t\t\tpackageId: '0xc391c200188dd1a363ff12dcffe07eaac5cf28ad1cd8dc0fcc18f2f8625f0da2',\n\t\t},\n\t\tbbb: {\n\t\t\tpackageId: '0xed9b18147ca81c8f3f60192c8d0630574e42387cd200a6e39b3e4e07df1ce6e6',\n\t\t\tvault: '0xa0b7a4dcbb85209c9096a4e0e85e43b716377c605743193abe915e9c9f3043e5',\n\t\t},\n\t\tpyth: {\n\t\t\tpythStateId: '0x243759059f4c3111179da5878c12f68d612c21a8d54d85edc86164bb18be1c7c',\n\t\t\twormholeStateId: '0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790',\n\t\t},\n\t\t/// Testnet coins will be different here for testing purposes, we can publish our own\n\t\tcoins: {\n\t\t\tSUI: {\n\t\t\t\ttype: '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI',\n\t\t\t\tfeed: '0x50c67b3fd225db8912a424dd4baed60ffdde625ed2feaaf283724f9608fea266',\n\t\t\t},\n\t\t\t/// this is a test token published as 0xb48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTNS::TESTNS\n\t\t\t/// NS token is using the HFT feed since NS feed on testnet is not available\n\t\t\tNS: {\n\t\t\t\ttype: '0xb48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTNS::TESTNS',\n\t\t\t\tfeed: '0x99137a18354efa7fb6840889d059fdb04c46a6ce21be97ab60d9ad93e91ac758',\n\t\t\t},\n\t\t\t/// this is a test token published as 0xb48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTUSDC::TESTUSDC\n\t\t\tUSDC: {\n\t\t\t\ttype: '0xb48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTUSDC::TESTUSDC',\n\t\t\t\tfeed: '',\n\t\t\t},\n\t\t},\n\t\tregistryTableId: '0xb120c0d55432630fce61f7854795a3463deb6e3b443cc4ae72e1282073ff56e4',\n\t},\n};\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Transaction } from '@mysten/sui/transactions';\nimport { normalizeSuiNSName } from '@mysten/sui/utils';\n\nexport function isSubName(name: string): boolean {\n\treturn normalizeSuiNSName(name, 'dot').split('.').length > 2;\n}\n\n/**\n * Checks if a name is a nested subname.\n * A nested subdomain is a subdomain that is a subdomain of another subdomain.\n * @param name The name to check (e.g test.example.sub.sui)\n */\nexport function isNestedSubName(name: string): boolean {\n\treturn normalizeSuiNSName(name, 'dot').split('.').length > 3;\n}\n\n/**\n * The years must be between 1 and 5.\n */\nexport function validateYears(years: number) {\n\tif (!(years > 0 && years < 6)) throw new Error('Years must be between 1 and 5');\n}\n\nexport function zeroCoin(tx: Transaction, type: string) {\n\treturn tx.moveCall({\n\t\ttarget: '0x2::coin::zero',\n\t\ttypeArguments: [type],\n\t});\n}\n\nexport function getConfigType(suinsPackageV1: string, innerType: string): string {\n\treturn `${suinsPackageV1}::suins::ConfigKey<${innerType}>`;\n}\n\nexport function getDomainType(suinsPackageV1: string): string {\n\treturn `${suinsPackageV1}::domain::Domain`;\n}\n\nexport function getPricelistConfigType(suinsPackageId: string): string {\n\treturn `${suinsPackageId}::pricing_config::PricingConfig`;\n}\n\nexport function getRenewalPricelistConfigType(suinsPackageId: string): string {\n\treturn `${suinsPackageId}::pricing_config::RenewalConfig`;\n}\n\nexport function getCoinDiscountConfigType(paymentPackageId: string): string {\n\treturn `${paymentPackageId}::payments::PaymentsConfig`;\n}\n","import {\n\tbcs,\n\ttype BcsType,\n\ttype TypeTag,\n\tTypeTagSerializer,\n\tBcsStruct,\n\tBcsEnum,\n\tBcsTuple,\n} from '@mysten/sui/bcs';\nimport { normalizeSuiAddress } from '@mysten/sui/utils';\nimport { type TransactionArgument, isArgument } from '@mysten/sui/transactions';\nimport { type ClientWithCoreApi, type SuiClientTypes } from '@mysten/sui/client';\n\nconst MOVE_STDLIB_ADDRESS = normalizeSuiAddress('0x1');\nconst SUI_FRAMEWORK_ADDRESS = normalizeSuiAddress('0x2');\n\nexport type RawTransactionArgument<T> = T | TransactionArgument;\n\nexport type GetOptions<Include extends Omit<SuiClientTypes.ObjectInclude, 'content'> = {}> =\n\tSuiClientTypes.GetObjectOptions<Include> & { client: ClientWithCoreApi };\n\nexport type GetManyOptions<Include extends Omit<SuiClientTypes.ObjectInclude, 'content'> = {}> =\n\tSuiClientTypes.GetObjectsOptions<Include> & { client: ClientWithCoreApi };\n\nexport function getPureBcsSchema(typeTag: string | TypeTag): BcsType<any> | null {\n\tconst parsedTag = typeof typeTag === 'string' ? TypeTagSerializer.parseFromStr(typeTag) : typeTag;\n\n\tif ('u8' in parsedTag) {\n\t\treturn bcs.U8;\n\t} else if ('u16' in parsedTag) {\n\t\treturn bcs.U16;\n\t} else if ('u32' in parsedTag) {\n\t\treturn bcs.U32;\n\t} else if ('u64' in parsedTag) {\n\t\treturn bcs.U64;\n\t} else if ('u128' in parsedTag) {\n\t\treturn bcs.U128;\n\t} else if ('u256' in parsedTag) {\n\t\treturn bcs.U256;\n\t} else if ('address' in parsedTag) {\n\t\treturn bcs.Address;\n\t} else if ('bool' in parsedTag) {\n\t\treturn bcs.Bool;\n\t} else if ('vector' in parsedTag) {\n\t\tconst type = getPureBcsSchema(parsedTag.vector);\n\t\treturn type ? bcs.vector(type) : null;\n\t} else if ('struct' in parsedTag) {\n\t\tconst structTag = parsedTag.struct;\n\t\tconst pkg = normalizeSuiAddress(structTag.address);\n\n\t\tif (pkg === MOVE_STDLIB_ADDRESS) {\n\t\t\tif (\n\t\t\t\t(structTag.module === 'ascii' || structTag.module === 'string') &&\n\t\t\t\tstructTag.name === 'String'\n\t\t\t) {\n\t\t\t\treturn bcs.String;\n\t\t\t}\n\n\t\t\tif (structTag.module === 'option' && structTag.name === 'Option') {\n\t\t\t\tconst inner = structTag.typeParams[0];\n\t\t\t\tconst type = inner ? getPureBcsSchema(inner) : null;\n\t\t\t\treturn type ? bcs.option(type) : null;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tpkg === SUI_FRAMEWORK_ADDRESS &&\n\t\t\tstructTag.module === 'object' &&\n\t\t\t(structTag.name === 'ID' || structTag.name === 'UID')\n\t\t) {\n\t\t\treturn bcs.Address;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nexport function normalizeMoveArguments(\n\targs: unknown[] | object,\n\targTypes: readonly (string | null)[],\n\tparameterNames?: string[],\n) {\n\tconst argLen = Array.isArray(args) ? args.length : Object.keys(args).length;\n\tif (parameterNames && argLen !== parameterNames.length) {\n\t\tthrow new Error(\n\t\t\t`Invalid number of arguments, expected ${parameterNames.length}, got ${argLen}`,\n\t\t);\n\t}\n\n\tconst normalizedArgs: TransactionArgument[] = [];\n\n\tlet index = 0;\n\tfor (const argType of argTypes) {\n\t\tif (argType === '0x2::clock::Clock') {\n\t\t\tnormalizedArgs.push((tx) => tx.object.clock());\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (argType === '0x2::random::Random') {\n\t\t\tnormalizedArgs.push((tx) => tx.object.random());\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (argType === '0x2::deny_list::DenyList') {\n\t\t\tnormalizedArgs.push((tx) => tx.object.denyList());\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (argType === '0x3::sui_system::SuiSystemState') {\n\t\t\tnormalizedArgs.push((tx) => tx.object.system());\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet arg;\n\t\tif (Array.isArray(args)) {\n\t\t\tif (index >= args.length) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid number of arguments, expected at least ${index + 1}, got ${args.length}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\targ = args[index];\n\t\t} else {\n\t\t\tif (!parameterNames) {\n\t\t\t\tthrow new Error(`Expected arguments to be passed as an array`);\n\t\t\t}\n\t\t\tconst name = parameterNames[index];\n\t\t\targ = args[name as keyof typeof args];\n\n\t\t\tif (arg === undefined) {\n\t\t\t\tthrow new Error(`Parameter ${name} is required`);\n\t\t\t}\n\t\t}\n\n\t\tindex += 1;\n\n\t\tif (typeof arg === 'function' || isArgument(arg)) {\n\t\t\tnormalizedArgs.push(arg as TransactionArgument);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst bcsType = argType === null ? null : getPureBcsSchema(argType);\n\n\t\tif (bcsType) {\n\t\t\tconst bytes = bcsType.serialize(arg as never);\n\t\t\tnormalizedArgs.push((tx) => tx.pure(bytes));\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (typeof arg === 'string') {\n\t\t\tnormalizedArgs.push((tx) => tx.object(arg));\n\t\t\tcontinue;\n\t\t}\n\n\t\tthrow new Error(`Invalid argument ${stringify(arg)} for type ${argType}`);\n\t}\n\n\treturn normalizedArgs;\n}\n\nexport class MoveStruct<\n\tT extends Record<string, BcsType<any>>,\n\tconst Name extends string = string,\n> extends BcsStruct<T, Name> {\n\tasync get<Include extends Omit<SuiClientTypes.ObjectInclude, 'content' | 'json'> = {}>({\n\t\tobjectId,\n\t\t...options\n\t}: GetOptions<Include>): Promise<\n\t\tSuiClientTypes.Object<Include & { content: true; json: true }> & {\n\t\t\tjson: BcsStruct<T>['$inferType'];\n\t\t}\n\t> {\n\t\tconst [res] = await this.getMany<Include>({\n\t\t\t...options,\n\t\t\tobjectIds: [objectId],\n\t\t});\n\n\t\tif (!res) {\n\t\t\tthrow new Error(`No object found for id ${objectId}`);\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tasync getMany<Include extends Omit<SuiClientTypes.ObjectInclude, 'content' | 'json'> = {}>({\n\t\tclient,\n\t\t...options\n\t}: GetManyOptions<Include>): Promise<\n\t\tArray<\n\t\t\tSuiClientTypes.Object<Include & { content: true; json: true }> & {\n\t\t\t\tjson: BcsStruct<T>['$inferType'];\n\t\t\t}\n\t\t>\n\t> {\n\t\tconst response = (await client.core.getObjects({\n\t\t\t...options,\n\t\t\tinclude: {\n\t\t\t\t...options.include,\n\t\t\t\tcontent: true,\n\t\t\t},\n\t\t})) as SuiClientTypes.GetObjectsResponse<Include & { content: true }>;\n\n\t\treturn response.objects.map((obj) => {\n\t\t\tif (obj instanceof Error) {\n\t\t\t\tthrow obj;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...obj,\n\t\t\t\tjson: this.parse(obj.content),\n\t\t\t};\n\t\t});\n\t}\n}\n\nexport class MoveEnum<\n\tT extends Record<string, BcsType<any> | null>,\n\tconst Name extends string,\n> extends BcsEnum<T, Name> {}\n\nexport class MoveTuple<\n\tconst T extends readonly BcsType<any>[],\n\tconst Name extends string,\n> extends BcsTuple<T, Name> {}\n\nfunction stringify(val: unknown) {\n\tif (typeof val === 'object') {\n\t\treturn JSON.stringify(val, (val: unknown) => val);\n\t}\n\tif (typeof val === 'bigint') {\n\t\treturn val.toString();\n\t}\n\n\treturn val;\n}\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\n\n/**\n * Defines the `Domain` type and helper functions.\n *\n * Domains are structured similar to their web2 counterpart and the rules\n * determining what a valid domain is can be found here:\n * https://en.wikipedia.org/wiki/Domain_name#Domain_name_syntax\n */\n\nimport { MoveStruct, normalizeMoveArguments, type RawTransactionArgument } from '../utils/index.js';\nimport { bcs } from '@mysten/sui/bcs';\nimport { type Transaction, type TransactionArgument } from '@mysten/sui/transactions';\nconst $moduleName = '@suins/core::domain';\nexport const Domain = new MoveStruct({\n\tname: `${$moduleName}::Domain`,\n\tfields: {\n\t\t/**\n\t\t * Vector of labels that make up a domain.\n\t\t *\n\t\t * Labels are stored in reverse order such that the TLD is always in position `0`.\n\t\t * e.g. domain \"pay.name.sui\" will be stored in the vector as [\"sui\", \"name\",\n\t\t * \"pay\"].\n\t\t */\n\t\tlabels: bcs.vector(bcs.string()),\n\t},\n});\nexport interface NewArguments {\n\tdomain: RawTransactionArgument<string>;\n}\nexport interface NewOptions {\n\tpackage?: string;\n\targuments: NewArguments | [domain: RawTransactionArgument<string>];\n}\nexport function _new(options: NewOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = ['0x1::string::String'] satisfies (string | null)[];\n\tconst parameterNames = ['domain'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'domain',\n\t\t\tfunction: 'new',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface ToStringArguments {\n\tself: TransactionArgument;\n}\nexport interface ToStringOptions {\n\tpackage?: string;\n\targuments: ToStringArguments | [self: TransactionArgument];\n}\n/** Converts a domain into a fully-qualified string representation. */\nexport function toString(options: ToStringOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null] satisfies (string | null)[];\n\tconst parameterNames = ['self'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'domain',\n\t\t\tfunction: 'to_string',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface LabelArguments {\n\tself: TransactionArgument;\n\tlevel: RawTransactionArgument<number | bigint>;\n}\nexport interface LabelOptions {\n\tpackage?: string;\n\targuments:\n\t\t| LabelArguments\n\t\t| [self: TransactionArgument, level: RawTransactionArgument<number | bigint>];\n}\n/**\n * Returns the `label` in a domain specified by `level`.\n *\n * Given the domain \"pay.name.sui\" the individual labels have the following levels:\n *\n * - \"pay\" - `2`\n * - \"name\" - `1`\n * - \"sui\" - `0`\n *\n * This means that the TLD will always be at level `0`.\n */\nexport function label(options: LabelOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, 'u64'] satisfies (string | null)[];\n\tconst parameterNames = ['self', 'level'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'domain',\n\t\t\tfunction: 'label',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface TldArguments {\n\tself: TransactionArgument;\n}\nexport interface TldOptions {\n\tpackage?: string;\n\targuments: TldArguments | [self: TransactionArgument];\n}\n/**\n * Returns the TLD (Top-Level Domain) of a `Domain`.\n *\n * \"name.sui\" -> \"sui\"\n */\nexport function tld(options: TldOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null] satisfies (string | null)[];\n\tconst parameterNames = ['self'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'domain',\n\t\t\tfunction: 'tld',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface SldArguments {\n\tself: TransactionArgument;\n}\nexport interface SldOptions {\n\tpackage?: string;\n\targuments: SldArguments | [self: TransactionArgument];\n}\n/**\n * Returns the SLD (Second-Level Domain) of a `Domain`.\n *\n * \"name.sui\" -> \"sui\"\n */\nexport function sld(options: SldOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null] satisfies (string | null)[];\n\tconst parameterNames = ['self'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'domain',\n\t\t\tfunction: 'sld',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface NumberOfLevelsArguments {\n\tself: TransactionArgument;\n}\nexport interface NumberOfLevelsOptions {\n\tpackage?: string;\n\targuments: NumberOfLevelsArguments | [self: TransactionArgument];\n}\nexport function numberOfLevels(options: NumberOfLevelsOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null] satisfies (string | null)[];\n\tconst parameterNames = ['self'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'domain',\n\t\t\tfunction: 'number_of_levels',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface IsSubdomainArguments {\n\tdomain: TransactionArgument;\n}\nexport interface IsSubdomainOptions {\n\tpackage?: string;\n\targuments: IsSubdomainArguments | [domain: TransactionArgument];\n}\nexport function isSubdomain(options: IsSubdomainOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null] satisfies (string | null)[];\n\tconst parameterNames = ['domain'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'domain',\n\t\t\tfunction: 'is_subdomain',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface ParentArguments {\n\tdomain: TransactionArgument;\n}\nexport interface ParentOptions {\n\tpackage?: string;\n\targuments: ParentArguments | [domain: TransactionArgument];\n}\n/** Derive the parent of a subdomain. e.g. `subdomain.example.sui` -> `example.sui` */\nexport function parent(options: ParentOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null] satisfies (string | null)[];\n\tconst parameterNames = ['domain'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'domain',\n\t\t\tfunction: 'parent',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface IsParentOfArguments {\n\tparent: TransactionArgument;\n\tchild: TransactionArgument;\n}\nexport interface IsParentOfOptions {\n\tpackage?: string;\n\targuments: IsParentOfArguments | [parent: TransactionArgument, child: TransactionArgument];\n}\n/** Checks if `parent` domain is a valid parent for `child`. */\nexport function isParentOf(options: IsParentOfOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, null] satisfies (string | null)[];\n\tconst parameterNames = ['parent', 'child'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'domain',\n\t\t\tfunction: 'is_parent_of',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\nimport { type BcsType, bcs } from '@mysten/sui/bcs';\nimport { MoveStruct } from '../../../utils/index.js';\nconst $moduleName = '0x2::vec_map';\n/** An entry in the map */\nexport function Entry<K extends BcsType<any>, V extends BcsType<any>>(...typeParameters: [K, V]) {\n\treturn new MoveStruct({\n\t\tname: `${$moduleName}::Entry<${typeParameters[0].name as K['name']}, ${typeParameters[1].name as V['name']}>`,\n\t\tfields: {\n\t\t\tkey: typeParameters[0],\n\t\t\tvalue: typeParameters[1],\n\t\t},\n\t});\n}\n/**\n * A map data structure backed by a vector. The map is guaranteed not to contain\n * duplicate keys, but entries are _not_ sorted by key--entries are included in\n * insertion order. All operations are O(N) in the size of the map--the intention\n * of this data structure is only to provide the convenience of programming against\n * a map API. Large maps should use handwritten parent/child relationships instead.\n * Maps that need sorted iteration rather than insertion order iteration should\n * also be handwritten.\n */\nexport function VecMap<K extends BcsType<any>, V extends BcsType<any>>(...typeParameters: [K, V]) {\n\treturn new MoveStruct({\n\t\tname: `${$moduleName}::VecMap<${typeParameters[0].name as K['name']}, ${typeParameters[1].name as V['name']}>`,\n\t\tfields: {\n\t\t\tcontents: bcs.vector(Entry(typeParameters[0], typeParameters[1])),\n\t\t},\n\t});\n}\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\n\n/** Functionality for converting Move types into values. Use with care! */\n\nimport { MoveStruct } from '../../../utils/index.js';\nimport { bcs } from '@mysten/sui/bcs';\nconst $moduleName = 'std::type_name';\nexport const TypeName = new MoveStruct({\n\tname: `${$moduleName}::TypeName`,\n\tfields: {\n\t\t/**\n\t\t * String representation of the type. All types are represented using their source\n\t\t * syntax: \"u8\", \"u64\", \"bool\", \"address\", \"vector\", and so on for primitive types.\n\t\t * Struct types are represented as fully qualified type names; e.g.\n\t\t * `00000000000000000000000000000001::string::String` or\n\t\t * `0000000000000000000000000000000a::module_name1::type_name1<0000000000000000000000000000000a::module_name2::type_name2<u64>>`\n\t\t * Addresses are hex-encoded lowercase values of length ADDRESS_LENGTH (16, 20, or\n\t\t * 32 depending on the Move platform)\n\t\t */\n\t\tname: bcs.string(),\n\t},\n});\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\nimport { type BcsType, bcs } from '@mysten/sui/bcs';\nimport { MoveStruct } from '../../../utils/index.js';\nconst $moduleName = '0x2::vec_map';\n/** An entry in the map */\nexport function Entry<K extends BcsType<any>, V extends BcsType<any>>(...typeParameters: [K, V]) {\n\treturn new MoveStruct({\n\t\tname: `${$moduleName}::Entry<${typeParameters[0].name as K['name']}, ${typeParameters[1].name as V['name']}>`,\n\t\tfields: {\n\t\t\tkey: typeParameters[0],\n\t\t\tvalue: typeParameters[1],\n\t\t},\n\t});\n}\n/**\n * A map data structure backed by a vector. The map is guaranteed not to contain\n * duplicate keys, but entries are _not_ sorted by key--entries are included in\n * insertion order. All operations are O(N) in the size of the map--the intention\n * of this data structure is only to provide the convenience of programming against\n * a map API. Large maps should use handwritten parent/child relationships instead.\n * Maps that need sorted iteration rather than insertion order iteration should\n * also be handwritten.\n */\nexport function VecMap<K extends BcsType<any>, V extends BcsType<any>>(...typeParameters: [K, V]) {\n\treturn new MoveStruct({\n\t\tname: `${$moduleName}::VecMap<${typeParameters[0].name as K['name']}, ${typeParameters[1].name as V['name']}>`,\n\t\tfields: {\n\t\t\tcontents: bcs.vector(Entry(typeParameters[0], typeParameters[1])),\n\t\t},\n\t});\n}\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\nimport {\n\tMoveTuple,\n\tMoveStruct,\n\tnormalizeMoveArguments,\n\ttype RawTransactionArgument,\n} from '../utils/index.js';\nimport { bcs } from '@mysten/sui/bcs';\nimport { type Transaction, type TransactionArgument } from '@mysten/sui/transactions';\nimport * as type_name from './deps/std/type_name.js';\nimport * as vec_map from './deps/sui/vec_map.js';\nconst $moduleName = '@suins/payments::payments';\nexport const PaymentsApp = new MoveTuple({\n\tname: `${$moduleName}::PaymentsApp`,\n\tfields: [bcs.bool()],\n});\nexport const CoinTypeData = new MoveStruct({\n\tname: `${$moduleName}::CoinTypeData`,\n\tfields: {\n\t\t/** The coin's decimals. */\n\t\tdecimals: bcs.u8(),\n\t\tdiscount_percentage: bcs.u8(),\n\t\tprice_feed_id: bcs.vector(bcs.u8()),\n\t\ttype_name: type_name.TypeName,\n\t},\n});\nexport const PaymentsConfig = new MoveStruct({\n\tname: `${$moduleName}::PaymentsConfig`,\n\tfields: {\n\t\tcurrencies: vec_map.VecMap(type_name.TypeName, CoinTypeData),\n\t\tbase_currency: type_name.TypeName,\n\t\tmax_age: bcs.u64(),\n\t\t/** The percentage of the payment that gets burned, in basis points. */\n\t\tburn_bps: bcs.u64(),\n\t},\n});\nexport interface HandleBasePaymentArguments {\n\tsuins: RawTransactionArgument<string>;\n\tbbbVault: RawTransactionArgument<string>;\n\tintent: TransactionArgument;\n\tpayment: RawTransactionArgument<string>;\n}\nexport interface HandleBasePaymentOptions {\n\tpackage?: string;\n\targuments:\n\t\t| HandleBasePaymentArguments\n\t\t| [\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tbbbVault: RawTransactionArgument<string>,\n\t\t\t\tintent: TransactionArgument,\n\t\t\t\tpayment: RawTransactionArgument<string>,\n\t\t ];\n\ttypeArguments: [string];\n}\n/**\n * This has to be called with our base payment currency. The payment has to be\n * equal to the base price of the domain. We do not need to check the price feed\n * for the base currency.\n */\nexport function handleBasePayment(options: HandleBasePaymentOptions) {\n\tconst packageAddress = options.package ?? '@suins/payments';\n\tconst argumentsTypes = [null, null, null, null] satisfies (string | null)[];\n\tconst parameterNames = ['suins', 'bbbVault', 'intent', 'payment'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payments',\n\t\t\tfunction: 'handle_base_payment',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\nexport interface HandlePaymentArguments {\n\tsuins: RawTransactionArgument<string>;\n\tbbbVault: RawTransactionArgument<string>;\n\tintent: TransactionArgument;\n\tpayment: RawTransactionArgument<string>;\n\tpriceInfoObject: RawTransactionArgument<string>;\n\tuserPriceGuard: RawTransactionArgument<number | bigint>;\n}\nexport interface HandlePaymentOptions {\n\tpackage?: string;\n\targuments:\n\t\t| HandlePaymentArguments\n\t\t| [\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tbbbVault: RawTransactionArgument<string>,\n\t\t\t\tintent: TransactionArgument,\n\t\t\t\tpayment: RawTransactionArgument<string>,\n\t\t\t\tpriceInfoObject: RawTransactionArgument<string>,\n\t\t\t\tuserPriceGuard: RawTransactionArgument<number | bigint>,\n\t\t ];\n\ttypeArguments: [string];\n}\n/**\n * Handles a payment done for a non-base currency payment. E.g. SUI, NS.\n *\n * The payment amount is derived from the base currency price and the Pyth price\n * feed.\n *\n * The `user_price_guard` is a value that the user expects to pay. If the payment\n * amount is higher than this value, the payment will be rejected. This is to\n * protect the user from paying more than they expected on their FEs. Ideally, this\n * number should be calculated on the FE based on the price that is being displayed\n * to the user (with a buffer determined by the FE).\n */\nexport function handlePayment(options: HandlePaymentOptions) {\n\tconst packageAddress = options.package ?? '@suins/payments';\n\tconst argumentsTypes = [null, null, null, null, '0x2::clock::Clock', null, 'u64'] satisfies (\n\t\t| string\n\t\t| null\n\t)[];\n\tconst parameterNames = [\n\t\t'suins',\n\t\t'bbbVault',\n\t\t'intent',\n\t\t'payment',\n\t\t'priceInfoObject',\n\t\t'userPriceGuard',\n\t];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payments',\n\t\t\tfunction: 'handle_payment',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\nexport interface CalculatePriceArguments {\n\tsuins: RawTransactionArgument<string>;\n\tbaseAmount: RawTransactionArgument<number | bigint>;\n\tpriceInfoObject: RawTransactionArgument<string>;\n}\nexport interface CalculatePriceOptions {\n\tpackage?: string;\n\targuments:\n\t\t| CalculatePriceArguments\n\t\t| [\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tbaseAmount: RawTransactionArgument<number | bigint>,\n\t\t\t\tpriceInfoObject: RawTransactionArgument<string>,\n\t\t ];\n\ttypeArguments: [string];\n}\n/**\n * Calculates the amount that has to be paid in the target currency.\n *\n * Can be used to split the payment amount in a single PTB.\n *\n * 1. const intent = function_to_get_intent();\n * 2. const price = calculate_price<SUI>(suins, intent, ...);\n * 3. const coin = txb.splitCoins(baseCoin, [price])\n * 4. handle_payment<SUI>(suins, intent, coin, ...);\n */\nexport function calculatePrice(options: CalculatePriceOptions) {\n\tconst packageAddress = options.package ?? '@suins/payments';\n\tconst argumentsTypes = [null, 'u64', '0x2::clock::Clock', null] satisfies (string | null)[];\n\tconst parameterNames = ['suins', 'baseAmount', 'priceInfoObject'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payments',\n\t\t\tfunction: 'calculate_price',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\nexport interface CalculatePriceAfterDiscountArguments {\n\tsuins: RawTransactionArgument<string>;\n\tintent: TransactionArgument;\n}\nexport interface CalculatePriceAfterDiscountOptions {\n\tpackage?: string;\n\targuments:\n\t\t| CalculatePriceAfterDiscountArguments\n\t\t| [suins: RawTransactionArgument<string>, intent: TransactionArgument];\n\ttypeArguments: [string];\n}\nexport function calculatePriceAfterDiscount(options: CalculatePriceAfterDiscountOptions) {\n\tconst packageAddress = options.package ?? '@suins/payments';\n\tconst argumentsTypes = [null, null] satisfies (string | null)[];\n\tconst parameterNames = ['suins', 'intent'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payments',\n\t\t\tfunction: 'calculate_price_after_discount',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\nexport interface NewCoinTypeDataArguments {\n\tcoinMetadata: RawTransactionArgument<string>;\n\tdiscountPercentage: RawTransactionArgument<number>;\n\tpriceFeedId: RawTransactionArgument<Array<number>>;\n}\nexport interface NewCoinTypeDataOptions {\n\tpackage?: string;\n\targuments:\n\t\t| NewCoinTypeDataArguments\n\t\t| [\n\t\t\t\tcoinMetadata: RawTransactionArgument<string>,\n\t\t\t\tdiscountPercentage: RawTransactionArgument<number>,\n\t\t\t\tpriceFeedId: RawTransactionArgument<Array<number>>,\n\t\t ];\n\ttypeArguments: [string];\n}\n/** Creates a new CoinTypeData struct. Leave price_feed_id empty for base currency. */\nexport function newCoinTypeData(options: NewCoinTypeDataOptions) {\n\tconst packageAddress = options.package ?? '@suins/payments';\n\tconst argumentsTypes = [null, 'u8', 'vector<u8>'] satisfies (string | null)[];\n\tconst parameterNames = ['coinMetadata', 'discountPercentage', 'priceFeedId'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payments',\n\t\t\tfunction: 'new_coin_type_data',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\nexport interface NewPaymentsConfigArguments {\n\tsetups: TransactionArgument;\n\tbaseCurrency: TransactionArgument;\n\tmaxAge: RawTransactionArgument<number | bigint>;\n\tburnBps: RawTransactionArgument<number | bigint>;\n}\nexport interface NewPaymentsConfigOptions {\n\tpackage?: string;\n\targuments:\n\t\t| NewPaymentsConfigArguments\n\t\t| [\n\t\t\t\tsetups: TransactionArgument,\n\t\t\t\tbaseCurrency: TransactionArgument,\n\t\t\t\tmaxAge: RawTransactionArgument<number | bigint>,\n\t\t\t\tburnBps: RawTransactionArgument<number | bigint>,\n\t\t ];\n}\n/**\n * Creates a new PaymentsConfig struct. Can be attached by the Admin to SuiNS to\n * allow the payments module to work.\n */\nexport function newPaymentsConfig(options: NewPaymentsConfigOptions) {\n\tconst packageAddress = options.package ?? '@suins/payments';\n\tconst argumentsTypes = ['vector<null>', null, 'u64', 'u64'] satisfies (string | null)[];\n\tconst parameterNames = ['setups', 'baseCurrency', 'maxAge', 'burnBps'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payments',\n\t\t\tfunction: 'new_payments_config',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\n\n/** Functionality for converting Move types into values. Use with care! */\n\nimport { MoveStruct } from '../../../utils/index.js';\nimport { bcs } from '@mysten/sui/bcs';\nconst $moduleName = 'std::type_name';\nexport const TypeName = new MoveStruct({\n\tname: `${$moduleName}::TypeName`,\n\tfields: {\n\t\t/**\n\t\t * String representation of the type. All types are represented using their source\n\t\t * syntax: \"u8\", \"u64\", \"bool\", \"address\", \"vector\", and so on for primitive types.\n\t\t * Struct types are represented as fully qualified type names; e.g.\n\t\t * `00000000000000000000000000000001::string::String` or\n\t\t * `0000000000000000000000000000000a::module_name1::type_name1<0000000000000000000000000000000a::module_name2::type_name2<u64>>`\n\t\t * Addresses are hex-encoded lowercase values of length ADDRESS_LENGTH (16, 20, or\n\t\t * 32 depending on the Move platform)\n\t\t */\n\t\tname: bcs.string(),\n\t},\n});\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\nimport {\n\tMoveStruct,\n\tMoveEnum,\n\tnormalizeMoveArguments,\n\ttype RawTransactionArgument,\n} from '../utils/index.js';\nimport { bcs, type BcsType } from '@mysten/sui/bcs';\nimport { type Transaction, type TransactionArgument } from '@mysten/sui/transactions';\nimport * as domain_1 from './domain.js';\nimport * as vec_map from './deps/sui/vec_map.js';\nimport * as type_name from './deps/std/type_name.js';\nconst $moduleName = '@suins/core::payment';\nexport const RequestData = new MoveStruct({\n\tname: `${$moduleName}::RequestData`,\n\tfields: {\n\t\t/** The version of the payment module. */\n\t\tversion: bcs.u8(),\n\t\t/** The domain for which the payment is being made. */\n\t\tdomain: domain_1.Domain,\n\t\t/** The years for which the payment is being made. Defaults to 1 for registration. */\n\t\tyears: bcs.u8(),\n\t\t/** The amount the user has to pay in base units. */\n\t\tbase_amount: bcs.u64(),\n\t\t/**\n\t\t * The discounts (each app can add a key for its discount) to avoid multiple\n\t\t * additions of the same discount.\n\t\t */\n\t\tdiscounts_applied: vec_map.VecMap(bcs.string(), bcs.u64()),\n\t\t/**\n\t\t * a metadata field for future-proofness. No use-cases are enabled in the current\n\t\t * release.\n\t\t */\n\t\tmetadata: vec_map.VecMap(bcs.string(), bcs.string()),\n\t},\n});\nexport const TransactionEvent = new MoveStruct({\n\tname: `${$moduleName}::TransactionEvent`,\n\tfields: {\n\t\tapp: type_name.TypeName,\n\t\tdomain: domain_1.Domain,\n\t\tyears: bcs.u8(),\n\t\trequest_data_version: bcs.u8(),\n\t\tbase_amount: bcs.u64(),\n\t\tdiscounts_applied: vec_map.VecMap(bcs.string(), bcs.u64()),\n\t\tmetadata: vec_map.VecMap(bcs.string(), bcs.string()),\n\t\tis_renewal: bcs.bool(),\n\t\tcurrency: type_name.TypeName,\n\t\tcurrency_amount: bcs.u64(),\n\t},\n});\n/**\n * The payment intent for a given domain\n *\n * - Registration: The user is registering a new domain.\n * - Renewal: The user is renewing an existing domain.\n */\nexport const PaymentIntent = new MoveEnum({\n\tname: `${$moduleName}::PaymentIntent`,\n\tfields: {\n\t\tRegistration: RequestData,\n\t\tRenewal: RequestData,\n\t},\n});\n/**\n * A receipt that is generated after a successful payment. Can be used to:\n *\n * - Prove that the payment was successful.\n * - Register a new name, or renew an existing one.\n */\nexport const Receipt = new MoveEnum({\n\tname: `${$moduleName}::Receipt`,\n\tfields: {\n\t\tRegistration: new MoveStruct({\n\t\t\tname: `Receipt.Registration`,\n\t\t\tfields: {\n\t\t\t\tdomain: domain_1.Domain,\n\t\t\t\tyears: bcs.u8(),\n\t\t\t\tversion: bcs.u8(),\n\t\t\t},\n\t\t}),\n\t\tRenewal: new MoveStruct({\n\t\t\tname: `Receipt.Renewal`,\n\t\t\tfields: {\n\t\t\t\tdomain: domain_1.Domain,\n\t\t\t\tyears: bcs.u8(),\n\t\t\t\tversion: bcs.u8(),\n\t\t\t},\n\t\t}),\n\t},\n});\nexport interface ApplyPercentageDiscountArguments<A extends BcsType<any>> {\n\tintent: TransactionArgument;\n\tsuins: RawTransactionArgument<string>;\n\t_: RawTransactionArgument<A>;\n\tdiscountKey: RawTransactionArgument<string>;\n\tdiscount: RawTransactionArgument<number>;\n\tallowMultipleDiscounts: RawTransactionArgument<boolean>;\n}\nexport interface ApplyPercentageDiscountOptions<A extends BcsType<any>> {\n\tpackage?: string;\n\targuments:\n\t\t| ApplyPercentageDiscountArguments<A>\n\t\t| [\n\t\t\t\tintent: TransactionArgument,\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\t_: RawTransactionArgument<A>,\n\t\t\t\tdiscountKey: RawTransactionArgument<string>,\n\t\t\t\tdiscount: RawTransactionArgument<number>,\n\t\t\t\tallowMultipleDiscounts: RawTransactionArgument<boolean>,\n\t\t ];\n\ttypeArguments: [string];\n}\n/**\n * Allow an authorized app to apply a percentage discount to the payment intent.\n * E.g. an NS payment can apply a 10% discount on top of a user's 20% discount if\n * allow_multiple_discounts is true\n */\nexport function applyPercentageDiscount<A extends BcsType<any>>(\n\toptions: ApplyPercentageDiscountOptions<A>,\n) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [\n\t\tnull,\n\t\tnull,\n\t\t`${options.typeArguments[0]}`,\n\t\t'0x1::string::String',\n\t\t'u8',\n\t\t'bool',\n\t] satisfies (string | null)[];\n\tconst parameterNames = [\n\t\t'intent',\n\t\t'suins',\n\t\t'_',\n\t\t'discountKey',\n\t\t'discount',\n\t\t'allowMultipleDiscounts',\n\t];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payment',\n\t\t\tfunction: 'apply_percentage_discount',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\nexport interface FinalizePaymentArguments<A extends BcsType<any>> {\n\tintent: TransactionArgument;\n\tsuins: RawTransactionArgument<string>;\n\tapp: RawTransactionArgument<A>;\n\tcoin: RawTransactionArgument<string>;\n}\nexport interface FinalizePaymentOptions<A extends BcsType<any>> {\n\tpackage?: string;\n\targuments:\n\t\t| FinalizePaymentArguments<A>\n\t\t| [\n\t\t\t\tintent: TransactionArgument,\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tapp: RawTransactionArgument<A>,\n\t\t\t\tcoin: RawTransactionArgument<string>,\n\t\t ];\n\ttypeArguments: [string, string];\n}\n/**\n * Allow an authorized app to finalize a payment. Returns a receipt that can be\n * used to register or renew a domain.\n *\n * SAFETY: Only authorized packages can call this. We do not check the amount of\n * funds in this helper. This is the responsibility of the `payments` app.\n */\nexport function finalizePayment<A extends BcsType<any>>(options: FinalizePaymentOptions<A>) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, null, `${options.typeArguments[0]}`, null] satisfies (\n\t\t| string\n\t\t| null\n\t)[];\n\tconst parameterNames = ['intent', 'suins', 'app', 'coin'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payment',\n\t\t\tfunction: 'finalize_payment',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\nexport interface InitRegistrationArguments {\n\tsuins: RawTransactionArgument<string>;\n\tdomain: RawTransactionArgument<string>;\n}\nexport interface InitRegistrationOptions {\n\tpackage?: string;\n\targuments:\n\t\t| InitRegistrationArguments\n\t\t| [suins: RawTransactionArgument<string>, domain: RawTransactionArgument<string>];\n}\n/**\n * Creates a `PaymentIntent` for registering a new domain. This is a hot-potato and\n * can only be consumed in a single transaction.\n */\nexport function initRegistration(options: InitRegistrationOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, '0x1::string::String'] satisfies (string | null)[];\n\tconst parameterNames = ['suins', 'domain'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payment',\n\t\t\tfunction: 'init_registration',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface InitRenewalArguments {\n\tsuins: RawTransactionArgument<string>;\n\tnft: RawTransactionArgument<string>;\n\tyears: RawTransactionArgument<number>;\n}\nexport interface InitRenewalOptions {\n\tpackage?: string;\n\targuments:\n\t\t| InitRenewalArguments\n\t\t| [\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tnft: RawTransactionArgument<string>,\n\t\t\t\tyears: RawTransactionArgument<number>,\n\t\t ];\n}\n/**\n * Creates a `PaymentIntent` for renewing an existing domain. This is a hot-potato\n * and can only be consumed in a single transaction.\n */\nexport function initRenewal(options: InitRenewalOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, null, 'u8'] satisfies (string | null)[];\n\tconst parameterNames = ['suins', 'nft', 'years'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payment',\n\t\t\tfunction: 'init_renewal',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface RegisterArguments {\n\treceipt: TransactionArgument;\n\tsuins: RawTransactionArgument<string>;\n}\nexport interface RegisterOptions {\n\tpackage?: string;\n\targuments:\n\t\t| RegisterArguments\n\t\t| [receipt: TransactionArgument, suins: RawTransactionArgument<string>];\n}\n/**\n * Register a domain with the given receipt. This is a hot-potato and can only be\n * consumed in a single transaction.\n */\nexport function register(options: RegisterOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, null, '0x2::clock::Clock'] satisfies (string | null)[];\n\tconst parameterNames = ['receipt', 'suins'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payment',\n\t\t\tfunction: 'register',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface RenewArguments {\n\treceipt: TransactionArgument;\n\tsuins: RawTransactionArgument<string>;\n\tnft: RawTransactionArgument<string>;\n}\nexport interface RenewOptions {\n\tpackage?: string;\n\targuments:\n\t\t| RenewArguments\n\t\t| [\n\t\t\t\treceipt: TransactionArgument,\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tnft: RawTransactionArgument<string>,\n\t\t ];\n}\n/**\n * Renew a domain with the given receipt. This is a hot-potato and can only be\n * consumed in a single transaction.\n */\nexport function renew(options: RenewOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, null, null, '0x2::clock::Clock'] satisfies (string | null)[];\n\tconst parameterNames = ['receipt', 'suins', 'nft'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payment',\n\t\t\tfunction: 'renew',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface RequestDataArguments {\n\tintent: TransactionArgument;\n}\nexport interface RequestDataOptions {\n\tpackage?: string;\n\targuments: RequestDataArguments | [intent: TransactionArgument];\n}\n/** Getters */\nexport function requestData(options: RequestDataOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null] satisfies (string | null)[];\n\tconst parameterNames = ['intent'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payment',\n\t\t\tfunction: 'request_data',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface YearsArguments {\n\tself: TransactionArgument;\n}\nexport interface YearsOptions {\n\tpackage?: string;\n\targuments: YearsArguments | [self: TransactionArgument];\n}\nexport function years(options: YearsOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null] satisfies (string | null)[];\n\tconst parameterNames = ['self'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payment',\n\t\t\tfunction: 'years',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface BaseAmountArguments {\n\tself: TransactionArgument;\n}\nexport interface BaseAmountOptions {\n\tpackage?: string;\n\targuments: BaseAmountArguments | [self: TransactionArgument];\n}\nexport function baseAmount(options: BaseAmountOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null] satisfies (string | null)[];\n\tconst parameterNames = ['self'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payment',\n\t\t\tfunction: 'base_amount',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface DomainArguments {\n\tself: TransactionArgument;\n}\nexport interface DomainOptions {\n\tpackage?: string;\n\targuments: DomainArguments | [self: TransactionArgument];\n}\nexport function domain(options: DomainOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null] satisfies (string | null)[];\n\tconst parameterNames = ['self'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payment',\n\t\t\tfunction: 'domain',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface DiscountAppliedArguments {\n\tself: TransactionArgument;\n}\nexport interface DiscountAppliedOptions {\n\tpackage?: string;\n\targuments: DiscountAppliedArguments | [self: TransactionArgument];\n}\n/** Returns true if at least one discount has been applied to the payment intent. */\nexport function discountApplied(options: DiscountAppliedOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null] satisfies (string | null)[];\n\tconst parameterNames = ['self'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payment',\n\t\t\tfunction: 'discount_applied',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface DiscountsAppliedArguments {\n\tself: TransactionArgument;\n}\nexport interface DiscountsAppliedOptions {\n\tpackage?: string;\n\targuments: DiscountsAppliedArguments | [self: TransactionArgument];\n}\n/** A list of discounts that have been applied to the payment intent. */\nexport function discountsApplied(options: DiscountsAppliedOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null] satisfies (string | null)[];\n\tconst parameterNames = ['self'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payment',\n\t\t\tfunction: 'discounts_applied',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface CalculateTotalAfterDiscountArguments {\n\tdata: TransactionArgument;\n\tdiscount: RawTransactionArgument<number>;\n}\nexport interface CalculateTotalAfterDiscountOptions {\n\tpackage?: string;\n\targuments:\n\t\t| CalculateTotalAfterDiscountArguments\n\t\t| [data: TransactionArgument, discount: RawTransactionArgument<number>];\n}\n/** Public helper to calculate price after a percentage discount has been applied. */\nexport function calculateTotalAfterDiscount(options: CalculateTotalAfterDiscountOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, 'u8'] satisfies (string | null)[];\n\tconst parameterNames = ['data', 'discount'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'payment',\n\t\t\tfunction: 'calculate_total_after_discount',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\nimport {\n\tMoveStruct,\n\tMoveTuple,\n\tnormalizeMoveArguments,\n\ttype RawTransactionArgument,\n} from '../utils/index.js';\nimport { bcs } from '@mysten/sui/bcs';\nimport { type Transaction } from '@mysten/sui/transactions';\nimport * as domain from './domain.js';\nconst $moduleName = '@suins/core::controller';\nexport const SubnamePrunedEvent = new MoveStruct({\n\tname: `${$moduleName}::SubnamePrunedEvent`,\n\tfields: {\n\t\tsubdomain: domain.Domain,\n\t\tparent_domain: domain.Domain,\n\t},\n});\nexport const ControllerV2 = new MoveTuple({\n\tname: `${$moduleName}::ControllerV2`,\n\tfields: [bcs.bool()],\n});\nexport const Controller = new MoveStruct({\n\tname: `${$moduleName}::Controller`,\n\tfields: {\n\t\tdummy_field: bcs.bool(),\n\t},\n});\nexport interface SetTargetAddressArguments {\n\tsuins: RawTransactionArgument<string>;\n\tnft: RawTransactionArgument<string>;\n\tnewTarget: RawTransactionArgument<string | null>;\n}\nexport interface SetTargetAddressOptions {\n\tpackage?: string;\n\targuments:\n\t\t| SetTargetAddressArguments\n\t\t| [\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tnft: RawTransactionArgument<string>,\n\t\t\t\tnewTarget: RawTransactionArgument<string | null>,\n\t\t ];\n}\n/** Set the target address of a domain. */\nexport function setTargetAddress(options: SetTargetAddressOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [\n\t\tnull,\n\t\tnull,\n\t\t'0x1::option::Option<address>',\n\t\t'0x2::clock::Clock',\n\t] satisfies (string | null)[];\n\tconst parameterNames = ['suins', 'nft', 'newTarget'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'controller',\n\t\t\tfunction: 'set_target_address',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface SetReverseLookupArguments {\n\tsuins: RawTransactionArgument<string>;\n\tdomainName: RawTransactionArgument<string>;\n}\nexport interface SetReverseLookupOptions {\n\tpackage?: string;\n\targuments:\n\t\t| SetReverseLookupArguments\n\t\t| [suins: RawTransactionArgument<string>, domainName: RawTransactionArgument<string>];\n}\n/** Set the reverse lookup address for the domain */\nexport function setReverseLookup(options: SetReverseLookupOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, '0x1::string::String'] satisfies (string | null)[];\n\tconst parameterNames = ['suins', 'domainName'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'controller',\n\t\t\tfunction: 'set_reverse_lookup',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface UnsetReverseLookupArguments {\n\tsuins: RawTransactionArgument<string>;\n}\nexport interface UnsetReverseLookupOptions {\n\tpackage?: string;\n\targuments: UnsetReverseLookupArguments | [suins: RawTransactionArgument<string>];\n}\n/** User-facing function - unset the reverse lookup address for the domain. */\nexport function unsetReverseLookup(options: UnsetReverseLookupOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null] satisfies (string | null)[];\n\tconst parameterNames = ['suins'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'controller',\n\t\t\tfunction: 'unset_reverse_lookup',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface SetObjectReverseLookupArguments {\n\tsuins: RawTransactionArgument<string>;\n\tobj: RawTransactionArgument<string>;\n\tdomainName: RawTransactionArgument<string>;\n}\nexport interface SetObjectReverseLookupOptions {\n\tpackage?: string;\n\targuments:\n\t\t| SetObjectReverseLookupArguments\n\t\t| [\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tobj: RawTransactionArgument<string>,\n\t\t\t\tdomainName: RawTransactionArgument<string>,\n\t\t ];\n}\n/**\n * Allows setting the reverse lookup address for an object. Expects a mutable\n * reference of the object.\n */\nexport function setObjectReverseLookup(options: SetObjectReverseLookupOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, '0x2::object::ID', '0x1::string::String'] satisfies (\n\t\t| string\n\t\t| null\n\t)[];\n\tconst parameterNames = ['suins', 'obj', 'domainName'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'controller',\n\t\t\tfunction: 'set_object_reverse_lookup',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface UnsetObjectReverseLookupArguments {\n\tsuins: RawTransactionArgument<string>;\n\tobj: RawTransactionArgument<string>;\n}\nexport interface UnsetObjectReverseLookupOptions {\n\tpackage?: string;\n\targuments:\n\t\t| UnsetObjectReverseLookupArguments\n\t\t| [suins: RawTransactionArgument<string>, obj: RawTransactionArgument<string>];\n}\n/**\n * Allows unsetting the reverse lookup address for an object. Expects a mutable\n * reference of the object.\n */\nexport function unsetObjectReverseLookup(options: UnsetObjectReverseLookupOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, '0x2::object::ID'] satisfies (string | null)[];\n\tconst parameterNames = ['suins', 'obj'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'controller',\n\t\t\tfunction: 'unset_object_reverse_lookup',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface SetUserDataArguments {\n\tsuins: RawTransactionArgument<string>;\n\tnft: RawTransactionArgument<string>;\n\tkey: RawTransactionArgument<string>;\n\tvalue: RawTransactionArgument<string>;\n}\nexport interface SetUserDataOptions {\n\tpackage?: string;\n\targuments:\n\t\t| SetUserDataArguments\n\t\t| [\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tnft: RawTransactionArgument<string>,\n\t\t\t\tkey: RawTransactionArgument<string>,\n\t\t\t\tvalue: RawTransactionArgument<string>,\n\t\t ];\n}\n/** User-facing function - add a new key-value pair to the name record's data. */\nexport function setUserData(options: SetUserDataOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [\n\t\tnull,\n\t\tnull,\n\t\t'0x1::string::String',\n\t\t'0x1::string::String',\n\t\t'0x2::clock::Clock',\n\t] satisfies (string | null)[];\n\tconst parameterNames = ['suins', 'nft', 'key', 'value'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'controller',\n\t\t\tfunction: 'set_user_data',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface UnsetUserDataArguments {\n\tsuins: RawTransactionArgument<string>;\n\tnft: RawTransactionArgument<string>;\n\tkey: RawTransactionArgument<string>;\n}\nexport interface UnsetUserDataOptions {\n\tpackage?: string;\n\targuments:\n\t\t| UnsetUserDataArguments\n\t\t| [\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tnft: RawTransactionArgument<string>,\n\t\t\t\tkey: RawTransactionArgument<string>,\n\t\t ];\n}\n/** User-facing function - remove a key from the name record's data. */\nexport function unsetUserData(options: UnsetUserDataOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, null, '0x1::string::String', '0x2::clock::Clock'] satisfies (\n\t\t| string\n\t\t| null\n\t)[];\n\tconst parameterNames = ['suins', 'nft', 'key'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'controller',\n\t\t\tfunction: 'unset_user_data',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface BurnExpiredArguments {\n\tsuins: RawTransactionArgument<string>;\n\tnft: RawTransactionArgument<string>;\n}\nexport interface BurnExpiredOptions {\n\tpackage?: string;\n\targuments:\n\t\t| BurnExpiredArguments\n\t\t| [suins: RawTransactionArgument<string>, nft: RawTransactionArgument<string>];\n}\nexport function burnExpired(options: BurnExpiredOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, null, '0x2::clock::Clock'] satisfies (string | null)[];\n\tconst parameterNames = ['suins', 'nft'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'controller',\n\t\t\tfunction: 'burn_expired',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface BurnExpiredSubnameArguments {\n\tsuins: RawTransactionArgument<string>;\n\tnft: RawTransactionArgument<string>;\n}\nexport interface BurnExpiredSubnameOptions {\n\tpackage?: string;\n\targuments:\n\t\t| BurnExpiredSubnameArguments\n\t\t| [suins: RawTransactionArgument<string>, nft: RawTransactionArgument<string>];\n}\nexport function burnExpiredSubname(options: BurnExpiredSubnameOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, null, '0x2::clock::Clock'] satisfies (string | null)[];\n\tconst parameterNames = ['suins', 'nft'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'controller',\n\t\t\tfunction: 'burn_expired_subname',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface PruneExpiredSubnameArguments {\n\tsuins: RawTransactionArgument<string>;\n\tparent: RawTransactionArgument<string>;\n\tsubdomainName: RawTransactionArgument<string>;\n}\nexport interface PruneExpiredSubnameOptions {\n\tpackage?: string;\n\targuments:\n\t\t| PruneExpiredSubnameArguments\n\t\t| [\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tparent: RawTransactionArgument<string>,\n\t\t\t\tsubdomainName: RawTransactionArgument<string>,\n\t\t ];\n}\n/**\n * Prunes an expired subdomain record from the registry by name, gated by ownership\n * of the parent. This allows the parent holder to clean up expired subdomain\n * records even when they don't possess the SubDomainRegistration object. After\n * pruning, the subdomain name becomes available for re-registration. The orphaned\n * SubDomainRegistration object (if it still exists) becomes useless.\n *\n * Use this when you control the parent domain but someone else holds the expired\n * subdomain NFT.\n */\nexport function pruneExpiredSubname(options: PruneExpiredSubnameOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [null, null, '0x1::string::String', '0x2::clock::Clock'] satisfies (\n\t\t| string\n\t\t| null\n\t)[];\n\tconst parameterNames = ['suins', 'parent', 'subdomainName'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'controller',\n\t\t\tfunction: 'prune_expired_subname',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface PruneExpiredSubnamesArguments {\n\tsuins: RawTransactionArgument<string>;\n\tparent: RawTransactionArgument<string>;\n\tsubdomainNames: RawTransactionArgument<Array<string>>;\n}\nexport interface PruneExpiredSubnamesOptions {\n\tpackage?: string;\n\targuments:\n\t\t| PruneExpiredSubnamesArguments\n\t\t| [\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tparent: RawTransactionArgument<string>,\n\t\t\t\tsubdomainNames: RawTransactionArgument<Array<string>>,\n\t\t ];\n}\n/**\n * Best-effort pruning of multiple expired subdomain records for a given parent.\n *\n * This function does **not** abort if individual entries are:\n *\n * - not subdomains,\n * - not direct children of the parent,\n * - missing from the registry,\n * - not expired,\n * - leaf records.\n *\n * It prunes what it can, emitting `SubnamePrunedEvent` for each successfully\n * pruned record, and returns the total count of pruned entries.\n */\nexport function pruneExpiredSubnames(options: PruneExpiredSubnamesOptions) {\n\tconst packageAddress = options.package ?? '@suins/core';\n\tconst argumentsTypes = [\n\t\tnull,\n\t\tnull,\n\t\t'vector<0x1::string::String>',\n\t\t'0x2::clock::Clock',\n\t] satisfies (string | null)[];\n\tconst parameterNames = ['suins', 'parent', 'subdomainNames'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'controller',\n\t\t\tfunction: 'prune_expired_subnames',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\n\n/**\n * A bag is a heterogeneous map-like collection. The collection is similar to\n * `sui::table` in that its keys and values are not stored within the `Bag` value,\n * but instead are stored using Sui's object system. The `Bag` struct acts only as\n * a handle into the object system to retrieve those keys and values. Note that\n * this means that `Bag` values with exactly the same key-value mapping will not be\n * equal, with `==`, at runtime. For example\n *\n * ```\n * let bag1 = bag::new();\n * let bag2 = bag::new();\n * bag::add(&mut bag1, 0, false);\n * bag::add(&mut bag1, 1, true);\n * bag::add(&mut bag2, 0, false);\n * bag::add(&mut bag2, 1, true);\n * // bag1 does not equal bag2, despite having the same entries\n * assert!(&bag1 != &bag2);\n * ```\n *\n * At it's core, `sui::bag` is a wrapper around `UID` that allows for access to\n * `sui::dynamic_field` while preventing accidentally stranding field values. A\n * `UID` can be deleted, even if it has dynamic fields associated with it, but a\n * bag, on the other hand, must be empty to be destroyed.\n */\n\nimport { MoveStruct } from '../../../utils/index.js';\nimport { bcs } from '@mysten/sui/bcs';\nconst $moduleName = '0x2::bag';\nexport const Bag = new MoveStruct({\n\tname: `${$moduleName}::Bag`,\n\tfields: {\n\t\t/** the ID of this bag */\n\t\tid: bcs.Address,\n\t\t/** the number of key-value pairs in the bag */\n\t\tsize: bcs.u64(),\n\t},\n});\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\nimport { MoveStruct } from '../utils/index.js';\nimport * as bag from './deps/sui/bag.js';\nconst $moduleName = '@suins/coupons::data';\nexport const Data = new MoveStruct({\n\tname: `${$moduleName}::Data`,\n\tfields: {\n\t\tcoupons: bag.Bag,\n\t},\n});\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\n\n/**\n * A module to support coupons for SuiNS. This module allows secondary modules\n * (e.g. Discord) to add or remove coupons too. This allows for separation of logic\n * & ease of de-authorization in case we don't want some functionality anymore.\n *\n * Coupons are unique string codes, that can be used (based on the business rules)\n * to claim discounts in the app. Each coupon is validated towards a list of rules.\n * View `rules` module for explanation. The app is authorized on `SuiNS` to be able\n * to claim names and add earnings to the registry.\n */\n\nimport { MoveStruct, normalizeMoveArguments, type RawTransactionArgument } from '../utils/index.js';\nimport { bcs, type BcsType } from '@mysten/sui/bcs';\nimport { type Transaction, type TransactionArgument } from '@mysten/sui/transactions';\nimport * as data from './data.js';\nconst $moduleName = '@suins/coupons::coupon_house';\nexport const CouponsApp = new MoveStruct({\n\tname: `${$moduleName}::CouponsApp`,\n\tfields: {\n\t\tdummy_field: bcs.bool(),\n\t},\n});\nexport const AppKey = new MoveStruct({\n\tname: `${$moduleName}::AppKey<phantom A>`,\n\tfields: {\n\t\tdummy_field: bcs.bool(),\n\t},\n});\nexport const CouponHouse = new MoveStruct({\n\tname: `${$moduleName}::CouponHouse`,\n\tfields: {\n\t\tdata: data.Data,\n\t\tversion: bcs.u8(),\n\t\tstorage: bcs.Address,\n\t},\n});\nexport interface SetupArguments {\n\tsuins: RawTransactionArgument<string>;\n\tcap: RawTransactionArgument<string>;\n}\nexport interface SetupOptions {\n\tpackage?: string;\n\targuments:\n\t\t| SetupArguments\n\t\t| [suins: RawTransactionArgument<string>, cap: RawTransactionArgument<string>];\n}\n/** Called once to setup the CouponHouse on SuiNS. */\nexport function setup(options: SetupOptions) {\n\tconst packageAddress = options.package ?? '@suins/coupons';\n\tconst argumentsTypes = [null, null] satisfies (string | null)[];\n\tconst parameterNames = ['suins', 'cap'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'coupon_house',\n\t\t\tfunction: 'setup',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface ApplyCouponArguments {\n\tsuins: RawTransactionArgument<string>;\n\tintent: TransactionArgument;\n\tcouponCode: RawTransactionArgument<string>;\n}\nexport interface ApplyCouponOptions {\n\tpackage?: string;\n\targuments:\n\t\t| ApplyCouponArguments\n\t\t| [\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tintent: TransactionArgument,\n\t\t\t\tcouponCode: RawTransactionArgument<string>,\n\t\t ];\n}\nexport function applyCoupon(options: ApplyCouponOptions) {\n\tconst packageAddress = options.package ?? '@suins/coupons';\n\tconst argumentsTypes = [null, null, '0x1::string::String', '0x2::clock::Clock'] satisfies (\n\t\t| string\n\t\t| null\n\t)[];\n\tconst parameterNames = ['suins', 'intent', 'couponCode'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'coupon_house',\n\t\t\tfunction: 'apply_coupon',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface RegisterWithCouponArguments {\n\tSuins: RawTransactionArgument<string>;\n\tCouponCode: RawTransactionArgument<string>;\n\tDomainName: RawTransactionArgument<string>;\n\tNoYears: RawTransactionArgument<number>;\n\tPayment: RawTransactionArgument<string>;\n}\nexport interface RegisterWithCouponOptions {\n\tpackage?: string;\n\targuments:\n\t\t| RegisterWithCouponArguments\n\t\t| [\n\t\t\t\tSuins: RawTransactionArgument<string>,\n\t\t\t\tCouponCode: RawTransactionArgument<string>,\n\t\t\t\tDomainName: RawTransactionArgument<string>,\n\t\t\t\tNoYears: RawTransactionArgument<number>,\n\t\t\t\tPayment: RawTransactionArgument<string>,\n\t\t ];\n}\nexport function registerWithCoupon(options: RegisterWithCouponOptions) {\n\tconst packageAddress = options.package ?? '@suins/coupons';\n\tconst argumentsTypes = [\n\t\tnull,\n\t\t'0x1::string::String',\n\t\t'0x1::string::String',\n\t\t'u8',\n\t\tnull,\n\t\t'0x2::clock::Clock',\n\t] satisfies (string | null)[];\n\tconst parameterNames = ['Suins', 'CouponCode', 'DomainName', 'NoYears', 'Payment'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'coupon_house',\n\t\t\tfunction: 'register_with_coupon',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface CalculateSalePriceArguments {\n\tSuins: RawTransactionArgument<string>;\n\tPrice: RawTransactionArgument<number | bigint>;\n\tCouponCode: RawTransactionArgument<string>;\n}\nexport interface CalculateSalePriceOptions {\n\tpackage?: string;\n\targuments:\n\t\t| CalculateSalePriceArguments\n\t\t| [\n\t\t\t\tSuins: RawTransactionArgument<string>,\n\t\t\t\tPrice: RawTransactionArgument<number | bigint>,\n\t\t\t\tCouponCode: RawTransactionArgument<string>,\n\t\t ];\n}\nexport function calculateSalePrice(options: CalculateSalePriceOptions) {\n\tconst packageAddress = options.package ?? '@suins/coupons';\n\tconst argumentsTypes = [null, 'u64', '0x1::string::String'] satisfies (string | null)[];\n\tconst parameterNames = ['Suins', 'Price', 'CouponCode'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'coupon_house',\n\t\t\tfunction: 'calculate_sale_price',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface AppDataMutArguments<A extends BcsType<any>> {\n\tsuins: RawTransactionArgument<string>;\n\t_: RawTransactionArgument<A>;\n}\nexport interface AppDataMutOptions<A extends BcsType<any>> {\n\tpackage?: string;\n\targuments:\n\t\t| AppDataMutArguments<A>\n\t\t| [suins: RawTransactionArgument<string>, _: RawTransactionArgument<A>];\n\ttypeArguments: [string];\n}\nexport function appDataMut<A extends BcsType<any>>(options: AppDataMutOptions<A>) {\n\tconst packageAddress = options.package ?? '@suins/coupons';\n\tconst argumentsTypes = [null, `${options.typeArguments[0]}`] satisfies (string | null)[];\n\tconst parameterNames = ['suins', '_'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'coupon_house',\n\t\t\tfunction: 'app_data_mut',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\nexport interface AuthorizeAppArguments {\n\t_: RawTransactionArgument<string>;\n\tsuins: RawTransactionArgument<string>;\n}\nexport interface AuthorizeAppOptions {\n\tpackage?: string;\n\targuments:\n\t\t| AuthorizeAppArguments\n\t\t| [_: RawTransactionArgument<string>, suins: RawTransactionArgument<string>];\n\ttypeArguments: [string];\n}\n/**\n * Authorize an app on the coupon house. This allows to a secondary module to\n * add/remove coupons.\n */\nexport function authorizeApp(options: AuthorizeAppOptions) {\n\tconst packageAddress = options.package ?? '@suins/coupons';\n\tconst argumentsTypes = [null, null] satisfies (string | null)[];\n\tconst parameterNames = ['_', 'suins'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'coupon_house',\n\t\t\tfunction: 'authorize_app',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\nexport interface DeauthorizeAppArguments {\n\t_: RawTransactionArgument<string>;\n\tsuins: RawTransactionArgument<string>;\n}\nexport interface DeauthorizeAppOptions {\n\tpackage?: string;\n\targuments:\n\t\t| DeauthorizeAppArguments\n\t\t| [_: RawTransactionArgument<string>, suins: RawTransactionArgument<string>];\n\ttypeArguments: [string];\n}\n/** De-authorize an app. The app can no longer add or remove */\nexport function deauthorizeApp(options: DeauthorizeAppOptions) {\n\tconst packageAddress = options.package ?? '@suins/coupons';\n\tconst argumentsTypes = [null, null] satisfies (string | null)[];\n\tconst parameterNames = ['_', 'suins'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'coupon_house',\n\t\t\tfunction: 'deauthorize_app',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\nexport interface SetVersionArguments {\n\t_: RawTransactionArgument<string>;\n\tsuins: RawTransactionArgument<string>;\n\tversion: RawTransactionArgument<number>;\n}\nexport interface SetVersionOptions {\n\tpackage?: string;\n\targuments:\n\t\t| SetVersionArguments\n\t\t| [\n\t\t\t\t_: RawTransactionArgument<string>,\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tversion: RawTransactionArgument<number>,\n\t\t ];\n}\n/**\n * An admin helper to set the version of the shared object. Registrations are only\n * possible if the latest version is being used.\n */\nexport function setVersion(options: SetVersionOptions) {\n\tconst packageAddress = options.package ?? '@suins/coupons';\n\tconst argumentsTypes = [null, null, 'u8'] satisfies (string | null)[];\n\tconst parameterNames = ['_', 'suins', 'version'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'coupon_house',\n\t\t\tfunction: 'set_version',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface AssertVersionIsValidArguments {\n\tself: TransactionArgument;\n}\nexport interface AssertVersionIsValidOptions {\n\tpackage?: string;\n\targuments: AssertVersionIsValidArguments | [self: TransactionArgument];\n}\n/** Validate that the version of the app is the latest. */\nexport function assertVersionIsValid(options: AssertVersionIsValidOptions) {\n\tconst packageAddress = options.package ?? '@suins/coupons';\n\tconst argumentsTypes = [null] satisfies (string | null)[];\n\tconst parameterNames = ['self'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'coupon_house',\n\t\t\tfunction: 'assert_version_is_valid',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface AdminAddCouponArguments {\n\t_: RawTransactionArgument<string>;\n\tsuins: RawTransactionArgument<string>;\n\tcode: RawTransactionArgument<string>;\n\tkind: RawTransactionArgument<number>;\n\tamount: RawTransactionArgument<number | bigint>;\n\trules: TransactionArgument;\n}\nexport interface AdminAddCouponOptions {\n\tpackage?: string;\n\targuments:\n\t\t| AdminAddCouponArguments\n\t\t| [\n\t\t\t\t_: RawTransactionArgument<string>,\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tcode: RawTransactionArgument<string>,\n\t\t\t\tkind: RawTransactionArgument<number>,\n\t\t\t\tamount: RawTransactionArgument<number | bigint>,\n\t\t\t\trules: TransactionArgument,\n\t\t ];\n}\n/**\n * To create a coupon, you have to call the PTB in the specific order\n *\n * 1. (Optional) Call rules::new_domain_length_rule(type, length) // generate a\n * length specific rule (e.g. only domains of size 5)\n * 2. Call rules::coupon_rules(...) to create the coupon's ruleset.\n */\nexport function adminAddCoupon(options: AdminAddCouponOptions) {\n\tconst packageAddress = options.package ?? '@suins/coupons';\n\tconst argumentsTypes = [null, null, '0x1::string::String', 'u8', 'u64', null] satisfies (\n\t\t| string\n\t\t| null\n\t)[];\n\tconst parameterNames = ['_', 'suins', 'code', 'kind', 'amount', 'rules'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'coupon_house',\n\t\t\tfunction: 'admin_add_coupon',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface AdminRemoveCouponArguments {\n\t_: RawTransactionArgument<string>;\n\tsuins: RawTransactionArgument<string>;\n\tcode: RawTransactionArgument<string>;\n}\nexport interface AdminRemoveCouponOptions {\n\tpackage?: string;\n\targuments:\n\t\t| AdminRemoveCouponArguments\n\t\t| [\n\t\t\t\t_: RawTransactionArgument<string>,\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tcode: RawTransactionArgument<string>,\n\t\t ];\n}\nexport function adminRemoveCoupon(options: AdminRemoveCouponOptions) {\n\tconst packageAddress = options.package ?? '@suins/coupons';\n\tconst argumentsTypes = [null, null, '0x1::string::String'] satisfies (string | null)[];\n\tconst parameterNames = ['_', 'suins', 'code'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'coupon_house',\n\t\t\tfunction: 'admin_remove_coupon',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface AppAddCouponArguments {\n\tdata: TransactionArgument;\n\tcode: RawTransactionArgument<string>;\n\tkind: RawTransactionArgument<number>;\n\tamount: RawTransactionArgument<number | bigint>;\n\trules: TransactionArgument;\n}\nexport interface AppAddCouponOptions {\n\tpackage?: string;\n\targuments:\n\t\t| AppAddCouponArguments\n\t\t| [\n\t\t\t\tdata: TransactionArgument,\n\t\t\t\tcode: RawTransactionArgument<string>,\n\t\t\t\tkind: RawTransactionArgument<number>,\n\t\t\t\tamount: RawTransactionArgument<number | bigint>,\n\t\t\t\trules: TransactionArgument,\n\t\t ];\n}\nexport function appAddCoupon(options: AppAddCouponOptions) {\n\tconst packageAddress = options.package ?? '@suins/coupons';\n\tconst argumentsTypes = [null, '0x1::string::String', 'u8', 'u64', null] satisfies (\n\t\t| string\n\t\t| null\n\t)[];\n\tconst parameterNames = ['data', 'code', 'kind', 'amount', 'rules'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'coupon_house',\n\t\t\tfunction: 'app_add_coupon',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface AppRemoveCouponArguments {\n\tdata: TransactionArgument;\n\tcode: RawTransactionArgument<string>;\n}\nexport interface AppRemoveCouponOptions {\n\tpackage?: string;\n\targuments:\n\t\t| AppRemoveCouponArguments\n\t\t| [data: TransactionArgument, code: RawTransactionArgument<string>];\n}\nexport function appRemoveCoupon(options: AppRemoveCouponOptions) {\n\tconst packageAddress = options.package ?? '@suins/coupons';\n\tconst argumentsTypes = [null, '0x1::string::String'] satisfies (string | null)[];\n\tconst parameterNames = ['data', 'code'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'coupon_house',\n\t\t\tfunction: 'app_remove_coupon',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\n\n/**\n * A module that allows purchasing names in a different price by presenting a\n * reference of type T. Each `T` can have a separate configuration for a discount\n * percentage. If a `T` doesn't exist, registration will fail.\n *\n * Can be called only when promotions are active for a specific type T. Activation\n * / deactivation happens through PTBs.\n */\n\nimport { MoveTuple, normalizeMoveArguments, type RawTransactionArgument } from '../utils/index.js';\nimport { bcs, type BcsType } from '@mysten/sui/bcs';\nimport { type Transaction, type TransactionArgument } from '@mysten/sui/transactions';\nconst $moduleName = '@suins/discounts::discounts';\nexport const RegularDiscountsApp = new MoveTuple({\n\tname: `${$moduleName}::RegularDiscountsApp`,\n\tfields: [bcs.bool()],\n});\nexport const DiscountKey = new MoveTuple({\n\tname: `${$moduleName}::DiscountKey<phantom T>`,\n\tfields: [bcs.bool()],\n});\nexport interface ApplyPercentageDiscountArguments<T extends BcsType<any>> {\n\tself: RawTransactionArgument<string>;\n\tintent: TransactionArgument;\n\tsuins: RawTransactionArgument<string>;\n\t_: RawTransactionArgument<T>;\n}\nexport interface ApplyPercentageDiscountOptions<T extends BcsType<any>> {\n\tpackage?: string;\n\targuments:\n\t\t| ApplyPercentageDiscountArguments<T>\n\t\t| [\n\t\t\t\tself: RawTransactionArgument<string>,\n\t\t\t\tintent: TransactionArgument,\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\t_: RawTransactionArgument<T>,\n\t\t ];\n\ttypeArguments: [string];\n}\n/** A function to register a name with a discount using type `T`. */\nexport function applyPercentageDiscount<T extends BcsType<any>>(\n\toptions: ApplyPercentageDiscountOptions<T>,\n) {\n\tconst packageAddress = options.package ?? '@suins/discounts';\n\tconst argumentsTypes = [null, null, null, `${options.typeArguments[0]}`] satisfies (\n\t\t| string\n\t\t| null\n\t)[];\n\tconst parameterNames = ['self', 'intent', 'suins', '_'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'discounts',\n\t\t\tfunction: 'apply_percentage_discount',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\nexport interface ApplyDayOneDiscountArguments {\n\tself: RawTransactionArgument<string>;\n\tintent: TransactionArgument;\n\tsuins: RawTransactionArgument<string>;\n\tdayOne: RawTransactionArgument<string>;\n}\nexport interface ApplyDayOneDiscountOptions {\n\tpackage?: string;\n\targuments:\n\t\t| ApplyDayOneDiscountArguments\n\t\t| [\n\t\t\t\tself: RawTransactionArgument<string>,\n\t\t\t\tintent: TransactionArgument,\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tdayOne: RawTransactionArgument<string>,\n\t\t ];\n}\n/**\n * A special function for DayOne registration. We separate it from the normal\n * registration flow because we only want it to be usable for activated DayOnes.\n */\nexport function applyDayOneDiscount(options: ApplyDayOneDiscountOptions) {\n\tconst packageAddress = options.package ?? '@suins/discounts';\n\tconst argumentsTypes = [null, null, null, null] satisfies (string | null)[];\n\tconst parameterNames = ['self', 'intent', 'suins', 'dayOne'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'discounts',\n\t\t\tfunction: 'apply_day_one_discount',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface AuthorizeTypeArguments {\n\tself: RawTransactionArgument<string>;\n\t_: RawTransactionArgument<string>;\n\tpricingConfig: TransactionArgument;\n}\nexport interface AuthorizeTypeOptions {\n\tpackage?: string;\n\targuments:\n\t\t| AuthorizeTypeArguments\n\t\t| [\n\t\t\t\tself: RawTransactionArgument<string>,\n\t\t\t\t_: RawTransactionArgument<string>,\n\t\t\t\tpricingConfig: TransactionArgument,\n\t\t ];\n\ttypeArguments: [string];\n}\n/**\n * An admin action to authorize a type T for special pricing.\n *\n * When authorizing, we reuse the core `PricingConfig` struct, and only accept it\n * if all the values are in the [0, 100] range. make sure that all the percentages\n * are in the [0, 99] range. We can use `free_claims` to giveaway free names.\n */\nexport function authorizeType(options: AuthorizeTypeOptions) {\n\tconst packageAddress = options.package ?? '@suins/discounts';\n\tconst argumentsTypes = [null, null, null] satisfies (string | null)[];\n\tconst parameterNames = ['self', '_', 'pricingConfig'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'discounts',\n\t\t\tfunction: 'authorize_type',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\nexport interface DeauthorizeTypeArguments {\n\t_: RawTransactionArgument<string>;\n\tself: RawTransactionArgument<string>;\n}\nexport interface DeauthorizeTypeOptions {\n\tpackage?: string;\n\targuments:\n\t\t| DeauthorizeTypeArguments\n\t\t| [_: RawTransactionArgument<string>, self: RawTransactionArgument<string>];\n\ttypeArguments: [string];\n}\n/** An admin action to deauthorize type T from getting discounts. */\nexport function deauthorizeType(options: DeauthorizeTypeOptions) {\n\tconst packageAddress = options.package ?? '@suins/discounts';\n\tconst argumentsTypes = [null, null] satisfies (string | null)[];\n\tconst parameterNames = ['_', 'self'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'discounts',\n\t\t\tfunction: 'deauthorize_type',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\nimport { MoveTuple } from '../../../utils/index.js';\nimport { bcs } from '@mysten/sui/bcs';\nconst $moduleName = 'suins::pricing_config';\nexport const Range = new MoveTuple({\n\tname: `${$moduleName}::Range`,\n\tfields: [bcs.u64(), bcs.u64()],\n});\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\n\n/**\n * Similar to `sui::table` but the values are linked together, allowing for ordered\n * insertion and removal\n */\n\nimport { type BcsType, bcs } from '@mysten/sui/bcs';\nimport { MoveStruct } from '../../../utils/index.js';\nconst $moduleName = '0x2::linked_table';\nexport function LinkedTable<K extends BcsType<any>>(...typeParameters: [K]) {\n\treturn new MoveStruct({\n\t\tname: `${$moduleName}::LinkedTable<${typeParameters[0].name as K['name']}, phantom V>`,\n\t\tfields: {\n\t\t\t/** the ID of this table */\n\t\t\tid: bcs.Address,\n\t\t\t/** the number of key-value pairs in the table */\n\t\t\tsize: bcs.u64(),\n\t\t\t/** the front of the table, i.e. the key of the first entry */\n\t\t\thead: bcs.option(typeParameters[0]),\n\t\t\t/** the back of the table, i.e. the key of the last entry */\n\t\t\ttail: bcs.option(typeParameters[0]),\n\t\t},\n\t});\n}\n","/**************************************************************\n * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *\n **************************************************************/\n\n/**\n * A module that allows claiming names of a set length for free by presenting an\n * object T. Each `T` can have a separate configuration for a discount percentage.\n * If a `T` doesn't exist, registration will fail.\n *\n * Can be called only when promotions are active for a specific type T. Activation\n * / deactivation happens through PTBs.\n */\n\nimport {\n\tMoveTuple,\n\tMoveStruct,\n\tnormalizeMoveArguments,\n\ttype RawTransactionArgument,\n} from '../utils/index.js';\nimport { bcs, type BcsType } from '@mysten/sui/bcs';\nimport { type Transaction, type TransactionArgument } from '@mysten/sui/transactions';\nimport * as pricing_config from './deps/suins/pricing_config.js';\nimport * as linked_table from './deps/sui/linked_table.js';\nconst $moduleName = '@suins/discounts::free_claims';\nexport const FreeClaimsApp = new MoveTuple({\n\tname: `${$moduleName}::FreeClaimsApp`,\n\tfields: [bcs.bool()],\n});\nexport const FreeClaimsKey = new MoveTuple({\n\tname: `${$moduleName}::FreeClaimsKey<phantom T>`,\n\tfields: [bcs.bool()],\n});\nexport const FreeClaimsConfig = new MoveStruct({\n\tname: `${$moduleName}::FreeClaimsConfig`,\n\tfields: {\n\t\tdomain_length_range: pricing_config.Range,\n\t\tused_objects: linked_table.LinkedTable(bcs.Address),\n\t},\n});\nexport interface FreeClaimArguments<T extends BcsType<any>> {\n\tself: RawTransactionArgument<string>;\n\tsuins: RawTransactionArgument<string>;\n\tintent: TransactionArgument;\n\tobject: RawTransactionArgument<T>;\n}\nexport interface FreeClaimOptions<T extends BcsType<any>> {\n\tpackage?: string;\n\targuments:\n\t\t| FreeClaimArguments<T>\n\t\t| [\n\t\t\t\tself: RawTransactionArgument<string>,\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tintent: TransactionArgument,\n\t\t\t\tobject: RawTransactionArgument<T>,\n\t\t ];\n\ttypeArguments: [string];\n}\n/** A function to register a name with a discount using type `T`. */\nexport function freeClaim<T extends BcsType<any>>(options: FreeClaimOptions<T>) {\n\tconst packageAddress = options.package ?? '@suins/discounts';\n\tconst argumentsTypes = [null, null, null, `${options.typeArguments[0]}`] satisfies (\n\t\t| string\n\t\t| null\n\t)[];\n\tconst parameterNames = ['self', 'suins', 'intent', 'object'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'free_claims',\n\t\t\tfunction: 'free_claim',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\nexport interface FreeClaimWithDayOneArguments {\n\tself: RawTransactionArgument<string>;\n\tsuins: RawTransactionArgument<string>;\n\tintent: TransactionArgument;\n\tdayOne: RawTransactionArgument<string>;\n}\nexport interface FreeClaimWithDayOneOptions {\n\tpackage?: string;\n\targuments:\n\t\t| FreeClaimWithDayOneArguments\n\t\t| [\n\t\t\t\tself: RawTransactionArgument<string>,\n\t\t\t\tsuins: RawTransactionArgument<string>,\n\t\t\t\tintent: TransactionArgument,\n\t\t\t\tdayOne: RawTransactionArgument<string>,\n\t\t ];\n}\nexport function freeClaimWithDayOne(options: FreeClaimWithDayOneOptions) {\n\tconst packageAddress = options.package ?? '@suins/discounts';\n\tconst argumentsTypes = [null, null, null, null] satisfies (string | null)[];\n\tconst parameterNames = ['self', 'suins', 'intent', 'dayOne'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'free_claims',\n\t\t\tfunction: 'free_claim_with_day_one',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t});\n}\nexport interface AuthorizeTypeArguments {\n\tself: RawTransactionArgument<string>;\n\t_: RawTransactionArgument<string>;\n\tdomainLengthRange: TransactionArgument;\n}\nexport interface AuthorizeTypeOptions {\n\tpackage?: string;\n\targuments:\n\t\t| AuthorizeTypeArguments\n\t\t| [\n\t\t\t\tself: RawTransactionArgument<string>,\n\t\t\t\t_: RawTransactionArgument<string>,\n\t\t\t\tdomainLengthRange: TransactionArgument,\n\t\t ];\n\ttypeArguments: [string];\n}\n/**\n * An admin action to authorize a type T for free claiming of names by presenting\n * an object of type `T`.\n */\nexport function authorizeType(options: AuthorizeTypeOptions) {\n\tconst packageAddress = options.package ?? '@suins/discounts';\n\tconst argumentsTypes = [null, null, null] satisfies (string | null)[];\n\tconst parameterNames = ['self', '_', 'domainLengthRange'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'free_claims',\n\t\t\tfunction: 'authorize_type',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\nexport interface DeauthorizeTypeArguments {\n\tself: RawTransactionArgument<string>;\n\t_: RawTransactionArgument<string>;\n}\nexport interface DeauthorizeTypeOptions {\n\tpackage?: string;\n\targuments:\n\t\t| DeauthorizeTypeArguments\n\t\t| [self: RawTransactionArgument<string>, _: RawTransactionArgument<string>];\n\ttypeArguments: [string];\n}\n/** Force-deauthorize type T from free claims. Drops the linked_table. */\nexport function deauthorizeType(options: DeauthorizeTypeOptions) {\n\tconst packageAddress = options.package ?? '@suins/discounts';\n\tconst argumentsTypes = [null, null] satisfies (string | null)[];\n\tconst parameterNames = ['self', '_'];\n\treturn (tx: Transaction) =>\n\t\ttx.moveCall({\n\t\t\tpackage: packageAddress,\n\t\t\tmodule: 'free_claims',\n\t\t\tfunction: 'deauthorize_type',\n\t\t\targuments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),\n\t\t\ttypeArguments: options.typeArguments,\n\t\t});\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@mysten/sui/bcs';\nimport type {\n\tTransaction,\n\tTransactionObjectArgument,\n\tTransactionObjectInput,\n} from '@mysten/sui/transactions';\nimport { isValidSuiNSName, normalizeSuiNSName, SUI_CLOCK_OBJECT_ID } from '@mysten/sui/utils';\n\nimport { ALLOWED_METADATA, MAX_U64 } from './constants.js';\nimport { isNestedSubName, isSubName, zeroCoin } from './helpers.js';\nimport type { SuinsClient } from './suins-client.js';\nimport type { DiscountInfo, ReceiptParams, RegistrationParams, RenewalParams } from './types.js';\n\nimport * as payment from './contracts/suins/payment.js';\nimport * as controller from './contracts/suins/controller.js';\nimport * as paymentsModule from './contracts/suins_payments/payments.js';\nimport * as couponHouse from './contracts/suins_coupons/coupon_house.js';\nimport * as discounts from './contracts/suins_discounts/discounts.js';\nimport * as freeClaims from './contracts/suins_discounts/free_claims.js';\n\nexport class SuinsTransaction {\n\tsuinsClient: SuinsClient;\n\ttransaction: Transaction;\n\n\tconstructor(client: SuinsClient, transaction: Transaction) {\n\t\tthis.suinsClient = client;\n\t\tthis.transaction = transaction;\n\t}\n\n\t/**\n\t * Registers a domain for a number of years.\n\t */\n\tregister(params: RegistrationParams): TransactionObjectArgument {\n\t\tif (params.couponCode && params.discountInfo) {\n\t\t\tthrow new Error('Cannot apply both coupon and discount NFT');\n\t\t}\n\n\t\tconst paymentIntent = this.initRegistration(params.domain);\n\t\tif (params.couponCode) {\n\t\t\tthis.applyCoupon(paymentIntent, params.couponCode);\n\t\t}\n\t\tif (params.discountInfo) {\n\t\t\tthis.applyDiscount(paymentIntent, params.discountInfo);\n\t\t}\n\t\tconst priceAfterDiscount = this.calculatePriceAfterDiscount(\n\t\t\tpaymentIntent,\n\t\t\tparams.coinConfig.type,\n\t\t);\n\t\tconst receipt = this.generateReceipt({\n\t\t\tpaymentIntent,\n\t\t\tpriceAfterDiscount,\n\t\t\tcoinConfig: params.coinConfig,\n\t\t\tcoin: params.coin,\n\t\t\tmaxAmount: params.maxAmount,\n\t\t\tpriceInfoObjectId: params.priceInfoObjectId,\n\t\t});\n\t\tconst nft = this.finalizeRegister(receipt);\n\n\t\tif (params.years > 1) {\n\t\t\tthis.renew({\n\t\t\t\tnft,\n\t\t\t\tyears: params.years - 1,\n\t\t\t\tcoinConfig: params.coinConfig,\n\t\t\t\tcoin: params.coin,\n\t\t\t\tcouponCode: params.couponCode,\n\t\t\t\tdiscountInfo: params.discountInfo,\n\t\t\t\tmaxAmount: params.maxAmount,\n\t\t\t\tpriceInfoObjectId: params.priceInfoObjectId,\n\t\t\t});\n\t\t}\n\n\t\treturn nft as TransactionObjectArgument;\n\t}\n\n\t/**\n\t * Renews an NFT for a number of years.\n\t */\n\trenew(params: RenewalParams): void {\n\t\tif (params.couponCode && params.discountInfo) {\n\t\t\tthrow new Error('Cannot apply both coupon and discount NFT');\n\t\t}\n\n\t\tconst paymentIntent = this.initRenewal(params.nft, params.years);\n\t\tif (params.couponCode) {\n\t\t\tthis.applyCoupon(paymentIntent, params.couponCode);\n\t\t}\n\t\tif (params.discountInfo) {\n\t\t\tthis.applyDiscount(paymentIntent, params.discountInfo);\n\t\t}\n\t\tconst priceAfterDiscount = this.calculatePriceAfterDiscount(\n\t\t\tpaymentIntent,\n\t\t\tparams.coinConfig.type,\n\t\t);\n\t\tconst receipt = this.generateReceipt({\n\t\t\tpaymentIntent,\n\t\t\tpriceAfterDiscount,\n\t\t\tcoinConfig: params.coinConfig,\n\t\t\tcoin: params.coin,\n\t\t\tmaxAmount: params.maxAmount,\n\t\t\tpriceInfoObjectId: params.priceInfoObjectId,\n\t\t});\n\t\tthis.finalizeRenew(receipt, params.nft);\n\t}\n\n\tinitRegistration(domain: string): TransactionObjectArgument {\n\t\tconst config = this.suinsClient.config;\n\t\treturn this.transaction.add(\n\t\t\tpayment.initRegistration({\n\t\t\t\tpackage: config.packageId,\n\t\t\t\targuments: { suins: config.suins, domain },\n\t\t\t}),\n\t\t);\n\t}\n\n\tinitRenewal(nft: TransactionObjectInput, years: number): TransactionObjectArgument {\n\t\tconst config = this.suinsClient.config;\n\t\treturn this.transaction.add(\n\t\t\tpayment.initRenewal({\n\t\t\t\tpackage: config.packageId,\n\t\t\t\targuments: { suins: config.suins, nft: this.transaction.object(nft), years },\n\t\t\t}),\n\t\t);\n\t}\n\n\tcalculatePrice(\n\t\tbaseAmount: TransactionObjectArgument,\n\t\tpaymentType: string,\n\t\tpriceInfoObjectId: string,\n\t): TransactionObjectArgument {\n\t\tconst config = this.suinsClient.config;\n\t\treturn this.transaction.add(\n\t\t\tpaymentsModule.calculatePrice({\n\t\t\t\tpackage: config.payments.packageId,\n\t\t\t\targuments: {\n\t\t\t\t\tsuins: config.suins,\n\t\t\t\t\tbaseAmount,\n\t\t\t\t\tpriceInfoObject: priceInfoObjectId,\n\t\t\t\t},\n\t\t\t\ttypeArguments: [paymentType],\n\t\t\t}),\n\t\t);\n\t}\n\n\thandleBasePayment(\n\t\tpaymentIntent: TransactionObjectArgument,\n\t\tpaymentArg: TransactionObjectArgument,\n\t\tpaymentType: string,\n\t): TransactionObjectArgument {\n\t\tconst config = this.suinsClient.config;\n\t\treturn this.transaction.add(\n\t\t\tpaymentsModule.handleBasePayment({\n\t\t\t\tpackage: config.payments.packageId,\n\t\t\t\targuments: {\n\t\t\t\t\tsuins: config.suins,\n\t\t\t\t\tbbbVault: config.bbb.vault,\n\t\t\t\t\tintent: paymentIntent,\n\t\t\t\t\tpayment: paymentArg,\n\t\t\t\t},\n\t\t\t\ttypeArguments: [paymentType],\n\t\t\t}),\n\t\t);\n\t}\n\n\thandlePayment(\n\t\tpaymentIntent: TransactionObjectArgument,\n\t\tpaymentArg: TransactionObjectArgument,\n\t\tpaymentType: string,\n\t\tpriceInfoObjectId: string,\n\t\tmaxAmount: bigint = MAX_U64,\n\t): TransactionObjectArgument {\n\t\tconst config = this.suinsClient.config;\n\t\treturn this.transaction.add(\n\t\t\tpaymentsModule.handlePayment({\n\t\t\t\tpackage: config.payments.packageId,\n\t\t\t\targuments: {\n\t\t\t\t\tsuins: config.suins,\n\t\t\t\t\tbbbVault: config.bbb.vault,\n\t\t\t\t\tintent: paymentIntent,\n\t\t\t\t\tpayment: paymentArg,\n\t\t\t\t\tpriceInfoObject: priceInfoObjectId,\n\t\t\t\t\tuserPriceGuard: maxAmount,\n\t\t\t\t},\n\t\t\t\ttypeArguments: [paymentType],\n\t\t\t}),\n\t\t);\n\t}\n\n\tfinalizeRegister(receipt: TransactionObjectArgument): TransactionObjectArgument {\n\t\tconst config = this.suinsClient.config;\n\t\treturn this.transaction.add(\n\t\t\tpayment.register({\n\t\t\t\tpackage: config.packageId,\n\t\t\t\targuments: { receipt, suins: config.suins },\n\t\t\t}),\n\t\t);\n\t}\n\n\tfinalizeRenew(\n\t\treceipt: TransactionObjectArgument,\n\t\tnft: TransactionObjectInput,\n\t): TransactionObjectArgument {\n\t\tconst config = this.suinsClient.config;\n\t\treturn this.transaction.add(\n\t\t\tpayment.renew({\n\t\t\t\tpackage: config.packageId,\n\t\t\t\targuments: { receipt, suins: config.suins, nft: this.transaction.object(nft) },\n\t\t\t}),\n\t\t);\n\t}\n\n\tcalculatePriceAfterDiscount(\n\t\tpaymentIntent: TransactionObjectArgument,\n\t\tpaymentType: string,\n\t): TransactionObjectArgument {\n\t\tconst config = this.suinsClient.config;\n\t\treturn this.transaction.add(\n\t\t\tpaymentsModule.calculatePriceAfterDiscount({\n\t\t\t\tpackage: config.payments.packageId,\n\t\t\t\targuments: { suins: config.suins, intent: paymentIntent },\n\t\t\t\ttypeArguments: [paymentType],\n\t\t\t}),\n\t\t);\n\t}\n\n\tgenerateReceipt(params: ReceiptParams): TransactionObjectArgument {\n\t\tconst baseAssetPurchase = params.coinConfig.feed === '';\n\t\tif (baseAssetPurchase) {\n\t\t\tconst payment = params.coin\n\t\t\t\t? this.transaction.splitCoins(this.transaction.object(params.coin), [\n\t\t\t\t\t\tparams.priceAfterDiscount,\n\t\t\t\t\t])\n\t\t\t\t: zeroCoin(this.transaction, params.coinConfig.type);\n\t\t\tconst receipt = this.handleBasePayment(params.paymentIntent, payment, params.coinConfig.type);\n\t\t\treturn receipt;\n\t\t} else {\n\t\t\tconst priceInfoObjectId = params.priceInfoObjectId;\n\t\t\tif (!priceInfoObjectId)\n\t\t\t\tthrow new Error('Price info object ID is required for non-base asset purchases');\n\t\t\tconst price = this.calculatePrice(\n\t\t\t\tparams.priceAfterDiscount,\n\t\t\t\tparams.coinConfig.type,\n\t\t\t\tpriceInfoObjectId,\n\t\t\t);\n\t\t\tif (!params.coin) throw new Error('coin input is required');\n\t\t\tconst payment = this.transaction.splitCoins(this.transaction.object(params.coin!), [price]);\n\t\t\tconst receipt = this.handlePayment(\n\t\t\t\tparams.paymentIntent,\n\t\t\t\tpayment,\n\t\t\t\tparams.coinConfig.type,\n\t\t\t\tpriceInfoObjectId,\n\t\t\t\tparams.maxAmount,\n\t\t\t);\n\t\t\treturn receipt;\n\t\t}\n\t}\n\n\t/**\n\t * Applies a coupon to the payment intent.\n\t */\n\tapplyCoupon(intent: TransactionObjectArgument, couponCode: string): TransactionObjectArgument {\n\t\tconst config = this.suinsClient.config;\n\t\treturn this.transaction.add(\n\t\t\tcouponHouse.applyCoupon({\n\t\t\t\tpackage: config.coupons.packageId,\n\t\t\t\targuments: { suins: config.suins, intent, couponCode },\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * Applies a discount to the payment intent.\n\t */\n\tapplyDiscount(intent: TransactionObjectArgument, discountInfo: DiscountInfo): void {\n\t\tconst config = this.suinsClient.config;\n\n\t\tif (discountInfo.isFreeClaim) {\n\t\t\tthis.transaction.add(\n\t\t\t\tfreeClaims.freeClaim({\n\t\t\t\t\tpackage: config.discountsPackage.packageId,\n\t\t\t\t\targuments: {\n\t\t\t\t\t\tself: config.discountsPackage.discountHouseId,\n\t\t\t\t\t\tsuins: config.suins,\n\t\t\t\t\t\tintent,\n\t\t\t\t\t\tobject: this.transaction.object(discountInfo.discountNft),\n\t\t\t\t\t},\n\t\t\t\t\ttypeArguments: [discountInfo.type],\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.transaction.add(\n\t\t\t\tdiscounts.applyPercentageDiscount({\n\t\t\t\t\tpackage: config.discountsPackage.packageId,\n\t\t\t\t\targuments: {\n\t\t\t\t\t\tself: config.discountsPackage.discountHouseId,\n\t\t\t\t\t\tintent,\n\t\t\t\t\t\tsuins: config.suins,\n\t\t\t\t\t\t_: this.transaction.object(discountInfo.discountNft),\n\t\t\t\t\t},\n\t\t\t\t\ttypeArguments: [discountInfo.type],\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Creates a subdomain.\n\t */\n\tcreateSubName({\n\t\tparentNft,\n\t\tname,\n\t\texpirationTimestampMs,\n\t\tallowChildCreation,\n\t\tallowTimeExtension,\n\t}: {\n\t\tparentNft: TransactionObjectInput;\n\t\tname: string;\n\t\texpirationTimestampMs: number;\n\t\tallowChildCreation: boolean;\n\t\tallowTimeExtension: boolean;\n\t}) {\n\t\tif (!isValidSuiNSName(name)) throw new Error('Invalid SuiNS name');\n\t\tconst isParentSubdomain = isNestedSubName(name);\n\t\tif (!this.suinsClient.config.suins) throw new Error('SuiNS Object ID not found');\n\t\tif (!this.suinsClient.config.subNamesPackageId)\n\t\t\tthrow new Error('Subnames package ID not found');\n\t\tif (isParentSubdomain && !this.suinsClient.config.tempSubdomainsProxyPackageId)\n\t\t\tthrow new Error('Subnames proxy package ID not found');\n\n\t\tconst subNft = this.transaction.moveCall({\n\t\t\ttarget: isParentSubdomain\n\t\t\t\t? `${this.suinsClient.config.tempSubdomainsProxyPackageId}::subdomain_proxy::new`\n\t\t\t\t: `${this.suinsClient.config.subNamesPackageId}::subdomains::new`,\n\t\t\targuments: [\n\t\t\t\tthis.transaction.object(this.suinsClient.config.suins),\n\t\t\t\tthis.transaction.object(parentNft),\n\t\t\t\tthis.transaction.object(SUI_CLOCK_OBJECT_ID),\n\t\t\t\tthis.transaction.pure.string(normalizeSuiNSName(name, 'dot')),\n\t\t\t\tthis.transaction.pure.u64(expirationTimestampMs),\n\t\t\t\tthis.transaction.pure.bool(!!allowChildCreation),\n\t\t\t\tthis.transaction.pure.bool(!!allowTimeExtension),\n\t\t\t],\n\t\t});\n\n\t\treturn subNft;\n\t}\n\n\t/**\n\t * Builds the PTB to create a leaf subdomain.\n\t * Parent can be a `SuinsRegistration` or a `SubDomainRegistration` object.\n\t * Can be passed in as an ID or a TransactionArgument.\n\t */\n\tcreateLeafSubName({\n\t\tparentNft,\n\t\tname,\n\t\ttargetAddress,\n\t}: {\n\t\tparentNft: TransactionObjectInput;\n\t\tname: string;\n\t\ttargetAddress: string;\n\t}) {\n\t\tif (!isValidSuiNSName(name)) throw new Error('Invalid SuiNS name');\n\t\tconst isParentSubdomain = isNestedSubName(name);\n\t\tif (!this.suinsClient.config.suins) throw new Error('SuiNS Object ID not found');\n\t\tif (!this.suinsClient.config.subNamesPackageId)\n\t\t\tthrow new Error('Subnames package ID not found');\n\t\tif (isParentSubdomain && !this.suinsClient.config.tempSubdomainsProxyPackageId)\n\t\t\tthrow new Error('Subnames proxy package ID not found');\n\n\t\tthis.transaction.moveCall({\n\t\t\ttarget: isParentSubdomain\n\t\t\t\t? `${this.suinsClient.config.tempSubdomainsProxyPackageId}::subdomain_proxy::new_leaf`\n\t\t\t\t: `${this.suinsClient.config.subNamesPackageId}::subdomains::new_leaf`,\n\t\t\targuments: [\n\t\t\t\tthis.transaction.object(this.suinsClient.config.suins),\n\t\t\t\tthis.transaction.object(parentNft),\n\t\t\t\tthis.transaction.object(SUI_CLOCK_OBJECT_ID),\n\t\t\t\tthis.transaction.pure.string(normalizeSuiNSName(name, 'dot')),\n\t\t\t\tthis.transaction.pure.address(targetAddress),\n\t\t\t],\n\t\t});\n\t}\n\n\t/**\n\t * Removes a leaf subname.\n\t */\n\tremoveLeafSubName({ parentNft, name }: { parentNft: TransactionObjectInput; name: string }) {\n\t\tif (!isValidSuiNSName(name)) throw new Error('Invalid SuiNS name');\n\t\tconst isParentSubdomain = isNestedSubName(name);\n\t\tif (!isSubName(name)) throw new Error('This can only be invoked for subnames');\n\t\tif (!this.suinsClient.config.suins) throw new Error('SuiNS Object ID not found');\n\t\tif (!this.suinsClient.config.subNamesPackageId)\n\t\t\tthrow new Error('Subnames package ID not found');\n\t\tif (isParentSubdomain && !this.suinsClient.config.tempSubdomainsProxyPackageId)\n\t\t\tthrow new Error('Subnames proxy package ID not found');\n\n\t\tthis.transaction.moveCall({\n\t\t\ttarget: isParentSubdomain\n\t\t\t\t? `${this.suinsClient.config.tempSubdomainsProxyPackageId}::subdomain_proxy::remove_leaf`\n\t\t\t\t: `${this.suinsClient.config.subNamesPackageId}::subdomains::remove_leaf`,\n\t\t\targuments: [\n\t\t\t\tthis.transaction.object(this.suinsClient.config.suins),\n\t\t\t\tthis.transaction.object(parentNft),\n\t\t\t\tthis.transaction.object(SUI_CLOCK_OBJECT_ID),\n\t\t\t\tthis.transaction.pure.string(normalizeSuiNSName(name, 'dot')),\n\t\t\t],\n\t\t});\n\t}\n\n\t/**\n\t * Sets the target address of an NFT.\n\t */\n\tsetTargetAddress({\n\t\tnft, // Can be string or argument\n\t\taddress,\n\t\tisSubname,\n\t}: {\n\t\tnft: TransactionObjectInput;\n\t\taddress?: string;\n\t\tisSubname?: boolean;\n\t}) {\n\t\tif (isSubname && !this.suinsClient.config.tempSubdomainsProxyPackageId)\n\t\t\tthrow new Error('Subnames proxy package ID not found');\n\n\t\tthis.transaction.moveCall({\n\t\t\ttarget: isSubname\n\t\t\t\t? `${this.suinsClient.config.tempSubdomainsProxyPackageId}::subdomain_proxy::set_target_address`\n\t\t\t\t: `${this.suinsClient.config.packageId}::controller::set_target_address`,\n\t\t\targuments: [\n\t\t\t\tthis.transaction.object(this.suinsClient.config.suins),\n\t\t\t\tthis.transaction.object(nft),\n\t\t\t\tthis.transaction.pure(bcs.option(bcs.Address).serialize(address).toBytes()),\n\t\t\t\tthis.transaction.object(SUI_CLOCK_OBJECT_ID),\n\t\t\t],\n\t\t});\n\t}\n\n\t/**\n\t * Sets a default name for the user.\n\t */\n\tsetDefault(name: string) {\n\t\tif (!isValidSuiNSName(name)) throw new Error('Invalid SuiNS name');\n\t\tif (!this.suinsClient.config.suins) throw new Error('SuiNS Object ID not found');\n\n\t\tthis.transaction.add(\n\t\t\tcontroller.setReverseLookup({\n\t\t\t\tpackage: this.suinsClient.config.packageId,\n\t\t\t\targuments: {\n\t\t\t\t\tsuins: this.suinsClient.config.suins,\n\t\t\t\t\tdomainName: normalizeSuiNSName(name, 'dot'),\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * Edits the setup of a subname.\n\t */\n\teditSetup({\n\t\tparentNft,\n\t\tname,\n\t\tallowChildCreation,\n\t\tallowTimeExtension,\n\t}: {\n\t\tparentNft: TransactionObjectInput;\n\t\tname: string;\n\t\tallowChildCreation: boolean;\n\t\tallowTimeExtension: boolean;\n\t}) {\n\t\tif (!isValidSuiNSName(name)) throw new Error('Invalid SuiNS name');\n\t\tconst isParentSubdomain = isNestedSubName(name);\n\t\tif (!this.suinsClient.config.suins) throw new Error('SuiNS Object ID not found');\n\t\tif (!isParentSubdomain && !this.suinsClient.config.subNamesPackageId)\n\t\t\tthrow new Error('Subnames package ID not found');\n\t\tif (isParentSubdomain && !this.suinsClient.config.tempSubdomainsProxyPackageId)\n\t\t\tthrow new Error('Subnames proxy package ID not found');\n\n\t\tthis.transaction.moveCall({\n\t\t\ttarget: isParentSubdomain\n\t\t\t\t? `${this.suinsClient.config.tempSubdomainsProxyPackageId}::subdomain_proxy::edit_setup`\n\t\t\t\t: `${this.suinsClient.config.subNamesPackageId}::subdomains::edit_setup`,\n\t\t\targuments: [\n\t\t\t\tthis.transaction.object(this.suinsClient.config.suins),\n\t\t\t\tthis.transaction.object(parentNft),\n\t\t\t\tthis.transaction.object(SUI_CLOCK_OBJECT_ID),\n\t\t\t\tthis.transaction.pure.string(normalizeSuiNSName(name, 'dot')),\n\t\t\t\tthis.transaction.pure.bool(!!allowChildCreation),\n\t\t\t\tthis.transaction.pure.bool(!!allowTimeExtension),\n\t\t\t],\n\t\t});\n\t}\n\n\t/**\n\t * Extends the expiration of a subname.\n\t */\n\textendExpiration({\n\t\tnft,\n\t\texpirationTimestampMs,\n\t}: {\n\t\tnft: TransactionObjectInput;\n\t\texpirationTimestampMs: number;\n\t}) {\n\t\tif (!this.suinsClient.config.suins) throw new Error('SuiNS Object ID not found');\n\t\tif (!this.suinsClient.config.subNamesPackageId)\n\t\t\tthrow new Error('Subnames package ID not found');\n\n\t\tthis.transaction.moveCall({\n\t\t\ttarget: `${this.suinsClient.config.subNamesPackageId}::subdomains::extend_expiration`,\n\t\t\targuments: [\n\t\t\t\tthis.transaction.object(this.suinsClient.config.suins),\n\t\t\t\tthis.transaction.object(nft),\n\t\t\t\tthis.transaction.pure.u64(expirationTimestampMs),\n\t\t\t],\n\t\t});\n\t}\n\n\t/**\n\t * Sets the user data of an NFT.\n\t */\n\tsetUserData({\n\t\tnft,\n\t\tvalue,\n\t\tkey,\n\t\tisSubname,\n\t}: {\n\t\tnft: TransactionObjectInput;\n\t\tvalue: string;\n\t\tkey: string;\n\t\tisSubname?: boolean;\n\t}) {\n\t\tif (!this.suinsClient.config.suins) throw new Error('SuiNS Object ID not found');\n\t\tif (isSubname && !this.suinsClient.config.tempSubdomainsProxyPackageId)\n\t\t\tthrow new Error('Subnames proxy package ID not found');\n\n\t\tif (!Object.values(ALLOWED_METADATA).some((x) => x === key)) throw new Error('Invalid key');\n\n\t\tthis.transaction.moveCall({\n\t\t\ttarget: isSubname\n\t\t\t\t? `${this.suinsClient.config.tempSubdomainsProxyPackageId}::subdomain_proxy::set_user_data`\n\t\t\t\t: `${this.suinsClient.config.packageId}::controller::set_user_data`,\n\t\t\targuments: [\n\t\t\t\tthis.transaction.object(this.suinsClient.config.suins),\n\t\t\t\tthis.transaction.object(nft),\n\t\t\t\tthis.transaction.pure.string(key),\n\t\t\t\tthis.transaction.pure.string(value),\n\t\t\t\tthis.transaction.object(SUI_CLOCK_OBJECT_ID),\n\t\t\t],\n\t\t});\n\t}\n\n\t/**\n\t * Burns an expired NFT to collect storage rebates.\n\t */\n\tburnExpired({ nft, isSubname }: { nft: TransactionObjectInput; isSubname?: boolean }) {\n\t\tif (!this.suinsClient.config.suins) throw new Error('SuiNS Object ID not found');\n\n\t\tif (isSubname) {\n\t\t\tthis.transaction.add(\n\t\t\t\tcontroller.burnExpiredSubname({\n\t\t\t\t\tpackage: this.suinsClient.config.packageId,\n\t\t\t\t\targuments: {\n\t\t\t\t\t\tsuins: this.suinsClient.config.suins,\n\t\t\t\t\t\tnft: this.transaction.object(nft),\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.transaction.add(\n\t\t\t\tcontroller.burnExpired({\n\t\t\t\t\tpackage: this.suinsClient.config.packageId,\n\t\t\t\t\targuments: {\n\t\t\t\t\t\tsuins: this.suinsClient.config.suins,\n\t\t\t\t\t\tnft: this.transaction.object(nft),\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n}\n","export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'INVALID_ASSET'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'WITHDRAW_FAILED'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | 'SAFEGUARD_BLOCKED'\n | 'SWAP_NO_ROUTE'\n | 'SWAP_FAILED'\n | 'CHAIN_MODE_INVALID'\n | 'UNKNOWN';\n\nexport interface T2000ErrorData {\n reason?: string;\n [key: string]: unknown;\n}\n\nexport class T2000Error extends Error {\n readonly code: T2000ErrorCode;\n readonly data?: T2000ErrorData;\n readonly retryable: boolean;\n\n constructor(code: T2000ErrorCode, message: string, data?: T2000ErrorData, retryable = false) {\n super(message);\n this.name = 'T2000Error';\n this.code = code;\n this.data = data;\n this.retryable = retryable;\n }\n\n toJSON() {\n return {\n error: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n retryable: this.retryable,\n };\n }\n}\n\nexport function mapWalletError(error: unknown): T2000Error {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes('rejected') || msg.includes('cancelled')) {\n return new T2000Error('TRANSACTION_FAILED', 'Transaction cancelled');\n }\n if (msg.includes('Insufficient') || msg.includes('insufficient')) {\n return new T2000Error('INSUFFICIENT_BALANCE', 'Insufficient balance');\n }\n\n return new T2000Error('UNKNOWN', msg, undefined, true);\n}\n\nexport function mapMoveAbortCode(code: number): string {\n const abortMessages: Record<number, string> = {\n 1: 'Protocol is temporarily paused',\n 2: 'Amount must be greater than zero',\n 3: 'Invalid operation type',\n 4: 'Fee rate exceeds maximum',\n 5: 'Insufficient treasury balance',\n 6: 'Not authorized',\n 7: 'Package version mismatch — upgrade required',\n 8: 'Timelock is active — wait for expiry',\n 9: 'No pending change to execute',\n 10: 'Already at current version',\n // NAVI Protocol abort codes\n 1502: 'Oracle price is stale — try again in a moment',\n 1503: 'Withdrawal amount is invalid (zero or dust) — try a specific amount instead of \"all\"',\n 1600: 'Health factor too low — withdrawal would risk liquidation',\n 1605: 'Asset borrowing is disabled or at capacity on this protocol',\n // NAVI utils abort codes\n 46000: 'Insufficient balance to repay — withdraw some savings first to get cash',\n };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n\n/**\n * Check if an error message contains a MoveAbort — these are on-chain\n * failures that will fail no matter how many times you retry.\n */\nexport function isMoveAbort(msg: string): boolean {\n return msg.includes('MoveAbort') || msg.includes('MovePrimitiveRuntimeError');\n}\n\nexport function parseMoveAbortMessage(msg: string): string {\n const abortMatch = msg.match(/abort code:\\s*(\\d+)/i) ?? msg.match(/MoveAbort[^,]*,\\s*(\\d+)/);\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n\n const moduleMatch = msg.match(/Identifier\\(\"([^\"]+)\"\\)/) ?? msg.match(/in '([^']+)'/);\n const fnMatch = msg.match(/function_name:\\s*Some\\(\"([^\"]+)\"\\)/);\n const context = `${moduleMatch?.[1] ?? ''}${fnMatch ? `::${fnMatch[1]}` : ''}`.toLowerCase();\n const suffix = moduleMatch\n ? ` [${moduleMatch[1]}${fnMatch ? `::${fnMatch[1]}` : ''}]`\n : '';\n\n if (context.includes('slippage')) {\n return `Slippage too high — price moved during execution${suffix}`;\n }\n if (context.includes('balance::split') || context.includes('balance::ENotEnough')) {\n return `Insufficient on-chain balance${suffix}`;\n }\n\n const mapped = mapMoveAbortCode(code);\n return `${mapped}${suffix}`;\n }\n return msg;\n}\n","/**\n * Unified token registry — single source of truth for coin types, decimals, symbols, and tiers.\n *\n * ZERO heavy dependencies. Safe to import from any context (server, browser, Edge).\n *\n * Tier 1: USDC — the financial layer (save, borrow, receive, yield, allowances, marketplace, MPP).\n * Tier 2: 15 curated swap assets — hold, trade, and send only.\n * No tier: Legacy tokens kept for display accuracy (existing NAVI positions). No new operations.\n *\n * To add a new token: add ONE entry to COIN_REGISTRY below. Everything else derives from it.\n * Gate for Tier 2 addition: confirmed deep Cetus liquidity + clear user need.\n */\n\nexport interface CoinMeta {\n type: string;\n decimals: number;\n symbol: string;\n tier?: 1 | 2;\n}\n\n/**\n * Canonical coin registry.\n * Key = user-friendly name (used in swap_execute, CLI, prompts).\n */\nexport const COIN_REGISTRY: Record<string, CoinMeta> = {\n // ── Tier 1 — Financial layer ──────────────────────────────────────────\n USDC: { type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC', decimals: 6, symbol: 'USDC', tier: 1 },\n\n // ── Tier 2 — Swap assets (15 tokens) ──────────────────────────────────\n SUI: { type: '0x2::sui::SUI', decimals: 9, symbol: 'SUI', tier: 2 },\n wBTC: { type: '0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC', decimals: 8, symbol: 'wBTC', tier: 2 },\n ETH: { type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH', decimals: 8, symbol: 'ETH', tier: 2 },\n GOLD: { type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM', decimals: 9, symbol: 'GOLD', tier: 2 },\n DEEP: { type: '0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP', decimals: 6, symbol: 'DEEP', tier: 2 },\n WAL: { type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL', decimals: 9, symbol: 'WAL', tier: 2 },\n NS: { type: '0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS', decimals: 6, symbol: 'NS', tier: 2 },\n IKA: { type: '0x7262fb2f7a3a14c888c438a3cd9b912469a58cf60f367352c46584262e8299aa::ika::IKA', decimals: 9, symbol: 'IKA', tier: 2 },\n CETUS: { type: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS', decimals: 9, symbol: 'CETUS', tier: 2 },\n NAVX: { type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX', decimals: 9, symbol: 'NAVX', tier: 2 },\n vSUI: { type: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT', decimals: 9, symbol: 'vSUI', tier: 2 },\n haSUI: { type: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI', decimals: 9, symbol: 'haSUI', tier: 2 },\n afSUI: { type: '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc::afsui::AFSUI', decimals: 9, symbol: 'afSUI', tier: 2 },\n LOFI: { type: '0xf22da9a24ad027cccb5f2d496cbe91de953d363513db08a3a734d361c7c17503::LOFI::LOFI', decimals: 9, symbol: 'LOFI', tier: 2 },\n MANIFEST: { type: '0xc466c28d87b3d5cd34f3d5c088751532d71a38d93a8aae4551dd56272cfb4355::manifest::MANIFEST', decimals: 9, symbol: 'MANIFEST', tier: 2 },\n\n // ── Legacy — no tier, kept for display accuracy on existing positions ──\n USDT: { type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT', decimals: 6, symbol: 'USDT' },\n USDe: { type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE', decimals: 6, symbol: 'USDe' },\n USDSUI: { type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI', decimals: 6, symbol: 'USDsui' },\n};\n\n/** Reverse lookup: coin type → CoinMeta. Built once at import time. */\nconst BY_TYPE = new Map<string, CoinMeta>();\nfor (const meta of Object.values(COIN_REGISTRY)) {\n BY_TYPE.set(meta.type, meta);\n}\n\n// ── Lookup helpers ───────────────────────────────────────────────────────\n\n/**\n * Returns the registry metadata for a coin type, or `undefined` if the coin\n * is not in the registry. Use this when you need to distinguish \"known coin\"\n * from \"supported coin\" — `isSupported` only flags tiered (active) coins,\n * but legacy coins like USDsui / USDe / USDT are in the registry without a\n * tier and still need canonical-symbol resolution.\n */\nexport function getCoinMeta(coinType: string): CoinMeta | undefined {\n return BY_TYPE.get(coinType);\n}\n\n/**\n * Returns true if the coin type appears anywhere in COIN_REGISTRY (tier 1, 2,\n * OR legacy/no-tier). Different from `isSupported`, which excludes legacy\n * entries. The blockvision-prices canonical-symbol gate uses this looser\n * check so that USDsui (legacy/no-tier today, but with a registry-canonical\n * mixed-case symbol) still wins over BlockVision's uppercase 'USDSUI'.\n */\nexport function isInRegistry(coinType: string): boolean {\n return BY_TYPE.has(coinType);\n}\n\n// ── Tier helpers ─────────────────────────────────────────────────────────\n\n/** Returns true if the coin type is Tier 1 (USDC — the financial layer). */\nexport function isTier1(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier === 1;\n}\n\n/** Returns true if the coin type is Tier 2 (curated swap asset). */\nexport function isTier2(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier === 2;\n}\n\n/** Returns true if the coin type is actively supported (Tier 1 or Tier 2). */\nexport function isSupported(coinType: string): boolean {\n const meta = BY_TYPE.get(coinType);\n return meta?.tier !== undefined;\n}\n\n/** Returns the tier for a coin type, or undefined if legacy/unknown. */\nexport function getTier(coinType: string): 1 | 2 | undefined {\n return BY_TYPE.get(coinType)?.tier;\n}\n\n// ── Lookup helpers ───────────────────────────────────────────────────────\n\n/**\n * Get decimals for any coin type. Checks full type match, then suffix match, then defaults to 9.\n * Works for both tiered and legacy tokens.\n */\nexport function getDecimalsForCoinType(coinType: string): number {\n const direct = BY_TYPE.get(coinType);\n if (direct) return direct.decimals;\n\n const suffix = coinType.split('::').slice(1).join('::').toUpperCase();\n if (suffix) {\n for (const meta of BY_TYPE.values()) {\n const metaSuffix = meta.type.split('::').slice(1).join('::').toUpperCase();\n if (metaSuffix === suffix) return meta.decimals;\n }\n }\n\n return 9;\n}\n\n/**\n * Resolve a full coin type to a user-friendly symbol.\n * Returns the last `::` segment if not in the registry.\n */\nexport function resolveSymbol(coinType: string): string {\n const direct = BY_TYPE.get(coinType);\n if (direct) return direct.symbol;\n\n const suffix = coinType.split('::').slice(1).join('::').toUpperCase();\n if (suffix) {\n for (const meta of BY_TYPE.values()) {\n const metaSuffix = meta.type.split('::').slice(1).join('::').toUpperCase();\n if (metaSuffix === suffix) return meta.symbol;\n }\n }\n\n return coinType.split('::').pop() ?? coinType;\n}\n\n/**\n * Name → type map for swap resolution. Derived from COIN_REGISTRY.\n * Contains BOTH original-case and UPPERCASE keys for case-insensitive lookup.\n */\nexport const TOKEN_MAP: Record<string, string> = (() => {\n const map: Record<string, string> = {};\n for (const [name, meta] of Object.entries(COIN_REGISTRY)) {\n map[name] = meta.type;\n map[name.toUpperCase()] = meta.type;\n }\n return map;\n})();\n\n/**\n * Resolve a user-friendly token name to its full coin type.\n * Returns the input unchanged if already a full coin type (contains \"::\").\n * Case-insensitive: 'usde', 'USDe', 'USDE' all resolve correctly.\n */\nexport function resolveTokenType(nameOrType: string): string | null {\n if (nameOrType.includes('::')) return nameOrType;\n return TOKEN_MAP[nameOrType] ?? TOKEN_MAP[nameOrType.toUpperCase()] ?? null;\n}\n\n/** Common type constants for direct import. */\nexport const SUI_TYPE = COIN_REGISTRY.SUI.type;\nexport const USDC_TYPE = COIN_REGISTRY.USDC.type;\nexport const USDT_TYPE = COIN_REGISTRY.USDT.type;\nexport const USDSUI_TYPE = COIN_REGISTRY.USDSUI.type;\nexport const USDE_TYPE = COIN_REGISTRY.USDe.type;\nexport const ETH_TYPE = COIN_REGISTRY.ETH.type;\nexport const WBTC_TYPE = COIN_REGISTRY.wBTC.type;\nexport const WAL_TYPE = COIN_REGISTRY.WAL.type;\nexport const NAVX_TYPE = COIN_REGISTRY.NAVX.type;\nexport const IKA_TYPE = COIN_REGISTRY.IKA.type;\nexport const LOFI_TYPE = COIN_REGISTRY.LOFI.type;\nexport const MANIFEST_TYPE = COIN_REGISTRY.MANIFEST.type;\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match words composed of alphanumeric characters. */\nvar reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/** Used to match Latin Unicode letters (excluding mathematical operators). */\nvar reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20f0',\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\",\n rsAstral = '[' + rsAstralRange + ']',\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar rsLowerMisc = '(?:' + rsLower + '|' + rsMisc + ')',\n rsUpperMisc = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptLowerContr = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptUpperContr = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match apostrophes. */\nvar reApos = RegExp(rsApos, 'g');\n\n/**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\nvar reComboMark = RegExp(rsCombo, 'g');\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/** Used to match complex or compound words. */\nvar reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptLowerContr + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsUpperMisc + '+' + rsOptUpperContr + '(?=' + [rsBreak, rsUpper + rsLowerMisc, '$'].join('|') + ')',\n rsUpper + '?' + rsLowerMisc + '+' + rsOptLowerContr,\n rsUpper + '+' + rsOptUpperContr,\n rsDigits,\n rsEmoji\n].join('|'), 'g');\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');\n\n/** Used to detect strings that need a more robust regexp to match words. */\nvar reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n/** Used to map Latin Unicode letters to basic Latin letters. */\nvar deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n '\\u0134': 'J', '\\u0135': 'j',\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n '\\u0174': 'W', '\\u0175': 'w',\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\n '\\u0132': 'IJ', '\\u0133': 'ij',\n '\\u0152': 'Oe', '\\u0153': 'oe',\n '\\u0149': \"'n\", '\\u017f': 'ss'\n};\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array ? array.length : 0;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\n/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\n/**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction asciiWords(string) {\n return string.match(reAsciiWord) || [];\n}\n\n/**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\nvar deburrLetter = basePropertyOf(deburredLetters);\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\n/**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\nfunction hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n}\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\n/**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n}\n\n/**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\nfunction createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\nvar camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n});\n\n/**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\nfunction capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n}\n\n/**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\nfunction deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n}\n\n/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\nvar upperFirst = createCaseFirst('toUpperCase');\n\n/**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\nfunction words(string, pattern, guard) {\n string = toString(string);\n pattern = guard ? undefined : pattern;\n\n if (pattern === undefined) {\n return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n }\n return string.match(pattern) || [];\n}\n\nmodule.exports = camelCase;\n","/**\n * VOLO vSUI liquid staking — thin transaction builders.\n * No SDK dependency. Two Move calls, immutable contract addresses.\n */\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { SUI_TYPE } from '../token-registry.js';\n\nexport const VOLO_PKG = '0x68d22cf8bdbcd11ecba1e094922873e4080d4d11133e2443fddda0bfd11dae20';\nexport const VOLO_POOL = '0x2d914e23d82fedef1b5f56a32d5c64bdcc3087ccfea2b4d6ea51a71f587840e5';\nexport const VOLO_METADATA = '0x680cd26af32b2bde8d3361e804c53ec1d1cfe24c7f039eb7f549e8dfde389a60';\nexport const VSUI_TYPE = '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT';\nexport const SUI_SYSTEM_STATE = '0x05';\nexport const MIN_STAKE_MIST = 1_000_000_000n; // 1 SUI\n\nconst VOLO_STATS_URL = 'https://open-api.naviprotocol.io/api/volo/stats';\n\nexport interface VoloStats {\n apy: number;\n exchangeRate: number;\n tvl: number;\n}\n\n/**\n * Fetch VOLO vSUI staking stats (APY, exchange rate, TVL).\n */\nexport async function getVoloStats(): Promise<VoloStats> {\n const res = await fetch(VOLO_STATS_URL, {\n signal: AbortSignal.timeout(8_000),\n });\n\n if (!res.ok) {\n throw new Error(`VOLO stats API error: HTTP ${res.status}`);\n }\n\n const data = await res.json() as {\n apy?: number;\n exchange_rate?: number;\n exchangeRate?: number;\n tvl?: number;\n data?: { apy?: number; exchange_rate?: number; exchangeRate?: number; tvl?: number };\n };\n\n const d = data.data ?? data;\n\n return {\n apy: d.apy ?? 0,\n exchangeRate: d.exchange_rate ?? d.exchangeRate ?? 1,\n tvl: d.tvl ?? 0,\n };\n}\n\n/**\n * Build a PTB to stake SUI for vSUI.\n */\nexport async function buildStakeVSuiTx(\n _client: SuiJsonRpcClient,\n address: string,\n amountMist: bigint,\n): Promise<Transaction> {\n if (amountMist < MIN_STAKE_MIST) {\n throw new Error(`Minimum stake is 1 SUI (${MIN_STAKE_MIST} MIST). Got: ${amountMist}`);\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const [suiCoin] = tx.splitCoins(tx.gas, [amountMist]);\n\n const [vSuiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::stake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n suiCoin,\n ],\n });\n\n tx.transferObjects([vSuiCoin], address);\n return tx;\n}\n\n/**\n * Build a PTB to unstake vSUI back to SUI.\n */\nexport async function buildUnstakeVSuiTx(\n client: SuiJsonRpcClient,\n address: string,\n amountMist: bigint | 'all',\n): Promise<Transaction> {\n const coins = await fetchCoinsByType(client, address, VSUI_TYPE);\n if (coins.length === 0) {\n throw new Error('No vSUI found in wallet.');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n\n let vSuiCoin: TransactionObjectArgument;\n if (amountMist === 'all') {\n vSuiCoin = primary;\n } else {\n [vSuiCoin] = tx.splitCoins(primary, [amountMist]);\n }\n\n const [suiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::unstake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n vSuiCoin,\n ],\n });\n\n tx.transferObjects([suiCoin], address);\n return tx;\n}\n\n/**\n * SPEC 7 § \"Layer 1\" Volo stake appender. Two modes.\n *\n * Wallet mode (`inputCoin` omitted): fetches SUI coins from the\n * sender's wallet (paginated), merges/splits to `amountMist`. Mirrors\n * the audric host's `transactions/prepare/route.ts:524-545` volo-stake\n * branch — sponsored-flow safe (does NOT consume `tx.gas`, which\n * belongs to the Enoki sponsor in sponsored flows).\n *\n * For non-sponsored flows where the caller owns `tx.gas`, prefer\n * `buildStakeVSuiTx` directly (it splits from gas, which is more\n * efficient by avoiding the extra getCoins RTT).\n *\n * Chain mode (`inputCoin` provided): consumes the passed-in SUI coin\n * ref entirely. Used for chained flows like \"swap USDC → SUI → stake\".\n * The caller is responsible for splitting upstream if they only want\n * part of the input coin staked.\n *\n * @returns\n * - `coin`: vSUI output coin ref, ready for downstream consumption or\n * wallet transfer (`tx.transferObjects`).\n * - `effectiveAmountMist`: SUI mist consumed (echoes `input.amountMist`\n * in both modes; chain-mode trusts the caller-supplied value since\n * the actual coin balance is opaque).\n */\nexport async function addStakeVSuiToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n input: {\n amountMist: bigint;\n inputCoin?: TransactionObjectArgument;\n },\n): Promise<{ coin: TransactionObjectArgument; effectiveAmountMist: bigint }> {\n if (input.amountMist < MIN_STAKE_MIST) {\n throw new Error(`Minimum stake is 1 SUI (${MIN_STAKE_MIST} MIST). Got: ${input.amountMist}`);\n }\n\n let suiCoin: TransactionObjectArgument;\n\n if (input.inputCoin) {\n suiCoin = input.inputCoin;\n } else {\n const coins = await fetchCoinsByType(client, address, SUI_TYPE);\n if (coins.length === 0) {\n throw new Error('No SUI coins found in wallet');\n }\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n if (totalBalance < input.amountMist) {\n throw new Error(`Insufficient SUI: need ${input.amountMist} MIST, have ${totalBalance}`);\n }\n\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n [suiCoin] = tx.splitCoins(primary, [input.amountMist]);\n }\n\n const [vSuiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::stake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n suiCoin,\n ],\n });\n\n return { coin: vSuiCoin, effectiveAmountMist: input.amountMist };\n}\n\n/**\n * SPEC 7 § \"Layer 1\" Volo unstake appender. Two modes.\n *\n * Wallet mode (`inputCoin` omitted): fetches vSUI coins from the\n * sender's wallet (paginated), merges to a primary coin, splits to\n * `amountMist` (or consumes the entire merged primary if `'all'`).\n *\n * Chain mode (`inputCoin` provided): consumes the passed-in vSUI coin\n * ref. With `amountMist = 'all'`, the entire input coin is unstaked.\n * With a bigint `amountMist`, the input coin is split internally and\n * only that portion unstaked (the leftover stays accessible via the\n * original ref). Used for chained flows where vSUI was just produced\n * by a prior step.\n *\n * @returns\n * - `coin`: SUI output coin ref, ready for downstream consumption\n * (e.g. `addSendToTx`, `addStakeVSuiToTx` re-stake) or wallet\n * transfer (`tx.transferObjects`).\n * - `effectiveAmountMist`: input vSUI mist consumed; echoes\n * `input.amountMist` (`'all'` is preserved as-is — the actual SUI\n * received differs from input vSUI by the pool exchange rate, so\n * callers needing the SUI amount must query `getVoloStats` or\n * parse balance changes from the executed tx).\n */\nexport async function addUnstakeVSuiToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n input: {\n amountMist: bigint | 'all';\n inputCoin?: TransactionObjectArgument;\n },\n): Promise<{ coin: TransactionObjectArgument; effectiveAmountMist: bigint | 'all' }> {\n let vSuiCoin: TransactionObjectArgument;\n\n if (input.inputCoin) {\n if (input.amountMist === 'all') {\n vSuiCoin = input.inputCoin;\n } else {\n [vSuiCoin] = tx.splitCoins(input.inputCoin, [input.amountMist]);\n }\n } else {\n const coins = await fetchCoinsByType(client, address, VSUI_TYPE);\n if (coins.length === 0) {\n throw new Error('No vSUI found in wallet.');\n }\n\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n\n if (input.amountMist === 'all') {\n vSuiCoin = primary;\n } else {\n [vSuiCoin] = tx.splitCoins(primary, [input.amountMist]);\n }\n }\n\n const [suiCoin] = tx.moveCall({\n target: `${VOLO_PKG}::stake_pool::unstake`,\n arguments: [\n tx.object(VOLO_POOL),\n tx.object(VOLO_METADATA),\n tx.object(SUI_SYSTEM_STATE),\n vSuiCoin,\n ],\n });\n\n return { coin: suiCoin, effectiveAmountMist: input.amountMist };\n}\n\n/**\n * Paginated coin lookup by coin type. Local helper shared between\n * `buildUnstakeVSuiTx` (fetches vSUI), `addStakeVSuiToTx` (fetches\n * SUI), and `addUnstakeVSuiToTx` (fetches vSUI). P2.2c may extract\n * a shared `wallet/coinSelection.ts` once `addSendFromWalletToTx` and\n * the registry adapter need the same prelude.\n */\nasync function fetchCoinsByType(\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await client.getCoins({\n owner,\n coinType,\n cursor: cursor ?? undefined,\n });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return all;\n}\n","/**\n * Wallet-side coin selection helpers — shared paginated coin lookup +\n * merge + split prelude used by every wallet-mode appender that needs\n * a `TransactionObjectArgument` reference to a specific amount of a\n * given coin type.\n *\n * Replaces three earlier inline implementations:\n * - `cetus-swap.ts:fetchAllCoinsForSwap` (deleted 2026-05-02 — addSwapToTx\n * now calls `selectAndSplitCoin` directly so the merge cache is shared\n * across every appender in a multi-write bundle)\n * - `volo.ts:fetchCoinsByType` (kept for backwards-compat, delegates\n * here)\n * - audric host's `transactions/prepare/route.ts:fetchCoinsForSwap`\n * (P2.2c retires this when migrating to `composeTx`)\n *\n * Single source of truth for the \"fetch coins of type X owned by\n * address Y, paginated\" pattern. P2.2b extracts this so `composeTx`'s\n * registry adapters can build a wallet-mode `TransactionObjectArgument`\n * uniformly across save / send / repay / etc. The 2026-05-02 P2.7 fix\n * adds a per-PTB merge cache so multi-write bundles that touch the same\n * coin type twice (swap+save, save+send, etc.) only emit `mergeCoins`\n * once — see `ptbMergeCache` JSDoc below.\n */\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { T2000Error } from '../errors.js';\n\nexport interface CoinPage {\n ids: string[];\n totalBalance: bigint;\n}\n\n/**\n * Per-PTB merge cache. Keyed by `(sender|coinType)`, stores the primary\n * coin reference + remaining unconsumed balance.\n *\n * **Why this exists.** Pre-2026-05-02 every appender call re-fetched the\n * sender's coins of `coinType` and re-emitted `mergeCoins(primary,\n * [secondaries])`. That works in a single-write PTB. In a multi-write\n * bundle that touches the same coin type twice (e.g. swap+save+send all\n * spending USDC), the second `mergeCoins` references `Input(secondary)`\n * slots that the FIRST `mergeCoins` already consumed — Enoki's dry-run\n * rejects with `CommandArgumentError { kind: ArgumentWithoutValue }`.\n *\n * The cache makes the first call for `(sender, coinType)` do the full\n * fetch + merge + split, and subsequent calls split from the cached\n * primary directly. No re-fetch, no re-merge, no double-consume.\n *\n * Lives on the `Transaction` instance via a WeakMap so it auto-clears\n * once the PTB is built and the Transaction is GC'd.\n */\nconst ptbMergeCache = new WeakMap<\n Transaction,\n Map<string, { primary: TransactionObjectArgument; remaining: bigint }>\n>();\n\nfunction getMergeCache(tx: Transaction) {\n let cache = ptbMergeCache.get(tx);\n if (!cache) {\n cache = new Map();\n ptbMergeCache.set(tx, cache);\n }\n return cache;\n}\n\n/**\n * Paginated coin lookup. Fetches every coin object of `coinType` owned\n * by `owner` (walks the cursor until `hasNextPage === false`). Returns\n * the list of object IDs + summed balance.\n *\n * Replaces inline `client.getCoins` calls that miss coins on the second\n * page when wallets accumulate many small coin objects (the bug class\n * that bit `buildSendTx` pre-P2.2 — captured for SPEC 12).\n */\nexport async function fetchAllCoins(\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n): Promise<CoinPage> {\n const ids: string[] = [];\n let totalBalance = 0n;\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await client.getCoins({ owner, coinType, cursor: cursor ?? undefined });\n for (const c of page.data) {\n ids.push(c.coinObjectId);\n totalBalance += BigInt(c.balance);\n }\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return { ids, totalBalance };\n}\n\nexport interface SelectAndSplitResult {\n /** TransactionObjectArgument for a coin holding `effectiveAmount` raw units. */\n coin: TransactionObjectArgument;\n /** Actual raw amount the returned coin holds. May be < requested if `swapAll` is true. */\n effectiveAmount: bigint;\n /** True iff the request consumed the entire wallet balance (no split needed). */\n swapAll: boolean;\n}\n\n/**\n * Wallet-mode coin selection prelude. Fetches every coin of `coinType`\n * owned by `owner`, merges them into a primary, and splits off the\n * requested `amount` (or returns the merged primary directly if the\n * request meets/exceeds the total balance — `swapAll` semantics).\n *\n * Throws `T2000Error` (`INSUFFICIENT_BALANCE`) when:\n * - No coins of `coinType` exist for `owner`\n * - `amount` is bigger than the total balance AND the caller did NOT\n * opt into `swapAll: true` clipping\n *\n * Used by:\n * - `composeTx` registry adapters (save_deposit, send_transfer,\n * repay_debt — non-SUI assets) for the wallet-mode prelude\n * - Layer 1 dual-mode appenders (`addSwapToTx`, `addStakeVSuiToTx`,\n * `addUnstakeVSuiToTx`) when `inputCoin` is omitted\n *\n * @param tx — PTB to append `mergeCoins` + `splitCoins` commands to.\n * @param client — Sui RPC client for the paginated `getCoins` lookup.\n * @param owner — wallet address whose coins to fetch.\n * @param coinType — fully-qualified Sui coin type\n * (`\"0x...::usdc::USDC\"`).\n * @param amount — raw amount to split out (in MIST / smallest unit).\n * Pass `'all'` to consume the entire merged primary directly.\n * @param options.allowSwapAll — if true (default), `amount` >=\n * totalBalance auto-clips to total (matches audric host's swap\n * branch). If false, throws `INSUFFICIENT_BALANCE` when over.\n *\n * @returns\n * - `coin` — `TransactionObjectArgument` ready for downstream\n * consumption (e.g. `addSaveToTx`, `tx.transferObjects`).\n * - `effectiveAmount` — the raw amount the returned coin actually\n * holds (handles swapAll clipping).\n * - `swapAll` — true iff the entire merged primary was consumed.\n */\nexport async function selectAndSplitCoin(\n tx: Transaction,\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n amount: bigint | 'all',\n options: { allowSwapAll?: boolean } = {},\n): Promise<SelectAndSplitResult> {\n const cache = getMergeCache(tx);\n const cacheKey = `${owner}|${coinType}`;\n const cached = cache.get(cacheKey);\n\n // Fast path — second+ call for this (sender, coinType) inside the same PTB.\n // First call already merged all on-chain coin objects into a single primary\n // and stashed it in the cache; we just split off another chunk here. No RPC\n // re-fetch, no re-emitted MergeCoins (which would reference already-consumed\n // input slots and trip Enoki's dry-run with ArgumentWithoutValue — the\n // P2.7 multi-write bundle bug).\n if (cached) {\n const allowSwapAll = options.allowSwapAll ?? true;\n if (amount !== 'all' && amount > cached.remaining && !allowSwapAll) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient balance for ${coinType}`, {\n available: cached.remaining.toString(),\n required: amount.toString(),\n });\n }\n const requested = amount === 'all' ? cached.remaining : amount;\n const swapAll = amount === 'all' || requested >= cached.remaining;\n const effectiveAmount = swapAll ? cached.remaining : requested;\n\n // `swapAll` from a cached primary means \"consume the whole remainder\" —\n // callers that pass 'all' (or oversize amount with allowSwapAll) get the\n // primary itself, leaving the cache slot drained for any future caller.\n const coin = swapAll ? cached.primary : tx.splitCoins(cached.primary, [effectiveAmount])[0];\n cached.remaining = swapAll ? 0n : cached.remaining - effectiveAmount;\n return { coin, effectiveAmount, swapAll };\n }\n\n // Slow path — first call for this (sender, coinType).\n const { ids, totalBalance } = await fetchAllCoins(client, owner, coinType);\n if (ids.length === 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `No coins found for ${coinType}`);\n }\n\n const allowSwapAll = options.allowSwapAll ?? true;\n\n if (amount !== 'all' && amount > totalBalance && !allowSwapAll) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient balance for ${coinType}`, {\n available: totalBalance.toString(),\n required: amount.toString(),\n });\n }\n\n const requested = amount === 'all' ? totalBalance : amount;\n const swapAll = amount === 'all' || requested >= totalBalance;\n const effectiveAmount = swapAll ? totalBalance : requested;\n\n const primary = tx.object(ids[0]);\n if (ids.length > 1) {\n tx.mergeCoins(primary, ids.slice(1).map((id) => tx.object(id)));\n }\n\n const coin = swapAll ? primary : tx.splitCoins(primary, [effectiveAmount])[0];\n\n // Cache the primary + remaining balance for any subsequent caller in the\n // same PTB. If the first caller drained everything (`swapAll`), remaining\n // is 0 and the next caller will hit INSUFFICIENT_BALANCE — which is\n // correct: the primary has no value left to split.\n cache.set(cacheKey, {\n primary,\n remaining: swapAll ? 0n : totalBalance - effectiveAmount,\n });\n\n return { coin, effectiveAmount, swapAll };\n}\n\n/**\n * SUI-specific coin selection. Branches on sponsorship context:\n *\n * - **Sponsored (`sponsoredContext: true`)** — fetches SUI coins via\n * `getCoins` and merges/splits, because `tx.gas` belongs to the\n * Enoki sponsor (NOT the user) under sponsored flows. Same shape as\n * `selectAndSplitCoin` for any other coin type.\n *\n * - **Self-funded (`sponsoredContext: false`)** — splits from `tx.gas`\n * directly (the user's gas coin IS their SUI). More efficient — no\n * getCoins RTT.\n *\n * Captures the SUI-vs-other-asset divergence that lives inline in\n * `buildSendTx` today (`tx.splitCoins(tx.gas, ...)` vs paginated\n * lookup). composeTx's `send_transfer` adapter routes through this\n * helper to handle both.\n */\nexport async function selectSuiCoin(\n tx: Transaction,\n client: SuiJsonRpcClient,\n owner: string,\n amountMist: bigint,\n sponsoredContext: boolean,\n): Promise<SelectAndSplitResult> {\n if (sponsoredContext) {\n const { SUI_TYPE } = await import('../token-registry.js');\n return selectAndSplitCoin(tx, client, owner, SUI_TYPE, amountMist);\n }\n\n const [coin] = tx.splitCoins(tx.gas, [amountMist]);\n return { coin, effectiveAmount: amountMist, swapAll: false };\n}\n","/**\n * Cetus Aggregator V3 SDK wrapper — the ONLY file that imports @cetusprotocol/aggregator-sdk.\n * Documented CLAUDE.md exception: multi-DEX routing cannot be feasibly replaced by thin tx builders.\n *\n * [B5 v2 / @t2000/sdk@1.1.0 / 2026-04-30]\n * Overlay fee config is now per-call instead of a module-level singleton. CLI / direct\n * SDK callers (`T2000.swap()`) DON'T pass `overlayFee` → fee-free swap. Audric's\n * prepare/route.ts ALWAYS passes `overlayFee = { rate: OVERLAY_FEE_RATE, receiver:\n * T2000_OVERLAY_FEE_WALLET }` → fee charged. Structural inclusion (Audric's code can't\n * forget to pass it because it IS the code), not a toggle that defaults to safe.\n *\n * Pre-1.1.0: a module-level `OVERLAY_FEE_RECEIVER` constant defaulted to a Move object\n * ID. USDC sent there became OwnedObjects keyed to the object and was inaccessible.\n * Fixed by making the receiver a regular wallet address (T2000_OVERLAY_FEE_WALLET) AND\n * by removing the singleton pattern that hid the misconfig.\n */\nimport { AggregatorClient, Env, type FindRouterParams, type RouterDataV3 } from '@cetusprotocol/aggregator-sdk';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { resolveTokenType, getDecimalsForCoinType } from '../token-registry.js';\n\nexport interface OverlayFeeConfig {\n /** Fee rate as a fraction (e.g. 0.001 = 0.1%). Pass 0 to disable. */\n rate: number;\n /** Wallet address that receives the overlay fee. */\n receiver: string;\n}\n\nexport interface SwapRouteResult {\n routerData: RouterDataV3;\n amountIn: string;\n amountOut: string;\n byAmountIn: boolean;\n priceImpact: number;\n insufficientLiquidity: boolean;\n}\n\n/**\n * Default Audric swap overlay fee — 0.1%. Exported for consumers that want to use\n * the canonical Audric rate (the Audric prepare-route does this). Changing this\n * rate requires a coordinated SDK + audric release.\n */\nexport const OVERLAY_FEE_RATE = 0.001;\n\n/**\n * Cache `AggregatorClient` instances by `(signer + overlay rate + overlay receiver)`.\n * Per-call instantiation is cheap (the client is mostly config), but caching avoids\n * pointless re-allocation when the same caller swaps multiple times in a loop.\n */\nconst clientCache = new Map<string, AggregatorClient>();\n\nfunction getClient(walletAddress: string, overlayFee?: OverlayFeeConfig): AggregatorClient {\n const rate = overlayFee?.rate ?? 0;\n const receiver = overlayFee?.receiver ?? '';\n const key = `${walletAddress}|${rate}|${receiver}`;\n\n const cached = clientCache.get(key);\n if (cached) return cached;\n\n const client = new AggregatorClient({\n signer: walletAddress,\n env: Env.Mainnet,\n ...(rate > 0 && receiver\n ? { overlayFeeRate: rate, overlayFeeReceiver: receiver }\n : {}),\n });\n clientCache.set(key, client);\n return client;\n}\n\n/**\n * Find the optimal swap route via Cetus Aggregator REST API.\n *\n * Pass `overlayFee` to charge an overlay fee on the output (Audric's pattern).\n * Omit it for a fee-free swap (CLI / direct SDK pattern).\n */\nexport async function findSwapRoute(params: {\n walletAddress: string;\n from: string;\n to: string;\n amount: bigint;\n byAmountIn: boolean;\n overlayFee?: OverlayFeeConfig;\n /**\n * Optional Cetus provider allow-list. When omitted, all 30+ DEXes\n * are eligible. Sponsored flows (Enoki) MUST pass an exclusion list\n * computed via `getProvidersExcluding([...])` from the Cetus SDK to\n * remove Pyth-dependent providers (HAEDALPMM, METASTABLE, OBRIC,\n * STEAMM_OMM, STEAMM_OMM_V2, SEVENK, HAEDALHMMV2) — those reference\n * `tx.gas` for oracle fees, which Enoki rejects in sponsored txs.\n * Non-sponsored callers (CLI, direct SDK) leave this undefined.\n */\n providers?: string[];\n}): Promise<SwapRouteResult | null> {\n const client = getClient(params.walletAddress, params.overlayFee);\n\n const findParams: FindRouterParams = {\n from: params.from,\n target: params.to,\n amount: params.amount.toString(),\n byAmountIn: params.byAmountIn,\n ...(params.providers ? { providers: params.providers } : {}),\n };\n\n const routerData = await client.findRouters(findParams);\n if (!routerData) return null;\n\n if (routerData.insufficientLiquidity) {\n return {\n routerData,\n amountIn: routerData.amountIn.toString(),\n amountOut: routerData.amountOut.toString(),\n byAmountIn: params.byAmountIn,\n priceImpact: normalizePriceImpact(routerData.deviationRatio),\n insufficientLiquidity: true,\n };\n }\n\n if (routerData.error) {\n const { T2000Error } = await import('../errors.js');\n throw new T2000Error('SWAP_FAILED', `Cetus routing error: ${routerData.error.msg} (code ${routerData.error.code})`);\n }\n\n return {\n routerData,\n amountIn: routerData.amountIn.toString(),\n amountOut: routerData.amountOut.toString(),\n byAmountIn: params.byAmountIn,\n priceImpact: normalizePriceImpact(routerData.deviationRatio),\n insufficientLiquidity: false,\n };\n}\n\n/**\n * Cetus' aggregator types `deviationRatio` as `number`, but in some routes\n * the router actually returns a string (\"0.001234\"). The SDK type lies, so we\n * always coerce to a finite number here (NaN/null/undefined → 0). Without\n * this every downstream consumer that calls `priceImpact.toFixed(...)` will\n * crash at runtime — including the Audric SwapQuoteCard, which takes the\n * whole chat UI down through its error boundary.\n */\nfunction normalizePriceImpact(value: unknown): number {\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : 0;\n}\n\n/**\n * Build a swap PTB from a route result. The caller must provide an input coin\n * obtained by splitting/merging wallet coins.\n *\n * **Important:** Cetus's `routerSwap` reads the overlay-fee config from the\n * AggregatorClient instance. The `overlayFee` param here MUST match the one\n * passed to `findSwapRoute` for the same swap (otherwise you'll hit the cache\n * boundary and get a different client with different overlay config).\n */\nexport async function buildSwapTx(params: {\n walletAddress: string;\n route: SwapRouteResult;\n tx: Transaction;\n inputCoin: TransactionObjectArgument;\n slippage: number;\n overlayFee?: OverlayFeeConfig;\n}): Promise<TransactionObjectArgument> {\n const client = getClient(params.walletAddress, params.overlayFee);\n const clampedSlippage = Math.max(0.001, Math.min(params.slippage, 0.05));\n\n const outputCoin = await client.routerSwap({\n router: params.route.routerData,\n inputCoin: params.inputCoin,\n slippage: clampedSlippage,\n txb: params.tx,\n });\n\n return outputCoin;\n}\n\n/**\n * Append a swap fragment to an existing PTB. SPEC 7 § \"Layer 1\" Cetus\n * appender. Two modes, dispatched by the presence of `input.inputCoin`:\n *\n * - **Wallet mode** (`inputCoin` omitted) — fetches `from`-asset coins\n * from the sender's wallet (paginated), merges/splits to the\n * requested amount, runs the swap. Mirrors the audric host's\n * `transactions/prepare/route.ts` swap branch (P2.2c will retire that\n * branch in favor of this appender via `composeTx`).\n *\n * - **Chain mode** (`inputCoin` provided) — consumes the passed-in coin\n * reference (typically produced by an upstream appender like\n * `addWithdrawToTx`) directly, no wallet fetch / no merge / no\n * split. This is the SPEC 7 multi-write enabler (\"withdraw → swap →\n * save\" without intermediate wallet materialization).\n *\n * **SUI in wallet mode:** uses `client.getCoins` like every other\n * token. This works for sponsored flows (Enoki — `tx.gas` belongs to\n * the sponsor, swap input comes from the user's separate SUI coin\n * objects). For non-sponsored flows where `tx.gas` IS the user's SUI,\n * the caller should pre-build the inputCoin via\n * `tx.splitCoins(tx.gas, [rawAmount])[0]` and pass it via chain mode\n * instead. (`T2000.swap()` already handles this internally — direct SDK\n * users go through the high-level class, not through this appender.)\n *\n * **`swapAll` semantics (wallet mode):** if the requested raw amount\n * is >= the wallet's total `from` balance, the appender consumes the\n * entire merged primary coin (not a split), matching audric's host\n * route's `swapAll` clipping. The returned `effectiveAmountIn` reflects\n * the actual consumed amount in display units.\n *\n * **Slippage:** clamped to [0.001, 0.05] (0.1% – 5%). Defaults to 0.01.\n *\n * @returns\n * - `coin` — output coin reference, ready for downstream consumption\n * (e.g. `addSaveToTx`) or wallet transfer (`tx.transferObjects`).\n * - `effectiveAmountIn` — display-units input amount the swap actually\n * consumes (handles `swapAll` clipping in wallet mode; in chain mode\n * echoes the requested `input.amount`).\n * - `expectedAmountOut` — display-units output amount per the route\n * quote. Actual on-chain output may differ within slippage.\n * - `route` — raw `SwapRouteResult` for downstream telemetry / logging.\n */\nexport async function addSwapToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n input: {\n from: string;\n to: string;\n amount: number;\n slippage?: number;\n byAmountIn?: boolean;\n overlayFee?: OverlayFeeConfig;\n inputCoin?: TransactionObjectArgument;\n /**\n * Optional Cetus provider allow-list. Forwarded to `findSwapRoute`.\n * Sponsored flows (Enoki) MUST pass `getProvidersExcluding([...])`\n * to remove Pyth-dependent providers — see `findSwapRoute`'s JSDoc\n * for the exclusion list. Non-sponsored callers omit this.\n */\n providers?: string[];\n },\n): Promise<{\n coin: TransactionObjectArgument;\n effectiveAmountIn: number;\n expectedAmountOut: number;\n route: SwapRouteResult;\n}> {\n const { T2000Error } = await import('../errors.js');\n\n const fromType = resolveTokenType(input.from);\n const toType = resolveTokenType(input.to);\n if (!fromType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${input.from}. Provide the symbol (USDC, SUI, ...) or full coin type.`);\n if (!toType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${input.to}. Provide the symbol (USDC, SUI, ...) or full coin type.`);\n if (fromType === toType) throw new T2000Error('SWAP_FAILED', 'Cannot swap a token to itself');\n if (!Number.isFinite(input.amount) || input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n }\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const toDecimals = getDecimalsForCoinType(toType);\n const requestedRaw = BigInt(Math.floor(input.amount * 10 ** fromDecimals));\n\n const slippage = Math.max(0.001, Math.min(input.slippage ?? 0.01, 0.05));\n const byAmountIn = input.byAmountIn ?? true;\n\n let inputCoin: TransactionObjectArgument;\n let effectiveRaw: bigint;\n\n if (input.inputCoin) {\n inputCoin = input.inputCoin;\n effectiveRaw = requestedRaw;\n } else {\n // Delegate to the canonical wallet-mode prelude. Critically, this path\n // shares a per-PTB merge cache with every other appender via\n // `selectAndSplitCoin` — when a multi-write bundle includes\n // `swap_execute` alongside `save_deposit`/`send_transfer` of the same\n // input asset (e.g. swap+save+send all from USDC), the second/third\n // appender hits the cache and splits from the already-merged primary\n // instead of re-emitting `mergeCoins` on consumed input slots. That's\n // the P2.7 multi-write bundle fix landed 2026-05-02.\n const { selectAndSplitCoin } = await import('../wallet/coinSelection.js');\n const result = await selectAndSplitCoin(tx, client, address, fromType, requestedRaw);\n inputCoin = result.coin;\n effectiveRaw = result.effectiveAmount;\n }\n\n const route = await findSwapRoute({\n walletAddress: address,\n from: fromType,\n to: toType,\n amount: effectiveRaw,\n byAmountIn,\n overlayFee: input.overlayFee,\n providers: input.providers,\n });\n\n if (!route) {\n throw new T2000Error('SWAP_NO_ROUTE', `No swap route found for ${input.from} → ${input.to}`);\n }\n if (route.insufficientLiquidity) {\n throw new T2000Error('SWAP_NO_ROUTE', `Insufficient liquidity for ${input.from} → ${input.to}`);\n }\n\n const outputCoin = await buildSwapTx({\n walletAddress: address,\n route,\n tx,\n inputCoin,\n slippage,\n overlayFee: input.overlayFee,\n });\n\n return {\n coin: outputCoin,\n effectiveAmountIn: Number(effectiveRaw) / 10 ** fromDecimals,\n expectedAmountOut: Number(route.amountOut) / 10 ** toDecimals,\n route,\n };\n}\n\n/**\n * Simulate a swap transaction without executing it.\n */\nexport async function simulateSwap(params: {\n walletAddress: string;\n tx: Transaction;\n overlayFee?: OverlayFeeConfig;\n}): Promise<{ success: boolean; error?: string }> {\n const client = getClient(params.walletAddress, params.overlayFee);\n try {\n await client.devInspectTransactionBlock(params.tx);\n return { success: true };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n}\n\n// Re-export from the canonical token registry for backward-compat.\nexport { TOKEN_MAP, resolveTokenType } from '../token-registry.js';\n","import { T2000Error } from './errors.js';\n\nexport const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n displayName: 'USDC',\n },\n USDT: {\n type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT',\n decimals: 6,\n symbol: 'USDT',\n displayName: 'suiUSDT',\n },\n USDe: {\n type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE',\n decimals: 6,\n symbol: 'USDe',\n displayName: 'suiUSDe',\n },\n USDsui: {\n type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI',\n decimals: 6,\n symbol: 'USDsui',\n displayName: 'USDsui',\n },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n displayName: 'SUI',\n },\n WAL: {\n type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL',\n decimals: 9,\n symbol: 'WAL',\n displayName: 'WAL',\n },\n ETH: {\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n decimals: 8,\n symbol: 'ETH',\n displayName: 'suiETH',\n },\n NAVX: {\n type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX',\n decimals: 9,\n symbol: 'NAVX',\n displayName: 'NAVX',\n },\n GOLD: {\n type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM',\n decimals: 6,\n symbol: 'GOLD',\n displayName: 'XAUM',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\nexport type StableAsset = 'USDC';\nexport const STABLE_ASSETS: readonly StableAsset[] = ['USDC'] as const;\nexport const ALL_NAVI_ASSETS: readonly SupportedAsset[] = Object.keys(SUPPORTED_ASSETS) as SupportedAsset[];\n\n// ---------------------------------------------------------------------------\n// Operation → allowed asset rules (single source of truth)\n// ---------------------------------------------------------------------------\n\n// [v0.51.0] Saveable/borrowable set: USDC + USDsui.\n// USDC is the canonical default; USDsui is a strategic exception backed by an\n// existing NAVI pool. See `.cursor/rules/savings-usdc-only.mdc` for the\n// rationale and the rule that gates additional stables (don't add more here\n// without updating that file).\nexport const OPERATION_ASSETS = {\n save: ['USDC', 'USDsui'],\n borrow: ['USDC', 'USDsui'],\n withdraw: '*',\n repay: '*',\n send: '*',\n swap: '*',\n} as const;\n\nexport type Operation = keyof typeof OPERATION_ASSETS;\n\nexport function isAllowedAsset(op: Operation, asset: string): boolean {\n const allowed = OPERATION_ASSETS[op];\n if (allowed === '*') return true;\n // [v0.51.0] Mixed-case canonical keys (USDsui, suiUSDT) need case-insensitive\n // membership. Pre-v0.51 we only had USDC ↔ USDC (uppercase identity), so\n // a one-sided uppercase compare looked correct. Now that USDsui is in the\n // set, normalize both sides.\n const target = asset.toLowerCase();\n return (allowed as readonly string[]).some((a) => a.toLowerCase() === target);\n}\n\n/**\n * Throws if the asset is not permitted for the given operation.\n * Passing `undefined` (omitted) is always valid — defaults to USDC.\n */\nexport function assertAllowedAsset(op: Operation, asset: string | undefined): void {\n if (!asset) return;\n if (!isAllowedAsset(op, asset)) {\n const allowed = OPERATION_ASSETS[op];\n const list = Array.isArray(allowed) ? allowed.join(', ') : 'any';\n throw new T2000Error(\n 'INVALID_ASSET',\n `${op} only supports ${list}. Cannot use ${asset}.${op === 'save' ? ' Swap to USDC or USDsui first.' : ''}`,\n );\n }\n}\n\n// All protocol fees route here as a regular USDC wallet transfer. Audric's\n// prepare/route.ts adds `addFeeTransfer(...)` inline for save/borrow and passes\n// `overlayFee.receiver = T2000_OVERLAY_FEE_WALLET` for swaps. The CLI/SDK never\n// charge fees — this constant is exported for consumer apps only.\n//\n// Address corresponds to the treasury admin wallet. Override via env for local dev /\n// testnet only — production must use the canonical mainnet address below.\nexport const T2000_OVERLAY_FEE_WALLET = process.env.T2000_OVERLAY_FEE_WALLET\n ?? '0x5366efbf2b4fe5767fe2e78eb197aa5f5d138d88ac3333fbf3f80a1927da473a';\n\nexport const DEFAULT_NETWORK = 'mainnet' as const;\nexport const DEFAULT_RPC_URL = 'https://fullnode.mainnet.sui.io:443';\nexport const DEFAULT_KEY_PATH = '~/.t2000/wallet.key';\nexport const DEFAULT_CONFIG_PATH = '~/.t2000/config.json';\n\nexport const API_BASE_URL = process.env.T2000_API_URL ?? 'https://api.t2000.ai';\n\n// Cetus USDC/SUI pool — read-only for SUI price oracle (no SDK dependency)\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\n\nexport const GAS_RESERVE_MIN = 0.05; // minimum SUI to keep for gas\n","import { SuiJsonRpcClient, getJsonRpcFullnodeUrl } from '@mysten/sui/jsonRpc';\nimport { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { DEFAULT_RPC_URL } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nlet cachedClient: SuiJsonRpcClient | null = null;\n\nexport function getSuiClient(rpcUrl?: string): SuiJsonRpcClient {\n const url = rpcUrl ?? DEFAULT_RPC_URL;\n if (cachedClient) return cachedClient;\n cachedClient = new SuiJsonRpcClient({ url, network: 'mainnet' });\n return cachedClient;\n}\n\nexport function createSuiClient(network: 'mainnet' | 'testnet' = 'mainnet'): SuiJsonRpcClient {\n return new SuiJsonRpcClient({ url: getJsonRpcFullnodeUrl(network), network });\n}\n\nexport function validateAddress(address: string): string {\n const normalized = normalizeSuiAddress(address);\n if (!isValidSuiAddress(normalized)) {\n throw new T2000Error('INVALID_ADDRESS', `Invalid Sui address: ${address}`);\n }\n return normalized;\n}\n\nexport function truncateAddress(address: string): string {\n if (address.length <= 10) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n/**\n * Normalize a Sui coin type to its canonical long-form 64-hex address.\n * `0x2::sui::SUI` → `0x0000…0002::sui::SUI`. Idempotent on already-long\n * forms. Returns the input unchanged if it doesn't look like a coin type\n * (`<address>::<module>::<name>`) so callers can pass arbitrary strings\n * without crashing.\n *\n * Why this exists: BlockVision's `/v2/sui/coin/price/list` endpoint\n * silently returns an empty `prices` map for short-form coin types\n * (notably `0x2::sui::SUI` — the native gas coin). Internal callers must\n * pass the long form, but external callers (LLM tool args, cached\n * coin-type strings, audit logs) commonly use the short form. Normalize\n * before the network call, denormalize back to the caller's input shape\n * after, and short/long become interchangeable.\n */\nexport function normalizeCoinType(coinType: string): string {\n const parts = coinType.split('::');\n if (parts.length !== 3) return coinType;\n const [addr, mod, name] = parts;\n if (!addr.startsWith('0x')) return coinType;\n return `${normalizeSuiAddress(addr)}::${mod}::${name}`;\n}\n","import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { decodeSuiPrivateKey } from '@mysten/sui/cryptography';\nimport { randomBytes, createCipheriv, createDecipheriv, scryptSync } from 'node:crypto';\nimport { readFile, writeFile, mkdir, access } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000Error } from '../errors.js';\nimport { DEFAULT_KEY_PATH } from '../constants.js';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst SCRYPT_N = 2 ** 14; // 16384 — secure and fast enough\nconst SCRYPT_R = 8;\nconst SCRYPT_P = 1;\nconst SALT_LENGTH = 32;\nconst IV_LENGTH = 16;\n\ninterface EncryptedKey {\n version: 1;\n algorithm: typeof ALGORITHM;\n salt: string;\n iv: string;\n tag: string;\n ciphertext: string;\n}\n\nfunction expandPath(p: string): string {\n if (p.startsWith('~')) return resolve(homedir(), p.slice(2));\n return resolve(p);\n}\n\nfunction deriveKey(passphrase: string, salt: Buffer): Buffer {\n return scryptSync(passphrase, salt, 32, { N: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P });\n}\n\nfunction encrypt(data: Buffer, passphrase: string): EncryptedKey {\n const salt = randomBytes(SALT_LENGTH);\n const key = deriveKey(passphrase, salt);\n const iv = randomBytes(IV_LENGTH);\n\n const cipher = createCipheriv(ALGORITHM, key, iv);\n const ciphertext = Buffer.concat([cipher.update(data), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n return {\n version: 1,\n algorithm: ALGORITHM,\n salt: salt.toString('hex'),\n iv: iv.toString('hex'),\n tag: tag.toString('hex'),\n ciphertext: ciphertext.toString('hex'),\n };\n}\n\nfunction decrypt(encrypted: EncryptedKey, passphrase: string): Buffer {\n const salt = Buffer.from(encrypted.salt, 'hex');\n const key = deriveKey(passphrase, salt);\n const iv = Buffer.from(encrypted.iv, 'hex');\n const tag = Buffer.from(encrypted.tag, 'hex');\n const ciphertext = Buffer.from(encrypted.ciphertext, 'hex');\n\n const decipher = createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(tag);\n\n try {\n return Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n } catch {\n throw new T2000Error('WALLET_LOCKED', 'Invalid PIN');\n }\n}\n\nexport function generateKeypair(): Ed25519Keypair {\n return Ed25519Keypair.generate();\n}\n\nexport function keypairFromPrivateKey(privateKey: string): Ed25519Keypair {\n if (privateKey.startsWith('suiprivkey')) {\n const decoded = decodeSuiPrivateKey(privateKey);\n return Ed25519Keypair.fromSecretKey(decoded.secretKey);\n }\n const bytes = Buffer.from(privateKey.replace(/^0x/, ''), 'hex');\n return Ed25519Keypair.fromSecretKey(bytes);\n}\n\nexport async function saveKey(\n keypair: Ed25519Keypair,\n passphrase: string,\n keyPath?: string,\n): Promise<string> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n\n try {\n await access(filePath);\n throw new T2000Error('WALLET_EXISTS', `Wallet already exists at ${filePath}`);\n } catch (error) {\n if (error instanceof T2000Error) throw error;\n }\n\n await mkdir(dirname(filePath), { recursive: true });\n\n const bech32Key = keypair.getSecretKey();\n const encrypted = encrypt(Buffer.from(bech32Key, 'utf-8'), passphrase);\n\n await writeFile(filePath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n\n return filePath;\n}\n\nexport async function loadKey(passphrase: string, keyPath?: string): Promise<Ed25519Keypair> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n throw new T2000Error('WALLET_NOT_FOUND', `No wallet found at ${filePath}`);\n }\n\n const encrypted: EncryptedKey = JSON.parse(content);\n const decrypted = decrypt(encrypted, passphrase);\n const bech32Key = decrypted.toString('utf-8');\n const decoded = decodeSuiPrivateKey(bech32Key);\n\n return Ed25519Keypair.fromSecretKey(decoded.secretKey);\n}\n\nexport async function walletExists(keyPath?: string): Promise<boolean> {\n const filePath = expandPath(keyPath ?? DEFAULT_KEY_PATH);\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function exportPrivateKey(keypair: Ed25519Keypair): string {\n return keypair.getSecretKey();\n}\n\nexport function getAddress(keypair: Ed25519Keypair): string {\n return keypair.getPublicKey().toSuiAddress();\n}\n","import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport class KeypairSigner implements TransactionSigner {\n constructor(private readonly keypair: Ed25519Keypair) {}\n\n getAddress(): string {\n return this.keypair.getPublicKey().toSuiAddress();\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n return this.keypair.signTransaction(txBytes);\n }\n\n /** Access the underlying keypair for APIs that still require it directly. */\n getKeypair(): Ed25519Keypair {\n return this.keypair;\n }\n}\n","import type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { TransactionSigner } from '../signer.js';\n\nexport interface ZkLoginProof {\n proofPoints: {\n a: string[];\n b: string[][];\n c: string[];\n };\n issBase64Details: {\n indexMod4: number;\n value: string;\n };\n headerBase64: string;\n addressSeed: string;\n}\n\nexport class ZkLoginSigner implements TransactionSigner {\n constructor(\n private readonly ephemeralKeypair: Ed25519Keypair,\n private readonly zkProof: ZkLoginProof,\n private readonly userAddress: string,\n private readonly maxEpoch: number,\n ) {}\n\n getAddress(): string {\n return this.userAddress;\n }\n\n async signTransaction(txBytes: Uint8Array): Promise<{ signature: string }> {\n const { getZkLoginSignature } = await import('@mysten/zklogin');\n const ephSig = await this.ephemeralKeypair.signTransaction(txBytes);\n return {\n signature: getZkLoginSignature({\n inputs: this.zkProof,\n maxEpoch: this.maxEpoch,\n userSignature: ephSig.signature,\n }),\n };\n }\n\n isExpired(currentEpoch: number): boolean {\n return currentEpoch >= this.maxEpoch;\n }\n}\n","import { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, type SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { validateAddress } from '../utils/sui.js';\nimport { displayToRaw } from '../utils/format.js';\n\nexport async function buildSendTx({\n client,\n address,\n to,\n amount,\n asset = 'USDC',\n}: { client: SuiJsonRpcClient; address: string; to: string; amount: number; asset?: SupportedAsset }): Promise<Transaction> {\n const recipient = validateAddress(to);\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n if (!assetInfo) throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n if (amount <= 0) throw new T2000Error('INVALID_AMOUNT', 'Amount must be greater than zero');\n\n const rawAmount = displayToRaw(amount, assetInfo.decimals);\n const tx = new Transaction();\n tx.setSender(address);\n\n if (asset === 'SUI') {\n const [coin] = tx.splitCoins(tx.gas, [rawAmount]);\n tx.transferObjects([coin], recipient);\n } else {\n const coins = await client.getCoins({ owner: address, coinType: assetInfo.type });\n if (coins.data.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${asset} coins found`);\n\n const totalBalance = coins.data.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n if (totalBalance < rawAmount) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Insufficient ${asset} balance`, {\n available: Number(totalBalance) / 10 ** assetInfo.decimals, required: amount,\n });\n }\n\n const primaryCoin = tx.object(coins.data[0].coinObjectId);\n if (coins.data.length > 1) {\n tx.mergeCoins(primaryCoin, coins.data.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n const [sendCoin] = tx.splitCoins(primaryCoin, [rawAmount]);\n tx.transferObjects([sendCoin], recipient);\n }\n\n return tx;\n}\n\n/**\n * Fragment-appender for the chain-mode send leg of SPEC 7 multi-write\n * Payment Intents. Consumes a coin reference produced by a previous\n * appender (e.g. `addWithdrawToTx`, `addSwapToTx`) and transfers it to\n * `recipient` within the same Payment Intent — no intermediate wallet\n * materialization.\n *\n * Codifies the hand-built send leg from\n * `scripts/smoke-spec7-withdraw-then-send.ts` (P2.1) into a typed\n * appender. SPEC 7 § \"Layer 1\" — P2.2b will register this in the\n * `WRITE_APPENDER_REGISTRY` under `send_transfer` for chain-mode\n * dispatch; the registry adapter will handle the wallet-fetch fallback\n * by delegating to `buildSendTx` when no upstream coin is available.\n *\n * For single-step send_transfer flows (no chained predecessor), use\n * `buildSendTx` directly — it builds a complete tx including the\n * wallet-coin selection / merge / split prelude.\n *\n * @returns void — the coin is consumed by `tx.transferObjects`. Callers\n * that need the post-transfer \"effective amount\" should rely on the\n * upstream appender's `effectiveAmount` (e.g. `addWithdrawToTx`'s\n * return), not on this appender.\n */\nexport function addSendToTx(\n tx: Transaction,\n coin: TransactionObjectArgument,\n recipient: string,\n): void {\n const validRecipient = validateAddress(recipient);\n tx.transferObjects([coin], validRecipient);\n}\n\n","import { MIST_PER_SUI, BPS_DENOMINATOR, USDC_DECIMALS, SUPPORTED_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\n\nexport function mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nexport function suiToMist(sui: number): bigint {\n return BigInt(Math.round(sui * Number(MIST_PER_SUI)));\n}\n\nexport function usdcToRaw(amount: number): bigint {\n return BigInt(Math.round(amount * 10 ** USDC_DECIMALS));\n}\n\nexport function rawToUsdc(raw: bigint): number {\n return Number(raw) / 10 ** USDC_DECIMALS;\n}\n\nexport function stableToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function rawToStable(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function getDecimals(asset: SupportedAsset): number {\n return SUPPORTED_ASSETS[asset].decimals;\n}\n\nexport function rawToDisplay(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function displayToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function bpsToPercent(bps: bigint): number {\n return Number(bps) / Number(BPS_DENOMINATOR) * 100;\n}\n\nexport function formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`;\n}\n\nexport function formatSui(amount: number): string {\n if (amount < 0.001) return `${amount.toFixed(6)} SUI`;\n return `${amount.toFixed(3)} SUI`;\n}\n\nexport function formatLargeNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(2);\n}\n\nexport function formatAssetAmount(amount: number, asset: string): string {\n if (asset === 'BTC') return amount.toFixed(8);\n if (asset === 'GOLD') return amount.toFixed(6);\n if (asset === 'ETH') return amount.toFixed(6);\n return amount.toFixed(4);\n}\n\nconst ASSET_LOOKUP: Map<string, string> = new Map();\nfor (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n ASSET_LOOKUP.set(key.toUpperCase(), key);\n if (info.displayName && info.displayName.toUpperCase() !== key.toUpperCase()) {\n ASSET_LOOKUP.set(info.displayName.toUpperCase(), key);\n }\n}\n\n/**\n * Case-insensitive lookup against SUPPORTED_ASSETS keys AND display names.\n * 'usde' → 'USDe', 'suiusde' → 'USDe', 'suiusdt' → 'USDT', 'usdsui' → 'USDsui'.\n * Returns the original input if not found so downstream validation can reject it.\n */\nexport function normalizeAsset(input: string): string {\n return ASSET_LOOKUP.get(input.toUpperCase()) ?? input;\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, STABLE_ASSETS, MIST_PER_SUI, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport type { StableAsset } from '../constants.js';\nimport type { BalanceResponse } from '../types.js';\n\nconst SUI_PRICE_FALLBACK = 1.0;\nlet _cachedSuiPrice = 0;\nlet _priceLastFetched = 0;\nconst PRICE_CACHE_TTL_MS = 60_000;\n\n/**\n * Fetch SUI price in USD from the Cetus USDC/SUI pool's sqrt_price.\n *\n * Pool is Pool<USDC, SUI> so coin_a = USDC (6 dec), coin_b = SUI (9 dec).\n * current_sqrt_price (Q64 fixed-point) encodes sqrt(raw_price) where\n * raw_price = SUI_raw / USDC_raw.\n *\n * USDC per SUI = 10^(decimals_a - decimals_b) / raw_price\n * = 10^(6-9) / raw_price\n * = 1 / (raw_price * 1000)\n *\n * Equivalently: 1000 / raw_price\n */\nasync function fetchSuiPrice(client: SuiJsonRpcClient): Promise<number> {\n const now = Date.now();\n if (_cachedSuiPrice > 0 && now - _priceLastFetched < PRICE_CACHE_TTL_MS) {\n return _cachedSuiPrice;\n }\n\n try {\n const pool = await client.getObject({\n id: CETUS_USDC_SUI_POOL,\n options: { showContent: true },\n });\n\n if (pool.data?.content?.dataType === 'moveObject') {\n const fields = pool.data.content.fields as Record<string, unknown>;\n const currentSqrtPrice = BigInt(String(fields.current_sqrt_price ?? '0'));\n\n if (currentSqrtPrice > 0n) {\n const Q64 = 2n ** 64n;\n const sqrtPriceFloat = Number(currentSqrtPrice) / Number(Q64);\n const rawPrice = sqrtPriceFloat * sqrtPriceFloat;\n const price = 1000 / rawPrice;\n if (price > 0.01 && price < 1000) {\n _cachedSuiPrice = price;\n _priceLastFetched = now;\n }\n }\n }\n } catch {\n // Use cached/fallback price\n }\n\n return _cachedSuiPrice || SUI_PRICE_FALLBACK;\n}\n\nexport async function queryBalance(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<BalanceResponse> {\n const stableBalancePromises = STABLE_ASSETS.map((asset) =>\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS[asset].type })\n .then((b) => ({ asset, amount: Number(b.totalBalance) / 10 ** SUPPORTED_ASSETS[asset].decimals }))\n .catch(() => ({ asset, amount: 0 })),\n );\n\n const [suiBalance, suiPriceUsd, ...stableResults] = await Promise.all([\n client.getBalance({ owner: address, coinType: SUPPORTED_ASSETS.SUI.type }),\n fetchSuiPrice(client),\n ...stableBalancePromises,\n ]);\n\n const stables = {} as Record<StableAsset, number>;\n let totalStables = 0;\n for (const { asset, amount } of stableResults) {\n stables[asset] = amount;\n totalStables += amount;\n }\n\n const suiAmount = Number(suiBalance.totalBalance) / Number(MIST_PER_SUI);\n const savings = 0; // Merged from NAVI in T2000.balance()\n const usdEquiv = suiAmount * suiPriceUsd;\n const total = totalStables + savings + usdEquiv;\n\n return {\n available: totalStables,\n savings,\n debt: 0,\n pendingRewards: 0,\n gasReserve: {\n sui: suiAmount,\n usdEquiv,\n },\n total,\n stables,\n };\n}\n","/**\n * Shared transaction classifier.\n *\n * Consumed by both the SDK's `parseTxRecord` (production agent path) and\n * the engine's `transaction_history` tool (cold-start RPC path). Keeping\n * a single source of truth here prevents the two paths from drifting —\n * see v1.5.3 regression where the SDK path was emitting `action:\n * 'transaction'` (rendered as \"On-chain\") while the engine path was\n * already producing fine-grained labels.\n */\n\nimport { getDecimalsForCoinType, resolveSymbol, SUI_TYPE } from '../token-registry.js';\n\n/**\n * Coarse action bucket — one of `'send' | 'lending' | 'swap' |\n * 'transaction'`. Used by the ACI `action` filter on the\n * `transaction_history` tool. STABLE: downstream queries depend on\n * exactly these values.\n *\n * Order matters: more specific buckets first. Lending patterns precede\n * swap patterns so a NAVI `::swap` helper (if one ever existed) would\n * still bucket as lending.\n */\nexport const KNOWN_TARGETS: readonly [RegExp, string][] = [\n [/::suilend|::obligation/, 'lending'],\n [/::navi|::lending_core|::incentive_v\\d+|::oracle_pro/, 'lending'],\n /**\n * DEX modules — both direct calls and aggregator legs. The Cetus\n * aggregator dispatches through a per-DEX module (e.g.\n * `cetus::swap`, `flowx_amm::swap`, `aftermath::swap`, …) plus\n * router glue functions. We list every DEX module the aggregator\n * supports today so a single-DEX call still classifies cleanly.\n */\n [/::cetus(?:_dlmm)?::|::pool::|::deepbook|::flowx_(?:amm|clmm)::|::kriya_(?:amm|clmm)::|::turbos::|::aftermath::|::afsui::|::bluefin::|::bluemove::|::ferra_(?:clmm|dlmm)::|::haedal_hmm::|::hasui::|::hawal::|::magma::|::momentum::|::obric::|::springsui::|::steamm_cpmm::|::fullsail::|::alphafi::|::volo_swap::/, 'swap'],\n /**\n * Cetus aggregator router glue. These are the swap-context and\n * balance-handling helpers the aggregator emits around per-DEX\n * legs. Without this entry a tx that ONLY had router calls\n * (theoretically possible for setup/cleanup) would slip through;\n * in practice these always coexist with a DEX leg, but the entry\n * is cheap insurance.\n */\n [/::router::(?:new_swap_context(?:_v)?|confirm_swap|transfer_balance|take_balance|transfer_or_destroy_coin)/, 'swap'],\n [/::transfer::public_transfer/, 'send'],\n];\n\n/**\n * Finer-grained display labels — derived from MoveCall function names.\n * The card renders `label ?? action`, so when this map matches we get\n * \"Deposit\" / \"Withdraw\" / \"Borrow\" / \"Repay\" / \"Payment link\" instead\n * of the generic \"Lending\" or \"Transaction\".\n *\n * Order matters: more specific patterns first. Each entry is\n * (regex, label) where the regex is matched against the\n * fully-qualified MoveCall target `pkg::module::function`.\n */\nexport const LABEL_PATTERNS: readonly [RegExp, string][] = [\n [/::pay(?:ment_kit|_kit)?::|::create_payment_link|::pay_link/, 'payment_link'],\n [/::create_invoice|::invoice::/, 'invoice'],\n [/::deposit|::supply|::mint_ctokens/, 'deposit'],\n [/::withdraw|::redeem|::redeem_ctokens/, 'withdraw'],\n [/::borrow/, 'borrow'],\n [/::repay/, 'repay'],\n [/::claim_reward|::claim::|::claim_incentive/, 'claim'],\n [/::stake/, 'stake'],\n [/::unstake|::burn::/, 'unstake'],\n [/::liquidate/, 'liquidate'],\n];\n\nexport interface ClassifyBalanceChange {\n owner: { AddressOwner?: string } | string;\n coinType: string;\n amount: string;\n}\n\nfunction resolveOwner(owner: ClassifyBalanceChange['owner']): string | null {\n if (typeof owner === 'object' && owner.AddressOwner) return owner.AddressOwner;\n if (typeof owner === 'string') return owner;\n return null;\n}\n\nexport function classifyAction(targets: string[], commandTypes: string[]): string {\n for (const target of targets) {\n for (const [pattern, label] of KNOWN_TARGETS) {\n if (pattern.test(target)) return label;\n }\n }\n if (commandTypes.includes('TransferObjects') && !commandTypes.includes('MoveCall')) return 'send';\n return 'transaction';\n}\n\n/**\n * Last-resort fallback when neither `LABEL_PATTERNS` nor the action\n * bucket produces something useful.\n *\n * Returns the first MoveCall's *module* name (e.g. \"navi\", \"spam\") so\n * the card shows something better than the literal word \"transaction\".\n * When no MoveCall exists, returns 'on-chain'.\n *\n * Note: callers should prefer `classifyLabel` which now layers\n * pattern-match → coarse action → module name (see commentary there).\n */\nexport function fallbackLabel(targets: string[]): string {\n if (!targets.length) return 'on-chain';\n const first = targets[0];\n const parts = first.split('::');\n if (parts.length >= 2 && parts[1]) return parts[1].toLowerCase();\n return 'on-chain';\n}\n\n/**\n * Three-tier label resolution for the transaction history card:\n * 1. Specific keyword match in `LABEL_PATTERNS` (\"deposit\",\n * \"payment_link\", …).\n * 2. Coarse action bucket from `classifyAction` (\"swap\", \"send\",\n * \"lending\") — prevents leaking opaque internal module names like\n * \"router\" (Cetus aggregator) or \"cross_swap\" (third-party DEX\n * aggregators) for txs that we already classified as a swap.\n * 3. Module name from the first MoveCall (`fallbackLabel`) — only\n * used when the action bucket itself is the generic \"transaction\".\n *\n * Pre-v0.46.2 we skipped tier 2, so swaps showed labels like \"router\",\n * \"cross_swap\", \"scallop_router\", etc. instead of the clean \"swap\".\n */\nexport function classifyLabel(targets: string[], commandTypes: string[]): string {\n for (const target of targets) {\n for (const [pattern, label] of LABEL_PATTERNS) {\n if (pattern.test(target)) return label;\n }\n }\n if (commandTypes.includes('TransferObjects') && !commandTypes.includes('MoveCall')) return 'send';\n const action = classifyAction(targets, commandTypes);\n if (action !== 'transaction') return action;\n return fallbackLabel(targets);\n}\n\n/**\n * Balance-direction tiebreaker for ambiguous lending calls.\n *\n * Many lending modules expose generic entry points (NAVI's bundled\n * flash actions, `lending_core::*::entry_*`, etc.) that don't carry\n * a `deposit`/`withdraw`/`borrow`/`repay` keyword in the function\n * name. When `classifyLabel` falls back to a bare module name like\n * `\"lending\"` for a known lending tx, infer direction from the user's\n * non-SUI balance change:\n * - net outflow of the supplied asset → deposit (also covers repay,\n * but repay-without-keyword is essentially never emitted).\n * - net inflow of the supplied asset → withdraw (also covers borrow).\n * SUI is excluded so gas-only transactions don't get mislabeled.\n *\n * If `LABEL_PATTERNS` matched a specific keyword, the existing label is\n * returned unchanged.\n */\nexport function refineLendingLabel(\n currentAction: string,\n currentLabel: string,\n moveCallTargets: string[],\n changes: ClassifyBalanceChange[],\n address: string,\n): string {\n if (currentAction !== 'lending') return currentLabel;\n const labelMatchedSpecific = LABEL_PATTERNS.some(([p]) =>\n moveCallTargets.some((t) => p.test(t)),\n );\n if (labelMatchedSpecific) return currentLabel;\n\n const userNonSuiOutflow = changes.find(\n (c) => resolveOwner(c.owner) === address && c.coinType !== SUI_TYPE && BigInt(c.amount) < 0n,\n );\n if (userNonSuiOutflow) return 'deposit';\n\n const userNonSuiInflow = changes.find(\n (c) => resolveOwner(c.owner) === address && c.coinType !== SUI_TYPE && BigInt(c.amount) > 0n,\n );\n if (userNonSuiInflow) return 'withdraw';\n\n return currentLabel;\n}\n\nexport interface ClassifyResult {\n action: string;\n label: string;\n}\n\nexport function classifyTransaction(\n moveCallTargets: string[],\n commandTypes: string[],\n balanceChanges: ClassifyBalanceChange[],\n address: string,\n): ClassifyResult {\n const action = classifyAction(moveCallTargets, commandTypes);\n const baseLabel = classifyLabel(moveCallTargets, commandTypes);\n const label = refineLendingLabel(action, baseLabel, moveCallTargets, balanceChanges, address);\n return { action, label };\n}\n\n/**\n * Direction of the user's net non-gas movement for this transaction.\n *\n * - `'out'` — the user spent the asset (sends, deposits, repays,\n * swap-in, payment-link payouts).\n * - `'in'` — the user received the asset (withdraws, borrows,\n * swap-out, claims, deposits credited from another wallet).\n *\n * Used by the `TransactionHistoryCard` to choose the `+`/`−` sign and\n * color. Direction is computed from the actual on-chain balance change\n * — never from the textual label — so opaque action types (`'router'`,\n * `'cross_swap'`, …) still render the correct sign.\n */\nexport type TxDirection = 'in' | 'out';\n\nexport interface ExtractedTransfer {\n amount?: number;\n asset?: string;\n recipient?: string;\n direction?: TxDirection;\n}\n\n/**\n * Extracts the principal amount/asset/direction for a transaction\n * from its `balanceChanges`.\n *\n * Algorithm:\n * 1. Restrict to the user's *own* balance changes.\n * 2. Prefer non-SUI changes (gas-only SUI deltas are noise).\n * 3. Pick the change with the largest absolute value — the \"principal\".\n * 4. If no non-SUI change exists, fall back to the largest SUI change\n * so pure-SUI transfers (stake/unstake/native send) still render.\n * 5. Direction follows the sign of the principal.\n * 6. Recipient is set only on outflows, by finding a matching inflow\n * on a *non-user* address with the same coinType.\n *\n * Pre-v0.46.2 this function only inspected outflows, so withdraws,\n * borrows, claims, swap-receives and payment-link receives all\n * rendered with no amount on the rich card (and with a wrong sign,\n * because the card guessed direction from the label string).\n */\nexport function extractTransferDetails(\n changes: ClassifyBalanceChange[] | undefined,\n sender: string,\n): ExtractedTransfer {\n if (!changes || changes.length === 0) return {};\n\n const userChanges = changes.filter((c) => resolveOwner(c.owner) === sender);\n if (userChanges.length === 0) return {};\n\n const userNonSui = userChanges.filter((c) => c.coinType !== SUI_TYPE);\n const pool = userNonSui.length > 0 ? userNonSui : userChanges;\n\n let primary = pool[0];\n let primaryAbs = bigintAbs(BigInt(primary.amount));\n for (let i = 1; i < pool.length; i++) {\n const abs = bigintAbs(BigInt(pool[i].amount));\n if (abs > primaryAbs) {\n primary = pool[i];\n primaryAbs = abs;\n }\n }\n\n const raw = BigInt(primary.amount);\n if (raw === 0n) return {};\n\n const decimals = getDecimalsForCoinType(primary.coinType);\n const amount = Number(primaryAbs) / 10 ** decimals;\n const asset = resolveSymbol(primary.coinType);\n const direction: TxDirection = raw < 0n ? 'out' : 'in';\n\n let recipient: string | undefined;\n if (direction === 'out') {\n const recipientChange = changes.find(\n (c) =>\n resolveOwner(c.owner) !== sender &&\n c.coinType === primary.coinType &&\n BigInt(c.amount) > 0n,\n );\n recipient = recipientChange ? resolveOwner(recipientChange.owner) ?? undefined : undefined;\n }\n\n return { amount, asset, recipient, direction };\n}\n\nfunction bigintAbs(n: bigint): bigint {\n return n < 0n ? -n : n;\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { TransactionRecord } from '../types.js';\nimport {\n classifyTransaction,\n extractTransferDetails,\n type ClassifyBalanceChange,\n} from './classify.js';\n\nexport async function queryHistory(\n client: SuiJsonRpcClient,\n address: string,\n limit = 20,\n): Promise<TransactionRecord[]> {\n const txns = await client.queryTransactionBlocks({\n filter: { FromAddress: address },\n options: { showEffects: true, showInput: true, showBalanceChanges: true },\n limit,\n order: 'descending',\n });\n\n return txns.data.map((tx) => parseTxRecord(tx as unknown as SuiRpcTxBlock, address));\n}\n\nexport async function queryTransaction(\n client: SuiJsonRpcClient,\n digest: string,\n senderAddress: string,\n): Promise<TransactionRecord | null> {\n try {\n const tx = await client.getTransactionBlock({\n digest,\n options: { showEffects: true, showInput: true, showBalanceChanges: true },\n });\n return parseTxRecord(tx as unknown as SuiRpcTxBlock, senderAddress);\n } catch {\n return null;\n }\n}\n\n/**\n * Shape of a transaction block as returned by `suix_queryTransactionBlocks`\n * with `showEffects | showInput | showBalanceChanges` enabled. Exported so\n * downstream consumers (audric dashboard `/api/history`, `/api/activity`,\n * etc.) can type their RPC calls without redeclaring the structure.\n */\nexport interface SuiRpcTxBlock {\n digest: string;\n timestampMs?: string;\n transaction?: unknown;\n effects?: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } };\n balanceChanges?: ClassifyBalanceChange[];\n}\n\n/**\n * Convert a single Sui RPC transaction block to a {@link TransactionRecord}\n * using the canonical (shared) classifier and balance-change extractor.\n *\n * This is the single source of truth for transaction parsing across the\n * agent-tool path AND the dashboard-API path. Use it instead of writing\n * a bespoke parser per surface.\n *\n * @param tx Raw RPC tx block (must include `effects`, `input`, `balanceChanges`).\n * @param address Wallet address whose perspective we're parsing from.\n */\nexport function parseSuiRpcTx(tx: SuiRpcTxBlock, address: string): TransactionRecord {\n return parseTxRecord(tx, address);\n}\n\n/**\n * Extract the sender (signer) address from a raw RPC tx block.\n * Returns `null` if the block shape is unexpected.\n */\nexport function extractTxSender(txBlock: unknown): string | null {\n try {\n if (!txBlock || typeof txBlock !== 'object') return null;\n const data = 'data' in txBlock ? (txBlock as Record<string, unknown>).data : undefined;\n if (!data || typeof data !== 'object') return null;\n return ((data as Record<string, unknown>).sender as string) ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract MoveCall targets (`<pkg>::<module>::<function>`) and the\n * sequence of programmable-transaction command types (e.g. `MoveCall`,\n * `TransferObjects`) from a raw RPC tx block. Tolerates both the\n * legacy `inner.transactions` field and the newer `inner.commands`\n * field.\n */\nexport function extractTxCommands(txBlock: unknown): {\n moveCallTargets: string[];\n commandTypes: string[];\n} {\n return extractCommands(txBlock);\n}\n\nfunction parseTxRecord(tx: SuiRpcTxBlock, address: string): TransactionRecord {\n const gasUsed = tx.effects?.gasUsed;\n const gasCost = gasUsed\n ? (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) /\n 1e9\n : undefined;\n\n const { moveCallTargets, commandTypes } = extractCommands(tx.transaction);\n const balanceChanges = tx.balanceChanges ?? [];\n const { amount, asset, recipient, direction } = extractTransferDetails(balanceChanges, address);\n const { action, label } = classifyTransaction(\n moveCallTargets,\n commandTypes,\n balanceChanges,\n address,\n );\n\n return {\n digest: tx.digest,\n action,\n label,\n amount,\n asset,\n recipient,\n direction,\n timestamp: Number(tx.timestampMs ?? 0),\n gasCost,\n };\n}\n\ninterface CommandInfo {\n moveCallTargets: string[];\n commandTypes: string[];\n}\n\nfunction extractCommands(txBlock: unknown): CommandInfo {\n const result: CommandInfo = { moveCallTargets: [], commandTypes: [] };\n try {\n if (!txBlock || typeof txBlock !== 'object') return result;\n const data = 'data' in txBlock ? (txBlock as Record<string, unknown>).data : undefined;\n if (!data || typeof data !== 'object') return result;\n const inner = 'transaction' in (data as Record<string, unknown>)\n ? (data as Record<string, unknown>).transaction\n : undefined;\n if (!inner || typeof inner !== 'object') return result;\n const commands = 'commands' in (inner as Record<string, unknown>)\n ? (inner as Record<string, unknown>).commands\n : 'transactions' in (inner as Record<string, unknown>)\n ? (inner as Record<string, unknown>).transactions\n : undefined;\n if (!Array.isArray(commands)) return result;\n\n for (const cmd of commands as Record<string, unknown>[]) {\n if (cmd.MoveCall) {\n const mc = cmd.MoveCall as { package: string; module: string; function: string };\n result.moveCallTargets.push(`${mc.package}::${mc.module}::${mc.function}`);\n result.commandTypes.push('MoveCall');\n } else if (cmd.TransferObjects) {\n result.commandTypes.push('TransferObjects');\n }\n }\n } catch { /* best effort */ }\n return result;\n}\n","import { EventEmitter } from 'eventemitter3';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { createPaymentTransactionUri } from '@mysten/payment-kit';\nimport { getSuiClient } from './utils/sui.js';\nimport {\n generateKeypair,\n keypairFromPrivateKey,\n saveKey,\n loadKey,\n walletExists,\n exportPrivateKey,\n getAddress,\n} from './wallet/keyManager.js';\nimport type { TransactionSigner } from './signer.js';\nimport { KeypairSigner } from './wallet/keypairSigner.js';\nimport { ZkLoginSigner, type ZkLoginProof } from './wallet/zkLoginSigner.js';\nimport { buildSendTx } from './wallet/send.js';\nimport { queryBalance } from './wallet/balance.js';\nimport { queryHistory, queryTransaction } from './wallet/history.js';\nimport { getDecimalsForCoinType, resolveSymbol } from './token-registry.js';\n// [B5 v2 / 2026-04-30] No fee imports — CLI / direct SDK is fee-free. Consumer\n// apps (Audric) own fee policy via `addFeeTransfer` from `./protocols/protocolFee.js`.\nimport * as yieldTracker from './protocols/yieldTracker.js';\nimport { ProtocolRegistry } from './adapters/registry.js';\nimport { NaviAdapter } from './adapters/navi.js';\nimport type { LendingAdapter } from './adapters/types.js';\nimport type {\n T2000Options,\n BalanceResponse,\n SendResult,\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n RatesResult,\n PositionsResult,\n TransactionRecord,\n DepositInfo,\n PaymentRequest,\n EarningsResult,\n FundStatusResult,\n ClaimRewardsResult,\n CompoundRewardsResult,\n PendingReward,\n PayOptions,\n PayResult,\n SwapResult,\n SwapQuoteResult,\n StakeVSuiResult,\n UnstakeVSuiResult,\n} from './types.js';\nimport { T2000Error } from './errors.js';\nimport { SUPPORTED_ASSETS, MIST_PER_SUI, assertAllowedAsset, type SupportedAsset } from './constants.js';\n\nimport { truncateAddress } from './utils/sui.js';\nimport { SafeguardEnforcer } from './safeguards/enforcer.js';\nimport { ContactManager } from './contacts.js';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nconst DEFAULT_CONFIG_DIR = join(homedir(), '.t2000');\n\ninterface T2000Events {\n balanceChange: (event: { asset: string; previous: number; current: number; cause: string; tx?: string }) => void;\n healthWarning: (event: { healthFactor: number; threshold: number; severity: 'warning' }) => void;\n healthCritical: (event: { healthFactor: number; threshold: number; severity: 'critical' }) => void;\n yield: (event: { earned: number; total: number; apy: number; timestamp: number }) => void;\n error: (error: T2000Error) => void;\n}\n\n// Sign + execute a transaction with the agent's signer. Replaces the pre-v2 gas\n// manager — every transaction is now self-funded by the agent's wallet.\ntype SuiTransactionEffects = NonNullable<Awaited<ReturnType<SuiJsonRpcClient['executeTransactionBlock']>>['effects']>;\n\nasync function executeTx(\n client: SuiJsonRpcClient,\n signer: TransactionSigner,\n buildTx: () => Promise<Transaction> | Transaction,\n): Promise<{ digest: string; gasCostSui: number; effects: SuiTransactionEffects | undefined }> {\n const tx = await buildTx();\n tx.setSender(signer.getAddress());\n const txBytes = await tx.build({ client });\n const { signature } = await signer.signTransaction(txBytes);\n const result = await client.executeTransactionBlock({\n transactionBlock: txBytes,\n signature,\n options: { showEffects: true },\n });\n await client.waitForTransaction({ digest: result.digest });\n const gasUsed = result.effects?.gasUsed;\n let gasCostSui = 0;\n if (gasUsed) {\n const total = BigInt(gasUsed.computationCost) + BigInt(gasUsed.storageCost) - BigInt(gasUsed.storageRebate);\n gasCostSui = Number(total) / 1e9;\n }\n return { digest: result.digest, gasCostSui, effects: result.effects ?? undefined };\n}\n\nexport class T2000 extends EventEmitter<T2000Events> {\n private readonly _signer: TransactionSigner;\n private readonly _keypair?: Ed25519Keypair;\n private readonly client: SuiJsonRpcClient;\n private readonly _address: string;\n private readonly registry: ProtocolRegistry;\n readonly enforcer: SafeguardEnforcer;\n readonly contacts: ContactManager;\n\n private constructor(keypair: Ed25519Keypair, client: SuiJsonRpcClient, registry?: ProtocolRegistry, configDir?: string);\n private constructor(signer: TransactionSigner, client: SuiJsonRpcClient, registry: ProtocolRegistry | undefined, configDir: string | undefined, isSignerMode: true);\n private constructor(\n keypairOrSigner: Ed25519Keypair | TransactionSigner,\n client: SuiJsonRpcClient,\n registry?: ProtocolRegistry,\n configDir?: string,\n isSignerMode?: boolean,\n ) {\n super();\n if (isSignerMode) {\n this._signer = keypairOrSigner as TransactionSigner;\n this._keypair = undefined;\n this._address = this._signer.getAddress();\n } else {\n const kp = keypairOrSigner as Ed25519Keypair;\n this._keypair = kp;\n this._signer = new KeypairSigner(kp);\n this._address = getAddress(kp);\n }\n this.client = client;\n this.registry = registry ?? T2000.createDefaultRegistry(client);\n this.enforcer = new SafeguardEnforcer(configDir);\n this.enforcer.load();\n this.contacts = new ContactManager(configDir);\n }\n\n private static createDefaultRegistry(client: SuiJsonRpcClient): ProtocolRegistry {\n const registry = new ProtocolRegistry();\n const naviAdapter = new NaviAdapter();\n naviAdapter.initSync(client);\n registry.registerLending(naviAdapter);\n return registry;\n }\n\n static async create(options: T2000Options = {}): Promise<T2000> {\n const { keyPath, pin, passphrase, rpcUrl } = options;\n const secret = pin ?? passphrase;\n\n const client = getSuiClient(rpcUrl);\n\n const exists = await walletExists(keyPath);\n if (!exists) {\n throw new T2000Error(\n 'WALLET_NOT_FOUND',\n 'No wallet found. Run `t2000 init` to create one.',\n );\n }\n\n if (!secret) {\n throw new T2000Error('WALLET_LOCKED', 'PIN required to unlock wallet');\n }\n\n const keypair = await loadKey(secret, keyPath);\n return new T2000(keypair, client, undefined, DEFAULT_CONFIG_DIR);\n }\n\n static fromPrivateKey(privateKey: string, options: { network?: 'mainnet' | 'testnet'; rpcUrl?: string } = {}): T2000 {\n const keypair = keypairFromPrivateKey(privateKey);\n const client = getSuiClient(options.rpcUrl);\n return new T2000(keypair, client);\n }\n\n static async init(options: { pin: string; passphrase?: string; keyPath?: string; name?: string }): Promise<{ agent: T2000; address: string }> {\n const secret = options.pin ?? options.passphrase ?? '';\n const keypair = generateKeypair();\n await saveKey(keypair, secret, options.keyPath);\n\n const client = getSuiClient();\n const agent = new T2000(keypair, client, undefined, DEFAULT_CONFIG_DIR);\n const address = agent.address();\n\n return { agent, address };\n }\n\n // -- Gas --\n\n /** SuiJsonRpcClient used by this agent — exposed for integrations. */\n get suiClient(): SuiJsonRpcClient {\n return this.client;\n }\n\n /** Ed25519Keypair used by this agent — exposed for CLI/MCP integrations. */\n get keypair(): Ed25519Keypair {\n if (!this._keypair) {\n throw new T2000Error('WALLET_NOT_FOUND', 'Keypair not available — this instance uses zkLogin');\n }\n return this._keypair;\n }\n\n /** Transaction signer (works for both keypair and zkLogin). */\n get signer(): TransactionSigner {\n return this._signer;\n }\n\n // -- MPP Payments --\n\n async pay(options: PayOptions): Promise<PayResult> {\n this.enforcer.assertNotLocked();\n this.enforcer.check({ operation: 'pay', amount: options.maxPrice ?? 1.0 });\n\n const { Mppx } = await import('mppx/client');\n const { sui } = await import('@suimpp/mpp/client');\n\n const client = this.client;\n const signer = this._signer;\n const signerAddress = signer.getAddress();\n\n const mppx = Mppx.create({\n polyfill: false,\n methods: [sui({\n client,\n signer: { toSuiAddress: () => signerAddress } as Parameters<typeof sui>[0]['signer'],\n execute: async (tx) => {\n const result = await executeTx(client, signer, () => tx);\n return { digest: result.digest, effects: result.effects };\n },\n })],\n });\n\n const method = (options.method ?? 'GET').toUpperCase();\n const canHaveBody = method !== 'GET' && method !== 'HEAD';\n\n const response = await mppx.fetch(options.url, {\n method,\n headers: options.headers,\n body: canHaveBody ? options.body : undefined,\n });\n\n const contentType = response.headers.get('content-type') ?? '';\n let body: unknown;\n try {\n body = contentType.includes('application/json')\n ? await response.json()\n : await response.text();\n } catch {\n body = null;\n }\n\n const receiptHeader = response.headers.get('x-payment-receipt');\n const paid = !!receiptHeader;\n\n if (paid) {\n this.enforcer.recordUsage(options.maxPrice ?? 1.0);\n }\n\n return {\n status: response.status,\n body,\n paid,\n cost: paid ? (options.maxPrice ?? undefined) : undefined,\n receipt: receiptHeader\n ? { reference: receiptHeader, timestamp: new Date().toISOString() }\n : undefined,\n };\n }\n\n // -- VOLO vSUI Staking --\n\n async stakeVSui(params: { amount: number }): Promise<StakeVSuiResult> {\n this.enforcer.assertNotLocked();\n const { buildStakeVSuiTx, getVoloStats } = await import('./protocols/volo.js');\n\n const amountMist = BigInt(Math.floor(params.amount * Number(MIST_PER_SUI)));\n const stats = await getVoloStats();\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n return buildStakeVSuiTx(this.client, this._address, amountMist);\n });\n\n const vSuiReceived = params.amount / stats.exchangeRate;\n\n return {\n success: true,\n tx: gasResult.digest,\n amountSui: params.amount,\n vSuiReceived,\n apy: stats.apy,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n async unstakeVSui(params: { amount: number | 'all' }): Promise<UnstakeVSuiResult> {\n this.enforcer.assertNotLocked();\n const { buildUnstakeVSuiTx, getVoloStats, VSUI_TYPE } = await import('./protocols/volo.js');\n\n let amountMist: bigint | 'all';\n let vSuiAmount: number;\n\n if (params.amount === 'all') {\n amountMist = 'all';\n const coins = await this._fetchCoins(VSUI_TYPE);\n vSuiAmount = coins.reduce((sum, c) => sum + Number(c.balance), 0) / 1e9;\n } else {\n amountMist = BigInt(Math.floor(params.amount * 1e9));\n vSuiAmount = params.amount;\n }\n\n const stats = await getVoloStats();\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n return buildUnstakeVSuiTx(this.client, this._address, amountMist);\n });\n\n const suiReceived = vSuiAmount * stats.exchangeRate;\n\n return {\n success: true,\n tx: gasResult.digest,\n vSuiAmount,\n suiReceived,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n // -- Swap --\n\n async swap(params: {\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n slippage?: number;\n }): Promise<SwapResult> {\n this.enforcer.assertNotLocked();\n\n const { findSwapRoute, buildSwapTx, resolveTokenType } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n if (!fromType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.from}. Provide the full coin type.`);\n if (!toType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.to}. Provide the full coin type.`);\n\n const byAmountIn = params.byAmountIn ?? true;\n const slippage = Math.min(params.slippage ?? 0.01, 0.05);\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: this._address,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new T2000Error('SWAP_NO_ROUTE', `No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) throw new T2000Error('SWAP_NO_ROUTE', `Insufficient liquidity for ${params.from} -> ${params.to}.`);\n if (route.priceImpact > 0.05) {\n console.warn(`[swap] High price impact: ${(route.priceImpact * 100).toFixed(2)}%`);\n }\n\n const toDecimals = getDecimalsForCoinType(toType);\n\n // Snapshot pre-swap balance for fallback diff calculation\n let preBalRaw = 0n;\n try {\n const preBal = await this.client.getBalance({ owner: this._address, coinType: toType });\n preBalRaw = BigInt(preBal.totalBalance);\n } catch { /* first time holding this token — balance is 0 */ }\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n let inputCoin: TransactionObjectArgument;\n if (fromType === '0x2::sui::SUI') {\n [inputCoin] = tx.splitCoins(tx.gas, [rawAmount]);\n } else {\n const coins = await this._fetchCoins(fromType);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${params.from} coins found.`);\n const merged = this._mergeCoinsInTx(tx, coins);\n [inputCoin] = tx.splitCoins(merged, [rawAmount]);\n }\n\n const outputCoin = await buildSwapTx({\n walletAddress: this._address,\n route,\n tx,\n inputCoin,\n slippage,\n });\n\n tx.transferObjects([outputCoin], this._address);\n return tx;\n });\n\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n let toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n // --- Primary: parse balance changes from the finalized transaction ---\n const toTypeSuffix = toType.split('::').slice(1).join('::');\n try {\n const fullTx = await this.client.waitForTransaction({\n digest: gasResult.digest,\n options: { showBalanceChanges: true },\n timeout: 8_000,\n pollInterval: 400,\n });\n type BalChange = { coinType: string; amount: string; owner: { AddressOwner?: string } };\n const changes = ((fullTx as { balanceChanges?: BalChange[] }).balanceChanges ?? []);\n const received = changes.find((c) => {\n if (BigInt(c.amount) <= 0n) return false;\n const ownerAddr = (c.owner as { AddressOwner?: string })?.AddressOwner;\n if (!ownerAddr || ownerAddr.toLowerCase() !== this._address.toLowerCase()) return false;\n if (c.coinType === toType) return true;\n return c.coinType.endsWith(toTypeSuffix);\n });\n if (received) {\n const actual = Number(BigInt(received.amount)) / 10 ** toDecimals;\n if (actual > 0) toAmount = actual;\n }\n } catch {\n // waitForTransaction timeout — fall through to balance diff\n }\n\n // --- Fallback: pre/post getBalance diff ---\n const cetusEstimate = Number(route.amountOut) / 10 ** toDecimals;\n if (Math.abs(toAmount - cetusEstimate) < 0.001) {\n try {\n await new Promise((r) => setTimeout(r, 2000));\n const postBal = await this.client.getBalance({ owner: this._address, coinType: toType });\n const postRaw = BigInt(postBal.totalBalance);\n const delta = Number(postRaw - preBalRaw) / 10 ** toDecimals;\n if (delta > 0) toAmount = delta;\n } catch {\n // Balance diff fallback failed — use Cetus estimate\n }\n }\n\n // Resolve full coin types to user-friendly token names\n const fromName = resolveSymbol(fromType);\n const toName = resolveSymbol(toType);\n\n const routeDesc = route.routerData.paths\n ?.map((p) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n success: true,\n tx: gasResult.digest,\n fromToken: fromName,\n toToken: toName,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n async swapQuote(params: {\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n }): Promise<SwapQuoteResult> {\n const { findSwapRoute, resolveTokenType } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n if (!fromType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.from}. Provide the full coin type.`);\n if (!toType) throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown token: ${params.to}. Provide the full coin type.`);\n\n const byAmountIn = params.byAmountIn ?? true;\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: this._address,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new T2000Error('SWAP_NO_ROUTE', `No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) throw new T2000Error('SWAP_NO_ROUTE', `Insufficient liquidity for ${params.from} -> ${params.to}.`);\n\n const toDecimals = getDecimalsForCoinType(toType);\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n const toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n const routeDesc = route.routerData.paths\n ?.map((p) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n fromToken: params.from,\n toToken: params.to,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n };\n }\n\n // -- Wallet --\n\n address(): string {\n return this._address;\n }\n\n async send(params: { to: string; amount: number; asset?: string }): Promise<SendResult> {\n this.enforcer.assertNotLocked();\n\n const asset = (params.asset ?? 'USDC') as keyof typeof SUPPORTED_ASSETS;\n if (!(asset in SUPPORTED_ASSETS)) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n }\n\n const resolved = this.contacts.resolve(params.to);\n const sendAmount = params.amount;\n const sendTo = resolved.address;\n\n const gasResult = await executeTx(this.client, this._signer, () =>\n buildSendTx({ client: this.client, address: this._address, to: sendTo, amount: sendAmount, asset }),\n );\n\n this.enforcer.recordUsage(sendAmount);\n const balance = await this.balance();\n\n this.emitBalanceChange(asset, sendAmount, 'send', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: sendAmount,\n to: resolved.address,\n contactName: resolved.contactName,\n gasCost: gasResult.gasCostSui,\n gasCostUnit: 'SUI',\n balance,\n };\n }\n\n async balance(): Promise<BalanceResponse> {\n const bal = await queryBalance(this.client, this._address);\n\n let chainTotal = bal.available + bal.gasReserve.usdEquiv;\n\n try {\n const positions = await this.positions();\n for (const pos of positions.positions) {\n const usdValue = pos.amountUsd ?? pos.amount;\n if (pos.type === 'save') {\n chainTotal += usdValue;\n bal.savings += usdValue;\n } else if (pos.type === 'borrow') {\n chainTotal -= usdValue;\n bal.debt += usdValue;\n }\n }\n } catch {\n // Protocol unavailable — chain total limited to wallet\n }\n\n try {\n const pendingRewards = await this.getPendingRewards();\n bal.pendingRewards = pendingRewards.reduce((s, r) => s + r.estimatedValueUsd, 0);\n } catch {\n bal.pendingRewards = 0;\n }\n\n bal.total = chainTotal;\n return bal;\n }\n\n async history(params?: { limit?: number }): Promise<TransactionRecord[]> {\n return queryHistory(this.client, this._address, params?.limit);\n }\n\n async transactionDetail(digest: string): Promise<TransactionRecord | null> {\n return queryTransaction(this.client, digest, this._address);\n }\n\n async deposit(): Promise<DepositInfo> {\n return {\n address: this._address,\n network: 'mainnet',\n supportedAssets: ['USDC', 'USDT', 'SUI'],\n instructions: [\n `Send USDC to: ${this._address}`,\n `Network: Sui Mainnet`,\n `Or buy USDC on an exchange and withdraw to this address.`,\n `USDC contract: ${SUPPORTED_ASSETS.USDC.type}`,\n ].join('\\n'),\n };\n }\n\n receive(params?: { amount?: number; currency?: string; memo?: string; label?: string }): PaymentRequest {\n const amount = params?.amount ?? null;\n const currency = params?.currency ?? 'USDC';\n const memo = params?.memo ?? null;\n const label = params?.label ?? null;\n const nonce = crypto.randomUUID();\n\n let qrUri: string;\n if (amount != null && amount > 0) {\n const decimals = currency === 'SUI' ? 9 : 6;\n const coinType = currency === 'SUI'\n ? '0x2::sui::SUI'\n : SUPPORTED_ASSETS.USDC.type;\n const rawAmount = BigInt(Math.floor(amount * 10 ** decimals));\n qrUri = createPaymentTransactionUri({\n receiverAddress: this._address,\n amount: rawAmount,\n coinType,\n nonce,\n ...(label ? { label } : {}),\n ...(memo ? { message: memo } : {}),\n });\n } else {\n const qrParts = [`sui:${this._address}`];\n const queryParams: string[] = [];\n if (currency !== 'SUI') queryParams.push(`currency=${currency}`);\n if (memo) queryParams.push(`memo=${encodeURIComponent(memo)}`);\n if (label) queryParams.push(`label=${encodeURIComponent(label)}`);\n qrUri = queryParams.length > 0 ? `${qrParts[0]}?${queryParams.join('&')}` : qrParts[0];\n }\n\n const amountStr = amount != null ? `$${amount.toFixed(2)} ` : '';\n const displayParts = [`Send ${amountStr}${currency} to ${truncateAddress(this._address)}`];\n if (memo) displayParts.push(`Memo: ${memo}`);\n\n return {\n address: this._address,\n network: 'mainnet',\n amount,\n currency,\n memo,\n label,\n nonce,\n qrUri,\n displayText: displayParts.join('\\n'),\n };\n }\n\n exportKey(): string {\n return exportPrivateKey(this.keypair);\n }\n\n static fromZkLogin(opts: {\n ephemeralKeypair: Ed25519Keypair;\n zkProof: ZkLoginProof;\n userAddress: string;\n maxEpoch: number;\n rpcUrl?: string;\n }): T2000 {\n const signer = new ZkLoginSigner(opts.ephemeralKeypair, opts.zkProof, opts.userAddress, opts.maxEpoch);\n const client = getSuiClient(opts.rpcUrl);\n return new T2000(signer, client, undefined, undefined, true);\n }\n\n async registerAdapter(adapter: LendingAdapter): Promise<void> {\n await adapter.init(this.client);\n this.registry.registerLending(adapter);\n }\n\n // -- Savings --\n\n async save(params: { amount: number | 'all'; asset?: SupportedAsset; protocol?: string }): Promise<SaveResult> {\n this.enforcer.assertNotLocked();\n assertAllowedAsset('save', params.asset);\n // [v0.51.0] Default USDC, but honor params.asset for the strategic-exception\n // set (currently USDC, USDsui — see OPERATION_ASSETS.save). Hardcoding 'USDC'\n // here previously silently rewrote the user's intent.\n const asset: SupportedAsset = (params.asset as SupportedAsset | undefined) ?? 'USDC';\n const assetInfo = SUPPORTED_ASSETS[asset];\n\n let amount: number;\n if (params.amount === 'all') {\n // [v0.51.0] Per-asset balance query — `queryBalance.available` is the sum\n // of STABLE_ASSETS (USDC), not the requested asset. For USDsui we need the\n // raw on-chain balance for that specific coin type.\n const assetBalance = await this._queryAssetBalance(assetInfo.type, assetInfo.decimals);\n amount = assetBalance - 1.0;\n if (amount <= 0) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} available to save`, {\n reason: 'insufficient_balance', asset,\n });\n }\n } else {\n amount = params.amount;\n const assetBalance = await this._queryAssetBalance(assetInfo.type, assetInfo.decimals);\n if (amount > assetBalance) {\n throw new T2000Error(\n 'INSUFFICIENT_BALANCE',\n `Insufficient ${assetInfo.displayName} balance. Available: ${assetBalance.toFixed(assetInfo.decimals === 6 ? 2 : 4)}, requested: ${amount.toFixed(assetInfo.decimals === 6 ? 2 : 4)}`,\n );\n }\n }\n\n // [B5 v2 / 2026-04-30] CLI / direct SDK calls are fee-free. Consumer apps\n // (Audric) charge their own fees by adding `addFeeTransfer` to the tx before\n // calling the SDK builders. `fee` is reported as 0 in the result.\n const saveAmount = amount;\n const adapter = await this.resolveLending(params.protocol, asset, 'save');\n const canPTB = !!adapter.addSaveToTx;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const coins = await this._fetchCoins(assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins found`);\n const merged = this._mergeCoinsInTx(tx, coins);\n const rawAmount = BigInt(Math.floor(saveAmount * 10 ** assetInfo.decimals));\n const [inputCoin] = tx.splitCoins(merged, [rawAmount]);\n\n await adapter.addSaveToTx!(tx, this._address, inputCoin, asset);\n return tx;\n }\n\n const { tx } = await adapter.buildSaveTx(this._address, saveAmount, asset);\n return tx;\n });\n\n const rates = await adapter.getRates(asset);\n this.emitBalanceChange(asset, saveAmount, 'save', gasResult.digest);\n\n let savingsBalance = saveAmount;\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n const positions = await this.positions();\n const actual = positions.positions\n .filter((p) => p.type === 'save' && p.asset === asset)\n .reduce((sum, p) => sum + p.amount, 0);\n if (actual > 0) {\n savingsBalance = actual;\n break;\n }\n } catch { /* retry */ }\n await new Promise(r => setTimeout(r, 2000));\n }\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: saveAmount,\n apy: rates.saveApy,\n fee: 0,\n gasCost: gasResult.gasCostSui,\n savingsBalance,\n };\n }\n\n async withdraw(params: { amount: number | 'all'; asset?: string; protocol?: string }): Promise<WithdrawResult> {\n this.enforcer.assertNotLocked();\n if (params.amount === 'all' && !params.protocol && !params.asset) {\n return this.withdrawAllProtocols();\n }\n\n const allPositions = await this.registry.allPositions(this._address);\n const supplies: Array<{ protocolId: string; asset: string; amount: number; apy: number }> = [];\n for (const pos of allPositions) {\n if (params.protocol && pos.protocolId !== params.protocol) continue;\n for (const s of pos.positions.supplies) {\n if (s.amount > 0.001) {\n if (params.asset && s.asset !== params.asset) continue;\n supplies.push({ protocolId: pos.protocolId, asset: s.asset, amount: s.amount, apy: s.apy });\n }\n }\n }\n\n if (supplies.length === 0) {\n throw new T2000Error('NO_COLLATERAL', params.asset ? `No ${params.asset} savings to withdraw` : 'No savings to withdraw');\n }\n\n supplies.sort((a, b) => {\n const aIsUsdc = a.asset === 'USDC' ? 0 : 1;\n const bIsUsdc = b.asset === 'USDC' ? 0 : 1;\n if (aIsUsdc !== bIsUsdc) return aIsUsdc - bIsUsdc;\n return a.apy - b.apy;\n });\n const target = supplies[0]!;\n const adapter = this.registry.getLending(target.protocolId);\n if (!adapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${target.protocolId} not found`);\n\n let amount: number;\n if (params.amount === 'all') {\n const maxResult = await adapter.maxWithdraw(this._address, target.asset);\n amount = maxResult.maxAmount;\n if (amount <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw');\n }\n } else {\n amount = params.amount;\n\n const hf = await adapter.getHealth(this._address);\n if (hf.borrowed > 0) {\n const maxResult = await adapter.maxWithdraw(this._address, target.asset);\n if (amount > maxResult.maxAmount) {\n throw new T2000Error(\n 'WITHDRAW_WOULD_LIQUIDATE',\n `Withdrawing $${amount.toFixed(2)} would drop health factor below 1.5`,\n {\n safeWithdrawAmount: maxResult.maxAmount,\n currentHF: maxResult.currentHF,\n projectedHF: maxResult.healthFactorAfter,\n },\n );\n }\n }\n }\n\n const withdrawAmount = amount;\n let finalAmount = withdrawAmount;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (adapter.addWithdrawToTx) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const { coin, effectiveAmount } = await adapter.addWithdrawToTx!(tx, this._address, withdrawAmount, target.asset);\n finalAmount = effectiveAmount;\n tx.transferObjects([coin], this._address);\n return tx;\n }\n\n const built = await adapter.buildWithdrawTx(this._address, withdrawAmount, target.asset);\n finalAmount = built.effectiveAmount;\n return built.tx;\n });\n\n this.emitBalanceChange(target.asset, finalAmount, 'withdraw', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: finalAmount,\n asset: target.asset,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n private async withdrawAllProtocols(): Promise<WithdrawResult> {\n const allPositions = await this.registry.allPositions(this._address);\n\n const withdrawable: Array<{ protocolId: string; asset: string; amount: number }> = [];\n for (const pos of allPositions) {\n for (const supply of pos.positions.supplies) {\n if (supply.amount > 0.01) {\n withdrawable.push({ protocolId: pos.protocolId, asset: supply.asset, amount: supply.amount });\n }\n }\n }\n\n if (withdrawable.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n const protocolMaxes = new Map<string, number>();\n const entries: Array<{ protocolId: string; asset: string; maxAmount: number; adapter: LendingAdapter }> = [];\n for (const entry of withdrawable) {\n const adapter = this.registry.getLending(entry.protocolId);\n if (!adapter) continue;\n if (!protocolMaxes.has(entry.protocolId)) {\n const maxResult = await adapter.maxWithdraw(this._address, entry.asset);\n protocolMaxes.set(entry.protocolId, maxResult.maxAmount);\n }\n const remaining = protocolMaxes.get(entry.protocolId)!;\n const perAssetMax = Math.min(entry.amount, remaining);\n if (perAssetMax > 0.01) {\n entries.push({ ...entry, maxAmount: perAssetMax, adapter });\n protocolMaxes.set(entry.protocolId, remaining - perAssetMax);\n }\n }\n\n if (entries.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n let totalReceived = 0;\n const canPTB = entries.every(e => e.adapter.addWithdrawToTx);\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n for (const entry of entries) {\n const { coin, effectiveAmount } = await entry.adapter.addWithdrawToTx!(\n tx, this._address, entry.maxAmount, entry.asset,\n );\n totalReceived += effectiveAmount;\n tx.transferObjects([coin], this._address);\n }\n return tx;\n }\n\n let lastTx: Transaction | undefined;\n for (const entry of entries) {\n const built = await entry.adapter.buildWithdrawTx(this._address, entry.maxAmount, entry.asset);\n totalReceived += built.effectiveAmount;\n lastTx = built.tx;\n }\n return lastTx!;\n });\n\n if (totalReceived <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No savings to withdraw across any protocol');\n }\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: totalReceived,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n /**\n * [v0.51.0] Per-asset wallet balance lookup.\n *\n * `queryBalance.available` rolls up only `STABLE_ASSETS` (USDC), so it cannot\n * answer \"do they have enough USDsui to save 10?\". This helper hits\n * `getBalance` for the specific coin type — same mechanism `queryBalance`\n * uses internally — and converts to a human-readable amount using the asset's\n * decimals. Returns 0 (not a throw) when the address holds none of the asset,\n * matching the caller's existing \"insufficient balance\" error path.\n */\n private async _queryAssetBalance(coinType: string, decimals: number): Promise<number> {\n try {\n const bal = await this.client.getBalance({ owner: this._address, coinType });\n return Number(bal.totalBalance) / 10 ** decimals;\n } catch {\n return 0;\n }\n }\n\n private async _fetchCoins(coinType: string): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await this.client.getCoins({ owner: this._address, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n\n if (all.length > 0) {\n this._lastFundDigest = undefined;\n return all;\n }\n\n if (this._lastFundDigest && coinType === SUPPORTED_ASSETS.USDC.type) {\n const txInfo = await this.client.getTransactionBlock({\n digest: this._lastFundDigest,\n options: { showObjectChanges: true },\n });\n const coinIds = (txInfo.objectChanges ?? [])\n .filter((c): c is typeof c & { objectId: string } =>\n (c.type === 'created' || c.type === 'mutated') &&\n 'objectType' in c &&\n typeof c.objectType === 'string' &&\n c.objectType.includes('0x2::coin::Coin') &&\n c.objectType.includes(coinType),\n )\n .map(c => c.objectId);\n\n if (coinIds.length > 0) {\n const objects = await this.client.multiGetObjects({\n ids: coinIds,\n options: { showContent: true, showOwner: true },\n });\n for (const obj of objects) {\n if (\n obj.data?.content?.dataType === 'moveObject' &&\n obj.data.owner &&\n typeof obj.data.owner === 'object' &&\n 'AddressOwner' in obj.data.owner &&\n obj.data.owner.AddressOwner === this._address\n ) {\n const fields = obj.data.content.fields as Record<string, unknown>;\n all.push({ coinObjectId: obj.data.objectId!, balance: String(fields.balance ?? '0') });\n }\n }\n }\n }\n\n return all;\n }\n\n private _mergeCoinsInTx(tx: Transaction, coins: Array<{ coinObjectId: string; balance: string }>): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n return primary;\n }\n\n private _lastFundDigest: string | undefined;\n\n private async _autoFundFromSavings(shortfall: number): Promise<void> {\n const positions = await this.positions();\n const savingsTotal = positions.positions\n .filter(p => p.type === 'save')\n .reduce((sum, p) => sum + p.amount, 0);\n\n if (savingsTotal < shortfall * 0.95) {\n const bal = await queryBalance(this.client, this._address);\n throw new T2000Error(\n 'INSUFFICIENT_BALANCE',\n `Insufficient funds. Available: $${bal.available.toFixed(2)}, savings: $${savingsTotal.toFixed(2)}, requested shortfall: $${shortfall.toFixed(2)}`,\n );\n }\n\n const result = await this.withdraw({ amount: shortfall });\n if (result.amount < shortfall * 0.5) {\n throw new T2000Error(\n 'WITHDRAW_FAILED',\n `Auto-withdraw from savings returned $${result.amount.toFixed(2)} — expected ~$${shortfall.toFixed(2)}. Try withdrawing manually first.`,\n );\n }\n\n const txInfo = await this.client.getTransactionBlock({\n digest: result.tx,\n options: { showBalanceChanges: true },\n });\n const usdcReceived = (txInfo.balanceChanges ?? []).some(\n c => c.coinType === SUPPORTED_ASSETS.USDC.type &&\n Number(c.amount) > 0 &&\n typeof c.owner === 'object' && 'AddressOwner' in c.owner &&\n c.owner.AddressOwner === this._address,\n );\n if (!usdcReceived) {\n throw new T2000Error('WITHDRAW_FAILED', 'Withdraw TX did not produce USDC');\n }\n this._lastFundDigest = result.tx;\n }\n\n async maxWithdraw(): Promise<MaxWithdrawResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'withdraw');\n return adapter.maxWithdraw(this._address, 'USDC');\n }\n\n // -- Borrowing --\n\n async borrow(params: { amount: number; asset?: SupportedAsset; protocol?: string }): Promise<BorrowResult> {\n this.enforcer.assertNotLocked();\n assertAllowedAsset('borrow', params.asset);\n // [v0.51.0] Default USDC, honor params.asset for the strategic-exception\n // set (USDC, USDsui — see OPERATION_ASSETS.borrow).\n const asset: SupportedAsset = (params.asset as SupportedAsset | undefined) ?? 'USDC';\n const adapter = await this.resolveLending(params.protocol, asset, 'borrow');\n\n const maxResult = await adapter.maxBorrow(this._address, asset);\n if (maxResult.maxAmount <= 0) {\n throw new T2000Error('NO_COLLATERAL', 'No collateral deposited. Save first with `t2000 save <amount>`.');\n }\n if (params.amount > maxResult.maxAmount) {\n throw new T2000Error('HEALTH_FACTOR_TOO_LOW', `Max safe borrow: $${maxResult.maxAmount.toFixed(2)}. Only savings deposits count as borrowable collateral.`, {\n maxBorrow: maxResult.maxAmount,\n currentHF: maxResult.currentHF,\n });\n }\n // [B5 v2 / 2026-04-30] CLI / direct SDK borrows are fee-free. See save() above.\n const borrowAmount = params.amount;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n const { tx } = await adapter.buildBorrowTx(this._address, borrowAmount, asset);\n return tx;\n });\n\n const hf = await adapter.getHealth(this._address);\n this.emitBalanceChange(asset, borrowAmount, 'borrow', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: borrowAmount,\n asset,\n fee: 0,\n healthFactor: hf.healthFactor,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n async repay(params: { amount: number | 'all'; asset?: SupportedAsset; protocol?: string }): Promise<RepayResult> {\n this.enforcer.assertNotLocked();\n const allPositions = await this.registry.allPositions(this._address);\n const borrows: Array<{ protocolId: string; asset: string; amount: number; apy: number }> = [];\n for (const pos of allPositions) {\n if (params.protocol && pos.protocolId !== params.protocol) continue;\n for (const b of pos.positions.borrows) {\n if (b.amount > 0.001) borrows.push({ protocolId: pos.protocolId, asset: b.asset, amount: b.amount, apy: b.apy });\n }\n }\n\n if (borrows.length === 0) {\n throw new T2000Error('NO_COLLATERAL', 'No outstanding borrow to repay');\n }\n\n if (params.amount === 'all') {\n return this._repayAllBorrows(borrows);\n }\n\n // [v0.51.1] Filter by params.asset when supplied. Pre-v0.51.1 we always\n // sorted by APY and picked the highest-APY borrow regardless of asset —\n // which broke USDsui repayment because `target` could be any asset and\n // we'd then fetch USDC coins for it (type mismatch). When the caller\n // names an asset, only that asset's borrows are eligible.\n const eligible = params.asset\n ? borrows.filter((b) => b.asset === params.asset)\n : borrows;\n if (eligible.length === 0) {\n throw new T2000Error('NO_COLLATERAL', `No outstanding ${params.asset} borrow to repay`);\n }\n eligible.sort((a, b) => b.apy - a.apy);\n const target = eligible[0]!;\n const adapter = this.registry.getLending(target.protocolId);\n if (!adapter) throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol ${target.protocolId} not found`);\n\n const repayAmount = Math.min(params.amount, target.amount);\n // [v0.51.1] Resolve the borrowed asset's coin type instead of\n // hardcoding USDC. Repaying a USDsui debt with a USDC coin would fail\n // at NAVI (type mismatch) or worse, succeed against the wrong pool.\n const targetAssetInfo = SUPPORTED_ASSETS[target.asset as SupportedAsset]\n ?? SUPPORTED_ASSETS.USDC;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (adapter.addRepayToTx) {\n const tx = new Transaction();\n tx.setSender(this._address);\n const coins = await this._fetchCoins(targetAssetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${targetAssetInfo.displayName} coins`);\n const merged = this._mergeCoinsInTx(tx, coins);\n const raw = BigInt(Math.floor(repayAmount * 10 ** targetAssetInfo.decimals));\n const [repayCoin] = tx.splitCoins(merged, [raw]);\n await adapter.addRepayToTx!(tx, this._address, repayCoin, target.asset);\n return tx;\n }\n\n const { tx } = await adapter.buildRepayTx(this._address, repayAmount, target.asset);\n return tx;\n });\n\n const hf = await adapter.getHealth(this._address);\n // [v0.51.1] Emit the actual asset, not always 'USDC'. Subscribers\n // rely on this event to refresh balance UIs.\n this.emitBalanceChange(target.asset, repayAmount, 'repay', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: repayAmount,\n asset: target.asset,\n remainingDebt: hf.borrowed,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n private async _repayAllBorrows(borrows: Array<{ protocolId: string; asset: string; amount: number; apy: number }>): Promise<RepayResult> {\n borrows.sort((a, b) => b.apy - a.apy);\n\n const entries: Array<{ borrow: typeof borrows[0]; adapter: LendingAdapter }> = [];\n for (const borrow of borrows) {\n const adapter = this.registry.getLending(borrow.protocolId);\n if (adapter) entries.push({ borrow, adapter });\n }\n\n const canPTB = entries.every(e => e.adapter.addRepayToTx);\n let totalRepaid = 0;\n\n const gasResult = await executeTx(this.client, this._signer, async () => {\n if (canPTB) {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n // [v0.51.1] Group borrows by asset; fetch + merge coins per asset.\n // Pre-v0.51.1 we fetched USDC coins once and tried to repay every\n // borrow (including USDsui) from the same merged USDC. That works\n // when every borrow happens to be USDC; it silently breaks the\n // moment USDsui (or any other allowed borrow asset) appears.\n const assetMerged = new Map<string, TransactionObjectArgument>();\n const uniqueAssets = Array.from(new Set(entries.map((e) => e.borrow.asset)));\n for (const asset of uniqueAssets) {\n const info = SUPPORTED_ASSETS[asset as SupportedAsset];\n if (!info) throw new T2000Error('ASSET_NOT_SUPPORTED', `Cannot repay unknown asset: ${asset}`);\n const coins = await this._fetchCoins(info.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${info.displayName} coins for repayment`);\n assetMerged.set(asset, this._mergeCoinsInTx(tx, coins));\n }\n\n for (const { borrow, adapter } of entries) {\n const info = SUPPORTED_ASSETS[borrow.asset as SupportedAsset]!;\n const merged = assetMerged.get(borrow.asset)!;\n const raw = BigInt(Math.floor(borrow.amount * 10 ** info.decimals));\n const [repayCoin] = tx.splitCoins(merged, [raw]);\n await adapter.addRepayToTx!(tx, this._address, repayCoin, borrow.asset);\n totalRepaid += borrow.amount;\n }\n\n return tx;\n }\n\n let lastTx: Transaction | undefined;\n for (const { borrow, adapter } of entries) {\n const { tx } = await adapter.buildRepayTx(this._address, borrow.amount, borrow.asset);\n lastTx = tx;\n totalRepaid += borrow.amount;\n }\n return lastTx!;\n });\n\n const firstAdapter = entries[0]?.adapter;\n const hf = firstAdapter ? await firstAdapter.getHealth(this._address) : { borrowed: 0 };\n // [v0.51.1] Mixed-asset repay-all emits a 'repay' event per dominant\n // asset (largest by amount). Single-asset case still fires correctly.\n const dominantAsset = entries\n .reduce((acc, e) => acc.amount >= e.borrow.amount ? acc : e.borrow, entries[0]?.borrow ?? { asset: 'USDC', amount: 0 })\n .asset;\n this.emitBalanceChange(dominantAsset, totalRepaid, 'repay', gasResult.digest);\n\n return {\n success: true,\n tx: gasResult.digest,\n amount: totalRepaid,\n asset: dominantAsset,\n remainingDebt: hf.borrowed,\n gasCost: gasResult.gasCostSui,\n };\n }\n\n async maxBorrow(): Promise<MaxBorrowResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'borrow');\n return adapter.maxBorrow(this._address, 'USDC');\n }\n\n async healthFactor(): Promise<HealthFactorResult> {\n const adapter = await this.resolveLending(undefined, 'USDC', 'save');\n const hf = await adapter.getHealth(this._address);\n\n if (hf.healthFactor < 1.2) {\n this.emit('healthCritical', { healthFactor: hf.healthFactor, threshold: 1.5, severity: 'critical' });\n } else if (hf.healthFactor < 2.0) {\n this.emit('healthWarning', { healthFactor: hf.healthFactor, threshold: 2.0, severity: 'warning' });\n }\n\n return hf;\n }\n\n // -- Claim Rewards --\n\n async getPendingRewards(): Promise<PendingReward[]> {\n const adapters = this.registry.listLending().filter((a) => a.getPendingRewards);\n if (adapters.length === 0) return [];\n\n const results = await Promise.allSettled(\n adapters.map((a) => a.getPendingRewards!(this._address)),\n );\n const all: PendingReward[] = [];\n const errors: unknown[] = [];\n for (const r of results) {\n if (r.status === 'fulfilled') all.push(...r.value);\n else errors.push(r.reason);\n }\n // [S18-F20] If every adapter failed and we have nothing to show,\n // propagate the first error so the engine tool can surface\n // \"NAVI degraded\" instead of narrating \"no pending rewards\"\n // (a false negative). Today there is only one claim-capable adapter\n // (NAVI), so this collapses to \"if NAVI threw, throw\"; the loop\n // shape preserves graceful partial degradation when a 2nd adapter\n // (e.g. Suilend) lands.\n if (all.length === 0 && errors.length === adapters.length) {\n const first = errors[0];\n throw first instanceof Error ? first : new Error(String(first));\n }\n return all;\n }\n\n async claimRewards(): Promise<ClaimRewardsResult> {\n this.enforcer.assertNotLocked();\n\n const adapters = this.registry.listLending().filter((a) => a.addClaimRewardsToTx);\n if (adapters.length === 0) {\n return { success: true, tx: '', rewards: [], totalValueUsd: 0, gasCost: 0 };\n }\n\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const allRewards: PendingReward[] = [];\n const errors: unknown[] = [];\n for (const adapter of adapters) {\n try {\n const claimed = await adapter.addClaimRewardsToTx!(tx, this._address);\n allRewards.push(...claimed);\n } catch (err) {\n errors.push(err);\n }\n }\n\n // [S18-F20] Propagate degradation when every adapter failed AND we\n // have nothing to claim. See `getPendingRewards` for the full\n // rationale — silent skip here was a primary contributor to the\n // engine narrating \"no pending rewards\" during NAVI degradation.\n if (allRewards.length === 0 && errors.length === adapters.length) {\n const first = errors[0];\n throw first instanceof Error ? first : new Error(String(first));\n }\n\n if (allRewards.length === 0) {\n return { success: true, tx: '', rewards: [], totalValueUsd: 0, gasCost: 0 };\n }\n\n const claimResult = await executeTx(this.client, this._signer, async () => tx);\n await this.client.waitForTransaction({ digest: claimResult.digest });\n\n const totalValueUsd = allRewards.reduce((s, r) => s + r.estimatedValueUsd, 0);\n\n return {\n success: true,\n tx: claimResult.digest,\n rewards: allRewards,\n totalValueUsd,\n gasCost: claimResult.gasCostSui,\n };\n }\n\n /**\n * Claim pending rewards, swap non-USDC tokens to USDC via Cetus, and deposit into NAVI.\n * Multi-step: claim (transfers to wallet) -> swap each reward token to USDC -> deposit USDC.\n * Minimum threshold: skips if total rewards < $0.10 (gas not worth it).\n */\n async compoundRewards(options: { minValueUsd?: number } = {}): Promise<CompoundRewardsResult> {\n this.enforcer.assertNotLocked();\n const minValue = options.minValueUsd ?? 0.10;\n const USDC_TYPE = SUPPORTED_ASSETS.USDC.type;\n const USDC_DEC = SUPPORTED_ASSETS.USDC.decimals;\n\n const pending = await this.getPendingRewards();\n const nonTrivial = pending.filter((r) => r.amount > 0);\n if (nonTrivial.length === 0) {\n return {\n success: true, claimTx: '', swapTxs: [], depositTx: '',\n rewards: pending, totalCompoundedUsdc: 0, totalGasCost: 0,\n };\n }\n\n const totalPendingUsd = pending.reduce((s, r) => s + r.estimatedValueUsd, 0);\n if (totalPendingUsd > 0 && totalPendingUsd < minValue) {\n return {\n success: true, claimTx: '', swapTxs: [], depositTx: '',\n rewards: pending, totalCompoundedUsdc: 0, totalGasCost: 0,\n };\n }\n\n // Snapshot USDC balance before compounding to scope deposit correctly\n const preUsdcCoins = await this._fetchCoins(USDC_TYPE);\n const preUsdcRaw = preUsdcCoins.reduce((s, c) => s + BigInt(c.balance), 0n);\n\n // Step 1: Claim — transfers reward tokens to wallet\n const claimResult = await this.claimRewards();\n if (!claimResult.tx) {\n return {\n success: false, claimTx: '', swapTxs: [], depositTx: '',\n rewards: pending, totalCompoundedUsdc: 0, totalGasCost: 0,\n };\n }\n\n // Step 2: Swap each non-USDC reward token to USDC via Cetus\n const { findSwapRoute, buildSwapTx } = await import('./protocols/cetus-swap.js');\n const swapTxs: string[] = [];\n let totalGasCost = claimResult.gasCost;\n\n for (const reward of nonTrivial) {\n if (!reward.coinType) continue;\n if (reward.coinType === USDC_TYPE) continue;\n\n try {\n const decimals = getDecimalsForCoinType(reward.coinType) ?? 9;\n const rawAmount = BigInt(Math.floor(reward.amount * 10 ** decimals));\n if (rawAmount <= 0n) continue;\n\n const coins = await this._fetchCoins(reward.coinType);\n if (coins.length === 0) continue;\n\n const route = await findSwapRoute({\n walletAddress: this._address,\n from: reward.coinType,\n to: USDC_TYPE,\n amount: rawAmount,\n byAmountIn: true,\n });\n\n if (!route || route.insufficientLiquidity) continue;\n\n const swapResult = await executeTx(this.client, this._signer, async () => {\n const tx = new Transaction();\n tx.setSender(this._address);\n\n const freshCoins = await this._fetchCoins(reward.coinType);\n if (freshCoins.length === 0) return tx;\n\n const merged = this._mergeCoinsInTx(tx, freshCoins);\n const [inputCoin] = tx.splitCoins(merged, [rawAmount]);\n\n const outputCoin = await buildSwapTx({\n walletAddress: this._address,\n route,\n tx,\n inputCoin,\n slippage: 0.01,\n });\n\n tx.transferObjects([outputCoin], this._address);\n return tx;\n });\n\n swapTxs.push(swapResult.digest);\n totalGasCost += swapResult.gasCostSui;\n } catch (err) {\n console.warn(`[compound] Failed to swap ${reward.symbol}:`, err instanceof Error ? err.message : err);\n }\n }\n\n // Step 3: Deposit only the NEW USDC gained from compounding (not pre-existing balance)\n const postUsdcCoins = await this._fetchCoins(USDC_TYPE);\n const postUsdcRaw = postUsdcCoins.reduce((s, c) => s + BigInt(c.balance), 0n);\n const gainedRaw = postUsdcRaw > preUsdcRaw ? postUsdcRaw - preUsdcRaw : 0n;\n const depositUsdc = Number(gainedRaw) / 10 ** USDC_DEC;\n\n let depositTx = '';\n if (gainedRaw > 0n) {\n try {\n const adapter = await this.resolveLending(undefined, 'USDC', 'save');\n const depositResult = await executeTx(this.client, this._signer, async () => {\n const tx = new Transaction();\n tx.setSender(this._address);\n const coins = await this._fetchCoins(USDC_TYPE);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No USDC coins after swap');\n const merged = this._mergeCoinsInTx(tx, coins);\n const [inputCoin] = tx.splitCoins(merged, [gainedRaw]);\n await adapter.addSaveToTx!(tx, this._address, inputCoin, 'USDC');\n return tx;\n });\n depositTx = depositResult.digest;\n totalGasCost += depositResult.gasCostSui;\n } catch (err) {\n console.warn('[compound] NAVI deposit failed:', err instanceof Error ? err.message : err);\n }\n }\n\n const hasSubstantiveResult = swapTxs.length > 0 || depositTx !== '';\n return {\n success: hasSubstantiveResult,\n claimTx: claimResult.tx,\n swapTxs,\n depositTx,\n rewards: nonTrivial,\n totalCompoundedUsdc: depositUsdc,\n totalGasCost,\n };\n }\n\n // -- Info --\n\n async positions(): Promise<PositionsResult> {\n const allPositions = await this.registry.allPositions(this._address);\n const positions = allPositions.flatMap(p =>\n [\n ...p.positions.supplies\n .filter(s => s.amount > 0.005)\n .map(s => ({\n protocol: p.protocolId,\n asset: s.asset,\n type: 'save' as const,\n amount: s.amount,\n amountUsd: s.amountUsd,\n apy: s.apy,\n })),\n ...p.positions.borrows\n .filter(b => b.amount > 0.005)\n .map(b => ({\n protocol: p.protocolId,\n asset: b.asset,\n type: 'borrow' as const,\n amount: b.amount,\n amountUsd: b.amountUsd,\n apy: b.apy,\n })),\n ],\n );\n return { positions };\n }\n\n async rates(): Promise<RatesResult> {\n const allRatesResult = await this.registry.allRatesAcrossAssets();\n const result: RatesResult = {};\n for (const entry of allRatesResult) {\n if (!result[entry.asset] || entry.rates.saveApy > result[entry.asset].saveApy) {\n result[entry.asset] = { saveApy: entry.rates.saveApy, borrowApy: entry.rates.borrowApy };\n }\n }\n if (!result.USDC) result.USDC = { saveApy: 0, borrowApy: 0 };\n return result;\n }\n\n async allRates(asset = 'USDC') {\n return this.registry.allRates(asset);\n }\n\n async allRatesAcrossAssets() {\n return this.registry.allRatesAcrossAssets();\n }\n\n async earnings(): Promise<EarningsResult> {\n const result = await yieldTracker.getEarnings(this.client, this._address);\n\n if (result.totalYieldEarned > 0) {\n this.emit('yield', {\n earned: result.dailyEarning,\n total: result.totalYieldEarned,\n apy: result.currentApy / 100,\n timestamp: Date.now(),\n });\n }\n\n return result;\n }\n\n async fundStatus(): Promise<FundStatusResult> {\n return yieldTracker.getFundStatus(this.client, this._address);\n }\n\n // -- Helpers --\n\n private async resolveLending(protocol: string | undefined, asset: string, capability: 'save' | 'withdraw' | 'borrow' | 'repay'): Promise<LendingAdapter> {\n if (protocol) {\n const adapter = this.registry.getLending(protocol);\n if (!adapter) throw new T2000Error('ASSET_NOT_SUPPORTED', `Lending adapter '${protocol}' not found`);\n return adapter;\n }\n\n if (capability === 'save') {\n const { adapter } = await this.registry.bestSaveRate(asset);\n return adapter;\n }\n\n if (capability === 'borrow' || capability === 'repay') {\n const adapters = this.registry.listLending().filter(\n a => a.supportedAssets.includes(asset) &&\n a.capabilities.includes(capability) &&\n (capability !== 'borrow' || a.supportsSameAssetBorrow),\n );\n if (adapters.length === 0) {\n const alternatives = this.registry.listLending().filter(\n a => a.capabilities.includes(capability) &&\n (capability !== 'borrow' || a.supportsSameAssetBorrow),\n );\n if (alternatives.length > 0) {\n const altList = alternatives.map(a => a.name).join(', ');\n const altAssets = [...new Set(alternatives.flatMap(a => [...a.supportedAssets]))].join(', ');\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No protocol supports ${capability} for ${asset}. Available for ${capability}: ${altList} (assets: ${altAssets})`);\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No adapter supports ${capability} ${asset}`);\n }\n return adapters[0];\n }\n\n const adapters = this.registry.listLending().filter(\n a => a.supportedAssets.includes(asset) && a.capabilities.includes(capability),\n );\n if (adapters.length === 0) {\n const alternatives = this.registry.listLending().filter(\n a => a.capabilities.includes(capability),\n );\n if (alternatives.length > 0) {\n const altList = alternatives.map(a => `${a.name} (${[...a.supportedAssets].join(', ')})`).join('; ');\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No protocol supports ${capability} for ${asset}. Try: ${altList}`);\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No adapter supports ${capability} ${asset}`);\n }\n return adapters[0];\n }\n\n private emitBalanceChange(asset: string, amount: number, cause: string, tx?: string): void {\n this.emit('balanceChange', { asset, previous: 0, current: 0, cause, tx });\n }\n}\n\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n// Helper utility: write number as an ULEB array.\n// Original code is taken from: https://www.npmjs.com/package/uleb128 (no longer exists)\nexport function ulebEncode(num: number | bigint): number[] {\n\tlet bigNum = BigInt(num);\n\tconst arr: number[] = [];\n\tlet len = 0;\n\n\tif (bigNum === 0n) {\n\t\treturn [0];\n\t}\n\n\twhile (bigNum > 0) {\n\t\tarr[len] = Number(bigNum & 0x7fn);\n\t\tbigNum >>= 7n;\n\t\tif (bigNum > 0n) {\n\t\t\tarr[len] |= 0x80;\n\t\t}\n\t\tlen += 1;\n\t}\n\n\treturn arr;\n}\n\n// Helper utility: decode ULEB as an array of numbers.\n// Original code is taken from: https://www.npmjs.com/package/uleb128 (no longer exists)\nexport function ulebDecode(arr: number[] | Uint8Array): {\n\tvalue: number;\n\tlength: number;\n} {\n\tlet total = 0n;\n\tlet shift = 0n;\n\tlet len = 0;\n\n\twhile (true) {\n\t\tif (len >= arr.length) {\n\t\t\tthrow new Error('ULEB decode error: buffer overflow');\n\t\t}\n\n\t\tconst byte = arr[len];\n\t\tlen += 1;\n\t\ttotal += BigInt(byte & 0x7f) << shift;\n\t\tif ((byte & 0x80) === 0) {\n\t\t\tbreak;\n\t\t}\n\t\tshift += 7n;\n\t}\n\n\t// TODO: return bigint in next major version\n\tif (total > BigInt(Number.MAX_SAFE_INTEGER)) {\n\t\tthrow new Error('ULEB decode error: value exceeds MAX_SAFE_INTEGER');\n\t}\n\n\treturn {\n\t\tvalue: Number(total),\n\t\tlength: len,\n\t};\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { ulebDecode } from './uleb.js';\n\n/**\n * Class used for reading BCS data chunk by chunk. Meant to be used\n * by some wrapper, which will make sure that data is valid and is\n * matching the desired format.\n *\n * @example\n * // data for this example is:\n * // { a: u8, b: u32, c: bool, d: u64 }\n *\n * let reader = new BcsReader(\"647f1a060001ffffe7890423c78a050102030405\");\n * let field1 = reader.read8();\n * let field2 = reader.read32();\n * let field3 = reader.read8() === '1'; // bool\n * let field4 = reader.read64();\n * // ....\n *\n * Reading vectors is another deal in bcs. To read a vector, you first need to read\n * its length using {@link readULEB}. Here's an example:\n * @example\n * // data encoded: { field: [1, 2, 3, 4, 5] }\n * let reader = new BcsReader(\"050102030405\");\n * let vec_length = reader.readULEB();\n * let elements = [];\n * for (let i = 0; i < vec_length; i++) {\n * elements.push(reader.read8());\n * }\n * console.log(elements); // [1,2,3,4,5]\n *\n * @param {String} data HEX-encoded data (serialized BCS)\n */\nexport class BcsReader {\n\tprivate dataView: DataView;\n\tprivate bytePosition: number = 0;\n\n\t/**\n\t * @param {Uint8Array} data Data to use as a buffer.\n\t */\n\tconstructor(data: Uint8Array) {\n\t\tthis.dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\t}\n\t/**\n\t * Shift current cursor position by `bytes`.\n\t *\n\t * @param {Number} bytes Number of bytes to\n\t * @returns {this} Self for possible chaining.\n\t */\n\tshift(bytes: number) {\n\t\tthis.bytePosition += bytes;\n\t\treturn this;\n\t}\n\t/**\n\t * Read U8 value from the buffer and shift cursor by 1.\n\t * @returns\n\t */\n\tread8(): number {\n\t\tconst value = this.dataView.getUint8(this.bytePosition);\n\t\tthis.shift(1);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U16 value from the buffer and shift cursor by 2.\n\t * @returns\n\t */\n\tread16(): number {\n\t\tconst value = this.dataView.getUint16(this.bytePosition, true);\n\t\tthis.shift(2);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U32 value from the buffer and shift cursor by 4.\n\t * @returns\n\t */\n\tread32(): number {\n\t\tconst value = this.dataView.getUint32(this.bytePosition, true);\n\t\tthis.shift(4);\n\t\treturn value;\n\t}\n\t/**\n\t * Read U64 value from the buffer and shift cursor by 8.\n\t * @returns\n\t */\n\tread64(): string {\n\t\tconst value1 = this.read32();\n\t\tconst value2 = this.read32();\n\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(8, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read U128 value from the buffer and shift cursor by 16.\n\t */\n\tread128(): string {\n\t\tconst value1 = BigInt(this.read64());\n\t\tconst value2 = BigInt(this.read64());\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(16, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read U128 value from the buffer and shift cursor by 32.\n\t * @returns\n\t */\n\tread256(): string {\n\t\tconst value1 = BigInt(this.read128());\n\t\tconst value2 = BigInt(this.read128());\n\t\tconst result = value2.toString(16) + value1.toString(16).padStart(32, '0');\n\n\t\treturn BigInt('0x' + result).toString(10);\n\t}\n\t/**\n\t * Read `num` number of bytes from the buffer and shift cursor by `num`.\n\t * @param num Number of bytes to read.\n\t */\n\treadBytes(num: number): Uint8Array {\n\t\tconst start = this.bytePosition + this.dataView.byteOffset;\n\t\tconst value = new Uint8Array(this.dataView.buffer, start, num);\n\n\t\tthis.shift(num);\n\n\t\treturn value;\n\t}\n\t/**\n\t * Read ULEB value - an integer of varying size. Used for enum indexes and\n\t * vector lengths.\n\t * @returns {Number} The ULEB value.\n\t */\n\treadULEB(): number {\n\t\tconst start = this.bytePosition + this.dataView.byteOffset;\n\t\tconst buffer = new Uint8Array(this.dataView.buffer, start);\n\t\tconst { value, length } = ulebDecode(buffer);\n\n\t\tthis.shift(length);\n\n\t\treturn value;\n\t}\n\t/**\n\t * Read a BCS vector: read a length and then apply function `cb` X times\n\t * where X is the length of the vector, defined as ULEB in BCS bytes.\n\t * @param cb Callback to process elements of vector.\n\t * @returns {Array<Any>} Array of the resulting values, returned by callback.\n\t */\n\treadVec(cb: (reader: BcsReader, i: number, length: number) => any): any[] {\n\t\tconst length = this.readULEB();\n\t\tconst result = [];\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tresult.push(cb(this, i, length));\n\t\t}\n\t\treturn result;\n\t}\n}\n","/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder<F, T> {\n encode(from: F): T;\n decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder<Uint8Array, string> {\n encode: (data: Uint8Array) => string;\n decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n if (!Array.isArray(arr)) return false;\n if (arr.length === 0) return true;\n if (isString) {\n return arr.every((item) => typeof item === 'string');\n } else {\n return arr.every((item) => Number.isSafeInteger(item));\n }\n}\n\nfunction afn(input: Function): input is Function {\n if (typeof input !== 'function') throw new Error('function expected');\n return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n return true;\n}\n\nfunction anumber(n: number): void {\n if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like <string, number>, <number, bytes>, <bytes, float>\ntype Chain = [Coder<any, any>, ...Coder<any, any>[]];\n// Extract info from Coder type\ntype Input<F> = F extends Coder<infer T, any> ? T : never;\ntype Output<F> = F extends Coder<any, infer T> ? T : never;\n// Generic function for arrays\ntype First<T> = T extends [infer U, ...any[]] ? U : never;\ntype Last<T> = T extends [...any[], infer U] ? U : never;\ntype Tail<T> = T extends [any, ...infer U] ? U : never;\n\ntype AsChain<C extends Chain, Rest = Tail<C>> = {\n // C[K] = Coder<Input<C[K]>, Input<Rest[k]>>\n [K in keyof C]: Coder<Input<C[K]>, Input<K extends keyof Rest ? Rest[K] : any>>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain<T extends Chain & AsChain<T>>(...args: T): Coder<Input<First<T>>, Output<Last<T>>> {\n const id = (a: any) => a;\n // Wrap call in closure so JIT can inline calls\n const wrap = (a: any, b: any) => (c: any) => a(b(c));\n // Construct chain of args[-1].encode(args[-2].encode([...]))\n const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n // Construct chain of args[0].decode(args[1].decode(...))\n const decode = args.map((x) => x.decode).reduce(wrap, id);\n return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder<number[], string[]> {\n // mapping 1 to \"b\"\n const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n const len = lettersA.length;\n astrArr('alphabet', lettersA);\n\n // mapping \"b\" to 1\n const indexes = new Map(lettersA.map((l, i) => [l, i]));\n return {\n encode: (digits: number[]) => {\n aArr(digits);\n return digits.map((i) => {\n if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n throw new Error(\n `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n );\n return lettersA[i]!;\n });\n },\n decode: (input: string[]): number[] => {\n aArr(input);\n return input.map((letter) => {\n astr('alphabet.decode', letter);\n const i = indexes.get(letter);\n if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n return i;\n });\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder<string[], string> {\n astr('join', separator);\n return {\n encode: (from) => {\n astrArr('join.decode', from);\n return from.join(separator);\n },\n decode: (to) => {\n astr('join.decode', to);\n return to.split(separator);\n },\n };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder<string[], string[]> {\n anumber(bits);\n astr('padding', chr);\n return {\n encode(data: string[]): string[] {\n astrArr('padding.encode', data);\n while ((data.length * bits) % 8) data.push(chr);\n return data;\n },\n decode(input: string[]): string[] {\n astrArr('padding.decode', input);\n let end = input.length;\n if ((end * bits) % 8)\n throw new Error('padding: invalid, string should have whole number of bytes');\n for (; end > 0 && input[end - 1] === chr; end--) {\n const last = end - 1;\n const byte = last * bits;\n if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n }\n return input.slice(0, end);\n },\n };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize<T>(fn: (val: T) => T): Coder<T, T> {\n afn(fn);\n return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n // base 1 is impossible\n if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n aArr(data);\n if (!data.length) return [];\n let pos = 0;\n const res = [];\n const digits = Array.from(data, (d) => {\n anumber(d);\n if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n return d;\n });\n const dlen = digits.length;\n while (true) {\n let carry = 0;\n let done = true;\n for (let i = pos; i < dlen; i++) {\n const digit = digits[i]!;\n const fromCarry = from * carry;\n const digitBase = fromCarry + digit;\n if (\n !Number.isSafeInteger(digitBase) ||\n fromCarry / from !== carry ||\n digitBase - digit !== fromCarry\n ) {\n throw new Error('convertRadix: carry overflow');\n }\n const div = digitBase / to;\n carry = digitBase % to;\n const rounded = Math.floor(div);\n digits[i] = rounded;\n if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n throw new Error('convertRadix: carry overflow');\n if (!done) continue;\n else if (!rounded) pos = i;\n else done = false;\n }\n res.push(carry);\n if (done) break;\n }\n for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n let res = [];\n for (let i = 0; i < 40; i++) res.push(2 ** i);\n return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n aArr(data);\n if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n if (radix2carry(from, to) > 32) {\n throw new Error(\n `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n );\n }\n let carry = 0;\n let pos = 0; // bitwise position in current element\n const max = powers[from]!;\n const mask = powers[to]! - 1;\n const res: number[] = [];\n for (const n of data) {\n anumber(n);\n if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n carry = (carry << from) | n;\n if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n pos += from;\n for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n const pow = powers[pos];\n if (pow === undefined) throw new Error('invalid carry');\n carry &= pow - 1; // clean carry, otherwise it will cause overflow\n }\n carry = (carry << (to - pos)) & mask;\n if (!padding && pos >= from) throw new Error('Excess padding');\n if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n if (padding && pos > 0) res.push(carry >>> 0);\n return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder<Uint8Array, number[]> {\n anumber(num);\n const _256 = 2 ** 8;\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n return convertRadix(Array.from(bytes), _256, num);\n },\n decode: (digits: number[]) => {\n anumArr('radix.decode', digits);\n return Uint8Array.from(convertRadix(digits, num, _256));\n },\n };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder<Uint8Array, number[]> {\n anumber(bits);\n if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n throw new Error('radix2: carry overflow');\n return {\n encode: (bytes: Uint8Array) => {\n if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n },\n decode: (digits: number[]) => {\n anumArr('radix2.decode', digits);\n return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n },\n };\n}\n\ntype ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper<T extends (...args: any) => any>(fn: T) {\n afn(fn);\n return function (...args: ArgumentTypes<T>): ReturnType<T> | void {\n try {\n return fn.apply(null, args);\n } catch (e) {}\n };\n}\n\nfunction checksum(\n len: number,\n fn: (data: Uint8Array) => Uint8Array\n): Coder<Uint8Array, Uint8Array> {\n anumber(len);\n afn(fn);\n return {\n encode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n const sum = fn(data).slice(0, len);\n const res = new Uint8Array(data.length + len);\n res.set(data);\n res.set(sum, data.length);\n return res;\n },\n decode(data: Uint8Array) {\n if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n const payload = data.slice(0, -len);\n const oldChecksum = data.slice(-len);\n const newChecksum = fn(payload).slice(0, len);\n for (let i = 0; i < len; i++)\n if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n return payload;\n },\n };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n radix2(5),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n padding(5),\n join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n radix2(5),\n alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n join(''),\n normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n astr('base64', s);\n const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n const alphabet = isUrl ? 'base64url' : 'base64';\n if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64(); },\n decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n padding(6),\n join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n padding(6),\n join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n radix2(6),\n alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n encode(data: Uint8Array) {\n let res = '';\n for (let i = 0; i < data.length; i += 8) {\n const block = data.subarray(i, i + 8);\n res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n }\n return res;\n },\n decode(str: string) {\n let res: number[] = [];\n for (let i = 0; i < str.length; i += 11) {\n const slice = str.slice(i, i + 11);\n const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n const block = base58.decode(slice);\n for (let j = 0; j < block.length - blockLen; j++) {\n if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n }\n res = res.concat(Array.from(block.slice(block.length - blockLen)));\n }\n return Uint8Array.from(res);\n },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n chain(\n checksum(4, (data) => sha256(sha256(data))),\n base58\n );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n}\nexport interface Bech32DecodedWithArray<Prefix extends string = string> {\n prefix: Prefix;\n words: number[];\n bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder<number[], string> = chain(\n alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n const b = pre >> 25;\n let chk = (pre & 0x1ffffff) << 5;\n for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n }\n return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n const len = prefix.length;\n let chk = 1;\n for (let i = 0; i < len; i++) {\n const c = prefix.charCodeAt(i);\n if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n chk = bech32Polymod(chk) ^ (c >> 5);\n }\n chk = bech32Polymod(chk);\n for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n for (let v of words) chk = bech32Polymod(chk) ^ v;\n for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n chk ^= encodingConst;\n return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit?: number | false\n ): `${Lowercase<Prefix>}1${string}`;\n decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n decodeToBytes(str: string): Bech32DecodedWithArray;\n decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded<string>;\n fromWords(to: number[]): Uint8Array;\n fromWordsUnsafe(to: number[]): void | Uint8Array;\n toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n const _words = radix2(5);\n const fromWords = _words.decode;\n const toWords = _words.encode;\n const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n function encode<Prefix extends string>(\n prefix: Prefix,\n words: number[] | Uint8Array,\n limit: number | false = 90\n ): `${Lowercase<Prefix>}1${string}` {\n astr('bech32.encode prefix', prefix);\n if (isBytes(words)) words = Array.from(words);\n anumArr('bech32.encode', words);\n const plen = prefix.length;\n if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n const actualLength = plen + 7 + words.length;\n if (limit !== false && actualLength > limit)\n throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n const lowered = prefix.toLowerCase();\n const sum = bechChecksum(lowered, words, ENCODING_CONST);\n return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase<Prefix>}1${string}`;\n }\n\n function decode<Prefix extends string>(\n str: `${Prefix}1${string}`,\n limit?: number | false\n ): Bech32Decoded<Prefix>;\n function decode(str: string, limit?: number | false): Bech32Decoded;\n function decode(str: string, limit: number | false = 90): Bech32Decoded {\n astr('bech32.decode input', str);\n const slen = str.length;\n if (slen < 8 || (limit !== false && slen > limit))\n throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n // don't allow mixed case\n const lowered = str.toLowerCase();\n if (str !== lowered && str !== str.toUpperCase())\n throw new Error(`String must be lowercase or uppercase`);\n const sepIndex = lowered.lastIndexOf('1');\n if (sepIndex === 0 || sepIndex === -1)\n throw new Error(`Letter \"1\" must be present between prefix and data only`);\n const prefix = lowered.slice(0, sepIndex);\n const data = lowered.slice(sepIndex + 1);\n if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n const words = BECH_ALPHABET.decode(data).slice(0, -6);\n const sum = bechChecksum(prefix, words, ENCODING_CONST);\n if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n return { prefix, words };\n }\n\n const decodeUnsafe = unsafeWrapper(decode);\n\n function decodeToBytes(str: string): Bech32DecodedWithArray {\n const { prefix, words } = decode(str, false);\n return { prefix, words, bytes: fromWords(words) };\n }\n\n function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n return encode(prefix, toWords(bytes));\n }\n\n return {\n encode,\n decode,\n encodeFromBytes,\n decodeToBytes,\n decodeUnsafe,\n fromWords,\n fromWordsUnsafe,\n toWords,\n };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n encode: (data) => new TextDecoder().decode(data),\n decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n typeof (Uint8Array as any).from([]).toHex === 'function' &&\n typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n encode(data) { abytes(data); return (data as any).toHex(); },\n decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n ? hexBuiltin\n : chain(\n radix2(4),\n alphabet('0123456789abcdef'),\n join(''),\n normalize((s: string) => {\n if (typeof s !== 'string' || s.length % 2 !== 0)\n throw new TypeError(\n `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n );\n return s.toLowerCase();\n })\n );\n\nexport type SomeCoders = {\n utf8: BytesCoder;\n hex: BytesCoder;\n base16: BytesCoder;\n base32: BytesCoder;\n base64: BytesCoder;\n base64url: BytesCoder;\n base58: BytesCoder;\n base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { base58 } from '@scure/base';\n\nexport const toBase58 = (buffer: Uint8Array) => base58.encode(buffer);\nexport const fromBase58 = (str: string) => base58.decode(str) as Uint8Array<ArrayBuffer>;\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport function fromBase64(base64String: string): Uint8Array<ArrayBuffer> {\n\treturn Uint8Array.from(atob(base64String), (char) => char.charCodeAt(0));\n}\n\nconst CHUNK_SIZE = 8192;\nexport function toBase64(bytes: Uint8Array): string {\n\t// Special-case the simple case for speed's sake.\n\tif (bytes.length < CHUNK_SIZE) {\n\t\treturn btoa(String.fromCharCode(...bytes));\n\t}\n\n\tlet output = '';\n\tfor (var i = 0; i < bytes.length; i += CHUNK_SIZE) {\n\t\tconst chunk = bytes.slice(i, i + CHUNK_SIZE);\n\t\toutput += String.fromCharCode(...chunk);\n\t}\n\n\treturn btoa(output);\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport function fromHex(hexStr: string): Uint8Array<ArrayBuffer> {\n\tconst normalized = hexStr.startsWith('0x') ? hexStr.slice(2) : hexStr;\n\tconst padded = normalized.length % 2 === 0 ? normalized : `0${normalized}`;\n\tconst intArr = padded.match(/[0-9a-fA-F]{2}/g)?.map((byte) => parseInt(byte, 16)) ?? [];\n\n\tif (intArr.length !== padded.length / 2) {\n\t\tthrow new Error(`Invalid hex string ${hexStr}`);\n\t}\n\n\treturn Uint8Array.from(intArr);\n}\n\nexport function toHex(bytes: Uint8Array): string {\n\treturn bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase58, fromBase64, fromHex, toBase58, toBase64, toHex } from '@mysten/utils';\nimport type { Encoding } from './types.js';\n\n/**\n * Encode data with either `hex` or `base64`.\n *\n * @param {Uint8Array} data Data to encode.\n * @param {String} encoding Encoding to use: base64 or hex\n * @returns {String} Encoded value.\n */\nexport function encodeStr(data: Uint8Array, encoding: Encoding): string {\n\tswitch (encoding) {\n\t\tcase 'base58':\n\t\t\treturn toBase58(data);\n\t\tcase 'base64':\n\t\t\treturn toBase64(data);\n\t\tcase 'hex':\n\t\t\treturn toHex(data);\n\t\tdefault:\n\t\t\tthrow new Error('Unsupported encoding, supported values are: base64, hex');\n\t}\n}\n\n/**\n * Decode either `base64` or `hex` data.\n *\n * @param {String} data Data to encode.\n * @param {String} encoding Encoding to use: base64 or hex\n * @returns {Uint8Array} Encoded value.\n */\nexport function decodeStr(data: string, encoding: Encoding): Uint8Array {\n\tswitch (encoding) {\n\t\tcase 'base58':\n\t\t\treturn fromBase58(data);\n\t\tcase 'base64':\n\t\t\treturn fromBase64(data);\n\t\tcase 'hex':\n\t\t\treturn fromHex(data);\n\t\tdefault:\n\t\t\tthrow new Error('Unsupported encoding, supported values are: base64, hex');\n\t}\n}\n\nexport function splitGenericParameters(\n\tstr: string,\n\tgenericSeparators: [string, string] = ['<', '>'],\n) {\n\tconst [left, right] = genericSeparators;\n\tconst tok = [];\n\tlet word = '';\n\tlet nestedAngleBrackets = 0;\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst char = str[i];\n\t\tif (char === left) {\n\t\t\tnestedAngleBrackets++;\n\t\t}\n\t\tif (char === right) {\n\t\t\tnestedAngleBrackets--;\n\t\t}\n\t\tif (nestedAngleBrackets === 0 && char === ',') {\n\t\t\ttok.push(word.trim());\n\t\t\tword = '';\n\t\t\tcontinue;\n\t\t}\n\t\tword += char;\n\t}\n\n\ttok.push(word.trim());\n\n\treturn tok;\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Encoding } from './types.js';\nimport { ulebEncode } from './uleb.js';\nimport { encodeStr } from './utils.js';\n\nexport interface BcsWriterOptions {\n\t/** The initial size (in bytes) of the buffer tht will be allocated */\n\tinitialSize?: number;\n\t/** The maximum size (in bytes) that the buffer is allowed to grow to */\n\tmaxSize?: number;\n\t/** The amount of bytes that will be allocated whenever additional memory is required */\n\tallocateSize?: number;\n}\n\n/**\n * Class used to write BCS data into a buffer. Initializer requires\n * some size of a buffer to init; default value for this buffer is 1KB.\n *\n * Most methods are chainable, so it is possible to write them in one go.\n *\n * @example\n * let serialized = new BcsWriter()\n * .write8(10)\n * .write32(1000000)\n * .write64(10000001000000)\n * .hex();\n */\n\n/**\n * Set of methods that allows data encoding/decoding as standalone\n * BCS value or a part of a composed structure/vector.\n */\nexport class BcsWriter {\n\tprivate dataView: DataView<ArrayBuffer>;\n\tprivate bytePosition: number = 0;\n\tprivate size: number;\n\tprivate maxSize: number;\n\tprivate allocateSize: number;\n\n\tconstructor({\n\t\tinitialSize = 1024,\n\t\tmaxSize = Infinity,\n\t\tallocateSize = 1024,\n\t}: BcsWriterOptions = {}) {\n\t\tthis.size = initialSize;\n\t\tthis.maxSize = maxSize;\n\t\tthis.allocateSize = allocateSize;\n\t\tthis.dataView = new DataView(new ArrayBuffer(initialSize));\n\t}\n\n\tprivate ensureSizeOrGrow(bytes: number) {\n\t\tconst requiredSize = this.bytePosition + bytes;\n\t\tif (requiredSize > this.size) {\n\t\t\tconst nextSize = Math.min(\n\t\t\t\tthis.maxSize,\n\t\t\t\tMath.max(this.size + requiredSize, this.size + this.allocateSize),\n\t\t\t);\n\t\t\tif (requiredSize > nextSize) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Attempting to serialize to BCS, but buffer does not have enough size. Allocated size: ${this.size}, Max size: ${this.maxSize}, Required size: ${requiredSize}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.size = nextSize;\n\t\t\tconst nextBuffer = new ArrayBuffer(this.size);\n\t\t\tnew Uint8Array(nextBuffer).set(new Uint8Array(this.dataView.buffer));\n\t\t\tthis.dataView = new DataView(nextBuffer);\n\t\t}\n\t}\n\n\t/**\n\t * Shift current cursor position by `bytes`.\n\t *\n\t * @param {Number} bytes Number of bytes to\n\t * @returns {this} Self for possible chaining.\n\t */\n\tshift(bytes: number): this {\n\t\tthis.bytePosition += bytes;\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U8 value into a buffer and shift cursor position by 1.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite8(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(1);\n\t\tthis.dataView.setUint8(this.bytePosition, Number(value));\n\t\treturn this.shift(1);\n\t}\n\n\t/**\n\t * Write a U8 value into a buffer and shift cursor position by 1.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twriteBytes(bytes: Uint8Array): this {\n\t\tthis.ensureSizeOrGrow(bytes.length);\n\n\t\tfor (let i = 0; i < bytes.length; i++) {\n\t\t\tthis.dataView.setUint8(this.bytePosition + i, bytes[i]);\n\t\t}\n\n\t\treturn this.shift(bytes.length);\n\t}\n\t/**\n\t * Write a U16 value into a buffer and shift cursor position by 2.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite16(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(2);\n\t\tthis.dataView.setUint16(this.bytePosition, Number(value), true);\n\t\treturn this.shift(2);\n\t}\n\t/**\n\t * Write a U32 value into a buffer and shift cursor position by 4.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twrite32(value: number | bigint): this {\n\t\tthis.ensureSizeOrGrow(4);\n\t\tthis.dataView.setUint32(this.bytePosition, Number(value), true);\n\t\treturn this.shift(4);\n\t}\n\t/**\n\t * Write a U64 value into a buffer and shift cursor position by 8.\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite64(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 8).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U128 value into a buffer and shift cursor position by 16.\n\t *\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite128(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 16).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a U256 value into a buffer and shift cursor position by 16.\n\t *\n\t * @param {bigint} value Value to write.\n\t * @returns {this}\n\t */\n\twrite256(value: number | bigint): this {\n\t\ttoLittleEndian(BigInt(value), 32).forEach((el) => this.write8(el));\n\n\t\treturn this;\n\t}\n\t/**\n\t * Write a ULEB value into a buffer and shift cursor position by number of bytes\n\t * written.\n\t * @param {Number} value Value to write.\n\t * @returns {this}\n\t */\n\twriteULEB(value: number): this {\n\t\tulebEncode(value).forEach((el) => this.write8(el));\n\t\treturn this;\n\t}\n\t/**\n\t * Write a vector into a buffer by first writing the vector length and then calling\n\t * a callback on each passed value.\n\t *\n\t * @param {Array<Any>} vector Array of elements to write.\n\t * @param {WriteVecCb} cb Callback to call on each element of the vector.\n\t * @returns {this}\n\t */\n\twriteVec(vector: any[], cb: (writer: BcsWriter, el: any, i: number, len: number) => void): this {\n\t\tthis.writeULEB(vector.length);\n\t\tArray.from(vector).forEach((el, i) => cb(this, el, i, vector.length));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds support for iterations over the object.\n\t * @returns {Uint8Array}\n\t */\n\t// oxlint-disable-next-line require-yields\n\t*[Symbol.iterator](): Iterator<number, Iterable<number>> {\n\t\tfor (let i = 0; i < this.bytePosition; i++) {\n\t\t\tyield this.dataView.getUint8(i);\n\t\t}\n\t\treturn this.toBytes();\n\t}\n\n\t/**\n\t * Get underlying buffer taking only value bytes (in case initial buffer size was bigger).\n\t * @returns {Uint8Array} Resulting bcs.\n\t */\n\ttoBytes(): Uint8Array<ArrayBuffer> {\n\t\treturn new Uint8Array(this.dataView.buffer.slice(0, this.bytePosition));\n\t}\n\n\t/**\n\t * Represent data as 'hex' or 'base64'\n\t * @param encoding Encoding to use: 'base64' or 'hex'\n\t */\n\ttoString(encoding: Encoding): string {\n\t\treturn encodeStr(this.toBytes(), encoding);\n\t}\n}\n\nfunction toLittleEndian(bigint: bigint, size: number) {\n\tconst result = new Uint8Array(size);\n\tlet i = 0;\n\twhile (bigint > 0) {\n\t\tresult[i] = Number(bigint % BigInt(256));\n\t\tbigint = bigint / BigInt(256);\n\t\ti += 1;\n\t}\n\treturn result;\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase58, fromBase64, toBase58, toBase64, fromHex, toHex } from '@mysten/utils';\nimport { BcsReader } from './reader.js';\nimport { ulebEncode } from './uleb.js';\nimport type { BcsWriterOptions } from './writer.js';\nimport { BcsWriter } from './writer.js';\nimport type { EnumInputShape, EnumOutputShape, JoinString } from './types.js';\n\nexport interface BcsTypeOptions<T, Input = T, Name extends string = string> {\n\tname?: Name;\n\tvalidate?: (value: Input) => void;\n}\n\nexport class BcsType<T, Input = T, const Name extends string = string> {\n\t$inferType!: T;\n\t$inferInput!: Input;\n\tname: Name;\n\tread: (reader: BcsReader) => T;\n\tserializedSize: (value: Input, options?: BcsWriterOptions) => number | null;\n\tvalidate: (value: Input) => void;\n\t#write: (value: Input, writer: BcsWriter) => void;\n\t#serialize: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n\n\tconstructor(\n\t\toptions: {\n\t\t\tname: Name;\n\t\t\tread: (reader: BcsReader) => T;\n\t\t\twrite: (value: Input, writer: BcsWriter) => void;\n\t\t\tserialize?: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n\t\t\tserializedSize?: (value: Input) => number | null;\n\t\t\tvalidate?: (value: Input) => void;\n\t\t} & BcsTypeOptions<T, Input, Name>,\n\t) {\n\t\tthis.name = options.name;\n\t\tthis.read = options.read;\n\t\tthis.serializedSize = options.serializedSize ?? (() => null);\n\t\tthis.#write = options.write;\n\t\tthis.#serialize =\n\t\t\toptions.serialize ??\n\t\t\t((value, options) => {\n\t\t\t\tconst writer = new BcsWriter({\n\t\t\t\t\tinitialSize: this.serializedSize(value) ?? undefined,\n\t\t\t\t\t...options,\n\t\t\t\t});\n\t\t\t\tthis.#write(value, writer);\n\t\t\t\treturn writer.toBytes();\n\t\t\t});\n\n\t\tthis.validate = options.validate ?? (() => {});\n\t}\n\n\twrite(value: Input, writer: BcsWriter) {\n\t\tthis.validate(value);\n\t\tthis.#write(value, writer);\n\t}\n\n\tserialize(value: Input, options?: BcsWriterOptions) {\n\t\tthis.validate(value);\n\t\treturn new SerializedBcs(this, this.#serialize(value, options));\n\t}\n\n\tparse(bytes: Uint8Array): T {\n\t\tconst reader = new BcsReader(bytes);\n\t\treturn this.read(reader);\n\t}\n\n\tfromHex(hex: string) {\n\t\treturn this.parse(fromHex(hex));\n\t}\n\n\tfromBase58(b64: string) {\n\t\treturn this.parse(fromBase58(b64));\n\t}\n\n\tfromBase64(b64: string) {\n\t\treturn this.parse(fromBase64(b64));\n\t}\n\n\ttransform<T2 = T, Input2 = Input, NewName extends string = Name>({\n\t\tname,\n\t\tinput,\n\t\toutput,\n\t\tvalidate,\n\t}: {\n\t\tinput?: (val: Input2) => Input;\n\t\toutput?: (value: T) => T2;\n\t} & BcsTypeOptions<T2, Input2, NewName>) {\n\t\treturn new BcsType<T2, Input2, NewName>({\n\t\t\tname: (name ?? this.name) as NewName,\n\t\t\tread: (reader) => (output ? output(this.read(reader)) : (this.read(reader) as never)),\n\t\t\twrite: (value, writer) => this.#write(input ? input(value) : (value as never), writer),\n\t\t\tserializedSize: (value) => this.serializedSize(input ? input(value) : (value as never)),\n\t\t\tserialize: (value, options) =>\n\t\t\t\tthis.#serialize(input ? input(value) : (value as never), options),\n\t\t\tvalidate: (value) => {\n\t\t\t\tvalidate?.(value);\n\t\t\t\tthis.validate(input ? input(value) : (value as never));\n\t\t\t},\n\t\t});\n\t}\n}\n\nconst SERIALIZED_BCS_BRAND = Symbol.for('@mysten/serialized-bcs') as never;\nexport function isSerializedBcs(obj: unknown): obj is SerializedBcs<unknown> {\n\treturn !!obj && typeof obj === 'object' && (obj as any)[SERIALIZED_BCS_BRAND] === true;\n}\n\nexport class SerializedBcs<T, Input = T> {\n\t#schema: BcsType<T, Input>;\n\t#bytes: Uint8Array<ArrayBuffer>;\n\n\t// Used to brand SerializedBcs so that they can be identified, even between multiple copies\n\t// of the @mysten/bcs package are installed\n\tget [SERIALIZED_BCS_BRAND]() {\n\t\treturn true;\n\t}\n\n\tconstructor(schema: BcsType<T, Input>, bytes: Uint8Array<ArrayBuffer>) {\n\t\tthis.#schema = schema;\n\t\tthis.#bytes = bytes;\n\t}\n\n\ttoBytes() {\n\t\treturn this.#bytes;\n\t}\n\n\ttoHex() {\n\t\treturn toHex(this.#bytes);\n\t}\n\n\ttoBase64() {\n\t\treturn toBase64(this.#bytes);\n\t}\n\n\ttoBase58() {\n\t\treturn toBase58(this.#bytes);\n\t}\n\n\tparse() {\n\t\treturn this.#schema.parse(this.#bytes);\n\t}\n}\n\nexport function fixedSizeBcsType<T, Input = T, const Name extends string = string>({\n\tsize,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\tread: (reader: BcsReader) => T;\n\twrite: (value: Input, writer: BcsWriter) => void;\n} & BcsTypeOptions<T, Input, Name>) {\n\treturn new BcsType<T, Input, Name>({\n\t\t...options,\n\t\tserializedSize: () => size,\n\t});\n}\n\nexport function uIntBcsType<const Name extends string = string>({\n\treadMethod,\n\twriteMethod,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\treadMethod: `read${8 | 16 | 32}`;\n\twriteMethod: `write${8 | 16 | 32}`;\n\tmaxValue: number;\n} & BcsTypeOptions<number, number, Name>) {\n\treturn fixedSizeBcsType<number, number, Name>({\n\t\t...options,\n\t\tread: (reader) => reader[readMethod](),\n\t\twrite: (value, writer) => writer[writeMethod](value),\n\t\tvalidate: (value) => {\n\t\t\tif (value < 0 || value > options.maxValue) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t`Invalid ${options.name} value: ${value}. Expected value in range 0-${options.maxValue}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function bigUIntBcsType<const Name extends string = string>({\n\treadMethod,\n\twriteMethod,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\treadMethod: `read${64 | 128 | 256}`;\n\twriteMethod: `write${64 | 128 | 256}`;\n\tmaxValue: bigint;\n} & BcsTypeOptions<string, string | number | bigint>) {\n\treturn fixedSizeBcsType<string, string | number | bigint, Name>({\n\t\t...options,\n\t\tread: (reader) => reader[readMethod](),\n\t\twrite: (value, writer) => writer[writeMethod](BigInt(value)),\n\t\tvalidate: (val) => {\n\t\t\tconst value = BigInt(val);\n\t\t\tif (value < 0 || value > options.maxValue) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t`Invalid ${options.name} value: ${value}. Expected value in range 0-${options.maxValue}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function dynamicSizeBcsType<T, Input = T, const Name extends string = string>({\n\tserialize,\n\t...options\n}: {\n\tname: Name;\n\tread: (reader: BcsReader) => T;\n\tserialize: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n} & BcsTypeOptions<T, Input>) {\n\tconst type = new BcsType<T, Input>({\n\t\t...options,\n\t\tserialize,\n\t\twrite: (value, writer) => {\n\t\t\tfor (const byte of type.serialize(value).toBytes()) {\n\t\t\t\twriter.write8(byte);\n\t\t\t}\n\t\t},\n\t});\n\n\treturn type;\n}\n\nexport function stringLikeBcsType<const Name extends string = string>({\n\ttoBytes,\n\tfromBytes,\n\t...options\n}: {\n\tname: Name;\n\ttoBytes: (value: string) => Uint8Array;\n\tfromBytes: (bytes: Uint8Array) => string;\n\tserializedSize?: (value: string) => number | null;\n} & BcsTypeOptions<string, string, Name>) {\n\treturn new BcsType<string, string, Name>({\n\t\t...options,\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst bytes = reader.readBytes(length);\n\n\t\t\treturn fromBytes(bytes);\n\t\t},\n\t\twrite: (hex, writer) => {\n\t\t\tconst bytes = toBytes(hex);\n\t\t\twriter.writeULEB(bytes.length);\n\t\t\tfor (let i = 0; i < bytes.length; i++) {\n\t\t\t\twriter.write8(bytes[i]);\n\t\t\t}\n\t\t},\n\t\tserialize: (value) => {\n\t\t\tconst bytes = toBytes(value);\n\t\t\tconst size = ulebEncode(bytes.length);\n\t\t\tconst result = new Uint8Array(size.length + bytes.length);\n\t\t\tresult.set(size, 0);\n\t\t\tresult.set(bytes, size.length);\n\n\t\t\treturn result;\n\t\t},\n\t\tvalidate: (value) => {\n\t\t\tif (typeof value !== 'string') {\n\t\t\t\tthrow new TypeError(`Invalid ${options.name} value: ${value}. Expected string`);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function lazyBcsType<T, Input>(cb: () => BcsType<T, Input>) {\n\tlet lazyType: BcsType<T, Input> | null = null;\n\tfunction getType() {\n\t\tif (!lazyType) {\n\t\t\tlazyType = cb();\n\t\t}\n\t\treturn lazyType;\n\t}\n\n\treturn new BcsType<T, Input>({\n\t\tname: 'lazy' as never,\n\t\tread: (data) => getType().read(data),\n\t\tserializedSize: (value) => getType().serializedSize(value),\n\t\twrite: (value, writer) => getType().write(value, writer),\n\t\tserialize: (value, options) => getType().serialize(value, options).toBytes(),\n\t});\n}\n\nexport interface BcsStructOptions<\n\tT extends Record<string, BcsType<any>>,\n\tName extends string = string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t\t},\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t\t},\n\t\tName\n\t>,\n\t'name'\n> {\n\tname: Name;\n\tfields: T;\n}\n\nexport class BcsStruct<\n\tT extends Record<string, BcsType<any>>,\n\tconst Name extends string = string,\n> extends BcsType<\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t},\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t},\n\tName\n> {\n\tconstructor({ name, fields, ...options }: BcsStructOptions<T, Name>) {\n\t\tconst canonicalOrder = Object.entries(fields);\n\n\t\tsuper({\n\t\t\tname,\n\t\t\tserializedSize: (values) => {\n\t\t\t\tlet total = 0;\n\t\t\t\tfor (const [field, type] of canonicalOrder) {\n\t\t\t\t\tconst size = type.serializedSize(values[field]);\n\t\t\t\t\tif (size == null) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\ttotal += size;\n\t\t\t\t}\n\n\t\t\t\treturn total;\n\t\t\t},\n\t\t\tread: (reader) => {\n\t\t\t\tconst result: Record<string, unknown> = {};\n\t\t\t\tfor (const [field, type] of canonicalOrder) {\n\t\t\t\t\tresult[field] = type.read(reader);\n\t\t\t\t}\n\n\t\t\t\treturn result as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tfor (const [field, type] of canonicalOrder) {\n\t\t\t\t\ttype.write(value[field], writer);\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'object' || value == null) {\n\t\t\t\t\tthrow new TypeError(`Expected object, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n\nexport interface BcsEnumOptions<\n\tT extends Record<string, BcsType<any> | null>,\n\tName extends string = string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\tEnumOutputShape<{\n\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true;\n\t\t}>,\n\t\tEnumInputShape<{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t\t}>,\n\t\tName\n\t>,\n\t'name'\n> {\n\tname: Name;\n\tfields: T;\n}\n\nexport class BcsEnum<\n\tT extends Record<string, BcsType<any> | null>,\n\tconst Name extends string = string,\n> extends BcsType<\n\tEnumOutputShape<{\n\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : true;\n\t}>,\n\tEnumInputShape<{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t}>,\n\tName\n> {\n\tconstructor({ fields, ...options }: BcsEnumOptions<T, Name>) {\n\t\tconst canonicalOrder = Object.entries(fields as object);\n\t\tsuper({\n\t\t\tread: (reader) => {\n\t\t\t\tconst index = reader.readULEB();\n\n\t\t\t\tconst enumEntry = canonicalOrder[index];\n\t\t\t\tif (!enumEntry) {\n\t\t\t\t\tthrow new TypeError(`Unknown value ${index} for enum ${options.name}`);\n\t\t\t\t}\n\n\t\t\t\tconst [kind, type] = enumEntry;\n\n\t\t\t\treturn {\n\t\t\t\t\t[kind]: type?.read(reader) ?? true,\n\t\t\t\t\t$kind: kind,\n\t\t\t\t} as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tconst [name, val] = Object.entries(value).filter(([name]) =>\n\t\t\t\t\tObject.hasOwn(fields, name),\n\t\t\t\t)[0];\n\n\t\t\t\tfor (let i = 0; i < canonicalOrder.length; i++) {\n\t\t\t\t\tconst [optionName, optionType] = canonicalOrder[i];\n\t\t\t\t\tif (optionName === name) {\n\t\t\t\t\t\twriter.writeULEB(i);\n\t\t\t\t\t\toptionType?.write(val, writer);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'object' || value == null) {\n\t\t\t\t\tthrow new TypeError(`Expected object, found ${typeof value}`);\n\t\t\t\t}\n\n\t\t\t\tconst keys = Object.keys(value).filter(\n\t\t\t\t\t(k) => value[k] !== undefined && Object.hasOwn(fields, k),\n\t\t\t\t);\n\n\t\t\t\tif (keys.length !== 1) {\n\t\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\t`Expected object with one key, but found ${keys.length} for type ${options.name}}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst [variant] = keys;\n\n\t\t\t\tif (!Object.hasOwn(fields, variant)) {\n\t\t\t\t\tthrow new TypeError(`Invalid enum variant ${variant}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n\nexport interface BcsTupleOptions<\n\tT extends readonly BcsType<any>[],\n\tName extends string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\t{\n\t\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t\t},\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t\t},\n\t\tName\n\t>,\n\t'name'\n> {\n\tname?: Name;\n\tfields: T;\n}\n\nexport class BcsTuple<\n\tconst T extends readonly BcsType<any>[],\n\tconst Name extends string =\n\t\t`(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T> ? T : never }, ', '>})`,\n> extends BcsType<\n\t{\n\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t},\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t},\n\tName\n> {\n\tconstructor({ fields, name, ...options }: BcsTupleOptions<T, Name>) {\n\t\tsuper({\n\t\t\tname: name ?? (`(${fields.map((t) => t.name).join(', ')})` as never),\n\t\t\tserializedSize: (values) => {\n\t\t\t\tlet total = 0;\n\t\t\t\tfor (let i = 0; i < fields.length; i++) {\n\t\t\t\t\tconst size = fields[i].serializedSize(values[i]);\n\t\t\t\t\tif (size == null) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\ttotal += size;\n\t\t\t\t}\n\n\t\t\t\treturn total;\n\t\t\t},\n\t\t\tread: (reader) => {\n\t\t\t\tconst result: unknown[] = [];\n\t\t\t\tfor (const field of fields) {\n\t\t\t\t\tresult.push(field.read(reader));\n\t\t\t\t}\n\t\t\t\treturn result as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tfor (let i = 0; i < fields.length; i++) {\n\t\t\t\t\tfields[i].write(value[i], writer);\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!Array.isArray(value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t\tif (value.length !== fields.length) {\n\t\t\t\t\tthrow new TypeError(`Expected array of length ${fields.length}, found ${value.length}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { BcsTypeOptions } from './bcs-type.js';\nimport {\n\tBcsEnum,\n\tBcsStruct,\n\tBcsTuple,\n\tBcsType,\n\tbigUIntBcsType,\n\tdynamicSizeBcsType,\n\tfixedSizeBcsType,\n\tlazyBcsType,\n\tstringLikeBcsType,\n\tuIntBcsType,\n} from './bcs-type.js';\nimport type {\n\tEnumInputShape,\n\tEnumOutputShape,\n\tInferBcsInput,\n\tInferBcsType,\n\tJoinString,\n} from './types.js';\nimport { ulebEncode } from './uleb.js';\n\nfunction fixedArray<T extends BcsType<any>, Name extends string = string>(\n\tsize: number,\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>;\nfunction fixedArray<T, Input, Name extends string = string>(\n\tsize: number,\n\ttype: BcsType<T, Input>,\n\toptions?: BcsTypeOptions<T[], Iterable<Input> & { length: number }, Name>,\n): BcsType<T[], Iterable<Input> & { length: number }, Name>;\nfunction fixedArray<T extends BcsType<any>, Name extends string = `${T['name']}[${number}]`>(\n\tsize: number,\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name> {\n\treturn new BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>({\n\t\tread: (reader) => {\n\t\t\tconst result: InferBcsType<T>[] = new Array(size);\n\t\t\tfor (let i = 0; i < size; i++) {\n\t\t\t\tresult[i] = type.read(reader);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\tfor (const item of value) {\n\t\t\t\ttype.write(item, writer);\n\t\t\t}\n\t\t},\n\t\t...options,\n\t\tname: (options?.name ?? `${type.name}[${size}]`) as Name,\n\t\tvalidate: (value) => {\n\t\t\toptions?.validate?.(value);\n\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t}\n\t\t\tif (value.length !== size) {\n\t\t\t\tthrow new TypeError(`Expected array of length ${size}, found ${value.length}`);\n\t\t\t}\n\t\t},\n\t});\n}\n\nfunction option<T extends BcsType<any>>(\n\ttype: T,\n): BcsType<InferBcsType<T> | null, InferBcsInput<T> | null | undefined, `Option<${T['name']}>`>;\nfunction option<T, Input, Name extends string = string>(\n\ttype: BcsType<T, Input, Name>,\n): BcsType<T | null, Input | null | undefined>;\nfunction option<T extends BcsType<any>>(\n\ttype: T,\n): BcsType<InferBcsType<T> | null, InferBcsInput<T> | null | undefined, `Option<${T['name']}>`> {\n\treturn bcs\n\t\t.enum(`Option<${type.name}>`, {\n\t\t\tNone: null,\n\t\t\tSome: type,\n\t\t})\n\t\t.transform({\n\t\t\tinput: (value: InferBcsInput<T> | null | undefined) => {\n\t\t\t\tif (value == null) {\n\t\t\t\t\treturn { None: true };\n\t\t\t\t}\n\n\t\t\t\treturn { Some: value };\n\t\t\t},\n\t\t\toutput: (value) => {\n\t\t\t\tif (value.$kind === 'Some') {\n\t\t\t\t\treturn value.Some as InferBcsType<T>;\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t},\n\t\t});\n}\n\nfunction vector<T extends BcsType<any>, Name extends string = `vector<${T['name']}>`>(\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>;\nfunction vector<T, Input, Name extends string = string>(\n\ttype: BcsType<T, Input, Name>,\n\toptions?: BcsTypeOptions<T[], Iterable<Input> & { length: number }, `vector<${Name}>`>,\n): BcsType<T[], Iterable<Input> & { length: number }, `vector<${Name}>`>;\nfunction vector<T extends BcsType<any>, Name extends string = `vector<${T['name']}>`>(\n\ttype: T,\n\toptions?: BcsTypeOptions<\n\t\tInferBcsType<T>[],\n\t\tIterable<InferBcsInput<T>> & { length: number },\n\t\tName\n\t>,\n): BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name> {\n\treturn new BcsType<InferBcsType<T>[], Iterable<InferBcsInput<T>> & { length: number }, Name>({\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst result: InferBcsType<T>[] = new Array(length);\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tresult[i] = type.read(reader);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\twriter.writeULEB(value.length);\n\t\t\tfor (const item of value) {\n\t\t\t\ttype.write(item, writer);\n\t\t\t}\n\t\t},\n\t\t...options,\n\t\tname: (options?.name ?? `vector<${type.name}>`) as Name,\n\t\tvalidate: (value) => {\n\t\t\toptions?.validate?.(value);\n\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t}\n\t\t},\n\t});\n}\n\n/**\n * Compares two byte arrays using lexicographic ordering.\n * This matches Rust's Ord implementation for Vec<u8>/[u8] which is used for BTreeMap key ordering.\n * Comparison is done byte-by-byte first, then by length if all compared bytes are equal.\n */\nexport function compareBcsBytes(a: Uint8Array, b: Uint8Array): number {\n\tfor (let i = 0; i < Math.min(a.length, b.length); i++) {\n\t\tif (a[i] !== b[i]) {\n\t\t\treturn a[i] - b[i];\n\t\t}\n\t}\n\n\treturn a.length - b.length;\n}\n\nfunction map<K extends BcsType<any>, V extends BcsType<any>>(\n\tkeyType: K,\n\tvalueType: V,\n): BcsType<\n\tMap<InferBcsType<K>, InferBcsType<V>>,\n\tMap<InferBcsInput<K>, InferBcsInput<V>>,\n\t`Map<${K['name']}, ${V['name']}>`\n>;\nfunction map<K, V, InputK = K, InputV = V>(\n\tkeyType: BcsType<K, InputK>,\n\tvalueType: BcsType<V, InputV>,\n): BcsType<Map<K, V>, Map<InputK, InputV>, `Map<${string}, ${string}>`>;\nfunction map<K extends BcsType<any>, V extends BcsType<any>>(\n\tkeyType: K,\n\tvalueType: V,\n): BcsType<\n\tMap<InferBcsType<K>, InferBcsType<V>>,\n\tMap<InferBcsInput<K>, InferBcsInput<V>>,\n\t`Map<${K['name']}, ${V['name']}>`\n> {\n\treturn new BcsType({\n\t\tname: `Map<${keyType.name}, ${valueType.name}>`,\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst result = new Map<InferBcsType<K>, InferBcsType<V>>();\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tresult.set(keyType.read(reader), valueType.read(reader));\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\twrite: (value, writer) => {\n\t\t\tconst entries = [...value.entries()].map(\n\t\t\t\t([key, val]) => [keyType.serialize(key).toBytes(), val] as const,\n\t\t\t);\n\t\t\tentries.sort(([a], [b]) => compareBcsBytes(a, b));\n\n\t\t\twriter.writeULEB(entries.length);\n\t\t\tfor (const [keyBytes, val] of entries) {\n\t\t\t\twriter.writeBytes(keyBytes);\n\t\t\t\tvalueType.write(val, writer);\n\t\t\t}\n\t\t},\n\t});\n}\n\nexport const bcs = {\n\t/**\n\t * Creates a BcsType that can be used to read and write an 8-bit unsigned integer.\n\t * @example\n\t * bcs.u8().serialize(255).toBytes() // Uint8Array [ 255 ]\n\t */\n\tu8(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read8',\n\t\t\twriteMethod: 'write8',\n\t\t\tsize: 1,\n\t\t\tmaxValue: 2 ** 8 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u8') as 'u8',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 16-bit unsigned integer.\n\t * @example\n\t * bcs.u16().serialize(65535).toBytes() // Uint8Array [ 255, 255 ]\n\t */\n\tu16(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read16',\n\t\t\twriteMethod: 'write16',\n\t\t\tsize: 2,\n\t\t\tmaxValue: 2 ** 16 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u16') as 'u16',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 32-bit unsigned integer.\n\t * @example\n\t * bcs.u32().serialize(4294967295).toBytes() // Uint8Array [ 255, 255, 255, 255 ]\n\t */\n\tu32(options?: BcsTypeOptions<number>) {\n\t\treturn uIntBcsType({\n\t\t\treadMethod: 'read32',\n\t\t\twriteMethod: 'write32',\n\t\t\tsize: 4,\n\t\t\tmaxValue: 2 ** 32 - 1,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u32') as 'u32',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 64-bit unsigned integer.\n\t * @example\n\t * bcs.u64().serialize(1).toBytes() // Uint8Array [ 1, 0, 0, 0, 0, 0, 0, 0 ]\n\t */\n\tu64(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read64',\n\t\t\twriteMethod: 'write64',\n\t\t\tsize: 8,\n\t\t\tmaxValue: 2n ** 64n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u64') as 'u64',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 128-bit unsigned integer.\n\t * @example\n\t * bcs.u128().serialize(1).toBytes() // Uint8Array [ 1, ..., 0 ]\n\t */\n\tu128(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read128',\n\t\t\twriteMethod: 'write128',\n\t\t\tsize: 16,\n\t\t\tmaxValue: 2n ** 128n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u128') as 'u128',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write a 256-bit unsigned integer.\n\t * @example\n\t * bcs.u256().serialize(1).toBytes() // Uint8Array [ 1, ..., 0 ]\n\t */\n\tu256(options?: BcsTypeOptions<string, number | bigint | string>) {\n\t\treturn bigUIntBcsType({\n\t\t\treadMethod: 'read256',\n\t\t\twriteMethod: 'write256',\n\t\t\tsize: 32,\n\t\t\tmaxValue: 2n ** 256n - 1n,\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'u256') as 'u256',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write boolean values.\n\t * @example\n\t * bcs.bool().serialize(true).toBytes() // Uint8Array [ 1 ]\n\t */\n\tbool(options?: BcsTypeOptions<boolean>) {\n\t\treturn fixedSizeBcsType({\n\t\t\tsize: 1,\n\t\t\tread: (reader) => reader.read8() === 1,\n\t\t\twrite: (value, writer) => writer.write8(value ? 1 : 0),\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'bool') as 'bool',\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'boolean') {\n\t\t\t\t\tthrow new TypeError(`Expected boolean, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can be used to read and write unsigned LEB encoded integers\n\t * @example\n\t *\n\t */\n\tuleb128(options?: BcsTypeOptions<number>) {\n\t\treturn dynamicSizeBcsType({\n\t\t\tread: (reader) => reader.readULEB(),\n\t\t\tserialize: (value) => {\n\t\t\t\treturn Uint8Array.from(ulebEncode(value));\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'uleb128') as 'uleb128',\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a fixed length byte array\n\t * @param size The number of bytes this types represents\n\t * @example\n\t * bcs.bytes(3).serialize(new Uint8Array([1, 2, 3])).toBytes() // Uint8Array [1, 2, 3]\n\t */\n\tbytes<T extends number>(size: T, options?: BcsTypeOptions<Uint8Array, Iterable<number>>) {\n\t\treturn fixedSizeBcsType<Uint8Array, Iterable<number>, `bytes[${T}]`>({\n\t\t\tsize,\n\t\t\tread: (reader) => reader.readBytes(size),\n\t\t\twrite: (value, writer) => {\n\t\t\t\twriter.writeBytes(new Uint8Array(value));\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? `bytes[${size}]`) as `bytes[${T}]`,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t\tif (value.length !== size) {\n\t\t\t\t\tthrow new TypeError(`Expected array of length ${size}, found ${value.length}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a variable length byte array\n\t *\n\t * @example\n\t * bcs.byteVector().serialize([1, 2, 3]).toBytes() // Uint8Array [3, 1, 2, 3]\n\t */\n\tbyteVector(options?: BcsTypeOptions<Uint8Array, Iterable<number>>) {\n\t\treturn new BcsType<Uint8Array, Iterable<number>, 'vector<u8>'>({\n\t\t\tread: (reader) => {\n\t\t\t\tconst length = reader.readULEB();\n\n\t\t\t\treturn reader.readBytes(length);\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tconst array = new Uint8Array(value);\n\t\t\t\twriter.writeULEB(array.length);\n\t\t\t\twriter.writeBytes(array);\n\t\t\t},\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'vector<u8>') as 'vector<u8>',\n\t\t\tserializedSize: (value) => {\n\t\t\t\tconst length = 'length' in value ? (value.length as number) : null;\n\t\t\t\treturn length == null ? null : ulebEncode(length).length + length;\n\t\t\t},\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!value || typeof value !== 'object' || !('length' in value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType that can ser/de string values. Strings will be UTF-8 encoded\n\t * @example\n\t * bcs.string().serialize('a').toBytes() // Uint8Array [ 1, 97 ]\n\t */\n\tstring(options?: BcsTypeOptions<string>) {\n\t\treturn stringLikeBcsType({\n\t\t\ttoBytes: (value) => new TextEncoder().encode(value),\n\t\t\tfromBytes: (bytes) => new TextDecoder().decode(bytes),\n\t\t\t...options,\n\t\t\tname: (options?.name ?? 'string') as 'string',\n\t\t});\n\t},\n\t/**\n\t * Creates a BcsType that represents a fixed length array of a given type\n\t * @param size The number of elements in the array\n\t * @param type The BcsType of each element in the array\n\t * @example\n\t * bcs.fixedArray(3, bcs.u8()).serialize([1, 2, 3]).toBytes() // Uint8Array [ 1, 2, 3 ]\n\t */\n\tfixedArray,\n\n\t/**\n\t * Creates a BcsType representing an optional value\n\t * @param type The BcsType of the optional value\n\t * @example\n\t * bcs.option(bcs.u8()).serialize(null).toBytes() // Uint8Array [ 0 ]\n\t * bcs.option(bcs.u8()).serialize(1).toBytes() // Uint8Array [ 1, 1 ]\n\t */\n\toption,\n\n\t/**\n\t * Creates a BcsType representing a variable length vector of a given type\n\t * @param type The BcsType of each element in the vector\n\t *\n\t * @example\n\t * bcs.vector(bcs.u8()).toBytes([1, 2, 3]) // Uint8Array [ 3, 1, 2, 3 ]\n\t */\n\tvector,\n\n\t/**\n\t * Creates a BcsType representing a tuple of a given set of types\n\t * @param types The BcsTypes for each element in the tuple\n\t *\n\t * @example\n\t * const tuple = bcs.tuple([bcs.u8(), bcs.string(), bcs.bool()])\n\t * tuple.serialize([1, 'a', true]).toBytes() // Uint8Array [ 1, 1, 97, 1 ]\n\t */\n\ttuple<\n\t\tconst T extends readonly BcsType<any, any>[],\n\t\tconst Name extends string =\n\t\t\t`(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T> ? T : never }, ', '>})`,\n\t>(\n\t\tfields: T,\n\t\toptions?: BcsTypeOptions<\n\t\t\t{\n\t\t\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t\t\t},\n\t\t\t{\n\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t\t\t},\n\t\t\tName\n\t\t>,\n\t) {\n\t\treturn new BcsTuple<T, Name>({\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a struct of a given set of fields\n\t * @param name The name of the struct\n\t * @param fields The fields of the struct. The order of the fields affects how data is serialized and deserialized\n\t *\n\t * @example\n\t * const struct = bcs.struct('MyStruct', {\n\t * a: bcs.u8(),\n\t * b: bcs.string(),\n\t * })\n\t * struct.serialize({ a: 1, b: 'a' }).toBytes() // Uint8Array [ 1, 1, 97 ]\n\t */\n\tstruct<T extends Record<string, BcsType<any>>, const Name extends string = string>(\n\t\tname: Name,\n\t\tfields: T,\n\t\toptions?: Omit<\n\t\t\tBcsTypeOptions<\n\t\t\t\t{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t\t\t\t}\n\t\t\t>,\n\t\t\t'name'\n\t\t>,\n\t) {\n\t\treturn new BcsStruct<T>({\n\t\t\tname,\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing an enum of a given set of options\n\t * @param name The name of the enum\n\t * @param values The values of the enum. The order of the values affects how data is serialized and deserialized.\n\t * null can be used to represent a variant with no data.\n\t *\n\t * @example\n\t * const enum = bcs.enum('MyEnum', {\n\t * A: bcs.u8(),\n\t * B: bcs.string(),\n\t * C: null,\n\t * })\n\t * enum.serialize({ A: 1 }).toBytes() // Uint8Array [ 0, 1 ]\n\t * enum.serialize({ B: 'a' }).toBytes() // Uint8Array [ 1, 1, 97 ]\n\t * enum.serialize({ C: true }).toBytes() // Uint8Array [ 2 ]\n\t */\n\tenum<T extends Record<string, BcsType<any> | null>, const Name extends string = string>(\n\t\tname: Name,\n\t\tfields: T,\n\t\toptions?: Omit<\n\t\t\tBcsTypeOptions<\n\t\t\t\tEnumOutputShape<{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true;\n\t\t\t\t}>,\n\t\t\t\tEnumInputShape<{\n\t\t\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t\t\t\t}>,\n\t\t\t\tName\n\t\t\t>,\n\t\t\t'name'\n\t\t>,\n\t) {\n\t\treturn new BcsEnum<T, Name>({\n\t\t\tname,\n\t\t\tfields,\n\t\t\t...options,\n\t\t});\n\t},\n\n\t/**\n\t * Creates a BcsType representing a map of a given key and value type\n\t * @param keyType The BcsType of the key\n\t * @param valueType The BcsType of the value\n\t * @example\n\t * const map = bcs.map(bcs.u8(), bcs.string())\n\t * map.serialize(new Map([[2, 'a']])).toBytes() // Uint8Array [ 1, 2, 1, 97 ]\n\t */\n\tmap,\n\n\t/**\n\t * Creates a BcsType that wraps another BcsType which is lazily evaluated. This is useful for creating recursive types.\n\t * @param cb A callback that returns the BcsType\n\t */\n\tlazy<T extends BcsType<any>>(cb: () => T): T {\n\t\treturn lazyBcsType(cb) as T;\n\t},\n};\n","/*\r\n * bignumber.js v9.1.2\r\n * A JavaScript library for arbitrary-precision arithmetic.\r\n * https://github.com/MikeMcl/bignumber.js\r\n * Copyright (c) 2022 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 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 alphabetHasNormalDecimalDigits = true;\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 && alphabetHasNormalDecimalDigits) {\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 less than two characters,\r\n // or if it contains '+', '-', '.', whitespace, or a repeated character.\r\n if (typeof v == 'string' && !/^.?$|[+\\-.\\s]|(.).*\\1/.test(v)) {\r\n alphabetHasNormalDecimalDigits = v.slice(0, 10) == '0123456789';\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, -1);\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, 1);\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 // If any number is NaN, return NaN.\r\n function maxOrMin(args, n) {\r\n var k, y,\r\n i = 1,\r\n x = new BigNumber(args[0]);\r\n\r\n for (; i < args.length; i++) {\r\n y = new BigNumber(args[i]);\r\n if (!y.s || (k = compare(x, y)) === n || k === 0 && x.s === n) {\r\n x = y;\r\n }\r\n }\r\n\r\n return x;\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 = mathfloor(n / pows10[d - j - 1] % 10);\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 : mathfloor(n / pows10[d - j - 1] % 10);\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 ? n.s * (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) {\r\n t = xc;\r\n xc = yc;\r\n yc = t;\r\n y.s = -y.s;\r\n }\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) {\r\n zc = xc;\r\n xc = yc;\r\n yc = zc;\r\n i = xcL;\r\n xcL = ycL;\r\n ycL = i;\r\n }\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) {\r\n t = yc;\r\n yc = xc;\r\n xc = t;\r\n b = a;\r\n }\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) {\r\n i = g1;\r\n g1 = g2;\r\n g2 = i;\r\n len -= i;\r\n }\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 && alphabetHasNormalDecimalDigits) {\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","/**\n * BCS (Binary Canonical Serialization) Schemas for Lending Protocol\n *\n * This module defines the BCS schemas for serializing and deserializing\n * lending protocol data structures. BCS is used for efficient binary\n * encoding of complex data types for blockchain transactions and storage.\n */\n\nimport { bcs, fromHex, toHex } from '@mysten/bcs'\n\n/**\n * BCS schema for Sui addresses with hex transformation\n * Converts between hex string representation and byte arrays\n */\nexport const Address = bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n})\n\n/**\n * BCS schema for incentive APY information\n * Contains asset ID, APY value, and supported coin types\n */\nexport const IncentiveAPYInfo = bcs.struct('IncentiveAPYInfo', {\n /** Asset identifier */\n asset_id: bcs.u8(),\n /** Annual Percentage Yield as a 256-bit integer */\n apy: bcs.u256(),\n /** List of supported coin types for this incentive */\n coin_types: bcs.vector(bcs.string())\n})\n\n/**\n * BCS schema for incentive pool information\n * Contains comprehensive details about a lending incentive pool\n */\nexport const IncentivePoolInfo = bcs.struct('IncentivePoolInfo', {\n /** Unique pool identifier */\n pool_id: Address,\n /** Address holding the incentive funds */\n funds: Address,\n /** Current phase of the incentive program */\n phase: bcs.u64(),\n /** Timestamp when the incentive started */\n start_at: bcs.u64(),\n /** Timestamp when the incentive ends */\n end_at: bcs.u64(),\n /** Timestamp when the incentive was closed */\n closed_at: bcs.u64(),\n /** Total supply of incentive tokens */\n total_supply: bcs.u64(),\n /** Asset identifier for the incentive */\n asset_id: bcs.u8(),\n /** Option type for the incentive */\n option: bcs.u8(),\n /** Factor used in incentive calculations */\n factor: bcs.u256(),\n /** Amount of incentives already distributed */\n distributed: bcs.u64(),\n /** Amount of incentives currently available */\n available: bcs.u256(),\n /** Total amount of incentives */\n total: bcs.u256()\n})\n\n/**\n * BCS schema for incentive pool information grouped by phase\n * Contains phase number and list of pools in that phase\n */\nexport const IncentivePoolInfoByPhase = bcs.struct('IncentivePoolInfoByPhase', {\n /** Phase number */\n phase: bcs.u64(),\n /** List of incentive pools in this phase */\n pools: bcs.vector(IncentivePoolInfo)\n})\n\n/**\n * BCS schema for oracle price information\n * Contains price data from external price feeds\n */\nexport const OracleInfo = bcs.struct('OracleInfo', {\n /** Oracle identifier */\n oracle_id: bcs.u8(),\n /** Current price as a 256-bit integer */\n price: bcs.u256(),\n /** Number of decimal places for the price */\n decimals: bcs.u8(),\n /** Whether the oracle data is valid */\n valid: bcs.bool()\n})\n\n/**\n * BCS schema for flash loan asset configuration\n * Contains parameters for flash loan functionality\n */\nexport const FlashLoanAssetConfig = bcs.struct('FlashLoanAssetConfig', {\n /** Unique identifier for the flash loan asset */\n id: bcs.string(),\n /** Asset identifier */\n asset_id: bcs.u8(),\n /** Coin type for the asset */\n coin_type: bcs.string(),\n /** Pool identifier for the flash loan */\n pool_id: bcs.string(),\n /** Rate paid to suppliers for flash loans */\n rate_to_supplier: bcs.u64(),\n /** Rate paid to treasury for flash loans */\n rate_to_treasury: bcs.u64(),\n /** Maximum flash loan amount */\n max: bcs.u64(),\n /** Minimum flash loan amount */\n min: bcs.u64()\n})\n\n/**\n * BCS schema for reserve data information\n * Contains comprehensive details about a lending reserve\n */\nexport const ReserveDataInfo = bcs.struct('ReserveDataInfo', {\n /** Reserve identifier */\n id: bcs.u8(),\n /** Oracle identifier for price feeds */\n oracle_id: bcs.u8(),\n /** Coin type for the reserve */\n coin_type: bcs.string(),\n /** Maximum supply capacity */\n supply_cap: bcs.u256(),\n /** Maximum borrow capacity */\n borrow_cap: bcs.u256(),\n /** Current supply interest rate */\n supply_rate: bcs.u256(),\n /** Current borrow interest rate */\n borrow_rate: bcs.u256(),\n /** Current supply index for interest calculation */\n supply_index: bcs.u256(),\n /** Current borrow index for interest calculation */\n borrow_index: bcs.u256(),\n /** Total amount supplied to the reserve */\n total_supply: bcs.u256(),\n /** Total amount borrowed from the reserve */\n total_borrow: bcs.u256(),\n /** Timestamp of last update */\n last_update_at: bcs.u64(),\n /** Loan-to-Value ratio for collateral */\n ltv: bcs.u256(),\n /** Treasury factor for fee calculations */\n treasury_factor: bcs.u256(),\n /** Current treasury balance */\n treasury_balance: bcs.u256(),\n /** Base interest rate */\n base_rate: bcs.u256(),\n /** Interest rate multiplier */\n multiplier: bcs.u256(),\n /** Jump rate multiplier for high utilization */\n jump_rate_multiplier: bcs.u256(),\n /** Reserve factor for protocol fees */\n reserve_factor: bcs.u256(),\n /** Optimal utilization rate */\n optimal_utilization: bcs.u256(),\n /** Liquidation ratio threshold */\n liquidation_ratio: bcs.u256(),\n /** Liquidation bonus for liquidators */\n liquidation_bonus: bcs.u256(),\n /** Liquidation threshold */\n liquidation_threshold: bcs.u256()\n})\n\n/**\n * BCS schema for user state information\n * Contains user's borrowing and supplying balances for an asset\n */\nexport const UserStateInfo = bcs.struct('UserStateInfo', {\n /** Asset identifier */\n asset_id: bcs.u8(),\n /** User's current borrow balance */\n borrow_balance: bcs.u256(),\n /** User's current supply balance */\n supply_balance: bcs.u256()\n})\n","import packageJson from '../package.json'\n\nconst sdkVersion = packageJson.version\n\nconst getNodeInfo = (): string => {\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n try {\n const os = require('os')\n const nodeVersion: string = process.version\n const osType: string = os.type()\n const osArch: string = os.arch()\n\n const formattedNodeVersion: string = nodeVersion.startsWith('v')\n ? nodeVersion.substring(1)\n : nodeVersion\n\n return `Node.js ${formattedNodeVersion}; ${osType}/${osArch}`\n } catch (e) {\n return `Node.js ${process.version}; OS/Unknown (Error)`\n }\n }\n return 'Node/Unknown'\n}\n\nexport const getUserAgent = (): string => {\n let environmentInfo: string = ''\n\n const isNode = typeof process !== 'undefined' && process.versions && process.versions.node\n\n if (isNode) {\n environmentInfo = `lending/${sdkVersion} (${getNodeInfo()})`\n }\n\n return environmentInfo\n}\n\nexport const userAgent = getUserAgent()\n","/**\n * Lending Utilities\n *\n * This module provides utility functions for the lending protocol, including\n * caching mechanisms, data transformation, transaction parsing, and blockchain\n * interaction helpers.\n *\n * @module LendingUtils\n */\n\nimport type { CacheOption, EMode, EModeIdentity, EModePool, Pool, TransactionResult } from './types'\nimport type { DevInspectResults } from '@mysten/sui/client'\nimport { SuiClient, getFullnodeUrl } from '@mysten/sui/client'\nimport camelCase from 'lodash.camelcase'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { BcsType } from '@mysten/sui/bcs'\nimport { normalizeStructTag } from '@mysten/sui/utils'\nimport { SuiPriceServiceConnection } from '@pythnetwork/pyth-sui-js'\nimport BigNumber from 'bignumber.js'\nimport { userAgent } from './ua'\n\n/**\n * Default Sui client instance configured for mainnet\n */\nexport const suiClient = new SuiClient({\n url: getFullnodeUrl('mainnet')\n})\n\n/**\n * Generates a cache key from function arguments\n *\n * This function creates a unique key for caching by serializing the arguments\n * and removing cache-specific options that shouldn't affect the cache key.\n *\n * @param args - Function arguments to generate key from\n * @returns JSON string representing the arguments\n */\nfunction argsKey(args: any[]) {\n const serializergs = [] as any[]\n args.forEach((option: any, index) => {\n const isLast = index === args.length - 1\n if (typeof option === 'object' && option !== null && isLast) {\n const { client, disableCache, cacheTime, ...rest } = option\n serializergs.push(rest)\n } else {\n serializergs.push(option)\n }\n })\n return JSON.stringify(serializergs)\n}\n\n/**\n * Wraps a function with singleton behavior to prevent duplicate concurrent calls\n *\n * This decorator ensures that if the same function is called with the same arguments\n * while a previous call is still pending, it returns the existing promise instead\n * of making a new call.\n *\n * @param fn - Function to wrap with singleton behavior\n * @returns Wrapped function with singleton behavior\n */\nexport function withSingleton<T extends (...args: any[]) => Promise<any>>(fn: T): T {\n const promiseMap: Record<string, Promise<any> | null> = {}\n\n return ((...args: any[]) => {\n const key = argsKey(args)\n if (promiseMap[key]) {\n return promiseMap[key]\n }\n promiseMap[key] = fn(...args).finally(() => {\n delete promiseMap[key]\n })\n return promiseMap[key]\n }) as T\n}\n\n/**\n * Wraps a function with caching behavior\n *\n * This decorator caches function results based on arguments and cache options.\n * It respects cache time settings and can be disabled per call.\n *\n * @param fn - Function to wrap with caching behavior\n * @returns Wrapped function with caching behavior\n */\nexport function withCache<T extends (...args: any[]) => Promise<any>>(fn: T): T {\n let cache: Record<\n string,\n {\n data: undefined\n cacheAt: number\n }\n > = {}\n\n return ((...args: any[]) => {\n const options = args[args.length - 1] as Partial<CacheOption>\n const key = argsKey(args)\n const cacheData = cache[key]\n\n // Check if cache is valid and not disabled\n if (!options?.disableCache && typeof cacheData?.data !== 'undefined') {\n if (\n typeof options?.cacheTime === 'undefined' ||\n options.cacheTime > Date.now() - cacheData.cacheAt\n ) {\n return cacheData.data\n }\n }\n\n // Execute function and cache result\n return fn(...args).then((result) => {\n cache[key] = {\n data: result,\n cacheAt: Date.now()\n }\n return result\n })\n }) as T\n}\n\n/**\n * Converts object keys from snake_case to camelCase recursively\n *\n * This function transforms all keys in an object (including nested objects and arrays)\n * from snake_case format to camelCase format.\n *\n * @param obj - Object to transform\n * @returns Object with camelCase keys\n */\nexport function camelize<T extends Record<string, any>>(obj: T): T {\n if (Array.isArray(obj)) {\n return obj.map((v) => camelize(v)) as unknown as T\n } else if (obj != null && typeof obj === 'object') {\n return Object.keys(obj).reduce(\n (result, key) => ({\n ...result,\n [camelCase(key)]: camelize(obj[key])\n }),\n {} as T\n )\n }\n return obj\n}\n\n/**\n * Parses a value for use in transaction building\n *\n * This function converts various value types into the appropriate format\n * for transaction building, handling both primitive types and existing\n * transaction results.\n *\n * @param value - Value to parse (string, number, boolean, or object)\n * @param format - Format function to apply to the value\n * @returns Transaction result in the appropriate format\n */\nexport function parseTxValue(\n value: string | number | boolean | object,\n format: any\n): TransactionResult {\n if (typeof value === 'object') {\n return value as TransactionResult\n }\n return format(value) as TransactionResult\n}\n\n/**\n * Parses a pool value for use in transaction building\n *\n * This function handles different pool representations and converts them\n * to the appropriate transaction object format.\n *\n * @param tx - Transaction object to build\n * @param value - Pool value (string, Pool object, or TransactionResult)\n * @returns Transaction result representing the pool\n */\nexport function parseTxPoolValue(tx: Transaction, value: string | Pool | TransactionResult) {\n if (typeof value === 'string') {\n return tx.object(value)\n }\n if (typeof value === 'object' && (value as TransactionResult).$kind) {\n return value as TransactionResult\n }\n return tx.object((value as Pool).contract.pool)\n}\n\n/**\n * Parses the result of a devInspectTransactionBlock call\n *\n * This function extracts and parses return values from transaction inspection\n * results using BCS (Binary Canonical Serialization) types.\n *\n * @param data - DevInspectResults from transaction inspection\n * @param parseTypes - Array of BCS types to parse the return values\n * @param options - Optional configuration including error handling\n * @returns Parsed result data\n */\nexport function parseDevInspectResult<T>(\n data: DevInspectResults,\n parseTypes: BcsType<any>[],\n options?: {\n throwError?: boolean\n }\n): T {\n if (data.results && data.results.length > 0) {\n if (data.results[0].returnValues && data.results[0].returnValues.length > 0) {\n return data.results[0].returnValues.map((item, index) => {\n const parseType = parseTypes[index] || parseTypes[0]\n return parseType.parse(Uint8Array.from(item[0]))\n }) as T\n }\n } else if (data.error) {\n console.log(`Get an error, msg: ${data.error}`)\n if (options?.throwError) {\n throw new Error(data.error)\n }\n return [] as T\n }\n return [] as T\n}\n\n/**\n * Normalizes a coin type string using Sui's struct tag normalization\n *\n * @param coinType - Coin type string to normalize\n * @returns Normalized coin type string\n */\nexport function normalizeCoinType(coinType: string) {\n return normalizeStructTag(coinType)\n}\n\n/**\n * Processes health factor values from contract format to human-readable format\n *\n * This function converts the raw health factor value from the contract\n * (which is typically a large integer) to a more readable decimal format.\n *\n * @param hf - Raw health factor value from contract\n * @returns Processed health factor value\n */\nexport function processContractHealthFactor(hf: number) {\n const healthFactor = (hf || 0) / Math.pow(10, 27)\n if (healthFactor > Math.pow(10, 5)) {\n return Infinity\n }\n return healthFactor\n}\n\n/**\n * Pyth price service connection for oracle price feeds\n *\n * This connection is used to fetch real-time price data from the Pyth network\n * for various assets in the lending protocol.\n */\nexport const suiPythConnection = new SuiPriceServiceConnection('https://hermes.pyth.network', {\n timeout: 20000\n})\n\nexport const Rate_Decimals = 27\n\nexport const rayMathMulIndex = (amount: string | number, index: string | number) => {\n if (!Number(amount) || !Number(index)) return new BigNumber(0)\n const ray = new BigNumber(1).shiftedBy(1 * Rate_Decimals)\n const halfRay = ray.multipliedBy(new BigNumber(0.5))\n return new BigNumber(amount)\n .multipliedBy(new BigNumber(index))\n .plus(halfRay)\n .dividedBy(ray)\n .integerValue(BigNumber.ROUND_DOWN)\n}\n\nexport const requestHeaders = !!userAgent\n ? {\n 'User-Agent': userAgent\n }\n : ({} as HeadersInit)\n\nexport function getPoolsMap(pools: Pool[], key: 'uniqueId' | 'id' = 'uniqueId') {\n return pools.reduce(\n (acc, pool) => {\n acc[pool[key]] = pool\n return acc\n },\n {} as Record<string, Pool>\n )\n}\n\nexport function getEmodesMap(emodes: EMode[], key: 'uniqueId' | 'emodeId' = 'uniqueId') {\n return emodes.reduce(\n (acc, emode) => {\n acc[emode[key]] = emode\n return acc\n },\n {} as Record<string, EMode>\n )\n}\n\nexport function poolToEModePool(pool: Pool, emodeIdentity: EModeIdentity): EModePool {\n const emode = pool.emodes.find((emode) => emode.emodeId === emodeIdentity.emodeId)\n if (!emode) {\n throw new Error('EMode not found in pool')\n }\n const emodeAsset = emode.assets.find((asset) => asset.assetId === pool.id)!\n return {\n ...pool,\n emode: {\n ...emodeAsset,\n emodeId: emode.emodeId\n },\n isEMode: true\n }\n}\n\nexport function parsePoolUID(uid: string) {\n const [marketKey, poolId] = uid.split('-')\n if (!marketKey || !poolId) {\n return null\n }\n return {\n marketKey: marketKey,\n poolId: parseInt(poolId)\n }\n}\n\nexport function uuid() {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)\n}\n","/**\n * Lending Pool Operations\n *\n * This module provides comprehensive pool management functionality for the lending protocol.\n * It handles pool information retrieval, deposit/withdraw operations, borrow/repay operations,\n * and various pool-related utilities and statistics.\n *\n * @module LendingPool\n */\n\nimport { DEFAULT_CACHE_TIME, getConfig } from './config'\nimport type {\n EnvOption,\n CacheOption,\n Pool,\n AssetIdentifier,\n PoolStats,\n FeeDetail,\n CoinObject,\n TransactionResult,\n AccountCapOption,\n BorrowFeeOption,\n SuiClientOption,\n MarketOption,\n EMode,\n MarketsOption\n} from './types'\nimport {\n normalizeCoinType,\n withCache,\n withSingleton,\n parseTxValue,\n suiClient,\n requestHeaders,\n parsePoolUID\n} from './utils'\nimport { Transaction } from '@mysten/sui/transactions'\nimport BigNumber from 'bignumber.js'\nimport { parseDevInspectResult } from './utils'\nimport { bcs } from '@mysten/sui/bcs'\nimport packageJson from '../package.json'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig, MARKETS } from './market'\n\n/**\n * Enumeration of pool operations\n *\n * This enum defines the different types of operations that can be performed\n * on lending pools, used for health factor calculations and operation tracking.\n */\nexport enum PoolOperator {\n /** Supply/deposit operation */\n Supply = 1,\n /** Withdraw operation */\n Withdraw = 2,\n /** Borrow operation */\n Borrow = 3,\n /** Repay operation */\n Repay = 4\n}\n\n/**\n * Fetches all available lending pools\n *\n * This function retrieves the complete list of lending pools from the Navi protocol API.\n * It's wrapped with caching and singleton behavior for efficient data access.\n *\n * @param options - Optional environment and caching options\n * @returns Promise<Pool[]> - Array of all available lending pools\n */\nexport const getPools = withCache(\n withSingleton(\n async (options?: Partial<EnvOption & CacheOption & MarketsOption>): Promise<Pool[]> => {\n const markets = (options?.markets || [MARKETS.main]).map((identity) => {\n return getMarketConfig(identity)\n })\n const url = `https://open-api.naviprotocol.io/api/navi/pools?env=${options?.env || 'prod'}&sdk=${packageJson.version}&market=${markets.map(\n (market) => {\n return market.key\n }\n )}`\n const res: {\n data: Pool[]\n meta: {\n emodes: EMode[]\n }\n } = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n\n res.data.forEach((pool) => {\n const filterEmodes = res.meta.emodes.filter((emode) => {\n const market = getMarketConfig(emode.marketId)\n return pool.market === market.key && emode.isActive\n })\n const emodes = filterEmodes.filter((emode) => {\n return !!emode.assets.find((asset) => asset.assetId === pool.id)\n })\n pool.emodes = emodes\n const poolSupplyAmount = BigNumber(pool.totalSupplyAmount)\n .div(Math.pow(10, 9))\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolBorrowAmount = BigNumber(pool.borrowedAmount)\n .shiftedBy(-9)\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolSupplyValue = BigNumber(poolSupplyAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n const poolBorrowValue = BigNumber(poolBorrowAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n const poolSupplyCapAmount = BigNumber(pool.supplyCapCeiling)\n .shiftedBy(-27)\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolBorrowCapAmount = BigNumber.max(\n BigNumber(pool.borrowedAmount),\n BigNumber(pool.validBorrowAmount)\n )\n .shiftedBy(-9)\n .decimalPlaces(pool.token.decimals, BigNumber.ROUND_DOWN)\n .toString()\n const poolSupplyCapValue = BigNumber(poolSupplyCapAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n const poolBorrowCapValue = BigNumber(poolBorrowCapAmount)\n .multipliedBy(pool.oracle.price)\n .toString()\n pool.poolSupplyAmount = poolSupplyAmount\n pool.poolBorrowAmount = poolBorrowAmount\n pool.poolSupplyValue = poolSupplyValue\n pool.poolBorrowValue = poolBorrowValue\n pool.poolSupplyCapAmount = poolSupplyCapAmount\n pool.poolBorrowCapAmount = poolBorrowCapAmount\n pool.poolSupplyCapValue = poolSupplyCapValue\n pool.poolBorrowCapValue = poolBorrowCapValue\n })\n return res.data\n }\n )\n)\n\n/**\n * Gets information for a specific lending pool\n *\n * This function retrieves pool information based on various identifier types:\n * - Pool object (returns directly)\n * - String (coin type - normalized for comparison)\n * - Number (pool ID)\n *\n * @param identifier - Asset identifier (string, Pool object, or number)\n * @param options - Optional environment options\n * @returns Promise<Pool> - Pool information\n * @throws Error if pool is not found\n */\nexport async function getPool(\n identifier: AssetIdentifier,\n options?: Partial<EnvOption & MarketOption>\n): Promise<Pool> {\n let market = options?.market\n if (typeof identifier === 'string') {\n const parsedUID = parsePoolUID(identifier)\n if (parsedUID) {\n market = parsedUID.marketKey\n identifier = parsedUID.poolId\n }\n }\n const pools = await getPools({\n ...options,\n markets: [market || DEFAULT_MARKET_IDENTITY],\n cacheTime: DEFAULT_CACHE_TIME\n })\n\n // If identifier is already a pool object, return it directly\n if (typeof identifier === 'object') {\n return identifier\n }\n\n // Find pool by identifier\n const pool = pools.find((p) => {\n if (typeof identifier === 'string') {\n return normalizeCoinType(p.suiCoinType) === normalizeCoinType(identifier)\n }\n if (typeof identifier === 'number') {\n return p.id === identifier\n }\n return false\n })\n\n if (!pool) {\n throw new Error(`Pool not found`)\n }\n\n if (pool.isDeprecated) {\n console.log(`The lending pool for coinType ${pool.suiCoinType} is going to be deprecated.`)\n }\n return pool\n}\n\n/**\n * Fetches protocol statistics\n *\n * This function retrieves overall protocol statistics including TVL,\n * total borrow amounts, and other key metrics.\n *\n * @param options - Optional caching options\n * @returns Promise<PoolStats> - Protocol statistics\n */\nexport const getStats = withCache(\n withSingleton(async (options?: Partial<CacheOption>): Promise<PoolStats> => {\n const url = `https://open-api.naviprotocol.io/api/navi/stats?sdk=${packageJson.version}`\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res.data\n })\n)\n\n/**\n * Fetches protocol fee information\n *\n * This function retrieves detailed fee information including:\n * - Total fee value\n * - V3 borrow fees\n * - Borrow interest fees\n * - Flash loan and liquidation fees\n *\n * @param options - Optional caching options\n * @returns Promise with detailed fee breakdown\n */\nexport const getFees = withCache(\n withSingleton(\n async (\n options?: Partial<CacheOption>\n ): Promise<{\n totalValue: number\n v3BorrowFee: {\n totalValue: number\n details: FeeDetail[]\n }\n borrowInterestFee: {\n totalValue: number\n details: FeeDetail[]\n }\n flashloanAndLiquidationFee: {\n totalValue: number\n details: FeeDetail[]\n }\n }> => {\n const url = `https://open-api.naviprotocol.io/api/navi/fee?sdk=${packageJson.version}`\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res\n }\n )\n)\n\n/**\n * Builds a deposit transaction for a lending pool\n *\n * This function creates a transaction block for depositing coins into a lending pool.\n * It handles both regular deposits and deposits with account capabilities,\n * and includes special handling for SUI gas coins.\n *\n * @param tx - Transaction object to build\n * @param identifier - Asset identifier for the pool\n * @param coinObject - Coin object to deposit\n * @param options - Optional parameters including environment, account capability, and amount\n * @returns Promise<Transaction> - Transaction with deposit operation\n */\nexport async function depositCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n coinObject: CoinObject,\n options?: Partial<\n EnvOption &\n AccountCapOption &\n MarketOption & {\n amount: number | TransactionResult\n }\n >\n): Promise<Transaction> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n\n if (pool?.deprecatedAt && Date.now() > pool.deprecatedAt) {\n throw new Error(`The lending pool for coinType ${pool.suiCoinType} has been deprecated.`)\n }\n\n const isGasCoin = typeof coinObject === 'object' && coinObject.$kind === 'GasCoin'\n\n // Handle SUI gas coin deposits\n if (normalizeCoinType(pool.suiCoinType) === normalizeCoinType('0x2::sui::SUI') && isGasCoin) {\n if (!options?.amount) {\n throw new Error('Amount is required for sui coin')\n }\n coinObject = tx.splitCoins(coinObject, [options.amount])\n }\n\n // Determine deposit amount\n let depositAmount: TransactionResult\n\n if (typeof options?.amount !== 'undefined') {\n depositAmount = parseTxValue(options.amount, tx.pure.u64)\n } else {\n depositAmount = tx.moveCall({\n target: '0x2::coin::value',\n arguments: [parseTxValue(coinObject as any, tx.object)],\n typeArguments: [pool.suiCoinType]\n })\n }\n\n // Build deposit transaction based on account capability\n if (options?.accountCap) {\n tx.moveCall({\n target: `${config.package}::incentive_v3::deposit_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n } else {\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_deposit`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n depositAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n }\n\n // refresh stake for sui pool to balance the stake after deposit\n if (config.version === 2 && pool.id === 0 && (!options?.env || options?.env === 'prod')) {\n tx.moveCall({\n target: `${config.package}::pool::refresh_stake`,\n arguments: [tx.object(pool.contract.pool), tx.object('0x05')]\n })\n }\n\n return tx\n}\n\n/**\n * Builds a withdraw transaction for a lending pool\n *\n * Constructs and adds withdrawal operations to a transaction object.\n * This function supports standard withdrawal and withdrawal using account capability.\n *\n * @param tx - The transaction builder to append operations to\n * @param identifier - Asset identifier for the pool\n * @param amount - Amount to withdraw\n * @param options - Optional parameters including environment and account capability\n * @returns Transaction result representing the withdrawn coins\n */\nexport async function withdrawCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n amount: number | TransactionResult,\n options?: Partial<EnvOption & AccountCapOption & MarketOption>\n) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n\n const withdrawAmount = parseTxValue(amount, tx.pure.u64)\n\n let withdrawBalance\n\n if (config.version === 1) {\n // Build withdraw transaction based on account capability\n if (options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n }\n } else {\n // Build withdraw transaction based on account capability\n if (options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_with_account_cap_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::withdraw_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n withdrawAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n withdrawBalance = ret\n }\n }\n\n const withdrawCoin = tx.moveCall({\n target: `0x2::coin::from_balance`,\n arguments: [withdrawBalance],\n typeArguments: [pool.suiCoinType]\n })\n\n return withdrawCoin\n}\n\nexport async function borrowCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n amount: number | TransactionResult,\n options?: Partial<EnvOption & AccountCapOption & MarketOption>\n) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n\n if (pool?.deprecatedAt && Date.now() > pool.deprecatedAt) {\n throw new Error(`The lending pool for coinType ${pool.suiCoinType} has been deprecated.`)\n }\n\n const borrowAmount = parseTxValue(amount, tx.pure.u64)\n\n let borrowBalance\n\n if (config.version === 1) {\n if (!options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n }\n } else {\n if (!options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n } else {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::borrow_with_account_cap_v2`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n borrowAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object),\n tx.object('0x05')\n ],\n typeArguments: [pool.suiCoinType]\n })\n borrowBalance = ret\n }\n }\n\n const coin = tx.moveCall({\n target: `0x2::coin::from_balance`,\n arguments: [tx.object(borrowBalance)],\n typeArguments: [pool.suiCoinType]\n })\n\n return coin\n}\n\n/**\n * Builds a repay transaction for a lending pool debt\n *\n * Constructs and adds repayment operations to an existing transaction object.\n * This function handles loan repayments, supporting both standard user\n * repayments and privileged operations via account capabilities.\n *\n *\n * @param tx - The transaction builder to append repayment operations to\n * @param identifier - Unique identifier for the lending pool asset (e.g., \"USDC\", \"SUI\")\n * @param coinObject - The coin object to use for repayment, or GasCoin for SUI payments\n * @param options - Configuration options for the repayment\n * - `amount` - Specific amount to repay (required for SUI gas coin, otherwise uses value of specified coinObject)\n * - `accountCap` - Optional account capability object for privileged repayments\n * - `env` - Environment configuration\n * - `cacheTime` - Cache duration for configuration data\n *\n * @returns Promise<Transaction | TransactionResult> - The modified transaction object with repayment operations added\n *\n * @throws {Error} When amount is not provided for SUI gas coin repayments\n * @throws Will throw if pool doesn't exist or repayment validation fails\n */\nexport async function repayCoinPTB(\n tx: Transaction,\n identifier: AssetIdentifier,\n coinObject: CoinObject,\n options?: Partial<\n EnvOption &\n AccountCapOption &\n MarketOption & {\n amount: number | TransactionResult\n }\n >\n): Promise<Transaction | TransactionResult> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n const isGasCoin = typeof coinObject === 'object' && coinObject.$kind === 'GasCoin'\n\n if (normalizeCoinType(pool.suiCoinType) === normalizeCoinType('0x2::sui::SUI') && isGasCoin) {\n if (!options?.amount) {\n throw new Error('Amount is required for sui coin')\n }\n coinObject = tx.splitCoins(coinObject, [options.amount])\n }\n\n let repayAmount: TransactionResult\n\n if (typeof options?.amount !== 'undefined') {\n repayAmount = parseTxValue(options.amount, tx.pure.u64)\n } else {\n repayAmount = tx.moveCall({\n target: '0x2::coin::value',\n arguments: [parseTxValue(coinObject as any, tx.object)],\n typeArguments: [pool.suiCoinType]\n })\n }\n\n if (options?.accountCap) {\n const [ret] = tx.moveCall({\n target: `${config.package}::incentive_v3::repay_with_account_cap`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3),\n parseTxValue(options.accountCap, tx.object)\n ],\n typeArguments: [pool.suiCoinType]\n })\n const coin = tx.moveCall({\n target: `0x2::coin::from_balance`,\n arguments: [ret],\n typeArguments: [pool.suiCoinType]\n })\n return coin\n } else {\n tx.moveCall({\n target: `${config.package}::incentive_v3::entry_repay`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.priceOracle),\n tx.object(config.storage),\n tx.object(pool.contract.pool),\n tx.pure.u8(pool.id),\n parseTxValue(coinObject, tx.object),\n repayAmount,\n tx.object(config.incentiveV2),\n tx.object(config.incentiveV3)\n ],\n typeArguments: [pool.suiCoinType]\n })\n return tx\n }\n}\n\n/**\n * Fetches the current borrow fee rate\n *\n * This function can retrieve borrow fee rates in two ways:\n * - If `address` and `asset` are provided, it calculates the specific borrow fee rate\n * for a given address and asset by calling the on-chain `get_borrow_fee_v2` function\n * - Otherwise, it returns the global borrow fee rate from the incentive V3 contract\n *\n * @param options - Optional configuration options\n * - `address` - User address to calculate specific borrow fee (requires `asset` to be set)\n * - `asset` - Asset identifier to calculate specific borrow fee (requires `address` to be set)\n * - `env` - Environment setting ('dev' or 'prod')\n * - `client` - Sui client instance for on-chain queries\n * - `cacheTime` - Cache expiration time in milliseconds\n * - `disableCache` - Whether to disable caching for this operation\n * @returns Promise<number> - Borrow fee rate as a decimal number\n * - When `address` and `asset` are provided: returns the specific fee rate (divided by 10000)\n * - Otherwise: returns the global fee rate (divided by 100)\n */\nexport const getBorrowFee = withCache(\n withSingleton(\n async (\n options?: Partial<EnvOption & CacheOption & BorrowFeeOption & SuiClientOption & MarketOption>\n ): Promise<number> => {\n const config = await getConfig({\n ...options\n })\n if (options?.address && typeof options?.asset !== 'undefined') {\n try {\n const pool = await getPool(options.asset, options)\n const client = options?.client ?? suiClient\n const tx = new Transaction()\n tx.moveCall({\n target: `${config.package}::incentive_v3::get_borrow_fee_v2`,\n arguments: [\n tx.object(config.incentiveV3),\n tx.pure.address(options.address),\n tx.pure.u8(pool.id),\n tx.pure.u64(10000)\n ],\n typeArguments: []\n })\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: options.address\n })\n const res = parseDevInspectResult<number[]>(result, [bcs.u64()])\n return (Number(res[0]) || 0) / 100\n } catch (error) {\n console.error(error)\n }\n }\n const rawData: any = await suiClient.getObject({\n id: config.incentiveV3,\n options: { showType: true, showOwner: true, showContent: true }\n })\n const borrowFee = rawData.data.content.fields.borrow_fee_rate\n return Number(borrowFee) / 100\n }\n )\n)\n","import { withCache, withSingleton, getPoolsMap, getEmodesMap } from './utils'\nimport type {\n MarketIdentity,\n EnvOption,\n CacheOption,\n EMode,\n MarketConfig,\n Pool,\n EModePool\n} from './types'\nimport { getPools } from './pool'\nimport BigNumber from 'bignumber.js'\n\nexport const DEFAULT_MARKET_IDENTITY = 'main'\n\nexport const MARKETS = {\n main: {\n id: 0,\n key: 'main',\n name: 'Main Market'\n }\n}\n\nexport class Market {\n private poolMap = {} as Record<string, Pool>\n private emodeMap = {} as Record<string, EMode>\n readonly config: MarketConfig\n readonly pools: Pool[] = []\n readonly emodes: EMode[] = []\n readonly emodePools: EModePool[] = []\n emodeBorrowablePools: Pool[] = []\n emodeSupplyablePools: Pool[] = []\n\n private _overview = {\n marketTotalSupplyValue: '0',\n marketTotalBorrowValue: '0'\n }\n\n get overview() {\n return this._overview\n }\n\n constructor(marketIdentity: MarketIdentity, pools: Pool[]) {\n this.config = getMarketConfig(marketIdentity)\n this.initPools(pools)\n }\n\n private initPools(pools: Pool[]) {\n const poolsMap = getPoolsMap(this.pools)\n const emodesMap = getEmodesMap(this.emodes)\n const emodeBorrowablePoolIds = new Set<string>()\n const emodeSupplyablePoolIds = new Set<string>()\n let marketTotalSupplyValue = BigNumber(0)\n let marketTotalBorrowValue = BigNumber(0)\n\n pools.forEach((pool) => {\n const isMatch = this.checkMarket(pool.market)\n if (!isMatch) {\n console.warn(`Pool is not in market ${this.config.name}`, pool)\n return\n }\n if (!poolsMap[pool.uniqueId]) {\n this.pools.push(pool)\n }\n pool?.emodes?.forEach((emode) => {\n if (!emodesMap[emode.uniqueId]) {\n this.emodes.push(emode)\n }\n emode.assets.forEach((asset) => {\n if (asset.isDebt) {\n const debtAsset = emode.assets.find(\n (a) => a.isCollateral && a.ltv > 0 && a.assetId !== pool.id\n )\n if (debtAsset) {\n emodeBorrowablePoolIds.add(pool.uniqueId)\n }\n }\n if (asset.isCollateral) {\n const supplyAsset = emode.assets.find((a) => a.isDebt && a.assetId !== pool.id)\n if (supplyAsset) {\n emodeSupplyablePoolIds.add(pool.uniqueId)\n }\n }\n })\n })\n marketTotalBorrowValue = marketTotalBorrowValue.plus(pool.poolBorrowValue)\n marketTotalSupplyValue = marketTotalSupplyValue.plus(pool.poolSupplyValue)\n })\n this.poolMap = getPoolsMap(this.pools, 'id')\n this.emodeMap = getEmodesMap(this.emodes, 'emodeId')\n this.emodes.forEach((emode) => {\n const emodePools = this.getEModePools(emode.emodeId)\n this.emodePools.push(...emodePools)\n })\n this._overview = {\n marketTotalSupplyValue: marketTotalSupplyValue.toString(),\n marketTotalBorrowValue: marketTotalBorrowValue.toString()\n }\n this.emodeBorrowablePools = this.pools.filter((pool) => {\n return emodeBorrowablePoolIds.has(pool.uniqueId)\n })\n this.emodeSupplyablePools = this.pools.filter((pool) => {\n return emodeSupplyablePoolIds.has(pool.uniqueId)\n })\n }\n\n public getEMode(emodeId: number): EMode | null {\n const emode = this.emodeMap[emodeId]\n return emode || null\n }\n\n public getEModeRelatePools(\n pool: Pool,\n options?: {\n collateral?: boolean\n debt?: boolean\n emodeId?: number\n }\n ): Pool[] {\n const { collateral, debt, emodeId } = options || {}\n const relatePools = [] as Pool[]\n pool.emodes.forEach((emode) => {\n if (typeof emodeId === 'number' && emodeId !== emode.emodeId) {\n return\n }\n emode.assets.forEach((asset) => {\n if (\n typeof collateral === 'boolean' &&\n collateral &&\n asset.isCollateral &&\n asset.assetId === pool.id\n ) {\n relatePools.push(this.poolMap[asset.assetId])\n }\n if (typeof debt === 'boolean' && debt && asset.isDebt && asset.assetId === pool.id) {\n relatePools.push(this.poolMap[asset.assetId])\n }\n })\n })\n return relatePools\n }\n\n public getEModePools(emodeId: number): EModePool[] {\n const emode = this.getEMode(emodeId)\n if (!emode) {\n return []\n }\n const pools = emode.assets\n .map((asset) => asset.assetId)\n .map((id) => {\n return this.poolMap[id]\n })\n .filter((pool) => !!pool)\n return pools.map((pool) => {\n const asset = emode.assets.find((asset) => asset.assetId === pool.id)!\n return {\n ...pool,\n emode: {\n ...asset,\n emodeId: emode.emodeId\n },\n isEMode: true\n }\n })\n }\n\n private checkMarket(marketIdentity: MarketIdentity) {\n let isMatch = false\n if (typeof marketIdentity === 'number' && marketIdentity === this.config.id) {\n isMatch = true\n }\n if (typeof marketIdentity === 'string' && marketIdentity === this.config.key) {\n isMatch = true\n }\n if (typeof marketIdentity === 'object' && marketIdentity.id === this.config.id) {\n isMatch = true\n }\n return isMatch\n }\n}\n\nexport const getMarketConfig = (marketIdentity: MarketIdentity) => {\n const configs = Object.values(MARKETS)\n const config = configs.find((marketConfig) => {\n if (typeof marketIdentity === 'number') {\n return marketConfig.id === marketIdentity\n }\n if (typeof marketIdentity === 'string') {\n return marketConfig.key === marketIdentity\n }\n return marketConfig.id === marketIdentity.id\n })\n if (!config) {\n throw new Error(`Market not found`)\n }\n return config\n}\n\nexport const getMarkets = withCache(\n withSingleton(\n async (\n markets: MarketIdentity[],\n options?: Partial<EnvOption & CacheOption>\n ): Promise<Market[]> => {\n const pools = await getPools({\n cacheTime: 1000 * 60,\n ...options,\n markets\n })\n return markets.map((market) => {\n const marketConfig = getMarketConfig(market)\n const marketPools = pools.filter((pool) => {\n return pool.market === marketConfig.key\n })\n return new Market(market, marketPools)\n })\n }\n )\n)\n\nexport const getMarket = withCache(\n withSingleton(\n async (market: MarketIdentity, options?: Partial<EnvOption & CacheOption>): Promise<Market> => {\n const markets = await getMarkets([market], options)\n return markets[0]\n }\n )\n)\n","/**\n * Lending Configuration Management\n *\n * This module provides configuration management for the lending protocol.\n * It handles fetching configuration from the Navi protocol API and provides\n * caching mechanisms for efficient configuration retrieval.\n *\n * @module LendingConfig\n */\n\nimport type { LendingConfig, EnvOption, CacheOption, MarketOption } from './types'\nimport { withCache, withSingleton, requestHeaders } from './utils'\nimport packageJson from '../package.json'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig } from './market'\n\n/**\n * Fetches lending protocol configuration from the API\n *\n * This function retrieves the current configuration for the lending protocol\n * from the Navi protocol API. It's wrapped with both caching and singleton\n * behavior to ensure efficient and consistent configuration access.\n *\n * The configuration includes:\n * - Contract addresses for all protocol components\n * - Oracle configuration and price feed information\n * - Pool and incentive contract addresses\n * - Environment-specific settings\n *\n * @param options - Optional environment and caching options\n * @returns Promise<LendingConfig> - Complete lending protocol configuration\n */\nexport const getConfig = withCache(\n withSingleton(\n async (options?: Partial<EnvOption & CacheOption & MarketOption>): Promise<LendingConfig> => {\n const market = getMarketConfig(options?.market || DEFAULT_MARKET_IDENTITY)\n const url = `https://open-api.naviprotocol.io/api/navi/config?env=${options?.env || 'prod'}&sdk=${packageJson.version}&market=${market.key}`\n\n // Fetch configuration from API\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res.data\n }\n )\n)\n\n/**\n * Default cache time for configuration data\n *\n * Configuration is cached for 5 minutes to reduce API calls\n * while ensuring reasonably fresh configuration data.\n */\nexport const DEFAULT_CACHE_TIME = 1000 * 60 * 5\n","import {\n CacheOption,\n EnvOption,\n EModeCap,\n AccountCapOption,\n MarketOption,\n TransactionResult,\n SuiClientOption,\n EModeIdentity\n} from './types'\nimport { withSingleton, withCache, parseTxValue, suiClient } from './utils'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig } from './market'\nimport { getConfig, DEFAULT_CACHE_TIME } from './config'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { createAccountCapPTB, getAccountCapOwnerPTB } from './account-cap'\nimport { bcs } from '@mysten/sui/bcs'\n\nexport async function enterEModePTB(\n tx: Transaction,\n emodeId: number | TransactionResult,\n options?: Partial<EnvOption & AccountCapOption & MarketOption>\n): Promise<Transaction> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n if (!options?.accountCap) {\n tx.moveCall({\n target: `${config.package}::lending::enter_emode`,\n arguments: [tx.object(config.storage), parseTxValue(emodeId, tx.pure.u64)]\n })\n } else {\n tx.moveCall({\n target: `${config.package}::lending::enter_emode_with_account_cap`,\n arguments: [\n tx.object(config.storage),\n parseTxValue(emodeId, tx.pure.u64),\n parseTxValue(options.accountCap, tx.object)\n ]\n })\n }\n\n return tx\n}\n\nexport async function exitEModePTB(\n tx: Transaction,\n options?: Partial<EnvOption & AccountCapOption & MarketOption>\n): Promise<Transaction> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n if (!options?.accountCap) {\n tx.moveCall({\n target: `${config.package}::lending::exit_emode`,\n arguments: [tx.object(config.storage)]\n })\n } else {\n tx.moveCall({\n target: `${config.package}::lending::exit_emode_with_account_cap`,\n arguments: [tx.object(config.storage), parseTxValue(options.accountCap, tx.object)]\n })\n }\n return tx\n}\n\nexport async function createEModeCapPTB(\n tx: Transaction,\n emodeId: number | TransactionResult,\n options?: Partial<EnvOption & MarketOption>\n) {\n const config = await getConfig({\n cacheTime: DEFAULT_CACHE_TIME,\n ...options\n })\n const accountCap = await createAccountCapPTB(tx, options)\n await enterEModePTB(tx, emodeId, {\n ...options,\n accountCap: accountCap\n })\n const market = await getMarketConfig(options?.market || DEFAULT_MARKET_IDENTITY)\n const accountCapOwner = await getAccountCapOwnerPTB(tx, accountCap, options)\n tx.moveCall({\n target: `${config.emode.contract.registryPackage}::registry::register_emode_for_account_cap`,\n arguments: [\n tx.object(config.emode.contract.registryObject),\n accountCapOwner,\n parseTxValue(market.id, tx.pure.u64),\n parseTxValue(emodeId, tx.pure.u64)\n ]\n })\n return accountCap\n}\n\nexport const getUserEModeCaps = withCache(\n withSingleton(\n async (\n address: string,\n options?: Partial<SuiClientOption & EnvOption & CacheOption>\n ): Promise<EModeCap[]> => {\n const config = await getConfig({\n cacheTime: DEFAULT_CACHE_TIME,\n ...options\n })\n const tx = new Transaction()\n const client = options?.client ?? suiClient\n\n tx.moveCall({\n target: `${config.emode.contract.registryPackage}::registry::find_user_emode_account_caps`,\n arguments: [tx.object(config.emode.contract.registryObject), tx.pure.address(address!)]\n })\n\n const result: any = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n\n const values = result.results[0].returnValues\n\n const marketIds = bcs.vector(bcs.u64()).parse(Uint8Array.from(values[0][0]))\n const emodeIds = bcs.vector(bcs.u64()).parse(Uint8Array.from(values[1][0]))\n const accountCaps = bcs.vector(bcs.Address).parse(Uint8Array.from(values[2][0]))\n\n return marketIds.map((marketId, index) => ({\n marketId: Number(marketId),\n emodeId: Number(emodeIds[index]),\n accountCap: accountCaps[index].toString()\n }))\n }\n )\n)\n\nexport function emodeIdentityId(identifier: EModeIdentity) {\n const market = getMarketConfig(identifier.marketId)\n return `${market.key}-${identifier.emodeId}`\n}\n","/**\n * Lending Account Management\n *\n * This module provides comprehensive account management functionality for the lending protocol.\n * It includes coin merging, health factor calculations, user state management, and various\n * lending operations like supply, borrow, withdraw, and repay.\n *\n * @module LendingAccount\n */\n\nimport type {\n UserLendingInfo,\n SuiClientOption,\n EnvOption,\n Pool,\n Transaction as NAVITransaction,\n AssetIdentifier,\n TransactionResult,\n CacheOption,\n AccountCap,\n MarketOption,\n LendingPosition,\n MarketsOption,\n EModePool,\n EModeCap\n} from './types'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { UserStateInfo } from './bcs'\nimport { getConfig, DEFAULT_CACHE_TIME } from './config'\nimport {\n suiClient,\n camelize,\n parseDevInspectResult,\n withSingleton,\n processContractHealthFactor,\n parseTxValue,\n parseTxPoolValue,\n withCache,\n normalizeCoinType,\n rayMathMulIndex,\n requestHeaders,\n poolToEModePool,\n getPoolsMap,\n uuid\n} from './utils'\nimport { bcs } from '@mysten/sui/bcs'\nimport { CoinStruct, PaginatedCoins } from '@mysten/sui/client'\nimport { getPool, PoolOperator, getPools } from './pool'\nimport packageJson from '../package.json'\nimport { getUserEModeCaps } from './emode'\nimport BigNumber from 'bignumber.js'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig, MARKETS } from './market'\n\n/**\n * Merges multiple coins into a single coin for transaction building\n *\n * This function takes multiple coin objects and merges them into a single coin\n * that can be used in a transaction. It supports optional splitting to create\n * a specific balance amount.\n *\n * @param tx - Transaction object to add merge operations to\n * @param coins - Array of coin objects to merge\n * @param options - Optional parameters for balance splitting and gas coin usage\n * - `balance` - If provided, splits this amount from the resulting coin object\n * - `useGasCoin` - If true, uses the gas coin for the operation\n * @returns Transaction result representing the merged coin\n */\nexport function mergeCoinsPTB(\n tx: Transaction,\n coins: ({\n balance: string | number | bigint\n coinObjectId: string\n coinType: string\n } & CoinStruct)[],\n options?: {\n balance?: number\n useGasCoin?: boolean\n }\n) {\n const needSplit = typeof options?.balance === 'number'\n const splitBalance = needSplit ? options.balance! : 0\n let mergedBalance = 0\n const mergeList: string[] = []\n let coinType = ''\n\n // Sort coins by balance (highest first) and collect valid coins\n coins\n .sort((a, b) => Number(b.balance) - Number(a.balance))\n .forEach((coin) => {\n if (needSplit && mergedBalance >= splitBalance) {\n return\n }\n if (Number(coin.balance) === 0) {\n return\n }\n if (!coinType) {\n coinType = coin.coinType\n }\n if (coinType !== coin.coinType) {\n throw new Error('All coins must be of the same type')\n }\n mergedBalance += Number(coin.balance)\n mergeList.push(coin.coinObjectId)\n })\n\n if (mergeList.length === 0) {\n throw new Error('No coins to merge')\n }\n if (needSplit && mergedBalance < splitBalance) {\n throw new Error(\n `Balance is less than the specified balance: ${mergedBalance} < ${splitBalance}`\n )\n }\n\n // Handle SUI gas coin specially\n if (normalizeCoinType(coinType) === normalizeCoinType('0x2::sui::SUI') && options?.useGasCoin) {\n return needSplit ? tx.splitCoins(tx.gas, [tx.pure.u64(splitBalance)]) : tx.gas\n }\n\n // Merge coins and optionally split\n\n mergeList.length === 1 ? tx.object(mergeList[0]) : tx.mergeCoins(mergeList[0], mergeList.slice(1))\n\n return needSplit ? tx.splitCoins(mergeList[0], [tx.pure.u64(splitBalance)]) : mergeList[0]\n}\n\n/**\n * Calculates dynamic health factor for a user after potential operations\n *\n * This function creates a transaction call to calculate the health factor\n * that would result after performing supply/borrow operations.\n *\n * @param tx - Transaction object to append calculation to\n * @param address - User address or transaction result\n * @param identifier - Asset identifier\n * @param estimatedSupply - Estimated supply amount\n * @param estimatedBorrow - Estimated borrow amount\n * @param isIncrease - Whether this is an increase operation\n * @param options - Environment options\n * @returns Transaction result for health factor calculation\n */\nexport async function getSimulatedHealthFactorPTB(\n tx: Transaction,\n address: string | AccountCap | TransactionResult,\n identifier: AssetIdentifier,\n estimatedSupply: number | TransactionResult,\n estimatedBorrow: number | TransactionResult,\n isIncrease: boolean | TransactionResult,\n options?: Partial<EnvOption & MarketOption>\n): Promise<TransactionResult> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n const pool = await getPool(identifier, options)\n return tx.moveCall({\n target: `${config.uiGetter}::calculator_unchecked::dynamic_health_factor`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.storage),\n tx.object(config.oracle.priceOracle),\n parseTxPoolValue(tx, pool),\n parseTxValue(address, tx.pure.address),\n parseTxValue(pool.id, tx.pure.u8),\n parseTxValue(estimatedSupply, tx.pure.u64),\n parseTxValue(estimatedBorrow, tx.pure.u64),\n parseTxValue(isIncrease, tx.pure.bool)\n ],\n typeArguments: [pool.suiCoinType]\n })\n}\n\n/**\n * Gets the current health factor for a user\n *\n * @param tx - The transaction object to add health factor query operation to\n * @param address - User address or account cap or transaction result\n * @param options - Environment options\n * @returns Transaction result for health factor calculation\n */\nexport async function getHealthFactorPTB(\n tx: Transaction,\n address: string | AccountCap | TransactionResult,\n options?: Partial<EnvOption>\n): Promise<TransactionResult> {\n return getSimulatedHealthFactorPTB(tx, address, 0, 0, 0, false, options)\n}\n\nasync function getLendingStateBatch(\n address: string,\n tasks: {\n address: string\n market: string\n emodeId?: number\n }[],\n options?: Partial<\n SuiClientOption &\n EnvOption &\n CacheOption & {\n includeZeroBalanceEmodePositions?: boolean\n }\n >\n): Promise<UserLendingInfo[]> {\n const tx = new Transaction()\n const client = options?.client ?? suiClient\n const pools = await getPools({\n ...options,\n markets: Object.values(MARKETS)\n })\n const poolsMap = getPoolsMap(pools)\n\n for (let task of tasks) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME,\n market: task.market\n })\n tx.moveCall({\n target: `${config.uiGetter}::getter_unchecked::get_user_state`,\n arguments: [tx.object(config.storage), tx.pure.address(task.address)]\n })\n }\n\n const resp = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n\n const stateList = (resp.results || []).map((result) => {\n return (\n result.returnValues?.map((item) => {\n return bcs.vector(UserStateInfo as any).parse(Uint8Array.from(item[0]))\n })[0] || []\n )\n }) as {\n supply_balance: string\n borrow_balance: string\n asset_id: number\n }[][]\n\n const result = [] as UserLendingInfo[]\n\n stateList.forEach((states, index) => {\n const task = tasks[index]\n const market = getMarketConfig(task.market)\n states.forEach((state) => {\n if (state.supply_balance === '0' && state.borrow_balance === '0') {\n if (task.emodeId === undefined) {\n return\n }\n if (!options?.includeZeroBalanceEmodePositions) {\n return\n }\n }\n const pool = poolsMap[`${market.key}-${state.asset_id}`]\n if (!pool) {\n return\n }\n const supplyBalance = rayMathMulIndex(\n state.supply_balance,\n pool!.currentSupplyIndex\n ).toString()\n const borrowBalance = rayMathMulIndex(\n state.borrow_balance,\n pool!.currentBorrowIndex\n ).toString()\n result.push({\n supplyBalance,\n borrowBalance,\n assetId: state.asset_id,\n market: market.key,\n pool,\n emodeId: task.emodeId\n })\n })\n })\n\n return result\n}\n\n/**\n * Retrieves the current lending state for a user\n *\n * This function fetches all active lending positions for a user, including\n * supply and borrow balances for different assets.\n *\n * @param address - User wallet address or account cap\n * @param options - Options for client, environment, and caching\n * @returns Promise<UserLendingInfo[]> - Array of user lending positions\n */\nexport const getLendingState = withCache(\n async (\n address: string | AccountCap,\n options?: Partial<SuiClientOption & EnvOption & CacheOption & MarketsOption>\n ): Promise<UserLendingInfo[]> => {\n const markets = (options?.markets || Object.keys(MARKETS)).map((item) => {\n return getMarketConfig(item)\n })\n\n const tasks = markets.map((market) => {\n return {\n address,\n market: market.key\n }\n })\n\n return await getLendingStateBatch(address, tasks, options)\n }\n)\n\n/**\n * Calculates the current health factor for a user\n *\n * @param address - User wallet address or account cap\n * @param options - Options for client and environment\n * @returns Promise<number> - Health factor value\n */\nexport async function getHealthFactor(\n address: string | AccountCap,\n options?: Partial<SuiClientOption & EnvOption>\n): Promise<number> {\n const client = options?.client ?? suiClient\n const tx = new Transaction()\n await getHealthFactorPTB(tx, address, options)\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n const res = parseDevInspectResult<number[]>(result, [bcs.u256()])\n return processContractHealthFactor(Number(res[0]) || 0)\n}\n\n/**\n * Calculates the health factor after performing lending operations\n *\n * This function simulates the health factor that would result after\n * performing a series of supply, withdraw, borrow, or repay operations.\n *\n * @param address - User wallet address or account cap\n * @param identifier - Asset identifier\n * @param operations - Array of operations to simulate\n * @param options - Options for client and environment\n * @returns Promise<number> - Projected health factor\n */\nexport async function getSimulatedHealthFactor(\n address: string | AccountCap,\n identifier: AssetIdentifier,\n operations: {\n type: PoolOperator\n amount: number\n }[],\n options?: Partial<SuiClientOption & EnvOption>\n): Promise<number> {\n const client = options?.client ?? suiClient\n const tx = new Transaction()\n let estimatedSupply = 0\n let estimatedBorrow = 0\n const pool = await getPool(identifier, options)\n\n // Calculate estimated changes from operations\n operations.forEach((operation) => {\n if (operation.type === PoolOperator.Supply) {\n estimatedSupply += operation.amount\n } else if (operation.type === PoolOperator.Withdraw) {\n estimatedSupply -= operation.amount\n } else if (operation.type === PoolOperator.Borrow) {\n estimatedBorrow += operation.amount\n } else if (operation.type === PoolOperator.Repay) {\n estimatedBorrow -= operation.amount\n }\n })\n\n // Validate operation consistency\n if (estimatedSupply * estimatedBorrow < 0) {\n throw new Error('Invalid operations')\n }\n\n // Determine if this is an increase operation\n const isIncrease = estimatedSupply > 0 || estimatedBorrow > 0\n\n // Calculate the dynamic health factor\n await getSimulatedHealthFactorPTB(\n tx,\n address,\n pool,\n Math.abs(estimatedSupply),\n Math.abs(estimatedBorrow),\n isIncrease,\n options\n )\n\n // Execute dry run to get the result\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n const res = parseDevInspectResult<number[]>(result, [bcs.u256()])\n return processContractHealthFactor(Number(res[0]) || 0)\n}\n\n/**\n * Retrieves transaction history for a user from the Navi protocol API\n *\n * This function fetches the transaction history for a specific user address\n * from the Navi protocol's open API. It supports pagination through cursor-based navigation.\n *\n * @param address - User wallet address or account cap\n * @param options - Optional parameters including cursor for pagination\n * @returns Promise with transaction data and optional cursor for next page\n */\nexport const getTransactions = withSingleton(\n async (\n address: string | AccountCap,\n options?: {\n cursor?: string\n }\n ): Promise<{\n data: NAVITransaction[]\n cursor?: string\n }> => {\n // Build query parameters for the API request\n const params = new URLSearchParams()\n if (options?.cursor) {\n params.set('cursor', options.cursor)\n }\n params.set('userAddress', address)\n\n // Fetch transaction history from Navi protocol API\n const url = `https://open-api.naviprotocol.io/api/navi/user/transactions?${params.toString()}&sdk=${packageJson.version}`\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res.data\n }\n)\n\n/**\n * Retrieves all coins owned by a user address\n *\n * This function fetches all coin objects owned by a specific address from the Sui blockchain.\n * It supports filtering by coin type and handles pagination automatically to retrieve all coins.\n *\n * @param address - User wallet address\n * @param options - Optional parameters including coin type filter and client options\n * - `coinType` - If specified, retrieves only coins of this type\n * - `client` - If provided, uses this `SuiClient` instance instead of the default client\n * @returns Promise<CoinStruct[]> - Array of coin objects owned by the address\n */\nexport async function getCoins(\n address: string,\n options?: Partial<\n {\n coinType?: string\n } & SuiClientOption\n >\n): Promise<CoinStruct[]> {\n let cursor: string | undefined | null = null\n const allCoinDatas: CoinStruct[] = []\n const client = options?.client ?? suiClient\n\n // Fetch all coins using pagination\n do {\n let res: PaginatedCoins\n\n // Use specific coin type filter if provided, otherwise get all coins\n if (options?.coinType) {\n res = await client.getCoins({\n owner: address,\n coinType: options?.coinType,\n cursor,\n limit: 100\n })\n } else {\n res = await client.getAllCoins({\n owner: address,\n cursor,\n limit: 100\n })\n }\n\n // Break if no more data\n if (!res.data || !res.data.length) {\n break\n }\n\n // Collect coin data and continue with next page\n allCoinDatas.push(...res.data)\n cursor = res.nextCursor\n } while (cursor)\n\n return allCoinDatas\n}\n\nexport const getLendingPositions = withCache(\n async (\n address: string,\n options?: Partial<\n SuiClientOption &\n EnvOption &\n CacheOption &\n MarketsOption & {\n includeZeroBalanceEmodePositions?: boolean\n }\n >\n ): Promise<LendingPosition[]> => {\n const positions: LendingPosition[] = []\n const markets = (options?.markets || Object.keys(MARKETS)).map((item) => {\n return getMarketConfig(item)\n })\n\n let emodeCaps: EModeCap[] = []\n\n try {\n emodeCaps = await getUserEModeCaps(address, options)\n } catch (e) {\n console.error(e)\n }\n\n const tasks = markets\n .map((market) => {\n return {\n address,\n market: market.key\n }\n })\n .concat(\n emodeCaps\n .filter((cap) => {\n return !!markets.find((market) => market.id === cap.marketId)\n })\n .map((emodeCap) => {\n return {\n address: emodeCap.accountCap,\n market: getMarketConfig(emodeCap.marketId).key,\n emodeId: emodeCap.emodeId\n }\n })\n )\n\n const lendingStates = await getLendingStateBatch(address, tasks, options)\n\n lendingStates.forEach((lendingState) => {\n const emodeCap =\n typeof lendingState.emodeId === 'number'\n ? emodeCaps.find((cap) => {\n const market = getMarketConfig(lendingState.market)\n return cap.emodeId === lendingState.emodeId && cap.marketId === market.id\n })\n : undefined\n if (emodeCap) {\n const inEmode = lendingState.pool.emodes.find((emode) => emode.emodeId === emodeCap.emodeId)\n if (!inEmode) {\n return\n }\n if (BigNumber(lendingState.supplyBalance).gte(0)) {\n const supplyAmount = BigNumber(lendingState.supplyBalance)\n .shiftedBy(-9)\n .decimalPlaces(lendingState.pool.token.decimals, BigNumber.ROUND_DOWN)\n\n const emodePool = poolToEModePool(lendingState.pool, emodeCap)\n\n if (supplyAmount.gt(0) || emodePool.emode.isCollateral) {\n try {\n positions.push({\n id: `${lendingState.pool.uniqueId}_${emodeCap.emodeId}_navi-lending-emode-supply-${uuid()}`,\n wallet: address,\n protocol: 'navi',\n market: lendingState.market,\n type: 'navi-lending-emode-supply',\n 'navi-lending-emode-supply': {\n amount: supplyAmount.toString(),\n pool: poolToEModePool(lendingState.pool, emodeCap),\n token: lendingState.pool.token,\n valueUSD: supplyAmount.multipliedBy(lendingState.pool.oracle.price).toString(),\n emodeCap: emodeCap\n }\n })\n } catch (e) {\n console.error(e)\n }\n }\n }\n if (BigNumber(lendingState.borrowBalance).gte(0)) {\n const borrowAmount = BigNumber(lendingState.borrowBalance)\n .shiftedBy(-9)\n .decimalPlaces(lendingState.pool.token.decimals, BigNumber.ROUND_DOWN)\n\n const emodePool = poolToEModePool(lendingState.pool, emodeCap)\n\n if (borrowAmount.gt(0) || emodePool.emode.isDebt) {\n try {\n positions.push({\n id: `${lendingState.pool.uniqueId}_${emodeCap.emodeId}_navi-lending-emode-borrow-${uuid()}`,\n wallet: address,\n protocol: 'navi',\n market: lendingState.market,\n type: 'navi-lending-emode-borrow',\n 'navi-lending-emode-borrow': {\n amount: borrowAmount.toString(),\n pool: poolToEModePool(lendingState.pool, emodeCap),\n token: lendingState.pool.token,\n valueUSD: borrowAmount.multipliedBy(lendingState.pool.oracle.price).toString(),\n emodeCap: emodeCap\n }\n })\n } catch (e) {\n console.error(e)\n }\n }\n }\n } else {\n if (BigNumber(lendingState.supplyBalance).gt(0)) {\n const supplyAmount = BigNumber(lendingState.supplyBalance)\n .shiftedBy(-9)\n .decimalPlaces(lendingState.pool.token.decimals, BigNumber.ROUND_DOWN)\n positions.push({\n id: `${lendingState.pool.uniqueId}_navi-lending-supply-${uuid()}`,\n wallet: address,\n protocol: 'navi',\n type: 'navi-lending-supply',\n market: lendingState.market,\n 'navi-lending-supply': {\n amount: supplyAmount.toString(),\n pool: lendingState.pool,\n token: lendingState.pool.token,\n valueUSD: supplyAmount.multipliedBy(lendingState.pool.oracle.price).toString()\n }\n })\n }\n if (BigNumber(lendingState.borrowBalance).gt(0)) {\n const borrowAmount = BigNumber(lendingState.borrowBalance)\n .shiftedBy(-9)\n .decimalPlaces(lendingState.pool.token.decimals, BigNumber.ROUND_DOWN)\n positions.push({\n id: `${lendingState.pool.uniqueId}_navi-lending-borrow-${uuid()}`,\n wallet: address,\n protocol: 'navi',\n market: lendingState.market,\n type: 'navi-lending-borrow',\n 'navi-lending-borrow': {\n amount: borrowAmount.toString(),\n pool: lendingState.pool,\n token: lendingState.pool.token,\n valueUSD: borrowAmount.multipliedBy(lendingState.pool.oracle.price).toString()\n }\n })\n }\n }\n })\n return positions\n }\n)\n\nexport class UserPositions {\n private _positions: LendingPosition[] = []\n private _overview = {\n hf: Infinity,\n netVaule: '0',\n netWorthApr: '0',\n totalSupplyValue: '0',\n totalBorrowValue: '0',\n totalsupplyApy: '0',\n totalBorrowApy: '0',\n maxLiquidationValue: '0',\n maxLoanToVaule: '0',\n supply: {} as Record<string, string>,\n borrow: {} as Record<string, string>\n }\n\n get positions() {\n return this._positions\n }\n\n get overview() {\n return this._overview\n }\n\n set positions(positions: LendingPosition[]) {\n this._positions = positions\n this._overview = this.getPositionsOverview(positions)\n }\n\n constructor(positions: LendingPosition[]) {\n this.positions = positions\n }\n\n public filterPositionsByPool(pool: Pool | EModePool) {\n const isEmode = !!(pool as EModePool).isEMode\n const types = isEmode\n ? ['navi-lending-emode-supply', 'navi-lending-emode-borrow']\n : ['navi-lending-supply', 'navi-lending-borrow']\n return new UserPositions(\n this.positions.filter((position) => {\n const positionData = position[position.type]!\n return types.includes(position.type) && positionData.pool.uniqueId === pool.uniqueId\n })\n )\n }\n\n public deposit(pool: Pool | EModePool, amount: number) {\n const isEmode = !!(pool as EModePool).isEMode\n let position: LendingPosition\n if (isEmode) {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-emode-supply',\n 'navi-lending-emode-supply': {\n amount: amount.toString(),\n valueUSD: BigNumber(amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any,\n emodeCap: {} as any\n }\n }\n } else {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-supply',\n 'navi-lending-supply': {\n amount: amount.toString(),\n valueUSD: BigNumber(amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any\n }\n }\n }\n return new UserPositions([...this.positions, position])\n }\n\n public withdraw(pool: Pool | EModePool, amount: number) {\n const isEmode = !!(pool as EModePool).isEMode\n let position: LendingPosition\n if (isEmode) {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-emode-supply',\n 'navi-lending-emode-supply': {\n amount: (-amount).toString(),\n valueUSD: BigNumber(-amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any,\n emodeCap: {} as any\n }\n }\n } else {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-supply',\n 'navi-lending-supply': {\n amount: (-amount).toString(),\n valueUSD: BigNumber(-amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any\n }\n }\n }\n return new UserPositions([...this.positions, position])\n }\n\n public borrow(pool: Pool | EModePool, amount: number) {\n const isEmode = !!(pool as EModePool).isEMode\n let position: LendingPosition\n if (isEmode) {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-emode-borrow',\n 'navi-lending-emode-borrow': {\n amount: amount.toString(),\n valueUSD: BigNumber(amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any,\n emodeCap: {} as any\n }\n }\n } else {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-borrow',\n 'navi-lending-borrow': {\n amount: amount.toString(),\n valueUSD: BigNumber(amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any\n }\n }\n }\n return new UserPositions([...this.positions, position])\n }\n\n public repay(pool: Pool | EModePool, amount: number) {\n const isEmode = !!(pool as EModePool).isEMode\n let position: LendingPosition\n if (isEmode) {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-emode-borrow',\n 'navi-lending-emode-borrow': {\n amount: (-amount).toString(),\n valueUSD: BigNumber(-amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any,\n emodeCap: {} as any\n }\n }\n } else {\n position = {\n id: uuid(),\n wallet: '',\n protocol: 'navi',\n market: '',\n type: 'navi-lending-borrow',\n 'navi-lending-borrow': {\n amount: (-amount).toString(),\n valueUSD: BigNumber(-amount).multipliedBy(pool.oracle.price).toString(),\n token: pool.token,\n pool: pool as any\n }\n }\n }\n return new UserPositions([...this.positions, position])\n }\n\n getPositionsOverview(positions: LendingPosition[]) {\n const supply = {} as Record<string, string>\n const borrow = {} as Record<string, string>\n let totalSupplyValue = new BigNumber(0)\n let totalBorrowValue = new BigNumber(0)\n let totalsupplyApy = new BigNumber(0)\n let totalBorrowApy = new BigNumber(0)\n let maxLiquidationValue = new BigNumber(0)\n let maxLoanToVaule = new BigNumber(0)\n positions.forEach((position) => {\n if (position.type === 'navi-lending-supply') {\n const data = position['navi-lending-supply']!\n totalSupplyValue = totalSupplyValue.plus(data.valueUSD)\n maxLiquidationValue = maxLiquidationValue.plus(\n new BigNumber(data.valueUSD).multipliedBy(data.pool.liquidationFactor.threshold)\n )\n maxLoanToVaule = maxLoanToVaule.plus(\n new BigNumber(data.valueUSD).multipliedBy(data.pool.ltvValue)\n )\n } else if (position.type === 'navi-lending-borrow') {\n totalBorrowValue = totalBorrowValue.plus(position['navi-lending-borrow']!.valueUSD)\n } else if (position.type === 'navi-lending-emode-supply') {\n const data = position['navi-lending-emode-supply']!\n totalSupplyValue = totalSupplyValue.plus(data.valueUSD)\n const poolEmodeConfig = data.pool.emode\n maxLiquidationValue = maxLiquidationValue.plus(\n new BigNumber(data.valueUSD).multipliedBy(poolEmodeConfig.lt)\n )\n maxLoanToVaule = maxLoanToVaule.plus(\n new BigNumber(data.valueUSD).multipliedBy(poolEmodeConfig.ltv)\n )\n } else if (position.type === 'navi-lending-emode-borrow') {\n totalBorrowValue = totalBorrowValue.plus(position['navi-lending-emode-borrow']!.valueUSD)\n }\n })\n\n totalBorrowValue = BigNumber.max(totalBorrowValue, 0)\n totalSupplyValue = BigNumber.max(totalSupplyValue, 0)\n maxLiquidationValue = BigNumber.max(maxLiquidationValue, 0)\n maxLoanToVaule = BigNumber.max(maxLoanToVaule, 0)\n\n positions.forEach((position) => {\n if (position.type === 'navi-lending-supply') {\n const data = position['navi-lending-supply']!\n const apy = data.pool.supplyIncentiveApyInfo.apy\n if (totalSupplyValue.gt(0)) {\n totalsupplyApy = totalsupplyApy.plus(\n new BigNumber(data.valueUSD)\n .dividedBy(totalSupplyValue)\n .multipliedBy(new BigNumber(apy).dividedBy(100))\n )\n }\n supply[data.pool.suiCoinType] = BigNumber(supply[data.pool.suiCoinType] || 0)\n .plus(data.amount)\n .toString()\n } else if (position.type === 'navi-lending-borrow') {\n const data = position['navi-lending-borrow']!\n const apy = data.pool.borrowIncentiveApyInfo.apy\n if (totalBorrowValue.gt(0)) {\n totalBorrowApy = totalBorrowApy.plus(\n new BigNumber(data.valueUSD)\n .dividedBy(totalBorrowValue)\n .multipliedBy(new BigNumber(apy).dividedBy(100))\n )\n }\n borrow[data.pool.suiCoinType] = BigNumber(borrow[data.pool.suiCoinType] || 0)\n .plus(data.amount)\n .toString()\n } else if (position.type === 'navi-lending-emode-supply') {\n const data = position['navi-lending-emode-supply']!\n const apy = data.pool.supplyIncentiveApyInfo.apy\n if (totalSupplyValue.gt(0)) {\n totalsupplyApy = totalsupplyApy.plus(\n new BigNumber(data.valueUSD)\n .dividedBy(totalSupplyValue)\n .multipliedBy(new BigNumber(apy).dividedBy(100))\n )\n }\n supply[data.pool.suiCoinType] = BigNumber(supply[data.pool.suiCoinType] || 0)\n .plus(data.amount)\n .toString()\n } else if (position.type === 'navi-lending-emode-borrow') {\n const data = position['navi-lending-emode-borrow']!\n const apy = data.pool.borrowIncentiveApyInfo.apy\n if (totalBorrowValue.gt(0)) {\n totalBorrowApy = totalBorrowApy.plus(\n new BigNumber(data.valueUSD)\n .dividedBy(totalBorrowValue)\n .multipliedBy(new BigNumber(apy).dividedBy(100))\n )\n }\n borrow[data.pool.suiCoinType] = BigNumber(borrow[data.pool.suiCoinType] || 0)\n .plus(data.amount)\n .toString()\n }\n })\n\n const netVaule = totalSupplyValue.minus(totalBorrowValue)\n const netWorthApr = totalSupplyValue.minus(totalBorrowValue).eq(0)\n ? new BigNumber(0)\n : totalSupplyValue\n .multipliedBy(totalsupplyApy)\n .minus(totalBorrowValue.multipliedBy(totalBorrowApy))\n .div(totalSupplyValue.minus(totalBorrowValue))\n const hf =\n totalBorrowValue.toNumber() !== 0\n ? maxLiquidationValue.dividedBy(totalBorrowValue).toNumber()\n : Infinity\n\n return {\n hf,\n netVaule: netVaule.toString(),\n netWorthApr: netWorthApr.toString(),\n totalSupplyValue: totalSupplyValue.toString(),\n totalBorrowValue: totalBorrowValue.toString(),\n totalsupplyApy: totalsupplyApy.toString(),\n totalBorrowApy: totalBorrowApy.toString(),\n maxLiquidationValue: maxLiquidationValue.toString(),\n maxLoanToVaule: maxLoanToVaule.toString(),\n supply,\n borrow\n }\n }\n}\n\nexport async function verifyHealthFactorPTB(\n tx: Transaction,\n address: string | AccountCap | TransactionResult,\n hf: number,\n options?: Partial<EnvOption>\n) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n if (config.limter) {\n tx.moveCall({\n target: `${config.limter}::navi_adaptor::verify_navi_position_healthy`,\n arguments: [\n tx.object('0x06'),\n tx.object(config.storage),\n tx.object(config.priceOracle),\n parseTxValue(address, tx.pure.address),\n tx.pure.u256(new BigNumber(hf).shiftedBy(27).toNumber())\n ]\n })\n }\n}\n","/**\n * Oracle Price Feed Management for Lending Protocol\n *\n * This module provides oracle price feed functionality for the lending protocol.\n * It integrates with Pyth Network for real-time price data and manages price updates\n * for various assets used in lending operations.\n */\n\nimport { getConfig, DEFAULT_CACHE_TIME } from './config'\nimport type {\n OraclePriceFeed,\n EnvOption,\n UserLendingInfo,\n Pool,\n SuiClientOption,\n MarketOption,\n LendingPosition\n} from './types'\nimport { SuiPriceServiceConnection, SuiPythClient } from '@pythnetwork/pyth-sui-js'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { suiClient } from './utils'\nimport { getPools } from './pool'\nimport { getLendingPositions } from './account'\n\ntype PythInfo = {\n priceFeedId: string\n priceInfoObject: string\n expiration?: number\n}\n\nexport type PythPriceInfo = {\n priceFeedId: string\n priceInfoObject: string\n price: string\n conf: string\n publishTime: number\n expiration?: number\n}\n\n/**\n * Pyth Network connection for price feed data\n * Connects to the Hermes endpoint for real-time price updates\n */\nconst suiPythConnection = new SuiPriceServiceConnection('https://hermes.pyth.network', {\n timeout: 10000\n})\n\n/**\n * Get stale price feed IDs from Pyth Network\n *\n * Identifies price feeds that have not been updated recently (more than 30 seconds old).\n * This helps ensure that only fresh price data is used for lending operations.\n *\n * @param priceIds - Array of Pyth price feed IDs to check\n * @returns Array of stale price feed IDs that need updating\n * @throws Error if failed to fetch price feed data\n */\nexport async function getPythStalePriceFeedId(priceIds: string[]): Promise<string[]> {\n try {\n const returnData: string[] = []\n const latestPriceFeeds = await suiPythConnection.getLatestPriceFeeds(priceIds)\n if (!latestPriceFeeds) return returnData\n\n const currentTimestamp = Math.floor(new Date().valueOf() / 1000)\n for (const priceFeed of latestPriceFeeds) {\n const uncheckedPrice = priceFeed.getPriceUnchecked()\n if (uncheckedPrice.publishTime > currentTimestamp) {\n console.warn(\n `pyth price feed is invalid, id: ${priceFeed.id}, publish time: ${uncheckedPrice.publishTime}, current timestamp: ${currentTimestamp}`\n )\n continue\n }\n\n // From pyth state is 60, but setting it to 30 makes more sense.\n if (currentTimestamp - priceFeed.getPriceUnchecked().publishTime > 30) {\n console.info(\n `stale price feed, id: ${priceFeed.id}, publish time: ${uncheckedPrice.publishTime}, current timestamp: ${currentTimestamp}`\n )\n returnData.push(priceFeed.id)\n }\n }\n return returnData\n } catch (error) {\n throw new Error(`failed to get pyth stale price feed id, msg: ${(error as Error).message}`)\n }\n}\n\nasync function getOnChainPriceInfo(\n pythInfos: PythInfo[],\n options?: Partial<SuiClientOption>\n): Promise<PythPriceInfo[] | undefined> {\n try {\n const priceInfos: PythPriceInfo[] = []\n const client = options?.client ?? suiClient\n\n const priceInfoObjectIds = pythInfos.map((k) => k.priceInfoObject)\n const priceInfoObjects = await client.multiGetObjects({\n ids: Array.from(new Set(priceInfoObjectIds)),\n options: { showContent: true }\n })\n for (const obj of priceInfoObjects) {\n const data = obj.data\n if (!data || !data.content || data.content.dataType !== 'moveObject') {\n console.warn(`fetched object ${data?.objectId} datatype should be moveObject`)\n continue\n }\n\n const pythInfo = pythInfos.find((v) => v.priceInfoObject == data.objectId)\n if (!pythInfo) {\n console.warn(`unable to find pyth info from array, priceInfoObject: ${data.objectId}`)\n continue\n }\n\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n const objectFields = data.content.fields.price_info.fields.price_feed.fields.price.fields\n const { magnitude, negative } = objectFields.price.fields\n const conf = objectFields.conf\n const timestamp = objectFields.timestamp\n\n priceInfos.push({\n priceFeedId: pythInfo.priceFeedId,\n priceInfoObject: pythInfo.priceInfoObject,\n price: negative ? '-' + magnitude : magnitude,\n conf,\n publishTime: Number(timestamp),\n expiration: pythInfo.expiration\n })\n }\n return priceInfos\n } catch (err) {\n console.error(err, `Polling Sui on-chain price for ${pythInfos} failed.`)\n return undefined\n }\n}\n\nexport async function getPythStalePriceFeedIdV2(\n pythInfos: PythInfo[],\n options?: Partial<SuiClientOption>\n): Promise<string[]> {\n try {\n const returnData: string[] = []\n const latestPriceFeeds = await getOnChainPriceInfo(pythInfos, options)\n if (!latestPriceFeeds) return returnData\n\n const currentTimestamp = Math.floor(new Date().valueOf() / 1000)\n\n for (const priceFeed of latestPriceFeeds) {\n if (priceFeed.publishTime > currentTimestamp) {\n console.warn(\n `pyth price feed is invalid, id: ${priceFeed.priceFeedId}, publish time: ${priceFeed.publishTime}, current timestamp: ${currentTimestamp}`\n )\n continue\n }\n\n const maxTime = priceFeed.expiration || 60\n // 3s is the margin of error for the price feed.\n if (currentTimestamp - priceFeed.publishTime > maxTime) {\n console.info(\n `stale price feed, id: ${priceFeed.priceFeedId}, publish time: ${priceFeed.publishTime}, current timestamp: ${currentTimestamp}`\n )\n returnData.push(priceFeed.priceFeedId)\n }\n }\n return returnData\n } catch (error) {\n throw new Error(`failed to get pyth stale price feed id, msg: ${(error as Error).message}`)\n }\n}\n\n/**\n * Update Pyth price feeds in a transaction\n *\n * Fetches the latest price update data from Pyth Network and adds the update\n * operations to the transaction block.\n *\n * @param tx - The transaction block to add price feed updates to\n * @param priceFeedIds - Array of Pyth price feed IDs to update\n * @param options - Optional client and environment configuration\n * @returns Promise that resolves when price feeds are updated\n * @throws Error if failed to update price feeds\n */\nexport async function updatePythPriceFeeds(\n tx: Transaction,\n priceFeedIds: string[],\n options?: Partial<SuiClientOption & EnvOption & MarketOption>\n) {\n const client = options?.client ?? suiClient\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n try {\n const priceUpdateData = await suiPythConnection.getPriceFeedsUpdateData(priceFeedIds)\n const suiPythClient = new SuiPythClient(\n client as any,\n config.oracle.pythStateId,\n config.oracle.wormholeStateId\n )\n\n return await suiPythClient.updatePriceFeeds(tx as any, priceUpdateData, priceFeedIds)\n } catch (error) {\n throw new Error(`failed to update pyth price feeds, msg: ${(error as Error).message}`)\n }\n}\n\n/**\n * Update oracle prices in the PTB (Programmable Transaction Block)\n *\n * This function updates price feeds for the lending protocol. It can optionally\n * update Pyth price feeds first if they are stale, then updates individual\n * price feeds in the oracle contract.\n *\n * @param tx - The transaction block to add price update operations to\n * @param priceFeeds - Array of oracle price feeds to update\n * @param options - Optional configuration including whether to update Pyth feeds\n * @returns The updated transaction block\n */\nexport async function updateOraclePricesPTB(\n tx: Transaction,\n priceFeeds: OraclePriceFeed[],\n options?: Partial<\n EnvOption &\n SuiClientOption &\n MarketOption & {\n updatePythPriceFeeds?: boolean\n }\n >\n): Promise<Transaction> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n\n // Optionally update Pyth price feeds if they are stale\n if (options?.updatePythPriceFeeds) {\n const pythInfos = priceFeeds\n .filter((feed) => !!feed.pythPriceFeedId && !!feed.pythPriceInfoObject)\n .map((feed) => ({\n priceFeedId: feed.pythPriceFeedId,\n priceInfoObject: feed.pythPriceInfoObject,\n expiration: 30\n }))\n\n try {\n const stalePriceFeedIds = await getPythStalePriceFeedIdV2(pythInfos, options)\n if (stalePriceFeedIds.length > 0) {\n await updatePythPriceFeeds(tx, stalePriceFeedIds, options)\n }\n } catch (e) {\n console.error(`Failed to update Pyth price feeds`)\n }\n }\n\n // Update individual price feeds in the oracle contract\n for (const priceFeed of priceFeeds) {\n if (options?.env === 'dev') {\n tx.moveCall({\n target: `${config.oracle.packageId}::oracle_pro::update_single_price`,\n arguments: [\n tx.object('0x6'), // Clock object\n tx.object(config.oracle.oracleConfig), // Oracle configuration\n tx.object(config.oracle.priceOracle), // Price oracle contract\n tx.object(config.oracle.supraOracleHolder), // Supra oracle holder\n tx.object(priceFeed.pythPriceInfoObject), // Pyth price info object\n tx.pure.address(priceFeed.feedId) // Price feed ID\n ]\n })\n } else {\n tx.moveCall({\n target: `${config.oracle.packageId}::oracle_pro::update_single_price_v2`,\n arguments: [\n tx.object('0x6'), // Clock object\n tx.object(config.oracle.oracleConfig), // Oracle configuration\n tx.object(config.oracle.priceOracle), // Price oracle contract\n tx.object(config.oracle.supraOracleHolder), // Supra oracle holder\n tx.object(priceFeed.pythPriceInfoObject), // Pyth price info object\n tx.object(config.oracle.switchboardAggregator),\n tx.pure.address(priceFeed.feedId) // Price feed ID\n ]\n })\n }\n }\n return tx\n}\n\n/**\n * Get all available price feeds from the configuration\n *\n * @param options - Optional environment configuration\n * @returns Array of oracle price feed configurations\n */\nexport async function getPriceFeeds(options?: Partial<EnvOption>): Promise<OraclePriceFeed[]> {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME\n })\n return config.oracle.feeds\n}\n\n/**\n * Filter price feeds based on lending state and pools\n *\n * This function filters price feeds to only include those that are relevant\n * to the current lending state or available pools.\n *\n * @param feeds - Array of price feeds to filter\n * @param filters - Filter criteria including lending state and pools\n * @returns Filtered array of price feeds\n */\nexport function filterPriceFeeds(\n feeds: OraclePriceFeed[],\n filters: {\n lendingState?: UserLendingInfo[]\n pools?: Pool[]\n lendingPositions?: LendingPosition[]\n }\n): OraclePriceFeed[] {\n return feeds.filter((feed) => {\n // Filter by lending state (user's current positions)\n if (filters?.lendingState) {\n const inState = filters.lendingState.find((state) => {\n return state.assetId === feed.assetId\n })\n if (inState) {\n return true\n }\n }\n\n if (filters?.lendingPositions) {\n const inPosition = filters.lendingPositions.find((position) => {\n const availableTypes = [\n 'navi-lending-supply',\n 'navi-lending-borrow',\n 'navi-lending-emode-supply',\n 'navi-lending-emode-borrow'\n ]\n if (!availableTypes.includes(position.type)) {\n return false\n }\n const pool = position[position.type]?.pool\n return pool?.id === feed.assetId\n })\n if (inPosition) {\n return true\n }\n }\n\n // Filter by available pools\n if (filters?.pools) {\n const inPool = filters.pools.find((pool) => {\n return pool.id === feed.assetId\n })\n if (inPool) {\n return true\n }\n }\n return false\n })\n}\n\nexport async function updateOraclePriceBeforeUserOperationPTB(\n tx: Transaction,\n address: string,\n pools: Pool[],\n options?: Partial<\n EnvOption &\n SuiClientOption &\n MarketOption & {\n throws?: boolean\n }\n >\n) {\n try {\n const allPriceFeeds = await getPriceFeeds({\n ...options\n })\n\n const markets = [] as string[]\n\n pools.forEach((pool) => {\n if (!markets.includes(pool.market)) {\n markets.push(pool.market)\n }\n })\n\n const lendingPositions = await getLendingPositions(address, {\n ...options,\n markets\n })\n\n const relevantFeeds = filterPriceFeeds(allPriceFeeds, {\n lendingPositions,\n pools\n })\n\n const updatedTx = await updateOraclePricesPTB(tx, relevantFeeds, {\n updatePythPriceFeeds: true,\n ...options\n })\n return updatedTx\n } catch (e) {\n if (options?.throws) {\n throw e\n }\n console.error(e)\n return tx\n }\n}\n","/**\n * Lending Reward Management for Lending Protocol\n *\n * This module provides comprehensive reward functionality for the lending protocol.\n * It handles reward calculations, claiming, and management for users who participate\n * in lending activities such as supplying assets or borrowing.\n */\n\nimport type {\n SuiClientOption,\n EnvOption,\n LendingRewardSummary,\n LendingReward,\n HistoryClaimedReward,\n LendingClaimedReward,\n TransactionResult,\n AccountCapOption,\n AccountCap,\n MarketOption,\n MarketsOption,\n EModeCap\n} from './types'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { getConfig, DEFAULT_CACHE_TIME } from './config'\nimport {\n suiClient,\n camelize,\n parseDevInspectResult,\n normalizeCoinType,\n withSingleton,\n parseTxValue,\n requestHeaders\n} from './utils'\nimport { bcs } from '@mysten/sui/bcs'\nimport { getPriceFeeds } from './oracle'\nimport { getPools, depositCoinPTB } from './pool'\nimport BigNumber from 'bignumber.js'\nimport packageJson from '../package.json'\nimport { DEFAULT_MARKET_IDENTITY, getMarketConfig, MARKETS } from './market'\nimport { getUserEModeCaps } from './emode'\n\nasync function getLendingRewardsBatch(\n address: string,\n tasks: {\n address: string\n market: string\n owner: string\n emodeId?: number\n }[],\n options?: Partial<SuiClientOption & EnvOption>\n): Promise<LendingReward[]> {\n const client = options?.client ?? suiClient\n const tx = new Transaction()\n\n const pools = await getPools({\n ...options,\n markets: Object.values(MARKETS),\n cacheTime: DEFAULT_CACHE_TIME\n })\n\n const feeds = await getPriceFeeds(options)\n\n for (let task of tasks) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME,\n market: task.market\n })\n tx.moveCall({\n target: `${config.uiGetter}::incentive_v3_getter::get_user_atomic_claimable_rewards`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.storage), // Protocol storage\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.pure.address(task.address) // User address\n ]\n })\n }\n\n const result = await client.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: address\n })\n\n const data = [] as [string[], string[], number[], string[], number[]][]\n\n result?.results?.forEach((item) => {\n data.push(\n parseDevInspectResult<[string[], string[], number[], string[], number[]]>(\n {\n results: [item]\n } as any,\n [\n bcs.vector(bcs.string()), // Asset coin types\n bcs.vector(bcs.string()), // Reward coin types\n bcs.vector(bcs.u8()), // Reward options\n bcs.vector(bcs.Address), // Rule IDs\n bcs.vector(bcs.u256()) // Claimable amounts\n ]\n )\n )\n })\n\n const rewardsList: {\n userClaimableReward: number\n userClaimedReward?: string\n option: number\n ruleIds: string[]\n assetCoinType: string\n rewardCoinType: string\n assetId: number\n market: string\n owner: string\n address: string\n emodeId?: number\n }[] = []\n\n data.forEach((rewardsData, index) => {\n const task = tasks[index]\n if (rewardsData.length === 5 && Array.isArray(rewardsData[0])) {\n const count = rewardsData[0].length\n for (let i = 0; i < count; i++) {\n const feed = feeds.find(\n (feed) => normalizeCoinType(feed.coinType) === normalizeCoinType(rewardsData[1][i])\n )\n const pool = pools.find(\n (pool) =>\n normalizeCoinType(pool.coinType) === normalizeCoinType(rewardsData[0][i]) &&\n pool.market === task.market\n )\n if (!feed || !pool) {\n continue\n }\n rewardsList.push({\n assetId: pool.id,\n assetCoinType: normalizeCoinType(rewardsData[0][i]),\n rewardCoinType: normalizeCoinType(rewardsData[1][i]),\n option: Number(rewardsData[2][i]),\n userClaimableReward: Number(rewardsData[4][i]) / Math.pow(10, feed.priceDecimal),\n ruleIds: Array.isArray(rewardsData[3][i])\n ? (rewardsData[3][i] as any)\n : [rewardsData[3][i]],\n market: task.market,\n owner: task.owner,\n address: task.address,\n emodeId: task.emodeId\n })\n }\n }\n })\n\n return rewardsList\n}\n\n/**\n * Get user's available lending rewards\n *\n * This function retrieves all available rewards for a user from the lending protocol.\n * It uses devInspect to simulate the reward calculation and returns detailed\n * information about claimable rewards for each asset and reward type.\n *\n * @param address - User's wallet address or account cap\n * @param options - Optional client and environment configuration\n * @returns Array of lending rewards available for claiming\n */\nexport async function getUserAvailableLendingRewards(\n address: string | AccountCap,\n options?: Partial<SuiClientOption & EnvOption & MarketsOption>\n): Promise<LendingReward[]> {\n const markets = (options?.markets || [MARKETS.main]).map((identity) => {\n return getMarketConfig(identity)\n })\n\n let emodeCaps: EModeCap[] = []\n\n try {\n emodeCaps = await getUserEModeCaps(address, options)\n } catch (e) {\n console.error(e)\n }\n\n const tasks = markets\n .map((market) => {\n return {\n address,\n owner: address,\n market: market.key\n }\n })\n .concat(\n emodeCaps\n .filter((cap) => {\n return !!markets.find((market) => market.id === cap.marketId)\n })\n .map((cap) => {\n const market = getMarketConfig(cap.marketId)\n return {\n address: cap.accountCap,\n owner: address,\n market: market.key,\n emodeId: cap.emodeId\n }\n })\n )\n\n return await getLendingRewardsBatch(address, tasks, options)\n}\n\n/**\n * Summarize lending rewards by asset and reward type\n *\n * This function aggregates rewards by asset ID and reward type, providing\n * a summary view of all available rewards for easier display and management.\n *\n * @param rewards - Array of lending rewards to summarize\n * @returns Array of summarized reward information grouped by asset and type\n */\nexport function summaryLendingRewards(rewards: LendingReward[]): LendingRewardSummary[] {\n // Aggregate rewards by asset ID, reward type, and coin type\n const agg = new Map<\n string,\n { assetId: number; rewardType: number; coinType: string; total: number; market: string }\n >()\n\n rewards.forEach((reward) => {\n const assetId = reward.assetId\n const rewardType = reward.option\n const key = `${assetId}-${rewardType}-${reward.rewardCoinType}-${reward.market}`\n if (agg.has(key)) {\n agg.get(key)!.total += reward.userClaimableReward\n } else {\n agg.set(key, {\n assetId,\n rewardType,\n coinType: reward.rewardCoinType,\n total: Number(reward.userClaimableReward),\n market: reward.market\n })\n }\n })\n\n // Group rewards by asset ID and reward type\n const groupMap = new Map<\n string,\n { assetId: number; rewardType: number; market: string; rewards: Map<string, number> }\n >()\n for (const { assetId, rewardType, coinType, total, market } of agg.values()) {\n const groupKey = `${assetId}-${rewardType}-${market}`\n if (!groupMap.has(groupKey)) {\n groupMap.set(groupKey, { assetId, rewardType, market, rewards: new Map<string, number>() })\n }\n const rewardMap = groupMap.get(groupKey)!\n rewardMap.rewards.set(coinType, (rewardMap.rewards.get(coinType) || 0) + total)\n }\n\n // Convert to summary format\n return Array.from(groupMap.values()).map((group) => ({\n assetId: group.assetId,\n rewardType: group.rewardType,\n market: group.market,\n rewards: Array.from(group.rewards.entries()).map(([coinType, available]) => ({\n coinType,\n available: available.toFixed(6)\n }))\n }))\n}\n\n/**\n * Get user's total claimed rewards in USD value\n *\n * Fetches the total amount of rewards that a user has claimed historically,\n * converted to USD value for easy comparison and display.\n *\n * @param address - User's wallet address or account cap\n * @returns Object containing total claimed rewards in USD\n */\nexport const getUserTotalClaimedReward = withSingleton(\n async (\n address: string | AccountCap,\n options?: Partial<MarketOption>\n ): Promise<{\n USDValue: number\n }> => {\n const url = `https://open-api.naviprotocol.io/api/navi/user/total_claimed_reward?userAddress=${address}&sdk=${packageJson.version}&market=${options?.market || DEFAULT_MARKET_IDENTITY}`\n const res = await fetch(url, { headers: requestHeaders }).then((res) => res.json())\n return res.data\n }\n)\n\n/**\n * Get user's claimed reward history\n *\n * Retrieves a paginated list of all rewards that a user has claimed historically.\n * Useful for tracking reward history and generating reports.\n *\n * @param address - User's wallet address or account cap\n * @param options - Pagination options (page number and size)\n * @returns Object containing claimed reward history and pagination cursor\n */\nexport const getUserClaimedRewardHistory = withSingleton(\n async (\n address: string | AccountCap,\n options?: Partial<\n MarketOption & {\n page: number\n size: number\n }\n >\n ): Promise<{\n data: HistoryClaimedReward[]\n cursor?: string\n }> => {\n const endpoint = `https://open-api.naviprotocol.io/api/navi/user/rewards?userAddress=${address}&page=${options?.page || 1}&pageSize=${options?.size || 400}&sdk=${packageJson.version}&market=${options?.market || DEFAULT_MARKET_IDENTITY}`\n const res = await fetch(endpoint, { headers: requestHeaders }).then((res) => res.json())\n return camelize({\n data: res.data.rewards\n })\n }\n)\n\n/**\n * Claim lending rewards in the PTB (Programmable Transaction Block)\n *\n * This function adds operations to a transaction block to claim rewards from the lending protocol.\n * It supports different claiming methods including direct claiming, claiming with\n * account capabilities, and custom coin handling (transfer or deposit).\n *\n * @param tx - The transaction block to add reward claiming operations to\n * @param rewards - Array of rewards to claim\n * @param options - Optional configuration including account capabilities and custom coin handling\n * @param options.customCoinReceive.type - The type of custom coin handling, can be 'transfer', 'depositNAVI' or 'skip'\n * @param options.customCoinReceive.transfer - The address to transfer the reward to, only used when options.customCoinReceive.type is 'transfer'\n * @param options.customCoinReceive.depositNAVI.fallbackReceiveAddress - The address to transfer the reward to if the pool is full, only used when options.customCoinReceive.type is 'depositNAVI'\n * @returns Array of claimed reward coins and their identifiers\n * @throws Error if reward fund not found or invalid configuration\n */\nexport async function claimLendingRewardsPTB(\n tx: Transaction,\n rewards: LendingReward[],\n options?: Partial<\n EnvOption &\n AccountCapOption &\n MarketOption & {\n customCoinReceive?: {\n type: 'transfer' | 'depositNAVI' | 'skip'\n transfer?: string | TransactionResult\n depositNAVI?: {\n fallbackReceiveAddress?: string\n }\n }\n }\n >\n) {\n const pools = await getPools({\n ...options,\n markets: Object.values(MARKETS),\n cacheTime: DEFAULT_CACHE_TIME\n })\n\n // Group rewards by reward coin type and collect asset IDs and rule IDs\n const rewardMap = new Map<\n string,\n {\n assetIds: string[]\n ruleIds: string[]\n amount: number\n market: string\n owner: string\n address: string\n isEMode: boolean\n }\n >()\n\n for (const reward of rewards) {\n const { rewardCoinType, ruleIds, market, owner, address, emodeId } = reward\n\n const key = `${rewardCoinType}___${address}`\n\n for (const ruleId of ruleIds) {\n if (!rewardMap.has(key)) {\n rewardMap.set(key, {\n assetIds: [],\n ruleIds: [],\n amount: 0,\n market,\n owner,\n address,\n isEMode: typeof emodeId !== 'undefined'\n })\n }\n\n const group = rewardMap.get(key)!\n group.assetIds.push(reward.assetCoinType.replace('0x', ''))\n group.ruleIds.push(ruleId)\n group.amount += reward.userClaimableReward\n }\n }\n\n const rewardCoins = [] as LendingClaimedReward[]\n\n // Process each reward coin type\n for (const [\n rewardCoinType,\n { assetIds, ruleIds, amount, market, owner, address, isEMode }\n ] of rewardMap) {\n const config = await getConfig({\n ...options,\n cacheTime: DEFAULT_CACHE_TIME,\n market\n })\n const coinType = rewardCoinType.split('___')[0]\n const pool = pools.find(\n (p) => normalizeCoinType(p.suiCoinType) === normalizeCoinType(coinType) && p.market === market\n )\n if (!pool || !pool.contract.rewardFundId) {\n throw new Error(`No matching rewardFund found for reward coin: ${coinType} ${market}`)\n }\n const matchedRewardFund = pool.contract.rewardFundId\n\n // Validate configuration\n if (options?.accountCap && !options.customCoinReceive) {\n throw new Error('customCoinReceive is required when accountCap is provided')\n }\n\n // Handle custom coin receiving logic\n if (options?.customCoinReceive) {\n let rewardBalance\n\n // Claim rewards with or without account capability\n if (options.accountCap) {\n rewardBalance = tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward_with_account_cap`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds), // Rule IDs\n parseTxValue(options.accountCap, tx.object) // Account capability\n ],\n typeArguments: [coinType]\n })\n } else if (isEMode) {\n rewardBalance = tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward_with_account_cap`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds), // Rule IDs\n parseTxValue(address, tx.object) // Account capability\n ],\n typeArguments: [coinType]\n })\n } else {\n rewardBalance = tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds) // Rule IDs\n ],\n typeArguments: [coinType]\n })\n }\n\n // Convert balance to coin object\n const [rewardCoin]: any = tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [rewardBalance],\n typeArguments: [coinType]\n })\n\n // Handle different custom coin receiving types\n if (options?.customCoinReceive.type === 'transfer') {\n if (!options.customCoinReceive.transfer) {\n throw new Error('customCoinReceive.transfer is required')\n }\n tx.transferObjects(\n [rewardCoin],\n parseTxValue(options.customCoinReceive.transfer, tx.pure.address)\n )\n }\n if (options?.customCoinReceive.type === 'depositNAVI') {\n const supplyAmount = BigNumber(pool.totalSupplyAmount).shiftedBy(-9)\n const cap = BigNumber(pool.supplyCapCeiling).shiftedBy(-27)\n\n // if the pool is full, transfer the reward to the fallback receive address\n if (\n supplyAmount.plus(amount).isGreaterThan(cap) &&\n !!options?.customCoinReceive.depositNAVI?.fallbackReceiveAddress\n ) {\n tx.transferObjects(\n [rewardCoin],\n tx.pure.address(options.customCoinReceive.depositNAVI.fallbackReceiveAddress)\n )\n } else {\n await depositCoinPTB(tx, pool, rewardCoin, options)\n }\n } else {\n rewardCoins.push({\n coin: rewardCoin,\n identifier: pool,\n owner,\n isEMode\n })\n }\n } else {\n // Standard reward claiming without custom handling\n if (!!options?.accountCap || isEMode) {\n const rewardBalance = tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward_with_account_cap`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds), // Rule IDs\n parseTxValue(options?.accountCap || address, tx.object) // Account capability\n ],\n typeArguments: [coinType]\n })\n\n const [rewardCoin]: any = tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [rewardBalance],\n typeArguments: [coinType]\n })\n\n tx.transferObjects(\n [rewardCoin],\n parseTxValue(options?.accountCap || owner, tx.pure.address)\n )\n } else {\n tx.moveCall({\n target: `${config.package}::incentive_v3::claim_reward_entry`,\n arguments: [\n tx.object('0x06'), // Clock object\n tx.object(config.incentiveV3), // Incentive V3 contract\n tx.object(config.storage), // Protocol storage\n tx.object(matchedRewardFund), // Reward fund\n tx.pure.vector('string', assetIds), // Asset IDs\n tx.pure.vector('address', ruleIds) // Rule IDs\n ],\n typeArguments: [coinType]\n })\n }\n }\n }\n return rewardCoins\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport {\n getLendingPositions,\n getPools as naviGetPools,\n getHealthFactor as naviGetHealthFactor,\n depositCoinPTB,\n withdrawCoinPTB,\n borrowCoinPTB,\n repayCoinPTB,\n getUserAvailableLendingRewards,\n claimLendingRewardsPTB,\n updateOraclePriceBeforeUserOperationPTB,\n type Pool,\n} from '@naviprotocol/lending';\nimport { SUPPORTED_ASSETS, ALL_NAVI_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { stableToRaw } from '../utils/format.js';\nimport { getCoinMeta } from '../token-registry.js';\nimport type { PendingReward } from '../adapters/types.js';\nimport type {\n RatesResult,\n PositionsResult,\n PositionEntry,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n} from '../types.js';\n\nconst MIN_HEALTH_FACTOR = 1.5;\n\n// NAVI SDK expects SuiClient (v1 name), our code uses SuiJsonRpcClient (v2 name).\n// They're the same runtime class, so the cast is safe.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction sdkOptions(client: SuiJsonRpcClient): { env: 'prod'; client: any; cacheTime: number; disableCache: boolean } {\n // Fully disable NAVI SDK's built-in caching. cacheTime: 0 bypasses the\n // top-level withCache check, but internal SDK calls override it via\n // spread order ({ ...opts, cacheTime: w }). disableCache: true is the\n // only flag the SDK never overrides — it short-circuits the cache check.\n return { env: 'prod', client, cacheTime: 0, disableCache: true };\n}\n\n/**\n * Refresh Pyth oracle prices in the PTB before price-dependent NAVI operations.\n * NAVI's on-chain contract requires fresh oracle prices (within 15s) for\n * withdraw, borrow, and repay. Unlike Suilend (which auto-refreshes), NAVI's\n * PTB builders don't update prices — the caller must do it via this SDK helper.\n */\nasync function refreshOracle(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n options?: { skipPythUpdate?: boolean; skipOracle?: boolean },\n): Promise<void> {\n if (options?.skipOracle) return;\n const origInfo = console.info;\n const origWarn = console.warn;\n console.info = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('stale price feed')) return;\n origInfo.apply(console, args);\n };\n console.warn = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('price feed')) return;\n origWarn.apply(console, args);\n };\n try {\n const pools = await naviGetPools(sdkOptions(client));\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const oracleOpts: any = {\n ...sdkOptions(client),\n throws: false,\n updatePythPriceFeeds: !options?.skipPythUpdate,\n };\n await updateOraclePriceBeforeUserOperationPTB(tx, address, pools, oracleOpts);\n } catch {\n // Best-effort: if oracle refresh fails (network issue), the operation\n // may still succeed if on-chain prices are fresh enough.\n } finally {\n console.info = origInfo;\n console.warn = origWarn;\n }\n}\n\nconst NAVI_SYMBOL_MAP: Record<string, string> = {\n nUSDC: 'USDC',\n suiUSDT: 'USDT',\n suiUSDe: 'USDe',\n XAUM: 'GOLD',\n WBTC: 'BTC',\n suiETH: 'ETH',\n WETH: 'ETH',\n SUI: 'SUI',\n USDC: 'USDC',\n USDT: 'USDT',\n USDe: 'USDe',\n USDsui: 'USDsui',\n WAL: 'WAL',\n NAVX: 'NAVX',\n ETH: 'ETH',\n GOLD: 'GOLD',\n};\n\nfunction resolveNaviSymbol(sdkSymbol: string, coinType: string): string {\n for (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n const poolSuffix = coinType.split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = info.type.split('::').slice(1).join('::').toLowerCase();\n if (poolSuffix === targetSuffix) return key;\n }\n return NAVI_SYMBOL_MAP[sdkSymbol] ?? sdkSymbol;\n}\n\nfunction resolveAssetInfo(asset: string): { type: string; decimals: number; displayName: string } {\n if (asset in SUPPORTED_ASSETS) {\n const info = SUPPORTED_ASSETS[asset as SupportedAsset];\n return { type: info.type, decimals: info.decimals, displayName: info.displayName };\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown asset: ${asset}`);\n}\n\n\nasync function fetchCoins(\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await client.getCoins({ owner, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return all;\n}\n\nfunction mergeCoins(\n tx: Transaction,\n coins: Array<{ coinObjectId: string; balance: string }>,\n): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n return primary;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function getPositions(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PositionsResult> {\n\n try {\n const naviPositions = await getLendingPositions(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n const positions: PositionEntry[] = [];\n\n for (const pos of naviPositions) {\n const data = pos['navi-lending-supply']\n ?? pos['navi-lending-emode-supply']\n ?? pos['navi-lending-borrow']\n ?? pos['navi-lending-emode-borrow'];\n if (!data) continue;\n\n const isBorrow = pos.type.includes('borrow');\n const symbol = resolveNaviSymbol(data.token.symbol, data.token.coinType);\n const amount = parseFloat(data.amount);\n const amountUsd = parseFloat(data.valueUSD);\n const pool = data.pool;\n\n const apy = (isBorrow\n ? parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0')\n : parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0')) / 100;\n\n if (amountUsd > 0.01 || amount > 1e-10) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: isBorrow ? 'borrow' : 'save',\n amount,\n amountUsd,\n apy,\n });\n }\n }\n\n return { positions };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('not found') || msg.includes('404')) return { positions: [] };\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI getPositions failed: ${msg}`);\n }\n}\n\nexport async function getRates(client: SuiJsonRpcClient): Promise<RatesResult> {\n try {\n const pools = await naviGetPools(sdkOptions(client));\n const result: RatesResult = {};\n\n for (const asset of ALL_NAVI_ASSETS) {\n const targetType = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS].type;\n const pool = pools.find((p: Pool) => {\n const poolSuffix = (p.suiCoinType || p.coinType || '').split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = targetType.split('::').slice(1).join('::').toLowerCase();\n return poolSuffix === targetSuffix;\n });\n if (!pool) continue;\n\n const saveApy = parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0') / 100;\n const borrowApy = parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0') / 100;\n\n if (saveApy >= 0 && saveApy < 2.0) {\n result[asset] = { saveApy, borrowApy: borrowApy >= 0 && borrowApy < 2.0 ? borrowApy : 0 };\n }\n }\n\n if (!result.USDC) result.USDC = { saveApy: 0.04, borrowApy: 0.06 };\n return result;\n } catch {\n return { USDC: { saveApy: 0.04, borrowApy: 0.06 } };\n }\n}\n\nexport async function getHealthFactor(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<HealthFactorResult> {\n\n const posResult = await getPositions(client, address);\n let supplied = 0;\n let borrowed = 0;\n\n for (const pos of posResult.positions) {\n const usd = pos.amountUsd ?? pos.amount;\n if (pos.type === 'save') supplied += usd;\n else if (pos.type === 'borrow') borrowed += usd;\n }\n\n let healthFactor: number;\n try {\n const hf = await naviGetHealthFactor(address, sdkOptions(client));\n healthFactor = hf > 1e5 ? Infinity : hf;\n } catch {\n healthFactor = borrowed > 0 ? (supplied * 0.75) / borrowed : Infinity;\n }\n\n const ltv = 0.75;\n const maxBorrow = Math.max(0, supplied * ltv - borrowed);\n\n return {\n healthFactor,\n supplied,\n borrowed,\n maxBorrow,\n liquidationThreshold: ltv,\n };\n}\n\nexport async function buildSaveTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Save amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins found`);\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n // [B5 v2 / 2026-04-30] No fee collection here. SDK + CLI are fee-free by design.\n // Consumer apps (Audric) collect fees by calling `addFeeTransfer(tx, coinObj, ...)`\n // BEFORE invoking this builder. See packages/sdk/src/protocols/protocolFee.ts.\n\n const rawAmount = Math.min(Number(stableToRaw(amount, assetInfo.decimals)), Number(totalBalance));\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coinObj as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function buildWithdrawTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n // skipPythUpdate=true is required for sponsored builds (Enoki):\n // Pyth's SuiPythClient.updatePriceFeeds uses tx.splitCoins(tx.gas, ...)\n // for the oracle fee. Sponsored txes can't reference tx.gas as an\n // argument — Sui rejects with \"Cannot use GasCoin as a transaction\n // argument\". Skipping the client-side Pyth update still adds NAVI's\n // on-chain `update_single_price_v2` moveCalls, which read Pyth's\n // on-chain state (kept fresh by Pyth keepers ~every 5s for major\n // assets). Self-funded callers (CLI) leave it false to also pay the\n // Pyth fee from tx.gas, maximizing freshness.\n options: { asset?: string; skipPythUpdate?: boolean } = {},\n): Promise<{ tx: Transaction; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Withdrawal amount rounds to zero — balance is dust');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.skipPythUpdate });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n tx.transferObjects([coin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n\n return { tx, effectiveAmount };\n}\n\nexport async function addWithdrawToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n // See note on buildWithdrawTx for skipPythUpdate semantics.\n options: { asset?: string; skipPythUpdate?: boolean } = {},\n): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n const [coin] = tx.moveCall({\n target: '0x2::coin::zero',\n typeArguments: [assetInfo.type],\n });\n return { coin, effectiveAmount: 0 };\n }\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.skipPythUpdate });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n return { coin: coin as TransactionObjectArgument, effectiveAmount };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n}\n\nexport async function addSaveToTx(\n tx: Transaction,\n _client: SuiJsonRpcClient,\n _address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n // [B5 v2 / 2026-04-30] No fee collection — see comment in `buildSaveTx`.\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n}\n\nexport async function addRepayToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n coin: TransactionObjectArgument,\n // skipOracle bypasses oracle entirely (safe for repay — no HF risk; debt\n // reduction never triggers liquidation). skipPythUpdate is the narrower\n // flag — preserves on-chain `update_single_price_v2` calls but skips the\n // tx.gas-using Pyth fee payment. Sponsored callers (Enoki) typically pass\n // skipOracle=true; self-funded callers can leave both undefined.\n // See note on buildWithdrawTx for sponsored-build details.\n options: { asset?: string; skipPythUpdate?: boolean; skipOracle?: boolean } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n await refreshOracle(tx, client, address, {\n skipPythUpdate: options.skipPythUpdate,\n skipOracle: options.skipOracle,\n });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n}\n\nexport async function buildBorrowTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n // See note on buildWithdrawTx for skipPythUpdate semantics.\n options: { asset?: string; skipPythUpdate?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.skipPythUpdate });\n\n try {\n const borrowedCoin = await borrowCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n\n // [B5 v2 / 2026-04-30] No fee collection — consumer apps that want to\n // charge a fee should use `addBorrowToTx` directly, split the fee from\n // the returned coin via `addFeeTransfer`, then transfer the remainder.\n // See packages/sdk/src/protocols/protocolFee.ts.\n\n tx.transferObjects([borrowedCoin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI borrow failed: ${msg}`);\n }\n\n return tx;\n}\n\n/**\n * [B5 v2] Add a NAVI borrow to an existing PTB and return the borrowed coin\n * WITHOUT transferring it to the user. Lets consumer apps interpose a fee\n * transfer (split → transfer to treasury) before the final transfer to user.\n *\n * This is the lower-level companion to `buildBorrowTx`. CLI / direct SDK\n * callers should keep using `buildBorrowTx` (it transfers to user automatically\n * and is fee-free); Audric uses this to wedge `addFeeTransfer` between the\n * borrow and the user transfer.\n */\nexport async function addBorrowToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; skipPythUpdate?: boolean } = {},\n): Promise<TransactionObjectArgument> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.skipPythUpdate });\n\n try {\n const borrowedCoin = await borrowCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n return borrowedCoin as TransactionObjectArgument;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI borrow failed: ${msg}`);\n }\n}\n\nexport async function buildRepayTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n // skipOracle bypasses oracle entirely (safe for repay — no HF risk).\n // skipPythUpdate is the narrower flag — preserves on-chain\n // `update_single_price_v2` calls but skips the tx.gas-using Pyth fee\n // payment. See note on buildWithdrawTx for sponsored-build details.\n options: { asset?: string; skipOracle?: boolean; skipPythUpdate?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Repay amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins to repay with. Withdraw some savings first to get cash.`);\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n const rawRequested = Number(stableToRaw(amount, assetInfo.decimals));\n\n if (Number(totalBalance) < rawRequested && Number(totalBalance) < 1000) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Not enough ${assetInfo.displayName} to repay (need $${amount.toFixed(2)}, wallet has ~$${(Number(totalBalance) / 10 ** assetInfo.decimals).toFixed(4)}). Withdraw some savings first.`);\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n const rawAmount = Math.min(rawRequested, Number(totalBalance));\n const [repayCoin] = tx.splitCoins(coinObj, [rawAmount]);\n\n await refreshOracle(tx, client, address, {\n skipOracle: options.skipOracle,\n skipPythUpdate: options.skipPythUpdate,\n });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, repayCoin as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function maxWithdrawAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n let maxAmount: number;\n if (hf.borrowed === 0) {\n maxAmount = hf.supplied;\n } else {\n maxAmount = Math.max(0, hf.supplied - (hf.borrowed * MIN_HEALTH_FACTOR / ltv));\n }\n\n const remainingSupply = hf.supplied - maxAmount;\n const hfAfter = hf.borrowed > 0 ? (remainingSupply * ltv) / hf.borrowed : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: hf.healthFactor };\n}\n\nexport async function maxBorrowAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n const maxAmount = Math.max(0, hf.supplied * ltv / MIN_HEALTH_FACTOR - hf.borrowed);\n\n return { maxAmount, healthFactorAfter: MIN_HEALTH_FACTOR, currentHF: hf.healthFactor };\n}\n\n// ---------------------------------------------------------------------------\n// Rewards\n// ---------------------------------------------------------------------------\n\n/**\n * [Track B follow-up / 2026-05-08] Stateless wrapper around `getPendingRewards`\n * that creates its own `SuiJsonRpcClient`. Used by the engine's\n * `pending_rewards` tool — engine doesn't import `@mysten/sui` directly\n * (would expand its dep surface), so this helper accepts just `(address,\n * suiRpcUrl?)` and instantiates the client internally.\n *\n * **Why this exists.** Pre-fix the engine tool went through\n * `requireAgent(context).getPendingRewards()`, which threw\n * \"Tool requires a T2000 agent instance — pass `agent` in EngineConfig\"\n * in audric prod (audric uses sponsored-tx flow, never instantiates a\n * T2000 agent). Live mainnet smoke on funkii's wallet 2026-05-08 caught\n * this immediately when the LLM correctly called pending_rewards before\n * harvest_rewards. This helper makes the audric/CLI paths symmetric\n * (both work, neither requires an agent).\n *\n * Defaults `suiRpcUrl` to mainnet fullnode for CLI / standalone callers\n * that don't pass one. Errors propagate with the same `T2000Error`\n * shape as the underlying `getPendingRewards` (PROTOCOL_UNAVAILABLE on\n * NAVI degradation, etc.) so the engine tool's catch path is unchanged.\n */\nexport async function getPendingRewardsByAddress(\n address: string,\n suiRpcUrl?: string,\n): Promise<PendingReward[]> {\n const { SuiJsonRpcClient, getJsonRpcFullnodeUrl } = await import('@mysten/sui/jsonRpc');\n const client = new SuiJsonRpcClient({\n url: suiRpcUrl ?? getJsonRpcFullnodeUrl('mainnet'),\n network: 'mainnet',\n });\n return getPendingRewards(client, address);\n}\n\nexport async function getPendingRewards(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n let rewards;\n try {\n rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n } catch (err) {\n // [S18-F20] Pre-fix this swallowed every NAVI failure with `return []`,\n // making the engine's claim_rewards tool narrate \"no pending rewards\"\n // when NAVI was actually degraded. Now we throw a typed error so the\n // engine tool can surface \"NAVI degraded — try again in a moment\"\n // (truthful) instead of \"no pending rewards\" (false negative).\n // See `single-source-of-truth.mdc` rule on never silently downgrading\n // vendor degradation.\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error(\n 'PROTOCOL_UNAVAILABLE',\n `NAVI rewards lookup failed: ${msg}`,\n { source: 'navi-rewards-read' },\n true,\n );\n }\n\n if (!rewards || rewards.length === 0) return [];\n\n // [S.118 follow-up — 2026-05-08]\n // Read from the same source as `addClaimRewardsToTx` (raw\n // `userClaimableReward`) and reuse the same aggregator\n // (`aggregateClaimableRewards`). Pre-fix this read iterated\n // `summaryLendingRewards(rewards).rewards.available` — a different NAVI\n // aggregation that produced row-structure AND per-coinType-total drift\n // vs the claim path (smoke on funkii's mainnet wallet showed 2 rows\n // here vs 1 row from `addClaimRewardsToTx`, with totals diverging by\n // ~1.36e-7 for the same vSUI cert across two NAVI pools). Routing both\n // through the same source + same aggregator removes the drift class\n // entirely and makes the contract test a true equality check (not\n // a tolerance-based one).\n const claimable = rewards.filter((r) => Number(r.userClaimableReward) > 0);\n return aggregateClaimableRewards(claimable);\n}\n\nexport async function addClaimRewardsToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n let rewards;\n try {\n rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n } catch (err) {\n // [S18-F20] See `getPendingRewards` for rationale — silent `return []`\n // here was a primary contributor to the engine's claim_rewards tool\n // narrating \"no pending rewards\" during NAVI degradation. Throw a\n // typed error; the engine tool catches and surfaces a truthful\n // \"NAVI degraded\" message instead.\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error(\n 'PROTOCOL_UNAVAILABLE',\n `NAVI rewards lookup failed: ${msg}`,\n { source: 'navi-rewards-claim-prelude' },\n true,\n );\n }\n\n if (!rewards || rewards.length === 0) return [];\n\n const claimable = rewards.filter(\n (r) => Number(r.userClaimableReward) > 0,\n );\n if (claimable.length === 0) return [];\n\n // Capture per-reward metadata from the source `claimable` list before\n // it gets handed to the NAVI PTB builder. We previously stubbed every\n // returned reward as `{ symbol: 'REWARD', amount: 0 }`, which made\n // the engine narrate \"no pending rewards\" / \"Claimed $0.00\" even when\n // the on-chain tx successfully credited e.g. vSUI to the wallet. The\n // PTB builder's return value is just an internal opaque list of move\n // calls — the truth about which assets / amounts were claimed lives\n // in the `claimable` rows we filtered above.\n try {\n await claimLendingRewardsPTB(tx, claimable, {\n env: 'prod',\n customCoinReceive: { type: 'transfer', transfer: address },\n });\n } catch (err) {\n // [S18-F20] PTB-build failures are also worth surfacing rather than\n // silently returning empty — the lookup succeeded but the builder\n // (e.g. missing reward fund config) failed.\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error(\n 'PROTOCOL_UNAVAILABLE',\n `NAVI claim PTB build failed: ${msg}`,\n { source: 'navi-rewards-claim-ptb' },\n true,\n );\n }\n\n return aggregateClaimableRewards(claimable);\n}\n\n/**\n * Standalone builder for the `claim_rewards` tool. Wraps the existing\n * `addClaimRewardsToTx` appender into a complete PTB so the SPEC 7\n * `composeTx` registry adapter has a single-step builder it can dispatch\n * to when `claim_rewards` is invoked alone (the chain-mode path uses\n * `addClaimRewardsToTx` directly inside a multi-step PTB).\n *\n * Multi-protocol claim flows (e.g. NAVI + Suilend in a future world)\n * still go through the `T2000` class's `claimRewards()` method, which\n * iterates every registered lending adapter via the adapter registry —\n * this standalone builder is intentionally NAVI-only to keep the shape\n * symmetric with the rest of SPEC 7's Layer 1 builders.\n *\n * Returns `{ tx, rewards }`:\n * - `tx` — built PTB with sender set; if no rewards are claimable, no\n * move calls are appended (caller should skip executing).\n * - `rewards` — what WILL be claimed by `tx`. Empty array means nothing\n * to claim.\n */\nexport async function buildClaimRewardsTx(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<{ tx: Transaction; rewards: PendingReward[] }> {\n const tx = new Transaction();\n tx.setSender(address);\n const rewards = await addClaimRewardsToTx(tx, client, address);\n return { tx, rewards };\n}\n\n/**\n * Minimal shape we read off the NAVI SDK's `LendingReward` rows. Kept\n * structural rather than imported so the tests don't have to reproduce\n * the full upstream type and the function works for any future caller\n * that has the same fields.\n */\nexport interface ClaimableRewardLike {\n userClaimableReward: number | string;\n rewardCoinType: string;\n assetId?: number | string;\n}\n\n/**\n * Aggregate raw NAVI `claimable` rows into the `PendingReward[]` shape\n * the engine surfaces to the LLM and the UI. Aggregates by reward coin\n * type so a user with rewards from multiple pools (e.g. USDC pool + SUI\n * pool both rewarding vSUI) sees a single \"0.0165 vSUI\" line rather\n * than three separate dust entries. Filters out non-finite / non-positive\n * amounts so dust noise can't sneak in as \"$0.00 REWARD\" rows.\n */\nexport function aggregateClaimableRewards(\n claimable: ClaimableRewardLike[],\n): PendingReward[] {\n const aggregated = new Map<string, PendingReward>();\n for (const c of claimable) {\n const coinType = c.rewardCoinType;\n if (!coinType) continue;\n // [S18-F20 follow-up] Resolve symbol via canonical registry first; falls\n // back to raw struct name only for unregistered coins. Mirrors the same\n // resolution in `getPendingRewards` so both readers narrate vSUI rewards\n // as \"vSUI\" instead of the raw \"CERT\" struct name.\n const meta = getCoinMeta(coinType);\n const symbol = meta?.symbol ?? coinType.split('::').pop() ?? 'REWARD';\n const amount = Number(c.userClaimableReward);\n if (!Number.isFinite(amount) || amount <= 0) continue;\n\n const existing = aggregated.get(coinType);\n if (existing) {\n existing.amount += amount;\n } else {\n aggregated.set(coinType, {\n protocol: 'navi',\n asset: String(c.assetId ?? ''),\n coinType,\n symbol,\n amount,\n estimatedValueUsd: 0,\n });\n }\n }\n return Array.from(aggregated.values());\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport * as navi from './navi.js';\nimport type { EarningsResult, FundStatusResult } from '../types.js';\n\nexport async function getEarnings(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<EarningsResult> {\n const hf = await navi.getHealthFactor(client, address);\n const rates = await navi.getRates(client);\n\n const supplied = hf.supplied;\n const apy = rates.USDC.saveApy;\n const dailyRate = apy / 365;\n const dailyEarning = supplied * dailyRate;\n\n const totalYieldEarned = dailyEarning * 30;\n\n return {\n totalYieldEarned,\n currentApy: rates.USDC.saveApy,\n dailyEarning,\n supplied,\n };\n}\n\nexport async function getFundStatus(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<FundStatusResult> {\n const earnings = await getEarnings(client, address);\n\n return {\n supplied: earnings.supplied,\n apy: earnings.currentApy,\n earnedToday: earnings.dailyEarning,\n earnedAllTime: earnings.totalYieldEarned,\n projectedMonthly: earnings.dailyEarning * 30,\n };\n}\n","import type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n} from './types.js';\nimport { STABLE_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nexport class ProtocolRegistry {\n private lending: Map<string, LendingAdapter> = new Map();\n\n registerLending(adapter: LendingAdapter): void {\n this.lending.set(adapter.id, adapter);\n }\n\n async bestSaveRate(asset: string): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip adapters that fail to fetch rates\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No lending adapter supports saving ${asset}`);\n }\n\n candidates.sort((a, b) => b.rate.saveApy - a.rate.saveApy);\n return candidates[0];\n }\n\n async bestBorrowRate(asset: string, opts?: { requireSameAssetBorrow?: boolean }): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('borrow')) continue;\n if (opts?.requireSameAssetBorrow && !adapter.supportsSameAssetBorrow) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No lending adapter supports borrowing ${asset}`);\n }\n\n candidates.sort((a, b) => a.rate.borrowApy - b.rate.borrowApy);\n return candidates[0];\n }\n\n async bestSaveRateAcrossAssets(): Promise<{ adapter: LendingAdapter; rate: LendingRates; asset: string }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates; asset: string }> = [];\n\n for (const asset of STABLE_ASSETS) {\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate, asset });\n } catch { /* skip */ }\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', 'No lending adapter found for any stablecoin');\n }\n\n candidates.sort((a, b) => b.rate.saveApy - a.rate.saveApy);\n return candidates[0];\n }\n\n async allRatesAcrossAssets(): Promise<Array<{ protocol: string; protocolId: string; asset: string; rates: LendingRates }>> {\n const results: Array<{ protocol: string; protocolId: string; asset: string; rates: LendingRates }> = [];\n const seen = new Set<string>();\n for (const asset of STABLE_ASSETS) {\n if (seen.has(asset)) continue;\n seen.add(asset);\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n try {\n const rates = await adapter.getRates(asset);\n if (rates.saveApy > 0 || rates.borrowApy > 0) {\n results.push({ protocol: adapter.name, protocolId: adapter.id, asset, rates });\n }\n } catch { /* skip */ }\n }\n }\n return results;\n }\n\n async allRates(asset: string): Promise<Array<{ protocol: string; protocolId: string; rates: LendingRates }>> {\n const results: Array<{ protocol: string; protocolId: string; rates: LendingRates }> = [];\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n try {\n const rates = await adapter.getRates(asset);\n results.push({ protocol: adapter.name, protocolId: adapter.id, rates });\n } catch {\n // skip\n }\n }\n return results;\n }\n\n async allPositions(address: string): Promise<Array<{ protocol: string; protocolId: string; positions: AdapterPositions }>> {\n const results: Array<{ protocol: string; protocolId: string; positions: AdapterPositions }> = [];\n const errors: string[] = [];\n for (const adapter of this.lending.values()) {\n try {\n const positions = await adapter.getPositions(address);\n if (positions.supplies.length > 0 || positions.borrows.length > 0) {\n results.push({ protocol: adapter.name, protocolId: adapter.id, positions });\n }\n } catch (err) {\n errors.push(`${adapter.name}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n if (results.length === 0 && errors.length > 0) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol queries failed (${errors.length}/${this.lending.size}): ${errors.join('; ')}`);\n }\n return results;\n }\n\n getLending(id: string): LendingAdapter | undefined {\n return this.lending.get(id);\n }\n\n listLending(): LendingAdapter[] {\n return [...this.lending.values()];\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n AdapterTxResult,\n AdapterCapability,\n PendingReward,\n} from './types.js';\nimport { ALL_NAVI_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { normalizeAsset } from '../utils/format.js';\nimport * as naviProtocol from '../protocols/navi.js';\n\nexport { naviDescriptor as descriptor } from './descriptors.js';\n\nexport class NaviAdapter implements LendingAdapter {\n readonly id = 'navi';\n readonly name = 'NAVI Protocol';\n readonly version = '1.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['save', 'withdraw', 'borrow', 'repay'];\n readonly supportedAssets: readonly string[] = [...ALL_NAVI_ASSETS];\n readonly supportsSameAssetBorrow = true;\n\n private client!: SuiJsonRpcClient;\n\n async init(client: SuiJsonRpcClient): Promise<void> {\n this.client = client;\n }\n\n initSync(client: SuiJsonRpcClient): void {\n this.client = client;\n }\n\n async getRates(asset: string): Promise<LendingRates> {\n const rates = await naviProtocol.getRates(this.client);\n const normalized = normalizeAsset(asset);\n const r = rates[normalized as keyof typeof rates];\n if (!r) throw new T2000Error('ASSET_NOT_SUPPORTED', `NAVI does not support ${asset}`);\n return { asset: normalized, saveApy: r.saveApy, borrowApy: r.borrowApy };\n }\n\n async getPositions(address: string): Promise<AdapterPositions> {\n const result = await naviProtocol.getPositions(this.client, address);\n return {\n supplies: result.positions\n .filter(p => p.type === 'save')\n .map(p => ({ asset: p.asset, amount: p.amount, amountUsd: p.amountUsd, apy: p.apy })),\n borrows: result.positions\n .filter(p => p.type === 'borrow')\n .map(p => ({ asset: p.asset, amount: p.amount, amountUsd: p.amountUsd, apy: p.apy })),\n };\n }\n\n async getHealth(address: string): Promise<HealthInfo> {\n return naviProtocol.getHealthFactor(this.client, address);\n }\n\n async buildSaveTx(\n address: string,\n amount: number,\n asset: string,\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildSaveTx(this.client, address, amount, { asset: normalized });\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n const result = await naviProtocol.buildWithdrawTx(this.client, address, amount, {\n asset: normalized,\n skipPythUpdate: options?.skipPythUpdate,\n });\n return { tx: result.tx, effectiveAmount: result.effectiveAmount };\n }\n\n async buildBorrowTx(\n address: string,\n amount: number,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildBorrowTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildRepayTx(\n address: string,\n amount: number,\n asset: string,\n options?: { skipOracle?: boolean; skipPythUpdate?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildRepayTx(this.client, address, amount, {\n asset: normalized,\n skipOracle: options?.skipOracle,\n skipPythUpdate: options?.skipPythUpdate,\n });\n return { tx };\n }\n\n async maxWithdraw(address: string, _asset: string) {\n return naviProtocol.maxWithdrawAmount(this.client, address);\n }\n\n async maxBorrow(address: string, _asset: string) {\n return naviProtocol.maxBorrowAmount(this.client, address);\n }\n\n async addWithdrawToTx(\n tx: Transaction,\n address: string,\n amount: number,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addWithdrawToTx(tx, this.client, address, amount, {\n asset: normalized,\n skipPythUpdate: options?.skipPythUpdate,\n });\n }\n\n async addSaveToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n ): Promise<void> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addSaveToTx(tx, this.client, address, coin, { asset: normalized });\n }\n\n async addBorrowToTx(\n tx: Transaction,\n address: string,\n amount: number,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<TransactionObjectArgument> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addBorrowToTx(tx, this.client, address, amount, {\n asset: normalized,\n skipPythUpdate: options?.skipPythUpdate,\n });\n }\n\n async addRepayToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n options?: { skipPythUpdate?: boolean },\n ): Promise<void> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addRepayToTx(tx, this.client, address, coin, {\n asset: normalized,\n skipPythUpdate: options?.skipPythUpdate,\n });\n }\n\n async getPendingRewards(address: string): Promise<PendingReward[]> {\n return naviProtocol.getPendingRewards(this.client, address);\n }\n\n async addClaimRewardsToTx(tx: Transaction, address: string): Promise<PendingReward[]> {\n return naviProtocol.addClaimRewardsToTx(tx, this.client, address);\n }\n}\n","import type { ProtocolDescriptor } from './types.js';\n\nexport type { ProtocolDescriptor } from './types.js';\n\nexport const naviDescriptor: ProtocolDescriptor = {\n id: 'navi',\n name: 'NAVI Protocol',\n packages: [],\n dynamicPackageId: true,\n actionMap: {\n // Deposit variants (entry_deposit / deposit + account-cap form for\n // harvest's internal save leg)\n 'incentive_v3::entry_deposit': 'save',\n 'incentive_v3::deposit': 'save',\n 'incentive_v3::deposit_with_account_cap': 'save',\n // Withdraw variants\n 'incentive_v3::withdraw_v2': 'withdraw',\n 'incentive_v3::entry_withdraw': 'withdraw',\n 'incentive_v3::withdraw_with_account_cap': 'withdraw',\n 'incentive_v3::withdraw_with_account_cap_v': 'withdraw',\n 'incentive_v3::withdraw': 'withdraw',\n 'incentive_v3::withdraw_v': 'withdraw',\n // Borrow variants\n 'incentive_v3::borrow_v2': 'borrow',\n 'incentive_v3::entry_borrow': 'borrow',\n 'incentive_v3::borrow': 'borrow',\n 'incentive_v3::borrow_v': 'borrow',\n 'incentive_v3::borrow_with_account_cap': 'borrow',\n 'incentive_v3::borrow_with_account_cap_v': 'borrow',\n // Repay variants\n 'incentive_v3::entry_repay': 'repay',\n 'incentive_v3::repay': 'repay',\n 'incentive_v3::repay_with_account_cap': 'repay',\n // Claim-reward variants — required for `claim_rewards` tagging AND for\n // `harvest` compound-op detection in the indexer (paired with a save\n // target, classified as `harvest` instead of `claim`).\n 'incentive_v3::claim_reward': 'claim',\n 'incentive_v3::claim_reward_entry': 'claim',\n 'incentive_v3::claim_reward_with_account_cap': 'claim',\n },\n};\n\nexport const allDescriptors: ProtocolDescriptor[] = [\n naviDescriptor,\n];\n","export interface SafeguardConfig {\n locked: boolean;\n maxPerTx: number;\n maxDailySend: number;\n dailyUsed: number;\n dailyResetDate: string;\n maxLeverage?: number;\n maxPositionSize?: number;\n}\n\nexport interface TxMetadata {\n operation:\n | 'send'\n | 'save'\n | 'withdraw'\n | 'borrow'\n | 'repay'\n | 'pay';\n amount?: number;\n}\n\nexport const OUTBOUND_OPS = new Set<TxMetadata['operation']>([\n 'send',\n 'pay',\n]);\n\nexport const DEFAULT_SAFEGUARD_CONFIG: SafeguardConfig = {\n locked: false,\n maxPerTx: 0,\n maxDailySend: 0,\n dailyUsed: 0,\n dailyResetDate: '',\n};\n","import { T2000Error } from '../errors.js';\n\nexport type SafeguardRule = 'locked' | 'maxPerTx' | 'maxDailySend';\n\nexport interface SafeguardErrorDetails {\n attempted?: number;\n limit?: number;\n current?: number;\n}\n\nexport class SafeguardError extends T2000Error {\n readonly rule: SafeguardRule;\n readonly details: SafeguardErrorDetails;\n\n constructor(rule: SafeguardRule, details: SafeguardErrorDetails, message?: string) {\n const msg = message ?? buildMessage(rule, details);\n super('SAFEGUARD_BLOCKED' as any, msg, { rule, ...details });\n this.name = 'SafeguardError';\n this.rule = rule;\n this.details = details;\n }\n\n override toJSON() {\n return {\n error: 'SAFEGUARD_BLOCKED' as const,\n message: this.message,\n retryable: this.retryable,\n data: { rule: this.rule, ...this.details },\n };\n }\n}\n\nfunction buildMessage(rule: SafeguardRule, details: SafeguardErrorDetails): string {\n switch (rule) {\n case 'locked':\n return 'Agent is locked. All operations are frozen.';\n case 'maxPerTx':\n return `Amount $${(details.attempted ?? 0).toFixed(2)} exceeds per-transaction limit ($${(details.limit ?? 0).toFixed(2)})`;\n case 'maxDailySend':\n return `Daily send limit reached ($${(details.current ?? 0).toFixed(2)}/$${(details.limit ?? 0).toFixed(2)} used today)`;\n }\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SafeguardConfig, TxMetadata } from './types.js';\nimport { OUTBOUND_OPS, DEFAULT_SAFEGUARD_CONFIG } from './types.js';\nimport { SafeguardError } from './errors.js';\n\nexport class SafeguardEnforcer {\n private config: SafeguardConfig;\n private readonly configPath: string | null;\n\n constructor(configDir?: string) {\n this.config = { ...DEFAULT_SAFEGUARD_CONFIG };\n this.configPath = configDir ? join(configDir, 'config.json') : null;\n }\n\n load(): void {\n if (!this.configPath) return;\n try {\n const raw = JSON.parse(readFileSync(this.configPath, 'utf-8'));\n this.config = {\n ...DEFAULT_SAFEGUARD_CONFIG,\n locked: raw.locked ?? false,\n maxPerTx: raw.maxPerTx ?? 0,\n maxDailySend: raw.maxDailySend ?? 0,\n dailyUsed: raw.dailyUsed ?? 0,\n dailyResetDate: raw.dailyResetDate ?? '',\n };\n } catch {\n this.config = { ...DEFAULT_SAFEGUARD_CONFIG };\n }\n }\n\n assertNotLocked(): void {\n this.load();\n if (this.config.locked) {\n throw new SafeguardError('locked', {});\n }\n }\n\n check(metadata: TxMetadata): void {\n this.load();\n\n if (this.config.locked) {\n throw new SafeguardError('locked', {});\n }\n\n if (!OUTBOUND_OPS.has(metadata.operation)) return;\n\n const amount = metadata.amount ?? 0;\n\n if (this.config.maxPerTx > 0 && amount > this.config.maxPerTx) {\n throw new SafeguardError('maxPerTx', {\n attempted: amount,\n limit: this.config.maxPerTx,\n });\n }\n\n this.resetDailyIfNewDay();\n\n if (this.config.maxDailySend > 0 && this.config.dailyUsed + amount > this.config.maxDailySend) {\n throw new SafeguardError('maxDailySend', {\n attempted: amount,\n limit: this.config.maxDailySend,\n current: this.config.dailyUsed,\n });\n }\n }\n\n recordUsage(amount: number): void {\n this.resetDailyIfNewDay();\n this.config.dailyUsed += amount;\n this.save();\n }\n\n lock(): void {\n this.config.locked = true;\n this.save();\n }\n\n unlock(): void {\n this.config.locked = false;\n this.save();\n }\n\n set(key: string, value: unknown): void {\n if (key === 'locked' && typeof value === 'boolean') {\n this.config.locked = value;\n } else if (key === 'maxPerTx' && typeof value === 'number') {\n this.config.maxPerTx = value;\n } else if (key === 'maxDailySend' && typeof value === 'number') {\n this.config.maxDailySend = value;\n }\n this.save();\n }\n\n getConfig(): SafeguardConfig {\n this.load();\n this.resetDailyIfNewDay();\n return { ...this.config };\n }\n\n isConfigured(): boolean {\n return this.config.maxPerTx > 0 || this.config.maxDailySend > 0;\n }\n\n private resetDailyIfNewDay(): void {\n const today = new Date().toISOString().slice(0, 10);\n if (this.config.dailyResetDate !== today) {\n this.config.dailyUsed = 0;\n this.config.dailyResetDate = today;\n this.save();\n }\n }\n\n private save(): void {\n if (!this.configPath) return;\n try {\n let existing: Record<string, unknown> = {};\n try {\n existing = JSON.parse(readFileSync(this.configPath, 'utf-8'));\n } catch {\n // no existing config\n }\n\n const merged = {\n ...existing,\n locked: this.config.locked,\n maxPerTx: this.config.maxPerTx,\n maxDailySend: this.config.maxDailySend,\n dailyUsed: this.config.dailyUsed,\n dailyResetDate: this.config.dailyResetDate,\n };\n\n const dir = this.configPath.replace(/[/\\\\][^/\\\\]+$/, '');\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(this.configPath, JSON.stringify(merged, null, 2) + '\\n');\n } catch {\n // Best-effort persistence\n }\n }\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { validateAddress } from './utils/sui.js';\nimport { T2000Error } from './errors.js';\n\nexport interface Contact {\n name: string;\n address: string;\n}\n\nexport type ContactMap = Record<string, Contact>;\n\nconst RESERVED_NAMES = new Set(['to', 'all', 'address']);\n\nexport class ContactManager {\n private contacts: ContactMap = {};\n private readonly filePath: string;\n private readonly dir: string;\n\n constructor(configDir?: string) {\n this.dir = configDir ?? join(homedir(), '.t2000');\n this.filePath = join(this.dir, 'contacts.json');\n this.load();\n }\n\n private load(): void {\n try {\n if (existsSync(this.filePath)) {\n this.contacts = JSON.parse(readFileSync(this.filePath, 'utf-8'));\n }\n } catch {\n this.contacts = {};\n }\n }\n\n private save(): void {\n if (!existsSync(this.dir)) mkdirSync(this.dir, { recursive: true });\n writeFileSync(this.filePath, JSON.stringify(this.contacts, null, 2));\n }\n\n add(name: string, address: string): { action: 'added' | 'updated' } {\n this.validateName(name);\n const normalized = validateAddress(address);\n const key = name.toLowerCase();\n const existed = key in this.contacts;\n this.contacts[key] = { name, address: normalized };\n this.save();\n return { action: existed ? 'updated' : 'added' };\n }\n\n remove(name: string): boolean {\n const key = name.toLowerCase();\n if (!(key in this.contacts)) return false;\n delete this.contacts[key];\n this.save();\n return true;\n }\n\n get(name: string): Contact | undefined {\n this.load();\n return this.contacts[name.toLowerCase()];\n }\n\n list(): Contact[] {\n this.load();\n return Object.values(this.contacts);\n }\n\n resolve(nameOrAddress: string): { address: string; contactName?: string } {\n this.load();\n\n if (nameOrAddress.startsWith('0x') && nameOrAddress.length >= 42) {\n return { address: validateAddress(nameOrAddress) };\n }\n\n const contact = this.contacts[nameOrAddress.toLowerCase()];\n if (contact) {\n return { address: contact.address, contactName: contact.name };\n }\n\n throw new T2000Error(\n 'CONTACT_NOT_FOUND',\n `\"${nameOrAddress}\" is not a valid Sui address or saved contact.\\n` +\n ` Add it: t2000 contacts add ${nameOrAddress} 0x...`,\n );\n }\n\n private validateName(name: string): void {\n if (name.startsWith('0x')) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names cannot start with 0x');\n }\n if (!/^[a-zA-Z0-9_]+$/.test(name)) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names can only contain letters, numbers, and underscores');\n }\n if (name.length > 32) {\n throw new T2000Error('INVALID_CONTACT_NAME', 'Contact names must be 32 characters or fewer');\n }\n if (RESERVED_NAMES.has(name.toLowerCase())) {\n throw new T2000Error('INVALID_CONTACT_NAME', `\"${name}\" is a reserved name and cannot be used as a contact`);\n }\n }\n}\n","export { T2000 } from './t2000.js';\nexport type { TransactionSigner } from './signer.js';\nexport { KeypairSigner } from './wallet/keypairSigner.js';\nexport { ZkLoginSigner, type ZkLoginProof } from './wallet/zkLoginSigner.js';\nexport { ContactManager } from './contacts.js';\nexport { T2000Error, mapWalletError, mapMoveAbortCode } from './errors.js';\nexport type { T2000ErrorCode, T2000ErrorData } from './errors.js';\nexport type {\n T2000Options,\n BalanceResponse,\n GasReserve,\n SendResult,\n SaveResult,\n WithdrawResult,\n BorrowResult,\n RepayResult,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n AssetRates,\n RatesResult,\n PositionEntry,\n PositionsResult,\n EarningsResult,\n FundStatusResult,\n DepositInfo,\n PaymentRequest,\n TransactionRecord,\n PendingReward,\n ClaimRewardsResult,\n CompoundRewardsResult,\n PayOptions,\n PayResult,\n SwapResult,\n SwapQuoteResult,\n StakeVSuiResult,\n UnstakeVSuiResult,\n FinancialSummary,\n HFAlertLevel,\n} from './types.js';\nexport {\n MIST_PER_SUI,\n SUI_DECIMALS,\n USDC_DECIMALS,\n BPS_DENOMINATOR,\n SAVE_FEE_BPS,\n BORROW_FEE_BPS,\n T2000_OVERLAY_FEE_WALLET,\n SUPPORTED_ASSETS,\n CLOCK_ID,\n DEFAULT_NETWORK,\n} from './constants.js';\nexport type { SupportedAsset, StableAsset } from './constants.js';\nexport {\n STABLE_ASSETS,\n ALL_NAVI_ASSETS,\n GAS_RESERVE_MIN,\n CETUS_USDC_SUI_POOL,\n OPERATION_ASSETS,\n isAllowedAsset,\n assertAllowedAsset,\n} from './constants.js';\nexport type { Operation } from './constants.js';\nexport { validateAddress, truncateAddress, normalizeCoinType } from './utils/sui.js';\nexport {\n KNOWN_TARGETS,\n LABEL_PATTERNS,\n classifyAction,\n classifyLabel,\n fallbackLabel,\n refineLendingLabel,\n classifyTransaction,\n extractTransferDetails,\n} from './wallet/classify.js';\nexport type {\n ClassifyBalanceChange,\n ClassifyResult,\n ExtractedTransfer,\n TxDirection,\n} from './wallet/classify.js';\nexport {\n parseSuiRpcTx,\n extractTxSender,\n extractTxCommands,\n queryHistory,\n queryTransaction,\n} from './wallet/history.js';\nexport type { SuiRpcTxBlock } from './wallet/history.js';\nexport {\n mistToSui,\n suiToMist,\n usdcToRaw,\n rawToUsdc,\n stableToRaw,\n rawToStable,\n getDecimals,\n formatUsd,\n formatSui,\n formatAssetAmount,\n normalizeAsset,\n} from './utils/format.js';\nexport {\n generateKeypair,\n keypairFromPrivateKey,\n saveKey,\n loadKey,\n walletExists,\n exportPrivateKey,\n getAddress,\n} from './wallet/keyManager.js';\nexport { buildSendTx, addSendToTx } from './wallet/send.js';\nexport {\n fetchAllCoins,\n selectAndSplitCoin,\n selectSuiCoin,\n} from './wallet/coinSelection.js';\nexport type { CoinPage, SelectAndSplitResult } from './wallet/coinSelection.js';\nexport {\n composeTx,\n deriveAllowedAddressesFromPtb,\n WRITE_APPENDER_REGISTRY,\n} from './composeTx.js';\nexport type {\n WriteToolName,\n WriteStep,\n ComposeTxOptions,\n ComposeTxResult,\n ComposeTxFeeHooks,\n ComposeTxFeeHookContext,\n AppenderContext,\n StepPreview,\n SaveDepositInput,\n WithdrawInput,\n BorrowInput,\n RepayDebtInput,\n SendTransferInput,\n SwapExecuteInput,\n ClaimRewardsInput,\n VoloStakeInput,\n VoloUnstakeInput,\n} from './composeTx.js';\nexport { calculateFee, addFeeTransfer } from './protocols/protocolFee.js';\nexport type { ProtocolFeeInfo, FeeOperation } from './protocols/protocolFee.js';\nexport {\n getFinancialSummary,\n HF_WARN_THRESHOLD,\n HF_CRITICAL_THRESHOLD,\n} from './protocols/financialSummary.js';\nexport type { FinancialSummaryOptions } from './protocols/financialSummary.js';\nexport { simulateTransaction, throwIfSimulationFailed } from './utils/simulate.js';\nexport type { SimulationResult } from './utils/simulate.js';\nexport {\n getRates,\n getPendingRewards,\n getPendingRewardsByAddress,\n addClaimRewardsToTx,\n buildClaimRewardsTx,\n aggregateClaimableRewards,\n} from './protocols/navi.js';\n// [Track B / 2026-05-08] Single-PTB compound flow: claim NAVI rewards,\n// swap each non-USDC reward to USDC inline (Cetus chain mode), deposit\n// the merged USDC into the NAVI USDC pool. ONE confirm card, atomic\n// settlement. Powers the engine's `harvest_rewards` tool and the\n// audric \"🌾 HARVEST\" chip.\nexport { buildHarvestRewardsTx } from './protocols/navi-harvest.js';\nexport type {\n HarvestPlan,\n HarvestSwapLeg,\n HarvestSkippedLeg,\n BuildHarvestRewardsTxOptions,\n} from './protocols/navi-harvest.js';\nexport { getSwapQuote } from './swap-quote.js';\nexport {\n findSwapRoute,\n buildSwapTx,\n addSwapToTx,\n OVERLAY_FEE_RATE,\n} from './protocols/cetus-swap.js';\nexport type { SwapRouteResult, OverlayFeeConfig } from './protocols/cetus-swap.js';\nexport {\n COIN_REGISTRY,\n TOKEN_MAP,\n resolveTokenType,\n resolveSymbol,\n getDecimalsForCoinType,\n getCoinMeta,\n isInRegistry,\n isTier1,\n isTier2,\n isSupported,\n getTier,\n SUI_TYPE,\n USDC_TYPE,\n USDT_TYPE,\n USDSUI_TYPE,\n USDE_TYPE,\n ETH_TYPE,\n WBTC_TYPE,\n WAL_TYPE,\n NAVX_TYPE,\n IKA_TYPE,\n LOFI_TYPE,\n MANIFEST_TYPE,\n} from './token-registry.js';\nexport type { CoinMeta } from './token-registry.js';\nexport {\n buildStakeVSuiTx,\n buildUnstakeVSuiTx,\n addStakeVSuiToTx,\n addUnstakeVSuiToTx,\n getVoloStats,\n VSUI_TYPE,\n VOLO_PKG,\n VOLO_POOL,\n VOLO_METADATA,\n} from './protocols/volo.js';\nexport type { VoloStats } from './protocols/volo.js';\nexport {\n AUDRIC_PARENT_NAME,\n AUDRIC_PARENT_NFT_ID,\n buildAddLeafTx,\n buildRevokeLeafTx,\n displayHandle,\n fullHandle,\n validateLabel,\n} from './protocols/suins-leaf.js';\nexport type {\n BuildAddLeafParams,\n BuildRevokeLeafParams,\n LabelValidationResult,\n} from './protocols/suins-leaf.js';\nexport * from './adapters/index.js';\nexport { SafeguardEnforcer, SafeguardError } from './safeguards/index.js';\nexport type { SafeguardConfig, TxMetadata, SafeguardRule, SafeguardErrorDetails } from './safeguards/index.js';\nexport { OUTBOUND_OPS, DEFAULT_SAFEGUARD_CONFIG } from './safeguards/index.js';\n","/**\n * NAVI rewards harvest — single-PTB compound flow.\n *\n * **Goal.** Bundle the three-step \"claim → swap → save\" reward-cycling\n * routine into ONE atomic Programmable Transaction Block so the user\n * sees ONE confirm card instead of three sequential ones, and so the\n * legs settle together (or revert together — no half-claimed-but-\n * unsaved drift).\n *\n * **Flow.**\n * 1. Read pending rewards via NAVI's `getUserAvailableLendingRewards`\n * (same source as `getPendingRewards` + `addClaimRewardsToTx`, so\n * what the user sees in `pending_rewards` is exactly what gets\n * harvested — no drift).\n * 2. Append `claimLendingRewardsPTB(... { customCoinReceive: { type: 'skip' }})`\n * so the claimed coin handles are returned as `TransactionObjectArgument`\n * handles instead of being transferred to the wallet — they stay\n * consumable inside the same PTB.\n * 3. For each claimed handle:\n * • If the reward IS USDC, hold the handle for the deposit step.\n * • If the reward is in `COIN_REGISTRY` AND tradeable on Cetus\n * (any tier-2 token effectively), append `addSwapToTx` in chain\n * mode using the claimed coin as `inputCoin`. Collect the USDC\n * output handle.\n * • Else (untradeable / non-registry), transfer the claimed coin\n * back to the user's wallet — preserves the reward but skips\n * the auto-deposit (the user keeps it as a wallet asset).\n * 4. Merge all collected USDC handles via `tx.mergeCoins`, then deposit\n * via `addSaveToTx`.\n *\n * **Atomicity.** Single PTB = single transaction = single sponsored-gas\n * envelope. Either ALL legs settle (claim + swap(s) + deposit) or none\n * do. No partial-state recovery code needed.\n *\n * **Sponsored-gas posture.** This builder appends ONLY chained move\n * calls — no `tx.gas` reads, no Pyth fee writes, no oracle Pyth updates.\n * Cetus chain-mode swaps with `slippage` ≤ 5% don't require Pyth either\n * (Cetus aggregator routes around Pyth-dependent providers when callers\n * pass `providers: getProvidersExcluding(...)`). Audric's host wires\n * the provider exclusion automatically for Enoki sponsorship — see\n * `cetus-swap.ts` JSDoc.\n *\n * **Dust filter.** Rewards with `amount * priceCache.get(symbol) <\n * minRewardUsd` are skipped from the swap leg AND from the deposit —\n * not worth the gas to swap dust. They get transferred back to the\n * wallet (preserving on-chain truth: the claim happened, the swap\n * didn't). Default minRewardUsd = $0.01.\n *\n * **Failure modes.**\n * - PROTOCOL_UNAVAILABLE — NAVI rewards lookup or claim PTB build failed.\n * Engine surfaces \"NAVI is degraded right now.\"\n * - SWAP_NO_ROUTE — a reward asset has no Cetus route. Logged + that\n * leg is skipped (rewards transferred to wallet). Other legs proceed.\n * - INVALID_AMOUNT — rewards array empty after dust filter (nothing\n * worth harvesting). Throws so the engine narrates \"nothing to\n * harvest right now\" instead of building a no-op PTB.\n *\n * **Why a separate file (not inside `navi.ts`).** This composition\n * crosses two protocols (NAVI + Cetus) — keeping it out of `navi.ts`\n * preserves the single-protocol-per-file invariant the rest of the SDK\n * follows. Mirrors how `cetus-swap.ts` already lives separately even\n * though it composes through `composeTx.ts`.\n */\n\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { getUserAvailableLendingRewards, claimLendingRewardsPTB } from '@naviprotocol/lending';\nimport { T2000Error } from '../errors.js';\nimport { getCoinMeta, USDC_TYPE } from '../token-registry.js';\nimport { addSaveToTx, aggregateClaimableRewards } from './navi.js';\nimport { addSwapToTx, type OverlayFeeConfig } from './cetus-swap.js';\nimport type { PendingReward } from '../adapters/types.js';\n\n// -- types --------------------------------------------------------------\n\nexport interface HarvestSwapLeg {\n /** Reward symbol pre-swap (e.g. 'vSUI', 'NAVX'). */\n fromSymbol: string;\n /** Reward coinType pre-swap. */\n fromCoinType: string;\n /** Always 'USDC' — this builder only deposits to the USDC pool. */\n toSymbol: 'USDC';\n /** Display-units input amount (the entire claimed reward for that coin). */\n inputAmount: number;\n /** Display-units USDC the swap quote estimated. Actual on-chain may differ within slippage. */\n expectedOutputUsdc: number;\n}\n\nexport interface HarvestSkippedLeg {\n /** Reward symbol skipped (untradeable, dust, or no-route). */\n symbol: string;\n coinType: string;\n /** Display-units claimed amount (still credited to user's wallet — just not auto-deposited). */\n amount: number;\n /** 'untradeable' | 'dust' | 'no-route' */\n reason: 'untradeable' | 'dust' | 'no-route';\n}\n\nexport interface HarvestPlan {\n /** Every reward that WILL be claimed by this PTB. */\n claimed: PendingReward[];\n /** Each non-USDC reward that WILL be swapped to USDC inline. */\n swaps: HarvestSwapLeg[];\n /** Rewards claimed but transferred back to wallet (no auto-deposit). */\n skipped: HarvestSkippedLeg[];\n /** Display-units USDC that will be deposited to the NAVI USDC pool. */\n expectedUsdcDeposited: number;\n}\n\n/**\n * Callback invoked right before the harvest's internal `addSaveToTx`.\n * Mirrors the shape of `composeTx`'s `feeHooks.save_deposit` so audric's\n * existing hook can be threaded straight through without adapters. The\n * SDK never invents a fee — the host decides whether to skim from\n * `coin` and to where. See CLAUDE.md rule #9 (fees are a host concern).\n */\nexport type HarvestSaveFeeHook = (ctx: {\n tx: Transaction;\n coin: TransactionObjectArgument;\n input: { asset: 'USDC'; amount: number };\n sender: string;\n}) => void | Promise<void>;\n\nexport interface BuildHarvestRewardsTxOptions {\n /** Per-swap slippage tolerance (0.001–0.05). Defaults to 0.01 (1%). */\n slippage?: number;\n /**\n * USD floor for \"is this worth swapping?\". Rewards below this threshold\n * get transferred back to the wallet instead of swapped. Default $0.01.\n * Pass 0 to disable the filter (always swap; useful for tests).\n */\n minRewardUsd?: number;\n /**\n * Symbol → USD price map. Sourced from the engine's `ToolContext.priceCache`\n * in production; tests can pass a literal Map. When undefined, the dust\n * filter degrades to \"skip nothing\" (every reward is swapped) so we don't\n * accidentally drop large rewards just because we couldn't price them.\n */\n priceCache?: Map<string, number>;\n /**\n * Cetus provider allow-list. Sponsored callers (Enoki) pass\n * `getProvidersExcluding(['pyth-dependent-list'])` to keep the PTB\n * Pyth-free. Non-sponsored callers omit this.\n */\n providers?: string[];\n /**\n * [v1.24.2 fee wiring] Overlay fee forwarded to EACH internal\n * `addSwapToTx` call. When set, every swap leg charges the rate to\n * the receiver (typically `T2000_OVERLAY_FEE_WALLET` for audric).\n * Omit for fee-free harvests (CLI / direct SDK callers).\n */\n overlayFee?: OverlayFeeConfig;\n /**\n * [v1.24.2 fee wiring] Fired immediately before the internal\n * `addSaveToTx` consumes the merged USDC deposit coin. The hook\n * receives the deposit handle so it can split a fee off via\n * `addFeeTransfer(...)` (host's call). Audric threads its\n * `feeHooks.save_deposit` straight through here so a harvest's\n * deposit leg pays the same `SAVE_FEE_BPS` as a single-op `save`.\n *\n * Order is load-bearing: this hook fires AFTER all USDC handles\n * are merged into one and BEFORE the NAVI deposit consumes it.\n * Fee receiver gets recorded as a top-level transferObjects, so\n * it's automatically picked up by `derivedAllowedAddresses`.\n */\n saveFeeHook?: HarvestSaveFeeHook;\n}\n\n// -- builders -----------------------------------------------------------\n\n/**\n * Append the harvest legs (claim → swap(s) → save) to an EXISTING PTB.\n * Used by `composeTx`'s `harvest_rewards` registry appender so harvest\n * fits the same orchestration pattern as every other write tool.\n *\n * Standalone callers (CLI, smoke tests) should use `buildHarvestRewardsTx`\n * which wraps this with `tx.setSender(address)` and a fresh `Transaction`.\n */\nexport async function addHarvestToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n options: BuildHarvestRewardsTxOptions = {},\n): Promise<HarvestPlan> {\n const slippage = options.slippage ?? 0.01;\n const minRewardUsd = options.minRewardUsd ?? 0.01;\n const priceCache = options.priceCache;\n\n // Step 1 — read pending rewards. Same source + same shape as\n // `getPendingRewards` so users see EXACTLY what they're about to harvest.\n let rawRewards;\n try {\n rawRewards = await getUserAvailableLendingRewards(address, {\n env: 'prod',\n client: client as never,\n markets: ['main'],\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error(\n 'PROTOCOL_UNAVAILABLE',\n `NAVI rewards lookup failed: ${msg}`,\n { source: 'navi-harvest-read' },\n true,\n );\n }\n\n const claimable = (rawRewards ?? []).filter((r) => Number(r.userClaimableReward) > 0);\n if (claimable.length === 0) {\n throw new T2000Error(\n 'INVALID_AMOUNT',\n 'No pending rewards to harvest.',\n { source: 'navi-harvest' },\n );\n }\n\n // Pre-aggregate so the plan + the claim PTB receive the SAME view —\n // mirrors `addClaimRewardsToTx`'s aggregation step. The PTB still gets\n // the raw `claimable` list (NAVI iterates per-pool internally); the\n // plan output uses the aggregated view (one row per coin, like the\n // `pending_rewards` tool surfaces).\n const aggregated = aggregateClaimableRewards(claimable);\n\n let claimed: Array<{ coin: TransactionObjectArgument; coinType: string }>;\n try {\n const claimResult = await claimLendingRewardsPTB(tx, claimable, {\n env: 'prod',\n // 'skip' = NAVI doesn't auto-transfer; coin handles stay in the PTB\n // for downstream consumption. Verified against NAVI lending source\n // (index.esm.js@1828–1911) — when type !== 'transfer' && type !==\n // 'depositNAVI', the `else` branch pushes `{ coin, identifier, ... }`\n // to the return without consuming the handle.\n customCoinReceive: { type: 'skip' as const },\n });\n // NAVI's claim emits ONE entry per (asset, reward-type) row, NOT one\n // per claimable input row. Group by coin type to match the swap-plan\n // shape (one swap per coin type, regardless of how many pools it\n // came from).\n const grouped = new Map<string, TransactionObjectArgument[]>();\n for (const c of claimResult) {\n // c.identifier is a NAVI Pool — the suiCoinType field is the reward coin's full type.\n const ct = (c.identifier as { suiCoinType?: string }).suiCoinType ?? '';\n if (!ct) continue;\n const list = grouped.get(ct) ?? [];\n list.push(c.coin);\n grouped.set(ct, list);\n }\n // For each coin type, merge all NAVI-emitted handles into one (so\n // each coin type yields exactly ONE handle for swap/save chaining).\n claimed = [];\n for (const [coinType, handles] of grouped.entries()) {\n if (handles.length === 1) {\n claimed.push({ coin: handles[0], coinType });\n } else {\n // mergeCoins: tx.mergeCoins(destination, [sources...]) — destination\n // is the first; absorbs the rest; returns destination ref.\n const [dest, ...rest] = handles;\n tx.mergeCoins(dest, rest);\n claimed.push({ coin: dest, coinType });\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error(\n 'PROTOCOL_UNAVAILABLE',\n `NAVI claim PTB build failed: ${msg}`,\n { source: 'navi-harvest-claim-ptb' },\n true,\n );\n }\n\n // Step 3 — classify each claimed coin: USDC (deposit-eligible), tradeable\n // (swap then deposit), or untradeable (transfer to wallet).\n const usdcHandles: TransactionObjectArgument[] = [];\n const swaps: HarvestSwapLeg[] = [];\n const skipped: HarvestSkippedLeg[] = [];\n\n // For computing expected USDC totals — sum claimed USDC + each swap quote.\n let expectedUsdcDeposited = 0;\n\n for (const { coin, coinType } of claimed) {\n const aggRow = aggregated.find((r) => r.coinType === coinType);\n if (!aggRow) {\n // Defensive — shouldn't happen since claimable feeds both paths.\n continue;\n }\n\n if (coinType === USDC_TYPE) {\n usdcHandles.push(coin);\n expectedUsdcDeposited += aggRow.amount;\n continue;\n }\n\n const meta = getCoinMeta(coinType);\n const isTradeable = meta && (meta.tier === 1 || meta.tier === 2);\n if (!isTradeable) {\n tx.transferObjects([coin], address);\n skipped.push({\n symbol: aggRow.symbol,\n coinType,\n amount: aggRow.amount,\n reason: 'untradeable',\n });\n continue;\n }\n\n // Dust filter — only when we have a price for the symbol.\n if (priceCache && minRewardUsd > 0) {\n const px = priceCache.get(aggRow.symbol.toUpperCase());\n if (px && px > 0 && aggRow.amount * px < minRewardUsd) {\n tx.transferObjects([coin], address);\n skipped.push({\n symbol: aggRow.symbol,\n coinType,\n amount: aggRow.amount,\n reason: 'dust',\n });\n continue;\n }\n }\n\n // Tradeable + above-dust — append swap leg in chain mode.\n try {\n const swapResult = await addSwapToTx(tx, client, address, {\n from: aggRow.symbol,\n to: 'USDC',\n amount: aggRow.amount,\n slippage,\n inputCoin: coin,\n providers: options.providers,\n overlayFee: options.overlayFee,\n });\n usdcHandles.push(swapResult.coin);\n expectedUsdcDeposited += swapResult.expectedAmountOut;\n swaps.push({\n fromSymbol: aggRow.symbol,\n fromCoinType: coinType,\n toSymbol: 'USDC',\n inputAmount: swapResult.effectiveAmountIn,\n expectedOutputUsdc: swapResult.expectedAmountOut,\n });\n } catch (err) {\n // SWAP_NO_ROUTE / SWAP_FAILED for this leg → transfer to wallet\n // and continue. Other reward legs still settle.\n const code = err instanceof T2000Error ? err.code : 'UNKNOWN';\n if (code !== 'SWAP_NO_ROUTE' && code !== 'SWAP_FAILED') {\n // Non-routing failure (e.g. provider down) — re-throw so the user\n // doesn't silently get a degraded harvest.\n throw err;\n }\n tx.transferObjects([coin], address);\n skipped.push({\n symbol: aggRow.symbol,\n coinType,\n amount: aggRow.amount,\n reason: 'no-route',\n });\n }\n }\n\n // Step 4 — merge USDC handles + deposit, OR no-op if nothing to deposit.\n if (usdcHandles.length > 0) {\n let depositCoin: TransactionObjectArgument;\n if (usdcHandles.length === 1) {\n depositCoin = usdcHandles[0];\n } else {\n const [primary, ...rest] = usdcHandles;\n tx.mergeCoins(primary, rest);\n depositCoin = primary;\n }\n // [v1.24.2 fee wiring] Skim the host's save fee BEFORE deposit\n // consumes the coin. Same ordering rule as the single-op `save`\n // path: feeHooks.save_deposit fires after the user's USDC is in\n // hand, before the NAVI deposit move call. `expectedUsdcDeposited`\n // is the pre-fee total (claimed USDC + each swap quote); the hook\n // skims a fraction of it and the NAVI deposit consumes the\n // remainder.\n if (options.saveFeeHook) {\n await options.saveFeeHook({\n tx,\n coin: depositCoin,\n input: { asset: 'USDC', amount: expectedUsdcDeposited },\n sender: address,\n });\n }\n try {\n await addSaveToTx(tx, client, address, depositCoin, { asset: 'USDC' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error(\n 'PROTOCOL_UNAVAILABLE',\n `NAVI deposit failed during harvest: ${msg}`,\n { source: 'navi-harvest-deposit' },\n true,\n );\n }\n }\n // If usdcHandles is empty, all rewards were skipped (untradeable / dust /\n // no-route) and transferred to the wallet — no deposit needed. The plan\n // returns expectedUsdcDeposited = 0, which the engine tool surfaces as\n // \"claimed X but nothing to deposit; rewards are in your wallet.\"\n\n return {\n claimed: aggregated,\n swaps,\n skipped,\n expectedUsdcDeposited,\n };\n}\n\n/**\n * Standalone harvest builder — creates a fresh PTB, sets the sender,\n * appends the full harvest flow, and returns both the tx and the plan.\n * Used by CLI / direct SDK callers (smoke tests, scripts). The audric\n * host goes through `composeTx({ steps: [{ toolName: 'harvest_rewards' }] })`\n * which wires the appender + Enoki sponsorship.\n */\nexport async function buildHarvestRewardsTx(\n client: SuiJsonRpcClient,\n address: string,\n options: BuildHarvestRewardsTxOptions = {},\n): Promise<{ tx: Transaction; plan: HarvestPlan }> {\n const tx = new Transaction();\n tx.setSender(address);\n const plan = await addHarvestToTx(tx, client, address, options);\n return { tx, plan };\n}\n\n","/**\n * SPEC 7 v0.4 § Layer 0 — Canonical Write Architecture.\n *\n * `composeTx({ steps })` is the single canonical entry-point for every\n * Audric Enoki-sponsored write. The fragment-appender pattern (Layer 1)\n * is the implementation; this primitive dispatches each step to its\n * registered appender from the typed `WRITE_APPENDER_REGISTRY`.\n *\n * Single-write and multi-write go through the same code path. A 1-step\n * `composeTx([{ toolName: 'send_transfer', input: {...} }])` produces\n * the same shape of result as a 3-step bundle.\n *\n * **Why this exists**\n *\n * Pre-Layer-0, four parallel write stacks lived across the audric host:\n * `transactions/prepare` (fat ~600-line route), `services/prepare`\n * (hand-rolled), `debug-swap` (diagnostic), and PayButton (dapp-kit).\n * Each one re-implemented merge/split/transfer + hand-maintained the\n * `allowedAddresses` array Enoki requires. Two production bugs in the\n * past 60 days came from drift between them — PR-H1 (claim-rewards\n * self-transfer missing from allowedAddresses) and PR-H4 (borrow/\n * withdraw self-transfer same bug).\n *\n * Layer 0 collapses 3 of those stacks into one canonical primitive.\n * PayButton stays out by design (different signer, different trust\n * model — see `audric-canonical-write.mdc` for the rationale and the\n * `// CANONICAL-BYPASS:` escape-hatch contract).\n *\n * **What composeTx owns**\n *\n * - PTB assembly via per-tool wallet-mode appenders (the\n * `WRITE_APPENDER_REGISTRY`).\n * - Pre-built `txKindBytes` (`tx.build({ onlyTransactionKind: true })`)\n * ready for Enoki's `createSponsoredTransaction`.\n * - Auto-derived `derivedAllowedAddresses` from the assembled PTB's\n * top-level `transferObjects` calls — eliminates the PR-H1/H4 bug\n * class permanently. Hand-maintained arrays are now unreachable.\n * - S.38 Pyth flag plumbing — `sponsoredContext: true` automatically\n * applies `skipPythUpdate` (borrow/withdraw) and `skipOracle` (repay)\n * to NAVI appenders so Enoki doesn't reject `tx.gas`-as-argument.\n *\n * **What composeTx does NOT own**\n *\n * - **Fees** — Audric concern, not @t2000/sdk concern (CLAUDE.md\n * rule #9). The SDK is fee-free by design as of @t2000/sdk@1.1.0\n * (B5 v2). Audric host wraps composeTx with fee insertion in P2.2c.\n * - **Sponsorship** — caller's job. composeTx returns `txKindBytes`\n * pre-built for Enoki; the caller calls `createSponsoredTransaction`\n * with their JWT.\n * - **Chain-mode coin handoff between steps** — Layer 2 (engine\n * bundling) ships this. P2.2b is wallet-mode-only: each step fetches\n * coins independently. Layer 2 will extend by introducing\n * `inputCoinFromStep: number` to thread upstream output coins.\n *\n * **Cross-references**\n *\n * - Spec → `spec/SPEC_7_MULTI_WRITE_PTB.md` § \"Layer 0: Canonical\n * Write Architecture\"\n * - Read-side companion → `t2000/.cursor/rules/single-source-of-truth.mdc`\n * + `audric/.cursor/rules/audric-canonical-portfolio.mdc`\n * - Write-side rule → `audric/.cursor/rules/audric-canonical-write.mdc`\n */\n\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n Transaction,\n type TransactionObjectArgument,\n} from '@mysten/sui/transactions';\nimport type { OverlayFeeConfig } from './protocols/cetus-swap.js';\nimport {\n addSaveToTx,\n addWithdrawToTx,\n addBorrowToTx,\n addRepayToTx,\n addClaimRewardsToTx,\n} from './protocols/navi.js';\nimport { addHarvestToTx } from './protocols/navi-harvest.js';\nimport type { PendingReward } from './adapters/types.js';\nimport { addSwapToTx, type SwapRouteResult } from './protocols/cetus-swap.js';\nimport {\n addStakeVSuiToTx,\n addUnstakeVSuiToTx,\n} from './protocols/volo.js';\nimport { addSendToTx } from './wallet/send.js';\nimport { selectAndSplitCoin, selectSuiCoin } from './wallet/coinSelection.js';\nimport { resolveTokenType, getDecimalsForCoinType, SUI_TYPE } from './token-registry.js';\nimport { SUPPORTED_ASSETS, type SupportedAsset } from './constants.js';\nimport { T2000Error } from './errors.js';\nimport { validateAddress } from './utils/sui.js';\n\n/**\n * Canonical write tools. The 10 tools that can be composed into a PTB\n * (Track B 2026-05-08 added `harvest_rewards`).\n *\n * Excluded by design:\n * - `pay_api` — recipient/amount unknown at compose time; the on-chain\n * leg uses `send_transfer` after the gateway 402 challenge resolves.\n * - `save_contact` — no on-chain leg (Prisma-only).\n */\nexport type WriteToolName =\n | 'save_deposit'\n | 'withdraw'\n | 'borrow'\n | 'repay_debt'\n | 'send_transfer'\n | 'swap_execute'\n | 'claim_rewards'\n // [Track B / 2026-05-08] Compound: claim NAVI rewards → swap each non-USDC\n // reward to USDC inline → deposit into NAVI USDC pool. ONE confirm card.\n | 'harvest_rewards'\n | 'volo_stake'\n | 'volo_unstake';\n\n// Per-tool input contracts. Match the engine tool input schemas, not the\n// audric host's loosely-typed `params` blob — the registry is the typed\n// surface that lets the host shed the `any`-typed switch statement.\n\nexport interface SaveDepositInput {\n amount: number;\n asset?: 'USDC' | 'USDsui';\n}\n\nexport interface WithdrawInput {\n amount: number;\n asset?: 'USDC' | 'USDsui';\n}\n\nexport interface BorrowInput {\n amount: number;\n asset?: 'USDC' | 'USDsui';\n}\n\nexport interface RepayDebtInput {\n amount: number;\n asset?: 'USDC' | 'USDsui';\n}\n\nexport interface SendTransferInput {\n to: string;\n amount: number;\n asset?: SupportedAsset;\n}\n\nexport interface SwapExecuteInput {\n from: string;\n to: string;\n amount: number;\n slippage?: number;\n byAmountIn?: boolean;\n /** Cetus provider allow-list. Sponsored callers MUST pass an exclusion list\n * to remove Pyth-dependent providers — see addSwapToTx JSDoc. composeTx\n * derives this automatically from `sponsoredContext` if omitted. */\n providers?: string[];\n}\n\nexport type ClaimRewardsInput = Record<string, never>;\n\n/**\n * [Track B] `harvest_rewards` accepts only optional tunables — no required\n * inputs, since the user's choice is binary (\"harvest now\" or not). Default\n * slippage 1%, default dust floor $0.01. The audric host's HARVEST chip\n * passes literal `{}` and gets sensible defaults.\n */\nexport interface HarvestRewardsInput {\n /** Per-swap slippage tolerance (0.001–0.05). Default 0.01 (1%). */\n slippage?: number;\n /** USD floor for \"is this worth swapping?\" — dust below transfers to wallet. Default $0.01. */\n minRewardUsd?: number;\n}\n\nexport interface VoloStakeInput {\n amountSui: number;\n}\n\nexport interface VoloUnstakeInput {\n amountVSui: number | 'all';\n}\n\n/**\n * Discriminated union mapping `toolName` → `input`. Used to type\n * `WriteStep` so consumers get autocomplete + compile-time validation\n * that the input matches the tool.\n *\n * **[SPEC 13 Phase 1] `inputCoinFromStep`** — consumer steps may\n * reference an earlier step's output coin handle by index. When set,\n * `composeTx`'s orchestration loop threads the producer's\n * `outputCoin` into this step's appender as the `inputCoin` arg,\n * bypassing the wallet pre-fetch path. The producer's terminal\n * `tx.transferObjects([coin], sender)` is suppressed automatically so\n * the same handle isn't double-consumed.\n *\n * Producer-only tools (`withdraw`, `borrow`, `claim_rewards`) don't\n * accept the field — they have no input coin slot. Consumer +\n * dual-mode tools all accept it.\n */\nexport type WriteStep =\n | { toolName: 'save_deposit'; input: SaveDepositInput; inputCoinFromStep?: number }\n | { toolName: 'withdraw'; input: WithdrawInput }\n | { toolName: 'borrow'; input: BorrowInput }\n | { toolName: 'repay_debt'; input: RepayDebtInput; inputCoinFromStep?: number }\n | { toolName: 'send_transfer'; input: SendTransferInput; inputCoinFromStep?: number }\n | { toolName: 'swap_execute'; input: SwapExecuteInput; inputCoinFromStep?: number }\n | { toolName: 'claim_rewards'; input: ClaimRewardsInput }\n // Self-contained compound — internally claims, swaps, and deposits in\n // one PTB. Doesn't accept `inputCoinFromStep` because it's the only\n // step in the bundle (it's a \"macro\" appender, not a chainable producer\n // or consumer).\n | { toolName: 'harvest_rewards'; input: HarvestRewardsInput }\n | { toolName: 'volo_stake'; input: VoloStakeInput; inputCoinFromStep?: number }\n | { toolName: 'volo_unstake'; input: VoloUnstakeInput; inputCoinFromStep?: number };\n\nexport interface ComposeTxOptions {\n sender: string;\n steps: WriteStep[];\n client: SuiJsonRpcClient;\n /**\n * S.38 Pyth flag (sponsorship-critical). When true:\n * - NAVI borrow/withdraw appenders apply `skipPythUpdate: true`\n * (preserves on-chain price-feed updates, skips the tx.gas-using\n * Pyth fee payment that Enoki rejects).\n * - NAVI repay appender applies `skipOracle: true` (debt reduction\n * has no health-factor risk, full oracle bypass is safe).\n * - Cetus swap appender applies `getProvidersExcluding([HAEDALPMM,\n * METASTABLE, OBRIC, STEAMM_OMM, STEAMM_OMM_V2, SEVENK,\n * HAEDALHMMV2])` — Pyth-dependent providers reference `tx.gas` for\n * oracle fees, also rejected by Enoki.\n * - SUI sends fetch coins via `getCoins` (tx.gas belongs to sponsor,\n * not user) instead of splitting from `tx.gas`.\n *\n * Self-funded callers (CLI, MCP, server tasks) leave this `false` /\n * omit — they pay all oracle/Pyth fees from their own SUI gas.\n */\n sponsoredContext?: boolean;\n /**\n * Per-call overlay fee config for Cetus swaps. Audric host passes\n * `{ rate: 0.001, receiver: T2000_OVERLAY_FEE_WALLET }` to charge the\n * 0.1% swap overlay. CLI / direct SDK callers omit. Forwarded to\n * `addSwapToTx`'s `input.overlayFee`.\n */\n overlayFee?: OverlayFeeConfig;\n /**\n * Optional fee-injection hooks for save_deposit + borrow. Fires inside\n * the appender at the exact moment the user's coin is in hand and BEFORE\n * the protocol step consumes (save) or the canonical transferObjects\n * finalizes (borrow). Audric host uses this to inline `addFeeTransfer`\n * for USDC SAVE_FEE_BPS / BORROW_FEE_BPS without ever leaving the\n * canonical write contract — keeps the SDK fee-free per CLAUDE.md\n * rule #9 while letting hosts charge their own overlay fees.\n *\n * Hooks are fire-and-forget (no return value). They mutate `tx` directly\n * (e.g., `addFeeTransfer(tx, coin, ...)` splits the fee chunk off and\n * appends a top-level `transferObjects` to the host's fee wallet — that\n * recipient automatically appears in `derivedAllowedAddresses`).\n */\n feeHooks?: ComposeTxFeeHooks;\n}\n\n/**\n * Per-tool fee-injection callbacks. Each hook fires at a tool-specific\n * moment in the appender flow (see field JSDoc). Currently scoped to\n * the 2 fee-eligible tools — extend if/when new ones land.\n */\nexport interface ComposeTxFeeHooks {\n /**\n * Fires inside the `save_deposit` appender AFTER the user's USDC/USDsui\n * coin is split into the deposit amount, BEFORE NAVI's `deposit` move\n * call consumes the coin. Order matters: the `coin` reference passed in\n * is the SAME `TransactionObjectArgument` that flows into the deposit,\n * so any `splitCoins(coin, [feeAmount])` inside the hook reduces the\n * deposit by exactly that fee.\n */\n save_deposit?: (ctx: ComposeTxFeeHookContext<SaveDepositInput>) => void | Promise<void>;\n /**\n * Fires inside the `borrow` appender AFTER NAVI returns the borrowed\n * coin, BEFORE the canonical `transferObjects(coin, sender)` finalizes.\n * The `coin` reference is the borrowed-and-not-yet-transferred output;\n * splitting a fee here means the user receives the remainder.\n */\n borrow?: (ctx: ComposeTxFeeHookContext<BorrowInput>) => void | Promise<void>;\n}\n\n/**\n * Context object passed to every fee hook. Carries the `tx` (mutate it),\n * the in-flight `coin` (split fees off it), the resolved tool input\n * (asset/amount for fee-policy decisions), and the sender (rarely needed\n * but kept for symmetry with `AppenderContext`).\n */\nexport interface ComposeTxFeeHookContext<TInput> {\n tx: Transaction;\n coin: TransactionObjectArgument;\n input: TInput;\n sender: string;\n}\n\n/** Per-step preview returned by each registry appender. Tool-specific shape. */\nexport type StepPreview =\n | { toolName: 'save_deposit'; effectiveAmount: number; asset: 'USDC' | 'USDsui' }\n | { toolName: 'withdraw'; effectiveAmount: number; asset: 'USDC' | 'USDsui' }\n | { toolName: 'borrow'; effectiveAmount: number; asset: 'USDC' | 'USDsui' }\n | { toolName: 'repay_debt'; effectiveAmount: number; asset: 'USDC' | 'USDsui' }\n | { toolName: 'send_transfer'; effectiveAmount: number; recipient: string; asset: SupportedAsset }\n | { toolName: 'swap_execute'; effectiveAmountIn: number; expectedAmountOut: number; route: SwapRouteResult }\n | { toolName: 'claim_rewards'; rewards: PendingReward[] }\n // Compact: the audric host renders a multi-line \"Claim → Swap → Save\"\n // breakdown card from this preview (claimed[], swaps[], skipped[],\n // expectedUsdcDeposited). One signature, one settlement.\n | {\n toolName: 'harvest_rewards';\n claimed: PendingReward[];\n swaps: Array<{\n fromSymbol: string;\n fromCoinType: string;\n toSymbol: 'USDC';\n inputAmount: number;\n expectedOutputUsdc: number;\n }>;\n skipped: Array<{\n symbol: string;\n coinType: string;\n amount: number;\n reason: 'untradeable' | 'dust' | 'no-route';\n }>;\n expectedUsdcDeposited: number;\n }\n | { toolName: 'volo_stake'; effectiveAmountMist: bigint }\n | { toolName: 'volo_unstake'; effectiveAmountMist: bigint | 'all' };\n\nexport interface ComposeTxResult {\n tx: Transaction;\n /**\n * Pre-built bytes for Enoki's `createSponsoredTransaction`. Built\n * with `onlyTransactionKind: true` so the gas coin can be supplied\n * by the sponsor.\n */\n txKindBytes: Uint8Array;\n /**\n * Auto-derived from the assembled PTB's top-level `transferObjects`\n * commands. Replaces hand-maintained `allowedAddresses` arrays in\n * audric host's `transactions/prepare` + `services/prepare` —\n * eliminates the PR-H1/H4 bug class permanently.\n */\n derivedAllowedAddresses: string[];\n perStepPreviews: StepPreview[];\n}\n\n/**\n * Per-appender context passed into every registry entry. Carries the\n * RPC client, sender, sponsorship flag, optional per-call overlay\n * fee config (Cetus swaps), and SPEC 13 Phase 1 chain-mode fields.\n */\nexport interface AppenderContext {\n client: SuiJsonRpcClient;\n sender: string;\n sponsoredContext: boolean;\n overlayFee?: OverlayFeeConfig;\n feeHooks?: ComposeTxFeeHooks;\n /**\n * [SPEC 13 Phase 1] When set, the consumer appender consumes this\n * coin handle directly instead of pre-fetching from the wallet via\n * `selectAndSplitCoin` / `selectSuiCoin`. Provided by the\n * orchestration loop when the step has `inputCoinFromStep` set; the\n * loop looks up `priorOutputs[step.inputCoinFromStep]` and threads\n * it through here.\n *\n * In chain mode, the consumer consumes the handle IN FULL — the\n * `input.amount` field is treated as informational (used for preview\n * math). This matches Cetus's `routerSwap`, NAVI's `deposit`/`repay`,\n * and the Sui `transferObjects` semantics: each takes a coin object\n * and consumes its entire balance.\n */\n chainedCoin?: TransactionObjectArgument;\n /**\n * [SPEC 13 Phase 1] True when this step's output coin will be\n * consumed by a downstream step (some later step has\n * `inputCoinFromStep === currentStepIndex`). Producer appenders MUST\n * skip their terminal `tx.transferObjects([coin], ctx.sender)` call\n * when this is true — otherwise the same `TransactionObjectArgument`\n * gets used twice (once by the consumer, once by the transfer) and\n * the PTB build fails or the on-chain leg reverts.\n */\n isOutputConsumed?: boolean;\n}\n\n/**\n * [SPEC 13 Phase 1] Appender return shape. Producers populate\n * `outputCoin` so the orchestration loop can thread it into a\n * downstream consumer's `chainedCoin`. Terminal consumers\n * (`save_deposit`, `repay_debt`, `send_transfer`) omit it.\n *\n * `swap_execute`, `volo_stake`, and `volo_unstake` are dual-mode —\n * they accept `chainedCoin` AND populate `outputCoin`.\n */\nexport interface AppenderResult<TPreview extends StepPreview> {\n preview: TPreview;\n outputCoin?: TransactionObjectArgument;\n}\n\ntype AppenderFn<TInput, TPreview extends StepPreview> = (\n tx: Transaction,\n input: TInput,\n ctx: AppenderContext,\n) => Promise<AppenderResult<TPreview>>;\n\n/**\n * Cetus provider exclusion list for sponsored flows. Mirrors the\n * audric host's `SPONSORED_TX_PROVIDERS` constant — these 7 providers\n * reference `tx.gas` for Pyth oracle fee payments, which Enoki rejects.\n *\n * NOTE: keeping this hardcoded means `findSwapRoute` doesn't need a\n * dependency on `@cetusprotocol/aggregator-sdk`'s `getProvidersExcluding`\n * helper — composeTx forwards the literal list to Cetus, Cetus does the\n * inverse lookup. Result is identical.\n */\nconst SPONSORED_PYTH_DEPENDENT_PROVIDERS = [\n 'HAEDALPMM',\n 'METASTABLE',\n 'OBRIC',\n 'STEAMM_OMM',\n 'STEAMM_OMM_V2',\n 'SEVENK',\n 'HAEDALHMMV2',\n] as const;\n\n/**\n * Get all eligible Cetus provider names except the Pyth-dependent ones,\n * for sponsored swap context. Computed from the Cetus SDK's\n * `getAllProviders()` minus the exclusion list.\n */\nasync function getSponsoredSwapProviders(): Promise<string[]> {\n const { getProvidersExcluding } = await import('@cetusprotocol/aggregator-sdk');\n return getProvidersExcluding([...SPONSORED_PYTH_DEPENDENT_PROVIDERS]);\n}\n\n/** Resolve canonical asset symbol or throw `INVALID_ASSET`. */\nfunction resolveSaveableAsset(asset: 'USDC' | 'USDsui' | undefined): 'USDC' | 'USDsui' {\n if (!asset) return 'USDC';\n if (asset !== 'USDC' && asset !== 'USDsui') {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Saveable asset must be USDC or USDsui, got ${asset}`);\n }\n return asset;\n}\n\n/**\n * The typed registry. Each entry is a wallet-mode dispatcher that takes\n * (tx, input, ctx) and returns a per-step preview. Compile-time check\n * that all 10 `WriteToolName` values have an entry — TypeScript will\n * fail the build if a tool is missing.\n */\nexport const WRITE_APPENDER_REGISTRY: {\n save_deposit: AppenderFn<SaveDepositInput, Extract<StepPreview, { toolName: 'save_deposit' }>>;\n withdraw: AppenderFn<WithdrawInput, Extract<StepPreview, { toolName: 'withdraw' }>>;\n borrow: AppenderFn<BorrowInput, Extract<StepPreview, { toolName: 'borrow' }>>;\n repay_debt: AppenderFn<RepayDebtInput, Extract<StepPreview, { toolName: 'repay_debt' }>>;\n send_transfer: AppenderFn<SendTransferInput, Extract<StepPreview, { toolName: 'send_transfer' }>>;\n swap_execute: AppenderFn<SwapExecuteInput, Extract<StepPreview, { toolName: 'swap_execute' }>>;\n claim_rewards: AppenderFn<ClaimRewardsInput, Extract<StepPreview, { toolName: 'claim_rewards' }>>;\n harvest_rewards: AppenderFn<HarvestRewardsInput, Extract<StepPreview, { toolName: 'harvest_rewards' }>>;\n volo_stake: AppenderFn<VoloStakeInput, Extract<StepPreview, { toolName: 'volo_stake' }>>;\n volo_unstake: AppenderFn<VoloUnstakeInput, Extract<StepPreview, { toolName: 'volo_unstake' }>>;\n} = {\n save_deposit: async (tx, input, ctx) => {\n const asset = resolveSaveableAsset(input.asset);\n const assetInfo = SUPPORTED_ASSETS[asset];\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Save amount must be greater than zero');\n }\n const rawAmount = BigInt(Math.floor(input.amount * 10 ** assetInfo.decimals));\n\n let coin: TransactionObjectArgument;\n let effectiveAmount: bigint;\n if (ctx.chainedCoin) {\n coin = ctx.chainedCoin;\n effectiveAmount = rawAmount;\n } else {\n const r = await selectAndSplitCoin(tx, ctx.client, ctx.sender, assetInfo.type, rawAmount);\n coin = r.coin;\n effectiveAmount = r.effectiveAmount;\n }\n\n if (ctx.feeHooks?.save_deposit) {\n await ctx.feeHooks.save_deposit({ tx, coin, input, sender: ctx.sender });\n }\n await addSaveToTx(tx, ctx.client, ctx.sender, coin, { asset });\n return {\n preview: {\n toolName: 'save_deposit',\n effectiveAmount: Number(effectiveAmount) / 10 ** assetInfo.decimals,\n asset,\n },\n };\n },\n\n withdraw: async (tx, input, ctx) => {\n const asset = resolveSaveableAsset(input.asset);\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Withdraw amount must be greater than zero');\n }\n const { coin, effectiveAmount } = await addWithdrawToTx(\n tx, ctx.client, ctx.sender, input.amount,\n { asset, skipPythUpdate: ctx.sponsoredContext },\n );\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([coin], ctx.sender);\n }\n return {\n preview: { toolName: 'withdraw', effectiveAmount, asset },\n outputCoin: coin,\n };\n },\n\n borrow: async (tx, input, ctx) => {\n const asset = resolveSaveableAsset(input.asset);\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be greater than zero');\n }\n const coin = await addBorrowToTx(\n tx, ctx.client, ctx.sender, input.amount,\n { asset, skipPythUpdate: ctx.sponsoredContext },\n );\n if (ctx.feeHooks?.borrow) {\n await ctx.feeHooks.borrow({ tx, coin, input, sender: ctx.sender });\n }\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([coin], ctx.sender);\n }\n return {\n preview: { toolName: 'borrow', effectiveAmount: input.amount, asset },\n outputCoin: coin,\n };\n },\n\n repay_debt: async (tx, input, ctx) => {\n const asset = resolveSaveableAsset(input.asset);\n const assetInfo = SUPPORTED_ASSETS[asset];\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Repay amount must be greater than zero');\n }\n const rawAmount = BigInt(Math.floor(input.amount * 10 ** assetInfo.decimals));\n\n let coin: TransactionObjectArgument;\n let effectiveAmount: bigint;\n if (ctx.chainedCoin) {\n coin = ctx.chainedCoin;\n effectiveAmount = rawAmount;\n } else {\n const r = await selectAndSplitCoin(tx, ctx.client, ctx.sender, assetInfo.type, rawAmount);\n coin = r.coin;\n effectiveAmount = r.effectiveAmount;\n }\n\n await addRepayToTx(tx, ctx.client, ctx.sender, coin, {\n asset,\n skipOracle: ctx.sponsoredContext,\n });\n return {\n preview: {\n toolName: 'repay_debt',\n effectiveAmount: Number(effectiveAmount) / 10 ** assetInfo.decimals,\n asset,\n },\n };\n },\n\n send_transfer: async (tx, input, ctx) => {\n const recipient = validateAddress(input.to);\n const asset: SupportedAsset = input.asset ?? 'USDC';\n const assetInfo = SUPPORTED_ASSETS[asset];\n if (!assetInfo) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Asset ${asset} is not supported`);\n }\n if (input.amount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Send amount must be greater than zero');\n }\n\n const rawAmount = BigInt(Math.floor(input.amount * 10 ** assetInfo.decimals));\n\n let coin: TransactionObjectArgument;\n let effectiveRaw: bigint;\n\n if (ctx.chainedCoin) {\n coin = ctx.chainedCoin;\n effectiveRaw = rawAmount;\n } else if (asset === 'SUI') {\n const result = await selectSuiCoin(tx, ctx.client, ctx.sender, rawAmount, ctx.sponsoredContext);\n coin = result.coin;\n effectiveRaw = result.effectiveAmount;\n } else {\n const result = await selectAndSplitCoin(tx, ctx.client, ctx.sender, assetInfo.type, rawAmount);\n coin = result.coin;\n effectiveRaw = result.effectiveAmount;\n }\n\n addSendToTx(tx, coin, recipient);\n return {\n preview: {\n toolName: 'send_transfer',\n effectiveAmount: Number(effectiveRaw) / 10 ** assetInfo.decimals,\n recipient,\n asset,\n },\n };\n },\n\n swap_execute: async (tx, input, ctx) => {\n const fromType = resolveTokenType(input.from);\n const toType = resolveTokenType(input.to);\n if (!fromType || !toType) {\n throw new T2000Error(\n 'ASSET_NOT_SUPPORTED',\n `Unknown token in swap: from=${input.from}, to=${input.to}`,\n );\n }\n\n const providers = input.providers\n ?? (ctx.sponsoredContext ? await getSponsoredSwapProviders() : undefined);\n\n const result = await addSwapToTx(tx, ctx.client, ctx.sender, {\n from: input.from,\n to: input.to,\n amount: input.amount,\n slippage: input.slippage,\n byAmountIn: input.byAmountIn,\n overlayFee: ctx.overlayFee,\n providers,\n inputCoin: ctx.chainedCoin,\n });\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([result.coin], ctx.sender);\n }\n return {\n preview: {\n toolName: 'swap_execute',\n effectiveAmountIn: result.effectiveAmountIn,\n expectedAmountOut: result.expectedAmountOut,\n route: result.route,\n },\n outputCoin: result.coin,\n };\n },\n\n claim_rewards: async (tx, _input, ctx) => {\n const rewards = await addClaimRewardsToTx(tx, ctx.client, ctx.sender);\n return { preview: { toolName: 'claim_rewards', rewards } };\n },\n\n // [Track B / 2026-05-08] Macro appender — assembles claim → swap(s) →\n // save inline. The audric host wires `getSponsoredSwapProviders()` into\n // `options.providers` automatically when `ctx.sponsoredContext === true`\n // (parity with `swap_execute` below). Slippage + dust-floor pulled from\n // the input; price cache is forwarded from the host so the dust filter\n // can compare claimed amounts to USD.\n harvest_rewards: async (tx, input, ctx) => {\n const providers = ctx.sponsoredContext ? await getSponsoredSwapProviders() : undefined;\n // [v1.24.2 fee wiring] Forward host fee config into the harvest macro\n // so each internal swap leg charges the overlay AND the deposit leg\n // skims the save fee. Without this, harvest_rewards bypassed both\n // mechanisms (live-prod regression observed 2026-05-08 — see S.120).\n // The save_deposit hook is reused as-is; the harvest macro calls it\n // with `input.asset === 'USDC'` and the merged USDC deposit coin,\n // matching what the audric host's hook already expects.\n const plan = await addHarvestToTx(tx, ctx.client, ctx.sender, {\n slippage: input.slippage,\n minRewardUsd: input.minRewardUsd,\n providers,\n overlayFee: ctx.overlayFee,\n saveFeeHook: ctx.feeHooks?.save_deposit,\n });\n return {\n preview: {\n toolName: 'harvest_rewards',\n claimed: plan.claimed,\n swaps: plan.swaps,\n skipped: plan.skipped,\n expectedUsdcDeposited: plan.expectedUsdcDeposited,\n },\n };\n },\n\n volo_stake: async (tx, input, ctx) => {\n if (input.amountSui <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Stake amount must be greater than zero');\n }\n const amountMist = BigInt(Math.floor(input.amountSui * 1e9));\n const result = await addStakeVSuiToTx(tx, ctx.client, ctx.sender, {\n amountMist,\n inputCoin: ctx.chainedCoin,\n });\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([result.coin], ctx.sender);\n }\n return {\n preview: { toolName: 'volo_stake', effectiveAmountMist: result.effectiveAmountMist },\n outputCoin: result.coin,\n };\n },\n\n volo_unstake: async (tx, input, ctx) => {\n const amountMist =\n input.amountVSui === 'all' ? 'all' : BigInt(Math.floor(input.amountVSui * 1e9));\n if (amountMist !== 'all' && amountMist <= 0n) {\n throw new T2000Error('INVALID_AMOUNT', 'Unstake amount must be greater than zero');\n }\n const result = await addUnstakeVSuiToTx(tx, ctx.client, ctx.sender, {\n amountMist,\n inputCoin: ctx.chainedCoin,\n });\n if (!ctx.isOutputConsumed) {\n tx.transferObjects([result.coin], ctx.sender);\n }\n return {\n preview: { toolName: 'volo_unstake', effectiveAmountMist: result.effectiveAmountMist },\n outputCoin: result.coin,\n };\n },\n};\n\n// Reference unused import to suppress noUnusedLocals; SUI_TYPE is used\n// by selectSuiCoin internally and re-export from index.ts.\nvoid SUI_TYPE;\nvoid getDecimalsForCoinType;\n\n/**\n * Walks the assembled PTB's command list and extracts every recipient\n * address from top-level `TransferObjects` commands. Top-level only —\n * recipients inside nested Move calls are NOT inspected (Enoki only\n * cross-checks top-level commands).\n *\n * Replaces hand-maintained `allowedAddresses` arrays. Two production\n * bugs in 60 days came from drift between the array and the actual\n * PTB recipients (PR-H1 + PR-H4). Computing this from the PTB makes\n * drift impossible by construction.\n */\nexport function deriveAllowedAddressesFromPtb(tx: Transaction): string[] {\n const addresses = new Set<string>();\n const data = tx.getData();\n\n for (const cmd of data.commands) {\n // The Sui transaction-builder stores each top-level command as a\n // tagged object: { TransferObjects: { objects, address } }.\n // Inspect the `TransferObjects.address` field — it's a typed input\n // reference that resolves to a literal `Pure` input holding the\n // recipient bytes.\n const transferCmd = (cmd as { TransferObjects?: unknown }).TransferObjects;\n if (!transferCmd) continue;\n\n const addressArg = (transferCmd as { address?: unknown }).address;\n if (!addressArg) continue;\n\n const addressInputIndex = (addressArg as { Input?: number }).Input;\n if (addressInputIndex === undefined) continue;\n\n const input = data.inputs[addressInputIndex];\n if (!input) continue;\n\n const pureBytes = (input as { Pure?: { bytes?: string } }).Pure?.bytes;\n if (!pureBytes) continue;\n\n // Pure bytes are base64-encoded BCS for Sui addresses (32 bytes →\n // 44-char base64). Decode + format as 0x-prefixed hex.\n try {\n const bytes = base64ToBytes(pureBytes);\n if (bytes.length !== 32) continue; // not an address\n const hex = '0x' + Array.from(bytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n addresses.add(hex);\n } catch {\n // not a parseable address — skip\n }\n }\n\n return Array.from(addresses);\n}\n\nfunction base64ToBytes(b64: string): Uint8Array {\n if (typeof Buffer !== 'undefined') {\n return Uint8Array.from(Buffer.from(b64, 'base64'));\n }\n // Browser fallback (in case this ever runs in a worker)\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/**\n * Compose a PTB from a list of canonical write steps. Each step\n * dispatches to its registered fragment-appender; the assembled PTB is\n * returned alongside pre-built `txKindBytes` ready for Enoki sponsorship\n * + auto-derived `derivedAllowedAddresses`.\n *\n * Single-step: `composeTx({ steps: [{ toolName: 'send_transfer', input: {...} }], ... })`\n * Multi-step (Layer 2): `composeTx({ steps: [{...}, {...}, {...}], ... })`\n *\n * Throws:\n * - `T2000Error('NO_APPENDER')` — unknown `toolName`\n * - Any error thrown by the per-step appender (insufficient balance,\n * asset not supported, route not found, etc.) — propagates as-is.\n */\nexport async function composeTx(opts: ComposeTxOptions): Promise<ComposeTxResult> {\n const tx = new Transaction();\n tx.setSender(opts.sender);\n\n const baseCtx = {\n client: opts.client,\n sender: opts.sender,\n sponsoredContext: opts.sponsoredContext ?? false,\n overlayFee: opts.overlayFee,\n feeHooks: opts.feeHooks,\n };\n\n // [SPEC 13 Phase 1] First pass: validate every `inputCoinFromStep`\n // reference and build the `consumedSteps` set. Forward-only\n // references; producer-only tools can't be consumers.\n const consumedSteps = new Set<number>();\n for (let i = 0; i < opts.steps.length; i++) {\n const step = opts.steps[i];\n const stepWithChain = step as { inputCoinFromStep?: number };\n const idx = stepWithChain.inputCoinFromStep;\n if (idx === undefined) continue;\n\n if (!Number.isInteger(idx) || idx < 0 || idx >= i) {\n throw new T2000Error(\n 'CHAIN_MODE_INVALID',\n `Step ${i} (${step.toolName}) has inputCoinFromStep=${idx}, ` +\n `which must be a non-negative integer < ${i} (forward-only references).`,\n );\n }\n\n const producer = opts.steps[idx];\n if (\n producer.toolName === 'save_deposit' ||\n producer.toolName === 'repay_debt' ||\n producer.toolName === 'send_transfer' ||\n producer.toolName === 'claim_rewards'\n ) {\n throw new T2000Error(\n 'CHAIN_MODE_INVALID',\n `Step ${i} (${step.toolName}) references step ${idx} (${producer.toolName}) as ` +\n `producer, but '${producer.toolName}' is a terminal consumer that does not ` +\n `produce a chainable coin handle. Allowed producers: withdraw, borrow, ` +\n `swap_execute, volo_stake, volo_unstake.`,\n );\n }\n\n consumedSteps.add(idx);\n }\n\n // [SPEC 13 Phase 1] Second pass: dispatch each step in order,\n // capturing producers' output handles in `priorOutputs` and threading\n // them into consumers' `chainedCoin`.\n const priorOutputs: (TransactionObjectArgument | null)[] = [];\n const previews: StepPreview[] = [];\n for (let i = 0; i < opts.steps.length; i++) {\n const step = opts.steps[i];\n const appender = (WRITE_APPENDER_REGISTRY as Record<string, AppenderFn<unknown, StepPreview>>)[step.toolName];\n if (!appender) {\n throw new T2000Error(\n 'UNKNOWN',\n `No fragment appender registered for tool '${step.toolName}'. ` +\n `Allowed: ${(Object.keys(WRITE_APPENDER_REGISTRY) as WriteToolName[]).join(', ')}`,\n );\n }\n\n const stepWithChain = step as { inputCoinFromStep?: number };\n let chainedCoin: TransactionObjectArgument | undefined;\n if (stepWithChain.inputCoinFromStep !== undefined) {\n const upstream = priorOutputs[stepWithChain.inputCoinFromStep];\n if (!upstream) {\n // Producer didn't return an outputCoin (shouldn't happen given the\n // first-pass guard, but defends against future appender bugs).\n throw new T2000Error(\n 'CHAIN_MODE_INVALID',\n `Step ${i} (${step.toolName}) expected a coin handle from step ` +\n `${stepWithChain.inputCoinFromStep}, but the producer did not return one.`,\n );\n }\n chainedCoin = upstream;\n }\n\n const stepCtx: AppenderContext = {\n ...baseCtx,\n chainedCoin,\n isOutputConsumed: consumedSteps.has(i),\n };\n\n const result = await appender(tx, step.input, stepCtx);\n priorOutputs.push(result.outputCoin ?? null);\n previews.push(result.preview);\n }\n\n const txKindBytes = await tx.build({ client: opts.client, onlyTransactionKind: true });\n const derivedAllowedAddresses = deriveAllowedAddressesFromPtb(tx);\n\n return {\n tx,\n txKindBytes,\n derivedAllowedAddresses,\n perStepPreviews: previews,\n };\n}\n","/**\n * Protocol fee primitives — wallet-direct transfer model.\n *\n * Fees are collected by splitting from the payment coin and transferring directly\n * to the treasury wallet inside the same PTB. Atomic with the operation (PTB\n * semantics); the wallet IS the ledger; the server-side indexer reads\n * `balanceChanges` and writes a `ProtocolFeeLedger` row tagged with the operation\n * classified from the tx's moveCall targets.\n *\n * The SDK / CLI never call this helper — they're fee-free by design (t2000 = infra\n * brand, no opinion on fees). Audric's `prepare/route.ts` is the canonical caller.\n */\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport {\n SAVE_FEE_BPS,\n BORROW_FEE_BPS,\n BPS_DENOMINATOR,\n USDC_DECIMALS,\n} from '../constants.js';\nimport { stableToRaw } from '../utils/format.js';\n\nexport type FeeOperation = 'save' | 'borrow' | 'swap';\n\nexport interface ProtocolFeeInfo {\n amount: number;\n asset: string;\n rate: number;\n rawAmount: bigint;\n}\n\nconst FEE_RATES: Record<FeeOperation, bigint> = {\n save: SAVE_FEE_BPS,\n borrow: BORROW_FEE_BPS,\n // Swap uses Cetus's overlay-fee mechanism (taken from output by the aggregator\n // and transferred to `overlayFee.receiver`). We list the rate here for display\n // / quote calculations only — `addFeeTransfer` is NOT called for swaps.\n swap: 10n, // 0.1%\n};\n\n/**\n * Compute the fee amount for a given operation against a USD-denominated input.\n * Used pre-tx for receipt display + quote math. Does not modify any tx.\n */\nexport function calculateFee(operation: FeeOperation, amount: number): ProtocolFeeInfo {\n const bps = FEE_RATES[operation];\n const feeAmount = amount * Number(bps) / Number(BPS_DENOMINATOR);\n const rawAmount = stableToRaw(feeAmount, USDC_DECIMALS);\n\n return {\n amount: feeAmount,\n asset: 'USDC',\n rate: Number(bps) / Number(BPS_DENOMINATOR),\n rawAmount,\n };\n}\n\n/**\n * Split a fee from `paymentCoin` and transfer it to `receiver` inside the given PTB.\n *\n * **Order is load-bearing.** Call this BEFORE the protocol operation that consumes\n * `paymentCoin` (e.g. NAVI deposit). `splitCoins` mutates the source coin in place,\n * leaving the remainder for the protocol step. If you split AFTER the deposit,\n * the deposit will have consumed the coin and the split will fail.\n *\n * Atomicity: `splitCoins` + `transferObjects` are PTB ops; if anything later in\n * the PTB reverts, the fee transfer reverts too.\n *\n * @param tx Active PTB\n * @param paymentCoin Coin to split the fee from (mutated in place)\n * @param feeBps Fee rate in basis points (e.g. `SAVE_FEE_BPS = 10n` = 0.1%)\n * @param receiver Treasury wallet address (typically `T2000_OVERLAY_FEE_WALLET`)\n * @param amount Display-units input amount (matches what was passed to the\n * protocol operation; used to compute the raw fee amount)\n * @param decimals Coin decimals for raw conversion. Defaults to USDC_DECIMALS\n * (6). Pass the actual coin decimals when skimming a fee\n * from a non-USDC coin (e.g. USDsui = 6, GOLD = 6, ETH = 8,\n * SUI = 9). Backward-compatible: existing USDC callers can\n * omit. Wrong decimals → wrong raw amount → either fee\n * too small (silent loss) or too large (PTB revert from\n * insufficient coin balance).\n */\nexport function addFeeTransfer(\n tx: Transaction,\n paymentCoin: TransactionObjectArgument,\n feeBps: bigint,\n receiver: string,\n amount: number,\n decimals: number = USDC_DECIMALS,\n): void {\n if (feeBps <= 0n) return;\n if (amount <= 0) return;\n\n const feeAmount = amount * Number(feeBps) / Number(BPS_DENOMINATOR);\n const rawFee = stableToRaw(feeAmount, decimals);\n if (rawFee <= 0n) return;\n\n const [feeCoin] = tx.splitCoins(paymentCoin, [tx.pure.u64(rawFee)]);\n tx.transferObjects([feeCoin], tx.pure.address(receiver));\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { SUPPORTED_ASSETS, MIST_PER_SUI, CETUS_USDC_SUI_POOL } from '../constants.js';\nimport type { FinancialSummary, HFAlertLevel, HealthFactorResult } from '../types.js';\nimport { getHealthFactor, getRates } from './navi.js';\n\nconst HF_WARN_THRESHOLD = 1.8;\nconst HF_CRITICAL_THRESHOLD = 1.3;\n\nconst HF_FALLBACK: HealthFactorResult = {\n healthFactor: Infinity,\n supplied: 0,\n borrowed: 0,\n maxBorrow: 0,\n liquidationThreshold: 0.75,\n};\n\nfunction classifyHF(hf: number, hasBorrow: boolean): HFAlertLevel {\n if (!hasBorrow || !Number.isFinite(hf)) return 'none';\n if (hf <= HF_CRITICAL_THRESHOLD) return 'critical';\n if (hf <= HF_WARN_THRESHOLD) return 'warn';\n return 'none';\n}\n\nasync function fetchSuiPriceUsd(client: SuiJsonRpcClient): Promise<number> {\n try {\n const pool = await client.getObject({\n id: CETUS_USDC_SUI_POOL,\n options: { showContent: true },\n });\n if (pool.data?.content?.dataType === 'moveObject') {\n const fields = pool.data.content.fields as Record<string, unknown>;\n const sqrtPrice = BigInt(String(fields.current_sqrt_price ?? '0'));\n if (sqrtPrice > 0n) {\n const Q64 = 2n ** 64n;\n const sqrtFloat = Number(sqrtPrice) / Number(Q64);\n const price = 1000 / (sqrtFloat * sqrtFloat);\n if (price > 0.01 && price < 1000) return price;\n }\n }\n } catch { /* fallback */ }\n return 1.0;\n}\n\n// Reserved for future per-call options. Keeping the shape stable avoids a\n// breaking-change for callers that pass `{}` defensively. Using a type alias\n// (not `interface {}`) so eslint's no-empty-object-type rule is happy.\nexport type FinancialSummaryOptions = Record<string, never>;\n\n/**\n * Fetch a complete financial snapshot for one wallet in parallel.\n * Designed for the indexer HF hook + chain-memory cron.\n *\n * Every sub-call has a fallback so a single RPC failure doesn't\n * crash the entire batch. Callers can check individual zero values\n * to detect degraded data.\n */\nexport async function getFinancialSummary(\n client: SuiJsonRpcClient,\n walletAddress: string,\n _options: FinancialSummaryOptions = {},\n): Promise<FinancialSummary> {\n const [usdcBal, suiBal, hf, rates, suiPrice] = await Promise.all([\n client.getBalance({ owner: walletAddress, coinType: SUPPORTED_ASSETS.USDC.type })\n .catch(() => ({ totalBalance: '0' })),\n client.getBalance({ owner: walletAddress, coinType: SUPPORTED_ASSETS.SUI.type })\n .catch(() => ({ totalBalance: '0' })),\n getHealthFactor(client, walletAddress)\n .catch(() => HF_FALLBACK),\n getRates(client),\n fetchSuiPriceUsd(client),\n ]);\n\n const usdcAvailable = Number(usdcBal.totalBalance) / 10 ** SUPPORTED_ASSETS.USDC.decimals;\n const gasReserveSui = Number(suiBal.totalBalance) / Number(MIST_PER_SUI);\n const saveApy = rates.USDC?.saveApy ?? 0;\n const borrowApy = rates.USDC?.borrowApy ?? 0;\n const dailyYield = hf.supplied * (saveApy / 365);\n\n return {\n walletAddress,\n usdcAvailable,\n savingsBalance: hf.supplied,\n debtBalance: hf.borrowed,\n idleUsdc: Math.max(0, usdcAvailable),\n healthFactor: hf.healthFactor,\n hfAlertLevel: classifyHF(hf.healthFactor, hf.borrowed > 0),\n saveApy,\n borrowApy,\n dailyYield,\n gasReserveSui,\n gasReserveUsd: gasReserveSui * suiPrice,\n fetchedAt: Date.now(),\n };\n}\n\nexport { HF_WARN_THRESHOLD, HF_CRITICAL_THRESHOLD };\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { T2000Error } from '../errors.js';\nimport { mapMoveAbortCode } from '../errors.js';\n\nexport interface SimulationResult {\n success: boolean;\n gasEstimateSui: number;\n error?: {\n moveAbortCode?: number;\n moveModule?: string;\n reason: string;\n rawError: string;\n };\n}\n\nexport async function simulateTransaction(\n client: SuiJsonRpcClient,\n tx: Transaction,\n sender: string,\n): Promise<SimulationResult> {\n tx.setSender(sender);\n\n try {\n const txBytes = await tx.build({ client });\n const dryRun = await client.dryRunTransactionBlock({\n transactionBlock: Buffer.from(txBytes).toString('base64'),\n });\n\n const status = dryRun.effects?.status;\n const gasUsed = dryRun.effects?.gasUsed;\n\n const gasEstimateSui = gasUsed\n ? (Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)) / 1e9\n : 0;\n\n if (status?.status === 'failure') {\n const rawError = status.error ?? 'Unknown simulation error';\n const parsed = parseMoveAbort(rawError);\n\n return {\n success: false,\n gasEstimateSui,\n error: {\n moveAbortCode: parsed.abortCode,\n moveModule: parsed.module,\n reason: parsed.reason,\n rawError,\n },\n };\n }\n\n return { success: true, gasEstimateSui };\n } catch (err) {\n const rawError = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n gasEstimateSui: 0,\n error: {\n reason: 'Simulation failed: ' + rawError,\n rawError,\n },\n };\n }\n}\n\nexport function throwIfSimulationFailed(sim: SimulationResult): void {\n if (sim.success) return;\n\n throw new T2000Error(\n 'SIMULATION_FAILED',\n sim.error?.reason ?? 'Transaction simulation failed',\n {\n moveAbortCode: sim.error?.moveAbortCode,\n moveModule: sim.error?.moveModule,\n reason: sim.error?.reason,\n rawError: sim.error?.rawError,\n },\n );\n}\n\nfunction parseMoveAbort(errorStr: string): {\n abortCode?: number;\n module?: string;\n reason: string;\n} {\n // Pattern: MoveAbort(MoveLocation { module: ModuleId { ... name: \"module\" }, ... }, code)\n const abortMatch = errorStr.match(/MoveAbort\\([^,]*,\\s*(\\d+)\\)/);\n const moduleMatch = errorStr.match(/name:\\s*Identifier\\(\"([^\"]+)\"\\)/);\n\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n const module = moduleMatch?.[1];\n const reason = mapMoveAbortCode(code);\n return { abortCode: code, module, reason };\n }\n\n // Pattern: MovePrimitiveRuntimeError\n if (errorStr.includes('MovePrimitiveRuntimeError')) {\n const module = moduleMatch?.[1];\n return {\n module,\n reason: `Move runtime error in ${module ?? 'unknown'} module`,\n };\n }\n\n return { reason: errorStr };\n}\n","/**\n * Standalone swap quote — no T2000 agent instance required.\n * Only needs a wallet address for Cetus Aggregator routing.\n */\nimport { T2000Error } from './errors.js';\nimport { getDecimalsForCoinType } from './token-registry.js';\nimport type { SwapQuoteResult } from './types.js';\n\nexport async function getSwapQuote(params: {\n walletAddress: string;\n from: string;\n to: string;\n amount: number;\n byAmountIn?: boolean;\n}): Promise<SwapQuoteResult> {\n const { findSwapRoute, resolveTokenType } = await import('./protocols/cetus-swap.js');\n\n const fromType = resolveTokenType(params.from);\n const toType = resolveTokenType(params.to);\n // [S.123 v1.24.7] Use T2000Error('ASSET_NOT_SUPPORTED') consistently with the\n // other 4 throw sites in t2000.ts / cetus-swap.ts. Allows tools to branch\n // on `err.code === 'ASSET_NOT_SUPPORTED'` and return a structured recovery\n // hint to the LLM instead of re-throwing a generic error string.\n if (!fromType) {\n throw new T2000Error(\n 'ASSET_NOT_SUPPORTED',\n `Unknown token: ${params.from}. Provide the symbol (USDC, SUI, ...) or full coin type.`,\n );\n }\n if (!toType) {\n throw new T2000Error(\n 'ASSET_NOT_SUPPORTED',\n `Unknown token: ${params.to}. Provide the symbol (USDC, SUI, ...) or full coin type.`,\n );\n }\n\n const byAmountIn = params.byAmountIn ?? true;\n\n const fromDecimals = getDecimalsForCoinType(fromType);\n const rawAmount = BigInt(Math.floor(params.amount * 10 ** fromDecimals));\n\n const route = await findSwapRoute({\n walletAddress: params.walletAddress,\n from: fromType,\n to: toType,\n amount: rawAmount,\n byAmountIn,\n });\n\n if (!route) throw new T2000Error('SWAP_FAILED', `No swap route found for ${params.from} -> ${params.to}.`);\n if (route.insufficientLiquidity) {\n throw new T2000Error('SWAP_FAILED', `Insufficient liquidity for ${params.from} -> ${params.to}.`);\n }\n\n const toDecimals = getDecimalsForCoinType(toType);\n const fromAmount = Number(route.amountIn) / 10 ** fromDecimals;\n const toAmount = Number(route.amountOut) / 10 ** toDecimals;\n\n const routeDesc = route.routerData.paths\n ?.map((p: { provider?: string }) => p.provider)\n .filter(Boolean)\n .slice(0, 3)\n .join(' + ') ?? 'Cetus Aggregator';\n\n return {\n fromToken: params.from,\n toToken: params.to,\n fromAmount,\n toAmount,\n priceImpact: route.priceImpact,\n route: routeDesc,\n };\n}\n","/**\n * SuiNS leaf-subname builders for the `audric.sui` parent NFT.\n *\n * Used by SPEC 10 v0.2.1 Phase A.1 — Audric Passport Identity. Lets the audric host\n * mint and revoke `username.audric.sui` leaves under the parent NFT held by the\n * dedicated custody address (`0xaca29165…23d11`).\n *\n * **Why a dedicated SDK module (not inline in the audric route):**\n * - Consumers (audric/web's `/api/identity/{reserve,change,release}` routes) can import\n * the canonical builder shape without re-discovering the `SuinsTransaction` API.\n * - Single source of truth for the parent NFT ID + parent name.\n * - Single source of truth for label validation (length / charset / hyphen rules).\n *\n * **Signer model — read this before wiring into a route:**\n * These builders are signed by the **service account** (the parent NFT custody address),\n * NOT by the user's zkLogin key. Per `audric/.cursor/rules/audric-canonical-write.mdc`,\n * the SPEC 10 leaf-mint API routes are explicitly documented as a CANONICAL-BYPASS of\n * the `composeTx` write contract — they are server-to-server, the user's key is never\n * in the loop, and Enoki sponsors the gas. PTB atomicity requires single-signer, so\n * leaf mints cannot be bundled with chat-agent writes via composeTx.\n *\n * **Reference:** `spec/runbooks/RUNBOOK_audric_sui_parent.md` §1 (parent NFT ID) +\n * §3 (validated SDK reference shape) + §4 (mainnet smoke test 2026-05-01).\n */\n\nimport { Transaction } from '@mysten/sui/transactions';\nimport { isValidSuiAddress, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { SuinsTransaction, type SuinsClient } from '@mysten/suins';\n\n/**\n * Parent name registered on SuiNS mainnet. Audric's identity namespace anchor.\n *\n * Every leaf created via `buildAddLeafTx` becomes `<label>.audric.sui` and resolves\n * via the standard SuiNS resolver (`suix_resolveNameServiceAddress`).\n */\nexport const AUDRIC_PARENT_NAME = 'audric.sui';\n\n/**\n * On-chain object ID of the `audric.sui` parent NFT (a `SuinsRegistration`).\n *\n * Owned by the dedicated custody address `0xaca29165188f10136073788f648e1186dd25100100146186ebecedaf94b23d11`\n * (per `RUNBOOK_audric_sui_parent.md` §1). Every leaf mint / revoke MUST be signed\n * by the address that owns this NFT. Mainnet only.\n */\nexport const AUDRIC_PARENT_NFT_ID =\n '0x070456e283ec988b6302bdd6cc5172bbdcb709998cf116586fb98d19b0870198';\n\nexport interface BuildAddLeafParams {\n /** Bare label, e.g. `'alice'` — NOT the full `'alice.audric.sui'` path. */\n label: string;\n /** Sui address the leaf will resolve to (typically the user's zkLogin wallet). */\n targetAddress: string;\n}\n\nexport interface BuildRevokeLeafParams {\n /** Bare label of the leaf to revoke. */\n label: string;\n}\n\nexport type LabelValidationResult = { valid: true } | { valid: false; reason: string };\n\n/**\n * SuiNS labels accept lowercase ASCII letters, digits, and hyphens. Hyphens cannot\n * lead or trail. The 3–63 char window matches SuiNS protocol rules and the SuiNS\n * dashboard's own `Register` form.\n *\n * The regex permits a single character only when it is alphanumeric (rejected by\n * the length check below for being < 3, but the pattern itself stays internally\n * consistent with DNS conventions).\n *\n * SUINS-LABEL-RULE — paired with `audric/apps/web/lib/identity/validate-label.ts`.\n * The audric host duplicates these rules inline to avoid pulling the SDK's\n * transitive deps (e.g. `@pythnetwork/pyth-sui-js` → `node:buffer`) into the\n * client bundle when the picker uses validation. If SuiNS ever changes its\n * label rules, BOTH this file and the audric copy need updating.\n */\nconst LABEL_PATTERN = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;\n\n/**\n * Validate a leaf label against SuiNS protocol rules. Pure function; no I/O.\n *\n * Pre-call this before `buildAddLeafTx` / `buildRevokeLeafTx` if you want a\n * structured error (the builder functions throw on invalid labels). The audric\n * `/api/identity/check` endpoint uses this to drive the picker's real-time\n * availability indicator.\n *\n * Reserved-name policy (specific Audric handles like `support`, `admin`,\n * `official`) is NOT enforced here — that's a UI / route-level concern owned\n * by the audric host, not a protocol-level rule. See SPEC 10 D3.\n */\nexport function validateLabel(label: unknown): LabelValidationResult {\n if (typeof label !== 'string') {\n return { valid: false, reason: 'label must be a string' };\n }\n if (label.length < 3) {\n return { valid: false, reason: 'label must be at least 3 characters' };\n }\n if (label.length > 63) {\n return { valid: false, reason: 'label must be at most 63 characters' };\n }\n if (!LABEL_PATTERN.test(label)) {\n return {\n valid: false,\n reason:\n 'label may only contain lowercase letters, digits, and hyphens, and may not start or end with a hyphen',\n };\n }\n if (label.includes('--')) {\n return { valid: false, reason: 'label may not contain consecutive hyphens' };\n }\n return { valid: true };\n}\n\n/**\n * Build an unsigned PTB that creates a `<label>.audric.sui` leaf subname pointing\n * to `targetAddress`.\n *\n * The returned `Transaction` has neither sender nor gas configured — the caller\n * (audric's `/api/identity/reserve` route) sets the sender to the parent NFT\n * custody address and submits via Enoki sponsorship. See `audric-transaction-flow.mdc`\n * for the sponsored-tx wrapper pattern; note SPEC 10 leaf-mint is a documented\n * CANONICAL-BYPASS of `composeTx` because the signer is the service account, not\n * the user's zkLogin key.\n *\n * Throws synchronously if `label` violates protocol rules or `targetAddress` is\n * not a valid Sui address — fail-closed before bytes are built.\n */\nexport function buildAddLeafTx(\n suinsClient: SuinsClient,\n { label, targetAddress }: BuildAddLeafParams,\n): Transaction {\n const labelCheck = validateLabel(label);\n if (!labelCheck.valid) {\n throw new Error(`buildAddLeafTx: invalid label \"${label}\" — ${labelCheck.reason}`);\n }\n if (typeof targetAddress !== 'string' || !isValidSuiAddress(normalizeSuiAddress(targetAddress))) {\n throw new Error(`buildAddLeafTx: invalid targetAddress \"${targetAddress}\"`);\n }\n\n const tx = new Transaction();\n const suinsTx = new SuinsTransaction(suinsClient, tx);\n suinsTx.createLeafSubName({\n parentNft: AUDRIC_PARENT_NFT_ID,\n name: `${label}.${AUDRIC_PARENT_NAME}`,\n targetAddress: normalizeSuiAddress(targetAddress),\n });\n return tx;\n}\n\n/**\n * Build an unsigned PTB that revokes a `<label>.audric.sui` leaf subname.\n *\n * Used by:\n * 1. The change-username flow (`/api/identity/change`): revoke old leaf inside\n * the same PTB as the new leaf creation, atomically.\n * 2. The release-username flow (`/api/admin/identity/release`): admin recovery\n * of squatted / impersonating handles.\n * 3. Account-deletion flow (future): revoke leaf when user deletes their account.\n *\n * The mainnet smoke test (2026-05-01) confirmed revocation gas cost is roughly\n * negative net (storage rebate exceeds computation) — see RUNBOOK §4.\n */\nexport function buildRevokeLeafTx(\n suinsClient: SuinsClient,\n { label }: BuildRevokeLeafParams,\n): Transaction {\n const labelCheck = validateLabel(label);\n if (!labelCheck.valid) {\n throw new Error(`buildRevokeLeafTx: invalid label \"${label}\" — ${labelCheck.reason}`);\n }\n\n const tx = new Transaction();\n const suinsTx = new SuinsTransaction(suinsClient, tx);\n suinsTx.removeLeafSubName({\n parentNft: AUDRIC_PARENT_NFT_ID,\n name: `${label}.${AUDRIC_PARENT_NAME}`,\n });\n return tx;\n}\n\n/**\n * Convenience: turn a bare label into the full `<label>.audric.sui` path.\n *\n * **Use this for ON-CHAIN operations** — SuiNS leaf NFT `name` field, the\n * `createLeafSubName` / `removeLeafSubName` move calls, and any RPC call\n * that returns/expects the canonical name string. The `<label>.audric.sui`\n * form is what the SuiNS protocol writes into the NFT `name` field.\n *\n * **Do NOT use this for UI rendering** — that's `displayHandle()`'s job\n * (S.118 reversal of SPEC 10 D10, see audric-build-tracker). Pre-S.118\n * we surfaced the full `.sui` form everywhere; we now use the SuiNS V2\n * `@` form (`alice@audric`) for display because it's shorter, fits the\n * agent harness mono aesthetic, and matches SuiNS's own V2 standard.\n *\n * Both forms resolve to the same address via SuiNS RPC (verified\n * mainnet 2026-05-08 PF1) — `displayHandle()` is purely a render-layer\n * choice, not a backend storage change.\n */\nexport function fullHandle(label: string): string {\n return `${label}.${AUDRIC_PARENT_NAME}`;\n}\n\n/**\n * SuiNS V2 short-form display alias. `displayHandle('alice')` →\n * `'alice@audric'`. Use for chat narration, permission cards, receipts,\n * profile pages, share-to-X copy, OG metadata, and lookup_user output.\n *\n * **Why a separate function from `fullHandle`:**\n * - `fullHandle('alice')` → `'alice.audric.sui'` is the **on-chain**\n * NFT name field; SuiNS's `createLeafSubName` writes exactly this\n * string and `suix_resolveNameServiceAddress` accepts it.\n * - `displayHandle('alice')` → `'alice@audric'` is the **UI** form\n * that users see and share. SuiNS RPC also accepts this form\n * (verified mainnet 2026-05-08 PF1 — both forms return the same\n * address), so we have one storage form (`<label>.audric.sui`) and\n * two interchangeable input forms (the user can paste either).\n *\n * Reverses SPEC 10 D10 (\"full handle ALWAYS\"). See audric-build-tracker\n * S.118 for the rationale; see also `audric/apps/web/lib/identity/`\n * for canonicalization in the input parser (which is a no-op since\n * SuiNS RPC accepts both — kept available for future-proofing).\n */\nexport function displayHandle(label: string): string {\n // Strip trailing `.sui` from the parent for the display form.\n // Today AUDRIC_PARENT_NAME is `'audric.sui'` → `'audric'`. If the\n // parent ever changes (e.g. `audric.app.sui` becomes the parent),\n // this still produces a sensible display form by removing only the\n // top-level TLD.\n const parentDisplay = AUDRIC_PARENT_NAME.replace(/\\.sui$/, '');\n return `${label}@${parentDisplay}`;\n}\n"],"mappings":"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,IAAK;AAClC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC,aAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAK;AAClC,aAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAK;AAClC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC,aAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAK;AAClC,aAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAK;AAClC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC,aAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAK;AAClC,aAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAK;AAClC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC,aAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAK;AAClC,aAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAK;AAClC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC,aAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAK;AAClC,aAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAK;AAClC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC,aAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAK;AAClC,aAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAK;AAClC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC,aAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAK;AAClC,aAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAK;AAClC,cAAO,MAAM,KAAK,KAAK,KAAK,GAAG,IAAK;AACpC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","names":["EventEmitter","ee","map","typ","val","key","module","exports","Buffer","w","b","mod","clone","allocate","add","self","k","comb10MulTo","b2","x","N","_","q","A","B","g","isOdd","split","prime","z","_PriceFeed","isFunction","prototype","b","hasOwnProperty","utils","PlatformFormData","option","AxiosError","encode","toString","url","alphabet","crypto","FormData","platform","isFormData","isFileList","w","self","defaults","AxiosHeaders","resolve","stream","util","readBlob","Readable","inRange","zlib","followRedirects","http2","proxyFromEnv","httpAdapter","callbackify","EventEmitter","CanceledError","data","formDataToStream","AxiosTransformStream","https","http","ZlibHeaderTransformStream","origin","merge","signal","iterator","done","ReadableStream","TextEncoder","composeSignals","fetch","map","fetchAdapter.getFetch","adapters","validators","validator","InterceptorManager","transitional","chain","Axios","CancelToken","HttpStatusCode","e","r","n","t","r","n","o","i","c","u","f","d","t","p","e","_regenerator","r","t","e","n","e","o","r","e","t","n","o","a","_regeneratorRuntime","require_regenerator","n","namespace","isNetworkError","error","CODE_EXCLUDE_LIST","response","Boolean","code","includes","SAFE_HTTP_METHODS","IDEMPOTENT_HTTP_METHODS","concat","isRetryableError","status","isSafeRequestError","config","indexOf","method","isIdempotentRequestError","isNetworkOrIdempotentRequestError","noDelay","exponentialDelay","retryNumber","delayFactor","delay","Math","pow","randomSum","random","DEFAULT_OPTIONS","retries","retryCondition","retryDelay","shouldResetTimeout","onRetry","getRequestOptions","defaultOptions","getCurrentState","currentState","retryCount","fixConfig","axios","defaults","agent","httpAgent","httpsAgent","shouldRetry","shouldRetryOrPromise","shouldRetryPromiseResult","axiosRetry","requestInterceptorId","interceptors","request","use","lastRequestTime","Date","now","responseInterceptorId","Promise","reject","timeout","lastRequestDuration","transformRequest","data","resolve","setTimeout","data","_","k","EventEmitter","randomBytes","URL","key","err","protocol","EventEmitter","map","mod","resolve","mod","SuiPriceServiceConnection","SuiPythClient","require_lib","bcs","b","bcs","k","map","_0n","_1n","b","x","_0n","b","_1n","q","P","Q","M","R","map","_1n","_0n","_1n","b","_0n","_1n","window","P","_0n","_1n","window","_0n","_0n","_1n","_2n","_8n","x","x2","uvRatio","X","Y","T","X2","Y2","A","B","E","H","p","BASE","randomBytes","adjustScalarBytes","R","k","A","_1n","_1n","_2n","_5n","_8n","x","P","x2","_2n","_1n","bip39MnemonicToSeedSync","Ed25519Keypair","val","$moduleName","$moduleName","$moduleName","Entry","VecMap","$moduleName","type_name.TypeName","vec_map.VecMap","$moduleName","TypeName","$moduleName","domain_1.Domain","vec_map.VecMap","type_name.TypeName","$moduleName","domain.Domain","$moduleName","$moduleName","bag.Bag","$moduleName","data.Data","$moduleName","$moduleName","$moduleName","$moduleName","pricing_config.Range","linked_table.LinkedTable","payment.initRegistration","payment.initRenewal","paymentsModule.calculatePrice","paymentsModule.handleBasePayment","paymentsModule.handlePayment","payment.register","payment.renew","paymentsModule.calculatePriceAfterDiscount","couponHouse.applyCoupon","freeClaims.freeClaim","discounts.applyPercentageDiscount","controller.setReverseLookup","x","controller.burnExpiredSubname","controller.burnExpired","map","__commonJS","exports","Symbol","Transaction","allowSwapAll","requested","swapAll","effectiveAmount","coin","SUI_TYPE","T2000Error","selectAndSplitCoin","mod","randomBytes","b","isBytes","anumber","x","fromBase64","toBase64","fromHex","toHex","vector","BcsType","options","#bytes","BcsStruct","BcsEnum","name","k","BcsTuple","bcs","P","BigNumber","alphabet","compare","q","ne","xe","ye","format","z","Address","val","IncentivePoolInfo","UserStateInfo","sdkVersion","packageJson","getNodeInfo","os","__require","nodeVersion","osType","osArch","getUserAgent","environmentInfo","userAgent","suiClient","SuiClient","getFullnodeUrl","argsKey","args","serializergs","option","index","isLast","client","disableCache","cacheTime","rest","withSingleton","fn","promiseMap","key","withCache","cache","cacheData","result","parseTxValue","value","parseTxPoolValue","tx","parseDevInspectResult","data","parseTypes","item","normalizeCoinType","coinType","normalizeStructTag","processContractHealthFactor","hf","healthFactor","SuiPriceServiceConnection","Rate_Decimals","rayMathMulIndex","amount","ray","halfRay","requestHeaders","getPoolsMap","pools","acc","pool","poolToEModePool","emodeIdentity","emode","emodeAsset","asset","parsePoolUID","uid","marketKey","poolId","uuid","getPools","markets","MARKETS","identity","getMarketConfig","url","market","res","emodes","poolSupplyAmount","poolBorrowAmount","poolSupplyValue","poolBorrowValue","poolSupplyCapAmount","poolBorrowCapAmount","poolSupplyCapValue","poolBorrowCapValue","getPool","identifier","parsedUID","DEFAULT_MARKET_IDENTITY","DEFAULT_CACHE_TIME","p","depositCoinPTB","coinObject","config","getConfig","isGasCoin","depositAmount","withdrawCoinPTB","withdrawAmount","withdrawBalance","ret","borrowCoinPTB","borrowAmount","borrowBalance","repayCoinPTB","repayAmount","marketIdentity","marketConfig","getUserEModeCaps","address","values","marketIds","emodeIds","accountCaps","marketId","getSimulatedHealthFactorPTB","estimatedSupply","estimatedBorrow","isIncrease","getHealthFactorPTB","getLendingStateBatch","tasks","poolsMap","task","stateList","states","state","supplyBalance","getHealthFactor","getLendingPositions","positions","emodeCaps","e","cap","emodeCap","lendingState","supplyAmount","emodePool","suiPythConnection","getOnChainPriceInfo","pythInfos","priceInfos","priceInfoObjectIds","priceInfoObjects","obj","pythInfo","v","objectFields","magnitude","negative","conf","timestamp","err","getPythStalePriceFeedIdV2","returnData","latestPriceFeeds","currentTimestamp","priceFeed","maxTime","error","updatePythPriceFeeds","priceFeedIds","priceUpdateData","SuiPythClient","updateOraclePricesPTB","priceFeeds","feed","stalePriceFeedIds","getPriceFeeds","filterPriceFeeds","feeds","filters","position","updateOraclePriceBeforeUserOperationPTB","allPriceFeeds","lendingPositions","relevantFeeds","getLendingRewardsBatch","rewardsList","rewardsData","count","i","getUserAvailableLendingRewards","claimLendingRewardsPTB","rewards","rewardMap","reward","rewardCoinType","ruleIds","owner","emodeId","ruleId","group","rewardCoins","assetIds","isEMode","matchedRewardFund","rewardBalance","rewardCoin","SuiJsonRpcClient","getJsonRpcFullnodeUrl","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","EventEmitter","buildStakeVSuiTx","getVoloStats","buildUnstakeVSuiTx","VSUI_TYPE","findSwapRoute","buildSwapTx","resolveTokenType","USDC_TYPE","adapters","ct","isValidSuiAddress","normalizeSuiAddress"]}