Skip to content

Commit ecbd404

Browse files
authored
Merge pull request #69 from lbryio/supports
Add ClaimSupport ( tippable too)
2 parents 564595c + 2768cdd commit ecbd404

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

lbrycrd/client.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,39 @@ var MainNetParams = chaincfg.Params{
3838
Name: "mainnet",
3939
}
4040

41+
const (
42+
lbrycrdMainPubkeyPrefix = byte(85)
43+
lbrycrdMainScriptPrefix = byte(122)
44+
lbrycrdTestnetPubkeyPrefix = byte(111)
45+
lbrycrdTestnetScriptPrefix = byte(196)
46+
lbrycrdRegtestPubkeyPrefix = byte(111)
47+
lbrycrdRegtestScriptPrefix = byte(196)
48+
49+
LbrycrdMain = "lbrycrd_main"
50+
LbrycrdTestnet = "lbrycrd_testnet"
51+
LbrycrdRegtest = "lbrycrd_regtest"
52+
)
53+
54+
var mainNetParams = chaincfg.Params{
55+
PubKeyHashAddrID: lbrycrdMainPubkeyPrefix,
56+
ScriptHashAddrID: lbrycrdMainScriptPrefix,
57+
PrivateKeyID: 0x1c,
58+
}
59+
60+
var testNetParams = chaincfg.Params{
61+
PubKeyHashAddrID: lbrycrdTestnetPubkeyPrefix,
62+
ScriptHashAddrID: lbrycrdTestnetScriptPrefix,
63+
PrivateKeyID: 0x1c,
64+
}
65+
66+
var regTestNetParams = chaincfg.Params{
67+
PubKeyHashAddrID: lbrycrdRegtestPubkeyPrefix,
68+
ScriptHashAddrID: lbrycrdRegtestScriptPrefix,
69+
PrivateKeyID: 0x1c,
70+
}
71+
72+
var ChainParamsMap = map[string]chaincfg.Params{LbrycrdMain: mainNetParams, LbrycrdTestnet: testNetParams, LbrycrdRegtest: regTestNetParams}
73+
4174
func init() {
4275
// Register lbrycrd network
4376
err := chaincfg.Register(&MainNetParams)
@@ -288,3 +321,52 @@ func (c *Client) CreateChannel(name string, amount float64) (*c.ClaimHelper, *bt
288321

289322
return channel, key, nil
290323
}
324+
325+
func (c *Client) SupportClaim(name, claimID, address, blockchainName string, claimAmount float64) (*chainhash.Hash, error) {
326+
const DefaultFeePerSupport = float64(0.0001)
327+
unspentResults, err := c.ListUnspentMin(1)
328+
if err != nil {
329+
return nil, errors.Err(err)
330+
}
331+
332+
finder := newOutputFinder(unspentResults)
333+
outputs, err := finder.nextBatch(claimAmount + DefaultFeePerSupport)
334+
if err != nil {
335+
return nil, err
336+
}
337+
if len(outputs) == 0 {
338+
return nil, errors.Err("Not enough spendable outputs to create transaction")
339+
}
340+
inputs := make([]btcjson.TransactionInput, len(outputs))
341+
342+
var totalInputSpend float64
343+
for i, output := range outputs {
344+
inputs[i] = btcjson.TransactionInput{Txid: output.TxID, Vout: output.Vout}
345+
totalInputSpend = totalInputSpend + output.Amount
346+
}
347+
348+
change := totalInputSpend - claimAmount - DefaultFeePerSupport
349+
rawTx, err := c.CreateBaseRawTx(inputs, change)
350+
if err != nil {
351+
return nil, err
352+
}
353+
chainParams, ok := ChainParamsMap[blockchainName]
354+
if !ok {
355+
return nil, errors.Err("invalid blockchain name %s", blockchainName)
356+
}
357+
decodedAddress, err := DecodeAddress(address, &chainParams)
358+
if err != nil {
359+
return nil, errors.Err(err)
360+
}
361+
amount, err := btcutil.NewAmount(claimAmount)
362+
if err != nil {
363+
return nil, errors.Err(err)
364+
}
365+
script, err := getClaimSupportPayoutScript(name, claimID, decodedAddress)
366+
if err != nil {
367+
return nil, errors.Err(err)
368+
}
369+
rawTx.AddTxOut(wire.NewTxOut(int64(amount), script))
370+
371+
return c.SignTxAndSend(rawTx)
372+
}

0 commit comments

Comments
 (0)