From 9e9c0a57d36d002777877847cbbf62832b4bddab Mon Sep 17 00:00:00 2001 From: Stuart Kuentzel Date: Fri, 9 Jan 2026 09:01:21 +0900 Subject: [PATCH 1/2] adds balance code to network create args --- controller/network_controller.go | 21 +++++++++++++++++++-- go.sum | 12 ------------ model/network_model.go | 1 + 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/controller/network_controller.go b/controller/network_controller.go index c8711369..fe23bd44 100644 --- a/controller/network_controller.go +++ b/controller/network_controller.go @@ -22,9 +22,26 @@ func NetworkCreate( return result, nil } - // model.CreateNetworkReferralCode(session.Ctx, result.Network.NetworkId) + if networkCreate.BalanceCode != nil { - AddRefreshTransferBalance(session.Ctx, result.Network.NetworkId) + balanceCode := &model.RedeemBalanceCodeArgs{ + Secret: *networkCreate.BalanceCode, + } + + // this will add transfer balance and mark the user as paid if successful + _, err := model.RedeemBalanceCode(balanceCode, session) + + if err != nil { + // we don't want this to block creating a network + // users will be able to try and redeem in their account later + // add normal balance and continue + AddRefreshTransferBalance(session.Ctx, result.Network.NetworkId) + } + + } else { + // no balance code, add normal balance + AddRefreshTransferBalance(session.Ctx, result.Network.NetworkId) + } if networkCreate.ReferralCode != nil { model.CreateNetworkReferral( diff --git a/go.sum b/go.sum index 1ecf8276..23a7d84a 100644 --- a/go.sum +++ b/go.sum @@ -93,8 +93,6 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.7.6 h1:rWQc5FwZSPX58r1OQmkuaNicxdmExaEz5A2DO2hUuTk= -github.com/jackc/pgx/v5 v5.7.6/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= github.com/jackc/pgx/v5 v5.8.0 h1:TYPDoleBBme0xGSAX3/+NujXXtpZn9HBONkQC7IEZSo= github.com/jackc/pgx/v5 v5.8.0/go.mod h1:QVeDInX2m9VyzvNeiCJVjCkNFqzsNb43204HshNSZKw= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= @@ -180,8 +178,6 @@ github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= github.com/prometheus/procfs v0.16.0 h1:xh6oHhKwnOJKMYiYBDWmkHqQPyiY40sny36Cmx2bbsM= github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg= -github.com/quic-go/quic-go v0.57.1 h1:25KAAR9QR8KZrCZRThWMKVAwGoiHIrNbT72ULHTuI10= -github.com/quic-go/quic-go v0.57.1/go.mod h1:ly4QBAjHA2VhdnxhojRsCUOeJwKYg+taDlos92xb1+s= github.com/quic-go/quic-go v0.58.0 h1:ggY2pvZaVdB9EyojxL1p+5mptkuHyX5MOSv4dgWF4Ug= github.com/quic-go/quic-go v0.58.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU= github.com/redis/go-redis/v9 v9.17.2 h1:P2EGsA4qVIM3Pp+aPocCJ7DguDHhqrXNhVcEp4ViluI= @@ -252,8 +248,6 @@ golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= -golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39 h1:DHNhtq3sNNzrvduZZIiFyXWOL9IWaDPHqTnLJp+rCBY= -golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0= golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0= golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -273,8 +267,6 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -318,8 +310,6 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= -golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= -golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -331,8 +321,6 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= -google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/model/network_model.go b/model/network_model.go index 45ba565c..fd5b2e88 100644 --- a/model/network_model.go +++ b/model/network_model.go @@ -76,6 +76,7 @@ type NetworkCreateArgs struct { GuestMode bool `json:"guest_mode"` VerifyUseNumeric bool `json:"verify_use_numeric"` ReferralCode *string `json:"referral_code,omitempty"` + BalanceCode *string `json:"balance_code,omitempty"` WalletAuth *WalletAuthArgs `json:"wallet_auth,omitempty"` } From 7aa787874ef2988c34f4e9af01083bdf7bb618f6 Mon Sep 17 00:00:00 2001 From: Stuart Kuentzel Date: Fri, 9 Jan 2026 10:30:41 +0900 Subject: [PATCH 2/2] rework redeeming balance code params; adds tests --- api/handlers/subscription_handlers.go | 2 +- connect/connect_test.go | 11 ++--- controller/account_payment_controller_test.go | 5 ++- controller/network_controller.go | 5 ++- controller/network_controller_test.go | 44 +++++++++++++++++++ controller/subscription_controller.go | 18 ++++++++ model/account_payment_model_test.go | 15 ++++--- model/account_point_model_test.go | 5 ++- model/leaderboard_model_test.go | 5 ++- model/subscription_model.go | 17 ++++--- model/subscription_model_test.go | 20 +++++---- 11 files changed, 112 insertions(+), 35 deletions(-) diff --git a/api/handlers/subscription_handlers.go b/api/handlers/subscription_handlers.go index 33ceb492..b6d4b2f7 100644 --- a/api/handlers/subscription_handlers.go +++ b/api/handlers/subscription_handlers.go @@ -53,7 +53,7 @@ func SubscriptionCheckBalanceCode(w http.ResponseWriter, r *http.Request) { } func SubscriptionRedeemBalanceCode(w http.ResponseWriter, r *http.Request) { - router.WrapWithInputRequireAuth(model.RedeemBalanceCode, w, r) + router.WrapWithInputRequireAuth(controller.RedeemBalanceCode, w, r) } func SubscriptionCreatePaymentId(w http.ResponseWriter, r *http.Request) { diff --git a/connect/connect_test.go b/connect/connect_test.go index 2b2d38eb..427f28be 100644 --- a/connect/connect_test.go +++ b/connect/connect_test.go @@ -25,7 +25,6 @@ import ( "github.com/urnetwork/server/jwt" "github.com/urnetwork/server/model" "github.com/urnetwork/server/router" - "github.com/urnetwork/server/session" ) func TestConnectNoNack(t *testing.T) { @@ -788,9 +787,10 @@ func testConnect( result, err := model.RedeemBalanceCode( &model.RedeemBalanceCodeArgs{ - Secret: balanceCodeA.Secret, + Secret: balanceCodeA.Secret, + NetworkId: networkIdA, }, - session.NewLocalClientSession(ctx, "0.0.0.0", byJwtA), + ctx, ) assert.Equal(t, nil, err) assert.Equal(t, nil, result.Error) @@ -808,9 +808,10 @@ func testConnect( result, err = model.RedeemBalanceCode( &model.RedeemBalanceCodeArgs{ - Secret: balanceCodeB.Secret, + Secret: balanceCodeB.Secret, + NetworkId: networkIdB, }, - session.NewLocalClientSession(ctx, "0.0.0.0", byJwtB), + ctx, ) assert.Equal(t, nil, err) assert.Equal(t, nil, result.Error) diff --git a/controller/account_payment_controller_test.go b/controller/account_payment_controller_test.go index 8196bc59..210a2ae2 100644 --- a/controller/account_payment_controller_test.go +++ b/controller/account_payment_controller_test.go @@ -72,8 +72,9 @@ func TestSubscriptionSendPayment(t *testing.T) { ) assert.Equal(t, err, nil) model.RedeemBalanceCode(&model.RedeemBalanceCodeArgs{ - Secret: balanceCode.Secret, - }, sourceSession) + Secret: balanceCode.Secret, + NetworkId: sourceSession.ByJwt.NetworkId, + }, ctx) transferEscrow, err := model.CreateTransferEscrow(ctx, sourceNetworkId, sourceId, destinationNetworkId, destinationId, 1024*1024) assert.Equal(t, err, nil) diff --git a/controller/network_controller.go b/controller/network_controller.go index fe23bd44..d192c4a6 100644 --- a/controller/network_controller.go +++ b/controller/network_controller.go @@ -25,11 +25,12 @@ func NetworkCreate( if networkCreate.BalanceCode != nil { balanceCode := &model.RedeemBalanceCodeArgs{ - Secret: *networkCreate.BalanceCode, + Secret: *networkCreate.BalanceCode, + NetworkId: result.Network.NetworkId, } // this will add transfer balance and mark the user as paid if successful - _, err := model.RedeemBalanceCode(balanceCode, session) + _, err := model.RedeemBalanceCode(balanceCode, session.Ctx) if err != nil { // we don't want this to block creating a network diff --git a/controller/network_controller_test.go b/controller/network_controller_test.go index 09da06d5..0041717f 100644 --- a/controller/network_controller_test.go +++ b/controller/network_controller_test.go @@ -180,3 +180,47 @@ func TestNetworkNameUpdate(t *testing.T) { assert.Equal(t, networkResult.NetworkName, updatedNetworkName) }) } + +func TestNetworkCreateWithBalanceCodeSuccess(t *testing.T) { + server.DefaultTestEnv().Run(func() { + + ctx := context.Background() + session := session.Testing_CreateClientSession(ctx, nil) + + userAuth := "foo@ur.io" + password := "bar123456789Foo!" + + netTransferByteCount := model.ByteCount(1024 * 1024) + netRevenue := model.UsdToNanoCents(10.00) + subscriptionYearDuration := 365 * 24 * time.Hour + + balanceCode, err := model.CreateBalanceCode( + ctx, + netTransferByteCount, + subscriptionYearDuration, + netRevenue, + "", + "", + "", + ) + assert.Equal(t, err, nil) + + networkCreate := model.NetworkCreateArgs{ + UserName: "", + UserAuth: &userAuth, + Password: &password, + NetworkName: "foobar", + Terms: true, + GuestMode: false, + BalanceCode: &balanceCode.Secret, + } + + result, err := NetworkCreate(networkCreate, session) + assert.Equal(t, err, nil) + assert.Equal(t, result.Error, nil) + + isPro := model.IsPro(ctx, &result.Network.NetworkId) + assert.Equal(t, isPro, true) + + }) +} diff --git a/controller/subscription_controller.go b/controller/subscription_controller.go index 55b2ec58..892df2e1 100644 --- a/controller/subscription_controller.go +++ b/controller/subscription_controller.go @@ -1045,6 +1045,24 @@ func CreateBalanceCode( } } +type RedeemBalanceCodeArgs struct { + Secret string `json:"secret"` +} + +func RedeemBalanceCode( + redeemBalanceCode RedeemBalanceCodeArgs, + session *session.ClientSession, +) (*model.RedeemBalanceCodeResult, error) { + + return model.RedeemBalanceCode( + &model.RedeemBalanceCodeArgs{ + Secret: redeemBalanceCode.Secret, + NetworkId: session.ByJwt.NetworkId, + }, + session.Ctx, + ) +} + // https://developers.google.com/android-publisher/authorization func playAuth(ctx context.Context) (string, error) { form := url.Values{} diff --git a/model/account_payment_model_test.go b/model/account_payment_model_test.go index 67788e5a..eefec3b3 100644 --- a/model/account_payment_model_test.go +++ b/model/account_payment_model_test.go @@ -49,8 +49,9 @@ func TestCancelAccountPayment(t *testing.T) { ) assert.Equal(t, err, nil) RedeemBalanceCode(&RedeemBalanceCodeArgs{ - Secret: balanceCode.Secret, - }, sourceSession) + Secret: balanceCode.Secret, + NetworkId: sourceNetworkId, + }, sourceSession.Ctx) transferEscrow, err := CreateTransferEscrow(ctx, sourceNetworkId, sourceId, destinationNetworkId, destinationId, 1024*1024) assert.Equal(t, err, nil) @@ -162,8 +163,9 @@ func TestGetNetworkProvideStats(t *testing.T) { ) assert.Equal(t, err, nil) RedeemBalanceCode(&RedeemBalanceCodeArgs{ - Secret: balanceCode.Secret, - }, sourceSession) + Secret: balanceCode.Secret, + NetworkId: sourceSession.ByJwt.NetworkId, + }, sourceSession.Ctx) // create a wallet to receive the payout args := &CreateAccountWalletExternalArgs{ @@ -297,8 +299,9 @@ func TestPaymentPlanSubsidy(t *testing.T) { ) assert.Equal(t, err, nil) RedeemBalanceCode(&RedeemBalanceCodeArgs{ - Secret: balanceCode.Secret, - }, sourceSession) + Secret: balanceCode.Secret, + NetworkId: sourceSession.ByJwt.NetworkId, + }, sourceSession.Ctx) contractIds := GetOpenContractIds(ctx, sourceId, destinationId) assert.Equal(t, len(contractIds), 0) diff --git a/model/account_point_model_test.go b/model/account_point_model_test.go index 6deeebd2..a8e8e356 100644 --- a/model/account_point_model_test.go +++ b/model/account_point_model_test.go @@ -204,8 +204,9 @@ func TestAccountPointsPerPayout(t *testing.T) { ) assert.Equal(t, err, nil) RedeemBalanceCode(&RedeemBalanceCodeArgs{ - Secret: balanceCode.Secret, - }, clientSessionC) + Secret: balanceCode.Secret, + NetworkId: clientSessionC.ByJwt.NetworkId, + }, clientSessionC.Ctx) usedTransferByteCount := ByteCount(1024 * 1024 * 1024) diff --git a/model/leaderboard_model_test.go b/model/leaderboard_model_test.go index 9eecfac7..7b6bf375 100644 --- a/model/leaderboard_model_test.go +++ b/model/leaderboard_model_test.go @@ -74,8 +74,9 @@ func TestLeaderboard(t *testing.T) { ) assert.Equal(t, err, nil) RedeemBalanceCode(&RedeemBalanceCodeArgs{ - Secret: balanceCode.Secret, - }, clientSessionC) + Secret: balanceCode.Secret, + NetworkId: clientSessionC.ByJwt.NetworkId, + }, clientSessionC.Ctx) usedTransferByteCount := ByteCount(1024 * 1024 * 1024) paid := NanoCents(0) diff --git a/model/subscription_model.go b/model/subscription_model.go index 4fdfc764..0bf451a4 100644 --- a/model/subscription_model.go +++ b/model/subscription_model.go @@ -373,7 +373,8 @@ func CreateBalanceCode( } type RedeemBalanceCodeArgs struct { - Secret string `json:"secret"` + Secret string `json:"secret"` + NetworkId server.Id `json:"network_id"` } type RedeemBalanceCodeResult struct { @@ -394,11 +395,11 @@ type RedeemBalanceCodeError struct { func RedeemBalanceCode( redeemBalanceCode *RedeemBalanceCodeArgs, - session *session.ClientSession, + ctx context.Context, ) (redeemBalanceCodeResult *RedeemBalanceCodeResult, returnErr error) { - server.Tx(session.Ctx, func(tx server.PgTx) { + server.Tx(ctx, func(tx server.PgTx) { result, err := tx.Query( - session.Ctx, + ctx, ` SELECT balance_code_id, @@ -442,7 +443,7 @@ func RedeemBalanceCode( endTime := now.Add(duration) server.RaisePgResult(tx.Exec( - session.Ctx, + ctx, ` UPDATE transfer_balance_code SET @@ -461,7 +462,7 @@ func RedeemBalanceCode( )) server.RaisePgResult(tx.Exec( - session.Ctx, + ctx, ` INSERT INTO transfer_balance ( balance_id, @@ -475,7 +476,9 @@ func RedeemBalanceCode( VALUES ($1, $2, $3, $4, $5, $5, $6) `, balanceId, - session.ByJwt.NetworkId, + // note: we don't use session.Jwt.NetworkId here + // users can redeem when creating a network, in which case the jwt is not yet threaded + redeemBalanceCode.NetworkId, now, endTime, balanceCode.BalanceByteCount, diff --git a/model/subscription_model_test.go b/model/subscription_model_test.go index bebc4de3..bdc0d5ec 100644 --- a/model/subscription_model_test.go +++ b/model/subscription_model_test.go @@ -116,8 +116,9 @@ func TestEscrow(t *testing.T) { ) assert.Equal(t, err, nil) RedeemBalanceCode(&RedeemBalanceCodeArgs{ - Secret: balanceCode.Secret, - }, sourceSession) + Secret: balanceCode.Secret, + NetworkId: sourceSession.ByJwt.NetworkId, + }, ctx) contractIds := GetOpenContractIds(ctx, sourceId, destinationId) assert.Equal(t, len(contractIds), 0) @@ -363,8 +364,9 @@ func TestCompanionEscrowAndCheckpoint(t *testing.T) { ) assert.Equal(t, err, nil) RedeemBalanceCode(&RedeemBalanceCodeArgs{ - Secret: balanceCode.Secret, - }, destinationSession) + Secret: balanceCode.Secret, + NetworkId: destinationSession.ByJwt.NetworkId, + }, ctx) contractIds := GetOpenContractIds(ctx, sourceId, destinationId) assert.Equal(t, len(contractIds), 0) @@ -656,9 +658,10 @@ func TestBalanceCode(t *testing.T) { redeemResult0, err := RedeemBalanceCode( &RedeemBalanceCodeArgs{ - Secret: balanceCode.Secret, + Secret: balanceCode.Secret, + NetworkId: clientSessionA.ByJwt.NetworkId, }, - clientSessionA, + ctx, ) assert.Equal(t, err, nil) assert.Equal(t, redeemResult0.Error, nil) @@ -1311,8 +1314,9 @@ func TestGetOpenTransferByteCount(t *testing.T) { ) assert.Equal(t, err, nil) RedeemBalanceCode(&RedeemBalanceCodeArgs{ - Secret: balanceCode.Secret, - }, sourceSession) + Secret: balanceCode.Secret, + NetworkId: sourceSession.ByJwt.NetworkId, + }, ctx) paid := NanoCents(0) paidByteCount := ByteCount(0)