Skip to content

Commit 52cd8b5

Browse files
authored
fix(state): Ensure user can submit tx from custom acct and bypass queue (#4698)
1 parent 48fc557 commit 52cd8b5

File tree

2 files changed

+117
-1
lines changed

2 files changed

+117
-1
lines changed

state/core_access.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ func (ca *CoreAccessor) SubmitPayForBlob(
262262
}
263263

264264
var response *user.TxResponse
265-
if ca.txWorkerAccounts > 0 {
265+
if ca.txWorkerAccounts > 0 && author.Equals(ca.defaultSignerAddress) {
266266
response, err = client.SubmitPayForBlobToQueue(ctx, libBlobs, opts...)
267267
} else {
268268
response, err = client.SubmitPayForBlobWithAccount(ctx, account.Name(), libBlobs, opts...)

state/core_access_test.go

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,122 @@ func TestTxWorkerSetup(t *testing.T) {
347347
require.NoError(t, err)
348348
}
349349

350+
// TestSubmitFromDefaultAccountWithoutTxWorkers ensures users can submit transactions
351+
// bypassing the queue from the default account
352+
func TestSubmitFromDefaultAccountWithoutTxWorkers(t *testing.T) {
353+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
354+
t.Cleanup(cancel)
355+
356+
accounts := []string{
357+
"jimmy", "carl", "sheen", "cindy",
358+
}
359+
360+
config := testnode.DefaultConfig().
361+
WithChainID(chainID).
362+
WithFundedAccounts(accounts...).
363+
WithDelayedPrecommitTimeout(time.Millisecond)
364+
365+
cctx, _, grpcAddr := testnode.NewNetwork(t, config)
366+
conn, err := grpc.NewClient(grpcAddr, grpc.WithTransportCredentials(insecure.NewCredentials()))
367+
require.NoError(t, err)
368+
369+
// configured without txworkers
370+
ca, err := NewCoreAccessor(cctx.Keyring, accounts[0], localHeader{cctx.Client}, conn, chainID, nil)
371+
require.NoError(t, err)
372+
err = ca.Start(ctx)
373+
require.NoError(t, err)
374+
375+
randBlob, err := libshare.GenerateV0Blobs([]int{8}, false)
376+
require.NoError(t, err)
377+
378+
nonDefaultAcct, err := cctx.Keyring.Key(accounts[3])
379+
require.NoError(t, err)
380+
addr, err := nonDefaultAcct.GetAddress()
381+
require.NoError(t, err)
382+
383+
// check bals of accounts before tx (TODO @renaynay: hack til we get signer in txresp)
384+
sdkAddress, err := sdktypes.AccAddressFromHexUnsafe(fmt.Sprintf("%X", addr.Bytes()))
385+
require.NoError(t, err)
386+
balNonDefault, err := ca.BalanceForAddress(ctx, Address{sdkAddress})
387+
require.NoError(t, err)
388+
balDefault, err := ca.Balance(ctx)
389+
require.NoError(t, err)
390+
391+
// default tx config (submit from default acct)
392+
_, err = ca.SubmitPayForBlob(ctx, randBlob, NewTxConfig())
393+
require.NoError(t, err)
394+
395+
// ensure balance has remained the same for non-default account
396+
updatedBalNonDefault, err := ca.BalanceForAddress(ctx, Address{sdkAddress})
397+
require.NoError(t, err)
398+
require.True(t, updatedBalNonDefault.Amount.Equal(balNonDefault.Amount))
399+
400+
// ensure balance decreased for default account
401+
updatedBalDefault, err := ca.Balance(ctx)
402+
require.NoError(t, err)
403+
require.True(t, updatedBalDefault.Amount.LT(balDefault.Amount))
404+
405+
// TODO @renaynay: once tx response contains signer, check signer here
406+
}
407+
408+
// TestSubmitFromCustomAccount ensures users can submit transactions
409+
// from a non-default account
410+
func TestSubmitFromCustomAccount(t *testing.T) {
411+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
412+
t.Cleanup(cancel)
413+
414+
accounts := []string{
415+
"jimmy", "carl", "sheen", "cindy",
416+
}
417+
418+
config := testnode.DefaultConfig().
419+
WithChainID(chainID).
420+
WithFundedAccounts(accounts...).
421+
WithDelayedPrecommitTimeout(time.Millisecond)
422+
423+
cctx, _, grpcAddr := testnode.NewNetwork(t, config)
424+
conn, err := grpc.NewClient(grpcAddr, grpc.WithTransportCredentials(insecure.NewCredentials()))
425+
require.NoError(t, err)
426+
427+
ca, err := NewCoreAccessor(cctx.Keyring, accounts[0], localHeader{cctx.Client}, conn, chainID, nil,
428+
WithTxWorkerAccounts(8))
429+
require.NoError(t, err)
430+
err = ca.Start(ctx)
431+
require.NoError(t, err)
432+
433+
randBlob, err := libshare.GenerateV0Blobs([]int{8}, false)
434+
require.NoError(t, err)
435+
436+
nonDefaultAcct, err := cctx.Keyring.Key(accounts[3])
437+
require.NoError(t, err)
438+
addr, err := nonDefaultAcct.GetAddress()
439+
require.NoError(t, err)
440+
441+
// check bals of accounts before tx (TODO @renaynay: hack til we get signer in txresp)
442+
sdkAddress, err := sdktypes.AccAddressFromHexUnsafe(fmt.Sprintf("%X", addr.Bytes()))
443+
require.NoError(t, err)
444+
balNonDefault, err := ca.BalanceForAddress(ctx, Address{sdkAddress})
445+
require.NoError(t, err)
446+
balDefault, err := ca.Balance(ctx)
447+
require.NoError(t, err)
448+
449+
txConf := NewTxConfig(WithSignerAddress(addr.String()))
450+
_, err = ca.SubmitPayForBlob(ctx, randBlob, txConf)
451+
require.NoError(t, err)
452+
453+
// ensure balance has decreased for non-default account
454+
updatedBalNonDefault, err := ca.BalanceForAddress(ctx, Address{sdkAddress})
455+
require.NoError(t, err)
456+
require.True(t, updatedBalNonDefault.Amount.LT(balNonDefault.Amount))
457+
458+
// ensure balance remained same for default account
459+
updatedBalDefault, err := ca.Balance(ctx)
460+
require.NoError(t, err)
461+
require.True(t, updatedBalDefault.Equal(balDefault))
462+
463+
// TODO @renaynay: once tx response contains signer, check signer here
464+
}
465+
350466
func buildAccessor(t *testing.T, opts ...Option) (*CoreAccessor, []string) {
351467
t.Helper()
352468
accounts := []string{

0 commit comments

Comments
 (0)