diff --git a/README.md b/README.md index 8b404bc..a9e9b4a 100644 --- a/README.md +++ b/README.md @@ -247,7 +247,7 @@ type QueryTxResponse struct { BlockHash string `json:"blockHash,omitempty"` BlockHeight int64 `json:"blockHeight,omitempty"` ExtraInfo string `json:"extraInfo,omitempty"` - MerklePath string `json:"merklePath,omitempty"` + MerklePath *bc.MerklePath `json:"merklePath,omitempty"` Timestamp string `json:"timestamp,omitempty"` TxStatus TxStatus `json:"txStatus,omitempty"` TxID string `json:"txid,omitempty"` @@ -308,7 +308,7 @@ type SubmitTxResponse struct { BlockHash string `json:"blockHash,omitempty"` BlockHeight int64 `json:"blockHeight,omitempty"` ExtraInfo string `json:"extraInfo,omitempty"` - MerklePath string `json:"merklePath,omitempty"` + MerklePath *bc.MerklePath `json:"merklePath,omitempty"` Timestamp string `json:"timestamp,omitempty"` TxStatus TxStatus `json:"txStatus,omitempty"` TxID string `json:"txid,omitempty"` diff --git a/broadcast/broadcast-client-mock/fixtures/fixtures.go b/broadcast/broadcast-client-mock/fixtures/fixtures.go index 3da4ea6..887c061 100644 --- a/broadcast/broadcast-client-mock/fixtures/fixtures.go +++ b/broadcast/broadcast-client-mock/fixtures/fixtures.go @@ -23,6 +23,7 @@ const ( TxBlockHeightSecondary int64 = 799439 TxExtraInfo = "" TxMerklePath = "fd123511fc17127984cea2846b6a6b3965cbd523ea92736c11022372dc922d0013ee15f577bb7d832ce6102e22a15c6e4f4e4214e246d769f04baaf458e3407f5117de8eceb78782a1f90bfaa103915dcc3aa940c7e1476398db47dc62833f3149c51593cf9eeaec36f86c871d64e849a486b97eee1ee863c18aa28e599e3b30853a8563a87441202a97f707d0614cfc024f73ba4a2848ec63e19bc5fb168e994c2c2c105b5951dee4775f20879cb63b3b525370b35200e9f91e9e0fa234dfae5cc4792d17ab08f5cb29aa97e99742dc1e48a9d7e648be33db2d75b806519d88c62a57b39ef900cf68c9d765a1a3b17895d05077ab33280fdb4c09f818d31065b1325b6eb0366c4fd48c2840c1e3a5eb64a9596ffe53bbb315b44784882fb727a98e791d4c8a0bc1d5a88fd85365afdf83da86216cf81b587ee960b5c2a4174dfb26fa2606addf5e51edea58f76cc415f21876c9fa4551891aab537f4e463f1ded910d6a27ff27531c32b4dad15360b35d4d6da348c0c311aaf412bd19a92e2253e90c67104c8f0c0167cf43032f4ffa616cb8c5c28733a3faef5afb83d3c621b252112cbf35859c7b3b4caf820ae43f7054db87da2b7bc735f41b0969b4caadd1cc78be66fb367990103b5682f33605628dcc9af941bf555c64e1c48d3d0955f2c53f7ed7611d976d3effb053eb13b85ca2bff429516aa21227c39d6b6f4106f513069a559805977dee6462d354522d6e42f30d60744bd0f08471577ea5e1f63f319261" + TxMerklePathSecondary = "fd13400f3e40f8eedd367dbe5dee632fb577e513fcc8d73cd1f6032ee6f710e95c5907d71f67fbc7027c4652a67752c45b90057f3758f6582aaad728c5ea7a29b29f53798f6ce2a931f86c84f665b31fa5247669dbf7501cba7c562c4f11a58654fc1a8a57f78cffbced9bcc18925ed46f1002f22a4f56edf29c403dc9ca5846994a89f54038e8c68b898d17e505dd1e861b1dd20ffd8736dfc3c503706ee27ec1b852cbcdb33a564c0e8f0959cf1b758bdf0164f318de57c1e674d11e5b6b0c5336a662edfeb161ced6b16916f0e4f709ba9498b3d0440dbff65ca82c39f64e3487d3d9e7e46c8251eb2e443202a19b060ddf3dcbd6414371ff0544de2370d1948ba8c5a9ef29350e6475061fa82428b1b199f7d5e7a2ad28ccba7c802a5ba38b038ec3e4710e1483440e507f7e188d35693082d441d48e4be16e5da0f6e3203b93f295334a08ead059024a0750cbc88ee77a6b3101203ff8eb17353b58f5d03568084fd22b22467e500f72fa368021c8c8f0fa559b41ec3c01c6c355a9186a7d8bda348bf5ee7035d66e8b32ed57ebfcff619e893ea9a9873bd63c8247f4467d91e16fa256fc586a56e652850ee65b69bad583c72860f30ac04f6f8d71acc4840853353b9ae3c1da33107bb631e55d0c6b474d42c95f42611a50e21ff4271350fc4868" TxId = "680d975a403fd9ec90f613e87d17802c029d2d930df1c8373cdcdda2f536a1c0" - TxIdSecondary = "d4f4bcb8decdbc75a3dcc54580c76457ee663a28b843956733570b38f7c73b5a" + TxIdSecondary = "469dd0f63fe4b3fe972dc72d28057e931abd69d8dfc85bf6e623efa41d50ef73" ) diff --git a/broadcast/errors.go b/broadcast/errors.go index 0bde65f..3f097da 100644 --- a/broadcast/errors.go +++ b/broadcast/errors.go @@ -30,6 +30,9 @@ var ErrBroadcasterFailed = errors.New("broadcaster failed") // ErrUnableToDecodeResponse is returned when the http response cannot be decoded. var ErrUnableToDecodeResponse = errors.New("unable to decode response") +// ErrUnableToDecodeMerklePath is returned when merkle path from transaction response cannot be decoded. +var ErrUnableToDecodeMerklePath = errors.New("unable to decode merkle path from response") + // ErrMissingStatus is returned when the tx status is missing. var ErrMissingStatus = errors.New("missing tx status") diff --git a/broadcast/internal/arc/arc_query_tx.go b/broadcast/internal/arc/arc_query_tx.go index 7ee3abd..b4ff754 100644 --- a/broadcast/internal/arc/arc_query_tx.go +++ b/broadcast/internal/arc/arc_query_tx.go @@ -3,6 +3,9 @@ package arc import ( "context" "errors" + "net/http" + + "github.com/libsv/go-bc" "github.com/bitcoin-sv/go-broadcast-client/broadcast" arcutils "github.com/bitcoin-sv/go-broadcast-client/broadcast/internal/arc/utils" @@ -46,15 +49,39 @@ func queryTransaction(ctx context.Context, arc *ArcClient, txHash string) (*broa return nil, err } - model := broadcast.QueryTxResponse{} - err = arcutils.DecodeResponseBody(resp.Body, &model) + model, err := decodeQueryResponseBody(resp, arc) if err != nil { return nil, err } - model.Miner = arc.apiURL + return model, nil +} + +func decodeQueryResponseBody(resp *http.Response, arc *ArcClient) (*broadcast.QueryTxResponse, error) { + base := broadcast.BaseTxResponse{} + err := arcutils.DecodeResponseBody(resp.Body, &base) + if err != nil { + return nil, err + } + + var merklePath *bc.MerklePath + + if base.MerklePath != "" { + merklePath, err = bc.NewMerklePathFromStr(base.MerklePath) + if err != nil { + return nil, broadcast.ErrUnableToDecodeMerklePath + } + } + + model := &broadcast.QueryTxResponse{ + BaseResponse: broadcast.BaseResponse{ + Miner: arc.apiURL, + }, + BaseTxResponse: base, + MerklePath: merklePath, + } - return &model, nil + return model, nil } func validateQueryTxResponse(model *broadcast.QueryTxResponse) error { diff --git a/broadcast/internal/arc/arc_query_tx_test.go b/broadcast/internal/arc/arc_query_tx_test.go index 0b72173..b39312f 100644 --- a/broadcast/internal/arc/arc_query_tx_test.go +++ b/broadcast/internal/arc/arc_query_tx_test.go @@ -4,14 +4,17 @@ import ( "bytes" "context" "errors" + "fmt" "io" "net/http" "testing" + "github.com/libsv/go-bc" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/bitcoin-sv/go-broadcast-client/broadcast" + "github.com/bitcoin-sv/go-broadcast-client/broadcast/broadcast-client-mock/fixtures" ) func TestQueryTransaction(t *testing.T) { @@ -87,3 +90,59 @@ func TestQueryTransaction(t *testing.T) { }) } } + +func TestDecodeQueryResponseBody(t *testing.T) { + mp, _ := bc.NewMerklePathFromStr(fixtures.TxMerklePath) + testCases := []struct { + name string + httpResponse *http.Response + expectedResult *broadcast.QueryTxResponse + }{ + { + name: "successful decode", + httpResponse: &http.Response{ + StatusCode: http.StatusOK, + Body: io.NopCloser(bytes.NewBufferString(fmt.Sprintf("{\"merklePath\":\"%s\"}", fixtures.TxMerklePath))), + }, + expectedResult: &broadcast.QueryTxResponse{ + BaseResponse: broadcast.BaseResponse{Miner: "http://example.com"}, + BaseTxResponse: broadcast.BaseTxResponse{ + MerklePath: fixtures.TxMerklePath, + }, + MerklePath: mp, + }, + }, + { + name: "empty merkle path", + httpResponse: &http.Response{ + StatusCode: http.StatusOK, + Body: io.NopCloser(bytes.NewBufferString(` + { + "merklePath": "" + } + `)), + }, + expectedResult: &broadcast.QueryTxResponse{ + BaseResponse: broadcast.BaseResponse{ + Miner: "http://example.com", + }, + MerklePath: nil, + }, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // given + client := &ArcClient{ + apiURL: "http://example.com", + } + + // when + model, err := decodeQueryResponseBody(tc.httpResponse, client) + + // then + assert.NoError(t, err) + assert.Equal(t, tc.expectedResult, model) + }) + } +} diff --git a/broadcast/internal/arc/arc_submit_tx.go b/broadcast/internal/arc/arc_submit_tx.go index a65d36b..c88533a 100644 --- a/broadcast/internal/arc/arc_submit_tx.go +++ b/broadcast/internal/arc/arc_submit_tx.go @@ -6,9 +6,11 @@ import ( "encoding/json" "errors" "fmt" + "net/http" "strconv" "github.com/GorillaPool/go-junglebus" + "github.com/libsv/go-bc" "github.com/libsv/go-bt/v2" "github.com/bitcoin-sv/go-broadcast-client/broadcast" @@ -72,12 +74,12 @@ func (a *ArcClient) SubmitBatchTransactions(ctx context.Context, txs []*broadcas return nil, err } - response := broadcast.SubmitBatchTxResponse{ + response := &broadcast.SubmitBatchTxResponse{ BaseResponse: broadcast.BaseResponse{Miner: a.apiURL}, Transactions: result, } - return &response, nil + return response, nil } func submitTransaction(ctx context.Context, arc *ArcClient, tx *broadcast.Transaction, opts *broadcast.TransactionOpts) (*broadcast.SubmittedTx, error) { @@ -103,13 +105,12 @@ func submitTransaction(ctx context.Context, arc *ArcClient, tx *broadcast.Transa return nil, arc_utils.HandleHttpError(err) } - model := broadcast.SubmittedTx{} - err = arc_utils.DecodeResponseBody(resp.Body, &model) + model, err := decodeSubmitResponseBody(resp) if err != nil { return nil, err } - return &model, nil + return model, nil } func submitBatchTransactions(ctx context.Context, arc *ArcClient, txs []*broadcast.Transaction, opts *broadcast.TransactionOpts) ([]*broadcast.SubmittedTx, error) { @@ -135,8 +136,7 @@ func submitBatchTransactions(ctx context.Context, arc *ArcClient, txs []*broadca return nil, arc_utils.HandleHttpError(err) } - var model []*broadcast.SubmittedTx - err = arc_utils.DecodeResponseBody(resp.Body, &model) + model, err := decodeSubmitBatchResponseBody(resp) if err != nil { return nil, err } @@ -209,6 +209,53 @@ func appendSubmitTxHeaders(pld *httpclient.HTTPRequest, opts *broadcast.Transact } } +func decodeSubmitResponseBody(resp *http.Response) (*broadcast.SubmittedTx, error) { + base := broadcast.BaseSubmitTxResponse{} + err := arc_utils.DecodeResponseBody(resp.Body, &base) + if err != nil { + return nil, broadcast.ErrUnableToDecodeMerklePath + } + + var merklePath *bc.MerklePath + + if base.MerklePath != "" { + if merklePath, err = bc.NewMerklePathFromStr(base.MerklePath); err != nil { + return nil, broadcast.ErrUnableToDecodeMerklePath + } + } + + model := &broadcast.SubmittedTx{ + BaseSubmitTxResponse: base, + MerklePath: merklePath, + } + + return model, nil +} + +func decodeSubmitBatchResponseBody(resp *http.Response) ([]*broadcast.SubmittedTx, error) { + base := make([]broadcast.BaseSubmitTxResponse, 0) + err := arc_utils.DecodeResponseBody(resp.Body, &base) + if err != nil { + return nil, err + } + + model := make([]*broadcast.SubmittedTx, 0) + for _, tx := range base { + var merklePath *bc.MerklePath + if tx.MerklePath != "" { + if merklePath, err = bc.NewMerklePathFromStr(tx.MerklePath); err != nil { + return nil, broadcast.ErrUnableToDecodeMerklePath + } + } + model = append(model, &broadcast.SubmittedTx{ + BaseSubmitTxResponse: tx, + MerklePath: merklePath, + }) + } + + return model, nil +} + func validateBatchResponse(model []*broadcast.SubmittedTx) error { for _, tx := range model { if err := validateSubmitTxResponse(tx); err != nil { diff --git a/broadcast/internal/arc/arc_submit_tx_test.go b/broadcast/internal/arc/arc_submit_tx_test.go index 891458c..6cb7e89 100644 --- a/broadcast/internal/arc/arc_submit_tx_test.go +++ b/broadcast/internal/arc/arc_submit_tx_test.go @@ -4,13 +4,16 @@ import ( "bytes" "context" "errors" + "fmt" "io" "net/http" "testing" + "github.com/libsv/go-bc" "github.com/stretchr/testify/assert" "github.com/bitcoin-sv/go-broadcast-client/broadcast" + "github.com/bitcoin-sv/go-broadcast-client/broadcast/broadcast-client-mock/fixtures" "github.com/bitcoin-sv/go-broadcast-client/httpclient" ) @@ -39,8 +42,10 @@ func TestSubmitTransaction(t *testing.T) { expectedResult: &broadcast.SubmitTxResponse{ BaseResponse: broadcast.BaseResponse{Miner: "http://example.com"}, SubmittedTx: &broadcast.SubmittedTx{ - BaseTxResponse: broadcast.BaseTxResponse{ - TxStatus: broadcast.Confirmed, + BaseSubmitTxResponse: broadcast.BaseSubmitTxResponse{ + BaseTxResponse: broadcast.BaseTxResponse{ + TxStatus: broadcast.Confirmed, + }, }, }, }, @@ -177,6 +182,55 @@ func TestConvertBatchTransactions(t *testing.T) { } } +func TestDecodeSubmitResponseBody(t *testing.T) { + mp, _ := bc.NewMerklePathFromStr(fixtures.TxMerklePath) + testCases := []struct { + name string + httpResponse *http.Response + expectedResult *broadcast.SubmittedTx + }{ + { + name: "successful decode", + httpResponse: &http.Response{ + StatusCode: http.StatusOK, + Body: io.NopCloser(bytes.NewBufferString(fmt.Sprintf("{\"merklePath\":\"%s\"}", fixtures.TxMerklePath))), + }, + expectedResult: &broadcast.SubmittedTx{ + BaseSubmitTxResponse: broadcast.BaseSubmitTxResponse{ + BaseTxResponse: broadcast.BaseTxResponse{ + MerklePath: fixtures.TxMerklePath, + }, + }, + MerklePath: mp, + }, + }, + { + name: "empty merkle path", + httpResponse: &http.Response{ + StatusCode: http.StatusOK, + Body: io.NopCloser(bytes.NewBufferString(` + { + "merklePath": "" + } + `)), + }, + expectedResult: &broadcast.SubmittedTx{ + MerklePath: nil, + }, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // when + model, err := decodeSubmitResponseBody(tc.httpResponse) + + // then + assert.NoError(t, err) + assert.Equal(t, tc.expectedResult, model) + }) + } +} + func TestSubmitBatchTransactions(t *testing.T) { testCases := []struct { name string @@ -208,13 +262,17 @@ func TestSubmitBatchTransactions(t *testing.T) { BaseResponse: broadcast.BaseResponse{Miner: "http://example.com"}, Transactions: []*broadcast.SubmittedTx{ { - BaseTxResponse: broadcast.BaseTxResponse{ - TxStatus: broadcast.Confirmed, + BaseSubmitTxResponse: broadcast.BaseSubmitTxResponse{ + BaseTxResponse: broadcast.BaseTxResponse{ + TxStatus: broadcast.Confirmed, + }, }, }, { - BaseTxResponse: broadcast.BaseTxResponse{ - TxStatus: broadcast.Confirmed, + BaseSubmitTxResponse: broadcast.BaseSubmitTxResponse{ + BaseTxResponse: broadcast.BaseTxResponse{ + TxStatus: broadcast.Confirmed, + }, }, }, }, diff --git a/broadcast/internal/arc/mocks/consts.go b/broadcast/internal/arc/mocks/consts.go index 718443e..30ac7e9 100644 --- a/broadcast/internal/arc/mocks/consts.go +++ b/broadcast/internal/arc/mocks/consts.go @@ -1,6 +1,8 @@ package mocks import ( + "github.com/libsv/go-bc" + broadcast_api "github.com/bitcoin-sv/go-broadcast-client/broadcast" "github.com/bitcoin-sv/go-broadcast-client/broadcast/broadcast-client-mock/fixtures" ) @@ -46,32 +48,41 @@ var ( Timestamp: Policy2.Timestamp, } + mp, _ = bc.NewMerklePathFromStr(fixtures.TxMerklePath) + mp2, _ = bc.NewMerklePathFromStr(fixtures.TxMerklePathSecondary) + SubmittedTx = &broadcast_api.SubmittedTx{ - Status: fixtures.TxResponseStatus, - Title: fixtures.TxResponseTitle, - BaseTxResponse: broadcast_api.BaseTxResponse{ - BlockHash: fixtures.TxBlockHash, - BlockHeight: fixtures.TxBlockHeight, - ExtraInfo: fixtures.TxExtraInfo, - MerklePath: fixtures.TxMerklePath, - Timestamp: fixtures.Timestamp, - TxStatus: fixtures.TxStatus, - TxID: fixtures.TxId, + BaseSubmitTxResponse: broadcast_api.BaseSubmitTxResponse{ + Status: fixtures.TxResponseStatus, + Title: fixtures.TxResponseTitle, + BaseTxResponse: broadcast_api.BaseTxResponse{ + BlockHash: fixtures.TxBlockHash, + BlockHeight: fixtures.TxBlockHeight, + ExtraInfo: fixtures.TxExtraInfo, + MerklePath: fixtures.TxMerklePath, + Timestamp: fixtures.Timestamp, + TxStatus: fixtures.TxStatus, + TxID: fixtures.TxId, + }, }, + MerklePath: mp, } SubmittedTxSecondary = &broadcast_api.SubmittedTx{ - Status: fixtures.TxResponseStatus, - Title: fixtures.TxResponseTitle, - BaseTxResponse: broadcast_api.BaseTxResponse{ - BlockHash: fixtures.TxBlockHashSecondary, - BlockHeight: fixtures.TxBlockHeightSecondary, - ExtraInfo: fixtures.TxExtraInfo, - MerklePath: fixtures.TxMerklePath, - Timestamp: fixtures.Timestamp, - TxStatus: fixtures.TxStatus, - TxID: fixtures.TxIdSecondary, + BaseSubmitTxResponse: broadcast_api.BaseSubmitTxResponse{ + Status: fixtures.TxResponseStatus, + Title: fixtures.TxResponseTitle, + BaseTxResponse: broadcast_api.BaseTxResponse{ + BlockHash: fixtures.TxBlockHashSecondary, + BlockHeight: fixtures.TxBlockHeightSecondary, + ExtraInfo: fixtures.TxExtraInfo, + MerklePath: fixtures.TxMerklePath, + Timestamp: fixtures.Timestamp, + TxStatus: fixtures.TxStatus, + TxID: fixtures.TxIdSecondary, + }, }, + MerklePath: mp2, } ) diff --git a/broadcast/transaction.go b/broadcast/transaction.go index ada39eb..36838d1 100644 --- a/broadcast/transaction.go +++ b/broadcast/transaction.go @@ -1,5 +1,7 @@ package broadcast +import "github.com/libsv/go-bc" + // Transaction is the body contents in the "submit transaction" request. type Transaction struct { // Hex is the transaction hex string. @@ -28,10 +30,12 @@ type BaseTxResponse struct { type QueryTxResponse struct { BaseResponse BaseTxResponse + // MerklePath is the Merkle path used to calculate Merkle root of the block in which the transaction was included. + MerklePath *bc.MerklePath `json:"merklePath,omitempty"` } -// SubmittedTx is the internal response returned by the miner from submitting transaction(s). -type SubmittedTx struct { +// BaseSubmitTxResponse is the internal response returned by the miner from submitting transaction(s). +type BaseSubmitTxResponse struct { BaseTxResponse // Status is the status of the response. Status int `json:"status,omitempty"` @@ -39,6 +43,13 @@ type SubmittedTx struct { Title string `json:"title,omitempty"` } +// SubmittedTx is the submit response with decoded Merkl Path. +type SubmittedTx struct { + BaseSubmitTxResponse + // MerklePath is the Merkle path used to calculate Merkle root of the block in which the transaction was included. + MerklePath *bc.MerklePath `json:"merklePath,omitempty"` +} + // SubmitTxResponse is the response returned by the SubmitTransaction method. type SubmitTxResponse struct { BaseResponse diff --git a/examples/query_transaction/query_tx.go b/examples/query_transaction/query_tx.go index d6731a4..dba9de6 100644 --- a/examples/query_transaction/query_tx.go +++ b/examples/query_transaction/query_tx.go @@ -12,7 +12,7 @@ import ( func main() { token := "" apiURL := "https://tapi.taal.com/arc" - hex := "680d975a403fd9ec90f613e87d17802c029d2d930df1c8373cdcdda2f536a1c0" + hex := "469dd0f63fe4b3fe972dc72d28057e931abd69d8dfc85bf6e623efa41d50ef73" cfg := broadcast_client.ArcClientConfig{ Token: token, diff --git a/examples/submit_transaction/submit_tx.go b/examples/submit_transaction/submit_tx.go index 2483538..7d781e9 100644 --- a/examples/submit_transaction/submit_tx.go +++ b/examples/submit_transaction/submit_tx.go @@ -12,7 +12,7 @@ import ( func main() { token := "" apiURL := "https://tapi.taal.com/arc" - tx := broadcast.Transaction{Hex: "0100000001b71cbd19dd20160d3e662b2f10f686dba7ffad05caa687f0a9950a8efb394fbf060000006a473044022005dfb6c03648ce8cc6dbf3e44f905ff26f4140fec1868a237685a31e8df46c3e02204a0b9da3fb3514946cda2f2eab4662217633de10d4a83865c376ba39e093e373412103b671ba3ef17b2b1eea224579af868d40ec6645d819461b82eaf7846ae281d455ffffffff08f4010000000000001976a91449674dc635418b384086ef9a95100cc40e92799e88acf4010000000000001976a914bf062a0a6915954069141ad7584506997ad2bddf88acf4010000000000001976a914cb9a17dfa0c033cac9f297d9f82add28673e8f1b88ac88130000000000001976a914a58d30914be2cddffbdb2cfd544445729f993f0388acf4010000000000001976a914f6f6346b6f4a8c0b3dc1e3ffd7ba897018e7059188acf4010000000000001976a914640f71761a00fbebedeba33bc41f18bcfdd0118088ac0000000000000000fd2401006a22314d6a4a7251744a735959647a753254487872654e69524c53586548637a417778550a5361746f73656e6465720a746578742f706c61696e057574662d38017c223150755161374b36324d694b43747373534c4b79316b683536575755374d7455523503534554036170700a7361746f73656e64657204747970650c7265676973746572557365720c7061796d61696c204861736840373863613031353837646635373533323265623538386233623830623433313239633763636435383266343361303662623538363133353233323737613663340970686f6e65486173684039643535626465323661613139343364326234366463303665343735356139363536666564323062626632643839313138353339346139623431633034643539c3090000000000001976a914397bafc4137c7d04f77afcb42e80f6955dde3a4188ac00000000"} + tx := broadcast.Transaction{Hex: "0100000001ddb4c9848bdb3815df8615fa292cbd78d08df8ddcca030952893cd5323cde2d6070000006a4730440220217a28cce8e91a6aed468f55a3ff370b659243a1426bac54e969ee0bac66917702201e4325624ed092a72fe4bfdf7ab73c63b54d02ebfc2c281fe6b168aead3b81bf412102297bd70ae25fb4a13b4ce619dfa7c01711d7999a7ffa027869df61758a8128d1ffffffff08f4010000000000001976a914c762c78bc4166f1d612f444759690bd54543cd8788acf4010000000000001976a914cfb15128b34f29c0fef7281664f15f9e9b86b2c888acf4010000000000001976a9140c5a3b6a60c6e1eeb787ede1a03ae118ae3c437688ac88130000000000001976a914e4d0bd8a51c7524b895e00561310e51baa10c66c88acf4010000000000001976a914848b33504640a85cc8884144b656f92e704a253c88acf4010000000000001976a914e1d4a53aa9f3d11c7b5d1b532266b34d6a34181288ac0000000000000000fd2401006a22314d6a4a7251744a735959647a753254487872654e69524c53586548637a417778550a5361746f73656e6465720a746578742f706c61696e057574662d38017c223150755161374b36324d694b43747373534c4b79316b683536575755374d7455523503534554036170700a7361746f73656e64657204747970650c7265676973746572557365720c7061796d61696c204861736840373863613031353837646635373533323265623538386233623830623433313239633763636435383266343361303662623538363133353233323737613663340970686f6e65486173684039643535626465323661613139343364326234366463303665343735356139363536666564323062626632643839313138353339346139623431633034643539d3830700000000001976a91467ef6a452137dc349cf28ffe6893f782a704560388ac00000000"} cfg := broadcast_client.ArcClientConfig{ Token: token, diff --git a/go.mod b/go.mod index 0ed2051..d795846 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.20 require ( github.com/GorillaPool/go-junglebus v0.2.0 + github.com/libsv/go-bc v0.1.18 github.com/libsv/go-bt/v2 v2.2.5 github.com/stretchr/testify v1.8.4 ) @@ -24,8 +25,8 @@ require ( github.com/segmentio/encoding v0.3.5 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - golang.org/x/crypto v0.13.0 // indirect - golang.org/x/sys v0.12.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/sys v0.13.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 413c716..742308d 100644 --- a/go.sum +++ b/go.sum @@ -18,6 +18,8 @@ github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2E github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/libsv/go-bc v0.1.18 h1:n0M5c0jtd8Ds4DLyX1g+AkfFZB7o780aO9YHQlRxzGM= +github.com/libsv/go-bc v0.1.18/go.mod h1:TydCZiPUpYPTLiYFDrz2Ug+wSzADUHJux4t3DPVPg08= github.com/libsv/go-bk v0.1.6 h1:c9CiT5+64HRDbzxPl1v/oiFmbvWZTuUYqywCf+MBs/c= github.com/libsv/go-bk v0.1.6/go.mod h1:khJboDoH18FPUaZlzRFKzlVN84d4YfdmlDtdX4LAjQA= github.com/libsv/go-bt/v2 v2.2.5 h1:VoggBLMRW9NYoFujqe5bSYKqnw5y+fYfufgERSoubog= @@ -47,14 +49,14 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=