001package org.consensusj.bitcoinj.signing;
002
003import org.bitcoinj.base.Address;
004import org.bitcoinj.base.Coin;
005import org.bitcoinj.core.Transaction;
006import java.util.List;
007import java.util.Map;
008import java.util.stream.Collectors;
009
010// A SigningRequest should be immutable *and* complete/ready-to-sign. There should be some kind of SigningRequestBuilder
011// to build a SigningRequest.
012/**
013 * A transaction signing request with immutable data specifying the transaction.
014 * <p>
015 * This is an experiment as to what immutable transactions might look like in <b>bitcoinj</b>.
016 * At some point in the future I would like to propose some refactoring in bitcoinj to implement
017 * immutable transactions in a mostly-compatible way with the existing transaction classes.
018 */
019public interface SigningRequest {
020    List<TransactionInputData> inputs();
021    List<TransactionOutputData> outputs();
022
023    static SigningRequest of(List<TransactionInputData> inputs, List<TransactionOutputData> outputs) {
024        return new DefaultSigningRequest(inputs, outputs);
025    }
026
027    static SigningRequest of(List<TransactionInputData> inputs, Map<Address, Coin> outputMap) {
028        List<TransactionOutputData> outs = outputMap.entrySet().stream()
029                .map(e -> new TransactionOutputAddress(e.getValue(), e.getKey()))
030                .collect(Collectors.toList());
031        return SigningRequest.of(inputs, outs);
032    }
033
034    /**
035     * bitcoinj signing (currently) uses mutable {@link Transaction} objects, this convenience method will create
036     * a completed, unsigned bitcoinj {@code Transaction} if you want to use bitcoinj to sign this request.
037     * @return an unsigned bitcoinj transaction
038     */
039    Transaction toUnsignedTransaction();
040}