wido
Version:
JavaScript library for interacting with the Wido protocol which allows you to seamlessly move liquidity across vaults and chains.
3 lines (2 loc) • 13.5 kB
JavaScript
(function(s,l){typeof exports=="object"&&typeof module!="undefined"?l(exports):typeof define=="function"&&define.amd?define(["exports"],l):(s=typeof globalThis!="undefined"?globalThis:s||self,l(s.wido={}))})(this,function(s){"use strict";var Ct=Object.defineProperty;var vt=(s,l,w)=>l in s?Ct(s,l,{enumerable:!0,configurable:!0,writable:!0,value:w}):s[l]=w;var T=(s,l,w)=>(vt(s,typeof l!="symbol"?l+"":l,w),w);class l extends Error{constructor(n,o,r){let a;switch(n){case"INVALID_REQUEST":a=`${o}: ${r==null?void 0:r.map(f=>f.msg).join(", ")}`;break;default:a=`${n}: ${o}`;break}super(a);T(this,"name","WidoError");T(this,"code");T(this,"detail");T(this,"validationErrors");this.detail=o,this.code=n,this.validationErrors=r}static from_api_response(n){return new l(n.code,n.detail,n.validationErrors)}}async function w(e){const{tokenAddress:t,fromToken:n,toToken:o,chainId:r,fromChainId:a,toChainId:f,amount:m=C,tokenId:i}=e,u="approve";if(!r&&!a)throw new Error("fromChainId must be set");const c={chain_id:String(a||r),amount:m,from_token:n,to_token:o};t&&(c.token_address=t),i&&(c.token_id=i),f&&(c.to_chain_id=String(f));const h=new URLSearchParams(c),p=`${E.WIDO_API_URL}/${u}?${h}`,N=await fetch(p);if(!N.ok)throw l.from_api_response(await N.json());const R=await N.json();return{to:R.to,data:R.data}}const W="0x0000000000000000000000000000000000000000",E={WIDO_API_URL:"https://api.joinwido.com",SEGMENT_KEY:"G4ttHjzxUXZ2ORLGHpXE8yEfCCkqjPXx",DEBUG:!1},x=()=>{console.log("Using local Wido API URL..."),E.WIDO_API_URL="http://127.0.0.1:8080",E.SEGMENT_KEY="qu7qvYAa1ziyWWkgsInDw4K2YQDFxWOR"},X=()=>{E.WIDO_API_URL="https://api.joinwido.com",E.SEGMENT_KEY="G4ttHjzxUXZ2ORLGHpXE8yEfCCkqjPXx"};async function V(e){const{txHash:t,chainId:n}=e,o="status",r={chain_id:String(n),tx_hash:t},a=new URLSearchParams(r),f=`${E.WIDO_API_URL}/${o}?${a}`,m=await fetch(f);if(!m.ok)throw l.from_api_response(await m.json());const i=await m.json();return{status:i.status,substatus:i.substatus,substatusMessage:i.substatus_message,toChainId:i.to_chain_id,toTxHash:i.to_tx_hash}}async function B(e){const{accountAddress:t,tokenAddress:n,chainId:o,fromToken:r,toToken:a,fromChainId:f,toChainId:m,tokenId:i}=e,u="allowance";if(!o&&!f)throw new Error("fromChainId must be set");const c={chain_id:String(f||o),account_address:t,from_token:r,to_token:a};n&&(c.token_address=n),i&&(c.token_id=i),m&&(c.to_chain_id=String(m));const h=new URLSearchParams(c),p=`${E.WIDO_API_URL}/${u}?${h}`,N=await fetch(p);if(!N.ok)throw l.from_api_response(await N.json());const R=await N.json();return{spender:R.spender,allowance:R.allowance}}async function z(e){const t="contract_address",n=new URLSearchParams({chain_id:String(e)}),o=`${E.WIDO_API_URL}/${t}?${n}`,r=await fetch(o);if(!r.ok)throw l.from_api_response(await r.json());return(await r.json()).spender}async function K(e){const{chainId:t,fromToken:n,toChainId:o,toToken:r}=e,a="contract_address",f={chain_id:String(t),from_token:n,to_chain_id:String(o),to_token:r},m=new URLSearchParams(f),i=`${E.WIDO_API_URL}/${a}?${m}`,u=await fetch(i);if(!u.ok)throw l.from_api_response(await u.json());return(await u.json()).spender}async function q(e){const{chainId:t=[],protocol:n=[],includePricing:o=!1,includePreview:r=!1,toChainId:a,toToken:f}=e||{},m="tokens",i={include_pricing:String(o),include_preview:String(r)};a&&(i.to_chain_id=String(a)),f&&(i.to_token=f);const u=new URLSearchParams(i);t.forEach(p=>u.append("chain_id",String(p))),n.forEach(p=>u.append("protocol",p));const c=`${E.WIDO_API_URL}/${m}?${u}`,h=await fetch(c);if(!h.ok)throw l.from_api_response(await h.json());return(await h.json()).tokens}async function H(e){return await q(e)}async function J(e,t){const n="balances",o=new URLSearchParams({user:e});t==null||t.forEach(f=>o.append("chain_id",String(f)));const r=`${E.WIDO_API_URL}/${n}?${o}`,a=await fetch(r);if(!a.ok)throw l.from_api_response(await a.json());return(await a.json()).balances}async function Z(e){const{user:t,fromChainId:n,fromToken:o,toChainId:r,toToken:a,amount:f,slippagePercentage:m=.01,varsOverride:i={},partner:u,lowerTick:c,upperTick:h,tokenId:p,recipient:N,gaslessType:R,providers:M}=e,it="quote_v2",I={from_chain_id:String(n),from_token:o,to_chain_id:String(r),to_token:a,...i};m&&(I.slippage_percentage=String(m)),f&&(I.amount=f),t&&(I.user=t),u&&(I.partner=u),c&&(I.lower_tick=c),h&&(I.upper_tick=h),p&&(I.token_id=p),N&&(I.recipient=N),R&&(I.gasless_type=R);const j=new URLSearchParams(I);if(M)for(const yt of M)j.append("providers",yt);const st=`${E.WIDO_API_URL}/${it}?${j}`,P=await fetch(st);if(!P.ok)throw l.from_api_response(await P.json());const g=await P.json(),{is_supported:ct,steps:ut,steps_count:lt,messages:_t}=g,$={isSupported:ct,steps:ut,stepsCount:lt,messages:_t||[]};if(!f&&!t)return $;const{price:mt,min_price:ht,from_token_usd_price:Et,from_token_amount:dt,from_token_amount_usd_value:pt,to_token_usd_price:Nt,to_token_amount:It,to_token_amount_usd_value:Rt,expected_slippage:wt,min_to_token_amount:Tt,from:At,to:St,data:Ut,value:Pt,gas_fee:gt,gas_fee_usd:kt,fee_in_from_token:Dt,bridge_fee_usd_value:Ot,fee_usd_value:bt}=g;return{...$,price:mt,minPrice:ht,fromTokenUsdPrice:Et,fromTokenAmount:dt,fromTokenAmountUsdValue:pt,toTokenUsdPrice:Nt,toTokenAmount:It,toTokenAmountUsdValue:Rt,expectedSlippage:wt,minToTokenAmount:Tt,from:At,to:St,data:Ut,value:Pt,gasFee:gt,gasFeeUsdValue:kt,feeBps:g.fee_bps,feeInFromToken:Dt,bridgeFeeUsdValue:Ot,feeUsdValue:bt}}const Y="logger/5.7.0";let k=!1,D=!1;const A={debug:1,default:2,info:2,warning:3,error:4,off:5};let O=A.default,S=null;function Q(){try{const e=[];if(["NFD","NFC","NFKD","NFKC"].forEach(t=>{try{if("test".normalize(t)!=="test")throw new Error("bad normalize")}catch{e.push(t)}}),e.length)throw new Error("missing "+e.join(", "));if(String.fromCharCode(233).normalize("NFD")!==String.fromCharCode(101,769))throw new Error("broken implementation")}catch(e){return e.message}return null}const b=Q();var U;(function(e){e.DEBUG="DEBUG",e.INFO="INFO",e.WARNING="WARNING",e.ERROR="ERROR",e.OFF="OFF"})(U||(U={}));var d;(function(e){e.UNKNOWN_ERROR="UNKNOWN_ERROR",e.NOT_IMPLEMENTED="NOT_IMPLEMENTED",e.UNSUPPORTED_OPERATION="UNSUPPORTED_OPERATION",e.NETWORK_ERROR="NETWORK_ERROR",e.SERVER_ERROR="SERVER_ERROR",e.TIMEOUT="TIMEOUT",e.BUFFER_OVERRUN="BUFFER_OVERRUN",e.NUMERIC_FAULT="NUMERIC_FAULT",e.MISSING_NEW="MISSING_NEW",e.INVALID_ARGUMENT="INVALID_ARGUMENT",e.MISSING_ARGUMENT="MISSING_ARGUMENT",e.UNEXPECTED_ARGUMENT="UNEXPECTED_ARGUMENT",e.CALL_EXCEPTION="CALL_EXCEPTION",e.INSUFFICIENT_FUNDS="INSUFFICIENT_FUNDS",e.NONCE_EXPIRED="NONCE_EXPIRED",e.REPLACEMENT_UNDERPRICED="REPLACEMENT_UNDERPRICED",e.UNPREDICTABLE_GAS_LIMIT="UNPREDICTABLE_GAS_LIMIT",e.TRANSACTION_REPLACED="TRANSACTION_REPLACED",e.ACTION_REJECTED="ACTION_REJECTED"})(d||(d={}));const y="0123456789abcdef";class _{constructor(t){Object.defineProperty(this,"version",{enumerable:!0,value:t,writable:!1})}_log(t,n){const o=t.toLowerCase();A[o]==null&&this.throwArgumentError("invalid log level name","logLevel",t),!(O>A[o])&&console.log.apply(console,n)}debug(...t){this._log(_.levels.DEBUG,t)}info(...t){this._log(_.levels.INFO,t)}warn(...t){this._log(_.levels.WARNING,t)}makeError(t,n,o){if(D)return this.makeError("censored error",n,{});n||(n=_.errors.UNKNOWN_ERROR),o||(o={});const r=[];Object.keys(o).forEach(i=>{const u=o[i];try{if(u instanceof Uint8Array){let c="";for(let h=0;h<u.length;h++)c+=y[u[h]>>4],c+=y[u[h]&15];r.push(i+"=Uint8Array(0x"+c+")")}else r.push(i+"="+JSON.stringify(u))}catch{r.push(i+"="+JSON.stringify(o[i].toString()))}}),r.push(`code=${n}`),r.push(`version=${this.version}`);const a=t;let f="";switch(n){case d.NUMERIC_FAULT:{f="NUMERIC_FAULT";const i=t;switch(i){case"overflow":case"underflow":case"division-by-zero":f+="-"+i;break;case"negative-power":case"negative-width":f+="-unsupported";break;case"unbound-bitwise-result":f+="-unbound-result";break}break}case d.CALL_EXCEPTION:case d.INSUFFICIENT_FUNDS:case d.MISSING_NEW:case d.NONCE_EXPIRED:case d.REPLACEMENT_UNDERPRICED:case d.TRANSACTION_REPLACED:case d.UNPREDICTABLE_GAS_LIMIT:f=n;break}f&&(t+=" [ See: https://links.ethers.org/v5-errors-"+f+" ]"),r.length&&(t+=" ("+r.join(", ")+")");const m=new Error(t);return m.reason=a,m.code=n,Object.keys(o).forEach(function(i){m[i]=o[i]}),m}throwError(t,n,o){throw this.makeError(t,n,o)}throwArgumentError(t,n,o){return this.throwError(t,_.errors.INVALID_ARGUMENT,{argument:n,value:o})}assert(t,n,o,r){t||this.throwError(n,o,r)}assertArgument(t,n,o,r){t||this.throwArgumentError(n,o,r)}checkNormalize(t){b&&this.throwError("platform missing String.prototype.normalize",_.errors.UNSUPPORTED_OPERATION,{operation:"String.prototype.normalize",form:b})}checkSafeUint53(t,n){typeof t=="number"&&(n==null&&(n="value not safe"),(t<0||t>=9007199254740991)&&this.throwError(n,_.errors.NUMERIC_FAULT,{operation:"checkSafeInteger",fault:"out-of-safe-range",value:t}),t%1&&this.throwError(n,_.errors.NUMERIC_FAULT,{operation:"checkSafeInteger",fault:"non-integer",value:t}))}checkArgumentCount(t,n,o){o?o=": "+o:o="",t<n&&this.throwError("missing argument"+o,_.errors.MISSING_ARGUMENT,{count:t,expectedCount:n}),t>n&&this.throwError("too many arguments"+o,_.errors.UNEXPECTED_ARGUMENT,{count:t,expectedCount:n})}checkNew(t,n){(t===Object||t==null)&&this.throwError("missing new",_.errors.MISSING_NEW,{name:n.name})}checkAbstract(t,n){t===n?this.throwError("cannot instantiate abstract class "+JSON.stringify(n.name)+" directly; use a sub-class",_.errors.UNSUPPORTED_OPERATION,{name:t.name,operation:"new"}):(t===Object||t==null)&&this.throwError("missing new",_.errors.MISSING_NEW,{name:n.name})}static globalLogger(){return S||(S=new _(Y)),S}static setCensorship(t,n){if(!t&&n&&this.globalLogger().throwError("cannot permanently disable censorship",_.errors.UNSUPPORTED_OPERATION,{operation:"setCensorship"}),k){if(!t)return;this.globalLogger().throwError("error censorship permanent",_.errors.UNSUPPORTED_OPERATION,{operation:"setCensorship"})}D=!!t,k=!!n}static setLogLevel(t){const n=A[t.toLowerCase()];if(n==null){_.globalLogger().warn("invalid log level - "+t);return}O=n}static from(t){return new _(t)}}_.errors=d,_.levels=U;const tt="properties/5.7.0";var et=globalThis&&globalThis.__awaiter||function(e,t,n,o){function r(a){return a instanceof n?a:new n(function(f){f(a)})}return new(n||(n=Promise))(function(a,f){function m(c){try{u(o.next(c))}catch(h){f(h)}}function i(c){try{u(o.throw(c))}catch(h){f(h)}}function u(c){c.done?a(c.value):r(c.value).then(m,i)}u((o=o.apply(e,t||[])).next())})};new _(tt);function nt(e){return et(this,void 0,void 0,function*(){const t=Object.keys(e).map(o=>{const r=e[o];return Promise.resolve(r).then(a=>({key:o,value:a}))});return(yield Promise.all(t)).reduce((o,r)=>(o[r.key]=r.value,o),{})})}async function ot(e,t){const n="paymaster",o={chainId:e,sender:t.sender,nonce:t.nonce.toString(),initCode:t.initCode,callData:t.callData,callGasLimit:t.callGasLimit.toString(),verificationGasLimit:t.verificationGasLimit.toString(),preVerificationGas:t.preVerificationGas.toString(),maxFeePerGas:t.maxFeePerGas.toString(),maxPriorityFeePerGas:t.maxPriorityFeePerGas.toString(),paymasterAndData:t.paymasterAndData,signature:t.signature},r=`${E.WIDO_API_URL}/${n}`,a=await fetch(r,{method:"POST",mode:"cors",headers:{Accept:"*/*","Content-Type":"application/json"},body:JSON.stringify(o)});if(!a.ok)throw l.from_api_response(await a.json());const{paymasterAndData:f}=await a.json();return{paymasterAndData:f}}class rt{constructor(t){T(this,"chainId");this.chainId=t}getDummyPaymasterAndData(t){return Promise.resolve("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")}async getPaymasterAndData(t){return t=await nt(t),t.nonce=Number(t.nonce),t.callGasLimit=Number(t.callGasLimit),t.verificationGasLimit=Number(t.verificationGasLimit),t.maxFeePerGas=Number(t.maxFeePerGas),t.maxPriorityFeePerGas=Number(t.maxPriorityFeePerGas),t.preVerificationGas=Number(t.preVerificationGas),t.signature="0x",t.paymasterAndData="0x",{paymasterAndData:(await ot(this.chainId,t)).paymasterAndData}}}const C="115792089237316195423570985008687907853269984665640564039457584007913129639935",v={other:1,mainnet:1,goerli:5,fantom:250,arbitrum:42161,avalanche:43114,moonriver:1285,polygon:137,celo:42220,phuture:1338,optimism:10,binance:56,aurora:1313161554,base:8453};function at(e){if(!v[e])throw new Error(`InputError: chain with name ${e} not found.`);return v[e]}const G={1:"mainnet",5:"goerli",250:"fantom",43114:"avalanche",42161:"arbitrum",1285:"moonriver",137:"polygon",42220:"celo",1338:"phuture",10:"optimism",56:"binance",1313161554:"aurora",8453:"base"};function ft(e){if(!G[e])throw new Error(`InputError: chain with id ${e} not found.`);return G[e]}var L=(e=>(e.ERC4337="erc4337",e.EOA="eoa",e))(L||{}),F=(e=>(e.LiFi="LiFi",e.ZeroEx="ZeroEx",e.OpenOcean="OpenOcean",e))(F||{});s.BiconomyPaymaster=rt,s.CONFIG=E,s.GaslessType=L,s.MAX_UINT256=C,s.Providers=F,s.ZERO_ADDRESS=W,s.approve=w,s.getBalances=J,s.getChainId=at,s.getChainName=ft,s.getStatus=V,s.getSupportedTokens=H,s.getTokenAllowance=B,s.getWidoContractAddress=z,s.getWidoSpender=K,s.quote=Z,s.useLocalApi=x,s.useProdApi=X,Object.defineProperties(s,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
//# sourceMappingURL=wido.js.map