-
Notifications
You must be signed in to change notification settings - Fork 805
/
evm.go
102 lines (88 loc) · 3.09 KB
/
evm.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package keeper
import (
"encoding/hex"
"sync"
"time"
"github.com/cosmos/cosmos-sdk/crypto/hd"
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/go-bip39"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/sei-protocol/sei-chain/app"
evmkeeper "github.com/sei-protocol/sei-chain/x/evm/keeper"
evmtypes "github.com/sei-protocol/sei-chain/x/evm/types"
)
var EVMTestApp = app.Setup(false, true)
var mockKeeper *evmkeeper.Keeper
var mockCtx sdk.Context
var mtx = &sync.Mutex{}
func MockEVMKeeperWithPrecompiles() (*evmkeeper.Keeper, sdk.Context) {
mtx.Lock()
defer mtx.Unlock()
if mockKeeper != nil {
return mockKeeper, mockCtx
}
ctx := EVMTestApp.GetContextForDeliverTx([]byte{}).WithBlockHeight(8)
k := EVMTestApp.EvmKeeper
k.InitGenesis(ctx, *evmtypes.DefaultGenesis())
// mint some coins to a sei address
seiAddr, err := sdk.AccAddressFromHex(common.Bytes2Hex([]byte("seiAddr")))
if err != nil {
panic(err)
}
err = EVMTestApp.BankKeeper.MintCoins(ctx, "evm", sdk.NewCoins(sdk.NewCoin("usei", sdk.NewInt(10))))
if err != nil {
panic(err)
}
err = EVMTestApp.BankKeeper.SendCoinsFromModuleToAccount(ctx, "evm", seiAddr, sdk.NewCoins(sdk.NewCoin("usei", sdk.NewInt(10))))
if err != nil {
panic(err)
}
mockKeeper = &k
mockCtx = ctx
return &k, ctx
}
func MockEVMKeeper() (*evmkeeper.Keeper, sdk.Context) {
testApp := app.Setup(false, false)
ctx := testApp.GetContextForDeliverTx([]byte{}).WithBlockHeight(8).WithBlockTime(time.Now())
k := testApp.EvmKeeper
k.InitGenesis(ctx, *evmtypes.DefaultGenesis())
// mint some coins to a sei address
seiAddr, err := sdk.AccAddressFromHex(common.Bytes2Hex([]byte("seiAddr")))
if err != nil {
panic(err)
}
err = testApp.BankKeeper.MintCoins(ctx, "evm", sdk.NewCoins(sdk.NewCoin("usei", sdk.NewInt(10))))
if err != nil {
panic(err)
}
err = testApp.BankKeeper.SendCoinsFromModuleToAccount(ctx, "evm", seiAddr, sdk.NewCoins(sdk.NewCoin("usei", sdk.NewInt(10))))
if err != nil {
panic(err)
}
return &k, ctx
}
func MockAddressPair() (sdk.AccAddress, common.Address) {
return PrivateKeyToAddresses(MockPrivateKey())
}
func MockPrivateKey() cryptotypes.PrivKey {
// Generate a new Sei private key
entropySeed, _ := bip39.NewEntropy(256)
mnemonic, _ := bip39.NewMnemonic(entropySeed)
algo := hd.Secp256k1
derivedPriv, _ := algo.Derive()(mnemonic, "", "")
return algo.Generate()(derivedPriv)
}
func PrivateKeyToAddresses(privKey cryptotypes.PrivKey) (sdk.AccAddress, common.Address) {
// Encode the private key to hex (i.e. what wallets do behind the scene when users reveal private keys)
testPrivHex := hex.EncodeToString(privKey.Bytes())
// Sign an Ethereum transaction with the hex private key
key, _ := crypto.HexToECDSA(testPrivHex)
msg := crypto.Keccak256([]byte("foo"))
sig, _ := crypto.Sign(msg, key)
// Recover the public keys from the Ethereum signature
recoveredPub, _ := crypto.Ecrecover(msg, sig)
pubKey, _ := crypto.UnmarshalPubkey(recoveredPub)
return sdk.AccAddress(privKey.PubKey().Address()), crypto.PubkeyToAddress(*pubKey)
}