{"version":3,"file":"index.cjs","names":["BN","module","Buffer","allocate","comb10MulTo","prime","z","z","PublicKey","provider: ethers.JsonRpcProvider","url: string","decodedOutput: TransactionOutputData","address","address","Client","adapter","dataToSerialize: SerializableValue","dataToEncode: TransactionOutputData","obj: TransactionOutputData","data: TransactionOutputData","events: ParsedCpiEvent[]","events","anchor","bitcoin","inputs: BitcoinInputSigningPlan[]","signedTxHash: string","tx","anchor","Connection","ChainSignaturesIDL","Program","BN"],"sources":["../../../node_modules/bn.js/lib/bn.js","../src/types/index.ts","../idl/chain_signatures.json","../src/config/Config.ts","../src/modules/CryptoUtils.ts","../src/modules/RequestIdGenerator.ts","../src/modules/ChainUtils.ts","../src/modules/ethereum/EthereumMonitor.ts","../src/adapters/MempoolSpaceAdapter.ts","../src/adapters/BitcoinCoreRpcAdapter.ts","../src/adapters/BitcoinAdapterFactory.ts","../src/modules/bitcoin/BitcoinMonitor.ts","../src/modules/OutputSerializer.ts","../src/events/CpiEventParser.ts","../src/modules/bitcoin/BitcoinTransactionProcessor.ts","../src/modules/bitcoin/BidirectionalHandler.ts","../src/modules/ethereum/EthereumTransactionProcessor.ts","../src/modules/ethereum/BidirectionalHandler.ts","../src/server/ChainSignatureServer.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    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 { PublicKey } from '@solana/web3.js';\nimport { z } from 'zod';\n\nexport type BitcoinNetwork = 'regtest' | 'testnet';\n\nexport interface ServerConfig {\n  solanaRpcUrl: string;\n  solanaPrivateKey: string;\n  mpcRootKey: string;\n  infuraApiKey: string;\n  programId: string;\n  isDevnet: boolean;\n  signatureDeposit?: string;\n  chainId?: string;\n  verbose?: boolean;\n  bitcoinNetwork: BitcoinNetwork;\n}\n\nexport const serverConfigSchema = z.object({\n  solanaRpcUrl: z.string().min(1, 'Solana RPC URL is required'),\n  solanaPrivateKey: z.string().min(1, 'Solana private key is required'),\n  mpcRootKey: z\n    .string()\n    .regex(\n      /^0x[a-fA-F0-9]{64}$/,\n      'MPC root key must be a valid hex private key'\n    ),\n  infuraApiKey: z.string().min(1, 'Infura API key is required'),\n  programId: z.string().refine((val) => {\n    try {\n      new PublicKey(val);\n      return true;\n    } catch {\n      return false;\n    }\n  }, 'Must be a valid Solana public key'),\n  isDevnet: z.boolean(),\n  signatureDeposit: z.string().optional(),\n  chainId: z.string().optional(),\n  verbose: z.boolean().optional(),\n  bitcoinNetwork: z.enum(['regtest', 'testnet']),\n});\n\nexport interface SignBidirectionalEvent {\n  sender: PublicKey;\n  serializedTransaction: Buffer;\n  caip2Id: string;\n  keyVersion: number;\n  deposit: bigint;\n  path: string;\n  algo: string;\n  dest: string;\n  params: string;\n  outputDeserializationSchema: Buffer;\n  respondSerializationSchema: Buffer;\n}\n\nexport interface SignatureRequestedEvent {\n  sender: PublicKey;\n  payload: number[];\n  keyVersion: number;\n  deposit: bigint;\n  chainId: string;\n  path: string;\n  algo: string;\n  dest: string;\n  params: string;\n  feePayer: PublicKey | null;\n}\n\nexport interface PrevoutRef {\n  txid: string;\n  vout: number;\n}\n\n/**\n * Bookkeeping for any cross-chain transaction we are still monitoring.\n *\n * Each entry is added immediately after the server hands signatures back to the\n * requester, and removed once the monitor emits either a success/failure\n * response. Fields mirror the data needed by `BitcoinMonitor`/`EthereumMonitor`\n * plus the serialization schemas required to format the final callback payload.\n */\nexport interface PendingTransaction {\n  /** Canonical transaction hash on the destination chain (txid for Bitcoin). */\n  txHash: string;\n\n  /** Deterministic request identifier that the Solana contract expects. */\n  requestId: string;\n\n  /** CAIP-2 chain identifier (e.g. `eip155:1`, `bip122:000000...`). */\n  caip2Id: string;\n\n  /** Schema emitted on-chain describing how to decode explorer outputs. */\n  explorerDeserializationSchema: Buffer | number[];\n\n  /** Schema to re-encode the callback payload for `respondBidirectional`. */\n  callbackSerializationSchema: Buffer | number[];\n\n  /** Address that broadcast the transaction (EVM sender or `bitcoin`). */\n  fromAddress: string;\n\n  /** Nonce used for the EVM transaction (0 for Bitcoin). */\n  nonce: number;\n\n  /** Number of poll attempts already performed; drives backoff. */\n  checkCount: number;\n\n  /** Chain namespace derived from CAIP-2 (e.g. `eip155`, `bip122`). */\n  namespace: string;\n\n  /**\n   * Previous outputs consumed by the transaction. Only populated for Bitcoin so\n   * the monitor can detect if any input was double-spent elsewhere.\n   */\n  prevouts?: PrevoutRef[];\n}\n\n// Borsh schema types\nexport interface BorshStructField {\n  [key: string]: string;\n}\n\nexport interface BorshSchema {\n  struct?: BorshStructField;\n  enum?: Array<{ [key: string]: BorshStructField | string }>;\n}\n\n// ABI schema types\nexport interface AbiSchemaField {\n  name: string;\n  type: string;\n}\n\n// Serialization output types\nexport type SerializableValue =\n  | string\n  | number\n  | boolean\n  | bigint\n  | null\n  | SerializableValue[]\n  | { [key: string]: SerializableValue };\n\n// Monitor outputs always return structured objects so serializers can apply\n// either Borsh or ABI schemas consistently across chains.\nexport type TransactionOutputData = { [key: string]: SerializableValue };\n\nexport interface TransactionOutput {\n  success: boolean;\n  output: TransactionOutputData;\n}\n\nexport type TransactionStatus =\n  | { status: 'pending' }\n  | { status: 'success'; success: boolean; output: TransactionOutputData }\n  | { status: 'error'; reason: string }\n  | { status: 'fatal_error'; reason: string };\n\nexport interface SignatureResponse {\n  bigR: { x: number[]; y: number[] };\n  s: number[];\n  recoveryId: number;\n}\n\nexport interface ProcessedTransaction {\n  signedTxHash: string;\n  signature: SignatureResponse[]; // Array to support multiple inputs (e.g., Bitcoin PSBTs)\n  signedTransaction: string;\n  fromAddress: string;\n  nonce: number;\n}\n\n// CPI Event data types - union of all possible event data\nexport type CpiEventData = SignBidirectionalEvent | SignatureRequestedEvent;\n\n// Type guard functions\nexport function isSignBidirectionalEvent(\n  event: CpiEventData\n): event is SignBidirectionalEvent {\n  return 'serializedTransaction' in event && 'caip2Id' in event;\n}\n\nexport function isSignatureRequestedEvent(\n  event: CpiEventData\n): event is SignatureRequestedEvent {\n  return 'payload' in event && 'chainId' in event;\n}\n","{\n  \"address\": \"H5tHfpYoEnarrrzcV7sWBcZhiKMvL2aRpUYvb1ydWkwS\",\n  \"metadata\": {\n    \"name\": \"chain_signatures\",\n    \"version\": \"0.4.0\",\n    \"spec\": \"0.1.0\",\n    \"description\": \"Chain signatures program for cross-chain signing on Solana\",\n    \"repository\": \"https://github.com/sig-net/signet-solana-program\"\n  },\n  \"instructions\": [\n    {\n      \"name\": \"get_signature_deposit\",\n      \"docs\": [\n        \"* @dev Function to get the current signature deposit amount.\\n     * @return The current signature deposit amount.\"\n      ],\n      \"discriminator\": [\n        45,\n        243,\n        86,\n        86,\n        58,\n        57,\n        172,\n        253\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"program_state\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  112,\n                  114,\n                  111,\n                  103,\n                  114,\n                  97,\n                  109,\n                  45,\n                  115,\n                  116,\n                  97,\n                  116,\n                  101\n                ]\n              }\n            ]\n          }\n        }\n      ],\n      \"args\": [],\n      \"returns\": \"u64\"\n    },\n    {\n      \"name\": \"initialize\",\n      \"docs\": [\n        \"* @dev Function to initialize the program state.\\n     * @param signature_deposit The deposit required for signature requests.\\n     * @param chain_id The CAIP-2 chain identifier.\"\n      ],\n      \"discriminator\": [\n        175,\n        175,\n        109,\n        31,\n        13,\n        152,\n        155,\n        237\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"program_state\",\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  112,\n                  114,\n                  111,\n                  103,\n                  114,\n                  97,\n                  109,\n                  45,\n                  115,\n                  116,\n                  97,\n                  116,\n                  101\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"admin\",\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"system_program\",\n          \"address\": \"11111111111111111111111111111111\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"signature_deposit\",\n          \"type\": \"u64\"\n        },\n        {\n          \"name\": \"chain_id\",\n          \"type\": \"string\"\n        }\n      ]\n    },\n    {\n      \"name\": \"respond\",\n      \"docs\": [\n        \"* @dev Function to respond to signature requests.\\n     * @param request_ids The array of request IDs.\\n     * @param signatures The array of signature responses.\"\n      ],\n      \"discriminator\": [\n        72,\n        65,\n        227,\n        97,\n        42,\n        255,\n        147,\n        12\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"responder\",\n          \"signer\": true\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"request_ids\",\n          \"type\": {\n            \"vec\": {\n              \"array\": [\n                \"u8\",\n                32\n              ]\n            }\n          }\n        },\n        {\n          \"name\": \"signatures\",\n          \"type\": {\n            \"vec\": {\n              \"defined\": {\n                \"name\": \"Signature\"\n              }\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"respond_bidirectional\",\n      \"docs\": [\n        \"* @dev Function to finalize bidirectional flow\\n     * @param request_id The ID of the signature request to respond to\\n     * @param serialized_output output of the previously executed transaction\\n     * @param signature ECDSA signature of the serialized output and request_id (keccak256(request_id.concat(serialized_output)))\"\n      ],\n      \"discriminator\": [\n        138,\n        0,\n        45,\n        246,\n        236,\n        211,\n        109,\n        81\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"responder\",\n          \"signer\": true\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"request_id\",\n          \"type\": {\n            \"array\": [\n              \"u8\",\n              32\n            ]\n          }\n        },\n        {\n          \"name\": \"serialized_output\",\n          \"type\": \"bytes\"\n        },\n        {\n          \"name\": \"signature\",\n          \"type\": {\n            \"defined\": {\n              \"name\": \"Signature\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"respond_error\",\n      \"docs\": [\n        \"* @dev Function to emit signature generation errors.\\n     * @param errors The array of signature generation errors.\"\n      ],\n      \"discriminator\": [\n        3,\n        170,\n        41,\n        132,\n        72,\n        184,\n        252,\n        69\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"responder\",\n          \"signer\": true\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"errors\",\n          \"type\": {\n            \"vec\": {\n              \"defined\": {\n                \"name\": \"ErrorResponse\"\n              }\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"sign\",\n      \"docs\": [\n        \"* @dev Function to request a signature.\\n     * @param payload The payload to be signed.\\n     * @param key_version The version of the key used for signing.\\n     * @param path The derivation path for the user account.\\n     * @param algo The algorithm used for signing.\\n     * @param dest The response destination.\\n     * @param params Additional parameters.\"\n      ],\n      \"discriminator\": [\n        5,\n        221,\n        155,\n        46,\n        237,\n        91,\n        28,\n        236\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"program_state\",\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  112,\n                  114,\n                  111,\n                  103,\n                  114,\n                  97,\n                  109,\n                  45,\n                  115,\n                  116,\n                  97,\n                  116,\n                  101\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"requester\",\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"fee_payer\",\n          \"writable\": true,\n          \"signer\": true,\n          \"optional\": true\n        },\n        {\n          \"name\": \"system_program\",\n          \"address\": \"11111111111111111111111111111111\"\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"payload\",\n          \"type\": {\n            \"array\": [\n              \"u8\",\n              32\n            ]\n          }\n        },\n        {\n          \"name\": \"key_version\",\n          \"type\": \"u32\"\n        },\n        {\n          \"name\": \"path\",\n          \"type\": \"string\"\n        },\n        {\n          \"name\": \"algo\",\n          \"type\": \"string\"\n        },\n        {\n          \"name\": \"dest\",\n          \"type\": \"string\"\n        },\n        {\n          \"name\": \"params\",\n          \"type\": \"string\"\n        }\n      ]\n    },\n    {\n      \"name\": \"sign_bidirectional\",\n      \"docs\": [\n        \"* @dev Function to initiate bidirectional flow\\n     * @param serialized_transaction transaction to be signed\\n     * @param caip2_id chain identifier\\n     * @param key_version The version of the key used for signing.\\n     * @param path The derivation path for the user account.\\n     * @param algo The algorithm used for signing.\\n     * @param dest The response destination.\\n     * @param params Additional parameters.\\n     * @param program_id Program ID to callback after execution (not yet enabled).\\n     * @param output_deserialization_schema schema for transaction output deserialization\\n     * @param respond_serialization_schema serialization schema for respond_bidirectional payload\"\n      ],\n      \"discriminator\": [\n        21,\n        104,\n        182,\n        213,\n        189,\n        143,\n        219,\n        48\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"program_state\",\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  112,\n                  114,\n                  111,\n                  103,\n                  114,\n                  97,\n                  109,\n                  45,\n                  115,\n                  116,\n                  97,\n                  116,\n                  101\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"requester\",\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"fee_payer\",\n          \"writable\": true,\n          \"signer\": true,\n          \"optional\": true\n        },\n        {\n          \"name\": \"system_program\",\n          \"address\": \"11111111111111111111111111111111\"\n        },\n        {\n          \"name\": \"instructions\",\n          \"optional\": true\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"serialized_transaction\",\n          \"type\": \"bytes\"\n        },\n        {\n          \"name\": \"caip2_id\",\n          \"type\": \"string\"\n        },\n        {\n          \"name\": \"key_version\",\n          \"type\": \"u32\"\n        },\n        {\n          \"name\": \"path\",\n          \"type\": \"string\"\n        },\n        {\n          \"name\": \"algo\",\n          \"type\": \"string\"\n        },\n        {\n          \"name\": \"dest\",\n          \"type\": \"string\"\n        },\n        {\n          \"name\": \"params\",\n          \"type\": \"string\"\n        },\n        {\n          \"name\": \"program_id\",\n          \"type\": \"pubkey\"\n        },\n        {\n          \"name\": \"output_deserialization_schema\",\n          \"type\": \"bytes\"\n        },\n        {\n          \"name\": \"respond_serialization_schema\",\n          \"type\": \"bytes\"\n        }\n      ]\n    },\n    {\n      \"name\": \"update_deposit\",\n      \"docs\": [\n        \"* @dev Function to set the signature deposit amount.\\n     * @param new_deposit The new deposit amount.\"\n      ],\n      \"discriminator\": [\n        126,\n        116,\n        15,\n        164,\n        238,\n        179,\n        155,\n        59\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"program_state\",\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  112,\n                  114,\n                  111,\n                  103,\n                  114,\n                  97,\n                  109,\n                  45,\n                  115,\n                  116,\n                  97,\n                  116,\n                  101\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"admin\",\n          \"writable\": true,\n          \"signer\": true,\n          \"relations\": [\n            \"program_state\"\n          ]\n        },\n        {\n          \"name\": \"system_program\",\n          \"address\": \"11111111111111111111111111111111\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"new_deposit\",\n          \"type\": \"u64\"\n        }\n      ]\n    },\n    {\n      \"name\": \"withdraw_funds\",\n      \"docs\": [\n        \"* @dev Function to withdraw funds from the program.\\n     * @param amount The amount to withdraw.\"\n      ],\n      \"discriminator\": [\n        241,\n        36,\n        29,\n        111,\n        208,\n        31,\n        104,\n        217\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"program_state\",\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  112,\n                  114,\n                  111,\n                  103,\n                  114,\n                  97,\n                  109,\n                  45,\n                  115,\n                  116,\n                  97,\n                  116,\n                  101\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"admin\",\n          \"writable\": true,\n          \"signer\": true,\n          \"relations\": [\n            \"program_state\"\n          ]\n        },\n        {\n          \"name\": \"recipient\",\n          \"docs\": [\n            \"function by checking it is not the zero address.\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"system_program\",\n          \"address\": \"11111111111111111111111111111111\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"amount\",\n          \"type\": \"u64\"\n        }\n      ]\n    }\n  ],\n  \"accounts\": [\n    {\n      \"name\": \"ProgramState\",\n      \"discriminator\": [\n        77,\n        209,\n        137,\n        229,\n        149,\n        67,\n        167,\n        230\n      ]\n    }\n  ],\n  \"events\": [\n    {\n      \"name\": \"DepositUpdatedEvent\",\n      \"discriminator\": [\n        215,\n        193,\n        53,\n        27,\n        221,\n        101,\n        249,\n        108\n      ]\n    },\n    {\n      \"name\": \"FundsWithdrawnEvent\",\n      \"discriminator\": [\n        86,\n        232,\n        194,\n        4,\n        211,\n        69,\n        172,\n        202\n      ]\n    },\n    {\n      \"name\": \"RespondBidirectionalEvent\",\n      \"discriminator\": [\n        195,\n        195,\n        28,\n        1,\n        102,\n        100,\n        189,\n        234\n      ]\n    },\n    {\n      \"name\": \"SignBidirectionalEvent\",\n      \"discriminator\": [\n        135,\n        205,\n        217,\n        152,\n        96,\n        187,\n        11,\n        124\n      ]\n    },\n    {\n      \"name\": \"SignatureErrorEvent\",\n      \"discriminator\": [\n        42,\n        28,\n        210,\n        105,\n        9,\n        196,\n        189,\n        51\n      ]\n    },\n    {\n      \"name\": \"SignatureRequestedEvent\",\n      \"discriminator\": [\n        171,\n        129,\n        105,\n        91,\n        154,\n        49,\n        160,\n        34\n      ]\n    },\n    {\n      \"name\": \"SignatureRespondedEvent\",\n      \"discriminator\": [\n        118,\n        146,\n        248,\n        151,\n        194,\n        93,\n        18,\n        86\n      ]\n    }\n  ],\n  \"errors\": [\n    {\n      \"code\": 6000,\n      \"name\": \"InsufficientDeposit\",\n      \"msg\": \"Insufficient deposit amount\"\n    },\n    {\n      \"code\": 6001,\n      \"name\": \"InvalidInputLength\",\n      \"msg\": \"Arrays must have the same length\"\n    },\n    {\n      \"code\": 6002,\n      \"name\": \"Unauthorized\",\n      \"msg\": \"Unauthorized access\"\n    },\n    {\n      \"code\": 6003,\n      \"name\": \"InsufficientFunds\",\n      \"msg\": \"Insufficient funds for withdrawal\"\n    },\n    {\n      \"code\": 6004,\n      \"name\": \"InvalidRecipient\",\n      \"msg\": \"Invalid recipient address\"\n    },\n    {\n      \"code\": 6005,\n      \"name\": \"InvalidTransaction\",\n      \"msg\": \"Invalid transaction data\"\n    },\n    {\n      \"code\": 6006,\n      \"name\": \"MissingInstructionSysvar\",\n      \"msg\": \"Missing instruction sysvar\"\n    }\n  ],\n  \"types\": [\n    {\n      \"name\": \"AffinePoint\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"x\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                32\n              ]\n            }\n          },\n          {\n            \"name\": \"y\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                32\n              ]\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"DepositUpdatedEvent\",\n      \"docs\": [\n        \"* @dev Emitted when the deposit amount is updated.\\n * @param old_deposit The previous deposit amount.\\n * @param new_deposit The new deposit amount.\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"old_deposit\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"new_deposit\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"ErrorResponse\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"request_id\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                32\n              ]\n            }\n          },\n          {\n            \"name\": \"error_message\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"FundsWithdrawnEvent\",\n      \"docs\": [\n        \"* @dev Emitted when a withdrawal is made.\\n * @param amount The amount withdrawn.\\n * @param recipient The address of the recipient.\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"amount\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"recipient\",\n            \"type\": \"pubkey\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"ProgramState\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"admin\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"signature_deposit\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"chain_id\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"RespondBidirectionalEvent\",\n      \"docs\": [\n        \"* @dev Emitted when a read response is received.\\n * @param request_id The ID of the request. Must be calculated off-chain.\\n * @param responder The address of the responder.\\n * @param serialized_output The serialized output.\\n * @param signature The signature.\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"request_id\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                32\n              ]\n            }\n          },\n          {\n            \"name\": \"responder\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"serialized_output\",\n            \"type\": \"bytes\"\n          },\n          {\n            \"name\": \"signature\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"Signature\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"SignBidirectionalEvent\",\n      \"docs\": [\n        \"* @dev Emitted when a sign_bidirectional request is made.\\n * @param sender The address of the sender.\\n * @param serialized_transaction The serialized transaction to be signed.\\n * @param caip2_id The SLIP-44 chain ID.\\n * @param key_version The version of the key used for signing.\\n * @param deposit The deposit amount.\\n * @param path The derivation path for the user account.\\n * @param algo The algorithm used for signing.\\n * @param dest The response destination.\\n * @param params Additional parameters.\\n * @param program_id Program ID to callback after execution (not yet enabled).\\n * @param output_deserialization_schema Schema for transaction output deserialization.\\n * @param respond_serialization_schema Serialization schema for respond_bidirectional payload.\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"sender\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"serialized_transaction\",\n            \"type\": \"bytes\"\n          },\n          {\n            \"name\": \"caip2_id\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"key_version\",\n            \"type\": \"u32\"\n          },\n          {\n            \"name\": \"deposit\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"path\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"algo\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"dest\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"params\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"program_id\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"output_deserialization_schema\",\n            \"type\": \"bytes\"\n          },\n          {\n            \"name\": \"respond_serialization_schema\",\n            \"type\": \"bytes\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Signature\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"big_r\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"AffinePoint\"\n              }\n            }\n          },\n          {\n            \"name\": \"s\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                32\n              ]\n            }\n          },\n          {\n            \"name\": \"recovery_id\",\n            \"type\": \"u8\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"SignatureErrorEvent\",\n      \"docs\": [\n        \"* @dev Emitted when a signature error is received.\\n * @notice Any address can emit this event. Do not rely on it for business logic.\\n * @param request_id The ID of the request. Must be calculated off-chain.\\n * @param responder The address of the responder.\\n * @param error The error message.\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"request_id\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                32\n              ]\n            }\n          },\n          {\n            \"name\": \"responder\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"error\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"SignatureRequestedEvent\",\n      \"docs\": [\n        \"* @dev Emitted when a signature is requested.\\n * @param sender The address of the sender.\\n * @param payload The payload to be signed.\\n * @param key_version The version of the key used for signing.\\n * @param deposit The deposit amount.\\n * @param chain_id The CAIP-2 ID of the blockchain.\\n * @param path The derivation path for the user account.\\n * @param algo The algorithm used for signing.\\n * @param dest The response destination.\\n * @param params Additional parameters.\\n * @param fee_payer Optional fee payer account.\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"sender\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"payload\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                32\n              ]\n            }\n          },\n          {\n            \"name\": \"key_version\",\n            \"type\": \"u32\"\n          },\n          {\n            \"name\": \"deposit\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"chain_id\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"path\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"algo\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"dest\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"params\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"fee_payer\",\n            \"type\": {\n              \"option\": \"pubkey\"\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"SignatureRespondedEvent\",\n      \"docs\": [\n        \"* @dev Emitted when a signature response is received.\\n * @notice Any address can emit this event. Clients should always verify the validity of the signature.\\n * @param request_id The ID of the request. Must be calculated off-chain.\\n * @param responder The address of the responder.\\n * @param signature The signature response.\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"request_id\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                32\n              ]\n            }\n          },\n          {\n            \"name\": \"responder\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"signature\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"Signature\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  ]\n}","export const CONFIG = {\n  EPSILON_DERIVATION_PREFIX: 'sig.network v1.0.0 epsilon derivation',\n  SOLANA_CHAIN_ID: '0x800001f5',\n  SECP256K1_P:\n    '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F',\n  SECP256K1_N:\n    '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141',\n  POLL_INTERVAL_MS: 5000,\n  TX_TIMEOUT_MS: 1200000, // 20 minutes\n  BITCOIN_DEFAULT_CONFIRMATIONS: 1,\n} as const;\n","import { CONFIG } from '../config/Config';\nimport { ethers } from 'ethers';\nimport { SignatureResponse } from '../types';\n\nexport class CryptoUtils {\n  static deriveEpsilon(requester: string, path: string): bigint {\n    const derivationPath = `${CONFIG.EPSILON_DERIVATION_PREFIX},${CONFIG.SOLANA_CHAIN_ID},${requester},${path}`;\n    const hash = ethers.keccak256(ethers.toUtf8Bytes(derivationPath));\n    return BigInt(hash);\n  }\n\n  static async deriveSigningKey(\n    path: string,\n    predecessor: string,\n    basePrivateKey: string\n  ): Promise<string> {\n    const epsilon = this.deriveEpsilon(predecessor, path);\n    const privateKeyBigInt = BigInt(basePrivateKey);\n    const derivedPrivateKey =\n      (privateKeyBigInt + epsilon) % BigInt(CONFIG.SECP256K1_N);\n    return '0x' + derivedPrivateKey.toString(16).padStart(64, '0');\n  }\n\n  static async signMessage(\n    msgHash: number[] | string,\n    privateKeyHex: string\n  ): Promise<SignatureResponse> {\n    const msgHashHex =\n      typeof msgHash === 'string'\n        ? msgHash\n        : '0x' + Buffer.from(msgHash).toString('hex');\n\n    const signingKey = new ethers.SigningKey(privateKeyHex);\n    const signature = signingKey.sign(msgHashHex);\n\n    const recoveredPublicKey = ethers.SigningKey.recoverPublicKey(\n      msgHashHex,\n      signature\n    );\n    const publicKeyPoint = ethers.getBytes(recoveredPublicKey);\n\n    const y = publicKeyPoint.slice(33, 65);\n\n    return {\n      bigR: {\n        x: Array.from(Buffer.from(signature.r.slice(2), 'hex')),\n        y: Array.from(y),\n      },\n      s: Array.from(Buffer.from(signature.s.slice(2), 'hex')),\n      recoveryId: signature.v - 27,\n    };\n  }\n\n  static async signBidirectionalResponse(\n    requestId: Uint8Array,\n    serializedOutput: Uint8Array,\n    privateKeyHex: string\n  ): Promise<SignatureResponse> {\n    const combined = new Uint8Array(requestId.length + serializedOutput.length);\n    combined.set(requestId);\n    combined.set(serializedOutput, requestId.length);\n    const messageHash = ethers.keccak256(combined);\n    return this.signMessage(messageHash, privateKeyHex);\n  }\n}\n","import { ethers } from 'ethers';\n\nexport class RequestIdGenerator {\n  /**\n   * Generate a request ID for bidirectional sign operations\n   *\n   * Use this for sign-and-respond flows where:\n   * - A transaction is signed on one chain (e.g., Ethereum, Bitcoin)\n   * - The transaction is executed\n   * - The result is monitored and returned to Solana\n   *\n   * @param sender - Solana public key of the requester\n   * @param transactionData - Transaction identifier:\n   *   - For Bitcoin: 32-byte txid (transaction hash without witness)\n   *   - For EVM: Full RLP-encoded transaction bytes\n   * @param caip2Id - CAIP-2 chain identifier (e.g., \"eip155:1\", \"bip122:...\")\n   * @param keyVersion - MPC key version\n   * @param path - Derivation path\n   * @param algo - Signature algorithm\n   * @param dest - Destination identifier\n   * @param params - Additional parameters\n   * @returns Deterministic request ID (keccak256 hash)\n   */\n  static generateSignBidirectionalRequestId(\n    sender: string,\n    transactionData: number[],\n    caip2Id: string,\n    keyVersion: number,\n    path: string,\n    algo: string,\n    dest: string,\n    params: string\n  ): string {\n    const txDataHex = '0x' + Buffer.from(transactionData).toString('hex');\n    const encoded = ethers.solidityPacked(\n      [\n        'string',\n        'bytes',\n        'string',\n        'uint32',\n        'string',\n        'string',\n        'string',\n        'string',\n      ],\n      [sender, txDataHex, caip2Id, keyVersion, path, algo, dest, params]\n    );\n    return ethers.keccak256(encoded);\n  }\n\n  /**\n   * Generate a request ID for simple signature requests\n   *\n   * Use this for one-way signature operations where:\n   * - A payload/message hash is signed\n   * - Only the signature is returned (no transaction execution)\n   * - No monitoring or bidirectional response needed\n   *\n   * @param addr - Solana public key of the requester\n   * @param payload - Message hash or payload to sign\n   * @param path - Derivation path\n   * @param keyVersion - MPC key version\n   * @param chainId - Chain identifier (number or string)\n   * @param algo - Signature algorithm\n   * @param dest - Destination identifier\n   * @param params - Additional parameters\n   * @returns Deterministic request ID (keccak256 hash)\n   */\n  static generateSignRequestId(\n    addr: string,\n    payload: number[],\n    path: string,\n    keyVersion: number,\n    chainId: number | string,\n    algo: string,\n    dest: string,\n    params: string\n  ): string {\n    const payloadHex = '0x' + Buffer.from(payload).toString('hex');\n    const encoded = ethers.AbiCoder.defaultAbiCoder().encode(\n      [\n        'string',\n        'bytes',\n        'string',\n        'uint32',\n        'uint256',\n        'string',\n        'string',\n        'string',\n      ],\n      [addr, payloadHex, path, keyVersion, chainId, algo, dest, params]\n    );\n    return ethers.keccak256(encoded);\n  }\n}\n","/**\n * Utilities for chain-specific operations\n */\n\nexport enum SerializationFormat {\n  Borsh = 0,\n  ABI = 1,\n  BitcoinSimple = 2,\n}\n\n/**\n * Extract namespace from CAIP-2 chain ID\n *\n * @param caip2Id - CAIP-2 chain identifier\n * @returns namespace - The chain namespace\n *\n * @example\n * getNamespaceFromCaip2(\"eip155:1\") // \"eip155\" (Ethereum)\n * getNamespaceFromCaip2(\"solana:mainnet\") // \"solana\"\n * getNamespaceFromCaip2(\"bip122:000000000000000000064...\") // \"bip122\" (Bitcoin)\n */\nexport function getNamespaceFromCaip2(caip2Id: string): string {\n  const [namespace] = caip2Id.split(':');\n  if (!namespace) {\n    throw new Error(`Invalid CAIP-2 ID: ${caip2Id}`);\n  }\n  return namespace.toLowerCase();\n}\n\n/**\n * Get serialization format from CAIP-2 chain ID\n *\n * @param caip2Id - CAIP-2 chain identifier\n * @returns SerializationFormat enum value\n *\n * Formats:\n * - Borsh (0): Solana chains\n * - ABI (1): EVM chains (Ethereum, Polygon, BSC, etc.)\n * - BitcoinSimple (2): Bitcoin (testnet4/regtest) - returns { success: bool } only\n *\n * @example\n * getSerializationFormat(\"eip155:1\") // SerializationFormat.ABI\n * getSerializationFormat(\"solana:mainnet\") // SerializationFormat.Borsh\n * getSerializationFormat(\"bip122:000000000000000000064...\") // SerializationFormat.BitcoinSimple\n */\nexport function getSerializationFormat(caip2Id: string): SerializationFormat {\n  const namespace = getNamespaceFromCaip2(caip2Id);\n\n  switch (namespace) {\n    case 'eip155':\n      return SerializationFormat.ABI;\n    case 'solana':\n      return SerializationFormat.Borsh;\n    case 'bip122':\n      return SerializationFormat.BitcoinSimple;\n    default:\n      throw new Error(`Unsupported chain namespace: ${namespace}`);\n  }\n}\n","import { ethers } from 'ethers';\nimport {\n  TransactionOutput,\n  TransactionStatus,\n  ServerConfig,\n  TransactionOutputData,\n  AbiSchemaField,\n} from '../../types';\nimport {\n  getNamespaceFromCaip2,\n  getSerializationFormat,\n  SerializationFormat,\n} from '../ChainUtils';\n\nexport class EthereumMonitor {\n  private static providerCache = new Map<string, ethers.JsonRpcProvider>();\n  static async waitForTransactionAndGetOutput(\n    txHash: string,\n    caip2Id: string,\n    explorerDeserializationSchema: Buffer | number[],\n    fromAddress: string,\n    nonce: number,\n    config: ServerConfig\n  ): Promise<TransactionStatus> {\n    let provider: ethers.JsonRpcProvider;\n\n    try {\n      provider = this.getProvider(caip2Id, config);\n    } catch (e) {\n      return { status: 'fatal_error', reason: 'unsupported_chain' };\n    }\n\n    console.log(`⏳ Checking transaction ${txHash}...`);\n\n    try {\n      const receipt = await provider.getTransactionReceipt(txHash);\n\n      if (receipt) {\n        console.log(`✅ Transaction found! Confirmation complete.`);\n        console.log(`  📦 Block number: ${receipt.blockNumber}`);\n        console.log(\n          `  ${receipt.status === 1 ? '✅' : '❌'} Status: ${\n            receipt.status === 1 ? 'Success' : 'Failed'\n          }`\n        );\n\n        if (receipt.status === 0) {\n          return { status: 'error', reason: 'reverted' };\n        }\n\n        const tx = await provider.getTransaction(txHash);\n        if (!tx) {\n          return { status: 'pending' };\n        }\n\n        try {\n          const output = await this.extractTransactionOutput(\n            tx,\n            receipt,\n            provider,\n            caip2Id,\n            explorerDeserializationSchema,\n            fromAddress\n          );\n          return {\n            status: 'success',\n            success: output.success,\n            output: output.output,\n          };\n        } catch (e) {\n          return { status: 'fatal_error', reason: 'extraction_failed' };\n        }\n      } else {\n        // No receipt - check if replaced\n        const currentNonce = await provider.getTransactionCount(fromAddress);\n        if (currentNonce > nonce) {\n          // Check if it was our transaction\n          const receiptCheck = await provider.getTransactionReceipt(txHash);\n          if (!receiptCheck) {\n            return { status: 'error', reason: 'replaced' };\n          }\n        }\n\n        // Check if transaction exists\n        const tx = await provider.getTransaction(txHash);\n        if (!tx) {\n          return { status: 'pending' };\n        }\n\n        console.log(`✅ Transaction found! Waiting for confirmation...`);\n\n        // Already checked receipt above and it was null, so return pending\n        return { status: 'pending' };\n      }\n    } catch (e) {\n      return { status: 'pending' };\n    }\n  }\n\n  private static getProvider(\n    caip2Id: string,\n    config: ServerConfig\n  ): ethers.JsonRpcProvider {\n    const namespace = getNamespaceFromCaip2(caip2Id);\n    const cacheKey = `${caip2Id}-${config.isDevnet}`;\n\n    if (this.providerCache.has(cacheKey)) {\n      return this.providerCache.get(cacheKey)!;\n    }\n\n    let url: string;\n    switch (namespace) {\n      case 'eip155':\n        url = config.isDevnet\n          ? `https://sepolia.infura.io/v3/${config.infuraApiKey}`\n          : `https://mainnet.infura.io/v3/${config.infuraApiKey}`;\n        break;\n      default:\n        throw new Error(`Unsupported chain namespace: ${namespace}`);\n    }\n\n    const provider = new ethers.JsonRpcProvider(url);\n    this.providerCache.set(cacheKey, provider);\n    return provider;\n  }\n\n  private static async extractTransactionOutput(\n    tx: ethers.TransactionResponse,\n    receipt: ethers.TransactionReceipt,\n    provider: ethers.JsonRpcProvider,\n    caip2Id: string,\n    explorerDeserializationSchema: Buffer | number[],\n    fromAddress: string\n  ): Promise<TransactionOutput> {\n    const serializationFormat = getSerializationFormat(caip2Id);\n    const isContractCall = tx.data && tx.data !== '0x' && tx.data.length > 2;\n\n    if (isContractCall && serializationFormat === SerializationFormat.ABI) {\n      try {\n        console.log('  📞 Getting function return value...');\n\n        const callResult = await provider.call({\n          to: tx.to,\n          data: tx.data,\n          from: fromAddress,\n          blockTag: receipt.blockNumber - 1,\n        });\n\n        const schemaStr =\n          typeof explorerDeserializationSchema === 'string'\n            ? explorerDeserializationSchema\n            : new TextDecoder().decode(\n                new Uint8Array(explorerDeserializationSchema)\n              );\n\n        const schema = JSON.parse(schemaStr) as AbiSchemaField[];\n        const decoded = ethers.AbiCoder.defaultAbiCoder().decode(\n          schema.map((s) => s.type),\n          callResult\n        );\n\n        const decodedOutput: TransactionOutputData = {};\n        schema.forEach((field, index) => {\n          decodedOutput[field.name] = decoded[index];\n        });\n\n        return { success: true, output: decodedOutput };\n      } catch (e) {\n        console.error('Error extracting output:', e);\n        return { success: true, output: { success: true } };\n      }\n    } else {\n      return {\n        success: true,\n        output: {\n          success: true,\n          isFunctionCall: false,\n        },\n      };\n    }\n  }\n}\n","import {\n  IBitcoinAdapter,\n  BitcoinTransactionInfo,\n  UTXO,\n} from './IBitcoinAdapter';\nimport type { BitcoinNetwork } from '../types/index.js';\n\ninterface MempoolTransaction {\n  txid: string;\n  status: {\n    confirmed: boolean;\n    block_height?: number;\n    block_hash?: string;\n  };\n}\n\n/**\n * Mempool.space API adapter for Bitcoin testnet\n *\n * Public API (no auth required, ~1 req/sec rate limit)\n * Does NOT support regtest - use BitcoinCoreRpcAdapter instead\n */\nexport class MempoolSpaceAdapter implements IBitcoinAdapter {\n  private baseUrl: string;\n\n  private constructor(baseUrl: string) {\n    this.baseUrl = baseUrl;\n  }\n\n  static create(network: BitcoinNetwork): MempoolSpaceAdapter {\n    if (network !== 'testnet') {\n      throw new Error(\n        `Unsupported mempool.space network '${network}'. Only testnet requests use this adapter.`\n      );\n    }\n\n    return new MempoolSpaceAdapter('https://mempool.space/testnet4/api');\n  }\n\n  async isAvailable(): Promise<boolean> {\n    try {\n      const response = await fetch(`${this.baseUrl}/blocks/tip/height`, {\n        signal: AbortSignal.timeout(5000),\n      });\n      return response.ok;\n    } catch {\n      return false;\n    }\n  }\n\n  async getTransaction(txid: string): Promise<BitcoinTransactionInfo> {\n    const response = await fetch(`${this.baseUrl}/tx/${txid}`);\n\n    if (!response.ok) {\n      throw new Error(`Transaction ${txid} not found`);\n    }\n\n    const tx = (await response.json()) as MempoolTransaction;\n    const currentHeight = await this.getCurrentBlockHeight();\n\n    const confirmations =\n      tx.status.confirmed && tx.status.block_height\n        ? currentHeight - tx.status.block_height + 1\n        : 0;\n\n    return {\n      txid: tx.txid,\n      confirmed: tx.status.confirmed,\n      blockHeight: tx.status.block_height,\n      blockHash: tx.status.block_hash,\n      confirmations,\n    };\n  }\n\n  async getCurrentBlockHeight(): Promise<number> {\n    const response = await fetch(`${this.baseUrl}/blocks/tip/height`);\n    const height = parseInt(await response.text());\n    return height;\n  }\n\n  async getAddressUtxos(address: string): Promise<UTXO[]> {\n    const response = await fetch(`${this.baseUrl}/address/${address}/utxo`);\n\n    if (!response.ok) {\n      throw new Error(\n        `Failed to fetch UTXOs for ${address}: ${response.statusText}`\n      );\n    }\n\n    return (await response.json()) as UTXO[];\n  }\n\n  async getTransactionHex(txid: string): Promise<string> {\n    const response = await fetch(`${this.baseUrl}/tx/${txid}/hex`);\n\n    if (!response.ok) {\n      throw new Error(\n        `Failed to fetch transaction hex: ${response.statusText}`\n      );\n    }\n\n    return await response.text();\n  }\n\n  async broadcastTransaction(txHex: string): Promise<string> {\n    const response = await fetch(`${this.baseUrl}/tx`, {\n      method: 'POST',\n      body: txHex,\n    });\n\n    if (!response.ok) {\n      const error = await response.text();\n      throw new Error(`Failed to broadcast transaction: ${error}`);\n    }\n\n    return await response.text();\n  }\n\n  /** Get API base URL for custom endpoints (/v1/fees/recommended, /mempool, etc) */\n  getBaseUrl(): string {\n    return this.baseUrl;\n  }\n\n  async isPrevoutSpent(txid: string, vout: number): Promise<boolean> {\n    const response = await fetch(`${this.baseUrl}/tx/${txid}/outspends`);\n\n    if (!response.ok) {\n      if (response.status === 404) {\n        // If the parent tx is unknown, treat as not spent yet\n        return false;\n      }\n      throw new Error(\n        `Failed to fetch outspends for ${txid}: ${response.statusText}`\n      );\n    }\n\n    const outspends = (await response.json()) as Array<\n      | {\n          spent: boolean;\n          txid: string;\n          vin: number;\n        }\n      | null\n    >;\n\n    const info = outspends[vout];\n    return info !== null && info !== undefined && info.spent === true;\n  }\n}\n","import {\n  IBitcoinAdapter,\n  BitcoinTransactionInfo,\n  UTXO,\n} from './IBitcoinAdapter';\nimport Client from 'bitcoin-core';\n\n/**\n * Bitcoin Core RPC adapter for regtest (localhost:18443)\n *\n * Uses getrawtransaction (not gettransaction) to query any tx, not just wallet txs.\n * Converts BTC amounts to/from satoshis automatically.\n *\n * Setup: https://github.com/Pessina/bitcoin-regtest\n */\nexport class BitcoinCoreRpcAdapter implements IBitcoinAdapter {\n  private client: Client;\n\n  constructor(client: Client) {\n    this.client = client;\n  }\n\n  async isAvailable(): Promise<boolean> {\n    try {\n      await this.client.command('getblockchaininfo');\n      return true;\n    } catch (error) {\n      return false;\n    }\n  }\n\n  async getTransaction(txid: string): Promise<BitcoinTransactionInfo> {\n    try {\n      // Use getrawtransaction with verbose=true to get ANY transaction\n      // (not just wallet transactions like gettransaction does)\n      const tx = await this.client.command('getrawtransaction', txid, true);\n\n      return {\n        txid: tx.txid,\n        confirmed: tx.confirmations > 0,\n        blockHeight: tx.blockheight,\n        blockHash: tx.blockhash,\n        confirmations: tx.confirmations || 0,\n      };\n    } catch (error) {\n      if (\n        error instanceof Error &&\n        (error.message.includes('No such mempool or blockchain transaction') ||\n          error.message.includes('Invalid or non-wallet transaction'))\n      ) {\n        throw new Error(`Transaction ${txid} not found`);\n      }\n      throw error;\n    }\n  }\n\n  async getCurrentBlockHeight(): Promise<number> {\n    return await this.client.command('getblockcount');\n  }\n\n  async getAddressUtxos(address: string): Promise<UTXO[]> {\n    const result = await this.client.command('scantxoutset', 'start', [\n      `addr(${address})`,\n    ]);\n\n    return result.unspents.map((utxo: any) => ({\n      txid: utxo.txid,\n      vout: utxo.vout,\n      value: Math.round(utxo.amount * 100000000),\n      status: {\n        confirmed: true,\n      },\n    }));\n  }\n\n  async getTransactionHex(txid: string): Promise<string> {\n    return await this.client.command('getrawtransaction', txid, false);\n  }\n\n  async broadcastTransaction(txHex: string): Promise<string> {\n    const hash = await this.client.command('sendrawtransaction', txHex);\n    await this.mineBlocks(1);\n    return hash;\n  }\n\n  async mineBlocks(count: number, address?: string): Promise<string[]> {\n    const minerAddress =\n      address || (await this.client.command('getnewaddress'));\n\n    return await this.client.command('generatetoaddress', count, minerAddress);\n  }\n\n  async fundAddress(address: string, amount: number): Promise<string> {\n    const txid = await this.client.command('sendtoaddress', address, amount);\n    await this.mineBlocks(1);\n    return txid;\n  }\n\n  /** Get underlying RPC client for advanced operations (getblockchaininfo, etc) */\n  getClient(): Client {\n    return this.client;\n  }\n\n  static createRegtestAdapter(): BitcoinCoreRpcAdapter {\n    const client = new Client({\n      host: 'http://localhost:18443',\n      username: 'test',\n      password: 'test123',\n    });\n\n    return new BitcoinCoreRpcAdapter(client);\n  }\n\n  async isPrevoutSpent(txid: string, vout: number): Promise<boolean> {\n    const utxo = await this.client.command('gettxout', txid, vout, true);\n    return utxo === null;\n  }\n}\n","import { IBitcoinAdapter } from './IBitcoinAdapter';\nimport { MempoolSpaceAdapter } from './MempoolSpaceAdapter';\nimport { BitcoinCoreRpcAdapter } from './BitcoinCoreRpcAdapter';\nimport type { BitcoinNetwork } from '../types/index.js';\n\n/**\n * Auto-selects Bitcoin backend based on network:\n * - regtest → Bitcoin Core RPC (localhost:18443)\n * - testnet → mempool.space API\n */\nexport class BitcoinAdapterFactory {\n  /**\n   * Create a Bitcoin adapter for the configured network.\n   *\n   * - `regtest`: returns a Bitcoin Core RPC adapter, fails fast if RPC is down.\n   * - `testnet`: returns a mempool.space adapter and warns if the API is unreachable.\n   *\n   * @param network Bitcoin network identifier (`regtest` | `testnet`).\n   * @returns Adapter implementing `IBitcoinAdapter`.\n   */\n  static async create(\n    network: BitcoinNetwork\n  ): Promise<IBitcoinAdapter> {\n    if (network === 'regtest') {\n      const adapter = BitcoinCoreRpcAdapter.createRegtestAdapter();\n\n      const available = await adapter.isAvailable();\n      if (!available) {\n        throw new Error(\n          `❌ Bitcoin regtest is not running!\\n\\n` +\n            `To start bitcoin-regtest with Docker:\\n` +\n            `  1. Clone: git clone https://github.com/Pessina/bitcoin-regtest.git\\n` +\n            `  2. Run: yarn docker:dev\\n` +\n            `  3. Wait for Bitcoin Core to start\\n` +\n            `  4. Restart this server\\n\\n` +\n            `Expected: bitcoind running on localhost:18443\\n` +\n            `Web UI: http://localhost:5173\\n` +\n            `See: https://github.com/Pessina/bitcoin-regtest`\n        );\n      }\n\n      console.log(`✅ Using Bitcoin Core RPC adapter (${network})`);\n      return adapter;\n    }\n\n    if (network !== 'testnet') {\n      throw new Error(`Unsupported Bitcoin network '${network}'. Only regtest and testnet are available.`);\n    }\n\n    const adapter = MempoolSpaceAdapter.create(network);\n\n    const available = await adapter.isAvailable();\n    if (!available) {\n      console.warn(\n        `⚠️  Warning: mempool.space API at ${adapter.getBaseUrl()} is not responding`\n      );\n    }\n\n    console.log(`✅ Using mempool.space adapter (testnet)`);\n    return adapter;\n  }\n}\n","import type {\n  TransactionStatus,\n  TransactionOutputData,\n  ServerConfig,\n  PrevoutRef,\n} from '../../types';\nimport { IBitcoinAdapter } from '../../adapters/IBitcoinAdapter';\nimport { BitcoinAdapterFactory } from '../../adapters/BitcoinAdapterFactory';\n\n/**\n * Bitcoin transaction monitor using adapter pattern\n *\n * Supports:\n * - mempool.space API (testnet)\n * - Bitcoin Core RPC (regtest)\n *\n * Automatically selects adapter based on network:\n * - regtest → Bitcoin Core RPC adapter (localhost:18443)\n * - testnet → mempool.space API (testnet4)\n *\n * Features:\n * - Structured output object `{ success: true, isFunctionCall: false }`\n *\n * Note: Transactions are broadcast by the client, not the server.\n */\nexport class BitcoinMonitor {\n  private static adapterCache = new Map<string, IBitcoinAdapter>();\n\n  /**\n   * Poll a Bitcoin transaction until it confirms or a conflict is detected.\n   *\n   * - Selects the correct adapter (regtest via RPC, testnet via mempool.space).\n   * - Returns `pending` while waiting for confirmations.\n   * - Returns `success` once the minimum confirmation threshold is met.\n   * - Returns `error` if any prevout is spent elsewhere (double-spend).\n   *\n   * @param txid Explorer-facing txid (big-endian).\n   * @param prevouts Optional prevouts consumed by this tx, for conflict checks.\n   * @param config Server config (chooses network and adapter).\n   */\n  static async waitForTransactionAndGetOutput(\n    txid: string,\n    prevouts: PrevoutRef[] | undefined,\n    config: ServerConfig\n  ): Promise<TransactionStatus> {\n    const adapter = await this.getAdapter(config);\n    const requiredConfs = 1;\n\n    try {\n      const tx = await adapter.getTransaction(txid);\n\n      if (tx.confirmations < requiredConfs) {\n        const conflicted = await this.getConflictedPrevout(\n          prevouts,\n          adapter\n        );\n        if (conflicted) {\n          console.error(\n            `❌ ${config.bitcoinNetwork} tx ${txid}: input ${conflicted.txid}:${conflicted.vout} was spent elsewhere`\n          );\n          return { status: 'error', reason: 'inputs_spent' };\n        }\n\n        const hint = `${tx.confirmations}/${requiredConfs} confirmations`;\n\n        console.log(\n          `⏳ ${config.bitcoinNetwork} tx ${txid}: ${hint}`\n        );\n        return { status: 'pending' };\n      }\n\n      console.log(\n        `✅ ${config.bitcoinNetwork} tx ${txid}: ${tx.confirmations} confirmation(s)`\n      );\n\n      const output: TransactionOutputData = {\n        success: true,\n        isFunctionCall: false,\n      };\n\n      return {\n        status: 'success',\n        success: true,\n        output,\n      };\n    } catch (error) {\n      if (error instanceof Error && error.message.includes('not found')) {\n        const conflicted = await this.getConflictedPrevout(\n          prevouts,\n          adapter\n        );\n        if (conflicted) {\n          console.error(\n            `❌ ${config.bitcoinNetwork} tx ${txid}: input ${conflicted.txid}:${conflicted.vout} was spent elsewhere`\n          );\n          return { status: 'error', reason: 'inputs_spent' };\n        }\n\n        console.log(`⏳ ${config.bitcoinNetwork} tx ${txid}: not found`);\n        return { status: 'pending' };\n      }\n\n      console.error(\n        `❌ Error while monitoring ${txid}: ${\n          error instanceof Error ? error.message : String(error)\n        }`\n      );\n      return { status: 'pending' };\n    }\n  }\n\n  private static async getAdapter(\n    config: ServerConfig\n  ): Promise<IBitcoinAdapter> {\n    const network = config.bitcoinNetwork;\n\n    if (this.adapterCache.has(network)) {\n      return this.adapterCache.get(network)!;\n    }\n\n    const adapter = await BitcoinAdapterFactory.create(network);\n\n    this.adapterCache.set(network, adapter);\n    return adapter;\n  }\n\n  /**\n   * Check if any prevout has been spent in another transaction.\n   *\n   * @param prevouts List of txid/vout pairs from the original PSBT inputs.\n   * @param adapter Active Bitcoin adapter (RPC or mempool.space).\n   * @returns First conflicting prevout, or null if none are spent.\n   */\n  private static async getConflictedPrevout(\n    prevouts: PrevoutRef[] | undefined,\n    adapter: IBitcoinAdapter\n  ): Promise<PrevoutRef | null> {\n    if (!prevouts || prevouts.length === 0) {\n      return null;\n    }\n\n    for (const prev of prevouts) {\n      try {\n        const spent = await adapter.isPrevoutSpent(prev.txid, prev.vout);\n        if (spent) {\n          return prev;\n        }\n      } catch (error) {\n        console.error(\n          `❌ Error checking prevout ${prev.txid}:${prev.vout}: ${\n            error instanceof Error ? error.message : String(error)\n          }`\n        );\n      }\n    }\n\n    return null;\n  }\n}\n","import * as borsh from 'borsh';\nimport type { Schema } from 'borsh';\nimport { ethers } from 'ethers';\nimport {\n  TransactionOutputData,\n  BorshSchema,\n  AbiSchemaField,\n  SerializableValue,\n} from '../types';\n\nexport class OutputSerializer {\n  static async serialize(\n    output: TransactionOutputData,\n    format: number,\n    schema: Buffer | number[]\n  ): Promise<Uint8Array> {\n    if (format === 0) {\n      return this.serializeBorsh(output, schema);\n    } else if (format === 1) {\n      return this.serializeAbi(output, schema);\n    }\n\n    throw new Error(`Unsupported serialization format: ${format}`);\n  }\n\n  private static async serializeBorsh(\n    output: TransactionOutputData,\n    schema: Buffer | number[]\n  ): Promise<Uint8Array> {\n    const schemaStr = this.getSchemaString(schema);\n    const parsedSchema = JSON.parse(schemaStr);\n\n    // Handle scalar bool schema (schema is literally \"bool\")\n    if (typeof parsedSchema === 'string' && parsedSchema === 'bool') {\n      const boolValue =\n        typeof output === 'boolean'\n          ? output\n          : 'error' in (output as Record<string, unknown>)\n            ? Boolean((output as any).error)\n            : 'success' in (output as Record<string, unknown>)\n              ? Boolean((output as any).success)\n              : true;\n\n      try {\n        return borsh.serialize('bool' as unknown as Schema, boolValue);\n      } catch (error) {\n        console.error(\n          '[OutputSerializer] Borsh serialization failed (scalar bool)',\n          { schema: parsedSchema, payload: boolValue },\n          error\n        );\n        throw error;\n      }\n    }\n\n    const borshSchema = parsedSchema as BorshSchema;\n\n    let dataToSerialize: SerializableValue = output;\n    if (output.isFunctionCall === false) {\n      dataToSerialize = this.createBorshData(borshSchema, output);\n    }\n\n    // Handle single-field objects with empty key\n    if (typeof dataToSerialize === 'object' && dataToSerialize !== null) {\n      const keys = Object.keys(dataToSerialize as TransactionOutputData);\n      if (keys.length === 1 && keys[0] === '') {\n        dataToSerialize = (dataToSerialize as TransactionOutputData)[''];\n      }\n    }\n\n    // Wrap common boolean error struct when payload is an object with `error`\n    if (\n      borshSchema.struct &&\n      Object.keys(borshSchema.struct).length === 1 &&\n      borshSchema.struct.error === 'bool' &&\n      typeof dataToSerialize === 'object' &&\n      dataToSerialize !== null &&\n      'error' in (dataToSerialize as Record<string, unknown>)\n    ) {\n      dataToSerialize = { error: Boolean((dataToSerialize as any).error) };\n    }\n\n    try {\n      return borsh.serialize(borshSchema as Schema, dataToSerialize);\n    } catch (error) {\n      // Emit schema/payload for debugging serialization issues\n      console.error(\n        '[OutputSerializer] Borsh serialization failed',\n        {\n          schema: borshSchema,\n          payload: dataToSerialize,\n        },\n        error\n      );\n      throw error;\n    }\n  }\n\n  private static async serializeAbi(\n    output: TransactionOutputData,\n    schema: Buffer | number[]\n  ): Promise<Uint8Array> {\n    const schemaStr = this.getSchemaString(schema);\n    const parsedSchema = JSON.parse(schemaStr) as AbiSchemaField[];\n\n    let dataToEncode: TransactionOutputData = output;\n    if (output.isFunctionCall === false) {\n      dataToEncode = this.createAbiData(parsedSchema);\n    }\n\n    const values = parsedSchema.map((field) => {\n      if (dataToEncode[field.name] === undefined) {\n        throw new Error(`Missing required field '${field.name}' in output`);\n      }\n      return dataToEncode[field.name];\n    });\n\n    const encoded = ethers.AbiCoder.defaultAbiCoder().encode(\n      parsedSchema.map((s) => s.type),\n      values\n    );\n\n    return ethers.getBytes(encoded);\n  }\n\n  private static getSchemaString(schema: Buffer | number[]): string {\n    return typeof schema === 'string'\n      ? schema\n      : new TextDecoder().decode(new Uint8Array(schema));\n  }\n\n  private static createBorshData(\n    borshSchema: BorshSchema,\n    fallback?: TransactionOutputData\n  ): TransactionOutputData {\n    const struct = borshSchema.struct;\n    if (!struct) {\n      return { success: true };\n    }\n\n    const obj: TransactionOutputData = {};\n    for (const [key, type] of Object.entries(struct)) {\n      if (fallback && key in fallback) {\n        obj[key] = fallback[key];\n        continue;\n      }\n\n      switch (type) {\n        case 'bool':\n          obj[key] = true;\n          break;\n        case 'string':\n          obj[key] = 'non_function_call_success';\n          break;\n        case 'u8':\n        case 'u16':\n        case 'u32':\n        case 'u64':\n        case 'u128':\n        case 'i8':\n        case 'i16':\n        case 'i32':\n        case 'i64':\n        case 'i128':\n          obj[key] = 0;\n          break;\n        default:\n          // Default seed with null for unrecognized types; caller should override.\n          obj[key] = null;\n      }\n    }\n    return obj;\n  }\n\n  private static createAbiData(\n    schema: AbiSchemaField[]\n  ): TransactionOutputData {\n    const data: TransactionOutputData = {};\n    schema.forEach((field) => {\n      if (field.type === 'string') {\n        data[field.name] = 'non_function_call_success';\n      } else if (field.type === 'bool') {\n        data[field.name] = true;\n      } else {\n        throw new Error(\n          `Cannot serialize non-function call success as type ${field.type}`\n        );\n      }\n    });\n    return data;\n  }\n}\n","import * as anchor from '@coral-xyz/anchor';\nimport { Connection } from '@solana/web3.js';\nimport bs58 from 'bs58';\nimport { CpiEventData } from '../types';\n\n// EMIT_CPI_INSTRUCTION_DISCRIMINATOR - identifies that this is an emit_cpi! instruction\n// This is a constant from Anchor that identifies the instruction type\n// Value: e445a52e51cb9a1d\nexport const EMIT_CPI_INSTRUCTION_DISCRIMINATOR = Buffer.from([\n  0xe4, 0x45, 0xa5, 0x2e, 0x51, 0xcb, 0x9a, 0x1d,\n]);\n\nexport interface ParsedCpiEvent {\n  name: string;\n  data: CpiEventData;\n}\n\nexport class CpiEventParser {\n  /**\n   * Parse CPI events from a transaction\n   * @param connection Solana connection\n   * @param signature Transaction signature\n   * @param targetProgramId Program ID to filter events for\n   * @param program Anchor program instance\n   * @returns Array of parsed events\n   */\n  static async parseCpiEvents(\n    connection: Connection,\n    signature: string,\n    targetProgramId: string,\n    program: anchor.Program\n  ): Promise<ParsedCpiEvent[]> {\n    const events: ParsedCpiEvent[] = [];\n\n    try {\n      // Get the transaction with JsonParsed encoding to access inner instructions\n      // CPI events appear as inner instructions when emit_cpi! is used\n      const tx = await connection.getParsedTransaction(signature, {\n        commitment: 'confirmed',\n        maxSupportedTransactionVersion: 0,\n      });\n\n      if (!tx || !tx.meta) return events;\n\n      const innerInstructions = tx.meta.innerInstructions || [];\n\n      for (const innerIxSet of innerInstructions) {\n        for (const instruction of innerIxSet.instructions) {\n          if (\n            'programId' in instruction &&\n            'data' in instruction &&\n            instruction.programId.toString() === targetProgramId\n          ) {\n            const parsedEvent = CpiEventParser.parseInstruction(\n              instruction.data,\n              program\n            );\n            if (parsedEvent) {\n              events.push(parsedEvent);\n            }\n          }\n        }\n      }\n    } catch (error) {\n      console.error('Error parsing transaction for CPI events:', error);\n    }\n\n    return events;\n  }\n\n  /**\n   * Parse a single instruction for CPI event data\n   * @param instructionData Base58 encoded instruction data\n   * @param program Anchor program instance\n   * @returns Parsed event or null if not a CPI event\n   */\n  private static parseInstruction(\n    instructionData: string,\n    program: anchor.Program\n  ): ParsedCpiEvent | null {\n    try {\n      const ixData = bs58.decode(instructionData);\n\n      // Check if this is an emit_cpi! instruction\n      // The instruction data format is:\n      // [0-8]:   emit_cpi! instruction discriminator\n      // [8-16]:  event discriminator (identifies which event type)\n      // [16+]:   event data (the actual event fields)\n      if (\n        ixData.length >= 16 &&\n        Buffer.compare(\n          ixData.subarray(0, 8),\n          EMIT_CPI_INSTRUCTION_DISCRIMINATOR\n        ) === 0\n      ) {\n        // Extract the event discriminator (bytes 8-16)\n        const eventDiscriminator = ixData.subarray(8, 16);\n\n        // Extract the event data (after byte 16)\n        const eventData = ixData.subarray(16);\n\n        // Match the event discriminator against our IDL to identify the event type\n        let matchedEvent = null;\n        for (const event of program.idl.events || []) {\n          // Convert the discriminator array from IDL to Buffer for comparison\n          const idlDiscriminator = Buffer.from(event.discriminator);\n\n          if (Buffer.compare(eventDiscriminator, idlDiscriminator) === 0) {\n            matchedEvent = event;\n            break;\n          }\n        }\n\n        if (matchedEvent) {\n          try {\n            // Reconstruct the full event buffer for Anchor's BorshEventCoder\n            // The coder expects: [event discriminator (8 bytes) + event data]\n            const fullEventData = Buffer.concat([\n              eventDiscriminator,\n              eventData,\n            ]);\n\n            // Decode using Anchor's BorshEventCoder\n            const eventCoder = new anchor.BorshEventCoder(program.idl);\n            const decodedEvent = eventCoder.decode(\n              fullEventData.toString('base64')\n            );\n\n            if (decodedEvent) {\n              return decodedEvent;\n            }\n          } catch {\n            // Ignore decode errors\n          }\n        }\n      }\n    } catch (e) {\n      // Not our event, continue\n    }\n\n    return null;\n  }\n\n  /**\n   * Subscribe to CPI events for a program\n   * @param connection Solana connection\n   * @param program Anchor program instance\n   * @param eventHandlers Map of event names to handler functions\n   * @returns Subscription ID for cleanup\n   */\n  static subscribeToCpiEvents(\n    connection: Connection,\n    program: anchor.Program,\n    eventHandlers: Map<\n      string,\n      (event: CpiEventData, slot: number) => Promise<void>\n    >\n  ): number {\n    return connection.onLogs(\n      program.programId,\n      async (logs, context) => {\n        // Skip failed transactions - CPI events require valid transactions\n        if (logs.err) {\n          return;\n        }\n\n        // Parse CPI events from inner instructions\n        const events = await CpiEventParser.parseCpiEvents(\n          connection,\n          logs.signature,\n          program.programId.toString(),\n          program\n        );\n\n        // Process each event with its corresponding handler\n        for (const event of events) {\n          const handler = eventHandlers.get(event.name);\n          if (handler) {\n            // Use the slot from context\n            await handler(event.data, context.slot);\n          }\n        }\n      },\n      'confirmed'\n    );\n  }\n}\n","import * as bitcoin from 'bitcoinjs-lib';\nimport type { ServerConfig } from '../../types';\n\nexport interface BitcoinInputSigningPlan {\n  inputIndex: number;\n  sighash: Uint8Array;\n  prevTxid: string;\n  vout: number;\n}\n\nexport interface BitcoinSigningPlan {\n  /**\n   * Explorer-facing txid (Transaction.getId). Always the hex string you would\n   * paste into a block explorer; never the little-endian buffer that\n   * bitcoinjs-lib exposes internally.\n   */\n  explorerTxid: string;\n  inputs: BitcoinInputSigningPlan[];\n}\n\n/**\n * Pre-compute signing material for each PSBT input.\n *\n * The MPC signer derives the per-input BIP-143 digest once, responds one\n * signature per request ID, and never needs to mutate the PSBT afterwards.\n */\nexport class BitcoinTransactionProcessor {\n  /**\n   * Parse a PSBT and pre-compute BIP-143 sighashes for each SegWit input.\n   *\n   * - Validates the network (testnet/regtest) from server config.\n   * - Enforces SegWit v0 P2WPKH inputs with `witnessUtxo` metadata.\n   * - Builds an explorer-facing txid (big-endian) plus per-input sighash data.\n   *\n   * @param psbtBytes Raw PSBT bytes from the Solana event.\n   * @param config Server config, specifically `bitcoinNetwork` for network selection.\n   * @returns Explorer txid and per-input signing material (sighash, prevout ref, index).\n   */\n  static createSigningPlan(\n    psbtBytes: Uint8Array,\n    config: ServerConfig\n  ): BitcoinSigningPlan {\n    const network = this.getNetwork(config);\n    const psbt = bitcoin.Psbt.fromBuffer(Buffer.from(psbtBytes), { network });\n    /**\n     * In bitcoinjs-lib v6 the unsigned transaction inside a PSBT is a\n     * `PsbtTransaction` (no hash helpers). Convert it to a full\n     * `bitcoin.Transaction` via its `toBuffer()` method so we can call\n     * `hashForWitnessV0` idiomatically without peeking at private caches.\n     */\n    const unsignedTxBuffer = psbt.data.globalMap.unsignedTx.toBuffer();\n    const unsignedTx = bitcoin.Transaction.fromBuffer(unsignedTxBuffer);\n\n    const inputs: BitcoinInputSigningPlan[] = [];\n\n    for (let i = 0; i < psbt.data.inputs.length; i++) {\n      const inputData = psbt.data.inputs[i];\n      const witnessUtxo = inputData.witnessUtxo;\n\n      if (!witnessUtxo) {\n        throw new Error(\n          `Input ${i} missing witnessUtxo (required for SegWit signing)`\n        );\n      }\n\n      // Only SegWit v0 P2WPKH is supported; derive the legacy P2PKH\n      // scriptCode required by BIP-143.\n      const script = witnessUtxo.script;\n      const isP2wpkhV0 =\n        script.length === 22 && script[0] === 0x00 && script[1] === 0x14;\n\n      if (!isP2wpkhV0) {\n        const scriptHex = Buffer.from(script).toString('hex');\n        throw new Error(\n          `Input ${i} must be SegWit v0 P2WPKH (got script ${scriptHex})`\n        );\n      }\n\n      const scriptCode = bitcoin.payments.p2pkh({\n        hash: script.slice(2),\n        network,\n      }).output!;\n\n      const sighashType =\n        inputData.sighashType ?? bitcoin.Transaction.SIGHASH_ALL;\n\n      const sighash = unsignedTx.hashForWitnessV0(\n        i,\n        scriptCode,\n        witnessUtxo.value,\n        sighashType\n      );\n\n      const prevTxid = Buffer.from(psbt.txInputs[i].hash)\n        .reverse()\n        .toString('hex');\n\n      const vout = psbt.txInputs[i].index;\n\n      inputs.push({\n        inputIndex: i,\n        sighash: new Uint8Array(sighash),\n        prevTxid,\n        vout,\n      });\n    }\n\n    return {\n      explorerTxid: unsignedTx.getId(),\n      inputs,\n    };\n  }\n\n  private static getNetwork(config: ServerConfig): bitcoin.Network {\n    switch (config.bitcoinNetwork) {\n      case 'testnet':\n        return bitcoin.networks.testnet;\n      case 'regtest':\n        return bitcoin.networks.regtest;\n      default:\n        throw new Error(\n          `Unsupported Bitcoin network '${config.bitcoinNetwork}'. Only regtest and testnet are available.`\n        );\n    }\n  }\n}\n","import { RequestIdGenerator } from '../RequestIdGenerator';\nimport { CryptoUtils } from '../CryptoUtils';\nimport {\n  BitcoinTransactionProcessor,\n  type BitcoinSigningPlan,\n} from './BitcoinTransactionProcessor';\nimport type { SignBidirectionalEvent } from '../../types';\nimport type { BidirectionalHandlerContext } from '../shared/BidirectionalContext';\n\n/**\n * Handle a Bitcoin bidirectional signing request emitted from Solana.\n * - Parses the PSBT, derives per-input signing plan, and triggers signing.\n * - Uses the MPC-derived private key for all inputs (one key per request).\n * - Registers the transaction for later monitoring/response.\n */\nexport async function handleBitcoinBidirectional(\n  event: SignBidirectionalEvent,\n  context: BidirectionalHandlerContext,\n  derivedPrivateKey: string\n): Promise<void> {\n  const { config } = context;\n\n  console.log(`🔍 Bitcoin transaction detected on ${config.bitcoinNetwork}`);\n  console.log(\n    `📦 PSBT received (${event.serializedTransaction.length} bytes, ${event.caip2Id})`\n  );\n\n  const bitcoinPlan = BitcoinTransactionProcessor.createSigningPlan(\n    new Uint8Array(event.serializedTransaction),\n    config\n  );\n\n  console.log(\n    `✅ PSBT parsed successfully → tx ${bitcoinPlan.explorerTxid} (${bitcoinPlan.inputs.length} input(s))`\n  );\n\n  await handleBitcoinSigningPlan(\n    event,\n    bitcoinPlan,\n    derivedPrivateKey,\n    context\n  );\n}\n\n/**\n * Processes a PSBT into per-input signing jobs and registers the pending tx.\n *\n * Flow mirrors the \"Bitcoin Per-Input Signing\" doc:\n *  - Uses {@link BitcoinTransactionProcessor} to parse the PSBT once, yielding\n *    the explorer-facing txid plus per-input witness metadata and BIP-143\n *    sighashes.\n *  - Immediately records the txid in `pendingTransactions` with the schemas\n *    and prevouts so {@link BitcoinMonitor} can watch for confirmations or\n *    spent inputs (isPrevoutSpent via the adapters).\n *  - For each PSBT input, derives a deterministic request ID by hashing the\n *    explorer-facing txid bytes concatenated with the input index (u32 LE) and\n *    signs the corresponding sighash with the single MPC-derived private key.\n *  - Streams every signature back to the Solana program individually via\n *    `respond`, logging `{ txid, inputIndex, requestId }` for traceability.\n *  - The external client finalizes/broadcasts the PSBT; the server only signs\n *    and monitors until {@link handleCompletedTransaction} /\n *    {@link handleFailedTransaction} respond bidirectionally.\n *\n * @param event Solana-emitted bidirectional event containing PSBT bytes and metadata.\n * @param plan Parsed Bitcoin signing plan (txid + per-input sighashes).\n * @param derivedPrivateKey Single-use MPC-derived private key for this request.\n * @param context Shared server context (Anchor program, wallet, config, pending map).\n */\nasync function handleBitcoinSigningPlan(\n  event: SignBidirectionalEvent,\n  plan: BitcoinSigningPlan,\n  derivedPrivateKey: string,\n  context: BidirectionalHandlerContext\n) {\n  if (plan.inputs.length === 0) {\n    throw new Error('Bitcoin PSBT must contain at least one input');\n  }\n\n  const { program, wallet, config, pendingTransactions } = context;\n\n  // Use the explorer-facing txid (big-endian) for all aggregated request IDs;\n  // never flip the byte order here.\n  const txidBytes = Buffer.from(plan.explorerTxid, 'hex');\n  const prevouts = plan.inputs.map(({ prevTxid, vout }) => ({\n    txid: prevTxid,\n    vout,\n  }));\n\n  const aggregateRequestId =\n    RequestIdGenerator.generateSignBidirectionalRequestId(\n      event.sender.toString(),\n      Array.from(txidBytes),\n      event.caip2Id,\n      event.keyVersion,\n      event.path,\n      event.algo,\n      event.dest,\n      event.params\n    );\n\n  pendingTransactions.set(plan.explorerTxid, {\n    txHash: plan.explorerTxid,\n    requestId: aggregateRequestId,\n    caip2Id: event.caip2Id,\n    explorerDeserializationSchema: event.outputDeserializationSchema,\n    callbackSerializationSchema: event.respondSerializationSchema,\n    fromAddress: 'bitcoin',\n    nonce: 0,\n    checkCount: 0,\n    namespace: 'bip122',\n    prevouts,\n  });\n\n  // Simulate MPC nodes returning signatures out of order so clients rely on\n  // requestId when matching signatures. Shuffle deterministically per run using\n  // Math.random for simplicity.\n  const signingQueue = [...plan.inputs];\n  for (let i = signingQueue.length - 1; i > 0; i--) {\n    const j = Math.floor(Math.random() * (i + 1));\n    [signingQueue[i], signingQueue[j]] = [signingQueue[j], signingQueue[i]];\n  }\n\n  for (const inputPlan of signingQueue) {\n    const inputIndexBytes = Buffer.alloc(4);\n    inputIndexBytes.writeUInt32LE(inputPlan.inputIndex, 0);\n    const txDataForInput = Buffer.concat([txidBytes, inputIndexBytes]);\n\n    const perInputRequestId =\n      RequestIdGenerator.generateSignBidirectionalRequestId(\n        event.sender.toString(),\n        Array.from(txDataForInput),\n        event.caip2Id,\n        event.keyVersion,\n        event.path,\n        event.algo,\n        event.dest,\n        event.params\n      );\n\n    const perInputRequestIdBytes = Array.from(\n      Buffer.from(perInputRequestId.slice(2), 'hex')\n    );\n\n    const signature = await CryptoUtils.signMessage(\n      Array.from(inputPlan.sighash),\n      derivedPrivateKey\n    );\n\n    const tx = await program.methods\n      .respond([perInputRequestIdBytes], [signature])\n      .accounts({\n        responder: wallet.publicKey,\n      })\n      .rpc();\n\n    console.log(\n      `✅ Signed input ${inputPlan.inputIndex} for ${plan.explorerTxid} (tx: ${tx})`\n    );\n  }\n\n  console.log(`🔍 Monitoring ${config.bitcoinNetwork} tx ${plan.explorerTxid}`);\n}\n","import { ethers } from 'ethers';\nimport {\n  ProcessedTransaction,\n  ServerConfig,\n  SignatureResponse,\n} from '../../types';\nimport { getNamespaceFromCaip2 } from '../ChainUtils';\n\nexport class EthereumTransactionProcessor {\n  private static fundingProvider: ethers.JsonRpcProvider | null = null;\n  private static fundingProviderError: boolean = false;\n\n  static async processTransactionForSigning(\n    rlpEncodedTx: Uint8Array,\n    privateKey: string,\n    caip2Id: string,\n    config: ServerConfig\n  ): Promise<ProcessedTransaction> {\n    console.log('\\n🔐 Processing the Transaction for Signing');\n    console.log('  📋 RLP-encoded transaction:', ethers.hexlify(rlpEncodedTx));\n    console.log('  🔗 Chain ID:', caip2Id);\n\n    // Detect transaction type\n    const isEIP1559 = rlpEncodedTx[0] === 0x02;\n    const txType = isEIP1559 ? 0x02 : 0x00;\n    const rlpData = isEIP1559 ? rlpEncodedTx.slice(1) : rlpEncodedTx;\n\n    console.log(`  📝 Transaction type: ${isEIP1559 ? 'EIP-1559' : 'Legacy'}`);\n\n    // Create wallet and sign\n    const wallet = new ethers.Wallet(privateKey);\n    console.log('  👤 Signing address:', wallet.address);\n\n    const unsignedTxHash = ethers.keccak256(rlpEncodedTx);\n    const signature = wallet.signingKey.sign(unsignedTxHash);\n\n    // Decode and prepare signed transaction\n    const decoded = ethers.decodeRlp(rlpData) as string[];\n    const nonce = isEIP1559\n      ? parseInt(decoded[1], 16) // Second field for EIP-1559\n      : parseInt(decoded[0], 16); // First field for legacy\n    console.log(' 📝 Transaction nonce:', nonce);\n    const vValue = isEIP1559 ? signature.v - 27 : signature.v;\n\n    const signedFields = [\n      ...decoded,\n      ethers.toBeHex(vValue, 1),\n      signature.r,\n      signature.s,\n    ];\n\n    const signedRlp = ethers.encodeRlp(signedFields);\n    const signedTransaction = isEIP1559\n      ? ethers.concat([new Uint8Array([txType]), signedRlp])\n      : signedRlp;\n\n    // Get correct transaction hash\n    let signedTxHash: string;\n    try {\n      const parsedTx = ethers.Transaction.from(signedTransaction);\n      signedTxHash = parsedTx.hash!;\n    } catch {\n      signedTxHash = ethers.keccak256(signedTransaction);\n    }\n\n    // Convert signature to Solana format (single signature for EVM transactions)\n    const solanaSignature = this.toSolanaSignature(signature);\n\n    const namespace = getNamespaceFromCaip2(caip2Id);\n    if (namespace === 'eip155') {\n      /// FUNDING DERIVED ADDRESS WITH ETH CODE\n      const tx = ethers.Transaction.from(ethers.hexlify(rlpEncodedTx));\n      const gasNeeded =\n        tx.gasLimit * (tx.maxFeePerGas || tx.gasPrice!) + tx.value;\n\n      // Don't retry if we already know it's broken\n      if (this.fundingProviderError) {\n        console.error(\n          'Funding provider is unavailable, skipping balance check'\n        );\n        return {\n          signedTxHash,\n          signature: [solanaSignature], // EVM has single signature\n          signedTransaction: ethers.hexlify(signedTransaction),\n          fromAddress: wallet.address,\n          nonce,\n        };\n      }\n\n      try {\n        if (!this.fundingProvider) {\n          const url = `https://sepolia.infura.io/v3/${config.infuraApiKey}`;\n          this.fundingProvider = new ethers.JsonRpcProvider(url);\n          await this.fundingProvider.getNetwork();\n        }\n\n        const balance = await this.fundingProvider.getBalance(wallet.address);\n        if (balance < gasNeeded) {\n          const fundingWallet = new ethers.Wallet(\n            config.mpcRootKey,\n            this.fundingProvider\n          );\n          await fundingWallet\n            .sendTransaction({\n              to: wallet.address,\n              value: gasNeeded - balance,\n            })\n            .then((tx) => tx.wait());\n        }\n      } catch (error) {\n        console.error('Funding provider error:', error);\n        this.fundingProviderError = true;\n      }\n    }\n\n    return {\n      signedTxHash,\n      signature: [solanaSignature], // EVM has single signature\n      signedTransaction: ethers.hexlify(signedTransaction),\n      fromAddress: wallet.address,\n      nonce,\n    };\n  }\n\n  private static toSolanaSignature(\n    signature: ethers.Signature\n  ): SignatureResponse {\n    const prefix = signature.yParity === 0 ? '02' : '03';\n    const compressed = prefix + signature.r.slice(2);\n    const point = ethers.SigningKey.computePublicKey('0x' + compressed, false);\n    const pointBytes = ethers.getBytes(point);\n\n    return {\n      bigR: {\n        x: Array.from(Buffer.from(signature.r.slice(2), 'hex')),\n        y: Array.from(pointBytes.slice(33, 65)),\n      },\n      s: Array.from(Buffer.from(signature.s.slice(2), 'hex')),\n      recoveryId: signature.yParity || 0,\n    };\n  }\n}\n","import { RequestIdGenerator } from '../RequestIdGenerator';\nimport { EthereumTransactionProcessor } from './EthereumTransactionProcessor';\nimport type { SignBidirectionalEvent } from '../../types';\nimport type { BidirectionalHandlerContext } from '../shared/BidirectionalContext';\n\nexport async function handleEthereumBidirectional(\n  event: SignBidirectionalEvent,\n  context: BidirectionalHandlerContext,\n  derivedPrivateKey: string\n): Promise<void> {\n  const { config, program, wallet, pendingTransactions } = context;\n\n  const requestId = RequestIdGenerator.generateSignBidirectionalRequestId(\n    event.sender.toString(),\n    Array.from(event.serializedTransaction),\n    event.caip2Id,\n    event.keyVersion,\n    event.path,\n    event.algo,\n    event.dest,\n    event.params\n  );\n\n  console.log(`🔑 Request ID (eip155): ${requestId}`);\n\n  const result =\n    await EthereumTransactionProcessor.processTransactionForSigning(\n      new Uint8Array(event.serializedTransaction),\n      derivedPrivateKey,\n      event.caip2Id,\n      config\n    );\n\n  const requestIdBytes = Array.from(Buffer.from(requestId.slice(2), 'hex'));\n  const requestIds = result.signature.map(() => Array.from(requestIdBytes));\n\n  const tx = await program.methods\n    .respond(requestIds, result.signature)\n    .accounts({\n      responder: wallet.publicKey,\n    })\n    .rpc();\n\n  console.log(`✅ Signatures sent to contract (tx=${tx})`);\n\n  pendingTransactions.set(result.signedTxHash, {\n    txHash: result.signedTxHash,\n    requestId,\n    caip2Id: event.caip2Id,\n    explorerDeserializationSchema: event.outputDeserializationSchema,\n    callbackSerializationSchema: event.respondSerializationSchema,\n    fromAddress: result.fromAddress,\n    nonce: result.nonce,\n    checkCount: 0,\n    namespace: 'eip155',\n  });\n\n  console.log(`🔍 Monitoring transaction ${result.signedTxHash} (eip155)`);\n}\n","import * as anchor from '@coral-xyz/anchor';\nimport { Program } from '@coral-xyz/anchor';\nimport { Connection } from '@solana/web3.js';\nimport BN from 'bn.js';\nimport type {\n  SignBidirectionalEvent,\n  SignatureRequestedEvent,\n  PendingTransaction,\n  TransactionOutput,\n  ServerConfig,\n  CpiEventData,\n} from '../types';\nimport { isSignBidirectionalEvent, isSignatureRequestedEvent } from '../types';\nimport { serverConfigSchema } from '../types';\nimport ChainSignaturesIDL from '../../idl/chain_signatures.json';\nimport { CryptoUtils } from '../modules/CryptoUtils';\nimport { CONFIG } from '../config/Config';\nimport { RequestIdGenerator } from '../modules/RequestIdGenerator';\nimport { EthereumMonitor } from '../modules/ethereum/EthereumMonitor';\nimport { BitcoinMonitor } from '../modules/bitcoin/BitcoinMonitor';\nimport { OutputSerializer } from '../modules/OutputSerializer';\nimport { CpiEventParser } from '../events/CpiEventParser';\nimport * as borsh from 'borsh';\nimport {\n  SerializationFormat,\n  getNamespaceFromCaip2,\n} from '../modules/ChainUtils';\nimport { handleBitcoinBidirectional } from '../modules/bitcoin/BidirectionalHandler';\nimport { handleEthereumBidirectional } from '../modules/ethereum/BidirectionalHandler';\nimport type { BidirectionalHandlerContext } from '../modules/shared/BidirectionalContext';\n\nconst pendingTransactions = new Map<string, PendingTransaction>();\n\nexport class ChainSignatureServer {\n  private connection: Connection;\n  private wallet: anchor.Wallet;\n  private provider: anchor.AnchorProvider;\n  private program: Program;\n  private pollCounter = 0;\n  private cpiSubscriptionId: number | null = null;\n  private config: ServerConfig;\n  private monitorIntervalId: NodeJS.Timeout | null = null;\n  private readyPromise: Promise<void>;\n  private resolveReady: (() => void) | null = null;\n\n  constructor(config: ServerConfig) {\n    try {\n      this.config = serverConfigSchema.parse(config);\n    } catch (error) {\n      if (error instanceof Error && 'issues' in error) {\n        const zodError = error as {\n          issues: Array<{ path: string[]; message: string }>;\n        };\n        console.error('❌ Server configuration validation failed:');\n        zodError.issues.forEach((err) => {\n          console.error(`  - ${err.path.join('.')}: ${err.message}`);\n        });\n      }\n      throw new Error('Invalid server configuration');\n    }\n\n    this.readyPromise = new Promise((resolve) => {\n      this.resolveReady = resolve;\n    });\n\n    const solanaKeypair = anchor.web3.Keypair.fromSecretKey(\n      new Uint8Array(JSON.parse(this.config.solanaPrivateKey))\n    );\n\n    this.connection = new Connection(this.config.solanaRpcUrl, 'confirmed');\n    this.wallet = new anchor.Wallet(solanaKeypair);\n    this.provider = new anchor.AnchorProvider(this.connection, this.wallet, {\n      commitment: 'confirmed',\n    });\n    anchor.setProvider(this.provider);\n\n    const idl = ChainSignaturesIDL as anchor.Idl;\n    idl.address = this.config.programId;\n    this.program = new Program(idl, this.provider);\n  }\n\n  async start() {\n    console.log('🚀 Response Server');\n    console.log(`Wallet: ${this.wallet.publicKey.toString()}`);\n    console.log(`Program: ${this.program.programId.toString()}`);\n\n    await this.ensureInitialized();\n\n    this.startTransactionMonitor();\n    this.setupEventListeners();\n\n    // Resolve readiness so callers can await server.waitUntilReady()\n    this.resolveReady?.();\n  }\n\n  private async ensureInitialized() {\n    const [programStatePda] = anchor.web3.PublicKey.findProgramAddressSync(\n      [Buffer.from('program-state')],\n      this.program.programId\n    );\n\n    try {\n      const accountInfo = await this.connection.getAccountInfo(programStatePda);\n      if (accountInfo) {\n        return;\n      }\n    } catch {}\n\n    const signatureDeposit = this.config.signatureDeposit || '10000000';\n    const chainId = this.config.chainId || 'solana:localnet';\n\n    try {\n      await this.program.methods\n        .initialize(new BN(signatureDeposit), chainId)\n        .accounts({\n          admin: this.wallet.publicKey,\n        })\n        .rpc();\n    } catch (error) {\n      throw new Error(\n        `Failed to initialize program: ${error instanceof Error ? error.message : error}`\n      );\n    }\n  }\n\n  private startTransactionMonitor() {\n    this.monitorIntervalId = setInterval(async () => {\n      this.pollCounter++;\n\n      if (pendingTransactions.size > 0 && this.pollCounter % 12 === 1) {\n        console.log(\n          `📊 Monitoring pending transactions (count=${pendingTransactions.size})`\n        );\n      }\n\n      for (const [txHash, txInfo] of pendingTransactions.entries()) {\n        if (txInfo.checkCount > 0) {\n          let skipFactor = 1;\n\n          if (txInfo.namespace === 'bip122') {\n            if (txInfo.checkCount > 10) skipFactor = 12;\n            else if (txInfo.checkCount > 5) skipFactor = 6;\n            else skipFactor = 2;\n          } else {\n            if (txInfo.checkCount > 20) skipFactor = 12;\n            else if (txInfo.checkCount > 10) skipFactor = 6;\n            else if (txInfo.checkCount > 5) skipFactor = 2;\n          }\n\n          if (this.pollCounter % skipFactor !== 0) {\n            continue;\n          }\n        }\n\n        try {\n          const result =\n            txInfo.namespace === 'bip122'\n              ? await BitcoinMonitor.waitForTransactionAndGetOutput(\n                  txHash,\n                  txInfo.prevouts,\n                  this.config\n                )\n              : await EthereumMonitor.waitForTransactionAndGetOutput(\n                  txHash,\n                  txInfo.caip2Id,\n                  txInfo.explorerDeserializationSchema,\n                  txInfo.fromAddress,\n                  txInfo.nonce,\n                  this.config\n                );\n\n          txInfo.checkCount++;\n\n          switch (result.status) {\n            case 'pending':\n              // Just increment count, continue polling\n              break;\n\n            case 'success':\n              await this.handleCompletedTransaction(txHash, txInfo, {\n                success: result.success!,\n                output: result.output,\n              });\n              pendingTransactions.delete(txHash);\n              break;\n\n            case 'error':\n              // Only for reverted/replaced - send signed error\n              await this.handleFailedTransaction(txHash, txInfo);\n              pendingTransactions.delete(txHash);\n              break;\n\n            case 'fatal_error':\n              // Just remove from map, don't send signed error\n              console.error(\n                `Fatal error for transaction ${txHash}: ${result.reason}`\n              );\n              pendingTransactions.delete(txHash);\n              break;\n          }\n        } catch (error) {\n          if (\n            error instanceof Error &&\n            (error.message.includes('Modulus not supported') ||\n            error.message.includes('Failed to parse SOLANA_PRIVATE_KEY') ||\n            error.message.includes('Failed to load keypair'))\n          ) {\n            console.error(\n              `Infrastructure error for ${txHash}: ${error.message}`\n            );\n            pendingTransactions.delete(txHash);\n          } else {\n            console.error(\n              `Unexpected error polling ${txHash}: ${\n                error instanceof Error ? error.message : String(error)\n              }`\n            );\n            txInfo.checkCount++;\n          }\n        }\n      }\n    }, CONFIG.POLL_INTERVAL_MS);\n  }\n\n  private async handleCompletedTransaction(\n    txHash: string,\n    txInfo: PendingTransaction,\n    result: TransactionOutput\n  ) {\n    console.log(`✅ Transaction completed: ${txHash}`);\n\n    const requestId = txInfo.requestId;\n    if (!requestId) {\n      throw new Error(`Missing request ID for tx ${txHash}`);\n    }\n    const serializedOutput = await OutputSerializer.serialize(\n      result.output,\n      SerializationFormat.Borsh, // Server only respond to Solana for now\n      txInfo.callbackSerializationSchema\n    );\n\n    const requestIdBytes = Buffer.from(requestId.slice(2), 'hex');\n    const signature = await CryptoUtils.signBidirectionalResponse(\n      requestIdBytes,\n      serializedOutput,\n      this.config.mpcRootKey\n    );\n\n    try {\n      await this.program.methods\n        .respondBidirectional(\n          Array.from(requestIdBytes),\n          Buffer.from(serializedOutput),\n          signature\n        )\n        .accounts({\n          responder: this.wallet.publicKey,\n        })\n        .rpc();\n\n      pendingTransactions.delete(txHash);\n    } catch (error) {\n      console.error(\n        `Error sending response for ${txHash}: ${\n          error instanceof Error ? error.message : String(error)\n        }`\n      );\n      console.error(\n        '🔍 Borsh serialization context',\n        txInfo.callbackSerializationSchema,\n        result.output\n      );\n    }\n  }\n\n  private async handleFailedTransaction(\n    txHash: string,\n    txInfo: PendingTransaction\n  ) {\n    console.warn(`❌ Transaction failed: ${txHash}`);\n\n    try {\n      const MAGIC_ERROR_PREFIX = Buffer.from([0xde, 0xad, 0xbe, 0xef]);\n\n      const errorSchema = { struct: { error: 'bool' } };\n      const borshData = borsh.serialize(errorSchema, { error: true });\n      const errorData = Buffer.concat([MAGIC_ERROR_PREFIX, borshData]);\n\n      const serializedOutput = new Uint8Array(errorData);\n\n      const requestId = txInfo.requestId;\n      if (!requestId) {\n        throw new Error(`Missing request ID for tx ${txHash}`);\n      }\n      const requestIdBytes = Buffer.from(requestId.slice(2), 'hex');\n      const signature = await CryptoUtils.signBidirectionalResponse(\n        requestIdBytes,\n        serializedOutput,\n        this.config.mpcRootKey\n      );\n\n      await this.program.methods\n        .respondBidirectional(\n          Array.from(requestIdBytes),\n          Buffer.from(serializedOutput),\n          signature\n        )\n        .accounts({\n          responder: this.wallet.publicKey,\n        })\n        .rpc();\n    } catch (error) {\n      console.error(\n        `Error sending error response for ${txHash}: ${\n          error instanceof Error ? error.message : String(error)\n        }`\n      );\n    }\n  }\n\n  private setupEventListeners() {\n    const cpiEventHandlers = new Map<\n      string,\n      (event: CpiEventData, slot: number) => Promise<void>\n    >();\n\n    cpiEventHandlers.set(\n      'signBidirectionalEvent',\n      async (eventData: CpiEventData, _slot: number) => {\n        if (!isSignBidirectionalEvent(eventData)) {\n          console.error('Invalid event type for signBidirectionalEvent');\n          return;\n        }\n\n        console.log(`📨 SignBidirectionalEvent from ${eventData.sender.toString()}`);\n\n        try {\n          await this.handleSignBidirectional(eventData);\n        } catch (error) {\n          console.error(\n            `Error processing bidirectional: ${\n              error instanceof Error ? error.message : String(error)\n            }`\n          );\n        }\n      }\n    );\n\n    cpiEventHandlers.set(\n      'signatureRequestedEvent',\n      async (eventData: CpiEventData) => {\n        if (!isSignatureRequestedEvent(eventData)) {\n          console.error('Invalid event type for signatureRequestedEvent');\n          return;\n        }\n\n        console.log(`📝 SignatureRequestedEvent from ${eventData.sender.toString()}`);\n\n        try {\n          await this.handleSignatureRequest(eventData);\n        } catch (error) {\n          console.error(\n            `Error sending signature: ${\n              error instanceof Error ? error.message : String(error)\n            }`\n          );\n        }\n      }\n    );\n\n    this.cpiSubscriptionId = CpiEventParser.subscribeToCpiEvents(\n      this.connection,\n      this.program,\n      cpiEventHandlers\n    );\n  }\n\n  private async handleSignBidirectional(event: SignBidirectionalEvent) {\n    const namespace = getNamespaceFromCaip2(event.caip2Id);\n    console.log(\n      `🧾 SignBidirectional payload namespace=${namespace} caip2Id=${event.caip2Id} keyVersion=${event.keyVersion} path=${event.path} algo=${event.algo} dest=${event.dest} params=${event.params} sender=${event.sender.toString()}`\n    );\n    const derivedPrivateKey = await CryptoUtils.deriveSigningKey(\n      event.path,\n      event.sender.toString(),\n      this.config.mpcRootKey\n    );\n\n    if (namespace === 'bip122') {\n      await handleBitcoinBidirectional(\n        event,\n        this.getBidirectionalContext(),\n        derivedPrivateKey\n      );\n      return;\n    }\n\n    if (namespace === 'eip155') {\n      await handleEthereumBidirectional(\n        event,\n        this.getBidirectionalContext(),\n        derivedPrivateKey\n      );\n      return;\n    }\n\n    throw new Error(`Unsupported chain namespace: ${namespace}`);\n  }\n\n  private async handleSignatureRequest(event: SignatureRequestedEvent) {\n    const requestId = RequestIdGenerator.generateSignRequestId(\n      event.sender.toString(),\n      Array.from(event.payload),\n      event.path,\n      event.keyVersion,\n      0,\n      event.algo,\n      event.dest,\n      event.params\n    );\n\n    console.log(`🔑 Request ID: ${requestId}`);\n\n    const derivedPrivateKey = await CryptoUtils.deriveSigningKey(\n      event.path,\n      event.sender.toString(),\n      this.config.mpcRootKey\n    );\n\n    const signature = await CryptoUtils.signMessage(\n      event.payload,\n      derivedPrivateKey\n    );\n\n    const requestIdBytes = Array.from(Buffer.from(requestId.slice(2), 'hex'));\n    const tx = await this.program.methods\n      .respond([requestIdBytes], [signature])\n      .accounts({\n        responder: this.wallet.publicKey,\n      })\n      .rpc();\n\n    console.log(`✅ Signature sent! tx=${tx}`);\n  }\n\n  private getBidirectionalContext(): BidirectionalHandlerContext {\n    return {\n      program: this.program,\n      wallet: this.wallet,\n      config: this.config,\n      pendingTransactions,\n    };\n  }\n\n  /**\n   * Await until the server has finished its startup sequence and listeners are registered.\n   * Useful in tests to avoid racing the first request against the log subscription.\n   */\n  async waitUntilReady(timeoutMs = 2_000): Promise<void> {\n    const timeoutPromise = new Promise<void>((_, reject) => {\n      const id = setTimeout(() => {\n        clearTimeout(id);\n        reject(\n          new Error(\n            `ChainSignatureServer readiness timed out after ${timeoutMs}ms`\n          )\n        );\n      }, timeoutMs);\n    });\n\n    await Promise.race([this.readyPromise, timeoutPromise]);\n  }\n\n  async shutdown() {\n    console.log('🛑 Shutting down...');\n    if (this.monitorIntervalId !== null) {\n      clearInterval(this.monitorIntervalId);\n      this.monitorIntervalId = null;\n    }\n    if (this.cpiSubscriptionId !== null) {\n      await this.connection.removeOnLogsListener(this.cpiSubscriptionId);\n      this.cpiSubscriptionId = null;\n    }\n  }\n}\n"],"x_google_ignoreList":[0],"mappings":"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;;;AAWI;AACE;AACA;;AAEA;;;;;;;;;AAgJN;AAGE;;AAGF;AAGE;;;;;cCzLW;eACC;CACV,QAAQ;CACR,WAAW;CACX,QAAQ;CACR,eAAe;CACf,cAAc;CACf;mBACe;CACd;EACE,QAAQ;EACR,QAAQ,CACN,qHACD;EACD,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CACV;GACE,QAAQ;GACR,OAAO,EACL,SAAS,CACP;IACE,QAAQ;IACR,SAAS;KACP;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACD;IACF,CACF,EACF;GACF,CACF;EACD,QAAQ,EAAE;EACV,WAAW;EACZ;CACD;EACE,QAAQ;EACR,QAAQ,CACN,sLACD;EACD,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY;GACV;IACE,QAAQ;IACR,YAAY;IACZ,OAAO,EACL,SAAS,CACP;KACE,QAAQ;KACR,SAAS;MACP;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD;KACF,CACF,EACF;IACF;GACD;IACE,QAAQ;IACR,YAAY;IACZ,UAAU;IACX;GACD;IACE,QAAQ;IACR,WAAW;IACZ;GACF;EACD,QAAQ,CACN;GACE,QAAQ;GACR,QAAQ;GACT,EACD;GACE,QAAQ;GACR,QAAQ;GACT,CACF;EACF;CACD;EACE,QAAQ;EACR,QAAQ,CACN,qKACD;EACD,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY;GACV;IACE,QAAQ;IACR,UAAU;IACX;GACD;IACE,QAAQ;IACR,OAAO,EACL,SAAS,CACP;KACE,QAAQ;KACR,SAAS;MACP;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD;KACF,CACF,EACF;IACF;GACD,EACE,QAAQ,WACT;GACF;EACD,QAAQ,CACN;GACE,QAAQ;GACR,QAAQ,EACN,OAAO,EACL,SAAS,CACP,MACA,GACD,EACF,EACF;GACF,EACD;GACE,QAAQ;GACR,QAAQ,EACN,OAAO,EACL,WAAW,EACT,QAAQ,aACT,EACF,EACF;GACF,CACF;EACF;CACD;EACE,QAAQ;EACR,QAAQ,CACN,2UACD;EACD,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CACV;GACE,QAAQ;GACR,UAAU;GACX,CACF;EACD,QAAQ;GACN;IACE,QAAQ;IACR,QAAQ,EACN,SAAS,CACP,MACA,GACD,EACF;IACF;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACD;IACE,QAAQ;IACR,QAAQ,EACN,WAAW,EACT,QAAQ,aACT,EACF;IACF;GACF;EACF;CACD;EACE,QAAQ;EACR,QAAQ,CACN,uHACD;EACD,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY,CACV;GACE,QAAQ;GACR,UAAU;GACX,CACF;EACD,QAAQ,CACN;GACE,QAAQ;GACR,QAAQ,EACN,OAAO,EACL,WAAW,EACT,QAAQ,iBACT,EACF,EACF;GACF,CACF;EACF;CACD;EACE,QAAQ;EACR,QAAQ,CACN,4WACD;EACD,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY;GACV;IACE,QAAQ;IACR,YAAY;IACZ,OAAO,EACL,SAAS,CACP;KACE,QAAQ;KACR,SAAS;MACP;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD;KACF,CACF,EACF;IACF;GACD;IACE,QAAQ;IACR,YAAY;IACZ,UAAU;IACX;GACD;IACE,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,YAAY;IACb;GACD;IACE,QAAQ;IACR,WAAW;IACZ;GACD;IACE,QAAQ;IACR,OAAO,EACL,SAAS,CACP;KACE,QAAQ;KACR,SAAS;MACP;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD;KACF,CACF,EACF;IACF;GACD,EACE,QAAQ,WACT;GACF;EACD,QAAQ;GACN;IACE,QAAQ;IACR,QAAQ,EACN,SAAS,CACP,MACA,GACD,EACF;IACF;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACF;EACF;CACD;EACE,QAAQ;EACR,QAAQ,CACN,4rBACD;EACD,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY;GACV;IACE,QAAQ;IACR,YAAY;IACZ,OAAO,EACL,SAAS,CACP;KACE,QAAQ;KACR,SAAS;MACP;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD;KACF,CACF,EACF;IACF;GACD;IACE,QAAQ;IACR,YAAY;IACZ,UAAU;IACX;GACD;IACE,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,YAAY;IACb;GACD;IACE,QAAQ;IACR,WAAW;IACZ;GACD;IACE,QAAQ;IACR,YAAY;IACb;GACD;IACE,QAAQ;IACR,OAAO,EACL,SAAS,CACP;KACE,QAAQ;KACR,SAAS;MACP;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD;KACF,CACF,EACF;IACF;GACD,EACE,QAAQ,WACT;GACF;EACD,QAAQ;GACN;IACE,QAAQ;IACR,QAAQ;IACT;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACD;IACE,QAAQ;IACR,QAAQ;IACT;GACF;EACF;CACD;EACE,QAAQ;EACR,QAAQ,CACN,0GACD;EACD,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY;GACV;IACE,QAAQ;IACR,YAAY;IACZ,OAAO,EACL,SAAS,CACP;KACE,QAAQ;KACR,SAAS;MACP;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD;KACF,CACF,EACF;IACF;GACD;IACE,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,aAAa,CACX,gBACD;IACF;GACD;IACE,QAAQ;IACR,WAAW;IACZ;GACF;EACD,QAAQ,CACN;GACE,QAAQ;GACR,QAAQ;GACT,CACF;EACF;CACD;EACE,QAAQ;EACR,QAAQ,CACN,oGACD;EACD,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACD,YAAY;GACV;IACE,QAAQ;IACR,YAAY;IACZ,OAAO,EACL,SAAS,CACP;KACE,QAAQ;KACR,SAAS;MACP;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD;KACF,CACF,EACF;IACF;GACD;IACE,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,aAAa,CACX,gBACD;IACF;GACD;IACE,QAAQ;IACR,QAAQ,CACN,mDACD;IACD,YAAY;IACb;GACD;IACE,QAAQ;IACR,WAAW;IACZ;GACF;EACD,QAAQ,CACN;GACE,QAAQ;GACR,QAAQ;GACT,CACF;EACF;CACF;eACW,CACV;CACE,QAAQ;CACR,iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACF,CACF;aACS;CACR;EACE,QAAQ;EACR,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACF;CACD;EACE,QAAQ;EACR,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACF;CACD;EACE,QAAQ;EACR,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACF;CACD;EACE,QAAQ;EACR,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACF;CACD;EACE,QAAQ;EACR,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACF;CACD;EACE,QAAQ;EACR,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACF;CACD;EACE,QAAQ;EACR,iBAAiB;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EACF;CACF;aACS;CACR;EACE,QAAQ;EACR,QAAQ;EACR,OAAO;EACR;CACD;EACE,QAAQ;EACR,QAAQ;EACR,OAAO;EACR;CACD;EACE,QAAQ;EACR,QAAQ;EACR,OAAO;EACR;CACD;EACE,QAAQ;EACR,QAAQ;EACR,OAAO;EACR;CACD;EACE,QAAQ;EACR,QAAQ;EACR,OAAO;EACR;CACD;EACE,QAAQ;EACR,QAAQ;EACR,OAAO;EACR;CACD;EACE,QAAQ;EACR,QAAQ;EACR,OAAO;EACR;CACF;YACQ;CACP;EACE,QAAQ;EACR,QAAQ;GACN,QAAQ;GACR,UAAU,CACR;IACE,QAAQ;IACR,QAAQ,EACN,SAAS,CACP,MACA,GACD,EACF;IACF,EACD;IACE,QAAQ;IACR,QAAQ,EACN,SAAS,CACP,MACA,GACD,EACF;IACF,CACF;GACF;EACF;CACD;EACE,QAAQ;EACR,QAAQ,CACN,wJACD;EACD,QAAQ;GACN,QAAQ;GACR,UAAU,CACR;IACE,QAAQ;IACR,QAAQ;IACT,EACD;IACE,QAAQ;IACR,QAAQ;IACT,CACF;GACF;EACF;CACD;EACE,QAAQ;EACR,QAAQ;GACN,QAAQ;GACR,UAAU,CACR;IACE,QAAQ;IACR,QAAQ,EACN,SAAS,CACP,MACA,GACD,EACF;IACF,EACD;IACE,QAAQ;IACR,QAAQ;IACT,CACF;GACF;EACF;CACD;EACE,QAAQ;EACR,QAAQ,CACN,uIACD;EACD,QAAQ;GACN,QAAQ;GACR,UAAU,CACR;IACE,QAAQ;IACR,QAAQ;IACT,EACD;IACE,QAAQ;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"}