UNPKG

@luffalab/luffa-evm-sdk

Version:

luffa evm ts sdk

2 lines 10 kB
var _=Object.defineProperty;var x=(i,e,t)=>e in i?_(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var a=(i,e,t)=>x(i,typeof e!="symbol"?e+"":e,t);var p=(d=>(d.CONNECT="connect",d.GETACCOUNT="getAccount",d.DISCONNECT="disconnect",d.ACCOUNT_CHANGE="accountChange",d.ACCOUNTS_CHANGE="accountsChanged",d.NETWORK_CHANGE="luffa_switchChain",d.CHAIN_CHANGED="chainChanged",d))(p||{});var h=()=>window&&window?._evmWallet!==void 0||window?.webkit?.messageHandlers?._evmWallet!==void 0||!1,v=()=>(window&&window?.navigator?.userAgent||"").includes("miniProgram"),f=()=>!!(window?.wx&&window?.wx?.getSystemInfoSync),N={mainnet:"endless",testnet:"eds"},D=i=>{let e=parseInt(i,16),t="";switch(e){case 728126428:t="tron";break;case 3448148188:t="tron_nile";break;case 1:t="eth";break;case 11155111:t="eth_sepolia";break;case 56:t="bsc";break;case 97:t="bsc_test";break;case 220:t="endless";break;case 221:t="eds";break}return t},A=i=>{let e;switch(i){case"eth":e=1;break;case"eth_sepolia":e=11155111;break;case"bsc":e=56;break;case"bsc_test":e=97;break;case"tron":e=728126428;break;case"tron_nile":e=3448148188;break;case"endless":e=220;break;case"eds":e=221;break}return e},I=i=>{if(!i||!i.startsWith("0x095ea7b3"))return{isApprove:!1,spender:null,amount:null};try{let e=i.slice(10),t=e.slice(0,64),s=e.slice(64,128),n="0x"+t.slice(24),c=BigInt("0x"+s);return{isApprove:!0,spender:n,amount:c}}catch{return{isApprove:!1,spender:null,amount:null}}},M=i=>typeof i=="string"&&i.startsWith("0x")&&i.length%2===0&&/^[0-9a-fA-F]+$/.test(i.slice(2)),k=i=>{let e=i.slice(2),t=new Uint8Array(e.length/2);for(let n=0;n<e.length;n+=2)t[n/2]=parseInt(e.slice(n,n+2),16);return new TextDecoder("utf-8").decode(t)},y=i=>M(i)?k(i):i;var g=class g{constructor(){a(this,"callbacks",{});a(this,"listeners",{});a(this,"receive",e=>{let t=e.data.methodName;switch(this.callbacks[e.data.uuid+t]&&(this.callbacks[e.data.uuid+t](e.data.data),delete this.callbacks[e.data.uuid+t]),t){case"luffa_switchChain":{let s=e.data.data.network;if(!s)break;f()&&(s=e.data.data),this.emit(t,s),this.emit("chainChanged",`0x${A(s)?.toString(16)}`);break}case"connect":this.emit(t,[e?.data?.data?.account]);break;case"accountChange":{e?.data?.data?.account?(l.setAccountAddress(e.data.data.account),this.emit("accountsChanged",[e?.data?.data?.account])):l.setAccountAddress(null);break}case"disconnect":{l.setAccountAddress(null),this.emit(t,e.data.data),this.emit("accountsChanged",[]);break}default:this.emit(t,e.data.data);break}});a(this,"addListener",(e,t)=>{this.listeners[e]||(this.listeners[e]=[]),this.listeners[e].push(t)});a(this,"removeListener",(e,t)=>{if(t){let s=this.listeners[e]?.indexOf(t)??-1;s>-1&&this.listeners?.[e]?.splice(s,1)}else this.listeners[e]=[]});a(this,"emit",(e,t)=>{this.listeners?.[e]?.forEach(s=>s(t))});a(this,"sendMessage",(e,t)=>{try{if(h()){this.sendLuffaMessage(e,t);return}if(f()||v()){this.sendMiniProgramMessage(e,t);return}}catch{}});if(g._instance)return g._instance;g._instance=this,h()&&(window.evmWallet={sendResponse:this.sendResponse.bind(this)})}sendLuffaMessage(e,t){let s=e?.initData||l.getIninData();e.initData={...s||{},network:N[s.network]??s.network},e.from=l.getAccountAddress(),t&&(this.callbacks[e.uuid+e.methodName]=t),window?._evmWallet?window._evmWallet?.sendMessage(JSON.stringify(e)):window?.webkit&&window?.webkit?.messageHandlers?._evmWallet&&window.webkit.messageHandlers._evmWallet?.postMessage(e)}sendResponse(e){let t=JSON.parse(e);this.receive({data:t})}sendMiniProgramMessage(e,t){let s="invokeNativePlugin",n=l.getAccountAddress(),c=l.getIninData(),d={api_name:"luffaWebRequest",data:{func:e.methodName,chainType:"endless",...e,initData:{...c,network:N[c.network]??c.network},from:n}},m=r=>{t&&t({status:"success",...r.data||{}})},w=r=>{t&&t({status:"error",...r.data||{}})};switch(e.methodName){case"connect":case"getAccount":m=r=>{l.setAccountAddress(r.data.account),t&&t({account:r?.data?.address||"",...r.data||{}})};break;case"signMessage":case"signTransaction":case"signBuildTransaction":case"signAndSubmitTransaction":case"evmApprove":m=r=>{t&&t({status:"success",...r.data||{}})},w=r=>{t&&t({status:"error",...r.data||{}})};break;default:break}f()?wx[s]({...d,complete:r=>{r.status===void 0?t&&t({...r}):r.status==="success"?(m(r),this.receive({data:r})):w(r)}}):v()&&window.WeixinJSBridge?.invoke(s,d,r=>{r.status===void 0?t&&t({...r}):r.status==="success"?(m(r),this.receive({data:r})):w(r)})}};a(g,"_instance");var E=g;import{v4 as R}from"uuid";var T=(t=>(t.APPROVED="Approved",t.REJECTED="Rejected",t))(T||{});var S=(u=>(u.CONNECT="connect",u.GETACCOUNT="getAccount",u.DISCONNECT="disconnect",u.CURRENT_CHAIN="currentChain",u.NETWORK_CHANGE="luffa_switchChain",u.SIGN_MESSAGE="signMessage",u.SEND_TRANSACTION="sendTransaction",u.SIGN_AND_SUBMIT_TRANSACTION="signAndSubmitTransaction",u.SIGN_TRANSACTION="signTransaction",u.SIGN_BUILD_TRANSACTION="signBuildTransaction",u.EVM_APPROVE="evmApprove",u.ACCOUNT_CHANGE="accountChange",u))(S||{}),o=class o{constructor(e){a(this,"message",null);a(this,"_metadata",{});a(this,"_initData",{});a(this,"accountAddress",null);a(this,"request",(e,t)=>{switch(e.method){case"eth_requestAccounts":return this.connect();case"eth_accounts":return this.getAccount();case"eth_chainId":return this.currentChain();case"wallet_switchEthereumChain":return this.luffa_switchChain(e);case"eth_sendTransaction":return this.sendTransaction(e);case"personal_sign":return this.signMessage(e);case"wallet_revokePermissions":return this.disconnect();default:throw new Error("Unsupported method: "+e.method)}});a(this,"luffa_switchChain",e=>new Promise(t=>{let s=D(e?.params[0]?.chainId);this.message?.sendMessage({uuid:new Date().getTime().toString(),methodName:"luffa_switchChain",metadata:this._metadata,data:{targetNet:s}},n=>{n?.network&&(this._initData.network=n.network);let c={...n};t(c)})}));a(this,"currentChain",()=>new Promise(e=>{this.message?.sendMessage({uuid:new Date().getTime().toString(),methodName:"currentChain",metadata:this._metadata,data:{}},t=>{if(t?.network){this._initData.network=t?.network;let s=`0x${A(t?.network)?.toString(16)}`;e(s)}else e({status:"Rejected"})})}));a(this,"getAccount",()=>new Promise(e=>{this.message?.sendMessage({uuid:new Date().getTime().toString(),methodName:"getAccount",metadata:this._metadata,data:{}},t=>{t?.account?(this.accountAddress=t.account,e([t.account])):e([])})}));a(this,"connect",()=>new Promise((e,t)=>{this.message?.sendMessage({uuid:new Date().getTime().toString(),methodName:"connect",metadata:this._metadata,data:{}},s=>{let n;s?.account?(this.accountAddress=s.account,n=[s.account],e(n)):(n={code:4001,message:"User rejected the request."},t(n))})}));a(this,"disconnect",e=>new Promise((t,s)=>{this.message?.sendMessage({uuid:new Date().getTime().toString(),methodName:"disconnect",metadata:this._metadata,data:{}},n=>{this.accountAddress=null,e&&e(n),t()})}));a(this,"on",(e,t)=>{this.message?.addListener&&this.message?.addListener(e,t)});a(this,"off",(e,t)=>{this.message?.removeListener&&this.message?.removeListener(e,t)});a(this,"signAndSubmitTransaction",async(e,t="signAndSubmitTransaction")=>{if(!this.accountAddress){let s=await this.connect();this.accountAddress=s[0]}return new Promise(async s=>{this.message?.sendMessage({uuid:new Date().getTime().toString(),methodName:t,metadata:this._metadata,data:e.params[0]},n=>{n?.hash?s(n.hash):s({code:4001,message:n?.message})})})});a(this,"signTransaction",(e,t="signBuildTransaction")=>new Promise(async(s,n)=>{let c={raw_data_hex:e.raw_data_hex};e.to&&(c.to=e.to),this.message?.sendMessage({uuid:new Date().getTime().toString(),methodName:t,metadata:this._metadata,data:c},C=>{let d=C?.signature?.split(",")||[];if(Array.isArray(d)&&d.length>0){let m={...e,signature:d};s(m)}else n("Confirmation declined by user")})}));a(this,"signMessage",(e,t)=>new Promise(async s=>{this.accountAddress||await this.connect(),this.message?.sendMessage({uuid:new Date().getTime().toString(),methodName:"signMessage",metadata:this._metadata,data:{message:y(e.params[0])}},n=>{if(n?.signature){let c={status:"Approved",args:n};s(c)}else{let c={status:"Rejected",message:n?.message};s(c)}t&&t(n)})}));a(this,"onAccountChange",e=>{this.on("accountChange",e)});a(this,"onNetworkChange",e=>{this.on("luffa_switchChain",e)});if(o._instance)return o._instance;this.message=new E,this.getMetadata(),this.initConfig(e),o._instance=this}initConfig(e){this._initData.callbackWalletName="evmWallet",this._initData.network=e.network;let t=Object.freeze({isMetaMask:!1,request:this.request,on:this.on,removeListener:this.off});Object.defineProperty(globalThis,"ethereum",{value:t,writable:!1});function s(){let n={uuid:R(),name:"LuffaEvmWallet",icon:"",rdns:"org.luffa.wallet"};window.dispatchEvent(new CustomEvent("eip6963:announceProvider",{detail:Object.freeze({info:n,provider:t})}))}window.addEventListener("eip6963:requestProvider",()=>{s()}),s()}async sendTransaction(e){if(!this.accountAddress){let n=await this.connect();this.accountAddress=n[0]}let{isApprove:t,spender:s}=I(e.params[0].data);return t?(e.to=s,this.signAndSubmitTransaction(e,"evmApprove")):this.signAndSubmitTransaction(e)}getMetadata(){if(!window)return;let t=(document.querySelector('link[rel="icon"]')||document.querySelector('link[rel="shortcut icon"]'))?.getAttribute("href")||"";t&&!t.startsWith("http")&&(t=new URL(t,window.location.origin).href),this._metadata.title=window.document.title,this._metadata.url=window.location.href,this._metadata.origin=window.location.origin,this._metadata.icon=t}};a(o,"version","1.0.7"),a(o,"_instance"),a(o,"getIninData",()=>o._instance?o._instance._initData:{}),a(o,"getAccountAddress",()=>o._instance?o._instance.accountAddress:null),a(o,"setAccountAddress",e=>{o._instance&&(o._instance.accountAddress=e)});var l=o;export{p as EvmSDKEvent,l as LuffaEvmSdk,S as MethodName,T as UserResponseStatus,h as isLuffa,f as isLuffaMiniProgram,v as isLuffaMiniProgramWebview}; //# sourceMappingURL=index.mjs.map