Skip to content

Commit 2ab6d4f

Browse files
author
chenfengjin
committed
Add transfer support
1 parent 908899c commit 2ab6d4f

File tree

1 file changed

+40
-8
lines changed

1 file changed

+40
-8
lines changed

kernel/evm/evm.go

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package evm
22

33
import (
44
"encoding/hex"
5+
"github.com/hyperledger/burrow/acm/balance"
6+
"math/big"
57
"strconv"
68

79
//"github.com/hyperledger/burrow/acm/balance"
@@ -128,23 +130,53 @@ func (p *proxy) sendRawTransaction(ctx contract.KContext) (*contract.Response, e
128130
); err != nil {
129131
return nil, err
130132
}
133+
//from,err:=crypto.AddressFromBytes(rawt)
134+
to, err := crypto.AddressFromBytes(rawTx.To)
135+
if err != nil {
136+
return nil, err
137+
}
131138

132-
to, err := crypto.AddressFromHexString(string(rawTx.To))
139+
enc, err := txs.RLPEncode(rawTx.Nonce, rawTx.GasPrice, rawTx.GasLimit, rawTx.To, rawTx.Value, rawTx.Data)
133140
if err != nil {
134141
return nil, err
135142
}
136-
contractName, err := DetermineContractNameFromEVM(to)
143+
144+
sig := crypto.CompressedSignatureFromParams(rawTx.V-net-8-1, rawTx.R, rawTx.S)
145+
pub, err := crypto.PublicKeyFromSignature(sig, crypto.Keccak256(enc))
137146
if err != nil {
138147
return nil, err
139148
}
140149

141-
args1 := map[string][]byte{
142-
"input": rawTx.Data,
143-
"jsonEncoded": []byte("false"),
150+
if len(rawTx.Data) == 0 {
151+
from := pub.GetAddress()
152+
xfrom, err := EVMAddressToXchain(from)
153+
if err != nil {
154+
return nil, err
155+
}
156+
//to,err:=crypto
157+
xto, err := EVMAddressToXchain(to)
158+
if err != nil {
159+
return nil, err
160+
}
161+
amount := balance.WeiToNative(rawTx.Value)
162+
if err := ctx.Transfer(xfrom, xto, amount); err != nil {
163+
return nil, err
164+
}
165+
166+
} else {
167+
contractName, err := DetermineContractNameFromEVM(to)
168+
if err != nil {
169+
return nil, err
170+
}
171+
172+
args1 := map[string][]byte{
173+
"input": rawTx.Data,
174+
"jsonEncoded": []byte("false"),
175+
}
176+
resp, err := ctx.Call("evm", contractName, "", args1)
177+
return resp, err
144178
}
145-
//TODO 如果value 非空,那么需要有 transfer
146-
resp, err := ctx.Call("evm", contractName, "", args1)
147-
return resp, err
179+
148180
}
149181

150182
func (p *proxy) ContractCall(ctx contract.KContext) (*contract.Response, error) {

0 commit comments

Comments
 (0)