{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-stable/src/blockchain/model/transaction/transaction.js"],"names":["forge","Transaction","constructor","senderWallet","inputCollection","outputCollection","timestamp","Date","now","senderHash","hash","senderPublicKey","publicKey","inputs","outputs","_hash","digest","toHex","signature","_generateSignature","forEach","output","transactionHash","displayName","substring","isSigned","isVerified","verify","bytes","inputValue","value","outputValue","fees","Error","sign","sha256","md","create","update"],"mappings":";;;;;;AAAOA,W;;;;;;;;;;;;;;;;;;AAEQ,YAAMC,WAAN,CAAkB;AAC/BC,oBAAYC,YAAZ,EAA0BC,eAA1B,EAA2CC,gBAA3C,EAA6D;AAC3D,eAAKC,SAAL,GAAiBC,KAAKC,GAAL,EAAjB;AACA,eAAKC,UAAL,GAAkBN,aAAaO,IAA/B;AACA,eAAKC,eAAL,GAAuBR,aAAaS,SAApC;AACA,eAAKC,MAAL,GAAcT,eAAd;AACA,eAAKU,OAAL,GAAeT,gBAAf;AACA,eAAKK,IAAL,GAAY,KAAKK,KAAL,GAAaC,MAAb,GAAsBC,KAAtB,EAAZ;AACA,eAAKC,SAAL,GAAiB,KAAKC,kBAAL,CAAwBhB,YAAxB,CAAjB;;AAEA;AACA,eAAKW,OAAL,CAAaM,OAAb,CAAsBC,MAAD,IAAYA,OAAOC,eAAP,GAAyB,KAAKZ,IAA/D;AACD;;AAED,YAAIa,WAAJ,GAAkB;AAChB,cAAI,CAAC,KAAKb,IAAV,EAAgB;AACd,mBAAO,WAAP;AACD;;AAED,iBAAO,MAAM,KAAKA,IAAL,CAAUc,SAAV,CAAoB,CAApB,EAAuB,EAAvB,CAAb;AACD;;AAEDC,mBAAW;AACT,iBAAO,CAAC,CAAC,KAAKP,SAAd;AACD;;AAEDQ,qBAAa;AACX,cAAI,CAAC,KAAKD,QAAL,EAAL,EAAsB;AACpB,mBAAO,KAAP;AACD;;AAED;AACA;AACA,cAAIf,OAAO,KAAKK,KAAL,EAAX;;AAEA;AACA,iBAAO,KAAKJ,eAAL,CAAqBgB,MAArB,CAA4BjB,KAAKM,MAAL,GAAcY,KAAd,EAA5B,EAAmD,KAAKV,SAAxD,CAAP;AACD;;AAED,YAAIW,UAAJ,GAAiB;AACf,iBAAO,KAAKhB,MAAL,CAAYiB,KAAnB;AACD;;AAED,YAAIC,WAAJ,GAAkB;AAChB,iBAAO,KAAKjB,OAAL,CAAagB,KAApB;AACD;;AAED,YAAIE,IAAJ,GAAW;AACT,iBAAO,KAAKH,UAAL,GAAkB,KAAKE,WAA9B;AACD;;AAEDZ,2BAAmBhB,YAAnB,EAAiC;AAC/B,cAAI,KAAKsB,QAAL,EAAJ,EAAqB;AACnB,mBAAO,IAAP;AACD;;AAED,cAAI,KAAKO,IAAL,GAAY,CAAhB,EAAmB;AACjB,kBAAM,IAAIC,KAAJ,CAAU,sBAAV,CAAN;AACD;;AAED;AACA;AACA;AACA,iBAAO9B,aAAa+B,IAAb,CAAkB,KAAKnB,KAAL,EAAlB,CAAP;AACD;;AAEDA,gBAAQ;AACN,gBAAMoB,SAASnC,MAAMoC,EAAN,CAASD,MAAT,CAAgBE,MAAhB,EAAf;AACA,iBAAOF,OAAOG,MAAP,CACL,KAAKhC,SAAL,GACA,KAAKG,UADL,GAEA,KAAKE,eAFL,GAGA,KAAKE,MAAL,CAAYH,IAHZ,GAIA,KAAKI,OAAL,CAAaJ,IALR,CAAP;AAOD;AA3E8B;;yBAAZT,W","file":"transaction.js","sourcesContent":["import forge from 'node_modules/node-forge/dist/forge.min.js';\n\nexport default class Transaction {\n  constructor(senderWallet, inputCollection, outputCollection) {\n    this.timestamp = Date.now();\n    this.senderHash = senderWallet.hash;\n    this.senderPublicKey = senderWallet.publicKey;\n    this.inputs = inputCollection;\n    this.outputs = outputCollection;    \n    this.hash = this._hash().digest().toHex();\n    this.signature = this._generateSignature(senderWallet);\n    \n    // set transaction hash for outputs\n    this.outputs.forEach((output) => output.transactionHash = this.hash);\n  }\n  \n  get displayName() {\n    if (!this.hash) {\n      return \"#NotAName\";\n    }\n    \n    return \"#\" + this.hash.substring(0, 10);\n  }\n  \n  isSigned() {\n    return !!this.signature;\n  }\n  \n  isVerified() {\n    if (!this.isSigned()) {\n      return false;\n    }\n    \n    // recalculate hash for comparison\n    // if anything was changed, this hash will not match the encrypted hash (signature)\n    var hash = this._hash();\n    \n    // decrypt the signature using the public key (==> hash) and compare with the hash we just calculated\n    return this.senderPublicKey.verify(hash.digest().bytes(), this.signature);\n  }\n  \n  get inputValue() {\n    return this.inputs.value;\n  }\n  \n  get outputValue() {\n    return this.outputs.value;\n  }\n  \n  get fees() {\n    return this.inputValue - this.outputValue;\n  }\n  \n  _generateSignature(senderWallet) {\n    if (this.isSigned()) {\n      return this;\n    }\n    \n    if (this.fees < 0) {\n      throw new Error(\"Fee must be positive\");\n    }\n    \n    // encrypt the hash using the given private key\n    // this allows us to decrypt the signature later\n    // on using the matching public key\n    return senderWallet.sign(this._hash());\n  }\n  \n  _hash() {\n    const sha256 = forge.md.sha256.create();\n    return sha256.update(\n      this.timestamp + \n      this.senderHash + \n      this.senderPublicKey + \n      this.inputs.hash + \n      this.outputs.hash\n    );\n  }\n}"]}