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}