Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 29 additions & 25 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,26 @@ export GO111MODULE = on
LEDGER_ENABLED ?= true
build_tags = netgo
ifeq ($(LEDGER_ENABLED),true)
ifeq ($(OS),Windows_NT)
GCCEXE = $(shell where gcc.exe 2> NUL)
ifeq ($(GCCEXE),)
$(error gcc.exe not installed for ledger support, please install or set LEDGER_ENABLED=false)
else
build_tags += ledger
endif
else
UNAME_S = $(shell uname -s)
ifeq ($(UNAME_S),OpenBSD)
$(warning OpenBSD detected, disabling ledger support (https://github.com/cosmos/cosmos-sdk/issues/1988))
else
GCC = $(shell command -v gcc 2> /dev/null)
ifeq ($(GCC),)
$(error gcc not installed for ledger support, please install or set LEDGER_ENABLED=false)
else
build_tags += ledger
endif
endif
endif
ifeq ($(OS),Windows_NT)
GCCEXE = $(shell where gcc.exe 2> NUL)
ifeq ($(GCCEXE),)
$(error gcc.exe not installed for ledger support, please install or set LEDGER_ENABLED=false)
else
build_tags += ledger
endif
else
UNAME_S = $(shell uname -s)
ifeq ($(UNAME_S),OpenBSD)
$(warning OpenBSD detected, disabling ledger support (https://github.com/cosmos/cosmos-sdk/issues/1988))
else
GCC = $(shell command -v gcc 2> /dev/null)
ifeq ($(GCC),)
$(error gcc not installed for ledger support, please install or set LEDGER_ENABLED=false)
else
build_tags += ledger
endif
endif
endif
endif

build_tags += $(BUILD_TAGS)
Expand All @@ -43,13 +43,13 @@ build_tags_comma_sep := $(subst $(whitespace),$(comma),$(build_tags))
# process linker flags

ldflags = -X github.com/cosmos/cosmos-sdk/version.Name=sei \
-X github.com/cosmos/cosmos-sdk/version.ServerName=seid \
-X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \
-X github.com/cosmos/cosmos-sdk/version.Commit=$(COMMIT) \
-X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags_comma_sep)"
-X github.com/cosmos/cosmos-sdk/version.ServerName=seid \
-X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \
-X github.com/cosmos/cosmos-sdk/version.Commit=$(COMMIT) \
-X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags_comma_sep)"

ifeq ($(LINK_STATICALLY),true)
ldflags += -linkmode=external -extldflags "-Wl,-z,muldefs -static"
ldflags += -linkmode=external -extldflags "-Wl,-z,muldefs -static"
endif
ldflags += $(LDFLAGS)
ldflags := $(strip $(ldflags))
Expand All @@ -64,6 +64,10 @@ all: lint install
install: go.sum
go install $(BUILD_FLAGS) ./cmd/seid

loadtest: go.sum
go build $(BUILD_FLAGS) -o ./build/loadtest ./loadtest/


go.sum: go.mod
@echo "--> Ensure dependencies have not been modified"
@go mod verify
Expand Down
91 changes: 91 additions & 0 deletions aclmapping/bank/mappings.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package aclbankmapping

import (
"fmt"

sdk "github.com/cosmos/cosmos-sdk/types"
sdkacltypes "github.com/cosmos/cosmos-sdk/types/accesscontrol"
aclkeeper "github.com/cosmos/cosmos-sdk/x/accesscontrol/keeper"
acltypes "github.com/cosmos/cosmos-sdk/x/accesscontrol/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
utils "github.com/sei-protocol/sei-chain/aclmapping/utils"
)

var ErrorInvalidMsgType = fmt.Errorf("invalid message received for bank module")

func GetBankDepedencyGenerator() aclkeeper.DependencyGeneratorMap {
dependencyGeneratorMap := make(aclkeeper.DependencyGeneratorMap)

// dex place orders
placeOrdersKey := acltypes.GenerateMessageKey(&banktypes.MsgSend{})
dependencyGeneratorMap[placeOrdersKey] = MsgSendDependencyGenerator

return dependencyGeneratorMap
}

func MsgSendDependencyGenerator(keeper aclkeeper.Keeper, ctx sdk.Context, msg sdk.Msg) ([]sdkacltypes.AccessOperation, error) {
msgSend, ok := msg.(*banktypes.MsgSend)
if !ok {
return []sdkacltypes.AccessOperation{}, ErrorInvalidMsgType
}
fromAddrIdentifier := string(banktypes.CreateAccountBalancesPrefixFromBech32(msgSend.FromAddress))
toAddrIdentifier := string(banktypes.CreateAccountBalancesPrefixFromBech32(msgSend.ToAddress))

accessOperations := []sdkacltypes.AccessOperation{
// MsgSend also checks if the coin denom is enabled, but the information is from the params.
// Changing the param would require a gov proposal, which is synchrounos by default

// Checks balance of sender
{
AccessType: sdkacltypes.AccessType_READ,
ResourceType: sdkacltypes.ResourceType_KV_BANK_BALANCES,
IdentifierTemplate: fromAddrIdentifier,
},
// Reduce the amount from the sender's balance
{
AccessType: sdkacltypes.AccessType_WRITE,
ResourceType: sdkacltypes.ResourceType_KV_BANK_BALANCES,
IdentifierTemplate: fromAddrIdentifier,
},

// Checks balance for receiver
{
AccessType: sdkacltypes.AccessType_READ,
ResourceType: sdkacltypes.ResourceType_KV_BANK_BALANCES,
IdentifierTemplate: toAddrIdentifier,
},
{
AccessType: sdkacltypes.AccessType_WRITE,
ResourceType: sdkacltypes.ResourceType_KV_BANK_BALANCES,
IdentifierTemplate: toAddrIdentifier,
},

// Tries to create the reciever's account if it doesn't exist
{
AccessType: sdkacltypes.AccessType_READ,
ResourceType: sdkacltypes.ResourceType_KV_AUTH_ADDRESS_STORE,
IdentifierTemplate: string(authtypes.CreateAddressStoreKeyFromBech32(msgSend.ToAddress)),
},
{
AccessType: sdkacltypes.AccessType_WRITE,
ResourceType: sdkacltypes.ResourceType_KV_AUTH_ADDRESS_STORE,
IdentifierTemplate: string(authtypes.CreateAddressStoreKeyFromBech32(msgSend.ToAddress)),
},

// Gets Account Info for the sender
{
AccessType: sdkacltypes.AccessType_READ,
ResourceType: sdkacltypes.ResourceType_KV_AUTH_ADDRESS_STORE,
IdentifierTemplate: string(authtypes.CreateAddressStoreKeyFromBech32(msgSend.FromAddress)),
},

{
ResourceType: sdkacltypes.ResourceType_ANY,
AccessType: sdkacltypes.AccessType_COMMIT,
IdentifierTemplate: utils.DefaultIDTemplate,
},
}

return accessOperations, nil
}
158 changes: 158 additions & 0 deletions aclmapping/bank/mappings_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
package aclbankmapping

import (
"testing"

"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
"github.com/cosmos/cosmos-sdk/simapp"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkacltypes "github.com/cosmos/cosmos-sdk/types/accesscontrol"
acltypes "github.com/cosmos/cosmos-sdk/x/accesscontrol/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
"github.com/cosmos/cosmos-sdk/x/bank"
"github.com/cosmos/cosmos-sdk/x/bank/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
aclutils "github.com/sei-protocol/sei-chain/aclmapping/utils"
oracletypes "github.com/sei-protocol/sei-chain/x/oracle/types"
"github.com/stretchr/testify/require"
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
)


func cacheTxContext(ctx sdk.Context) (sdk.Context, sdk.CacheMultiStore) {
ms := ctx.MultiStore()
msCache := ms.CacheMultiStore()
return ctx.WithMultiStore(msCache), msCache
}

func TestMsgBankSendAclOps(t *testing.T) {
priv1 := secp256k1.GenPrivKey()
addr1 := sdk.AccAddress(priv1.PubKey().Address())
priv2 := secp256k1.GenPrivKey()
addr2 := sdk.AccAddress(priv2.PubKey().Address())
coins := sdk.Coins{sdk.NewInt64Coin("foocoin", 10)}

tests := []struct {
name string
expectedError error
msg *types.MsgSend
dynamicDep bool
}{
{
name: "default send",
msg: types.NewMsgSend(addr1, addr2, coins),
expectedError: nil,
dynamicDep: true,
},
{
name: "dont check synchronous",
msg: types.NewMsgSend(addr1, addr2, coins),
expectedError: nil,
dynamicDep: false,
},
}

acc1 := &authtypes.BaseAccount{
Address: addr1.String(),
}
acc2 := &authtypes.BaseAccount{
Address: addr2.String(),
}
accs := authtypes.GenesisAccounts{acc1, acc2}
balances := []types.Balance{
{
Address: addr1.String(),
Coins: coins,
},
{
Address: addr2.String(),
Coins: coins,
},
}

app := simapp.SetupWithGenesisAccounts(accs, balances...)
ctx := app.BaseApp.NewContext(false, tmproto.Header{})

handler := bank.NewHandler(app.BankKeeper)
msgValidator := sdkacltypes.NewMsgValidator(aclutils.StoreKeyToResourceTypePrefixMap)
ctx = ctx.WithMsgValidator(msgValidator)

for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
handlerCtx, cms := cacheTxContext(ctx)

_, err := handler(handlerCtx, tc.msg)

depdenencies , _ := MsgSendDependencyGenerator(app.AccessControlKeeper, handlerCtx, tc.msg)

if !tc.dynamicDep {
depdenencies = sdkacltypes.SynchronousAccessOps()
}

if tc.expectedError != nil {
require.EqualError(t, err, tc.expectedError.Error())
} else {
require.NoError(t, err)
}
missing := handlerCtx.MsgValidator().ValidateAccessOperations(depdenencies, cms.GetEvents())
require.Empty(t, missing)
})
}
}

