Skip to content

Commit

Permalink
Merge pull request #68 from Zilliqa/fix/payload
Browse files Browse the repository at this point in the history
fix(payload): add payment type
  • Loading branch information
renlulu authored Jul 22, 2020
2 parents 1560aed + 568e389 commit 29f90f2
Show file tree
Hide file tree
Showing 8 changed files with 181 additions and 49 deletions.
36 changes: 33 additions & 3 deletions account/wallet_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,37 @@ import (
"testing"
)

func TestPayload(t *testing.T) {
if os.Getenv("CI") != "" {
t.Skip("Skipping testing in CI environment")
}
wallet := NewWallet()
wallet.AddByPrivateKey("e19d05c5452598e24caad4a0d85a49146f7be089515c905ae6a19e8a578a6930")
provider := provider2.NewProvider("https://dev-api.zilliqa.com/")

gasPrice, err := provider.GetMinimumGasPrice()
assert.Nil(t, err, err)

tx := &transaction.Transaction{
Version: strconv.FormatInt(int64(util.Pack(333, 1)), 10),
SenderPubKey: "0246E7178DC8253201101E18FD6F6EB9972451D121FC57AA2A06DD5C111E58DC6A",
ToAddr: "4BAF5faDA8e5Db92C3d3242618c5B47133AE003C",
Amount: "10000000",
GasPrice: gasPrice,
GasLimit: "1",
Code: "",
Data: "",
Priority: false,
}
err2 := wallet.Sign(tx, *provider)
assert.Nil(t, err2, err2)

pl := tx.ToTransactionPayload()
payloadJson, err3 := pl.ToJson()
assert.Nil(t, err3, err3)
fmt.Println(string(payloadJson))
}

