{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-stable/src/blockchain/model/blockchain/blockchain.js"],"names":["GenesisBlock","Blockchain","constructor","wallet","_blocks","Map","headOfChain","set","hash","size","add","block","isVerified","previousHash","Error","getBlock","get","isValid","blocks","Array","from","reverse","i","length","_hash","digest","toHex","forEach","callback","value"],"mappings":";;;;;;AAAOA,kB;;;;;;;;;;;;;;;;;;AAEQ,YAAMC,UAAN,CAAiB;AAC9BC,oBAAYC,MAAZ,EAAoB;AAClB,eAAKC,OAAL,GAAe,IAAIC,GAAJ,EAAf;AACA,eAAKC,WAAL,GAAmB,IAAIN,YAAJ,CAAiBG,MAAjB,CAAnB;AACA,eAAKC,OAAL,CAAaG,GAAb,CAAiB,KAAKD,WAAL,CAAiBE,IAAlC,EAAwC,KAAKF,WAA7C;AACD;;AAEDG,eAAO;AACL,iBAAO,KAAKL,OAAL,CAAaK,IAApB;AACD;;AAEDC,YAAIC,KAAJ,EAAW;AACT,cAAG,CAACA,MAAMC,UAAN,EAAJ,EAAwB;AACtB;AACA;AACD;AACD,cAAGD,MAAME,YAAN,IAAsB,KAAKP,WAAL,CAAiBE,IAA1C,EAAgD;AAC9C,kBAAM,IAAIM,KAAJ,CAAU,wEAAV,CAAN;AACD;AACD,eAAKV,OAAL,CAAaG,GAAb,CAAiBI,MAAMH,IAAvB,EAA6BG,KAA7B;AACA,eAAKL,WAAL,GAAmBK,KAAnB;AACD;;AAEDI,iBAASP,IAAT,EAAe;AACb,iBAAO,KAAKJ,OAAL,CAAaY,GAAb,CAAiBR,IAAjB,CAAP;AACD;;AAEDS,kBAAU;AACR,gBAAMC,SAASC,MAAMC,IAAN,CAAW,KAAKhB,OAAhB,EAAyBiB,OAAzB,EAAf;AACA,eAAI,IAAIC,IAAI,CAAZ,EAAeA,IAAIJ,OAAOK,MAA1B,EAAkCD,GAAlC,EAAuC;AACrC,gBAAIJ,OAAOI,CAAP,EAAU,CAAV,EAAaT,YAAb,KAA8B,EAA9B,IAAoCS,MAAMJ,OAAOK,MAAP,GAAgB,CAA9D,EAAiE;AAC9D,qBAAO,IAAP;AACF;;AAED,gBAAGL,OAAOI,CAAP,EAAU,CAAV,EAAad,IAAb,KAAsBU,OAAOI,CAAP,EAAU,CAAV,EAAaE,KAAb,GAAqBC,MAArB,GAA8BC,KAA9B,EAAzB,EAAgE;AAC9D,qBAAO,KAAP;AACD;;AAED,gBAAI,KAAKtB,OAAL,CAAaY,GAAb,CAAiBE,OAAOI,CAAP,EAAU,CAAV,EAAaT,YAA9B,EAA4CL,IAA5C,KAAqDU,OAAOI,CAAP,EAAU,CAAV,EAAaT,YAAtE,EAAoF;AAClF,qBAAO,KAAP;AACD;AACF;AACF;;AAEDc,gBAAQC,QAAR,EAAkB;AAChB,eAAKxB,OAAL,CAAauB,OAAb,CAAsBE,KAAD,IAAWD,SAASC,KAAT,CAAhC;AACD;;AA9C6B;;yBAAX5B,U","file":"blockchain.js","sourcesContent":["import GenesisBlock from './genesisBlock.js';\n\nexport default class Blockchain {\n  constructor(wallet) {\n    this._blocks = new Map();\n    this.headOfChain = new GenesisBlock(wallet);\n    this._blocks.set(this.headOfChain.hash, this.headOfChain);\n  }\n  \n  size() {\n    return this._blocks.size;\n  }\n  \n  add(block) {\n    if(!block.isVerified()) {\n      // only accept valid blocks\n      return;\n    }\n    if(block.previousHash != this.headOfChain.hash) {\n      throw new Error('The block to be added does not reference the previous block correctly!')\n    }\n    this._blocks.set(block.hash, block);\n    this.headOfChain = block;\n  }\n  \n  getBlock(hash) {\n    return this._blocks.get(hash);\n  }\n  \n  isValid() {\n    const blocks = Array.from(this._blocks).reverse();\n    for(let i = 0; i < blocks.length; i++) {\n      if (blocks[i][1].previousHash === \"\" && i === blocks.length - 1) {\n         return true;\n      }\n      \n      if(blocks[i][1].hash !== blocks[i][1]._hash().digest().toHex()) {\n        return false;\n      }\n      \n      if (this._blocks.get(blocks[i][1].previousHash).hash !== blocks[i][1].previousHash) {\n        return false;\n      }\n    }\n  }\n  \n  forEach(callback) {\n    this._blocks.forEach((value) => callback(value));\n  }\n\n}"]}