Hi,
I am creating an online wallet & I am using C# (WebAPI) as my backed scripting language.
I am also using NBitcoin & QBitninja NuGet packages developed by NicolasDorier.
Some how I created a verified transaction but network is not able to broadcast that transaction.
Command:- bitcoin-cli signrawtransaction 010000000001012be
973e52a7f8efbc91ef9c397a81df05c047e8138c76920fd9225df19aaea360000000000ffffffff 0
2a4c0e400000000001976a9140ecd86fcda32df67e7cbd989eddd38d00bb2504f88ac40420f0000 0
000001976a9145da61fbc2b8de68bbe1b666b4e84bec9d2e3edae88ac02473044022061199488e5 a
5fe9c3db4678eadc08b92de1d0881dd13ac3af5b39b15543ae4c202205ff7aeead9ba8c3f4bc89a c
0614802ae19f781be8bfa8c74fb01bd50b96c7cf4012103e970de664249bb560ec1501ea8a98571 d
a983c899ee02888d6e41aaab2ff56b300000000
Err. :-
{
"hex": "010000000001012be973e52a7f8efbc91ef9c397a81df05c047e8138c76920fd9225df
19aaea360000000000ffffffff02a4c0e400000000001976a9140ecd86fcda32df67e7cbd989edd d
38d00bb2504f88ac40420f00000000001976a9145da61fbc2b8de68bbe1b666b4e84bec9d2e3eda e
88ac02473044022061199488e5a5fe9c3db4678eadc08b92de1d0881dd13ac3af5b39b15543ae4c 2
02205ff7aeead9ba8c3f4bc89ac0614802ae19f781be8bfa8c74fb01bd50b96c7cf4012103e970d e
664249bb560ec1501ea8a98571da983c899ee02888d6e41aaab2ff56b300000000",
"complete": false,
"errors": [
{
"txid": "36eaaa19df2592fd2069c738817e045cf01da897c3f91ec9fb8e7f2ae573e92b"
,
"vout": 0,
"scriptSig": "",
"sequence": 4294967295,
"error": "Input not found or already spent"
}
]
}
Demo Code :-
public string SendBitCoins(int userId, int walletID, string destinationAddress, decimal amount)
{
try
{
var masterKey = new GetMasterWallet(userId);
var privateKey = masterKey.PrivateKey;
Money fee = Money.Satoshis(8476);
Money transactionAmount = Money.Satoshis(Convert.ToInt64(amount * 100000000));
var transaction = CreateTransaction(userId, walletID, privateKey.PubKey,transactionAmount,fee, masterKey);
var transactionhex = BuildTransaction(transaction,privateKey, destinationAddress, amount, fee);
return transactionhex;
}
catch (Exception)
{
throw;
}
}
public Transaction CreateTransaction(int userID,int userWalletID, PubKey sourcePublicKey, Money amount, Money fee, ExtKey masterwallet)
{
try
{
var init = new Transaction();
if (userWalletID != 0)
{
var client = new QBitNinjaClient(Network.TestNet);
var totalAmount = amount + fee;
long transactionAmount = 0;
var userRequestAddress = _unitOfWork.UserRequestAddressRepository
.GetManyQueryable(x => x.UserID == userID &&
x.UserWalletID == userWalletID && x.Amount > 0 && !x.IsActive);
var userPrivateWalletKey = new UserWalletChainService(_unitOfWork).GetUserWalletKey(userWalletID, masterwallet);
var userPublicWalletKey = userPrivateWalletKey.Neuter();
userRequestAddress.ToList().ForEach(x => {
var extPubKey = userPublicWalletKey.Derive(
new KeyPath(Convert.ToString(x.ChainDerivationKey)));
//var extPrivateKey = userPrivateWalletKey.Derive(
// new KeyPath(Convert.ToString(x.ChainDerivationKey)));
client.GetBalance(extPubKey.PubKey.Hash.GetAddress(Network.TestNet), true)
.Result.Operations.ToList().ForEach(z => {
z.ReceivedCoins.ForEach(l => {
if (totalAmount.Satoshi > transactionAmount)
//init.Outputs.Add(new TxOut(Money.Coins(1m), GetP2WPKH(sourcePublicKey)));
init.Outputs.Add(new TxOut(Money.Coins(Convert.ToDecimal((l.Amount as Money).Satoshi) / 100000000), GetP2WPKH(sourcePublicKey)));
//init.Outputs.Add(new TxOut(Money.Coins(Convert.ToDecimal((l.Amount as Money).Satoshi) / 100000000), GetP2WPKH(userPrivateWalletKey.PrivateKey.PubKey)));
transactionAmount += (l.Amount as Money).Satoshi;
});
});
});
}
//init.Outputs.Add(new TxOut(Money.Coins(1m), GetP2WPKH(sourcePublicKey)));
return init;
}
catch (Exception)
{
throw;
}
}
public string BuildTransaction(Transaction transaction, Key sourcePriveatKey, string destinationAddress,decimal amount,Money fee)
{
TransactionBuilder builder = null;
try
{
var destination = BitcoinAddress.Create(destinationAddress).ScriptPubKey;
Coin[] coins = transaction.Outputs.AsCoins().ToArray();
builder = new TransactionBuilder();
Transaction tx = builder
.AddCoins(coins[0])
.AddKeys(sourcePriveatKey)
.Send(destination, Money.Coins(amount))
.SetChange(sourcePriveatKey)
.SendFees(fee)
.BuildTransaction(sign: true);
if (builder.Verify(tx))
return tx.ToHex();
else
return "";
}
catch (Exception)
{
throw;
}
}
please give me some suggestion is anybody knows what I am doing wrong.