@tenprotocol/session-keys
Version:
Framework-agnostic session key management for TEN Protocol
2 lines • 8.56 kB
JavaScript
;var p=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var J=Object.prototype.hasOwnProperty;var X=(e,t)=>{for(var r in t)p(e,r,{get:t[r],enumerable:!0})},z=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of j(t))!J.call(e,n)&&n!==r&&p(e,n,{get:()=>t[n],enumerable:!(s=W(t,n))||s.enumerable});return e};var Q=e=>z(p({},"__esModule",{value:!0}),e);var te={};X(te,{activateSessionKey:()=>B,cleanupSessionKey:()=>k,createSessionKey:()=>G,deactivateSessionKey:()=>H,deleteSessionKey:()=>O,fundSessionKey:()=>D,getBalance:()=>L,getError:()=>F,getIsActive:()=>K,getIsLoading:()=>v,getSessionKey:()=>I,getState:()=>P,sendTransaction:()=>R,subscribeToState:()=>A});module.exports=Q(te);var E={SESSION_KEY_CREATE:"0x0000000000000000000000000000000000000003",SESSION_KEY_RETRIEVE:"0x0000000000000000000000000000000000000007",SESSION_KEY_ACTIVATE:"0x0000000000000000000000000000000000000004",SESSION_KEY_DEACTIVATE:"0x0000000000000000000000000000000000000005",SESSION_KEY_DELETE:"0x0000000000000000000000000000000000000006",SESSION_KEY_EXECUTE:"0x0000000000000000000000000000000000000008"},u=443,T={PRIORITY_FEE_PERCENTILES:[25,50,75],FEE_HISTORY_BLOCKS:10,BASE_FEE_MULTIPLIERS:{LOW:1.1,MEDIUM:1.2,HIGH:1.5}};var c={sessionKey:null,isActive:!1,balance:null,isLoading:!1,error:null},w=new Set,x=!1;try{let e=localStorage.getItem("ten-session-key-state");if(e){let t=JSON.parse(e);c={...c,sessionKey:t.sessionKey,isActive:t.isActive}}}catch(e){console.warn("Failed to load persisted state:",e)}var P=()=>({...c}),o=async e=>{for(;x;)await new Promise(t=>setTimeout(t,50));try{if(x=!0,c={...c,...e},"sessionKey"in e||"isActive"in e)try{localStorage.setItem("ten-session-key-state",JSON.stringify({sessionKey:c.sessionKey,isActive:c.isActive}))}catch(t){console.warn("Failed to persist state:",t)}w.forEach(t=>{try{t(P())}catch(r){console.error("Error in state subscriber:",r)}})}finally{x=!1}},A=e=>(w.add(e),()=>{w.delete(e)}),b=()=>{try{localStorage.removeItem("ten-session-key-state")}catch(e){console.warn("Failed to clear persisted state:",e)}},I=()=>c.sessionKey,K=()=>c.isActive,L=()=>c.balance,v=()=>c.isLoading,F=()=>c.error;var g=e=>{let t=BigInt(e).toString(16);return t=t||"0","0x"+t},N=e=>{let t=e.replace("0x",""),r=new Uint8Array(t.length/2);for(let s=0;s<t.length;s+=2)r[s/2]=parseInt(t.substr(s,2),16);return r};var C=e=>{let[t,r=""]=e.split("."),s=r.padEnd(18,"0").slice(0,18);return BigInt(t+s)};var y=null,Z=e=>{y&&y();let t=()=>{o({isActive:!1,error:new Error("Provider disconnected")})},r=()=>{o({isActive:!1,error:new Error("Chain changed")})};e.on?.("disconnect",t),e.on?.("chainChanged",r),y=()=>{e.removeListener?.("disconnect",t),e.removeListener?.("chainChanged",r)}},h=async e=>{let t=await e.request({method:"eth_chainId"});if(parseInt(t,16)!==u)throw new Error("Session Keys is only for TEN chain, please add or switch to TEN.")},G=async e=>{try{o({isLoading:!0,error:null}),Z(e),await h(e),console.log("\u{1F511} Creating session key on TEN network..."),console.log("\u{1F511} Using address:",E.SESSION_KEY_CREATE);let t=await e.request({method:"eth_getStorageAt",params:[E.SESSION_KEY_CREATE,"0x0","latest"]});if(console.log("\u{1F511} Create response:",t),!t||t==="0x0000000000000000000000000000000000000000000000000000000000000000"){console.log("\u{1F511} Creation failed, trying to retrieve existing session key...");let s=await e.request({method:"eth_getStorageAt",params:[E.SESSION_KEY_RETRIEVE,"0x0","latest"]});if(console.log("\u{1F511} Existing key response:",s),s&&s!=="0x0000000000000000000000000000000000000000000000000000000000000000"){let n="0x"+s.slice(-40);return console.log("\u{1F511} Retrieved existing session key:",n),o({sessionKey:n,isLoading:!1}),n}throw new Error("Failed to create session key - both creation and retrieval returned empty response")}let r="0x"+t.slice(-40);return console.log("\u{1F511} Created new session key:",r),o({sessionKey:r,isLoading:!1}),r}catch(t){console.error("\u{1F511} Session key creation error:",t);let r=t instanceof Error?t:new Error("Unknown error");throw o({error:r,isLoading:!1}),r}},D=async(e,t,r,s)=>{try{o({isLoading:!0,error:null}),await h(r),console.log("\u{1F4B0} Funding session key:",e,"with",t,"ETH");let n=C(t),a=g(n),l=await r.request({method:"eth_sendTransaction",params:[{to:e,value:a,from:s}]});console.log("\u{1F4B0} Funding transaction sent:",l);let d=async()=>{let S=await r.request({method:"eth_getTransactionReceipt",params:[l]});return S?(console.log("\u{1F4B0} Funding confirmed!"),S):(await new Promise(f=>setTimeout(f,2e3)),d())};return await d(),o({isLoading:!1}),l}catch(n){let a=n instanceof Error?n:new Error("Unknown error");throw o({error:a,isLoading:!1}),a}},B=async e=>{try{o({isLoading:!0,error:null}),await h(e),await e.request({method:"eth_getStorageAt",params:[E.SESSION_KEY_ACTIVATE,"0x0","latest"]}),o({isActive:!0,isLoading:!1})}catch(t){let r=t instanceof Error?t:new Error("Activation failed");throw o({error:r,isLoading:!1}),r}},H=async e=>{try{o({isLoading:!0,error:null}),await h(e),await e.request({method:"eth_getStorageAt",params:[E.SESSION_KEY_DEACTIVATE,"0x0","latest"]}),o({isActive:!1,isLoading:!1})}catch(t){let r=t instanceof Error?t:new Error("Deactivation failed");throw o({error:r,isLoading:!1}),r}},O=async e=>{try{o({isLoading:!0,error:null}),await h(e),await e.request({method:"eth_getStorageAt",params:[E.SESSION_KEY_DELETE,"0x0","latest"]}),b(),y&&(y(),y=null),o({sessionKey:null,isActive:!1,balance:null,isLoading:!1})}catch(t){let r=t instanceof Error?t:new Error("Deletion failed");throw o({error:r,isLoading:!1}),r}},k=async e=>{try{o({isLoading:!0,error:null}),await h(e),await e.request({method:"eth_getStorageAt",params:[E.SESSION_KEY_DEACTIVATE,"0x0","latest"]}),await e.request({method:"eth_getStorageAt",params:[E.SESSION_KEY_DELETE,"0x0","latest"]}),o({sessionKey:null,isActive:!1,balance:null,isLoading:!1})}catch(t){let r=t instanceof Error?t:new Error("Cleanup failed");throw o({error:r,isLoading:!1}),r}};var U=require("rlp");var $=async e=>{let t=await e.request({method:"eth_chainId"});if(parseInt(t,16)!==u)throw new Error("Session Keys is only for TEN chain, please add or switch to TEN.")},ee=async(e,t="MEDIUM")=>{let{BASE_FEE_MULTIPLIERS:r}=T;try{let s=await e.request({method:"eth_feeHistory",params:[1,"latest",[]]});if(console.log("Fee history response:",s),!s?.baseFeePerGas?.[0])throw new Error("Invalid fee history response");let n=BigInt(s.baseFeePerGas[0]);console.log("Base fee:",n.toString());let a=BigInt(1e8),l=r[t],d=BigInt(Math.floor(Number(n)*l))+a;return console.log("Priority fee:",a.toString()),console.log("Max fee:",d.toString()),{maxFeePerGas:d,maxPriorityFeePerGas:a}}catch(s){console.warn("Error getting fee history, using fallback values:",s);let n=BigInt(1e9),a=BigInt(1e8),l=r[t];return{maxFeePerGas:BigInt(Math.floor(Number(n)*l))+a,maxPriorityFeePerGas:a}}},R=async(e,t)=>{try{o({isLoading:!0,error:null}),await $(t);let r=I();if(!r)throw new Error("No active session key. Create and activate a session key first.");let s=await t.request({method:"eth_chainId"}),n=parseInt(s,16),a;if(e.nonce!==void 0)a=e.nonce;else{let i=await t.request({method:"eth_getTransactionCount",params:[r,"latest"]});a=parseInt(i,16)}let l,d;if(e.maxFeePerGas&&e.maxPriorityFeePerGas)l=BigInt(e.maxFeePerGas),d=BigInt(e.maxPriorityFeePerGas);else{let i=await ee(t,"MEDIUM");l=i.maxFeePerGas,d=i.maxPriorityFeePerGas}let S;if(e.gasLimit)S=e.gasLimit;else{let i=await t.request({method:"eth_estimateGas",params:[{to:e.to,data:e.data,value:e.value||"0x0",from:r}]});S=parseInt(i,16)}let f=[g(n),a===0?"0x":g(a),g(d),g(l),g(S),e.to.toLowerCase(),e.value?.toLowerCase()||"0x0",e.data?.toLowerCase()||"0x",[],"0x","0x","0x"].map(i=>typeof i=="string"&&!i.startsWith("0x")?"0x"+i:i),m=(0,U.encode)(f),_;if(m&&typeof m=="object"&&"length"in m)_=Array.from(m).map(V=>V.toString(16).padStart(2,"0")).join("");else throw new Error("Unexpected RLP encoding result");let q=new Uint8Array([2,...N("0x"+_)]),Y=btoa(String.fromCharCode(...q)),M=await t.request({method:"eth_getStorageAt",params:[E.SESSION_KEY_EXECUTE,Y,"latest"]});return o({isLoading:!1}),M}catch(r){let s=r instanceof Error?r:new Error("Transaction failed");throw o({error:s,isLoading:!1}),s}};0&&(module.exports={activateSessionKey,cleanupSessionKey,createSessionKey,deactivateSessionKey,deleteSessionKey,fundSessionKey,getBalance,getError,getIsActive,getIsLoading,getSessionKey,getState,sendTransaction,subscribeToState});
//# sourceMappingURL=index.js.map