77# PROTOBUF3 types
88TYPE_VARINT = 0
99TYPE_DOUBLE = 1
10- TYPE_STRING = 2
11- TYPE_GROUPS = 3
12- TYPE_GROUPE = 4
10+ TYPE_LEN = 2
1311TYPE_FLOAT = 5
1412
1513
@@ -56,22 +54,39 @@ def pack_contract(contract, owner_address):
5654 write_varint (retc , 1 )
5755 api = "TransferContract"
5856
59- add_field (cmessage , 1 , TYPE_STRING )
57+ add_field (cmessage , 1 , TYPE_LEN )
6058 write_bytes_with_length (cmessage , base58 .decode_check (owner_address ))
61- add_field (cmessage , 2 , TYPE_STRING )
59+ add_field (cmessage , 2 , TYPE_LEN )
6260 write_bytes_with_length (
6361 cmessage , base58 .decode_check (contract .transfer_contract .to_address )
6462 )
6563 add_field (cmessage , 3 , TYPE_VARINT )
6664 write_varint (cmessage , contract .transfer_contract .amount )
65+ elif contract .vote_witness_contract :
66+ write_varint (retc , 4 )
67+ api = "VoteWitnessContract"
6768
68- if contract .trigger_smart_contract :
69+ add_field (cmessage , 1 , TYPE_LEN )
70+ write_bytes_with_length (cmessage , base58 .decode_check (owner_address ))
71+ for vote in contract .vote_witness_contract .votes :
72+ v_message = bytearray ()
73+ add_field (cmessage , 2 , TYPE_LEN )
74+ add_field (v_message , 1 , TYPE_LEN )
75+ write_bytes_with_length (v_message , base58 .decode_check (vote .vote_address ))
76+ add_field (v_message , 2 , TYPE_VARINT )
77+ write_varint (v_message , vote .vote_count )
78+ write_bytes_with_length (cmessage , v_message )
79+ if contract .vote_witness_contract .support is not None :
80+ add_field (cmessage , 3 , TYPE_VARINT )
81+ write_varint (cmessage , int (contract .vote_witness_contract .support ))
82+
83+ elif contract .trigger_smart_contract :
6984 write_varint (retc , 31 )
7085 api = "TriggerSmartContract"
7186
72- add_field (cmessage , 1 , TYPE_STRING )
87+ add_field (cmessage , 1 , TYPE_LEN )
7388 write_bytes_with_length (cmessage , base58 .decode_check (owner_address ))
74- add_field (cmessage , 2 , TYPE_STRING )
89+ add_field (cmessage , 2 , TYPE_LEN )
7590 write_bytes_with_length (
7691 cmessage ,
7792 base58 .decode_check (contract .trigger_smart_contract .contract_address ),
@@ -81,7 +96,7 @@ def pack_contract(contract, owner_address):
8196 write_varint (cmessage , contract .trigger_smart_contract .call_value )
8297
8398 # Contract data
84- add_field (cmessage , 4 , TYPE_STRING )
99+ add_field (cmessage , 4 , TYPE_LEN )
85100 write_bytes_with_length (cmessage , contract .trigger_smart_contract .data )
86101
87102 if contract .trigger_smart_contract .call_token_value :
@@ -90,11 +105,11 @@ def pack_contract(contract, owner_address):
90105 add_field (cmessage , 6 , TYPE_VARINT )
91106 write_varint (cmessage , contract .trigger_smart_contract .asset_id )
92107
93- if contract .freeze_balance_contract :
108+ elif contract .freeze_balance_contract :
94109 write_varint (retc , 11 )
95110 api = "FreezeBalanceContract"
96111
97- add_field (cmessage , 1 , TYPE_STRING )
112+ add_field (cmessage , 1 , TYPE_LEN )
98113 write_bytes_with_length (cmessage , base58 .decode_check (owner_address ))
99114 add_field (cmessage , 2 , TYPE_VARINT )
100115 write_varint (cmessage , contract .freeze_balance_contract .frozen_balance )
@@ -104,41 +119,41 @@ def pack_contract(contract, owner_address):
104119 add_field (cmessage , 4 , TYPE_VARINT )
105120 write_varint (cmessage , contract .freeze_balance_contract .resource )
106121 if contract .freeze_balance_contract .receiver_address is not None :
107- add_field (cmessage , 5 , TYPE_STRING )
122+ add_field (cmessage , 5 , TYPE_LEN )
108123 write_bytes_with_length (
109124 cmessage ,
110125 base58 .decode_check (contract .freeze_balance_contract .receiver_address ),
111126 )
112127
113- if contract .unfreeze_balance_contract :
128+ elif contract .unfreeze_balance_contract :
114129 write_varint (retc , 12 )
115130 api = "UnfreezeBalanceContract"
116131
117- add_field (cmessage , 1 , TYPE_STRING )
132+ add_field (cmessage , 1 , TYPE_LEN )
118133 write_bytes_with_length (cmessage , base58 .decode_check (owner_address ))
119134
120135 if contract .unfreeze_balance_contract .resource is not None :
121136 add_field (cmessage , 2 , TYPE_VARINT )
122137 write_varint (cmessage , contract .unfreeze_balance_contract .resource )
123138 if contract .unfreeze_balance_contract .receiver_address is not None :
124- add_field (cmessage , 3 , TYPE_STRING )
139+ add_field (cmessage , 3 , TYPE_LEN )
125140 write_bytes_with_length (
126141 cmessage ,
127142 base58 .decode_check (
128143 contract .unfreeze_balance_contract .receiver_address
129144 ),
130145 )
131146
132- if contract .withdraw_balance_contract :
147+ elif contract .withdraw_balance_contract :
133148 write_varint (retc , 13 )
134149 api = "WithdrawBalanceContract"
135- add_field (cmessage , 1 , TYPE_STRING )
150+ add_field (cmessage , 1 , TYPE_LEN )
136151 write_bytes_with_length (cmessage , base58 .decode_check (owner_address ))
137152
138- if contract .freeze_balance_v2_contract :
153+ elif contract .freeze_balance_v2_contract :
139154 write_varint (retc , 54 )
140155 api = "FreezeBalanceV2Contract"
141- add_field (cmessage , 1 , TYPE_STRING )
156+ add_field (cmessage , 1 , TYPE_LEN )
142157 write_bytes_with_length (cmessage , base58 .decode_check (owner_address ))
143158
144159 add_field (cmessage , 2 , TYPE_VARINT )
@@ -147,10 +162,10 @@ def pack_contract(contract, owner_address):
147162 add_field (cmessage , 3 , TYPE_VARINT )
148163 write_varint (cmessage , contract .freeze_balance_v2_contract .resource )
149164
150- if contract .unfreeze_balance_v2_contract :
165+ elif contract .unfreeze_balance_v2_contract :
151166 write_varint (retc , 55 )
152167 api = "UnfreezeBalanceV2Contract"
153- add_field (cmessage , 1 , TYPE_STRING )
168+ add_field (cmessage , 1 , TYPE_LEN )
154169 write_bytes_with_length (cmessage , base58 .decode_check (owner_address ))
155170
156171 add_field (cmessage , 2 , TYPE_VARINT )
@@ -159,23 +174,23 @@ def pack_contract(contract, owner_address):
159174 add_field (cmessage , 3 , TYPE_VARINT )
160175 write_varint (cmessage , contract .unfreeze_balance_v2_contract .resource )
161176
162- if contract .withdraw_expire_unfreeze_contract :
177+ elif contract .withdraw_expire_unfreeze_contract :
163178 write_varint (retc , 56 )
164179 api = "WithdrawExpireUnfreezeContract"
165- add_field (cmessage , 1 , TYPE_STRING )
180+ add_field (cmessage , 1 , TYPE_LEN )
166181 write_bytes_with_length (cmessage , base58 .decode_check (owner_address ))
167182
168- if contract .delegate_resource_contract :
183+ elif contract .delegate_resource_contract :
169184 write_varint (retc , 57 )
170185 api = "DelegateResourceContract"
171- add_field (cmessage , 1 , TYPE_STRING )
186+ add_field (cmessage , 1 , TYPE_LEN )
172187 write_bytes_with_length (cmessage , base58 .decode_check (owner_address ))
173188
174189 add_field (cmessage , 2 , TYPE_VARINT )
175190 write_varint (cmessage , contract .delegate_resource_contract .resource )
176191 add_field (cmessage , 3 , TYPE_VARINT )
177192 write_varint (cmessage , contract .delegate_resource_contract .balance )
178- add_field (cmessage , 4 , TYPE_STRING )
193+ add_field (cmessage , 4 , TYPE_LEN )
179194 write_bytes_with_length (
180195 cmessage ,
181196 base58 .decode_check (contract .delegate_resource_contract .receiver_address ),
@@ -184,55 +199,67 @@ def pack_contract(contract, owner_address):
184199 add_field (cmessage , 5 , TYPE_VARINT )
185200 write_varint (cmessage , contract .delegate_resource_contract .lock )
186201
187- if contract .undelegate_resource_contract :
202+ elif contract .undelegate_resource_contract :
188203 write_varint (retc , 58 )
189204 api = "UnDelegateResourceContract"
190- add_field (cmessage , 1 , TYPE_STRING )
205+ add_field (cmessage , 1 , TYPE_LEN )
191206 write_bytes_with_length (cmessage , base58 .decode_check (owner_address ))
192207
193208 add_field (cmessage , 2 , TYPE_VARINT )
194209 write_varint (cmessage , contract .undelegate_resource_contract .resource )
195210 add_field (cmessage , 3 , TYPE_VARINT )
196211 write_varint (cmessage , contract .undelegate_resource_contract .balance )
197- add_field (cmessage , 4 , TYPE_STRING )
212+ add_field (cmessage , 4 , TYPE_LEN )
198213 write_bytes_with_length (
199214 cmessage ,
200215 base58 .decode_check (contract .undelegate_resource_contract .receiver_address ),
201216 )
217+ else :
218+ raise ValueError ("Invalid contract type" )
202219
203220 # write API
204221 capi = bytearray ()
205- add_field (capi , 1 , TYPE_STRING )
222+ add_field (capi , 1 , TYPE_LEN )
206223 # write_bytes_with_length(capi, "type.googleapis.com/protocol." + api)
207224 write_bytes_with_length (capi , bytes ("type.googleapis.com/protocol." + api , "ascii" ))
208225
209226 # extend to capi
210- add_field (capi , 2 , TYPE_STRING )
227+ add_field (capi , 2 , TYPE_LEN )
211228 write_bytes_with_length (capi , cmessage )
212229
213230 # extend to contract
214- add_field (retc , 2 , TYPE_STRING )
231+ add_field (retc , 2 , TYPE_LEN )
215232 write_bytes_with_length (retc , capi )
233+
234+ if contract .provider :
235+ add_field (retc , 3 , TYPE_LEN )
236+ write_bytes_with_length (retc , contract .provider )
237+ if contract .contract_name :
238+ add_field (retc , 4 , TYPE_LEN )
239+ write_bytes_with_length (retc , contract .contract_name )
240+ if contract .permission_id is not None :
241+ add_field (retc , 5 , TYPE_VARINT )
242+ write_varint (retc , contract .permission_id )
216243 return retc
217244
218245
219246def serialize (transaction : TronSignTx , owner_address : str ):
220247 # transaction parameters
221248 ret = bytearray ()
222- add_field (ret , 1 , TYPE_STRING )
249+ add_field (ret , 1 , TYPE_LEN )
223250 write_bytes_with_length (ret , transaction .ref_block_bytes )
224- add_field (ret , 4 , TYPE_STRING )
251+ add_field (ret , 4 , TYPE_LEN )
225252 write_bytes_with_length (ret , transaction .ref_block_hash )
226253 add_field (ret , 8 , TYPE_VARINT )
227254 write_varint (ret , transaction .expiration )
228255 if transaction .data is not None :
229- add_field (ret , 10 , TYPE_STRING )
230- write_bytes_with_length (ret , bytes ( transaction .data , "ascii" ) )
256+ add_field (ret , 10 , TYPE_LEN )
257+ write_bytes_with_length (ret , transaction .data )
231258
232259 # add Contract
233260 retc = pack_contract (transaction .contract , owner_address )
234261
235- add_field (ret , 11 , TYPE_STRING )
262+ add_field (ret , 11 , TYPE_LEN )
236263 write_bytes_with_length (ret , retc )
237264 # add timestamp
238265 add_field (ret , 14 , TYPE_VARINT )
0 commit comments