{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-core/src/blockchain/model/transaction/transactionInputCollection.js"],"names":["forge","TransactionOutput","TransactionInputCollection","constructor","senderWallet","_senderWallet","_transactionInputs","Map","_containsMiningReward","_value","hash","displayName","substring","add","transaction","isFinalized","output","outputs","get","set","_calculateValue","addMiningReward","block","minerHash","Error","reward","value","finalize","_hash","forEach","callback","has","outputHash","Array","from","entries","reduce","total","entry","sha256","md","create","update","keys","join","digest","toHex"],"mappings":";;;;;;AAAOA,W;;AACAC,uB;;;;;;;;;;;AADAD,gD;;;;;;;;;;;;;AACAC,4D;;;;;;;;;AAEP;;;;;;;;;;AAUe,YAAMC,0BAAN,CAAiC;AAC9CC,oBAAYC,YAAZ,EAA0B;AACxB,eAAKC,aAAL,GAAqBD,YAArB;AACA,eAAKE,kBAAL,GAA0B,IAAIC,GAAJ,EAA1B;AACA,eAAKC,qBAAL,GAA6B,KAA7B;AACA,eAAKC,MAAL,GAAc,CAAd;AACA,eAAKC,IAAL,GAAY,IAAZ;AACD;;AAED,YAAIC,WAAJ,GAAkB;AAChB,cAAI,CAAC,KAAKD,IAAV,EAAgB;AACd,mBAAO,WAAP;AACD;;AAED,iBAAO,MAAM,KAAKA,IAAL,CAAUE,SAAV,CAAoB,CAApB,EAAuB,EAAvB,CAAb;AACD;;AAEDC,YAAIC,WAAJ,EAAiB;AACf,cAAI,KAAKC,WAAL,EAAJ,EAAwB;AACtB,mBAAO,IAAP;AACD;;AAED,cAAIC,SAASF,YAAYG,OAAZ,CAAoBC,GAApB,CAAwB,KAAKb,aAAL,CAAmBK,IAA3C,CAAb;AACA,cAAIM,UAAU,IAAd,EAAoB;AAClB;AACA,mBAAO,IAAP;AACD;;AAED,eAAKV,kBAAL,CAAwBa,GAAxB,CAA4BH,OAAON,IAAnC,EAAyCM,MAAzC;AACA,eAAKI,eAAL;AACA,iBAAO,IAAP;AACD;;AAEDC,wBAAgBC,KAAhB,EAAuB;AACrB,cAAI,KAAKP,WAAL,EAAJ,EAAwB;AACtB,mBAAO,IAAP;AACD;;AAED,cAAI,KAAKP,qBAAT,EAAgC;AAC9B;AACA,mBAAO,IAAP;AACD;;AAED,cAAIc,MAAMC,SAAN,KAAoB,KAAKlB,aAAL,CAAmBK,IAA3C,EAAiD;AAC/C,kBAAM,IAAIc,KAAJ,CAAU,gDAAV,CAAN;AACD;;AAED,cAAIR,SAAS,IAAIf,iBAAJ,CAAsB,KAAKI,aAA3B,EAA0CiB,MAAMG,MAAhD,CAAb;AACA,eAAKnB,kBAAL,CAAwBa,GAAxB,CAA4BH,OAAON,IAAnC,EAAyCM,MAAzC;AACA,eAAKR,qBAAL,GAA6B,IAA7B;AACA,eAAKY,eAAL;AACA,iBAAO,IAAP;AACD;;AAED,YAAIM,KAAJ,GAAY;AACV,iBAAO,KAAKjB,MAAZ;AACD;;AAEDkB,mBAAW;AACT,cAAI,KAAKZ,WAAL,EAAJ,EAAwB;AACtB,mBAAO,IAAP;AACD;;AAED,eAAKL,IAAL,GAAY,KAAKkB,KAAL,EAAZ;AACA,iBAAO,IAAP;AACD;;AAEDb,sBAAc;AACZ,iBAAO,CAAC,CAAC,KAAKL,IAAd;AACD;;AAEDmB,gBAAQC,QAAR,EAAkB;AAChB,eAAKxB,kBAAL,CAAwBuB,OAAxB,CAAiCH,KAAD,IAAWI,SAASJ,KAAT,CAA3C;AACD;;AAEDK,YAAIC,UAAJ,EAAgB;AACd,iBAAO,KAAK1B,kBAAL,CAAwByB,GAAxB,CAA4BC,UAA5B,CAAP;AACD;;AAEDZ,0BAAkB;AAChB,eAAKX,MAAL,GAAcwB,MAAMC,IAAN,CAAW,KAAK5B,kBAAL,CAAwB6B,OAAxB,EAAX,EAA8CC,MAA9C,CAAqD,CAACC,KAAD,EAAQC,KAAR,KAAkB;AACnF,mBAAOD,QAAQC,MAAM,CAAN,EAASZ,KAAxB;AACD,WAFa,EAEX,CAFW,CAAd;AAGD;;AAEDE,gBAAQ;AACN,gBAAMW,SAASvC,MAAMwC,EAAN,CAASD,MAAT,CAAgBE,MAAhB,EAAf;AACAF,iBAAOG,MAAP,CACET,MAAMC,IAAN,CAAW,KAAK5B,kBAAL,CAAwBqC,IAAxB,EAAX,EAA2CC,IAA3C,CAAgD,EAAhD,CADF;AAGA,iBAAOL,OAAOM,MAAP,GAAgBC,KAAhB,EAAP;AACD;AA3F6C;;yBAA3B5C,0B;;;;;;;;6BAAAA,2D","file":"transactionInputCollection.js","sourcesContent":["import forge from 'node_modules/node-forge/dist/forge.min.js';\nimport TransactionOutput from './transactionOutput.js';\n\n/**\n  Intended usage:\n  \n  var inputs = new TransactionInputCollection(sender)\n                    .add(transaction1)\n                    .add(transaction2)\n                    .add(transaction3)\n                    .finalize();\n**/\n\nexport default class TransactionInputCollection {\n  constructor(senderWallet) {\n    this._senderWallet = senderWallet;\n    this._transactionInputs = new Map();\n    this._containsMiningReward = false;\n    this._value = 0;\n    this.hash = null;\n  }\n  \n  get displayName() {\n    if (!this.hash) {\n      return \"#NotAName\";\n    }\n    \n    return \"#\" + this.hash.substring(0, 10);\n  }\n  \n  add(transaction) {\n    if (this.isFinalized()) {\n      return this;\n    }\n    \n    var output = transaction.outputs.get(this._senderWallet.hash);    \n    if (output == null) {\n      // the sender was not credited in the given transaction\n      return this;\n    }\n    \n    this._transactionInputs.set(output.hash, output);\n    this._calculateValue();\n    return this;\n  }\n  \n  addMiningReward(block) {\n    if (this.isFinalized()) {\n      return this;\n    }\n    \n    if (this._containsMiningReward) {\n      // there must only be one mining reward per transaction\n      return this;\n    }\n\n    if (block.minerHash !== this._senderWallet.hash) {\n      throw new Error(\"the block must be mined by the reward receiver\");\n    }\n    \n    var output = new TransactionOutput(this._senderWallet, block.reward);\n    this._transactionInputs.set(output.hash, output);\n    this._containsMiningReward = true;\n    this._calculateValue();\n    return this;\n  }\n  \n  get value() {\n    return this._value;\n  }\n  \n  finalize() {\n    if (this.isFinalized()) {\n      return this;\n    }\n    \n    this.hash = this._hash();\n    return this;\n  }\n  \n  isFinalized() {\n    return !!this.hash;\n  }\n  \n  forEach(callback) {\n    this._transactionInputs.forEach((value) => callback(value));\n  }\n  \n  has(outputHash) {\n    return this._transactionInputs.has(outputHash);\n  }\n  \n  _calculateValue() {\n    this._value = Array.from(this._transactionInputs.entries()).reduce((total, entry) => {\n      return total + entry[1].value;\n    }, 0);\n  }\n  \n  _hash() {\n    const sha256 = forge.md.sha256.create();\n    sha256.update(\n      Array.from(this._transactionInputs.keys()).join('')\n    );\n    return sha256.digest().toHex();\n  }\n}"]}