@@ -19,6 +19,7 @@ import {
1919 http ,
2020 parseAbi ,
2121 zeroAddress ,
22+ encodeAbiParameters ,
2223} from "viem" ;
2324import { privateKeyToAccount } from "viem/accounts" ;
2425import TronWeb from "tronweb" ;
@@ -125,7 +126,9 @@ export class RequestHandlerService {
125126 ) ?. topics [ 1 ]
126127 ) ;
127128 if ( ! payloadId ) {
128- throw externalError ( "Could not submit withdrawal request" ) ;
129+ throw externalError (
130+ "Withdrawal request submission failed to generate payload"
131+ ) ;
129132 }
130133
131134 encodedData = await contract . read . payloads ( [ payloadId as Hex ] ) ;
@@ -270,7 +273,9 @@ export class RequestHandlerService {
270273 ) ?. topics [ 1 ]
271274 ) ;
272275 if ( ! payloadId ) {
273- throw externalError ( "Could not submit withdrawal request" ) ;
276+ throw externalError (
277+ "Withdrawal request submission failed to generate payload"
278+ ) ;
274279 }
275280
276281 encodedData = await contract . read . payloads ( [ payloadId as Hex ] ) ;
@@ -453,6 +458,64 @@ export class RequestHandlerService {
453458 }
454459 }
455460
461+ case "hyperliquid-vm" : {
462+ if ( request . mode === "onchain" ) {
463+ const { contract, publicClient, walletClient } =
464+ await getOnchainAllocator ( ) ;
465+
466+ const currentTime = BigInt ( Date . now ( ) ) ;
467+
468+ // TODO: Add support for "sendAsset"
469+ const data = encodeAbiParameters ( [ { type : "uint64" } ] , [ currentTime ] ) ;
470+
471+ payloadParams = {
472+ chainId : chain . metadata . allocatorChainId ! ,
473+ depository : chain . depository ! ,
474+ currency : request . currency . toLowerCase ( ) ,
475+ amount : request . amount ,
476+ spender : walletClient . account . address . toLowerCase ( ) ,
477+ receiver : request . recipient . toLowerCase ( ) ,
478+ data,
479+ nonce : `0x${ randomBytes ( 32 ) . toString ( "hex" ) } ` ,
480+ } ;
481+
482+ // This is needed before being able to submit withdraw requests
483+ await handleOneTimeApproval ( ) ;
484+
485+ const txHash = await contract . write . submitWithdrawRequest ( [
486+ payloadParams as any ,
487+ ] ) ;
488+ payloadId = await publicClient
489+ . waitForTransactionReceipt ( { hash : txHash } )
490+ . then (
491+ ( receipt ) =>
492+ receipt . logs . find (
493+ ( l ) =>
494+ l . address . toLowerCase ( ) ===
495+ contract . address . toLowerCase ( ) &&
496+ // We need the "PayloadBuild" event
497+ l . topics [ 0 ] ===
498+ "0x007d52d35e656ce646ba5807d55724e47d53e72435a328e89eb6ce56b0e95d6a"
499+ ) ?. topics [ 1 ]
500+ ) ;
501+ if ( ! payloadId ) {
502+ throw externalError (
503+ "Withdrawal request submission failed to generate payload"
504+ ) ;
505+ }
506+
507+ encodedData = await contract . read . payloads ( [ payloadId as Hex ] ) ;
508+
509+ id = getDecodedWithdrawalId (
510+ decodeWithdrawal ( encodedData , chain . vmType )
511+ ) ;
512+
513+ break ;
514+ } else {
515+ throw externalError ( "Offchain allocator mode not implemented" ) ;
516+ }
517+ }
518+
456519 case "tron-vm" : {
457520 if ( request . mode === "onchain" ) {
458521 throw externalError ( "Onchain allocator mode not implemented" ) ;
0 commit comments