{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-stable/src/blockchain/model/blockchainNode/blockchainNode.js"],"names":["Blockchain","NetworkComponent","Wallet","Miner","BlockchainNode","constructor","_hasExited","_wallet","_blockchain","_networkComponent","_miner","requestBlockchain","_subscribers","blockchain","wallet","hasExited","exit","mine","subscribe","lSubscriber","callback","push","subscriber","unsubscribe","filter","item","sendTransaction","receivers","tx","newTransaction","propagateTransaction","blockchainIsValid","currentBlock","headOfChain","counter","isVerified","get","previousHash","size","handleBlock","block","invalidateTransactions","transactions","forEach","transaction","receive","add","_notifySubscribers","handleTransaction","addTransaction","handleBlockchain","propagateBlock"],"mappings":"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","file":"blockchainNode.js","sourcesContent":["import Blockchain from \"../blockchain/blockchain.js\";\nimport NetworkComponent from \"./networkComponent.js\";\nimport Wallet from \"../wallet/wallet.js\";\nimport Miner from \"./miner.js\";\n\n\nexport default class BlockchainNode {\n  \n  constructor() {\n    this._hasExited = false;\n    this._wallet = new Wallet();\n    this._blockchain = new Blockchain(this._wallet);\n    this._networkComponent = new NetworkComponent(this);\n    this._miner = new Miner(this);\n    this._networkComponent.requestBlockchain();\n    this._subscribers = [];\n  }\n  \n  get blockchain() {\n    return this._blockchain;\n  }\n  \n  get wallet() {\n    return this._wallet;\n  }\n  \n  get hasExited() {\n    return this._hasExited;\n  }\n  \n  exit() {\n    this._hasExited = true;\n  }\n  \n  async mine() {\n    await this._miner.mine();\n  }\n  \n  subscribe(lSubscriber, callback) {\n    this._subscribers.push({subscriber: lSubscriber, callback: callback});\n  }\n  \n  unsubscribe(lSubscriber) {\n    this._subscribers = this._subscribers.filter(\n      item => item.subscriber !== lSubscriber\n    );\n  }\n  \n  sendTransaction(receivers) {\n    const tx = this.wallet.newTransaction(receivers);\n    this.propagateTransaction(tx);\n    \n    return tx;\n  }\n  \n  blockchainIsValid(blockchain) {\n    // Currently double spend check is not implemented\n    let currentBlock = blockchain.headOfChain;\n    let counter = 0;\n    while(currentBlock) {\n      counter += 1;\n      if(!currentBlock.isVerified()) {\n        return false;\n      }\n      currentBlock = blockchain.get(currentBlock.previousHash);\n    }\n    if(counter != blockchain.size()) {\n      return false;\n    }\n    return true;\n  }\n  \n  handleBlock(block) {\n    this._miner.invalidateTransactions(block);\n    block.transactions.forEach(transaction => this.wallet.receive(transaction));\n    this._blockchain.add(block);\n    this._notifySubscribers(block);\n  }\n  \n  handleTransaction(transaction) {\n    if(!transaction.isVerified()) {\n      // only accept verified transactions\n      return;\n    }\n    this._miner.addTransaction(transaction);\n  }\n  \n  handleBlockchain(blockchain) {\n    if(!blockchain) {\n      return;\n    }\n    //TODO: Validate blockchain before saving\n    this._blockchain = blockchain;\n  }\n  \n  // Sending to other nodes (via network component)\n  \n  propagateBlock(block) {\n    this.handleBlock(block);\n    this._networkComponent.propagateBlock(block);\n  }\n  \n  propagateTransaction(transaction) {\n    this.handleTransaction(transaction);\n    this._networkComponent.propagateTransaction(transaction);\n  }\n  \n  _notifySubscribers(block) {\n    this._subscribers.forEach(item => item.callback(block));\n  }\n    \n}"]}