/** * @param int $sighashType * @param int $inputToSign * @return Buffer|BufferInterface */ public function hashOutputs($sighashType, $inputToSign) { if (($sighashType & 0x1f) !== SigHash::SINGLE && ($sighashType & 0x1f) != SigHash::NONE) { $binary = ''; foreach ($this->transaction->getOutputs() as $output) { $binary .= $output->getBinary(); } return Hash::sha256d(new Buffer($binary)); } elseif (($sighashType & 0x1f) == SigHash::SINGLE && $inputToSign < count($this->transaction->getOutputs())) { return Hash::sha256($this->transaction->getOutput($inputToSign)->getBuffer()); } return new Buffer('', 32); }
/** * @param TransactionInterface $transaction */ private function processTransaction(TransactionInterface $transaction) { $results = []; $nOut = count($transaction->getOutputs()); for ($i = 0; $i < $nOut; $i++) { $output = $transaction->getOutput($i); $script = $output->getScript()->getBinary(); if (!isset($results[$script])) { $results[$script] = $output->getValue(); } else { $results[$script] += $output->getValue(); } } // Compare results to known contracts foreach ($this->contracts as $contract) { $requirements = $contract['requirements']; $rCount = count($requirements); $have = 0; foreach ($requirements as $script => $value) { if (isset($results[$script])) { echo 'pmt'; if ($results[$script] >= $value) { $have++; } } } if ($have > 0) { if ($have < $rCount) { $command = 'tx.partial'; } else { $command = 'tx.complete'; } $this->listener->send(json_encode(['slug' => $contract['slug'], 'command' => $command, 'tx' => $transaction->getHex()])); } } }
/** * @param TransactionInterface $transaction * @param int $outputToSpend * @param ScriptInterface|null $script * @param int $nSequence * @return $this */ public function spendOutputFrom(TransactionInterface $transaction, $outputToSpend, ScriptInterface $script = null, $nSequence = TransactionInputInterface::SEQUENCE_FINAL) { // Check TransactionOutput exists in $tx $transaction->getOutput($outputToSpend); $this->input($transaction->getTxId(), $outputToSpend, $script, $nSequence); return $this; }