func TestGeneratorInvalidMessageTypes(t *testing.T) {
accs := authtypes.GenesisAccounts{}
balances := []types.Balance{}

app := simapp.SetupWithGenesisAccounts(accs, balances...)
ctx := app.BaseApp.NewContext(false, tmproto.Header{})

oracleVote := oracletypes.MsgAggregateExchangeRateVote{
ExchangeRates: "1usei",
Feeder: "test",
Validator: "validator",
}

_, err := MsgSendDependencyGenerator(app.AccessControlKeeper, ctx, &oracleVote)
require.Error(t, err)
}

func TestMsgBeginBankSendGenerator(t *testing.T) {
priv1 := secp256k1.GenPrivKey()
addr1 := sdk.AccAddress(priv1.PubKey().Address())
priv2 := secp256k1.GenPrivKey()
addr2 := sdk.AccAddress(priv2.PubKey().Address())
coins := sdk.Coins{sdk.NewInt64Coin("foocoin", 10)}

acc1 := &authtypes.BaseAccount{
Address: addr1.String(),
}
acc2 := &authtypes.BaseAccount{
Address: addr2.String(),
}
accs := authtypes.GenesisAccounts{acc1, acc2}
balances := []types.Balance{
{
Address: addr1.String(),
Coins: coins,
},
{
Address: addr2.String(),
Coins: coins,
},
}

app := simapp.SetupWithGenesisAccounts(accs, balances...)
ctx := app.BaseApp.NewContext(false, tmproto.Header{})

sendMsg := banktypes.MsgSend{
FromAddress: addr1.String(),
ToAddress: addr2.String(),
Amount: coins,
}

accessOps, err := MsgSendDependencyGenerator(app.AccessControlKeeper, ctx, &sendMsg)
require.NoError(t, err)
err = acltypes.ValidateAccessOps(accessOps)
require.NoError(t, err)
}
27 changes: 27 additions & 0 deletions aclmapping/dependency_generator.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package aclmapping

