2019-09-15 16:12:59 +00:00
|
|
|
package types
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/cosmos/cosmos-sdk/codec"
|
2019-09-26 15:36:23 +00:00
|
|
|
"github.com/cosmos/ethermint/utils"
|
2019-09-15 16:12:59 +00:00
|
|
|
|
|
|
|
ethcmn "github.com/ethereum/go-ethereum/common"
|
|
|
|
)
|
|
|
|
|
|
|
|
var cdc = codec.New()
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
RegisterAmino(cdc)
|
|
|
|
}
|
|
|
|
|
|
|
|
// RegisterAmino registers all crypto related types in the given (amino) codec.
|
|
|
|
func RegisterAmino(cdc *codec.Codec) {
|
|
|
|
cdc.RegisterConcrete(EncodableTxData{}, "ethermint/EncodedMessage", nil)
|
|
|
|
}
|
|
|
|
|
2019-09-26 15:36:23 +00:00
|
|
|
// EncodableTxData implements the Ethereum transaction data structure. It is used
|
2019-09-15 16:12:59 +00:00
|
|
|
// solely as intended in Ethereum abiding by the protocol.
|
|
|
|
type EncodableTxData struct {
|
|
|
|
AccountNonce uint64 `json:"nonce"`
|
|
|
|
Price string `json:"gasPrice"`
|
|
|
|
GasLimit uint64 `json:"gas"`
|
|
|
|
Recipient *ethcmn.Address `json:"to" rlp:"nil"` // nil means contract creation
|
|
|
|
Amount string `json:"value"`
|
|
|
|
Payload []byte `json:"input"`
|
|
|
|
|
|
|
|
// signature values
|
|
|
|
V string `json:"v"`
|
|
|
|
R string `json:"r"`
|
|
|
|
S string `json:"s"`
|
|
|
|
|
|
|
|
// hash is only used when marshaling to JSON
|
|
|
|
Hash *ethcmn.Hash `json:"hash" rlp:"-"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func marshalAmino(td EncodableTxData) (string, error) {
|
|
|
|
bz, err := cdc.MarshalBinaryBare(td)
|
|
|
|
return string(bz), err
|
|
|
|
}
|
|
|
|
|
2020-03-16 22:53:24 +00:00
|
|
|
func unmarshalAmino(td *EncodableTxData, text string) error {
|
2019-09-15 16:12:59 +00:00
|
|
|
return cdc.UnmarshalBinaryBare([]byte(text), td)
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalAmino defines custom encoding scheme for TxData
|
|
|
|
func (td TxData) MarshalAmino() (string, error) {
|
|
|
|
e := EncodableTxData{
|
|
|
|
AccountNonce: td.AccountNonce,
|
2019-09-26 15:36:23 +00:00
|
|
|
Price: utils.MarshalBigInt(td.Price),
|
2019-09-15 16:12:59 +00:00
|
|
|
GasLimit: td.GasLimit,
|
|
|
|
Recipient: td.Recipient,
|
2019-09-26 15:36:23 +00:00
|
|
|
Amount: utils.MarshalBigInt(td.Amount),
|
2019-09-15 16:12:59 +00:00
|
|
|
Payload: td.Payload,
|
|
|
|
|
2019-09-26 15:36:23 +00:00
|
|
|
V: utils.MarshalBigInt(td.V),
|
|
|
|
R: utils.MarshalBigInt(td.R),
|
|
|
|
S: utils.MarshalBigInt(td.S),
|
2019-09-15 16:12:59 +00:00
|
|
|
|
|
|
|
Hash: td.Hash,
|
|
|
|
}
|
|
|
|
|
|
|
|
return marshalAmino(e)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalAmino defines custom decoding scheme for TxData
|
2020-03-16 22:53:24 +00:00
|
|
|
func (td *TxData) UnmarshalAmino(text string) error {
|
2019-09-15 16:12:59 +00:00
|
|
|
e := new(EncodableTxData)
|
2020-03-16 22:53:24 +00:00
|
|
|
err := unmarshalAmino(e, text)
|
2019-09-15 16:12:59 +00:00
|
|
|
if err != nil {
|
2020-03-16 22:53:24 +00:00
|
|
|
return err
|
2019-09-15 16:12:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
td.AccountNonce = e.AccountNonce
|
|
|
|
td.GasLimit = e.GasLimit
|
|
|
|
td.Recipient = e.Recipient
|
|
|
|
td.Payload = e.Payload
|
|
|
|
td.Hash = e.Hash
|
|
|
|
|
2019-09-26 15:36:23 +00:00
|
|
|
price, err := utils.UnmarshalBigInt(e.Price)
|
2019-09-15 16:12:59 +00:00
|
|
|
if err != nil {
|
2020-03-16 22:53:24 +00:00
|
|
|
return err
|
2019-09-15 16:12:59 +00:00
|
|
|
}
|
2020-03-16 22:53:24 +00:00
|
|
|
|
2019-09-15 16:12:59 +00:00
|
|
|
if td.Price != nil {
|
|
|
|
td.Price.Set(price)
|
|
|
|
} else {
|
|
|
|
td.Price = price
|
|
|
|
}
|
|
|
|
|
2019-09-26 15:36:23 +00:00
|
|
|
amt, err := utils.UnmarshalBigInt(e.Amount)
|
2019-09-15 16:12:59 +00:00
|
|
|
if err != nil {
|
2020-03-16 22:53:24 +00:00
|
|
|
return err
|
2019-09-15 16:12:59 +00:00
|
|
|
}
|
2020-03-16 22:53:24 +00:00
|
|
|
|
2019-09-15 16:12:59 +00:00
|
|
|
if td.Amount != nil {
|
|
|
|
td.Amount.Set(amt)
|
|
|
|
} else {
|
|
|
|
td.Amount = amt
|
|
|
|
}
|
|
|
|
|
2019-09-26 15:36:23 +00:00
|
|
|
v, err := utils.UnmarshalBigInt(e.V)
|
2019-09-15 16:12:59 +00:00
|
|
|
if err != nil {
|
2020-03-16 22:53:24 +00:00
|
|
|
return err
|
2019-09-15 16:12:59 +00:00
|
|
|
}
|
2020-03-16 22:53:24 +00:00
|
|
|
|
2019-09-15 16:12:59 +00:00
|
|
|
if td.V != nil {
|
|
|
|
td.V.Set(v)
|
|
|
|
} else {
|
|
|
|
td.V = v
|
|
|
|
}
|
|
|
|
|
2019-09-26 15:36:23 +00:00
|
|
|
r, err := utils.UnmarshalBigInt(e.R)
|
2019-09-15 16:12:59 +00:00
|
|
|
if err != nil {
|
2020-03-16 22:53:24 +00:00
|
|
|
return err
|
2019-09-15 16:12:59 +00:00
|
|
|
}
|
2020-03-16 22:53:24 +00:00
|
|
|
|
2019-09-15 16:12:59 +00:00
|
|
|
if td.R != nil {
|
|
|
|
td.R.Set(r)
|
|
|
|
} else {
|
|
|
|
td.R = r
|
|
|
|
}
|
|
|
|
|
2019-09-26 15:36:23 +00:00
|
|
|
s, err := utils.UnmarshalBigInt(e.S)
|
2019-09-15 16:12:59 +00:00
|
|
|
if err != nil {
|
2020-03-16 22:53:24 +00:00
|
|
|
return err
|
2019-09-15 16:12:59 +00:00
|
|
|
}
|
2020-03-16 22:53:24 +00:00
|
|
|
|
2019-09-15 16:12:59 +00:00
|
|
|
if td.S != nil {
|
|
|
|
td.S.Set(s)
|
|
|
|
} else {
|
|
|
|
td.S = s
|
|
|
|
}
|
|
|
|
|
2020-03-16 22:53:24 +00:00
|
|
|
return nil
|
2019-09-15 16:12:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: Implement JSON marshaling/ unmarshaling for this type
|
|
|
|
|
|
|
|
// TODO: Implement YAML marshaling/ unmarshaling for this type
|