github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/sdk/auth/test_common.go (about)

     1  package auth
     2  
     3  import (
     4  	abci "github.com/gnolang/gno/tm2/pkg/bft/abci/types"
     5  	bft "github.com/gnolang/gno/tm2/pkg/bft/types"
     6  	"github.com/gnolang/gno/tm2/pkg/crypto"
     7  	"github.com/gnolang/gno/tm2/pkg/db/memdb"
     8  	"github.com/gnolang/gno/tm2/pkg/log"
     9  
    10  	"github.com/gnolang/gno/tm2/pkg/sdk"
    11  	"github.com/gnolang/gno/tm2/pkg/std"
    12  	"github.com/gnolang/gno/tm2/pkg/store"
    13  	"github.com/gnolang/gno/tm2/pkg/store/iavl"
    14  )
    15  
    16  type testEnv struct {
    17  	ctx  sdk.Context
    18  	acck AccountKeeper
    19  	bank BankKeeperI
    20  }
    21  
    22  func setupTestEnv() testEnv {
    23  	db := memdb.NewMemDB()
    24  
    25  	authCapKey := store.NewStoreKey("authCapKey")
    26  
    27  	ms := store.NewCommitMultiStore(db)
    28  	ms.MountStoreWithDB(authCapKey, iavl.StoreConstructor, db)
    29  	ms.LoadLatestVersion()
    30  
    31  	acck := NewAccountKeeper(authCapKey, std.ProtoBaseAccount)
    32  	bank := NewDummyBankKeeper(acck)
    33  
    34  	ctx := sdk.NewContext(sdk.RunTxModeDeliver, ms, &bft.Header{Height: 1, ChainID: "test-chain-id"}, log.NewNoopLogger())
    35  	ctx = ctx.WithValue(AuthParamsContextKey{}, DefaultParams())
    36  	ctx = ctx.WithConsensusParams(&abci.ConsensusParams{
    37  		Block: &abci.BlockParams{
    38  			MaxTxBytes:    1024,
    39  			MaxDataBytes:  1024 * 100,
    40  			MaxBlockBytes: 1024 * 100,
    41  			MaxGas:        10 * 1000 * 1000,
    42  			TimeIotaMS:    10,
    43  		},
    44  		Validator: &abci.ValidatorParams{
    45  			PubKeyTypeURLs: []string{}, // XXX
    46  		},
    47  	})
    48  
    49  	return testEnv{ctx: ctx, acck: acck, bank: bank}
    50  }
    51  
    52  // DummyBankKeeper defines a supply keeper used only for testing to avoid
    53  // circle dependencies
    54  type DummyBankKeeper struct {
    55  	acck AccountKeeper
    56  }
    57  
    58  // NewDummyBankKeeper creates a DummyBankKeeper instance
    59  func NewDummyBankKeeper(acck AccountKeeper) DummyBankKeeper {
    60  	return DummyBankKeeper{acck}
    61  }
    62  
    63  // SendCoins for the dummy supply keeper
    64  func (bank DummyBankKeeper) SendCoins(ctx sdk.Context, fromAddr crypto.Address, toAddr crypto.Address, amt std.Coins) error {
    65  	fromAcc := bank.acck.GetAccount(ctx, fromAddr)
    66  	toAcc := bank.acck.GetAccount(ctx, toAddr)
    67  	if toAcc == nil {
    68  		toAcc = bank.acck.NewAccountWithAddress(ctx, toAddr)
    69  	}
    70  
    71  	newFromCoins := fromAcc.GetCoins().SubUnsafe(amt)
    72  	if !newFromCoins.IsValid() {
    73  		return std.ErrInsufficientCoins(fromAcc.GetCoins().String())
    74  	}
    75  	newToCoins := toAcc.GetCoins().Add(amt)
    76  	if err := fromAcc.SetCoins(newFromCoins); err != nil {
    77  		return std.ErrInternal(err.Error())
    78  	}
    79  	bank.acck.SetAccount(ctx, fromAcc)
    80  	if err := toAcc.SetCoins(newToCoins); err != nil {
    81  		return std.ErrInternal(err.Error())
    82  	}
    83  	bank.acck.SetAccount(ctx, toAcc)
    84  
    85  	return nil
    86  }