Skip to content

Commit 08e49e2

Browse files
authored
Merge pull request #700 from KiraCore/release/v0.4.4
release/v0.4.4 -> master
2 parents f1a5993 + 92ab60d commit 08e49e2

File tree

4 files changed

+100
-7
lines changed

4 files changed

+100
-7
lines changed

scripts/sekai-utils.sh

+14
Original file line numberDiff line numberDiff line change
@@ -1361,3 +1361,17 @@ function getPollVotes() {
13611361

13621362
echo "$RESULT"
13631363
}
1364+
1365+
1366+
function ethereumTxRelay() {
1367+
local SOURCE=$1
1368+
local DATA=$2
1369+
local RESULT=""
1370+
1371+
($(isNullOrEmpty $FEE_AMOUNT)) && FEE_AMOUNT=100
1372+
($(isNullOrEmpty $FEE_DENOM)) && FEE_DENOM="ukex"
1373+
1374+
RESULT=$(sekaid tx ethereum relay --from="$SOURCE" "$DATA" --keyring-backend=test --chain-id="$NETWORK_NAME" --fees "${FEE_AMOUNT}${FEE_DENOM}" --output=json --yes --home="$SEKAID_HOME" 2> /dev/null | txAwait2 180 2> /dev/null || echo -n "" )
1375+
1376+
echo "${RESULT,,}"
1377+
}
+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#!/usr/bin/env bash
2+
# To run test locally: make network-start && ./scripts/test-local/ethereum-processes.sh
3+
4+
set -e
5+
set -x
6+
. /etc/profile
7+
. ./scripts/sekai-env.sh
8+
9+
TEST_NAME="ETHEREUM" && timerStart $TEST_NAME
10+
echoInfo "INFO: $TEST_NAME - Integration Test - START"
11+
echoInfo "INFO: Ethereum TX relay..."
12+
13+
addAccount tester
14+
15+
VALIDATOR_ADDRESS=$(showAddress validator)
16+
ACCOUNT_ADDRESS=$(showAddress tester)
17+
18+
sendTokens "$VALIDATOR_ADDRESS" "$ACCOUNT_ADDRESS" 1000000000000 ukex 100 ukex
19+
20+
# Send tokens with ethereum relay --->
21+
22+
# TEST 1
23+
# ---> Send tokens
24+
echoInfo "TEST 1"
25+
ETH_DATA="0a2a307831323334353637383930616263646566313233343536373839306162636465663132333435363738122c30786162636465666162636465666162636465666162636465666162636465666162636465666162636465661a07313030303030302201312a0b32303030303030303030303201303ac703307866323432343332613030303030303030303030303030303030303030303030303132333435363738393061626364656631323334353637383930616263646566313233343536373830303030303030303030303030303030303030303030303061626364656661626364656661626364656661626364656661626364656661626364656661626364656630303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303634307830613237306132383061313432643739373833313332323933333232323433313733326336343332333832653533366233333232366533343437323236653333363436393333346533333765333336343665333336343665333436653333376533333765326133363261323136313633363336663735366537343264373336333662326634643733363735333635366536343132316230613132326436353733363832323333323133313332333332633331333433343232323665366636343232333431343131326333313161313030613039363336313732363436313634363436393133313034303131303030303661393230303030303040014a043078323652423078346233613765366635643663386233613766356334623361366437653866356334623361376635653464356136623363376436653866356234633361376536665a42307836623738393362346636643561376535633762336136643765386635633462336137663565346435613662336337643665386635623463336137653666356434"
26+
TESTER_BALANCE_EXPECTED=$((1000000000000 - 150 - 100)) # -150 fee -100 coded in the ethereum tx
27+
28+
ethereumTxRelay tester "$ETH_DATA" 150 ukex
29+
30+
TESTER_BALANCE_REAL=$(showBalance tester ukex)
31+
32+
[ "$TESTER_BALANCE_EXPECTED" != "$TESTER_BALANCE_REAL" ] && echoErr "ERROR TEST 1/1: Expected tester account balance to be '$TESTER_BALANCE_EXPECTED', but got '$TESTER_BALANCE_REAL'" && exit 1
33+
# <--- Send tokens
34+
35+
echoInfo "INFO: $TEST_NAME - Integration Test - END, elapsed: $(prettyTime $(timerSpan $TEST_NAME))"

types/constants.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ package types
33
const (
44
// we set page iteration limit for safety
55
PageIterationLimit = 512
6-
SekaiVersion = "v0.4.3"
6+
SekaiVersion = "v0.4.4"
77
CosmosVersion = "v0.47.6"
88
)

x/ethereum/keeper/msg_server.go

