@@ -6,11 +6,8 @@ import { Transaction as VetTransaction, Secp256k1, TransactionClause } from '@ve
66import { Transaction } from './transaction' ;
77import { VetTransactionData } from '../iface' ;
88import { ClaimRewardsData } from '../types' ;
9- import {
10- CLAIM_BASE_REWARDS_METHOD_ID ,
11- CLAIM_STAKING_REWARDS_METHOD_ID ,
12- STARGATE_DELEGATION_ADDRESS ,
13- } from '../constants' ;
9+ import { CLAIM_BASE_REWARDS_METHOD_ID , CLAIM_STAKING_REWARDS_METHOD_ID } from '../constants' ;
10+ import utils from '../utils' ;
1411
1512export class ClaimRewardsTransaction extends Transaction {
1613 private _claimRewardsData : ClaimRewardsData ;
@@ -83,42 +80,26 @@ export class ClaimRewardsTransaction extends Transaction {
8380 }
8481
8582 /**
86- * Get the delegation contract address to use for claims
87- * Uses the address from claimRewardsData if provided, otherwise falls back to default
88- */
89- private getDelegationAddress ( ) : string {
90- return this . _claimRewardsData . delegationContractAddress || STARGATE_DELEGATION_ADDRESS ;
91- }
92-
93- /**
94- * Build clause for claiming base rewards
83+ * Build clause for claiming base rewards (claimVetGeneratedVtho)
9584 */
9685 private buildClaimBaseRewardsClause ( ) : TransactionClause {
97- const methodData = this . encodeClaimRewardsMethod (
98- CLAIM_BASE_REWARDS_METHOD_ID ,
99- this . _claimRewardsData . validatorAddress ,
100- this . _claimRewardsData . delegatorAddress
101- ) ;
86+ const methodData = this . encodeClaimRewardsMethod ( CLAIM_BASE_REWARDS_METHOD_ID , this . _claimRewardsData . tokenId ) ;
10287
10388 return {
104- to : this . getDelegationAddress ( ) ,
89+ to : utils . getDefaultStakingAddress ( this . _coinConfig ) ,
10590 value : '0x0' ,
10691 data : methodData ,
10792 } ;
10893 }
10994
11095 /**
111- * Build clause for claiming staking rewards
96+ * Build clause for claiming staking rewards (claimRewards)
11297 */
11398 private buildClaimStakingRewardsClause ( ) : TransactionClause {
114- const methodData = this . encodeClaimRewardsMethod (
115- CLAIM_STAKING_REWARDS_METHOD_ID ,
116- this . _claimRewardsData . validatorAddress ,
117- this . _claimRewardsData . delegatorAddress
118- ) ;
99+ const methodData = this . encodeClaimRewardsMethod ( CLAIM_STAKING_REWARDS_METHOD_ID , this . _claimRewardsData . tokenId ) ;
119100
120101 return {
121- to : this . getDelegationAddress ( ) ,
102+ to : utils . getDefaultDelegationAddress ( this . _coinConfig ) ,
122103 value : '0x0' ,
123104 data : methodData ,
124105 } ;
@@ -127,10 +108,10 @@ export class ClaimRewardsTransaction extends Transaction {
127108 /**
128109 * Encode the claim rewards method call data
129110 */
130- private encodeClaimRewardsMethod ( methodId : string , validatorAddress : string , delegatorAddress : string ) : string {
131- const methodName = methodId === CLAIM_BASE_REWARDS_METHOD_ID ? 'claimBaseRewards ' : 'claimStakingRewards ' ;
132- const types = [ 'address' , 'address '] ;
133- const params = [ validatorAddress , delegatorAddress ] ;
111+ private encodeClaimRewardsMethod ( methodId : string , tokenId : string ) : string {
112+ const methodName = methodId === CLAIM_BASE_REWARDS_METHOD_ID ? 'claimVetGeneratedVtho ' : 'claimRewards ' ;
113+ const types = [ 'uint256 ' ] ;
114+ const params = [ tokenId ] ;
134115
135116 const method = EthereumAbi . methodID ( methodName , types ) ;
136117 const args = EthereumAbi . rawEncode ( types , params ) ;
@@ -215,35 +196,29 @@ export class ClaimRewardsTransaction extends Transaction {
215196
216197 let claimBaseRewards = false ;
217198 let claimStakingRewards = false ;
218- let validatorAddress = '' ;
219- let delegatorAddress = '' ;
199+ let tokenId = '' ;
220200 let delegationContractAddress = '' ;
201+ let stargateNftAddress = '' ;
221202
222203 for ( const clause of clauses ) {
223- // Check if this is a claim rewards clause by looking at the method ID in data
224- if (
225- clause . data &&
226- ( clause . data . startsWith ( CLAIM_BASE_REWARDS_METHOD_ID ) ||
227- clause . data . startsWith ( CLAIM_STAKING_REWARDS_METHOD_ID ) )
228- ) {
229- // Store the contract address (could be different from default)
230- if ( ! delegationContractAddress ) {
231- delegationContractAddress = clause . to || '' ;
232- }
233-
204+ if ( clause . data ) {
234205 if ( clause . data . startsWith ( CLAIM_BASE_REWARDS_METHOD_ID ) ) {
206+ // claimVetGeneratedVtho should go to STARGATE_NFT_ADDRESS
235207 claimBaseRewards = true ;
236- if ( ! validatorAddress || ! delegatorAddress ) {
237- const addresses = this . parseAddressesFromClaimData ( clause . data ) ;
238- validatorAddress = addresses . validator ;
239- delegatorAddress = addresses . delegator ;
208+ if ( ! tokenId ) {
209+ tokenId = utils . decodeClaimRewardsData ( clause . data ) ;
210+ }
211+ if ( ! stargateNftAddress && clause . to ) {
212+ stargateNftAddress = clause . to ;
240213 }
241214 } else if ( clause . data . startsWith ( CLAIM_STAKING_REWARDS_METHOD_ID ) ) {
215+ // claimRewards should go to STARGATE_DELEGATION_ADDRESS
242216 claimStakingRewards = true ;
243- if ( ! validatorAddress || ! delegatorAddress ) {
244- const addresses = this . parseAddressesFromClaimData ( clause . data ) ;
245- validatorAddress = addresses . validator ;
246- delegatorAddress = addresses . delegator ;
217+ if ( ! tokenId ) {
218+ tokenId = utils . decodeClaimRewardsData ( clause . data ) ;
219+ }
220+ if ( ! delegationContractAddress && clause . to ) {
221+ delegationContractAddress = clause . to ;
247222 }
248223 }
249224 }
@@ -254,41 +229,15 @@ export class ClaimRewardsTransaction extends Transaction {
254229 }
255230
256231 this . _claimRewardsData = {
257- validatorAddress,
258- delegatorAddress,
232+ tokenId,
259233 delegationContractAddress :
260- delegationContractAddress !== STARGATE_DELEGATION_ADDRESS ? delegationContractAddress : undefined ,
234+ delegationContractAddress && ! utils . isDelegationContractAddress ( delegationContractAddress )
235+ ? delegationContractAddress
236+ : undefined ,
237+ stargateNftAddress :
238+ stargateNftAddress && ! utils . isNftContractAddress ( stargateNftAddress ) ? stargateNftAddress : undefined ,
261239 claimBaseRewards,
262240 claimStakingRewards,
263241 } ;
264242 }
265-
266- /**
267- * Parse validator and delegator addresses from claim rewards method data.
268- *
269- * The method data follows Ethereum ABI encoding where each parameter occupies 32 bytes (64 hex chars).
270- * After the 4-byte method ID, the parameters are laid out as:
271- * - Bytes 0-31 (chars 0-63): First address parameter (validator) - right-padded, actual address in bytes 12-31
272- * - Bytes 32-63 (chars 64-127): Second address parameter (delegator) - right-padded, actual address in bytes 44-63
273- *
274- * @param data The encoded method call data including method ID and parameters
275- * @returns Object containing the extracted validator and delegator addresses
276- */
277- private parseAddressesFromClaimData ( data : string ) : { validator : string ; delegator : string } {
278- // Remove method ID (first 10 characters: '0x' + 4-byte method ID)
279- const methodData = data . slice ( 10 ) ;
280-
281- // Extract validator address from first parameter (bytes 12-31 of first 32-byte slot)
282- // Slice 24-64: Skip first 12 bytes of padding (24 hex chars), take next 20 bytes (40 hex chars)
283- const validatorAddress = '0x' + methodData . slice ( 24 , 64 ) ;
284-
285- // Extract delegator address from second parameter (bytes 44-63 of second 32-byte slot)
286- // Slice 88-128: Skip to second slot + 12 bytes padding (88 hex chars), take next 20 bytes (40 hex chars)
287- const delegatorAddress = '0x' + methodData . slice ( 88 , 128 ) ;
288-
289- return {
290- validator : validatorAddress ,
291- delegator : delegatorAddress ,
292- } ;
293- }
294243}
0 commit comments