<?php
namespace BitWasp\Bitcoin\Serializer\Transaction;
use BitWasp\Bitcoin\Script\Opcodes;
use BitWasp\Bitcoin\Script\Script;
use BitWasp\Bitcoin\Serializer\Types;
use BitWasp\Bitcoin\Transaction\TransactionOutput;
use BitWasp\Bitcoin\Transaction\TransactionOutputInterface;
use BitWasp\Buffertools\Buffer;
use BitWasp\Buffertools\BufferInterface;
use BitWasp\Buffertools\Parser;
class TransactionOutputSerializer
{
/**
* @var \BitWasp\Buffertools\Types\Uint64
*/
private $uint64le;
/**
* @var \BitWasp\Buffertools\Types\VarString
*/
private $varstring;
/**
* @var Opcodes
*/
private $opcodes;
/**
* TransactionOutputSerializer constructor.
* @param Opcodes|null $opcodes
*/
public function __construct(Opcodes $opcodes = null)
{
$this->uint64le = Types::uint64le();
$this->varstring = Types::varstring();
$this->opcodes = $opcodes ?: new Opcodes();
}
/**
* @param TransactionOutputInterface $output
* @return BufferInterface
*/
public function serialize(TransactionOutputInterface $output)
{
return new Buffer(
$this->uint64le->write($output->getValue()) .
$this->varstring->write($output->getScript()->getBuffer())
);
}
/**
* @param Parser $parser
* @return TransactionOutput
* @throws \BitWasp\Buffertools\Exceptions\ParserOutOfRange
*/
public function fromParser(Parser $parser)
{
return new TransactionOutput(
$this->uint64le->read($parser),
new Script($this->varstring->read($parser), $this->opcodes)
);
}
/**
* @param string $string
* @return TransactionOutput
* @throws \BitWasp\Buffertools\Exceptions\ParserOutOfRange
*/
public function parse($string)
{
return $this->fromParser(new Parser($string));
}
}