Skip to content

Commit 8f0b622

Browse files
authored
Merge pull request #57 from bitcoin-sv/broadcasters
Broadcasters
2 parents 1ae86b6 + 65e0db9 commit 8f0b622

File tree

15 files changed

+672
-56
lines changed

15 files changed

+672
-56
lines changed

CHANGELOG.md

+24-42
Original file line numberDiff line numberDiff line change
@@ -4,48 +4,30 @@ All notable changes to this project will be documented in this file. The format
44

55
## Table of Contents
66

7-
- [CHANGELOG](#changelog)
8-
- [Table of Contents](#table-of-contents)
9-
- [\[1.1.12\] - 2024-10-31](#1112---2024-10-31)
10-
- [Fixed](#fixed)
11-
- [\[1.1.11\] - 2024-10-23](#1111---2024-10-23)
12-
- [Fixed](#fixed-1)
13-
- [\[1.1.10\] - 2024-10-20](#1110---2024-10-20)
14-
- [Changed](#changed)
15-
- [Added](#added)
16-
- [\[1.1.9\] - 2024-10-01](#119---2024-10-01)
17-
- [Changed](#changed-1)
18-
- [\[1.1.8\] - 2024-09-17](#118---2024-09-17)
19-
- [Changed](#changed-2)
20-
- [Added](#added-1)
21-
- [\[1.1.7\] - 2024-09-10](#117---2024-09-10)
22-
- [Added](#added-2)
23-
- [Changed](#changed-3)
24-
- [\[1.1.6\] - 2024-09-09](#116---2024-09-09)
25-
- [Added](#added-3)
26-
- [Changed](#changed-4)
27-
- [\[1.1.5\] - 2024-09-06](#115---2024-09-06)
28-
- [Added](#added-4)
29-
- [\[1.1.4\] - 2024-09-05](#114---2024-09-05)
30-
- [Added](#added-5)
31-
- [Removed](#removed)
32-
- [Changed](#changed-5)
33-
- [\[1.1.3\] - 2024-09-04](#113---2024-09-04)
34-
- [Added](#added-6)
35-
- [Changed](#changed-6)
36-
- [\[1.1.2\] - 2024-09-02](#112---2024-09-02)
37-
- [Changed](#changed-7)
38-
- [\[1.1.1\] - 2024-08-28](#111---2024-08-28)
39-
- [Added](#added-7)
40-
- [Changed](#changed-8)
41-
- [\[1.1.0\] - 2024-08-19](#110---2024-08-19)
42-
- [Added](#added-8)
43-
- [Changed](#changed-9)
44-
- [Removed](#removed-1)
45-
- [Fixed](#fixed-2)
46-
- [\[1.0.0\] - 2024-06-06](#100---2024-06-06)
47-
- [Added](#added-9)
48-
- [Template for New Releases:](#template-for-new-releases)
7+
- [1.1.13 - 2024-11-01](#1113---2024-11-01)
8+
- [1.1.12 - 2024-10-31](#1112---2024-10-31)
9+
- [1.1.11 - 2024-10-23](#1111---2024-10-23)
10+
- [1.1.10 - 2024-10-20](#1110---2024-10-20)
11+
- [1.1.9 - 2024-10-01](#119---2024-10-01)
12+
- [1.1.8 - 2024-09-17](#118---2024-09-17)
13+
- [1.1.7 - 2024-09-10](#117---2024-09-10)
14+
- [1.1.6 - 2024-09-09](#116---2024-09-09)
15+
- [1.1.5 - 2024-09-06](#115---2024-09-06)
16+
- [1.1.4 - 2024-09-05](#114---2024-09-05)
17+
- [1.1.3 - 2024-09-04](#113---2024-09-04)
18+
- [1.1.2 - 2024-09-02](#112---2024-09-02)
19+
- [1.1.1 - 2024-08-28](#111---2024-08-28)
20+
- [1.1.0 - 2024-08-19](#110---2024-08-19)
21+
- [1.0.0 - 2024-06-06](#100---2024-06-06)
22+
23+
## [1.1.13] - 2024-11-01
24+
### Changed
25+
- Broadcaster examples
26+
27+
### Added
28+
- WOC Broadcaster
29+
- TAAL Broadcaster
30+
- Tests for woc, taal, and arc broadcasters
4931

5032
## [1.1.12] - 2024-10-31
5133
### Fixed

docs/examples/broadcaster/broadcaster.md

+16-3
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,24 @@ func main() {
2020
hexTx := "010000000100"
2121
tx, _ := transaction.NewTransactionFromHex(hexTx)
2222

23-
// Broadcast the transaction
24-
success, failure := tx.Broadcast(&broadcaster.Arc{
23+
broadcaster := &broadcaster.Arc{
2524
ApiUrl: "https://arc.gorillapool.io",
2625
ApiKey: "",
27-
})
26+
}
27+
28+
// To use TAAL API
29+
// broadcaster := &broadcaster.Taal{
30+
// ApiKey: "",
31+
// }
32+
33+
// To use Whats on Chain API
34+
// broadcaster := &broadcaster.WhatsOnChain{
35+
// ApiKey: "",
36+
// Network: broadcaster.WOCMainnet
37+
// }
38+
39+
// Broadcast the transaction
40+
success, failure := tx.Broadcast(broadcaster)
2841

2942
// Check for errors
3043
if failure != nil {

docs/examples/broadcaster/broadcaster_gp/broadcaster_gp.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,15 @@ func main() {
1111
hexTx := "010000000100"
1212
tx, _ := transaction.NewTransactionFromHex(hexTx)
1313

14-
// Broadcast the transaction
15-
success, failure := tx.Broadcast(&broadcaster.Arc{
14+
// Use the GP Arc Broadcaster
15+
16+
b := &broadcaster.Arc{
1617
ApiUrl: "https://arc.gorillapool.io",
1718
ApiKey: "",
18-
})
19+
}
20+
21+
// Broadcast the transaction
22+
success, failure := tx.Broadcast(b)
1923

2024
// Check for errors
2125
if failure != nil {

docs/examples/broadcaster/broadcaster_woc/broadcaster_woc.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,14 @@ func main() {
1111
hexTx := "010000000100"
1212
tx, _ := transaction.NewTransactionFromHex(hexTx)
1313

14+
// Use the WOC API broadcaster
15+
b := &broadcaster.WhatsOnChain{
16+
ApiKey: "",
17+
Network: broadcaster.WOCMainnet,
18+
}
19+
1420
// Broadcast the transaction
15-
success, failure := tx.Broadcast(&broadcaster.Arc{
16-
ApiUrl: "https://api.whatsonchain.com/v1/bsv/main/tx/raw",
17-
})
21+
success, failure := tx.Broadcast(b)
1822

1923
// Check for errors
2024
if failure != nil {

docs/examples/create_simple_tx/create_simple_tx.go

+2
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,11 @@ func main() {
7171
log.Fatal(err.Error())
7272
}
7373

74+
// BEEF format
7475
beef, _ := tx.BEEF()
7576
log.Printf("beef: %s\n", hex.EncodeToString(beef))
7677

78+
// Extended format
7779
ef, _ := tx.EF()
7880
log.Printf("ef: %s\n", hex.EncodeToString(ef))
7981
}

go.mod

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ go 1.22
44

55
require (
66
github.com/davecgh/go-spew v1.1.1
7-
github.com/stretchr/testify v1.8.4
7+
github.com/stretchr/testify v1.9.0
88
golang.org/x/crypto v0.21.0
99
golang.org/x/sync v0.6.0
1010
)
1111

12+
require github.com/stretchr/objx v0.5.2 // indirect
13+
1214
require (
1315
github.com/pkg/errors v0.9.1
1416
github.com/pmezard/go-difflib v1.0.0 // indirect

go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
44
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
55
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
66
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
7+
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
8+
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
79
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
810
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
11+
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
12+
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
913
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
1014
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
1115
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=

transaction/beef.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"fmt"
88
)
99

10+
const BEEF_VERSION = uint32(4022206465)
11+
1012
func (t *Transaction) FromBEEF(beef []byte) error {
1113
tx, err := NewTransactionFromBEEF(beef)
1214
*t = *tx
@@ -21,8 +23,8 @@ func NewTransactionFromBEEF(beef []byte) (*Transaction, error) {
2123
if err != nil {
2224
return nil, err
2325
}
24-
if version != 4022206465 {
25-
return nil, fmt.Errorf("invalid BEEF version. expected 4022206465, received %d", version)
26+
if version != BEEF_VERSION {
27+
return nil, fmt.Errorf("invalid BEEF version. expected %d, received %d", BEEF_VERSION, version)
2628
}
2729

2830
// Read the BUMPs
@@ -94,7 +96,7 @@ func NewTransactionFromBEEFHex(beefHex string) (*Transaction, error) {
9496

9597
func (t *Transaction) BEEF() ([]byte, error) {
9698
b := new(bytes.Buffer)
97-
err := binary.Write(b, binary.LittleEndian, uint32(4022206465))
99+
err := binary.Write(b, binary.LittleEndian, BEEF_VERSION)
98100
if err != nil {
99101
return nil, err
100102
}

transaction/beef_test.go

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// beef_test.go
2+
3+
package transaction
4+
5+
import (
6+
"encoding/base64"
7+
"testing"
8+
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
const BRC62Hex = "0100beef01fe636d0c0007021400fe507c0c7aa754cef1f7889d5fd395cf1f785dd7de98eed895dbedfe4e5bc70d1502ac4e164f5bc16746bb0868404292ac8318bbac3800e4aad13a014da427adce3e010b00bc4ff395efd11719b277694cface5aa50d085a0bb81f613f70313acd28cf4557010400574b2d9142b8d28b61d88e3b2c3f44d858411356b49a28a4643b6d1a6a092a5201030051a05fc84d531b5d250c23f4f886f6812f9fe3f402d61607f977b4ecd2701c19010000fd781529d58fc2523cf396a7f25440b409857e7e221766c57214b1d38c7b481f01010062f542f45ea3660f86c013ced80534cb5fd4c19d66c56e7e8c5d4bf2d40acc5e010100b121e91836fd7cd5102b654e9f72f3cf6fdbfd0b161c53a9c54b12c841126331020100000001cd4e4cac3c7b56920d1e7655e7e260d31f29d9a388d04910f1bbd72304a79029010000006b483045022100e75279a205a547c445719420aa3138bf14743e3f42618e5f86a19bde14bb95f7022064777d34776b05d816daf1699493fcdf2ef5a5ab1ad710d9c97bfb5b8f7cef3641210263e2dee22b1ddc5e11f6fab8bcd2378bdd19580d640501ea956ec0e786f93e76ffffffff013e660000000000001976a9146bfd5c7fbe21529d45803dbcf0c87dd3c71efbc288ac0000000001000100000001ac4e164f5bc16746bb0868404292ac8318bbac3800e4aad13a014da427adce3e000000006a47304402203a61a2e931612b4bda08d541cfb980885173b8dcf64a3471238ae7abcd368d6402204cbf24f04b9aa2256d8901f0ed97866603d2be8324c2bfb7a37bf8fc90edd5b441210263e2dee22b1ddc5e11f6fab8bcd2378bdd19580d640501ea956ec0e786f93e76ffffffff013c660000000000001976a9146bfd5c7fbe21529d45803dbcf0c87dd3c71efbc288ac0000000000"
13+
const BEEF = "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"
14+
15+
func TestFromBEEF(t *testing.T) {
16+
// Decode the BEEF data from base64
17+
beefBytes, err := base64.StdEncoding.DecodeString(BEEF)
18+
require.NoError(t, err, "Failed to decode BEEF data")
19+
20+
// Create a new Transaction object
21+
tx := &Transaction{}
22+
23+
// Use the FromBEEF method to populate the transaction
24+
err = tx.FromBEEF(beefBytes)
25+
require.NoError(t, err, "FromBEEF method failed")
26+
27+
expectedTxID := "ce70df889d5ba66a989b8e47294c751d19f948f004075cf265c4cbb2a7c97838"
28+
actualTxID := tx.TxID().String()
29+
require.Equal(t, expectedTxID, actualTxID, "Transaction ID does not match")
30+
}

transaction/broadcaster/arc.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ type Arc struct {
3737
SkipScriptValidation bool
3838
SkipTxValidation bool
3939
WaitForStatus ArcStatus
40+
Client HTTPClient // Added for testing
4041
}
4142

4243
type ArcResponse struct {
@@ -127,7 +128,7 @@ func (a *Arc) Broadcast(t *transaction.Transaction) (*transaction.BroadcastSucce
127128
req.Header.Set("X-WaitForStatus", string(a.WaitForStatus))
128129
}
129130

130-
resp, err := http.DefaultClient.Do(req)
131+
resp, err := a.Client.Do(req)
131132
if err != nil {
132133
return nil, &transaction.BroadcastFailure{
133134
Code: "500",

transaction/broadcaster/arc_test.go

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// arc_test.go
2+
3+
package broadcaster
4+
5+
import (
6+
"io"
7+
"net/http"
8+
"strings"
9+
"testing"
10+
11+
"github.com/bitcoin-sv/go-sdk/transaction"
12+
"github.com/stretchr/testify/require"
13+
)
14+
15+
// MockArcFailureClient simulates a failed API response for Arc.
16+
type MockArcFailureClient struct{}
17+
18+
// Do implements the HTTPClient interface for failure scenarios.
19+
func (m *MockArcFailureClient) Do(req *http.Request) (*http.Response, error) {
20+
return &http.Response{
21+
StatusCode: 500,
22+
Body: io.NopCloser(strings.NewReader(`{"blockHash":"","blockHeight":0,"extraInfo":"","status":500,"timestamp":"2023-01-01T00:00:00Z","title":"Internal Server Error","txStatus":null,"instance":null,"txid":"","detail":""}`)),
23+
}, nil
24+
}
25+
26+
// MockArcSuccessClient simulates a successful API response for Arc.
27+
type MockArcSuccessClient struct{}
28+
29+
// Do implements the HTTPClient interface for success scenarios.
30+
func (m *MockArcSuccessClient) Do(req *http.Request) (*http.Response, error) {
31+
return &http.Response{
32+
StatusCode: 200,
33+
Body: io.NopCloser(strings.NewReader(`{
34+
"blockHash":"abc123",
35+
"blockHeight":100,
36+
"extraInfo":"extra",
37+
"status":200,
38+
"timestamp":"2023-01-01T00:00:00Z",
39+
"title":"Broadcast Success",
40+
"txStatus":"7",
41+
"instance":"instance1",
42+
"txid":"4d76b00f29e480e0a933cef9d9ffe303d6ab919e2cdb265dd2cea41089baa85a",
43+
"detail":"detail info"
44+
}`)),
45+
}, nil
46+
}
47+
48+
// TestArcBroadcast tests the Broadcast method of Arc.
49+
func TestArcBroadcast(t *testing.T) {
50+
// Create a real transaction with a known TxID.
51+
txHex := "0100000001a9b0c5a2437042e5d0c6288fad6abc2ef8725adb6fef5f1bab21b2124cfb7cf6dc9300006a47304402204c3f88aadc90a3f29669bba5c4369a2eebc10439e857a14e169d19626243ffd802205443013b187a5c7f23e2d5dd82bc4ea9a79d138a3dc6cae6e6ef68874bd23a42412103fd290068ae945c23a06775de8422ceb6010aaebab40b78e01a0af3f1322fa861ffffffff010000000000000000b1006a0963657274696861736822314c6d763150594d70387339594a556e374d3948565473446b64626155386b514e4a4032356163343531383766613035616532626436346562323632386666336432666636646338313665383335376364616366343765663862396331656433663531403064383963343363343636303262643865313831376530393137313736343134353938373337623161663865363939343930646364653462343937656338643300000000"
52+
tx, err := transaction.NewTransactionFromHex(txHex)
53+
require.NoError(t, err, "Failed to create transaction from hex")
54+
55+
// Initialize Arc with a failure client.
56+
a := &Arc{
57+
ApiUrl: "https://arc.gorillapool.io",
58+
ApiKey: "test_api_key",
59+
Client: &MockArcFailureClient{},
60+
}
61+
62+
// Broadcast with failure client.
63+
success, failure := a.Broadcast(tx)
64+
require.Nil(t, success, "Expected no success when client fails")
65+
require.NotNil(t, failure, "Expected failure when client fails")
66+
require.Equal(t, "500", failure.Code, "Failure code mismatch")
67+
require.Equal(t, "Internal Server Error", failure.Description, "Failure description mismatch")
68+
69+
// Initialize Arc with a success client.
70+
a.Client = &MockArcSuccessClient{}
71+
72+
// Broadcast with success client.
73+
success, failure = a.Broadcast(tx)
74+
require.NotNil(t, success, "Expected success when client succeeds")
75+
require.Nil(t, failure, "Expected no failure when client succeeds")
76+
require.Equal(t, tx.TxID().String(), success.Txid, "Txid mismatch")
77+
require.Equal(t, "Broadcast Success", success.Message, "Message mismatch")
78+
}

0 commit comments

Comments
 (0)