{"version":3,"sources":["../node_modules/bn.js/lib/bn.js","../src/apps/alphafi/helper.ts","../src/apps/alphafi/decoder.ts","../src/apps/alphafi/intentions/claim-reward.ts","../src/apps/interface/sui.ts","../src/apps/alphafi/intentions/deposit-double-asset.ts","../src/apps/alphafi/intentions/deposit-single-asset.ts","../src/apps/alphafi/intentions/withdraw.ts","../src/apps/alphafi/intentions/withdraw-alpha.ts","../src/apps/bucket/helper.ts","../src/apps/bucket/decoder.ts","../src/apps/bucket/intentions/psm.ts","../src/apps/bucket/api/psm.ts","../src/apps/bucket/api/config.ts","../src/apps/bucket/intentions/borrow.ts","../src/apps/bucket/api/lending.ts","../src/apps/bucket/intentions/repay.ts","../src/apps/bucket/intentions/withdraw.ts","../src/apps/bucket/intentions/close.ts","../src/apps/bucket/intentions/sbuck.ts","../src/apps/bucket/api/sbuck.ts","../src/apps/bucket/intentions/tank.ts","../src/apps/bucket/api/tank.ts","../src/apps/bucket/api/lock.ts","../src/apps/bucket/intentions/lock.ts","../src/apps/cetus/helper.ts","../src/apps/cetus/intentions/add-liquidity.ts","../src/apps/interface/sui-grpc.ts","../src/apps/cetus/api/config.ts","../src/apps/cetus/api/position.ts","../src/apps/cetus/intentions/claim-fee-and-mining.ts","../src/apps/cetus/intentions/create-pool.ts","../src/apps/cetus/intentions/decrease-liquidity.ts","../src/apps/cetus/intentions/farming-add.ts","../src/apps/cetus/api/farming.ts","../src/apps/cetus/intentions/farming-batch-harvest.ts","../src/apps/cetus/intentions/farming-claim-fee-and-rewards.ts","../src/apps/cetus/intentions/farming-decrease.ts","../src/apps/cetus/intentions/farming-harvest.ts","../src/apps/cetus/intentions/farming-increase.ts","../src/apps/cetus/intentions/farming-remove.ts","../src/apps/cetus/intentions/farming-stake.ts","../src/apps/cetus/intentions/farming-unstake.ts","../src/apps/cetus/intentions/increase-liquidity.ts","../src/apps/cetus/intentions/pos-vesting-redeem.ts","../src/apps/cetus/api/posvest.ts","../src/apps/cetus/intentions/remove-liquidity.ts","../src/apps/cetus/intentions/swap.ts","../src/apps/cetus/api/swap.ts","../src/apps/cetus/intentions/vaults-add.ts","../src/apps/cetus/api/vaults.ts","../src/apps/cetus/intentions/vaults-remove.ts","../src/apps/cetus/intentions/vesting-redeem.ts","../src/apps/cetus/api/vesting.ts","../src/apps/cetus/intentions/xcetus-cancel.ts","../src/apps/cetus/api/xcetus.ts","../src/apps/cetus/intentions/xcetus-claim.ts","../src/apps/cetus/intentions/xcetus-convert.ts","../src/apps/cetus/intentions/xcetus-redeem.ts","../src/apps/cetus/intentions/xcetus-redeem-lock.ts","../src/apps/mpay/cancel-stream.ts","../src/compat/mysten-sui-json-rpc.ts","../src/lib/suiGrpcClient.ts","../src/apps/mpay/config/dev.json","../src/apps/mpay/config/prod.json","../src/apps/mpay/common/env.ts","../src/apps/mpay/error/base.ts","../src/apps/mpay/error/NoBackendError.ts","../src/apps/mpay/error/WalletNotConnectedError.ts","../src/apps/mpay/stream/backend.ts","../src/apps/mpay/error/BackendError.ts","../src/apps/mpay/common/globals.ts","../src/apps/mpay/stream/client.ts","../src/apps/mpay/builder/MPayBuilder.ts","../src/apps/mpay/builder/CreateStreamHelper.ts","../src/apps/mpay/builder/const.ts","../src/apps/mpay/common/transaction.ts","../src/apps/mpay/contract/InspectViewer.ts","../src/apps/mpay/error/InvalidRpcResultError.ts","../src/apps/mpay/utils/rpc.ts","../src/apps/mpay/error/RpcError.ts","../src/apps/mpay/utils/moveObjectFields.ts","../src/apps/mpay/stream/metadata.ts","../src/apps/mpay/error/InvalidInputError.ts","../src/apps/mpay/sui/utils.ts","../src/apps/mpay/types/wallet.ts","../src/apps/mpay/utils/random.ts","../src/apps/mpay/const.ts","../src/apps/mpay/contract/BaseContract.ts","../src/apps/mpay/contract/FeeContract.ts","../src/apps/mpay/contract/StreamContract.ts","../src/apps/mpay/stream/helper.ts","../src/apps/mpay/error/TransactionFailedError.ts","../src/apps/mpay/stream/query.ts","../src/apps/mpay/stream/Stream.ts","../src/apps/mpay/error/NotCreatorError.ts","../src/apps/mpay/error/NotRecipientError.ts","../src/apps/mpay/error/SanityError.ts","../src/apps/mpay/error/StreamNotFoundError.ts","../src/apps/mpay/utils/utils.ts","../src/apps/mpay/error/InvalidStreamGroupError.ts","../src/apps/mpay/sui/iterator/iterator.ts","../src/apps/mpay/sui/iterator/object.ts","../src/apps/mpay/stream/StreamGroup.ts","../src/apps/mpay/error/NotEnoughBalanceError.ts","../src/apps/mpay/sui/iterator/coin.ts","../src/apps/mpay/intention.ts","../src/apps/mpay/claim-by-proxy-stream.ts","../src/apps/mpay/claim-stream.ts","../src/apps/mpay/create-stream.ts","../src/apps/mpay/decoder/moveCall.ts","../src/apps/mpay/decoder/create.ts","../src/apps/mpay/decoder/decoder.ts","../src/apps/mpay/set-auto-claim-stream.ts","../src/apps/mpay/helper.ts","../src/apps/msafe-core/helper.ts","../src/apps/msafe-core/coin-transfer.ts","../src/apps/msafe-core/object-transfer.ts","../src/apps/navi/helper.ts","../src/apps/navi/config.ts","../src/apps/navi/decoder.ts","../src/apps/navi/api/incentiveV2.ts","../src/apps/navi/intentions/claim-reward.ts","../src/apps/navi/intentions/claim-supply.ts","../src/apps/navi/intentions/entry-borrow.ts","../src/apps/navi/utils/tools.ts","../src/apps/navi/intentions/entry-deposit.ts","../src/apps/navi/utils/token.ts","../src/apps/navi/intentions/entry-repay.ts","../src/apps/navi/intentions/entry-withdraw.ts","../src/apps/navi/intentions/multi-deposit.ts","../src/apps/navi/intentions/plain-transaction.ts","../src/apps/plain-transaction/helper.ts","../src/apps/registry.ts","../src/apps/scallop/helper.ts","../src/apps/scallop/decoders/decoderLending.ts","../src/apps/scallop/decoders/decoder.ts","../src/apps/scallop/utils/moveCallHelper.ts","../src/apps/scallop/utils/splitCoinHelper.ts","../src/apps/scallop/utils/obligation.ts","../src/apps/scallop/utils/array.ts","../src/apps/scallop/decoders/decoderReferral.ts","../src/apps/scallop/decoders/decoderVesca.ts","../src/apps/scallop/intentions/scallopCoreBaseIntention.ts","../src/apps/scallop/intentions/lending/borrow.ts","../src/apps/scallop/intentions/lending/borrow-with-boost.ts","../src/apps/scallop/intentions/lending/borrow-with-referral.ts","../src/apps/scallop/intentions/lending/claim-incentive-reward.ts","../src/apps/scallop/intentions/lending/deposit-collateral.ts","../src/apps/scallop/intentions/lending/migrate-and-claim.ts","../src/apps/scallop/intentions/lending/migrate-scoin.ts","../src/apps/scallop/intentions/lending/open-obligation.ts","../src/apps/scallop/intentions/lending/repay.ts","../src/apps/scallop/intentions/lending/repay-with-boost.ts","../src/apps/scallop/intentions/lending/supply-lending.ts","../src/apps/scallop/intentions/lending/unstake-spool.ts","../src/apps/scallop/intentions/lending/withdraw-and-unstake-lending.ts","../src/apps/scallop/intentions/lending/withdraw-collateral.ts","../src/apps/scallop/intentions/lending/withdraw-lending.ts","../src/apps/scallop/intentions/referral/bind-referral.ts","../src/apps/scallop/intentions/referral/claim-revenue-referral.ts","../src/apps/scallop/intentions/referral/create-referral-link.ts","../src/apps/scallop/intentions/staking/extend-period-and-stake-more.ts","../src/apps/scallop/intentions/staking/extend-stake-period.ts","../src/apps/scallop/intentions/staking/merge-ve-sca.ts","../src/apps/scallop/intentions/staking/redeem-sca.ts","../src/apps/scallop/intentions/staking/renew-exp-stake-period.ts","../src/apps/scallop/intentions/staking/split-ve-sca.ts","../src/apps/scallop/intentions/staking/stake-sca.ts","../src/apps/scallop/intentions/staking/supply-and-stake-lending.ts","../src/apps/scallop/intentions/staking/ve-sca-obligation-bindings.ts","../src/apps/scallop/intentions/staking/ve-sca-transfers.ts","../src/apps/scallop/intentions/staking/withdraw-staked-sca.ts","../src/apps/springSui/helper.ts","../src/apps/springSui/decoder.ts","../src/apps/springSui/types/helper.ts","../src/apps/suilend/helper.ts","../src/apps/suilend/decoder.ts","../src/apps/suilend/intentions/borrow.ts","../src/apps/suilend/intentions/suilendBaseIntention.ts","../src/apps/suilend/intentions/claim.ts","../src/apps/suilend/utils/getRewards.ts","../src/apps/suilend/intentions/claimAndDeposit.ts","../src/apps/suilend/intentions/deposit.ts","../src/apps/suilend/intentions/repay.ts","../src/apps/suilend/intentions/withdraw.ts","../src/apps/springSui/intentions/convert.ts","../src/apps/springSui/intentions/springSuiBaseIntention.ts","../src/apps/springSui/intentions/convertAndDeposit.ts","../src/apps/springSui/intentions/stake.ts","../src/apps/springSui/intentions/stakeAndDeposit.ts","../src/apps/springSui/intentions/unstake.ts","../src/apps/stsui/helper.ts","../src/apps/stsui/decoder.ts","../src/apps/stsui/intentions/mint.ts","../src/apps/stsui/intentions/redeem.ts","../src/apps/turbos/helper.ts","../src/apps/turbos/decoder.ts","../src/apps/turbos/config.ts","../src/apps/turbos/intentions/add-liquidity.ts","../src/apps/turbos/intentions/burn.ts","../src/apps/turbos/intentions/collect-fee.ts","../src/apps/turbos/intentions/collect-reward.ts","../src/apps/turbos/intentions/create-pool.ts","../src/apps/turbos/intentions/decrease-liquidity.ts","../src/apps/turbos/intentions/decrease-liquidity-with-return.ts","../src/apps/turbos/intentions/increase-liquidity.ts","../src/apps/turbos/intentions/prix-claim.ts","../src/apps/turbos/intentions/prix-join.ts","../src/apps/turbos/intentions/remove-liquidity.ts","../src/apps/turbos/intentions/remove-liquidity-with-return.ts","../src/apps/turbos/intentions/swap.ts","../src/apps/turbos/intentions/swap-exact-base-for-quote.ts","../src/apps/turbos/api/deepbook.ts","../src/apps/turbos/utils/sui-kit.ts","../src/apps/turbos/intentions/swap-exact-quote-for-base.ts","../src/apps/volo/helper.ts","../src/apps/volo/decoder.ts","../src/apps/volo/config.ts","../src/apps/volo/intentions/claimTicket.ts","../src/apps/volo/intentions/stake.ts","../src/apps/volo/intentions/unStake.ts","../src/apps/bluefin/helper.ts","../src/apps/bluefin/decoder.ts","../src/apps/bluefin/intentions/aggregator-7k-swap.ts","../src/apps/bluefin/tx-builder.ts","../src/apps/bluefin/config.ts","../src/apps/bluefin/intentions/close-position.ts","../src/apps/bluefin/intentions/collect-fee.ts","../src/apps/bluefin/intentions/collect-rewards.ts","../src/apps/bluefin/intentions/collect-rewards-and-fee.ts","../src/apps/bluefin/intentions/open-position-with-liquidity.ts","../src/apps/bluefin/intentions/provide-liquidity.ts","../src/apps/bluefin/intentions/remove-liquidity.ts","../src/apps/mmt-dex/helper.ts","../src/apps/mmt-dex/intentions/add-liquidity.ts","../src/apps/mmt-dex/utils/liquidity.ts","../src/apps/mmt-dex/utils/common.ts","../src/apps/mmt-dex/utils/reward.ts","../src/apps/mmt-dex/utils/sdk.ts","../src/apps/mmt-dex/intentions/add-liquidity-single-side.ts","../src/apps/mmt-dex/intentions/claim-all-rewards.ts","../src/apps/mmt-dex/types.ts","../src/apps/mmt-dex/utils/vemmt.ts","../src/apps/mmt-dex/intentions/claim-reward-as.ts","../src/apps/mmt-dex/intentions/claim-rewards.ts","../src/apps/mmt-dex/intentions/manage-liquidity.ts","../src/apps/mmt-dex/intentions/manage-liquidity-single-side.ts","../src/apps/mmt-dex/intentions/remove-liquidity.ts","../src/apps/mmt-dex/utils/stake.ts","../src/apps/mmt-dex/intentions/stake-xsui.ts","../src/apps/mmt-dex/intentions/swap.ts","../src/apps/mmt-dex/utils/swap.ts","../src/apps/mmt-dex/intentions/unstake-xsui.ts","../src/apps/mmt-dex/intentions/vemmt-bond.ts","../src/apps/mmt-dex/intentions/vemmt-extend.ts","../src/apps/mmt-dex/intentions/vemmt-merge.ts","../src/apps/mmt-dex/intentions/vemmt-unbond.ts","../src/index.ts"],"sourcesContent":["(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","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { ClaimRewardIntention } from './intentions/claim-reward';\nimport { DepositDoubleAssetIntention } from './intentions/deposit-double-asset';\nimport { DepositSingleAssetIntention } from './intentions/deposit-single-asset';\nimport { WithdrawIntention } from './intentions/withdraw';\nimport { WithdrawAlphaIntention } from './intentions/withdraw-alpha';\nimport {\n  AlphaFiIntentionData,\n  DepositDoubleAssetIntentionData,\n  DepositSingleAssetIntentionData,\n  EmptyIntentionData,\n  TransactionSubType,\n  WithdrawAlphaIntentionData,\n  WithdrawIntentionData,\n} from './types';\n\nexport type AlphaFiIntention =\n  | DepositDoubleAssetIntention\n  | DepositSingleAssetIntention\n  | WithdrawAlphaIntention\n  | WithdrawIntention\n  | ClaimRewardIntention;\n\nexport class AlphaFiHelper implements IAppHelperInternal<AlphaFiIntentionData> {\n  application = 'alphafi';\n\n  supportSDK = '@mysten/sui' as const;\n\n  async deserialize(input: {\n    transaction: Transaction;\n    chain: IdentifierString;\n    network: SuiNetworks;\n    suiClient: SuiClient;\n    account: WalletAccount;\n    appContext?: any;\n  }): Promise<{ txType: TransactionType; txSubType: string; intentionData: AlphaFiIntentionData }> {\n    const { transaction, suiClient, account } = input;\n\n    const simResult = await suiClient.devInspectTransactionBlock({\n      sender: transaction.getData().sender,\n      transactionBlock: transaction,\n    });\n    console.log('AlphaFiHelper Sim result - ', simResult);\n\n    const decoder = new Decoder(transaction, simResult);\n    const result = decoder.decode();\n\n    return {\n      txType: TransactionType.Other,\n      txSubType: result.type,\n      intentionData: result.intentionData,\n    };\n  }\n\n  async build(input: {\n    intentionData: AlphaFiIntentionData;\n    txType: TransactionType;\n    txSubType: string;\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { account } = input;\n    console.log('AlphaFi build transaction type', input.txSubType);\n\n    let intention: AlphaFiIntention;\n    switch (input.txSubType) {\n      case TransactionSubType.DEPOSIT_SINGLE_ASSET:\n        intention = DepositSingleAssetIntention.fromData(input.intentionData as DepositSingleAssetIntentionData);\n        break;\n      case TransactionSubType.DEPOSIT_DOUBLE_ASSET:\n        intention = DepositDoubleAssetIntention.fromData(input.intentionData as DepositDoubleAssetIntentionData);\n        break;\n      case TransactionSubType.WITHDRAW:\n        intention = WithdrawIntention.fromData(input.intentionData as WithdrawIntentionData);\n        break;\n      case TransactionSubType.WITHDRAW_ALPHA:\n        intention = WithdrawAlphaIntention.fromData(input.intentionData as WithdrawAlphaIntentionData);\n        break;\n      case TransactionSubType.CLAIM_REWARD:\n        intention = ClaimRewardIntention.fromData(input.intentionData as EmptyIntentionData);\n        break;\n      default:\n        throw new Error('not implemented');\n    }\n\n    return intention.build({ account });\n  }\n}\n","import { coinsList, poolIdPoolNameMap, poolInfo, PoolName, singleAssetPoolCoinMap } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { bcs, fromBase64 } from '@mysten/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { DevInspectResults } from '@/compat/mysten-sui-json-rpc';\n\nimport {\n  DecodeResult,\n  DepositDoubleAssetIntentionData,\n  DepositSingleAssetIntentionData,\n  EmptyIntentionData,\n  EventType,\n  TransactionSubType,\n  WithdrawAlphaIntentionData,\n  WithdrawIntentionData,\n} from './types';\n\nexport class Decoder {\n  constructor(\n    public readonly transaction: Transaction,\n    public readonly simResult: DevInspectResults,\n  ) {}\n\n  /**\n   * Entry point for decoding the transaction. Determines the type of transaction\n   * and calls the appropriate decode method.\n   */\n  decode(): DecodeResult {\n    if (this.isClaimRewardTransaction()) {\n      return this.decodeClaimReward();\n    }\n\n    const liquidityChangeEvent = this.getLiquidityChangeEvent();\n    if (!liquidityChangeEvent) {\n      throw new Error('No liquidity change event found. Unable to decode transaction.');\n    }\n\n    const eventData = liquidityChangeEvent.parsedJson as EventType;\n    const poolId = eventData.pool_id;\n    const poolName = poolIdPoolNameMap[poolId];\n\n    console.log('Decoder event data - ', eventData);\n    console.log('Decoder poolName - ', poolName);\n\n    if (this.isWithdrawAlphaEvent(liquidityChangeEvent)) {\n      return this.decodeWithdrawAlpha(eventData);\n    }\n\n    if (this.isWithdrawEvent(eventData)) {\n      return this.decodeWithdraw(poolName);\n    }\n\n    if (this.isDoubleAssetDepositEvent(eventData, poolName)) {\n      return this.decodeDoubleAssetDeposit(poolName, eventData);\n    }\n\n    if (this.isSingleAssetDepositEvent(eventData, poolName)) {\n      return this.decodeSingleAssetDeposit(poolName, eventData);\n    }\n\n    throw new Error(`Unknown transaction type`);\n  }\n\n  // ---- Private Helpers ----\n\n  private get commands() {\n    return this.transaction.getData().commands;\n  }\n\n  private get inputs() {\n    return this.transaction.getData().inputs;\n  }\n\n  private getMoveCallCommand(fn: string) {\n    return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n  }\n\n  private getLiquidityChangeEvent() {\n    return this.simResult.events.find((event) => this.isLiquidityChangeEventType(event.type));\n  }\n\n  // is*\n  private isClaimRewardTransaction() {\n    return !!this.getMoveCallCommand('get_user_rewards_all');\n  }\n\n  private isLiquidityChangeEventType(type: string) {\n    return (\n      type.includes('LiquidityChangeEvent') ||\n      type.includes('LiquidityChangeNewNewEvent') ||\n      type.includes('WithdrawEventV2')\n    );\n  }\n\n  private isWithdrawAlphaEvent(event: { type: string }) {\n    return event.type.includes('WithdrawEventV2');\n  }\n\n  private isWithdrawEvent(eventData: EventType) {\n    return eventData.event_type === 1;\n  }\n\n  private isDoubleAssetDepositEvent(eventData: EventType, poolName: PoolName) {\n    return eventData.event_type === 0 && poolInfo[poolName].assetTypes.length === 2;\n  }\n\n  private isSingleAssetDepositEvent(eventData: EventType, poolName: PoolName) {\n    return eventData.event_type === 0 && poolInfo[poolName].assetTypes.length === 1;\n  }\n\n  /**\n   * Extracts the xTokensAmount from transaction inputs.\n   */\n  private extractXTokensAmount(): string {\n    const inputWithPure = this.inputs.find((input) => input.Pure !== undefined);\n    if (!inputWithPure || !inputWithPure.Pure?.bytes) {\n      throw new Error('Unable to extract xTokensAmount from inputs');\n    }\n    const { bytes } = inputWithPure.Pure;\n\n    let res;\n    if (bytes.length === 12) {\n      res = bcs.u64().parse(fromBase64(bytes));\n    } else if (bytes.length === 24) {\n      res = bcs.u128().parse(fromBase64(bytes));\n    } else if (bytes.length === 44) {\n      res = bcs.u256().parse(fromBase64(bytes));\n    } else {\n      res = bcs.u64().parse(fromBase64(bytes));\n    }\n\n    return res;\n  }\n\n  // ---- Decode Methods ----\n\n  private decodeDoubleAssetDeposit(poolName: PoolName, eventData: EventType): DecodeResult {\n    const { amount_a, amount_b } = eventData;\n    const isAmountA = Number(amount_a) > 0;\n    console.log('Decoder.decodeDoubleAssetDeposit', amount_a, amount_b, isAmountA);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.DEPOSIT_DOUBLE_ASSET,\n      intentionData: {\n        poolName,\n        amount: isAmountA ? amount_a : amount_b,\n        isAmountA,\n      } as DepositDoubleAssetIntentionData,\n    };\n  }\n\n  private decodeSingleAssetDeposit(poolName: PoolName, eventData: EventType): DecodeResult {\n    let { amount } = eventData;\n    console.log('Decoder.decodeSingleAssetDeposit', amount);\n    const liquidityChangeEvent = this.getLiquidityChangeEvent();\n    if (liquidityChangeEvent.type.includes(':alphafi_navi_pool:')) {\n      const { coin } = singleAssetPoolCoinMap[poolName];\n      const { expo } = coinsList[coin];\n      amount = Math.floor(Number(amount) / 10 ** (9 - expo)).toString();\n    }\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.DEPOSIT_SINGLE_ASSET,\n      intentionData: {\n        poolName,\n        amount,\n      } as DepositSingleAssetIntentionData,\n    };\n  }\n\n  private decodeWithdraw(poolName: PoolName): DecodeResult {\n    const xTokensAmount = this.extractXTokensAmount();\n    console.log('Decoder.decodeWithdraw', xTokensAmount);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.WITHDRAW,\n      intentionData: {\n        poolName,\n        xTokensAmount,\n      } as WithdrawIntentionData,\n    };\n  }\n\n  private decodeWithdrawAlpha(eventData: EventType): DecodeResult {\n    const xTokensAmount = this.extractXTokensAmount();\n    const { amount_withdrawn_from_locked } = eventData;\n    console.log('Decoder.decodeWithdrawAlpha', xTokensAmount, amount_withdrawn_from_locked);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.WITHDRAW_ALPHA,\n      intentionData: {\n        withdrawFromLocked: Number(amount_withdrawn_from_locked) > 0,\n        xTokensAmount,\n      } as WithdrawAlphaIntentionData,\n    };\n  }\n\n  private decodeClaimReward(): DecodeResult {\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.CLAIM_REWARD,\n      intentionData: {} as EmptyIntentionData,\n    };\n  }\n}\n","import { claimRewardTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { EmptyIntentionData, TransactionSubType } from '../types';\n\nexport class ClaimRewardIntention extends BaseIntention<EmptyIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.CLAIM_REWARD;\n\n  constructor(public readonly data: EmptyIntentionData) {\n    super(data);\n  }\n\n  async build(input: { account: WalletAccount }): Promise<Transaction> {\n    const { account } = input;\n    const txb = await claimRewardTxb(account.address);\n    return txb;\n  }\n\n  static fromData(data: EmptyIntentionData) {\n    return new ClaimRewardIntention(data);\n  }\n}\n","// interface for @mysten/sui package\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nexport interface IAppHelperInternal<T> {\n  application: string;\n  supportSDK: '@mysten/sui';\n\n  deserialize(input: {\n    transaction: Transaction;\n    chain: IdentifierString;\n    network: SuiNetworks;\n    suiClient: SuiClient;\n    account: WalletAccount;\n    appContext?: any;\n  }): Promise<{\n    txType: TransactionType;\n    txSubType: string;\n    intentionData: T;\n  }>;\n\n  build(input: {\n    network: SuiNetworks;\n    txType: TransactionType;\n    txSubType: string;\n    intentionData: T;\n    suiClient: SuiClient;\n    account: WalletAccount;\n  }): Promise<Transaction>;\n}\n\nexport interface TransactionIntention<D> {\n  txType: TransactionType;\n  txSubType: string;\n  data: D;\n\n  serialize(): string;\n\n  build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction>;\n}\n\nexport abstract class BaseIntention<D> implements TransactionIntention<D> {\n  abstract txType: TransactionType;\n\n  abstract txSubType: string;\n\n  protected constructor(public readonly data: D) {}\n\n  abstract build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction>;\n\n  serialize() {\n    return JSON.stringify(sortKeys(this.data));\n  }\n}\n","import { depositDoubleAssetTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { DepositDoubleAssetIntentionData, TransactionSubType } from '../types';\n\nexport class DepositDoubleAssetIntention extends BaseIntention<DepositDoubleAssetIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.DEPOSIT_DOUBLE_ASSET;\n\n  constructor(public readonly data: DepositDoubleAssetIntentionData) {\n    super(data);\n  }\n\n  async build(input: { account: WalletAccount }): Promise<Transaction> {\n    const { account } = input;\n    const { poolName, amount, isAmountA } = this.data;\n    const txb = await depositDoubleAssetTxb(poolName, account.address, amount, isAmountA);\n    return txb;\n  }\n\n  static fromData(data: DepositDoubleAssetIntentionData) {\n    console.log('DepositDoubleAssetIntention.fromData', data);\n    return new DepositDoubleAssetIntention(data);\n  }\n}\n","import { depositSingleAssetTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { DepositSingleAssetIntentionData, TransactionSubType } from '../types';\n\nexport class DepositSingleAssetIntention extends BaseIntention<DepositSingleAssetIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.DEPOSIT_SINGLE_ASSET;\n\n  constructor(public readonly data: DepositSingleAssetIntentionData) {\n    super(data);\n  }\n\n  async build(input: { account: WalletAccount }): Promise<Transaction> {\n    const { account } = input;\n    const { poolName, amount } = this.data;\n    const txb = await depositSingleAssetTxb(poolName, account.address, amount);\n    return txb;\n  }\n\n  static fromData(data: DepositSingleAssetIntentionData) {\n    console.log('DepositSingleAssetIntention.fromData', data);\n    return new DepositSingleAssetIntention(data);\n  }\n}\n","import { withdrawTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, WithdrawIntentionData } from '../types';\n\nexport class WithdrawIntention extends BaseIntention<WithdrawIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.WITHDRAW;\n\n  constructor(public readonly data: WithdrawIntentionData) {\n    super(data);\n  }\n\n  async build(input: { account: WalletAccount }): Promise<Transaction> {\n    const { account } = input;\n    const { poolName, xTokensAmount } = this.data;\n    const txb = await withdrawTxb(xTokensAmount, poolName, account.address);\n    return txb;\n  }\n\n  static fromData(data: WithdrawIntentionData) {\n    console.log('WithdrawIntention.fromData', data);\n    return new WithdrawIntention(data);\n  }\n}\n","import { withdrawAlphaTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, WithdrawAlphaIntentionData } from '../types';\n\nexport class WithdrawAlphaIntention extends BaseIntention<WithdrawAlphaIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.WITHDRAW_ALPHA;\n\n  constructor(public readonly data: WithdrawAlphaIntentionData) {\n    super(data);\n  }\n\n  async build(input: { account: WalletAccount }): Promise<Transaction> {\n    const { account } = input;\n    const { withdrawFromLocked, xTokensAmount } = this.data;\n    const txb = await withdrawAlphaTxb(xTokensAmount, withdrawFromLocked, account.address);\n    return txb;\n  }\n\n  static fromData(data: WithdrawAlphaIntentionData) {\n    console.log('WithdrawAlphaIntention.fromData', data);\n    return new WithdrawAlphaIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { BucketIntentionData } from '@/apps/bucket/types/helper';\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport {\n  BorrowIntentionData,\n  CloseIntentionData,\n  LockClaimIntentionData,\n  PsmIntentionData,\n  RepayIntentionData,\n  SBUCKClaimIntentionData,\n  SBUCKDepositIntentionData,\n  SBUCKUnstakeIntentionData,\n  SBUCKWithdrawIntentionData,\n  TankClaimIntentionData,\n  TankDepositIntentionData,\n  TankWithdrawIntentionData,\n  WithdrawIntentionData,\n} from './api';\nimport { Decoder } from './decoder';\nimport {\n  BorrowIntention,\n  CloseIntention,\n  LockClaimIntention,\n  PsmIntention,\n  RepayIntention,\n  SBUCKClaimIntention,\n  SBUCKDepositIntention,\n  SBUCKUnstakeIntention,\n  SBUCKWithdrawIntention,\n  TankClaimIntention,\n  TankDepositIntention,\n  TankWithdrawIntention,\n  WithdrawIntention,\n} from './intentions';\nimport { TransactionSubType } from './types';\n\nexport type BucketIntention =\n  | PsmIntention\n  | BorrowIntention\n  | WithdrawIntention\n  | RepayIntention\n  | CloseIntention\n  | TankDepositIntention\n  | TankWithdrawIntention\n  | TankClaimIntention\n  | SBUCKDepositIntention\n  | SBUCKWithdrawIntention\n  | SBUCKUnstakeIntention\n  | SBUCKClaimIntention\n  | LockClaimIntention;\n\nexport class BucketHelper implements IAppHelperInternal<BucketIntentionData> {\n  application = 'bucket';\n\n  supportSDK = '@mysten/sui' as const;\n\n  // TODO: Please refer to the documentation and move the `action` and `txbParams` params into the `appContext` structure.\n  async deserialize(input: {\n    transaction: Transaction;\n    chain: IdentifierString;\n    network: SuiNetworks;\n    suiClient: SuiClient;\n    account: WalletAccount;\n  }): Promise<{ txType: TransactionType; txSubType: string; intentionData: BucketIntentionData }> {\n    console.log('Bucket helper deserialize input: ', input);\n    const { transaction } = input;\n    const decoder = new Decoder(transaction);\n    const result = decoder.decode();\n    return {\n      txType: TransactionType.Other,\n      txSubType: result.type,\n      intentionData: result.intentionData,\n    };\n  }\n\n  async build(input: {\n    intentionData: BucketIntentionData;\n    txType: TransactionType;\n    txSubType: string;\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiClient, account, network } = input;\n\n    let intention: BucketIntention;\n    switch (input.txSubType) {\n      case TransactionSubType.Psm:\n        intention = PsmIntention.fromData(input.intentionData as PsmIntentionData);\n        break;\n      case TransactionSubType.Borrow:\n        intention = BorrowIntention.fromData(input.intentionData as BorrowIntentionData);\n        break;\n      case TransactionSubType.Withdraw:\n        intention = WithdrawIntention.fromData(input.intentionData as WithdrawIntentionData);\n        break;\n      case TransactionSubType.Repay:\n        intention = RepayIntention.fromData(input.intentionData as RepayIntentionData);\n        break;\n      case TransactionSubType.Close:\n        intention = CloseIntention.fromData(input.intentionData as CloseIntentionData);\n        break;\n      case TransactionSubType.TankDeposit:\n        intention = TankDepositIntention.fromData(input.intentionData as TankDepositIntentionData);\n        break;\n      case TransactionSubType.TankWithdraw:\n        intention = TankWithdrawIntention.fromData(input.intentionData as TankWithdrawIntentionData);\n        break;\n      case TransactionSubType.TankClaim:\n        intention = TankClaimIntention.fromData(input.intentionData as TankClaimIntentionData);\n        break;\n      case TransactionSubType.SBUCKDeposit:\n        intention = SBUCKDepositIntention.fromData(input.intentionData as SBUCKDepositIntentionData);\n        break;\n      case TransactionSubType.SBUCKUnstake:\n        intention = SBUCKUnstakeIntention.fromData(input.intentionData as SBUCKUnstakeIntentionData);\n        break;\n      case TransactionSubType.SBUCKWithdraw:\n        intention = SBUCKWithdrawIntention.fromData(input.intentionData as SBUCKWithdrawIntentionData);\n        break;\n      case TransactionSubType.SBUCKClaim:\n        intention = SBUCKClaimIntention.fromData(input.intentionData as SBUCKClaimIntentionData);\n        break;\n      case TransactionSubType.LockClaim:\n        intention = LockClaimIntention.fromData(input.intentionData as LockClaimIntentionData);\n        break;\n      default:\n        throw new Error('not implemented');\n    }\n\n    return intention.build({ suiClient, account, network });\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { bcs } from '@mysten/sui/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SBUCK_FOUNTAIN_PACKAGE_ID } from 'bucket-protocol-sdk';\n\nimport {\n  BorrowIntentionData,\n  CloseIntentionData,\n  LockClaimIntentionData,\n  PsmIntentionData,\n  RepayIntentionData,\n  SBUCKClaimIntentionData,\n  SBUCKDepositIntentionData,\n  SBUCKUnstakeIntentionData,\n  SBUCKWithdrawIntentionData,\n  TankClaimIntentionData,\n  TankDepositIntentionData,\n  TankWithdrawIntentionData,\n  WithdrawIntentionData,\n} from './api';\nimport { DecodeResult, TransactionSubType } from './types';\n\nexport class Decoder {\n  constructor(public readonly transaction: Transaction) {}\n\n  decode() {\n    // this.commands.map((command) => {\n    //   if (command.$kind === 'MoveCall') {\n    //     console.log(command);\n    //   }\n    // });\n\n    // Check sBUCK commands\n    if (this.isSBUCKDepositTransaction()) {\n      return this.decodeSBUCKDeposit();\n    }\n    if (this.isSBUCKUnstakeTransaction()) {\n      return this.decodeSBUCKUnstake();\n    }\n    if (this.isSBUCKWithdrawTransaction()) {\n      return this.decodeSBUCKWithdraw();\n    }\n    if (this.isSBUCKClaimTransaction()) {\n      return this.decodeSBUCKClaim();\n    }\n\n    // Check lock commands\n    if (this.isLockedClaimTransaction()) {\n      return this.decodeLockedClaim();\n    }\n\n    // Check borrow commands\n    if (this.isBorrowTransaction()) {\n      return this.decodeBorrow();\n    }\n    if (this.isRepayTransaction()) {\n      return this.decodeRepay();\n    }\n    if (this.isWithdrawTransaction()) {\n      return this.decodeWithdraw();\n    }\n    if (this.isCloseTransaction()) {\n      return this.decodeClose();\n    }\n\n    // Get tank commands\n    if (this.isTankDepositTransaction()) {\n      return this.decodeTankDeposit();\n    }\n    if (this.isTankWithdrawTransaction()) {\n      return this.decodeTankWithdraw();\n    }\n    if (this.isTankClaimTransaction()) {\n      return this.decodeTankClaim();\n    }\n\n    // Check PSM commands\n    if (this.isPsmTransaction()) {\n      return this.decodePsm();\n    }\n\n    throw new Error(`Unknown transaction type`);\n  }\n\n  private get commands() {\n    return this.transaction.getData().commands;\n  }\n\n  private get inputs() {\n    return this.transaction.getData().inputs;\n  }\n\n  private getMoveCallCommand(fn: string) {\n    return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n  }\n\n  private getMoveCallModuleCommand(module: string, fn: string) {\n    return this.commands.find(\n      (command) =>\n        command.$kind === 'MoveCall' && command.MoveCall.module === module && command.MoveCall.function === fn,\n    );\n  }\n\n  private getMoveCallPackageModuleCommand(package_: string, module: string, fn: string) {\n    return this.commands.find(\n      (command) =>\n        command.$kind === 'MoveCall' &&\n        command.MoveCall.package === package_ &&\n        command.MoveCall.module === module &&\n        command.MoveCall.function === fn,\n    );\n  }\n\n  private getMoveCallModuleCommands(module: string, fn: string) {\n    return this.commands.filter(\n      (command) =>\n        command.$kind === 'MoveCall' && command.MoveCall.module === module && command.MoveCall.function === fn,\n    );\n  }\n\n  private getSplitCoinsCommands() {\n    return this.commands.filter((command) => command.$kind === 'SplitCoins');\n  }\n\n  private getTransferCommands() {\n    return this.commands.filter((command) => command.$kind === 'TransferObjects');\n  }\n\n  private isPsmTransaction() {\n    return !!this.getMoveCallCommand('charge_reservoir') || !!this.getMoveCallCommand('discharge_reservoir');\n  }\n\n  private isStrapNewTransaction() {\n    return !!this.getMoveCallModuleCommand('strap', 'new');\n  }\n\n  private isBorrowTransaction() {\n    return (\n      !!this.getMoveCallModuleCommand('bucket_operations', 'high_top_up') ||\n      !!this.getMoveCallModuleCommand('bucket_operations', 'high_borrow') ||\n      !!this.getMoveCallModuleCommand('bucket_operations', 'high_borrow_with_strap')\n    );\n  }\n\n  private isRepayTransaction() {\n    return (\n      !!this.getMoveCallModuleCommand('bucket_operations', 'fully_repay') ||\n      !!this.getMoveCallModuleCommand('bucket_operations', 'fully_repay_with_strap') ||\n      !!this.getMoveCallModuleCommand('bucket_operations', 'repay_and_withdraw') ||\n      !!this.getMoveCallModuleCommand('bucket_operations', 'repay_and_withdraw_with_strap')\n    );\n  }\n\n  private isWithdrawTransaction() {\n    return (\n      !!this.getMoveCallModuleCommand('buck', 'withdraw') ||\n      !!this.getMoveCallModuleCommand('buck', 'withdraw_with_strap')\n    );\n  }\n\n  private isCloseTransaction() {\n    return !!this.getMoveCallModuleCommand('bucket_operations', 'destroy_empty_strap');\n  }\n\n  private isTankDepositTransaction() {\n    return !!this.getMoveCallModuleCommand('tank_operations', 'deposit');\n  }\n\n  private isTankWithdrawTransaction() {\n    return !!this.getMoveCallModuleCommand('tank_operations', 'withdraw');\n  }\n\n  private isTankClaimTransaction() {\n    return !!this.getMoveCallModuleCommand('tank_operations', 'claim');\n  }\n\n  private isSBUCKDepositTransaction() {\n    return !!this.getMoveCallModuleCommand('buck', 'buck_to_sbuck');\n  }\n\n  private isSBUCKWithdrawTransaction() {\n    return !!this.getMoveCallModuleCommand('buck', 'sbuck_to_buck');\n  }\n\n  private isSBUCKStakeTransaction() {\n    return !!this.getMoveCallPackageModuleCommand(SBUCK_FOUNTAIN_PACKAGE_ID, 'fountain_core', 'stake');\n  }\n\n  private isSBUCKUnstakeTransaction() {\n    return !!this.getMoveCallPackageModuleCommand(SBUCK_FOUNTAIN_PACKAGE_ID, 'fountain_core', 'force_unstake');\n  }\n\n  private isSBUCKClaimTransaction() {\n    return !!this.getMoveCallPackageModuleCommand(SBUCK_FOUNTAIN_PACKAGE_ID, 'fountain_core', 'claim');\n  }\n\n  private isLockedClaimTransaction() {\n    return (\n      !!this.getMoveCallModuleCommand('proof_rule', 'claim') ||\n      !!this.getMoveCallModuleCommand('lst_proof_rule', 'claim')\n    );\n  }\n\n  private isLstUnlockTransaction() {\n    return !!this.getMoveCallModuleCommand('lst_proof_rule', 'unlock');\n  }\n\n  private decodePsm(): DecodeResult {\n    let coinType;\n    let buckToCoin;\n\n    let amount = '0';\n    const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins.amounts[0];\n    if (inputCoinObject.$kind === 'Input') {\n      amount = this.getPureInputU64(inputCoinObject.Input);\n    }\n\n    if (this.getMoveCallCommand('charge_reservoir')) {\n      const psmCommand = this.getMoveCallCommand('charge_reservoir').MoveCall;\n      [coinType] = psmCommand.typeArguments;\n      buckToCoin = false;\n    } else {\n      const psmCommand = this.getMoveCallCommand('discharge_reservoir').MoveCall;\n      [coinType] = psmCommand.typeArguments;\n      buckToCoin = true;\n    }\n\n    console.log('Decoder.decodePsm', coinType, amount, buckToCoin);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.Psm,\n      intentionData: {\n        coinType,\n        amount,\n        buckToCoin,\n      } as PsmIntentionData,\n    };\n  }\n\n  private decodeBorrow(): DecodeResult {\n    let collateralType = '';\n    let borrowAmount = '0';\n    let insertionPlace: string | undefined;\n    const strapId: string | undefined = this.getStrapId();\n\n    let collateralAmount = '0';\n    const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins.amounts[0];\n    if (inputCoinObject.$kind === 'Input') {\n      collateralAmount = this.getPureInputU64(inputCoinObject.Input);\n    }\n\n    if (this.getMoveCallCommand('high_top_up')) {\n      const command = this.getMoveCallCommand('high_top_up').MoveCall;\n      [collateralType] = command.typeArguments;\n\n      const buckAmount = command.arguments[1];\n      if (buckAmount.$kind === 'Input') {\n        borrowAmount = this.getPureInputU64(buckAmount.Input);\n      }\n\n      const insertPlaceArg = command.arguments[3];\n      if (insertPlaceArg.$kind === 'Input') {\n        const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n        if (insertionPlaces.length === 1) {\n          [insertionPlace] = insertionPlaces;\n        }\n      }\n    } else if (this.getMoveCallCommand('high_borrow')) {\n      const command = this.getMoveCallCommand('high_borrow').MoveCall;\n      [collateralType] = command.typeArguments;\n\n      const buckAmount = command.arguments[4];\n      if (buckAmount.$kind === 'Input') {\n        borrowAmount = this.getPureInputU64(buckAmount.Input);\n      }\n\n      const insertPlaceArg = command.arguments[5];\n      if (insertPlaceArg.$kind === 'Input') {\n        const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n        if (insertionPlaces.length === 1) {\n          [insertionPlace] = insertionPlaces;\n        }\n      }\n    } else if (this.getMoveCallCommand('high_borrow_with_strap')) {\n      const command = this.getMoveCallCommand('high_borrow_with_strap').MoveCall;\n      [collateralType] = command.typeArguments;\n\n      const buckOutput = command.arguments[5];\n      if (buckOutput.$kind === 'Input') {\n        borrowAmount = this.getPureInputU64(buckOutput.Input);\n      }\n\n      const insertPlaceArg = command.arguments[6];\n      if (insertPlaceArg.$kind === 'Input') {\n        const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n        if (insertionPlaces.length === 1) {\n          [insertionPlace] = insertionPlaces;\n        }\n      }\n    }\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.Borrow,\n      intentionData: {\n        collateralType,\n        collateralAmount,\n        borrowAmount,\n        insertionPlace,\n        strapId,\n      } as BorrowIntentionData,\n    };\n  }\n\n  private decodeRepay(): DecodeResult {\n    let collateralType = '';\n    let repayAmount = '0';\n    let withdrawAmount = '0';\n    const isSurplus = false;\n    let insertionPlace: string | undefined;\n    const strapId: string | undefined = this.getStrapId();\n\n    if (this.getMoveCallCommand('fully_repay')) {\n      const repayCommand = this.getMoveCallCommand('fully_repay').MoveCall;\n      [collateralType] = repayCommand.typeArguments;\n    } else if (this.getMoveCallCommand('fully_repay_with_strap')) {\n      const repayCommand = this.getMoveCallCommand('fully_repay_with_strap').MoveCall;\n      [collateralType] = repayCommand.typeArguments;\n    } else if (this.getMoveCallCommand('repay_and_withdraw')) {\n      const command = this.getMoveCallCommand('repay_and_withdraw').MoveCall;\n      [collateralType] = command.typeArguments;\n      const withdrawArg = command.arguments[4];\n      if (withdrawArg.$kind === 'Input') {\n        withdrawAmount = this.getPureInputU64(withdrawArg.Input);\n      }\n      const insertPlaceArg = command.arguments[5];\n      if (insertPlaceArg.$kind === 'Input') {\n        const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n        if (insertionPlaces.length === 1) {\n          [insertionPlace] = insertionPlaces;\n        }\n      }\n\n      const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins.amounts[0];\n      if (inputCoinObject.$kind === 'Input') {\n        repayAmount = this.getPureInputU64(inputCoinObject.Input);\n      }\n    } else if (this.getMoveCallCommand('repay_and_withdraw_with_strap')) {\n      const command = this.getMoveCallCommand('repay_and_withdraw_with_strap').MoveCall;\n      [collateralType] = command.typeArguments;\n      const withdrawArg = command.arguments[5];\n      if (withdrawArg.$kind === 'Input') {\n        withdrawAmount = this.getPureInputU64(withdrawArg.Input);\n      }\n      const insertPlaceArg = command.arguments[6];\n      if (insertPlaceArg.$kind === 'Input') {\n        const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n        if (insertionPlaces.length === 1) {\n          [insertionPlace] = insertionPlaces;\n        }\n      }\n\n      const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins.amounts[0];\n      if (inputCoinObject.$kind === 'Input') {\n        repayAmount = this.getPureInputU64(inputCoinObject.Input);\n      }\n    }\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.Repay,\n      intentionData: {\n        collateralType,\n        repayAmount,\n        withdrawAmount,\n        isSurplus,\n        insertionPlace,\n        strapId,\n      } as RepayIntentionData,\n    };\n  }\n\n  private decodeWithdraw(): DecodeResult {\n    let collateralType = '';\n    let withdrawAmount = '0';\n    let insertionPlace: string | undefined;\n    const strapId: string | undefined = this.getStrapId();\n\n    if (this.getMoveCallCommand('withdraw_with_strap')) {\n      const command = this.getMoveCallCommand('withdraw_with_strap').MoveCall;\n      [collateralType] = command.typeArguments;\n\n      const withdrawArg = command.arguments[4];\n      if (withdrawArg.$kind === 'Input') {\n        withdrawAmount = this.getPureInputU64(withdrawArg.Input);\n      }\n\n      const insertPlaceArg = command.arguments[5];\n      if (insertPlaceArg.$kind === 'Input') {\n        const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n        if (insertionPlaces.length === 1) {\n          [insertionPlace] = insertionPlaces;\n        }\n      }\n    } else if (this.getMoveCallCommand('withdraw')) {\n      const command = this.getMoveCallCommand('withdraw').MoveCall;\n      [collateralType] = command.typeArguments;\n\n      const withdrawArg = command.arguments[3];\n      if (withdrawArg.$kind === 'Input') {\n        withdrawAmount = this.getPureInputU64(withdrawArg.Input);\n      }\n\n      const insertPlaceArg = command.arguments[4];\n      if (insertPlaceArg.$kind === 'Input') {\n        const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n        if (insertionPlaces.length === 1) {\n          [insertionPlace] = insertionPlaces;\n        }\n      }\n    }\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.Withdraw,\n      intentionData: {\n        collateralType,\n        withdrawAmount,\n        insertionPlace,\n        strapId,\n      } as WithdrawIntentionData,\n    };\n  }\n\n  private decodeClose(): DecodeResult {\n    let collateralType = '';\n    const strapId: string | undefined = this.getStrapId();\n\n    if (this.getMoveCallCommand('destroy_empty_strap')) {\n      const command = this.getMoveCallCommand('destroy_empty_strap').MoveCall;\n      [collateralType] = command.typeArguments;\n    }\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.Close,\n      intentionData: {\n        collateralType,\n        strapId,\n      } as CloseIntentionData,\n    };\n  }\n\n  private decodeSBUCKDeposit(): DecodeResult {\n    const balanceObject = this.getMoveCallCommand('into_balance');\n    const coinType = balanceObject.MoveCall.typeArguments[0];\n\n    let amount = '0';\n    const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins;\n    const inputAmount = inputCoinObject.amounts[0];\n    if (inputAmount.$kind === 'Input') {\n      amount = this.getPureInputU64(inputAmount.Input);\n    }\n\n    const isStake = this.isSBUCKStakeTransaction();\n    console.log('Decoder.decodeSBUCKDeposit', coinType, amount, isStake);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.SBUCKDeposit,\n      intentionData: {\n        coinType,\n        amount,\n        isStake,\n      } as SBUCKDepositIntentionData,\n    };\n  }\n\n  private decodeSBUCKUnstake(): DecodeResult {\n    let amount = '0';\n\n    const isStake = this.isSBUCKStakeTransaction();\n    if (isStake) {\n      const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins;\n      const inputAmount = inputCoinObject.amounts[0];\n      if (inputAmount.$kind === 'Input') {\n        amount = this.getPureInputU64(inputAmount.Input);\n      }\n    }\n\n    const stakeProofs: string[] = [];\n    const unlockCommands = this.getMoveCallModuleCommands('proof_rule', 'unlock');\n    if (unlockCommands.length > 0) {\n      for (let i = 0; i < unlockCommands.length; i++) {\n        const command = unlockCommands[i];\n        stakeProofs.push('');\n      }\n    } else {\n      const unstakeCommands = this.getMoveCallModuleCommands('fountain_core', 'force_unstake');\n      for (let i = 0; i < unstakeCommands.length; i++) {\n        const command = unstakeCommands[i];\n        const argument = command.MoveCall.arguments[2];\n        if (argument.$kind === 'Input') {\n          const { objectId } = this.inputs[argument.Input].UnresolvedObject;\n          stakeProofs.push(objectId);\n        }\n      }\n    }\n\n    const toBuck = this.isSBUCKWithdrawTransaction();\n\n    const intentionData = {\n      stakeProofs,\n      amount,\n      isStake,\n      toBuck,\n    } as SBUCKUnstakeIntentionData;\n    console.log('Decoder.decodeSBUCKUnstake', intentionData);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.SBUCKUnstake,\n      intentionData,\n    };\n  }\n\n  private decodeSBUCKWithdraw(): DecodeResult {\n    let amount = '0';\n\n    const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins;\n    const inputAmount = inputCoinObject.amounts[0];\n    if (inputAmount.$kind === 'Input') {\n      amount = this.getPureInputU64(inputAmount.Input);\n    }\n\n    console.log('Decoder.SBUCKWithdraw', amount);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.SBUCKWithdraw,\n      intentionData: {\n        amount,\n      } as SBUCKWithdrawIntentionData,\n    };\n  }\n\n  private decodeSBUCKClaim(): DecodeResult {\n    const stakeProofs: string[] = [];\n\n    const commands = this.getMoveCallModuleCommands('fountain_core', 'claim');\n    for (let i = 0; i < commands.length; i++) {\n      const command = commands[i];\n      const argument = command.MoveCall.arguments[2];\n      if (argument.$kind === 'Input') {\n        const { objectId } = this.inputs[argument.Input].UnresolvedObject;\n        stakeProofs.push(objectId);\n      }\n    }\n\n    console.log('Decoder.decodeSBUCKClaim', stakeProofs);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.SBUCKClaim,\n      intentionData: {\n        stakeProofs,\n      } as SBUCKClaimIntentionData,\n    };\n  }\n\n  private decodeTankDeposit(): DecodeResult {\n    let amount = '0';\n    const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins;\n    const inputAmount = inputCoinObject.amounts[0];\n    if (inputAmount.$kind === 'Input') {\n      amount = this.getPureInputU64(inputAmount.Input);\n    }\n\n    const command = this.getMoveCallModuleCommand('tank_operations', 'deposit').MoveCall;\n    const coinType = command.typeArguments[0];\n\n    console.log('Decoder.decodeTankDeposit', coinType, amount);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.TankDeposit,\n      intentionData: {\n        coinType,\n        amount,\n      } as TankDepositIntentionData,\n    };\n  }\n\n  private decodeTankWithdraw(): DecodeResult {\n    const command = this.getMoveCallModuleCommand('tank_operations', 'withdraw').MoveCall;\n    const coinType = command.typeArguments[0];\n\n    let amount = '0';\n    const amountArg = command.arguments[5];\n    if (amountArg.$kind === 'Input') {\n      amount = this.getPureInputU64(amountArg.Input);\n    }\n\n    console.log('Decoder.decodeTankWithdraw', coinType, amount);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.TankWithdraw,\n      intentionData: {\n        coinType,\n        amount,\n      } as TankWithdrawIntentionData,\n    };\n  }\n\n  private decodeTankClaim(): DecodeResult {\n    const command = this.getMoveCallModuleCommand('tank_operations', 'claim').MoveCall;\n    const coinType = command.typeArguments[0];\n\n    console.log('Decoder.decodeTankClaim', coinType);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.TankClaim,\n      intentionData: {\n        coinType,\n      } as TankClaimIntentionData,\n    };\n  }\n\n  private decodeLockedClaim(): DecodeResult {\n    let coinType = '';\n    let proofCount = 0;\n\n    const sbuckClaimCommands = this.getMoveCallModuleCommands('proof_rule', 'claim');\n    for (let i = 0; i < sbuckClaimCommands.length; i++) {\n      const command = sbuckClaimCommands[i];\n      [coinType] = command.MoveCall.typeArguments;\n      proofCount++;\n    }\n\n    const lstClaimCommands = this.getMoveCallModuleCommands('lst_proof_rule', 'claim');\n    for (let i = 0; i < lstClaimCommands.length; i++) {\n      const command = lstClaimCommands[i];\n      [coinType] = command.MoveCall.typeArguments;\n      proofCount++;\n    }\n    console.log('Decoder.decodeLockedClaim', coinType, proofCount);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.LockClaim,\n      intentionData: {\n        coinType,\n        proofCount,\n      } as LockClaimIntentionData,\n    };\n  }\n\n  // Helpers\n  private getCoinInput(idx: number) {\n    const input = this.inputs[idx];\n    if (input.$kind !== 'Object') {\n      throw new Error('not Object argument');\n    }\n  }\n\n  private getStrapId() {\n    let strapId: string | undefined;\n\n    if (this.isStrapNewTransaction()) {\n      strapId = 'new';\n    } else if (this.isLstUnlockTransaction()) {\n      strapId = 'locked';\n    }\n\n    if (!strapId) {\n      const command = this.getMoveCallModuleCommand('fountain', 'unstake');\n      if (command) {\n        const strapArg = command.MoveCall.arguments[2];\n        if (strapArg.$kind === 'Input') {\n          strapId = this.inputs[strapArg.Input].UnresolvedObject.objectId;\n        }\n      }\n    }\n\n    return strapId;\n  }\n\n  private getPureInputU64(idx: number) {\n    const input = this.inputs[idx];\n    if (input.$kind !== 'Pure') {\n      throw new Error('not pure argument');\n    }\n\n    return bcs.U64.fromBase64(input.Pure.bytes);\n  }\n\n  private getPureAddresses(idx: number) {\n    const input = this.inputs[idx];\n    if (input.$kind !== 'Pure') {\n      throw new Error('not pure argument');\n    }\n\n    return bcs.vector(bcs.Address).fromBase64(input.Pure.bytes);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { PsmIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getPsmTx } from '../api/psm';\nimport { TransactionSubType } from '../types';\n\nexport class PsmIntention extends BaseIntention<PsmIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.Psm;\n\n  constructor(public readonly data: PsmIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    const tx = await getPsmTx(this.data, account, network);\n    return tx;\n  }\n\n  static fromData(data: PsmIntentionData) {\n    return new PsmIntention(data);\n  }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildPsmTx } from 'bucket-protocol-sdk';\n\nimport { PsmIntentionData } from '@/apps/bucket/types/api';\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\nimport { toBucketSdkTransaction } from '../utils/transaction';\n\nexport const getPsmTx = async (\n  txbParams: PsmIntentionData,\n  account: WalletAccount,\n  network: SuiNetworks,\n): Promise<Transaction> => {\n  const { coinType, amount, buckToCoin } = txbParams;\n\n  const tx = new Transaction();\n  const client = getBucketClient(network, account);\n  await buildPsmTx(client, toBucketSdkTransaction(tx), coinType, amount, buckToCoin, account.address);\n\n  return tx;\n};\n","import { WalletAccount } from '@mysten/wallet-standard';\nimport { BucketClient } from 'bucket-protocol-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nexport const getBucketClient = (network: SuiNetworks, account: WalletAccount) => {\n  const config = network === 'sui:mainnet' ? 'mainnet' : 'testnet';\n  return new BucketClient(config, account.address);\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BorrowIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getBorrowTx } from '../api/lending';\nimport { TransactionSubType } from '../types';\n\nexport class BorrowIntention extends BaseIntention<BorrowIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.Borrow;\n\n  constructor(public readonly data: BorrowIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    const tx = await getBorrowTx(this.data, account, network);\n    return tx;\n  }\n\n  static fromData(data: BorrowIntentionData) {\n    return new BorrowIntention(data);\n  }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildBorrowTx, buildCloseTx, buildRepayTx, buildWithdrawTx } from 'bucket-protocol-sdk';\n\nimport {\n  BorrowIntentionData,\n  CloseIntentionData,\n  RepayIntentionData,\n  WithdrawIntentionData,\n} from '@/apps/bucket/types/api';\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\nimport { toBucketSdkTransaction } from '../utils/transaction';\n\nexport const getBorrowTx = async (\n  txbParams: BorrowIntentionData,\n  account: WalletAccount,\n  network: SuiNetworks,\n): Promise<Transaction> => {\n  const { collateralType, collateralAmount, borrowAmount, insertionPlace, strapId } = txbParams;\n\n  const tx = new Transaction();\n  const client = getBucketClient(network, account);\n  await buildBorrowTx(\n    client,\n    toBucketSdkTransaction(tx),\n    collateralType,\n    collateralAmount,\n    borrowAmount,\n    account.address,\n    insertionPlace,\n    strapId,\n  );\n\n  return tx;\n};\n\nexport const getWithdrawTx = async (\n  txbParams: WithdrawIntentionData,\n  account: WalletAccount,\n  network: SuiNetworks,\n): Promise<Transaction> => {\n  const { collateralType, withdrawAmount, insertionPlace, strapId } = txbParams;\n\n  const tx = new Transaction();\n  const client = getBucketClient(network, account);\n  await buildWithdrawTx(\n    client,\n    toBucketSdkTransaction(tx),\n    collateralType,\n    withdrawAmount,\n    account.address,\n    insertionPlace,\n    strapId,\n  );\n\n  return tx;\n};\n\nexport const getRepayTx = async (\n  txbParams: RepayIntentionData,\n  account: WalletAccount,\n  network: SuiNetworks,\n): Promise<Transaction> => {\n  const { collateralType, repayAmount, withdrawAmount, isSurplus, insertionPlace, strapId } = txbParams;\n\n  const tx = new Transaction();\n  const client = getBucketClient(network, account);\n  await buildRepayTx(\n    client,\n    toBucketSdkTransaction(tx),\n    collateralType,\n    repayAmount,\n    withdrawAmount,\n    account.address,\n    isSurplus,\n    insertionPlace,\n    strapId,\n  );\n\n  return tx;\n};\n\nexport const getCloseTx = async (\n  txbParams: CloseIntentionData,\n  account: WalletAccount,\n  network: SuiNetworks,\n): Promise<Transaction> => {\n  const { collateralType, recipient, strapId } = txbParams;\n\n  const tx = new Transaction();\n  const client = getBucketClient(network, account);\n  await buildCloseTx(client, toBucketSdkTransaction(tx), collateralType, recipient, strapId);\n\n  return tx;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { RepayIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getRepayTx } from '../api/lending';\nimport { TransactionSubType } from '../types';\n\nexport class RepayIntention extends BaseIntention<RepayIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.Repay;\n\n  constructor(public readonly data: RepayIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    const tx = await getRepayTx(this.data, account, network);\n    return tx;\n  }\n\n  static fromData(data: RepayIntentionData) {\n    return new RepayIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { WithdrawIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getWithdrawTx } from '../api/lending';\nimport { TransactionSubType } from '../types';\n\nexport class WithdrawIntention extends BaseIntention<WithdrawIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.Withdraw;\n\n  constructor(public readonly data: WithdrawIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    const tx = await getWithdrawTx(this.data, account, network);\n    return tx;\n  }\n\n  static fromData(data: WithdrawIntentionData) {\n    return new WithdrawIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CloseIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getCloseTx } from '../api/lending';\nimport { TransactionSubType } from '../types';\n\nexport class CloseIntention extends BaseIntention<CloseIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.Close;\n\n  constructor(public readonly data: CloseIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    const tx = await getCloseTx(this.data, account, network);\n    return tx;\n  }\n\n  static fromData(data: CloseIntentionData) {\n    return new CloseIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport {\n  SBUCKClaimIntentionData,\n  SBUCKDepositIntentionData,\n  SBUCKUnstakeIntentionData,\n  SBUCKWithdrawIntentionData,\n} from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getSBUCKClaimTx, getSBUCKDepositTx, getSBUCKUnstakeTx, getSBUCKWithdrawTx } from '../api/sbuck';\nimport { TransactionSubType } from '../types';\n\nexport class SBUCKDepositIntention extends BaseIntention<SBUCKDepositIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.SBUCKDeposit;\n\n  constructor(public readonly data: SBUCKDepositIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    const tx = await getSBUCKDepositTx(this.data, account, network);\n    return tx;\n  }\n\n  static fromData(data: SBUCKDepositIntentionData) {\n    return new SBUCKDepositIntention(data);\n  }\n}\n\nexport class SBUCKUnstakeIntention extends BaseIntention<SBUCKUnstakeIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.SBUCKUnstake;\n\n  constructor(public readonly data: SBUCKUnstakeIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    const tx = await getSBUCKUnstakeTx(this.data, account, network);\n    return tx;\n  }\n\n  static fromData(data: SBUCKUnstakeIntentionData) {\n    return new SBUCKUnstakeIntention(data);\n  }\n}\n\nexport class SBUCKWithdrawIntention extends BaseIntention<SBUCKWithdrawIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.SBUCKWithdraw;\n\n  constructor(public readonly data: SBUCKWithdrawIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    const tx = await getSBUCKWithdrawTx(this.data, account, network);\n    return tx;\n  }\n\n  static fromData(data: SBUCKWithdrawIntentionData) {\n    return new SBUCKWithdrawIntention(data);\n  }\n}\n\nexport class SBUCKClaimIntention extends BaseIntention<SBUCKClaimIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.SBUCKClaim;\n\n  constructor(public readonly data: SBUCKClaimIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    const tx = await getSBUCKClaimTx(this.data, account, network);\n    return tx;\n  }\n\n  static fromData(data: SBUCKClaimIntentionData) {\n    return new SBUCKClaimIntention(data);\n  }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildSBUCKClaimTx, buildSBUCKDepositTx, buildSBUCKUnstakeTx, buildSBUCKWithdrawTx } from 'bucket-protocol-sdk';\n\nimport {\n  SBUCKClaimIntentionData,\n  SBUCKDepositIntentionData,\n  SBUCKUnstakeIntentionData,\n  SBUCKWithdrawIntentionData,\n} from '@/apps/bucket/types/api';\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\nimport { toBucketSdkTransaction } from '../utils/transaction';\n\nexport const getSBUCKDepositTx = async (\n  txbParams: SBUCKDepositIntentionData,\n  account: WalletAccount,\n  network: SuiNetworks,\n): Promise<Transaction> => {\n  const { coinType, amount, isStake } = txbParams;\n\n  const tx = new Transaction();\n  const client = getBucketClient(network, account);\n  await buildSBUCKDepositTx(client, toBucketSdkTransaction(tx), coinType, amount, account.address, isStake);\n\n  return tx;\n};\n\nexport const getSBUCKUnstakeTx = async (\n  txbParams: SBUCKUnstakeIntentionData,\n  account: WalletAccount,\n  network: SuiNetworks,\n): Promise<Transaction> => {\n  const { stakeProofs, amount, isStake, toBuck } = txbParams;\n\n  const tx = new Transaction();\n  const client = getBucketClient(network, account);\n  await buildSBUCKUnstakeTx(client, toBucketSdkTransaction(tx), stakeProofs, amount, account.address, isStake, toBuck);\n\n  return tx;\n};\n\nexport const getSBUCKWithdrawTx = async (\n  txbParams: SBUCKWithdrawIntentionData,\n  account: WalletAccount,\n  network: SuiNetworks,\n): Promise<Transaction> => {\n  const { amount } = txbParams;\n\n  const tx = new Transaction();\n  const client = getBucketClient(network, account);\n  await buildSBUCKWithdrawTx(client, toBucketSdkTransaction(tx), amount, account.address);\n\n  return tx;\n};\n\nexport const getSBUCKClaimTx = async (\n  txbParams: SBUCKClaimIntentionData,\n  account: WalletAccount,\n  network: SuiNetworks,\n): Promise<Transaction> => {\n  const { stakeProofs } = txbParams;\n\n  const tx = new Transaction();\n  const client = getBucketClient(network, account);\n  await buildSBUCKClaimTx(client, toBucketSdkTransaction(tx), stakeProofs, account.address);\n\n  return tx;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport {\n  getTankClaimTx,\n  getTankDepositTx,\n  getTankWithdrawTx,\n  TankClaimIntentionData,\n  TankDepositIntentionData,\n  TankWithdrawIntentionData,\n} from '../api';\nimport { TransactionSubType } from '../types';\n\nexport class TankDepositIntention extends BaseIntention<TankDepositIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.TankDeposit;\n\n  constructor(public readonly data: TankDepositIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    const tx = await getTankDepositTx(this.data, account, network);\n    return tx;\n  }\n\n  static fromData(data: TankDepositIntentionData) {\n    return new TankDepositIntention(data);\n  }\n}\n\nexport class TankWithdrawIntention extends BaseIntention<TankWithdrawIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.TankWithdraw;\n\n  constructor(public readonly data: TankWithdrawIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    const tx = await getTankWithdrawTx(this.data, account, network);\n    return tx;\n  }\n\n  static fromData(data: TankWithdrawIntentionData) {\n    return new TankWithdrawIntention(data);\n  }\n}\n\nexport class TankClaimIntention extends BaseIntention<TankClaimIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.TankClaim;\n\n  constructor(public readonly data: TankClaimIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    const tx = await getTankClaimTx(this.data, account, network);\n    return tx;\n  }\n\n  static fromData(data: TankClaimIntentionData) {\n    return new TankClaimIntention(data);\n  }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildTankClaimTx, buildTankDepositTx, buildTankWithdrawTx } from 'bucket-protocol-sdk';\n\nimport { TankClaimIntentionData, TankDepositIntentionData, TankWithdrawIntentionData } from '@/apps/bucket/types/api';\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\nimport { toBucketSdkTransaction } from '../utils/transaction';\n\nexport const getTankDepositTx = async (\n  txbParams: TankDepositIntentionData,\n  account: WalletAccount,\n  network: SuiNetworks,\n): Promise<Transaction> => {\n  const { coinType, amount } = txbParams;\n\n  const tx = new Transaction();\n  const client = getBucketClient(network, account);\n  await buildTankDepositTx(client, toBucketSdkTransaction(tx), coinType, amount, account.address);\n\n  return tx;\n};\n\nexport const getTankWithdrawTx = async (\n  txbParams: TankWithdrawIntentionData,\n  account: WalletAccount,\n  network: SuiNetworks,\n): Promise<Transaction> => {\n  const { coinType, amount } = txbParams;\n\n  const tx = new Transaction();\n  const client = getBucketClient(network, account);\n  await buildTankWithdrawTx(client, toBucketSdkTransaction(tx), coinType, amount, account.address);\n\n  return tx;\n};\n\nexport const getTankClaimTx = async (\n  txbParams: TankClaimIntentionData,\n  account: WalletAccount,\n  network: SuiNetworks,\n): Promise<Transaction> => {\n  const { coinType } = txbParams;\n\n  const tx = new Transaction();\n  const client = getBucketClient(network, account);\n  await buildTankClaimTx(client, toBucketSdkTransaction(tx), coinType, account.address);\n\n  return tx;\n};\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildLockedClaimTx } from 'bucket-protocol-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\nimport { toBucketSdkTransaction } from '../utils/transaction';\n\nexport interface LockClaimIntentionData {\n  coinType: string;\n  proofCount: number;\n}\n\nexport const getLockClaimTx = async (\n  txbParams: LockClaimIntentionData,\n  account: WalletAccount,\n  network: SuiNetworks,\n): Promise<Transaction> => {\n  const { coinType, proofCount } = txbParams;\n\n  const tx = new Transaction();\n  const client = getBucketClient(network, account);\n  await buildLockedClaimTx(client, toBucketSdkTransaction(tx), coinType, proofCount, account.address);\n\n  return tx;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { LockClaimIntentionData, getLockClaimTx } from '../api';\nimport { TransactionSubType } from '../types';\n\nexport class LockClaimIntention extends BaseIntention<LockClaimIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.LockClaim;\n\n  constructor(public readonly data: LockClaimIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    const tx = await getLockClaimTx(this.data, account, network);\n    return tx;\n  }\n\n  static fromData(data: LockClaimIntentionData) {\n    return new LockClaimIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternalGrpc } from '@/apps/interface/sui-grpc';\n\nimport { AddLiquidityIntention } from './intentions/add-liquidity';\nimport { ClaimFeeAndMiningIntention } from './intentions/claim-fee-and-mining';\nimport { CreatePoolIntention } from './intentions/create-pool';\nimport { DecreaseLiquidityIntention } from './intentions/decrease-liquidity';\nimport { FarmingAddLiquidityIntention } from './intentions/farming-add';\nimport { FarmingBatchHarvestIntention } from './intentions/farming-batch-harvest';\nimport { FarmingClaimFeeAndRewardIntention } from './intentions/farming-claim-fee-and-rewards';\nimport { FarmingDecreaseLiquidityIntention } from './intentions/farming-decrease';\nimport { FarmingHarvestIntention } from './intentions/farming-harvest';\nimport { FarmingIncreaseLiquidityIntention } from './intentions/farming-increase';\nimport { FarmingRemoveLiquidityIntention } from './intentions/farming-remove';\nimport { FarmingStakeIntention } from './intentions/farming-stake';\nimport { FarmingUnstakeIntention } from './intentions/farming-unstake';\nimport { IncreaseLiquidityIntention } from './intentions/increase-liquidity';\nimport { PosVestingRedeemIntention } from './intentions/pos-vesting-redeem';\nimport { RemoveLiquidityIntention } from './intentions/remove-liquidity';\nimport { SwapIntention } from './intentions/swap';\nimport { AddVaultsPositionIntention } from './intentions/vaults-add';\nimport { RemoveVaultsPositionIntention } from './intentions/vaults-remove';\nimport { VestingRedeemIntention } from './intentions/vesting-redeem';\nimport { XcetusCancelIntention } from './intentions/xcetus-cancel';\nimport { XcetusClaimingStakeRewardsIntention } from './intentions/xcetus-claim';\nimport { XcetusConvertIntention } from './intentions/xcetus-convert';\nimport { XcetusRedeemIntention } from './intentions/xcetus-redeem';\nimport { XcetusRedeemLockIntention } from './intentions/xcetus-redeem-lock';\nimport { SuiNetworks, CetusIntentionData, TransactionSubType } from './types';\n\nexport type CetusIntention =\n  | AddLiquidityIntention\n  | IncreaseLiquidityIntention\n  | FarmingAddLiquidityIntention\n  | FarmingIncreaseLiquidityIntention\n  | DecreaseLiquidityIntention\n  | RemoveLiquidityIntention\n  | ClaimFeeAndMiningIntention\n  | FarmingDecreaseLiquidityIntention\n  | FarmingRemoveLiquidityIntention\n  | FarmingClaimFeeAndRewardIntention\n  | FarmingHarvestIntention\n  | FarmingBatchHarvestIntention\n  | FarmingStakeIntention\n  | FarmingUnstakeIntention\n  | XcetusConvertIntention\n  | XcetusRedeemLockIntention\n  | XcetusClaimingStakeRewardsIntention\n  | XcetusCancelIntention\n  | XcetusRedeemIntention\n  | VestingRedeemIntention\n  | SwapIntention\n  | AddVaultsPositionIntention\n  | RemoveVaultsPositionIntention\n  | PosVestingRedeemIntention\n  | CreatePoolIntention;\n\nexport class CetusHelper implements IAppHelperInternalGrpc<CetusIntentionData> {\n  application = 'cetus';\n\n  supportSDK = '@mysten/sui-v2' as const;\n\n  async deserialize(\n    input: SuiSignTransactionBlockInput & {\n      network: SuiNetworks;\n      suiGrpcClient: SuiGrpcClient;\n      account: WalletAccount;\n      transaction: Transaction;\n      appContext: CetusIntentionData;\n    },\n  ): Promise<{ txType: TransactionType; txSubType: string; intentionData: CetusIntentionData }> {\n    console.log('Cetus helper deserialize input: ', input);\n    const { appContext } = input;\n\n    return {\n      txType: TransactionType.Other,\n      txSubType: appContext.action,\n      intentionData: appContext,\n    };\n  }\n\n  async build(input: {\n    intentionData: CetusIntentionData;\n    txType: TransactionType;\n    txSubType: string;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n\n    let intention: CetusIntention;\n    switch (input.txSubType) {\n      case TransactionSubType.OpenAndAddLiquidity:\n        intention = AddLiquidityIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.IncreaseLiquidity:\n        intention = IncreaseLiquidityIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.DecreaseLiquidity:\n        intention = DecreaseLiquidityIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.RemoveLiquidity:\n        intention = RemoveLiquidityIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.ClaimFeeAndMining:\n        intention = ClaimFeeAndMiningIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.FarmingOpenAndAddLiquidity:\n        intention = FarmingAddLiquidityIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.FarmingIncreaseLiquidity:\n        intention = FarmingIncreaseLiquidityIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.FarmingDecreaseLiquidity:\n        intention = FarmingDecreaseLiquidityIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.FarmingRemoveLiquidity:\n        intention = FarmingRemoveLiquidityIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.FarmingClaimFeeAndReward:\n        intention = FarmingClaimFeeAndRewardIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.FarmingHarvest:\n        intention = FarmingHarvestIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.FarmingBatchHarvest:\n        intention = FarmingBatchHarvestIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.FarmingStake:\n        intention = FarmingStakeIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.FarmingUnstake:\n        intention = FarmingUnstakeIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.xCETUSConvert:\n        intention = XcetusConvertIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.xCETUSRedeemLock:\n        intention = XcetusRedeemLockIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.xCETUSClaimStakingRwewards:\n        intention = XcetusClaimingStakeRewardsIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.xCETUSCancelRedeem:\n        intention = XcetusCancelIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.xCETUSRedeem:\n        intention = XcetusRedeemIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.VestingRedeem:\n        intention = VestingRedeemIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.Swap:\n        intention = SwapIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.AddVaultsPosition:\n        intention = AddVaultsPositionIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.RemoveVaultsPosition:\n        intention = RemoveVaultsPositionIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.PosVestingRedeem:\n        intention = PosVestingRedeemIntention.fromData(input.intentionData);\n        break;\n      case TransactionSubType.CreatePool:\n        intention = CreatePoolIntention.fromData(input.intentionData);\n        break;\n      default:\n        throw new Error('not implemented');\n    }\n\n    return intention.build({ suiGrpcClient, account, network });\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getAddLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class AddLiquidityIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.OpenAndAddLiquidity;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getAddLiquidityTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new AddLiquidityIntention(data);\n  }\n}\n","// interface for @mysten/sui/grpc package (v2 gRPC client)\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { SuiNetworks } from '@/types';\n\nexport interface IAppHelperInternalGrpc<T> {\n  application: string;\n  supportSDK: '@mysten/sui-v2';\n\n  deserialize(input: {\n    transaction: Transaction;\n    chain: IdentifierString;\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    appContext?: any;\n  }): Promise<{\n    txType: TransactionType;\n    txSubType: string;\n    intentionData: T;\n  }>;\n\n  build(input: {\n    network: SuiNetworks;\n    txType: TransactionType;\n    txSubType: string;\n    intentionData: T;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction>;\n}\n\nexport interface TransactionIntentionGrpc<D> {\n  txType: TransactionType;\n  txSubType: string;\n  data: D;\n\n  serialize(): string;\n\n  build(input: { suiGrpcClient: SuiGrpcClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction>;\n}\n\nexport abstract class BaseIntentionGrpc<D> implements TransactionIntentionGrpc<D> {\n  abstract txType: TransactionType;\n\n  abstract txSubType: string;\n\n  protected constructor(public readonly data: D) {}\n\n  abstract build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction>;\n\n  serialize() {\n    return JSON.stringify(sortKeys(this.data));\n  }\n}\n","import { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '../types';\n\nexport const getClmmSdk = async (network: SuiNetworks, account: WalletAccount, suiGrpcClient: SuiGrpcClient) => {\n  const { CetusClmmSDK } = await import('@cetusprotocol/sui-clmm-sdk');\n  const clmmSdk = CetusClmmSDK.createSDK({\n    env: 'mainnet',\n    sui_grpc_client: suiGrpcClient,\n  });\n  clmmSdk.setSenderAddress(account.address);\n  return clmmSdk;\n};\n\nexport const getFarmsSdk = async (network: SuiNetworks, account: WalletAccount, suiGrpcClient: SuiGrpcClient) => {\n  const { CetusFarmsSDK } = await import('@cetusprotocol/farms-sdk');\n  const farmsSdk = CetusFarmsSDK.createSDK({\n    env: 'mainnet',\n    sui_grpc_client: suiGrpcClient,\n  });\n  farmsSdk.setSenderAddress(account.address);\n  return farmsSdk;\n};\n\nconst aggregatorURL = 'https://api-sui.cetus.zone/router_v2/find_routes';\nexport const getAggregatorSdk = async (network: SuiNetworks, account: WalletAccount, suiGrpcClient: SuiGrpcClient) => {\n  const { AggregatorClient, Env } = await import('@cetusprotocol/aggregator-sdk');\n  const aggregatorSdk = new AggregatorClient({\n    endpoint: aggregatorURL,\n    signer: account.address,\n    // The aggregator SDK bundles a patch-level-different @mysten/sui copy.\n    // Both clients are runtime-compatible, but private fields make their types nominally incompatible.\n    client: suiGrpcClient as never,\n    env: Env.Mainnet,\n  });\n\n  return aggregatorSdk;\n};\n\nexport const getVaultsSdk = async (network: SuiNetworks, account: WalletAccount, suiGrpcClient: SuiGrpcClient) => {\n  const { CetusVaultsSDK } = await import('@cetusprotocol/vaults-sdk');\n  const vaultsSDK = CetusVaultsSDK.createSDK({\n    env: 'mainnet',\n    sui_grpc_client: suiGrpcClient,\n  });\n  vaultsSDK.setSenderAddress(account.address);\n  return vaultsSDK;\n};\n\nexport const getXcetusSdk = async (network: SuiNetworks, account: WalletAccount, suiGrpcClient: SuiGrpcClient) => {\n  const { CetusXcetusSDK } = await import('@cetusprotocol/xcetus-sdk');\n  const xcetusSDk = CetusXcetusSDK.createSDK({\n    env: 'mainnet',\n    sui_grpc_client: suiGrpcClient,\n  });\n  xcetusSDk.setSenderAddress(account.address);\n  return xcetusSDk;\n};\n","import { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getClmmSdk } from './config';\n\nexport const getCreatePoolTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const clmmSdk = await getClmmSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await clmmSdk.Pool.createPoolPayload(txbParams);\n  return txb;\n};\n\nexport const getAddLiquidityTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const clmmSdk = await getClmmSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await clmmSdk.Position.createAddLiquidityFixTokenPayload(txbParams?.parameter);\n  return txb;\n};\n\nexport const getIncreaseLiquidityTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const clmmSdk = await getClmmSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await clmmSdk.Position.createAddLiquidityFixTokenPayload(txbParams?.parameter);\n  return txb;\n};\n\nexport const getRemoveLiquidityTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const clmmSdk = await getClmmSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await clmmSdk.Position.closePositionPayload(txbParams);\n  return txb;\n};\n\nexport const getDecreaseLiquidityTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const clmmSdk = await getClmmSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await clmmSdk.Position.removeLiquidityPayload(txbParams);\n  return txb;\n};\n\nexport const getClaimFeeAndMiningTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const clmmSdk = await getClmmSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await clmmSdk.Rewarder.collectRewarderPayload(txbParams);\n  return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getClaimFeeAndMiningTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class ClaimFeeAndMiningIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.ClaimFeeAndMining;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getClaimFeeAndMiningTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new ClaimFeeAndMiningIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getCreatePoolTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class CreatePoolIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.CreatePool;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getCreatePoolTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new CreatePoolIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getDecreaseLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class DecreaseLiquidityIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.DecreaseLiquidity;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getDecreaseLiquidityTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new DecreaseLiquidityIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingAddLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingAddLiquidityIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.FarmingOpenAndAddLiquidity;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getFarmingAddLiquidityTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new FarmingAddLiquidityIntention(data);\n  }\n}\n","import { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmsSdk } from './config';\n\nexport const getFarmingAddLiquidityTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const peripherySdk = await getFarmsSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await peripherySdk.Farms.openPositionAddLiquidityStakePayload(txbParams);\n  return txb;\n};\n\nexport const getFarmingIncreaseLiquidityTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const peripherySdk = await getFarmsSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await peripherySdk.Farms.addLiquidityFixCoinPayload(txbParams);\n  return txb;\n};\n\nexport const getFarmingDecreaseLiquidityTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const peripherySdk = await getFarmsSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await peripherySdk.Farms.removeLiquidityPayload(txbParams);\n  return txb;\n};\n\nexport const getFarmingVestDecreaseLiquidityTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const peripherySdk = await getFarmsSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await peripherySdk.Farms.removeAllLiquidityPayload(txbParams);\n  return txb;\n};\n\nexport const getFarmingRemoveLiquidityTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const peripherySdk = await getFarmsSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await peripherySdk.Farms.removeLiquidityPayload(txbParams);\n  return txb;\n};\n\nexport const getFarmingClaimFeeAndRewardTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const peripherySdk = await getFarmsSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await peripherySdk.Farms.claimFeeAndClmmReward(txbParams);\n  return txb;\n};\n\nexport const getFarmingHarvest = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const peripherySdk = await getFarmsSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await peripherySdk.Farms.harvestPayload(txbParams);\n  return txb;\n};\n\nexport const getFarmingBatchHarvest = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const peripherySdk = await getFarmsSdk(network, account, suiGrpcClient);\n  const params: any = Object.values(txbParams);\n  const txb: Transaction = await peripherySdk.Farms.batchHarvestPayload(params);\n  return txb;\n};\n\nexport const getFarmingStake = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const peripherySdk = await getFarmsSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await peripherySdk.Farms.depositPayload(txbParams);\n  return txb;\n};\n\nexport const getFarmingUnstake = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const peripherySdk = await getFarmsSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await peripherySdk.Farms.withdrawPayload(txbParams);\n  return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingBatchHarvest } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingBatchHarvestIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.FarmingBatchHarvest;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getFarmingBatchHarvest(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new FarmingBatchHarvestIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingClaimFeeAndRewardTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingClaimFeeAndRewardIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.FarmingClaimFeeAndReward;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getFarmingClaimFeeAndRewardTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new FarmingClaimFeeAndRewardIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingDecreaseLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingDecreaseLiquidityIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.FarmingDecreaseLiquidity;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getFarmingDecreaseLiquidityTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new FarmingDecreaseLiquidityIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingHarvest } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingHarvestIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.FarmingHarvest;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getFarmingHarvest(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new FarmingHarvestIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingIncreaseLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingIncreaseLiquidityIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.FarmingIncreaseLiquidity;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getFarmingIncreaseLiquidityTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new FarmingIncreaseLiquidityIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingRemoveLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingRemoveLiquidityIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.FarmingRemoveLiquidity;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getFarmingRemoveLiquidityTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new FarmingRemoveLiquidityIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingStake } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingStakeIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.FarmingStake;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getFarmingStake(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new FarmingStakeIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingUnstake } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingUnstakeIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.FarmingUnstake;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getFarmingUnstake(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new FarmingUnstakeIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getIncreaseLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class IncreaseLiquidityIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.IncreaseLiquidity;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getIncreaseLiquidityTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new IncreaseLiquidityIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getPosReedeem } from '../api/posvest';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class PosVestingRedeemIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.PosVestingRedeem;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getPosReedeem(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new PosVestingRedeemIntention(data);\n  }\n}\n","import { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getClmmSdk, getFarmsSdk, getVaultsSdk } from './config';\n\nconst createTransaction = async () => {\n  const { Transaction } = await import('@mysten/sui/transactions');\n  return new Transaction();\n};\n\ntype Transaction = Awaited<ReturnType<typeof createTransaction>>;\n\nexport const getVaultReedeem = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const vaultsSdk = await getVaultsSdk(network, account, suiGrpcClient);\n  const tx = await createTransaction();\n  tx.setSender(account.address);\n  vaultsSdk.Vest.buildRedeemPayload(txbParams.params, tx);\n  return tx;\n};\n\nexport const getVolatileVaultReedeem = async (txbParams: any, account: WalletAccount): Promise<Transaction> => {\n  const { default: VolatileVaultsSDK, vaults_mainnet } = await import('haedal-vault-sdk');\n  const volatileVaultsSdk = new VolatileVaultsSDK(vaults_mainnet);\n  volatileVaultsSdk.senderAddress = account.address;\n  const tx = await createTransaction();\n  tx.setSender(account.address);\n  await volatileVaultsSdk?.Vest.buildRedeemPayload(txbParams.params, tx);\n  return tx;\n};\n\nexport const getClmmPosReedeem = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const clmmSdk = await getClmmSdk(network, account, suiGrpcClient);\n  const tx = await createTransaction();\n  clmmSdk?.Vest.buildRedeemPayload(txbParams.params, tx);\n  return tx;\n};\n\nexport const getFarmsPosReedeem = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const clmmSdk = await getClmmSdk(network, account, suiGrpcClient);\n  const farmsSdk = await getFarmsSdk(network, account, suiGrpcClient);\n  const tx = await createTransaction();\n  const pos = await farmsSdk!.Farms.withdrawReturnPayload(txbParams.withdrawParams, tx);\n  clmmSdk!.Vest.buildRedeemPayload(\n    txbParams.redeemParms.map((item: any) => ({\n      ...item,\n      clmm_position_id: pos,\n    })),\n    tx,\n  );\n  farmsSdk!.Farms.depositPayload(\n    {\n      ...txbParams.depositParams,\n      clmm_position_id: pos,\n    },\n    tx,\n  );\n  return tx;\n};\n\nexport const getPosReedeem = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  if (txbParams.type === 'clmm') {\n    return getClmmPosReedeem(txbParams, account, network, suiGrpcClient);\n  }\n  if (txbParams.type === 'farms') {\n    return getFarmsPosReedeem(txbParams, account, network, suiGrpcClient);\n  }\n  if (txbParams.type === 'vaults') {\n    return getVaultReedeem(txbParams, account, network, suiGrpcClient);\n  }\n  if (txbParams.type === 'haedalVaults') {\n    return getVolatileVaultReedeem(txbParams, account);\n  }\n  return getClmmPosReedeem(txbParams, account, network, suiGrpcClient);\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getRemoveLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class RemoveLiquidityIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.RemoveLiquidity;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getRemoveLiquidityTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new RemoveLiquidityIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getSwapRouterTxb } from '../api/swap';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class SwapIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.Swap;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getSwapRouterTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new SwapIntention(data);\n  }\n}\n","import { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getAggregatorSdk } from './config';\n\nexport const getSwapRouterTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const { restituteMsafeFastRouterSwapParams } = await import('@cetusprotocol/aggregator-sdk');\n  const aggregatorSdk = await getAggregatorSdk(network, account, suiGrpcClient);\n  const txb = new Transaction();\n  await aggregatorSdk.fastRouterSwap({\n    ...txbParams,\n    router: restituteMsafeFastRouterSwapParams(txbParams.router),\n    txb,\n  });\n  return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getAddVaultsPositionPayload } from '../api/vaults';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class AddVaultsPositionIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.AddVaultsPosition;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getAddVaultsPositionPayload(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new AddVaultsPositionIntention(data);\n  }\n}\n","import { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getVaultsSdk } from './config';\n\nexport const getAddVaultsPositionPayload = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const vaultsSdk = await getVaultsSdk(network, account, suiGrpcClient);\n  const tx = new Transaction();\n  tx.setSender(account.address);\n  await vaultsSdk.Vaults.deposit(txbParams, tx);\n  return tx;\n};\n\nexport const getRemoveVaultsPositionPayload = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const vaultsSdk = await getVaultsSdk(network, account, suiGrpcClient);\n  const tx = new Transaction();\n  await vaultsSdk.Vaults.withdraw(txbParams, tx);\n  return tx;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getRemoveVaultsPositionPayload } from '../api/vaults';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class RemoveVaultsPositionIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.RemoveVaultsPosition;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getRemoveVaultsPositionPayload(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new RemoveVaultsPositionIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getVestingRedeemTxb } from '../api/vesting';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class VestingRedeemIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.VestingRedeem;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getVestingRedeemTxb(txbParams, account, network);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new VestingRedeemIntention(data);\n  }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nconst VestingConfing = {\n  package_id: '0x355714a1eeb7ab1d80902da6c92001170cda1212edf524c32aa308a3ac177c31',\n  published_at: '0x355714a1eeb7ab1d80902da6c92001170cda1212edf524c32aa308a3ac177c31',\n  cetus_coin_type: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS',\n};\n\nexport const getVestingRedeemTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n): Promise<Transaction> => {\n  console.log('getVestingRedeemTxb txbParams: ', txbParams);\n  console.log('getVestingRedeemTxb account: ', account);\n  console.log('getVestingRedeemTxb network: ', network);\n  const { pool, nftId, periods, CLOCK_ADDRESS } = txbParams;\n  const txb = new Transaction();\n\n  periods.forEach((period: any) => {\n    txb.moveCall({\n      target: `${VestingConfing.published_at}::router::redeem`,\n      typeArguments: [VestingConfing.cetus_coin_type],\n      arguments: [txb.object(pool), txb.object(nftId), txb.pure(period), txb.object(CLOCK_ADDRESS)],\n    });\n  });\n\n  return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusCancelRedeemTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusCancelIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.xCETUSCancelRedeem;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getXcetusCancelRedeemTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new XcetusCancelIntention(data);\n  }\n}\n","// eslint-disable-next-line import/no-extraneous-dependencies\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusSdk } from './config';\n\nexport const getXcetusConvertTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const xcetusSdk = await getXcetusSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await xcetusSdk.XCetusModule.convertPayload(txbParams);\n  return txb;\n};\n\nexport const getXcetusRedeemLockTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const xcetusSdk = await getXcetusSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await xcetusSdk.XCetusModule.redeemLockPayload(txbParams);\n  return txb;\n};\n\nexport const getXcetusClaimingStakeRewardsTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const xcetusSdk = await getXcetusSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await xcetusSdk.XCetusModule.redeemDividendV3Payload(\n    txbParams.veNftId,\n    txbParams.rewardList,\n  );\n  return txb;\n};\n\nexport const getXcetusCancelRedeemTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const xcetusSdk = await getXcetusSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await xcetusSdk.XCetusModule.cancelRedeemPayload(txbParams);\n  return txb;\n};\n\nexport const getXcetusRedeemTxb = async (\n  txbParams: any,\n  account: WalletAccount,\n  network: SuiNetworks,\n  suiGrpcClient: SuiGrpcClient,\n): Promise<Transaction> => {\n  const xcetusSdk = await getXcetusSdk(network, account, suiGrpcClient);\n  const txb: Transaction = await xcetusSdk.XCetusModule.redeemPayload(txbParams);\n  return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusClaimingStakeRewardsTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusClaimingStakeRewardsIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.xCETUSClaimStakingRwewards;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getXcetusClaimingStakeRewardsTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new XcetusClaimingStakeRewardsIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusConvertTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusConvertIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.xCETUSConvert;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getXcetusConvertTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new XcetusConvertIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusRedeemTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusRedeemIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.xCETUSRedeem;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getXcetusRedeemTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new XcetusRedeemIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusRedeemLockTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusRedeemLockIntention extends BaseIntentionGrpc<CetusIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.xCETUSRedeemLock;\n\n  constructor(public override readonly data: CetusIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    const { txbParams } = this.data;\n    const txb = await getXcetusRedeemLockTxb(txbParams, account, network, suiGrpcClient);\n    return txb;\n  }\n\n  static fromData(data: CetusIntentionData) {\n    return new XcetusRedeemLockIntention(data);\n  }\n}\n","import { CancelStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class CancelStreamIntention extends StreamIntention<CancelStreamIntentionData> {\n  txType = TransactionType.Stream;\n\n  txSubType = StreamTransactionType.CANCEL;\n\n  constructor(public readonly data: CancelStreamIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const { network, account, suiGrpcClient } = input;\n    const mpayClient = this.getClient(network, account, suiGrpcClient);\n    const stream = await mpayClient.getStream(this.data.streamId);\n    return stream.cancel();\n  }\n}\n","// gRPC-backed client exports with legacy SuiClient names for app-store helpers.\n// Public JSON-RPC fullnodes are deprecated; runtime traffic goes through SuiGrpcClient.\nimport { SuiGrpcClient, isSuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { getFullnodeUrl, type SuiNetworkName } from '@/lib/suiGrpcClient';\nimport type { DevInspectResults, PaginatedCoins } from '@/lib/suiTypes';\n\nexport { getFullnodeUrl, toSuiNetworkName, type SuiNetworkName } from '@/lib/suiGrpcClient';\n\nexport { isSuiGrpcClient as isSuiClient };\n\nexport type {\n  CoinStruct,\n  DevInspectResults,\n  PaginatedCoins,\n  SuiObjectRef,\n  SuiObjectResponse,\n  SuiObjectData,\n  SuiParsedData,\n  CoinBalance,\n} from '@/lib/suiTypes';\n\nexport type SuiClientOptions = {\n  network?: SuiNetworkName;\n  /** @deprecated Prefer baseUrl. Accepted for existing call sites. */\n  url?: string;\n  baseUrl?: string;\n};\n\n/**\n * SuiClient backed by gRPC, with a few legacy-shaped helpers still used by apps\n * (getCoins, devInspectTransactionBlock) until those call sites migrate fully.\n */\nfunction inferNetworkFromUrl(url?: string): SuiNetworkName {\n  if (!url) return 'mainnet';\n  if (url.includes('testnet')) return 'testnet';\n  if (url.includes('devnet')) return 'devnet';\n  if (url.includes('127.0.0.1') || url.includes('localhost')) return 'localnet';\n  return 'mainnet';\n}\n\nexport class SuiClient extends SuiGrpcClient {\n  constructor(options: SuiClientOptions) {\n    const baseUrl = options.baseUrl ?? options.url ?? getFullnodeUrl(options.network ?? 'mainnet');\n    super({\n      network: options.network ?? inferNetworkFromUrl(baseUrl),\n      baseUrl,\n    });\n  }\n\n  async getCoins(input: {\n    owner: string;\n    coinType?: string;\n    cursor?: string | null;\n    limit?: number;\n  }): Promise<PaginatedCoins> {\n    const response = await this.listCoins({\n      owner: input.owner,\n      coinType: input.coinType,\n      cursor: input.cursor ?? undefined,\n      limit: input.limit,\n    });\n\n    return {\n      data: response.objects.map((coin) => ({\n        coinType: coin.type,\n        coinObjectId: coin.objectId,\n        version: coin.version,\n        digest: coin.digest,\n        balance: coin.balance,\n        previousTransaction: '0x0',\n      })),\n      hasNextPage: response.hasNextPage,\n      nextCursor: response.cursor,\n    };\n  }\n\n  /**\n   * Legacy JSON-RPC-shaped getOwnedObjects for third-party SDKs (e.g. bucket-protocol-sdk).\n   * Backed by gRPC listOwnedObjects.\n   */\n  async getOwnedObjects(input: {\n    owner: string;\n    cursor?: string | null;\n    limit?: number | null;\n    filter?: { StructType?: string; Package?: string; MatchAll?: unknown[]; MatchAny?: unknown[] } | null;\n    options?: { showContent?: boolean; showType?: boolean; showDisplay?: boolean; showOwner?: boolean } | null;\n  }) {\n    const structType = input.filter && 'StructType' in input.filter ? input.filter.StructType : undefined;\n\n    const response = await this.listOwnedObjects({\n      owner: input.owner,\n      type: structType,\n      cursor: input.cursor ?? undefined,\n      limit: input.limit ?? undefined,\n      include: {\n        content: !!input.options?.showContent,\n        json: !!input.options?.showContent,\n        type: true,\n      },\n    });\n\n    return {\n      data: response.objects.map((object) => ({\n        data: {\n          objectId: object.objectId,\n          version: object.version,\n          digest: object.digest,\n          type: object.type,\n          owner: object.owner,\n          content: object.json\n            ? {\n                dataType: 'moveObject' as const,\n                type: object.type,\n                fields: object.json,\n                hasPublicTransfer: false,\n              }\n            : object.content\n              ? {\n                  dataType: 'moveObject' as const,\n                  type: object.type,\n                  fields: object.content,\n                  hasPublicTransfer: false,\n                }\n              : undefined,\n        },\n      })),\n      hasNextPage: response.hasNextPage,\n      nextCursor: response.cursor,\n    };\n  }\n\n  async devInspectTransactionBlock(input: {\n    sender: string;\n    transactionBlock: Transaction | Uint8Array | string;\n  }): Promise<DevInspectResults> {\n    const tx =\n      typeof input.transactionBlock === 'object' &&\n      input.transactionBlock !== null &&\n      'setSenderIfNotSet' in input.transactionBlock\n        ? (input.transactionBlock as Transaction)\n        : Transaction.from(input.transactionBlock as Uint8Array | string);\n\n    tx.setSenderIfNotSet(input.sender);\n\n    const result = await this.simulateTransaction({\n      transaction: tx,\n      checksEnabled: false,\n      include: {\n        effects: true,\n        events: true,\n        commandResults: true,\n      },\n    });\n\n    const transaction = result.$kind === 'Transaction' ? result.Transaction : result.FailedTransaction;\n    const success = transaction.effects?.status?.success ?? false;\n\n    return {\n      error: success ? null : (transaction.effects?.status?.error?.message ?? 'Simulation failed'),\n      effects: {\n        status: {\n          status: success ? 'success' : 'failure',\n          error: transaction.effects?.status?.error?.message,\n        },\n      },\n      events: (transaction.events ?? []).map((event) => ({\n        type: event.eventType,\n        parsedJson: event.json,\n        packageId: event.packageId,\n        transactionModule: event.module,\n        sender: event.sender,\n        bcs: '',\n        id: { txDigest: '', eventSeq: '0' },\n      })),\n      results: result.commandResults?.map((commandResult) => ({\n        returnValues: commandResult.returnValues.map((value) => [Array.from(value.bcs), 'u64'] as [number[], string]),\n      })),\n    };\n  }\n}\n","import { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport type { DevInspectResults, PaginatedCoins } from '@/lib/suiTypes';\nimport { SuiNetworks } from '@/types';\n\nexport type SuiNetworkName = 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n\nconst NETWORK_MAP: Record<SuiNetworks, SuiNetworkName> = {\n  'sui:mainnet': 'mainnet',\n  'sui:testnet': 'testnet',\n  'sui:devnet': 'devnet',\n  'sui:localnet': 'localnet',\n};\n\nexport function toSuiNetworkName(network: SuiNetworks): SuiNetworkName {\n  return NETWORK_MAP[network];\n}\n\n/** Default fullnode base URLs (same hosts as former JSON-RPC helpers; used for gRPC). */\nexport function getFullnodeUrl(network: SuiNetworkName): string {\n  switch (network) {\n    case 'mainnet':\n      return 'https://fullnode.mainnet.sui.io:443';\n    case 'testnet':\n      return 'https://fullnode.testnet.sui.io:443';\n    case 'devnet':\n      return 'https://fullnode.devnet.sui.io:443';\n    case 'localnet':\n      return 'http://127.0.0.1:9000';\n    default:\n      throw new Error(`Unknown network: ${network}`);\n  }\n}\n\nexport type MsafeSuiGrpcClient = SuiGrpcClient & {\n  getCoins(input: {\n    owner: string;\n    coinType?: string;\n    cursor?: string | null;\n    limit?: number;\n  }): Promise<PaginatedCoins>;\n  devInspectTransactionBlock(input: {\n    sender: string;\n    transactionBlock: Transaction | Uint8Array | string;\n  }): Promise<DevInspectResults>;\n};\n\nfunction attachMsafeGrpcHelpers(client: SuiGrpcClient): MsafeSuiGrpcClient {\n  return Object.assign(client, {\n    async getCoins(input: {\n      owner: string;\n      coinType?: string;\n      cursor?: string | null;\n      limit?: number;\n    }): Promise<PaginatedCoins> {\n      const response = await client.listCoins({\n        owner: input.owner,\n        coinType: input.coinType,\n        cursor: input.cursor ?? undefined,\n        limit: input.limit,\n      });\n\n      return {\n        data: response.objects.map((coin) => ({\n          coinType: coin.type,\n          coinObjectId: coin.objectId,\n          version: coin.version,\n          digest: coin.digest,\n          balance: coin.balance,\n          previousTransaction: '0x0',\n        })),\n        hasNextPage: response.hasNextPage,\n        nextCursor: response.cursor,\n      };\n    },\n\n    async devInspectTransactionBlock(input: {\n      sender: string;\n      transactionBlock: Transaction | Uint8Array | string;\n    }): Promise<DevInspectResults> {\n      const tx =\n        typeof input.transactionBlock === 'object' &&\n        input.transactionBlock !== null &&\n        'setSenderIfNotSet' in input.transactionBlock\n          ? (input.transactionBlock as Transaction)\n          : Transaction.from(input.transactionBlock as Uint8Array | string);\n\n      tx.setSenderIfNotSet(input.sender);\n\n      const result = await client.simulateTransaction({\n        transaction: tx,\n        checksEnabled: false,\n        include: {\n          effects: true,\n          events: true,\n          commandResults: true,\n        },\n      });\n\n      const transaction = result.$kind === 'Transaction' ? result.Transaction : result.FailedTransaction;\n      const success = transaction.effects?.status?.success ?? false;\n\n      return {\n        error: success ? null : (transaction.effects?.status?.error?.message ?? 'Simulation failed'),\n        effects: {\n          status: {\n            status: success ? 'success' : 'failure',\n            error: transaction.effects?.status?.error?.message,\n          },\n        },\n        events: (transaction.events ?? []).map((event) => ({\n          type: event.eventType,\n          parsedJson: event.json,\n          packageId: event.packageId,\n          transactionModule: event.module,\n          sender: event.sender,\n          bcs: '',\n          id: { txDigest: '', eventSeq: '0' },\n        })),\n        results: result.commandResults?.map((commandResult) => ({\n          returnValues: commandResult.returnValues.map((value) => [Array.from(value.bcs), 'u64'] as [number[], string]),\n        })),\n      };\n    },\n  });\n}\n\nexport function getSuiGrpcClient(network: SuiNetworks, baseUrl?: string): MsafeSuiGrpcClient {\n  const networkName = toSuiNetworkName(network);\n  const client = new SuiGrpcClient({\n    network: networkName,\n    baseUrl: baseUrl ?? getFullnodeUrl(networkName),\n  });\n\n  return attachMsafeGrpcHelpers(client);\n}\n","{\n  \"transaction\": \"DiBZq4UmVVYiRL6ZJmFKYoHcxtxqrhsCXSkFyT7wUr3j\",\n  \"status\": \"success\",\n  \"contractId\": \"0x81c960dc653975fbd0072deca8afb92d322898c911622898ba1b2e3ad0c4bd8d\",\n  \"roleObjId\": \"0xc6ec0bdee0bb59a72077e9acd2f42457043cf47080b3d3fad4d39abf28bba63a\",\n  \"vaultObjId\": \"0xbc4021387fbac149119fd24e92be9e58f745774292f3a2a12e2ac6daf5363e1d\",\n  \"feeObjId\": \"0x4178f63970fe2daeb256dc5730ad172e82b3e8eb45f31b33e0daae72cd35e1e1\",\n  \"upgradeCapObjId\": \"0xe1e9aa7d222d151bfe6dd83358b0d7fdcb11260f710800cfaf7ccc1b1e245115\"\n}","{\n  \"transaction\": \"855FNDV8o8Z3fWULPnQo9qdhLJpsg7wZrkCpNyfw9KfB\",\n  \"status\": \"success\",\n  \"contractId\": \"0xc357c3985e8fb875d6b37141497af660779aa1bab0ec489b2213efd74067d1fa\",\n  \"roleObjId\": \"0x5ab49bdf9fd1413e328ef242b3f8d83dde791b38a0b627bfc87fb25c010d34f1\",\n  \"vaultObjId\": \"0xb483558770d8eb26007f193b75db40f0a45f2e36863a687625885d4de6993378\",\n  \"feeObjId\": \"0x48453fc4d7cde3fe35aad89e5dfb496608a6a55ea529a1c0274681a808627f94\",\n  \"upgradeCapObjId\": \"0x34279779a0d0d36bd5044b04830d607fa1b0ecf316548c8ac3a44151e4f1a42a\"\n}","import type { SuiGrpcClient } from '@mysten/sui/grpc';\n\nimport { getFullnodeUrl } from '@/compat/mysten-sui-json-rpc';\n\nimport * as devContractConfig from '../config/dev.json';\nimport * as prodContractConfig from '../config/prod.json';\n\nexport enum Env {\n  dev = 'dev',\n  stg = 'stg',\n  prev = 'prev',\n  prod = 'prod',\n}\n\nexport interface EnvConfig {\n  env: Env;\n  rpc: SuiConfig;\n  backend: BackendConfig;\n  contract: ContractConfig;\n}\n\nexport interface EnvConfigOptions {\n  rpc?: SuiConfig;\n  backend?: BackendConfig;\n  contract?: ContractConfig;\n  suiGrpcClient?: SuiGrpcClient;\n}\n\nexport interface BackendConfig {\n  url: string;\n}\n\nexport interface SuiConfig {\n  url: string;\n}\n\nexport interface ContractConfig {\n  contractId: string;\n  roleObjId: string;\n  vaultObjId: string;\n  feeObjId: string;\n}\n\nexport const DEV_RPC_ENDPOINT = getFullnodeUrl('testnet');\nexport const STG_RPC_ENDPOINT = getFullnodeUrl('testnet');\nexport const PREV_RPC_ENDPOINT = getFullnodeUrl('mainnet');\nexport const PROD_RPC_ENDPOINT = getFullnodeUrl('mainnet');\n\nexport const DEV_BE_API = 'https://bc3p6l5unl.execute-api.us-west-1.amazonaws.com/prod';\nexport const STG_BE_API = 'https://rolsbkota7.execute-api.us-west-1.amazonaws.com/prod';\nexport const PREV_BE_API = 'https://6p6mkx33ne.execute-api.us-west-1.amazonaws.com/prod';\nexport const PROD_BE_API = 'https://xrae3mrjv5.execute-api.us-west-1.amazonaws.com/prod';\n\nexport const CONTRACT_DEV: ContractConfig = devContractConfig;\nexport const CONTRACT_PROD: ContractConfig = prodContractConfig;\n\nconst ENV_CONFIG: Map<Env, EnvConfig> = new Map([\n  [\n    Env.dev,\n    {\n      env: Env.dev,\n      rpc: {\n        url: DEV_RPC_ENDPOINT,\n      },\n      backend: {\n        url: DEV_BE_API,\n      },\n      contract: CONTRACT_DEV,\n    },\n  ],\n  [\n    Env.stg,\n    {\n      env: Env.stg,\n      rpc: {\n        url: STG_RPC_ENDPOINT,\n      },\n      backend: {\n        url: STG_BE_API,\n      },\n      contract: CONTRACT_DEV,\n    },\n  ],\n  [\n    Env.prev,\n    {\n      env: Env.prev,\n      rpc: {\n        url: PREV_RPC_ENDPOINT,\n      },\n      backend: {\n        url: PREV_BE_API,\n      },\n      contract: CONTRACT_PROD,\n    },\n  ],\n  [\n    Env.prod,\n    {\n      env: Env.prod,\n      rpc: {\n        url: PROD_RPC_ENDPOINT,\n      },\n      backend: {\n        url: PROD_BE_API,\n      },\n      contract: CONTRACT_PROD,\n    },\n  ],\n]);\n\nexport function getConfig(env: Env, options?: EnvConfigOptions): EnvConfig {\n  const ec = ENV_CONFIG.get(env);\n  if (!ec) {\n    throw new Error(`Env not supported: ${env}`);\n  }\n  if (options && options.rpc) {\n    ec.rpc = options.rpc;\n  }\n  if (options && options.backend) {\n    ec.backend = options.backend;\n  }\n  if (options && options.contract) {\n    ec.contract = options.contract;\n  }\n  return ec;\n}\n","export enum MPayErrorCode {\n  sanity,\n  walletNotConnected,\n  InvalidInput,\n  InvalidRpcResult,\n  NotEnoughBalance,\n  StreamNotFound,\n  RpcError,\n  NotCreator,\n  NotRecipient,\n  InvalidStreamGroup,\n  BackendError,\n  NoBackend,\n  TransactionFailed,\n}\n\nexport type JsonObject =\n  | string\n  | number\n  | bigint\n  | boolean\n  | null\n  | undefined\n  | readonly JsonObject[]\n  | { readonly [key: string]: JsonObject }\n  | { toJSON(): JsonObject };\n\nexport class MPayError extends Error {\n  public readonly mpayErrorCode: number;\n\n  public readonly context?: JsonObject;\n\n  constructor(mpayErrorCode: number, msg: string, options: { cause?: unknown; context?: JsonObject } = {}) {\n    const { cause, context } = options;\n    if (cause) {\n      super(`[MPay] ${msg}: ${cause}`);\n    } else {\n      super(`[MPay] ${msg}`);\n    }\n    this.mpayErrorCode = mpayErrorCode;\n    this.context = context;\n  }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NoBackendError extends MPayError {\n  constructor() {\n    super(MPayErrorCode.NoBackend, 'Backend is not specified');\n  }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class WalletNotConnectedError extends MPayError {\n  constructor() {\n    super(MPayErrorCode.walletNotConnected, 'Wallet not connected');\n  }\n}\n","import axios, { AxiosError, AxiosResponse } from 'axios';\n\nimport { BackendError } from '../error/BackendError';\nimport {\n  IBackend,\n  BackendIncomingStreamFilterOptions,\n  StreamRef,\n  BackendOutgoingStreamFilterOptions,\n  StreamFilterStatus,\n} from '../types/backend';\nimport { StreamEvent } from '../types/events';\nimport { PaginationOptions, Paginated } from '../types/pagination';\n\nexport class Backend implements IBackend {\n  constructor(private apiURL: string) {}\n\n  private static parseResponseData(response: AxiosError | AxiosResponse) {\n    if (response instanceof AxiosError) {\n      throw new BackendError(response.response?.statusText as string);\n    }\n    if (response.status === 200) {\n      if (response.data.success) {\n        return response.data.data;\n      }\n      throw new BackendError(response.data.code);\n    }\n    throw new BackendError(response.status.toString());\n  }\n\n  async getIncomingStreams(recipient: string, options?: BackendIncomingStreamFilterOptions): Promise<StreamRef[]> {\n    const res = await axios.post(`${this.apiURL}/stream`, {\n      recipient,\n      ...options,\n    });\n    return Backend.parseResponseData(res) as StreamRef[];\n  }\n\n  async getOutgoingStreams(sender: string, options?: BackendOutgoingStreamFilterOptions): Promise<StreamRef[]> {\n    const res = await axios.post(`${this.apiURL}/stream`, {\n      sender,\n      ...options,\n    });\n    return Backend.parseResponseData(res);\n  }\n\n  async getStreamHistory(query: {\n    streamId?: string;\n    groupId?: string;\n    pagination?: PaginationOptions;\n  }): Promise<Paginated<StreamEvent>> {\n    const res = await axios.post(`${this.apiURL}/stream-events`, query);\n    const paginatedData = Backend.parseResponseData(res);\n    paginatedData.data.forEach((event: StreamEvent) => {\n      const formalizedEvent = event;\n      if (formalizedEvent.data.type === 'create_stream') {\n        formalizedEvent.data.balance = BigInt(formalizedEvent.data.balance);\n      } else if (formalizedEvent.data.type === 'cancel_stream') {\n        formalizedEvent.data.withdrawAmount = BigInt(formalizedEvent.data.withdrawAmount);\n      } else if (formalizedEvent.data.type === 'claim' || formalizedEvent.data.type === 'auto_claim') {\n        formalizedEvent.data.claimAmount = BigInt(formalizedEvent.data.claimAmount);\n      } else if (formalizedEvent.data.type === 'set_auto_claim') {\n        formalizedEvent.data.enabled = !!formalizedEvent.data.enabled;\n      }\n      formalizedEvent.createdAt = new Date(formalizedEvent.createdAt);\n      return formalizedEvent;\n    });\n\n    return paginatedData;\n  }\n\n  async getAllCoinTypes(address: string): Promise<string[]> {\n    const res = await axios.post(`${this.apiURL}/stream-info`, { address });\n    return Backend.parseResponseData(res);\n  }\n\n  async getAllRecipients(sender: string, options?: StreamFilterStatus): Promise<string[]> {\n    const res = await axios.post(`${this.apiURL}/stream-info`, { sender, status: options });\n    return Backend.parseResponseData(res);\n  }\n\n  async getAllSenders(recipient: string, options?: StreamFilterStatus): Promise<string[]> {\n    const res = await axios.post(`${this.apiURL}/stream-info`, { recipient, status: options });\n    return Backend.parseResponseData(res);\n  }\n}\n","import { JsonObject, MPayError, MPayErrorCode } from './base';\n\nexport class BackendError extends MPayError {\n  constructor(msg: string, context?: JsonObject) {\n    super(MPayErrorCode.BackendError, msg, { context });\n  }\n}\n","import type { SuiGrpcClient } from '@mysten/sui/grpc';\n\nimport { getSuiGrpcClient, MsafeSuiGrpcClient } from '@/lib/suiGrpcClient';\nimport { SuiNetworks } from '@/types';\n\nimport { EnvConfig, Env, EnvConfigOptions, getConfig } from './env';\nimport { NoBackendError } from '../error/NoBackendError';\nimport { WalletNotConnectedError } from '../error/WalletNotConnectedError';\nimport { Backend } from '../stream/backend';\nimport { IBackend } from '../types/backend';\nimport { IWallet, WalletType } from '../types/wallet';\n\nconst ENV_NETWORK: Record<Env, SuiNetworks> = {\n  [Env.dev]: 'sui:testnet',\n  [Env.stg]: 'sui:testnet',\n  [Env.prev]: 'sui:mainnet',\n  [Env.prod]: 'sui:mainnet',\n};\n\nexport class Globals {\n  public signer: IWallet | undefined;\n\n  public readonly suiClient: MsafeSuiGrpcClient;\n\n  public readonly envConfig: EnvConfig;\n\n  public _backend?: IBackend;\n\n  constructor(envConfig: EnvConfig, suiGrpcClient?: SuiGrpcClient) {\n    this.envConfig = envConfig;\n    this.suiClient =\n      (suiGrpcClient as MsafeSuiGrpcClient | undefined) ??\n      getSuiGrpcClient(ENV_NETWORK[envConfig.env], envConfig.rpc.url);\n    if (envConfig.backend) {\n      this._backend = new Backend(envConfig.backend.url);\n    }\n  }\n\n  static new(env: Env, options?: EnvConfigOptions) {\n    const ec = getConfig(env, options);\n    return new Globals(ec, options?.suiGrpcClient);\n  }\n\n  get walletType(): WalletType | 'disconnected' {\n    if (!this.wallet) {\n      return 'disconnected';\n    }\n    return this.wallet.type;\n  }\n\n  get backend(): IBackend {\n    if (!this._backend) {\n      throw new NoBackendError();\n    }\n    return this._backend;\n  }\n\n  // Used for test cases\n  set backend(b: IBackend) {\n    this._backend = b;\n  }\n\n  connectWallet(wallet: IWallet) {\n    this.signer = wallet;\n  }\n\n  disconnect() {\n    this.signer = undefined;\n  }\n\n  get wallet(): IWallet {\n    if (!this.signer) {\n      throw new WalletNotConnectedError();\n    }\n    return this.signer;\n  }\n\n  async walletAddress() {\n    return this.wallet.address();\n  }\n}\n","import { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SUI_TYPE_ARG, normalizeStructTag, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport type { MsafeSuiGrpcClient } from '@/lib/suiGrpcClient';\n\nimport { MPayBuilder } from '../builder/MPayBuilder';\nimport { Env, EnvConfigOptions, Globals } from '../common';\nimport { MPayHelper } from './helper';\nimport { PagedStreamListIterator } from './query';\nimport { Stream } from './Stream';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { SanityError } from '../error/SanityError';\nimport { getCoinsWithAmount } from '../sui/iterator/coin';\nimport { isSameCoinType } from '../sui/utils';\nimport { StreamFilterStatus } from '../types/backend';\nimport {\n  CreateStreamInfo,\n  IMPayClient,\n  IPagedStreamListIterator,\n  IncomingStreamQuery,\n  OutgoingStreamQuery,\n} from '../types/client';\nimport {\n  CoinRequest,\n  CoinRequestResponse,\n  GAS_OBJECT_SPEC,\n  IMSafeAccount,\n  ISingleWallet,\n  IWallet,\n  WalletType,\n} from '../types/wallet';\n\nexport class MSafeAccountAdapter implements IWallet {\n  constructor(private readonly msafe: IMSafeAccount) {}\n\n  get type() {\n    return WalletType.msafe;\n  }\n\n  async address() {\n    return this.msafe.address();\n  }\n\n  async requestCoins(reqs: CoinRequest[]): Promise<CoinRequestResponse[]> {\n    return this.msafe.requestCoins(reqs);\n  }\n}\n\nexport class MSafeSingleWallet {\n  constructor(private account: WalletAccount) {}\n\n  async address(): Promise<string> {\n    return this.account.address;\n  }\n}\n\nexport class SingleWalletAdapter implements IWallet {\n  constructor(\n    private readonly singleWallet: ISingleWallet,\n    private readonly suiClient: MsafeSuiGrpcClient,\n  ) {}\n\n  get type() {\n    return WalletType.single;\n  }\n\n  async address() {\n    return this.singleWallet.address();\n  }\n\n  async requestCoins(reqs: CoinRequest[]): Promise<CoinRequestResponse[]> {\n    return Promise.all(reqs.map((req) => this.requestCoin(req)));\n  }\n\n  async requestCoin(req: CoinRequest): Promise<CoinRequestResponse> {\n    if (isSameCoinType(req.coinType, SUI_TYPE_ARG)) {\n      return {\n        primaryCoin: GAS_OBJECT_SPEC,\n      };\n    }\n    if (req.amount <= 0) {\n      throw new InvalidInputError('Invalid coin request', 'coinAmount', req.amount);\n    }\n    const coins = await getCoinsWithAmount(this.suiClient, await this.address(), req.amount, req.coinType);\n    if (coins.length === 0) {\n      throw new SanityError('no coins available');\n    }\n    return {\n      primaryCoin: coins[0].coinObjectId,\n      mergedCoins: coins.slice(1).map((coin) => coin.coinObjectId),\n    };\n  }\n}\n\nexport class MPayClient implements IMPayClient {\n  public readonly globals: Globals;\n\n  public readonly helper: MPayHelper;\n\n  constructor(env: Env, options?: EnvConfigOptions) {\n    this.globals = Globals.new(env, options);\n    this.helper = new MPayHelper(this.globals);\n  }\n\n  connectSingleWallet(wallet: ISingleWallet) {\n    const adapter = new SingleWalletAdapter(wallet, this.globals.suiClient);\n    this.globals.connectWallet(adapter);\n  }\n\n  connectMSafeAccount(msafe: IMSafeAccount) {\n    const adapter = new MSafeAccountAdapter(msafe);\n    this.globals.connectWallet(adapter);\n  }\n\n  async createStream(info: CreateStreamInfo): Promise<Transaction> {\n    return this.builder().createStreams(info);\n  }\n\n  async getStream(streamId: string) {\n    return Stream.new(this.globals, streamId);\n  }\n\n  async getIncomingStreams(query?: IncomingStreamQuery, pageSize = 10): Promise<IPagedStreamListIterator> {\n    return PagedStreamListIterator.newIncoming({\n      globals: this.globals,\n      query,\n      pageSize,\n    });\n  }\n\n  async getOutgoingStreams(query?: OutgoingStreamQuery, pageSize = 10): Promise<IPagedStreamListIterator> {\n    return PagedStreamListIterator.newOutgoing({\n      globals: this.globals,\n      query,\n      pageSize,\n    });\n  }\n\n  async getCoinTypesForStreamFilter(): Promise<string[]> {\n    const address = await this.wallet.address();\n    const coinTypes = await this.globals.backend.getAllCoinTypes(address);\n    return coinTypes.map((coinType) => normalizeStructTag(coinType));\n  }\n\n  async getRecipientsForStreamFilter(options?: StreamFilterStatus): Promise<string[]> {\n    const address = await this.wallet.address();\n    const recipients = await this.globals.backend.getAllRecipients(address, options);\n    return recipients.map((recipient) => normalizeSuiAddress(recipient));\n  }\n\n  async getCreatorsForStreamFilter(options?: StreamFilterStatus): Promise<string[]> {\n    const address = await this.wallet.address();\n    const creators = await this.globals.backend.getAllSenders(address, options);\n    return creators.map((creator) => normalizeSuiAddress(creator));\n  }\n\n  get wallet() {\n    return this.globals.wallet;\n  }\n\n  private builder() {\n    return new MPayBuilder(this.globals);\n  }\n}\n\nexport type { SuiGrpcClient };\n","import { Transaction } from '@mysten/sui/transactions';\n\nimport { CreateStreamHelper } from './CreateStreamHelper';\nimport { Globals } from '../common';\nimport { FeeContract } from '../contract/FeeContract';\nimport { StreamContract } from '../contract/StreamContract';\nimport { CreateStreamInfo } from '../types/client';\n\n// TODO: add vault and admin control related code.\nexport class MPayBuilder {\n  private readonly feeContract: FeeContract;\n\n  private readonly streamContract: StreamContract;\n\n  constructor(public readonly globals: Globals) {\n    const config = globals.envConfig.contract;\n    this.feeContract = new FeeContract(config, globals);\n    this.streamContract = new StreamContract(config, globals);\n  }\n\n  async createStreams(info: CreateStreamInfo) {\n    const infoInternal = CreateStreamHelper.convertCreateStreamInfoToInternal(info);\n    return this.createStreamHelper().buildCreateStreamTransactionBlock(infoInternal);\n  }\n\n  createStreamHelper() {\n    return new CreateStreamHelper(this.globals, this.feeContract, this.streamContract);\n  }\n\n  setAutoClaim(streamId: string, enabled: boolean, coinType: string) {\n    const txb = new Transaction();\n    return this.streamContract.setAutoClaim(txb, {\n      streamId,\n      enabled,\n      coinType,\n    });\n  }\n\n  claimStream(streamId: string, coinType: string) {\n    const txb = new Transaction();\n    return this.streamContract.claimStream(txb, {\n      streamId,\n      coinType,\n    });\n  }\n\n  claimStreamByProxy(streamId: string, coinType: string) {\n    const txb = new Transaction();\n    return this.streamContract.claimStreamByProxy(txb, {\n      streamId,\n      coinType,\n    });\n  }\n\n  cancelStream(streamId: string, coinType: string) {\n    const txb = new Transaction();\n    this.streamContract.cancelStream(txb, {\n      streamId,\n      coinType,\n    });\n    return txb;\n  }\n}\n","import { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { SUI_TYPE_ARG, normalizeStructTag } from '@mysten/sui/utils';\n\nimport { CLAIM_FEE_NUMERATOR, FEE_DENOMINATOR, FEE_NUMERATOR, FLAT_FEE_SUI } from './const';\nimport { Globals } from '../common';\nimport { ResultRef } from '../common/transaction';\nimport { FeeContract } from '../contract/FeeContract';\nimport { InspectViewer } from '../contract/InspectViewer';\nimport { StreamContract } from '../contract/StreamContract';\nimport { encodeMetadata } from '../stream/metadata';\nimport { isSameCoinType } from '../sui/utils';\nimport {\n  CreateStreamInfo,\n  CreateStreamInfoInternal,\n  MPayFees,\n  PaymentWithFee,\n  RecipientInfoInternal,\n} from '../types/client';\nimport { CoinRequest, CoinRequestResponse, GAS_OBJECT_SPEC } from '../types/wallet';\nimport { generateGroupId } from '../utils/random';\nimport { mpaySimulateTransaction } from '../utils/rpc';\n\nexport class CreateStreamHelper {\n  constructor(\n    public readonly globals: Globals,\n    private readonly feeContract: FeeContract,\n    private readonly streamContract: StreamContract,\n  ) {}\n\n  static convertCreateStreamInfoToInternal(info: CreateStreamInfo): CreateStreamInfoInternal {\n    return {\n      metadata: encodeMetadata({\n        name: info.name,\n        groupId: generateGroupId(),\n      }),\n      coinType: normalizeStructTag(info.coinType),\n      recipients: info.recipients.map((recipient) => ({\n        address: recipient.address,\n        cliffAmount: recipient.cliffAmount,\n        amountPerEpoch: recipient.amountPerStep,\n      })),\n      epochInterval: info.interval,\n      numberEpoch: info.steps,\n      startTime: info.startTimeMs,\n      cancelable: info.cancelable,\n    };\n  }\n\n  async buildCreateStreamTransactionBlock(info: CreateStreamInfoInternal): Promise<Transaction> {\n    const txb = new Transaction();\n    const paymentWithFee = this.calculateFeesInternal(info);\n    const coinReqs = this.getCreateStreamCoinRequests(info, paymentWithFee);\n    const coinResp = await this.wallet.requestCoins(coinReqs);\n\n    const paymentMergedObject = await this.addMergeCoins(txb, coinResp[0]);\n    let flatFeeMergedObject: TransactionObjectArgument;\n    if (coinReqs.length > 1) {\n      flatFeeMergedObject = await this.addMergeCoins(txb, coinResp[1]);\n    } else {\n      flatFeeMergedObject = paymentMergedObject;\n    }\n\n    // Create streams\n    for (let i = 0; i < info.recipients.length; i++) {\n      const recipient = info.recipients[i];\n      const paymentAmount = this.amountForRecipient(recipient, info.numberEpoch);\n      const feeAmount = this.getStreamFeeLocal(paymentAmount);\n      const [paymentCoin] = txb.splitCoins(paymentMergedObject, [txb.pure.u64(paymentAmount + feeAmount)]);\n      const [flatFeeCoin] = txb.splitCoins(flatFeeMergedObject, [txb.pure.u64(this.flatSuiFee)]);\n      this.streamContract.createStream(txb, {\n        paymentCoin: new ResultRef(paymentCoin),\n        flatFeeCoin: new ResultRef(flatFeeCoin),\n        metadata: info.metadata,\n        recipient: recipient.address,\n        timeStart: info.startTime,\n        cliff: recipient.cliffAmount,\n        epochInterval: info.epochInterval,\n        numEpoch: info.numberEpoch,\n        amountPerEpoch: recipient.amountPerEpoch,\n        cancelable: info.cancelable,\n        coinType: info.coinType,\n      });\n    }\n    return txb;\n  }\n\n  calculateCreateStreamFees(createInfo: CreateStreamInfo) {\n    const infoInternal = CreateStreamHelper.convertCreateStreamInfoToInternal(createInfo);\n    return this.calculateFeesInternal(infoInternal);\n  }\n\n  feeParams(): MPayFees {\n    return {\n      createFeePercent: {\n        numerator: FEE_NUMERATOR,\n        denominator: FEE_DENOMINATOR,\n      },\n      claimFeePercent: {\n        numerator: CLAIM_FEE_NUMERATOR,\n        denominator: FEE_DENOMINATOR,\n      },\n      flatFeePerStream: FLAT_FEE_SUI,\n    };\n  }\n\n  private async addMergeCoins(txb: Transaction, coins: CoinRequestResponse): Promise<TransactionObjectArgument> {\n    let mergedCoin: TransactionObjectArgument;\n    if (coins.mergedCoins && coins.mergedCoins.length) {\n      txb.mergeCoins(\n        txb.object(coins.primaryCoin),\n        coins.mergedCoins.map((coinId) => txb.object(coinId)),\n      );\n      mergedCoin = txb.object(coins.primaryCoin);\n    } else if (coins.primaryCoin === GAS_OBJECT_SPEC) {\n      mergedCoin = txb.gas;\n    } else {\n      mergedCoin = txb.object(coins.primaryCoin);\n    }\n    return mergedCoin;\n  }\n\n  getCreateStreamCoinRequests(info: CreateStreamInfoInternal, payment: PaymentWithFee): CoinRequest[] {\n    const streamCoinType = info.coinType;\n\n    if (isSameCoinType(streamCoinType, SUI_TYPE_ARG)) {\n      return [\n        {\n          coinType: streamCoinType,\n          amount: payment.totalAmount + payment.streamFeeAmount + payment.flatFeeAmount,\n        },\n      ];\n    }\n    return [\n      {\n        coinType: streamCoinType,\n        amount: payment.totalAmount + payment.streamFeeAmount,\n      },\n      {\n        coinType: SUI_TYPE_ARG,\n        amount: payment.flatFeeAmount,\n      },\n    ];\n  }\n\n  calculateFeesInternal(info: CreateStreamInfoInternal): PaymentWithFee {\n    const streamPayment = info.recipients.reduce(\n      (sum, recipient) => {\n        const totalAmount = this.amountForRecipient(recipient, info.numberEpoch);\n        const fee = this.getStreamFeeLocal(totalAmount);\n        return {\n          totalAmount: sum.totalAmount + totalAmount,\n          streamFeeAmount: sum.streamFeeAmount + fee,\n        };\n      },\n      {\n        totalAmount: 0n,\n        streamFeeAmount: 0n,\n      },\n    );\n    const flatFeeAmount = BigInt(info.recipients.length) * this.flatSuiFee;\n    return {\n      flatFeeAmount,\n      ...streamPayment,\n    };\n  }\n\n  private amountForRecipient(recipient: RecipientInfoInternal, numEpoch: bigint) {\n    return BigInt(recipient.amountPerEpoch) * BigInt(numEpoch) + BigInt(recipient.cliffAmount);\n  }\n\n  get flatSuiFee() {\n    return FLAT_FEE_SUI;\n  }\n\n  getStreamFeeLocal(streamAmount: bigint) {\n    return (streamAmount * FEE_NUMERATOR) / FEE_DENOMINATOR;\n  }\n\n  async getStreamFeeRemote(streamAmount: bigint) {\n    const txb = this.feeContract.streamingFee(new Transaction(), streamAmount);\n    const res = await mpaySimulateTransaction(this.globals.suiClient, {\n      sender: await this.globals.walletAddress(),\n      transaction: txb,\n    });\n    const iv = new InspectViewer(res);\n    return iv.getU64();\n  }\n\n  get wallet() {\n    return this.globals.wallet;\n  }\n}\n","export const FEE_NUMERATOR = 50n;\nexport const FEE_DENOMINATOR = 10000n;\nexport const CLAIM_FEE_NUMERATOR = 25n;\nexport const FLAT_FEE_SUI = 100000000n;\n","import { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';\n\nexport type MoveNumber = bigint | string | number;\nexport type Ref<T> = T | ResultRef;\nexport type ObjectId = string;\n\nexport class MoveObject {\n  constructor(public readonly object: string) {}\n\n  moveArg(txb: Transaction) {\n    return txb.object(this.object);\n  }\n}\n\nexport class ObjectVector {\n  constructor(public readonly objects: string[]) {}\n\n  moveArgs(txb: Transaction) {\n    return txb.makeMoveVec({ elements: this.objects.map((o) => txb.object(o)) });\n  }\n}\n\nexport class ResultRef {\n  constructor(public readonly result: TransactionObjectArgument) {\n    // eslint-disable-next-line no-constructor-return\n    return new Proxy(this, {\n      set() {\n        throw new Error('The transaction result is a proxy, and does not support setting properties directly');\n      },\n      get(target, property) {\n        // This allows this transaction argument to be used in the singular form:\n        if (property in target) {\n          return Reflect.get(target, property);\n        }\n\n        const nestedResultFor = (resultIndex: number) =>\n          new ResultRef((target.result as unknown as TransactionObjectArgument[])[resultIndex]);\n\n        // Support destructuring:\n        if (property === Symbol.iterator) {\n          // eslint-disable-next-line func-names\n          return function* () {\n            let i = 0;\n            while (true) {\n              yield nestedResultFor(i);\n              i++;\n            }\n          };\n        }\n\n        if (typeof property === 'symbol') {\n          // eslint-disable-next-line consistent-return\n          return;\n        }\n\n        const resultIndex = parseInt(property, 10);\n        if (Number.isNaN(resultIndex) || resultIndex < 0) {\n          // eslint-disable-next-line consistent-return\n          return;\n        }\n        return nestedResultFor(resultIndex);\n      },\n    });\n  }\n\n  moveArg() {\n    return this.result;\n  }\n}\n\nexport function toPureArg(txb: Transaction, arg: unknown) {\n  if (typeof arg === 'bigint') {\n    return txb.pure.u64(arg);\n  }\n  if (typeof arg === 'number') {\n    return txb.pure.u64(arg);\n  }\n  if (typeof arg === 'boolean') {\n    return txb.pure.bool(arg);\n  }\n  if (typeof arg === 'string') {\n    if (/^0x[0-9a-fA-F]+$/.test(arg)) {\n      return txb.pure.address(arg);\n    }\n    return txb.pure.string(arg);\n  }\n  throw new Error(`Unsupported pure argument type: ${typeof arg}`);\n}\n","import { bcs } from '@mysten/bcs';\n\nimport { InvalidRpcResultError } from '../error/InvalidRpcResultError';\nimport { MpaySimulateResult, readU64FromCommandResult } from '../utils/rpc';\n\nexport class InspectViewer {\n  constructor(readonly results: MpaySimulateResult) {}\n\n  getU64(callIndex = 0, returnIndex = 0) {\n    try {\n      return readU64FromCommandResult(this.results, callIndex, returnIndex);\n    } catch {\n      const [value, type] = this.getLegacyValue(callIndex, returnIndex);\n      if (type !== 'u64') {\n        throw new InvalidRpcResultError('Invalid contract return type.', {\n          ctx: {\n            expectType: 'u64',\n            gotType: type,\n          },\n        });\n      }\n      return bcs.u64().parse(Uint8Array.from(value));\n    }\n  }\n\n  private getLegacyValue(callIndex = 0, returnIndex = 0) {\n    const callResult = this.results.results?.[callIndex];\n    const returnValues = callResult?.returnValues;\n    if (!returnValues?.[returnIndex]) {\n      throw new InvalidRpcResultError('Invalid contract return type.', {\n        ctx: {\n          expectType: 'u64',\n          gotType: 'missing',\n        },\n      });\n    }\n    return returnValues[returnIndex];\n  }\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\nexport class InvalidRpcResultError extends MPayError {\n  constructor(msg: string, ctx?: JsonObject) {\n    super(MPayErrorCode.InvalidRpcResult, msg, { context: ctx });\n  }\n}\n","import { bcs } from '@mysten/bcs';\nimport type { SuiClientTypes } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport type { MsafeSuiGrpcClient } from '@/lib/suiGrpcClient';\n\nimport { normalizeMoveObjectJson } from './moveObjectFields';\n\nexport type MpayCoin = {\n  coinObjectId: string;\n  balance: string;\n  coinType: string;\n};\n\nexport type MpayObjectResponse = {\n  data?: {\n    objectId: string;\n    type?: string;\n    content?: {\n      dataType: 'moveObject';\n      type: string;\n      fields: Record<string, unknown>;\n    };\n  };\n  error?: {\n    code: string;\n  };\n};\n\nexport type MpayBalance = {\n  coinType: string;\n  totalBalance: string;\n};\n\nexport type MpayCoinMetadata = SuiClientTypes.CoinMetadata;\n\nexport type MpaySimulateResult = {\n  effects?: {\n    status: {\n      status: 'success' | 'failure';\n      error?: string;\n    };\n  };\n  results?: {\n    returnValues?: [number[], string][];\n  }[];\n  commandResults?: SuiClientTypes.CommandResult[];\n};\n\nexport async function mpayGetCoins(\n  client: MsafeSuiGrpcClient,\n  options: {\n    owner: string;\n    coinType: string;\n    cursor?: string | null;\n    limit?: number;\n  },\n): Promise<{ data: MpayCoin[]; hasNextPage: boolean; nextCursor: string | null }> {\n  const response = await client.listCoins({\n    owner: options.owner,\n    coinType: options.coinType,\n    cursor: options.cursor ?? undefined,\n    limit: options.limit,\n  });\n\n  return {\n    data: response.objects.map((coin) => ({\n      coinObjectId: coin.objectId,\n      balance: coin.balance,\n      coinType: coin.type,\n    })),\n    hasNextPage: response.hasNextPage,\n    nextCursor: response.cursor,\n  };\n}\n\nfunction resolveGetObject(client: MsafeSuiGrpcClient) {\n  if (client.core?.getObject) {\n    return client.core.getObject.bind(client.core);\n  }\n  return client.getObject.bind(client);\n}\n\nfunction extractMoveObjectFields(object: {\n  json?: Record<string, unknown> | null;\n  type?: string;\n}): Record<string, unknown> | null {\n  if (object.json && typeof object.json === 'object') {\n    return normalizeMoveObjectJson(object.json);\n  }\n  return null;\n}\n\nexport async function mpayGetObject(client: MsafeSuiGrpcClient, objectId: string): Promise<MpayObjectResponse> {\n  try {\n    const getObject = resolveGetObject(client);\n    const { object } = await getObject({\n      objectId,\n      include: { json: true, type: true },\n    });\n\n    const fields = extractMoveObjectFields(object);\n    if (!fields) {\n      return {\n        error: { code: 'notExists' },\n      };\n    }\n\n    return {\n      data: {\n        objectId: object.objectId,\n        type: object.type,\n        content: {\n          dataType: 'moveObject',\n          type: object.type,\n          fields,\n        },\n      },\n    };\n  } catch {\n    return {\n      error: { code: 'notExists' },\n    };\n  }\n}\n\nexport async function mpayMultiGetObjects(\n  client: MsafeSuiGrpcClient,\n  ids: string[],\n): Promise<(MpayObjectResponse | undefined)[]> {\n  if (ids.length === 0) {\n    return [];\n  }\n\n  const { objects } = await client.getObjects({\n    objectIds: ids,\n    include: { json: true, type: true },\n  });\n\n  return objects.map((entry) => {\n    if (!('objectId' in entry)) {\n      return { error: { code: String((entry as { code?: unknown }).code ?? 'unknown') } };\n    }\n\n    const fields = extractMoveObjectFields(entry);\n    if (!fields) {\n      return undefined;\n    }\n\n    return {\n      data: {\n        objectId: entry.objectId,\n        type: entry.type,\n        content: {\n          dataType: 'moveObject' as const,\n          type: entry.type,\n          fields,\n        },\n      },\n    };\n  });\n}\n\nexport async function mpayGetBalance(\n  client: MsafeSuiGrpcClient,\n  options: { owner: string; coinType?: string | null },\n): Promise<MpayBalance> {\n  const { balance } = await client.getBalance({\n    owner: options.owner,\n    coinType: options.coinType ?? undefined,\n  });\n\n  return {\n    coinType: balance.coinType,\n    totalBalance: balance.balance,\n  };\n}\n\nexport async function mpayGetAllBalances(client: MsafeSuiGrpcClient, owner: string): Promise<MpayBalance[]> {\n  const response = await client.listBalances({ owner });\n  return response.balances.map((balance) => ({\n    coinType: balance.coinType,\n    totalBalance: balance.balance,\n  }));\n}\n\nexport async function mpayGetCoinMetadata(\n  client: MsafeSuiGrpcClient,\n  coinType: string,\n): Promise<MpayCoinMetadata | null> {\n  const { coinMetadata } = await client.getCoinMetadata({ coinType });\n  return coinMetadata;\n}\n\nexport async function mpaySimulateTransaction(\n  client: MsafeSuiGrpcClient,\n  options: { transaction: Transaction; sender: string },\n): Promise<MpaySimulateResult> {\n  options.transaction.setSenderIfNotSet(options.sender);\n  const result = await client.simulateTransaction({\n    transaction: options.transaction,\n    include: {\n      effects: true,\n      commandResults: true,\n    },\n  });\n\n  const transaction = result.$kind === 'Transaction' ? result.Transaction : result.FailedTransaction;\n\n  return {\n    effects: transaction.effects\n      ? {\n          status: {\n            status: transaction.effects.status.success ? 'success' : 'failure',\n            error: transaction.effects.status.error?.message,\n          },\n        }\n      : undefined,\n    commandResults: result.commandResults,\n    results: result.commandResults?.map((commandResult) => ({\n      returnValues: commandResult.returnValues.map((value) => [Array.from(value.bcs), 'u64'] as [number[], string]),\n    })),\n  };\n}\n\nexport function readU64FromCommandResult(result: MpaySimulateResult, callIndex = 0, returnIndex = 0): bigint {\n  const output = result.commandResults?.[callIndex]?.returnValues?.[returnIndex];\n  if (!output) {\n    throw new Error('Missing command result');\n  }\n  return BigInt(bcs.u64().parse(output.bcs));\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\nexport class RpcError extends MPayError {\n  constructor(msg: string, context?: JsonObject) {\n    super(MPayErrorCode.RpcError, msg, {\n      context,\n    });\n  }\n}\n","import { RpcError } from '../error/RpcError';\n\n// Legacy JSON-RPC nests struct fields under { fields: ... }; gRPC JSON is flat.\nexport function unwrapMoveFields(value: unknown): Record<string, unknown> {\n  if (value == null) {\n    throw new RpcError('Missing move object field');\n  }\n\n  if (typeof value === 'object' && 'fields' in value) {\n    const nested = (value as { fields?: unknown }).fields;\n    if (nested && typeof nested === 'object') {\n      return nested as Record<string, unknown>;\n    }\n  }\n\n  if (typeof value === 'object') {\n    return value as Record<string, unknown>;\n  }\n\n  throw new RpcError('Unexpected move object field shape', { value: String(value) });\n}\n\n// Some responses wrap the whole move object under a top-level `fields` key.\nexport function normalizeMoveObjectJson(json: Record<string, unknown>): Record<string, unknown> {\n  if (\n    json.fields &&\n    typeof json.fields === 'object' &&\n    !('balance' in json) &&\n    !('config' in json) &&\n    !('status' in json)\n  ) {\n    return json.fields as Record<string, unknown>;\n  }\n  return json;\n}\n\nexport function readCoinOrBalanceAmount(value: unknown, fieldName = 'balance'): bigint {\n  if (value == null) {\n    throw new RpcError(`Stream object missing ${fieldName} field`);\n  }\n\n  if (typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint') {\n    return BigInt(value);\n  }\n\n  const fields = unwrapMoveFields(value);\n  const amount = fields.balance ?? fields.value;\n  if (amount == null) {\n    throw new RpcError(`Stream object ${fieldName} field has unexpected shape`, {\n      value: JSON.stringify(value),\n    });\n  }\n\n  return BigInt(String(amount));\n}\n","import { bcs } from '@mysten/bcs';\n\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { StreamMetadata } from '../types/stream';\n\nconst MetadataBcs = bcs.struct('StreamMetadata', {\n  groupId: bcs.string(),\n  name: bcs.string(),\n});\n\nconst MAX_NAME_SIZE = 64;\n\nexport function encodeMetadata(metadata: StreamMetadata) {\n  validateMetadata(metadata);\n  return MetadataBcs.serialize(metadata).toBase64();\n}\n\nexport function decodeMetadata(metaStr: string) {\n  const metadata = MetadataBcs.fromBase64(metaStr);\n  validateMetadata(metadata);\n  return metadata;\n}\n\nexport function validateMetadata(metadata: StreamMetadata) {\n  if (!isAsciiString(metadata.name)) {\n    throw new InvalidInputError('Invalid metadata: Name contains unknown character');\n  }\n  if (!isAsciiString(metadata.groupId)) {\n    throw new InvalidInputError('Invalid metadata: Group ID contains unknown character');\n  }\n  if (metadata.name.length > MAX_NAME_SIZE) {\n    throw new InvalidInputError('Invalid metadata: Name exceed max length 64');\n  }\n}\n\nfunction isAsciiString(str: string) {\n  // eslint-disable-next-line no-control-regex\n  const asciiPattern = /^[\\x00-\\x7F]+$/;\n  return asciiPattern.test(str);\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class InvalidInputError extends MPayError {\n  constructor(msg: string, fieldKey?: string, fieldValue?: any) {\n    super(MPayErrorCode.InvalidInput, `Invalid input: ${msg}`, {\n      context: {\n        fieldKey,\n        fieldValue,\n      },\n    });\n  }\n}\n","import { normalizeStructTag } from '@mysten/sui/utils';\n\nexport function isSameCoinType(type1: string, type2: string) {\n  return normalizeStructTag(type1) === normalizeStructTag(type2);\n}\n\nexport function isSameTarget(target1: string, target2: string): boolean {\n  return normalizeStructTag(target1) === normalizeStructTag(target2);\n}\n\nexport function getMoveCallTarget(command: {\n  $kind: string;\n  MoveCall?: { package: string; module: string; function: string };\n}): string | null {\n  if (command.$kind !== 'MoveCall' || !command.MoveCall) {\n    return null;\n  }\n  const { package: pkg, module, function: fn } = command.MoveCall;\n  return `${pkg}::${module}::${fn}`;\n}\n","export enum WalletType {\n  single = 'single',\n  msafe = 'msafe',\n}\n\nexport const GAS_OBJECT_SPEC = 'txn.gas';\n\n/**\n * IWallet is the adapted interface of wallet. Supports both single wallet and msafe.\n */\nexport interface IWallet {\n  type: WalletType;\n\n  address(): Promise<string>;\n\n  requestCoins(reqs: CoinRequest[]): Promise<CoinRequestResponse[]>;\n}\n\n/**\n * ISingleWallet is the raw interface of msafe account.\n * Need to adapt to IWallet interface\n */\nexport interface IMSafeAccount {\n  address(): Promise<string>;\n\n  // return coin objects by amount.\n  requestCoins(reqs: CoinRequest[]): Promise<CoinRequestResponse[]>;\n}\n\n/**\n * ISingleWallet is the raw interface of single signer wallet.\n * Need to adapt to IWallet interface\n */\nexport interface ISingleWallet {\n  address(): Promise<string>;\n}\n\nexport interface CoinRequest {\n  coinType: string;\n  amount: bigint;\n}\n\nexport interface CoinRequestResponse {\n  primaryCoin: string;\n  mergedCoins?: string[];\n}\n","import { nanoid } from 'nanoid';\n\nexport function generateGroupId() {\n  return nanoid();\n}\n","export const CLOCK_ID = '0x0000000000000000000000000000000000000000000000000000000000000006';\n","import { Transaction } from '@mysten/sui/transactions';\n\nimport { ContractConfig, Globals } from '../common';\nimport { ObjectVector, MoveObject, ResultRef, Ref, ObjectId, toPureArg } from '../common/transaction';\nimport { CLOCK_ID } from '../const';\n\nexport class BaseContract {\n  constructor(\n    public readonly moduleName: string,\n    public readonly config: ContractConfig,\n    public readonly globals: Globals,\n  ) {}\n\n  addContractCall(txb: Transaction, input: { method: string; arguments: unknown[]; typeArgs?: string[] }) {\n    const target =\n      `${this.config.contractId}::${this.moduleName}::${input.method}` as `${string}::${string}::${string}`;\n    txb.moveCall({\n      target,\n      arguments: input.arguments.map((arg) => {\n        if (arg instanceof ObjectVector) {\n          return arg.moveArgs(txb);\n        }\n        if (arg instanceof MoveObject) {\n          return arg.moveArg(txb);\n        }\n        if (arg instanceof ResultRef) {\n          return arg.moveArg();\n        }\n        return toPureArg(txb, arg);\n      }),\n      typeArguments: input.typeArgs,\n    });\n    return txb;\n  }\n\n  makeObject(object: Ref<ObjectId>) {\n    return typeof object === 'string' ? new MoveObject(object) : object;\n  }\n\n  vaultObject() {\n    return new MoveObject(this.config.vaultObjId);\n  }\n\n  roleObject() {\n    return new MoveObject(this.config.roleObjId);\n  }\n\n  feeObject() {\n    return new MoveObject(this.config.feeObjId);\n  }\n\n  clockObject() {\n    return new MoveObject(CLOCK_ID);\n  }\n}\n","import { Transaction } from '@mysten/sui/transactions';\n\nimport { BaseContract } from './BaseContract';\nimport { ContractConfig, Globals } from '../common';\nimport { MoveNumber } from '../common/transaction';\n\nexport class FeeContract extends BaseContract {\n  static ModuleName = 'fee_module';\n\n  static MethodName = {\n    set_streaming_fee: 'set_streaming_fee',\n    set_claim_fee: 'set_claim_fee',\n    set_streaming_flat_fee: 'set_streaming_flat_fee',\n    streaming_flat_fee: 'streaming_flat_fee',\n    streaming_fee: 'streaming_fee',\n    claim_fee: 'claim_fee',\n    fee_denominator: 'fee_denominator',\n  } as const;\n\n  constructor(\n    public readonly config: ContractConfig,\n    public readonly globals: Globals,\n  ) {\n    super(FeeContract.ModuleName, config, globals);\n  }\n\n  setStreamingFee(txb: Transaction, createFeeNumerator: MoveNumber) {\n    const roleObject = this.roleObject();\n    const feeObject = this.feeObject();\n    return this.addContractCall(txb, {\n      method: FeeContract.MethodName.set_streaming_fee,\n      arguments: [roleObject, feeObject, createFeeNumerator],\n      typeArgs: [],\n    });\n  }\n\n  setStreamingFlatFee(txb: Transaction, flatFee: MoveNumber) {\n    const roleObject = this.roleObject();\n    const feeObject = this.feeObject();\n    return this.addContractCall(txb, {\n      method: FeeContract.MethodName.set_streaming_flat_fee,\n      arguments: [roleObject, feeObject, flatFee],\n      typeArgs: [],\n    });\n  }\n\n  setClaimFee(txb: Transaction, claimFee: MoveNumber) {\n    const roleObject = this.roleObject();\n    const feeObject = this.feeObject();\n    return this.addContractCall(txb, {\n      method: FeeContract.MethodName.set_claim_fee,\n      arguments: [roleObject, feeObject, claimFee],\n      typeArgs: [],\n    });\n  }\n\n  streamingFee(txb: Transaction, amount: MoveNumber) {\n    const feeObject = this.feeObject();\n    return this.addContractCall(txb, {\n      method: FeeContract.MethodName.streaming_fee,\n      arguments: [feeObject, amount],\n      typeArgs: [],\n    });\n  }\n\n  claimFee(txb: Transaction, amount: MoveNumber) {\n    return this.addContractCall(txb, {\n      method: FeeContract.MethodName.claim_fee,\n      arguments: [this.feeObject(), amount],\n      typeArgs: [],\n    });\n  }\n\n  feeDenominator(txb: Transaction) {\n    return this.addContractCall(txb, {\n      method: FeeContract.MethodName.fee_denominator,\n      arguments: [this.feeObject()],\n      typeArgs: [],\n    });\n  }\n}\n","import { Transaction } from '@mysten/sui/transactions';\n\nimport { BaseContract } from './BaseContract';\nimport { ContractConfig, Globals } from '../common';\nimport { Ref, ObjectId, MoveNumber } from '../common/transaction';\n\nexport class StreamContract extends BaseContract {\n  static ModuleName = 'stream';\n\n  static MethodName = {\n    create_stream: 'create_stream',\n    set_auto_claim: 'set_auto_claim',\n    cancel_stream: 'cancel_stream',\n    claim_stream: 'claim_stream',\n    claim_stream_by_proxy: 'claim_stream_by_proxy',\n    stream_current_epoch: 'stream_current_epoch',\n    now_milli_seconds: 'now_milli_seconds',\n  } as const;\n\n  constructor(\n    public readonly config: ContractConfig,\n    public readonly globals: Globals,\n  ) {\n    super(StreamContract.ModuleName, config, globals);\n  }\n\n  createStream(\n    txb: Transaction,\n    input: {\n      paymentCoin: Ref<ObjectId>;\n      flatFeeCoin: Ref<ObjectId>;\n      metadata: string;\n      recipient: string;\n      timeStart: Ref<MoveNumber>;\n      cliff: Ref<MoveNumber>;\n      epochInterval: Ref<MoveNumber>;\n      numEpoch: Ref<MoveNumber>;\n      amountPerEpoch: Ref<MoveNumber>;\n      cancelable: boolean;\n      coinType: string;\n    },\n  ) {\n    const feeObject = this.feeObject();\n    const vaultObject = this.vaultObject();\n    const paymentCoinObject = this.makeObject(input.paymentCoin);\n    const flatFeeObject = this.makeObject(input.flatFeeCoin);\n    const clockObject = this.clockObject();\n    return this.addContractCall(txb, {\n      method: StreamContract.MethodName.create_stream,\n      arguments: [\n        feeObject,\n        vaultObject,\n        paymentCoinObject,\n        flatFeeObject,\n        input.metadata,\n        input.recipient,\n        input.timeStart,\n        input.cliff,\n        input.epochInterval,\n        input.numEpoch,\n        input.amountPerEpoch,\n        input.cancelable,\n        clockObject,\n      ],\n      typeArgs: [input.coinType],\n    });\n  }\n\n  setAutoClaim(\n    txb: Transaction,\n    input: {\n      streamId: Ref<ObjectId>;\n      enabled: boolean;\n      coinType: string;\n    },\n  ) {\n    const streamObject = this.makeObject(input.streamId);\n    return this.addContractCall(txb, {\n      method: StreamContract.MethodName.set_auto_claim,\n      arguments: [streamObject, input.enabled],\n      typeArgs: [input.coinType],\n    });\n  }\n\n  cancelStream(\n    txb: Transaction,\n    input: {\n      streamId: Ref<ObjectId>;\n      coinType: string;\n    },\n  ) {\n    const streamObject = this.makeObject(input.streamId);\n    const clockObject = this.clockObject();\n    return this.addContractCall(txb, {\n      method: StreamContract.MethodName.cancel_stream,\n      arguments: [streamObject, clockObject],\n      typeArgs: [input.coinType],\n    });\n  }\n\n  claimStream(\n    txb: Transaction,\n    input: {\n      streamId: Ref<ObjectId>;\n      coinType: string;\n    },\n  ) {\n    const streamObject = this.makeObject(input.streamId);\n    const clockObject = this.clockObject();\n    return this.addContractCall(txb, {\n      method: StreamContract.MethodName.claim_stream,\n      arguments: [streamObject, clockObject],\n      typeArgs: [input.coinType],\n    });\n  }\n\n  claimStreamByProxy(\n    txb: Transaction,\n    input: {\n      streamId: Ref<ObjectId>;\n      coinType: string;\n    },\n  ) {\n    const streamObject = this.makeObject(input.streamId);\n    const vaultObject = this.vaultObject();\n    const feeObject = this.feeObject();\n    const clockObject = this.clockObject();\n    return this.addContractCall(txb, {\n      method: StreamContract.MethodName.claim_stream_by_proxy,\n      arguments: [streamObject, vaultObject, feeObject, clockObject],\n      typeArgs: [input.coinType],\n    });\n  }\n\n  get createStreamTarget() {\n    return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.create_stream}`;\n  }\n\n  get setAutoClaimTarget() {\n    return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.set_auto_claim}`;\n  }\n\n  get cancelStreamTarget() {\n    return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.cancel_stream}`;\n  }\n\n  get claimStreamTarget() {\n    return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.claim_stream}`;\n  }\n\n  get claimStreamByProxyTarget() {\n    return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.claim_stream_by_proxy}`;\n  }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag, SUI_TYPE_ARG } from '@mysten/sui/utils';\nimport { DateTime, Duration } from 'luxon';\n\nimport { CreateStreamHelper } from '../builder/CreateStreamHelper';\nimport { MPayBuilder } from '../builder/MPayBuilder';\nimport { Globals } from '../common';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { TransactionFailedError } from '../error/TransactionFailedError';\nimport {\n  IMPayHelper,\n  CreateStreamInfo,\n  PaymentWithFee,\n  MPayFees,\n  Fraction,\n  CalculatedStreamAmount,\n  CalculatedTimeline,\n  MpayTransactionResponse,\n} from '../types/client';\nimport {\n  mpayGetAllBalances,\n  mpayGetBalance,\n  mpayGetCoinMetadata,\n  mpaySimulateTransaction,\n  MpayCoinMetadata,\n} from '../utils/rpc';\n\n// Minimum time interval is 1 second\nexport const MIN_INTERVAL_MS = 1000;\n\nexport class MPayHelper implements IMPayHelper {\n  private readonly coinMetaHelper: CoinMetaHelper;\n\n  private readonly createStreamHelper: CreateStreamHelper;\n\n  constructor(public readonly globals: Globals) {\n    this.coinMetaHelper = new CoinMetaHelper(globals.suiClient);\n    this.createStreamHelper = new MPayBuilder(globals).createStreamHelper();\n  }\n\n  getStreamIdsFromCreateStreamResponse(res: MpayTransactionResponse) {\n    if (res.effects?.status.status !== 'success') {\n      throw new TransactionFailedError(res.effects?.status.status, res.effects?.status.error);\n    }\n    return Object.entries(res.objectTypes ?? {})\n      .filter(([, objectType]) =>\n        objectType.startsWith(`${this.globals.envConfig.contract.contractId}::stream::Stream`),\n      )\n      .map(([objectId]) => objectId);\n  }\n\n  calculateCreateStreamFees(info: CreateStreamInfo): PaymentWithFee {\n    return this.createStreamHelper.calculateCreateStreamFees(info);\n  }\n\n  feeParams(): MPayFees {\n    return this.createStreamHelper.feeParams();\n  }\n\n  calculateStreamAmount(input: { totalAmount: bigint; steps: bigint; cliff?: Fraction }): CalculatedStreamAmount {\n    if (input.steps === 0n) {\n      throw new InvalidInputError('Invalid stream steps: 0');\n    }\n    const cliffFraction = input.cliff\n      ? input.cliff\n      : {\n          numerator: 0n,\n          denominator: 100n,\n        };\n    const cliffAmount = (input.totalAmount * cliffFraction.numerator) / cliffFraction.denominator;\n    const amountPerStep = (input.totalAmount - cliffAmount) / input.steps;\n    const realTotalAmount = amountPerStep * input.steps + cliffAmount;\n\n    const res = {\n      realTotalAmount,\n      cliffAmount,\n      amountPerStep,\n    };\n    this.validateStreamAmount(res, input.totalAmount);\n    return res;\n  }\n\n  calculateTimelineByInterval(input: { timeStart: DateTime; interval: Duration; steps: bigint }): CalculatedTimeline {\n    if (input.steps === 0n) {\n      throw new InvalidInputError('Invalid stream steps: 0');\n    }\n    const timeEnd = input.timeStart.plus(input.interval.toMillis() * Number(input.steps));\n\n    const res = {\n      timeStart: input.timeStart,\n      timeEnd,\n      interval: input.interval,\n      steps: input.steps,\n    };\n    this.validateTimeline(res);\n    return res;\n  }\n\n  calculateTimelineByTotalDuration(input: { timeStart: DateTime; total: Duration; steps: bigint }): CalculatedTimeline {\n    if (input.steps === 0n) {\n      throw new InvalidInputError('Invalid stream steps: 0');\n    }\n    const intervalMilli = BigInt(input.total.toMillis()) / input.steps;\n    const timeEnd = input.timeStart.plus(Duration.fromMillis(Number(intervalMilli * input.steps)));\n    const res = {\n      timeStart: input.timeStart,\n      timeEnd,\n      interval: Duration.fromMillis(Number(intervalMilli)),\n      steps: input.steps,\n    };\n    this.validateTimeline(res);\n    return res;\n  }\n\n  async getBalance(address: string, coinType?: string | null) {\n    const balance = await mpayGetBalance(this.globals.suiClient, {\n      owner: address,\n      coinType,\n    });\n    const coinMeta = await this.getCoinMeta(coinType);\n    return {\n      ...balance,\n      coinType: normalizeStructTag(balance.coinType),\n      coinMeta,\n    };\n  }\n\n  async getAllBalance(address: string) {\n    const allBalance = await mpayGetAllBalances(this.globals.suiClient, address);\n    const coinMetas = await Promise.all(allBalance.map((bal) => this.getCoinMeta(bal.coinType)));\n    return allBalance.map((bal, i) => ({\n      ...bal,\n      coinType: normalizeStructTag(bal.coinType),\n      coinMeta: coinMetas[i],\n    }));\n  }\n\n  async getCoinMeta(coinType: string | null | undefined) {\n    return this.coinMetaHelper.getCoinMeta(coinType);\n  }\n\n  async simulateTransactionBlock(txb: Transaction) {\n    return mpaySimulateTransaction(this.globals.suiClient, {\n      transaction: txb,\n      sender: await this.globals.wallet.address(),\n    });\n  }\n\n  private validateStreamAmount(val: CalculatedStreamAmount, originTotalAmount: bigint) {\n    if (val.amountPerStep === 0n) {\n      throw new InvalidInputError('Stream amount too small', 'totalAmount', originTotalAmount);\n    }\n    if (val.cliffAmount > val.realTotalAmount) {\n      throw new InvalidInputError('Invalid cliff settings');\n    }\n  }\n\n  private validateTimeline(val: CalculatedTimeline) {\n    if (val.interval.toMillis() < MIN_INTERVAL_MS) {\n      throw new InvalidInputError('Interval shall be at least 1 second', 'interval', val.interval);\n    }\n  }\n}\n\nexport class CoinMetaHelper {\n  private coinMetaReg: Map<string, MpayCoinMetadata>;\n\n  constructor(private readonly suiClient: Globals['suiClient']) {\n    this.coinMetaReg = new Map();\n  }\n\n  async getCoinMeta(coinType: string | null | undefined): Promise<MpayCoinMetadata | undefined> {\n    const normalized = normalizeStructTag(coinType || SUI_TYPE_ARG);\n    if (this.coinMetaReg.has(normalized)) {\n      return this.coinMetaReg.get(normalized);\n    }\n    const meta = await this.queryCoinMeta(normalized);\n    if (meta) {\n      this.coinMetaReg.set(normalized, meta);\n    }\n    return meta ?? undefined;\n  }\n\n  private async queryCoinMeta(coinType: string): Promise<MpayCoinMetadata | null> {\n    return mpayGetCoinMetadata(this.suiClient, coinType);\n  }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class TransactionFailedError extends MPayError {\n  constructor(status: string | undefined, msg: string | undefined) {\n    super(MPayErrorCode.TransactionFailed, `Transaction failed: ${msg}`, {\n      context: {\n        status,\n        msg,\n      },\n    });\n  }\n}\n","import { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { DateTime } from 'luxon';\n\nimport { Stream } from './Stream';\nimport { StreamGroup } from './StreamGroup';\nimport { Globals } from '../common';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { SanityError } from '../error/SanityError';\nimport { SuiIterator } from '../sui/iterator/iterator';\nimport { ObjectBatchIterator, ListOidIterator } from '../sui/iterator/object';\nimport {\n  StreamRef,\n  BackendIncomingStreamFilterOptions,\n  BackendOutgoingStreamFilterOptions,\n  StreamFilterStatus,\n} from '../types/backend';\nimport { IPagedStreamListIterator, IncomingStreamQuery, OutgoingStreamQuery } from '../types/client';\nimport { IStream, IStreamGroup, StreamStatus } from '../types/stream';\nimport { MpayObjectResponse } from '../utils/rpc';\n\nexport class PagedStreamListIterator implements IPagedStreamListIterator {\n  private constructor(\n    public readonly it: StreamListIterator,\n    public readonly pageSize: number,\n  ) {}\n\n  static async newIncoming(input: {\n    globals: Globals;\n    query?: IncomingStreamQuery;\n    pageSize: number;\n  }): Promise<PagedStreamListIterator> {\n    const it = await StreamListIterator.newIncoming(input);\n    return new PagedStreamListIterator(it, input.pageSize);\n  }\n\n  static async newOutgoing(input: {\n    globals: Globals;\n    query?: OutgoingStreamQuery;\n    pageSize: number;\n  }): Promise<PagedStreamListIterator> {\n    const it = await StreamListIterator.newOutgoing(input);\n    return new PagedStreamListIterator(it, input.pageSize);\n  }\n\n  async hasNext() {\n    return this.it.hasNext();\n  }\n\n  async next(): Promise<(IStream | IStreamGroup)[]> {\n    const res: (IStream | IStreamGroup)[] = [];\n    while (res.length < this.pageSize && (await this.it.hasNext())) {\n      res.push(await this.it.next());\n    }\n    return res;\n  }\n}\n\nexport class StreamListIterator implements SuiIterator<IStream | IStreamGroup> {\n  cachedNext: IStream | IStreamGroup | undefined | null;\n\n  private constructor(private readonly requester: StreamListRequester) {}\n\n  static async newIncoming(input: { globals: Globals; query?: IncomingStreamQuery }) {\n    const requester = await StreamListRequester.newIncomingQuery(input);\n    return new StreamListIterator(requester);\n  }\n\n  static async newOutgoing(input: { globals: Globals; query?: OutgoingStreamQuery }) {\n    const requester = await StreamListRequester.newOutgoingQuery(input);\n    return new StreamListIterator(requester);\n  }\n\n  async hasNext(): Promise<boolean> {\n    if (this.cachedNext === undefined) {\n      this.cachedNext = await this.requester.doNextRequest();\n    }\n    return this.cachedNext !== null;\n  }\n\n  async next(): Promise<IStream | IStreamGroup> {\n    if (this.cachedNext === undefined) {\n      const res = await this.requester.doNextRequest();\n      if (res === null) {\n        throw new SanityError('No more results');\n      }\n      return res;\n    }\n    const res = this.cachedNext;\n    this.cachedNext = undefined;\n    if (res === null) {\n      throw new SanityError('No more results');\n    }\n    return res as IStream | IStreamGroup;\n  }\n}\n\nexport class StreamListRequester {\n  public current = 0;\n\n  public objectIter: ObjectBatchIterator;\n\n  private constructor(\n    public readonly globals: Globals,\n    public readonly recipient: string,\n    public readonly groupRefs: StreamRef[][],\n    public readonly query?: IncomingStreamQuery | OutgoingStreamQuery,\n  ) {\n    this.current = 0;\n    const oidIter = new ListOidIterator(groupRefs.flat().map((ref) => ref.streamId));\n    this.objectIter = new ObjectBatchIterator(globals.suiClient, oidIter);\n  }\n\n  static async newIncomingQuery(input: { globals: Globals; query?: IncomingStreamQuery }) {\n    const backendQuery = convertToIncomingBackendQuery(input.query);\n    const recipient = await input.globals.walletAddress();\n    const refs = await input.globals.backend.getIncomingStreams(recipient, backendQuery);\n    const filtered = refs.filter((ref: any) => normalizeSuiAddress(ref.recipient) === normalizeSuiAddress(recipient));\n    const groupedRefs = groupAndSortRefs(filtered);\n\n    return new StreamListRequester(input.globals, recipient, groupedRefs, input.query);\n  }\n\n  static async newOutgoingQuery(input: { globals: Globals; query?: OutgoingStreamQuery }) {\n    const backendQuery = convertToOutgoingBackendQuery(input.query);\n    const sender = await input.globals.walletAddress();\n    const refs = await input.globals.backend.getOutgoingStreams(sender, backendQuery);\n    const groupedRefs = groupAndSortRefs(refs);\n    return new StreamListRequester(input.globals, sender, groupedRefs, input.query);\n  }\n\n  async doNextRequest(): Promise<IStream | IStreamGroup | null> {\n    if (this.current >= this.groupRefs.length) {\n      return null;\n    }\n    const stRefs = this.groupRefs[this.current];\n    if (stRefs.length === 1) {\n      const stream = await getStreamFromIterator(this.globals, stRefs[0].streamId, this.objectIter);\n      this.current++;\n      return isStreamOfQuery(stream, this.query) ? stream : this.doNextRequest();\n    }\n    if (stRefs.length > 1) {\n      const sg = await getStreamGroupFromIterator(\n        this.globals,\n        stRefs.map((ref) => ref.streamId),\n        this.objectIter,\n      );\n      this.current++;\n      return isStreamGroupOfQuery(sg, this.query) ? sg : this.doNextRequest();\n    }\n    throw new SanityError('Stream group with no stream');\n  }\n}\n\nexport function groupAndSortRefs(refs: StreamRef[]) {\n  const m = new Map<string, StreamRef[]>();\n  refs.forEach((ref) => {\n    const groupList = m.get(ref.groupId);\n    if (groupList) {\n      groupList.push(ref);\n      m.set(ref.groupId, groupList);\n    } else {\n      m.set(ref.groupId, [ref]);\n    }\n  });\n  return Array.from(m.values()).sort(\n    (gl1, gl2) => DateTime.fromISO(gl2[0].createDate).toMillis() - DateTime.fromISO(gl1[0].createDate).toMillis(),\n  );\n}\n\nfunction isStreamOfQuery(stream: IStream, query: IncomingStreamQuery | OutgoingStreamQuery | undefined) {\n  if (query === undefined) {\n    return true;\n  }\n  const isStatus = isStreamOfStatus(stream, query.status);\n  if (query && 'claimable' in query && query.claimable !== undefined) {\n    const isClaimable = query.claimable ? stream.progress.claimable !== 0n : stream.progress.claimable === 0n;\n    return isStatus && isClaimable;\n  }\n  return isStatus;\n}\n\nfunction isStreamOfStatus(stream: IStream, filter: StreamStatus | StreamStatus[] | undefined): boolean {\n  if (filter === undefined) {\n    return true;\n  }\n  if (!Array.isArray(filter)) {\n    return stream.progress.status === filter;\n  }\n  return filter.includes(stream.progress.status);\n}\n\nfunction isStreamGroupOfQuery(sg: IStreamGroup, query: IncomingStreamQuery | OutgoingStreamQuery | undefined): boolean {\n  if (!query) {\n    return true;\n  }\n  let isStatus = false;\n  sg.streams.forEach((stream) => {\n    if (isStreamOfQuery(stream, query)) {\n      isStatus = true;\n    }\n  });\n  return isStatus;\n}\n\nasync function getStreamFromIterator(globals: Globals, streamId: string, it: ObjectBatchIterator) {\n  const data = await getStreamObjectResponseFromIter(it, streamId);\n  return Stream.fromObjectData(globals, streamId, data);\n}\n\nasync function getStreamGroupFromIterator(globals: Globals, streamIds: string[], it: ObjectBatchIterator) {\n  const objResponses: MpayObjectResponse[] = [];\n  while (objResponses.length < streamIds.length) {\n    const data = await getStreamObjectResponseFromIter(it, streamIds[objResponses.length]);\n    objResponses.push(data);\n  }\n  return StreamGroup.newFromObjectResponse(globals, streamIds, objResponses);\n}\n\nasync function getStreamObjectResponseFromIter(it: ObjectBatchIterator, streamId: string) {\n  if (!(await it.hasNext())) {\n    throw new SanityError('object iterator has been consumed');\n  }\n  const data = await it.next();\n  if (!data || data.error || data.data === undefined || data.data === null) {\n    throw new SanityError(`object iterator undefined response`, {\n      cause: data?.error,\n    });\n  }\n  if (data?.data?.objectId !== streamId) {\n    throw new SanityError('stream id not aligned');\n  }\n  return data;\n}\n\n// Convert IncomingStreamQuery to BackendIncomingStreamFilterOptions\nfunction convertToIncomingBackendQuery(query?: IncomingStreamQuery): BackendIncomingStreamFilterOptions {\n  return {\n    status: convertStreamStatus(query?.status),\n    coinType: normalizeCoinTypeFilter(query?.coinType),\n    sender: normalizeAddressFilter(query?.sender),\n  };\n}\n\nfunction convertToOutgoingBackendQuery(query?: OutgoingStreamQuery): BackendOutgoingStreamFilterOptions {\n  return {\n    status: convertStreamStatus(query?.status),\n    coinType: normalizeCoinTypeFilter(query?.coinType),\n    recipient: normalizeAddressFilter(query?.recipient),\n  };\n}\n\nexport function convertStreamStatus(status: undefined | StreamStatus | StreamStatus[]): StreamFilterStatus {\n  if (status === undefined || status.length === 0) {\n    return 'all';\n  }\n  if (!Array.isArray(status)) {\n    return convertStreamStatusSingle(status);\n  }\n  return status.reduce((res: StreamFilterStatus | undefined, st) => {\n    const sts = convertStreamStatus(st);\n    if (!res) {\n      return sts;\n    }\n    if (res === sts) {\n      return sts;\n    }\n    return 'all';\n  }, undefined) as StreamFilterStatus;\n}\n\nfunction convertStreamStatusSingle(status: StreamStatus): StreamFilterStatus {\n  switch (status) {\n    case 'STREAMING':\n    case 'STREAMED':\n    case 'CANCELED':\n      return 'active';\n    case 'COMPLETED':\n    case 'SETTLED':\n      return 'inactive';\n    default:\n      throw new InvalidInputError('Unknown stream filtered status');\n  }\n}\n\nfunction normalizeCoinTypeFilter(coinType: string | string[] | undefined) {\n  if (!coinType) {\n    return undefined;\n  }\n  if (!Array.isArray(coinType)) {\n    return normalizeStructTag(coinType);\n  }\n  return coinType.length !== 0 ? coinType.map((ct) => normalizeStructTag(ct)) : undefined;\n}\n\nfunction normalizeAddressFilter(address: string | string[] | undefined) {\n  if (!address) {\n    return undefined;\n  }\n  if (!Array.isArray(address)) {\n    return normalizeSuiAddress(address);\n  }\n  return address.length !== 0 ? address.map((addr) => normalizeSuiAddress(addr)) : undefined;\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag, parseStructTag } from '@mysten/sui/utils';\nimport { DateTime, Duration } from 'luxon';\n\nimport { decodeMetadata } from './metadata';\nimport { Globals } from '../common';\nimport { StreamContract } from '../contract/StreamContract';\nimport { NotCreatorError } from '../error/NotCreatorError';\nimport { NotRecipientError } from '../error/NotRecipientError';\nimport { RpcError } from '../error/RpcError';\nimport { SanityError } from '../error/SanityError';\nimport { StreamNotFoundError } from '../error/StreamNotFoundError';\nimport { RawStreamData, RawStreamStatusEnum } from '../types/data';\nimport { StreamEvent } from '../types/events';\nimport { PaginationOptions, Paginated } from '../types/pagination';\nimport { IStream, StreamInfo, StreamGroupCommonInfo, StreamProgress, StreamStatus } from '../types/stream';\nimport { readCoinOrBalanceAmount, unwrapMoveFields } from '../utils/moveObjectFields';\nimport { MpayObjectResponse, mpayGetObject } from '../utils/rpc';\nimport { MAX_U64, roundDateTime, roundDuration } from '../utils/utils';\n\nexport class Stream implements IStream {\n  private readonly streamContract: StreamContract;\n\n  public readonly type = 'Stream';\n\n  constructor(\n    public readonly globals: Globals,\n    public readonly streamId: string,\n    public rawData: RawStreamData,\n  ) {\n    this.streamContract = new StreamContract(globals.envConfig.contract, globals);\n  }\n\n  static async new(globals: Globals, streamId: string) {\n    const rawData = await Stream.fetchStreamData(globals, streamId);\n    return new Stream(globals, streamId, rawData);\n  }\n\n  static fromObjectData(globals: Globals, streamId: string, data: MpayObjectResponse) {\n    const rawData = Stream.parseRawStreamData(streamId, data);\n    return new Stream(globals, streamId, rawData);\n  }\n\n  get info(): StreamInfo {\n    return {\n      name: this.name,\n      creator: this.creator,\n      coinType: this.coinType,\n      totalAmount: this.totalAmount,\n      start: this.timeStart,\n      end: this.timeEnd,\n      cancelable: this.cancelable,\n      cliffAmount: this.cliff,\n      duration: this.duration,\n      interval: this.interval,\n      steps: this.totalSteps,\n      nextReleaseDate: this.nextReleaseDate,\n      nextReleaseAmount: this.nextReleaseAmount,\n\n      groupId: this.groupId,\n      streamId: this.streamId,\n      recipient: this.recipient,\n      progress: this.progress,\n      autoClaim: this.autoClaim,\n    };\n  }\n\n  get groupCommonInfo(): StreamGroupCommonInfo {\n    return {\n      name: this.name,\n      groupId: this.groupId,\n      creator: this.creator,\n      start: this.timeStart,\n      interval: this.interval,\n      steps: this.totalSteps,\n      cancelable: this.cancelable,\n    };\n  }\n\n  async refresh() {\n    this.rawData = await Stream.fetchStreamData(this.globals, this.streamId);\n  }\n\n  refreshWithData(data: MpayObjectResponse) {\n    if (data.data?.objectId !== this.streamId) {\n      throw new SanityError('Object Id does not align');\n    }\n    this.rawData = Stream.parseRawStreamData(this.streamId, data);\n  }\n\n  async historyEvents(pagination?: PaginationOptions): Promise<Paginated<StreamEvent>> {\n    return this.globals.backend.getStreamHistory({\n      streamId: this.streamId,\n      pagination,\n    });\n  }\n\n  async cancel() {\n    if ((await this.globals.walletAddress()) !== this.creator) {\n      throw new NotCreatorError();\n    }\n    const txb = new Transaction();\n    this.streamContract.cancelStream(txb, {\n      streamId: this.streamId,\n      coinType: this.coinType,\n    });\n    return txb;\n  }\n\n  async claim() {\n    if ((await this.globals.walletAddress()) !== this.recipient) {\n      throw new NotRecipientError();\n    }\n    const txb = new Transaction();\n    this.streamContract.claimStream(txb, {\n      streamId: this.streamId,\n      coinType: this.coinType,\n    });\n    return txb;\n  }\n\n  async setAutoClaim(enabled: boolean) {\n    if ((await this.globals.walletAddress()) !== this.recipient) {\n      throw new NotRecipientError();\n    }\n    const txb = new Transaction();\n    this.streamContract.setAutoClaim(txb, {\n      streamId: this.streamId,\n      coinType: this.coinType,\n      enabled,\n    });\n    return txb;\n  }\n\n  async claimByProxy() {\n    const txb = new Transaction();\n    this.streamContract.claimStreamByProxy(txb, {\n      streamId: this.streamId,\n      coinType: this.coinType,\n    });\n    return txb;\n  }\n\n  get wallet() {\n    return this.globals.wallet;\n  }\n\n  get client() {\n    return this.globals.suiClient;\n  }\n\n  get coinType() {\n    return normalizeStructTag(this.rawData.coinType);\n  }\n\n  get progress(): StreamProgress {\n    return {\n      status: this.streamStatus,\n      total: this.totalAmount,\n      streamed: this.streamedAmount,\n      claimed: this.claimedAmount,\n      claimable: this.claimable,\n      canceled: this.canceledAmount,\n    };\n  }\n\n  get balance() {\n    return this.rawData.balance;\n  }\n\n  get autoClaim() {\n    return this.rawData.autoClaim;\n  }\n\n  get amountPerEpoch() {\n    return this.rawData.config.amountPerEpoch;\n  }\n\n  get cancelable() {\n    return this.rawData.config.cancelable;\n  }\n\n  get cliff() {\n    return this.rawData.config.cliff;\n  }\n\n  get creator() {\n    return this.rawData.config.creator;\n  }\n\n  get interval(): Duration {\n    return roundDuration(this.rawData.config.epochInterval);\n  }\n\n  get groupId() {\n    const { metadata } = this.rawData.config;\n    const md = decodeMetadata(metadata);\n    return md.groupId;\n  }\n\n  get name() {\n    const { metadata } = this.rawData.config;\n    const md = decodeMetadata(metadata);\n    return md.name;\n  }\n\n  get recipient() {\n    return this.rawData.config.recipient;\n  }\n\n  get timeStart(): DateTime {\n    return roundDateTime(this.rawData.config.timeStart);\n  }\n\n  get duration(): Duration {\n    const rawConfig = this.rawData.config;\n    const duration = rawConfig.epochInterval * rawConfig.totalEpoch;\n    return roundDuration(duration);\n  }\n\n  get timeEnd(): DateTime {\n    return this.timeStart.plus(this.duration);\n  }\n\n  get totalSteps(): bigint {\n    return this.rawData.config.totalEpoch;\n  }\n\n  get claimable(): bigint {\n    return this.streamedAmount - this.claimedAmount;\n  }\n\n  get nextReleaseDate(): DateTime | null {\n    if (this.currentEpoch === -1n) {\n      return this.timeStart;\n    }\n    if (this.currentEpoch >= this.totalSteps || this.isCanceled) {\n      return null;\n    }\n    return roundDateTime((this.currentEpoch + 1n) * this.rawData.config.epochInterval + this.rawData.config.timeStart);\n  }\n\n  get nextReleaseAmount(): bigint | null {\n    if (this.currentEpoch === -1n) {\n      return this.cliff;\n    }\n    if (this.currentEpoch >= this.totalSteps || this.isCanceled) {\n      return null;\n    }\n    return this.amountPerEpoch;\n  }\n\n  get streamStatus(): StreamStatus {\n    const rawStatus = this.rawData.status.status;\n    if (rawStatus === RawStreamStatusEnum.CANCELED) {\n      return StreamStatus.CANCELED;\n    }\n    if (rawStatus === RawStreamStatusEnum.CANCELED_COMPLETED) {\n      return StreamStatus.SETTLED;\n    }\n    if (rawStatus === RawStreamStatusEnum.COMPLETED) {\n      return StreamStatus.COMPLETED;\n    }\n    if (this.currentEpoch >= this.totalSteps) {\n      return StreamStatus.STREAMED;\n    }\n    return StreamStatus.STREAMING;\n  }\n\n  get streamedAmount() {\n    if (this.currentEpoch === -1n) {\n      return 0n;\n    }\n    if (this.isCanceled) {\n      return this.rawData.status.epochCanceled * this.amountPerEpoch + this.cliff;\n    }\n    return this.currentEpoch * this.amountPerEpoch + this.cliff;\n  }\n\n  get claimedAmount() {\n    if (this.rawData.status.epochClaimed === MAX_U64) {\n      return 0n;\n    }\n    return this.rawData.status.epochClaimed * this.amountPerEpoch + this.cliff;\n  }\n\n  get currentEpoch() {\n    const timeNowMs = DateTime.now().toMillis();\n    const timeStartMs = this.timeStart.toMillis();\n    if (timeNowMs < timeStartMs) {\n      return -1n;\n    }\n    const epoch = Math.floor((timeNowMs - timeStartMs) / Number(this.rawData.config.epochInterval));\n    return BigInt(epoch) > Number(this.rawData.config.totalEpoch) ? this.rawData.config.totalEpoch : BigInt(epoch);\n  }\n\n  get totalAmount() {\n    const rawConfig = this.rawData.config;\n    return rawConfig.amountPerEpoch * rawConfig.totalEpoch + rawConfig.cliff;\n  }\n\n  get isCanceled() {\n    const rawStatus = this.rawData.status.status;\n    return rawStatus === RawStreamStatusEnum.CANCELED || rawStatus === RawStreamStatusEnum.CANCELED_COMPLETED;\n  }\n\n  get canceledAmount() {\n    return this.isCanceled ? this.totalAmount - this.streamedAmount : 0n;\n  }\n\n  private static async fetchStreamData(globals: Globals, streamId: string) {\n    const res = await mpayGetObject(globals.suiClient, streamId);\n    return Stream.parseRawStreamData(streamId, res);\n  }\n\n  static parseRawStreamData(streamId: string, res: MpayObjectResponse): RawStreamData {\n    if (res.error) {\n      if (res.error.code === 'notExists') {\n        throw new StreamNotFoundError(streamId);\n      }\n      throw new RpcError(`get stream data: ${res.error.code}`, {\n        streamId,\n        ...res.error,\n      });\n    }\n    const content = res.data?.content;\n    if (!content || content.dataType !== 'moveObject') {\n      throw new RpcError('Unexpected object type', {\n        gotType: content?.dataType,\n      });\n    }\n    const { typeParams } = parseStructTag(content.type);\n    const coinType = normalizeStructTag(typeParams[0]);\n\n    const dataFields = content.fields as Record<string, unknown>;\n    const config = unwrapMoveFields(dataFields.config);\n    const status = unwrapMoveFields(dataFields.status);\n\n    return {\n      coinType,\n      autoClaim: dataFields.auto_claim as boolean,\n      balance: readCoinOrBalanceAmount(dataFields.balance),\n      config: {\n        amountPerEpoch: BigInt(String(config.amount_per_epoch)),\n        cancelable: config.cancelable as boolean,\n        cliff: BigInt(String(config.cliff)),\n        creator: String(config.creator),\n        epochInterval: BigInt(String(config.epoch_interval)),\n        metadata: String(config.metadata),\n        recipient: String(config.recipient),\n        timeStart: BigInt(String(config.time_start)),\n        totalEpoch: BigInt(String(config.total_epoch)),\n      },\n      status: {\n        status: status.status as RawStreamStatusEnum,\n        epochCanceled: BigInt(String(status.epoch_canceled)),\n        epochClaimed: BigInt(String(status.epoch_claimed)),\n      },\n    };\n  }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotCreatorError extends MPayError {\n  constructor() {\n    super(MPayErrorCode.NotCreator, 'Connected wallet is not creator');\n  }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotRecipientError extends MPayError {\n  constructor() {\n    super(MPayErrorCode.NotRecipient, 'Connected wallet is not recipient');\n  }\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\n/**\n * SanityError is the error reported because of error in code.\n * For normal user process, the sanity error shall never be thrown.\n */\nexport class SanityError extends MPayError {\n  constructor(msg: string, options: { cause?: unknown; context?: JsonObject } = {}) {\n    super(MPayErrorCode.sanity, msg, options);\n  }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class StreamNotFoundError extends MPayError {\n  constructor(streamId: string) {\n    super(MPayErrorCode.StreamNotFound, 'Stream not found', {\n      context: {\n        streamId,\n      },\n    });\n  }\n}\n","// eslint-disable-next-line no-bitwise\nimport { DateTime, Duration } from 'luxon';\n\n// eslint-disable-next-line no-bitwise\nexport const MAX_U64 = (1n << 64n) - 1n;\n\nexport const TIME_ROUND_UNIT = 1000;\n\n// roundTime round date to seconds\nexport function roundDateTime(date: DateTime | number | bigint) {\n  let dateMs: number;\n  if (typeof date === 'number') {\n    dateMs = date;\n  } else if (typeof date === 'bigint') {\n    dateMs = Number(date);\n  } else {\n    dateMs = date.toMillis();\n  }\n  const roundMs = Math.round(dateMs / TIME_ROUND_UNIT);\n  return DateTime.fromMillis(roundMs * TIME_ROUND_UNIT);\n}\n\nexport function roundDuration(duration: Duration | number | bigint) {\n  let durationMs: number;\n  if (typeof duration === 'number') {\n    durationMs = duration;\n  } else if (typeof duration === 'bigint') {\n    durationMs = Number(duration);\n  } else {\n    durationMs = duration.toMillis();\n  }\n  const roundMs = Math.round(durationMs / TIME_ROUND_UNIT);\n  return Duration.fromMillis(roundMs * TIME_ROUND_UNIT);\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\nexport class InvalidStreamGroupError extends MPayError {\n  constructor(msg: string, context?: JsonObject) {\n    super(MPayErrorCode.InvalidStreamGroup, `Invalid stream group: ${msg}`, { context });\n  }\n}\n","import { PagedData, Requester } from './requester';\n\nexport const REQUEST_PAGE_SIZE = 25;\n\nexport interface SuiIterator<T> {\n  next: () => Promise<T | undefined>;\n  hasNext: () => Promise<boolean>;\n}\n\nexport async function getAllFromIterator<T>(it: SuiIterator<T>): Promise<(T | undefined) | (T | undefined)[]> {\n  const res: (T | undefined)[] = [];\n  while (await it.hasNext()) {\n    const val = await it.next();\n    res.push(val);\n  }\n  if (res && Array.isArray(res[0])) {\n    return res.flat(1) as T;\n  }\n  return res;\n}\n\nexport class PagedIterator<T> implements SuiIterator<(T | undefined)[]> {\n  private curPage: PagedData<T> | undefined;\n\n  private init: boolean;\n\n  constructor(public readonly requester: Requester<T>) {\n    this.curPage = undefined;\n    this.init = true;\n  }\n\n  async hasNext(): Promise<boolean> {\n    if (this.init) {\n      if (!this.curPage) {\n        this.curPage = await this.requester.doNextRequest();\n      }\n      return !!this.curPage.data?.length || this.curPage.hasNext;\n    }\n    if (!this.curPage) {\n      throw new Error('invalid implementation of iterator');\n    }\n    return this.curPage.hasNext;\n  }\n\n  async next(): Promise<(T | undefined)[]> {\n    if (this.init) {\n      this.init = false;\n      if (!this.curPage) {\n        this.curPage = await this.requester.doNextRequest();\n      }\n      return this.curPage.data;\n    }\n    this.curPage = await this.requester.doNextRequest();\n    return this.curPage.data;\n  }\n}\n\nexport class EntryIterator<T> implements SuiIterator<T> {\n  cursor: number;\n\n  pager: PagedIterator<T>;\n\n  curData: (T | undefined)[];\n\n  constructor(public readonly requester: Requester<T>) {\n    this.pager = new PagedIterator<T>(requester);\n    this.curData = [];\n    this.cursor = 0;\n  }\n\n  async hasNext(): Promise<boolean> {\n    if (this.cursor < this.curData.length - 1) {\n      return true;\n    }\n    return this.pager.hasNext();\n  }\n\n  async next(): Promise<T | undefined> {\n    this.cursor += 1;\n    while (this.cursor >= this.curData.length) {\n      if (!(await this.pager.hasNext())) {\n        throw new Error('not more data'); // Shall not happen for legit data source.\n      } else {\n        this.curData = await this.pager.next();\n        this.cursor = 0;\n      }\n    }\n    return this.curData[this.cursor];\n  }\n}\n","import type { MsafeSuiGrpcClient } from '@/lib/suiGrpcClient';\n\nimport { SuiIterator, getAllFromIterator, EntryIterator } from './iterator';\nimport { Requester, PagedData } from './requester';\nimport { MpayObjectResponse, mpayMultiGetObjects } from '../../utils/rpc';\n\nexport type ObjectFilter = (objRes: MpayObjectResponse) => boolean;\n\nexport const REQUEST_PAGE_SIZE = 25;\n\nexport type ObjectDataOptions = {\n  showType?: boolean;\n  showContent?: boolean;\n};\n\n// OidIter is the iterator to give the list of object ids\nexport type OidIter = SuiIterator<string>;\nexport interface BatchObjectOptions {\n  filter?: ObjectFilter;\n  pageSize?: number;\n  objectOptions?: ObjectDataOptions;\n}\n\n// getObjectsById get the list of objects by id.\n// Compared with the multiGetObject method defined by SUI, this method will do the pagination\n// for get object requests.\nexport async function getObjectsById(\n  suiClient: MsafeSuiGrpcClient,\n  ids: string[],\n  options?: BatchObjectOptions,\n): Promise<(MpayObjectResponse | undefined)[]> {\n  const oidIter = new ListOidIterator(ids);\n  const iter = new ObjectBatchIterator(suiClient, oidIter, options);\n  return (await getAllFromIterator(iter)) as MpayObjectResponse[];\n}\n\n// ListOidIterator is the iterator that iterate through a list of ids.\n// This iterator shall be used when the number requested objects is big\n// which is inappropriate to fit the requested objects into a single\n// request.\nexport class ListOidIterator implements OidIter {\n  cursor: number;\n\n  constructor(public readonly ids: string[]) {\n    this.cursor = -1;\n  }\n\n  async hasNext(): Promise<boolean> {\n    return this.cursor < this.ids.length - 1;\n  }\n\n  async next(): Promise<string> {\n    this.cursor += 1;\n    if (this.cursor >= this.ids.length) {\n      throw new Error('invalid iterator implementation'); // Shall be unreachable\n    }\n    return this.ids[this.cursor];\n  }\n}\n\nexport class ObjectBatchIterator extends EntryIterator<MpayObjectResponse> {\n  constructor(\n    public readonly suiClient: MsafeSuiGrpcClient,\n    public readonly idIter: OidIter,\n    public readonly options?: BatchObjectOptions,\n  ) {\n    super(new ObjectBatchRequester(suiClient, idIter, options));\n  }\n}\n\n// TODO: Unit test this class\nexport class ObjectBatchRequester implements Requester<MpayObjectResponse> {\n  filter: ObjectFilter | undefined;\n\n  pageSize: number;\n\n  objectOptions: ObjectDataOptions;\n\n  constructor(\n    public readonly suiClient: MsafeSuiGrpcClient,\n    public readonly stringIter: OidIter,\n    public options?: BatchObjectOptions,\n  ) {\n    this.filter = options?.filter;\n    this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n    this.objectOptions = options?.objectOptions || {\n      showType: true,\n      showContent: true,\n    };\n  }\n\n  async doNextRequest(): Promise<PagedData<MpayObjectResponse>> {\n    const requestPage: string[] = [];\n    while (requestPage.length < this.pageSize) {\n      const hasNext = await this.stringIter.hasNext();\n      if (!hasNext) {\n        break;\n      }\n      const objId = await this.stringIter.next();\n      if (objId) {\n        requestPage.push(objId);\n      }\n    }\n    const res = await mpayMultiGetObjects(this.suiClient, requestPage);\n    let filtered: MpayObjectResponse[];\n    if (this.filter) {\n      const { filter } = this;\n      filtered = res.filter((r): r is MpayObjectResponse => !!r && filter(r));\n    } else {\n      filtered = res.filter((r): r is MpayObjectResponse => !!r);\n    }\n    return {\n      data: filtered,\n      hasNext: await this.stringIter.hasNext(),\n    };\n  }\n}\n","import { Stream } from './Stream';\nimport { Globals } from '../common';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { InvalidStreamGroupError } from '../error/InvalidStreamGroupError';\nimport { SanityError } from '../error/SanityError';\nimport { getObjectsById } from '../sui/iterator/object';\nimport { StreamEvent } from '../types/events';\nimport { PaginationOptions, Paginated } from '../types/pagination';\nimport { IStreamGroup, StreamGroupInfo, StreamGroupProgress, StreamGroupCommonInfo } from '../types/stream';\nimport { MpayObjectResponse } from '../utils/rpc';\n\nexport class StreamGroup implements IStreamGroup {\n  public readonly type = 'StreamGroup';\n\n  constructor(\n    public readonly globals: Globals,\n    public readonly streams: Stream[],\n  ) {\n    if (streams.length === 0) {\n      throw new InvalidStreamGroupError('stream size 0');\n    }\n    const gids = streams.map((st) => st.groupId);\n    const set = new Set(gids);\n    if (set.size !== 1) {\n      throw new InvalidInputError('Stream does not have same group ID');\n    }\n  }\n\n  static async new(globals: Globals, ids: string[]) {\n    const streamObjs = await getObjectsById(globals.suiClient, ids);\n    streamObjs.forEach((obj) => {\n      if (!obj) {\n        throw new SanityError('stream group object data undefined');\n      }\n    });\n    return StreamGroup.newFromObjectResponse(globals, ids, streamObjs as MpayObjectResponse[]);\n  }\n\n  static async newFromObjectResponse(globals: Globals, ids: string[], responses: MpayObjectResponse[]) {\n    const streams = await StreamGroup.parseGroupStreams(globals, ids, responses);\n    return new StreamGroup(globals, streams);\n  }\n\n  static checkStreamGroup(streams: Stream[]) {\n    const commonInfos = streams.map((stream) => stream.groupCommonInfo);\n    const expInfo = commonInfos[0];\n    let isEqual = true;\n    commonInfos.forEach((info) => {\n      if (!isEqualStreamGroupCommonInfo(expInfo, info)) {\n        isEqual = false;\n      }\n    });\n    return isEqual;\n  }\n\n  async refresh() {\n    const streamObjs = await getObjectsById(\n      this.globals.suiClient,\n      this.streams.map((stream) => stream.streamId),\n    );\n    this.streams.forEach((stream, i) => {\n      stream.refreshWithData(streamObjs[i] as MpayObjectResponse);\n    });\n  }\n\n  get groupId() {\n    return this.streams[0].groupId;\n  }\n\n  get creator() {\n    return this.streams[0].creator;\n  }\n\n  get info(): StreamGroupInfo {\n    return {\n      groupId: this.groupId,\n      streamIds: this.streams.map((st) => st.streamId),\n      progress: this.progress,\n\n      name: this.streams[0].name,\n      creator: this.creator,\n      coinType: this.streams[0].coinType,\n      totalAmount: this.streams.reduce((sum, st) => sum + st.totalAmount, 0n),\n      start: this.streams[0].timeStart,\n      end: this.streams[0].timeEnd,\n      cancelable: this.streams[0].cancelable,\n      cliffAmount: this.streams.reduce((sum, st) => sum + st.cliff, 0n),\n      duration: this.streams[0].duration,\n      interval: this.streams[0].interval,\n      steps: this.streams[0].totalSteps,\n      nextReleaseAmount: this.streams.reduce((sum, st) => {\n        if (st.nextReleaseAmount === null) {\n          return sum;\n        }\n        return sum + st.nextReleaseAmount;\n      }, 0n),\n      nextReleaseDate: this.streams[0].nextReleaseDate,\n    };\n  }\n\n  get progress(): StreamGroupProgress {\n    return {\n      total: this.streams.reduce((sum, st) => sum + st.totalAmount, 0n),\n      streamed: this.streams.reduce((sum, st) => sum + st.streamedAmount, 0n),\n      claimed: this.streams.reduce((sum, st) => sum + st.claimedAmount, 0n),\n      claimable: this.streams.reduce((sum, st) => sum + st.claimable, 0n),\n      canceled: this.streams.reduce((sum, st) => sum + st.canceledAmount, 0n),\n    };\n  }\n\n  async historyEvents(pagination?: PaginationOptions): Promise<Paginated<StreamEvent>> {\n    return this.globals.backend.getStreamHistory({\n      groupId: this.groupId,\n      pagination,\n    });\n  }\n\n  private static async parseGroupStreams(globals: Globals, ids: string[], responses: MpayObjectResponse[]) {\n    const streams = responses\n      .map((obj, i) => Stream.fromObjectData(globals, ids[i], obj))\n      .filter((stream) => !!stream) as Stream[];\n\n    if (new Set(streams.map((st) => st.groupId)).size !== 1) {\n      throw new InvalidStreamGroupError('Not same group ID');\n    }\n    if (!this.checkStreamGroup(streams)) {\n      throw new InvalidStreamGroupError('Not same stream settings');\n    }\n    return streams;\n  }\n}\n\nfunction isEqualStreamGroupCommonInfo(info1: StreamGroupCommonInfo, info2: StreamGroupCommonInfo): boolean {\n  return (\n    info1.name === info2.name &&\n    info1.groupId === info2.groupId &&\n    info1.creator === info2.creator &&\n    info1.start.toMillis() === info2.start.toMillis() &&\n    info1.interval.toMillis() === info2.interval.toMillis() &&\n    info1.steps === info2.steps &&\n    info1.cancelable === info2.cancelable\n  );\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotEnoughBalanceError extends MPayError {\n  constructor(\n    public readonly coinType: string,\n    public readonly requestAmount: bigint,\n    public readonly gotAmount: bigint,\n  ) {\n    super(MPayErrorCode.NotEnoughBalance, `Not enough balance: ${coinType}`, {\n      context: {\n        coinType,\n        requestAmount,\n        gotAmount,\n      },\n    });\n  }\n}\n","import type { MsafeSuiGrpcClient } from '@/lib/suiGrpcClient';\n\nimport { getAllFromIterator, EntryIterator } from './iterator';\nimport { Requester, PagedData } from './requester';\nimport { NotEnoughBalanceError } from '../../error/NotEnoughBalanceError';\nimport { SanityError } from '../../error/SanityError';\nimport { MpayCoin, mpayGetCoins } from '../../utils/rpc';\n\nconst DEF_REQ_PAGE_SIZE = 25;\n\nexport async function getCoinsWithAmount(\n  suiClient: MsafeSuiGrpcClient,\n  owner: string,\n  requestAmount: bigint,\n  coinType = '0x2::sui::SUI',\n  pageSize: number = DEF_REQ_PAGE_SIZE,\n) {\n  const it = new OwnedCoinIterator(suiClient, owner, coinType, pageSize);\n  let totalAmount = BigInt(0);\n  const res: MpayCoin[] = [];\n  while ((await it.hasNext()) && totalAmount < requestAmount) {\n    const val = await it.next();\n    if (!val) {\n      continue;\n    }\n    res.push(val);\n    totalAmount += BigInt(val.balance);\n  }\n  if (totalAmount < requestAmount) {\n    throw new NotEnoughBalanceError(coinType, requestAmount, totalAmount);\n  }\n  return res;\n}\n\nexport async function getAllOwnedCoins(\n  suiClient: MsafeSuiGrpcClient,\n  owner: string,\n  coinType = '0x2::sui::SUI',\n  pageSize: number = DEF_REQ_PAGE_SIZE,\n) {\n  const iter = new OwnedCoinIterator(suiClient, owner, coinType, pageSize);\n  return (await getAllFromIterator(iter)) as MpayCoin[];\n}\n\nexport class OwnedCoinIterator extends EntryIterator<MpayCoin> {\n  constructor(\n    private readonly suiClient: MsafeSuiGrpcClient,\n    private readonly owner: string,\n    private readonly coinType: string,\n    private readonly reqPageSize: number,\n  ) {\n    super(new OwnedCoinRequester(suiClient, owner, coinType, reqPageSize));\n  }\n}\n\nexport class OwnedCoinRequester implements Requester<MpayCoin> {\n  nextCursor: string | null | undefined;\n\n  constructor(\n    private readonly suiClient: MsafeSuiGrpcClient,\n    private readonly owner: string,\n    private readonly coinType: string,\n    private readonly reqPageSize: number,\n  ) {\n    if (reqPageSize <= 0) {\n      throw new SanityError('Invalid reqPageSize');\n    }\n  }\n\n  async doNextRequest(): Promise<PagedData<MpayCoin>> {\n    const res = await mpayGetCoins(this.suiClient, {\n      owner: this.owner,\n      coinType: this.coinType,\n      cursor: this.nextCursor,\n      limit: this.reqPageSize,\n    });\n    this.nextCursor = res.nextCursor;\n    return {\n      data: res.data,\n      hasNext: res.hasNextPage,\n    };\n  }\n}\n","import { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\n\nexport abstract class StreamIntention<T> extends BaseIntentionGrpc<T> {\n  public application = 'mpay';\n\n  getClient(network: SuiNetworks, account: WalletAccount, suiGrpcClient: SuiGrpcClient): MPayClient {\n    const mpayClient = new MPayClient(network === 'sui:mainnet' ? Env.prod : Env.dev, {\n      suiGrpcClient: suiGrpcClient as never,\n    });\n    mpayClient.connectSingleWallet(new MSafeSingleWallet(account));\n    return mpayClient;\n  }\n}\n","import { ClaimByProxyStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class ClaimByProxyStreamIntention extends StreamIntention<ClaimByProxyStreamIntentionData> {\n  txType = TransactionType.Stream;\n\n  txSubType = StreamTransactionType.CLAIM_BY_PROXY;\n\n  constructor(public readonly data: ClaimByProxyStreamIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const { network, account, suiGrpcClient } = input;\n    const mpayClient = this.getClient(network, account, suiGrpcClient);\n    const stream = await mpayClient.getStream(this.data.streamId);\n    return stream.claimByProxy();\n  }\n}\n","import { ClaimStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class ClaimStreamIntention extends StreamIntention<ClaimStreamIntentionData> {\n  txType = TransactionType.Stream;\n\n  txSubType = StreamTransactionType.CLAIM;\n\n  constructor(public readonly data: ClaimStreamIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const { network, account, suiGrpcClient } = input;\n    const mpayClient = this.getClient(network, account, suiGrpcClient);\n    const stream = await mpayClient.getStream(this.data.streamId);\n    return stream.claim();\n  }\n}\n","import { CreateStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class CreateStreamIntention extends StreamIntention<CreateStreamIntentionData> {\n  txType = TransactionType.Stream;\n\n  txSubType = StreamTransactionType.CREATE_STREAM;\n\n  constructor(public readonly data: CreateStreamIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const { network, account, suiGrpcClient } = input;\n    const mpayClient = this.getClient(network, account, suiGrpcClient);\n    return mpayClient.createStream(this.data);\n  }\n}\n","import { fromBase64 } from '@mysten/bcs';\nimport { bcs, pureBcsSchemaFromTypeName, type PureTypeName } from '@mysten/sui/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui/utils';\n\ntype TxData = ReturnType<Transaction['getData']>;\ntype TransactionCommand = TxData['commands'][number];\ntype TransactionInput = TxData['inputs'][number];\ntype MoveCallCommand = Extract<TransactionCommand, { $kind: 'MoveCall' }>;\n\nfunction parsePureBytes(input: TransactionInput): Uint8Array {\n  if (!input.Pure) {\n    throw new Error('not pure argument');\n  }\n  return fromBase64(input.Pure.bytes);\n}\n\nexport class MoveCallHelper {\n  constructor(\n    public readonly moveCall: TransactionCommand,\n    public readonly txb: Transaction,\n  ) {}\n\n  private get moveCallData(): MoveCallCommand['MoveCall'] {\n    if (this.moveCall.$kind !== 'MoveCall') {\n      throw new Error('not move call command');\n    }\n    return this.moveCall.MoveCall;\n  }\n\n  private get inputs() {\n    return this.txb.getData().inputs;\n  }\n\n  private getInputIndex(argIndex: number): number {\n    const arg = this.moveCallData.arguments[argIndex];\n    if (arg.$kind !== 'Input') {\n      throw new Error('not input type');\n    }\n    return arg.Input;\n  }\n\n  private getInputParam(argIndex: number): TransactionInput {\n    return this.inputs[this.getInputIndex(argIndex)];\n  }\n\n  decodeSharedObjectId(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return MoveCallHelper.getSharedObjectId(input);\n  }\n\n  decodeOwnedObjectId(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return MoveCallHelper.getOwnedObjectId(input);\n  }\n\n  decodeInputU64(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return BigInt(bcs.U64.parse(parsePureBytes(input)));\n  }\n\n  decodeInputAddress(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return normalizeSuiAddress(bcs.Address.parse(parsePureBytes(input)));\n  }\n\n  decodeInputString(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return bcs.String.parse(parsePureBytes(input));\n  }\n\n  decodeInputBool(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return bcs.Bool.parse(parsePureBytes(input));\n  }\n\n  decodePureArg<T>(argIndex: number, bcsType: string) {\n    const input = this.getInputParam(argIndex);\n    return MoveCallHelper.getPureInputValue<T>(input, bcsType);\n  }\n\n  static getPureInputValue<T>(input: TransactionInput, bcsType: string) {\n    return MoveCallHelper.getPureInput<T>(input, bcsType);\n  }\n\n  static getOwnedObjectId(input: TransactionInput) {\n    const objectId =\n      input.Object?.ImmOrOwnedObject?.objectId ?? input.Object?.Receiving?.objectId ?? input.UnresolvedObject?.objectId;\n    if (!objectId) {\n      throw new Error(`not object argument: ${JSON.stringify(input)}`);\n    }\n    return normalizeSuiAddress(objectId);\n  }\n\n  static getSharedObjectId(input: TransactionInput) {\n    const objectId = input.Object?.SharedObject?.objectId ?? input.UnresolvedObject?.objectId;\n    if (!objectId) {\n      throw new Error(`not shared object argument: ${JSON.stringify(input)}`);\n    }\n    return normalizeSuiAddress(objectId);\n  }\n\n  static getPureInput<T>(input: TransactionInput, bcsType: string) {\n    const schema = pureBcsSchemaFromTypeName(bcsType as PureTypeName);\n    return schema.parse(parsePureBytes(input)) as T;\n  }\n\n  typeArg(index: number) {\n    return normalizeStructTag(this.moveCallData.typeArguments[index]);\n  }\n\n  txArg(index: number) {\n    return this.moveCallData.arguments[index];\n  }\n}\n","import { Transaction } from '@mysten/sui/transactions';\n\nimport { CreateStreamHelper } from '../builder/CreateStreamHelper';\nimport { Globals } from '../common';\nimport { MoveCallHelper } from './moveCall';\nimport { FeeContract } from '../contract/FeeContract';\nimport { StreamContract } from '../contract/StreamContract';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { SanityError } from '../error/SanityError';\nimport { decodeMetadata } from '../stream/metadata';\nimport { getMoveCallTarget, isSameTarget } from '../sui/utils';\nimport { CreateStreamInfo, RecipientWithAmount } from '../types/client';\nimport { DecodedCreateStream, StreamTransactionType } from '../types/decode';\n\nexport class CreateStreamDecodeHelper {\n  constructor(\n    public readonly globals: Globals,\n    public readonly txb: Transaction,\n  ) {}\n\n  decode(): DecodedCreateStream {\n    const streamInfo = this.decodeCreateStreamInfo();\n    const fees = this.createStreamHelper().calculateCreateStreamFees(streamInfo);\n    return {\n      type: StreamTransactionType.CREATE_STREAM,\n      info: streamInfo,\n      fees,\n    };\n  }\n\n  private decodeCreateStreamInfo(): CreateStreamInfo {\n    const moveCalls = this.createStreamTransactions();\n    const infos = moveCalls.map((moveCall) => this.getCreationInfoFromMoveCall(moveCall));\n    return this.aggregateGroupStreamInfo(infos);\n  }\n\n  private createStreamTransactions(): MoveCallHelper[] {\n    const txs = this.commands.filter(\n      (command) =>\n        command.$kind === 'MoveCall' && isSameTarget(getMoveCallTarget(command)!, this.contract.createStreamTarget),\n    );\n    if (txs.length === 0) {\n      throw new SanityError('No create stream transactions');\n    }\n    return txs.map((tx) => new MoveCallHelper(tx, this.txb));\n  }\n\n  private getCreationInfoFromMoveCall(moveCall: MoveCallHelper): SingleStreamCreationInfo {\n    const metadata = moveCall.decodeInputString(4);\n    const { name, groupId } = decodeMetadata(metadata);\n\n    const recipient = moveCall.decodeInputAddress(5);\n    const timeStart = moveCall.decodeInputU64(6);\n    const cliff = moveCall.decodeInputU64(7);\n    const epochInterval = moveCall.decodeInputU64(8);\n    const totalEpoch = moveCall.decodeInputU64(9);\n    const amountPerEpoch = moveCall.decodeInputU64(10);\n    const cancelable = moveCall.decodeInputBool(11);\n    const coinType = moveCall.typeArg(0);\n\n    return {\n      name,\n      groupId,\n      recipient,\n      timeStart,\n      cliff,\n      epochInterval,\n      totalEpoch,\n      amountPerEpoch,\n      cancelable,\n      coinType,\n    };\n  }\n\n  private aggregateGroupStreamInfo(infos: SingleStreamCreationInfo[]): CreateStreamInfo {\n    const commonInfoSet = new Set(\n      infos.map((info) =>\n        JSON.stringify({\n          name: info.name,\n          groupId: info.groupId,\n          timeStart: String(info.timeStart),\n          epochInterval: String(info.epochInterval),\n          totalEpoch: String(info.totalEpoch),\n          cancelable: info.cancelable,\n          coinType: info.coinType,\n        }),\n      ),\n    );\n    if (commonInfoSet.size !== 1) {\n      throw new InvalidInputError('Stream group not have common info');\n    }\n    const recipients: RecipientWithAmount[] = infos.map((info) => ({\n      address: info.recipient,\n      amountPerStep: info.amountPerEpoch,\n      cliffAmount: info.cliff,\n    }));\n    return {\n      name: infos[0].name,\n      coinType: infos[0].coinType,\n      recipients,\n      interval: infos[0].epochInterval,\n      steps: infos[0].totalEpoch,\n      startTimeMs: infos[0].timeStart,\n      cancelable: infos[0].cancelable,\n    };\n  }\n\n  private get commands() {\n    return this.txb.getData().commands;\n  }\n\n  private get contract() {\n    return new StreamContract(this.globals.envConfig.contract, this.globals);\n  }\n\n  private get feeContract() {\n    return new FeeContract(this.globals.envConfig.contract, this.globals);\n  }\n\n  private createStreamHelper() {\n    return new CreateStreamHelper(this.globals, this.feeContract, this.contract);\n  }\n}\n\ninterface SingleStreamCreationInfo {\n  name: string;\n  groupId: string;\n  recipient: string;\n  timeStart: bigint;\n  cliff: bigint;\n  epochInterval: bigint;\n  totalEpoch: bigint;\n  amountPerEpoch: bigint;\n  cancelable: boolean;\n  coinType: string;\n}\n","import { Transaction } from '@mysten/sui/transactions';\n\nimport { CreateStreamDecodeHelper } from './create';\nimport { MoveCallHelper } from './moveCall';\nimport { Globals } from '../common';\nimport { StreamContract } from '../contract/StreamContract';\nimport { getMoveCallTarget, isSameTarget } from '../sui/utils';\nimport {\n  DecodedCancelStream,\n  DecodedClaimByProxy,\n  DecodedClaimStream,\n  DecodedCreateStream,\n  DecodedSetAutoClaim,\n  StreamDecodedTransaction,\n  StreamTransactionType,\n} from '../types/decode';\n\nexport class StreamTransactionDecoder {\n  static decodeTransaction(globals: Globals, txb: Transaction): StreamDecodedTransaction {\n    const helper = new DecodeHelper(globals, txb);\n    return helper.decode();\n  }\n}\n\nexport class DecodeHelper {\n  private readonly contract: StreamContract;\n\n  constructor(\n    public readonly globals: Globals,\n    public readonly txb: Transaction,\n  ) {\n    this.contract = new StreamContract(globals.envConfig.contract, globals);\n  }\n\n  decode(): StreamDecodedTransaction {\n    if (this.isCreateStreamTransaction()) {\n      return this.decodeCreateStreamTransaction();\n    }\n    if (this.isClaimByProxyTransaction()) {\n      return this.decodeClaimByProxyTransaction();\n    }\n    if (this.isSetAutoClaimTransaction()) {\n      return this.decodeSetAutoClaimTransaction();\n    }\n    if (this.isCancelStreamTransaction()) {\n      return this.decodeCancelStreamTransaction();\n    }\n    if (this.isClaimStreamTransaction()) {\n      return this.decodeClaimTransaction();\n    }\n    throw new Error('Unknown stream transaction type');\n  }\n\n  private get commands() {\n    return this.txb.getData().commands;\n  }\n\n  private isCreateStreamTransaction() {\n    const createStreamIndex = this.commands.findIndex(\n      (command) =>\n        command.$kind === 'MoveCall' && isSameTarget(getMoveCallTarget(command)!, this.contract.createStreamTarget),\n    );\n    return createStreamIndex !== -1;\n  }\n\n  private isSetAutoClaimTransaction() {\n    return (\n      this.commands.length === 1 &&\n      this.commands[0].$kind === 'MoveCall' &&\n      isSameTarget(getMoveCallTarget(this.commands[0])!, this.contract.setAutoClaimTarget)\n    );\n  }\n\n  private isCancelStreamTransaction() {\n    return (\n      this.commands.length === 1 &&\n      this.commands[0].$kind === 'MoveCall' &&\n      isSameTarget(getMoveCallTarget(this.commands[0])!, this.contract.cancelStreamTarget)\n    );\n  }\n\n  private isClaimStreamTransaction(): boolean {\n    return (\n      this.commands.length === 1 &&\n      this.commands[0].$kind === 'MoveCall' &&\n      isSameTarget(getMoveCallTarget(this.commands[0])!, this.contract.claimStreamTarget)\n    );\n  }\n\n  private isClaimByProxyTransaction(): boolean {\n    return (\n      this.commands.length === 1 &&\n      this.commands[0].$kind === 'MoveCall' &&\n      isSameTarget(getMoveCallTarget(this.commands[0])!, this.contract.claimStreamByProxyTarget)\n    );\n  }\n\n  private decodeCreateStreamTransaction(): DecodedCreateStream {\n    const helper = new CreateStreamDecodeHelper(this.globals, this.txb);\n    return helper.decode();\n  }\n\n  private decodeSetAutoClaimTransaction(): DecodedSetAutoClaim {\n    const streamId = this.helper.decodeSharedObjectId(0);\n    const enabled = this.helper.decodeInputBool(1);\n    return {\n      type: StreamTransactionType.SET_AUTO_CLAIM,\n      streamId,\n      enabled,\n    };\n  }\n\n  private decodeClaimTransaction(): DecodedClaimStream {\n    const streamId = this.helper.decodeSharedObjectId(0);\n    return {\n      type: StreamTransactionType.CLAIM,\n      streamId,\n    };\n  }\n\n  private decodeClaimByProxyTransaction(): DecodedClaimByProxy {\n    const streamId = this.helper.decodeSharedObjectId(0);\n    return {\n      type: StreamTransactionType.CLAIM_BY_PROXY,\n      streamId,\n    };\n  }\n\n  private decodeCancelStreamTransaction(): DecodedCancelStream {\n    const streamId = this.helper.decodeSharedObjectId(0);\n    return {\n      type: StreamTransactionType.CANCEL,\n      streamId,\n    };\n  }\n\n  private get helper() {\n    const moveCall = this.commands[0];\n    if (moveCall.$kind !== 'MoveCall') {\n      throw new Error('MoveCall not found');\n    }\n    return new MoveCallHelper(moveCall, this.txb);\n  }\n}\n","import { SetAutoClaimIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class SetAutoClaimStreamIntention extends StreamIntention<SetAutoClaimIntentionData> {\n  txType = TransactionType.Stream;\n\n  txSubType = StreamTransactionType.SET_AUTO_CLAIM;\n\n  constructor(public readonly data: SetAutoClaimIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const { network, account, suiGrpcClient } = input;\n    const mpayClient = this.getClient(network, account, suiGrpcClient);\n    const stream = await mpayClient.getStream(this.data.streamId);\n    return stream.setAutoClaim(this.data.enabled);\n  }\n}\n","import {\n  CancelStreamIntentionData,\n  ClaimByProxyStreamIntentionData,\n  ClaimStreamIntentionData,\n  CreateStreamIntentionData,\n  SetAutoClaimIntentionData,\n  TransactionType,\n} from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternalGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { CancelStreamIntention } from './cancel-stream';\nimport { ClaimByProxyStreamIntention } from './claim-by-proxy-stream';\nimport { ClaimStreamIntention } from './claim-stream';\nimport { Env, Globals } from './common';\nimport { CreateStreamIntention } from './create-stream';\nimport { DecodeHelper } from './decoder/decoder';\nimport { SetAutoClaimStreamIntention } from './set-auto-claim-stream';\nimport { StreamTransactionType } from './types/decode';\n\nexport type MPayIntention =\n  | CreateStreamIntention\n  | SetAutoClaimStreamIntention\n  | ClaimStreamIntention\n  | CancelStreamIntention\n  | ClaimByProxyStreamIntention;\n\nexport type MPayIntentionData =\n  | CreateStreamIntentionData\n  | SetAutoClaimIntentionData\n  | ClaimStreamIntentionData\n  | ClaimByProxyStreamIntentionData\n  | CancelStreamIntentionData;\n\nexport class MPayAppHelper implements IAppHelperInternalGrpc<MPayIntentionData> {\n  application = 'mpay';\n\n  supportSDK = '@mysten/sui-v2' as const;\n\n  async deserialize(input: {\n    transaction: Transaction;\n    chain: IdentifierString;\n    network: SuiNetworks;\n    suiGrpcClient: Parameters<IAppHelperInternalGrpc<MPayIntentionData>['deserialize']>[0]['suiGrpcClient'];\n    account: WalletAccount;\n  }): Promise<{ txType: TransactionType; txSubType: string; intentionData: MPayIntentionData }> {\n    const { network, transaction, suiGrpcClient } = input;\n    const globals = Globals.new(network === 'sui:mainnet' ? Env.prod : Env.dev, { suiGrpcClient });\n    const decoder = new DecodeHelper(globals, transaction);\n    const result = decoder.decode();\n\n    let intention: MPayIntention;\n\n    switch (result.type) {\n      case StreamTransactionType.CREATE_STREAM:\n        intention = new CreateStreamIntention(result.info);\n        break;\n      case StreamTransactionType.SET_AUTO_CLAIM:\n        intention = new SetAutoClaimStreamIntention({ streamId: result.streamId, enabled: result.enabled });\n        break;\n      case StreamTransactionType.CLAIM:\n        intention = new ClaimStreamIntention({ streamId: result.streamId });\n        break;\n      case StreamTransactionType.CLAIM_BY_PROXY:\n        intention = new ClaimByProxyStreamIntention({ streamId: result.streamId });\n        break;\n      case StreamTransactionType.CANCEL:\n        intention = new CancelStreamIntention({ streamId: result.streamId });\n        break;\n      default:\n        throw new Error(`Unknown transaction type: ${result}`);\n    }\n\n    return {\n      txType: intention.txType,\n      txSubType: intention.txSubType,\n      intentionData: intention.data,\n    };\n  }\n\n  async build(input: {\n    intentionData: MPayIntentionData;\n    txType: TransactionType;\n    txSubType: string;\n    suiGrpcClient: Parameters<IAppHelperInternalGrpc<MPayIntentionData>['build']>[0]['suiGrpcClient'];\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { intentionData } = input;\n    let intention: MPayIntention;\n    switch (input.txSubType as StreamTransactionType) {\n      case StreamTransactionType.CREATE_STREAM:\n        intention = new CreateStreamIntention(intentionData as CreateStreamIntentionData);\n        break;\n      case StreamTransactionType.CLAIM:\n        intention = new ClaimStreamIntention(intentionData as ClaimStreamIntentionData);\n        break;\n      case StreamTransactionType.CLAIM_BY_PROXY:\n        intention = new ClaimByProxyStreamIntention(intentionData as ClaimByProxyStreamIntentionData);\n        break;\n      case StreamTransactionType.SET_AUTO_CLAIM:\n        intention = new SetAutoClaimStreamIntention(intentionData as SetAutoClaimIntentionData);\n        break;\n      case StreamTransactionType.CANCEL:\n        intention = new CancelStreamIntention(intentionData as CancelStreamIntentionData);\n        break;\n      default:\n        throw new Error('not implemented');\n    }\n    return intention.build({ ...input });\n  }\n}\n","import { TransactionDefaultApplication, TransactionSubTypes, TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternalGrpc } from '@/apps/interface/sui-grpc';\nimport { CoinTransferIntention, CoinTransferIntentionData } from '@/apps/msafe-core/coin-transfer';\nimport { SuiNetworks } from '@/types';\n\nimport { ObjectTransferIntention, ObjectTransferIntentionData } from './object-transfer';\n\nexport type CoreIntention = CoinTransferIntention | ObjectTransferIntention;\n\nexport type CoreIntentionData = CoinTransferIntentionData | ObjectTransferIntentionData;\n\nexport class CoreHelper implements IAppHelperInternalGrpc<CoreIntentionData> {\n  application = 'msafe-core';\n\n  supportSDK = '@mysten/sui-v2' as const;\n\n  constructor() {\n    this.application = TransactionDefaultApplication;\n  }\n\n  deserialize(): Promise<{ txType: TransactionType; txSubType: string; intentionData: CoreIntentionData }> {\n    throw new Error('MSafe core transaction intention should be build from API');\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    intentionData: CoreIntentionData;\n    txType: TransactionType;\n    txSubType: string;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const { account, network, suiGrpcClient } = input;\n    let intention: CoreIntention;\n    switch (input.txSubType) {\n      case TransactionSubTypes.assets.coin.send:\n        intention = CoinTransferIntention.fromData(input.intentionData as CoinTransferIntentionData);\n        break;\n      case TransactionSubTypes.assets.object.send:\n        intention = ObjectTransferIntention.fromData(input.intentionData as ObjectTransferIntentionData);\n        break;\n      default:\n        throw new Error('not implemented');\n    }\n    return intention.build({ suiGrpcClient, account, network });\n  }\n}\n","import { TransactionType, buildCoinTransferTxb } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nexport interface CoinTransferIntentionData {\n  recipient: string;\n  coinType: string;\n  amount: string;\n}\n\nexport class CoinTransferIntention extends BaseIntentionGrpc<CoinTransferIntentionData> {\n  txType: TransactionType.Assets;\n\n  txSubType: 'SendCoin';\n\n  constructor(public readonly data: CoinTransferIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account } = input;\n    return buildCoinTransferTxb(suiGrpcClient, this.data, account.address);\n  }\n\n  static fromData(data: CoinTransferIntentionData) {\n    return new CoinTransferIntention(data);\n  }\n}\n","import { TransactionType, buildObjectTransferTxb } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nexport interface ObjectTransferIntentionData {\n  receiver: string;\n  objectType: string;\n  objectId: string;\n}\n\nexport class ObjectTransferIntention extends BaseIntentionGrpc<ObjectTransferIntentionData> {\n  txType: TransactionType.Assets;\n\n  txSubType: 'SendObject';\n\n  constructor(public readonly data: ObjectTransferIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account } = input;\n    return buildObjectTransferTxb(suiGrpcClient, this.data, account.address);\n  }\n\n  static fromData(data: ObjectTransferIntentionData) {\n    return new ObjectTransferIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { updatePackageId } from './config';\nimport { Decoder } from './decoder';\nimport { ClaimRewardIntention, ClaimRewardIntentionData } from './intentions/claim-reward';\nimport { ClaimSupplyIntention, ClaimSupplyIntentionData } from './intentions/claim-supply';\nimport { EntryBorrowIntention, EntryBorrowIntentionData } from './intentions/entry-borrow';\nimport { EntryDepositIntention, EntryDepositIntentionData } from './intentions/entry-deposit';\nimport { EntryRepayIntention, EntryRepayIntentionData } from './intentions/entry-repay';\nimport { EntryWithdrawIntention, EntryWithdrawIntentionData } from './intentions/entry-withdraw';\nimport { EntryMultiDepositIntention, EntryMultiDepositIntentionData } from './intentions/multi-deposit';\nimport { PlainTransactionIntention, PlainTransactionIntentionData } from './intentions/plain-transaction';\nimport { TransactionSubType } from './types';\n\nexport type NAVIIntention =\n  | EntryDepositIntention\n  | EntryBorrowIntention\n  | EntryRepayIntention\n  | EntryWithdrawIntention\n  | EntryMultiDepositIntention\n  | ClaimRewardIntention\n  | ClaimSupplyIntention\n  | PlainTransactionIntention;\n\nexport type NAVIIntentionData =\n  | EntryDepositIntentionData\n  | EntryBorrowIntentionData\n  | EntryRepayIntentionData\n  | EntryWithdrawIntentionData\n  | EntryMultiDepositIntentionData\n  | ClaimRewardIntentionData\n  | ClaimSupplyIntentionData\n  | PlainTransactionIntentionData;\n\nexport class NAVIAppHelper implements IAppHelperInternal<NAVIIntentionData> {\n  application = 'navi';\n\n  supportSDK = '@mysten/sui' as const;\n\n  async deserialize(input: {\n    transaction: Transaction;\n    network: SuiNetworks;\n    suiClient: SuiClient;\n    account: WalletAccount;\n    appContext?: {\n      content?: string;\n      scene?: string;\n    };\n  }): Promise<{\n    txType: TransactionType;\n    txSubType: TransactionSubType;\n    intentionData: NAVIIntentionData;\n  }> {\n    await updatePackageId();\n    if (input.appContext?.content) {\n      return {\n        txType: TransactionType.Other,\n        txSubType: TransactionSubType.PlainTransaction,\n        intentionData: {\n          content: input.appContext.content,\n          scene: input.appContext.scene || 'unknown',\n        },\n      };\n    }\n    const { transaction } = input;\n    const decoder = new Decoder(transaction);\n    const result = decoder.decode();\n    return {\n      txType: TransactionType.Other,\n      txSubType: result.type,\n      intentionData: result.intentionData,\n    };\n  }\n\n  async build(input: {\n    intentionData: NAVIIntentionData;\n    txType: TransactionType;\n    txSubType: string;\n    suiClient: SuiClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const { suiClient, account } = input;\n    let intention: NAVIIntention;\n    await updatePackageId();\n    switch (input.txSubType) {\n      case TransactionSubType.EntryDeposit:\n        intention = EntryDepositIntention.fromData(input.intentionData as EntryDepositIntentionData);\n        break;\n      case TransactionSubType.EntryBorrow:\n        intention = EntryBorrowIntention.fromData(input.intentionData as EntryBorrowIntentionData);\n        break;\n      case TransactionSubType.EntryRepay:\n        intention = EntryRepayIntention.fromData(input.intentionData as EntryRepayIntentionData);\n        break;\n      case TransactionSubType.EntryWithdraw:\n        intention = EntryWithdrawIntention.fromData(input.intentionData as EntryWithdrawIntentionData);\n        break;\n      case TransactionSubType.EntryMultiDeposit:\n        intention = EntryMultiDepositIntention.fromData(input.intentionData as EntryMultiDepositIntentionData);\n        break;\n      case TransactionSubType.ClaimReward:\n        intention = ClaimRewardIntention.fromData(input.intentionData as ClaimRewardIntentionData);\n        break;\n      case TransactionSubType.EntryClaimAndDeposit:\n        intention = ClaimSupplyIntention.fromData(input.intentionData as ClaimSupplyIntentionData);\n        break;\n      case TransactionSubType.PlainTransaction:\n        intention = PlainTransactionIntention.fromData(input.intentionData as PlainTransactionIntentionData);\n        break;\n      default:\n        throw new Error('not implemented');\n    }\n    return intention.build({ suiClient, account });\n  }\n}\n","import { CoinType, type Pool } from './types';\n\nlet updated = false;\n\nconst config = {\n  ProtocolPackage: '0x512f28261c1a293f49416d8885b8d5d32bde6dd68a99a0be36fe42b248e6833a',\n  StorageId: '0xbb4e2f4b6205c2e2a2db47aeb4f830796ec7c005f88537ee775986639bc442fe',\n  Incentive: '0xaaf735bf83ff564e1b219a0d644de894ef5bdc4b2250b126b2a46dd002331821',\n  IncentiveV2: '0xf87a8acb8b81d14307894d12595541a73f19933f88e1326d5be349c7a6f7559c', // The new incentive version: V2\n  gasBudget: 50_000_000,\n  PriceOracle: '0x1568865ed9a0b5ec414220e8f79b3d04c77acc82358f6e5ae4635687392ffbef',\n  ReserveParentId: '0xe6d4c6610b86ce7735ea754596d71d72d10c7980b5052fc3c8cdf8d09fea9b4b', // get it from storage object id. storage.reserves\n  pool: {\n    sui: {\n      name: 'SUI',\n      assetId: 0,\n      poolId: '0x96df0fce3c471489f4debaaa762cf960b3d97820bd1f3f025ff8190730e958c5',\n      fondPoolId: '0xf975bc2d4cca10e3ace8887e20afd77b46c383b4465eac694c4688344955dea4',\n      type: '0x2::sui::SUI',\n      coinType: CoinType.sui,\n      reserveObjectId: '0xab644b5fd11aa11e930d1c7bc903ef609a9feaf9ffe1b23532ad8441854fbfaf',\n      borrowBalanceParentId: '0xe7ff0daa9d090727210abe6a8b6c0c5cd483f3692a10610386e4dc9c57871ba7',\n      supplyBalanceParentId: '0x589c83af4b035a3bc64c40d9011397b539b97ea47edf7be8f33d643606bf96f8',\n    },\n    wusdc: {\n      name: 'wUSDC',\n      assetId: 1,\n      coinType: CoinType.wusdc,\n      poolId: '0xa02a98f9c88db51c6f5efaaf2261c81f34dd56d86073387e0ef1805ca22e39c8',\n      type: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN',\n      reserveObjectId: '0xeb3903f7748ace73429bd52a70fff278aac1725d3b58afa781f25ce3450ac203',\n      borrowBalanceParentId: '0x8a3aaa817a811131c624658f6e77cba04ab5829293d2c49c1a9cce8ac9c8dec4',\n      supplyBalanceParentId: '0x8d0a4467806458052d577c8cd2be6031e972f2b8f5f77fce98aa12cd85330da9',\n    },\n    usdt: {\n      name: 'USDT',\n      coinType: CoinType.usdt,\n      assetId: 2,\n      poolId: '0x0e060c3b5b8de00fb50511b7a45188c8e34b6995c01f69d98ea5a466fe10d103',\n      type: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN',\n      reserveObjectId: '0xb8c5eab02a0202f638958cc79a69a2d30055565caad1684b3c8bbca3bddcb322',\n      borrowBalanceParentId: '0xc14d8292a7d69ae31164bafab7ca8a5bfda11f998540fe976a674ed0673e448f',\n      supplyBalanceParentId: '0x7e2a49ff9d2edd875f82b76a9b21e2a5a098e7130abfd510a203b6ea08ab9257',\n    },\n    weth: {\n      name: 'WETH',\n      coinType: CoinType.weth,\n      assetId: 3,\n      poolId: '0x71b9f6e822c48ce827bceadce82201d6a7559f7b0350ed1daa1dc2ba3ac41b56',\n      type: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5::coin::COIN',\n      reserveObjectId: '0xafecf4b57899d377cc8c9de75854c68925d9f512d0c47150ca52a0d3a442b735',\n      borrowBalanceParentId: '0x7568d06a1b6ffc416a36c82791e3daf0e621cf19d4a2724fc6f74842661b6323',\n      supplyBalanceParentId: '0xa668905b1ad445a3159b4d29b1181c4a62d864861b463dd9106cc0d97ffe8f7f',\n    },\n    cetus: {\n      name: 'CETUS',\n      coinType: CoinType.cetus,\n      assetId: 4,\n      poolId: '0x3c376f857ec4247b8ee456c1db19e9c74e0154d4876915e54221b5052d5b1e2e',\n      type: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS',\n      reserveObjectId: '0x66a807c06212537fe46aa6719a00e4fa1e85a932d0b53ce7c4b1041983645133',\n      borrowBalanceParentId: '0x4c3da45ffff6432b4592a39cdb3ce12f4a28034cbcb804bb071facc81fdd923d',\n      supplyBalanceParentId: '0x6adc72faf2a9a15a583c9fb04f457c6a5f0b456bc9b4832413a131dfd4faddae',\n    },\n    voloSui: {\n      name: 'VoloSui',\n      coinType: CoinType.voloSui,\n      assetId: 5,\n      poolId: '0x9790c2c272e15b6bf9b341eb531ef16bcc8ed2b20dfda25d060bf47f5dd88d01',\n      fondPoolId: '0xe2b5ada45273676e0da8ae10f8fe079a7cec3d0f59187d3d20b1549c275b07ea',\n      type: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT',\n      reserveObjectId: '0xd4fd7e094af9819b06ea3136c13a6ae8da184016b78cf19773ac26d2095793e2',\n      borrowBalanceParentId: '0x8fa5eccbca2c4ba9aae3b87fd44aa75aa5f5b41ea2d9be4d5321379384974984',\n      supplyBalanceParentId: '0xe6457d247b6661b1cac123351998f88f3e724ff6e9ea542127b5dcb3176b3841',\n    },\n    haSui: {\n      name: 'HaedalSui',\n      coinType: CoinType.haSui,\n      assetId: 6,\n      poolId: '0x6fd9cb6ebd76bc80340a9443d72ea0ae282ee20e2fd7544f6ffcd2c070d9557a',\n      fondPoolId: '0xa20e18085ce04be8aa722fbe85423f1ad6b1ae3b1be81ffac00a30f1d6d6ab51',\n      type: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI',\n      reserveObjectId: '0x0c9f7a6ca561dc566bd75744bcc71a6af1dc3caf7bd32c099cd640bb5f3bb0e3',\n      borrowBalanceParentId: '0x01f36898e020be6c3423e5c95d9f348868813cd4d0be39b0c8df9d8de4722b00',\n      supplyBalanceParentId: '0x278b8e3d09c3548c60c51ed2f8eed281876ea58c392f71b7ff650cc9286d095b',\n    },\n    navx: {\n      name: 'NAVX',\n      coinType: CoinType.navx,\n      assetId: 7,\n      poolId: '0xc0e02e7a245e855dd365422faf76f87d9f5b2148a26d48dda6e8253c3fe9fa60',\n      fondPoolId: '0x9dae0cf104a193217904f88a48ce2cf0221e8cd9073878edd05101d6b771fa09',\n      type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX',\n      reserveObjectId: '0x2e13b2f1f714c0c5fa72264f147ef7632b48ec2501f810c07df3ccb59d6fdc81',\n      borrowBalanceParentId: '0xa5bf13075aa400cbdd4690a617c5f008e1fae0511dcd4f7121f09817df6c8d8b',\n      supplyBalanceParentId: '0x59dedca8dc44e8df50b190f8b5fe673098c1273ac6168c0a4addf3613afcdee5',\n    },\n    wbtc: {\n      name: 'WBTC',\n      coinType: CoinType.wbtc,\n      assetId: 8,\n      poolId: '0xd162cbe40f8829ce71c9b3d3bf3a83859689a79fa220b23d70dc0300b777ae6e',\n      type: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881::coin::COIN',\n      reserveObjectId: '0x8b4d81f004e4e9faf4540951a896b6d96e42598a270e6375f598b99742db767e',\n      borrowBalanceParentId: '0x55e1f3c9e6e5cf9fff563bdd61db07a3826458c56ef72c455e049ab3b1b0e99c',\n      supplyBalanceParentId: '0x821e505a0091b089edba94deaa14c2f2230d026bbaa7b85680554441aad447e0',\n    },\n    ausd: {\n      name: 'AUSD',\n      coinType: CoinType.ausd,\n      assetId: 9,\n      poolId: '0xc9208c1e75f990b2c814fa3a45f1bf0e85bb78404cfdb2ae6bb97de58bb30932',\n      type: '0x2053d08c1e2bd02791056171aab0fd12bd7cd7efad2ab8f6b9c8902f14df2ff2::ausd::AUSD',\n      reserveObjectId: '0x918889c6a9d9b93108531d4d59a4ebb9cc4d41689798ffc1d4aed6e1ae816ec0',\n      borrowBalanceParentId: '0x551300b9441c9a3a16ca1d7972c1dbb4715e15004ccd5f001b2c2eee22fd92c1',\n      supplyBalanceParentId: '0xe151af690355de8be1c0281fbd0d483c099ea51920a57c4bf8c9666fd36808fd',\n    },\n    nusdc: {\n      name: 'USDC',\n      assetId: 10,\n      coinType: CoinType.nusdc,\n      poolId: '0xa3582097b4c57630046c0c49a88bfc6b202a3ec0a9db5597c31765f7563755a8',\n      type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n      reserveObjectId: '0x4c8a2c72a22ae8da803a8519798d312c86e74a9e0d6ec0eec2bfcf7e4b3fef5e',\n      borrowBalanceParentId: '0xb0b0c7470e96cabbb4f1e8d06bef2fbea65f4dbac52afae8635d9286b1ea9a09',\n      supplyBalanceParentId: '0x08b5ce8574ac3bc9327e66ad5decd34d07ee798f724ad01058e8855ac9acb605',\n    },\n    eth: {\n      name: 'ETH',\n      assetId: 11,\n      coinType: CoinType.eth,\n      poolId: '0x78ba01c21d8301be15690d3c30dc9f111871e38cfb0b2dd4b70cc6052fba41bb',\n      type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n      reserveObjectId: '0x376faea6dfbffab9ea808474cb751d91222b6d664f38c0f1d23de442a8edb1ce',\n      borrowBalanceParentId: '0xf0c6ce5cfaee96073876a5fab7426043f3a798b79502c4caeb6d9772cd35af1f',\n      supplyBalanceParentId: '0xc0a0cb43620eb8a84d5a4a50a85650e7fa7ba81e660f9cc2863404fd84591d4b',\n    },\n    usdy: {\n      name: 'USDY',\n      assetId: 12,\n      coinType: CoinType.usdy,\n      poolId: '0x4b6253a9f8cf7f5d31e6d04aed4046b9e325a1681d34e0eff11a8441525d4563',\n      type: '0x960b531667636f39e85867775f52f6b1f220a058c4de786905bdf761e06a56bb::usdy::USDY',\n      reserveObjectId: '',\n      borrowBalanceParentId: '',\n      supplyBalanceParentId: '',\n    },\n  } as Pool,\n  borrowFee: 0.003,\n  borrowFeeAddress: '0x70b9b10704263cf53392849e33b1f5fd16005869b4198ed5524836bad1234ea2',\n};\n\nexport async function updatePackageId() {\n  if (updated) {\n    return;\n  }\n  try {\n    const data = await fetch('https://open-api.naviprotocol.io/api/msafe').then((res) => res.json());\n    const { packageId, borrowFee, borrowFeeAddress, pool } = data;\n    if (packageId) {\n      config.ProtocolPackage = packageId;\n    }\n    if (borrowFee) {\n      config.borrowFee = borrowFee;\n    }\n    if (borrowFeeAddress) {\n      config.borrowFeeAddress = borrowFeeAddress;\n    }\n    if (pool) {\n      config.pool = pool;\n    }\n    updated = true;\n  } catch (e: any) {\n    console.error(e.message);\n  }\n}\n\nexport default config;\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { bcs, fromBase64 } from '@mysten/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui/utils';\n\nimport config from './config';\nimport { TransactionSubType } from './types';\n\nexport function isSameCoinType(type1: string, type2: string) {\n  return normalizeStructTag(type1) === normalizeStructTag(type2);\n}\n\nexport function isSameTarget(target1: string, target2: string): boolean {\n  return normalizeStructTag(target1) === normalizeStructTag(target2);\n}\n\ntype DecodeResult = {\n  txType: TransactionType;\n  type: TransactionSubType;\n  intentionData: any;\n};\n\ntype TxData = ReturnType<Transaction['getData']>;\ntype TransactionCommand = TxData['commands'][number];\ntype TransactionInput = TxData['inputs'][number];\ntype MoveCallCommand = Extract<TransactionCommand, { $kind: 'MoveCall' }>;\n\nfunction getMoveCallTarget(command: TransactionCommand): string | null {\n  if (command.$kind !== 'MoveCall') {\n    return null;\n  }\n  const { package: pkg, module, function: fn } = command.MoveCall;\n  return `${pkg}::${module}::${fn}`;\n}\n\nexport class Decoder {\n  constructor(public readonly txb: Transaction) {}\n\n  decode() {\n    if (this.isClaimRewardTransaction()) {\n      return this.decodeClaimReward();\n    }\n    if (this.isEntryBorrowTransaction()) {\n      return this.decodeEntryBorrow();\n    }\n    if (this.isEntryBorrowWithFeeTransaction()) {\n      return this.decodeEntryBorrow();\n    }\n    if (this.isEntryMultiDepositTransaction()) {\n      return this.decodeEntryMultiDeposit();\n    }\n    if (this.isEntryDepositTransaction()) {\n      return this.decodeEntryDeposit();\n    }\n    if (this.isEntryRepayTransaction()) {\n      return this.decodeEntryRepay();\n    }\n    if (this.isEntryWithdrawTransaction()) {\n      return this.decodeEntryWithdraw();\n    }\n    if (this.isEntryClaimAndDepositTransaction()) {\n      return this.decodeEntryClaimAndDeposit();\n    }\n    throw new Error(`Unknown transaction type`);\n  }\n\n  private get commands() {\n    return this.txb.getData().commands;\n  }\n\n  private getMoveCallCommand(target: string) {\n    return this.commands.find((command) => getMoveCallTarget(command) === target);\n  }\n\n  private isClaimRewardTransaction() {\n    return this.commands.some(\n      (command) => command.$kind === 'MoveCall' && command.MoveCall.function.includes('claim_reward'),\n    );\n  }\n\n  private isEntryBorrowTransaction() {\n    return !!this.getMoveCallCommand(`${config.ProtocolPackage}::incentive_v3::entry_borrow_v2`);\n  }\n\n  private isEntryBorrowWithFeeTransaction() {\n    return !!this.getMoveCallCommand(`${config.ProtocolPackage}::incentive_v3::borrow_v2`);\n  }\n\n  private isEntryMultiDepositTransaction() {\n    const target = `${config.ProtocolPackage}::incentive_v3::entry_deposit`;\n    const depositCommands = this.commands.filter((command) => getMoveCallTarget(command) === target);\n    const claimCommand = this.commands.find(\n      (command) => command.$kind === 'MoveCall' && command.MoveCall.function.includes('claim_reward'),\n    );\n    if (claimCommand) {\n      return false;\n    }\n    return depositCommands.length > 1;\n  }\n\n  private isEntryClaimAndDepositTransaction() {\n    const target = `${config.ProtocolPackage}::incentive_v3::entry_deposit`;\n    const depositCommands = this.commands.filter((command) => getMoveCallTarget(command) === target);\n    const claimCommand = this.commands.find(\n      (command) => command.$kind === 'MoveCall' && command.MoveCall.function.includes('claim_reward'),\n    );\n    if (claimCommand && depositCommands.length > 0) {\n      return true;\n    }\n    return false;\n  }\n\n  private isEntryDepositTransaction() {\n    return !!this.getMoveCallCommand(`${config.ProtocolPackage}::incentive_v3::entry_deposit`);\n  }\n\n  private isEntryRepayTransaction(): boolean {\n    return !!this.getMoveCallCommand(`${config.ProtocolPackage}::incentive_v3::entry_repay`);\n  }\n\n  private isEntryWithdrawTransaction(): boolean {\n    return !!this.getMoveCallCommand(`${config.ProtocolPackage}::incentive_v3::withdraw_v2`);\n  }\n\n  private decodeEntryClaimAndDeposit(): DecodeResult {\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.EntryClaimAndDeposit,\n      intentionData: {\n        type: 'entry_claim_and_deposit',\n      },\n    };\n  }\n\n  private decodeClaimReward(): DecodeResult {\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.ClaimReward,\n      intentionData: {\n        type: 'claim_reward',\n      },\n    };\n  }\n\n  private decodeEntryBorrow(): DecodeResult {\n    const assetId = this.helper.decodeInputU8(4);\n    const amount = this.helper.decodeInputU64(5);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.EntryBorrow,\n      intentionData: {\n        amount,\n        assetId,\n      },\n    };\n  }\n\n  private decodeEntryMultiDeposit(): DecodeResult {\n    const list = [] as {\n      amount: number;\n      assetId: number;\n    }[];\n    const target = `${config.ProtocolPackage}::incentive_v3::entry_deposit`;\n    this.commands.forEach((command) => {\n      if (getMoveCallTarget(command) === target) {\n        const helper = new MoveCallHelper(command, this.txb);\n        const assetId = helper.decodeInputU8(3);\n        const amount = helper.decodeInputU64(5);\n        list.push({\n          assetId,\n          amount,\n        });\n      }\n    });\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.EntryMultiDeposit,\n      intentionData: {\n        list,\n      },\n    };\n  }\n\n  private decodeEntryDeposit(): DecodeResult {\n    const assetId = this.helper.decodeInputU8(3);\n    const amount = this.helper.decodeInputU64(5);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.EntryDeposit,\n      intentionData: {\n        amount,\n        assetId,\n      },\n    };\n  }\n\n  private decodeEntryRepay(): DecodeResult {\n    const assetId = this.helper.decodeInputU8(4);\n    const amount = this.helper.decodeInputU64(6);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.EntryRepay,\n      intentionData: {\n        amount,\n        assetId,\n      },\n    };\n  }\n\n  private decodeEntryWithdraw(): DecodeResult {\n    const assetId = this.helper.decodeInputU8(4);\n    const amount = this.helper.decodeInputU64(5);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.EntryWithdraw,\n      intentionData: {\n        amount,\n        assetId,\n      },\n    };\n  }\n\n  private get helper() {\n    const moveCall = this.commands.find(\n      (command) => command.$kind === 'MoveCall' && command.MoveCall.package === config.ProtocolPackage,\n    );\n    if (!moveCall) {\n      throw new Error('MoveCall not found');\n    }\n    return new MoveCallHelper(moveCall, this.txb);\n  }\n}\n\nexport class MoveCallHelper {\n  constructor(\n    public readonly moveCall: TransactionCommand,\n    public readonly txb: Transaction,\n  ) {}\n\n  private get moveCallData(): MoveCallCommand['MoveCall'] {\n    if (this.moveCall.$kind !== 'MoveCall') {\n      throw new Error('not move call command');\n    }\n    return this.moveCall.MoveCall;\n  }\n\n  private get inputs() {\n    return this.txb.getData().inputs;\n  }\n\n  private getInputIndex(argIndex: number): number {\n    const arg = this.moveCallData.arguments[argIndex];\n    if (arg.$kind !== 'Input') {\n      throw new Error('not input type');\n    }\n    return arg.Input;\n  }\n\n  private getInputParam(argIndex: number): TransactionInput {\n    return this.inputs[this.getInputIndex(argIndex)];\n  }\n\n  decodeSharedObjectId(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return MoveCallHelper.getSharedObjectId(input);\n  }\n\n  decodeOwnedObjectId(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return MoveCallHelper.getOwnedObjectId(input);\n  }\n\n  decodeInputU64(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return Number(bcs.u64().parse(Uint8Array.from(fromBase64(input.Pure!.bytes))));\n  }\n\n  decodeInputU8(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return Number(bcs.u8().parse(Uint8Array.from(fromBase64(input.Pure!.bytes))));\n  }\n\n  decodeInputAddress(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return normalizeSuiAddress(bcs.Address.parse(Uint8Array.from(fromBase64(input.Pure!.bytes))));\n  }\n\n  decodeInputString(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return bcs.string().parse(Uint8Array.from(fromBase64(input.Pure!.bytes)));\n  }\n\n  decodeInputBool(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return bcs.bool().parse(Uint8Array.from(fromBase64(input.Pure!.bytes)));\n  }\n\n  static getOwnedObjectId(input: TransactionInput) {\n    const objectId =\n      input.Object?.ImmOrOwnedObject?.objectId ?? input.Object?.Receiving?.objectId ?? input.UnresolvedObject?.objectId;\n    if (!objectId) {\n      throw new Error(`not object argument: ${JSON.stringify(input)}`);\n    }\n    return normalizeSuiAddress(objectId);\n  }\n\n  static getSharedObjectId(input: TransactionInput) {\n    const objectId = input.Object?.SharedObject?.objectId ?? input.UnresolvedObject?.objectId;\n    if (!objectId) {\n      throw new Error(`not shared object argument: ${JSON.stringify(input)}`);\n    }\n    return normalizeSuiAddress(objectId);\n  }\n\n  typeArg(index: number) {\n    return normalizeStructTag(this.moveCallData.typeArguments[index]);\n  }\n\n  txArg(index: number) {\n    return this.moveCallData.arguments[index];\n  }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport {\n  depositCoinPTB,\n  withdrawCoinPTB,\n  repayCoinPTB,\n  borrowCoinPTB,\n  claimLendingRewardsPTB,\n  Pool,\n  getUserAvailableLendingRewards,\n} from '@naviprotocol/lending';\n\nimport type { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nexport async function depositToken(txb: Transaction, pool: Pool, coinObject: any, amount: number) {\n  await depositCoinPTB(txb as any, pool, coinObject, { amount });\n  return txb;\n}\n\nexport async function withdrawToken(txb: Transaction, pool: Pool, amount: number, userAddress: string) {\n  const [coin] = await withdrawCoinPTB(txb as any, pool, amount);\n  txb.transferObjects([coin as any], txb.pure.address(userAddress));\n  return txb;\n}\n\nexport async function borrowToken(tx: Transaction, pool: Pool, amount: number, userAddress: string) {\n  const [borrowedCoin] = await borrowCoinPTB(tx as any, pool, amount);\n  tx.transferObjects([borrowedCoin as any], tx.pure.address(userAddress));\n\n  return tx;\n}\n\nexport async function repayToken(txb: Transaction, pool: Pool, coinObject: any, amount: number) {\n  await repayCoinPTB(txb as any, pool, coinObject, { amount });\n  return txb;\n}\n\nexport async function claimReward(client: SuiClient, userAddress: string) {\n  const txb = new Transaction();\n  const rewards = await getUserAvailableLendingRewards(userAddress, { client });\n\n  await claimLendingRewardsPTB(txb, rewards);\n\n  return txb;\n}\n\nexport async function claimSupply(client: SuiClient, userAddress: string) {\n  const txb = new Transaction();\n  const rewards = await getUserAvailableLendingRewards(userAddress, { client });\n\n  await claimLendingRewardsPTB(txb, rewards, {\n    customCoinReceive: { type: 'depositNAVI', depositNAVI: { fallbackReceiveAddress: userAddress } },\n  });\n  return txb;\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport type { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport { claimReward } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\n\nexport interface ClaimRewardIntentionData {\n  type: string;\n}\n\nexport class ClaimRewardIntention extends BaseIntention<ClaimRewardIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.ClaimReward;\n\n  constructor(public readonly data: ClaimRewardIntentionData) {\n    super(data);\n  }\n\n  async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { type } = this.data;\n    console.log('claim reward', type);\n    const txb = await claimReward(input.suiClient, input.account.address);\n    return txb;\n  }\n\n  static fromData(data: ClaimRewardIntentionData) {\n    return new ClaimRewardIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport type { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport { claimSupply } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\n\nexport interface ClaimSupplyIntentionData {\n  type: string;\n}\n\nexport class ClaimSupplyIntention extends BaseIntention<ClaimSupplyIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.EntryClaimAndDeposit;\n\n  constructor(public readonly data: ClaimSupplyIntentionData) {\n    super(data);\n  }\n\n  async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { type } = this.data;\n    console.log('claim reward and supply', type);\n    const txb = await claimSupply(input.suiClient, input.account.address);\n    return txb;\n  }\n\n  static fromData(data: ClaimSupplyIntentionData) {\n    return new ClaimSupplyIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { borrowToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryBorrowIntentionData {\n  amount: number;\n  assetId: number;\n}\n\nexport class EntryBorrowIntention extends BaseIntention<EntryBorrowIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.EntryBorrow;\n\n  constructor(public readonly data: EntryBorrowIntentionData) {\n    super(data);\n  }\n\n  async build(input: { account: WalletAccount }): Promise<Transaction> {\n    const { assetId, amount } = this.data;\n    const tx = new Transaction();\n    console.log('build', this.data);\n\n    const pool = await getPoolConfigByAssetId(assetId);\n\n    const txb = await borrowToken(tx, pool, amount, input.account.address);\n    return txb;\n  }\n\n  static fromData(data: EntryBorrowIntentionData) {\n    return new EntryBorrowIntention(data);\n  }\n}\n","import { getPool } from '@naviprotocol/lending';\n\nexport async function getPoolConfigByAssetId(assetId: string | number) {\n  return getPool(assetId);\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport { depositToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getTokenObjs } from '../utils/token';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryDepositIntentionData {\n  amount: number;\n  assetId: number;\n}\n\nexport class EntryDepositIntention extends BaseIntention<EntryDepositIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.EntryDeposit;\n\n  constructor(public readonly data: EntryDepositIntentionData) {\n    super(data);\n  }\n\n  async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { suiClient, account } = input;\n    const { assetId, amount } = this.data;\n    const tx = new Transaction();\n    console.log('build', this.data);\n\n    const pool = await getPoolConfigByAssetId(assetId);\n\n    if (assetId === 0) {\n      const [toDeposit] = tx.splitCoins(tx.gas, [amount]);\n      const txb = await depositToken(tx, pool, toDeposit, amount);\n      return txb;\n    }\n\n    const tokenInfo = await getTokenObjs(suiClient, account.address, pool.suiCoinType);\n    if (!tokenInfo.data[0]) {\n      throw new Error(`Insufficient balance for ${pool.suiCoinType} Token`);\n    }\n\n    const coinObj = tokenInfo.data[0].coinObjectId;\n\n    if (tokenInfo.data.length >= 2) {\n      let i = 1;\n      while (i < tokenInfo.data.length) {\n        tx.mergeCoins(coinObj, [tokenInfo.data[i].coinObjectId]);\n        i++;\n      }\n    }\n\n    const txb = await depositToken(tx, pool, tx.object(coinObj), amount);\n    return txb;\n  }\n\n  static fromData(data: EntryDepositIntentionData) {\n    return new EntryDepositIntention(data);\n  }\n}\n","import { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nexport async function getTokenAmount(client: SuiClient, sender: string, coinType: string): Promise<number> {\n  if (!sender) {\n    throw new Error('Sender is undefined.');\n  }\n  if (!client) {\n    throw new Error('Client is undefined.');\n  }\n  const coinInfo = await client.getBalance({\n    owner: sender,\n    coinType,\n  });\n  const tokenBalance = Number(coinInfo.totalBalance);\n  return tokenBalance;\n}\n\nexport async function getTokenObjs(client: SuiClient, sender: string, coinType: string): Promise<any> {\n  const result = await client.getCoins({\n    owner: sender,\n    coinType,\n  });\n  console.log('getTokenObjs', sender, result);\n  return result;\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport { repayToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getTokenObjs } from '../utils/token';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryRepayIntentionData {\n  amount: number;\n  assetId: number;\n}\n\nexport class EntryRepayIntention extends BaseIntention<EntryRepayIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.EntryRepay;\n\n  constructor(public readonly data: EntryRepayIntentionData) {\n    super(data);\n  }\n\n  async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { suiClient, account } = input;\n    const { assetId, amount } = this.data;\n    const tx = new Transaction();\n    console.log('build', this.data);\n\n    const pool = await getPoolConfigByAssetId(assetId);\n\n    if (assetId === 0) {\n      const [toDeposit] = tx.splitCoins(tx.gas, [amount]);\n      return repayToken(tx, pool, toDeposit, amount);\n    }\n\n    const tokenInfo = await getTokenObjs(suiClient, account.address, pool.suiCoinType);\n    if (!tokenInfo.data[0]) {\n      throw new Error(`Insufficient balance for ${pool.suiCoinType} Token`);\n    }\n\n    const coinObj = tokenInfo.data[0].coinObjectId;\n\n    if (tokenInfo.data.length >= 2) {\n      let i = 1;\n      while (i < tokenInfo.data.length) {\n        tx.mergeCoins(coinObj, [tokenInfo.data[i].coinObjectId]);\n        i++;\n      }\n    }\n\n    return repayToken(tx, pool, tx.object(coinObj), amount);\n  }\n\n  static fromData(data: EntryRepayIntentionData) {\n    return new EntryRepayIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { withdrawToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryWithdrawIntentionData {\n  amount: number;\n  assetId: number;\n}\n\nexport class EntryWithdrawIntention extends BaseIntention<EntryWithdrawIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.EntryWithdraw;\n\n  constructor(public readonly data: EntryWithdrawIntentionData) {\n    super(data);\n  }\n\n  async build(input: { account: WalletAccount }): Promise<Transaction> {\n    const { assetId, amount } = this.data;\n    const tx = new Transaction();\n    console.log('build', this.data);\n\n    const pool = await getPoolConfigByAssetId(assetId);\n\n    const txb = await withdrawToken(tx, pool, amount, input.account.address);\n    return txb;\n  }\n\n  static fromData(data: EntryWithdrawIntentionData) {\n    return new EntryWithdrawIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport { depositToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getTokenObjs } from '../utils/token';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryMultiDepositIntentionData {\n  list: {\n    amount: number;\n    assetId: number;\n  }[];\n}\n\nexport class EntryMultiDepositIntention extends BaseIntention<EntryMultiDepositIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.EntryDeposit;\n\n  constructor(public readonly data: EntryMultiDepositIntentionData) {\n    super(data);\n  }\n\n  async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { suiClient, account } = input;\n    const { list } = this.data;\n    const tx = new Transaction();\n    console.log('build', this.data);\n\n    for (let i = 0; i < list.length; i++) {\n      const { assetId, amount } = list[i];\n      const pool = await getPoolConfigByAssetId(assetId);\n      if (assetId === 0) {\n        const [toDeposit] = tx.splitCoins(tx.gas, [amount]);\n        await depositToken(tx, pool, toDeposit, amount);\n        continue;\n      }\n\n      const tokenInfo = await getTokenObjs(suiClient, account.address, pool.suiCoinType);\n      if (!tokenInfo.data[0]) {\n        throw new Error(`Insufficient balance for ${pool.suiCoinType} Token`);\n      }\n\n      const coinObj = tokenInfo.data[0].coinObjectId;\n\n      if (tokenInfo.data.length >= 2) {\n        let j = 1;\n        while (j < tokenInfo.data.length) {\n          tx.mergeCoins(coinObj, [tokenInfo.data[j].coinObjectId]);\n          j++;\n        }\n      }\n\n      await depositToken(tx, pool, tx.object(coinObj), amount);\n    }\n\n    return tx;\n  }\n\n  static fromData(data: EntryMultiDepositIntentionData) {\n    return new EntryMultiDepositIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType } from '../types';\n\nexport interface PlainTransactionIntentionData {\n  content: string;\n  scene: string;\n}\n\nexport class PlainTransactionIntention extends BaseIntention<PlainTransactionIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.PlainTransaction;\n\n  constructor(public readonly data: PlainTransactionIntentionData) {\n    super(data);\n  }\n\n  async build(input: { account: WalletAccount }): Promise<Transaction> {\n    console.log('build', this.data);\n    return Transaction.from(this.data.content);\n  }\n\n  static fromData(data: PlainTransactionIntentionData) {\n    return new PlainTransactionIntention(data);\n  }\n}\n","import { TransactionSubTypes, TransactionType } from '@msafe/sui3-utils';\nimport { fromHex } from '@mysten/bcs';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc, IAppHelperInternalGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nexport type PlainTransactionData = {\n  content: string;\n};\n\nexport const PlainTransactionApplication = 'msafe-plain-tx';\nexport const PlainTransactionType = TransactionSubTypes.others.plain;\n\nexport class PlainTransactionIntention extends BaseIntentionGrpc<PlainTransactionData> {\n  txType = TransactionType.Other;\n\n  txSubType = PlainTransactionType;\n\n  constructor(public readonly data: PlainTransactionData) {\n    super(data);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  async build(_input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    return Transaction.from(fromHex(this.data.content));\n  }\n\n  static fromData(data: PlainTransactionData) {\n    return new PlainTransactionIntention(data);\n  }\n}\n\nexport class PlainTransactionHelper implements IAppHelperInternalGrpc<PlainTransactionData> {\n  application: string;\n\n  supportSDK = '@mysten/sui-v2' as const;\n\n  constructor() {\n    this.application = PlainTransactionApplication;\n  }\n\n  async deserialize(input: {\n    transaction: Transaction;\n    chain: IdentifierString;\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    appContext: {\n      content: string;\n    };\n  }): Promise<{ txType: TransactionType; txSubType: string; intentionData: PlainTransactionData }> {\n    const { content } = input.appContext;\n\n    return {\n      txType: TransactionType.Other,\n      txSubType: PlainTransactionType,\n      intentionData: { content },\n    };\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    txType: TransactionType;\n    txSubType: string;\n    intentionData: PlainTransactionData;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, network, account } = input;\n    const intention = PlainTransactionIntention.fromData(input.intentionData);\n    return intention.build({ suiGrpcClient, network, account });\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction, isTransaction } from '@mysten/sui/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\n\nimport { AppName, AppRegistry } from '@/apps/app-registry';\nimport { IAppHelper } from '@/apps/interface/common';\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { IAppHelperInternalGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiClient, toSuiNetworkName } from '@/compat/mysten-sui-json-rpc';\nimport { getSuiGrpcClient } from '@/lib/suiGrpcClient';\nimport { SuiNetworks } from '@/types';\n\nfunction createSuiClient(network: SuiNetworks, clientUrl: string) {\n  return new SuiClient({\n    network: toSuiNetworkName(network),\n    baseUrl: clientUrl,\n  });\n}\n\nconst SUI_COIN_TYPE = '0x2::sui::SUI';\nconst MIN_GAS_BALANCE = 100_000_000;\n\nasync function toDeserializeTransaction(transactionBlock: unknown): Promise<Transaction> {\n  if (isTransaction(transactionBlock)) {\n    return transactionBlock as Transaction;\n  }\n\n  if (typeof transactionBlock === 'string' || transactionBlock instanceof Uint8Array) {\n    return Transaction.from(transactionBlock);\n  }\n\n  // Legacy TransactionBlock: offline kind-only build (no JSON-RPC client).\n  if (\n    transactionBlock &&\n    typeof transactionBlock === 'object' &&\n    'build' in transactionBlock &&\n    typeof (transactionBlock as { build: unknown }).build === 'function'\n  ) {\n    const build = await (\n      transactionBlock as { build: (options: { onlyTransactionKind: boolean }) => Promise<Uint8Array> }\n    ).build({\n      onlyTransactionKind: true,\n    });\n    return Transaction.from(build);\n  }\n\n  throw new Error('Unsupported transaction payload for deserialize');\n}\n\ntype InternalAppHelper<T> = IAppHelperInternal<T> | IAppHelperInternalGrpc<T>;\n\ntype RegisteredAppHelper = IAppHelper<AppRegistry[AppName]>;\n\nexport class MSafeApps {\n  apps: Map<AppName, RegisteredAppHelper>;\n\n  private constructor() {\n    this.apps = new Map<AppName, RegisteredAppHelper>();\n  }\n\n  static fromHelpers(apps: InternalAppHelper<any>[]) {\n    const mApps = new MSafeApps();\n    for (let i = 0; i < apps.length; i++) {\n      const app = apps[i];\n      switch (app.supportSDK) {\n        case '@mysten/sui':\n          mApps.addHelper(app);\n          break;\n        case '@mysten/sui-v2':\n          mApps.addGrpcHelper(app);\n          break;\n        default: {\n          const unsupported = app as InternalAppHelper<unknown> & { supportSDK?: string };\n          throw new Error(`${unsupported.application}: ${unsupported.supportSDK} SDK not supported`);\n        }\n      }\n    }\n    return mApps;\n  }\n\n  addHelper(app: IAppHelperInternal<any>) {\n    this.setApp(app.application, new SuiSdkAdapter(app));\n  }\n\n  addGrpcHelper(app: IAppHelperInternalGrpc<any>) {\n    this.setApp(app.application, new SuiGrpcSdkAdapter(app));\n  }\n\n  getAppHelper<K extends AppName>(appName: K): IAppHelper<AppRegistry[K]>;\n  getAppHelper(appName: string): IAppHelper<unknown>;\n  getAppHelper(appName: string): IAppHelper<unknown> {\n    const app = this.apps.get(appName as AppName);\n    if (!app) {\n      throw new Error(`${appName} not registered`);\n    }\n    return app;\n  }\n\n  private setApp(appName: string, helper: RegisteredAppHelper) {\n    this.apps.set(appName as AppName, helper);\n  }\n}\n\n/*\n  SuiSdkAdapter adapts IAppHelperInternal with @mysten/sui to IAppHelper\n */\nexport class SuiSdkAdapter implements IAppHelper<any> {\n  constructor(public helper: IAppHelperInternal<any>) {}\n\n  async deserialize(\n    input: SuiSignTransactionBlockInput & {\n      network: SuiNetworks;\n      clientUrl: string;\n      account: WalletAccount;\n    },\n  ) {\n    const client = createSuiClient(input.network, input.clientUrl);\n    const tx = await toDeserializeTransaction(input.transactionBlock);\n    return this.helper.deserialize({ ...input, suiClient: client, transaction: tx });\n  }\n\n  async build(input: {\n    intentionData: any;\n    txType: TransactionType;\n    txSubType: string;\n    clientUrl: string;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const client = createSuiClient(input.network, input.clientUrl);\n    const { balance } = await client.getBalance({\n      owner: input.account.address,\n      coinType: SUI_COIN_TYPE,\n    });\n    // Prefer total spendable (coin objects + address balance).\n    if (Number(balance.balance) < MIN_GAS_BALANCE) {\n      throw new Error('Insufficient gas fee');\n    }\n    const tx = await this.helper.build({ ...input, suiClient: client });\n    tx.setSender(input.account.address);\n    // Do not tx.build() here. Early build triggers Mysten/node doGasSelection and can\n    // bake gasData.budget=\"0\" + payment=[] for Address Balance txs. Callers (sui3-sdk\n    // simulate/propose) run prepareGasFunding + build later with the correct gas policy.\n    return tx;\n  }\n}\n\n/*\n  SuiGrpcSdkAdapter adapts IAppHelperInternalGrpc with @mysten/sui/grpc to IAppHelper\n */\nexport class SuiGrpcSdkAdapter implements IAppHelper<any> {\n  constructor(public helper: IAppHelperInternalGrpc<any>) {}\n\n  async deserialize(\n    input: SuiSignTransactionBlockInput & {\n      network: SuiNetworks;\n      clientUrl: string;\n      account: WalletAccount;\n    },\n  ) {\n    const suiGrpcClient = getSuiGrpcClient(input.network, input.clientUrl);\n    const tx = await toDeserializeTransaction(input.transactionBlock);\n    return this.helper.deserialize({ ...input, suiGrpcClient, transaction: tx });\n  }\n\n  async build(input: {\n    intentionData: any;\n    txType: TransactionType;\n    txSubType: string;\n    clientUrl: string;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const suiGrpcClient = getSuiGrpcClient(input.network, input.clientUrl);\n    const { balance } = await suiGrpcClient.core.getBalance({\n      owner: input.account.address,\n      coinType: SUI_COIN_TYPE,\n    });\n    // Prefer total spendable (coin objects + address balance).\n    if (Number(balance.balance) < MIN_GAS_BALANCE) {\n      throw new Error('Insufficient gas fee');\n    }\n    const tx = await this.helper.build({ ...input, suiGrpcClient });\n    tx.setSender(input.account.address);\n    // Do not tx.build() here. Early build triggers Mysten/node doGasSelection and can\n    // bake gasData.budget=\"0\" + payment=[] for Address Balance txs. Callers (sui3-sdk\n    // simulate/propose) run prepareGasFunding + build later with the correct gas policy.\n    return tx;\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\nimport { Scallop, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { getFullnodeUrl, SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport { DecoderLending } from './decoders/decoderLending';\nimport { DecoderReferral } from './decoders/decoderReferral';\nimport { DecoderVeSca } from './decoders/decoderVesca';\nimport { BorrowIntention, BorrowIntentionData } from './intentions/lending/borrow';\nimport { BorrowWithBoostIntention, BorrowWithBoostIntentionData } from './intentions/lending/borrow-with-boost';\nimport {\n  BorrowWithReferralIntention,\n  BorrowWithReferralIntentionData,\n} from './intentions/lending/borrow-with-referral';\nimport { ClaimIncentiveRewardIntention } from './intentions/lending/claim-incentive-reward';\nimport { DepositCollateralIntention, DepositCollateralIntentionData } from './intentions/lending/deposit-collateral';\nimport { MigrateAndClaimIntention, MigrateAndClaimIntentionData } from './intentions/lending/migrate-and-claim';\nimport { MigrateScoinIntention, MigrateScoinIntentionData } from './intentions/lending/migrate-scoin';\nimport { OpenObligationIntention, OpenObligationIntentionData } from './intentions/lending/open-obligation';\nimport { RepayIntention, RepayIntentionData } from './intentions/lending/repay';\nimport { RepayWithBoostIntention, RepayWithBoostIntentionData } from './intentions/lending/repay-with-boost';\nimport { SupplyLendingIntention, SupplyLendingIntentionData } from './intentions/lending/supply-lending';\nimport { UnstakeSpoolIntention, UnstakeSpoolIntentionData } from './intentions/lending/unstake-spool';\nimport {\n  WithdrawAndUnstakeLendingIntention,\n  WithdrawAndUnstakeLendingIntentionData,\n} from './intentions/lending/withdraw-and-unstake-lending';\nimport { WithdrawCollateralIntention, WithdrawCollateralIntentionData } from './intentions/lending/withdraw-collateral';\nimport { WithdrawLendingIntention, WithdrawLendingIntentionData } from './intentions/lending/withdraw-lending';\nimport { BindReferralIntention, BindReferralIntentionData } from './intentions/referral/bind-referral';\nimport {\n  ClaimRevenueReferralIntention,\n  ClaimRevenueReferralIntentionData,\n} from './intentions/referral/claim-revenue-referral';\nimport {\n  CreateReferralLinkIntention,\n  CreateReferralLinkIntentionData,\n} from './intentions/referral/create-referral-link';\nimport {\n  ExtendPeriodAndStakeMoreIntention,\n  ExtendPeriodAndStakeMoreIntentionData,\n} from './intentions/staking/extend-period-and-stake-more';\nimport { ExtendStakePeriodIntention, ExtendStakePeriodIntentionData } from './intentions/staking/extend-stake-period';\nimport { MergeVeScaIntention, MergeVeScaIntentionData } from './intentions/staking/merge-ve-sca';\nimport { RedeemScaIntention, RedeemScaIntentionData } from './intentions/staking/redeem-sca';\nimport {\n  RenewExpStakePeriodIntention,\n  RenewExpStakePeriodIntentionData,\n} from './intentions/staking/renew-exp-stake-period';\nimport { SplitVeScaIntention, SplitVeScaIntentionData } from './intentions/staking/split-ve-sca';\nimport { StakeScaIntention, StakeScaIntentionData } from './intentions/staking/stake-sca';\nimport {\n  SupplyAndStakeLendingIntention,\n  SupplyAndStakeLendingIntentionData,\n} from './intentions/staking/supply-and-stake-lending';\nimport {\n  VeScaObligationBindingsIntentData,\n  VeScaObligationBindingsIntention,\n} from './intentions/staking/ve-sca-obligation-bindings';\nimport { TransferVeScaKeysIntention, TransferVeScaKeysIntentionData } from './intentions/staking/ve-sca-transfers';\nimport { WithdrawStakedScaIntention, WithdrawStakedScaIntentionData } from './intentions/staking/withdraw-staked-sca';\nimport { SuiNetworks } from './types';\nimport { TransactionSubType } from './types/utils';\nimport { IAppHelperInternal } from '../interface/sui';\n\nexport type ScallopIntention =\n  | SupplyLendingIntention\n  | WithdrawLendingIntention\n  | BorrowIntention\n  | RepayIntention\n  | DepositCollateralIntention\n  | WithdrawCollateralIntention\n  | OpenObligationIntention\n  | UnstakeSpoolIntention\n  | ClaimIncentiveRewardIntention\n  | BorrowWithBoostIntention\n  | StakeScaIntention\n  | ExtendStakePeriodIntention\n  | ExtendPeriodAndStakeMoreIntention\n  | RenewExpStakePeriodIntention\n  | WithdrawStakedScaIntention\n  | SupplyAndStakeLendingIntention\n  | WithdrawAndUnstakeLendingIntention\n  | RedeemScaIntention\n  | MigrateAndClaimIntention\n  | BorrowWithReferralIntention\n  | CreateReferralLinkIntention\n  | ClaimRevenueReferralIntention\n  | BindReferralIntention\n  | MigrateScoinIntention\n  | RepayWithBoostIntention\n  | MergeVeScaIntention\n  | SplitVeScaIntention\n  | VeScaObligationBindingsIntention\n  | TransferVeScaKeysIntention;\n\nexport type ScallopIntentionData =\n  | SupplyLendingIntentionData\n  | WithdrawLendingIntentionData\n  | BorrowIntentionData\n  | RepayIntentionData\n  | DepositCollateralIntentionData\n  | WithdrawCollateralIntentionData\n  | OpenObligationIntentionData\n  | UnstakeSpoolIntentionData\n  | BorrowWithBoostIntentionData\n  | StakeScaIntentionData\n  | ExtendStakePeriodIntentionData\n  | ExtendPeriodAndStakeMoreIntentionData\n  | RenewExpStakePeriodIntentionData\n  | WithdrawStakedScaIntentionData\n  | SupplyAndStakeLendingIntentionData\n  | WithdrawAndUnstakeLendingIntentionData\n  | RedeemScaIntentionData\n  | MigrateAndClaimIntentionData\n  | BorrowWithReferralIntentionData\n  | CreateReferralLinkIntentionData\n  | ClaimRevenueReferralIntentionData\n  | BindReferralIntentionData\n  | MigrateScoinIntentionData\n  | RepayWithBoostIntentionData\n  | MergeVeScaIntentionData\n  | SplitVeScaIntentionData\n  | VeScaObligationBindingsIntentData\n  | TransferVeScaKeysIntentionData;\n\nexport class ScallopAppHelper implements IAppHelperInternal<ScallopIntentionData> {\n  application = 'scallop';\n\n  supportSDK = '@mysten/sui' as const;\n\n  private scallopClient: ScallopClient | undefined;\n\n  private async initScallopClient(walletAddress: string, suiClient: SuiClient) {\n    if (!this.scallopClient) {\n      const scallop = new Scallop({\n        addressId: '695fcdc084f790c04eb068dc',\n        walletAddress,\n        suiClients: [suiClient],\n        fullnodeUrls: [\n          (suiClient as any).transport.rpcClient.requestManager.transports[0]?.uri ?? getFullnodeUrl('mainnet'),\n        ],\n      });\n      this.scallopClient = await scallop.createScallopClient();\n    }\n  }\n\n  async deserialize(input: {\n    transaction: Transaction;\n    chain: IdentifierString;\n    network: SuiNetworks;\n    suiClient: SuiClient;\n    account: WalletAccount;\n    appContext?: any;\n  }): Promise<{\n    txType: TransactionType;\n    txSubType: TransactionSubType;\n    intentionData: ScallopIntentionData;\n  }> {\n    const { transaction, suiClient, account } = input;\n    await this.initScallopClient(account.address, suiClient);\n\n    // const devInspectResult = await input.suiClient.devInspectTransactionBlock({\n    //   transactionBlock: transaction,\n    //   sender: input.account.address,\n    // });\n\n    const decoderLending = new DecoderLending(transaction, this.scallopClient);\n    const decoderReferral = new DecoderReferral(transaction, this.scallopClient);\n    const decoderVesca = new DecoderVeSca(transaction, this.scallopClient);\n\n    const result = decoderLending.decode() || decoderReferral.decode() || (await decoderVesca.decode());\n\n    if (!result) {\n      throw new Error('Unknown transaction type');\n    }\n    return {\n      txType: TransactionType.Other,\n      txSubType: result.type,\n      intentionData: result.intentionData,\n    };\n  }\n\n  async build(input: {\n    intentionData: ScallopIntentionData;\n    txType: TransactionType;\n    txSubType: string;\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiClient, account, network, txSubType, intentionData } = input;\n    await this.initScallopClient(account.address, suiClient);\n\n    let intention: ScallopIntention;\n    switch (txSubType) {\n      case TransactionSubType.SupplyLending:\n        intention = SupplyLendingIntention.fromData(intentionData as SupplyLendingIntentionData);\n        break;\n      case TransactionSubType.WithdrawLending:\n        intention = WithdrawLendingIntention.fromData(intentionData as WithdrawLendingIntentionData);\n        break;\n      case TransactionSubType.Borrow:\n        intention = BorrowIntention.fromData(intentionData as BorrowIntentionData);\n        break;\n      case TransactionSubType.Repay:\n        intention = RepayIntention.fromData(intentionData as RepayIntentionData);\n        break;\n      case TransactionSubType.DepositCollateral:\n        intention = DepositCollateralIntention.fromData(intentionData as DepositCollateralIntentionData);\n        break;\n      case TransactionSubType.WithdrawCollateral:\n        intention = WithdrawCollateralIntention.fromData(intentionData as WithdrawCollateralIntentionData);\n        break;\n      case TransactionSubType.OpenObligation:\n        intention = OpenObligationIntention.fromData(intentionData as OpenObligationIntentionData);\n        break;\n      case TransactionSubType.UnstakeSpool:\n        intention = UnstakeSpoolIntention.fromData(intentionData as UnstakeSpoolIntentionData);\n        break;\n      case TransactionSubType.ClaimIncentiveReward:\n        intention = ClaimIncentiveRewardIntention.fromData(intentionData);\n        break;\n      case TransactionSubType.BorrowWithBoost:\n        intention = BorrowWithBoostIntention.fromData(intentionData as BorrowWithBoostIntentionData);\n        break;\n      case TransactionSubType.StakeSca:\n        intention = StakeScaIntention.fromData(intentionData as StakeScaIntentionData);\n        break;\n      case TransactionSubType.ExtendStakePeriod:\n        intention = ExtendStakePeriodIntention.fromData(intentionData as ExtendStakePeriodIntentionData);\n        break;\n      case TransactionSubType.ExtendPeriodAndStakeMore:\n        intention = ExtendPeriodAndStakeMoreIntention.fromData(intentionData as ExtendPeriodAndStakeMoreIntentionData);\n        break;\n      case TransactionSubType.RenewExpStakePeriod:\n        intention = RenewExpStakePeriodIntention.fromData(intentionData as RenewExpStakePeriodIntentionData);\n        break;\n      case TransactionSubType.WithdrawStakedSca:\n        intention = WithdrawStakedScaIntention.fromData(intentionData as WithdrawStakedScaIntentionData);\n        break;\n      case TransactionSubType.SupplyAndStakeLending:\n        intention = SupplyAndStakeLendingIntention.fromData(intentionData as SupplyAndStakeLendingIntentionData);\n        break;\n      case TransactionSubType.WithdrawAndUnstakeLending:\n        intention = WithdrawAndUnstakeLendingIntention.fromData(\n          intentionData as WithdrawAndUnstakeLendingIntentionData,\n        );\n        break;\n      case TransactionSubType.RedeemSca:\n        intention = RedeemScaIntention.fromData(intentionData as RedeemScaIntentionData);\n        break;\n      case TransactionSubType.MigrateAndClaim:\n        intention = MigrateAndClaimIntention.fromData(intentionData as MigrateAndClaimIntentionData);\n        break;\n      case TransactionSubType.BorrowWithReferral:\n        intention = BorrowWithReferralIntention.fromData(intentionData as BorrowWithReferralIntentionData);\n        break;\n      case TransactionSubType.CreateReferralLink:\n        intention = CreateReferralLinkIntention.fromData(intentionData as CreateReferralLinkIntentionData);\n        break;\n      case TransactionSubType.ClaimRevenueReferral:\n        intention = ClaimRevenueReferralIntention.fromData(intentionData as ClaimRevenueReferralIntentionData);\n        break;\n      case TransactionSubType.BindReferral:\n        intention = BindReferralIntention.fromData(intentionData as BindReferralIntentionData);\n        break;\n      case TransactionSubType.MigrateScoin:\n        intention = MigrateScoinIntention.fromData(intentionData as MigrateScoinIntentionData);\n        break;\n      case TransactionSubType.RepayWithBoost:\n        intention = RepayWithBoostIntention.fromData(intentionData as RepayWithBoostIntentionData);\n        break;\n      case TransactionSubType.MergeVeSca:\n        intention = MergeVeScaIntention.fromData(intentionData as MergeVeScaIntentionData);\n        break;\n      case TransactionSubType.SplitVeSca:\n        intention = SplitVeScaIntention.fromData(intentionData as SplitVeScaIntentionData);\n        break;\n      case TransactionSubType.VeScaObligationBindings: {\n        intention = VeScaObligationBindingsIntention.fromData(intentionData as VeScaObligationBindingsIntentData);\n        break;\n      }\n      case TransactionSubType.TransferVeScaKeys: {\n        intention = TransferVeScaKeysIntention.fromData(intentionData as TransferVeScaKeysIntentionData);\n        break;\n      }\n      default:\n        throw new Error('not implemented');\n    }\n    return intention.build({ suiClient, account, network, scallopClient: this.scallopClient });\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { OLD_BORROW_INCENTIVE_PROTOCOL_ID } from '@scallop-io/sui-scallop-sdk';\n\nimport { Decoder } from './decoder';\nimport { SplitCoinTransactionType } from '../types/sui';\nimport { DecodeResult, TransactionSubType } from '../types/utils';\nimport { MoveCallHelper, SplitCoinHelper } from '../utils';\n\nexport class DecoderLending extends Decoder {\n  decode() {\n    // if (this.isMoveAsset()) {\n    //   return this.decodeMoveAsset();\n    // }\n    if (this.isSupplyWithStakeSpoolTransaction()) {\n      return this.decodeSupplyWithStakeSpool();\n    }\n    if (this.isUnstakeAndWithdrawTransaction()) {\n      return this.decodeUnstakeAndWithdraw();\n    }\n    if (this.isStakeSpoolTransaction()) {\n      return this.decodeStakeSpool();\n    }\n    if (this.isDepositCollateralTransaction()) {\n      return this.decodeDepositCollateral();\n    }\n    if (this.isWithdrawCollateralTransaction()) {\n      return this.decodeWithdrawCollateral();\n    }\n    if (this.isWithdrawLendingScoinTransaction()) {\n      return this.decodeWithdrawLendingScoin();\n    }\n    if (this.isWithdrawLendingTransaction()) {\n      return this.decodeWithdrawLending();\n    }\n    if (this.isSupplyLendingTransaction()) {\n      return this.decodeSupplyLending();\n    }\n    if (this.isBorrowWithReferralTransaction()) {\n      return this.decodeBorrowWithReferral();\n    }\n    if (this.isBorrowWithBoostTransaction()) {\n      return this.decodeBorrowWithBoost();\n    }\n    if (this.isBorrowTransaction()) {\n      return this.decodeBorrow();\n    }\n    if (this.isRepayWithBoostTransaction()) {\n      return this.decodeRepayWithBoost();\n    }\n    if (this.isRepayTransaction()) {\n      return this.decodeRepay();\n    }\n    if (this.isUnstakeSpoolTransaction()) {\n      return this.decodeUnstakeSpool();\n    }\n    if (this.isMigrateAndClaim()) {\n      return this.decodeMigrateAndClaim();\n    }\n    if (this.isClaimRewardTransaction()) {\n      return this.decodeClaimReward();\n    }\n    if (this.isOpenObligationTransaction()) {\n      return this.decodeOpenObligation();\n    }\n    if (this.isMigrateScoinTransaction()) {\n      return this.decodeMigrateScoin();\n    }\n    return undefined;\n  }\n\n  private isMigrateScoinTransaction() {\n    return this.hasMoveCallCommand(`${this.coreId.scoin}::s_coin_converter::mint_s_coin`);\n  }\n\n  private isSupplyLendingTransaction() {\n    return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::mint::mint`);\n  }\n\n  private isSupplyWithStakeSpoolTransaction() {\n    const supplyMoveCall = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::mint::mint`);\n    const stakeMoveCall = this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::stake`);\n    return supplyMoveCall && stakeMoveCall;\n  }\n\n  private isUnstakeAndWithdrawTransaction() {\n    const unstakeMoveCall = this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::unstake`);\n    const withdrawMoveCall = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::redeem::redeem`);\n    return unstakeMoveCall && withdrawMoveCall;\n  }\n\n  private isStakeSpoolTransaction() {\n    return this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::stake`);\n  }\n\n  private isWithdrawLendingTransaction() {\n    return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::redeem::redeem`);\n  }\n\n  private isWithdrawLendingScoinTransaction() {\n    const redeem = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::redeem::redeem`);\n    const burnScoin = this.hasMoveCallCommand(`${this.coreId.scoin}::s_coin_converter::burn_s_coin`);\n    return redeem && burnScoin;\n  }\n\n  private isDepositCollateralTransaction() {\n    return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::deposit_collateral::deposit_collateral`);\n  }\n\n  private isWithdrawCollateralTransaction() {\n    return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::withdraw_collateral::withdraw_collateral`);\n  }\n\n  private isBorrowTransaction() {\n    return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::borrow::borrow`);\n  }\n\n  private isBorrowWithBoostTransaction() {\n    const borrowMoveCall = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::borrow::borrow`);\n    const stakeMoveCall = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca_v2`);\n    return borrowMoveCall && stakeMoveCall;\n  }\n\n  private isBorrowWithReferralTransaction() {\n    return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::borrow::borrow_with_referral`);\n  }\n\n  private isRepayTransaction() {\n    return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::repay::repay`);\n  }\n\n  private isRepayWithBoostTransaction() {\n    const repayMoveCall = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::repay::repay`);\n    const stakeMoveCall = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca_v2`);\n    return repayMoveCall && stakeMoveCall;\n  }\n\n  private isUnstakeSpoolTransaction() {\n    return this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::unstake`);\n  }\n\n  private isCreateStakeAccountTransaction() {\n    return this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::new_spool_account`);\n  }\n\n  private isClaimRewardTransaction() {\n    const lendingIncentive = this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::redeem_rewards`);\n    const borrowIncentiveV2 = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::redeem_rewards`);\n    return lendingIncentive || borrowIncentiveV2;\n  }\n\n  private isOpenObligationTransaction() {\n    return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::open_obligation::open_obligation`);\n  }\n\n  private isMigrateAndClaim() {\n    const oldBorrowIncentive = this.hasMoveCallCommand(`${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::redeem_rewards`);\n    const stakeWithVeSca = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca_v2`);\n    const stakeWithoutVesca = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::stake`);\n    return oldBorrowIncentive && (stakeWithVeSca || stakeWithoutVesca);\n  }\n\n  private get helperClaimLendingReward() {\n    const moveCalls = this.commands\n      .filter((command) => this.filterMoveCallCommands(command, `${this.coreId.spoolPkg}::user::redeem_rewards`))\n      .map((command) => new MoveCallHelper(command, this.transaction));\n    return moveCalls;\n  }\n\n  private get helperClaimBorrowV2Reward() {\n    const moveCalls = this.commands\n      .filter((command) =>\n        this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::redeem_rewards`),\n      )\n      .map((command) => new MoveCallHelper(command, this.transaction));\n    return moveCalls;\n  }\n\n  private get helperStakeObligationWithVeSca() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca_v2`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperClaimBorrowReward() {\n    const moveCalls = this.commands\n      .filter((command) =>\n        this.filterMoveCallCommands(command, `${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::redeem_rewards`),\n      )\n      .map((command) => new MoveCallHelper(command, this.transaction));\n    return moveCalls;\n  }\n\n  private get helperMint() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::mint::mint`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperUnstakes() {\n    const moveCalls = this.commands\n      .filter((command) => this.filterMoveCallCommands(command, `${this.coreId.spoolPkg}::user::unstake`))\n      .map((command) => new MoveCallHelper(command, this.transaction));\n    return moveCalls;\n  }\n\n  private get helperRedeems() {\n    const moveCalls = this.commands\n      .filter((command) => this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::redeem::redeem`))\n      .map((command) => new MoveCallHelper(command, this.transaction));\n    return moveCalls;\n  }\n\n  private get helperRedeem() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::redeem::redeem`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperBurnScoin() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.scoin}::s_coin_converter::burn_s_coin`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  // private get helperSlippage() {\n  //   const moveCall = this.commands.find((command) =>\n  //     this.filterMoveCallCommands(\n  //       command,\n  //       `0x5857d185897aaff40ae37b2eecc895efc1a9dff1b210c4fb894eabbce4ac2603::slippage_check::check_slippage`,\n  //     ),\n  //   );\n  //   return new MoveCallHelper(moveCall, this.transaction);\n  // }\n\n  private get helperStake() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.spoolPkg}::user::stake`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperUnstake() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.spoolPkg}::user::unstake`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperDepositCollateral() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::deposit_collateral::deposit_collateral`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperWithdrawCollateral() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::withdraw_collateral::withdraw_collateral`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperBorrow() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::borrow::borrow`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperBorrowWithReferral() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::borrow::borrow_with_referral`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperRepay() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::repay::repay`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private decodeMigrateScoin(): DecodeResult {\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.MigrateScoin,\n      intentionData: {},\n    };\n  }\n\n  private decodeMigrateAndClaim(): DecodeResult {\n    let veScaKey;\n    if (this.helperStakeObligationWithVeSca.moveCall) {\n      veScaKey = this.helperStakeObligationWithVeSca.decodeOwnedObjectId(9);\n    }\n    const obligationKey = this.helperClaimBorrowReward[0].decodeOwnedObjectId(2);\n    const obligationId = this.helperClaimBorrowReward[0].decodeSharedObjectId(3);\n    const rewardCoinName = this.utils.parseCoinNameFromType(this.helperClaimBorrowReward[0].typeArg(0));\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.MigrateAndClaim,\n      intentionData: {\n        obligationKey,\n        obligationId,\n        rewardCoinName,\n        veScaKey,\n      },\n    };\n  }\n\n  private decodeOpenObligation(): DecodeResult {\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.OpenObligation,\n      intentionData: {},\n    };\n  }\n\n  // @TODO: Decode from event rather than from transaction block\n  private decodeSupplyLending(): DecodeResult {\n    const coinName = this.utils.parseCoinNameFromType(this.helperMint.typeArg(0));\n    const amount = this.helperMint.getNestedInputParam<SplitCoinTransactionType>(2);\n    const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n      .getAmountInput()\n      .reduce((a, b) => a + b, 0);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.SupplyLending,\n      intentionData: {\n        amount: amountFromSplitCoin,\n        coinName,\n      },\n    };\n  }\n\n  private decodeWithdrawLending(): DecodeResult {\n    const coinName = this.utils.parseCoinNameFromType(this.helperRedeem.typeArg(0));\n    const amount = this.helperRedeem.getNestedInputParam<SplitCoinTransactionType>(2);\n    const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n      .getAmountInput()\n      .reduce((a, b) => a + b, 0);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.WithdrawLending,\n      intentionData: {\n        amount: amountFromSplitCoin,\n        coinName,\n      },\n    };\n  }\n\n  private decodeWithdrawLendingScoin(): DecodeResult {\n    const coinName = this.utils.parseCoinNameFromType(this.helperRedeem.typeArg(0));\n    const amount = this.helperBurnScoin.getNestedInputParam<SplitCoinTransactionType>(1);\n    const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n      .getAmountInput()\n      .reduce((a, b) => a + b, 0);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.WithdrawLending,\n      intentionData: {\n        amount: amountFromSplitCoin,\n        coinName,\n      },\n    };\n  }\n\n  private decodeDepositCollateral(): DecodeResult {\n    const coinName = this.utils.parseCoinNameFromType(this.helperDepositCollateral.typeArg(0));\n    const amount = this.helperDepositCollateral.getNestedInputParam<SplitCoinTransactionType>(3);\n    const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n      .getAmountInput()\n      .reduce((a, b) => a + b, 0);\n    const obligationId = this.helperDepositCollateral.decodeSharedObjectId(1);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.DepositCollateral,\n      intentionData: {\n        amount: amountFromSplitCoin,\n        obligationId,\n        collateralCoinName: coinName,\n      },\n    };\n  }\n\n  private decodeWithdrawCollateral(): DecodeResult {\n    const coinName = this.utils.parseCoinNameFromType(this.helperWithdrawCollateral.typeArg(0));\n    const amount = this.helperWithdrawCollateral.decodeInputU64(5);\n    const obligationId = this.helperWithdrawCollateral.decodeSharedObjectId(1);\n    const obligationKey = this.helperWithdrawCollateral.decodeOwnedObjectId(2);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.WithdrawCollateral,\n      intentionData: {\n        amount,\n        collateralCoinName: coinName,\n        obligationKey,\n        obligationId,\n      },\n    };\n  }\n\n  private decodeBorrow(): DecodeResult {\n    const coinName = this.utils.parseCoinNameFromType(this.helperBorrow.typeArg(0));\n    const amount = this.helperBorrow.decodeInputU64(5);\n    const obligationId = this.helperBorrow.decodeSharedObjectId(1);\n    const obligationKey = this.helperBorrow.decodeOwnedObjectId(2);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.Borrow,\n      intentionData: {\n        amount,\n        coinName,\n        obligationKey,\n        obligationId,\n      },\n    };\n  }\n\n  private decodeBorrowWithBoost(): DecodeResult {\n    const coinName = this.utils.parseCoinNameFromType(this.helperBorrow.typeArg(0));\n    const veScaKey = this.helperStakeObligationWithVeSca.decodeOwnedObjectId(9);\n    const amount = this.helperBorrow.decodeInputU64(5);\n    const obligationId = this.helperBorrow.decodeSharedObjectId(1);\n    const obligationKey = this.helperBorrow.decodeOwnedObjectId(2);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.BorrowWithBoost,\n      intentionData: {\n        amount,\n        coinName,\n        obligationKey,\n        obligationId,\n        veScaKey,\n      },\n    };\n  }\n\n  private decodeBorrowWithReferral(): DecodeResult {\n    const coinName = this.utils.parseCoinNameFromType(this.helperBorrowWithReferral.typeArg(0));\n    let veScaKey;\n    if (this.helperStakeObligationWithVeSca.moveCall) {\n      veScaKey = this.helperStakeObligationWithVeSca.decodeOwnedObjectId(9);\n    }\n    const amount = this.helperBorrowWithReferral.decodeInputU64(6);\n    const obligationId = this.helperBorrowWithReferral.decodeSharedObjectId(1);\n    const obligationKey = this.helperBorrowWithReferral.decodeOwnedObjectId(2);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.BorrowWithReferral,\n      intentionData: {\n        amount,\n        coinName,\n        obligationKey,\n        obligationId,\n        veScaKey,\n      },\n    };\n  }\n\n  private decodeRepay(): DecodeResult {\n    const coinName = this.utils.parseCoinNameFromType(this.helperRepay.typeArg(0));\n    const amount = this.helperRepay.getNestedInputParam<SplitCoinTransactionType>(3);\n    const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n      .getAmountInput()\n      .reduce((a, b) => a + b, 0);\n    const obligationId = this.helperRepay.decodeSharedObjectId(1);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.Repay,\n      intentionData: {\n        amount: amountFromSplitCoin,\n        obligationId,\n        coinName,\n      },\n    };\n  }\n\n  private decodeRepayWithBoost(): DecodeResult {\n    const coinName = this.utils.parseCoinNameFromType(this.helperRepay.typeArg(0));\n    const veScaKey = this.helperStakeObligationWithVeSca.decodeOwnedObjectId(9);\n    const amount = this.helperRepay.getNestedInputParam<SplitCoinTransactionType>(3);\n    const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n      .getAmountInput()\n      .reduce((a, b) => a + b, 0);\n    const obligationId = this.helperRepay.decodeSharedObjectId(1);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.RepayWithBoost,\n      intentionData: {\n        amount: amountFromSplitCoin,\n        obligationId,\n        coinName,\n        veScaKey,\n      },\n    };\n  }\n\n  private decodeStakeSpool(): DecodeResult {\n    let stakeSpoolAccount;\n    if (!this.isCreateStakeAccountTransaction()) {\n      stakeSpoolAccount = this.helperStake.decodeOwnedObjectId(1);\n    }\n    let amountFromSplitCoin = 0;\n    if (this.helperBurnScoin.moveCall) {\n      const amount = this.helperBurnScoin.getNestedInputParam<SplitCoinTransactionType>(1);\n      amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction).getAmountInput().reduce((a, b) => a + b, 0);\n    }\n    if (this.helperStake.moveCall && amountFromSplitCoin === 0) {\n      const amount = this.helperStake.getNestedInputParam<SplitCoinTransactionType>(2);\n      amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction).getAmountInput().reduce((a, b) => a + b, 0);\n    }\n    const coinType = this.helperStake.typeArg(0);\n    const coinName = this.utils.parseCoinNameFromType(coinType);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.StakeSpool,\n      intentionData: {\n        amount: amountFromSplitCoin,\n        marketCoinName: coinName,\n        stakeAccountId: stakeSpoolAccount,\n      },\n    };\n  }\n\n  private decodeUnstakeSpool(): DecodeResult {\n    const stakeSpoolAccount = this.helperUnstake.decodeOwnedObjectId(1);\n    const amount = this.helperUnstake.decodeInputU64(2);\n    const coinType = this.helperUnstake.typeArg(0);\n    const coinName = this.utils.parseCoinNameFromType(coinType);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.UnstakeSpool,\n      intentionData: {\n        amount,\n        marketCoinName: coinName,\n        stakeAccountId: stakeSpoolAccount,\n      },\n    };\n  }\n\n  private decodeSupplyWithStakeSpool(): DecodeResult {\n    const coinName = this.utils.parseCoinNameFromType(this.helperMint.typeArg(0));\n    const amount = this.helperMint.getNestedInputParam<SplitCoinTransactionType>(2);\n    const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n      .getAmountInput()\n      .reduce((a, b) => a + b, 0);\n    let stakeSpoolAccount;\n    if (!this.isCreateStakeAccountTransaction()) {\n      stakeSpoolAccount = this.helperStake.decodeOwnedObjectId(1);\n    }\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.SupplyAndStakeLending,\n      intentionData: {\n        amount: amountFromSplitCoin,\n        coinName,\n        stakeAccountId: stakeSpoolAccount,\n      },\n    };\n  }\n\n  private decodeUnstakeAndWithdraw(): DecodeResult {\n    const stakeAccountWithAmount: { id: string; coin: number }[] = [];\n    this.helperUnstakes.forEach((tx) => {\n      const stakeAccountId = tx.decodeOwnedObjectId(1);\n      const amount = tx.decodeInputU64(2);\n      stakeAccountWithAmount.push({ id: stakeAccountId, coin: amount });\n    });\n    const coinName = this.utils.parseCoinNameFromType(this.helperRedeems[0].typeArg(0));\n    let amountFromSplitCoin = 0;\n    if (this.helperBurnScoin.moveCall) {\n      const amount = this.helperBurnScoin.getNestedInputParam<SplitCoinTransactionType>(1);\n      amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction).getAmountInput().reduce((a, b) => a + b, 0);\n    }\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.WithdrawAndUnstakeLending,\n      intentionData: {\n        amount: amountFromSplitCoin,\n        coinName,\n        stakeAccountId: stakeAccountWithAmount,\n      },\n    };\n  }\n\n  // private decodeMoveAsset(): DecodeResult {\n  //   const stakeAccountWithAmount: { id: string; coin: number }[] = [];\n  //   this.helperUnstakes.forEach((tx) => {\n  //     const stakeAccountId = tx.decodeOwnedObjectId(1);\n  //     const amount = tx.decodeInputU64(2);\n  //     stakeAccountWithAmount.push({ id: stakeAccountId, coin: amount });\n  //   });\n  //   const coinName = this.utils.parseCoinNameFromType(this.helperRedeems[0].typeArg(0));\n  //   let amountFromSplitCoin = 0;\n  //   if (this.helperBurnScoin.moveCall) {\n  //     const amount = this.helperBurnScoin.getNestedInputParam<SplitCoinTransactionType>(1);\n  //     amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction).getAmountInput().reduce((a, b) => a + b, 0);\n  //   }\n  //   const slippage = this.helperSlippage.decodePureArg(1, 'U64');\n  //   const validSwapAmount = this.helperSlippage.decodePureArg(2, 'String');\n\n  //   return {\n  //     txType: TransactionType.Other,\n  //     type: TransactionSubType.MigrateWusdcToUsdc,\n  //     intentionData: {\n  //       amount: amountFromSplitCoin,\n  //       coinName,\n  //       slippage,\n  //       validSwapAmount,\n  //       stakeAccountId: stakeAccountWithAmount,\n  //     },\n  //   };\n  // }\n\n  private decodeClaimReward(): DecodeResult {\n    const lendingReward: {\n      stakeMarketCoinName: string;\n      stakeAccountId: string;\n    }[] = [];\n    const borrowRewardV2: {\n      obligationId: string;\n      obligationKey: string;\n      rewardCoinName: string;\n    }[] = [];\n\n    const borrowReward: {\n      obligationId: string;\n      obligationKey: string;\n      rewardCoinName: string;\n    }[] = [];\n\n    this.helperClaimLendingReward.forEach((tx) => {\n      const stakeAccountId = tx.decodeOwnedObjectId(2);\n      const stakeMarketCoinName = tx.typeArg(0);\n      const coinName = this.utils.parseCoinNameFromType(stakeMarketCoinName);\n      lendingReward.push({ stakeMarketCoinName: coinName as string, stakeAccountId });\n    });\n\n    this.helperClaimBorrowV2Reward.forEach((tx) => {\n      const obligationKey = tx.decodeSharedObjectId(4);\n      const obligationId = tx.decodeOwnedObjectId(3);\n      const rewardCoinName = this.utils.parseCoinNameFromType(tx.typeArg(0));\n      borrowRewardV2.push({ obligationId, obligationKey, rewardCoinName });\n    });\n\n    this.helperClaimBorrowReward.forEach((tx) => {\n      const obligationKey = tx.decodeSharedObjectId(2);\n      const obligationId = tx.decodeOwnedObjectId(3);\n      const rewardCoinName = this.utils.parseCoinNameFromType(tx.typeArg(0));\n      borrowReward.push({ obligationId, obligationKey, rewardCoinName });\n    });\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.ClaimIncentiveReward,\n      intentionData: {\n        lendingIncentive: lendingReward,\n        borrowIncentiveV2: borrowRewardV2,\n        borrowIncentive: borrowReward,\n      },\n    };\n  }\n}\n","// import { DevInspectResults } from '@/compat/mysten-sui-json-rpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { parseStructTag } from '@mysten/sui/utils';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { MoveCallCommand, TransactionCommand, TransactionCommands, TransactionInputs } from '../types/sui';\n\nexport class Decoder {\n  protected inputs: TransactionInputs;\n\n  protected commands: TransactionCommands;\n\n  protected movecallsAsSet: Set<string>;\n\n  constructor(\n    public readonly transaction: Transaction,\n    protected scallopClient: ScallopClient,\n    // protected devInspectResult: DevInspectResults,\n  ) {\n    this.scallopClient = scallopClient;\n    this.inputs = transaction.getData().inputs;\n    this.commands = transaction.getData().commands;\n    this.movecallsAsSet = new Set(\n      this.commands\n        .filter(this.isMoveCall)\n        .map((command) => `${command.MoveCall!.package}::${command.MoveCall!.module}::${command.MoveCall!.function}`),\n    );\n  }\n\n  get address() {\n    return this.scallopClient.address;\n  }\n\n  get utils() {\n    return this.scallopClient.utils;\n  }\n\n  protected get coreId() {\n    return {\n      protocolPkg: this.address.get('core.packages.protocol.id'),\n      market: this.address.get('core.market'),\n      version: this.address.get('core.version'),\n      coinDecimalsRegistry: this.address.get('core.coinDecimalsRegistry'),\n      xOracle: this.address.get('core.oracles.xOracle'),\n      spoolPkg: this.address.get('spool.id'),\n      borrowIncentivePkg: this.address.get('borrowIncentive.id'),\n      veScaPkgId: this.address.get('vesca.id'),\n      veScaObjId: this.address.get('vesca.object'),\n      scoin: this.address.get('scoin.id'),\n      referral: this.address.get('referral.id'),\n    };\n  }\n\n  protected matchMoveCallCommand(moveCall: MoveCallCommand, target: string) {\n    const { address, module, name } = parseStructTag(target);\n    if (!moveCall) {\n      return false;\n    }\n    return moveCall.package === address && moveCall.module === module && moveCall.function === name;\n  }\n\n  private isMoveCall(\n    command: TransactionCommand,\n  ): command is typeof command & NonNullable<{ MoveCall: MoveCallCommand }> {\n    return command.$kind === 'MoveCall' && !!command.MoveCall;\n  }\n\n  protected filterMoveCallCommands(command: TransactionCommand, target: string) {\n    return this.isMoveCall(command) && this.matchMoveCallCommand(command.MoveCall, target);\n  }\n\n  protected getMoveCallCommands(targets: string[]): MoveCallCommand[] {\n    const targetSet = new Set(targets);\n    const targetToIdxMap = targets.reduce(\n      (acc, target, idx) => {\n        acc[target] = idx;\n        return acc;\n      },\n      {} as Record<string, number>,\n    );\n\n    const moveCallCommands: MoveCallCommand[] = [];\n    this.commands.forEach((command) => {\n      if (this.isMoveCall(command) && command.MoveCall && targetSet.has(command.MoveCall.package)) {\n        moveCallCommands[targetToIdxMap[command.MoveCall.package]] = command.MoveCall;\n      }\n    });\n\n    return moveCallCommands;\n  }\n\n  protected hasMoveCallCommand(target: string) {\n    return this.movecallsAsSet.has(target);\n  }\n}\n","import { bcs } from '@mysten/sui/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui/utils';\n\nimport {\n  BcsType,\n  MoveCallTransactionArgumentType,\n  MoveCallTransactionType,\n  SplitCoinTransactionType,\n  TransactionCommand,\n} from '../types/sui';\n\n/** Legacy Transaction.blockData input / argument shape still used by scallop decoders. */\ntype LegacyTxInput = {\n  type?: string;\n  value?: any;\n  kind?: string;\n  index?: number;\n  Pure?: number[];\n};\n\nclass MoveCallHelper {\n  private cmdIdx: number;\n\n  constructor(\n    public readonly moveCall: TransactionCommand | undefined,\n    public readonly transaction: Transaction,\n    index = 0,\n  ) {\n    const indexes: number[] = [];\n    if (moveCall?.MoveCall) {\n      transaction.getData().commands.filter((t, idx) => {\n        if (t.$kind === 'MoveCall') {\n          const target = `${t.MoveCall.package}::${t.MoveCall.module}::${t.MoveCall.function}`;\n          const moveCallTarget = `${moveCall.MoveCall.package}::${moveCall.MoveCall.module}::${moveCall.MoveCall.function}`;\n          const match = target === moveCallTarget;\n          if (match) {\n            indexes.push(idx);\n            return true;\n          }\n          return false;\n        }\n        return false;\n      });\n    }\n    this.cmdIdx = indexes[index];\n  }\n\n  get txBlockTransactions(): MoveCallTransactionType {\n    return this.transaction.blockData.transactions[this.cmdIdx] as MoveCallTransactionType;\n  }\n\n  decodeSharedObjectId(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return MoveCallHelper.getSharedObjectId(input);\n  }\n\n  decodeOwnedObjectId(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return MoveCallHelper.getOwnedObjectId(input);\n  }\n\n  decodeInputU64(argIndex: number) {\n    const strVal = this.decodePureArg<string>(argIndex, 'U64');\n    return Number(strVal);\n  }\n\n  decodeInputU8(argIndex: number) {\n    const strVal = this.decodePureArg<string>(argIndex, 'U8');\n    return Number(strVal);\n  }\n\n  decodeInputAddress(argIndex: number) {\n    const input = this.decodePureArg<string>(argIndex, 'Address');\n    return normalizeSuiAddress(input);\n  }\n\n  decodeInputString(argIndex: number) {\n    return this.decodePureArg<string>(argIndex, 'String');\n  }\n\n  decodeInputBool(argIndex: number) {\n    return this.decodePureArg<boolean>(argIndex, 'Bool');\n  }\n\n  decodePureArg<T>(argIndex: number, type: BcsType) {\n    const input = this.getInputParam(argIndex);\n    return MoveCallHelper.getPureInputValue<T>(input, type);\n  }\n\n  getInputParam(argIndex: number) {\n    const arg = this.txBlockTransactions.arguments[argIndex] as MoveCallTransactionArgumentType;\n    if (arg.kind !== 'Input') {\n      throw new Error('not input type');\n    }\n    return arg;\n  }\n\n  getNestedInputParam<T = SplitCoinTransactionType>(argIndex: number) {\n    const arg = this.txBlockTransactions.arguments[argIndex] as MoveCallTransactionArgumentType;\n    if (arg.kind !== 'NestedResult' && arg.kind !== 'Result') {\n      throw new Error('not nested or result type');\n    }\n    return this.transaction.blockData.transactions[arg.index] as T;\n  }\n\n  static getPureInputValue<T>(input: LegacyTxInput, type: BcsType) {\n    if (input.type !== 'pure') {\n      throw new Error('not pure argument');\n    }\n    if (typeof input.value === 'object' && 'Pure' in input.value) {\n      const bcsNums = input.value.Pure;\n      return bcs[type].parse(new Uint8Array(bcsNums)) as T;\n    }\n    return input.value as T;\n  }\n\n  static getOwnedObjectId(input: LegacyTxInput) {\n    if (input.type !== 'object') {\n      throw new Error(`not object argument: ${JSON.stringify(input)}`);\n    }\n    if (typeof input.value === 'object') {\n      if (!('Object' in input.value) || !('ImmOrOwned' in input.value.Object)) {\n        throw new Error('not ImmOrOwned');\n      }\n      return normalizeSuiAddress(input.value.Object.ImmOrOwned.objectId as string);\n    }\n    return normalizeSuiAddress(input.value as string);\n  }\n\n  static getSharedObjectId(input: LegacyTxInput) {\n    if (input.type !== 'object') {\n      throw new Error(`not object argument: ${JSON.stringify(input)}`);\n    }\n    if (typeof input.value !== 'object') {\n      return normalizeSuiAddress(input.value as string);\n    }\n    if (!('Object' in input.value) || !('Shared' in input.value.Object)) {\n      throw new Error('not Shared');\n    }\n    return normalizeSuiAddress(input.value.Object.Shared.objectId as string);\n  }\n\n  static getPureInput<T>(input: LegacyTxInput) {\n    if (input.type !== 'pure') {\n      throw new Error('not pure argument');\n    }\n    if (typeof input.value !== 'object') {\n      return input.value as T;\n    }\n    if (!('Pure' in input.value)) {\n      throw new Error('Pure not in value');\n    }\n    const bcsVal = input.value.Pure;\n    return bcs.U64.parse(new Uint8Array(bcsVal)) as T;\n  }\n\n  typeArg(index: number) {\n    return normalizeStructTag(this.txBlockTransactions.typeArguments[index]);\n  }\n\n  txArg(index: number) {\n    return this.transaction.blockData.inputs[index];\n  }\n}\n\nexport default MoveCallHelper;\n","import { Transaction } from '@mysten/sui/transactions';\n\nimport MoveCallHelper from './moveCallHelper';\nimport { SplitCoinTransactionType } from '../types/sui';\n\nclass SplitCoinHelper {\n  constructor(\n    public readonly splitCoin: SplitCoinTransactionType,\n    public readonly txb: Transaction,\n  ) {}\n\n  getAmountInput() {\n    return this.splitCoin.amounts\n      .map((input) => {\n        if (input.kind === 'Input') {\n          return Number(MoveCallHelper.getPureInputValue<number>(input, 'U64'));\n        }\n        return undefined;\n      })\n      .filter((input) => input !== undefined);\n  }\n}\n\nexport default SplitCoinHelper;\n","import { normalizeStructTag, SUI_CLOCK_OBJECT_ID, SUI_TYPE_ARG } from '@mysten/sui/utils';\nimport { ScallopQuery, ScallopTxBlock } from '@scallop-io/sui-scallop-sdk';\n\nexport const isObligationMigrated = async (query: ScallopQuery, obligationId: string) => {\n  const obligation = await query.scallopSuiKit.client.getObject({\n    id: obligationId,\n    options: {\n      showContent: true,\n    },\n  });\n\n  if (obligation?.data?.content?.dataType !== 'moveObject') {\n    return false;\n  }\n  const fields = obligation.data.content.fields as any;\n  const lockKey = fields.lock_key?.fields.name as string;\n  if (!lockKey) {\n    return false;\n  }\n  const borrowIncentiveObjectId = query.address.get('borrowIncentive.object');\n  return lockKey === `${borrowIncentiveObjectId.slice(2)}::incentive_account::IncentiveProgramLockKey`;\n};\n\nconst OldBorrowIncentiveContract = {\n  id: '0xc63072e7f5f4983a2efaf5bdba1480d5e7d74d57948e1c7cc436f8e22cbeb410',\n  incentivePools: '0x64972b713ccec45ec3964809e477cea6f97350c0c50ca3aec85bb631639266ec',\n  incentiveAccounts: '0x3c0b707068bdcea8bb859d751ad3e2149a9f83c13fcf4054ef91372a00bccdd3',\n} as const;\n\nexport const OldBorrowIncentiveTxBuilder = {\n  unstakeObligation: (tx: ScallopTxBlock, obligationKey: string, obligationId: string) =>\n    tx.moveCall(\n      `${OldBorrowIncentiveContract.id}::user::unstake`,\n      [\n        OldBorrowIncentiveContract.incentivePools,\n        OldBorrowIncentiveContract.incentiveAccounts,\n        tx.object(obligationKey),\n        tx.object(obligationId),\n        SUI_CLOCK_OBJECT_ID,\n      ],\n      [normalizeStructTag(SUI_TYPE_ARG)],\n    ),\n  redeem_rewards: (tx: ScallopTxBlock, obligationKey: string, obligationId: string, rewardType: string) =>\n    tx.moveCall(\n      `${OldBorrowIncentiveContract.id}::user::redeem_rewards`,\n      [\n        OldBorrowIncentiveContract.incentivePools,\n        OldBorrowIncentiveContract.incentiveAccounts,\n        tx.object(obligationKey),\n        tx.object(obligationId),\n        SUI_CLOCK_OBJECT_ID,\n      ],\n      [normalizeStructTag(rewardType)],\n    ),\n} as const;\n","export const partitionArray = <T>(array: T[], chunkSize: number) => {\n  const result: T[][] = [];\n  for (let i = 0; i < array.length; i += chunkSize) {\n    result.push(array.slice(i, i + chunkSize));\n  }\n  return result;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\n\nimport { Decoder } from './decoder';\nimport { DecodeResult } from '../types';\nimport { TransactionSubType } from '../types/utils';\nimport { MoveCallHelper } from '../utils';\n\nexport class DecoderReferral extends Decoder {\n  decode() {\n    if (this.isCreateReferralLink()) {\n      return this.decodeCreateReferralLink();\n    }\n    if (this.isClaimRevenueReferral()) {\n      return this.decodeClaimRevenueReferral();\n    }\n    if (this.isBindReferral()) {\n      return this.decodeBindReferral();\n    }\n    return undefined;\n  }\n\n  private isClaimRevenueReferral() {\n    return this.hasMoveCallCommand(`${this.coreId.referral}::referral_revenue_pool::claim_revenue_with_ve_sca_key`);\n  }\n\n  private isCreateReferralLink() {\n    return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::mint_ve_sca_placeholder_key`);\n  }\n\n  private isBindReferral() {\n    return this.hasMoveCallCommand(`${this.coreId.referral}::referral_bindings::bind_ve_sca_referrer`);\n  }\n\n  private get helperClaimRevenueReferral() {\n    const moveCalls = this.commands\n      .filter((command) =>\n        this.filterMoveCallCommands(\n          command,\n          `${this.coreId.referral}::referral_revenue_pool::claim_revenue_with_ve_sca_key`,\n        ),\n      )\n      .map((trans) => new MoveCallHelper(trans, this.transaction));\n    return moveCalls;\n  }\n\n  private get helperBindReferral() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.referral}::referral_bindings::bind_ve_sca_referrer`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private decodeCreateReferralLink(): DecodeResult {\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.CreateReferralLink,\n      intentionData: {},\n    };\n  }\n\n  private decodeClaimRevenueReferral(): DecodeResult {\n    const veScaKey = this.helperClaimRevenueReferral[0].decodeOwnedObjectId(2);\n    const coins = this.helperClaimRevenueReferral.map((helper) => helper.typeArg(0));\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.ClaimRevenueReferral,\n      intentionData: {\n        veScaKey,\n        coins,\n      },\n    };\n  }\n\n  private decodeBindReferral(): DecodeResult {\n    const veScaKey = this.helperBindReferral.decodePureArg(1, 'Address');\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.BindReferral,\n      intentionData: {\n        veScaKey,\n      },\n    };\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { OLD_BORROW_INCENTIVE_PROTOCOL_ID } from '@scallop-io/sui-scallop-sdk';\n\nimport { Decoder } from './decoder';\nimport { VeScaObligationBindingsIntentData } from '../intentions/staking/ve-sca-obligation-bindings';\nimport { DecodeResult } from '../types';\nimport { SplitCoinTransactionType, TransactionInputs, TransferObjectsCommand } from '../types/sui';\nimport { TransactionSubType } from '../types/utils';\nimport { MoveCallHelper, partitionArray, SplitCoinHelper } from '../utils';\n\nexport class DecoderVeSca extends Decoder {\n  async decode() {\n    if (this.isExtendPeriodAndStakeMoreSca()) {\n      return this.decodePeriodAndStakeMoreSca();\n    }\n    if (this.isStakeScaFirsTime() || this.isStakeMoreSca()) {\n      return this.decodeStakeSca();\n    }\n    if (this.isRenewExpiredVeSca()) {\n      return this.decodeRenewExpiredVeSca();\n    }\n    if (this.isExtendPeriod()) {\n      return this.decodeExtendStakePeriod();\n    }\n    if (this.isRedeemSca()) {\n      return this.decodeRedeemSca();\n    }\n    if (this.isMergeVeSca()) {\n      return this.decodeMergeVesca();\n    }\n    if (this.isSplitVeSca()) {\n      return this.decodeSplitVesca();\n    }\n    if (this.isVeScaObligationBindings()) {\n      return this.decodeVeScaObligationBindings();\n    }\n    if (await this.isTransferVeScaKey()) {\n      return this.decodeTransferVeScaKey();\n    }\n    return undefined;\n  }\n\n  private isStakeScaFirsTime() {\n    return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::mint_ve_sca_key`);\n  }\n\n  private isExtendPeriodAndStakeMoreSca() {\n    const extendPeriod = this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`);\n    const stakeMoreSca = this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`);\n    return !!extendPeriod && !!stakeMoreSca;\n  }\n\n  private isRedeemSca() {\n    return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::redeem`);\n  }\n\n  private isStakeMoreSca() {\n    return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`);\n  }\n\n  private isExtendPeriod() {\n    return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`);\n  }\n\n  private isRenewExpiredVeSca() {\n    return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::renew_expired_ve_sca`);\n  }\n\n  private isMergeVeSca() {\n    return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::merge`);\n  }\n\n  private isSplitVeSca() {\n    return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::split`);\n  }\n\n  private isVeScaObligationBindings() {\n    const unstakeCommands = this.commands.filter((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::unstake_v2`),\n    );\n\n    const stakeCommands = this.commands.filter((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca_v2`),\n    );\n\n    const deactivateBoostCommands = this.commands.filter((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::deactivate_boost_v2`),\n    );\n\n    const notEmpty =\n      unstakeCommands.length > 0 && stakeCommands.length > 0 && unstakeCommands.length === stakeCommands.length;\n    const isDeactivateBoost = deactivateBoostCommands.length > 0;\n    const noOtherCommands =\n      this.commands.length === unstakeCommands.length + stakeCommands.length + deactivateBoostCommands.length;\n\n    return noOtherCommands && (notEmpty || isDeactivateBoost);\n  }\n\n  private async isTransferVeScaKey() {\n    const transferTxs = this.commands.filter((t) => t.$kind === 'TransferObjects') as {\n      TransferObjects: TransferObjectsCommand;\n    }[];\n    // only allow 1 transfer object tx\n    if (transferTxs.length !== 1) {\n      return false;\n    }\n\n    // check if all the transfered objects are veSCA keys\n    const { objects } = transferTxs[0].TransferObjects;\n    const veScaKeyIndexes = (\n      objects.filter((t) => t.$kind === 'Input') as {\n        $kind: 'Input';\n        Input: number;\n      }[]\n    ).map(({ Input }) => Input);\n\n    // only allow if all objects is Input type\n    if (veScaKeyIndexes.length !== objects.length) {\n      return false;\n    }\n\n    // Get all veSCA keys objects\n    const indexesAsSet = new Set(veScaKeyIndexes);\n    const veScaKeys = (\n      this.inputs.filter((t, idx) => t.$kind === 'Object' && indexesAsSet.has(idx)) as TransactionInputs[number][]\n    ).map((t) => t.Object.ImmOrOwnedObject) as TransactionInputs[number]['Object']['ImmOrOwnedObject'][];\n\n    // assert object types\n    const veScaKeyType = `${this.coreId.veScaObjId}::ve_sca::VeScaKey`;\n\n    const batches = partitionArray(\n      veScaKeys.map(({ objectId }) => objectId),\n      50,\n    );\n\n    for (let i = 0; i < batches.length; i++) {\n      const batch = batches[i];\n      const responses = await this.scallopClient.scallopSuiKit.queryGetObjects(batch, {\n        showType: true,\n      });\n\n      if (responses.some((t) => t.type !== veScaKeyType)) {\n        return false;\n      }\n    }\n\n    return veScaKeys.length > 0;\n  }\n\n  private get helperStakeMoreSca() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperStakeSca() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::mint_ve_sca_key`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperExtendStakePeriod() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperRedeemSca() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::redeem`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperRenewExpired() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::renew_expired_ve_sca`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperOldUnstakeObligation() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::unstake`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperUnstakeObligation() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::unstake_v2`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private get helperStakeObligationWithVeSca() {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca_v2`),\n    );\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private getMergeSplitVeScaHelper(type: 'merge' | 'split') {\n    const moveCall = this.commands.find((command) =>\n      this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::${type}`),\n    );\n\n    return new MoveCallHelper(moveCall, this.transaction);\n  }\n\n  private getVeScaObligationBindingHelpers() {\n    const unstakeMoveCall = `${this.coreId.borrowIncentivePkg}::user::unstake_v2`;\n    const stakeMoveCall = `${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca_v2`;\n    const deactivateMoveCall = `${this.coreId.borrowIncentivePkg}::user::deactivate_boost_v2`;\n\n    const helpers: {\n      action: 'stake' | 'unstake' | 'deactivate';\n      helper: MoveCallHelper;\n    }[] = [];\n\n    let unstakeHelperIdx = 0;\n    let stakeHelperIdx = 0;\n    let deactivateIdx = 0;\n\n    this.commands.forEach((command) => {\n      if (this.filterMoveCallCommands(command, unstakeMoveCall)) {\n        helpers.push({\n          action: 'unstake',\n          helper: new MoveCallHelper(command, this.transaction, unstakeHelperIdx),\n        });\n        unstakeHelperIdx++;\n      } else if (this.filterMoveCallCommands(command, stakeMoveCall)) {\n        helpers.push({\n          action: 'stake',\n          helper: new MoveCallHelper(command, this.transaction, stakeHelperIdx),\n        });\n        stakeHelperIdx++;\n      } else if (this.filterMoveCallCommands(command, deactivateMoveCall)) {\n        helpers.push({\n          action: 'deactivate',\n          helper: new MoveCallHelper(command, this.transaction, deactivateIdx),\n        });\n        deactivateIdx++;\n      }\n    });\n\n    return helpers;\n  }\n\n  private decodeRedeemSca(): DecodeResult {\n    const veScaKey = this.helperRedeemSca.decodeOwnedObjectId(1);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.RedeemSca,\n      intentionData: {\n        veScaKey,\n      },\n    };\n  }\n\n  private decodeRenewExpiredVeSca(): DecodeResult {\n    const lockSca = this.helperRenewExpired.getNestedInputParam<SplitCoinTransactionType>(4);\n    const unlockTime = this.helperRenewExpired.decodeInputU64(5);\n    const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.transaction)\n      .getAmountInput()\n      .reduce((a, b) => a + b, 0);\n    const veScaKey = this.helperRenewExpired.decodeOwnedObjectId(1);\n    const isHaveRedeem = !!this.helperRedeemSca.moveCall;\n    let oldUnstakeObligation: string[] = [];\n    let unstakeObligation: string[] = [];\n    let stakeObligation: string[] = [];\n    if (this.helperOldUnstakeObligation.moveCall) {\n      oldUnstakeObligation = [\n        this.helperOldUnstakeObligation.decodeOwnedObjectId(2), // Obligation key\n        this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n      ];\n    }\n    if (this.helperUnstakeObligation.moveCall) {\n      unstakeObligation = [\n        this.helperUnstakeObligation.decodeOwnedObjectId(3), // Obligation key\n        this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n      ];\n    }\n    if (this.helperStakeObligationWithVeSca.moveCall) {\n      stakeObligation = [\n        this.helperStakeObligationWithVeSca.decodeOwnedObjectId(3), // Obligation key\n        this.helperStakeObligationWithVeSca.decodeSharedObjectId(4), // Obligation Id\n      ];\n    }\n    let isObligationLocked = false;\n    let isOldBorrowIncentive = false;\n    let obligationId;\n    let obligationKey;\n\n    const operations = [\n      { condition: oldUnstakeObligation, isOld: true },\n      { condition: unstakeObligation, isOld: false },\n      { condition: stakeObligation, isOld: false },\n    ];\n\n    for (let i = 0; i < operations.length; i++) {\n      if (operations[i].condition.length > 1) {\n        [obligationKey, obligationId] = operations[i].condition;\n        isObligationLocked = true;\n        isOldBorrowIncentive = operations[i].isOld;\n      }\n    }\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.RenewExpStakePeriod,\n      intentionData: {\n        amount: amountFromSplitCoin,\n        unlockTime,\n        obligationId,\n        obligationKey,\n        veScaKey,\n        isHaveRedeem,\n        isObligationLocked,\n        isOldBorrowIncentive,\n      },\n    };\n  }\n\n  private decodeExtendStakePeriod(): DecodeResult {\n    const unlockTime = this.helperExtendStakePeriod.decodeInputU64(4);\n    const veScaKey = this.helperExtendStakePeriod.decodeOwnedObjectId(1);\n    let oldUnstakeObligation: string[] = [];\n    let unstakeObligation: string[] = [];\n    let stakeObligation: string[] = [];\n    if (this.helperOldUnstakeObligation.moveCall) {\n      oldUnstakeObligation = [\n        this.helperOldUnstakeObligation.decodeOwnedObjectId(2), // Obligation key\n        this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n      ];\n    }\n    if (this.helperUnstakeObligation.moveCall) {\n      unstakeObligation = [\n        this.helperUnstakeObligation.decodeOwnedObjectId(3), // Obligation key\n        this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n      ];\n    }\n    if (this.helperStakeObligationWithVeSca.moveCall) {\n      stakeObligation = [\n        this.helperStakeObligationWithVeSca.decodeOwnedObjectId(3), // Obligation key\n        this.helperStakeObligationWithVeSca.decodeSharedObjectId(4), // Obligation Id\n      ];\n    }\n    let isObligationLocked = false;\n    let isOldBorrowIncentive = false;\n    let obligationId;\n    let obligationKey;\n\n    const operations = [\n      { condition: oldUnstakeObligation, isOld: true },\n      { condition: unstakeObligation, isOld: false },\n      { condition: stakeObligation, isOld: false },\n    ];\n\n    for (let i = 0; i < operations.length; i++) {\n      if (operations[i].condition.length > 1) {\n        [obligationKey, obligationId] = operations[i].condition;\n        isObligationLocked = true;\n        isOldBorrowIncentive = operations[i].isOld;\n      }\n    }\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.ExtendStakePeriod,\n      intentionData: {\n        unlockTime,\n        obligationId,\n        obligationKey,\n        veScaKey,\n        isObligationLocked,\n        isOldBorrowIncentive,\n      },\n    };\n  }\n\n  private decodePeriodAndStakeMoreSca(): DecodeResult {\n    const lockSca = this.helperStakeMoreSca.getNestedInputParam<SplitCoinTransactionType>(4);\n    const unlockTime = this.helperExtendStakePeriod.decodeInputU64(4);\n    const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.transaction)\n      .getAmountInput()\n      .reduce((a, b) => a + b, 0);\n    let oldUnstakeObligation: string[] = [];\n    let unstakeObligation: string[] = [];\n    let veScaKey;\n    let stakeObligation: string[] = [];\n    if (this.helperOldUnstakeObligation.moveCall) {\n      oldUnstakeObligation = [\n        this.helperOldUnstakeObligation.decodeOwnedObjectId(2), // Obligation key\n        this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n      ];\n    }\n    if (this.helperUnstakeObligation.moveCall) {\n      unstakeObligation = [\n        this.helperUnstakeObligation.decodeOwnedObjectId(3), // Obligation key\n        this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n      ];\n    }\n    if (this.helperStakeMoreSca.moveCall) {\n      veScaKey = this.helperStakeMoreSca.decodeOwnedObjectId(1);\n    }\n    if (this.helperStakeObligationWithVeSca.moveCall) {\n      stakeObligation = [\n        this.helperStakeObligationWithVeSca.decodeOwnedObjectId(3), // Obligation key\n        this.helperStakeObligationWithVeSca.decodeSharedObjectId(4), // Obligation Id\n      ];\n    }\n    let isObligationLocked = false;\n    let isOldBorrowIncentive = false;\n    let obligationId;\n    let obligationKey;\n\n    const operations = [\n      { condition: oldUnstakeObligation, isOld: true },\n      { condition: unstakeObligation, isOld: false },\n      { condition: stakeObligation, isOld: false },\n    ];\n\n    for (let i = 0; i < operations.length; i++) {\n      if (operations[i].condition.length > 1) {\n        [obligationKey, obligationId] = operations[i].condition;\n        isObligationLocked = true;\n        isOldBorrowIncentive = operations[i].isOld;\n      }\n    }\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.ExtendPeriodAndStakeMore,\n      intentionData: {\n        amount: amountFromSplitCoin,\n        veScaKey,\n        unlockTime,\n        obligationId,\n        obligationKey,\n        isOldBorrowIncentive,\n        isObligationLocked,\n      },\n    };\n  }\n\n  private decodeStakeSca(): DecodeResult {\n    let lockSca;\n    let unlockTime;\n    if (this.helperStakeSca.moveCall && this.helperStakeMoreSca.moveCall === undefined) {\n      lockSca = this.helperStakeSca.getNestedInputParam<SplitCoinTransactionType>(3);\n      unlockTime = this.helperStakeSca.decodeInputU64(4);\n    } else {\n      lockSca = this.helperStakeMoreSca.getNestedInputParam<SplitCoinTransactionType>(4);\n    }\n    const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.transaction)\n      .getAmountInput()\n      .reduce((a, b) => a + b, 0);\n    let oldUnstakeObligation: string[] = [];\n    let unstakeObligation: string[] = [];\n    let veScaKey;\n    let stakeObligation: string[] = [];\n    if (this.helperOldUnstakeObligation.moveCall) {\n      oldUnstakeObligation = [\n        this.helperOldUnstakeObligation.decodeOwnedObjectId(2), // Obligation key\n        this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n      ];\n    }\n    if (this.helperUnstakeObligation.moveCall) {\n      unstakeObligation = [\n        this.helperUnstakeObligation.decodeOwnedObjectId(3), // Obligation key\n        this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n      ];\n    }\n    if (this.helperStakeMoreSca.moveCall) {\n      veScaKey = this.helperStakeMoreSca.decodeOwnedObjectId(1);\n    }\n    if (this.helperStakeObligationWithVeSca.moveCall) {\n      stakeObligation = [\n        this.helperStakeObligationWithVeSca.decodeOwnedObjectId(3), // Obligation key\n        this.helperStakeObligationWithVeSca.decodeSharedObjectId(4), // Obligation Id\n      ];\n    }\n    let isObligationLocked = false;\n    let isOldBorrowIncentive = false;\n    let obligationId;\n    let obligationKey;\n\n    const operations = [\n      { condition: oldUnstakeObligation, isOld: true },\n      { condition: unstakeObligation, isOld: false },\n      { condition: stakeObligation, isOld: false },\n    ];\n\n    for (let i = 0; i < operations.length; i++) {\n      if (operations[i].condition.length > 1) {\n        [obligationKey, obligationId] = operations[i].condition;\n        isObligationLocked = true;\n        isOldBorrowIncentive = operations[i].isOld;\n      }\n    }\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.StakeSca,\n      intentionData: {\n        amount: amountFromSplitCoin,\n        unlockTime,\n        obligationId,\n        obligationKey,\n        veScaKey,\n        isObligationLocked,\n        isOldBorrowIncentive,\n      },\n    };\n  }\n\n  private decodeMergeVesca(): DecodeResult {\n    const mergeSplithelper = this.getMergeSplitVeScaHelper('merge');\n    const intentionData = {\n      targetVeScaKey: mergeSplithelper.decodeOwnedObjectId(1),\n      sourceVeScaKey: mergeSplithelper.decodeOwnedObjectId(2),\n    };\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.MergeVeSca,\n      intentionData,\n    };\n  }\n\n  private decodeSplitVesca(): DecodeResult {\n    const helper = this.getMergeSplitVeScaHelper('split');\n    const intentionData = {\n      targetVeScaKey: helper.decodeOwnedObjectId(1),\n      splitAmount: helper.decodeInputU64(4),\n    };\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.SplitVeSca,\n      intentionData,\n    };\n  }\n\n  private decodeVeScaObligationBindings(): DecodeResult {\n    const helpers = this.getVeScaObligationBindingHelpers();\n\n    const parseArgFromHelper = (\n      action: 'stake' | 'unstake' | 'deactivate',\n      helper: MoveCallHelper,\n    ): VeScaObligationBindingsIntentData['bindingDatas'][number]['args'] => {\n      switch (action) {\n        case 'stake': {\n          return {\n            veScaKey: helper.decodeOwnedObjectId(9),\n            obligationId: helper.decodeSharedObjectId(4),\n            obligationKey: helper.decodeOwnedObjectId(3),\n          };\n        }\n        case 'unstake': {\n          return {\n            obligationId: helper.decodeSharedObjectId(4),\n            obligationKey: helper.decodeOwnedObjectId(3),\n          };\n        }\n        case 'deactivate': {\n          return {\n            veScaKey: helper.decodeOwnedObjectId(4),\n            obligationId: helper.decodeSharedObjectId(3),\n          };\n        }\n        default:\n          throw new Error(`Invalid action ${action}`);\n      }\n    };\n\n    const bindingDatas = helpers.map(({ action, helper }) => ({\n      action,\n      args: parseArgFromHelper(action, helper),\n    }));\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.VeScaObligationBindings,\n      intentionData: {\n        bindingDatas,\n      },\n    };\n  }\n\n  private decodeTransferVeScaKey() {\n    const transferTxs = this.commands.filter((t) => t.$kind === 'TransferObjects') as {\n      TransferObjects: TransferObjectsCommand;\n    }[];\n\n    // check if all the transfered objects are veSCA keys\n    const { objects } = transferTxs[0].TransferObjects;\n    const veScaKeyIndexes = (\n      objects.filter((t) => t.$kind === 'Input') as {\n        $kind: 'Input';\n        Input: number;\n      }[]\n    ).map(({ Input }) => Input);\n\n    // only allow if all objects is Input type\n    if (veScaKeyIndexes.length !== objects.length) {\n      return false;\n    }\n\n    // Get all veSCA keys objects\n    const indexesAsSet = new Set(veScaKeyIndexes);\n    const veScaKeys = (\n      this.inputs.filter((t, idx) => t.$kind === 'Object' && indexesAsSet.has(idx)) as TransactionInputs[number][]\n    ).map((t) => t.Object.ImmOrOwnedObject) as TransactionInputs[number]['Object']['ImmOrOwnedObject'][];\n\n    return {\n      xType: TransactionType.Other,\n      type: TransactionSubType.TransferVeScaKeys,\n      intentionData: {\n        veScaKeys,\n      },\n    };\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient, ScallopTxBlock } from '@scallop-io/sui-scallop-sdk';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { SuiObjectArg } from '../types';\n\nexport abstract class ScallopCoreBaseIntention<D> implements BaseIntention<D> {\n  abstract txType: TransactionType;\n\n  abstract txSubType: string;\n\n  protected constructor(public readonly data: D) {}\n\n  get application() {\n    return 'msafe-core';\n  }\n\n  serialize() {\n    return JSON.stringify(sortKeys(this.data));\n  }\n\n  private isObligationLocked = async (suiClient: SuiClient, obligationId: SuiObjectArg) => {\n    const objectId = typeof obligationId === 'string' ? obligationId : obligationId.objectId;\n    // gRPC getObject returns Move fields under object.json when include.json is set.\n    const { object } = await suiClient.getObject({\n      objectId,\n      include: { json: true },\n    });\n    const fields = object.json as { lock_key?: unknown } | null | undefined;\n    return Boolean(fields?.lock_key);\n  };\n\n  protected async buildTxWithRefreshObligation(\n    client: ScallopClient,\n    input: {\n      walletAddress: string;\n      obligationId: string;\n      obligationKey: string;\n      veScaKey?: string;\n    },\n    callback: (\n      client: ScallopClient,\n      txBlock: ScallopTxBlock,\n      args: {\n        walletAddress: string;\n        obligationId: string;\n        obligationKey: string;\n        veScaKey?: string;\n      },\n    ) => Promise<void>,\n  ) {\n    const txb = client.builder.createTxBlock();\n    txb.setSender(input.walletAddress);\n\n    const { obligationId, obligationKey } = input;\n\n    // unstake obligation if it is locked\n    const locked = await this.isObligationLocked(client.scallopSuiKit.client, obligationId);\n    if (locked) {\n      await txb.unstakeObligationQuick(obligationId, obligationKey);\n      await callback(client, txb, input);\n      await txb.stakeObligationWithVeScaQuick(obligationId, obligationKey, input.veScaKey);\n    } else {\n      await callback(client, txb, input);\n    }\n\n    return txb;\n  }\n\n  abstract build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction>;\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface BorrowIntentionData {\n  coinName: string;\n  amount: number | string;\n  obligationId: string;\n  obligationKey: string;\n}\n\nexport class BorrowIntention extends ScallopCoreBaseIntention<BorrowIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.Borrow;\n\n  constructor(public readonly data: BorrowIntentionData) {\n    super(data);\n  }\n\n  async borrow({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n    const { coinName, amount, obligationId, obligationKey } = this.data;\n    const sender = account.address;\n    const tx = await this.buildTxWithRefreshObligation(\n      client,\n      {\n        walletAddress: sender,\n        obligationId,\n        obligationKey,\n      },\n      async (_, innerTx) => {\n        const coin = await innerTx.borrowQuick(+amount, coinName, obligationId, obligationKey);\n        innerTx.transferObjects([coin], sender);\n      },\n    );\n\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.borrow(input);\n  }\n\n  static fromData(data: BorrowIntentionData): BorrowIntention {\n    return new BorrowIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface BorrowWithBoostIntentionData {\n  coinName: string;\n  amount: number | string;\n  obligationId: string;\n  obligationKey: string;\n  veScaKey: string;\n}\n\nexport class BorrowWithBoostIntention extends ScallopCoreBaseIntention<BorrowWithBoostIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.Borrow;\n\n  constructor(public readonly data: BorrowWithBoostIntentionData) {\n    super(data);\n  }\n\n  public async borrowWithBoost(client: ScallopClient, walletAddress: string): Promise<Transaction> {\n    const { obligationId, obligationKey, veScaKey, amount, coinName: poolCoinName } = this.data;\n    const txb = await this.buildTxWithRefreshObligation(\n      client,\n      {\n        walletAddress,\n        obligationId,\n        obligationKey,\n        veScaKey,\n      },\n      async (_, scallopTxBlock) => {\n        const coin = await scallopTxBlock.borrowQuick(+amount, poolCoinName, obligationId, obligationKey);\n        scallopTxBlock.transferObjects([coin], walletAddress);\n      },\n    );\n    return txb.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.borrowWithBoost(input.scallopClient, input.account.address);\n  }\n\n  static fromData(data: BorrowWithBoostIntentionData): BorrowWithBoostIntention {\n    return new BorrowWithBoostIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface BorrowWithReferralIntentionData {\n  coinName: string;\n  amount: number | string;\n  obligationId: string;\n  obligationKey: string;\n  veScaKey: string | undefined;\n}\n\nexport class BorrowWithReferralIntention extends ScallopCoreBaseIntention<BorrowWithReferralIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.BorrowWithReferral;\n\n  constructor(public readonly data: BorrowWithReferralIntentionData) {\n    super(data);\n  }\n\n  async borrowWithReferral({\n    account,\n    scallopClient: client,\n  }: {\n    account: WalletAccount;\n    scallopClient: ScallopClient;\n  }) {\n    const walletAddress = account.address;\n    const { obligationId, obligationKey, veScaKey, coinName: poolCoinName, amount } = this.data;\n    const txb = await this.buildTxWithRefreshObligation(\n      client,\n      {\n        walletAddress,\n        obligationId,\n        obligationKey,\n        veScaKey,\n      },\n      async (_, scallopTxBlock) => {\n        const borrowReferral = scallopTxBlock.claimReferralTicket(poolCoinName);\n        const coin = await scallopTxBlock.borrowWithReferralQuick(\n          +amount,\n          poolCoinName,\n          borrowReferral,\n          obligationId,\n          obligationKey,\n        );\n        scallopTxBlock.burnReferralTicket(borrowReferral, poolCoinName);\n        scallopTxBlock.transferObjects([coin], walletAddress);\n      },\n    );\n\n    return txb.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.borrowWithReferral(input);\n  }\n\n  static fromData(data: BorrowWithReferralIntentionData): BorrowWithReferralIntention {\n    return new BorrowWithReferralIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction, TransactionResult } from '@mysten/sui/transactions';\nimport { SUI_TYPE_ARG } from '@mysten/sui/utils';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Lending, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { isObligationMigrated, OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport class ClaimIncentiveRewardIntention extends ScallopCoreBaseIntention<any> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.ClaimIncentiveReward;\n\n  constructor(data = {}) {\n    super(data);\n  }\n\n  async claimIncentiveRewards(client: ScallopClient, walletAddress: string) {\n    const txb = client.builder.createTxBlock();\n    txb.setSender(walletAddress);\n\n    const allStakeAccounts = await client.query.getAllStakeAccounts(walletAddress);\n    const lendings = await client.query.getLendings(undefined, walletAddress);\n    const obligations = await client.query.getObligations(walletAddress);\n    const obligationAccounts = Object.values((await client.query.getObligationAccounts(walletAddress)) ?? []);\n\n    const lendingInfos = (() => {\n      const spoolCoinNames = [...client.constants.whitelist.spool].map((marketCoinName) =>\n        client.utils.parseCoinName(marketCoinName),\n      );\n\n      return (\n        Object.values(lendings ?? []).filter(\n          (lendingInfo) => !!lendingInfo && spoolCoinNames.includes(lendingInfo.coinName),\n        ) as Lending[]\n      ).reduce(\n        (acc, lendingInfo) => {\n          const marketCoinName = client.utils.parseMarketCoinName(lendingInfo.coinName);\n          if (!acc[marketCoinName]) {\n            acc[marketCoinName] = 0;\n          }\n          acc[marketCoinName] += lendingInfo.availableClaimCoin;\n          return acc;\n        },\n        {} as Record<string, number>,\n      );\n    })();\n\n    const rewardCoinCollection: Record<string, TransactionResult[]> = {};\n\n    Object.entries(allStakeAccounts).forEach(([stakeMarketCoinName, stakeAccounts]) => {\n      for (let i = 0; i < stakeAccounts.length; i++) {\n        const stakeAccount = stakeAccounts[i];\n        // skip if no points to save gas\n        if (!lendingInfos[stakeMarketCoinName as string]) {\n          continue;\n        }\n        const rewardCoin = txb.claim(stakeAccount.id, stakeMarketCoinName as string);\n\n        // supposed to be all SUI reward for sCoin pool\n        if (!rewardCoinCollection.sui) {\n          rewardCoinCollection.sui = [rewardCoin];\n        } else {\n          rewardCoinCollection.sui.push(rewardCoin);\n        }\n      }\n    });\n\n    const totalClaimCoin = (() => {\n      const coins = {} as Record<string, number>;\n      coins.sui = Object.values(lendingInfos).reduce(\n        (totalClaim, availableClaimCoin) => totalClaim + availableClaimCoin,\n        0,\n      );\n\n      obligationAccounts.forEach((obligationAccount) => {\n        Object.values(obligationAccount.borrowIncentives).forEach((borrowIncentive) => {\n          if (borrowIncentive) {\n            borrowIncentive.rewards.forEach((reward) => {\n              if (!coins[reward.coinName]) {\n                coins[reward.coinName] = 0;\n              }\n              if (coins[reward.coinName]) {\n                coins[reward.coinName] += reward.availableClaimCoin;\n              } else {\n                coins[reward.coinName] = reward.availableClaimCoin;\n              }\n            });\n          }\n        });\n      });\n      return coins;\n    })();\n\n    if (obligations.length > 0 && obligationAccounts.length > 0) {\n      for (let i = 0; i < obligationAccounts.length; i++) {\n        const obligationAccount = obligationAccounts[i];\n\n        let obligationHasReward = false;\n        const obligationKeyId = obligations.find(\n          (obligation) => obligation.id === obligationAccount.obligationId,\n        )?.keyId;\n\n        const isRewardCoinClaimed: Partial<Record<string, boolean>> = {};\n        if (obligationKeyId) {\n          Object.values(obligationAccount.borrowIncentives).forEach((borrowIncentive) => {\n            if (borrowIncentive) {\n              const filteredBorrowIncentives = borrowIncentive.rewards.filter((reward) => {\n                const rewardCoinName = reward.coinName as string;\n                // determine if this obligation has rewards at all to reduce overall movecalls\n                return reward.availableClaimCoin > 0 && !isRewardCoinClaimed[rewardCoinName];\n              });\n              obligationHasReward = filteredBorrowIncentives.length > 0;\n              filteredBorrowIncentives.forEach((filteredBorrowIncentive) => {\n                const rewardCoin = txb.claimBorrowIncentive(\n                  obligationAccount.obligationId,\n                  obligationKeyId,\n                  filteredBorrowIncentive.coinName,\n                );\n\n                isRewardCoinClaimed[filteredBorrowIncentive.coinName] = true;\n                if (!rewardCoinCollection[filteredBorrowIncentive.coinName]) {\n                  rewardCoinCollection[filteredBorrowIncentive.coinName] = [rewardCoin];\n                } else {\n                  rewardCoinCollection[filteredBorrowIncentive.coinName].push(rewardCoin);\n                }\n              });\n            }\n          });\n\n          // claim old reward\n          // if no claim coin in sui, skip\n          if (totalClaimCoin.sui > 0) {\n            const oldRewardCoin = OldBorrowIncentiveTxBuilder.redeem_rewards(\n              txb,\n              obligationKeyId,\n              obligationAccount.obligationId,\n              SUI_TYPE_ARG,\n            );\n            // should all be SUI\n            if (rewardCoinCollection.sui) {\n              rewardCoinCollection.sui.push(oldRewardCoin);\n            } else {\n              rewardCoinCollection.sui = [oldRewardCoin];\n            }\n          }\n\n          if (obligationHasReward) {\n            const isMigrated = await isObligationMigrated(client.query, obligationAccount.obligationId);\n\n            // only restake if the obligation is migrated\n            if (isMigrated) {\n              txb.unstakeObligation(obligationAccount.obligationId, obligationKeyId);\n              // Check if current obligationId is binded with veSCA before restake\n              const bindedVeScaKey = await client.query.getBindedVeScaKey(obligationAccount.obligationId);\n              if (bindedVeScaKey) {\n                txb.stakeObligationWithVesca(obligationAccount.obligationId, obligationKeyId, bindedVeScaKey);\n              } else {\n                txb.stakeObligation(obligationAccount.obligationId, obligationKeyId);\n              }\n            }\n          }\n        }\n      }\n    }\n\n    const objectsNeedToTransfer = (\n      await Promise.all(\n        Object.entries(rewardCoinCollection).map(async ([coinName, rewardCoins]) => {\n          const mergeDest = rewardCoins[0];\n          if (rewardCoins.length > 1) {\n            txb.mergeCoins(mergeDest, rewardCoins.slice(1));\n          }\n          if (coinName === 'sui') {\n            txb.mergeCoins(txb.gas, [mergeDest]);\n            return undefined;\n          }\n          await client.builder.utils.mergeSimilarCoins(\n            txb,\n            mergeDest,\n            client.utils.parseCoinType(coinName as string),\n            walletAddress,\n          );\n          return mergeDest;\n        }),\n      )\n    ).filter((t) => !!t);\n\n    if (objectsNeedToTransfer.length > 0) {\n      txb.transferObjects(objectsNeedToTransfer, walletAddress);\n    }\n\n    return txb.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.claimIncentiveRewards(input.scallopClient, input.account.address);\n  }\n\n  static fromData(data = {}): ClaimIncentiveRewardIntention {\n    return new ClaimIncentiveRewardIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { fromScallopTransaction } from '../../utils/transaction';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface DepositCollateralIntentionData {\n  collateralCoinName: string;\n  amount: number | string;\n  obligationId: string;\n}\n\nexport class DepositCollateralIntention extends ScallopCoreBaseIntention<DepositCollateralIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.DepositCollateral;\n\n  constructor(public readonly data: DepositCollateralIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return fromScallopTransaction(\n      await input.scallopClient.depositCollateral(\n        this.data.collateralCoinName,\n        +this.data.amount,\n        false,\n        this.data.obligationId,\n      ),\n    );\n  }\n\n  static fromData(data: DepositCollateralIntentionData): DepositCollateralIntention {\n    return new DepositCollateralIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface MigrateAndClaimIntentionData {\n  obligationKey: string;\n  obligationId: string;\n  rewardCoinName: string;\n  veScaKey?: string;\n}\n\nexport class MigrateAndClaimIntention extends ScallopCoreBaseIntention<MigrateAndClaimIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.MigrateAndClaim;\n\n  constructor(public readonly data: MigrateAndClaimIntentionData) {\n    super(data);\n  }\n\n  async migrateAndClaim({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n    const sender = account.address;\n    const { obligationKey, obligationId, rewardCoinName, veScaKey } = this.data;\n\n    const tx = client.builder.createTxBlock();\n    tx.setSender(sender);\n\n    const rewardCoin = OldBorrowIncentiveTxBuilder.redeem_rewards(\n      tx,\n      obligationKey,\n      obligationId,\n      client.utils.parseCoinType(rewardCoinName),\n    );\n    tx.transferObjects([rewardCoin], sender);\n    await tx.unstakeObligationQuick(obligationId, obligationKey);\n    if (veScaKey) {\n      await tx.stakeObligationWithVeScaQuick(obligationId, obligationKey, veScaKey);\n    } else {\n      await tx.stakeObligationQuick(obligationId, obligationKey);\n    }\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.migrateAndClaim(input);\n  }\n\n  static fromData(data: MigrateAndClaimIntentionData): MigrateAndClaimIntention {\n    return new MigrateAndClaimIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { fromScallopTransaction } from '../../utils/transaction';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface MigrateScoinIntentionData {}\n\nexport class MigrateScoinIntention extends ScallopCoreBaseIntention<MigrateScoinIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.MigrateScoin;\n\n  constructor(public readonly data: MigrateScoinIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return fromScallopTransaction(await input.scallopClient.migrateAllMarketCoin(false, false));\n  }\n\n  static fromData(data: MigrateScoinIntentionData): MigrateScoinIntention {\n    return new MigrateScoinIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { fromScallopTransaction } from '../../utils/transaction';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface OpenObligationIntentionData {}\n\nexport class OpenObligationIntention extends ScallopCoreBaseIntention<OpenObligationIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.OpenObligation;\n\n  constructor(public readonly data: OpenObligationIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return fromScallopTransaction(await input.scallopClient.openObligation(false));\n  }\n\n  static fromData(data: OpenObligationIntentionData): OpenObligationIntention {\n    return new OpenObligationIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface RepayIntentionData {\n  coinName: string;\n  amount: number | string;\n  obligationId: string;\n  obligationKey: string;\n}\n\nexport class RepayIntention extends ScallopCoreBaseIntention<RepayIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.Repay;\n\n  constructor(public readonly data: RepayIntentionData) {\n    super(data);\n  }\n\n  async repay({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n    const sender = account.address;\n    const { coinName, amount, obligationId, obligationKey } = this.data;\n\n    const tx = await this.buildTxWithRefreshObligation(\n      client,\n      {\n        walletAddress: sender,\n        obligationId,\n        obligationKey,\n      },\n      async (_, innerTx) => {\n        await innerTx.repayQuick(+amount, coinName, obligationId);\n      },\n    );\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.repay(input);\n  }\n\n  static fromData(data: RepayIntentionData): RepayIntention {\n    return new RepayIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface RepayWithBoostIntentionData {\n  coinName: string;\n  amount: number | string;\n  obligationId: string;\n  veScaKey: string;\n}\n\nexport class RepayWithBoostIntention extends ScallopCoreBaseIntention<RepayWithBoostIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.RepayWithBoost;\n\n  constructor(public readonly data: RepayWithBoostIntentionData) {\n    super(data);\n  }\n\n  async repayWithBoost({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n    const sender = account.address;\n    const { coinName, amount, obligationId, veScaKey } = this.data;\n\n    const tx = client.builder.createTxBlock();\n    tx.setSender(sender);\n\n    const availableStake = client.constants.whitelist.borrowing.has(coinName);\n    if (availableStake) {\n      await tx.unstakeObligationQuick(obligationId, undefined);\n    }\n    await tx.repayQuick(+amount, coinName, obligationId);\n    if (availableStake) {\n      await tx.stakeObligationWithVeScaQuick(obligationId, undefined, veScaKey);\n    }\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.repayWithBoost(input);\n  }\n\n  static fromData(data: RepayWithBoostIntentionData): RepayWithBoostIntention {\n    return new RepayWithBoostIntention(data);\n  }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { fromScallopTransaction } from '../../utils/transaction';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface SupplyLendingIntentionData {\n  amount: number | string;\n  coinName: string;\n}\n\nexport class SupplyLendingIntention extends ScallopCoreBaseIntention<SupplyLendingIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.SupplyLending;\n\n  constructor(public readonly data: SupplyLendingIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return fromScallopTransaction(\n      await input.scallopClient.deposit(this.data.coinName, +this.data.amount, false, input.account.address),\n    );\n  }\n\n  static fromData(data: SupplyLendingIntentionData): SupplyLendingIntention {\n    return new SupplyLendingIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { fromScallopTransaction } from '../../utils/transaction';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface UnstakeSpoolIntentionData {\n  amount: number | string;\n  marketCoinName: string;\n  stakeAccountId: string | null;\n}\n\nexport class UnstakeSpoolIntention extends ScallopCoreBaseIntention<UnstakeSpoolIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.UnstakeSpool;\n\n  constructor(public readonly data: UnstakeSpoolIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return fromScallopTransaction(\n      await input.scallopClient.unstake(this.data.marketCoinName, +this.data.amount, false),\n    );\n  }\n\n  static fromData(data: UnstakeSpoolIntentionData): UnstakeSpoolIntention {\n    return new UnstakeSpoolIntention(data);\n  }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface WithdrawAndUnstakeLendingIntentionData {\n  amount: number | undefined;\n  coinName: string;\n  stakeAccountId: { id: string; coin: number }[];\n}\n\nexport class WithdrawAndUnstakeLendingIntention extends ScallopCoreBaseIntention<WithdrawAndUnstakeLendingIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.WithdrawAndUnstakeLending;\n\n  constructor(public readonly data: WithdrawAndUnstakeLendingIntentionData) {\n    super(data);\n  }\n\n  async unstakeAndWithdraw(client: ScallopClient, data: WithdrawAndUnstakeLendingIntentionData, walletAddress: string) {\n    const tx = client.builder.createTxBlock();\n    tx.setSender(walletAddress);\n\n    const { stakeAccountId, amount: totalAmount, coinName } = this.data;\n    const withdrawCoins = [];\n    for (let i = 0; i < stakeAccountId.length; i++) {\n      const { id: stakeAccount, coin: amount } = stakeAccountId[i];\n      const stakeMarketCoinName = client.utils.parseMarketCoinName(coinName);\n      const [marketCoin] = await tx.unstakeQuick(amount, stakeMarketCoinName, stakeAccount, false);\n      if (marketCoin) {\n        const wdScoin = tx.withdraw(marketCoin, coinName);\n        withdrawCoins.push(wdScoin);\n      }\n    }\n    if (totalAmount > 0) {\n      const wdCoin = await tx.withdrawQuick(totalAmount, coinName);\n      withdrawCoins.push(wdCoin);\n    }\n    if (withdrawCoins.length > 1) {\n      tx.mergeCoins(withdrawCoins[0], withdrawCoins.slice(1));\n    }\n    tx.transferObjects(withdrawCoins, walletAddress);\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.unstakeAndWithdraw(input.scallopClient, this.data, input.account.address);\n  }\n\n  static fromData(data: WithdrawAndUnstakeLendingIntentionData): WithdrawAndUnstakeLendingIntention {\n    return new WithdrawAndUnstakeLendingIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { fromScallopTransaction } from '../../utils/transaction';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface WithdrawCollateralIntentionData {\n  collateralCoinName: string;\n  amount: number | string;\n  obligationId: string;\n  obligationKey: string;\n}\n\nexport class WithdrawCollateralIntention extends ScallopCoreBaseIntention<WithdrawCollateralIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.WithdrawCollateral;\n\n  constructor(public readonly data: WithdrawCollateralIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return fromScallopTransaction(\n      await input.scallopClient.withdrawCollateral(\n        this.data.collateralCoinName,\n        Number(this.data.amount),\n        false,\n        this.data.obligationId,\n        this.data.obligationKey,\n        input.account.address,\n      ),\n    );\n  }\n\n  static fromData(data: WithdrawCollateralIntentionData): WithdrawCollateralIntention {\n    return new WithdrawCollateralIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport { SuiNetworks, TransactionSubType } from '../../types/utils';\nimport { fromScallopTransaction } from '../../utils/transaction';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface WithdrawLendingIntentionData {\n  amount: string | number;\n  coinName: string;\n}\n\nexport class WithdrawLendingIntention extends ScallopCoreBaseIntention<WithdrawLendingIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.WithdrawLending;\n\n  constructor(public readonly data: WithdrawLendingIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return fromScallopTransaction(\n      await input.scallopClient.withdraw(this.data.coinName, Number(this.data.amount), false, input.account.address),\n    );\n  }\n\n  static fromData(data: WithdrawLendingIntentionData): WithdrawLendingIntention {\n    return new WithdrawLendingIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface BindReferralIntentionData {\n  veScaKey: string;\n}\n\nexport class BindReferralIntention extends ScallopCoreBaseIntention<BindReferralIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.BindReferral;\n\n  constructor(public readonly data: BindReferralIntentionData) {\n    super(data);\n  }\n\n  async bindReferral({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n    const sender = account.address;\n    const tx = client.builder.createTxBlock();\n    tx.setSender(sender);\n    tx.bindToReferral(this.data.veScaKey);\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.bindReferral(input);\n  }\n\n  static fromData(data: BindReferralIntentionData): BindReferralIntention {\n    return new BindReferralIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface ClaimRevenueReferralIntentionData {\n  veScaKey: string;\n  coins: string[];\n}\n\nexport class ClaimRevenueReferralIntention extends ScallopCoreBaseIntention<ClaimRevenueReferralIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.ClaimRevenueReferral;\n\n  constructor(public readonly data: ClaimRevenueReferralIntentionData) {\n    super(data);\n  }\n\n  async claimRevenueReferral({\n    account,\n    scallopClient: client,\n  }: {\n    account: WalletAccount;\n    scallopClient: ScallopClient;\n  }) {\n    const { veScaKey, coins } = this.data;\n    const sender = account.address;\n    const tx = client.builder.createTxBlock();\n    tx.setSender(sender);\n\n    const coinsName = coins.map((coin) => client.utils.parseCoinNameFromType(coin));\n\n    await tx.claimReferralRevenueQuick(veScaKey, coinsName);\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.claimRevenueReferral(input);\n  }\n\n  static fromData(data: ClaimRevenueReferralIntentionData): ClaimRevenueReferralIntention {\n    return new ClaimRevenueReferralIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface CreateReferralLinkIntentionData {}\n\nexport class CreateReferralLinkIntention extends ScallopCoreBaseIntention<CreateReferralLinkIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.CreateReferralLink;\n\n  constructor(public readonly data: CreateReferralLinkIntentionData) {\n    super(data);\n  }\n\n  async createReferralLink({\n    account,\n    scallopClient: client,\n  }: {\n    account: WalletAccount;\n    scallopClient: ScallopClient;\n  }) {\n    const sender = account.address;\n\n    const tx = client.builder.createTxBlock();\n    tx.setSender(sender);\n\n    const referralTicket = tx.mintEmptyVeSca();\n    tx.transferObjects([referralTicket], sender);\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.createReferralLink(input);\n  }\n\n  static fromData(data: CreateReferralLinkIntentionData): CreateReferralLinkIntention {\n    return new CreateReferralLinkIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { SCA_COIN_TYPE, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface ExtendPeriodAndStakeMoreIntentionData {\n  amount: number;\n  veScaKey: string;\n  unlockTime: number;\n  obligationId: string | undefined;\n  obligationKey: string | undefined;\n  isOldBorrowIncentive: boolean;\n  isObligationLocked: boolean;\n}\n\nexport class ExtendPeriodAndStakeMoreIntention extends ScallopCoreBaseIntention<ExtendPeriodAndStakeMoreIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.ExtendPeriodAndStakeMore;\n\n  constructor(public readonly data: ExtendPeriodAndStakeMoreIntentionData) {\n    super(data);\n  }\n\n  async extendPeriodAndStakeMoreSca({\n    account,\n    scallopClient: client,\n  }: {\n    account: WalletAccount;\n    scallopClient: ScallopClient;\n  }) {\n    const { amount, veScaKey, unlockTime, obligationId, obligationKey, isOldBorrowIncentive, isObligationLocked } =\n      this.data;\n\n    const sender = account.address;\n    const tx = client.builder.createTxBlock();\n    tx.setSender(sender);\n\n    // Get all SCA and merge them into one.\n    const coins = await client.utils.selectCoins(amount, SCA_COIN_TYPE, sender);\n    const [takeCoin, leftCoin] = tx.takeAmountFromCoins(coins, amount);\n    tx.extendLockPeriod(veScaKey, unlockTime);\n    tx.extendLockAmount(veScaKey, takeCoin);\n    tx.transferObjects([leftCoin], sender);\n    if (!obligationId || !obligationKey) {\n      return tx.txBlock;\n    }\n    if (isObligationLocked) {\n      if (isOldBorrowIncentive) {\n        OldBorrowIncentiveTxBuilder.unstakeObligation(tx, obligationId, obligationKey);\n      } else {\n        tx.unstakeObligation(obligationId, obligationKey);\n      }\n    }\n    tx.stakeObligationWithVesca(obligationId, obligationKey, veScaKey);\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.extendPeriodAndStakeMoreSca(input);\n  }\n\n  static fromData(data: ExtendPeriodAndStakeMoreIntentionData): ExtendPeriodAndStakeMoreIntention {\n    return new ExtendPeriodAndStakeMoreIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface ExtendStakePeriodIntentionData {\n  isObligationLocked: boolean;\n  isOldBorrowIncentive: boolean;\n  obligationId: string | undefined;\n  obligationKey: string | undefined;\n  unlockTime: number | undefined;\n  veScaKey: string | undefined;\n}\n\nexport class ExtendStakePeriodIntention extends ScallopCoreBaseIntention<ExtendStakePeriodIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.ExtendStakePeriod;\n\n  constructor(public readonly data: ExtendStakePeriodIntentionData) {\n    super(data);\n  }\n\n  async extendStakeScaLockPeriod({\n    account,\n    scallopClient: client,\n  }: {\n    account: WalletAccount;\n    scallopClient: ScallopClient;\n  }) {\n    const sender = account.address;\n    const { veScaKey, unlockTime, obligationId, obligationKey, isObligationLocked, isOldBorrowIncentive } = this.data;\n\n    const tx = client.builder.createTxBlock();\n    tx.setSender(sender);\n\n    tx.extendLockPeriod(veScaKey, unlockTime);\n    if (obligationId && obligationKey) {\n      if (isObligationLocked) {\n        if (isOldBorrowIncentive) {\n          OldBorrowIncentiveTxBuilder.unstakeObligation(tx, obligationKey, obligationId);\n        } else {\n          tx.unstakeObligation(obligationId, obligationKey);\n        }\n      }\n      tx.stakeObligationWithVesca(obligationId, obligationKey, veScaKey);\n    }\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.extendStakeScaLockPeriod(input);\n  }\n\n  static fromData(data: ExtendStakePeriodIntentionData): ExtendStakePeriodIntention {\n    return new ExtendStakePeriodIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient, ScallopQuery, ScallopTxBlock } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport { SuiNetworks, TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface MergeVeScaIntentionData {\n  targetVeScaKey: string;\n  sourceVeScaKey: string;\n  obligationDatas: {\n    obligationKey: string;\n    obligationId: string;\n  }[];\n}\n\nexport class MergeVeScaIntention extends ScallopCoreBaseIntention<MergeVeScaIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.MergeVeSca;\n\n  constructor(public readonly data: MergeVeScaIntentionData) {\n    super(data);\n  }\n\n  private async handleUnsubForKeys(\n    tx: ScallopTxBlock,\n    query: ScallopQuery,\n    cb: (innerTx: ScallopTxBlock, targetVeScaKey: string, sourceVeScaKey: string) => void,\n  ) {\n    const { targetVeScaKey, sourceVeScaKey } = this.data;\n    const [targetObligation, sourceObligation] = await Promise.all([\n      query.getBindedObligationId(targetVeScaKey),\n      query.getBindedObligationId(sourceVeScaKey),\n    ]);\n\n    // Unstake\n    if (targetObligation) {\n      await tx.unstakeObligationQuick(targetObligation);\n    }\n    if (sourceObligation) {\n      await tx.unstakeObligationQuick(sourceObligation);\n    }\n\n    // run callback\n    cb(tx, targetVeScaKey, sourceVeScaKey);\n\n    if (targetObligation) {\n      await tx.stakeObligationWithVeScaQuick(targetObligation, undefined, targetVeScaKey);\n    }\n\n    if (sourceObligation) {\n      await tx.stakeObligationWithVeScaQuick(sourceObligation, undefined, sourceVeScaKey);\n    }\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    const {\n      scallopClient,\n      account: { address },\n    } = input;\n\n    const tx = scallopClient.builder.createTxBlock();\n    tx.setSender(address);\n\n    await this.handleUnsubForKeys(tx, scallopClient.query, async (innerTx, targetVeScaKey, sourceVeScaKey) => {\n      innerTx.mergeVeSca(tx.object(targetVeScaKey), tx.object(sourceVeScaKey));\n    });\n\n    return tx.txBlock;\n  }\n\n  static fromData(data: MergeVeScaIntentionData): MergeVeScaIntention {\n    return new MergeVeScaIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface RedeemScaIntentionData {\n  veScaKey: string;\n}\n\nexport class RedeemScaIntention extends ScallopCoreBaseIntention<RedeemScaIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.RedeemSca;\n\n  constructor(public readonly data: RedeemScaIntentionData) {\n    super(data);\n  }\n\n  async redeemSca({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n    const { veScaKey } = this.data;\n    const sender = account.address;\n\n    const tx = client.builder.createTxBlock();\n    tx.setSender(sender);\n\n    await tx.redeemScaQuick({ veScaKey });\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.redeemSca(input);\n  }\n\n  static fromData(data: RedeemScaIntentionData): RedeemScaIntention {\n    return new RedeemScaIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { SCA_COIN_TYPE, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface RenewExpStakePeriodIntentionData {\n  amount: number;\n  unlockTime: number;\n  veScaKey: string;\n  isHaveRedeem: boolean;\n  obligation?: string;\n  obligationKey?: string;\n  isObligationLocked: boolean;\n  isOldBorrowIncentive: boolean;\n}\n\nexport class RenewExpStakePeriodIntention extends ScallopCoreBaseIntention<RenewExpStakePeriodIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.RenewExpStakePeriod;\n\n  constructor(public readonly data: RenewExpStakePeriodIntentionData) {\n    super(data);\n  }\n\n  async renewExpiredStakeSca({\n    account,\n    scallopClient: client,\n  }: {\n    account: WalletAccount;\n    scallopClient: ScallopClient;\n  }) {\n    const sender = account.address;\n    const {\n      amount,\n      unlockTime,\n      veScaKey,\n      isHaveRedeem,\n      obligation,\n      obligationKey,\n      isObligationLocked,\n      isOldBorrowIncentive,\n    } = this.data;\n\n    const tx = client.builder.createTxBlock();\n    tx.setSender(sender);\n\n    if (isHaveRedeem) {\n      const redeem = tx.redeemSca(veScaKey);\n      tx.transferObjects([redeem], sender);\n    }\n\n    // Get all SCA and merge them into one.\n    const coins = await client.builder.utils.selectCoins(amount, SCA_COIN_TYPE, sender);\n    const [takeCoin, leftCoin] = tx.takeAmountFromCoins(coins, amount);\n    tx.transferObjects([leftCoin], sender);\n\n    // renew veSCA\n    tx.renewExpiredVeSca(veScaKey, takeCoin, unlockTime);\n    if (!obligation || !obligationKey) {\n      return tx.txBlock;\n    }\n    if (isObligationLocked) {\n      if (isOldBorrowIncentive) {\n        OldBorrowIncentiveTxBuilder.unstakeObligation(tx, obligationKey, obligation);\n      } else {\n        tx.unstakeObligation(obligation, obligationKey);\n      }\n    }\n    tx.stakeObligationWithVesca(obligation, obligationKey, veScaKey);\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.renewExpiredStakeSca(input);\n  }\n\n  static fromData(data: RenewExpStakePeriodIntentionData): RenewExpStakePeriodIntention {\n    return new RenewExpStakePeriodIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient, ScallopQuery, ScallopTxBlock } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport { SuiNetworks, TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface SplitVeScaIntentionData {\n  targetVeScaKey: string;\n  splitAmount: number;\n}\n\nexport class SplitVeScaIntention extends ScallopCoreBaseIntention<SplitVeScaIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.MergeVeSca;\n\n  constructor(public readonly data: SplitVeScaIntentionData) {\n    super(data);\n  }\n\n  private async handleUnsubForKeys(\n    tx: ScallopTxBlock,\n    query: ScallopQuery,\n    cb: (innerTx: ScallopTxBlock, targetVeScaKey: string, splitAmount: string) => void,\n  ) {\n    const { targetVeScaKey, splitAmount } = this.data;\n    const targetObligation = await query.getBindedObligationId(targetVeScaKey);\n\n    // Unstake\n    if (targetObligation) {\n      await tx.unstakeObligationQuick(targetObligation);\n    }\n\n    // run callback\n    cb(tx, targetVeScaKey, splitAmount.toString());\n\n    if (targetObligation) {\n      await tx.stakeObligationWithVeScaQuick(targetObligation, undefined, targetVeScaKey);\n    }\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    const {\n      scallopClient,\n      account: { address },\n    } = input;\n\n    const tx = scallopClient.builder.createTxBlock();\n    tx.setSender(address);\n\n    await this.handleUnsubForKeys(tx, scallopClient.query, (innerTx, targetVeScaKey, splitAmount) => {\n      const newVeScaKey = innerTx.splitVeSca(targetVeScaKey, splitAmount.toString());\n      innerTx.transferObjects([newVeScaKey], address);\n    });\n\n    return tx.txBlock;\n  }\n\n  static fromData(data: SplitVeScaIntentionData): SplitVeScaIntention {\n    return new SplitVeScaIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { SCA_COIN_TYPE, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface StakeScaIntentionData {\n  amount: number;\n  isObligationLocked: boolean;\n  isOldBorrowIncentive: boolean;\n  obligationId: string | undefined;\n  obligationKey: string | undefined;\n  unlockTime: number | undefined;\n  veScaKey: string | undefined;\n}\n\nexport class StakeScaIntention extends ScallopCoreBaseIntention<StakeScaIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.StakeSca;\n\n  constructor(public readonly data: StakeScaIntentionData) {\n    super(data);\n  }\n\n  async stakeSca({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n    const sender = account.address;\n    const { amount, isObligationLocked, isOldBorrowIncentive, obligationId, obligationKey, unlockTime, veScaKey } =\n      this.data;\n\n    const tx = client.builder.createTxBlock();\n    tx.setSender(sender);\n\n    // Get all SCA and merge them into one.\n    const coins = await client.utils.selectCoins(amount, SCA_COIN_TYPE, sender);\n    const [takeCoin, leftCoin] = tx.takeAmountFromCoins(coins, amount);\n\n    let newVescaKey;\n    if (!veScaKey) {\n      newVescaKey = tx.lockSca(takeCoin, unlockTime);\n    } else {\n      tx.extendLockAmount(veScaKey, takeCoin);\n    }\n\n    if (obligationId && obligationKey) {\n      if (isObligationLocked) {\n        if (isOldBorrowIncentive) {\n          OldBorrowIncentiveTxBuilder.unstakeObligation(tx, obligationKey, obligationId);\n        } else {\n          tx.unstakeObligation(obligationId, obligationKey);\n        }\n      }\n      tx.stakeObligationWithVesca(obligationId, obligationKey, veScaKey || newVescaKey);\n    }\n\n    if (!veScaKey) {\n      tx.transferObjects([newVescaKey, leftCoin], sender);\n    }\n\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.stakeSca(input);\n  }\n\n  static fromData(data: StakeScaIntentionData): StakeScaIntention {\n    return new StakeScaIntention(data);\n  }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface SupplyAndStakeLendingIntentionData {\n  amount: number | string;\n  coinName: string;\n  stakeAccountId?: string | null;\n}\n\nexport class SupplyAndStakeLendingIntention extends ScallopCoreBaseIntention<SupplyAndStakeLendingIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.SupplyAndStakeLending;\n\n  constructor(public readonly data: SupplyAndStakeLendingIntentionData) {\n    super(data);\n  }\n\n  async supplyAndStake({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n    const sender = account.address;\n    const { amount, coinName, stakeAccountId } = this.data;\n\n    const tx = client.builder.createTxBlock();\n    tx.setSender(sender);\n\n    const marketCoin = await tx.depositQuick(+amount, coinName);\n    const stakeMarketCoinName = client.utils.parseMarketCoinName(coinName);\n    if (client.constants.whitelist.spool.has(stakeMarketCoinName)) {\n      return tx.txBlock;\n    }\n    const stakeAccounts = await client.query.getStakeAccounts(stakeMarketCoinName, sender);\n    const targetStakeAccount = stakeAccountId || (stakeAccounts.length > 0 ? stakeAccounts[0].id : undefined);\n    if (targetStakeAccount) {\n      await tx.stakeQuick(marketCoin, stakeMarketCoinName, targetStakeAccount);\n    } else {\n      const newStakeAccount = tx.createStakeAccount(stakeMarketCoinName);\n      await tx.stakeQuick(marketCoin, stakeMarketCoinName, newStakeAccount);\n      tx.transferObjects([newStakeAccount], sender);\n    }\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.supplyAndStake(input);\n  }\n\n  static fromData(data: SupplyAndStakeLendingIntentionData): SupplyAndStakeLendingIntention {\n    return new SupplyAndStakeLendingIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient, ScallopTxBlock } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport { SuiNetworks, TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\n/**\n * Represents possible actions in the system\n */\ntype Action = 'stake' | 'unstake' | 'deactivate';\n\n/**\n * Type mapping from Action to its required arguments\n */\ntype Args<T extends Action> = T extends 'stake'\n  ? StakeArgs\n  : T extends 'unstake'\n    ? UnstakeArgs\n    : T extends 'deactivate'\n      ? DeactivateArgs\n      : never;\n\n/**\n * Arguments required for the 'stake' action\n */\ninterface StakeArgs {\n  veScaKey: string;\n  obligationId: string;\n  obligationKey: string;\n}\n\n/**\n * Arguments required for the 'unstake' action\n */\ninterface UnstakeArgs {\n  obligationId: string;\n  obligationKey: string;\n}\n\n/**\n * Arguments required for the 'deactivate' action\n */\ninterface DeactivateArgs {\n  veScaKey: string;\n  obligationId: string;\n}\n\ntype BindingDatas =\n  | { action: 'deactivate'; args: Args<'deactivate'> }\n  | { action: 'stake'; args: Args<'stake'> }\n  | { action: 'unstake'; args: Args<'unstake'> };\n\nexport interface VeScaObligationBindingsIntentData {\n  bindingDatas: BindingDatas[];\n}\n\nexport class VeScaObligationBindingsIntention extends ScallopCoreBaseIntention<VeScaObligationBindingsIntentData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.VeScaObligationBindings;\n\n  constructor(public readonly data: VeScaObligationBindingsIntentData) {\n    super(data);\n  }\n\n  private handleAction(tx: ScallopTxBlock, { action, args }: BindingDatas) {\n    switch (action) {\n      case 'deactivate':\n        return tx.deactivateBoost(args.obligationId, args.veScaKey);\n      case 'stake':\n        return tx.stakeObligationWithVesca(args.obligationId, args.obligationKey, args.veScaKey);\n      case 'unstake':\n        return tx.unstakeObligation(args.obligationId, args.obligationKey);\n      default:\n        throw new Error(`Invalid action`);\n    }\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    const {\n      scallopClient,\n      account: { address: sender },\n    } = input;\n\n    const tx = scallopClient.builder.createTxBlock();\n    tx.setSender(sender);\n\n    const { bindingDatas } = this.data;\n\n    bindingDatas.forEach((data) => this.handleAction(tx, data));\n\n    return tx.txBlock;\n  }\n\n  static fromData(data: VeScaObligationBindingsIntentData): VeScaObligationBindingsIntention {\n    return new VeScaObligationBindingsIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport { SuiNetworks, TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface TransferVeScaKeysIntentionData {\n  veScaKeys: {\n    objectId: string;\n    version: string;\n    digest: string;\n  }[];\n}\n\nexport class TransferVeScaKeysIntention extends ScallopCoreBaseIntention<TransferVeScaKeysIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.MergeVeSca;\n\n  constructor(public readonly data: TransferVeScaKeysIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    const {\n      scallopClient,\n      account: { address: sender },\n    } = input;\n\n    const tx = scallopClient.builder.createTxBlock();\n    tx.setSender(sender);\n\n    const { veScaKeys } = this.data;\n\n    tx.transferObjects(\n      veScaKeys.map((t) => tx.objectRef(t)),\n      tx.pure.address(sender),\n    );\n\n    return tx.txBlock;\n  }\n\n  static fromData(data: TransferVeScaKeysIntentionData): TransferVeScaKeysIntention {\n    return new TransferVeScaKeysIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface WithdrawStakedScaIntentionData {\n  vescaKey?: string;\n}\n\nexport class WithdrawStakedScaIntention extends ScallopCoreBaseIntention<WithdrawStakedScaIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.WithdrawStakedSca;\n\n  constructor(public readonly data: WithdrawStakedScaIntentionData) {\n    super(data);\n  }\n\n  async withdrawUnlockedSca({\n    account,\n    scallopClient: client,\n  }: {\n    account: WalletAccount;\n    scallopClient: ScallopClient;\n  }) {\n    const { vescaKey } = this.data;\n    const sender = account.address;\n    const tx = client.builder.createTxBlock();\n    tx.setSender(sender);\n\n    await tx.redeemScaQuick({ veScaKey: vescaKey });\n    return tx.txBlock;\n  }\n\n  async build(input: {\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n    scallopClient: ScallopClient;\n  }): Promise<Transaction> {\n    return this.withdrawUnlockedSca(input);\n  }\n\n  static fromData(data: WithdrawStakedScaIntentionData): WithdrawStakedScaIntention {\n    return new WithdrawStakedScaIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport {\n  ConvertAndDepositIntentionData,\n  ConvertIntentionData,\n  SpringSuiIntentionData,\n  StakeAndDepositIntentionData,\n  StakeIntentionData,\n  UnstakeIntentionData,\n} from '@/apps/springSui/types/intention';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { ConvertIntention } from './intentions/convert';\nimport { ConvertAndDepositIntention } from './intentions/convertAndDeposit';\nimport { StakeIntention } from './intentions/stake';\nimport { StakeAndDepositIntention } from './intentions/stakeAndDeposit';\nimport { UnstakeIntention } from './intentions/unstake';\nimport { Utils, TransactionSubType, getUtils, IntentionInput } from './types/helper';\n\nexport type SpringSuiIntention =\n  | StakeIntention\n  | StakeAndDepositIntention\n  | ConvertIntention\n  | ConvertAndDepositIntention\n  | UnstakeIntention;\n\nexport class SpringSuiAppHelper implements IAppHelperInternal<SpringSuiIntentionData> {\n  application = 'SpringSui';\n\n  supportSDK = '@mysten/sui' as const;\n\n  private utils: Utils | undefined;\n\n  async deserialize(input: {\n    transaction: Transaction;\n    chain: IdentifierString;\n    network: SuiNetworks;\n    suiClient: SuiClient;\n    account: WalletAccount;\n    appContext?: any;\n  }): Promise<{ txType: TransactionType; txSubType: string; intentionData: SpringSuiIntentionData }> {\n    const { transaction, suiClient, account } = input;\n\n    if (!this.utils) {\n      this.utils = await getUtils(suiClient, account);\n    }\n\n    const simResult = await suiClient.devInspectTransactionBlock({\n      sender: account.address,\n      transactionBlock: transaction,\n    });\n    console.log('SpringSuiAppHelper.deserialize', simResult);\n\n    const decoder = new Decoder(transaction, simResult);\n    const result = decoder.decode();\n\n    return {\n      txType: TransactionType.Other,\n      txSubType: result.type,\n      intentionData: result.intentionData,\n    };\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    txType: TransactionType;\n    txSubType: string;\n    intentionData: SpringSuiIntentionData;\n    suiClient: SuiClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const { network, txSubType, intentionData, suiClient, account } = input;\n\n    if (!this.utils) {\n      this.utils = await getUtils(suiClient, account);\n    }\n\n    let intention: SpringSuiIntention;\n    switch (txSubType) {\n      case TransactionSubType.STAKE:\n        intention = StakeIntention.fromData(intentionData as StakeIntentionData);\n        break;\n      case TransactionSubType.STAKE_AND_DEPOSIT:\n        intention = StakeAndDepositIntention.fromData(intentionData as StakeAndDepositIntentionData);\n        break;\n      case TransactionSubType.CONVERT:\n        intention = ConvertIntention.fromData(intentionData as ConvertIntentionData);\n        break;\n      case TransactionSubType.CONVERT_AND_DEPOSIT:\n        intention = ConvertAndDepositIntention.fromData(intentionData as ConvertAndDepositIntentionData);\n        break;\n      case TransactionSubType.UNSTAKE:\n        intention = UnstakeIntention.fromData(intentionData as UnstakeIntentionData);\n        break;\n      default:\n        throw new Error('not implemented');\n    }\n    return intention.build({\n      network,\n      suiClient,\n      account,\n\n      suilendClient: this.utils.suilendClient,\n      LIQUID_STAKING_INFO_MAP: this.utils.LIQUID_STAKING_INFO_MAP,\n      obligationOwnerCap: this.utils.obligationOwnerCaps?.[0],\n      obligation: this.utils.obligations?.[0],\n    } as IntentionInput);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag } from '@mysten/sui/utils';\n\nimport {\n  ConvertAndDepositIntentionData,\n  ConvertIntentionData,\n  StakeAndDepositIntentionData,\n  StakeIntentionData,\n  UnstakeIntentionData,\n} from '@/apps/springSui/types/intention';\nimport { DevInspectResults } from '@/compat/mysten-sui-json-rpc';\n\nimport { DecodeResult, TransactionSubType } from './types/helper';\n\nexport class Decoder {\n  constructor(\n    public readonly transaction: Transaction,\n    public readonly simResult: DevInspectResults,\n  ) {}\n\n  decode() {\n    if (this.isStakeTransaction()) {\n      return this.decodeStake();\n    }\n    if (this.isStakeAndDepositTransaction()) {\n      return this.decodeStakeAndDeposit();\n    }\n    if (this.isConvertTransaction()) {\n      return this.decodeConvert();\n    }\n    if (this.isConvertAndDepositTransaction()) {\n      return this.decodeConvertAndDeposit();\n    }\n    if (this.isUnstakeTransaction()) {\n      return this.decodeUnstake();\n    }\n\n    throw new Error(`Unknown transaction type`);\n  }\n\n  private get commands() {\n    return this.transaction.getData().commands;\n  }\n\n  private getMoveCallCommand(fn: string) {\n    return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n  }\n\n  private hasSuilendDepositTransactionMoveCallCommands() {\n    return (\n      !!this.getMoveCallCommand('deposit_liquidity_and_mint_ctokens') &&\n      !!this.getMoveCallCommand('deposit_ctokens_into_obligation')\n    );\n  }\n\n  private hasMintMoveCallCommands() {\n    return !!this.getMoveCallCommand('mint');\n  }\n\n  private hasRedeemMoveCallCommands() {\n    return !!this.getMoveCallCommand('redeem');\n  }\n\n  // is*\n  private isStakeTransaction() {\n    return (\n      this.hasMintMoveCallCommands() &&\n      !this.hasRedeemMoveCallCommands() &&\n      !this.hasSuilendDepositTransactionMoveCallCommands()\n    );\n  }\n\n  private isStakeAndDepositTransaction() {\n    return (\n      this.hasMintMoveCallCommands() &&\n      !this.hasRedeemMoveCallCommands() &&\n      this.hasSuilendDepositTransactionMoveCallCommands()\n    );\n  }\n\n  private isConvertTransaction() {\n    return (\n      this.hasMintMoveCallCommands() &&\n      this.hasRedeemMoveCallCommands() &&\n      !this.hasSuilendDepositTransactionMoveCallCommands()\n    );\n  }\n\n  private isConvertAndDepositTransaction() {\n    return (\n      this.hasMintMoveCallCommands() &&\n      this.hasRedeemMoveCallCommands() &&\n      this.hasSuilendDepositTransactionMoveCallCommands()\n    );\n  }\n\n  private isUnstakeTransaction() {\n    return (\n      !this.hasMintMoveCallCommands() &&\n      this.hasRedeemMoveCallCommands() &&\n      !this.hasSuilendDepositTransactionMoveCallCommands()\n    );\n  }\n\n  // decode*\n  private decodeStake(): DecodeResult {\n    const events = {\n      MintEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::MintEvent')),\n    };\n\n    const outCoinType = normalizeStructTag((events.MintEvent.parsedJson as any).event.typename.name as string);\n    const amount = (events.MintEvent.parsedJson as any).event.sui_amount_in as string;\n    console.log('Decoder.decodeStake', amount);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.STAKE,\n      intentionData: {\n        amount,\n        outCoinType,\n      } as StakeIntentionData,\n    };\n  }\n\n  private decodeStakeAndDeposit(): DecodeResult {\n    const events = {\n      MintEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::MintEvent')),\n    };\n\n    const outCoinType = normalizeStructTag((events.MintEvent.parsedJson as any).event.typename.name as string);\n    const amount = (events.MintEvent.parsedJson as any).event.sui_amount_in as string;\n    console.log('Decoder.decodeStakeAndDeposit', amount);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.STAKE_AND_DEPOSIT,\n      intentionData: {\n        amount,\n        outCoinType,\n      } as StakeAndDepositIntentionData,\n    };\n  }\n\n  private decodeConvert(): DecodeResult {\n    const events = {\n      RedeemEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::RedeemEvent')),\n      MintEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::MintEvent')),\n    };\n\n    const inCoinType = normalizeStructTag((events.RedeemEvent.parsedJson as any).event.typename.name as string);\n    const outCoinType = normalizeStructTag((events.MintEvent.parsedJson as any).event.typename.name as string);\n    const amount = (events.RedeemEvent.parsedJson as any).event.lst_amount_in as string;\n    console.log('Decoder.decodeConvert', amount);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.CONVERT,\n      intentionData: {\n        amount,\n        inCoinType,\n        outCoinType,\n      } as ConvertIntentionData,\n    };\n  }\n\n  private decodeConvertAndDeposit(): DecodeResult {\n    const events = {\n      RedeemEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::RedeemEvent')),\n      MintEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::MintEvent')),\n    };\n\n    const inCoinType = normalizeStructTag((events.RedeemEvent.parsedJson as any).event.typename.name as string);\n    const outCoinType = normalizeStructTag((events.MintEvent.parsedJson as any).event.typename.name as string);\n    const amount = (events.RedeemEvent.parsedJson as any).event.lst_amount_in as string;\n    console.log('Decoder.decodeConvertAndDeposit', amount);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.CONVERT_AND_DEPOSIT,\n      intentionData: {\n        amount,\n        inCoinType,\n        outCoinType,\n      } as ConvertAndDepositIntentionData,\n    };\n  }\n\n  private decodeUnstake(): DecodeResult {\n    const events = {\n      RedeemEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::RedeemEvent')),\n    };\n\n    const inCoinType = normalizeStructTag((events.RedeemEvent.parsedJson as any).event.typename.name as string);\n    const amount = (events.RedeemEvent.parsedJson as any).event.lst_amount_in as string;\n    console.log('Decoder.decodeUnstake', amount);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.UNSTAKE,\n      intentionData: {\n        amount,\n        inCoinType,\n      } as UnstakeIntentionData,\n    };\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { LiquidStakingInfo } from '@suilend/springsui-sdk/_generated/liquid_staking/liquid-staking/structs';\nimport { WeightHook } from '@suilend/springsui-sdk/_generated/liquid_staking/weight/structs';\nimport { LiquidStakingObjectInfo } from '@suilend/springsui-sdk/client';\nimport { API_URL } from '@suilend/sui-fe';\n\nimport { SpringSuiIntentionData } from '@/apps/springSui/types/intention';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { getUtils as getSuilendUtils, Utils as SuilendUtils } from '../../suilend/helper';\n\nexport enum TransactionSubType {\n  STAKE = 'stake',\n  STAKE_AND_DEPOSIT = 'stakeAndDeposit',\n  CONVERT = 'convert',\n  CONVERT_AND_DEPOSIT = 'convertAndDeposit',\n  UNSTAKE = 'unstake',\n}\n\nexport type DecodeResult = {\n  txType: TransactionType;\n  type: TransactionSubType;\n  intentionData: SpringSuiIntentionData;\n};\n\nexport type Utils = {\n  LIQUID_STAKING_INFO_MAP: Record<string, LiquidStakingObjectInfo>;\n} & SuilendUtils;\n\nexport const getUtils = async (suiClient: SuiClient, account: WalletAccount): Promise<Utils> => {\n  const suilendUtils = await getSuilendUtils(suiClient, account);\n\n  const lstInfoRes = await fetch(`${API_URL}/springsui/lst-info`);\n  const lstInfoJson: Record<\n    string,\n    {\n      LIQUID_STAKING_INFO: LiquidStakingObjectInfo;\n      liquidStakingInfo: LiquidStakingInfo<string>;\n      weightHook: WeightHook<string>;\n      apy: string;\n    }\n  > = await lstInfoRes.json();\n  if ((lstInfoRes as any)?.statusCode === 500) {\n    throw new Error('Failed to fetch SpringSui LST data');\n  }\n\n  const lstInfoMap = lstInfoJson;\n\n  const LIQUID_STAKING_INFO_MAP = Object.fromEntries(\n    Object.values(lstInfoMap).map((info) => [info.LIQUID_STAKING_INFO.type, info.LIQUID_STAKING_INFO]),\n  );\n\n  return { ...suilendUtils, LIQUID_STAKING_INFO_MAP };\n};\n\nexport type IntentionInput = {\n  network: SuiNetworks;\n  suiClient: SuiClient;\n  account: WalletAccount;\n\n  suilendClient: Utils['suilendClient'];\n  LIQUID_STAKING_INFO_MAP: Utils['LIQUID_STAKING_INFO_MAP'];\n  obligationOwnerCap: Utils['obligationOwnerCaps'][0] | undefined;\n  obligation: Utils['obligations'][0] | undefined;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\nimport { LENDING_MARKET_ID, LENDING_MARKET_TYPE, SuilendClient } from '@suilend/sdk';\nimport { ObligationOwnerCap } from '@suilend/sdk/_generated/suilend/lending-market/structs';\nimport { Obligation } from '@suilend/sdk/_generated/suilend/obligation/structs';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport {\n  BorrowIntentionData,\n  ClaimAndDepositIntentionData,\n  ClaimIntentionData,\n  DepositIntentionData,\n  RepayIntentionData,\n  SuilendIntentionData,\n  WithdrawIntentionData,\n} from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { BorrowIntention } from './intentions/borrow';\nimport { ClaimIntention } from './intentions/claim';\nimport { ClaimAndDepositIntention } from './intentions/claimAndDeposit';\nimport { DepositIntention } from './intentions/deposit';\nimport { RepayIntention } from './intentions/repay';\nimport { WithdrawIntention } from './intentions/withdraw';\nimport { TransactionSubType } from './types';\n\nexport type Utils = {\n  suilendClient: SuilendClient;\n  obligationOwnerCaps: ObligationOwnerCap<string>[];\n  obligations: Obligation<string>[];\n};\n\nexport const getUtils = async (suiClient: SuiClient, account: WalletAccount): Promise<Utils> => {\n  const suilendClient = await SuilendClient.initialize(LENDING_MARKET_ID, LENDING_MARKET_TYPE, suiClient);\n\n  const obligationOwnerCaps = await SuilendClient.getObligationOwnerCaps(\n    account.address,\n    suilendClient.lendingMarket.$typeArgs,\n    suiClient,\n  );\n\n  const obligations = await Promise.all(\n    obligationOwnerCaps.map((ownerCap) =>\n      SuilendClient.getObligation(ownerCap.obligationId, suilendClient.lendingMarket.$typeArgs, suiClient),\n    ),\n  );\n\n  console.log(\n    'XXX getUtils - suilendClient:',\n    suilendClient,\n    'obligations:',\n    obligations,\n    'obligationOwnerCaps:',\n    obligationOwnerCaps,\n  );\n\n  return { suilendClient, obligationOwnerCaps, obligations };\n};\n\nexport type SuilendIntention =\n  | DepositIntention\n  | WithdrawIntention\n  | BorrowIntention\n  | RepayIntention\n  | ClaimIntention\n  | ClaimAndDepositIntention;\n\nexport class SuilendAppHelper implements IAppHelperInternal<SuilendIntentionData> {\n  application = 'Suilend';\n\n  supportSDK = '@mysten/sui' as const;\n\n  private utils: Utils | undefined;\n\n  async deserialize(input: {\n    transaction: Transaction;\n    chain: IdentifierString;\n    network: SuiNetworks;\n    suiClient: SuiClient;\n    account: WalletAccount;\n    appContext?: any;\n  }): Promise<{ txType: TransactionType; txSubType: string; intentionData: SuilendIntentionData }> {\n    const { transaction, suiClient, account } = input;\n\n    if (!this.utils) {\n      this.utils = await getUtils(suiClient, account);\n    }\n\n    const simResult = await suiClient.devInspectTransactionBlock({\n      sender: account.address,\n      transactionBlock: transaction,\n    });\n\n    console.log('SuilendAppHelper.deserialize - simResult:', simResult, 'utils:', this.utils, 'suiClient:', suiClient);\n\n    const decoder = new Decoder(transaction, simResult);\n    const result = decoder.decode();\n\n    return {\n      txType: TransactionType.Other,\n      txSubType: result.type,\n      intentionData: result.intentionData,\n    };\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    txType: TransactionType;\n    txSubType: string;\n    intentionData: SuilendIntentionData;\n    suiClient: SuiClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const { network, txSubType, intentionData, suiClient, account } = input;\n\n    if (!this.utils) {\n      this.utils = await getUtils(suiClient, account);\n    }\n\n    let intention: SuilendIntention;\n    switch (txSubType) {\n      case TransactionSubType.DEPOSIT:\n        intention = DepositIntention.fromData(intentionData as DepositIntentionData);\n        break;\n      case TransactionSubType.WITHDRAW:\n        intention = WithdrawIntention.fromData(intentionData as WithdrawIntentionData);\n        break;\n      case TransactionSubType.BORROW:\n        intention = BorrowIntention.fromData(intentionData as BorrowIntentionData);\n        break;\n      case TransactionSubType.REPAY:\n        intention = RepayIntention.fromData(intentionData as RepayIntentionData);\n        break;\n      case TransactionSubType.CLAIM:\n        intention = ClaimIntention.fromData(intentionData as ClaimIntentionData);\n        break;\n      case TransactionSubType.CLAIM_AND_DEPOSIT:\n        intention = ClaimAndDepositIntention.fromData(intentionData as ClaimAndDepositIntentionData);\n        break;\n      default:\n        throw new Error('not implemented');\n    }\n\n    const obligationId = window.localStorage.getItem('obligationId');\n    const obligation = this.utils.obligations?.find((o) => o.id === obligationId) ?? this.utils.obligations?.[0];\n    const obligationOwnerCap = this.utils.obligationOwnerCaps?.find((o) => o.obligationId === obligation?.id);\n\n    return intention.build({\n      network,\n      suiClient,\n      account,\n\n      suilendClient: this.utils.suilendClient,\n      obligationOwnerCap,\n      obligation,\n    } as IntentionInput);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { fromBase64, toHex } from '@mysten/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag } from '@mysten/sui/utils';\nimport { MAX_U64 } from '@suilend/sui-fe';\nimport BigNumber from 'bignumber.js';\n\nimport {\n  BorrowIntentionData,\n  ClaimAndDepositIntentionData,\n  ClaimIntentionData,\n  DepositIntentionData,\n  RepayIntentionData,\n  SuilendIntentionData,\n  WithdrawIntentionData,\n} from '@/apps/suilend/types/helper';\nimport { DevInspectResults } from '@/compat/mysten-sui-json-rpc';\n\nimport { TransactionSubType } from './types';\n\ntype DecodeResult = {\n  txType: TransactionType;\n  type: TransactionSubType;\n  intentionData: SuilendIntentionData;\n};\n\nexport class Decoder {\n  constructor(\n    public readonly transaction: Transaction,\n    public readonly simResult: DevInspectResults,\n  ) {}\n\n  decode() {\n    if (this.isDepositTransaction()) {\n      return this.decodeDeposit();\n    }\n    if (this.isWithdrawTransaction()) {\n      return this.decodeWithdraw();\n    }\n    if (this.isBorrowTransaction()) {\n      return this.decodeBorrow();\n    }\n    if (this.isRepayTransaction()) {\n      return this.decodeRepay();\n    }\n    if (this.isClaimTransaction()) {\n      return this.decodeClaim();\n    }\n    if (this.isClaimAndDepositTransaction()) {\n      return this.decodeClaimAndDeposit();\n    }\n\n    throw new Error(`Unknown transaction type`);\n  }\n\n  private get inputs() {\n    console.log('this.transaction.getData().inputs', this.transaction.getData().inputs);\n    return this.transaction.getData().inputs;\n  }\n\n  private get commands() {\n    console.log('this.transaction.getData().commands', this.transaction.getData().commands);\n    return this.transaction.getData().commands;\n  }\n\n  private getMoveCallCommand(fn: string) {\n    return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n  }\n\n  private hasDepositTransactionMoveCallCommands() {\n    return (\n      !!this.getMoveCallCommand('deposit_liquidity_and_mint_ctokens') &&\n      !!this.getMoveCallCommand('deposit_ctokens_into_obligation')\n    );\n  }\n\n  private hasClaimTransactionMoveCallCommands() {\n    return !!this.getMoveCallCommand('claim_rewards');\n  }\n\n  // is*\n  private isDepositTransaction() {\n    return !this.hasClaimTransactionMoveCallCommands() && this.hasDepositTransactionMoveCallCommands();\n  }\n\n  private isWithdrawTransaction() {\n    return (\n      !!this.getMoveCallCommand('withdraw_ctokens') &&\n      !!this.getMoveCallCommand('redeem_ctokens_and_withdraw_liquidity_request')\n    );\n  }\n\n  private isBorrowTransaction() {\n    return !!this.getMoveCallCommand('borrow_request');\n  }\n\n  private isRepayTransaction() {\n    return !!this.getMoveCallCommand('repay');\n  }\n\n  private isClaimTransaction() {\n    return this.hasClaimTransactionMoveCallCommands() && !this.hasDepositTransactionMoveCallCommands();\n  }\n\n  private isClaimAndDepositTransaction() {\n    return this.hasClaimTransactionMoveCallCommands() && this.hasDepositTransactionMoveCallCommands();\n  }\n\n  // decode*\n  private decodeDeposit(): DecodeResult {\n    const events = {\n      MintEvent: this.simResult.events.find((event) => event.type.includes('lending_market::MintEvent')),\n    };\n\n    const coinType = normalizeStructTag((events.MintEvent.parsedJson as any).coin_type.name as string);\n    const value = (events.MintEvent.parsedJson as any).liquidity_amount as string;\n    console.log('Decoder.decodeDeposit', coinType, value);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.DEPOSIT,\n      intentionData: {\n        coinType,\n        value,\n      } as DepositIntentionData,\n    };\n  }\n\n  private decodeWithdraw(): DecodeResult {\n    const commands = {\n      withdraw_ctokens: this.getMoveCallCommand('withdraw_ctokens'),\n    };\n    const events = {\n      RedeemEvent: this.simResult.events.find((event) => event.type.includes('lending_market::RedeemEvent')),\n    };\n\n    const coinType = normalizeStructTag((events.RedeemEvent.parsedJson as any).coin_type.name as string);\n    let value = (events.RedeemEvent.parsedJson as any).liquidity_amount as string;\n    console.log('Decoder.decodeWithdraw', coinType, value);\n\n    const inputIndex = (commands.withdraw_ctokens.MoveCall.arguments[4] as any).Input as number;\n    const inputValue = new BigNumber(toHex(fromBase64(this.inputs[inputIndex].Pure!.bytes)), 16).toString();\n\n    const isMax = inputValue === MAX_U64.toString();\n    console.log(\n      'decodeWithdraw - isMax:',\n      isMax,\n      'inputIndex:',\n      inputIndex,\n      'inputValue:',\n      inputValue,\n      'MAX_U64.toString():',\n      MAX_U64.toString(),\n    );\n    if (isMax) {\n      value = MAX_U64.toString();\n    }\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.WITHDRAW,\n      intentionData: {\n        coinType,\n        value,\n      } as WithdrawIntentionData,\n    };\n  }\n\n  private decodeBorrow(): DecodeResult {\n    const commands = {\n      borrow_request: this.getMoveCallCommand('borrow_request'),\n    };\n    const events = {\n      BorrowEvent: this.simResult.events.find((event) => event.type.includes('lending_market::BorrowEvent')),\n    };\n\n    const coinType = normalizeStructTag((events.BorrowEvent.parsedJson as any).coin_type.name as string);\n    let value = `${+(events.BorrowEvent.parsedJson as any).liquidity_amount - +(events.BorrowEvent.parsedJson as any).origination_fee_amount}`;\n    console.log('Decoder.decodeBorrow', coinType, value);\n\n    const inputIndex = (commands.borrow_request.MoveCall.arguments[4] as any).Input as number;\n    const inputValue = new BigNumber(toHex(fromBase64(this.inputs[inputIndex].Pure!.bytes)), 16).toString();\n\n    const isMax = inputValue === MAX_U64.toString();\n    console.log(\n      'decodeBorrow - isMax:',\n      isMax,\n      'inputIndex:',\n      inputIndex,\n      'inputValue:',\n      inputValue,\n      'MAX_U64.toString():',\n      MAX_U64.toString(),\n    );\n    if (isMax) {\n      value = MAX_U64.toString();\n    }\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.BORROW,\n      intentionData: {\n        coinType,\n        value,\n      } as BorrowIntentionData,\n    };\n  }\n\n  private decodeRepay(): DecodeResult {\n    const events = {\n      RepayEvent: this.simResult.events.find((event) => event.type.includes('lending_market::RepayEvent')),\n    };\n\n    const coinType = normalizeStructTag((events.RepayEvent.parsedJson as any).coin_type.name as string);\n    const value = (events.RepayEvent.parsedJson as any).liquidity_amount as string;\n    console.log('Decoder.decodeRepay', coinType, value);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.REPAY,\n      intentionData: {\n        coinType,\n        value,\n      } as RepayIntentionData,\n    };\n  }\n\n  private decodeClaim(): DecodeResult {\n    const events = {\n      ClaimReward: this.simResult.events.filter((event) => event.type.includes('lending_market::ClaimReward')),\n    };\n\n    const result: Record<string, string> = {};\n    for (let i = 0; i < events.ClaimReward.length; i++) {\n      const claimRewardEvent = events.ClaimReward[i];\n\n      const coinType = normalizeStructTag((claimRewardEvent.parsedJson as any).coin_type.name as string);\n      const value = (claimRewardEvent.parsedJson as any).liquidity_amount as string;\n\n      result[coinType] = `${+(result[coinType] ?? '0') + +value}`;\n    }\n    console.log('Decoder.decodeClaimRewards', result);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.CLAIM,\n      intentionData: {\n        value: result,\n      } as ClaimIntentionData,\n    };\n  }\n\n  private decodeClaimAndDeposit(): DecodeResult {\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.CLAIM_AND_DEPOSIT,\n      intentionData: this.decodeClaim().intentionData as ClaimAndDepositIntentionData,\n    };\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { BorrowIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\n\nexport class BorrowIntention extends SuilendBaseIntention<BorrowIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.BORROW;\n\n  constructor(public readonly data: BorrowIntentionData) {\n    super(data);\n  }\n\n  async build(input: IntentionInput): Promise<Transaction> {\n    const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n    console.log('BorrowIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n    if (!obligationOwnerCap || !obligation) {\n      throw new Error('Obligation not found');\n    }\n\n    const transaction = new Transaction();\n    await suilendClient.borrowAndSendToUser(\n      account.address,\n      obligationOwnerCap.id,\n      obligation.id,\n      this.data.coinType,\n      this.data.value,\n      transaction,\n    );\n\n    return transaction;\n  }\n\n  static fromData(data: BorrowIntentionData) {\n    console.log('BorrowIntention.fromData', data);\n    return new BorrowIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nexport abstract class SuilendBaseIntention<D> implements BaseIntention<D> {\n  abstract txType: TransactionType;\n\n  abstract txSubType: string;\n\n  protected constructor(public readonly data: D) {}\n\n  abstract build(input: IntentionInput): Promise<Transaction>;\n\n  serialize() {\n    return JSON.stringify(sortKeys(this.data));\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { ClaimIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\nimport getRewards from '../utils/getRewards';\n\nexport class ClaimIntention extends SuilendBaseIntention<ClaimIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.CLAIM;\n\n  constructor(public readonly data: ClaimIntentionData) {\n    super(data);\n  }\n\n  async build(input: IntentionInput): Promise<Transaction> {\n    const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n    console.log('ClaimIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n    if (!obligationOwnerCap || !obligation) {\n      throw new Error('Obligation not found');\n    }\n\n    const transaction = new Transaction();\n    suilendClient.claimRewardsAndSendToUser(\n      account.address,\n      obligationOwnerCap.id,\n      getRewards(suilendClient, obligation),\n      transaction,\n    );\n\n    return transaction;\n  }\n\n  static fromData(data: ClaimIntentionData) {\n    console.log('ClaimIntention.fromData', data);\n    return new ClaimIntention(data);\n  }\n}\n","import { normalizeStructTag } from '@mysten/sui/utils';\nimport { ClaimRewardsReward, Side, SuilendClient } from '@suilend/sdk';\nimport { Obligation } from '@suilend/sdk/_generated/suilend/obligation/structs';\nimport { isSendPoints } from '@suilend/sui-fe';\nimport BigNumber from 'bignumber.js';\n\nconst getRewards = (suilendClient: SuilendClient, obligation: Obligation<string>) => {\n  const rewardsMap: Record<Side, ClaimRewardsReward[]> = {\n    [Side.DEPOSIT]: [],\n    [Side.BORROW]: [],\n  };\n\n  suilendClient.lendingMarket.reserves.forEach((reserve) => {\n    [Side.DEPOSIT, Side.BORROW].forEach((side) => {\n      const reservePrm = side === Side.DEPOSIT ? reserve.depositsPoolRewardManager : reserve.borrowsPoolRewardManager;\n\n      const sideUrm = obligation.userRewardManagers.find((urm) => urm.poolRewardManagerId === reservePrm.id);\n      if (!sideUrm) {\n        return;\n      }\n\n      rewardsMap[side] = reservePrm.poolRewards\n        .map((pr, index) => ({\n          reserveArrayIndex: reserve.arrayIndex,\n          rewardIndex: BigInt(index),\n          rewardCoinType: normalizeStructTag(pr.coinType.name),\n          side,\n        }))\n        .filter(\n          (r) =>\n            !isSendPoints(r.rewardCoinType) &&\n            !!sideUrm.rewards[Number(r.rewardIndex)] &&\n            new BigNumber(sideUrm.rewards[Number(r.rewardIndex)].earnedRewards.value.toString()).gt(0),\n        );\n    });\n  });\n\n  return Object.values(rewardsMap).flat();\n};\n\nexport default getRewards;\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { ClaimAndDepositIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\nimport getRewards from '../utils/getRewards';\n\nexport class ClaimAndDepositIntention extends SuilendBaseIntention<ClaimAndDepositIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.CLAIM_AND_DEPOSIT;\n\n  constructor(public readonly data: ClaimAndDepositIntentionData) {\n    super(data);\n  }\n\n  async build(input: IntentionInput): Promise<Transaction> {\n    const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n    console.log('ClaimAndDepositIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n    if (!obligationOwnerCap || !obligation) {\n      throw new Error('Obligation not found');\n    }\n\n    const transaction = new Transaction();\n    suilendClient.claimRewardsAndDeposit(\n      account.address,\n      obligationOwnerCap.id,\n      getRewards(suilendClient, obligation),\n      transaction,\n    );\n\n    return transaction;\n  }\n\n  static fromData(data: ClaimAndDepositIntentionData) {\n    console.log('ClaimAndDepositIntention.fromData', data);\n    return new ClaimAndDepositIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { DepositIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\n\nexport class DepositIntention extends SuilendBaseIntention<DepositIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.DEPOSIT;\n\n  constructor(public readonly data: DepositIntentionData) {\n    super(data);\n  }\n\n  async build(input: IntentionInput): Promise<Transaction> {\n    const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n    console.log('DepositIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n    const transaction = new Transaction();\n    await suilendClient.depositIntoObligation(\n      account.address,\n      this.data.coinType,\n      this.data.value,\n      transaction,\n      obligationOwnerCap?.id,\n    );\n\n    return transaction;\n  }\n\n  static fromData(data: DepositIntentionData) {\n    console.log('DepositIntention.fromData', data);\n    return new DepositIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { RepayIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\n\nexport class RepayIntention extends SuilendBaseIntention<RepayIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.REPAY;\n\n  constructor(public readonly data: RepayIntentionData) {\n    super(data);\n  }\n\n  async build(input: IntentionInput): Promise<Transaction> {\n    const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n    console.log('RepayIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n    if (!obligationOwnerCap || !obligation) {\n      throw new Error('Obligation not found');\n    }\n\n    const transaction = new Transaction();\n    await suilendClient.repayIntoObligation(\n      account.address,\n      obligation.id,\n      this.data.coinType,\n      this.data.value,\n      transaction,\n    );\n\n    return transaction;\n  }\n\n  static fromData(data: RepayIntentionData) {\n    console.log('RepayIntention.fromData', data);\n    return new RepayIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { WithdrawIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\n\nexport class WithdrawIntention extends SuilendBaseIntention<WithdrawIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.WITHDRAW;\n\n  constructor(public readonly data: WithdrawIntentionData) {\n    super(data);\n  }\n\n  async build(input: IntentionInput): Promise<Transaction> {\n    const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n    console.log('WithdrawIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n    if (!obligationOwnerCap || !obligation) {\n      throw new Error('Obligation not found');\n    }\n\n    const transaction = new Transaction();\n    await suilendClient.withdrawAndSendToUser(\n      account.address,\n      obligationOwnerCap.id,\n      obligation.id,\n      this.data.coinType,\n      this.data.value,\n      transaction,\n    );\n\n    return transaction;\n  }\n\n  static fromData(data: WithdrawIntentionData) {\n    console.log('WithdrawIntention.fromData', data);\n    return new WithdrawIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { LstClient, convertLstsAndRebalanceAndSendToUser } from '@suilend/springsui-sdk';\n\nimport { ConvertIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class ConvertIntention extends SpringSuiBaseIntention<ConvertIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.CONVERT;\n\n  constructor(public readonly data: ConvertIntentionData) {\n    super(data);\n  }\n\n  async build(input: IntentionInput): Promise<Transaction> {\n    const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n    console.log(\n      'ConvertIntention.build',\n      suiClient,\n      account,\n      suilendClient,\n      LIQUID_STAKING_INFO_MAP,\n      obligationOwnerCap,\n      obligation,\n    );\n\n    const inLstClient = await LstClient.initialize(\n      suiClient,\n      Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.inCoinType),\n    );\n    const outLstClient = await LstClient.initialize(\n      suiClient,\n      Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.outCoinType),\n    );\n\n    //\n\n    const transaction = new Transaction();\n    convertLstsAndRebalanceAndSendToUser(inLstClient, outLstClient, transaction, account.address, this.data.amount);\n\n    return transaction;\n  }\n\n  static fromData(data: ConvertIntentionData) {\n    console.log('ConvertIntention.fromData', data);\n    return new ConvertIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nexport abstract class SpringSuiBaseIntention<D> implements BaseIntention<D> {\n  abstract txType: TransactionType;\n\n  abstract txSubType: string;\n\n  protected constructor(public readonly data: D) {}\n\n  abstract build(input: IntentionInput): Promise<Transaction>;\n\n  serialize() {\n    return JSON.stringify(sortKeys(this.data));\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { createObligationIfNoneExists, sendObligationToUser } from '@suilend/sdk';\nimport { LstClient, convertLstsAndRebalance } from '@suilend/springsui-sdk';\n\nimport { ConvertAndDepositIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class ConvertAndDepositIntention extends SpringSuiBaseIntention<ConvertAndDepositIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.CONVERT_AND_DEPOSIT;\n\n  constructor(public readonly data: ConvertAndDepositIntentionData) {\n    super(data);\n  }\n\n  async build(input: IntentionInput): Promise<Transaction> {\n    const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n    console.log(\n      'ConvertAndDepositIntention.build',\n      suiClient,\n      account,\n      suilendClient,\n      LIQUID_STAKING_INFO_MAP,\n      obligationOwnerCap,\n      obligation,\n    );\n\n    const inLstClient = await LstClient.initialize(\n      suiClient,\n      Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.inCoinType),\n    );\n    const outLstClient = await LstClient.initialize(\n      suiClient,\n      Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.outCoinType),\n    );\n\n    //\n\n    const transaction = new Transaction();\n\n    const { obligationOwnerCapId, didCreate } = createObligationIfNoneExists(\n      suilendClient,\n      transaction,\n      obligationOwnerCap,\n    );\n\n    const lstCoin = convertLstsAndRebalance(inLstClient, outLstClient, transaction, account.address, this.data.amount);\n    suilendClient.deposit(lstCoin, this.data.outCoinType, obligationOwnerCapId, transaction);\n\n    if (didCreate) {\n      sendObligationToUser(obligationOwnerCapId, account.address, transaction);\n    }\n\n    return transaction;\n  }\n\n  static fromData(data: ConvertAndDepositIntentionData) {\n    console.log('ConvertAndDepositIntention.fromData', data);\n    return new ConvertAndDepositIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { LstClient } from '@suilend/springsui-sdk';\n\nimport { StakeIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class StakeIntention extends SpringSuiBaseIntention<StakeIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.STAKE;\n\n  constructor(public readonly data: StakeIntentionData) {\n    super(data);\n  }\n\n  async build(input: IntentionInput): Promise<Transaction> {\n    const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n    console.log(\n      'StakeIntention.build',\n      suiClient,\n      account,\n      suilendClient,\n      LIQUID_STAKING_INFO_MAP,\n      obligationOwnerCap,\n      obligation,\n    );\n\n    const outLstClient = await LstClient.initialize(\n      suiClient,\n      Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.outCoinType),\n    );\n\n    //\n\n    const transaction = new Transaction();\n    outLstClient.mintAmountAndRebalanceAndSendToUser(transaction, account.address, this.data.amount);\n\n    return transaction;\n  }\n\n  static fromData(data: StakeIntentionData) {\n    console.log('StakeIntention.fromData', data);\n    return new StakeIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { createObligationIfNoneExists, sendObligationToUser } from '@suilend/sdk';\nimport { LstClient } from '@suilend/springsui-sdk';\n\nimport { StakeAndDepositIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class StakeAndDepositIntention extends SpringSuiBaseIntention<StakeAndDepositIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.STAKE_AND_DEPOSIT;\n\n  constructor(public readonly data: StakeAndDepositIntentionData) {\n    super(data);\n  }\n\n  async build(input: IntentionInput): Promise<Transaction> {\n    const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n    console.log(\n      'StakeAndDepositIntention.build',\n      suiClient,\n      account,\n      suilendClient,\n      LIQUID_STAKING_INFO_MAP,\n      obligationOwnerCap,\n      obligation,\n    );\n\n    const outLstClient = await LstClient.initialize(\n      suiClient,\n      Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.outCoinType),\n    );\n\n    //\n\n    const transaction = new Transaction();\n\n    const { obligationOwnerCapId, didCreate } = createObligationIfNoneExists(\n      suilendClient,\n      transaction,\n      obligationOwnerCap,\n    );\n\n    const lstCoin = outLstClient.mintAmountAndRebalance(transaction, account.address, this.data.amount);\n    suilendClient.deposit(lstCoin, this.data.outCoinType, obligationOwnerCapId, transaction);\n\n    if (didCreate) {\n      sendObligationToUser(obligationOwnerCapId, account.address, transaction);\n    }\n\n    return transaction;\n  }\n\n  static fromData(data: StakeAndDepositIntentionData) {\n    console.log('StakeAndDepositIntention.fromData', data);\n    return new StakeAndDepositIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { LstClient } from '@suilend/springsui-sdk';\n\nimport { UnstakeIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class UnstakeIntention extends SpringSuiBaseIntention<UnstakeIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.UNSTAKE;\n\n  constructor(public readonly data: UnstakeIntentionData) {\n    super(data);\n  }\n\n  async build(input: IntentionInput): Promise<Transaction> {\n    const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n    console.log(\n      'UnstakeIntention.build',\n      suiClient,\n      account,\n      suilendClient,\n      LIQUID_STAKING_INFO_MAP,\n      obligationOwnerCap,\n      obligation,\n    );\n\n    const inLstClient = await LstClient.initialize(\n      suiClient,\n      Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.inCoinType),\n    );\n\n    //\n\n    const transaction = new Transaction();\n    // inLstClient.redeemAmountAndSendToUser(transaction, account.address, this.data.amount);\n    inLstClient.redeemAmountAndRebalanceAndSendToUser(transaction, account.address, this.data.amount);\n\n    return transaction;\n  }\n\n  static fromData(data: UnstakeIntentionData) {\n    console.log('UnstakeIntention.fromData', data);\n    return new UnstakeIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { MintIntention } from './intentions/mint';\nimport { RedeemIntention } from './intentions/redeem';\nimport { MintIntentionData, RedeemIntentionData, StSuiIntentionData, TransactionSubType } from './types';\n\nexport type StSuiIntention = MintIntention | RedeemIntention;\n\nexport class StSuiHelper implements IAppHelperInternal<StSuiIntentionData> {\n  application = 'stsui';\n\n  supportSDK = '@mysten/sui' as const;\n\n  async deserialize(input: {\n    transaction: Transaction;\n    chain: IdentifierString;\n    network: SuiNetworks;\n    suiClient: SuiClient;\n    account: WalletAccount;\n    appContext?: any;\n  }): Promise<{ txType: TransactionType; txSubType: string; intentionData: StSuiIntentionData }> {\n    const { transaction, suiClient } = input;\n\n    const simResult = await suiClient.devInspectTransactionBlock({\n      sender: transaction.getData().sender,\n      transactionBlock: transaction,\n    });\n    console.log('StSuiHelper Sim result - ', simResult);\n\n    const decoder = new Decoder(transaction, simResult);\n    const result = decoder.decode();\n\n    return {\n      txType: TransactionType.Other,\n      txSubType: result.type,\n      intentionData: result.intentionData,\n    };\n  }\n\n  async build(input: {\n    intentionData: StSuiIntentionData;\n    txType: TransactionType;\n    txSubType: string;\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { account } = input;\n    console.log('StSui build transaction type', input.txSubType);\n\n    let intention: StSuiIntention;\n    switch (input.txSubType) {\n      case TransactionSubType.MINT:\n        intention = MintIntention.fromData(input.intentionData as MintIntentionData);\n        break;\n      case TransactionSubType.REDEEM:\n        intention = RedeemIntention.fromData(input.intentionData as RedeemIntentionData);\n        break;\n      default:\n        throw new Error('build not implemented');\n    }\n\n    return intention.build({ account });\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { DevInspectResults } from '@/compat/mysten-sui-json-rpc';\n\nimport { MintIntentionData, RedeemIntentionData, StSuiIntentionData, TransactionSubType } from './types';\n\ntype DecodeResult = {\n  txType: TransactionType;\n  type: TransactionSubType;\n  intentionData: StSuiIntentionData;\n};\n\ntype MintEventType = {\n  event: {\n    sui_amount_in: string;\n  };\n};\n\ntype RedeemEventType = {\n  event: {\n    lst_amount_in: string;\n  };\n};\n\nexport class Decoder {\n  constructor(\n    public readonly transaction: Transaction,\n    public readonly simResult: DevInspectResults,\n  ) {}\n\n  /**\n   * Entry point for decoding the transaction. Determines the type of transaction\n   * and calls the appropriate decode method.\n   */\n  decode(): DecodeResult {\n    if (this.isMintTransaction()) {\n      const liquidityChangeEvent = this.getLiquidityChangeEvent('MintEvent');\n      if (!liquidityChangeEvent) {\n        throw new Error('No liquidity change event found. Unable to decode transaction.');\n      }\n\n      const eventData = liquidityChangeEvent.parsedJson as MintEventType;\n      console.log('Decoder event data - ', eventData);\n\n      return this.decodeMint(eventData);\n    }\n\n    if (this.isRedeemTransaction()) {\n      const liquidityChangeEvent = this.getLiquidityChangeEvent('RedeemEvent');\n      if (!liquidityChangeEvent) {\n        throw new Error('No liquidity change event found. Unable to decode transaction.');\n      }\n\n      const eventData = liquidityChangeEvent.parsedJson as RedeemEventType;\n      console.log('Decoder event data - ', eventData);\n\n      return this.decodeRedeem(eventData);\n    }\n\n    throw new Error(`Unknown transaction type`);\n  }\n\n  // ---- Private Helpers ----\n\n  private get commands() {\n    return this.transaction.getData().commands;\n  }\n\n  private getMoveCallCommand(fn: string) {\n    return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n  }\n\n  private getLiquidityChangeEvent(arg: string) {\n    return this.simResult.events.find((event) => this.isLiquidityChangeEventType(event.type, arg));\n  }\n\n  // is*\n\n  private isLiquidityChangeEventType(eventType: string, arg: string) {\n    return eventType.includes(arg);\n  }\n\n  private isMintTransaction() {\n    return !!this.getMoveCallCommand('mint');\n  }\n\n  private isRedeemTransaction() {\n    return !!this.getMoveCallCommand('redeem');\n  }\n\n  // ---- Decode Methods ----\n\n  private decodeMint(eventData: MintEventType): DecodeResult {\n    const {\n      event: { sui_amount_in: amount },\n    } = eventData;\n    console.log('Decoder.decodeMint', amount);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.MINT,\n      intentionData: {\n        amount,\n      } as MintIntentionData,\n    };\n  }\n\n  private decodeRedeem(eventData: RedeemEventType): DecodeResult {\n    const {\n      event: { lst_amount_in: amount },\n    } = eventData;\n    console.log('Decoder.decodeRedeem', amount);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.REDEEM,\n      intentionData: {\n        amount,\n      } as RedeemIntentionData,\n    };\n  }\n}\n","import { LST, LstParams } from '@alphafi/stsui-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { MintIntentionData, TransactionSubType } from '../types';\n\nexport class MintIntention extends BaseIntention<MintIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.MINT;\n\n  constructor(public readonly data: MintIntentionData) {\n    super(data);\n  }\n\n  async build(input: { account: WalletAccount }): Promise<Transaction> {\n    const { account } = input;\n    const { amount } = this.data;\n    const lstParams: LstParams = {\n      lstInfo: '0x1adb343ab351458e151bc392fbf1558b3332467f23bda45ae67cd355a57fd5f5',\n      lstCointype: '0xd1b72982e40348d069bb1ff701e634c117bb5f741f44dff91e472d3b01461e55::stsui::STSUI',\n    };\n    const lst = new LST(lstParams);\n    const txb = await lst.mint(amount, account.address);\n    txb.setGasBudget(100_000_000);\n    return txb;\n  }\n\n  static fromData(data: MintIntentionData) {\n    console.log('MintIntention.fromData', data);\n    return new MintIntention(data);\n  }\n}\n","import { LST, LstParams } from '@alphafi/stsui-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { RedeemIntentionData, TransactionSubType } from '../types';\n\nexport class RedeemIntention extends BaseIntention<RedeemIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.REDEEM;\n\n  constructor(public readonly data: RedeemIntentionData) {\n    super(data);\n  }\n\n  async build(input: { account: WalletAccount }): Promise<Transaction> {\n    const { account } = input;\n    const { amount } = this.data;\n    const lstParams: LstParams = {\n      lstInfo: '0x1adb343ab351458e151bc392fbf1558b3332467f23bda45ae67cd355a57fd5f5',\n      lstCointype: '0xd1b72982e40348d069bb1ff701e634c117bb5f741f44dff91e472d3b01461e55::stsui::STSUI',\n    };\n    const lst = new LST(lstParams);\n    const txb = await lst.redeem(amount, account.address);\n    txb.setGasBudget(100_000_000);\n    return txb;\n  }\n\n  static fromData(data: RedeemIntentionData) {\n    console.log('RedeemIntention.fromData', data);\n    return new RedeemIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\n// eslint-disable-next-line import/no-cycle\nimport { IAppHelperInternalGrpc } from '@/apps/interface/sui-grpc';\n\nimport { Decoder } from './decoder';\nimport { AddLiquidityIntention } from './intentions/add-liquidity';\nimport { BurnIntention } from './intentions/burn';\nimport { CollectFeeIntention } from './intentions/collect-fee';\nimport { CollectRewardIntention } from './intentions/collect-reward';\nimport { CreatePoolIntention } from './intentions/create-pool';\nimport { DecreaseLiquidityIntention } from './intentions/decrease-liquidity';\nimport { DecreaseLiquidityWithReturnIntention } from './intentions/decrease-liquidity-with-return';\nimport { IncreaseLiquidityIntention } from './intentions/increase-liquidity';\nimport { PrixClaimIntention } from './intentions/prix-claim';\nimport { PrixJoinIntention } from './intentions/prix-join';\nimport { RemoveLiquidityIntention } from './intentions/remove-liquidity';\nimport { RemoveLiquidityWithReturnIntention } from './intentions/remove-liquidity-with-return';\nimport { SwapIntention } from './intentions/swap';\nimport { SwapExactBaseForQuoteIntention } from './intentions/swap-exact-base-for-quote';\nimport { SwapExactQuoteForBaseIntention } from './intentions/swap-exact-quote-for-base';\nimport {\n  AddLiquidityIntentionData,\n  BurnIntentionData,\n  CollectFeeIntentionData,\n  CollectRewardIntentionData,\n  CreatePoolIntentionData,\n  DecreaseLiquidityIntentionData,\n  DecreaseLiquidityWithReturnIntentionData,\n  IncreaseLiquidityIntentionData,\n  PrixClaimIntentionData,\n  PrixJoinIntentionData,\n  RemoveLiquidityIntentionData,\n  RemoveLiquidityWithReturnIntentionData,\n  SuiNetworks,\n  SwapExactBaseForQuoteIntentionData,\n  SwapExactQuoteForBaseIntentionData,\n  SwapIntentionData,\n  TransactionSubType,\n  TURBOSIntentionData,\n} from './types';\n\nexport type TURBOSIntention =\n  | CreatePoolIntention\n  | AddLiquidityIntention\n  | IncreaseLiquidityIntention\n  | DecreaseLiquidityIntention\n  | DecreaseLiquidityWithReturnIntention\n  | CollectFeeIntention\n  | CollectRewardIntention\n  | RemoveLiquidityIntention\n  | RemoveLiquidityWithReturnIntention\n  | BurnIntention\n  | SwapIntention\n  | PrixClaimIntention\n  | PrixJoinIntention\n  | SwapExactQuoteForBaseIntention\n  | SwapExactBaseForQuoteIntention;\n\nexport class TURBOSAppHelper implements IAppHelperInternalGrpc<TURBOSIntentionData> {\n  application = 'turbos';\n\n  supportSDK = '@mysten/sui-v2' as const;\n\n  async deserialize(input: {\n    transaction: Transaction;\n    chain: IdentifierString;\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    action?: string;\n    txbParams?: any;\n  }): Promise<{\n    txType: TransactionType;\n    txSubType: string;\n    intentionData: TURBOSIntentionData;\n  }> {\n    console.log(input, 'input');\n    const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiGrpcClient);\n    const contract = await turbosSdk.contract.getConfig();\n    const { transaction, account } = input;\n    const decoder = new Decoder(transaction, turbosSdk, contract);\n    const result = await decoder.decode(account.address);\n    return {\n      txType: TransactionType.Other,\n      txSubType: result.type,\n      intentionData: result.intentionData,\n    };\n  }\n\n  async build(input: {\n    intentionData: TURBOSIntentionData;\n    txType: TransactionType;\n    txSubType: string;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    console.log(input.intentionData, 'intentionData');\n\n    let intention: TURBOSIntention;\n    switch (input.txSubType) {\n      case TransactionSubType.CreatePool:\n        intention = CreatePoolIntention.fromData(input.intentionData as CreatePoolIntentionData);\n        break;\n      case TransactionSubType.AddLiquidity:\n        intention = AddLiquidityIntention.fromData(input.intentionData as AddLiquidityIntentionData);\n        break;\n      case TransactionSubType.IncreaseLiquidity:\n        intention = IncreaseLiquidityIntention.fromData(input.intentionData as IncreaseLiquidityIntentionData);\n        break;\n      case TransactionSubType.DecreaseLiquidity:\n        intention = DecreaseLiquidityIntention.fromData(input.intentionData as DecreaseLiquidityIntentionData);\n        break;\n      case TransactionSubType.DecreaseLiquidityWithReturn:\n        intention = DecreaseLiquidityWithReturnIntention.fromData(\n          input.intentionData as DecreaseLiquidityWithReturnIntentionData,\n        );\n        break;\n      case TransactionSubType.RemoveLiquidity:\n        intention = RemoveLiquidityIntention.fromData(input.intentionData as RemoveLiquidityIntentionData);\n        break;\n      case TransactionSubType.RemoveLiquidityWithReturn:\n        intention = RemoveLiquidityWithReturnIntention.fromData(\n          input.intentionData as RemoveLiquidityWithReturnIntentionData,\n        );\n        break;\n      case TransactionSubType.CollectFee:\n        intention = CollectFeeIntention.fromData(input.intentionData as CollectFeeIntentionData);\n        break;\n      case TransactionSubType.CollectReward:\n        intention = CollectRewardIntention.fromData(input.intentionData as CollectRewardIntentionData);\n        break;\n      case TransactionSubType.Burn:\n        intention = BurnIntention.fromData(input.intentionData as BurnIntentionData);\n        break;\n      case TransactionSubType.Swap:\n        intention = SwapIntention.fromData(input.intentionData as SwapIntentionData);\n        break;\n      case TransactionSubType.PrixJoin:\n        intention = PrixJoinIntention.fromData(input.intentionData as PrixJoinIntentionData);\n        break;\n      case TransactionSubType.PrixClaim:\n        intention = PrixClaimIntention.fromData(input.intentionData as PrixClaimIntentionData);\n        break;\n      case TransactionSubType.SwapExactBaseForQuote:\n        intention = SwapExactBaseForQuoteIntention.fromData(input.intentionData as SwapExactBaseForQuoteIntentionData);\n        break;\n      case TransactionSubType.SwapExactQuoteForBase:\n        intention = SwapExactQuoteForBaseIntention.fromData(input.intentionData as SwapExactQuoteForBaseIntentionData);\n        break;\n\n      default:\n        throw new Error('not implemented');\n    }\n    return intention.build({ suiGrpcClient, account, network });\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { fromBase64 } from '@mysten/bcs';\nimport { bcs } from '@mysten/sui/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { BN, Contract, TurbosSdk, Decimal } from 'turbos-clmm-sdk';\n\nimport { deepbookConfig, prixConfig } from './config';\nimport { TransactionSubType, TURBOSIntentionData } from './types';\n\ntype GetDataReturnType = ReturnType<Transaction['getData']>;\nexport type TransactionInputs = GetDataReturnType['inputs'];\nexport type TransactionCommands = GetDataReturnType['commands'];\nexport type TransactionCommand = TransactionCommands[number];\n\ntype DecodeResult = {\n  txType: TransactionType;\n  type: TransactionSubType;\n  intentionData: TURBOSIntentionData;\n};\n\nconst getAtoB = (layer: 0 | 1, target: string, swap1Layer: string[], swap2Layer: string[]): boolean[] => {\n  if (layer === 1) {\n    const index = swap2Layer.findIndex((item) => item === target);\n    switch (index) {\n      case 0:\n        return [true, true];\n      case 1:\n        return [true, false];\n      case 2:\n        return [false, true];\n      case 3:\n        return [false, false];\n      default:\n        throw new Error(`not target: ${target}`);\n    }\n  }\n  const index = swap1Layer.findIndex((item) => item === target);\n  switch (index) {\n    case 0:\n      return [true];\n    case 1:\n      return [false];\n    default:\n      throw new Error(`not target: ${target}`);\n  }\n};\n\nexport class Decoder {\n  constructor(\n    public readonly txb: Transaction,\n    public readonly turbosSdk: TurbosSdk,\n    public readonly config: Contract.Config,\n  ) {}\n\n  private get transactions() {\n    return this.txb.getData().commands;\n  }\n\n  private get swap1Layer() {\n    return [`${this.config.PackageId}::swap_router::swap_a_b`, `${this.config.PackageId}::swap_router::swap_b_a`];\n  }\n\n  private get swap2Layer() {\n    return [\n      `${this.config.PackageId}::swap_router::swap_a_b_b_c`,\n      `${this.config.PackageId}::swap_router::swap_a_b_c_b`,\n      `${this.config.PackageId}::swap_router::swap_b_a_b_c`,\n      `${this.config.PackageId}::swap_router::swap_b_a_c_b`,\n    ];\n  }\n\n  async decode(address: string) {\n    if (this.isSwapTransaction()) {\n      return this.decodeSwap();\n    }\n\n    if (this.isAddLiquidityTransaction()) {\n      return this.decodeAddLiquidity();\n    }\n\n    if (this.isIncreaseLiquidityTransaction()) {\n      return this.decodeIncreaseLiquidity(address);\n    }\n\n    if (this.isRemoveLiquidityTransaction()) {\n      return this.decodeRemoveLiquidity(address);\n    }\n\n    if (this.isDecreaseLiquidityTransaction()) {\n      return this.decodeDecreaseLiquidity(address);\n    }\n\n    if (this.isRemoveLiquidityWithReturnTransaction()) {\n      return this.decodeRemoveLiquidityWithReturn(address);\n    }\n\n    if (this.isDecreaseLiquidityWithReturnTransaction()) {\n      return this.decodeDecreaseLiquidityWithReturn(address);\n    }\n\n    if (this.isCollectFeeTransaction()) {\n      return this.decodeCollectFee();\n    }\n\n    if (this.isCollectRewardTransaction()) {\n      return this.decodeCollectReward();\n    }\n\n    if (this.isBurnTransaction()) {\n      return this.decodeBurn();\n    }\n\n    if (this.isPrixClaimTransaction()) {\n      return this.decodePrixClaim();\n    }\n\n    if (this.isPrixJoinTransaction()) {\n      return this.decodePrixJoin();\n    }\n\n    if (this.isSwapExactBaseForQuoteTransaction()) {\n      return this.decodeSwapExactBaseForQuote();\n    }\n\n    if (this.isSwapExactQuoteForBaseTransaction()) {\n      return this.decodeSwapExactQuoteForBase();\n    }\n\n    throw new Error(`Unknown transaction type`);\n  }\n\n  private getMoveCallTransaction(target: string) {\n    return this.transactions.find((trans) => {\n      if (trans.$kind === 'MoveCall') {\n        const moveCallTarget = `${trans.MoveCall.package}::${trans.MoveCall.module}::${trans.MoveCall.function}`;\n        return moveCallTarget === target;\n      }\n      return false;\n    });\n  }\n\n  private getMoveCallsTransaction(targets: string[]) {\n    return targets.every((target) =>\n      this.transactions.find((trans) => {\n        if (trans.$kind === 'MoveCall') {\n          const moveCallTarget = `${trans.MoveCall.package}::${trans.MoveCall.module}::${trans.MoveCall.function}`;\n          return moveCallTarget === target;\n        }\n        return false;\n      }),\n    );\n  }\n\n  private getSwapMoveCallTransaction(targets: string[]) {\n    return this.transactions.find((trans) => {\n      if (trans.$kind === 'MoveCall') {\n        const moveCallTarget = `${trans.MoveCall.package}::${trans.MoveCall.module}::${trans.MoveCall.function}`;\n        return !!targets.includes(moveCallTarget);\n      }\n      return false;\n    });\n  }\n\n  private isSwapTransaction() {\n    return !!this.getSwapMoveCallTransaction([...this.swap1Layer, ...this.swap2Layer]);\n  }\n\n  private isAddLiquidityTransaction() {\n    return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::mint`);\n  }\n\n  private isIncreaseLiquidityTransaction() {\n    return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::increase_liquidity`);\n  }\n\n  private isDecreaseLiquidityTransaction() {\n    return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::decrease_liquidity`);\n  }\n\n  private isDecreaseLiquidityWithReturnTransaction() {\n    return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::decrease_liquidity_with_return_`);\n  }\n\n  private isCollectFeeTransaction() {\n    return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::collect`);\n  }\n\n  private isCollectRewardTransaction() {\n    return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::collect_reward`);\n  }\n\n  private isBurnTransaction() {\n    return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::burn`);\n  }\n\n  private isPrixJoinTransaction() {\n    return !!this.getMoveCallTransaction(`${prixConfig.PackageId}::claim::join`);\n  }\n\n  private isPrixClaimTransaction() {\n    return !!this.getMoveCallTransaction(`${prixConfig.PackageId}::claim::claim`);\n  }\n\n  private isRemoveLiquidityTransaction() {\n    return !!this.getMoveCallsTransaction([\n      `${this.config.PackageId}::position_manager::decrease_liquidity`,\n      `${this.config.PackageId}::position_manager::burn`,\n    ]);\n  }\n\n  private isRemoveLiquidityWithReturnTransaction() {\n    return !!this.getMoveCallsTransaction([\n      `${this.config.PackageId}::position_manager::decrease_liquidity_with_return_`,\n      `${this.config.PackageId}::position_manager::burn`,\n    ]);\n  }\n\n  private isSwapExactBaseForQuoteTransaction() {\n    return !!this.getMoveCallTransaction(`${deepbookConfig.PackageId}::clob_v2::swap_exact_base_for_quote`);\n  }\n\n  private isSwapExactQuoteForBaseTransaction() {\n    return !!this.getMoveCallTransaction(`${deepbookConfig.PackageId}::clob_v2::swap_exact_quote_for_base`);\n  }\n\n  private async decodeSwap(): Promise<DecodeResult> {\n    const moveCall = this.transactions.find((trans) => trans.$kind === 'MoveCall');\n    let layer: 0 | 1 = 0;\n    const moveCallTarget = `${moveCall.MoveCall.package}::${moveCall.MoveCall.module}::${moveCall.MoveCall.function}`;\n    console.log(moveCallTarget, 'moveCallTarget');\n    if (this.swap2Layer.includes(moveCallTarget)) {\n      layer = 1;\n    }\n\n    const atob = getAtoB(layer, moveCallTarget, this.swap1Layer, this.swap2Layer);\n\n    const routes = atob.map((item, index) => {\n      const pool = this.helper.decodeSharedObjectId(this.helper.getInputsIndex(index));\n      const sqrtPrice = this.helper.decodeInputU128(this.helper.getInputsIndex(4 + index + layer));\n      const nextTickIndex = this.turbosSdk.math.sqrtPriceX64ToTickIndex(new BN(sqrtPrice.toString()));\n\n      return {\n        pool,\n        a2b: item,\n        nextTickIndex,\n      };\n    });\n\n    // eslint-disable-next-line no-nested-ternary\n    const coinTypeA = atob[0]\n      ? moveCall.MoveCall.typeArguments[0]\n      : layer === 1\n        ? moveCall.MoveCall.typeArguments[0]\n        : moveCall.MoveCall.typeArguments[1];\n    const coinTypeB =\n      // eslint-disable-next-line no-nested-ternary\n      layer === 1\n        ? moveCall.MoveCall.typeArguments[4]\n        : atob[0]\n          ? moveCall.MoveCall.typeArguments[1]\n          : moveCall.MoveCall.typeArguments[0];\n\n    const address = this.helper.decodeInputAddress(this.helper.getInputsIndex(6 + 2 * layer));\n    const deadline = this.helper.decodeInputU64(this.helper.getInputsIndex(7 + 2 * layer));\n    const amountSpecifiedIsInput = this.helper.decodeInputBool(this.helper.getInputsIndex(5 + 2 * layer));\n    const amountA = this.helper.decodeInputU64(this.helper.getInputsIndex(2 + layer));\n    const amountB = this.helper.decodeInputU64(this.helper.getInputsIndex(3 + layer));\n\n    // const result = await this.turbosSdk.trade.computeSwapResultV2({\n    //   pools: [{ pool: routes[0].pool, a2b: routes[0].a2b, amountSpecified: amountA }],\n    //   address,\n    //   amountSpecifiedIsInput,\n    // });\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.Swap,\n      intentionData: {\n        routes,\n        coinTypeA,\n        coinTypeB,\n        address,\n        amountA: amountSpecifiedIsInput ? amountA : amountB,\n        amountB: amountSpecifiedIsInput ? amountB : amountA,\n        amountSpecifiedIsInput,\n        slippage: '0.1',\n        deadline,\n      },\n    };\n  }\n\n  private decodeAddLiquidity(): DecodeResult {\n    console.log(this.helper, 'decodeAddLiquidity this.helper');\n    const pool = this.helper.decodeSharedObjectId(this.helper.getInputsIndex(0));\n    const address = this.helper.decodeInputAddress(this.helper.getInputsIndex(12));\n\n    const amountA = this.helper.decodeInputU64(this.helper.getInputsIndex(8));\n    const amountB = this.helper.decodeInputU64(this.helper.getInputsIndex(9));\n    const tickLower = this.helper.decodeInputU32(this.helper.getInputsIndex(4));\n    const tickLowerIsNeg = this.helper.decodeInputBool(this.helper.getInputsIndex(5));\n    const tickUpper = this.helper.decodeInputU32(this.helper.getInputsIndex(6));\n    const tickUpperIsNeg = this.helper.decodeInputBool(this.helper.getInputsIndex(7));\n\n    const deadline = this.helper.decodeInputU64(this.helper.getInputsIndex(13));\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.AddLiquidity,\n      intentionData: {\n        pool,\n        slippage: 30,\n        address,\n        amountA,\n        amountB,\n        tickLower: tickLowerIsNeg ? -tickLower : tickLower,\n        tickUpper: tickUpperIsNeg ? -tickUpper : tickUpper,\n        deadline,\n      },\n    };\n  }\n\n  private decodeIncreaseLiquidity(address: string): DecodeResult {\n    console.log(this.helper, 'decodeIncreaseLiquidity this.helper');\n\n    const pool = this.helper.decodeSharedObjectId(this.helper.getInputsIndex(0));\n    const nft = this.helper.decodeOwnedObjectId(this.helper.getInputsIndex(4));\n    const amountA = this.helper.decodeInputU64(this.helper.getInputsIndex(5));\n    const amountB = this.helper.decodeInputU64(this.helper.getInputsIndex(6));\n\n    const deadline = this.helper.decodeInputU64(this.helper.getInputsIndex(9));\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.IncreaseLiquidity,\n      intentionData: {\n        pool,\n        slippage: 30,\n        address,\n        amountA,\n        amountB,\n        nft,\n        deadline,\n      },\n    };\n  }\n\n  private decodeDecreaseLiquidity(address: string): DecodeResult {\n    console.log(this.helper, 'decodeDecreaseLiquidity this.helper');\n    const pool = this.helper.decodeSharedObjectId(this.helper.getInputsIndex(0));\n    const nft = this.helper.decodeOwnedObjectId(this.helper.getInputsIndex(2));\n    const decreaseLiquidity = this.helper.decodeInputU64(this.helper.getInputsIndex(3));\n    const amountA = this.helper.decodeInputU64(this.helper.getInputsIndex(4));\n    const amountB = this.helper.decodeInputU64(this.helper.getInputsIndex(5));\n\n    const deadline = this.helper.decodeInputU64(this.helper.getInputsIndex(6));\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.DecreaseLiquidity,\n      intentionData: {\n        pool,\n        decreaseLiquidity,\n        nft,\n        amountA,\n        amountB,\n        slippage: 10, // DO NOT use slippage by user setting for now.\n        address,\n        deadline,\n      },\n    };\n  }\n\n  private decodeDecreaseLiquidityWithReturn(address: string): DecodeResult {\n    console.log(this.helper, 'decodeDecreaseLiquidityWithReturn this.helper');\n    const pool = this.helper.decodeSharedObjectId(0);\n    const nft = this.helper.decodeOwnedObjectId(2);\n    const decreaseLiquidity = this.helper.decodeInputU64(3);\n    const amountA = this.helper.decodeInputU64(4);\n    const amountB = this.helper.decodeInputU64(5);\n\n    const deadline = this.helper.decodeInputU64(6);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.DecreaseLiquidityWithReturn,\n      intentionData: {\n        pool,\n        decreaseLiquidity,\n        nft,\n        amountA,\n        amountB,\n        slippage: 10, // DO NOT use slippage by user setting for now.\n        address,\n        deadline,\n      },\n    };\n  }\n\n  private decodeCollectFee(): DecodeResult {\n    console.log(this.helper, 'decodeCollectFee this.helper');\n    const pool = this.helper.decodeSharedObjectId(this.helper.getInputsIndex(0));\n    const nft = this.helper.decodeOwnedObjectId(this.helper.getInputsIndex(2));\n    const address = this.helper.decodeInputAddress(this.helper.getInputsIndex(5));\n    const collectAmountA = this.helper.decodeInputU64(this.helper.getInputsIndex(3));\n    const collectAmountB = this.helper.decodeInputU64(this.helper.getInputsIndex(4));\n\n    const deadline = this.helper.decodeInputU64(this.helper.getInputsIndex(6));\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.CollectFee,\n      intentionData: {\n        pool,\n        address,\n        collectAmountA,\n        collectAmountB,\n        nft,\n        deadline,\n      },\n    };\n  }\n\n  private decodeCollectReward(): DecodeResult {\n    console.log(this.helper, 'decodeCollectReward this.helper');\n    const pool = this.helper.decodeSharedObjectId(this.helper.getInputsIndex(0));\n    const nft = this.helper.decodeOwnedObjectId(this.helper.getInputsIndex(2));\n    const address = this.helper.decodeInputAddress(this.helper.getInputsIndex(6));\n\n    const rewardAmounts: (number | string)[] = [0, 0, 0];\n    this.collectRewardHelper.forEach((helper) => {\n      const index = helper.decodeInputU64(helper.getInputsIndex(4));\n      const value = helper.decodeInputU64(helper.getInputsIndex(5));\n      rewardAmounts[index as number] = value;\n    });\n    const deadline = this.helper.decodeInputU64(7);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.CollectReward,\n      intentionData: {\n        pool,\n        address,\n        rewardAmounts,\n        nft,\n        deadline,\n      },\n    };\n  }\n\n  private decodeBurn(): DecodeResult {\n    console.log(this.helper, 'decodeBurn this.helper');\n    const pool = this.helper.decodeSharedObjectId(this.helper.getInputsIndex(0));\n    const nft = this.helper.decodeOwnedObjectId(this.helper.getInputsIndex(2));\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.Burn,\n      intentionData: {\n        pool,\n        nft,\n      },\n    };\n  }\n\n  private decodeRemoveLiquidity(address: string): DecodeResult {\n    console.log(this.helper, 'decodeRemoveLiquidity this.helper');\n    const slippage = 30;\n    const pool = this.decreaseLiquidityHelper.decodeSharedObjectId(this.decreaseLiquidityHelper.getInputsIndex(0));\n    const nft = this.decreaseLiquidityHelper.decodeOwnedObjectId(this.decreaseLiquidityHelper.getInputsIndex(2));\n    const decreaseLiquidity = this.decreaseLiquidityHelper.decodeInputU64(\n      this.decreaseLiquidityHelper.getInputsIndex(3),\n    );\n    const amountA = this.decreaseLiquidityHelper.decodeInputU64(this.decreaseLiquidityHelper.getInputsIndex(4));\n    const amountB = this.decreaseLiquidityHelper.decodeInputU64(this.decreaseLiquidityHelper.getInputsIndex(5));\n\n    const deadline = this.decreaseLiquidityHelper.decodeInputU64(this.decreaseLiquidityHelper.getInputsIndex(6));\n    const rewardAmounts = [0, 0, 0];\n    this.collectRewardHelper.forEach((helper) => {\n      const index = helper.decodeInputU64(helper.getInputsIndex(4));\n      const value = helper.decodeInputU64(helper.getInputsIndex(5));\n      rewardAmounts[index] = value;\n    });\n    const collectAmountA = this.collectFeeHelper.decodeInputU64(this.collectFeeHelper.getInputsIndex(3)) || 0;\n    const collectAmountB = this.collectFeeHelper.decodeInputU64(this.collectFeeHelper.getInputsIndex(4)) || 0;\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.RemoveLiquidity,\n      intentionData: {\n        pool,\n        decreaseLiquidity,\n        nft,\n        amountA: ((amountA / (100 - slippage)) * 100).toFixed(0),\n        amountB: ((amountB / (100 - slippage)) * 100).toFixed(0),\n        slippage,\n        address,\n        collectAmountA,\n        collectAmountB,\n        rewardAmounts,\n        deadline,\n      },\n    };\n  }\n\n  private decodeRemoveLiquidityWithReturn(address: string): DecodeResult {\n    console.log(this.helper, 'decodeRemoveLiquidityWithReturn this.helper');\n    const pool = this.decreaseLiquidityHelper.decodeSharedObjectId(0);\n    const nft = this.decreaseLiquidityHelper.decodeOwnedObjectId(2);\n    const decreaseLiquidity = this.decreaseLiquidityHelper.decodeInputU64(3);\n    const amountA = this.decreaseLiquidityHelper.decodeInputU64(4);\n    const amountB = this.decreaseLiquidityHelper.decodeInputU64(5);\n\n    const deadline = this.decreaseLiquidityHelper.decodeInputU64(6);\n    const rewardAmounts = this.collectRewardHelper.map((helper) => helper.decodeInputU64(5));\n\n    const collectAmountA = this.collectFeeHelper.decodeInputU64(3) || 0;\n    const collectAmountB = this.collectFeeHelper.decodeInputU64(4) || 0;\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.RemoveLiquidityWithReturn,\n      intentionData: {\n        pool,\n        decreaseLiquidity,\n        nft,\n        amountA,\n        amountB,\n        slippage: 10,\n        address,\n        collectAmountA,\n        collectAmountB,\n        rewardAmounts,\n        deadline,\n      },\n    };\n  }\n\n  private decodePrixClaim(): DecodeResult {\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.PrixClaim,\n      intentionData: {},\n    };\n  }\n\n  private decodePrixJoin(): DecodeResult {\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.PrixJoin,\n      intentionData: {},\n    };\n  }\n\n  private decodeSwapExactBaseForQuote(): DecodeResult {\n    const poolId = this.swapExactBaseForQuoteHelper.decodeSharedObjectId(0);\n    const amountIn = this.swapExactBaseForQuoteHelper.decodeInputU64(3);\n    const token1 = this.swapExactBaseForQuoteHelper.shortTypeArg(0);\n    const token2 = this.swapExactBaseForQuoteHelper.shortTypeArg(1);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.SwapExactBaseForQuote,\n      intentionData: {\n        poolId,\n        amountIn,\n        token1,\n        token2,\n      },\n    };\n  }\n\n  private decodeSwapExactQuoteForBase(): DecodeResult {\n    const poolId = this.swapExactQuoteForBaseHelper.decodeSharedObjectId(0);\n    const amountIn = this.swapExactQuoteForBaseHelper.decodeInputU64(3);\n    const token1 = this.swapExactQuoteForBaseHelper.shortTypeArg(0);\n    const token2 = this.swapExactQuoteForBaseHelper.shortTypeArg(1);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.SwapExactQuoteForBase,\n      intentionData: {\n        poolId,\n        amountIn,\n        token1,\n        token2,\n      },\n    };\n  }\n\n  private get helper() {\n    const moveCall = this.transactions.find((trans) => {\n      if (trans.$kind === 'MoveCall') {\n        const moveCallTarget = `${trans.MoveCall.package}::${trans.MoveCall.module}::${trans.MoveCall.function}`;\n        return (\n          moveCallTarget !== '0x2::coin::zero' &&\n          moveCallTarget !== '0x0000000000000000000000000000000000000000000000000000000000000002::coin::zero'\n        );\n      }\n      return false;\n    });\n    return new MoveCallHelper(moveCall, this.txb);\n  }\n\n  private get collectRewardHelper() {\n    const moveCalls = this.transactions.filter((trans) => {\n      if (trans.$kind === 'MoveCall') {\n        const moveCallTarget = `${trans.MoveCall.package}::${trans.MoveCall.module}::${trans.MoveCall.function}`;\n        return moveCallTarget === `${this.config.PackageId}::position_manager::collect_reward`;\n      }\n      return false;\n    });\n    return moveCalls.map((moveCall) => new MoveCallHelper(moveCall, this.txb));\n  }\n\n  private get collectFeeHelper() {\n    const moveCall = this.transactions.find((trans) => {\n      if (trans.$kind === 'MoveCall') {\n        const moveCallTarget = `${trans.MoveCall.package}::${trans.MoveCall.module}::${trans.MoveCall.function}`;\n        return moveCallTarget === `${this.config.PackageId}::position_manager::collect`;\n      }\n      return false;\n    });\n    return new MoveCallHelper(moveCall, this.txb);\n  }\n\n  private get decreaseLiquidityHelper() {\n    const moveCall = this.transactions.find((trans) => {\n      if (trans.$kind === 'MoveCall') {\n        const moveCallTarget = `${trans.MoveCall.package}::${trans.MoveCall.module}::${trans.MoveCall.function}`;\n        return moveCallTarget === `${this.config.PackageId}::position_manager::decrease_liquidity`;\n      }\n      return false;\n    });\n    return new MoveCallHelper(moveCall, this.txb);\n  }\n\n  private get swapExactBaseForQuoteHelper() {\n    const moveCall = this.transactions.find((trans) => {\n      if (trans.$kind === 'MoveCall') {\n        const moveCallTarget = `${trans.MoveCall.package}::${trans.MoveCall.module}::${trans.MoveCall.function}`;\n        return moveCallTarget === `${deepbookConfig.PackageId}::clob_v2::swap_exact_base_for_quote`;\n      }\n      return false;\n    });\n    return new MoveCallHelper(moveCall, this.txb);\n  }\n\n  private get swapExactQuoteForBaseHelper() {\n    const moveCall = this.transactions.find((trans) => {\n      if (trans.$kind === 'MoveCall') {\n        const moveCallTarget = `${trans.MoveCall.package}::${trans.MoveCall.module}::${trans.MoveCall.function}`;\n        return moveCallTarget === `${deepbookConfig.PackageId}::clob_v2::swap_exact_quote_for_base`;\n      }\n      return false;\n    });\n    return new MoveCallHelper(moveCall, this.txb);\n  }\n}\n\nexport class MoveCallHelper {\n  constructor(\n    public readonly moveCall: TransactionCommand,\n    public readonly txb: Transaction,\n  ) {}\n\n  private get inputs() {\n    return this.txb.getData().inputs;\n  }\n\n  getInputsIndex(index: number): number {\n    return (this.moveCall as any).MoveCall.arguments[index].Input;\n  }\n\n  decodeSharedObjectId(argIndex: number) {\n    return this.inputs[argIndex].Object?.SharedObject?.objectId || this.inputs[argIndex].UnresolvedObject.objectId;\n  }\n\n  decodeOwnedObjectId(argIndex: number) {\n    return this.inputs[argIndex].Object?.ImmOrOwnedObject?.objectId || this.inputs[argIndex].UnresolvedObject.objectId;\n  }\n\n  decodeInputU128(argIndex: number) {\n    return Number(bcs.u128().parse(Uint8Array.from(fromBase64(this.inputs[argIndex].Pure.bytes))));\n  }\n\n  decodeInputU64(argIndex: number) {\n    const parsed = new Decimal(bcs.u64().parse(Uint8Array.from(fromBase64(this.inputs[argIndex].Pure.bytes))));\n    // Number can't precisely represent values > MAX_SAFE_INTEGER\n    if (parsed.gt(Number.MAX_SAFE_INTEGER)) {\n      return parsed.toString();\n    }\n    return parsed.toNumber();\n  }\n\n  decodeInputU32(argIndex: number) {\n    return Number(bcs.u32().parse(Uint8Array.from(fromBase64(this.inputs[argIndex].Pure.bytes))));\n  }\n\n  decodeInputU8(argIndex: number) {\n    return Number(bcs.u8().parse(Uint8Array.from(fromBase64(this.inputs[argIndex].Pure.bytes))));\n  }\n\n  decodeInputAddress(argIndex: number) {\n    return bcs.Address.parse(Uint8Array.from(fromBase64(this.inputs[argIndex].Pure.bytes)));\n  }\n\n  decodeInputBool(argIndex: number) {\n    return bcs.bool().parse(Uint8Array.from(fromBase64(this.inputs[argIndex].Pure.bytes)));\n  }\n\n  shortTypeArg(index: number) {\n    return this.moveCall.MoveCall.typeArguments[index];\n  }\n\n  txArg(index: number) {\n    return this.moveCall.MoveCall.arguments[index];\n  }\n}\n","export const prixConfig = {\n  PackageId: '0x02fe4933f4521250e55a15441096d1d4a38a7311195b0bca126fc0138c1f5a97',\n  Claim: '0x0c822cec42f7ca703696b4232f1c47b348330c23580172a29aab465bc071d894',\n  turbosCoinType: '0x5d1f47ea69bb0de31c313d7acf89b890dbb8991ea8e03c6c355171f84bb1ba4a::turbos::TURBOS',\n};\n\nexport const deepbookConfig = {\n  PackageId: '0xdee9',\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { AddLiquidityIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class AddLiquidityIntention extends BaseIntentionGrpc<AddLiquidityIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.AddLiquidity;\n\n  constructor(public override readonly data: AddLiquidityIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiGrpcClient);\n    const { pool, address, amountA, amountB, slippage, tickLower, tickUpper, deadline, txb } = this.data;\n\n    return turbosSdk.pool.addLiquidity({\n      pool,\n      slippage,\n      address,\n      amountA,\n      amountB,\n      tickLower,\n      tickUpper,\n      deadline,\n      txb,\n    });\n  }\n\n  static fromData(data: AddLiquidityIntentionData) {\n    return new AddLiquidityIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { BurnIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class BurnIntention extends BaseIntentionGrpc<BurnIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.AddLiquidity;\n\n  constructor(public override readonly data: BurnIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiGrpcClient);\n    const { pool, nft, txb } = this.data;\n\n    return turbosSdk.position.burn({\n      pool,\n      nft,\n      txb,\n    });\n  }\n\n  static fromData(data: BurnIntentionData) {\n    return new BurnIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { CollectFeeIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class CollectFeeIntention extends BaseIntentionGrpc<CollectFeeIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.AddLiquidity;\n\n  constructor(public override readonly data: CollectFeeIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiGrpcClient);\n    const { pool, address, nft, collectAmountA, collectAmountB, deadline, txb } = this.data;\n\n    return turbosSdk.pool.collectFee({\n      pool,\n      address,\n      collectAmountA,\n      collectAmountB,\n      nft,\n      deadline,\n      txb,\n    });\n  }\n\n  static fromData(data: CollectFeeIntentionData) {\n    return new CollectFeeIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { CollectRewardIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class CollectRewardIntention extends BaseIntentionGrpc<CollectRewardIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.AddLiquidity;\n\n  constructor(public override readonly data: CollectRewardIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiGrpcClient);\n    const { pool, address, nft, rewardAmounts, deadline, txb } = this.data;\n\n    return turbosSdk.pool.collectReward({\n      pool,\n      address,\n      rewardAmounts,\n      nft,\n      deadline,\n      txb,\n    });\n  }\n\n  static fromData(data: CollectRewardIntentionData) {\n    return new CollectRewardIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { CreatePoolIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class CreatePoolIntention extends BaseIntentionGrpc<CreatePoolIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.AddLiquidity;\n\n  constructor(public override readonly data: CreatePoolIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiGrpcClient);\n    const {\n      fee,\n      address,\n      tickLower,\n      tickUpper,\n      sqrtPrice,\n      slippage,\n      coinTypeA,\n      coinTypeB,\n      amountA,\n      amountB,\n      deadline,\n      txb,\n    } = this.data;\n\n    return turbosSdk.pool.createPool({\n      fee,\n      amountA,\n      amountB,\n      address,\n      tickLower,\n      tickUpper,\n      sqrtPrice,\n      slippage,\n      coinTypeA,\n      coinTypeB,\n      deadline,\n      txb,\n    });\n  }\n\n  static fromData(data: CreatePoolIntentionData) {\n    return new CreatePoolIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { DecreaseLiquidityIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class DecreaseLiquidityIntention extends BaseIntentionGrpc<DecreaseLiquidityIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.AddLiquidity;\n\n  constructor(public override readonly data: DecreaseLiquidityIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiGrpcClient);\n    const { pool, address, amountA, amountB, slippage, nft, decreaseLiquidity, deadline, txb } = this.data;\n\n    return turbosSdk.pool.decreaseLiquidity({\n      pool,\n      slippage,\n      address,\n      amountA,\n      amountB,\n      nft,\n      decreaseLiquidity,\n      deadline,\n      txb,\n    });\n  }\n\n  static fromData(data: DecreaseLiquidityIntentionData) {\n    return new DecreaseLiquidityIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { DecreaseLiquidityWithReturnIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class DecreaseLiquidityWithReturnIntention extends BaseIntentionGrpc<DecreaseLiquidityWithReturnIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.DecreaseLiquidityWithReturn;\n\n  constructor(public override readonly data: DecreaseLiquidityWithReturnIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiGrpcClient);\n    const { pool, address, amountA, amountB, slippage, nft, decreaseLiquidity, deadline } = this.data;\n\n    const {\n      txb: tx,\n      coinA: objectCoinA,\n      coinB: objectCoinB,\n    } = await turbosSdk.pool.decreaseLiquidityWithReturn({\n      pool,\n      slippage,\n      address,\n      amountA,\n      amountB,\n      nft,\n      decreaseLiquidity,\n      deadline,\n    });\n    tx.transferObjects([objectCoinA!, objectCoinB!], this.data.address);\n    return tx;\n  }\n\n  static fromData(data: DecreaseLiquidityWithReturnIntentionData) {\n    return new DecreaseLiquidityWithReturnIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { IncreaseLiquidityIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class IncreaseLiquidityIntention extends BaseIntentionGrpc<IncreaseLiquidityIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.AddLiquidity;\n\n  constructor(public override readonly data: IncreaseLiquidityIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiGrpcClient);\n    const { pool, address, amountA, amountB, slippage, nft, deadline, txb } = this.data;\n\n    return turbosSdk.pool.increaseLiquidity({\n      pool,\n      slippage,\n      address,\n      amountA,\n      amountB,\n      nft,\n      deadline,\n      txb,\n    });\n  }\n\n  static fromData(data: IncreaseLiquidityIntentionData) {\n    return new IncreaseLiquidityIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui/utils';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { prixConfig } from '../config';\nimport { PrixClaimIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class PrixClaimIntention extends BaseIntentionGrpc<PrixClaimIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.PrixClaim;\n\n  constructor(public override readonly data: PrixClaimIntentionData) {\n    super(data);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const txb = new Transaction();\n    txb.moveCall({\n      target: `${prixConfig.PackageId}::claim::claim`,\n      typeArguments: [prixConfig.turbosCoinType],\n      arguments: [txb.object(prixConfig.Claim), txb.object(SUI_CLOCK_OBJECT_ID)],\n    });\n    return txb;\n  }\n\n  static fromData(data: PrixClaimIntentionData) {\n    return new PrixClaimIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { prixConfig } from '../config';\nimport { PrixJoinIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class PrixJoinIntention extends BaseIntentionGrpc<PrixJoinIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.PrixJoin;\n\n  constructor(public override readonly data: PrixJoinIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const txb = new Transaction();\n    txb.moveCall({\n      target: `${prixConfig.PackageId}::claim::join`,\n      typeArguments: [prixConfig.turbosCoinType],\n      arguments: [txb.object(prixConfig.Claim)],\n    });\n    return txb;\n  }\n\n  static fromData(data: PrixJoinIntentionData) {\n    return new PrixJoinIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { RemoveLiquidityIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class RemoveLiquidityIntention extends BaseIntentionGrpc<RemoveLiquidityIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.RemoveLiquidity;\n\n  constructor(public override readonly data: RemoveLiquidityIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiGrpcClient);\n    let txb = new Transaction();\n    txb = await turbosSdk.pool.collectFee({ txb, ...this.data });\n    txb = await turbosSdk.pool.collectReward({ txb, ...this.data });\n    txb = await turbosSdk.pool.decreaseLiquidity({ txb, ...this.data });\n    txb = await turbosSdk.position.burn({ txb, nft: this.data.nft, pool: this.data.pool });\n    return txb;\n  }\n\n  static fromData(data: RemoveLiquidityIntentionData) {\n    return new RemoveLiquidityIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { RemoveLiquidityWithReturnIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class RemoveLiquidityWithReturnIntention extends BaseIntentionGrpc<RemoveLiquidityWithReturnIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.RemoveLiquidityWithReturn;\n\n  constructor(public override readonly data: RemoveLiquidityWithReturnIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiGrpcClient);\n    const {\n      txb,\n      coinA: objectCoinA,\n      coinB: objectCoinB,\n    } = await turbosSdk.pool.removeLiquidityWithReturn({ ...this.data });\n    txb.transferObjects([objectCoinA!, objectCoinB!], this.data.address);\n    return txb;\n  }\n\n  static fromData(data: RemoveLiquidityWithReturnIntentionData) {\n    return new RemoveLiquidityWithReturnIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { SuiNetworks, SwapIntentionData, TransactionSubType } from '../types';\n\nexport class SwapIntention extends BaseIntentionGrpc<SwapIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.AddLiquidity;\n\n  constructor(public override readonly data: SwapIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    console.log(this.data, 'this.data');\n    const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiGrpcClient);\n    const { routes, coinTypeA, coinTypeB, address, amountA, amountB, slippage, amountSpecifiedIsInput, deadline, txb } =\n      this.data;\n    return turbosSdk.trade.swap({\n      routes,\n      coinTypeA,\n      coinTypeB,\n      address,\n      amountA,\n      amountB,\n      amountSpecifiedIsInput,\n      slippage,\n      deadline,\n      txb,\n    });\n  }\n\n  static fromData(data: SwapIntentionData) {\n    return new SwapIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { swap_exact_base_for_quote } from '../api/deepbook';\nimport { SuiNetworks, SwapExactBaseForQuoteIntentionData, TransactionSubType } from '../types';\n\nexport class SwapExactBaseForQuoteIntention extends BaseIntentionGrpc<SwapExactBaseForQuoteIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.SwapExactBaseForQuote;\n\n  constructor(public override readonly data: SwapExactBaseForQuoteIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiGrpcClient);\n    const txb = await swap_exact_base_for_quote({ ...this.data, turbosSdk, currentAddress: input.account.address });\n    return txb;\n  }\n\n  static fromData(data: SwapExactBaseForQuoteIntentionData) {\n    return new SwapExactBaseForQuoteIntention(data);\n  }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { normalizeSuiObjectId } from '@mysten/sui/utils';\nimport { TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { deepbookConfig } from '../config';\nimport { SuiKit } from '../utils/sui-kit';\n\nconst client_order_id = 89;\nconst gasBudget = 1_000_000;\n\ninterface SwapExactOptions {\n  token1: string;\n  token2: string;\n  poolId: string;\n  amountIn: number;\n  turbosSdk: TurbosSdk;\n  currentAddress: string;\n}\n\nexport const swap_exact_quote_for_base = async (options: SwapExactOptions) => {\n  const { token1, token2, poolId, amountIn, currentAddress, turbosSdk } = options;\n  const txb = new Transaction();\n\n  const suiKit = new SuiKit(turbosSdk);\n  // get token objectId\n  const coinsData = await suiKit.getCoinsData(currentAddress, token2, amountIn);\n  const [sendCoin, mergeCoin] = suiKit.splitAndMergeCoin(coinsData, amountIn, txb);\n  if (!sendCoin) {\n    throw new Error(`Not enough balance: ${token2}`);\n  }\n\n  // get accountCap id\n  const currentAccountCap = await suiKit.IsAccountCap(currentAddress);\n  const accountCap = !currentAccountCap ? suiKit.createAccount(txb) : txb.object(currentAccountCap);\n\n  const [base_coin_ret, quote_coin_ret, _amount] = txb.moveCall({\n    typeArguments: [token1, token2],\n    target: `${deepbookConfig.PackageId}::clob_v2::swap_exact_quote_for_base`,\n    arguments: [\n      txb.object(String(poolId)),\n      txb.pure.u64(client_order_id),\n      accountCap,\n      txb.pure.u64(amountIn),\n      txb.object(normalizeSuiObjectId('0x6')),\n      sendCoin,\n    ],\n  });\n\n  if (mergeCoin) {\n    txb.transferObjects([mergeCoin], txb.pure.address(currentAddress));\n  }\n\n  txb.transferObjects([base_coin_ret!], txb.pure.address(currentAddress));\n  txb.transferObjects([quote_coin_ret!], txb.pure.address(currentAddress));\n\n  if (!currentAccountCap) {\n    txb.transferObjects([accountCap], txb.pure.address(currentAddress));\n  }\n\n  txb.setSenderIfNotSet(currentAddress);\n  txb.setGasBudget(gasBudget);\n\n  return txb;\n};\n\nexport const swap_exact_base_for_quote = async (options: SwapExactOptions) => {\n  const { token1, token2, poolId, amountIn, currentAddress, turbosSdk } = options;\n  const txb = new Transaction();\n\n  const suiKit = new SuiKit(turbosSdk);\n  // get token objectId\n  const coinsData = await suiKit.getCoinsData(currentAddress, token1, amountIn);\n  const [sendCoin, mergeCoin] = suiKit.splitAndMergeCoin(coinsData, amountIn, txb);\n\n  if (!sendCoin) {\n    throw new Error(`Not enough balance: ${token1}`);\n  }\n\n  // get accountCap id\n  const currentAccountCap = await suiKit.IsAccountCap(currentAddress);\n  const accountCap = !currentAccountCap ? suiKit.createAccount(txb) : txb.object(currentAccountCap);\n\n  const zero = suiKit.zero(token2, txb);\n\n  const [base_coin_ret, quote_coin_ret, _amount] = txb.moveCall({\n    typeArguments: [token1, token2],\n    target: `${deepbookConfig.PackageId}::clob_v2::swap_exact_base_for_quote`,\n    arguments: [\n      txb.object(String(poolId)),\n      txb.pure.u64(client_order_id),\n      accountCap,\n      txb.pure.u64(amountIn),\n      sendCoin,\n      zero,\n      txb.object(normalizeSuiObjectId('0x6')),\n    ],\n  });\n  if (mergeCoin) {\n    txb.transferObjects([mergeCoin], txb.pure.address(currentAddress));\n  }\n\n  txb.transferObjects([base_coin_ret!], txb.pure.address(currentAddress));\n  txb.transferObjects([quote_coin_ret!], txb.pure.address(currentAddress));\n\n  if (!currentAccountCap) {\n    txb.transferObjects([accountCap], txb.pure.address(currentAddress));\n  }\n\n  txb.setSenderIfNotSet(currentAddress);\n  txb.setGasBudget(gasBudget);\n\n  return txb;\n};\n","import { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';\nimport { TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { deepbookConfig } from '../config';\n\ntype CoinData = {\n  coinObjectId: string;\n  balance: string;\n  coinType: string;\n}[];\n\nexport class SuiKit {\n  constructor(public readonly turbosSdk: TurbosSdk) {}\n\n  async getCoinsData(currentAddress: string, type: string, amount: number): Promise<CoinData> {\n    const coinObjects: CoinData = [];\n    let cursor: string | null | undefined;\n    let hasNextPage = true;\n\n    while (hasNextPage) {\n      const coinFields = await this.turbosSdk.provider.core.listCoins({\n        owner: currentAddress,\n        coinType: type,\n        cursor: cursor ?? undefined,\n      });\n      coinObjects.push(\n        ...coinFields.objects.map((coin) => ({\n          coinObjectId: coin.objectId,\n          balance: coin.balance,\n          coinType: coin.type,\n        })),\n      );\n      hasNextPage = coinFields.hasNextPage;\n      cursor = coinFields.cursor;\n    }\n\n    const resultCoinObjects: CoinData = [];\n    let currentBalance = 0;\n    coinObjects\n      .sort((coinA, coinB) => Number(coinB.balance) - Number(coinA.balance))\n      .some((object) => {\n        if (currentBalance >= amount) {\n          return true;\n        }\n        currentBalance += Number(object.balance);\n        resultCoinObjects.push(object);\n        return false;\n      });\n    return resultCoinObjects;\n  }\n\n  splitAndMergeCoin(\n    coins: CoinData | undefined,\n    amount: number,\n    txb: Transaction,\n  ): [TransactionObjectArgument | undefined, TransactionObjectArgument | undefined] {\n    if (!coins || coins.length < 1) {\n      return [undefined, undefined];\n    }\n\n    if (this.isSuiCoinAddress(coins[0]!.coinType)) {\n      const [sendCoin] = txb.splitCoins(txb.gas, [txb.pure.u64(amount)]);\n      return [sendCoin, undefined];\n    }\n\n    const mergeCoin = txb.object(coins[0]!.coinObjectId);\n    if (coins.length > 1) {\n      txb.mergeCoins(\n        mergeCoin,\n        coins.slice(1).map((coin) => txb.object(coin.coinObjectId)),\n      );\n    }\n\n    const [sendCoin] = txb.splitCoins(mergeCoin, [txb.pure.u64(amount)]);\n    return [sendCoin, mergeCoin];\n  }\n\n  isSuiCoinAddress(type: string) {\n    return type.toLocaleLowerCase() === '0x2::sui::sui';\n  }\n\n  async IsAccountCap(currentAddress: string): Promise<string | undefined> {\n    const ownedObjects = await this.turbosSdk.provider.core.listOwnedObjects({\n      owner: currentAddress,\n      type: `${deepbookConfig.PackageId}::custodian_v2::AccountCap`,\n    });\n    return ownedObjects.objects[0]?.objectId;\n  }\n\n  createAccount(txb: Transaction): TransactionObjectArgument {\n    const [cap] = txb.moveCall({\n      typeArguments: [],\n      target: `${deepbookConfig.PackageId}::clob_v2::create_account`,\n      arguments: [],\n    });\n    return cap;\n  }\n\n  zero(token: string, txb: Transaction): TransactionObjectArgument {\n    return txb.moveCall({\n      typeArguments: [token],\n      target: `0x2::coin::zero`,\n      arguments: [],\n    });\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\n\nimport { swap_exact_quote_for_base } from '../api/deepbook';\nimport { SuiNetworks, SwapExactQuoteForBaseIntentionData, TransactionSubType } from '../types';\n\nexport class SwapExactQuoteForBaseIntention extends BaseIntentionGrpc<SwapExactQuoteForBaseIntentionData> {\n  txType!: TransactionType.Other;\n\n  txSubType!: TransactionSubType.SwapExactQuoteForBase;\n\n  constructor(public override readonly data: SwapExactQuoteForBaseIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<Transaction> {\n    const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiGrpcClient);\n    const txb = await swap_exact_quote_for_base({ ...this.data, turbosSdk, currentAddress: input.account.address });\n    return txb;\n  }\n\n  static fromData(data: SwapExactQuoteForBaseIntentionData) {\n    return new SwapExactQuoteForBaseIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternalGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { ClaimTicketIntention, ClaimTicketIntentionData } from './intentions/claimTicket';\nimport { StakeIntention, StakeIntentionData } from './intentions/stake';\nimport { UnStakeIntention, UnStakeIntentionData } from './intentions/unStake';\nimport { TransactionSubType } from './types';\n\nexport type VoloIntention = StakeIntention | UnStakeIntention | ClaimTicketIntention;\n\nexport type VoloIntentionData = StakeIntentionData | UnStakeIntentionData | ClaimTicketIntentionData;\n\nexport class VoloAppHelper implements IAppHelperInternalGrpc<VoloIntentionData> {\n  application = 'volo';\n\n  supportSDK = '@mysten/sui-v2' as const;\n\n  async deserialize(input: {\n    transaction: Transaction;\n    network: SuiNetworks;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n  }): Promise<{ txType: TransactionType; txSubType: TransactionSubType; intentionData: VoloIntentionData }> {\n    const decoder = new Decoder(input.transaction);\n    const result = decoder.decode();\n    return {\n      txType: TransactionType.Other,\n      txSubType: result.type,\n      intentionData: result.intentionData,\n    };\n  }\n\n  async build(input: {\n    intentionData: VoloIntentionData;\n    txType: TransactionType;\n    txSubType: string;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiGrpcClient, account, network } = input;\n    let intention: VoloIntention;\n    switch (input.txSubType) {\n      case TransactionSubType.Stake:\n        intention = StakeIntention.fromData(input.intentionData as StakeIntentionData);\n        break;\n      case TransactionSubType.UnStake:\n        intention = UnStakeIntention.fromData(input.intentionData as UnStakeIntentionData);\n        break;\n      case TransactionSubType.ClaimTicket:\n        intention = ClaimTicketIntention.fromData(input.intentionData as ClaimTicketIntentionData);\n        break;\n      default:\n        throw new Error('not implemented');\n    }\n    return intention.build({ suiGrpcClient, account, network });\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { bcs, fromBase64 } from '@mysten/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui/utils';\n\nimport config from './config';\nimport { TransactionSubType } from './types';\n\nexport function isSameCoinType(type1: string, type2: string) {\n  return normalizeStructTag(type1) === normalizeStructTag(type2);\n}\n\nexport function isSameTarget(target1: string, target2: string): boolean {\n  return normalizeStructTag(target1) === normalizeStructTag(target2);\n}\n\ntype DecodeResult = {\n  txType: TransactionType;\n  type: TransactionSubType;\n  intentionData: any;\n};\n\ntype TxData = ReturnType<Transaction['getData']>;\ntype TransactionCommand = TxData['commands'][number];\ntype TransactionInput = TxData['inputs'][number];\ntype MoveCallCommand = Extract<TransactionCommand, { $kind: 'MoveCall' }>;\n\nfunction getMoveCallTarget(command: TransactionCommand): string | null {\n  if (command.$kind !== 'MoveCall') {\n    return null;\n  }\n  const { package: pkg, module, function: fn } = command.MoveCall;\n  return `${pkg}::${module}::${fn}`;\n}\n\nexport class Decoder {\n  constructor(public readonly txb: Transaction) {}\n\n  decode() {\n    if (this.isStakeTransaction()) {\n      return this.decodeStake();\n    }\n\n    if (this.isUnStakeTransaction()) {\n      return this.decodeUnStake();\n    }\n\n    if (this.isClaimTicketTransaction()) {\n      return this.decodeClaimTicket();\n    }\n\n    throw new Error(`Unknown transaction type`);\n  }\n\n  private get commands() {\n    return this.txb.getData().commands;\n  }\n\n  private getMoveCallCommand(target: string) {\n    return this.commands.find((command) => getMoveCallTarget(command) === target);\n  }\n\n  private isStakeTransaction() {\n    return !!this.getMoveCallCommand(`${config.packageId}::native_pool::stake`);\n  }\n\n  private isUnStakeTransaction() {\n    return !!this.getMoveCallCommand(`${config.packageId}::native_pool::unstake`);\n  }\n\n  private isClaimTicketTransaction() {\n    return !!this.getMoveCallCommand(`${config.packageId}::native_pool::burn_ticket`);\n  }\n\n  private decodeSplitAmount(): number {\n    const splitCoin = this.commands.find((command) => command.$kind === 'SplitCoins');\n    if (!splitCoin || splitCoin.$kind !== 'SplitCoins') {\n      throw new Error('SplitCoins command not found');\n    }\n    const amountArg = splitCoin.SplitCoins.amounts[0];\n    if (amountArg.$kind !== 'Input') {\n      throw new Error('SplitCoins amount is not an Input');\n    }\n    const input = this.txb.getData().inputs[amountArg.Input];\n    return Number(bcs.u64().parse(Uint8Array.from(fromBase64(input.Pure!.bytes))));\n  }\n\n  private decodeStake(): DecodeResult {\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.Stake,\n      intentionData: {\n        amount: this.decodeSplitAmount(),\n      },\n    };\n  }\n\n  private decodeUnStake(): DecodeResult {\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.UnStake,\n      intentionData: {\n        amount: this.decodeSplitAmount(),\n      },\n    };\n  }\n\n  private decodeClaimTicket(): DecodeResult {\n    const ticketId = this.helper.decodeOwnedObjectId(2);\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.ClaimTicket,\n      intentionData: {\n        ticketId,\n      },\n    };\n  }\n\n  private get helper() {\n    const moveCall = this.commands.find(\n      (command) => command.$kind === 'MoveCall' && command.MoveCall.package === config.packageId,\n    );\n    if (!moveCall) {\n      throw new Error('MoveCall not found');\n    }\n    return new MoveCallHelper(moveCall, this.txb);\n  }\n}\n\nexport class MoveCallHelper {\n  constructor(\n    public readonly moveCall: TransactionCommand,\n    public readonly txb: Transaction,\n  ) {}\n\n  private get moveCallData(): MoveCallCommand['MoveCall'] {\n    if (this.moveCall.$kind !== 'MoveCall') {\n      throw new Error('not move call command');\n    }\n    return this.moveCall.MoveCall;\n  }\n\n  private get inputs() {\n    return this.txb.getData().inputs;\n  }\n\n  private getInputIndex(argIndex: number): number {\n    const arg = this.moveCallData.arguments[argIndex];\n    if (arg.$kind !== 'Input') {\n      throw new Error('not input type');\n    }\n    return arg.Input;\n  }\n\n  private getInputParam(argIndex: number): TransactionInput {\n    return this.inputs[this.getInputIndex(argIndex)];\n  }\n\n  decodeOwnedObjectId(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return MoveCallHelper.getOwnedObjectId(input);\n  }\n\n  static getOwnedObjectId(input: TransactionInput) {\n    const objectId =\n      input.Object?.ImmOrOwnedObject?.objectId ?? input.Object?.Receiving?.objectId ?? input.UnresolvedObject?.objectId;\n    if (!objectId) {\n      throw new Error(`not object argument: ${JSON.stringify(input)}`);\n    }\n    return normalizeSuiAddress(objectId);\n  }\n}\n","const config = {\n  packageId: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n  poolObjectId: '0x7fa2faa111b8c65bea48a23049bfd81ca8f971a262d981dcd9a17c3825cb5baf',\n  metadataObjectId: '0x680cd26af32b2bde8d3361e804c53ec1d1cfe24c7f039eb7f549e8dfde389a60',\n  systemStateObjectId: '0x0000000000000000000000000000000000000000000000000000000000000005',\n  certType: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT',\n  gasBudget: 50_000_000,\n};\n\nexport default config;\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface ClaimTicketIntentionData {\n  ticketId: string;\n}\n\nexport class ClaimTicketIntention extends BaseIntentionGrpc<ClaimTicketIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.ClaimTicket;\n\n  constructor(public readonly data: ClaimTicketIntentionData) {\n    super(data);\n  }\n\n  async build(_input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const tx = new Transaction();\n    const { ticketId } = this.data;\n    tx.moveCall({\n      target: `${config.packageId}::native_pool::burn_ticket`,\n      arguments: [tx.object(config.poolObjectId), tx.object(config.systemStateObjectId), tx.object(ticketId)],\n    });\n    return tx;\n  }\n\n  static fromData(data: ClaimTicketIntentionData) {\n    return new ClaimTicketIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface StakeIntentionData {\n  amount: number;\n}\n\nexport class StakeIntention extends BaseIntentionGrpc<StakeIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.Stake;\n\n  constructor(public readonly data: StakeIntentionData) {\n    super(data);\n  }\n\n  async build(_input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const tx = new Transaction();\n    const { amount } = this.data;\n    const [coin] = tx.splitCoins(tx.gas, [amount]);\n    tx.moveCall({\n      target: `${config.packageId}::native_pool::stake`,\n      arguments: [\n        tx.object(config.poolObjectId),\n        tx.object(config.metadataObjectId),\n        tx.object(config.systemStateObjectId),\n        coin,\n      ],\n    });\n    return tx;\n  }\n\n  static fromData(data: StakeIntentionData) {\n    return new StakeIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface UnStakeIntentionData {\n  amount: number;\n}\n\nexport class UnStakeIntention extends BaseIntentionGrpc<UnStakeIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.UnStake;\n\n  constructor(public readonly data: UnStakeIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const tx = new Transaction();\n    const { amount } = this.data;\n    const coins = await input.suiGrpcClient.listCoins({\n      owner: input.account.address,\n      coinType: config.certType,\n      limit: 100,\n    });\n\n    if (coins.objects.length === 0) {\n      throw new Error('No cert coins found');\n    }\n\n    const [primaryCoin, ...mergeCoins] = coins.objects;\n    const primaryCoinInput = tx.object(primaryCoin.objectId);\n    if (mergeCoins.length) {\n      tx.mergeCoins(\n        primaryCoinInput,\n        mergeCoins.map((coin) => tx.object(coin.objectId)),\n      );\n    }\n    const [coin] = tx.splitCoins(tx.object(primaryCoin.objectId), [amount]);\n\n    tx.moveCall({\n      target: `${config.packageId}::native_pool::unstake`,\n      arguments: [\n        tx.object(config.poolObjectId),\n        tx.object(config.metadataObjectId),\n        tx.object(config.systemStateObjectId),\n        coin,\n      ],\n    });\n    return tx;\n  }\n\n  static fromData(data: UnStakeIntentionData) {\n    return new UnStakeIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport { Decoder } from './decoder';\nimport { Aggregator7KSwap } from './intentions/aggregator-7k-swap';\nimport { ClosePosition } from './intentions/close-position';\nimport { CollectFee } from './intentions/collect-fee';\nimport { CollectRewards } from './intentions/collect-rewards';\nimport { CollectRewardsAndFee } from './intentions/collect-rewards-and-fee';\nimport { OpenAndAddLiquidity } from './intentions/open-position-with-liquidity';\nimport { ProvideLiquidity } from './intentions/provide-liquidity';\nimport { RemoveLiquidity } from './intentions/remove-liquidity';\nimport { SuiNetworks, BluefinIntentionData, TransactionSubType } from './types';\n\nexport type BluefinIntention =\n  | OpenAndAddLiquidity\n  | ProvideLiquidity\n  | RemoveLiquidity\n  | ClosePosition\n  | CollectFee\n  | CollectRewards\n  | CollectRewardsAndFee;\nexport class BluefinHelper implements IAppHelperInternal<BluefinIntentionData> {\n  application = 'bluefin';\n\n  supportSDK = '@mysten/sui' as const;\n\n  async deserialize(input: {\n    transaction: Transaction;\n    chain: IdentifierString;\n    network: SuiNetworks;\n    suiClient: SuiClient;\n    account: WalletAccount;\n    appContext?: any;\n  }): Promise<{\n    txType: TransactionType;\n    txSubType: string;\n    intentionData: BluefinIntentionData & { appContext?: any };\n  }> {\n    console.log('Bluefin helper deserialize input: ', input);\n\n    const { transaction, appContext } = input;\n\n    const decoder = new Decoder(transaction, appContext);\n\n    const result = await decoder.decode();\n\n    return {\n      txType: TransactionType.Other,\n      txSubType: result.type,\n      intentionData: {\n        appContext: input.appContext,\n        ...result.intentionData,\n      },\n    };\n  }\n\n  async build(input: {\n    intentionData: BluefinIntentionData;\n    txType: TransactionType;\n    txSubType: string;\n    suiClient: SuiClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { suiClient, account, network } = input;\n\n    console.log(input.txSubType);\n    let intention: BluefinIntention;\n    switch (input.txSubType) {\n      case TransactionSubType.OpenPosition:\n        intention = OpenAndAddLiquidity.fromData(input.intentionData);\n        break;\n\n      case TransactionSubType.ProvideLiquidity:\n        intention = ProvideLiquidity.fromData(input.intentionData);\n        break;\n\n      case TransactionSubType.RemoveLiquidity:\n        intention = RemoveLiquidity.fromData(input.intentionData);\n        break;\n\n      case TransactionSubType.ClosePosition:\n        intention = ClosePosition.fromData(input.intentionData);\n        break;\n\n      case TransactionSubType.CollectFee:\n        intention = CollectFee.fromData(input.intentionData);\n        break;\n\n      case TransactionSubType.CollectRewards:\n        intention = CollectRewards.fromData(input.intentionData);\n        break;\n\n      case TransactionSubType.CollectRewardsAndFee:\n        intention = CollectRewardsAndFee.fromData(input.intentionData);\n        break;\n\n      case TransactionSubType.Aggregator7KSwap:\n        intention = Aggregator7KSwap.fromData(input.intentionData);\n        break;\n\n      default:\n        throw new Error('not implemented');\n    }\n\n    return intention.build({ suiClient, account, network });\n  }\n}\n","import { asIntN } from '@cetusprotocol/common-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { fromBase64 } from '@mysten/bcs';\nimport { bcs } from '@mysten/sui/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport {\n  Aggregator7KSwapIntentionData,\n  ClosePositionIntentionData,\n  CollectFeeIntentionData,\n  CollectRewardsAndFeeIntentionData,\n  CollectRewardsIntentionData,\n  CollectTokens,\n  DecodeResult,\n  FeeTokens,\n  OpenPositionIntentionData,\n  ProvideLiquidityIntentionData,\n  RemoveLiquidityIntentionData,\n  RewardCollection,\n  RewardTokens,\n  TransactionSubType,\n} from './types';\n\nexport class Decoder {\n  constructor(\n    public readonly transaction: Transaction,\n    public readonly appContext?: any,\n  ) {}\n\n  async decode(): Promise<DecodeResult> {\n    if (this.isOpenPositionTx()) {\n      return this.decodeOpenPositionTx();\n    }\n    if (this.isClosePositionTx()) {\n      return this.decodeClosePositionTx();\n    }\n    if (this.isProvideLiquidityTx()) {\n      return this.decodeProvideLiquidityTx();\n    }\n    if (this.isRemoveLiquidityTx()) {\n      return this.decodeRemoveLiquidityTx();\n    }\n    if (this.isCollectRewardsAndFeeTx()) {\n      return this.decodeCollectRewardsAndFeeTx();\n    }\n    if (this.isCollectRewardsTx()) {\n      return this.decodeCollectRewardsTx();\n    }\n    if (this.isCollectFeeTx()) {\n      return this.decodeCollectFeeTx();\n    }\n    if (this.isAggregator7KSwapTx()) {\n      return this.decodeAggregator7KSwapTx();\n    }\n\n    throw new Error(`Unknown transaction type`);\n  }\n\n  private decodeOpenPositionTx(): DecodeResult {\n    const openPosCommand = this.getMoveCallCommand('open_position');\n    const addLiqCommand = this.getMoveCallCommand('provide_liquidity_with_fixed_amount');\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.OpenPosition,\n      intentionData: {\n        pool: this.getSharedObjectID(this.getInputIndex(openPosCommand, 1)),\n        lowerTick: Number(asIntN(BigInt(this.getU32(this.getInputIndex(openPosCommand, 2)))).toString()),\n        upperTick: Number(asIntN(BigInt(this.getU32(this.getInputIndex(openPosCommand, 3)))).toString()),\n        tokenAmount: this.getU64(this.getInputIndex(addLiqCommand, 6)),\n        maxAmountTokenA: this.getU64(this.getInputIndex(addLiqCommand, 7)),\n        maxAmountTokenB: this.getU64(this.getInputIndex(addLiqCommand, 8)),\n        isTokenAFixed: this.getBoolean(this.getInputIndex(addLiqCommand, 9)),\n      } as OpenPositionIntentionData,\n    };\n  }\n\n  private decodeClosePositionTx(): DecodeResult {\n    const closePosCommand = this.getMoveCallCommand('close_position');\n\n    const rewardsCallData = this.getCollectRewardCallData();\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.ClosePosition,\n      intentionData: {\n        pool: this.getSharedObjectID(this.getInputIndex(closePosCommand, 2)),\n        position: this.getOwnedObjectID(this.getInputIndex(closePosCommand, 3)),\n        transferTokensTo: this.getAddress(this.getInputIndex(closePosCommand, 4)),\n        collectRewardTokens: rewardsCallData.map((r) => r.rewardCoinType) as RewardTokens,\n        collectFeeTokens: this.getTypeArguments(closePosCommand) as FeeTokens,\n      } as ClosePositionIntentionData,\n    };\n  }\n\n  private decodeProvideLiquidityTx(): DecodeResult {\n    const addLiqCommand = this.getMoveCallCommand('provide_liquidity_with_fixed_amount');\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.ProvideLiquidity,\n      intentionData: {\n        pool: this.getSharedObjectID(this.getInputIndex(addLiqCommand, 2)),\n        position: this.getOwnedObjectID(this.getInputIndex(addLiqCommand, 3)),\n        tokenAmount: this.getU64(this.getInputIndex(addLiqCommand, 6)),\n        maxAmountTokenA: this.getU64(this.getInputIndex(addLiqCommand, 7)),\n        maxAmountTokenB: this.getU64(this.getInputIndex(addLiqCommand, 8)),\n        isTokenAFixed: this.getBoolean(this.getInputIndex(addLiqCommand, 9)),\n      } as ProvideLiquidityIntentionData,\n    };\n  }\n\n  private decodeRemoveLiquidityTx(): DecodeResult {\n    const removeLiqCommand = this.getMoveCallCommand('remove_liquidity');\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.RemoveLiquidity,\n      intentionData: {\n        pool: this.getSharedObjectID(this.getInputIndex(removeLiqCommand, 2)),\n        position: this.getOwnedObjectID(this.getInputIndex(removeLiqCommand, 3)),\n        liquidity: this.getU128(this.getInputIndex(removeLiqCommand, 4)),\n        maxAmountTokenA: this.getU64(this.getInputIndex(removeLiqCommand, 5)),\n        maxAmountTokenB: this.getU64(this.getInputIndex(removeLiqCommand, 6)),\n        transferTokensTo: this.getAddress(this.getInputIndex(removeLiqCommand, 7)),\n        ...this.collectTokens(),\n      } as RemoveLiquidityIntentionData,\n    };\n  }\n\n  private decodeCollectRewardsTx(): DecodeResult {\n    const rewardsCallData = this.getCollectRewardCallData();\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.CollectRewards,\n      intentionData: {\n        pool: rewardsCallData[0].pool,\n        position: rewardsCallData[0].position,\n        collectRewardTokens: rewardsCallData.map((r) => r.rewardCoinType),\n      } as CollectRewardsIntentionData,\n    };\n  }\n\n  private decodeCollectFeeTx(): DecodeResult {\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.CollectFee,\n      intentionData: this.getFeeCallData() as CollectFeeIntentionData,\n    };\n  }\n\n  private decodeCollectRewardsAndFeeTx(): DecodeResult {\n    const callData = this.getFeeCallData();\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.CollectRewardsAndFee,\n      intentionData: {\n        pool: callData.pool,\n        position: callData.position,\n        ...this.collectTokens(),\n      } as CollectRewardsAndFeeIntentionData,\n    };\n  }\n\n  private getFeeCallData(): CollectFeeIntentionData {\n    const collectFeeCommand = this.getMoveCallCommand('collect_fee');\n    return {\n      pool: this.getSharedObjectID(this.getInputIndex(collectFeeCommand, 2)),\n      position: this.getOwnedObjectID(this.getInputIndex(collectFeeCommand, 3)),\n      collectFeeTokens: this.getTypeArguments(collectFeeCommand) as FeeTokens,\n    };\n  }\n\n  private getCollectRewardCallData(): Array<RewardCollection> {\n    const collectRewards: RewardCollection[] = [];\n    this.commands.forEach((command) => {\n      if (command.$kind === 'MoveCall' && command.MoveCall.function === 'collect_reward') {\n        collectRewards.push({\n          pool: this.getSharedObjectID(this.getInputIndex(command, 2)),\n          position: this.getOwnedObjectID(this.getInputIndex(command, 3)),\n          rewardCoinType: this.getTypeArguments(command)[2],\n        });\n      }\n    });\n    return collectRewards;\n  }\n\n  private async decodeAggregator7KSwapTx(): Promise<DecodeResult> {\n    const { appContext } = this;\n    console.log('appContext', appContext);\n\n    return {\n      txType: TransactionType.Other,\n      type: TransactionSubType.Aggregator7KSwap,\n      intentionData: {\n        tokenIn: appContext.txParams.tokenIn,\n        tokenOut: appContext.txParams.tokenOut,\n        amountIn: String(appContext.txParams.amountIn),\n        maxSlippage: String(appContext.txParams.maxSlippage),\n      } as Aggregator7KSwapIntentionData,\n    };\n  }\n\n  private collectTokens(): CollectTokens {\n    const fee = this.getFeeCallData();\n    const rewards = this.getCollectRewardCallData();\n\n    return {\n      collectFeeTokens: fee.collectFeeTokens,\n      collectRewardTokens: rewards.map((r) => r.rewardCoinType) as RewardTokens,\n    };\n  }\n\n  private get commands() {\n    return this.transaction.getData().commands;\n  }\n\n  private get inputs() {\n    return this.transaction.getData().inputs;\n  }\n\n  private isOpenPositionTx() {\n    return !!this.getMoveCallCommand('open_position');\n  }\n\n  private isProvideLiquidityTx() {\n    return !!this.getMoveCallCommand('provide_liquidity_with_fixed_amount');\n  }\n\n  private isRemoveLiquidityTx() {\n    return !!this.getMoveCallCommand('remove_liquidity');\n  }\n\n  private isCollectRewardsTx() {\n    return !!this.getMoveCallCommand('collect_reward');\n  }\n\n  private isCollectFeeTx() {\n    return !!this.getMoveCallCommand('collect_fee');\n  }\n\n  private isCollectRewardsAndFeeTx() {\n    return this.isCollectRewardsTx() && this.isCollectFeeTx();\n  }\n\n  private isClosePositionTx() {\n    return !!this.getMoveCallCommand('close_position');\n  }\n\n  private isAggregator7KSwapTx() {\n    return !!this.commands.find(\n      (command) => command.$kind === 'MoveCall' && command.MoveCall.function.toLowerCase().includes('settle'),\n    );\n  }\n\n  private getMoveCallCommand(fn: string) {\n    return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n  }\n\n  private getSharedObjectID(index: number): string {\n    return this.inputs[index].Object.SharedObject.objectId as string;\n  }\n\n  private getOwnedObjectID(index: number): string {\n    return this.inputs[index].Object.ImmOrOwnedObject.objectId as string;\n  }\n\n  private getU32(index: number): string {\n    return String(bcs.u32().parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes))));\n  }\n\n  private getU64(index: number): string {\n    return bcs.u64().parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes)));\n  }\n\n  private getU128(index: number): string {\n    return bcs.u128().parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes)));\n  }\n\n  private getBoolean(index: number): boolean {\n    return bcs.bool().parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes)));\n  }\n\n  private getAddress(index: number): string {\n    return bcs.Address.parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes)));\n  }\n\n  private getTypeArguments(command: any): Array<string> {\n    return command.MoveCall.typeArguments || [];\n  }\n\n  private getInputIndex(command: any, index: number): number {\n    return command.MoveCall.arguments[index].Input;\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, Aggregator7KSwapIntentionData } from '../types';\n\nexport class Aggregator7KSwap extends BaseIntention<BluefinIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.Aggregator7KSwap;\n\n  constructor(public readonly data: BluefinIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    console.log(this.data);\n    return TxBuilder.aggregator7KSwap(this.data as Aggregator7KSwapIntentionData, account, network);\n  }\n\n  static fromData(data: BluefinIntentionData) {\n    return new Aggregator7KSwap(data);\n  }\n}\n","// eslint-disable-next-line import/no-extraneous-dependencies\nimport { buildTx, getQuote } from '@bluefin-exchange/bluefin7k-aggregator-sdk';\nimport { BN, ClmmPoolUtil, LiquidityInput } from '@firefly-exchange/library-sui';\nimport { Pool } from '@firefly-exchange/library-sui/dist/src/spot/types';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Decimal } from 'turbos-clmm-sdk';\n\nimport { getBluefinSpotSDK } from './config';\nimport {\n  ClosePositionIntentionData,\n  CollectRewardsAndFeeIntentionData,\n  CollectFeeIntentionData,\n  CollectRewardsIntentionData,\n  OpenPositionIntentionData,\n  ProvideLiquidityIntentionData,\n  RemoveLiquidityIntentionData,\n  SuiNetworks,\n  Aggregator7KSwapIntentionData,\n} from './types';\n\nexport default class TxBuilder {\n  static async OpenPosition(\n    txParams: OpenPositionIntentionData,\n    account: WalletAccount,\n    network: SuiNetworks,\n  ): Promise<Transaction> {\n    const sdk = getBluefinSpotSDK(network, account);\n\n    const pool = await sdk.queryChain.getPool(txParams.pool);\n\n    const liquidityInput = this.prototype.buildLiqInput(pool, { ...txParams, slippage: 0 });\n\n    const txb: Transaction = (await sdk.openPositionWithFixedAmount(\n      pool,\n      txParams.lowerTick,\n      txParams.upperTick,\n      liquidityInput,\n      {\n        returnTx: true,\n        sender: account.address,\n      },\n    )) as unknown as Transaction;\n\n    return txb;\n  }\n\n  static async provideLiquidity(\n    txParams: ProvideLiquidityIntentionData,\n    account: WalletAccount,\n    network: SuiNetworks,\n  ): Promise<Transaction> {\n    const sdk = getBluefinSpotSDK(network, account);\n\n    const pool = await sdk.queryChain.getPool(txParams.pool);\n\n    const res = this.prototype.buildLiqInput(pool, txParams);\n\n    const txb = (await sdk.provideLiquidityWithFixedAmount(pool, txParams.position, res, {\n      returnTx: true,\n      sender: account.address,\n    })) as any as Transaction;\n\n    return txb;\n  }\n\n  static async removeLiquidity(\n    txParams: RemoveLiquidityIntentionData,\n    account: WalletAccount,\n    network: SuiNetworks,\n  ): Promise<Transaction> {\n    const sdk = getBluefinSpotSDK(network, account);\n\n    const pool = await sdk.queryChain.getPool(txParams.pool);\n\n    const txb = (await sdk.removeLiquidity(\n      pool,\n      txParams.position,\n      {\n        liquidityAmount: new BN(txParams.liquidity),\n        tokenMaxA: new BN(txParams.maxAmountTokenA),\n        tokenMaxB: new BN(txParams.maxAmountTokenB),\n      } as any as LiquidityInput,\n      {\n        returnTx: true,\n        sender: account.address,\n      },\n    )) as any as Transaction;\n\n    return txb;\n  }\n\n  static async closePosition(\n    txParams: ClosePositionIntentionData,\n    account: WalletAccount,\n    network: SuiNetworks,\n  ): Promise<Transaction> {\n    const sdk = getBluefinSpotSDK(network, account);\n\n    const pool = await sdk.queryChain.getPool(txParams.pool);\n\n    const txb = (await sdk.closePosition(pool, txParams.position, {\n      returnTx: true,\n      sender: account.address,\n    })) as any as Transaction;\n\n    return txb;\n  }\n\n  static async collectRewards(\n    txParams: CollectRewardsIntentionData,\n    account: WalletAccount,\n    network: SuiNetworks,\n  ): Promise<Transaction> {\n    const sdk = getBluefinSpotSDK(network, account);\n\n    const pool = await sdk.queryChain.getPool(txParams.pool);\n\n    const txb: Transaction = (await sdk.collectRewards(pool, txParams.position, {\n      rewardCoinsType: txParams.collectRewardTokens,\n      returnTx: true,\n      sender: account.address,\n    })) as any as Transaction;\n\n    return txb;\n  }\n\n  static async collectFee(\n    txParams: CollectFeeIntentionData,\n    account: WalletAccount,\n    network: SuiNetworks,\n  ): Promise<Transaction> {\n    const sdk = getBluefinSpotSDK(network, account);\n\n    const pool = await sdk.queryChain.getPool(txParams.pool);\n\n    const txb: Transaction = (await sdk.collectFee(pool, txParams.position, {\n      returnTx: true,\n      sender: account.address,\n    })) as any as Transaction;\n\n    return txb;\n  }\n\n  static async collectRewardsAndFee(\n    txParams: CollectRewardsAndFeeIntentionData,\n    account: WalletAccount,\n    network: SuiNetworks,\n  ): Promise<Transaction> {\n    const sdk = getBluefinSpotSDK(network, account);\n\n    const pool = await sdk.queryChain.getPool(txParams.pool);\n\n    console.log(txParams.position);\n    const txb: Transaction = (await sdk.collectFeeAndRewards(pool, txParams.position, {\n      returnTx: true,\n      sender: account.address,\n    })) as any as Transaction;\n\n    return txb;\n  }\n\n  static async aggregator7KSwap(\n    txParams: Aggregator7KSwapIntentionData,\n    account: WalletAccount,\n    network: SuiNetworks,\n  ): Promise<Transaction> {\n    const _ = getBluefinSpotSDK(network, account);\n\n    const quoteResponse = await getQuote({\n      tokenIn: txParams.tokenIn.address,\n      tokenOut: txParams.tokenOut.address,\n      amountIn: new Decimal(txParams.amountIn).mul(10 ** txParams.tokenIn.decimals).toString(),\n    });\n\n    const txb = await buildTx({\n      quoteResponse,\n      accountAddress: account.address,\n      slippage: txParams.maxSlippage,\n      commission: {\n        partner: '0x956d6ea2da156a037952964badc51f997cc5581c86a0e05f74049e6effab9347',\n        commissionBps: 0,\n      },\n    });\n\n    (txb.tx as Transaction).setSender(account.address);\n\n    return txb.tx as Transaction;\n  }\n\n  /// Method to create the liquidity input payload\n  private buildLiqInput(pool: Pool, params: any): LiquidityInput {\n    const res = ClmmPoolUtil.estLiquidityAndCoinAmountFromOneAmounts(\n      params.lowerTick,\n      params.upperTick,\n      new BN(params.tokenAmount),\n      params.isTokenAFixed,\n      true,\n      0,\n      new BN(pool.current_sqrt_price),\n    );\n    return { ...res, tokenMaxA: new BN(params.maxAmountTokenA), tokenMaxB: new BN(params.maxAmountTokenB) };\n  }\n}\n","// eslint-disable-next-line import/no-extraneous-dependencies\nimport { SuiClient } from '@firefly-exchange/library-sui';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { IBluefinSpotContracts, OnChainCalls } from '@firefly-exchange/library-sui/spot';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from './types';\n\nexport const config = {\n  rpc: 'https://fullnode.mainnet.sui.io/',\n  objects: {\n    GlobalConfig: '0x03db251ba509a8d5d8777b6338836082335d93eecbdd09a11e190a1cff51c352',\n    BasePackage: '0x3492c874c1e3b3e2984e8c41b589e642d4d0a5d6459e5a9cfc2d52fd7c89c267',\n    CurrentPackage: '0x67b34b728c4e28e704dcfecf7c5cf55c7fc593b6c65c20d1836d97c209c1928a',\n  } as any as IBluefinSpotContracts,\n};\n\nexport const getBluefinSpotSDK = (network: SuiNetworks, account: WalletAccount) => {\n  if (network !== 'sui:mainnet') {\n    throw new Error('Bluefin spot protocol is only available on sui::mainnet');\n  }\n\n  const client = new SuiClient({ url: config.rpc });\n\n  const spotSDK = new OnChainCalls(client, config.objects, { address: account.address, isUIWallet: false });\n\n  return spotSDK;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, ClosePositionIntentionData } from '../types';\n\nexport class ClosePosition extends BaseIntention<BluefinIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.ClosePosition;\n\n  constructor(public readonly data: BluefinIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    console.log(this.data);\n    return TxBuilder.closePosition(this.data as ClosePositionIntentionData, account, network);\n  }\n\n  static fromData(data: BluefinIntentionData) {\n    return new ClosePosition(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, CollectFeeIntentionData } from '../types';\n\nexport class CollectFee extends BaseIntention<BluefinIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.CollectFee;\n\n  constructor(public readonly data: BluefinIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    console.log(this.data);\n    return TxBuilder.collectFee(this.data as CollectFeeIntentionData, account, network);\n  }\n\n  static fromData(data: BluefinIntentionData) {\n    return new CollectFee(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, CollectRewardsIntentionData } from '../types';\n\nexport class CollectRewards extends BaseIntention<BluefinIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.CollectRewards;\n\n  constructor(public readonly data: BluefinIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    console.log(this.data);\n    return TxBuilder.collectRewards(this.data as CollectRewardsIntentionData, account, network);\n  }\n\n  static fromData(data: BluefinIntentionData) {\n    return new CollectRewards(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, CollectRewardsAndFeeIntentionData } from '../types';\n\nexport class CollectRewardsAndFee extends BaseIntention<BluefinIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.CollectRewardsAndFee;\n\n  constructor(public readonly data: BluefinIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    console.log(this.data);\n    return TxBuilder.collectRewardsAndFee(this.data as CollectRewardsAndFeeIntentionData, account, network);\n  }\n\n  static fromData(data: BluefinIntentionData) {\n    return new CollectRewardsAndFee(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, OpenPositionIntentionData } from '../types';\n\nexport class OpenAndAddLiquidity extends BaseIntention<BluefinIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.OpenPosition;\n\n  constructor(public readonly data: BluefinIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    console.log(this.data);\n    return TxBuilder.OpenPosition(this.data as OpenPositionIntentionData, account, network);\n  }\n\n  static fromData(data: BluefinIntentionData) {\n    return new OpenAndAddLiquidity(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, ProvideLiquidityIntentionData } from '../types';\n\nexport class ProvideLiquidity extends BaseIntention<BluefinIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.ProvideLiquidity;\n\n  constructor(public readonly data: BluefinIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    console.log(this.data);\n    return TxBuilder.provideLiquidity(this.data as ProvideLiquidityIntentionData, account, network);\n  }\n\n  static fromData(data: BluefinIntentionData) {\n    return new ProvideLiquidity(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiClient } from '@/compat/mysten-sui-json-rpc';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, RemoveLiquidityIntentionData } from '../types';\n\nexport class RemoveLiquidity extends BaseIntention<BluefinIntentionData> {\n  txType = TransactionType.Other;\n\n  txSubType = TransactionSubType.RemoveLiquidity;\n\n  constructor(public readonly data: BluefinIntentionData) {\n    super(data);\n  }\n\n  async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n    const { account, network } = input;\n    console.log(this.data);\n    return TxBuilder.removeLiquidity(this.data as RemoveLiquidityIntentionData, account, network);\n  }\n\n  static fromData(data: BluefinIntentionData) {\n    return new RemoveLiquidity(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternalGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { AddLiquidityIntention } from './intentions/add-liquidity';\nimport { AddLiquiditySingleSideIntention } from './intentions/add-liquidity-single-side';\nimport { ClaimAllRewardsIntention } from './intentions/claim-all-rewards';\nimport { ClaimRewardAsIntention } from './intentions/claim-reward-as';\nimport { ClaimRewardsIntention } from './intentions/claim-rewards';\nimport { ManageLiquidityIntention } from './intentions/manage-liquidity';\nimport { ManageLiquiditySingleSideIntention } from './intentions/manage-liquidity-single-side';\nimport { RemoveLiquidityIntention } from './intentions/remove-liquidity';\nimport { StakeXSuiIntention } from './intentions/stake-xsui';\nimport { SwapIntention } from './intentions/swap';\nimport { UnstakeXSuiIntention } from './intentions/unstake-xsui';\nimport { BondVeMMTIntention } from './intentions/vemmt-bond';\nimport { ExtendVeMMTIntention } from './intentions/vemmt-extend';\nimport { MergeVeMMTIntention } from './intentions/vemmt-merge';\nimport { UnbondVeMMTIntention } from './intentions/vemmt-unbond';\nimport {\n  AddLiquidityIntentionData,\n  AddLiquiditySingleSideIntentionData,\n  BondVeMMTIntentionData,\n  ExtendVeMMTIntentionData,\n  MergeVeMMTIntentionData,\n  UnbondVeMMTIntentionData,\n  ClaimAllRewardsIntentionData,\n  ClaimRewardsIntentionData,\n  RemoveLiquidityIntentionData,\n  SwapIntentionData,\n  MMTDEXIntentionData,\n  TransactionSubType,\n  UnstakeXSuiIntentionData,\n  StakeXSuiIntentionData,\n  ManageLiquiditySingleSideIntentionData,\n  ManageLiquidityIntentionData,\n  ClaimRewardsAsIntentionData,\n} from './types';\n\nexport type MMTDEXIntention =\n  | AddLiquidityIntention\n  | AddLiquiditySingleSideIntention\n  | BondVeMMTIntention\n  | ExtendVeMMTIntention\n  | MergeVeMMTIntention\n  | UnbondVeMMTIntention\n  | ClaimRewardsIntention\n  | ClaimAllRewardsIntention\n  | ClaimRewardAsIntention\n  | RemoveLiquidityIntention\n  | SwapIntention\n  | StakeXSuiIntention\n  | UnstakeXSuiIntention\n  | ManageLiquidityIntention\n  | ManageLiquiditySingleSideIntention;\n\nexport class MMTDEXAppHelper implements IAppHelperInternalGrpc<MMTDEXIntentionData> {\n  application = 'mmt-dex';\n\n  supportSDK = '@mysten/sui-v2' as const;\n\n  async deserialize(\n    input: SuiSignTransactionBlockInput & {\n      network: SuiNetworks;\n      suiGrpcClient: SuiGrpcClient;\n      account: WalletAccount;\n      transaction: Transaction;\n      appContext: MMTDEXIntentionData;\n    },\n  ): Promise<{\n    txType: TransactionType;\n    txSubType: TransactionSubType;\n    intentionData: MMTDEXIntentionData;\n  }> {\n    const { appContext } = input;\n    return {\n      txType: TransactionType.Other,\n      txSubType: appContext.action,\n      intentionData: appContext,\n    };\n  }\n\n  async build(input: {\n    intentionData: MMTDEXIntentionData;\n    txType: TransactionType;\n    txSubType: string;\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    let intention: MMTDEXIntention;\n    switch (input.txSubType) {\n      case TransactionSubType.Swap:\n        intention = SwapIntention.fromData(input.intentionData as SwapIntentionData);\n        break;\n      case TransactionSubType.AddLiquidity:\n        intention = AddLiquidityIntention.fromData(input.intentionData as AddLiquidityIntentionData);\n        break;\n      case TransactionSubType.AddLiquiditySingleSide:\n        intention = AddLiquiditySingleSideIntention.fromData(\n          input.intentionData as AddLiquiditySingleSideIntentionData,\n        );\n        break;\n      case TransactionSubType.ClaimRewards:\n        intention = ClaimRewardsIntention.fromData(input.intentionData as ClaimRewardsIntentionData);\n        break;\n      case TransactionSubType.ClaimAllRewards:\n        intention = ClaimAllRewardsIntention.fromData(input.intentionData as ClaimAllRewardsIntentionData);\n        break;\n      case TransactionSubType.ClaimRewardsAs:\n        intention = ClaimRewardAsIntention.fromData(input.intentionData as ClaimRewardsAsIntentionData);\n        break;\n      case TransactionSubType.RemoveLiquidity:\n        intention = RemoveLiquidityIntention.fromData(input.intentionData as RemoveLiquidityIntentionData);\n        break;\n      case TransactionSubType.StakeXSui:\n        intention = StakeXSuiIntention.fromData(input.intentionData as StakeXSuiIntentionData);\n        break;\n      case TransactionSubType.UnstakeXSui:\n        intention = UnstakeXSuiIntention.fromData(input.intentionData as UnstakeXSuiIntentionData);\n        break;\n      case TransactionSubType.ManageLiquidity:\n        intention = ManageLiquidityIntention.fromData(input.intentionData as ManageLiquidityIntentionData);\n        break;\n      case TransactionSubType.ManageLiquiditySingleSide:\n        intention = ManageLiquiditySingleSideIntention.fromData(\n          input.intentionData as ManageLiquiditySingleSideIntentionData,\n        );\n        break;\n      case TransactionSubType.Bond:\n        intention = BondVeMMTIntention.fromData(input.intentionData as BondVeMMTIntentionData);\n        break;\n      case TransactionSubType.Extend:\n        intention = ExtendVeMMTIntention.fromData(input.intentionData as ExtendVeMMTIntentionData);\n        break;\n      case TransactionSubType.Merge:\n        intention = MergeVeMMTIntention.fromData(input.intentionData as MergeVeMMTIntentionData);\n        break;\n      case TransactionSubType.Unbond:\n        intention = UnbondVeMMTIntention.fromData(input.intentionData as UnbondVeMMTIntentionData);\n        break;\n      default:\n        throw new Error(`not implemented ${input.txSubType}`);\n    }\n    return intention.build({\n      suiGrpcClient: input.suiGrpcClient,\n      account: input.account,\n      network: input.network,\n    });\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType, AddLiquidityIntentionData } from '../types';\nimport { executeClmmDeposit } from '../utils/liquidity';\nimport { createMmtSdk } from '../utils/sdk';\n\nexport class AddLiquidityIntention extends BaseIntentionGrpc<AddLiquidityIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.AddLiquidity;\n\n  constructor(public override readonly data: AddLiquidityIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const sdk = createMmtSdk(input.suiGrpcClient);\n    const { params } = this.data;\n    const { address, amountA, amountB, pool, selectedLowTick, selectedHighTick, slippage } = params;\n    const tx = new Transaction();\n\n    await executeClmmDeposit(\n      sdk,\n      tx,\n      address,\n      amountA,\n      amountB,\n      pool,\n      pool.poolId,\n      selectedLowTick,\n      selectedHighTick,\n      slippage,\n    );\n\n    return tx;\n  }\n\n  static fromData(data: AddLiquidityIntentionData) {\n    return new AddLiquidityIntention(data);\n  }\n}\n","import { MmtSDK, TickMath } from '@mmt-finance/clmm-sui-sdk';\nimport { Transaction } from '@mysten/sui/transactions';\nimport BigNumber from 'bignumber.js';\nimport BN from 'bn.js';\n\nimport type { MsafeSuiGrpcClient } from '@/lib/suiGrpcClient';\n\nimport { getExactCoinByAmount, normalizeSuiCoinType } from './common';\nimport { claimV3Rewards } from './reward';\nimport { V3PositionType, NormalizedPool } from '../types';\n// eslint-disable-next-line import/no-cycle\n\nfunction signedShiftRight(n0: BN, shiftBy: number, bitWidth: number) {\n  const twoN0 = n0.toTwos(bitWidth).shrn(shiftBy);\n  twoN0.imaskn(bitWidth - shiftBy + 1);\n  return twoN0.fromTwos(bitWidth - shiftBy);\n}\n\nfunction tickIndexToSqrtPricePositive(tick: number) {\n  let ratio: BN;\n\n  if ((tick & 1) !== 0) {\n    ratio = new BN('79232123823359799118286999567');\n  } else {\n    ratio = new BN('79228162514264337593543950336');\n  }\n\n  if ((tick & 2) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79236085330515764027303304731')), 96, 256);\n  }\n  if ((tick & 4) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79244008939048815603706035061')), 96, 256);\n  }\n  if ((tick & 8) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79259858533276714757314932305')), 96, 256);\n  }\n  if ((tick & 16) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79291567232598584799939703904')), 96, 256);\n  }\n  if ((tick & 32) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79355022692464371645785046466')), 96, 256);\n  }\n  if ((tick & 64) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79482085999252804386437311141')), 96, 256);\n  }\n  if ((tick & 128) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79736823300114093921829183326')), 96, 256);\n  }\n  if ((tick & 256) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('80248749790819932309965073892')), 96, 256);\n  }\n  if ((tick & 512) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('81282483887344747381513967011')), 96, 256);\n  }\n  if ((tick & 1024) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('83390072131320151908154831281')), 96, 256);\n  }\n  if ((tick & 2048) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('87770609709833776024991924138')), 96, 256);\n  }\n  if ((tick & 4096) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('97234110755111693312479820773')), 96, 256);\n  }\n  if ((tick & 8192) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('119332217159966728226237229890')), 96, 256);\n  }\n  if ((tick & 16384) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('179736315981702064433883588727')), 96, 256);\n  }\n  if ((tick & 32768) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('407748233172238350107850275304')), 96, 256);\n  }\n  if ((tick & 65536) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('2098478828474011932436660412517')), 96, 256);\n  }\n  if ((tick & 131072) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('55581415166113811149459800483533')), 96, 256);\n  }\n  if ((tick & 262144) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('38992368544603139932233054999993551')), 96, 256);\n  }\n\n  return signedShiftRight(ratio, 32, 256);\n}\n\nfunction tickIndexToSqrtPriceNegative(tickIndex: number) {\n  const tick = Math.abs(tickIndex);\n  let ratio: BN;\n\n  if ((tick & 1) !== 0) {\n    ratio = new BN('18445821805675392311');\n  } else {\n    ratio = new BN('18446744073709551616');\n  }\n\n  if ((tick & 2) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18444899583751176498')), 64, 256);\n  }\n  if ((tick & 4) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18443055278223354162')), 64, 256);\n  }\n  if ((tick & 8) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18439367220385604838')), 64, 256);\n  }\n  if ((tick & 16) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18431993317065449817')), 64, 256);\n  }\n  if ((tick & 32) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18417254355718160513')), 64, 256);\n  }\n  if ((tick & 64) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18387811781193591352')), 64, 256);\n  }\n  if ((tick & 128) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18329067761203520168')), 64, 256);\n  }\n  if ((tick & 256) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18212142134806087854')), 64, 256);\n  }\n  if ((tick & 512) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('17980523815641551639')), 64, 256);\n  }\n  if ((tick & 1024) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('17526086738831147013')), 64, 256);\n  }\n  if ((tick & 2048) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('16651378430235024244')), 64, 256);\n  }\n  if ((tick & 4096) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('15030750278693429944')), 64, 256);\n  }\n  if ((tick & 8192) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('12247334978882834399')), 64, 256);\n  }\n  if ((tick & 16384) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('8131365268884726200')), 64, 256);\n  }\n  if ((tick & 32768) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('3584323654723342297')), 64, 256);\n  }\n  if ((tick & 65536) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('696457651847595233')), 64, 256);\n  }\n  if ((tick & 131072) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('26294789957452057')), 64, 256);\n  }\n  if ((tick & 262144) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('37481735321082')), 64, 256);\n  }\n\n  return ratio;\n}\n\nexport const tickIndexToSqrtPriceX64 = (tickIndex: number, tickSpacing: number, scaleUp?: boolean): BN => {\n  const signedTick = TickMath.convertI32ToSigned(\n    scaleUp ? tickIndex + (tickIndex % (tickSpacing ?? 1)) : tickIndex - (tickIndex % (tickSpacing ?? 1)),\n  );\n  if (signedTick > 0) {\n    return new BN(tickIndexToSqrtPricePositive(signedTick));\n  }\n  return new BN(tickIndexToSqrtPriceNegative(signedTick));\n};\n\nexport function toBaseUnits(amount: string, decimals: number): bigint {\n  if (!/^(\\d+)(\\.\\d+)?$/.test(amount)) {\n    return BigInt(0);\n  }\n  const [whole, fraction = ''] = amount.split('.');\n  const fractionPadded = (fraction + '0'.repeat(decimals)).slice(0, decimals);\n  const baseStr = whole + fractionPadded;\n  const baseStrClean = baseStr.replace(/^0+/, '') || '0';\n  return BigInt(baseStrClean);\n}\n\nexport async function getCoinObject({\n  address,\n  coinType,\n  coinAmount,\n  coinDecimals,\n  tx,\n  mmt,\n}: {\n  mmt: MmtSDK;\n  address: string;\n  coinAmount: string;\n  coinType: string;\n  coinDecimals: number;\n  tx: Transaction;\n}) {\n  const amount = toBaseUnits(coinAmount, coinDecimals);\n  let inputCoin;\n  if (!Number(coinAmount)) {\n    [inputCoin] = tx.moveCall({\n      target: `0x2::coin::zero`,\n      typeArguments: [coinType],\n      arguments: [],\n    });\n  } else {\n    inputCoin = await getExactCoinByAmount(mmt, address, normalizeSuiCoinType(coinType), amount, tx);\n  }\n  return inputCoin;\n}\n\nexport function getNewPositionObject({\n  mmt,\n  tx,\n  poolModel,\n  selectedLowTick,\n  selectedHighTick,\n}: {\n  mmt: MmtSDK;\n  tx: Transaction;\n  poolModel: {\n    poolId: string;\n    tokenXType: string;\n    tokenYType: string;\n    tickSpacing: number;\n    isStable?: boolean;\n  };\n  selectedLowTick: number;\n  selectedHighTick: number;\n}) {\n  const lowerTickSqrtPrice = tickIndexToSqrtPriceX64(\n    TickMath.convertI32ToSigned(selectedLowTick),\n    poolModel.tickSpacing!,\n  );\n  const upperTickSqrtPrice = tickIndexToSqrtPriceX64(\n    TickMath.convertI32ToSigned(selectedHighTick),\n    poolModel.tickSpacing!,\n  );\n\n  return mmt.Position.openPosition({\n    txb: tx,\n    pool: poolModel,\n    lowerTickSqrtPrice: lowerTickSqrtPrice.toString(),\n    upperTickSqrtPrice: upperTickSqrtPrice.toString(),\n  });\n}\n\nconst getResultAmountUsingSlippage = (amount: bigint, slippagePercentage: number) => {\n  const basisPoints = Math.floor(slippagePercentage * 100); // 0.5% -> 50 basis points\n  const remainingBasisPoints = 10000 - basisPoints; // 10000 - 50 = 9950\n\n  return (amount * BigInt(remainingBasisPoints)) / BigInt(10000);\n};\n\nexport function getMinimalAmountUsingSlippage(\n  coinAmount: string,\n  decimals: number,\n  slippage: number, // (0, 100), 1 = 1%\n): bigint {\n  const amount = toBaseUnits(coinAmount, decimals);\n\n  if (Number(coinAmount) === 0) {\n    return BigInt(0);\n  }\n\n  const minimalAmount = getResultAmountUsingSlippage(amount, slippage);\n  return minimalAmount;\n}\n\nexport async function getLimitSqrtPriceUsingSlippage({\n  poolId,\n  currentSqrtPrice,\n  tokenX,\n  tokenY,\n  slippagePercentage,\n  isTokenX,\n  suiClient,\n}: Pick<NormalizedPool, 'currentSqrtPrice' | 'tokenX' | 'tokenY'> & {\n  slippagePercentage: number; // 1 = 1% slippage\n  isTokenX: boolean;\n  suiClient: Pick<MsafeSuiGrpcClient, 'getObject'>;\n  poolId: string;\n}) {\n  // Align with mmt-dex-v3: gRPC object.json exposes Move fields at the top level.\n  const { object: rpcPool } = await suiClient.getObject({\n    objectId: poolId,\n    include: { json: true },\n  });\n\n  const rpcPoolCurrentPrice =\n    (rpcPool?.json as { sqrt_price?: unknown } | null | undefined)?.sqrt_price ?? currentSqrtPrice;\n\n  const currentPrice = TickMath.sqrtPriceX64ToPrice(\n    new BN(rpcPoolCurrentPrice?.toString()),\n    tokenX.decimals,\n    tokenY.decimals,\n  );\n\n  const minReceiveRate = isTokenX ? (100 - slippagePercentage) / 100 : (100 + slippagePercentage) / 100;\n\n  const limitSqrtPrice = TickMath.priceToSqrtPriceX64(\n    currentPrice.mul(minReceiveRate),\n    tokenX.decimals,\n    tokenY.decimals,\n  );\n\n  return BigInt(limitSqrtPrice.toString());\n}\n\n/** ========================================== add liquidity to new position ================================================ */\nexport const executeClmmDeposit = async (\n  mmt: MmtSDK,\n  tx: Transaction,\n  address: string,\n  amountA: string,\n  amountB: string,\n  pool: NormalizedPool,\n  poolId: string,\n  selectedLowTick: number,\n  selectedHighTick: number,\n  slippage: number,\n) => {\n  const inputCoinX = await getCoinObject({\n    mmt,\n    address,\n    coinType: pool.tokenX.coinType,\n    coinAmount: amountA,\n    coinDecimals: pool.tokenX.decimals,\n    tx,\n  });\n\n  const inputCoinY = await getCoinObject({\n    mmt,\n    address,\n    coinType: pool.tokenY.coinType,\n    coinAmount: amountB,\n    coinDecimals: pool.tokenY.decimals,\n    tx,\n  });\n\n  const poolModel = {\n    poolId,\n    tokenXType: pool.tokenXType,\n    tokenYType: pool.tokenYType,\n    tickSpacing: pool.tickSpacing,\n    isStable: pool.isStable,\n  };\n\n  const position = getNewPositionObject({\n    mmt,\n    tx,\n    poolModel,\n    selectedLowTick,\n    selectedHighTick,\n  });\n\n  const minimalAmountA = getMinimalAmountUsingSlippage(amountA, pool.tokenX.decimals, slippage);\n  const minimalAmountB = getMinimalAmountUsingSlippage(amountB, pool.tokenY.decimals, slippage);\n\n  await mmt.Pool.addLiquidity({\n    txb: tx,\n    pool: poolModel,\n    position: position!,\n    coinX: inputCoinX!,\n    coinY: inputCoinY!,\n    minAmountX: minimalAmountA,\n    minAmountY: minimalAmountB,\n    transferToAddress: address,\n    useMvr: true,\n  });\n  tx.transferObjects([position!], tx.pure.address(address));\n};\n\nexport const executeSingleSidedClmmDeposit = async (\n  mmt: MmtSDK,\n  tx: Transaction,\n  suiClient: Pick<MsafeSuiGrpcClient, 'getObject'>,\n  address: string,\n  amount: string,\n  isTokenX: boolean,\n  pool: NormalizedPool,\n  selectedLowTick: number,\n  selectedHighTick: number,\n  swapSlippage: number,\n  addLiquiditySlippage: number,\n) => {\n  try {\n    const inputCoin = await getCoinObject({\n      mmt,\n      address,\n      coinType: isTokenX ? pool.tokenX.coinType : pool.tokenY.coinType,\n      coinAmount: amount,\n      coinDecimals: isTokenX ? pool.tokenX.decimals : pool.tokenY.decimals,\n      tx,\n    });\n\n    const poolModel = {\n      poolId: pool.poolId,\n      tokenXType: normalizeSuiCoinType(pool.tokenX.coinType),\n      tokenYType: normalizeSuiCoinType(pool.tokenY.coinType),\n      tickSpacing: pool.tickSpacing,\n      isStable: pool.isStable,\n    };\n\n    const position = getNewPositionObject({\n      mmt,\n      tx,\n      poolModel,\n      selectedLowTick,\n      selectedHighTick,\n    });\n\n    const limitSqrtPrice = await getLimitSqrtPriceUsingSlippage({\n      suiClient,\n      poolId: pool.poolId,\n      currentSqrtPrice: pool.currentSqrtPrice,\n      tokenX: pool.tokenX,\n      tokenY: pool.tokenY,\n      slippagePercentage: swapSlippage,\n      isTokenX,\n    });\n\n    await mmt.Pool.zapInLiquidity({\n      txb: tx,\n      pool: poolModel,\n      position: position!,\n      inputCoin,\n      isXtoY: isTokenX,\n      limitSqrtPrice,\n      slippagePercentage: addLiquiditySlippage,\n      transferToAddress: address,\n      useMvr: true,\n    });\n\n    tx.transferObjects([position!], tx.pure.address(address));\n  } catch (error) {\n    console.error(error);\n  }\n};\n\n/** ======================== add liquidity to existing position ========================== */\nexport const executeAddLiquidityToExistingPosition = async (\n  mmt: MmtSDK,\n  tx: Transaction,\n  address: string,\n  amountA: string,\n  amountB: string,\n  pool: NormalizedPool,\n  positionObjectId: string,\n  slippage: number,\n) => {\n  const inputCoinX = await getCoinObject({\n    mmt,\n    address,\n    coinType: pool.tokenX.coinType,\n    coinAmount: amountA,\n    coinDecimals: pool.tokenX.decimals,\n    tx,\n  });\n\n  const inputCoinY = await getCoinObject({\n    mmt,\n    address,\n    coinType: pool.tokenY.coinType,\n    coinAmount: amountB,\n    coinDecimals: pool.tokenY.decimals,\n    tx,\n  });\n\n  const poolModel = {\n    poolId: pool.poolId,\n    tokenXType: pool.tokenXType,\n    tokenYType: pool.tokenYType,\n    tickSpacing: pool.tickSpacing,\n    isStable: pool.isStable,\n  };\n\n  const minimalXAmount = getMinimalAmountUsingSlippage(amountA, pool.tokenX.decimals, slippage);\n  const minimalYAmount = getMinimalAmountUsingSlippage(amountB, pool.tokenY.decimals, slippage);\n\n  await mmt.Pool.addLiquidity({\n    txb: tx,\n    pool: poolModel,\n    position: positionObjectId,\n    coinX: inputCoinX,\n    coinY: inputCoinY,\n    minAmountX: minimalXAmount,\n    minAmountY: minimalYAmount,\n    transferToAddress: address,\n  });\n};\n\nexport const executeAddSingleSidedLiquidityToExistingPosition = async (\n  mmt: MmtSDK,\n  tx: Transaction,\n  address: string,\n  amount: string,\n  isTokenX: boolean,\n  pool: NormalizedPool,\n  positionObjectId: string,\n  swapSlippage: number,\n  addLiquiditySlippage: number,\n) => {\n  try {\n    const inputCoin = await getCoinObject({\n      mmt,\n      address,\n      coinType: isTokenX ? pool.tokenX.coinType : pool.tokenY.coinType,\n      coinAmount: amount,\n      coinDecimals: isTokenX ? pool.tokenX.decimals : pool.tokenY.decimals,\n      tx,\n    });\n\n    const poolModel = {\n      poolId: pool.poolId,\n      tokenXType: pool.tokenX.coinType,\n      tokenYType: pool.tokenY.coinType,\n      tickSpacing: pool.tickSpacing,\n      isStable: pool.isStable,\n    };\n\n    const limitSqrtPrice = await getLimitSqrtPriceUsingSlippage({\n      suiClient: mmt.rpcClient,\n      poolId: pool.poolId,\n      currentSqrtPrice: pool.currentSqrtPrice,\n      tokenX: pool.tokenX,\n      tokenY: pool.tokenY,\n      slippagePercentage: swapSlippage,\n      isTokenX,\n    });\n\n    await mmt.Pool.zapInLiquidity({\n      txb: tx,\n      pool: poolModel,\n      position: positionObjectId,\n      inputCoin,\n      isXtoY: isTokenX,\n      limitSqrtPrice,\n      slippagePercentage: addLiquiditySlippage,\n      transferToAddress: address,\n    });\n  } catch (error) {\n    console.error(error);\n    throw error;\n  }\n};\n\nconst getLiquidityAmountByPercentage = (liquidity: string, percentage: number) =>\n  BigInt(percentage === 100 ? liquidity : new BigNumber(liquidity).multipliedBy(percentage / 100).toFixed(0));\n\nexport const removeClmmLiquidity = async (\n  sdk: MmtSDK,\n  address: string,\n  position: V3PositionType,\n  pool: NormalizedPool,\n  withdrawPercentage: number,\n  tx: Transaction,\n): Promise<void> => {\n  const removeLiqAmount = getLiquidityAmountByPercentage(position.liquidity, withdrawPercentage);\n  const typeX = pool.tokenX.coinType;\n  const typeY = pool.tokenY.coinType;\n\n  const poolModel = {\n    poolId: pool.poolId,\n    tokenXType: typeX,\n    tokenYType: typeY,\n    tickSpacing: pool.tickSpacing,\n    isStable: pool.isStable,\n  };\n\n  await sdk.Pool.removeLiquidity({\n    txb: tx,\n    pool: poolModel,\n    positionId: position.objectId,\n    liquidity: removeLiqAmount,\n    minAmountX: BigInt(0),\n    minAmountY: BigInt(0),\n    transferToAddress: address,\n  });\n\n  claimV3Rewards(sdk, address, position, pool, tx);\n\n  if (withdrawPercentage === 100) {\n    sdk.Position.closePosition({\n      txb: tx,\n      positionId: position.objectId,\n    });\n  }\n};\n\nexport const removeLiquiditySingleSided = async ({\n  sdk,\n  address,\n  position,\n  pool,\n  withdrawPercentage,\n  txb,\n  targetCoinType,\n  slippage,\n}: {\n  sdk: MmtSDK;\n  address: string;\n  position: V3PositionType;\n  pool: NormalizedPool;\n  withdrawPercentage: number;\n  txb: Transaction;\n  targetCoinType: string;\n  slippage: number;\n}) => {\n  const removeLiqAmount = getLiquidityAmountByPercentage(position.liquidity, withdrawPercentage);\n\n  const typeX = normalizeSuiCoinType(pool.tokenX.coinType);\n  const typeY = normalizeSuiCoinType(pool.tokenY.coinType);\n  const isSwapXToY = normalizeSuiCoinType(targetCoinType) === typeY;\n\n  const poolModel = {\n    poolId: pool.poolId,\n    tokenXType: typeX,\n    tokenYType: typeY,\n    tickSpacing: pool.tickSpacing,\n    isStable: pool.isStable,\n  };\n\n  const removeResult = sdk.Pool.removeLiquidity({\n    txb,\n    pool: poolModel,\n    positionId: position.objectId,\n    liquidity: removeLiqAmount,\n    minAmountX: BigInt(0),\n    minAmountY: BigInt(0),\n  });\n  const removeLpCoinA = removeResult?.removeLpCoinA;\n  const removeLpCoinB = removeResult?.removeLpCoinB;\n\n  if (!removeLpCoinA || !removeLpCoinB) {\n    throw new Error('Remove liquidity Failed: empty remove result');\n  }\n\n  const limitSqrtPrice = await getLimitSqrtPriceUsingSlippage({\n    suiClient: sdk.rpcClient,\n    poolId: pool.poolId,\n    currentSqrtPrice: pool.currentSqrtPrice,\n    tokenX: pool.tokenX,\n    tokenY: pool.tokenY,\n    isTokenX: isSwapXToY,\n    slippagePercentage: slippage,\n  });\n\n  const inputCoin = isSwapXToY ? removeLpCoinA : removeLpCoinB;\n\n  const amount = txb.moveCall({\n    target: '0x2::coin::value',\n    arguments: [inputCoin],\n    typeArguments: [isSwapXToY ? typeX : typeY],\n  });\n\n  txb.transferObjects([isSwapXToY ? removeLpCoinB : removeLpCoinA], address);\n\n  sdk.Pool.swap({\n    txb,\n    transferToAddress: address,\n    pool: poolModel,\n    limitSqrtPrice,\n    amount,\n    inputCoin,\n    isXtoY: isSwapXToY,\n  });\n\n  claimV3Rewards(sdk, address, position, pool, txb);\n\n  if (withdrawPercentage === 100) {\n    sdk.Position.closePosition({\n      txb,\n      positionId: position.objectId,\n    });\n  }\n};\n","/* eslint-disable no-restricted-syntax */\nimport { MmtSDK } from '@mmt-finance/clmm-sui-sdk';\nimport type { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\n\nexport const suiCoinType = '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI';\n\ntype MmtCoinStruct = {\n  coinType: string;\n  coinObjectId: string;\n  version: string;\n  digest: string;\n  balance: string;\n  previousTransaction: string;\n};\n\nexport const normalizeSuiCoinType = (coinType: string) => {\n  if (coinType !== '0x2::sui::SUI') {\n    return coinType;\n  }\n  return '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI';\n};\n\nexport const getUserCoins = async ({\n  suiClient,\n  address,\n  type,\n}: {\n  suiClient: Pick<SuiGrpcClient, 'listCoins'>;\n  address: string;\n  type: string;\n}) => {\n  let cursor: string | null | undefined;\n  let coins: MmtCoinStruct[] = [];\n  let iter = 0;\n  do {\n    try {\n      const res = await suiClient.listCoins({\n        owner: address,\n        coinType: type,\n        cursor: cursor ?? undefined,\n        limit: 50,\n      });\n      coins = coins.concat(\n        res.objects.map((coin) => ({\n          coinType: coin.type,\n          coinObjectId: coin.objectId,\n          version: coin.version,\n          digest: coin.digest,\n          balance: coin.balance,\n          previousTransaction: '0x0',\n        })),\n      );\n      cursor = res.cursor;\n      if (!res.hasNextPage || iter === 8) {\n        cursor = null;\n      }\n    } catch (error) {\n      console.log(error);\n      cursor = null;\n    }\n    iter++;\n  } while (cursor !== null);\n  return coins;\n};\n\nconst getCoinsGreaterThanAmount = (amount: bigint, coins: { balance: bigint; objectId: string }[]) => {\n  const coinsWithBalance: string[] = [];\n  let collectedAmount = BigInt(0);\n  for (const coin of coins) {\n    if (collectedAmount < amount && !coinsWithBalance.includes(coin.objectId)) {\n      coinsWithBalance.push(coin.objectId);\n      collectedAmount += BigInt(coin.balance);\n    }\n    if (coin.balance === BigInt(0) && !coinsWithBalance.includes(coin.objectId)) {\n      coinsWithBalance.push(coin.objectId);\n    }\n  }\n  if (collectedAmount >= amount) {\n    return coinsWithBalance;\n  }\n  throw new Error('Insufficient balance');\n};\n\nexport const getExactCoinByAmountInner = (\n  coinType: string,\n  coins: { balance: bigint; objectId: string }[],\n  amount: bigint,\n  txb: Transaction,\n) => {\n  if (coinType === suiCoinType) {\n    const [coinA] = txb.splitCoins(txb.gas, [txb.pure.u64(amount)]);\n    return coinA;\n    // eslint-disable-next-line no-else-return\n  } else {\n    const coinsX = getCoinsGreaterThanAmount(amount, coins);\n    if (coinsX.length > 1) {\n      txb.mergeCoins(\n        txb.object(coinsX[0]),\n        coinsX.slice(1).map((coin) => txb.object(coin)),\n      );\n    }\n    const [coinA] = txb.splitCoins(txb.object(coinsX[0]), [txb.pure.u64(amount)]);\n    return coinA;\n  }\n};\n\nexport async function getExactCoinByAmount(\n  mmtSdk: MmtSDK,\n  address: string,\n  coinType: string,\n  amount: bigint,\n  tx: Transaction,\n) {\n  const userCoins = await getUserCoins({\n    suiClient: mmtSdk.rpcClient,\n    address,\n    type: coinType,\n  });\n\n  const coin = getExactCoinByAmountInner(\n    normalizeSuiCoinType(coinType),\n    userCoins.map((item) => ({\n      balance: BigInt(item.balance),\n      objectId: item.coinObjectId,\n    })),\n    amount,\n    tx,\n  );\n\n  return coin;\n}\n","import { MmtSDK } from '@mmt-finance/clmm-sui-sdk';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { V3PositionType, ClaimRewardsAsParams, NormalizedPool } from '../types';\n\nexport const claimV3Rewards = (\n  mmt: MmtSDK,\n  address: string,\n  position: V3PositionType,\n  pool: NormalizedPool,\n  tx: Transaction,\n) => {\n  const poolModel = {\n    poolId: pool.poolId,\n    tokenXType: pool.tokenXType,\n    tokenYType: pool.tokenYType,\n    tickSpacing: pool.tickSpacing,\n    isStable: pool.isStable,\n  };\n\n  if (pool?.rewarders && pool?.rewarders.length > 0) {\n    mmt.Pool.collectAllRewards({\n      txb: tx,\n      pool: poolModel,\n      rewarders: pool.rewarders.map((rewarder) => ({\n        coin_type: rewarder.coinType,\n        flow_rate: rewarder.flowRate,\n        reward_amount: rewarder.rewardAmount,\n        rewards_allocated: rewarder.rewardsAllocated,\n        hasEnded: rewarder.hasEnded,\n      })),\n      positionId: position.objectId,\n      transferToAddress: address,\n    });\n  }\n\n  mmt.Pool.collectFee({\n    txb: tx,\n    pool: poolModel,\n    positionId: position.objectId,\n    transferToAddress: address,\n  });\n};\n\nexport async function claimRewardsAsTargetCoin({\n  sdk,\n  address,\n  positionId,\n  pool,\n  txb,\n  targetCoinType,\n  slippage,\n}: ClaimRewardsAsParams) {\n  const poolModel = {\n    poolId: pool.poolId,\n    tokenXType: pool.tokenXType,\n    tokenYType: pool.tokenYType,\n    tickSpacing: pool.tickSpacing,\n    isStable: pool.isStable,\n  };\n\n  const rewarderCoinTypes = pool.rewarders.map((rewarder) => rewarder.coinType);\n  // Align with mmt-dex-v3: pass pools into both claimRewardsAs and claimFeeAs.\n  const pools = await sdk.Pool.getAllPools();\n\n  if (rewarderCoinTypes.length > 0) {\n    console.log('claimRewardsAsTargetCoin input', {\n      pool: poolModel,\n      positionId,\n      rewarderCoinTypes,\n      targetCoinType,\n      slippage,\n      toAddress: address,\n    });\n    await sdk.Pool.claimRewardsAs({\n      txb,\n      pool: poolModel,\n      positionId,\n      rewarderCoinTypes,\n      targetCoinType,\n      slippage,\n      toAddress: address,\n      pools,\n    });\n  }\n\n  await sdk.Pool.claimFeeAs({\n    txb,\n    pool: poolModel,\n    positionId,\n    targetCoinType,\n    slippage,\n    toAddress: address,\n    pools,\n  });\n\n  return txb;\n}\n","import { MmtSDK } from '@mmt-finance/clmm-sui-sdk';\nimport { VeMMT } from '@mmt-finance/ve-sdk-v1';\nimport type { SuiGrpcClient } from '@mysten/sui/grpc';\n\nenum Network {\n  Mainnet = 'mainnet',\n}\n\n/**\n * MMT CLMM SDK is typed against SuiGrpcClient.\n * Pass the gRPC-backed client so build traffic stays on gRPC.\n */\nexport function createMmtSdk(suiGrpcClient: SuiGrpcClient): MmtSDK {\n  return new MmtSDK({\n    network: 'mainnet',\n    client: suiGrpcClient,\n  });\n}\n\nexport function createVeMmtSdk(suiGrpcClient: SuiGrpcClient): VeMMT {\n  return new VeMMT(suiGrpcClient as never, Network.Mainnet);\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType, AddLiquiditySingleSideIntentionData } from '../types';\nimport { executeSingleSidedClmmDeposit } from '../utils/liquidity';\nimport { createMmtSdk } from '../utils/sdk';\n\nexport class AddLiquiditySingleSideIntention extends BaseIntentionGrpc<AddLiquiditySingleSideIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.AddLiquiditySingleSide;\n\n  constructor(public override readonly data: AddLiquiditySingleSideIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const sdk = createMmtSdk(input.suiGrpcClient);\n    const { params } = this.data;\n    const { address, amount, isTokenX, pool, selectedLowTick, selectedHighTick, swapSlippage, addLiquiditySlippage } =\n      params;\n    const tx = new Transaction();\n    await executeSingleSidedClmmDeposit(\n      sdk,\n      tx,\n      input.suiGrpcClient,\n      address,\n      amount,\n      isTokenX,\n      pool,\n      selectedLowTick,\n      selectedHighTick,\n      swapSlippage,\n      addLiquiditySlippage,\n    );\n\n    return tx;\n  }\n\n  static fromData(data: AddLiquiditySingleSideIntentionData) {\n    return new AddLiquiditySingleSideIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { ClaimAllRewardsIntentionData, TransactionSubType } from '../types';\nimport { claimV3Rewards } from '../utils/reward';\nimport { createMmtSdk, createVeMmtSdk } from '../utils/sdk';\nimport { claimVeMMTRewards } from '../utils/vemmt';\n\nexport class ClaimAllRewardsIntention extends BaseIntentionGrpc<ClaimAllRewardsIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.ClaimAllRewards;\n\n  constructor(public override readonly data: ClaimAllRewardsIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const sdk = createMmtSdk(input.suiGrpcClient);\n    const veMMTSdk = createVeMmtSdk(input.suiGrpcClient);\n    const { params } = this.data;\n    const { address, positions, pools, veMMTs } = params;\n    const tx = new Transaction();\n\n    // eslint-disable-next-line no-restricted-syntax\n    for (const position of positions) {\n      const pool = pools.find((v3Pool) => v3Pool.poolId === position.poolId);\n      if (pool) {\n        claimV3Rewards(sdk, address, position, pool, tx);\n      }\n    }\n\n    await claimVeMMTRewards(veMMTSdk, address, veMMTs, tx);\n\n    return tx;\n  }\n\n  static fromData(data: ClaimAllRewardsIntentionData) {\n    return new ClaimAllRewardsIntention(data);\n  }\n}\n","import { MmtSDK } from '@mmt-finance/clmm-sui-sdk';\nimport type { Types } from '@mmt-finance/clmm-sui-sdk';\nimport { Transaction } from '@mysten/sui/transactions';\n\ntype Reward = Types.Reward;\n\nexport type NormalizedRewarder = {\n  coinType: string;\n  flowRate: number;\n  hasEnded: boolean;\n  rewardAmount: number;\n  rewardsAllocated: number;\n};\n\nexport type AprBreakdown = {\n  total: string;\n  fee: string;\n  rewards: {\n    coinType: string;\n    apr: string;\n    amountPerDay: number;\n  }[];\n};\n\nexport type NormalizedPool = {\n  poolSource: 'mmt-v3';\n  poolId: string;\n  tokenXType: string;\n  tokenYType: string;\n  tickSpacing: number;\n  lpFeesPercent: string;\n  feeRate: number;\n  protocolFeesPercent: string;\n  isStable: boolean;\n  currentSqrtPrice: string;\n  currentTickIndex: string;\n  liquidity: string;\n  liquidityHM: string;\n  tokenXReserve: string;\n  tokenYReserve: string;\n  tvl: string;\n  apy: string;\n  volume24h: string;\n  fees24h: string;\n  timestamp: string;\n  rewarders: NormalizedRewarder[];\n  tokenX: any; // TokenSchema, but avoid import cycle\n  tokenY: any;\n  aprBreakdown: AprBreakdown;\n};\n\nexport type Tokens = {\n  coinType: string;\n  tokenName: string;\n  ticker: string;\n  iconUrl: string;\n  decimals: number;\n  price: string;\n  description: string;\n  source?: 'hop' | 'af';\n  tokenType?: 'lst' | 'meme' | 'bridged' | '';\n  isVerified?: boolean;\n};\n\nexport type MMTDEXIntentionData = {\n  action: TransactionSubType;\n  params: any;\n};\n\nexport interface AddLiquidityIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.AddLiquidity;\n  params: {\n    address: string;\n    amountA: string;\n    amountB: string;\n    pool: NormalizedPool;\n    selectedLowTick: number;\n    selectedHighTick: number;\n    slippage: number;\n  };\n}\n\nexport interface AddLiquiditySingleSideIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.AddLiquiditySingleSide;\n  params: {\n    address: string;\n    amount: string;\n    isTokenX: boolean;\n    pool: NormalizedPool;\n    selectedLowTick: number;\n    selectedHighTick: number;\n    swapSlippage: number;\n    addLiquiditySlippage: number;\n  };\n}\n\nexport interface ManageLiquidityIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.ManageLiquidity;\n  params: {\n    address: string;\n    amountA: string;\n    amountB: string;\n    pool: NormalizedPool;\n    positionObjectId: string;\n    slippage: number;\n  };\n}\n\nexport interface ManageLiquiditySingleSideIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.ManageLiquiditySingleSide;\n  params: {\n    address: string;\n    amount: string;\n    isTokenX: boolean;\n    pool: NormalizedPool;\n    positionObjectId: string;\n    swapSlippage: number;\n    addLiquiditySlippage: number;\n  };\n}\n\nexport interface ClaimAllRewardsIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.ClaimAllRewards;\n  params: {\n    address: string;\n    positions: V3PositionType[];\n    pools: NormalizedPool[];\n    veMMTs: VeMMTData[];\n  };\n}\n\nexport interface ClaimRewardsIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.ClaimRewards;\n  params: {\n    address: string;\n    position: V3PositionType;\n    pool: NormalizedPool;\n  };\n}\n\nexport interface ClaimRewardsAsIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.ClaimRewardsAs;\n  params: {\n    claimParams: Omit<ClaimRewardsAsParams, 'sdk' | 'txb'>[];\n    claimVeMMTParams: {\n      address: string;\n      veMMTs: VeMMTData[];\n      targetCoinType: string;\n      slippage: number;\n      claimRoutes: ClaimRoutes;\n      pools: NormalizedPool[];\n    };\n  };\n}\nexport interface RemoveLiquidityIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.RemoveLiquidity;\n  params: {\n    position: V3PositionType;\n    pool: NormalizedPool;\n    address: string;\n    withdrawPercentage: number;\n    zapOutOn: boolean;\n    targetCoinType: string;\n    slippage: number;\n  };\n}\n\n/**\n * Legacy (web-app): full pool objects + token object + human-readable amountIn.\n * New (mmt-dex-v3): poolId[] + tokenIn coinType string + amountIn already in base units.\n */\nexport type SwapIntentionParams =\n  | {\n      route: NormalizedPool[];\n      tokenIn: Tokens;\n      amountIn: string;\n      address: string;\n      slippage: number;\n      mode?: 'mmt';\n    }\n  | {\n      route: string[];\n      tokenIn: string;\n      tokenOut?: string;\n      amountIn: string;\n      address: string;\n      slippage: number;\n      slippagePct?: number;\n      mode?: 'mmt' | 'aggregator';\n    };\n\nexport interface SwapIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.Swap;\n  params: SwapIntentionParams;\n}\n\nexport interface StakeXSuiIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.StakeXSui;\n  params: {\n    address: string;\n    amount: string;\n  };\n}\n\nexport interface UnstakeXSuiIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.UnstakeXSui;\n  params: {\n    address: string;\n    amount: string;\n  };\n}\n\nexport interface BondVeMMTIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.Bond;\n  params: {\n    token: Tokens;\n    address: string;\n    amount: string;\n    enableAutoMaxBond: boolean;\n    unbondAt: number | null;\n  };\n}\n\nexport interface ExtendVeMMTIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.Extend;\n  params: {\n    address: string;\n    veId: string;\n    currentUnbondAt: number;\n    isCurrentlyMaxBond: boolean;\n    enableAutoMaxBond: boolean;\n    unbondAt: number | null;\n  };\n}\n\nexport interface MergeVeMMTIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.Merge;\n  params: {\n    address: string;\n    veId: string;\n    selectedVeMMTIds: string[];\n  };\n}\n\nexport interface UnbondVeMMTIntentionData extends MMTDEXIntentionData {\n  action: TransactionSubType.Unbond;\n  params: {\n    address: string;\n    veId: string;\n  };\n}\n\nexport enum TransactionSubType {\n  AddLiquidity = 'AddLiquidity',\n  AddLiquiditySingleSide = 'AddLiquiditySingleSide',\n  ClaimAllRewards = 'ClaimAllRewards',\n  ClaimRewards = 'ClaimRewards',\n  ClaimRewardsAs = 'ClaimRewardsAs',\n  RemoveLiquidity = 'RemoveLiquidity',\n  Swap = 'Swap',\n  ManageLiquidity = 'ManageLiquidity',\n  ManageLiquiditySingleSide = 'ManageLiquiditySingleSide',\n  StakeXSui = 'StakeXSui',\n  UnstakeXSui = 'UnstakeXSui',\n  Bond = 'Bond',\n  Extend = 'Extend',\n  Merge = 'Merge',\n  Unbond = 'Unbond',\n}\n\nexport const Rpc = 'https://fullnode.mainnet.sui.io/';\n\nexport type V3PositionType = {\n  objectId: string;\n  poolId: string;\n  upperPrice: number;\n  lowerPrice: number;\n  upperTick: number;\n  lowerTick: number;\n  liquidity: string;\n  amount: number;\n  status: string;\n  claimableRewards: number;\n  rewarders: Reward[];\n  feeAmountXUsd: number;\n  feeAmountX: number;\n  feeAmountYUsd: number;\n  feeAmountY: number;\n  claimableMaya: number;\n};\n\nexport type ClaimRewardsAsParams = {\n  sdk: MmtSDK;\n  address: string;\n  positionId: string;\n  pool: NormalizedPool;\n  txb: Transaction;\n  targetCoinType: string;\n  slippage: number;\n};\n\nexport type VeMMTData = {\n  veId: string; // ID\n  bondAmount: bigint;\n  bondMode: number;\n  autoMaxBond: boolean;\n  unbondAt: bigint;\n  staked: boolean;\n  votePower: bigint;\n  totalVotePower: bigint;\n  userRewardAmount: bigint;\n  lastClaimedEpoch: bigint;\n  bondDurationInDays: number;\n  bondDurationInMS: bigint;\n  mergeableIds: string[];\n};\n\nexport const MMT_TOKEN_TYPE = '0x35169bc93e1fddfcf3a82a9eae726d349689ed59e4b065369af8789fe59f8608::mmt::MMT';\n\nexport type ClaimRoutes = Record<string, Record<string, string[]>>;\n","/* eslint-disable no-restricted-syntax */\nimport { MmtSDK } from '@mmt-finance/clmm-sui-sdk';\nimport { VeMMT } from '@mmt-finance/ve-sdk-v1';\nimport {\n  Transaction,\n  TransactionArgument,\n  TransactionObjectArgument,\n  TransactionObjectInput,\n} from '@mysten/sui/transactions';\n\nimport { getCoinObject, getLimitSqrtPriceUsingSlippage } from './liquidity';\nimport { ClaimRoutes, MMT_TOKEN_TYPE, NormalizedPool, Tokens, VeMMTData } from '../types';\nimport { normalizeSuiCoinType } from './common';\n\nconst fetchSyncEpochInfo = async (veMMTSdk: VeMMT) => {\n  const syncEpochInfo = await veMMTSdk.getSyncEpochInfo();\n  if (!syncEpochInfo) {\n    throw new Error('Failed to sync epoch');\n  }\n  return syncEpochInfo;\n};\n\n// Bond\nexport const performBond = async (\n  mmtSdk: MmtSDK,\n  veMMTSdk: VeMMT,\n  token: Tokens,\n  amount: string,\n  address: string,\n  enableAutoMaxBond: boolean,\n  unbondAt: number | null,\n  tx: Transaction,\n) => {\n  // Validate amount\n  const amountNum = Number(amount);\n  if (!amount || Number.isNaN(amountNum) || amountNum <= 0) {\n    throw new Error(`Bond Failed: Invalid amount: ${amount}. Amount must be greater than 0`);\n  }\n\n  if (!enableAutoMaxBond && !unbondAt) {\n    throw new Error('Bond Failed: Failed to calculate unbond date');\n  }\n\n  if (typeof unbondAt !== 'number' && !enableAutoMaxBond) {\n    throw new Error('Bond Failed: Invalid unbond date');\n  }\n\n  const coin = await getCoinObject({\n    mmt: mmtSdk,\n    tx,\n    address,\n    coinType: token.coinType,\n    coinAmount: amount,\n    coinDecimals: token.decimals,\n  });\n\n  if (!coin) {\n    throw new Error(`Bond Failed: Failed to get coin object for ${token.coinType}, amount: ${amount}`);\n  }\n\n  const syncEpochInfo = await fetchSyncEpochInfo(veMMTSdk);\n\n  await veMMTSdk.syncOrAdvanceEpoch(tx, syncEpochInfo.currentEpoch, syncEpochInfo.syncedEpoch);\n\n  // Check commands before bond operations\n  const commandsBeforeBond = tx.getData().commands.length;\n\n  if (enableAutoMaxBond) {\n    await veMMTSdk.createMaxBond(tx, coin as TransactionObjectInput, address);\n  } else {\n    await veMMTSdk.createBond(tx, coin as TransactionObjectInput, BigInt(unbondAt!), address);\n  }\n\n  // Verify that transaction has commands and new commands were added\n  const txData = tx.getData();\n  const commandsAfterBond = txData.commands.length;\n\n  if (commandsAfterBond === 0) {\n    throw new Error(\n      `Bond Failed: Transaction has no commands. enableAutoMaxBond: ${enableAutoMaxBond}, unbondAt: ${unbondAt}, amount: ${amount}`,\n    );\n  }\n\n  if (commandsAfterBond === commandsBeforeBond) {\n    throw new Error(\n      `Bond Failed: No new commands were added by bond operation. Commands before: ${commandsBeforeBond}, after: ${commandsAfterBond}`,\n    );\n  }\n};\n\nexport const performExtend = async (\n  veMMTSdk: VeMMT,\n  address: string,\n  veId: string,\n  currentUnbondAt: number,\n  isCurrentlyMaxBond: boolean,\n  enableAutoMaxBond: boolean,\n  unbondAt: number | null,\n  tx: Transaction,\n) => {\n  const syncEpochInfo = await fetchSyncEpochInfo(veMMTSdk);\n\n  await veMMTSdk.syncOrAdvanceEpoch(tx, syncEpochInfo.currentEpoch, syncEpochInfo.syncedEpoch);\n\n  await veMMTSdk.claimReward(tx, veId, address);\n\n  if (isCurrentlyMaxBond) {\n    if (!enableAutoMaxBond) {\n      await veMMTSdk.setNormal(tx, veId);\n    }\n  } else if (enableAutoMaxBond) {\n    await veMMTSdk.setMaxBond(tx, veId);\n  } else {\n    if (typeof unbondAt !== 'number') {\n      throw new Error('Extend Failed: Failed to calculate unbond date');\n    }\n\n    if (unbondAt < currentUnbondAt) {\n      throw new Error('Extend Failed: New duration cannot be less than current duration');\n    }\n\n    await veMMTSdk.extend(tx, veId, unbondAt);\n  }\n};\n\nexport const performMerge = async (\n  veMMTSdk: VeMMT,\n  address: string,\n  veId: string,\n  selectedVeMMTIds: string[],\n  tx: Transaction,\n) => {\n  const syncEpochInfo = await fetchSyncEpochInfo(veMMTSdk);\n\n  await veMMTSdk.syncOrAdvanceEpoch(tx, syncEpochInfo.currentEpoch, syncEpochInfo.syncedEpoch);\n\n  await veMMTSdk.claimReward(tx, veId, address);\n\n  await selectedVeMMTIds.reduce(async (promise, selectedId) => {\n    await promise;\n    await veMMTSdk.claimReward(tx, selectedId, address);\n    await veMMTSdk.merge(tx, veId, selectedId);\n  }, Promise.resolve());\n};\n\nexport const performUnbond = async (veMMTSdk: VeMMT, address: string, veId: string, tx: Transaction) => {\n  const syncEpochInfo = await fetchSyncEpochInfo(veMMTSdk);\n\n  await veMMTSdk.syncOrAdvanceEpoch(tx, syncEpochInfo.currentEpoch, syncEpochInfo.syncedEpoch);\n\n  await veMMTSdk.claimReward(tx, veId, address);\n\n  await veMMTSdk.unbond(tx, veId, address);\n};\n\nexport const claimVeMMTRewards = async (veMMTSdk: VeMMT, address: string, veMMTs: VeMMTData[], tx: Transaction) => {\n  if (veMMTs.length > 0 && veMMTs.some((veMMT) => veMMT.userRewardAmount > 0)) {\n    const syncEpochInfo = await fetchSyncEpochInfo(veMMTSdk);\n    await veMMTSdk.syncOrAdvanceEpoch(tx, syncEpochInfo.currentEpoch, syncEpochInfo.syncedEpoch);\n    await veMMTs.reduce(async (promise, veMMTData) => {\n      await promise;\n      if (veMMTData.userRewardAmount > 0) {\n        await veMMTSdk.claimReward(tx, veMMTData.veId, address);\n      }\n    }, Promise.resolve());\n  }\n};\n\nexport const claimVeMMTRewardsAsTargetCoin = async (\n  mmtSdk: MmtSDK,\n  veMMTSdk: VeMMT,\n  address: string,\n  veMMTs: VeMMTData[],\n  tx: Transaction,\n  targetCoinType: string,\n  slippage: number,\n  claimRoutes: ClaimRoutes,\n  pools: NormalizedPool[],\n) => {\n  const normalizedTargetCoinType = normalizeSuiCoinType(targetCoinType);\n\n  const coins: TransactionObjectArgument[] = [];\n  for (const veMMTData of veMMTs) {\n    if (veMMTData.userRewardAmount > 0) {\n      const coin = await veMMTSdk.buildClaimRewardCoin(tx, veMMTData.veId);\n      coins.push(coin);\n    }\n  }\n\n  const flatCoins: TransactionArgument[] = [];\n  for (const coin of coins) {\n    if (Array.isArray(coin)) {\n      flatCoins.push(...coin);\n    } else {\n      flatCoins.push(coin);\n    }\n  }\n\n  if (flatCoins.length === 0) {\n    return;\n  }\n\n  if (targetCoinType === normalizeSuiCoinType(MMT_TOKEN_TYPE)) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    tx.transferObjects(flatCoins as any[], tx.pure.address(address));\n    return;\n  }\n\n  const routes =\n    claimRoutes?.[targetCoinType as keyof typeof claimRoutes]?.[\n      MMT_TOKEN_TYPE as keyof (typeof claimRoutes)[keyof typeof claimRoutes]\n    ];\n\n  if (!routes || routes.length === 0) {\n    throw new Error(`No swap route found from ${MMT_TOKEN_TYPE} to ${targetCoinType}`);\n  }\n\n  const [primaryCoin, ...otherCoins] = flatCoins;\n  if (otherCoins.length > 0) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    tx.mergeCoins(primaryCoin as any, otherCoins as any);\n  }\n\n  let currentCoin = primaryCoin;\n  let currentAmount = tx.moveCall({\n    target: '0x2::coin::value',\n    arguments: [currentCoin],\n    typeArguments: [MMT_TOKEN_TYPE],\n  });\n  let currentCoinType = normalizeSuiCoinType(MMT_TOKEN_TYPE);\n\n  for (let i = 0; i < routes.length; i++) {\n    const poolId = routes[i];\n    const swapPool = pools.find((p) => p.poolId === poolId);\n\n    if (!swapPool) {\n      throw new Error(`Pool ${poolId} not found`);\n    }\n\n    const normalizedTokenX = normalizeSuiCoinType(swapPool.tokenXType || swapPool.tokenX?.coinType || '');\n    const isXtoY = normalizedTokenX === currentCoinType;\n\n    const poolModel = {\n      poolId: swapPool.poolId,\n      tokenXType: swapPool.tokenXType || swapPool.tokenX?.coinType || '',\n      tokenYType: swapPool.tokenYType || swapPool.tokenY?.coinType || '',\n      tickSpacing: swapPool.tickSpacing,\n      isStable: swapPool.isStable,\n    };\n\n    const limitSqrtPrice = await getLimitSqrtPriceUsingSlippage({\n      suiClient: mmtSdk.rpcClient,\n      poolId: swapPool.poolId,\n      currentSqrtPrice: swapPool.currentSqrtPrice,\n      tokenX: swapPool.tokenX!,\n      tokenY: swapPool.tokenY!,\n      slippagePercentage: slippage,\n      isTokenX: isXtoY,\n    });\n\n    // Align with mmt-dex-v3 rewards.ts claim route swaps.\n    const { outputCoin, leftoverCoin } =\n      mmtSdk.Pool.swap({\n        txb: tx,\n        pool: poolModel,\n        amount: currentAmount,\n        inputCoin: currentCoin,\n        isXtoY,\n        limitSqrtPrice,\n      }) || {};\n\n    if (!outputCoin || !leftoverCoin) {\n      throw new Error(`Swap Failed: empty swap result for pool ${poolId}`);\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    tx.transferObjects([leftoverCoin as any], tx.pure.address(address));\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    currentCoin = outputCoin as any;\n\n    currentCoinType = isXtoY\n      ? normalizeSuiCoinType(swapPool.tokenYType || swapPool.tokenY?.coinType || '')\n      : normalizeSuiCoinType(swapPool.tokenXType || swapPool.tokenX?.coinType || '');\n\n    if (currentCoinType === targetCoinType) {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      tx.transferObjects([currentCoin as any], tx.pure.address(address));\n      return;\n    }\n\n    currentAmount = tx.moveCall({\n      target: '0x2::coin::value',\n      arguments: [currentCoin],\n      typeArguments: [currentCoinType],\n    });\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  tx.transferObjects([currentCoin as any], tx.pure.address(address));\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { ClaimRewardsAsIntentionData, TransactionSubType } from '../types';\nimport { claimRewardsAsTargetCoin } from '../utils/reward';\nimport { createMmtSdk, createVeMmtSdk } from '../utils/sdk';\nimport { claimVeMMTRewardsAsTargetCoin } from '../utils/vemmt';\n\nexport class ClaimRewardAsIntention extends BaseIntentionGrpc<ClaimRewardsAsIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.ClaimRewardsAs;\n\n  constructor(public override readonly data: ClaimRewardsAsIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const sdk = createMmtSdk(input.suiGrpcClient);\n    const veMMTSdk = createVeMmtSdk(input.suiGrpcClient);\n    const { params } = this.data;\n    const { claimVeMMTParams } = params;\n    const { address, veMMTs, targetCoinType, slippage, claimRoutes, pools } = claimVeMMTParams;\n    const txb = new Transaction();\n\n    await Promise.all(\n      params.claimParams.map((param) =>\n        claimRewardsAsTargetCoin({\n          ...param,\n          sdk,\n          txb,\n        }),\n      ),\n    );\n\n    await claimVeMMTRewardsAsTargetCoin(\n      sdk,\n      veMMTSdk,\n      address,\n      veMMTs,\n      txb,\n      targetCoinType,\n      slippage,\n      claimRoutes,\n      pools,\n    );\n\n    return txb;\n  }\n\n  static fromData(data: ClaimRewardsAsIntentionData) {\n    return new ClaimRewardAsIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { ClaimRewardsIntentionData, TransactionSubType } from '../types';\nimport { claimV3Rewards } from '../utils/reward';\nimport { createMmtSdk } from '../utils/sdk';\n\nexport class ClaimRewardsIntention extends BaseIntentionGrpc<ClaimRewardsIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.ClaimRewards;\n\n  constructor(public override readonly data: ClaimRewardsIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const sdk = createMmtSdk(input.suiGrpcClient);\n    const { params } = this.data;\n    const { address, position, pool } = params;\n    const tx = new Transaction();\n\n    claimV3Rewards(sdk, address, position, pool, tx);\n\n    return tx;\n  }\n\n  static fromData(data: ClaimRewardsIntentionData) {\n    return new ClaimRewardsIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType, ManageLiquidityIntentionData } from '../types';\nimport { executeAddLiquidityToExistingPosition } from '../utils/liquidity';\nimport { createMmtSdk } from '../utils/sdk';\n\nexport class ManageLiquidityIntention extends BaseIntentionGrpc<ManageLiquidityIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.ManageLiquidity;\n\n  constructor(public override readonly data: ManageLiquidityIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const sdk = createMmtSdk(input.suiGrpcClient);\n    const { params } = this.data;\n    const { address, amountA, amountB, pool, positionObjectId, slippage } = params;\n    const tx = new Transaction();\n\n    await executeAddLiquidityToExistingPosition(sdk, tx, address, amountA, amountB, pool, positionObjectId, slippage);\n\n    return tx;\n  }\n\n  static fromData(data: ManageLiquidityIntentionData) {\n    return new ManageLiquidityIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType, ManageLiquiditySingleSideIntentionData } from '../types';\nimport { executeAddSingleSidedLiquidityToExistingPosition } from '../utils/liquidity';\nimport { createMmtSdk } from '../utils/sdk';\n\nexport class ManageLiquiditySingleSideIntention extends BaseIntentionGrpc<ManageLiquiditySingleSideIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.ManageLiquiditySingleSide;\n\n  constructor(public override readonly data: ManageLiquiditySingleSideIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const sdk = createMmtSdk(input.suiGrpcClient);\n    const { params } = this.data;\n    const { address, amount, isTokenX, pool, positionObjectId, swapSlippage, addLiquiditySlippage } = params;\n    const tx = new Transaction();\n\n    await executeAddSingleSidedLiquidityToExistingPosition(\n      sdk,\n      tx,\n      address,\n      amount,\n      isTokenX,\n      pool,\n      positionObjectId,\n      swapSlippage,\n      addLiquiditySlippage,\n    );\n\n    return tx;\n  }\n\n  static fromData(data: ManageLiquiditySingleSideIntentionData) {\n    return new ManageLiquiditySingleSideIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType, RemoveLiquidityIntentionData } from '../types';\nimport { removeClmmLiquidity, removeLiquiditySingleSided } from '../utils/liquidity';\nimport { createMmtSdk } from '../utils/sdk';\n\nexport class RemoveLiquidityIntention extends BaseIntentionGrpc<RemoveLiquidityIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.RemoveLiquidity;\n\n  constructor(public override readonly data: RemoveLiquidityIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const sdk = createMmtSdk(input.suiGrpcClient);\n    const { params } = this.data;\n    const { pool, position, address, withdrawPercentage, zapOutOn, targetCoinType, slippage } = params;\n    const tx = new Transaction();\n\n    if (zapOutOn) {\n      await removeLiquiditySingleSided({\n        sdk,\n        address,\n        position,\n        pool,\n        withdrawPercentage,\n        txb: tx,\n        targetCoinType,\n        slippage,\n      });\n    } else {\n      await removeClmmLiquidity(sdk, address, position, pool, withdrawPercentage, tx);\n    }\n\n    return tx;\n  }\n\n  static fromData(data: RemoveLiquidityIntentionData) {\n    return new RemoveLiquidityIntention(data);\n  }\n}\n","import type { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { LstClient, SPRING_SUI_UPGRADE_CAP_ID } from '@suilend/springsui-sdk';\n\nconst LIQUID_STAKING_INFO = {\n  id: '0x0431232199873db77a92aa645cd43521437e9cc5c6fff07fd03edb88afe0b25a',\n  type: '0x2b6602099970374cf58a2a1b9d96f005fccceb81e92eb059873baf420eb6c717::x_sui::X_SUI',\n  weightHookId: '0x9e35c13dbb0bc437e8ad5a95ec463622f58763e060552ae8d100db77f4904601',\n};\n\n/** Fallback if UpgradeCap lookup fails. Matches springsui-sdk PACKAGE_ID. */\nconst SPRING_SUI_PACKAGE_ID = '0xb0575765166030556a6eafd3b1b970eba8183ff748860680245b9edd41c716e7';\n\nasync function resolvePublishedAt(suiGrpcClient: SuiGrpcClient): Promise<string> {\n  try {\n    const { object } = await suiGrpcClient.getObject({\n      objectId: SPRING_SUI_UPGRADE_CAP_ID,\n      include: { json: true },\n    });\n    const publishedAt = (object?.json as { package?: string } | null | undefined)?.package;\n    if (publishedAt) {\n      return publishedAt;\n    }\n  } catch (error) {\n    console.warn('Failed to resolve SpringSui package id, using SDK default', error);\n  }\n  return SPRING_SUI_PACKAGE_ID;\n}\n\n/**\n * springsui-sdk 1.0.29+: initialize(grpcClient, jsonRpcClient, info, options?)\n * springsui-sdk 1.0.24:  initialize(client, info, publishedAt?)\n *\n * The previous (grpcClient, grpcClient, info) call only matches 1.0.29. On 1.0.24\n * the client is treated as liquidStakingObject, mint() calls tx.object(undefined),\n * and Mysten throws: Cannot read properties of undefined (reading 'Object').\n */\nasync function createLstClient(suiGrpcClient: SuiGrpcClient) {\n  const publishedAt = await resolvePublishedAt(suiGrpcClient);\n  const initialize = LstClient.initialize as unknown as (\n    ...args: unknown[]\n  ) => Promise<InstanceType<typeof LstClient>>;\n\n  if (LstClient.initialize.length >= 4) {\n    return initialize(suiGrpcClient, suiGrpcClient, LIQUID_STAKING_INFO, { publishedAt });\n  }\n\n  return initialize(suiGrpcClient, LIQUID_STAKING_INFO, publishedAt);\n}\n\nconst SUI_COIN_TYPE = '0x2::sui::SUI';\n\nasync function assertSufficientSpendableBalance(\n  suiGrpcClient: SuiGrpcClient,\n  owner: string,\n  coinType: string,\n  amount: bigint,\n) {\n  const { balance } = await suiGrpcClient.getBalance({ owner, coinType });\n  const total = BigInt(balance.balance);\n  if (total < amount) {\n    throw new Error(\n      `Not enough balance: need ${amount}, have total=${total} (coin=${balance.coinBalance}, address=${balance.addressBalance})`,\n    );\n  }\n}\n\nexport const getStakeTxPayload = async (suiGrpcClient: SuiGrpcClient, address: string, amount: string) => {\n  const stakeAmount = BigInt(amount);\n  await assertSufficientSpendableBalance(suiGrpcClient, address, SUI_COIN_TYPE, stakeAmount);\n\n  const lstClient = await createLstClient(suiGrpcClient);\n  const tx = new Transaction();\n  // Same source as msafe-core Send Coin: address balance first, then owned coins.\n  // splitCoins(tx.gas) only sees the gas coin and fails InsufficientCoinBalance\n  // when the stake amount lives in address balance (or is larger than the gas coin).\n  const sui = tx.coin({\n    balance: stakeAmount,\n    useGasCoin: true,\n  });\n  const sSui = lstClient.mint(tx, sui);\n  tx.transferObjects([sSui], address);\n\n  return tx;\n};\n\nexport const getUnstakeTxPayload = async (suiGrpcClient: SuiGrpcClient, address: string, amount: string) => {\n  const unstakeAmount = BigInt(amount);\n  await assertSufficientSpendableBalance(suiGrpcClient, address, LIQUID_STAKING_INFO.type, unstakeAmount);\n\n  const lstClient = await createLstClient(suiGrpcClient);\n  const tx = new Transaction();\n  const lst = tx.coin({\n    type: LIQUID_STAKING_INFO.type,\n    balance: unstakeAmount,\n    useGasCoin: false,\n  });\n  const sui = lstClient.redeem(tx, lst);\n  tx.transferObjects([sui], address);\n\n  return tx;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { StakeXSuiIntentionData, TransactionSubType } from '../types';\nimport { getStakeTxPayload } from '../utils/stake';\n\nexport class StakeXSuiIntention extends BaseIntentionGrpc<StakeXSuiIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.StakeXSui;\n\n  constructor(public override readonly data: StakeXSuiIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { params } = this.data;\n    const { address, amount } = params;\n    return getStakeTxPayload(input.suiGrpcClient, address, amount);\n  }\n\n  static fromData(data: StakeXSuiIntentionData) {\n    return new StakeXSuiIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType, SwapIntentionData } from '../types';\nimport { createMmtSdk } from '../utils/sdk';\nimport { performMmtSwap, resolveSwapIntentionParams } from '../utils/swap';\n\nexport class SwapIntention extends BaseIntentionGrpc<SwapIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.Swap;\n\n  constructor(public override readonly data: SwapIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const sdk = createMmtSdk(input.suiGrpcClient);\n    const resolved = await resolveSwapIntentionParams(sdk, this.data.params);\n    const tx = new Transaction();\n    await performMmtSwap(\n      sdk,\n      resolved.route,\n      resolved.tokenIn,\n      resolved.amountIn,\n      resolved.address,\n      tx,\n      resolved.slippage,\n    );\n    return tx;\n  }\n\n  static fromData(data: SwapIntentionData) {\n    return new SwapIntention(data);\n  }\n}\n","import { MmtSDK, Types, Utils } from '@mmt-finance/clmm-sui-sdk';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { normalizeSuiCoinType } from './common';\n// eslint-disable-next-line import/no-cycle\nimport { getCoinObject, getLimitSqrtPriceUsingSlippage } from './liquidity';\nimport { NormalizedPool, SwapIntentionParams, Tokens } from '../types';\n\nexport type NormalizedRewarder = {\n  coinType: string;\n  flowRate: number;\n  hasEnded: boolean;\n  rewardAmount: number;\n  rewardsAllocated: number;\n};\n\nexport type AprBreakdown = {\n  total: string;\n  fee: string;\n  rewards: {\n    coinType: string;\n    apr: string;\n    amountPerDay: number;\n  }[];\n};\n\nexport type ResolvedSwapParams = {\n  route: NormalizedPool[];\n  tokenIn: Tokens;\n  /** Human-readable amount for getCoinObject / toBaseUnits */\n  amountIn: string;\n  address: string;\n  slippage: number;\n};\n\nfunction isPoolIdRoute(route: SwapIntentionParams['route']): route is string[] {\n  return Array.isArray(route) && (route.length === 0 || typeof route[0] === 'string');\n}\n\nfunction isTokensObject(tokenIn: SwapIntentionParams['tokenIn']): tokenIn is Tokens {\n  return typeof tokenIn === 'object' && tokenIn !== null && 'coinType' in tokenIn && 'decimals' in tokenIn;\n}\n\n/** Convert base-unit integer string back to a human-readable decimal string. */\nexport function fromBaseUnits(amount: string, decimals: number): string {\n  if (!/^\\d+$/.test(amount)) {\n    return amount;\n  }\n  if (decimals <= 0) {\n    return amount.replace(/^0+/, '') || '0';\n  }\n\n  const value = BigInt(amount);\n  const base = 10n ** BigInt(decimals);\n  const whole = value / base;\n  const fraction = value % base;\n  if (fraction === 0n) {\n    return whole.toString();\n  }\n  const fracStr = fraction.toString().padStart(decimals, '0').replace(/0+$/, '');\n  return `${whole}.${fracStr}`;\n}\n\nfunction toNormalizedPool(pool: Types.ExtendedPoolWithApr): NormalizedPool {\n  return {\n    poolSource: 'mmt-v3',\n    poolId: pool.poolId,\n    tokenXType: pool.tokenXType,\n    tokenYType: pool.tokenYType,\n    tickSpacing: pool.tickSpacing,\n    lpFeesPercent: pool.lpFeesPercent,\n    feeRate: Number(pool.lpFeesPercent) || 0,\n    protocolFeesPercent: pool.protocolFeesPercent,\n    isStable: pool.isStable,\n    currentSqrtPrice: pool.currentSqrtPrice,\n    currentTickIndex: pool.currentTickIndex,\n    liquidity: pool.liquidity,\n    liquidityHM: pool.liquidityHM,\n    tokenXReserve: pool.tokenXReserve,\n    tokenYReserve: pool.tokenYReserve,\n    tvl: pool.tvl,\n    apy: pool.apy,\n    volume24h: pool.volume24h,\n    fees24h: pool.fees24h,\n    timestamp: pool.timestamp,\n    rewarders: (pool.rewarders || []).map((rewarder) => ({\n      coinType: rewarder.coin_type,\n      flowRate: rewarder.flow_rate,\n      hasEnded: rewarder.hasEnded,\n      rewardAmount: rewarder.reward_amount,\n      rewardsAllocated: rewarder.rewards_allocated,\n    })),\n    tokenX: pool.tokenX,\n    tokenY: pool.tokenY,\n    aprBreakdown: {\n      total: pool.aprBreakdown?.total ?? pool.apy ?? '0',\n      fee: pool.aprBreakdown?.fee ?? '0',\n      rewards: (pool.aprBreakdown?.rewards || []).map((reward) => ({\n        coinType: reward.coinType,\n        apr: reward.rewarderApr?.toString?.() ?? String(reward.rewarderApr ?? '0'),\n        amountPerDay: Number(reward.amountPerDay ?? 0),\n      })),\n    },\n  };\n}\n\nfunction findTokenInRoute(route: NormalizedPool[], coinType: string): Tokens | undefined {\n  const normalized = normalizeSuiCoinType(coinType);\n  for (const pool of route) {\n    if (normalizeSuiCoinType(pool.tokenX?.coinType || '') === normalized) {\n      return pool.tokenX as Tokens;\n    }\n    if (normalizeSuiCoinType(pool.tokenY?.coinType || '') === normalized) {\n      return pool.tokenY as Tokens;\n    }\n  }\n  return undefined;\n}\n\n/**\n * Normalize Swap intention params from either:\n * - legacy web-app shape (NormalizedPool[] + Tokens + human amount)\n * - mmt-dex-v3 shape (poolId[] + coinType string + base-unit amount)\n */\nexport async function resolveSwapIntentionParams(\n  mmtSdk: MmtSDK,\n  params: SwapIntentionParams,\n): Promise<ResolvedSwapParams> {\n  if ((params as { mode?: string }).mode === 'aggregator') {\n    throw new Error('Swap Failed: aggregator mode is not supported in MSafe rebuild path yet');\n  }\n\n  const address = params.address;\n  const slippage = params.slippage ?? (params as { slippagePct?: number }).slippagePct;\n  if (typeof slippage !== 'number') {\n    throw new Error('Swap Failed: missing slippage');\n  }\n\n  // Legacy shape: full pool objects + token object.\n  if (!isPoolIdRoute(params.route) && isTokensObject(params.tokenIn)) {\n    return {\n      route: params.route,\n      tokenIn: params.tokenIn,\n      amountIn: params.amountIn,\n      address,\n      slippage,\n    };\n  }\n\n  if (!isPoolIdRoute(params.route)) {\n    throw new Error('Swap Failed: route must be NormalizedPool[] or poolId string[]');\n  }\n  if (typeof params.tokenIn !== 'string') {\n    throw new Error('Swap Failed: tokenIn must be a coinType string when route is poolId[]');\n  }\n  if (params.route.length === 0) {\n    throw new Error('Swap Failed: empty route');\n  }\n\n  const pools = await Promise.all(params.route.map((poolId) => mmtSdk.Pool.getPool(poolId)));\n  const route = pools.map(toNormalizedPool);\n\n  let tokenIn = findTokenInRoute(route, params.tokenIn);\n  if (!tokenIn) {\n    const fetched = await mmtSdk.Pool.getToken(params.tokenIn);\n    tokenIn = {\n      coinType: fetched.coinType,\n      tokenName: fetched.name,\n      ticker: fetched.ticker,\n      iconUrl: fetched.iconUrl,\n      decimals: fetched.decimals,\n      price: fetched.price,\n      description: fetched.description,\n      isVerified: fetched.isVerified,\n    };\n  }\n\n  // mmt-dex-v3 sends amountIn already in base units; convert back for getCoinObject.\n  const amountIn = fromBaseUnits(params.amountIn, tokenIn.decimals);\n\n  return {\n    route,\n    tokenIn,\n    amountIn,\n    address,\n    slippage,\n  };\n}\n\nexport const performMmtSwap = async (\n  mmtSdk: MmtSDK,\n  route: NormalizedPool[],\n  tokenIn: Tokens,\n  amountIn: string,\n  address: string,\n  tx: Transaction,\n  slippage: number,\n) => {\n  let inputCoin = await getCoinObject({\n    mmt: mmtSdk,\n    tx,\n    address,\n    coinType: tokenIn.coinType,\n    coinAmount: amountIn,\n    coinDecimals: tokenIn.decimals,\n  });\n\n  let inputAmount = tx.moveCall({\n    target: '0x2::coin::value',\n    typeArguments: [tokenIn.coinType],\n    arguments: [inputCoin],\n  });\n\n  let inputCoinType = tokenIn.coinType;\n\n  for (let i = 0; i < route.length; i += 1) {\n    const routePool = route[i]!;\n    const { poolId, tokenX: routeTokenX, tokenY: routeTokenY, isStable, currentSqrtPrice } = routePool;\n\n    if (!routeTokenX?.coinType || !routeTokenY?.coinType) {\n      throw new Error(\n        `Swap Failed: route[${i}] is missing tokenX/tokenY after resolve. poolId=${routePool.poolId}`,\n      );\n    }\n\n    const { id: v3PoolId, isReverse } = Utils.mappedMmtV3Pool[poolId as keyof typeof Utils.mappedMmtV3Pool] || {\n      id: poolId,\n      isReverse: false,\n    };\n\n    let isXtoY = normalizeSuiCoinType(routeTokenX.coinType) === normalizeSuiCoinType(inputCoinType);\n    isXtoY = isReverse ? !isXtoY : isXtoY;\n\n    // Align with mmt-dex-v3: reverse pool tokens before building swap pool params / limit price.\n    const poolTokenX = isReverse ? routeTokenY : routeTokenX;\n    const poolTokenY = isReverse ? routeTokenX : routeTokenY;\n\n    const limitSqrtPrice = await getLimitSqrtPriceUsingSlippage({\n      poolId: v3PoolId,\n      tokenX: poolTokenX,\n      tokenY: poolTokenY,\n      slippagePercentage: slippage,\n      isTokenX: isXtoY,\n      suiClient: mmtSdk.rpcClient,\n      currentSqrtPrice,\n    });\n\n    const result = mmtSdk.Pool.swap({\n      txb: tx,\n      pool: {\n        poolId: v3PoolId,\n        tokenXType: poolTokenX.coinType,\n        tokenYType: poolTokenY.coinType,\n        tickSpacing: routePool.tickSpacing,\n        isStable,\n      },\n      amount: inputAmount,\n      inputCoin,\n      isXtoY,\n      limitSqrtPrice,\n    });\n\n    if (!result?.outputCoin) {\n      throw new Error('Swap Failed: empty swap result');\n    }\n\n    // leftoverCoin is the residual input coin after flash/swap split (same as mmt-dex-v3 trade.ts).\n    tx.transferObjects([inputCoin], tx.pure.address(address));\n    inputCoin = result.outputCoin as typeof inputCoin;\n    inputCoinType = isXtoY ? poolTokenY.coinType : poolTokenX.coinType;\n\n    inputAmount = tx.moveCall({\n      target: '0x2::coin::value',\n      typeArguments: [inputCoinType],\n      arguments: [inputCoin],\n    });\n  }\n\n  tx.transferObjects([inputCoin], tx.pure.address(address));\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType, UnstakeXSuiIntentionData } from '../types';\nimport { getUnstakeTxPayload } from '../utils/stake';\n\nexport class UnstakeXSuiIntention extends BaseIntentionGrpc<UnstakeXSuiIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.UnstakeXSui;\n\n  constructor(public override readonly data: UnstakeXSuiIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const { params } = this.data;\n    const { address, amount } = params;\n    return getUnstakeTxPayload(input.suiGrpcClient, address, amount);\n  }\n\n  static fromData(data: UnstakeXSuiIntentionData) {\n    return new UnstakeXSuiIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType, BondVeMMTIntentionData } from '../types';\nimport { createMmtSdk, createVeMmtSdk } from '../utils/sdk';\nimport { performBond } from '../utils/vemmt';\n\nexport class BondVeMMTIntention extends BaseIntentionGrpc<BondVeMMTIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.Bond;\n\n  constructor(public override readonly data: BondVeMMTIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const sdk = createMmtSdk(input.suiGrpcClient);\n    const veMMTSdk = createVeMmtSdk(input.suiGrpcClient);\n    const { params } = this.data;\n    const { token, amount, address, enableAutoMaxBond, unbondAt } = params;\n    const tx = new Transaction();\n    await performBond(sdk, veMMTSdk, token, amount, address, enableAutoMaxBond, unbondAt, tx);\n    return tx;\n  }\n\n  static fromData(data: BondVeMMTIntentionData) {\n    return new BondVeMMTIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType, ExtendVeMMTIntentionData } from '../types';\nimport { createVeMmtSdk } from '../utils/sdk';\nimport { performExtend } from '../utils/vemmt';\n\nexport class ExtendVeMMTIntention extends BaseIntentionGrpc<ExtendVeMMTIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.Extend;\n\n  constructor(public override readonly data: ExtendVeMMTIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const veMMTSdk = createVeMmtSdk(input.suiGrpcClient);\n    const { params } = this.data;\n    const { address, veId, currentUnbondAt, isCurrentlyMaxBond, enableAutoMaxBond, unbondAt } = params;\n    const tx = new Transaction();\n    await performExtend(veMMTSdk, address, veId, currentUnbondAt, isCurrentlyMaxBond, enableAutoMaxBond, unbondAt, tx);\n    return tx;\n  }\n\n  static fromData(data: ExtendVeMMTIntentionData) {\n    return new ExtendVeMMTIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType, MergeVeMMTIntentionData } from '../types';\nimport { createVeMmtSdk } from '../utils/sdk';\nimport { performMerge } from '../utils/vemmt';\n\nexport class MergeVeMMTIntention extends BaseIntentionGrpc<MergeVeMMTIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.Merge;\n\n  constructor(public override readonly data: MergeVeMMTIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const veMMTSdk = createVeMmtSdk(input.suiGrpcClient);\n    const { params } = this.data;\n    const { address, veId, selectedVeMMTIds } = params;\n    const tx = new Transaction();\n    await performMerge(veMMTSdk, address, veId, selectedVeMMTIds, tx);\n    return tx;\n  }\n\n  static fromData(data: MergeVeMMTIntentionData) {\n    return new MergeVeMMTIntention(data);\n  }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionGrpc } from '@/apps/interface/sui-grpc';\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType, UnbondVeMMTIntentionData } from '../types';\nimport { createVeMmtSdk } from '../utils/sdk';\nimport { performUnbond } from '../utils/vemmt';\n\nexport class UnbondVeMMTIntention extends BaseIntentionGrpc<UnbondVeMMTIntentionData> {\n  txType: TransactionType.Other;\n\n  txSubType: TransactionSubType.Unbond;\n\n  constructor(public override readonly data: UnbondVeMMTIntentionData) {\n    super(data);\n  }\n\n  async build(input: {\n    suiGrpcClient: SuiGrpcClient;\n    account: WalletAccount;\n    network: SuiNetworks;\n  }): Promise<Transaction> {\n    const veMMTSdk = createVeMmtSdk(input.suiGrpcClient);\n    const { params } = this.data;\n    const { address, veId } = params;\n    const tx = new Transaction();\n    await performUnbond(veMMTSdk, address, veId, tx);\n    return tx;\n  }\n\n  static fromData(data: UnbondVeMMTIntentionData) {\n    return new UnbondVeMMTIntention(data);\n  }\n}\n","import { AlphaFiHelper } from '@/apps/alphafi/helper';\nimport { BucketHelper } from '@/apps/bucket/helper';\nimport { CetusHelper } from '@/apps/cetus/helper';\nimport { MPayAppHelper } from '@/apps/mpay/helper';\nimport { CoreHelper } from '@/apps/msafe-core/helper';\nimport { NAVIAppHelper } from '@/apps/navi/helper';\nimport { PlainTransactionHelper } from '@/apps/plain-transaction/helper';\nimport { MSafeApps } from '@/apps/registry';\nimport { ScallopAppHelper } from '@/apps/scallop/helper';\nimport { SpringSuiAppHelper } from '@/apps/springSui/helper';\nimport { StSuiHelper } from '@/apps/stsui/helper';\nimport { SuilendAppHelper } from '@/apps/suilend/helper';\nimport { TURBOSAppHelper } from '@/apps/turbos/helper';\nimport { VoloAppHelper } from '@/apps/volo/helper';\n\nimport { BluefinHelper } from './apps/bluefin/helper';\nimport { MMTDEXAppHelper } from './apps/mmt-dex/helper';\n\nexport type { AppIntentionData, AppName, AppRegistry } from '@/apps/app-registry';\n\nexport const appHelpers = MSafeApps.fromHelpers([\n  new CoreHelper(),\n  new NAVIAppHelper(),\n  new MPayAppHelper(),\n  new PlainTransactionHelper(),\n  new CetusHelper(),\n  new TURBOSAppHelper(),\n  new MMTDEXAppHelper(),\n  new ScallopAppHelper(),\n  new VoloAppHelper(),\n  new BucketHelper(),\n  new SuilendAppHelper(),\n  new SpringSuiAppHelper(),\n  new AlphaFiHelper(),\n  new BluefinHelper(),\n  new StSuiHelper(),\n]);\n"],"mappings":"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","names":["require_bn","__commonJSMin","exports","module","assert","val","msg","inherits","ctor","superCtor","TempCtor","BN","number","base","endian","Buffer","num","left","right","start","i","j","w","off","parseHex4Bits","string","index","c","parseHexByte","lowerBound","r","parseLength","parseBase","str","end","mul","b","len","limbLen","limbPow","total","mod","word","pow","dest","move","src","size","inspect","zeros","groupSizes","groupBases","padding","out","carry","groupSize","groupBase","ret","length","allocate","ArrayType","byteLength","reqLength","res","postfix","position","shift","t","hi","toBitArray","bit","wbit","width","a","bytesNeeded","bitsLeft","cmp","smallMulTo","self","lo","k","ncarry","rword","maxJ","comb10MulTo","o","mid","a0","al0","ah0","a1","al1","ah1","a2","al2","ah2","a3","al3","ah3","a4","al4","ah4","a5","al5","ah5","a6","al6","ah6","a7","al7","ah7","a8","al8","ah8","a9","al9","ah9","b0","bl0","bh0","b1","bl1","bh1","b2","bl2","bh2","b3","bl3","bh3","b4","bl4","bh4","b5","bl5","bh5","b6","bl6","bh6","b7","bl7","bh7","b8","bl8","bh8","b9","bl9","bh9","w0","w1","w2","w3","w4","w5","w6","w7","w8","w9","w10","w11","w12","w13","w14","w15","w16","w17","w18","bigMulTo","hncarry","jumboMulTo","FFTM","x","y","N","l","rb","rbt","rws","iws","rtws","itws","s","rtwdf","itwdf","p","rtwdf_","itwdf_","re","ie","ro","io","rx","n","m","odd","ws","ph","_","rwst","iwst","nrws","nrwst","niwst","rmws","isNegNum","q","bits","carryMask","newCarry","hint","extended","h","mask","maskedWords","mode","bhi","bhiBits","diff","qj","positive","div","dm","half","r2","acc","A","B","C","D","g","yp","xp","im","jm","x1","x2","delta","negative","Red","ctx","primes","MPrime","name","tmp","rlen","input","K256","output","outLen","prev","next","P224","P192","P25519","prime","mod3","one","nOne","lpow","z","inv","windowSize","wnd","current","currentLen","Mont","u","TransactionType","coinsList","poolIdPoolNameMap","poolInfo","singleAssetPoolCoinMap","TransactionType","bcs","fromBase64","Decoder","transaction","simResult","liquidityChangeEvent","eventData","poolId","poolName","poolIdPoolNameMap","fn","command","event","type","poolInfo","inputWithPure","input","bytes","res","bcs","fromBase64","amount_a","amount_b","isAmountA","TransactionType","amount","coin","singleAssetPoolCoinMap","expo","coinsList","xTokensAmount","amount_withdrawn_from_locked","claimRewardTxb","sortKeys","BaseIntention","data","ClaimRewardIntention","_ClaimRewardIntention","BaseIntention","data","input","account","claimRewardTxb","depositDoubleAssetTxb","DepositDoubleAssetIntention","_DepositDoubleAssetIntention","BaseIntention","data","input","account","poolName","amount","isAmountA","depositDoubleAssetTxb","depositSingleAssetTxb","DepositSingleAssetIntention","_DepositSingleAssetIntention","BaseIntention","data","input","account","poolName","amount","depositSingleAssetTxb","withdrawTxb","WithdrawIntention","_WithdrawIntention","BaseIntention","data","input","account","poolName","xTokensAmount","withdrawTxb","withdrawAlphaTxb","WithdrawAlphaIntention","_WithdrawAlphaIntention","BaseIntention","data","input","account","withdrawFromLocked","xTokensAmount","withdrawAlphaTxb","AlphaFiHelper","input","transaction","suiClient","account","simResult","result","Decoder","TransactionType","intention","DepositSingleAssetIntention","DepositDoubleAssetIntention","WithdrawIntention","WithdrawAlphaIntention","ClaimRewardIntention","TransactionType","TransactionType","bcs","SBUCK_FOUNTAIN_PACKAGE_ID","Decoder","transaction","fn","command","module","package_","SBUCK_FOUNTAIN_PACKAGE_ID","coinType","buckToCoin","amount","inputCoinObject","TransactionType","collateralType","borrowAmount","insertionPlace","strapId","collateralAmount","buckAmount","insertPlaceArg","insertionPlaces","buckOutput","repayAmount","withdrawAmount","withdrawArg","inputAmount","isStake","stakeProofs","unlockCommands","i","unstakeCommands","argument","objectId","toBuck","intentionData","commands","amountArg","proofCount","sbuckClaimCommands","lstClaimCommands","idx","strapArg","input","bcs","TransactionType","Transaction","buildPsmTx","BucketClient","getBucketClient","network","account","config","getPsmTx","txbParams","account","network","coinType","amount","buckToCoin","tx","Transaction","client","getBucketClient","buildPsmTx","PsmIntention","_PsmIntention","BaseIntention","data","TransactionType","input","account","network","getPsmTx","TransactionType","Transaction","buildBorrowTx","buildCloseTx","buildRepayTx","buildWithdrawTx","getBorrowTx","txbParams","account","network","collateralType","collateralAmount","borrowAmount","insertionPlace","strapId","tx","Transaction","client","getBucketClient","buildBorrowTx","getWithdrawTx","withdrawAmount","buildWithdrawTx","getRepayTx","repayAmount","isSurplus","buildRepayTx","getCloseTx","recipient","buildCloseTx","BorrowIntention","_BorrowIntention","BaseIntention","data","TransactionType","input","account","network","getBorrowTx","TransactionType","RepayIntention","_RepayIntention","BaseIntention","data","TransactionType","input","account","network","getRepayTx","TransactionType","WithdrawIntention","_WithdrawIntention","BaseIntention","data","TransactionType","input","account","network","getWithdrawTx","TransactionType","CloseIntention","_CloseIntention","BaseIntention","data","TransactionType","input","account","network","getCloseTx","TransactionType","Transaction","buildSBUCKClaimTx","buildSBUCKDepositTx","buildSBUCKUnstakeTx","buildSBUCKWithdrawTx","getSBUCKDepositTx","txbParams","account","network","coinType","amount","isStake","tx","Transaction","client","getBucketClient","buildSBUCKDepositTx","getSBUCKUnstakeTx","stakeProofs","toBuck","buildSBUCKUnstakeTx","getSBUCKWithdrawTx","buildSBUCKWithdrawTx","getSBUCKClaimTx","buildSBUCKClaimTx","SBUCKDepositIntention","_SBUCKDepositIntention","BaseIntention","data","TransactionType","input","account","network","getSBUCKDepositTx","SBUCKUnstakeIntention","_SBUCKUnstakeIntention","getSBUCKUnstakeTx","SBUCKWithdrawIntention","_SBUCKWithdrawIntention","getSBUCKWithdrawTx","SBUCKClaimIntention","_SBUCKClaimIntention","getSBUCKClaimTx","TransactionType","Transaction","buildTankClaimTx","buildTankDepositTx","buildTankWithdrawTx","getTankDepositTx","txbParams","account","network","coinType","amount","tx","Transaction","client","getBucketClient","buildTankDepositTx","getTankWithdrawTx","buildTankWithdrawTx","getTankClaimTx","buildTankClaimTx","Transaction","buildLockedClaimTx","getLockClaimTx","txbParams","account","network","coinType","proofCount","tx","Transaction","client","getBucketClient","buildLockedClaimTx","TankDepositIntention","_TankDepositIntention","BaseIntention","data","TransactionType","input","account","network","getTankDepositTx","TankWithdrawIntention","_TankWithdrawIntention","getTankWithdrawTx","TankClaimIntention","_TankClaimIntention","getTankClaimTx","TransactionType","LockClaimIntention","_LockClaimIntention","BaseIntention","data","TransactionType","input","account","network","getLockClaimTx","BucketHelper","input","transaction","result","Decoder","TransactionType","suiClient","account","network","intention","PsmIntention","BorrowIntention","WithdrawIntention","RepayIntention","CloseIntention","TankDepositIntention","TankWithdrawIntention","TankClaimIntention","SBUCKDepositIntention","SBUCKUnstakeIntention","SBUCKWithdrawIntention","SBUCKClaimIntention","LockClaimIntention","TransactionType","TransactionType","sortKeys","BaseIntentionGrpc","data","getClmmSdk","network","account","suiGrpcClient","CetusClmmSDK","clmmSdk","getFarmsSdk","CetusFarmsSDK","farmsSdk","aggregatorURL","getAggregatorSdk","AggregatorClient","Env","getVaultsSdk","CetusVaultsSDK","vaultsSDK","getXcetusSdk","CetusXcetusSDK","xcetusSDk","getCreatePoolTxb","txbParams","account","network","suiGrpcClient","getClmmSdk","getAddLiquidityTxb","getIncreaseLiquidityTxb","getRemoveLiquidityTxb","getDecreaseLiquidityTxb","getClaimFeeAndMiningTxb","AddLiquidityIntention","_AddLiquidityIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getAddLiquidityTxb","TransactionType","ClaimFeeAndMiningIntention","_ClaimFeeAndMiningIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getClaimFeeAndMiningTxb","TransactionType","CreatePoolIntention","_CreatePoolIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getCreatePoolTxb","TransactionType","DecreaseLiquidityIntention","_DecreaseLiquidityIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getDecreaseLiquidityTxb","TransactionType","getFarmingAddLiquidityTxb","txbParams","account","network","suiGrpcClient","getFarmsSdk","getFarmingIncreaseLiquidityTxb","getFarmingDecreaseLiquidityTxb","getFarmingRemoveLiquidityTxb","txbParams","account","network","suiGrpcClient","getFarmsSdk","getFarmingClaimFeeAndRewardTxb","getFarmingHarvest","getFarmingBatchHarvest","peripherySdk","params","getFarmingStake","getFarmingUnstake","FarmingAddLiquidityIntention","_FarmingAddLiquidityIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getFarmingAddLiquidityTxb","TransactionType","FarmingBatchHarvestIntention","_FarmingBatchHarvestIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getFarmingBatchHarvest","TransactionType","FarmingClaimFeeAndRewardIntention","_FarmingClaimFeeAndRewardIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getFarmingClaimFeeAndRewardTxb","TransactionType","FarmingDecreaseLiquidityIntention","_FarmingDecreaseLiquidityIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getFarmingDecreaseLiquidityTxb","TransactionType","FarmingHarvestIntention","_FarmingHarvestIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getFarmingHarvest","TransactionType","FarmingIncreaseLiquidityIntention","_FarmingIncreaseLiquidityIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getFarmingIncreaseLiquidityTxb","TransactionType","FarmingRemoveLiquidityIntention","_FarmingRemoveLiquidityIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getFarmingRemoveLiquidityTxb","TransactionType","FarmingStakeIntention","_FarmingStakeIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getFarmingStake","TransactionType","FarmingUnstakeIntention","_FarmingUnstakeIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getFarmingUnstake","TransactionType","IncreaseLiquidityIntention","_IncreaseLiquidityIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getIncreaseLiquidityTxb","TransactionType","createTransaction","Transaction","getVaultReedeem","txbParams","account","network","suiGrpcClient","vaultsSdk","getVaultsSdk","tx","getVolatileVaultReedeem","VolatileVaultsSDK","vaults_mainnet","volatileVaultsSdk","getClmmPosReedeem","clmmSdk","getClmmSdk","getFarmsPosReedeem","farmsSdk","getFarmsSdk","pos","item","getPosReedeem","PosVestingRedeemIntention","_PosVestingRedeemIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getPosReedeem","TransactionType","RemoveLiquidityIntention","_RemoveLiquidityIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getRemoveLiquidityTxb","TransactionType","Transaction","getSwapRouterTxb","txbParams","account","network","suiGrpcClient","restituteMsafeFastRouterSwapParams","aggregatorSdk","getAggregatorSdk","txb","Transaction","SwapIntention","_SwapIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getSwapRouterTxb","TransactionType","Transaction","getAddVaultsPositionPayload","txbParams","account","network","suiGrpcClient","vaultsSdk","getVaultsSdk","tx","Transaction","getRemoveVaultsPositionPayload","AddVaultsPositionIntention","_AddVaultsPositionIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getAddVaultsPositionPayload","TransactionType","RemoveVaultsPositionIntention","_RemoveVaultsPositionIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getRemoveVaultsPositionPayload","TransactionType","Transaction","VestingConfing","getVestingRedeemTxb","txbParams","account","network","pool","nftId","periods","CLOCK_ADDRESS","txb","period","VestingRedeemIntention","_VestingRedeemIntention","BaseIntentionGrpc","data","TransactionType","input","account","network","txbParams","getVestingRedeemTxb","TransactionType","getXcetusConvertTxb","txbParams","account","network","suiGrpcClient","getXcetusSdk","getXcetusRedeemLockTxb","getXcetusClaimingStakeRewardsTxb","getXcetusCancelRedeemTxb","getXcetusRedeemTxb","XcetusCancelIntention","_XcetusCancelIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getXcetusCancelRedeemTxb","TransactionType","XcetusClaimingStakeRewardsIntention","_XcetusClaimingStakeRewardsIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getXcetusClaimingStakeRewardsTxb","TransactionType","XcetusConvertIntention","_XcetusConvertIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getXcetusConvertTxb","TransactionType","XcetusRedeemIntention","_XcetusRedeemIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getXcetusRedeemTxb","TransactionType","XcetusRedeemLockIntention","_XcetusRedeemLockIntention","BaseIntentionGrpc","data","TransactionType","input","suiGrpcClient","account","network","txbParams","getXcetusRedeemLockTxb","CetusHelper","input","appContext","TransactionType","suiGrpcClient","account","network","intention","AddLiquidityIntention","IncreaseLiquidityIntention","DecreaseLiquidityIntention","RemoveLiquidityIntention","ClaimFeeAndMiningIntention","FarmingAddLiquidityIntention","FarmingIncreaseLiquidityIntention","FarmingDecreaseLiquidityIntention","FarmingRemoveLiquidityIntention","FarmingClaimFeeAndRewardIntention","FarmingHarvestIntention","FarmingBatchHarvestIntention","FarmingStakeIntention","FarmingUnstakeIntention","XcetusConvertIntention","XcetusRedeemLockIntention","XcetusClaimingStakeRewardsIntention","XcetusCancelIntention","XcetusRedeemIntention","VestingRedeemIntention","SwapIntention","AddVaultsPositionIntention","RemoveVaultsPositionIntention","PosVestingRedeemIntention","CreatePoolIntention","TransactionType","SuiGrpcClient","isSuiGrpcClient","Transaction","SuiGrpcClient","Transaction","NETWORK_MAP","toSuiNetworkName","network","getFullnodeUrl","attachMsafeGrpcHelpers","client","input","response","coin","tx","result","transaction","success","event","commandResult","value","getSuiGrpcClient","baseUrl","networkName","inferNetworkFromUrl","url","SuiClient","SuiGrpcClient","options","baseUrl","getFullnodeUrl","input","response","coin","structType","object","tx","Transaction","result","transaction","success","event","commandResult","value","dev_exports","__export","contractId","dev_default","feeObjId","roleObjId","status","transaction","upgradeCapObjId","vaultObjId","prod_exports","__export","contractId","prod_default","feeObjId","roleObjId","status","transaction","upgradeCapObjId","vaultObjId","DEV_RPC_ENDPOINT","getFullnodeUrl","STG_RPC_ENDPOINT","PREV_RPC_ENDPOINT","PROD_RPC_ENDPOINT","DEV_BE_API","STG_BE_API","PREV_BE_API","PROD_BE_API","CONTRACT_DEV","dev_exports","CONTRACT_PROD","prod_exports","ENV_CONFIG","getConfig","env","options","ec","MPayError","mpayErrorCode","msg","options","cause","context","NoBackendError","MPayError","WalletNotConnectedError","MPayError","axios","AxiosError","BackendError","MPayError","msg","context","Backend","_Backend","apiURL","response","AxiosError","BackendError","recipient","options","res","axios","sender","query","paginatedData","event","formalizedEvent","address","ENV_NETWORK","Globals","_Globals","envConfig","suiGrpcClient","getSuiGrpcClient","Backend","env","options","ec","getConfig","NoBackendError","b","wallet","WalletNotConnectedError","SUI_TYPE_ARG","normalizeStructTag","normalizeSuiAddress","Transaction","Transaction","SUI_TYPE_ARG","normalizeStructTag","FEE_NUMERATOR","FEE_DENOMINATOR","CLAIM_FEE_NUMERATOR","FLAT_FEE_SUI","MoveObject","object","txb","ObjectVector","objects","o","ResultRef","_ResultRef","result","target","property","nestedResultFor","resultIndex","i","toPureArg","arg","bcs","InvalidRpcResultError","MPayError","msg","ctx","bcs","RpcError","MPayError","msg","context","unwrapMoveFields","value","RpcError","nested","normalizeMoveObjectJson","json","readCoinOrBalanceAmount","fieldName","fields","amount","mpayGetCoins","client","options","response","coin","resolveGetObject","extractMoveObjectFields","object","normalizeMoveObjectJson","mpayGetObject","objectId","getObject","fields","mpayMultiGetObjects","ids","objects","entry","mpayGetBalance","balance","mpayGetAllBalances","owner","mpayGetCoinMetadata","coinType","coinMetadata","mpaySimulateTransaction","result","transaction","commandResult","value","readU64FromCommandResult","callIndex","returnIndex","output","bcs","InspectViewer","results","callIndex","returnIndex","readU64FromCommandResult","value","type","InvalidRpcResultError","bcs","returnValues","bcs","InvalidInputError","MPayError","msg","fieldKey","fieldValue","MetadataBcs","bcs","MAX_NAME_SIZE","encodeMetadata","metadata","validateMetadata","decodeMetadata","metaStr","isAsciiString","InvalidInputError","str","normalizeStructTag","isSameCoinType","type1","type2","isSameTarget","target1","target2","getMoveCallTarget","command","pkg","module","fn","GAS_OBJECT_SPEC","nanoid","generateGroupId","CreateStreamHelper","_CreateStreamHelper","globals","feeContract","streamContract","info","encodeMetadata","generateGroupId","normalizeStructTag","recipient","txb","Transaction","paymentWithFee","coinReqs","coinResp","paymentMergedObject","flatFeeMergedObject","i","paymentAmount","feeAmount","paymentCoin","flatFeeCoin","ResultRef","createInfo","infoInternal","FEE_NUMERATOR","FEE_DENOMINATOR","CLAIM_FEE_NUMERATOR","FLAT_FEE_SUI","coins","mergedCoin","coinId","GAS_OBJECT_SPEC","payment","streamCoinType","isSameCoinType","SUI_TYPE_ARG","streamPayment","sum","totalAmount","fee","numEpoch","streamAmount","res","mpaySimulateTransaction","InspectViewer","CLOCK_ID","BaseContract","moduleName","config","globals","txb","input","target","arg","ObjectVector","MoveObject","ResultRef","toPureArg","object","CLOCK_ID","FeeContract","_FeeContract","BaseContract","config","globals","txb","createFeeNumerator","roleObject","feeObject","flatFee","claimFee","amount","StreamContract","_StreamContract","BaseContract","config","globals","txb","input","feeObject","vaultObject","paymentCoinObject","flatFeeObject","clockObject","streamObject","MPayBuilder","globals","config","FeeContract","StreamContract","info","infoInternal","CreateStreamHelper","streamId","enabled","coinType","txb","Transaction","normalizeStructTag","SUI_TYPE_ARG","Duration","TransactionFailedError","MPayError","status","msg","MIN_INTERVAL_MS","MPayHelper","globals","CoinMetaHelper","MPayBuilder","res","TransactionFailedError","objectType","objectId","info","input","InvalidInputError","cliffFraction","cliffAmount","amountPerStep","timeEnd","intervalMilli","Duration","address","coinType","balance","mpayGetBalance","coinMeta","normalizeStructTag","allBalance","mpayGetAllBalances","coinMetas","bal","i","txb","mpaySimulateTransaction","val","originTotalAmount","suiClient","normalized","SUI_TYPE_ARG","meta","mpayGetCoinMetadata","normalizeStructTag","normalizeSuiAddress","DateTime","Transaction","normalizeStructTag","parseStructTag","DateTime","NotCreatorError","MPayError","NotRecipientError","MPayError","SanityError","MPayError","msg","options","StreamNotFoundError","MPayError","streamId","DateTime","Duration","MAX_U64","TIME_ROUND_UNIT","roundDateTime","date","dateMs","roundMs","roundDuration","duration","durationMs","Stream","_Stream","globals","streamId","rawData","StreamContract","data","SanityError","pagination","NotCreatorError","txb","Transaction","NotRecipientError","enabled","normalizeStructTag","roundDuration","metadata","decodeMetadata","roundDateTime","rawConfig","duration","rawStatus","MAX_U64","timeNowMs","DateTime","timeStartMs","epoch","res","mpayGetObject","StreamNotFoundError","RpcError","content","typeParams","parseStructTag","coinType","dataFields","config","unwrapMoveFields","status","readCoinOrBalanceAmount","InvalidStreamGroupError","MPayError","msg","context","getAllFromIterator","it","res","val","PagedIterator","requester","EntryIterator","REQUEST_PAGE_SIZE","getObjectsById","suiClient","ids","options","oidIter","ListOidIterator","iter","ObjectBatchIterator","getAllFromIterator","EntryIterator","idIter","ObjectBatchRequester","stringIter","requestPage","objId","res","mpayMultiGetObjects","filtered","filter","r","StreamGroup","_StreamGroup","globals","streams","InvalidStreamGroupError","gids","st","InvalidInputError","ids","streamObjs","getObjectsById","obj","SanityError","responses","commonInfos","stream","expInfo","isEqual","info","isEqualStreamGroupCommonInfo","i","sum","pagination","Stream","info1","info2","PagedStreamListIterator","_PagedStreamListIterator","it","pageSize","input","StreamListIterator","res","_StreamListIterator","requester","StreamListRequester","SanityError","_StreamListRequester","globals","recipient","groupRefs","query","oidIter","ListOidIterator","ref","ObjectBatchIterator","backendQuery","convertToIncomingBackendQuery","filtered","normalizeSuiAddress","groupedRefs","groupAndSortRefs","convertToOutgoingBackendQuery","sender","refs","stRefs","stream","getStreamFromIterator","isStreamOfQuery","sg","getStreamGroupFromIterator","isStreamGroupOfQuery","m","groupList","gl1","gl2","DateTime","isStatus","isStreamOfStatus","isClaimable","filter","streamId","data","getStreamObjectResponseFromIter","Stream","streamIds","objResponses","StreamGroup","convertStreamStatus","normalizeCoinTypeFilter","normalizeAddressFilter","status","st","sts","convertStreamStatusSingle","InvalidInputError","coinType","ct","normalizeStructTag","address","addr","NotEnoughBalanceError","MPayError","coinType","requestAmount","gotAmount","DEF_REQ_PAGE_SIZE","getCoinsWithAmount","suiClient","owner","requestAmount","coinType","pageSize","it","OwnedCoinIterator","totalAmount","res","val","NotEnoughBalanceError","OwnedCoinIterator","EntryIterator","suiClient","owner","coinType","reqPageSize","OwnedCoinRequester","SanityError","res","mpayGetCoins","MSafeAccountAdapter","msafe","reqs","MSafeSingleWallet","account","SingleWalletAdapter","singleWallet","suiClient","req","isSameCoinType","SUI_TYPE_ARG","GAS_OBJECT_SPEC","InvalidInputError","coins","getCoinsWithAmount","SanityError","coin","MPayClient","env","options","Globals","MPayHelper","wallet","adapter","info","streamId","Stream","query","pageSize","PagedStreamListIterator","address","coinType","normalizeStructTag","recipient","normalizeSuiAddress","creator","MPayBuilder","StreamIntention","BaseIntentionGrpc","network","account","suiGrpcClient","mpayClient","MPayClient","MSafeSingleWallet","CancelStreamIntention","StreamIntention","data","TransactionType","input","network","account","suiGrpcClient","TransactionType","ClaimByProxyStreamIntention","StreamIntention","data","TransactionType","input","network","account","suiGrpcClient","TransactionType","ClaimStreamIntention","StreamIntention","data","TransactionType","input","network","account","suiGrpcClient","TransactionType","CreateStreamIntention","StreamIntention","data","TransactionType","input","network","account","suiGrpcClient","fromBase64","bcs","pureBcsSchemaFromTypeName","normalizeStructTag","normalizeSuiAddress","parsePureBytes","input","MoveCallHelper","_MoveCallHelper","moveCall","txb","argIndex","arg","bcsType","objectId","index","CreateStreamDecodeHelper","globals","txb","streamInfo","fees","infos","moveCall","txs","command","isSameTarget","getMoveCallTarget","SanityError","tx","MoveCallHelper","metadata","name","groupId","decodeMetadata","recipient","timeStart","cliff","epochInterval","totalEpoch","amountPerEpoch","cancelable","coinType","info","InvalidInputError","recipients","StreamContract","FeeContract","CreateStreamHelper","DecodeHelper","globals","txb","StreamContract","command","isSameTarget","getMoveCallTarget","CreateStreamDecodeHelper","streamId","enabled","moveCall","MoveCallHelper","TransactionType","SetAutoClaimStreamIntention","StreamIntention","data","TransactionType","input","network","account","suiGrpcClient","MPayAppHelper","input","network","transaction","suiGrpcClient","globals","Globals","result","DecodeHelper","intention","CreateStreamIntention","SetAutoClaimStreamIntention","ClaimStreamIntention","ClaimByProxyStreamIntention","CancelStreamIntention","intentionData","TransactionDefaultApplication","TransactionSubTypes","buildCoinTransferTxb","CoinTransferIntention","_CoinTransferIntention","BaseIntentionGrpc","data","input","suiGrpcClient","account","buildCoinTransferTxb","buildObjectTransferTxb","ObjectTransferIntention","_ObjectTransferIntention","BaseIntentionGrpc","data","input","suiGrpcClient","account","buildObjectTransferTxb","CoreHelper","TransactionDefaultApplication","input","account","network","suiGrpcClient","intention","TransactionSubTypes","CoinTransferIntention","ObjectTransferIntention","TransactionType","updated","config","updatePackageId","data","res","packageId","borrowFee","borrowFeeAddress","pool","e","config_default","TransactionType","bcs","fromBase64","normalizeStructTag","normalizeSuiAddress","getMoveCallTarget","command","pkg","module","fn","Decoder","txb","target","config_default","depositCommands","TransactionType","assetId","amount","list","helper","MoveCallHelper","moveCall","_MoveCallHelper","argIndex","arg","input","bcs","fromBase64","normalizeSuiAddress","objectId","index","normalizeStructTag","Transaction","depositCoinPTB","withdrawCoinPTB","repayCoinPTB","borrowCoinPTB","claimLendingRewardsPTB","getUserAvailableLendingRewards","depositToken","txb","pool","coinObject","amount","withdrawToken","userAddress","coin","borrowToken","tx","borrowedCoin","repayToken","claimReward","client","rewards","claimSupply","ClaimRewardIntention","_ClaimRewardIntention","BaseIntention","data","input","type","claimReward","ClaimSupplyIntention","_ClaimSupplyIntention","BaseIntention","data","input","type","claimSupply","Transaction","getPool","getPoolConfigByAssetId","assetId","EntryBorrowIntention","_EntryBorrowIntention","BaseIntention","data","input","assetId","amount","tx","Transaction","pool","getPoolConfigByAssetId","borrowToken","Transaction","getTokenObjs","client","sender","coinType","result","EntryDepositIntention","_EntryDepositIntention","BaseIntention","data","input","suiClient","account","assetId","amount","tx","Transaction","pool","getPoolConfigByAssetId","toDeposit","depositToken","tokenInfo","getTokenObjs","coinObj","i","Transaction","EntryRepayIntention","_EntryRepayIntention","BaseIntention","data","input","suiClient","account","assetId","amount","tx","Transaction","pool","getPoolConfigByAssetId","toDeposit","repayToken","tokenInfo","getTokenObjs","coinObj","i","Transaction","EntryWithdrawIntention","_EntryWithdrawIntention","BaseIntention","data","input","assetId","amount","tx","Transaction","pool","getPoolConfigByAssetId","withdrawToken","Transaction","EntryMultiDepositIntention","_EntryMultiDepositIntention","BaseIntention","data","input","suiClient","account","list","tx","Transaction","i","assetId","amount","pool","getPoolConfigByAssetId","toDeposit","depositToken","tokenInfo","getTokenObjs","coinObj","j","Transaction","PlainTransactionIntention","_PlainTransactionIntention","BaseIntention","data","input","Transaction","NAVIAppHelper","input","updatePackageId","TransactionType","transaction","result","Decoder","suiClient","account","intention","EntryDepositIntention","EntryBorrowIntention","EntryRepayIntention","EntryWithdrawIntention","EntryMultiDepositIntention","ClaimRewardIntention","ClaimSupplyIntention","PlainTransactionIntention","TransactionSubTypes","TransactionType","fromHex","Transaction","PlainTransactionApplication","PlainTransactionType","TransactionSubTypes","PlainTransactionIntention","_PlainTransactionIntention","BaseIntentionGrpc","data","TransactionType","_input","Transaction","fromHex","PlainTransactionHelper","input","content","suiGrpcClient","network","account","Transaction","isTransaction","createSuiClient","network","clientUrl","SuiClient","toSuiNetworkName","SUI_COIN_TYPE","MIN_GAS_BALANCE","toDeserializeTransaction","transactionBlock","isTransaction","Transaction","build","MSafeApps","_MSafeApps","apps","mApps","i","app","unsupported","SuiSdkAdapter","SuiGrpcSdkAdapter","appName","helper","input","client","tx","balance","suiGrpcClient","getSuiGrpcClient","TransactionType","Scallop","TransactionType","OLD_BORROW_INCENTIVE_PROTOCOL_ID","parseStructTag","Decoder","transaction","scallopClient","command","moveCall","target","address","module","name","targets","targetSet","targetToIdxMap","acc","idx","moveCallCommands","bcs","normalizeStructTag","normalizeSuiAddress","MoveCallHelper","_MoveCallHelper","moveCall","transaction","index","indexes","t","idx","target","moveCallTarget","argIndex","input","strVal","type","arg","bcsNums","bcsVal","moveCallHelper_default","SplitCoinHelper","splitCoin","txb","input","moveCallHelper_default","splitCoinHelper_default","normalizeStructTag","SUI_CLOCK_OBJECT_ID","SUI_TYPE_ARG","isObligationMigrated","query","obligationId","obligation","lockKey","borrowIncentiveObjectId","OldBorrowIncentiveContract","OldBorrowIncentiveTxBuilder","tx","obligationKey","rewardType","partitionArray","array","chunkSize","result","i","DecoderLending","Decoder","supplyMoveCall","stakeMoveCall","unstakeMoveCall","withdrawMoveCall","redeem","burnScoin","borrowMoveCall","repayMoveCall","lendingIncentive","borrowIncentiveV2","oldBorrowIncentive","OLD_BORROW_INCENTIVE_PROTOCOL_ID","stakeWithVeSca","stakeWithoutVesca","command","moveCallHelper_default","moveCall","TransactionType","veScaKey","obligationKey","obligationId","rewardCoinName","coinName","amount","amountFromSplitCoin","splitCoinHelper_default","a","b","stakeSpoolAccount","coinType","stakeAccountWithAmount","tx","stakeAccountId","lendingReward","borrowRewardV2","borrowReward","stakeMarketCoinName","TransactionType","DecoderReferral","Decoder","command","trans","moveCallHelper_default","moveCall","TransactionType","veScaKey","coins","helper","TransactionType","OLD_BORROW_INCENTIVE_PROTOCOL_ID","DecoderVeSca","Decoder","extendPeriod","stakeMoreSca","unstakeCommands","command","stakeCommands","deactivateBoostCommands","notEmpty","isDeactivateBoost","transferTxs","t","objects","veScaKeyIndexes","Input","indexesAsSet","veScaKeys","idx","veScaKeyType","batches","partitionArray","objectId","i","batch","moveCall","moveCallHelper_default","OLD_BORROW_INCENTIVE_PROTOCOL_ID","type","unstakeMoveCall","stakeMoveCall","deactivateMoveCall","helpers","unstakeHelperIdx","stakeHelperIdx","deactivateIdx","veScaKey","TransactionType","lockSca","unlockTime","amountFromSplitCoin","splitCoinHelper_default","a","b","isHaveRedeem","oldUnstakeObligation","unstakeObligation","stakeObligation","isObligationLocked","isOldBorrowIncentive","obligationId","obligationKey","operations","mergeSplithelper","intentionData","helper","parseArgFromHelper","action","bindingDatas","sortKeys","ScallopCoreBaseIntention","data","suiClient","obligationId","objectId","object","client","input","callback","txb","obligationKey","BorrowIntention","_BorrowIntention","ScallopCoreBaseIntention","data","account","client","coinName","amount","obligationId","obligationKey","sender","_","innerTx","coin","input","BorrowWithBoostIntention","_BorrowWithBoostIntention","ScallopCoreBaseIntention","data","client","walletAddress","obligationId","obligationKey","veScaKey","amount","poolCoinName","_","scallopTxBlock","coin","input","BorrowWithReferralIntention","_BorrowWithReferralIntention","ScallopCoreBaseIntention","data","account","client","walletAddress","obligationId","obligationKey","veScaKey","poolCoinName","amount","_","scallopTxBlock","borrowReferral","coin","input","SUI_TYPE_ARG","ClaimIncentiveRewardIntention","_ClaimIncentiveRewardIntention","ScallopCoreBaseIntention","data","client","walletAddress","txb","allStakeAccounts","lendings","obligations","obligationAccounts","lendingInfos","spoolCoinNames","marketCoinName","lendingInfo","acc","rewardCoinCollection","stakeMarketCoinName","stakeAccounts","i","stakeAccount","rewardCoin","totalClaimCoin","coins","totalClaim","availableClaimCoin","obligationAccount","borrowIncentive","reward","obligationHasReward","obligationKeyId","obligation","isRewardCoinClaimed","filteredBorrowIncentives","rewardCoinName","filteredBorrowIncentive","oldRewardCoin","OldBorrowIncentiveTxBuilder","SUI_TYPE_ARG","isObligationMigrated","bindedVeScaKey","objectsNeedToTransfer","coinName","rewardCoins","mergeDest","t","input","DepositCollateralIntention","_DepositCollateralIntention","ScallopCoreBaseIntention","data","input","MigrateAndClaimIntention","_MigrateAndClaimIntention","ScallopCoreBaseIntention","data","account","client","sender","obligationKey","obligationId","rewardCoinName","veScaKey","tx","rewardCoin","OldBorrowIncentiveTxBuilder","input","MigrateScoinIntention","_MigrateScoinIntention","ScallopCoreBaseIntention","data","input","OpenObligationIntention","_OpenObligationIntention","ScallopCoreBaseIntention","data","input","RepayIntention","_RepayIntention","ScallopCoreBaseIntention","data","account","client","sender","coinName","amount","obligationId","obligationKey","_","innerTx","input","RepayWithBoostIntention","_RepayWithBoostIntention","ScallopCoreBaseIntention","data","account","client","sender","coinName","amount","obligationId","veScaKey","tx","availableStake","input","SupplyLendingIntention","_SupplyLendingIntention","ScallopCoreBaseIntention","data","input","UnstakeSpoolIntention","_UnstakeSpoolIntention","ScallopCoreBaseIntention","data","input","WithdrawAndUnstakeLendingIntention","_WithdrawAndUnstakeLendingIntention","ScallopCoreBaseIntention","data","client","walletAddress","tx","stakeAccountId","totalAmount","coinName","withdrawCoins","i","stakeAccount","amount","stakeMarketCoinName","marketCoin","wdScoin","wdCoin","input","WithdrawCollateralIntention","_WithdrawCollateralIntention","ScallopCoreBaseIntention","data","input","WithdrawLendingIntention","_WithdrawLendingIntention","ScallopCoreBaseIntention","data","input","BindReferralIntention","_BindReferralIntention","ScallopCoreBaseIntention","data","account","client","sender","tx","input","ClaimRevenueReferralIntention","_ClaimRevenueReferralIntention","ScallopCoreBaseIntention","data","account","client","veScaKey","coins","sender","tx","coinsName","coin","input","CreateReferralLinkIntention","_CreateReferralLinkIntention","ScallopCoreBaseIntention","data","account","client","sender","tx","referralTicket","input","SCA_COIN_TYPE","ExtendPeriodAndStakeMoreIntention","_ExtendPeriodAndStakeMoreIntention","ScallopCoreBaseIntention","data","account","client","amount","veScaKey","unlockTime","obligationId","obligationKey","isOldBorrowIncentive","isObligationLocked","sender","tx","coins","SCA_COIN_TYPE","takeCoin","leftCoin","OldBorrowIncentiveTxBuilder","input","ExtendStakePeriodIntention","_ExtendStakePeriodIntention","ScallopCoreBaseIntention","data","account","client","sender","veScaKey","unlockTime","obligationId","obligationKey","isObligationLocked","isOldBorrowIncentive","tx","OldBorrowIncentiveTxBuilder","input","MergeVeScaIntention","_MergeVeScaIntention","ScallopCoreBaseIntention","data","tx","query","cb","targetVeScaKey","sourceVeScaKey","targetObligation","sourceObligation","input","scallopClient","address","innerTx","RedeemScaIntention","_RedeemScaIntention","ScallopCoreBaseIntention","data","account","client","veScaKey","sender","tx","input","SCA_COIN_TYPE","RenewExpStakePeriodIntention","_RenewExpStakePeriodIntention","ScallopCoreBaseIntention","data","account","client","sender","amount","unlockTime","veScaKey","isHaveRedeem","obligation","obligationKey","isObligationLocked","isOldBorrowIncentive","tx","redeem","coins","SCA_COIN_TYPE","takeCoin","leftCoin","OldBorrowIncentiveTxBuilder","input","SplitVeScaIntention","_SplitVeScaIntention","ScallopCoreBaseIntention","data","tx","query","cb","targetVeScaKey","splitAmount","targetObligation","input","scallopClient","address","innerTx","newVeScaKey","SCA_COIN_TYPE","StakeScaIntention","_StakeScaIntention","ScallopCoreBaseIntention","data","account","client","sender","amount","isObligationLocked","isOldBorrowIncentive","obligationId","obligationKey","unlockTime","veScaKey","tx","coins","SCA_COIN_TYPE","takeCoin","leftCoin","newVescaKey","OldBorrowIncentiveTxBuilder","input","SupplyAndStakeLendingIntention","_SupplyAndStakeLendingIntention","ScallopCoreBaseIntention","data","account","client","sender","amount","coinName","stakeAccountId","tx","marketCoin","stakeMarketCoinName","stakeAccounts","targetStakeAccount","newStakeAccount","input","VeScaObligationBindingsIntention","_VeScaObligationBindingsIntention","ScallopCoreBaseIntention","data","tx","action","args","input","scallopClient","sender","bindingDatas","TransferVeScaKeysIntention","_TransferVeScaKeysIntention","ScallopCoreBaseIntention","data","input","scallopClient","sender","tx","veScaKeys","t","WithdrawStakedScaIntention","_WithdrawStakedScaIntention","ScallopCoreBaseIntention","data","account","client","vescaKey","sender","tx","input","ScallopAppHelper","walletAddress","suiClient","scallop","Scallop","getFullnodeUrl","input","transaction","account","decoderLending","DecoderLending","decoderReferral","DecoderReferral","decoderVesca","DecoderVeSca","result","TransactionType","network","txSubType","intentionData","intention","SupplyLendingIntention","WithdrawLendingIntention","BorrowIntention","RepayIntention","DepositCollateralIntention","WithdrawCollateralIntention","OpenObligationIntention","UnstakeSpoolIntention","ClaimIncentiveRewardIntention","BorrowWithBoostIntention","StakeScaIntention","ExtendStakePeriodIntention","ExtendPeriodAndStakeMoreIntention","RenewExpStakePeriodIntention","WithdrawStakedScaIntention","SupplyAndStakeLendingIntention","WithdrawAndUnstakeLendingIntention","RedeemScaIntention","MigrateAndClaimIntention","BorrowWithReferralIntention","CreateReferralLinkIntention","ClaimRevenueReferralIntention","BindReferralIntention","MigrateScoinIntention","RepayWithBoostIntention","MergeVeScaIntention","SplitVeScaIntention","VeScaObligationBindingsIntention","TransferVeScaKeysIntention","TransactionType","TransactionType","normalizeStructTag","API_URL","TransactionType","LENDING_MARKET_ID","LENDING_MARKET_TYPE","SuilendClient","TransactionType","fromBase64","toHex","normalizeStructTag","MAX_U64","BigNumber","Decoder","transaction","simResult","fn","command","events","event","coinType","normalizeStructTag","value","TransactionType","commands","inputIndex","inputValue","BigNumber","toHex","fromBase64","isMax","MAX_U64","result","i","claimRewardEvent","Transaction","sortKeys","SuilendBaseIntention","data","BorrowIntention","_BorrowIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","Transaction","Transaction","normalizeStructTag","Side","isSendPoints","BigNumber","getRewards","suilendClient","obligation","rewardsMap","reserve","side","reservePrm","sideUrm","urm","pr","index","r","getRewards_default","ClaimIntention","_ClaimIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","Transaction","getRewards_default","Transaction","ClaimAndDepositIntention","_ClaimAndDepositIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","Transaction","getRewards_default","Transaction","DepositIntention","_DepositIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","Transaction","Transaction","RepayIntention","_RepayIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","Transaction","Transaction","WithdrawIntention","_WithdrawIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","Transaction","getUtils","suiClient","account","suilendClient","SuilendClient","LENDING_MARKET_ID","LENDING_MARKET_TYPE","obligationOwnerCaps","obligations","ownerCap","SuilendAppHelper","input","transaction","simResult","result","Decoder","TransactionType","network","txSubType","intentionData","intention","DepositIntention","WithdrawIntention","BorrowIntention","RepayIntention","ClaimIntention","ClaimAndDepositIntention","obligationId","obligation","o","obligationOwnerCap","getUtils","suiClient","account","suilendUtils","lstInfoRes","API_URL","lstInfoJson","LIQUID_STAKING_INFO_MAP","info","Decoder","transaction","simResult","fn","command","events","event","outCoinType","normalizeStructTag","amount","TransactionType","inCoinType","Transaction","LstClient","convertLstsAndRebalanceAndSendToUser","sortKeys","SpringSuiBaseIntention","data","ConvertIntention","_ConvertIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","inLstClient","LstClient","info","outLstClient","transaction","Transaction","convertLstsAndRebalanceAndSendToUser","Transaction","createObligationIfNoneExists","sendObligationToUser","LstClient","convertLstsAndRebalance","ConvertAndDepositIntention","_ConvertAndDepositIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","inLstClient","LstClient","info","outLstClient","transaction","Transaction","obligationOwnerCapId","didCreate","createObligationIfNoneExists","lstCoin","convertLstsAndRebalance","sendObligationToUser","Transaction","LstClient","StakeIntention","_StakeIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","outLstClient","LstClient","info","transaction","Transaction","Transaction","createObligationIfNoneExists","sendObligationToUser","LstClient","StakeAndDepositIntention","_StakeAndDepositIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","outLstClient","LstClient","info","transaction","Transaction","obligationOwnerCapId","didCreate","createObligationIfNoneExists","lstCoin","sendObligationToUser","Transaction","LstClient","UnstakeIntention","_UnstakeIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","inLstClient","LstClient","info","transaction","Transaction","SpringSuiAppHelper","input","transaction","suiClient","account","getUtils","simResult","result","Decoder","TransactionType","network","txSubType","intentionData","intention","StakeIntention","StakeAndDepositIntention","ConvertIntention","ConvertAndDepositIntention","UnstakeIntention","TransactionType","TransactionType","Decoder","transaction","simResult","liquidityChangeEvent","eventData","fn","command","arg","event","eventType","amount","TransactionType","LST","MintIntention","_MintIntention","BaseIntention","data","input","account","amount","lstParams","txb","LST","LST","RedeemIntention","_RedeemIntention","BaseIntention","data","input","account","amount","lstParams","txb","LST","StSuiHelper","input","transaction","suiClient","simResult","result","Decoder","TransactionType","account","intention","MintIntention","RedeemIntention","TransactionType","TurbosSdk","TransactionType","fromBase64","bcs","BN","Decimal","prixConfig","deepbookConfig","getAtoB","layer","target","swap1Layer","swap2Layer","item","Decoder","txb","turbosSdk","config","address","trans","targets","moveCallTarget","prixConfig","deepbookConfig","moveCall","atob","routes","index","pool","sqrtPrice","nextTickIndex","BN","coinTypeA","coinTypeB","deadline","amountSpecifiedIsInput","amountA","amountB","TransactionType","tickLower","tickLowerIsNeg","tickUpper","tickUpperIsNeg","nft","decreaseLiquidity","collectAmountA","collectAmountB","rewardAmounts","helper","value","slippage","poolId","amountIn","token1","token2","MoveCallHelper","argIndex","bcs","fromBase64","parsed","Decimal","TurbosSdk","AddLiquidityIntention","_AddLiquidityIntention","BaseIntentionGrpc","data","input","turbosSdk","TurbosSdk","pool","address","amountA","amountB","slippage","tickLower","tickUpper","deadline","txb","TurbosSdk","BurnIntention","_BurnIntention","BaseIntentionGrpc","data","input","turbosSdk","TurbosSdk","pool","nft","txb","TurbosSdk","CollectFeeIntention","_CollectFeeIntention","BaseIntentionGrpc","data","input","turbosSdk","TurbosSdk","pool","address","nft","collectAmountA","collectAmountB","deadline","txb","TurbosSdk","CollectRewardIntention","_CollectRewardIntention","BaseIntentionGrpc","data","input","turbosSdk","TurbosSdk","pool","address","nft","rewardAmounts","deadline","txb","TurbosSdk","CreatePoolIntention","_CreatePoolIntention","BaseIntentionGrpc","data","input","turbosSdk","TurbosSdk","fee","address","tickLower","tickUpper","sqrtPrice","slippage","coinTypeA","coinTypeB","amountA","amountB","deadline","txb","TurbosSdk","DecreaseLiquidityIntention","_DecreaseLiquidityIntention","BaseIntentionGrpc","data","input","turbosSdk","TurbosSdk","pool","address","amountA","amountB","slippage","nft","decreaseLiquidity","deadline","txb","TurbosSdk","DecreaseLiquidityWithReturnIntention","_DecreaseLiquidityWithReturnIntention","BaseIntentionGrpc","data","input","turbosSdk","TurbosSdk","pool","address","amountA","amountB","slippage","nft","decreaseLiquidity","deadline","tx","objectCoinA","objectCoinB","TurbosSdk","IncreaseLiquidityIntention","_IncreaseLiquidityIntention","BaseIntentionGrpc","data","input","turbosSdk","TurbosSdk","pool","address","amountA","amountB","slippage","nft","deadline","txb","Transaction","SUI_CLOCK_OBJECT_ID","PrixClaimIntention","_PrixClaimIntention","BaseIntentionGrpc","data","input","txb","Transaction","prixConfig","SUI_CLOCK_OBJECT_ID","Transaction","PrixJoinIntention","_PrixJoinIntention","BaseIntentionGrpc","data","input","txb","Transaction","prixConfig","Transaction","TurbosSdk","RemoveLiquidityIntention","_RemoveLiquidityIntention","BaseIntentionGrpc","data","input","turbosSdk","TurbosSdk","txb","Transaction","TurbosSdk","RemoveLiquidityWithReturnIntention","_RemoveLiquidityWithReturnIntention","BaseIntentionGrpc","data","input","turbosSdk","TurbosSdk","txb","objectCoinA","objectCoinB","TurbosSdk","SwapIntention","_SwapIntention","BaseIntentionGrpc","data","input","turbosSdk","TurbosSdk","routes","coinTypeA","coinTypeB","address","amountA","amountB","slippage","amountSpecifiedIsInput","deadline","txb","TurbosSdk","Transaction","normalizeSuiObjectId","SuiKit","turbosSdk","currentAddress","type","amount","coinObjects","cursor","hasNextPage","coinFields","coin","resultCoinObjects","currentBalance","coinA","coinB","object","coins","txb","sendCoin","mergeCoin","deepbookConfig","cap","token","client_order_id","gasBudget","swap_exact_quote_for_base","options","token1","token2","poolId","amountIn","currentAddress","turbosSdk","txb","Transaction","suiKit","SuiKit","coinsData","sendCoin","mergeCoin","currentAccountCap","accountCap","base_coin_ret","quote_coin_ret","_amount","deepbookConfig","normalizeSuiObjectId","swap_exact_base_for_quote","zero","SwapExactBaseForQuoteIntention","_SwapExactBaseForQuoteIntention","BaseIntentionGrpc","data","input","turbosSdk","TurbosSdk","swap_exact_base_for_quote","TurbosSdk","SwapExactQuoteForBaseIntention","_SwapExactQuoteForBaseIntention","BaseIntentionGrpc","data","input","turbosSdk","TurbosSdk","swap_exact_quote_for_base","TURBOSAppHelper","input","turbosSdk","TurbosSdk","contract","transaction","account","result","Decoder","TransactionType","suiGrpcClient","network","intention","CreatePoolIntention","AddLiquidityIntention","IncreaseLiquidityIntention","DecreaseLiquidityIntention","DecreaseLiquidityWithReturnIntention","RemoveLiquidityIntention","RemoveLiquidityWithReturnIntention","CollectFeeIntention","CollectRewardIntention","BurnIntention","SwapIntention","PrixJoinIntention","PrixClaimIntention","SwapExactBaseForQuoteIntention","SwapExactQuoteForBaseIntention","TransactionType","TransactionType","bcs","fromBase64","normalizeStructTag","normalizeSuiAddress","config","config_default","getMoveCallTarget","command","pkg","module","fn","Decoder","txb","target","config_default","splitCoin","amountArg","input","bcs","fromBase64","TransactionType","ticketId","moveCall","MoveCallHelper","_MoveCallHelper","argIndex","arg","objectId","normalizeSuiAddress","Transaction","ClaimTicketIntention","_ClaimTicketIntention","BaseIntentionGrpc","data","_input","tx","Transaction","ticketId","config_default","Transaction","StakeIntention","_StakeIntention","BaseIntentionGrpc","data","_input","tx","Transaction","amount","coin","config_default","Transaction","UnStakeIntention","_UnStakeIntention","BaseIntentionGrpc","data","input","tx","Transaction","amount","coins","config_default","primaryCoin","mergeCoins","primaryCoinInput","coin","VoloAppHelper","input","result","Decoder","TransactionType","suiGrpcClient","account","network","intention","StakeIntention","UnStakeIntention","ClaimTicketIntention","TransactionType","asIntN","TransactionType","fromBase64","bcs","Decoder","transaction","appContext","openPosCommand","addLiqCommand","TransactionType","asIntN","closePosCommand","rewardsCallData","r","removeLiqCommand","callData","collectFeeCommand","collectRewards","command","fee","rewards","fn","index","bcs","fromBase64","TransactionType","buildTx","getQuote","BN","ClmmPoolUtil","Decimal","SuiClient","OnChainCalls","config","getBluefinSpotSDK","network","account","client","TxBuilder","txParams","account","network","sdk","getBluefinSpotSDK","pool","liquidityInput","res","BN","_","quoteResponse","getQuote","Decimal","txb","buildTx","params","ClmmPoolUtil","Aggregator7KSwap","_Aggregator7KSwap","BaseIntention","data","TransactionType","input","account","network","TxBuilder","TransactionType","ClosePosition","_ClosePosition","BaseIntention","data","TransactionType","input","account","network","TxBuilder","TransactionType","CollectFee","_CollectFee","BaseIntention","data","TransactionType","input","account","network","TxBuilder","TransactionType","CollectRewards","_CollectRewards","BaseIntention","data","TransactionType","input","account","network","TxBuilder","TransactionType","CollectRewardsAndFee","_CollectRewardsAndFee","BaseIntention","data","TransactionType","input","account","network","TxBuilder","TransactionType","OpenAndAddLiquidity","_OpenAndAddLiquidity","BaseIntention","data","TransactionType","input","account","network","TxBuilder","TransactionType","ProvideLiquidity","_ProvideLiquidity","BaseIntention","data","TransactionType","input","account","network","TxBuilder","TransactionType","RemoveLiquidity","_RemoveLiquidity","BaseIntention","data","TransactionType","input","account","network","TxBuilder","BluefinHelper","input","transaction","appContext","result","Decoder","TransactionType","suiClient","account","network","intention","OpenAndAddLiquidity","ProvideLiquidity","RemoveLiquidity","ClosePosition","CollectFee","CollectRewards","CollectRewardsAndFee","Aggregator7KSwap","TransactionType","Transaction","import_bn","TickMath","BigNumber","suiCoinType","normalizeSuiCoinType","coinType","getUserCoins","suiClient","address","type","cursor","coins","iter","res","coin","error","getCoinsGreaterThanAmount","amount","coinsWithBalance","collectedAmount","getExactCoinByAmountInner","txb","coinA","coinsX","getExactCoinByAmount","mmtSdk","tx","userCoins","item","claimV3Rewards","mmt","address","position","pool","tx","poolModel","rewarder","claimRewardsAsTargetCoin","sdk","positionId","txb","targetCoinType","slippage","rewarderCoinTypes","pools","signedShiftRight","n0","shiftBy","bitWidth","twoN0","tickIndexToSqrtPricePositive","tick","ratio","BN","tickIndexToSqrtPriceNegative","tickIndex","tickIndexToSqrtPriceX64","tickSpacing","scaleUp","signedTick","TickMath","toBaseUnits","amount","decimals","whole","fraction","fractionPadded","baseStrClean","getCoinObject","address","coinType","coinAmount","coinDecimals","tx","mmt","inputCoin","getExactCoinByAmount","normalizeSuiCoinType","getNewPositionObject","poolModel","selectedLowTick","selectedHighTick","lowerTickSqrtPrice","upperTickSqrtPrice","getResultAmountUsingSlippage","slippagePercentage","remainingBasisPoints","getMinimalAmountUsingSlippage","slippage","getLimitSqrtPriceUsingSlippage","poolId","currentSqrtPrice","tokenX","tokenY","isTokenX","suiClient","rpcPool","rpcPoolCurrentPrice","currentPrice","minReceiveRate","limitSqrtPrice","executeClmmDeposit","amountA","amountB","pool","inputCoinX","inputCoinY","position","minimalAmountA","minimalAmountB","executeSingleSidedClmmDeposit","swapSlippage","addLiquiditySlippage","error","executeAddLiquidityToExistingPosition","positionObjectId","minimalXAmount","minimalYAmount","executeAddSingleSidedLiquidityToExistingPosition","getLiquidityAmountByPercentage","liquidity","percentage","BigNumber","removeClmmLiquidity","sdk","withdrawPercentage","removeLiqAmount","typeX","typeY","claimV3Rewards","removeLiquiditySingleSided","txb","targetCoinType","isSwapXToY","removeResult","removeLpCoinA","removeLpCoinB","MmtSDK","VeMMT","createMmtSdk","suiGrpcClient","MmtSDK","createVeMmtSdk","VeMMT","AddLiquidityIntention","_AddLiquidityIntention","BaseIntentionGrpc","data","input","sdk","createMmtSdk","params","address","amountA","amountB","pool","selectedLowTick","selectedHighTick","slippage","tx","Transaction","executeClmmDeposit","Transaction","AddLiquiditySingleSideIntention","_AddLiquiditySingleSideIntention","BaseIntentionGrpc","data","input","sdk","createMmtSdk","params","address","amount","isTokenX","pool","selectedLowTick","selectedHighTick","swapSlippage","addLiquiditySlippage","tx","Transaction","executeSingleSidedClmmDeposit","Transaction","MMT_TOKEN_TYPE","fetchSyncEpochInfo","veMMTSdk","syncEpochInfo","performBond","mmtSdk","token","amount","address","enableAutoMaxBond","unbondAt","tx","amountNum","coin","getCoinObject","commandsBeforeBond","commandsAfterBond","performExtend","veId","currentUnbondAt","isCurrentlyMaxBond","performMerge","selectedVeMMTIds","promise","selectedId","performUnbond","claimVeMMTRewards","veMMTs","veMMT","veMMTData","claimVeMMTRewardsAsTargetCoin","targetCoinType","slippage","claimRoutes","pools","normalizedTargetCoinType","normalizeSuiCoinType","coins","flatCoins","MMT_TOKEN_TYPE","routes","primaryCoin","otherCoins","currentCoin","currentAmount","currentCoinType","i","poolId","swapPool","p","isXtoY","poolModel","limitSqrtPrice","getLimitSqrtPriceUsingSlippage","outputCoin","leftoverCoin","ClaimAllRewardsIntention","_ClaimAllRewardsIntention","BaseIntentionGrpc","data","input","sdk","createMmtSdk","veMMTSdk","createVeMmtSdk","params","address","positions","pools","veMMTs","tx","Transaction","position","pool","v3Pool","claimV3Rewards","claimVeMMTRewards","Transaction","ClaimRewardAsIntention","_ClaimRewardAsIntention","BaseIntentionGrpc","data","input","sdk","createMmtSdk","veMMTSdk","createVeMmtSdk","params","claimVeMMTParams","address","veMMTs","targetCoinType","slippage","claimRoutes","pools","txb","Transaction","param","claimRewardsAsTargetCoin","claimVeMMTRewardsAsTargetCoin","Transaction","ClaimRewardsIntention","_ClaimRewardsIntention","BaseIntentionGrpc","data","input","sdk","createMmtSdk","params","address","position","pool","tx","Transaction","claimV3Rewards","Transaction","ManageLiquidityIntention","_ManageLiquidityIntention","BaseIntentionGrpc","data","input","sdk","createMmtSdk","params","address","amountA","amountB","pool","positionObjectId","slippage","tx","Transaction","executeAddLiquidityToExistingPosition","Transaction","ManageLiquiditySingleSideIntention","_ManageLiquiditySingleSideIntention","BaseIntentionGrpc","data","input","sdk","createMmtSdk","params","address","amount","isTokenX","pool","positionObjectId","swapSlippage","addLiquiditySlippage","tx","Transaction","executeAddSingleSidedLiquidityToExistingPosition","Transaction","RemoveLiquidityIntention","_RemoveLiquidityIntention","BaseIntentionGrpc","data","input","sdk","createMmtSdk","params","pool","position","address","withdrawPercentage","zapOutOn","targetCoinType","slippage","tx","Transaction","removeLiquiditySingleSided","removeClmmLiquidity","Transaction","LstClient","SPRING_SUI_UPGRADE_CAP_ID","LIQUID_STAKING_INFO","SPRING_SUI_PACKAGE_ID","resolvePublishedAt","suiGrpcClient","object","publishedAt","error","createLstClient","initialize","SUI_COIN_TYPE","assertSufficientSpendableBalance","owner","coinType","amount","balance","total","getStakeTxPayload","address","stakeAmount","lstClient","tx","sui","sSui","getUnstakeTxPayload","unstakeAmount","lst","StakeXSuiIntention","_StakeXSuiIntention","BaseIntentionGrpc","data","input","params","address","amount","getStakeTxPayload","Transaction","Utils","isPoolIdRoute","route","isTokensObject","tokenIn","fromBaseUnits","amount","decimals","value","base","whole","fraction","fracStr","toNormalizedPool","pool","rewarder","reward","findTokenInRoute","coinType","normalized","normalizeSuiCoinType","resolveSwapIntentionParams","mmtSdk","params","address","slippage","poolId","fetched","amountIn","performMmtSwap","tx","inputCoin","getCoinObject","inputAmount","inputCoinType","i","routePool","routeTokenX","routeTokenY","isStable","currentSqrtPrice","v3PoolId","isReverse","Utils","isXtoY","poolTokenX","poolTokenY","limitSqrtPrice","getLimitSqrtPriceUsingSlippage","result","SwapIntention","_SwapIntention","BaseIntentionGrpc","data","input","sdk","createMmtSdk","resolved","resolveSwapIntentionParams","tx","Transaction","performMmtSwap","UnstakeXSuiIntention","_UnstakeXSuiIntention","BaseIntentionGrpc","data","input","params","address","amount","getUnstakeTxPayload","Transaction","BondVeMMTIntention","_BondVeMMTIntention","BaseIntentionGrpc","data","input","sdk","createMmtSdk","veMMTSdk","createVeMmtSdk","params","token","amount","address","enableAutoMaxBond","unbondAt","tx","Transaction","performBond","Transaction","ExtendVeMMTIntention","_ExtendVeMMTIntention","BaseIntentionGrpc","data","input","veMMTSdk","createVeMmtSdk","params","address","veId","currentUnbondAt","isCurrentlyMaxBond","enableAutoMaxBond","unbondAt","tx","Transaction","performExtend","Transaction","MergeVeMMTIntention","_MergeVeMMTIntention","BaseIntentionGrpc","data","input","veMMTSdk","createVeMmtSdk","params","address","veId","selectedVeMMTIds","tx","Transaction","performMerge","Transaction","UnbondVeMMTIntention","_UnbondVeMMTIntention","BaseIntentionGrpc","data","input","veMMTSdk","createVeMmtSdk","params","address","veId","tx","Transaction","performUnbond","MMTDEXAppHelper","input","appContext","TransactionType","intention","SwapIntention","AddLiquidityIntention","AddLiquiditySingleSideIntention","ClaimRewardsIntention","ClaimAllRewardsIntention","ClaimRewardAsIntention","RemoveLiquidityIntention","StakeXSuiIntention","UnstakeXSuiIntention","ManageLiquidityIntention","ManageLiquiditySingleSideIntention","BondVeMMTIntention","ExtendVeMMTIntention","MergeVeMMTIntention","UnbondVeMMTIntention","appHelpers","MSafeApps","CoreHelper","NAVIAppHelper","MPayAppHelper","PlainTransactionHelper","CetusHelper","TURBOSAppHelper","MMTDEXAppHelper","ScallopAppHelper","VoloAppHelper","BucketHelper","SuilendAppHelper","SpringSuiAppHelper","AlphaFiHelper","BluefinHelper","StSuiHelper"]}