UNPKG

@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) • 9.38 kB
"use strict";var D=Object.defineProperty;var X=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var K=Object.prototype.hasOwnProperty;var j=(r,s)=>{for(var m in s)D(r,m,{get:s[m],enumerable:true})};var q=(r,s,m,i)=>{if(s&&typeof s==="object"||typeof s==="function"){for(let u of $(s))if(!K.call(r,u)&&u!==m)D(r,u,{get:()=>s[u],enumerable:!(i=X(s,u))||i.enumerable})}return r};var z=r=>q(D({},"__esModule",{value:true}),r);var Q={};j(Q,{parseSwap:()=>J});module.exports=z(Q);var C=require("viem");var O=require("viem");var e=require("viem/chains");var _=(0,O.defineChain)({id:4663,name:"Robinhood Chain",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.chain.robinhood.com"]}},blockExplorers:{default:{name:"Blockscout",url:"https://robinhoodchain.blockscout.com"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11"}}});var M=[{"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 N=[{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 U={EXECUTE_META_TXN:"0xfd3ad6d4"};var B=[e.bsc,e.base,e.mode,e.blast,e.linea,e.scroll,e.mantle,e.plasma,e.mainnet,e.polygon,e.arbitrum,e.unichain,e.optimism,e.avalanche,e.berachain,e.worldchain,e.monad,e.abstract,_];var L={[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,[_.id]:_.nativeCurrency.symbol};var g=`0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE`;var F=`0x00000000000000cf9e3c5a26621af382fa17f24f`;var H=`0xcA11bde05977b3631167028862bE2a173976CA11`;var P=`0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789`;var T=require("viem");var t=require("viem/chains");function Y(r){const s=[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,_.id];return s.includes(r)}function S(r,s){const{recipient:m,direction:i="to"}=s;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 A(n){for(const c of n){d(c);if(c.calls&&c.calls.length>0){A(c.calls)}}}A(r.calls);return(0,T.formatEther)(u)}async function V({publicClient:r,transactionReceipt:s}){const m={Transfer:`0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef`};const i=s.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 A=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 R=n.data==="0x"?"0":(0,T.formatUnits)(BigInt(n.data),I);const k=n.data==="0x"?0n:BigInt(n.data);const{address:y,topics:x}=n;const{1:w,2:b}=x;const a=(0,T.getAddress)(W(w));const o=(0,T.getAddress)(W(b));return{to:o,from:a,symbol:p,amount:R,amountRaw:k,address:y,decimals:I}}).filter(n=>n!=null&&n.amount!=="0");return A}function W(r){return`0x${r.slice(-40)}`}function G({logs:r,trace:s,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 A=S(s,{recipient:i});const n=S(s,{recipient:i,direction:"from"});if(!d&&A!=="0"){if(l){return{tokenIn:{address:l.address,amount:l.amount,symbol:l.symbol},tokenOut:{address:g,amount:A,symbol:L[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:L[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 J({publicClient:r,transactionHash:s,smartContractWallet:m}){const i=r.chain.id;if(!Y(i)){throw new Error(`chainId ${i} is unsupported\u2026`)}const u=r.extend(a=>({async traceCall(o){return a.request({method:"debug_traceTransaction",params:[o.hash,{tracer:"callTracer"}]})}}));const[l,d,A]=await Promise.all([u.traceCall({hash:s}),r.getTransaction({hash:s}),r.getTransactionReceipt({hash:s})]);const{from:n,value:c,to:p}=d;const I=p===P.toLowerCase();const R=S(l,{recipient:n});if(A.status==="reverted"){const a=B.find(f=>f.id===i);const o=`Unable to parse. Transaction ${s} on ${a?.name} has reverted.`;console.warn(o);return null}const k=c>0n;const y=await V({publicClient:r,transactionReceipt:A});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 G({logs:y,trace:l,chainId:i,smartContractWallet:m})}const x=y.filter(a=>a.from.toLowerCase()===n.toLowerCase());let w=x.length?x.reduce((a,o)=>({...a,amount:(0,C.formatUnits)(a.amountRaw+o.amountRaw,o.decimals),amountRaw:a.amountRaw+o.amountRaw})):y[0];let b=R==="0"?y.find(a=>{return a.to.toLowerCase()===n.toLowerCase()}):{symbol:L[i],amount:R,address:g};if(p?.toLowerCase()===F.toLowerCase()){const{args:a}=(0,C.decodeFunctionData)({abi:M,data:d.input});if(a&&Array.isArray(a)&&a[0]&&Array.isArray(a[0])){const{args:o}=(0,C.decodeFunctionData)({abi:N,data:a[0][1]?.data});const f=o[0].recipient.toLowerCase();const E=o[3];const h=S(l,{recipient:f});if(h==="0"){[b]=y.filter(v=>v.to.toLowerCase()===E.toLowerCase())}else{b={symbol:L[i],amount:h,address:g}}}}if(p?.toLowerCase()===H.toLowerCase()){const{args:a}=(0,C.decodeFunctionData)({abi:C.multicall3Abi,data:d.input});if(a[0]){const{args:o}=(0,C.decodeFunctionData)({abi:N,data:a[0][1]?.callData});const f=o[0].recipient.toLowerCase();const E=o[3];const h=S(l,{recipient:f});if(h==="0"){[b]=y.filter(v=>v.to.toLowerCase()===E.toLowerCase())}else{b={symbol:L[i],amount:h,address:g}}}}if(d.input.startsWith(U.EXECUTE_META_TXN)){const{args:a}=(0,C.decodeFunctionData)({abi:N,data:d.input});const{3:o}=a;const f=y.filter(h=>h.from===o);const E=S(l,{recipient:o});if(f.length){w=f[0]}if(E==="0"){b=y[y.length-1];const h=y.filter(v=>v.to.toLowerCase()===o.toLowerCase());if(h.length===1){b={symbol:h[0].symbol,amount:h[0].amount,address:h[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(v=>v.from.toLowerCase()===o.toLowerCase())[0]}else{b={symbol:L[i],amount:E,address:g}}}if(k){const a=(0,C.formatEther)(c);const o=y.filter(f=>f.to.toLowerCase()===n).reduce((f,E)=>({symbol:E.symbol,amount:(0,C.formatUnits)(f.amountRaw+E.amountRaw,E.decimals),amountRaw:f.amountRaw+E.amountRaw,address:E.address}),{symbol:"",amount:"",amountRaw:0n,address:""});return{tokenIn:{symbol:L[i],address:g,amount:a},tokenOut:{symbol:o.symbol,amount:o.amount,address:o.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});