From 6cfa2c5080f6c346ba06f04be143477d32eb387b Mon Sep 17 00:00:00 2001 From: Marcus Pasell <3690498+rickyrombo@users.noreply.github.com> Date: Tue, 24 Mar 2026 18:57:50 -0700 Subject: [PATCH 1/2] feat(relay): dual-write transactions to sos.audius.co Fires a best-effort background write to https://sos.audius.co on every relay call, regardless of whether the main mainnet write succeeds. Hardcoded as a temporary fix. Co-Authored-By: Claude Sonnet 4.6 --- api/relay.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/api/relay.go b/api/relay.go index b07204b9..f5dd2f74 100644 --- a/api/relay.go +++ b/api/relay.go @@ -11,6 +11,7 @@ import ( "api.audius.co/trashid" "connectrpc.com/connect" v1 "github.com/OpenAudio/go-openaudio/pkg/api/core/v1" + "github.com/OpenAudio/go-openaudio/pkg/sdk" cconfig "github.com/OpenAudio/go-openaudio/pkg/core/config" "github.com/OpenAudio/go-openaudio/pkg/core/server" eth_gen "github.com/OpenAudio/go-openaudio/pkg/eth/contracts/gen" @@ -259,7 +260,27 @@ func (app *ApiServer) relay(c *fiber.Ctx) error { }) } +const sosEndpoint = "https://sos.audius.co" + func (app *ApiServer) handleRelay(ctx context.Context, logger *zap.Logger, decodedTx *v1.ManageEntityLegacy) (*v1.Transaction, error) { + // Dual-write to SOS network (best-effort, non-blocking, always fires) + go func() { + sosClient := sdk.NewOpenAudioSDK(sosEndpoint) + sosLogger := logger.With(zap.String("openaudio_endpoint", sosEndpoint)) + sosRes, sosErr := sosClient.Core.SendTransaction(context.Background(), connect.NewRequest(&v1.SendTransactionRequest{ + Transaction: &v1.SignedTransaction{ + Transaction: &v1.SignedTransaction_ManageEntity{ + ManageEntity: decodedTx, + }, + }, + })) + if sosErr != nil { + sosLogger.Warn("sos dual-write failed", zap.Error(sosErr)) + } else { + sosLogger.Info("sos dual-write confirmed", zap.String("hash", sosRes.Msg.Transaction.GetHash())) + } + }() + allClients := app.openAudioPool.GetAll() if len(allClients) == 0 { logger.Error("no OpenAudio clients configured") From 1cdce24ec3e350b6e64ebb8ca430f1fd97ff46ab Mon Sep 17 00:00:00 2001 From: Marcus Pasell <3690498+rickyrombo@users.noreply.github.com> Date: Tue, 24 Mar 2026 19:11:17 -0700 Subject: [PATCH 2/2] refactor(relay): mainnet fire-and-forget, sos blocking with ctx - mainnet writes fire in a background goroutine (uses context.Background since request context cancels on response) - sos write is synchronous and returns the tx hash for the receipt - both writes share a single SendTransactionRequest Co-Authored-By: Claude Sonnet 4.6 --- api/relay.go | 70 +++++++++++++++++++++------------------------------- 1 file changed, 28 insertions(+), 42 deletions(-) diff --git a/api/relay.go b/api/relay.go index f5dd2f74..5d93b358 100644 --- a/api/relay.go +++ b/api/relay.go @@ -263,54 +263,40 @@ func (app *ApiServer) relay(c *fiber.Ctx) error { const sosEndpoint = "https://sos.audius.co" func (app *ApiServer) handleRelay(ctx context.Context, logger *zap.Logger, decodedTx *v1.ManageEntityLegacy) (*v1.Transaction, error) { - // Dual-write to SOS network (best-effort, non-blocking, always fires) - go func() { - sosClient := sdk.NewOpenAudioSDK(sosEndpoint) - sosLogger := logger.With(zap.String("openaudio_endpoint", sosEndpoint)) - sosRes, sosErr := sosClient.Core.SendTransaction(context.Background(), connect.NewRequest(&v1.SendTransactionRequest{ - Transaction: &v1.SignedTransaction{ - Transaction: &v1.SignedTransaction_ManageEntity{ - ManageEntity: decodedTx, - }, + req := &v1.SendTransactionRequest{ + Transaction: &v1.SignedTransaction{ + Transaction: &v1.SignedTransaction_ManageEntity{ + ManageEntity: decodedTx, }, - })) - if sosErr != nil { - sosLogger.Warn("sos dual-write failed", zap.Error(sosErr)) - } else { - sosLogger.Info("sos dual-write confirmed", zap.String("hash", sosRes.Msg.Transaction.GetHash())) - } - }() - - allClients := app.openAudioPool.GetAll() - if len(allClients) == 0 { - logger.Error("no OpenAudio clients configured") - return nil, fmt.Errorf("no OpenAudio clients configured") + }, } - var lastErr error - for i, clientInfo := range allClients { - endpointLogger := logger.With(zap.String("openaudio_endpoint", clientInfo.Endpoint), zap.Int("attempt", i+1)) - res, err := clientInfo.Client.Core.SendTransaction(ctx, connect.NewRequest(&v1.SendTransactionRequest{ - Transaction: &v1.SignedTransaction{ - Transaction: &v1.SignedTransaction_ManageEntity{ - ManageEntity: decodedTx, - }, - }, - })) - - if err != nil { - lastErr = err - endpointLogger.Warn("transaction failed, trying next", zap.Error(err)) - continue + // mainnet + go func() { + allClients := app.openAudioPool.GetAll() + for i, clientInfo := range allClients { + endpointLogger := logger.With(zap.String("openaudio_endpoint", clientInfo.Endpoint), zap.Int("attempt", i+1)) + res, err := clientInfo.Client.Core.SendTransaction(context.Background(), connect.NewRequest(req)) + if err != nil { + endpointLogger.Warn("transaction failed, trying next", zap.Error(err)) + continue + } + endpointLogger.Info("transaction confirmed", zap.String("hash", res.Msg.Transaction.GetHash())) + return } + logger.Error("all mainnet endpoints failed") + }() - msg := res.Msg.Transaction - endpointLogger.Info("transaction confirmed", zap.String("hash", msg.GetHash())) - return msg, nil + // sos + sosClient := sdk.NewOpenAudioSDK(sosEndpoint) + sosLogger := logger.With(zap.String("openaudio_endpoint", sosEndpoint)) + res, err := sosClient.Core.SendTransaction(ctx, connect.NewRequest(req)) + if err != nil { + sosLogger.Warn("sos dual-write failed", zap.Error(err)) + return nil, err } - - logger.Error("all OpenAudio endpoints failed", zap.Error(lastErr)) - return nil, fmt.Errorf("all endpoints failed, last error: %w", lastErr) + sosLogger.Info("sos dual-write confirmed", zap.String("hash", res.Msg.Transaction.GetHash())) + return res.Msg.Transaction, nil } func transactionToReceipt(tx *v1.Transaction, wallet string) map[string]interface{} {