{"version":3,"sources":["jsdelivr-header.js","/npm/sniper-js@0.2.0/src/main.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNA,oBAIS,cAAoB,sBACtB,WAAsB,4BACtB,SAAsB,0BACtB,YAAsB,6BACtB,oBAAsB,qCACtB,aAAsB,8BAG3B,SACA,YACA,wBACK,kBAEP,MAAM,IAAM,IACN,UAAY,IAAI,KAAK,oBAGZ,MAAM,OACnB,WAAA,CAAY,GACA,KAAK,cAAc,KAG7B,KAAK,QAAe,QACpB,KAAK,GAAe,KACpB,KAAK,SAAe,EAAK,SACzB,KAAK,YAAe,EAAK,WAAY,EAAK,UAC1C,KAAK,GAAe,IAAI,SAC1B,CAQA,UAAM,GACJ,OAAO,IAAI,SAAQ,CAAC,EAAS,KAC3B,KAAK,GAAK,IAAI,QAAQ,KAAK,UAC3B,KAAK,SAAW,IAAI,gBAAgB,KAAK,IACzC,GAAQ,GAEZ,CAEA,aAAA,CAAc,GACZ,IAAI,GAAQ,EAQZ,OAPK,EAAK,WACR,QAAQ,MAAM,2BACd,GAAQ,GAEL,EAAK,cACR,QAAQ,KAAK,+BAER,CACT,CAGA,OAAA,GAAY,OAAO,KAAK,EAAG,CAG3B,cAAA,CAAe,GACT,KAAK,IAAM,GACb,KAAK,SAAW,EAChB,KAAK,GAAG,aAAa,KAAK,WAE1B,QAAQ,MAAM,4BAElB,CAEA,gBAAA,GAAqB,OAAO,KAAK,GAAG,cAAe,CAEnD,UAAA,CAAW,GAAW,KAAK,GAAG,YAAY,EAAS,CAEnD,gBAAA,GAAqB,OAAO,KAAK,GAAG,cAAe,CAiBnD,sBAAM,CACJ,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EAAO,OAEP,OAAO,IAAI,SAAS,MAAO,EAAS,KAClC,MAAM,IAAY,EACZ,EAAQ,CACZ,KAAM,EACN,KAAM,KAAK,UACX,MAAO,EACP,MAAO,EAAY,GAAwB,UAC3C,kBAAmB,EACnB,kBAAmB,EACnB,iBAAkB,EAClB,iBAAkB,EAClB,gBAAiB,IAAI,KAAK,IAC1B,yBAA0B,IAAI,UAAU,KAAK,MAAQ,IAGnD,OAAO,UAAU,IACnB,EAAO,IAAI,MAAM,mEAGnB,MAAM,EAAe,KAAK,aAAa,GACvC,IAAI,EAAM,KAEV,IACE,QAAY,KAAK,mBAAmB,EAAc,EAAM,MAAO,EACjE,CAAE,MAAO,GAEP,YADA,EAAO,IAAI,MAAM,GAEnB,CAGA,IAAI,EAAQ,KACZ,MAAM,EAAS,CAAC,GAAI,IACd,EAAW,KAAK,iBAAiB,GACnC,EAAO,SAAS,EAAS,IACvB,KAAK,gBAAgB,EAAc,EAAM,MAAO,KAClD,EAAQ,GAGZ,MAAM,EAAW,KAAK,iBAAiB,GACnC,EAAO,SAAS,EAAS,IACvB,KAAK,gBAAgB,EAAc,EAAM,MAAO,KAClD,EAAQ,GAIP,GAAO,EAAO,IAAI,MAAM,6CAE7B,EACE,OAAO,OAAO,EAAO,CACnB,QAAS,EACT,IAAK,IAET,GAEJ,CAWA,wBAAM,CAAmB,EAAW,EAAY,GAC9C,OAAO,IAAI,SAAQ,MAAO,EAAS,KAC5B,KAAK,MAAM,IACd,EAAO,+CAEG,KAAK,qBAAqB,EAAY,KAAK,KACrD,EAAO,0CAGT,IAAI,EAAa,EACjB,GAAI,EAAW,CACb,MAAM,EAAgB,SAAS,GACzB,EAAc,oBAAoB,GACxC,EAAa,YAAY,EAC3B,CAGA,QADkB,KAAK,GAAG,MAAM,IAAI,WAAa,EAAY,GAClD,GAEf,CAGA,eAAA,CAAgB,GACd,OAAO,OAAO,gBAAgB,EAChC,CAEA,gBAAA,CAAiB,GACf,OAAO,OAAO,iBAAiB,EACjC,CASA,YAAA,CAAa,GACX,OAAO,KAAK,aAAa,EAC3B,CAWA,eAAA,CAAgB,EAAM,EAAY,GAEhC,SAD0B,CAAC,GAAI,IAEV,SAAS,EAAM,IACjC,KAAK,MAAM,IACI,iBAAT,GACW,iBAAX,EAAM,GACK,iBAAX,EAAM,GACK,iBAAX,EAAM,GACZ,OAAO,UAAU,KAIb,KAAK,gBAAgB,IAAI,WAAa,EAAM,EAAY,EACjE,CAEA,oBAAA,CAAqB,EAAQ,EAAa,EAAG,EAAW,MACtD,MAAM,EAA2B,IAAb,EACd,EAAuB,IAAX,EAClB,IAAI,EAAc,EAElB,OAAO,IAAI,SAAQ,CAAC,EAAS,KAC3B,IAAI,EAAS,aAAY,UACnB,EAAc,IAChB,QAAQ,KAAK,2CAA4C,GACzD,cAAc,GACd,KAEF,GAAe,EAEf,MAAM,QAAgB,KAAK,GAAG,sBAAsB,GAChD,IACF,cAAc,GACd,EAAQ,GACV,GACC,EAAW,GAElB,CAEA,oBAAA,CAAqB,EAAU,EAAQ,EAAQ,EAAU,GACvD,OAAO,KAAK,GAAG,gBAAgB,EAAU,EAAQ,EAAQ,EAAU,EACrE,CAEA,kBAAA,CAAmB,GACjB,OAAO,KAAK,GAAG,cAAc,EAC/B,CAGA,eAAA,CAAgB,EAAW,GACzB,OAAO,KAAK,SAAS,MAAM,gBAAgB,EAAW,EACxD,CAEA,yBAAA,CAA0B,EAAW,EAAW,GAC9C,OAAO,KAAK,SAAS,MAAM,2BAA2B,EAAW,EAAW,EAC9E,CAEA,iBAAA,CAAkB,EAAW,EAAW,GACtC,OAAO,KAAK,SAAS,MAAM,kBAAkB,EAAW,EAAW,EACrE,CAEA,aAAA,CAAc,EAAW,EAAW,EAAQ,GAC1C,OAAO,KAAK,SAAS,MAAM,SACzB,EACA,EACA,EACA,EAEJ,CAEA,iBAAA,CAAkB,EAAW,EAAU,EAAQ,EAAa,GAC1D,OAAO,KAAK,SAAS,MAAM,aACzB,EACA,EACA,EACA,EACA,EAEJ,CAEA,YAAA,CAAa,EAAW,EAAW,GACjC,OAAO,KAAK,SAAS,MAAM,QACzB,EACA,EACA,EAEJ,CAEA,aAAA,CAAc,EAAW,EAAW,GAClC,OAAO,KAAK,SAAS,MAAM,SACzB,EACA,EACA,EAEJ,CAIA,SAAA,CAAU,GAAgB,CAE1B,gBAAA,CAAiB,GAAS,OAAO,KAAK,GAAG,aAAa,EAAO,CAC7D,iBAAA,CAAkB,GAAS,OAAO,KAAK,GAAG,qBAAqB,EAAO,CAEtE,eAAA,CAAgB,EAAM,GAAM,KAAK,GAAG,iBAAiB,EAAM,EAAI,CAC/D,iBAAA,CAAkB,GAAQ,OAAO,KAAK,GAAG,cAAc,EAAM,EAO/D,WA6BC,EA7BD","file":"/npm/sniper-js@0.2.0/src/main.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/sniper-js@0.2.0/src/main.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict'\n\n// import { abi as dexAbi } from '../../build/contracts/SniperExchange'\n\nimport { BigNumber }    from 'bignumber.js'\nimport Assert           from './component/Assert'\nimport Util             from './component/Util'\nimport Web3lib          from './component/Web3lib'\nimport ContractManager  from './component/ContractManager'\nimport Firebase         from './component/Firebase'\n\nimport {\n  toBuffer,\n  bufferToHex,\n  hashPersonalMessage\n} from 'ethereumjs-util'\n\nconst cfg = CFG\nconst NULL_ADDR = cfg.addr.null\n\n\nexport default class Sniper {\n  constructor(opts) {\n    let err = this._checkOptions(opts)\n    if (err) return\n\n    this.Web3lib      = Web3lib\n    this.w3           = null\n    this.provider     = opts.provider\n    this.webworker    = opts.webworker ? opts.webworker : false\n    this.db           = new Firebase()\n  }\n\n\n  /**\n   * Instantiate Web3 & Contracts\n   * @return {Promise}\n   */\n\n  async init() {\n    return new Promise((resolve, reject) => {\n      this.w3 = new Web3lib(this.provider)\n      this.contract = new ContractManager(this.w3)\n      resolve()\n    })\n  }\n\n  _checkOptions(opts) {\n    let error = false\n    if (!opts.provider) {\n      console.error('Missing provider option')\n      error = true\n    }\n    if (!opts.exchangeAddr) {\n      console.warn('Missing exchangeAddr option')\n    }\n    return error\n  } // _checkOptions\n\n\n  getWeb3() { return this.w3 }\n\n\n  changeProvider(provider) {\n    if (this.w3 && provider) {\n      this.provider = provider\n      this.w3._setProvider(this.provider)\n    } else {\n      console.error('Could not change provider')\n    }\n  }\n\n  getGasPriceAsync() { return this.w3._getGasPrice() }\n\n  newAccount(numAddr) { this.w3._newAccount(numAddr) }\n\n  getAccountsAsync() { return this.w3._getAccounts() }\n\n\n  /**\n   * Create Order\n   * @param {bool} addPrefix - Adds ethereum signed message prefix\n   * @param {string} makerAddr - Maker Address\n   * @param {string} takerAddr - Taker Address\n   * @param {string} makerTokenAddr - Maker Token Address\n   * @param {string} takerTokenAddr - Maker Token Address\n   * @param {BigNumber} makerTokenAmt - Maker Token Amount\n   * @param {BigNumber} takerTokenAmt - Taker Token Amount\n   * @param {Number} expirationUnixLen - Expiration length in seconds\n   * @param {string} base - ETH || EOS\n   * @return {Point} A Point object.\n   */\n\n  async createOrderAsync(\n    addPrefix,\n    makerAddr,\n    takerAddr,\n    makerTokenAddr,\n    takerTokenAddr,\n    makerTokenAmt,\n    takerTokenAmt,\n    expirationUnixLen,\n    base = 'ETH'\n  ) {\n    return new Promise( async (resolve, reject) => {\n      const usePrefix = addPrefix ? true : false\n      const order = {\n        base: base,\n        salt: Util.genSalt(),\n        maker: makerAddr,\n        taker: takerAddr = takerAddr ? takerAddr : NULL_ADDR,\n        makerTokenAddress: makerTokenAddr,\n        takerTokenAddress: takerTokenAddr,\n        makerTokenAmount: makerTokenAmt,\n        takerTokenAmount: takerTokenAmt,\n        exchangeAddress: cfg.addr.dex,\n        expirationTimestampInSec: new BigNumber(Date.now() + expirationUnixLen)\n      }\n\n      if (Assert.orderJson(order)) {\n        reject(new Error('Error creating order. Please check the console log and report!'))\n      }\n\n      const orderHashHex = Util.getOrderHash(order)\n      let sig = null\n\n      try {\n        sig = await this.signOrderHashAsync(orderHashHex, order.maker, usePrefix)\n      } catch (e) {\n        reject(new Error(e))\n        return\n      }\n\n      // verification, attempt VRS & RSV\n      let ecSig = null\n      const validV = [27, 28]\n      const ecSigVRS = Util.parseSigHexToVRS(sig)\n      if (validV.includes(ecSigVRS.v)) {\n        if (this.verifySignature(orderHashHex, order.maker, ecSigVRS)) {\n          ecSig = ecSigVRS\n        }\n      }\n      const ecSigRSV = Util.parseSigHexToRSV(sig)\n      if (validV.includes(ecSigRSV.v)) {\n        if (this.verifySignature(orderHashHex, order.maker, ecSigRSV)) {\n          ecSig = ecSigRSV\n        }\n      }\n\n      if (!ecSig) reject(new Error('Could not sign order: invalid signature.'))\n\n      resolve(\n        Object.assign(order, {\n          hashHex: orderHashHex,\n          sig: ecSig\n        })\n      )\n    }) // Promise\n  }\n\n\n  /**\n   * Signs Order Hash\n   * @param {string} orderHash - Order hash/message to sign\n   * @param {string} signerAddr - Signer's address\n   * @param {boolean} addPrefix - adds Ethereum signed message prefix\n   * @return {object} VRS\n   */\n\n  async signOrderHashAsync(orderHash, signerAddr, addPrefix) {\n    return new Promise(async (resolve, reject) => {\n      if (!Util.isHex(orderHash)) {\n        reject('signOrderHashAsync: Invalid orderHash')\n      }\n      if (!(await Util.isSenderAddressAsync(signerAddr, this.w3))) {\n        reject('signOrderHashAsync: Invalid signerAddr')\n      }\n\n      let msgHashHex = orderHash\n      if (addPrefix) {\n        const orderHashBuff = toBuffer(orderHash);\n        const msgHashBuff = hashPersonalMessage(orderHashBuff);\n        msgHashHex = bufferToHex(msgHashBuff);\n      }\n\n      const sig = await this.w3._sign(cfg.msg_prefix + msgHashHex, signerAddr)\n      resolve(sig)\n    })\n  }\n\n\n  sanitizeOrderIn(o) {\n    return Assert.sanitizeOrderIn(o)\n  }\n\n  sanitizeOrderOut(o) {\n    return Assert.sanitizeOrderOut(o)\n  }\n\n\n  /**\n   * Externally-available order hashing\n   * @param {object} order - complete order data\n   * @return {string}\n   */\n\n  getOrderHash(order) {\n    return Util.getOrderHash(order)\n  }\n\n\n  /**\n   * Verify Order Hash\n   * @param {string} data - message to sign (eg. Order Hash)\n   * @param {string} signerAddr - Signer's address\n   * @param {object} ecSigVRS - adds Ethereum signed message prefix\n   * @return {bool} VRS\n   */\n\n  verifySignature(data, signerAddr, ecSig) {\n    const validVParamValues = [27, 28]\n    if (\n      !validVParamValues.includes(ecSig.v) ||\n      !Util.isHex(data) ||\n      typeof ecSig != 'object' ||\n      typeof ecSig.v != 'number' ||\n      typeof ecSig.r != 'string' ||\n      typeof ecSig.s != 'string' ||\n      !Assert.isAddress(signerAddr)\n    ) {\n      return false\n    }\n    return Util.verifySignature(cfg.msg_prefix + data, signerAddr, ecSig)\n  }\n\n  pollTransactionAsync(txHash, frequencyS = 1, timeoutS = 1200) {\n    const frequencyMS = frequencyS * 1000\n    const timeoutMS = timeoutS * 1000\n    let timeTracker = 0\n\n    return new Promise((resolve, reject) => {\n      let pollTx = setInterval(async () => {\n        if (timeTracker > timeoutMS) {\n          console.warn('Sniper.pollTransactionAsync: timeout for', txHash)\n          clearInterval(pollTx)\n          resolve()\n        }\n        timeTracker += frequencyMS\n\n        const receipt = await this.w3.getTransactionReceipt(txHash)\n        if (receipt) {\n          clearInterval(pollTx)\n          resolve(receipt)\n        }\n      }, frequencyMS)\n    })\n  }\n\n  sendTransactionAsync(fromAddr, toAddr, amount, gasPrice, nonce) {\n    return this.w3.sendTransaction(fromAddr, toAddr, amount, gasPrice, nonce)\n  }\n\n  getEthBalanceAsync(addr) {\n    return this.w3.getEthBalance(addr)\n  }\n\n  // Token-specific Functionality\n  getBalanceAsync(tokenAddr, ownerAddr) {\n    return this.contract.token.getBalanceAsync(tokenAddr, ownerAddr)\n  }\n\n  setUnlimitedApprovalAsync(tokenAddr, ownerAddr, spenderAddr) {\n    return this.contract.token.setUnlimitedAllowanceAsync(tokenAddr, ownerAddr, spenderAddr)\n  }\n\n  getAllowanceAsync(tokenAddr, ownerAddr, spenderAddr) {\n    return this.contract.token.getAllowanceAsync(tokenAddr, ownerAddr, spenderAddr)\n  }\n\n  transferAsync(tokenAddr, ownerAddr, toAddr, amount) {\n    return this.contract.token.transfer(\n      tokenAddr,\n      ownerAddr,\n      toAddr,\n      amount\n    )\n  }\n\n  transferFromAsync(tokenAddr, fromAddr, toAddr, spenderAddr, amount) {\n    return this.contract.token.transferFrom(\n      tokenAddr,\n      fromAddr,\n      toAddr,\n      spenderAddr,\n      amount\n    )\n  }\n\n  depositAsync(tokenAddr, ownerAddr, amount) {\n    return this.contract.token.deposit(\n      tokenAddr,\n      ownerAddr,\n      amount\n    )\n  }\n\n  withdrawAsync(tokenAddr, ownerAddr, amount) {\n    return this.contract.token.withdraw(\n      tokenAddr,\n      ownerAddr,\n      amount\n    )\n  }\n\n\n  // TODO\n  fillOrder(order) { return }\n\n  submitOrderAsync(order) { return this.db._submitOrder(order) }\n  submitOrderUnsafe(order) { return this.db._submitOrderInsecure(order) }\n\n  listenOrderBook(pair, cb) { this.db._listenOrderBook(pair, cb) }\n  getOrderBookAsync(pair) { return this.db._getOrderBook(pair) }\n}\n\n\n\n// dev testing\n\n( async () => {\n  // let snpr = new Sniper({\n  //   provider: web3\n  // })\n\n  // await snpr.init()\n  //\n  // const accounts = await snpr.getAccountsAsync()\n  // const ethToDeposit = BigNumber(1000000000000000000) // web3.toWei('1', 'ether')\n\n  // const txDeposit = await snpr.sendTransactionAsync(\n  //   accounts[0],\n  //   cfg.addr.weth,\n  //   ethToDeposit\n  // )\n  // const balance = await snpr.getBalanceAsync(cfg.addr.weth, accounts[0])\n  // console.log('balance:', balance)\n\n  // testing2 addr: 0x7ad2ca2081e4b40147e8b8a6cd3c0907ee09e469\n\n  // const tx = await snpr.setUnlimitedApprovalAsync(cfg.addr.weth, accounts[0])\n  // console.log(tx)\n  // const receipt = await snpr.pollTransactionAsync(tx.transactionHash)\n  //\n  // const balance = await snpr.getBalanceAsync(cfg.addr.weth, accounts[0])\n  // console.log('balance:', balance)\n  //\n  // const allowance = await snpr.getAllowanceAsync(cfg.addr.weth, '0xfaBe65f11fE3EB25636333ca740A8C605494B9b1', '0xBadb56702F42e8FA4D826234FF8744215EB511F3')\n  // console.log(allowance)\n})()\n\n//\n// let count = 0;\n// let onOrder = (orders) => {\n//   console.log(count, orders)\n//   count++\n// }\n//\n// snpr.listenOrderBook('ETH:0x6089982faab51b5758974cf6a502d15ca300a4eb', onOrder)\n//\n//\n// snpr.init().then(() => {\n//\n//   // console.log('standalone verification test:')\n//   // console.log(snpr.verifySignature(\n//   //   '0xd09e3e833a8581ecc01df146b197f63d243ceb023572044922f547836950599f',\n//   //   '0xfaBe65f11fE3EB25636333ca740A8C605494B9b1',\n//   //   {v: 28, r: '0xf7e34636dcb9a4b844e37bb28a998f96cb56a592fd508c738aee96a3222cba93', s: '0x6b8cf351dcfe6a9af1e9c6921b88af028421f2ebb09d87e9b86d6ad37785b7ae'}\n//   // ))\n//\n//   snpr.createOrderAsync(\n//     false,\n//     '0xfaBe65f11fE3EB25636333ca740A8C605494B9b1', // mAddr\n//     null, // tAddr\n//     '0xfaBe65f11fE3EB25636333ca740A8C605494B9b1', // mTokenAddr\n//     '0x6089982faab51b5758974cf6a502d15ca300a4eb', // tTokenAddr\n//     new BigNumber(1), // makerTokenAmt\n//     new BigNumber(1), // takerTokenAmt\n//     50000, // expiry length\n//     'ETH'\n//   ).then((order) => {\n//     // console.log(order)\n//     let hash = snpr.getOrderHash(order)\n//     console.log('verification test:', snpr.verifySignature(hash, order.maker, order.sig))\n//     return order\n//   }).then((order) => {\n//     snpr.submitOrderAsync(order)\n//   })\n//\n// })\n"]}