@@ -550,7 +550,7 @@ Method.prototype._confirmTransaction = function (defer, result, payload) {
550550 const startInterval = ( ) => {
551551 intervalId = setInterval ( checkConfirmation . bind ( null , existingReceipt , true ) , 1000 ) ;
552552 }
553-
553+
554554 if ( ! this . requestManager . provider . on ) {
555555 startInterval ( )
556556 } else {
@@ -618,22 +618,34 @@ Method.prototype.buildCall = function () {
618618
619619 // CALLBACK function
620620 var sendTxCallback = function ( err , result ) {
621- if ( method . handleRevert && ! err && isCall && ( method . isRevertReasonString ( result ) && method . abiCoder ) ) {
622- var reason = method . abiCoder . decodeParameter ( 'string' , '0x' + result . substring ( 10 ) ) ;
623- var signature = 'Error(String)' ;
624-
625- utils . _fireError (
626- errors . RevertInstructionError ( reason , signature ) ,
627- defer . eventEmitter ,
628- defer . reject ,
629- payload . callback ,
630- {
631- reason : reason ,
632- signature : signature
633- }
634- ) ;
621+ if ( method . handleRevert && isCall && method . abiCoder ) {
622+ var reasonData ;
623+
624+ // Ganache / Geth <= 1.9.13 return the reason data as a successful eth_call response
625+ // Geth >= 1.9.15 attaches the reason data to an error object.
626+ if ( ! err && method . isRevertReasonString ( result ) ) {
627+ reasonData = result . substring ( 10 ) ;
628+ } else if ( err && err . data ) {
629+ reasonData = err . data . substring ( 10 ) ;
630+ }
635631
636- return ;
632+ if ( reasonData ) {
633+ var reason = method . abiCoder . decodeParameter ( 'string' , '0x' + reasonData ) ;
634+ var signature = 'Error(String)' ;
635+
636+ utils . _fireError (
637+ errors . RevertInstructionError ( reason , signature ) ,
638+ defer . eventEmitter ,
639+ defer . reject ,
640+ payload . callback ,
641+ {
642+ reason : reason ,
643+ signature : signature
644+ }
645+ ) ;
646+
647+ return ;
648+ }
637649 }
638650
639651 try {
0 commit comments