Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
3d67bf2
added factory method FromPublicKeys for creating multiscript payment
sekulicd May 20, 2020
cc3bf1f
fix merge conflicts
sekulicd May 20, 2020
46662ff
Merge remote-tracking branch 'upstream/master'
sekulicd May 21, 2020
4c8baee
Merge remote-tracking branch 'upstream/master'
sekulicd May 27, 2020
c46b796
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 1, 2020
c7665a1
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 1, 2020
50ed1cc
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 3, 2020
a4c66c3
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 3, 2020
33e70ef
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 3, 2020
84f5e8e
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 4, 2020
eb921b6
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 8, 2020
3a8583f
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 9, 2020
b8c87cc
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 10, 2020
1efdee4
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 12, 2020
97e95fc
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 12, 2020
fe6bffd
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 12, 2020
0798fd1
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 16, 2020
b69eb30
merge with master
sekulicd Jun 26, 2020
b13d220
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 30, 2020
831f1ac
Merge remote-tracking branch 'upstream/master'
sekulicd Jul 20, 2020
5f3c1d3
Merge remote-tracking branch 'upstream/master'
sekulicd Jul 22, 2020
9b78b6b
Merge remote-tracking branch 'upstream/master'
sekulicd Aug 27, 2020
4cbd8fb
Merge remote-tracking branch 'upstream/master'
sekulicd Nov 24, 2020
78a1cbb
Merge remote-tracking branch 'upstream/master'
sekulicd Mar 30, 2021
6e453bb
Merge remote-tracking branch 'upstream/master'
sekulicd May 6, 2021
ed46ed5
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 15, 2021
85762c0
Merge remote-tracking branch 'upstream/master'
sekulicd Sep 13, 2021
3f397b9
Merge remote-tracking branch 'upstream/master'
sekulicd Oct 22, 2021
d22a94f
Merge remote-tracking branch 'upstream/master'
sekulicd Nov 22, 2021
d0343d3
Merge remote-tracking branch 'upstream/master'
sekulicd Nov 29, 2021
903b9a7
Merge remote-tracking branch 'upstream/master'
sekulicd Feb 15, 2022
634fc5d
Merge remote-tracking branch 'upstream/master'
sekulicd May 13, 2022
06066ff
Merge remote-tracking branch 'upstream/master'
sekulicd May 13, 2022
941047d
Merge remote-tracking branch 'upstream/master'
sekulicd May 24, 2022
84e4d4f
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 1, 2022
b70d249
Merge remote-tracking branch 'upstream/master'
sekulicd Jun 23, 2022
d7d5dff
FromOutputScript
sekulicd Jun 23, 2022
43dc3db
remove golanglint file
sekulicd Jun 23, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions payment/payment.go
Original file line number Diff line number Diff line change
Expand Up @@ -373,3 +373,89 @@ func buildScript(hash []byte, scriptType string) []byte {
script, _ := builder.Script()
return script
}

func FromOutputScript(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This method should stay in address package and should not make use of the payment one, like a "raw" address builder.
The idea is to allow the user to retrieve and address from an output script with either address or payment. The former lacks such API, while the latter already provides the necessary ones.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, thing is that if adding it to address pkg can use payment cause of cyclic import.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was trying to say that this function should be moved to address and its implementation must change so that it doesn't make use of payment's types/functions.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest you don't look at the liquidjs-lib implementation, rather this function should analyze the incoming script to understand its type and encode it to an address using the proper format (base58, bech32...).
I would remove also the blinding key argument and return always an unconfidential address from an output script to keep it simple. The user can translate it to confidential with existing types and functions of the address package if needed.

net *network.Network,
outputScript []byte,
blindingKey *btcec.PublicKey,
) (string, error) {
p, err := FromScript(outputScript, net, blindingKey)
if err != nil {
return "", err
}

switch address.GetScriptType(outputScript) {
case address.P2WpkhScript:
addr, err := p.WitnessPubKeyHash()
if err != nil {
return "", err
}

if blindingKey != nil {
addr, err = p.ConfidentialWitnessPubKeyHash()
if err != nil {
return "", err
}
}

return addr, nil
case address.P2WshScript:
addr, err := p.WitnessScriptHash()
if err != nil {
return "", err
}

if blindingKey != nil {
addr, err = p.ConfidentialWitnessScriptHash()
if err != nil {
return "", err
}
}

return addr, nil
case address.P2ShScript:
addr, err := p.ScriptHash()
if err != nil {
return "", err
}

if blindingKey != nil {
addr, err = p.ConfidentialScriptHash()
if err != nil {
return "", err
}
}

return addr, nil
case address.P2PkhScript:
addr, err := p.PubKeyHash()
if err != nil {
return "", err
}

if blindingKey != nil {
addr, err = p.ConfidentialPubKeyHash()
if err != nil {
return "", err
}
}

return addr, nil
case address.P2TRScript:
addr, err := p.TaprootAddress()
if err != nil {
return "", err
}

if blindingKey != nil {
addr, err = p.ConfidentialTaprootAddress()
if err != nil {
return "", err
}
}

return addr, nil
default:
return "", errors.New("unsupported script type")
}
}
148 changes: 148 additions & 0 deletions payment/payment_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -216,3 +216,151 @@ func TestSegwitScriptHashConfidential(t *testing.T) {
"rzmrq2mc3c6aa85wgxxfm9v8r062qwq4ty579p54pn2q2hq6f9r3gz0h4tn"
assert.Equal(t, expected, addr)
}

