@0x/0x-parser
Version:
🧾 Designed for 0x integrators: This library parses 0x transactions on EVM blockchains into a format that is both user-friendly and easy to understand.
2 lines (1 loc) • 8.97 kB
JavaScript
;var D=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var X=Object.prototype.hasOwnProperty;var $=(r,o)=>{for(var m in o)D(r,m,{get:o[m],enumerable:true})};var K=(r,o,m,i)=>{if(o&&typeof o==="object"||typeof o==="function"){for(let u of G(o))if(!X.call(r,u)&&u!==m)D(r,u,{get:()=>o[u],enumerable:!(i=V(o,u))||i.enumerable})}return r};var j=r=>K(D({},"__esModule",{value:true}),r);var z={};$(z,{parseSwap:()=>q});module.exports=j(z);var C=require("viem");var e=require("viem/chains");var k=[{"type":"receive","stateMutability":"payable"},{"type":"function","name":"multicall","inputs":[{"name":"calls","type":"tuple[]","internalType":"struct IMultiCall.Call[]","components":[{"name":"target","type":"address","internalType":"address"},{"name":"revertPolicy","type":"uint8","internalType":"enum IMultiCall.RevertPolicy"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}]},{"name":"contextdepth","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IMultiCall.Result[]","components":[{"name":"success","type":"bool","internalType":"bool"},{"name":"data","type":"bytes","internalType":"bytes"}]}],"stateMutability":"payable"}];var x=[{inputs:[{components:[{internalType:"address",name:"recipient",type:"address"},{internalType:"contract IERC20",name:"buyToken",type:"address"},{internalType:"uint256",name:"minAmountOut",type:"uint256"}],internalType:"struct SettlerBase.AllowedSlippage",name:"slippage",type:"tuple"},{internalType:"bytes[]",name:"actions",type:"bytes[]"},{internalType:"bytes32",name:"",type:"bytes32"},{internalType:"address",name:"msgSender",type:"address"},{internalType:"bytes",name:"sig",type:"bytes"}],name:"executeMetaTxn",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"}];var O={EXECUTE_META_TXN:"0xfd3ad6d4"};var M=[e.bsc,e.base,e.mode,e.blast,e.linea,e.scroll,e.mantle,e.mainnet,e.polygon,e.arbitrum,e.unichain,e.optimism,e.avalanche,e.berachain,e.worldchain,e.monad,e.abstract];var h={[e.bsc.id]:e.bsc.nativeCurrency.symbol,[e.base.id]:e.base.nativeCurrency.symbol,[e.mode.id]:e.mode.nativeCurrency.symbol,[e.blast.id]:e.blast.nativeCurrency.symbol,[e.linea.id]:e.linea.nativeCurrency.symbol,[e.scroll.id]:e.scroll.nativeCurrency.symbol,[e.mantle.id]:e.mantle.nativeCurrency.symbol,[e.monad.id]:e.monad.nativeCurrency.symbol,[e.plasma.id]:e.plasma.nativeCurrency.symbol,[e.mainnet.id]:e.mainnet.nativeCurrency.symbol,[e.polygon.id]:e.polygon.nativeCurrency.symbol,[e.unichain.id]:e.unichain.nativeCurrency.symbol,[e.optimism.id]:e.optimism.nativeCurrency.symbol,[e.arbitrum.id]:e.arbitrum.nativeCurrency.symbol,[e.avalanche.id]:e.avalanche.nativeCurrency.symbol,[e.berachain.id]:e.berachain.nativeCurrency.symbol,[e.worldchain.id]:e.worldchain.nativeCurrency.symbol,[e.abstract.id]:e.abstract.nativeCurrency.symbol};var g=`0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE`;var U=`0x00000000000000cf9e3c5a26621af382fa17f24f`;var F=`0xcA11bde05977b3631167028862bE2a173976CA11`;var B=`0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789`;var T=require("viem");var t=require("viem/chains");function H(r){const o=[t.bsc.id,t.base.id,t.mode.id,t.monad.id,t.blast.id,t.linea.id,t.scroll.id,t.mantle.id,t.plasma.id,t.polygon.id,t.mainnet.id,t.arbitrum.id,t.optimism.id,t.unichain.id,t.avalanche.id,t.berachain.id,t.worldchain.id,t.abstract.id];return o.includes(r)}function _(r,o){const{recipient:m,direction:i="to"}=o;let u=0n;const l=m.toLowerCase();function d(n){if(!n.value)return;const c=i==="from"?n.from:n.to;if(c.toLowerCase()===l){u+=(0,T.fromHex)(n.value,"bigint")}}function L(n){for(const c of n){d(c);if(c.calls&&c.calls.length>0){L(c.calls)}}}L(r.calls);return(0,T.formatEther)(u)}async function W({publicClient:r,transactionReceipt:o}){const m={Transfer:`0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef`};const i=o.logs.filter(n=>n.topics[0]===m.Transfer).map(n=>({...n,address:(0,T.getAddress)(n.address)}));const u=[...i.map(n=>({abi:T.erc20Abi,address:n.address,functionName:"symbol"})),...i.map(n=>({abi:T.erc20Abi,address:n.address,functionName:"decimals"}))];const l=await r.multicall({contracts:u});const d=Math.floor(l.length/2);const L=i.map((n,c)=>{const p=l[c].result;const I=l[d+c].result;if(p==null||I==null||typeof I!=="number"){return null}const v=n.data==="0x"?"0":(0,T.formatUnits)(BigInt(n.data),I);const N=n.data==="0x"?0n:BigInt(n.data);const{address:y,topics:R}=n;const{1:w,2:b}=R;const a=(0,T.getAddress)(P(w));const s=(0,T.getAddress)(P(b));return{to:s,from:a,symbol:p,amount:v,amountRaw:N,address:y,decimals:I}}).filter(n=>n!=null&&n.amount!=="0");return L}function P(r){return`0x${r.slice(-40)}`}function Y({logs:r,trace:o,chainId:m,smartContractWallet:i}){const u=r.reduce((c,p)=>{if(p.to===i)return{...c,output:p};if(p.from===i)return{...c,input:p};return c},{});let{input:l,output:d}=u;const L=_(o,{recipient:i});const n=_(o,{recipient:i,direction:"from"});if(!d&&L!=="0"){if(l){return{tokenIn:{address:l.address,amount:l.amount,symbol:l.symbol},tokenOut:{address:g,amount:L,symbol:h[m]}}}else{return null}}if(!l&&n!=="0"){const c=m===56?"WBNB":m===137?"WPOL":"WETH";const p=r.find(I=>I.symbol===c);if(p&&d){return{tokenIn:{address:g,amount:p.amount,symbol:h[m]},tokenOut:{address:d.address,amount:d.amount,symbol:d.symbol}}}else{return null}}if(l&&d){return{tokenIn:{address:l.address,amount:l.amount,symbol:l.symbol},tokenOut:{address:d.address,amount:d.amount,symbol:d.symbol}}}return null}async function q({publicClient:r,transactionHash:o,smartContractWallet:m}){const i=r.chain.id;if(!H(i)){throw new Error(`chainId ${i} is unsupported\u2026`)}const u=r.extend(a=>({async traceCall(s){return a.request({method:"debug_traceTransaction",params:[s.hash,{tracer:"callTracer"}]})}}));const[l,d,L]=await Promise.all([u.traceCall({hash:o}),r.getTransaction({hash:o}),r.getTransactionReceipt({hash:o})]);const{from:n,value:c,to:p}=d;const I=p===B.toLowerCase();const v=_(l,{recipient:n});if(L.status==="reverted"){const a=M.find(f=>f.id===i);const s=`Unable to parse. Transaction ${o} on ${a?.name} has reverted.`;console.warn(s);return null}const N=c>0n;const y=await W({publicClient:r,transactionReceipt:L});if(I){if(!m){throw new Error("This is an ERC-4337 transaction. You must provide a smart contract wallet address to 0x-parser.")}return Y({logs:y,trace:l,chainId:i,smartContractWallet:m})}const R=y.filter(a=>a.from.toLowerCase()===n.toLowerCase());let w=R.length?R.reduce((a,s)=>({...a,amount:(0,C.formatUnits)(a.amountRaw+s.amountRaw,s.decimals),amountRaw:a.amountRaw+s.amountRaw})):y[0];let b=v==="0"?y.find(a=>{return a.to.toLowerCase()===n.toLowerCase()}):{symbol:h[i],amount:v,address:g};if(p?.toLowerCase()===U.toLowerCase()){const{args:a}=(0,C.decodeFunctionData)({abi:k,data:d.input});if(a&&Array.isArray(a)&&a[0]&&Array.isArray(a[0])){const{args:s}=(0,C.decodeFunctionData)({abi:x,data:a[0][1]?.data});const f=s[0].recipient.toLowerCase();const A=s[3];const E=_(l,{recipient:f});if(E==="0"){[b]=y.filter(S=>S.to.toLowerCase()===A.toLowerCase())}else{b={symbol:h[i],amount:E,address:g}}}}if(p?.toLowerCase()===F.toLowerCase()){const{args:a}=(0,C.decodeFunctionData)({abi:C.multicall3Abi,data:d.input});if(a[0]){const{args:s}=(0,C.decodeFunctionData)({abi:x,data:a[0][1]?.callData});const f=s[0].recipient.toLowerCase();const A=s[3];const E=_(l,{recipient:f});if(E==="0"){[b]=y.filter(S=>S.to.toLowerCase()===A.toLowerCase())}else{b={symbol:h[i],amount:E,address:g}}}}if(d.input.startsWith(O.EXECUTE_META_TXN)){const{args:a}=(0,C.decodeFunctionData)({abi:x,data:d.input});const{3:s}=a;const f=y.filter(E=>E.from===s);const A=_(l,{recipient:s});if(f.length){w=f[0]}if(A==="0"){b=y[y.length-1];const E=y.filter(S=>S.to.toLowerCase()===s.toLowerCase());if(E.length===1){b={symbol:E[0].symbol,amount:E[0].amount,address:E[0].address}}else{console.error("File a bug report here, including the expected results (URL to a block explorer) and the unexpected results: https://github.com/0xProject/0x-parser/issues/new/choose.")}w=y.filter(S=>S.from.toLowerCase()===s.toLowerCase())[0]}else{b={symbol:h[i],amount:A,address:g}}}if(N){const a=(0,C.formatEther)(c);const s=y.filter(f=>f.to.toLowerCase()===n).reduce((f,A)=>({symbol:A.symbol,amount:(0,C.formatUnits)(f.amountRaw+A.amountRaw,A.decimals),amountRaw:f.amountRaw+A.amountRaw,address:A.address}),{symbol:"",amount:"",amountRaw:0n,address:""});return{tokenIn:{symbol:h[i],address:g,amount:a},tokenOut:{symbol:s.symbol,amount:s.amount,address:s.address}}}if(!b){console.error("File a bug report here, including the expected results (URL to a block explorer) and the unexpected results: https://github.com/0xProject/0x-parser/issues/new/choose.");return null}return{tokenIn:{symbol:w.symbol,amount:w.amount,address:w.address},tokenOut:{symbol:b.symbol,amount:b.amount,address:b.address}}}0&&(module.exports={parseSwap});