{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-stable/src/blockchain/model/wallet/wallet.js"],"names":["forge","TransactionInputCollection","TransactionOutputCollection","Transaction","TRANSACTION_FEES","Wallet","constructor","rsaKeyPair","_generateKeyPair","publicKey","_privateKey","privateKey","hash","_hash","_receivedTransactions","_value","displayName","substring","sign","rsa","pki","generateKeyPair","bits","e","sha256Date","md","sha256","create","dateHash","update","Date","now","sha256Wallet","digest","toHex","transactionsChanged","value","reduce","previousValue","transaction","outputs","get","receive","has","push","newTransaction","receivers","inputAmount","sum","Error","inputCollection","add","pop","finalize","outputCollection","forEach","receiver"],"mappings":";;;;;;AAAOA,W;;AACAC,gC;;AACAC,iC;;AACAC,iB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEP,YAAMC,mBAAmB,GAAzB;;;;;;;;;;;;;;;AAEe,YAAMC,MAAN,CAAa;AAC1BC,sBAAc;AACZ,cAAIC,aAAa,KAAKC,gBAAL,EAAjB;;AAEA,eAAKC,SAAL,GAAiBF,WAAWE,SAA5B;AACA,eAAKC,WAAL,GAAmBH,WAAWI,UAA9B;AACA,eAAKC,IAAL,GAAY,KAAKC,KAAL,EAAZ;AACA,eAAKC,qBAAL,GAA6B,EAA7B;AACA,eAAKC,MAAL,GAAc,CAAd;AACD;;AAED,YAAIC,WAAJ,GAAkB;AAChB,cAAI,CAAC,KAAKJ,IAAV,EAAgB;AACd,mBAAO,WAAP;AACD;;AAED,iBAAO,MAAM,KAAKA,IAAL,CAAUK,SAAV,CAAoB,CAApB,EAAuB,EAAvB,CAAb;AACD;;AAEDC,aAAKN,IAAL,EAAW;AACT,iBAAO,KAAKF,WAAL,CAAiBQ,IAAjB,CAAsBN,IAAtB,CAAP;AACD;;AAEDJ,2BAAmB;AACjB,cAAIW,MAAMnB,MAAMoB,GAAN,CAAUD,GAApB;AACA,iBAAOA,IAAIE,eAAJ,CAAoB,EAACC,MAAM,GAAP,EAAYC,GAAG,OAAf,EAApB,CAAP;AACD;;AAEDV,gBAAQ;AACN,gBAAMW,aAAaxB,MAAMyB,EAAN,CAASC,MAAT,CAAgBC,MAAhB,EAAnB;AACA,gBAAMC,WAAWJ,WAAWK,MAAX,CAAkBC,KAAKC,GAAL,EAAlB,CAAjB;;AAEA,gBAAMC,eAAehC,MAAMyB,EAAN,CAASC,MAAT,CAAgBC,MAAhB,EAArB;AACAK,uBAAaH,MAAb,CAAoB,KAAKX,IAAL,CAAUU,QAAV,CAApB;AACA,iBAAOI,aAAaC,MAAb,GAAsBC,KAAtB,EAAP;AACD;;AAEDC,8BAAsB;AACrB,eAAKC,KAAL,GAAa,KAAKtB,qBAAL,CAA2BuB,MAA3B,CAAkC,CAACC,aAAD,EAAgBC,WAAhB,KAAgC;AAC5E,mBAAOD,gBAAgBC,YAAYC,OAAZ,CAAoBC,GAApB,CAAwB,KAAK7B,IAA7B,EAAmCwB,KAA1D;AACD,WAFW,EAET,CAFS,CAAb;AAGA;;AAED,YAAIA,KAAJ,CAAUA,KAAV,EAAiB;AACf,eAAKrB,MAAL,GAAcqB,KAAd;AACD;;AAED,YAAIA,KAAJ,GAAY;AACV,iBAAO,KAAKrB,MAAZ;AACD;;AAED2B,gBAAQH,WAAR,EAAqB;AACnB,cAAI,CAACA,YAAYC,OAAZ,CAAoBG,GAApB,CAAwB,KAAK/B,IAA7B,CAAL,EAAyC;AACvC;AACD;AACD,eAAKE,qBAAL,CAA2B8B,IAA3B,CAAgCL,WAAhC;AACA,eAAKJ,mBAAL;AACD;;AAEDU,uBAAeC,SAAf,EAA0B;AACxB,cAAIC,cAAcD,UAAUT,MAAV,CAAiB,CAACW,GAAD,EAAMT,WAAN,KAAsB;AACvD,mBAAOS,MAAMT,YAAYH,KAAzB;AACD,WAFiB,EAEf,CAFe,CAAlB;;AAIAW,yBAAe3C,gBAAf;;AAEA,cAAI2C,cAAc,KAAKX,KAAvB,EAA8B;AAC5B,kBAAM,IAAIa,KAAJ,CAAU,+CAAV,CAAN;AACD;;AAED,cAAIF,eAAe,CAAnB,EAAsB;AACpB,kBAAM,IAAIE,KAAJ,CAAU,iDAAV,CAAN;AACD;;AAED,gBAAMC,kBAAkB,IAAIjD,0BAAJ,CAA+B,IAA/B,CAAxB;AACA,iBAAMiD,gBAAgBd,KAAhB,GAAwBW,WAA9B,EAA2C;AACzCG,4BAAgBC,GAAhB,CAAoB,KAAKrC,qBAAL,CAA2BsC,GAA3B,EAApB;AACD;AACDF,0BAAgBG,QAAhB;;AAEA,eAAKlB,mBAAL;;AAEA,gBAAMmB,mBAAmB,IAAIpD,2BAAJ,GAAkCiD,GAAlC,CAAsC,IAAtC,EAA4CD,gBAAgBd,KAAhB,GAAwBW,WAApE,CAAzB;AACAD,oBAAUS,OAAV,CAAkBC,YAAY;AAC5BF,6BAAiBH,GAAjB,CAAqBK,SAASA,QAA9B,EAAwCA,SAASpB,KAAjD;AACD,WAFD;AAGAkB,2BAAiBD,QAAjB;;AAEA,iBAAO,IAAIlD,WAAJ,CAAgB,IAAhB,EAAsB+C,eAAtB,EAAuCI,gBAAvC,CAAP;AACD;AAzFyB;;yBAAPjD,M","file":"wallet.js","sourcesContent":["import forge from 'node_modules/node-forge/dist/forge.min.js';\nimport TransactionInputCollection from 'src/blockchain/model/transaction/transactionInputCollection.js';\nimport TransactionOutputCollection from 'src/blockchain/model/transaction/transactionOutputCollection.js';\nimport Transaction from 'src/blockchain/model/transaction/transaction.js';\n\nconst TRANSACTION_FEES = 1.5;\n\nexport default class Wallet {\n  constructor() {\n    var rsaKeyPair = this._generateKeyPair();\n    \n    this.publicKey = rsaKeyPair.publicKey;\n    this._privateKey = rsaKeyPair.privateKey;\n    this.hash = this._hash(); \n    this._receivedTransactions = [];\n    this._value = 0;\n  }\n  \n  get displayName() {\n    if (!this.hash) {\n      return \"#NotAName\";\n    }\n    \n    return \"#\" + this.hash.substring(0, 10);\n  }\n   \n  sign(hash) {\n    return this._privateKey.sign(hash);\n  }\n  \n  _generateKeyPair() {\n    var rsa = forge.pki.rsa;\n    return rsa.generateKeyPair({bits: 512, e: 0x10001});\n  }\n  \n  _hash() {\n    const sha256Date = forge.md.sha256.create();\n    const dateHash = sha256Date.update(Date.now());\n    \n    const sha256Wallet = forge.md.sha256.create();\n    sha256Wallet.update(this.sign(dateHash));\n    return sha256Wallet.digest().toHex();\n  }\n  \n  transactionsChanged() {\n   this.value = this._receivedTransactions.reduce((previousValue, transaction) => {\n      return previousValue + transaction.outputs.get(this.hash).value;\n    }, 0);\n  }\n  \n  set value(value) {\n    this._value = value;\n  }\n  \n  get value() {\n    return this._value;\n  }\n  \n  receive(transaction) {\n    if (!transaction.outputs.has(this.hash)) {\n      return;\n    }\n    this._receivedTransactions.push(transaction);\n    this.transactionsChanged();\n  }\n  \n  newTransaction(receivers) {\n    let inputAmount = receivers.reduce((sum, transaction) => { \n      return sum + transaction.value \n    }, 0);\n    \n    inputAmount += TRANSACTION_FEES;\n    \n    if (inputAmount > this.value) {\n      throw new Error('Can not create transaction - not enough money');\n    }\n    \n    if (inputAmount <= 0) {\n      throw new Error('Can not send transaction with output value <= 0');\n    }\n    \n    const inputCollection = new TransactionInputCollection(this);\n    while(inputCollection.value < inputAmount) {\n      inputCollection.add(this._receivedTransactions.pop());\n    }\n    inputCollection.finalize();\n    \n    this.transactionsChanged();\n    \n    const outputCollection = new TransactionOutputCollection().add(this, inputCollection.value - inputAmount);\n    receivers.forEach(receiver => {\n      outputCollection.add(receiver.receiver, receiver.value);\n    });\n    outputCollection.finalize();\n    \n    return new Transaction(this, inputCollection, outputCollection);\n  }\n}"]}