package io.emax.cosigner.bitcoin.stubrpc; import io.emax.cosigner.bitcoin.BitcoinConfiguration; import io.emax.cosigner.bitcoin.BitcoinWallet; import io.emax.cosigner.bitcoin.bitcoindrpc.BitcoindRpc; import io.emax.cosigner.bitcoin.bitcoindrpc.BlockChainInfo; import io.emax.cosigner.bitcoin.bitcoindrpc.BlockChainName; import io.emax.cosigner.bitcoin.bitcoindrpc.MultiSig; import io.emax.cosigner.bitcoin.bitcoindrpc.Outpoint; import io.emax.cosigner.bitcoin.bitcoindrpc.OutpointDetails; import io.emax.cosigner.bitcoin.bitcoindrpc.Output; import io.emax.cosigner.bitcoin.bitcoindrpc.Payment; import io.emax.cosigner.bitcoin.bitcoindrpc.SigHash; import io.emax.cosigner.bitcoin.bitcoindrpc.SignedTransaction; import io.emax.cosigner.bitcoin.common.BitcoinTools; import io.emax.cosigner.common.ByteUtilities; import org.joda.time.DateTime; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; public class BitcoinTestRpc implements BitcoindRpc { @Override public BlockChainInfo getblockchaininfo() { BlockChainInfo info = new BlockChainInfo(); info.setChain(BlockChainName.regtest); return info; } @Override public long getBlockCount() { return 0; } @Override public String getBlockHash(long blockHeight) { return "12abeed"; } @Override public Map<String, Object> getBlock(String blockHash) { HashMap<String, Object> result = new HashMap<>(); result.put("time", ((Long) (DateTime.now().getMillis() / 1000)).toString()); return result; } @Override public String createrawtransaction(Outpoint[] unspentOutputs, Map<String, BigDecimal> addressAmounts) { return "deadbeefdeadbeefdeadbeefdeadbeef"; } @Override public String getrawtransaction(String transactionId) { return null; } @Override public String sendrawtransaction(String transaction, boolean allowHighFees) { return "0x1234567890"; } @Override public SignedTransaction signrawtransaction(String transaction, OutpointDetails[] outputs, String[] privateKeys, SigHash sigHash) { SignedTransaction signedTx = new SignedTransaction(); signedTx.setTransaction(transaction + "1234"); signedTx.setComplete(true); return signedTx; } @Override public String addmultisigaddress(int nrequired, String[] keys, String account) { return null; } @Override public MultiSig createmultisig(int nrequired, String[] keys) { MultiSig multiSig = new MultiSig(); multiSig.setAddress("2sjJ8zfnqZbkYj79EBtJLN4CDNPRg4s9xn"); multiSig.setRedeemScript(""); return multiSig; } @Override public String[] getaddressesbyaccount(String accountName) { return new String[]{}; } @Override public String getnewaddress(String accountName) { return null; } @Override public void importaddress(String addressOrScript, String account, boolean rescan) { } @Override public Map<String, BigDecimal> listaccounts(int confirmations, boolean includeWatchOnly) { return null; } @Override public Output[] listunspent(int minimumConfirmations, int maximumConfirmations, String[] addresses) { Output output = new Output(); output.setAccount(""); output.setAddress(new BitcoinWallet(new BitcoinConfiguration()).createAddress("deadbeef")); output.setAmount(BigDecimal.valueOf(30)); output.setConfirmations(minimumConfirmations); output.setOutputIndex(1); output.setTransactionId("00000000000000000000000000000000000000000000000000000000deadbeef"); String decodedAddress = BitcoinTools.decodeAddress(output.getAddress()); byte[] addressBytes = ByteUtilities.toByteArray(decodedAddress); String scriptData = "76a914"; scriptData += ByteUtilities.toHexString(addressBytes); scriptData += "88ac"; output.setScriptPubKey(scriptData); return new Output[]{output}; } @Override public Payment[] listtransactions(String account, int numberToReturn, int numberToSkip, boolean includeWatchOnly) { return new Payment[]{}; } @Override public Map<String, Object> gettransaction(String txid, boolean includeWatchOnly) { return null; } }