+50-6
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ import (
77
"encoding/hex"
88
"github.com/KiraCore/sekai/x/ethereum/types"
99
"github.com/armon/go-metrics"
10+
"github.com/cometbft/cometbft/crypto/secp256k1"
1011
"github.com/cosmos/cosmos-sdk/telemetry"
1112
sdk "github.com/cosmos/cosmos-sdk/types"
1213
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
13-
types2 "github.com/cosmos/cosmos-sdk/x/bank/types"
14+
bank "github.com/cosmos/cosmos-sdk/x/bank/types"
1415
"github.com/cosmos/gogoproto/proto"
1516
"github.com/ethereum/go-ethereum/common"
1617
ethtypes "github.com/ethereum/go-ethereum/core/types"
@@ -70,8 +71,12 @@ func (m msgServer) Relay(goCtx context.Context, relay *types.MsgRelay) (*types.M
7071
return &types.MsgRelayResponse{}, errors.Wrap(types.ErrEthTxNotValid, err.Error())
7172
}
7273

73-
data, _ := hex.DecodeString(tx.Data[2:])
74-
chainID := big.NewInt(int64(tx.ChainId))
74+
data, err := hex.DecodeString(tx.Data[2:])
75+
if err != nil {
76+
return &types.MsgRelayResponse{}, errors.Wrap(types.ErrEthTxNotValid, err.Error())
77+
}
78+
79+
chainID := big.NewInt(tx.ChainId)
7580

7681
rBytes, err := hex.DecodeString(tx.R[2:])
7782
if err != nil {
@@ -98,7 +103,15 @@ func (m msgServer) Relay(goCtx context.Context, relay *types.MsgRelay) (*types.M
98103
signer := ethtypes.NewEIP155Signer(chainID)
99104
hash := signer.Hash(ntx)
100105

101-
sig := append(rBytes, append(sBytes, vBytes...)...)
106+
r := new(big.Int).SetBytes(rBytes)
107+
s := new(big.Int).SetBytes(sBytes)
108+
v := new(big.Int).SetBytes(vBytes)
109+
110+
sig, err := recoverPlain(r, s, v, false)
111+
if err != nil {
112+
return &types.MsgRelayResponse{}, errors.Wrap(types.ErrEthTxNotValid, err.Error())
113+
}
114+
102115
pubKey, err := crypto.SigToPub(hash.Bytes(), sig)
103116
if err != nil {
104117
return &types.MsgRelayResponse{}, errors.Wrap(types.ErrEthTxNotValid, err.Error())
@@ -110,12 +123,25 @@ func (m msgServer) Relay(goCtx context.Context, relay *types.MsgRelay) (*types.M
110123
return &types.MsgRelayResponse{}, errors.Wrap(types.ErrEthTxNotValid, "Recovered address does not equal sender")
111124
}
112125

113-
var msg = new(types2.MsgSend)
114-
err = proto.Unmarshal([]byte(tx.Data), msg)
126+
dataBytes, err := hex.DecodeString(tx.Data[2:])
115127
if err != nil {
116128
return &types.MsgRelayResponse{}, errors.Wrap(types.ErrEthTxNotValid, err.Error())
117129
}
118130

131+
var msg = new(bank.MsgSend)
132+
err = proto.Unmarshal(dataBytes, msg)
133+
if err != nil {
134+
return &types.MsgRelayResponse{}, errors.Wrap(types.ErrEthTxNotValid, err.Error())
135+
}
136+
137+
pubB := crypto.CompressPubkey(pubKey)
138+
pubK := secp256k1.PubKey(pubB)
139+
kiraAdr := sdk.AccAddress(pubK.Address())
140+
141+
if msg.FromAddress != kiraAdr.String() {
142+
return &types.MsgRelayResponse{}, errors.Wrap(types.ErrEthTxNotValid, "Recovered address does not equal sender")
143+
}
144+
119145
if err := m.bk.IsSendEnabledCoins(ctx, msg.Amount...); err != nil {
120146
return nil, err
121147
}
@@ -155,3 +181,21 @@ func (m msgServer) Relay(goCtx context.Context, relay *types.MsgRelay) (*types.M
155181

156182
return &types.MsgRelayResponse{}, nil
157183
}
184+
185+
func recoverPlain(R, S, Vb *big.Int, homestead bool) ([]byte, error) {
186+
if Vb.BitLen() > 8 {
187+
return nil, errors.ErrPanic //todo
188+
}
189+
190+
V := byte(Vb.Uint64() - 27)
191+
if !crypto.ValidateSignatureValues(V, R, S, homestead) {
192+
return nil, errors.ErrPanic //todo
193+
}
194+
195+
r, s := R.Bytes(), S.Bytes()
196+
sig := make([]byte, 65)
197+
copy(sig[32-len(r):32], r)
198+
copy(sig[64-len(s):64], s)
199+
sig[64] = V
200+
return sig, nil
201+
}

0 commit comments

Comments
 (0)