func TestWallet_SignWith(t *testing.T) {
if os.Getenv("CI") != "" {
t.Skip("Skipping testing in CI environment")
Expand Down Expand Up @@ -69,12 +100,11 @@ func TestSendTransaction(t *testing.T) {
Data: "",
Priority: false,
}

err2 := wallet.Sign(tx, *provider)
assert.Nil(t, err2, err2)

h,_ := tx.Hash()
fmt.Println("local transaction hash: ",util.EncodeHex(h))
h, _ := tx.Hash()
fmt.Println("local transaction hash: ", util.EncodeHex(h))

rsp, err3 := provider.CreateTransaction(tx.ToTransactionPayload())
assert.Nil(t, err3, err3)
Expand Down
1 change: 0 additions & 1 deletion contract/contract.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,6 @@ func (c *Contract) Call(transition string, args []core.ContractValue, params Cal
if err2 != nil {
return tx, err2
}

rsp, err := c.Provider.CreateTransaction(tx.ToTransactionPayload())

if err != nil {
Expand Down
1 change: 0 additions & 1 deletion contract/contract_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ func TestContract_Call(t *testing.T) {
privateKey := "e19d05c5452598e24caad4a0d85a49146f7be089515c905ae6a19e8a578a6930"
chainID := 333
msgVersion := 1

publickKey := keytools.GetPublicKeyFromPrivateKey(util.DecodeHex(privateKey), true)
address := keytools.GetAddressFromPublic(publickKey)
pubkey := util.EncodeHex(publickKey)
Expand Down
6 changes: 3 additions & 3 deletions core/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,10 +140,10 @@ type Transition struct {
}

type TransactionMessage struct {
Amount string `json:"_amount"`
Amount string `json:"_amount"`
Recipient string `json:"_recipient"`
Tag string `json:"_tag"`
Params []ContractValue `json:"params"`
Tag string `json:"_tag"`
Params []ContractValue `json:"params"`
}

type Transactions struct {
Expand Down
72 changes: 52 additions & 20 deletions provider/transaction_payload.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,10 @@ type Data struct {
}

type payload struct {
Version int `json:"version"`
Nonce int `json:"nonce"`
ToAddr string `json:"toAddr"`
Amount int64 `json:"amount"`
Version int `json:"version"`
Nonce int `json:"nonce"`
ToAddr string `json:"toAddr"`
Amount int64 `json:"amount"`
PubKey string `json:"pubKey"`
GasPrice int64 `json:"gasPrice"`
GasLimit int64 `json:"gasLimit"`
Expand All @@ -65,10 +65,10 @@ type payload struct {
}

type Init struct {
Version int `json:"version"`
Nonce int `json:"nonce"`
ToAddr string `json:"toAddr"`
Amount int64 `json:"amount"`
Version int `json:"version"`
Nonce int `json:"nonce"`
ToAddr string `json:"toAddr"`
Amount int64 `json:"amount"`
PubKey string `json:"pubKey"`
GasPrice int64 `json:"gasPrice"`
GasLimit int64 `json:"gasLimit"`
Expand All @@ -77,6 +77,19 @@ type Init struct {
Signature string `json:"signature"`
}

type Payment struct {
Version int `json:"version"`
Nonce int `json:"nonce"`
ToAddr string `json:"toAddr"`
Amount int64 `json:"amount"`
PubKey string `json:"pubKey"`
GasPrice int64 `json:"gasPrice"`
GasLimit int64 `json:"gasLimit"`
Code string `json:"code"`
Data string `json:"data"`
Signature string `json:"signature"`
}

func (pl *TransactionPayload) ToJson() ([]byte, error) {
a, err := strconv.ParseInt(pl.Amount, 10, 64)
if err != nil {
Expand All @@ -93,6 +106,23 @@ func (pl *TransactionPayload) ToJson() ([]byte, error) {
return nil, err3
}

if pl.Data == "" {
p := Payment{
Version: pl.Version,
Nonce: pl.Nonce,
ToAddr: pl.ToAddr,
Amount: a,
PubKey: pl.PubKey,
GasPrice: price,
GasLimit: limit,
Code: pl.Code,
Data: "",
Signature: pl.Signature,
//Priority: pl.Priority,
}
return json.Marshal(&p)
}

originData := strings.TrimPrefix(pl.Data, `"`)
originData = strings.TrimSuffix(originData, `"`)
originData = strings.ReplaceAll(originData, "\\", "")
Expand All @@ -106,10 +136,10 @@ func (pl *TransactionPayload) ToJson() ([]byte, error) {
return nil, errors.New("wrong data")
} else {
p := Init{
Version: pl.Version,
Nonce: pl.Nonce,
ToAddr: pl.ToAddr,
Amount: a,
Version: pl.Version,
Nonce: pl.Nonce,
ToAddr: pl.ToAddr,
Amount: a,
PubKey: pl.PubKey,
GasPrice: price,
GasLimit: limit,
Expand All @@ -122,10 +152,10 @@ func (pl *TransactionPayload) ToJson() ([]byte, error) {
}
} else {
p := payload{
Version: pl.Version,
Nonce: pl.Nonce,
ToAddr: pl.ToAddr,
Amount: a,
Version: pl.Version,
Nonce: pl.Nonce,
ToAddr: pl.ToAddr,
Amount: a,
PubKey: pl.PubKey,
GasPrice: price,
GasLimit: limit,
Expand Down Expand Up @@ -217,6 +247,8 @@ func NewFromMap(middle map[string]interface{}) (*TransactionPayload, error) {
return nil, err
}
sd = string(s)
} else if reflect.TypeOf(d).Kind() == reflect.String {
sd = d.(string)
} else {
j, _ := json.Marshal(d)
var data Data
Expand All @@ -237,10 +269,10 @@ func NewFromMap(middle map[string]interface{}) (*TransactionPayload, error) {
}

return &TransactionPayload{
Version: int(v),
Nonce: int(n),
ToAddr: toAddr.(string),
Amount: fmt.Sprintf("%.0f", amount),
Version: int(v),
Nonce: int(n),
ToAddr: toAddr.(string),
Amount: fmt.Sprintf("%.0f", amount),
PubKey: pubkey,
GasPrice: fmt.Sprintf("%.0f", price),
GasLimit: fmt.Sprintf("%.0f", limit),
Expand Down
4 changes: 2 additions & 2 deletions provider/transaction_payload_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ func TestTransactionPayload_ToJson(t *testing.T) {
GasPrice: "10000000",
GasLimit: "9000",
Code: "",
Data: "[{\"vname\":\"_scilla_version\",\"type\":\"Uint32\",\"value\":\"0\"},{\"vname\":\"initial_owners\",\"type\":\"List ByStr20\",\"value\":{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0x1234567890123456789012345678906784567890\",{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0xabcdeabcde123456786782345678901234567890\",{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0xffcdeabcde126786789012345678901234567890\",{\"constructor\":\"Nil\",\"argtypes\":[\"ByStr20\"],\"arguments\":[]}]}]}]}},{\"vname\":\"required_signatures\",\"type\":\"Uint32\",\"value\":\"2\"}]",
Data: "",
Signature: "",
//Priority: false,
}
Expand All @@ -55,7 +55,7 @@ func TestTransactionPayload_ToJson(t *testing.T) {
}

fmt.Println(string(data))
expect := "{\"version\":65537,\"nonce\":1,\"toAddr\":\"0x0000000000000000000000000000000000000000\",\"amount\":0,\"pubKey\":\"\",\"gasPrice\":10000000,\"gasLimit\":9000,\"code\":\"\",\"data\":[{\"vname\":\"_scilla_version\",\"type\":\"Uint32\",\"value\":\"0\"},{\"vname\":\"initial_owners\",\"type\":\"List ByStr20\",\"value\":{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0x1234567890123456789012345678906784567890\",{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0xabcdeabcde123456786782345678901234567890\",{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0xffcdeabcde126786789012345678901234567890\",{\"constructor\":\"Nil\",\"argtypes\":[\"ByStr20\"],\"arguments\":[]}]}]}]}},{\"vname\":\"required_signatures\",\"type\":\"Uint32\",\"value\":\"2\"}],\"signature\":\"\"}"
expect := "{\"version\":65537,\"nonce\":1,\"toAddr\":\"0x0000000000000000000000000000000000000000\",\"amount\":0,\"pubKey\":\"\",\"gasPrice\":10000000,\"gasLimit\":9000,\"code\":\"\",\"data\":\"\",\"signature\":\"\"}"
if len(string(data)) != len(expect) {
t.Fail()
}
Expand Down
90 changes: 71 additions & 19 deletions transaction/transaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,23 +16,75 @@ type Transaction core.Transaction
func NewFromPayload(payload *provider.TransactionPayload) *Transaction {
v := strconv.FormatInt(int64(payload.Version), 10)
n := strconv.FormatInt(int64(payload.Nonce), 10)
return &Transaction{
ID: "",
Version: v,
Nonce: n,
Amount: payload.Amount,
GasPrice: payload.GasPrice,
GasLimit: payload.GasLimit,
Signature: payload.Signature,
Receipt: core.TransactionReceipt{},
SenderPubKey: payload.PubKey,
ToAddr: payload.ToAddr,
Code: payload.Code,
Data: payload.Data,
Status: 0,
ContractAddress: "",
Priority: payload.Priority,
var toAddr string
if payload.ToAddr == "0x0000000000000000000000000000000000000000" {
toAddr = "0x0000000000000000000000000000000000000000"
} else {
toAddr = "0x" + payload.ToAddr
}
if payload.Data == "" {
// payment
return &Transaction{
ID: "",
Version: v,
Nonce: n,
Amount: payload.Amount,
GasPrice: payload.GasPrice,
GasLimit: payload.GasLimit,
Signature: payload.Signature,
Receipt: core.TransactionReceipt{},
SenderPubKey: payload.PubKey,
ToAddr: toAddr,
Code: payload.Code,
Data: "",
Status: 0,
ContractAddress: "",
Priority: payload.Priority,
}
} else if strings.Contains(payload.Data, "_tag") {
// contract call
var data provider.Data
json.Unmarshal([]byte(payload.Data), &data)
return &Transaction{
ID: "",
Version: v,
Nonce: n,
Amount: payload.Amount,
GasPrice: payload.GasPrice,
GasLimit: payload.GasLimit,
Signature: payload.Signature,
Receipt: core.TransactionReceipt{},
SenderPubKey: payload.PubKey,
ToAddr: toAddr,
Code: payload.Code,
Data: data,
Status: 0,
ContractAddress: "",
Priority: payload.Priority,
}
} else {
// contract deployment
var data []provider.Value
json.Unmarshal([]byte(payload.Data), &data)
return &Transaction{
ID: "",
Version: v,
Nonce: n,
Amount: payload.Amount,
GasPrice: payload.GasPrice,
GasLimit: payload.GasLimit,
Signature: payload.Signature,
Receipt: core.TransactionReceipt{},
SenderPubKey: payload.PubKey,
ToAddr: toAddr,
Code: payload.Code,
Data: data,
Status: 0,
ContractAddress: "",
Priority: payload.Priority,
}
}

}

func (t *Transaction) toTransactionParam() TxParams {
Expand Down Expand Up @@ -129,13 +181,13 @@ func (t *Transaction) Bytes() ([]byte, error) {
}
}

func (t *Transaction) Hash() ([]byte,error){
bytes,err := t.Bytes()
func (t *Transaction) Hash() ([]byte, error) {
bytes, err := t.Bytes()
if err != nil {
return nil, err
}
hash := util.Sha256(bytes)
return hash,nil
return hash, nil
}

func (t *Transaction) isPending() bool {
Expand Down
20 changes: 20 additions & 0 deletions transaction/transaction_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,3 +143,23 @@ func TestNewFromPayload2(t *testing.T) {
assert.Nil(t, err, err)
t.Log(string(data))
}

func TestNewFromPayload3(t *testing.T) {
data := []byte(`{
"version": 65537,
"nonce": 1,
"toAddr": "0x0000000000000000000000000000000000000000",
"amount": 0,
"gasPrice": 10000000,
"gasLimit": 9000,
"code": "",
"data":"",
"signature": "",
"pubKey": ""
}`)

payload, err2 := provider.NewFromJson(data)
assert.Nil(t, err2, err2)
tx := NewFromPayload(payload)
t.Log(tx)
}

0 comments on commit 29f90f2

Please sign in to comment.