func TestFromOutputScript(t *testing.T) {
privKey, err := btcec.NewPrivateKey()
if err != nil {
t.Fatal(err)
}

blindPrivKey, err := btcec.NewPrivateKey()
if err != nil {
t.Fatal(err)
}

redeemScript := "52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959" +
"f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d0" +
"8ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09" +
"b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950" +
"cfe52a52ae"
redeemScriptBytes, err := hex.DecodeString(redeemScript)
if err != nil {
t.Error(err)
}

//p2pkh
p2pkh := payment.FromPublicKey(
privKey.PubKey(),
&network.Regtest,
blindPrivKey.PubKey(),
)

p2pkhAddress, err := p2pkh.ConfidentialPubKeyHash()
if err != nil {
t.Fatal(err)
}

p2pkhAddress1, err := payment.FromOutputScript(
&network.Regtest,
p2pkh.Script,
blindPrivKey.PubKey(),
)
if err != nil {
t.Fatal(err)
}

assert.Equal(t, p2pkhAddress, p2pkhAddress1)

//p2sh
p2ms, err := payment.FromScript(
redeemScriptBytes,
&network.Regtest,
blindPrivKey.PubKey(),
)
if err != nil {
t.Error(err)
}

p2sh, err := payment.FromPayment(p2ms)
if err != nil {
t.Error(err)
}

p2shAddress, err := p2sh.ConfidentialScriptHash()
if err != nil {
t.Error(err)
}

p2shAddress1, err := payment.FromOutputScript(
&network.Regtest,
p2sh.Script,
blindPrivKey.PubKey(),
)
if err != nil {
t.Fatal(err)
}

assert.Equal(t, p2shAddress, p2shAddress1)
//p2wpkh
p2wpkh := payment.FromPublicKey(
privKey.PubKey(),
&network.Regtest,
blindPrivKey.PubKey(),
)

p2wpkhAddress, err := p2wpkh.ConfidentialWitnessPubKeyHash()
if err != nil {
t.Fatal(err)
}

p2wpkhAddress1, err := payment.FromOutputScript(
&network.Regtest,
p2wpkh.WitnessScript,
blindPrivKey.PubKey(),
)
if err != nil {
t.Fatal(err)
}

assert.Equal(t, p2wpkhAddress, p2wpkhAddress1)

//p2wsh
p2wsh, err := payment.FromPayment(p2ms)
if err != nil {
t.Error(err)
}

p2wshAddress, err := p2wsh.ConfidentialWitnessScriptHash()
if err != nil {
t.Error(err)
}

p2wshAddress1, err := payment.FromOutputScript(
&network.Regtest,
p2wsh.WitnessScript,
blindPrivKey.PubKey(),
)
if err != nil {
t.Fatal(err)
}

assert.Equal(t, p2wshAddress, p2wshAddress1)

//p2tr
p2tr, err := payment.FromTaprootScriptTreeHash(
privKey.PubKey(),
nil,
&network.Regtest,
blindingKey.PubKey(),
)

if err != nil {
t.Error(err)
}

p2trAddress, err := p2tr.ConfidentialTaprootAddress()
if err != nil {
t.Error(err)
}

p2trAddress1, err := payment.FromOutputScript(
&network.Regtest,
p2tr.Script,
blindPrivKey.PubKey(),
)
if err != nil {
t.Fatal(err)
}

assert.Equal(t, p2trAddress, p2trAddress1)
}