forked from Qortal/qortal
Added PirateChainHTLC.getUnspentFundingTxid(), allowing a minimum amount to be specified.
This will ensure that the correct fundingTxid can be redeemed or refunded by the trade bot.
This commit is contained in:
parent
08fab451d2
commit
9c02b01318
@ -236,6 +236,37 @@ public class PirateChainHTLC {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a string containing the unspent txid of the transaction that funded supplied <tt>p2shAddress</tt>
|
||||||
|
* and is at least the value specified in <tt>minimumAmount</tt>
|
||||||
|
* <p>
|
||||||
|
* @throws ForeignBlockchainException if error occurs
|
||||||
|
*/
|
||||||
|
public static String getUnspentFundingTxid(BitcoinyBlockchainProvider blockchain, String p2shAddress, long minimumAmount) throws ForeignBlockchainException {
|
||||||
|
byte[] ourScriptPubKey = addressToScriptPubKey(p2shAddress);
|
||||||
|
|
||||||
|
// Note: we can't include unconfirmed transactions here because the Pirate light wallet server requires a block range
|
||||||
|
List<UnspentOutput> unspentOutputs = blockchain.getUnspentOutputs(p2shAddress, false);
|
||||||
|
for (UnspentOutput unspentOutput : unspentOutputs) {
|
||||||
|
|
||||||
|
if (!Arrays.equals(ourScriptPubKey, unspentOutput.script)) {
|
||||||
|
// Not funding our specific HTLC script hash
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unspentOutput.value < minimumAmount) {
|
||||||
|
// Not funding the required amount
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return HashCode.fromBytes(unspentOutput.hash).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// No valid unspent outputs, so must be already spent
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns HTLC status, given P2SH address and expected redeem/refund amount
|
* Returns HTLC status, given P2SH address and expected redeem/refund amount
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -124,6 +124,21 @@ public class PirateChainTests extends Common {
|
|||||||
assertEquals(expectedTxidBE, txid);
|
assertEquals(expectedTxidBE, txid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetTxidForUnspentAddressWithMinimumAmount() throws ForeignBlockchainException {
|
||||||
|
String p2shAddress = "ba6Q5HWrWtmfU2WZqQbrFdRYsafA45cUAt";
|
||||||
|
long p2shFee = 10000;
|
||||||
|
final long minimumAmount = 10000 + p2shFee;
|
||||||
|
String txid = PirateChainHTLC.getUnspentFundingTxid(pirateChain.getBlockchainProvider(), p2shAddress, minimumAmount);
|
||||||
|
|
||||||
|
// Reverse the byte order of the txid used by block explorers, to get to big-endian form
|
||||||
|
byte[] expectedTxidLE = HashCode.fromString("fea4b0c1abcf8f0f3ddc2fa2f9438501ee102aad62a9ff18a5ce7d08774755c0").asBytes();
|
||||||
|
Bytes.reverse(expectedTxidLE);
|
||||||
|
String expectedTxidBE = HashCode.fromBytes(expectedTxidLE).toString();
|
||||||
|
|
||||||
|
assertEquals(expectedTxidBE, txid);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetTxidForSpentAddress() throws ForeignBlockchainException {
|
public void testGetTxidForSpentAddress() throws ForeignBlockchainException {
|
||||||
String p2shAddress = "bE49izfVxz8odhu8c2BcUaVFUnt7NLFRgv"; //"t3KtVxeEb8srJofo6atMEpMpEP6TjEi8VqA";
|
String p2shAddress = "bE49izfVxz8odhu8c2BcUaVFUnt7NLFRgv"; //"t3KtVxeEb8srJofo6atMEpMpEP6TjEi8VqA";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user