rlpToMessage() converts an ethereum RLP transaction to a message
(publicKey crypto.PublicKeyI, transaction *lib.Transaction, tx ethTypes.Transaction)
| 86 | |
| 87 | // rlpToMessage() converts an ethereum RLP transaction to a message |
| 88 | func rlpToMessage(publicKey crypto.PublicKeyI, transaction *lib.Transaction, tx ethTypes.Transaction) (msg lib.MessageI, e lib.ErrorI) { |
| 89 | // get the relevant tx fields |
| 90 | to, from, data := tx.To(), publicKey.Address().Bytes(), tx.Data() |
| 91 | // ensure non-nil to |
| 92 | if to == nil { |
| 93 | return nil, ErrRecipientAddressEmpty() |
| 94 | } |
| 95 | // switch on the 'recipient' |
| 96 | switch tx.To().Hex() { |
| 97 | // if the recipient is a pseudo-contract call |
| 98 | case CNPYContractAddress, StakedCNPYContractAddress, SwapCNPYContractAddress: |
| 99 | // ensure enough data for a selector |
| 100 | if len(data) < 4 { |
| 101 | return nil, ErrInvalidERC20Tx(fmt.Errorf("data too short")) |
| 102 | } |
| 103 | // switch on the selector |
| 104 | switch selector := lib.BytesToString(data[:4]); selector { |
| 105 | case SendSelector: |
| 106 | msg, e = ethDataToMsgSend(from, data) |
| 107 | case StakeSelector: |
| 108 | m := new(MessageStake) |
| 109 | msg, e = ethDataToMsg(MessageStakeName, transaction, m, data, func() { |
| 110 | // allow the omission of the public key because it may be difficult to get the public key from the wallet |
| 111 | if len(m.PublicKey) == 0 { |
| 112 | m.PublicKey = publicKey.Bytes() |
| 113 | } |
| 114 | }) |
| 115 | case EditStakeSelector: |
| 116 | m := new(MessageEditStake) |
| 117 | msg, e = ethDataToMsg(MessageEditStakeName, transaction, m, data, nil) |
| 118 | case UnstakeSelector: |
| 119 | m := new(MessageUnstake) |
| 120 | msg, e = ethDataToMsg(MessageUnstakeName, transaction, m, data, nil) |
| 121 | case CreateOrderSelector: |
| 122 | m := new(MessageCreateOrder) |
| 123 | msg, e = ethDataToMsg(MessageCreateOrderName, transaction, m, data, nil) |
| 124 | case EditOrderSelector: |
| 125 | msg, e = ethDataToMsg(MessageEditOrderName, transaction, new(MessageEditOrder), data, nil) |
| 126 | case DeleteOrderSelector: |
| 127 | msg, e = ethDataToMsg(MessageDeleteOrderName, transaction, new(MessageDeleteOrder), data, nil) |
| 128 | case SubsidySelector: |
| 129 | m := new(MessageSubsidy) |
| 130 | msg, e = ethDataToMsg(MessageSubsidyName, transaction, m, data, nil) |
| 131 | default: |
| 132 | e = ErrInvalidERC20Tx(fmt.Errorf("unsupported selector: 0x%s", selector)) |
| 133 | } |
| 134 | default: // non-contract call (transfer() only) |
| 135 | amount := DownscaleTo6Decimals(tx.Value()) |
| 136 | if amount == 0 { |
| 137 | return nil, ErrInvalidAmount() |
| 138 | } |
| 139 | msg = &MessageSend{ |
| 140 | FromAddress: from, |
| 141 | ToAddress: tx.To().Bytes(), |
| 142 | Amount: amount, |
| 143 | } |
| 144 | } |
| 145 | return |
no test coverage detected