import (
aclkeeper "github.com/cosmos/cosmos-sdk/x/accesscontrol/keeper"
aclbankmapping "github.com/sei-protocol/sei-chain/aclmapping/bank"
acldexmapping "github.com/sei-protocol/sei-chain/aclmapping/dex"
acltokenfactorymapping "github.com/sei-protocol/sei-chain/aclmapping/tokenfactory"
aclwasmmapping "github.com/sei-protocol/sei-chain/aclmapping/wasm"
)

type CustomDependencyGenerator struct{}

func NewCustomDependencyGenerator() CustomDependencyGenerator {
return CustomDependencyGenerator{}
}

func (customDepGen CustomDependencyGenerator) GetCustomDependencyGenerators() aclkeeper.DependencyGeneratorMap {
dependencyGeneratorMap := make(aclkeeper.DependencyGeneratorMap)
wasmDependencyGenerators := aclwasmmapping.NewWasmDependencyGenerator()

dependencyGeneratorMap = dependencyGeneratorMap.Merge(acldexmapping.GetDexDependencyGenerators())
dependencyGeneratorMap = dependencyGeneratorMap.Merge(aclbankmapping.GetBankDepedencyGenerator())
dependencyGeneratorMap = dependencyGeneratorMap.Merge(acltokenfactorymapping.GetTokenFactoryDependencyGenerators())
dependencyGeneratorMap = dependencyGeneratorMap.Merge(wasmDependencyGenerators.GetWasmDependencyGenerators())

return dependencyGeneratorMap
}
Loading