MCPcopy
hub / github.com/canopy-network/canopy / rlpToMessage

Function rlpToMessage

fsm/ethereum.go:88–146  ·  view source on GitHub ↗

rlpToMessage() converts an ethereum RLP transaction to a message

(publicKey crypto.PublicKeyI, transaction *lib.Transaction, tx ethTypes.Transaction)

Source from the content-addressed store, hash-verified

86
87// rlpToMessage() converts an ethereum RLP transaction to a message
88func 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

Callers 1

RLPToCanopyTransactionFunction · 0.85

Calls 11

BytesToStringFunction · 0.92
ErrRecipientAddressEmptyFunction · 0.85
ErrInvalidERC20TxFunction · 0.85
ethDataToMsgSendFunction · 0.85
ethDataToMsgFunction · 0.85
DownscaleTo6DecimalsFunction · 0.85
ErrInvalidAmountFunction · 0.70
BytesMethod · 0.65
AddressMethod · 0.65
ErrorfMethod · 0.65
ValueMethod · 0.65

Tested by

no test coverage detected