|
@ -1,6 +1,7 @@ |
|
|
package types |
|
|
package types |
|
|
|
|
|
|
|
|
import ( |
|
|
import ( |
|
|
|
|
|
"encoding/json" |
|
|
"errors" |
|
|
"errors" |
|
|
"io" |
|
|
"io" |
|
|
|
|
|
|
|
@ -135,7 +136,7 @@ type SendTx struct { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func (tx *SendTx) WriteSignBytes(chainID string, w io.Writer, n *int64, err *error) { |
|
|
func (tx *SendTx) WriteSignBytes(chainID string, w io.Writer, n *int64, err *error) { |
|
|
binary.WriteTo([]byte(Fmt(`{"chain_id":"%s"`, chainID)), w, n, err) |
|
|
|
|
|
|
|
|
binary.WriteTo([]byte(Fmt(`{"chain_id":%s`, jsonEscape(chainID))), w, n, err) |
|
|
binary.WriteTo([]byte(Fmt(`,"tx":[%v,{"inputs":[`, TxTypeSend)), w, n, err) |
|
|
binary.WriteTo([]byte(Fmt(`,"tx":[%v,{"inputs":[`, TxTypeSend)), w, n, err) |
|
|
for i, in := range tx.Inputs { |
|
|
for i, in := range tx.Inputs { |
|
|
in.WriteSignBytes(w, n, err) |
|
|
in.WriteSignBytes(w, n, err) |
|
@ -168,7 +169,7 @@ type CallTx struct { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func (tx *CallTx) WriteSignBytes(chainID string, w io.Writer, n *int64, err *error) { |
|
|
func (tx *CallTx) WriteSignBytes(chainID string, w io.Writer, n *int64, err *error) { |
|
|
binary.WriteTo([]byte(Fmt(`{"chain_id":"%s"`, chainID)), w, n, err) |
|
|
|
|
|
|
|
|
binary.WriteTo([]byte(Fmt(`{"chain_id":%s`, jsonEscape(chainID))), w, n, err) |
|
|
binary.WriteTo([]byte(Fmt(`,"tx":[%v,{"address":"%X","data":"%X"`, TxTypeCall, tx.Address, tx.Data)), w, n, err) |
|
|
binary.WriteTo([]byte(Fmt(`,"tx":[%v,{"address":"%X","data":"%X"`, TxTypeCall, tx.Address, tx.Data)), w, n, err) |
|
|
binary.WriteTo([]byte(Fmt(`,"fee":%v,"gas_limit":%v,"input":`, tx.Fee, tx.GasLimit)), w, n, err) |
|
|
binary.WriteTo([]byte(Fmt(`,"fee":%v,"gas_limit":%v,"input":`, tx.Fee, tx.GasLimit)), w, n, err) |
|
|
tx.Input.WriteSignBytes(w, n, err) |
|
|
tx.Input.WriteSignBytes(w, n, err) |
|
@ -189,10 +190,11 @@ type NameTx struct { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func (tx *NameTx) WriteSignBytes(chainID string, w io.Writer, n *int64, err *error) { |
|
|
func (tx *NameTx) WriteSignBytes(chainID string, w io.Writer, n *int64, err *error) { |
|
|
binary.WriteTo([]byte(Fmt(`{"chain_id":"%s"`, chainID)), w, n, err) |
|
|
|
|
|
binary.WriteTo([]byte(Fmt(`,"tx":[%v,{"name":"%s","data":"%s"`, TxTypeName, tx.Name, tx.Data)), w, n, err) |
|
|
|
|
|
binary.WriteTo([]byte(Fmt(`,"fee":%v,"input":`, tx.Fee)), w, n, err) |
|
|
|
|
|
|
|
|
binary.WriteTo([]byte(Fmt(`{"chain_id":%s`, jsonEscape(chainID))), w, n, err) |
|
|
|
|
|
binary.WriteTo([]byte(Fmt(`,"tx":[%v,{"data":%s,"fee":%v`, TxTypeName, jsonEscape(tx.Data), tx.Fee)), w, n, err) |
|
|
|
|
|
binary.WriteTo([]byte(Fmt(`,"input":`, tx.Input)), w, n, err) |
|
|
tx.Input.WriteSignBytes(w, n, err) |
|
|
tx.Input.WriteSignBytes(w, n, err) |
|
|
|
|
|
binary.WriteTo([]byte(Fmt(`,"name":%s`, jsonEscape(tx.Name))), w, n, err) |
|
|
binary.WriteTo([]byte(`}]}`), w, n, err) |
|
|
binary.WriteTo([]byte(`}]}`), w, n, err) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -236,7 +238,7 @@ type BondTx struct { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func (tx *BondTx) WriteSignBytes(chainID string, w io.Writer, n *int64, err *error) { |
|
|
func (tx *BondTx) WriteSignBytes(chainID string, w io.Writer, n *int64, err *error) { |
|
|
binary.WriteTo([]byte(Fmt(`{"chain_id":"%s"`, chainID)), w, n, err) |
|
|
|
|
|
|
|
|
binary.WriteTo([]byte(Fmt(`{"chain_id":%s`, jsonEscape(chainID))), w, n, err) |
|
|
binary.WriteTo([]byte(Fmt(`,"tx":[%v,{"inputs":[`, TxTypeBond)), w, n, err) |
|
|
binary.WriteTo([]byte(Fmt(`,"tx":[%v,{"inputs":[`, TxTypeBond)), w, n, err) |
|
|
for i, in := range tx.Inputs { |
|
|
for i, in := range tx.Inputs { |
|
|
in.WriteSignBytes(w, n, err) |
|
|
in.WriteSignBytes(w, n, err) |
|
@ -269,7 +271,7 @@ type UnbondTx struct { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func (tx *UnbondTx) WriteSignBytes(chainID string, w io.Writer, n *int64, err *error) { |
|
|
func (tx *UnbondTx) WriteSignBytes(chainID string, w io.Writer, n *int64, err *error) { |
|
|
binary.WriteTo([]byte(Fmt(`{"chain_id":"%s"`, chainID)), w, n, err) |
|
|
|
|
|
|
|
|
binary.WriteTo([]byte(Fmt(`{"chain_id":%s`, jsonEscape(chainID))), w, n, err) |
|
|
binary.WriteTo([]byte(Fmt(`,"tx":[%v,{"address":"%X","height":%v}]}`, TxTypeUnbond, tx.Address, tx.Height)), w, n, err) |
|
|
binary.WriteTo([]byte(Fmt(`,"tx":[%v,{"address":"%X","height":%v}]}`, TxTypeUnbond, tx.Address, tx.Height)), w, n, err) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -286,7 +288,7 @@ type RebondTx struct { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func (tx *RebondTx) WriteSignBytes(chainID string, w io.Writer, n *int64, err *error) { |
|
|
func (tx *RebondTx) WriteSignBytes(chainID string, w io.Writer, n *int64, err *error) { |
|
|
binary.WriteTo([]byte(Fmt(`{"chain_id":"%s"`, chainID)), w, n, err) |
|
|
|
|
|
|
|
|
binary.WriteTo([]byte(Fmt(`{"chain_id":%s`, jsonEscape(chainID))), w, n, err) |
|
|
binary.WriteTo([]byte(Fmt(`,"tx":[%v,{"address":"%X","height":%v}]}`, TxTypeRebond, tx.Address, tx.Height)), w, n, err) |
|
|
binary.WriteTo([]byte(Fmt(`,"tx":[%v,{"address":"%X","height":%v}]}`, TxTypeRebond, tx.Address, tx.Height)), w, n, err) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -316,3 +318,14 @@ func TxId(chainID string, tx Tx) []byte { |
|
|
signBytes := account.SignBytes(chainID, tx) |
|
|
signBytes := account.SignBytes(chainID, tx) |
|
|
return binary.BinaryRipemd160(signBytes) |
|
|
return binary.BinaryRipemd160(signBytes) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
// Contract: This function is deterministic and completely reversible.
|
|
|
|
|
|
func jsonEscape(str string) string { |
|
|
|
|
|
escapedBytes, err := json.Marshal(str) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
panic(Fmt("Error json-escaping a string", str)) |
|
|
|
|
|
} |
|
|
|
|
|
return string(escapedBytes) |
|
|
|
|
|
} |