@@ -71,6 +71,8 @@ import {
7171 v4CreateForwarderMethodId ,
7272 flushTokensTypesv4 ,
7373 flushForwarderTokensMethodIdV4 ,
74+ sendMultiSigTokenTypesFirstSigner ,
75+ sendMultiSigTypesFirstSigner ,
7476} from './walletUtil' ;
7577import { EthTransactionData } from './types' ;
7678
@@ -292,11 +294,11 @@ export function decodeWalletCreationData(data: string): WalletInitializationData
292294 * @param data The data to decode
293295 * @returns parsed transfer data
294296 */
295- export function decodeTransferData ( data : string ) : TransferData {
297+ export function decodeTransferData ( data : string , isFirstSigner ?: boolean ) : TransferData {
296298 if ( data . startsWith ( sendMultisigMethodId ) ) {
297- return decodeNativeTransferData ( data ) ;
299+ return decodeNativeTransferData ( data , isFirstSigner ) ;
298300 } else if ( data . startsWith ( sendMultisigTokenMethodId ) ) {
299- return decodeTokenTransferData ( data ) ;
301+ return decodeTokenTransferData ( data , isFirstSigner ) ;
300302 } else {
301303 throw new BuildTransactionError ( `Invalid transfer bytecode: ${ data } ` ) ;
302304 }
@@ -306,19 +308,34 @@ export function decodeTransferData(data: string): TransferData {
306308 * Decode the given ABI-encoded transfer data for the sendMultisigToken function and return parsed fields
307309 *
308310 * @param data The data to decode
311+ * @param isFirstSigner whether transaction is being built for a first signer
309312 * @returns parsed token transfer data
310313 */
311- export function decodeTokenTransferData ( data : string ) : TokenTransferData {
314+ export function decodeTokenTransferData ( data : string , isFirstSigner ?: boolean ) : TokenTransferData {
312315 if ( ! data . startsWith ( sendMultisigTokenMethodId ) ) {
313316 throw new BuildTransactionError ( `Invalid transfer bytecode: ${ data } ` ) ;
314317 }
315-
316- const [ to , amount , tokenContractAddress , expireTime , sequenceId , signature ] = getRawDecoded (
317- sendMultiSigTokenTypes ,
318- getBufferedByteCode ( sendMultisigTokenMethodId , data )
319- ) ;
318+ let to : RecursiveBufferOrString | undefined ;
319+ let amount : RecursiveBufferOrString | undefined ;
320+ let tokenContractAddress : RecursiveBufferOrString | undefined ;
321+ let expireTime : RecursiveBufferOrString | undefined ;
322+ let sequenceId : RecursiveBufferOrString | undefined ;
323+ let signature : RecursiveBufferOrString | undefined ;
324+ let prefix : RecursiveBufferOrString | undefined ;
325+ if ( ! isFirstSigner ) {
326+ [ to , amount , tokenContractAddress , expireTime , sequenceId , signature ] = getRawDecoded (
327+ sendMultiSigTokenTypes ,
328+ getBufferedByteCode ( sendMultisigTokenMethodId , data )
329+ ) ;
330+ } else {
331+ [ prefix , to , amount , tokenContractAddress , expireTime , sequenceId ] = getRawDecoded (
332+ sendMultiSigTokenTypesFirstSigner ,
333+ getBufferedByteCode ( sendMultisigTokenMethodId , data )
334+ ) ;
335+ }
320336
321337 return {
338+ operationHashPrefix : isFirstSigner ? ( prefix as string ) : undefined ,
322339 to : addHexPrefix ( to as string ) ,
323340 amount : new BigNumber ( bufferToHex ( amount as Buffer ) ) . toFixed ( ) ,
324341 expireTime : bufferToInt ( expireTime as Buffer ) ,
@@ -417,19 +434,35 @@ export function decodeERC1155TransferData(data: string): ERC1155TransferData {
417434 * Decode the given ABI-encoded transfer data for the sendMultisig function and return parsed fields
418435 *
419436 * @param data The data to decode
437+ * @param isFirstSigner whether transaction is being built for a first signer
420438 * @returns parsed transfer data
421439 */
422- export function decodeNativeTransferData ( data : string ) : NativeTransferData {
440+ export function decodeNativeTransferData ( data : string , isFirstSigner ?: boolean ) : NativeTransferData {
423441 if ( ! data . startsWith ( sendMultisigMethodId ) ) {
424442 throw new BuildTransactionError ( `Invalid transfer bytecode: ${ data } ` ) ;
425443 }
426444
427- const [ to , amount , internalData , expireTime , sequenceId , signature ] = getRawDecoded (
428- sendMultiSigTypes ,
429- getBufferedByteCode ( sendMultisigMethodId , data )
430- ) ;
445+ let to : RecursiveBufferOrString | undefined ;
446+ let amount : RecursiveBufferOrString | undefined ;
447+ let internalData : RecursiveBufferOrString | undefined ;
448+ let expireTime : RecursiveBufferOrString | undefined ;
449+ let sequenceId : RecursiveBufferOrString | undefined ;
450+ let signature : RecursiveBufferOrString | undefined ;
451+ let prefix : RecursiveBufferOrString | undefined ;
452+ if ( ! isFirstSigner ) {
453+ [ to , amount , internalData , expireTime , sequenceId , signature ] = getRawDecoded (
454+ sendMultiSigTypes ,
455+ getBufferedByteCode ( sendMultisigMethodId , data )
456+ ) ;
457+ } else {
458+ [ prefix , to , amount , internalData , expireTime , sequenceId ] = getRawDecoded (
459+ sendMultiSigTypesFirstSigner ,
460+ getBufferedByteCode ( sendMultisigMethodId , data )
461+ ) ;
462+ }
431463
432464 return {
465+ operationHashPrefix : isFirstSigner ? ( prefix as string ) : undefined ,
433466 to : addHexPrefix ( to as string ) ,
434467 amount : new BigNumber ( bufferToHex ( amount as Buffer ) ) . toFixed ( ) ,
435468 expireTime : bufferToInt ( expireTime as Buffer ) ,
0 commit comments