@ordao/ethers-decode-error
Version:
Decode ethers.js smart contract errors into human-readable messages
3 lines (2 loc) • 7.22 kB
JavaScript
import{Result as r,ErrorDescription as e,AbiCoder as n,ErrorFragment as t,Interface as a}from"ethers";function o(r,e){(null==e||e>r.length)&&(e=r.length);for(var n=0,t=Array(e);n<e;n++)t[n]=r[n];return t}function i(){return i=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var t in n)({}).hasOwnProperty.call(n,t)&&(r[t]=n[t])}return r},i.apply(null,arguments)}var u,c="0x08c379a0",s="0x4e487b71";!function(r){r.EmptyError="EmptyError",r.RevertError="RevertError",r.PanicError="PanicError",r.CustomError="CustomError",r.UserRejectError="UserRejectError",r.RpcError="RpcError",r.UnknownError="UnknownError"}(u||(u={}));var l=function(r,e){return r&&""!==r.trim()?r:e},d=function(n){var t=n.data,a=n.fragment,o=n.args,u=n.selector,c=n.name,s={type:n.type,reason:l(n.reason,null),data:null!=t?t:null,fragment:null,args:null!=o?o:new r,selector:null!=u?u:null,name:null!=c?c:null,signature:null};return a&&(s=i({},s,new e(a,a.selector,o))),s},f=function(r){var e=r.data,n=r.name;return d({type:u.UnknownError,reason:l(r.reason,"Unknown error"),data:e,name:n})},v=/*#__PURE__*/function(){function r(){}var e=r.prototype;return e.predicate=function(r){return"0x"===r},e.handle=function(r){return d({type:u.EmptyError,data:{data:r}.data})},r}(),m=/*#__PURE__*/function(){function r(){}var e=r.prototype;return e.predicate=function(r){return null==r?void 0:r.startsWith(c)},e.handle=function(r){var e,a=r.slice(10),o=new n;try{var i=t.from("Error(string)"),c=o.decode(i.inputs,"0x"+a);return d({type:u.RevertError,reason:(e={data:r,fragment:i,reason:c[0],args:c}).reason,data:e.data,fragment:e.fragment,args:e.args})}catch(e){return f({reason:"Unknown error returned",data:r})}},r}(),p=/*#__PURE__*/function(){function r(){}var e=r.prototype;return e.predicate=function(r){return null==r?void 0:r.startsWith(s)},e.handle=function(r){var e,a=r.slice(10),o=new n;try{var i,c=t.from("Panic(uint256)"),s=o.decode(c.inputs,"0x"+a),l=null!=(i=function(r){switch(r){case 0x0n:return"Generic compiler inserted panic";case 0x1n:return"Assertion error";case 0x11n:return"Arithmetic operation underflowed or overflowed outside of an unchecked block";case 0x12n:return"Division or modulo division by zero";case 0x21n:return"Tried to convert a value into an enum, but the value was too big or negative";case 0x22n:return"Incorrectly encoded storage byte array";case 0x31n:return".pop() was called on an empty array";case 0x32n:return"Array accessed at an out-of-bounds or negative index";case 0x41n:return"Too much memory was allocated, or an array was created that is too large";case 0x51n:return"Called a zero-initialized variable of internal function type"}}(s[0]))?i:"Unknown panic code";return d({type:u.PanicError,reason:(e={data:r,fragment:c,reason:l,args:s}).reason,data:e.data,args:e.args})}catch(e){return f({reason:"Unknown panic error",data:r})}},r}(),g=/*#__PURE__*/function(){function r(){}var e=r.prototype;return e.predicate=function(r){return r&&"0x"!==r&&!(null!=r&&r.startsWith(c))&&!(null!=r&&r.startsWith(s))},e.handle=function(r,e){var n=e.errorInterface,t={data:r};if(n){var a=n.parseError(r);a&&(t=i({},t,{fragment:a.fragment,reason:a.name,args:a.args}))}return function(r){var e=r.data,n=r.reason,t=r.fragment,a=r.args,o=e.slice(0,10);return d({type:u.CustomError,reason:l(n,"No ABI for custom error "+o),data:e,fragment:t,args:a,selector:o,name:o})}(t)},r}(),h=/*#__PURE__*/function(){function r(){}var e=r.prototype;return e.predicate=function(r,e){var n;return!r&&(null==e||null==(n=e.message)?void 0:n.includes("rejected transaction"))},e.handle=function(r,e){var n,t,a,o;return o=void 0===(a=(t={data:null,reason:null!=(n=e.error.message)?n:"The transaction was rejected"}).data)?null:a,d({type:u.UserRejectError,reason:l(t.reason,"User has rejected the transaction"),data:o})},r}(),y=/*#__PURE__*/function(){function r(){}var e=r.prototype;return e.predicate=function(r,e){var n;return!r&&e.message&&!(null!=e&&null!=(n=e.message)&&n.includes("rejected transaction"))&&void 0!==e.code},e.handle=function(r,e){var n,t,a,o,i,c,s=e.error,f=null!=(n=null!=(t=null==(a=s.info)||null==(a=a.error)?void 0:a.message)?t:s.shortMessage)?n:s.message;return c=(o={data:null,name:s.code,reason:f}).name,d({type:u.RpcError,reason:l(o.reason,"Error from JSON RPC provider"),data:null,name:null!=(i=null==c?void 0:c.toString())?i:null})},r}(),E=/*#__PURE__*/function(){function r(r,e){this.errorInterface=void 0,this.errorHandlers=[],this.errorInterface=e,this.errorHandlers=r.map(function(r){return{predicate:r.predicate,handle:r.handle}})}var e=r.prototype;return e.getContractOrTransactionError=function(r){try{var e=r.receipt;return e?Promise.resolve(this.getTransactionError(e)).then(function(e){return e||r}):Promise.resolve(r)}catch(r){return Promise.reject(r)}},e.getTransactionError=function(r){try{if(!r||0!==r.status)return Promise.resolve(void 0);var e=r.provider;return Promise.resolve(e.getTransaction(r.hash)).then(function(r){return function(){try{var n=Promise.resolve(e.call(i({},r,{maxFeePerGas:void 0,maxPriorityFeePerGas:void 0}))).then(function(){return null})}catch(r){return r}return n&&n.then?n.then(void 0,function(r){return r}):n}()})}catch(r){return Promise.reject(r)}},e.getDataFromError=function(r){var e,n,t=null!=(e=r.data)?e:null==(n=r.error)?void 0:n.data;if(void 0!==t){var a="string"==typeof t?t:t.data;if("object"==typeof a&&a.data&&(a=a.data),void 0!==a&&"string"==typeof a)return a}},e.decodeError=function(r,e){for(var n,t,a=function(r){var e="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(e)return(e=e.call(r)).next.bind(e);if(Array.isArray(r)||(e=function(r,e){if(r){if("string"==typeof r)return o(r,e);var n={}.toString.call(r).slice(8,-1);return"Object"===n&&r.constructor&&(n=r.constructor.name),"Map"===n||"Set"===n?Array.from(r):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(r,e):void 0}}(r))){e&&(r=e);var n=0;return function(){return n>=r.length?{done:!0}:{done:!1,value:r[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(this.errorHandlers);!(t=a()).done;){var i=t.value,u=i.handle;if((0,i.predicate)(r,e))return u(r,{errorInterface:this.errorInterface,error:e})}return f({data:r,reason:null!=(n=null==e?void 0:e.message)?n:"Unexpected error",name:null==e?void 0:e.name})},e.decodeReturnData=function(r){return this.decodeError(r,new Error)},e.decode=function(r){try{var e,n=this;return r instanceof Error?Promise.resolve(n.getContractOrTransactionError(r)).then(function(r){var e=n.getDataFromError(r);return n.decodeError(e,r)}):Promise.resolve(f({data:void 0,reason:null!=(e=r.message)?e:"Invalid error"}))}catch(r){return Promise.reject(r)}},r.create=function(e,n){void 0===n&&(n={});var o,i=n.additionalErrorHandlers;if(e){var u=e.flatMap(function(r){return r instanceof a?r.fragments.filter(function(r){return t.isFragment(r)}):r.filter(function(r){return"error"===r.type||t.isFragment(r)})});o=new a(u)}return new r([new v,new m,new p,new g,new h,new y].concat(null!=i?i:[]),o)},r}();export{E as ErrorDecoder};
//# sourceMappingURL=error-decoder.mjs.map