@walletconnect/sign-client
Version:
Sign Client for WalletConnect Protocol
1 lines • 70.4 kB
JavaScript
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var d=require("@walletconnect/core"),J=require("@walletconnect/logger"),Se=require("@walletconnect/types"),r=require("@walletconnect/utils"),Te=require("events"),I=require("@walletconnect/time"),S=require("@walletconnect/jsonrpc-utils");function ke(T){return T&&typeof T=="object"&&"default"in T?T:{default:T}}var Ue=ke(Te);const ae="wc",ce=2,le="client",Q=`${ae}@${ce}:${le}:`,X={name:le,logger:"error",controller:!1,relayUrl:"wss://relay.walletconnect.org"},$e={session_proposal:"session_proposal",session_update:"session_update",session_extend:"session_extend",session_ping:"session_ping",session_delete:"session_delete",session_expire:"session_expire",session_request:"session_request",session_request_sent:"session_request_sent",session_event:"session_event",proposal_expire:"proposal_expire",session_authenticate:"session_authenticate",session_request_expire:"session_request_expire",session_connect:"session_connect"},Ke={database:":memory:"},pe="WALLETCONNECT_DEEPLINK_CHOICE",Ge={created:"history_created",updated:"history_updated",deleted:"history_deleted",sync:"history_sync"},Fe="history",Ye="0.3",Re="proposal",je=I.THIRTY_DAYS,he="Proposal expired",Ie="session",k=I.SEVEN_DAYS,fe="engine",O={wc_sessionPropose:{req:{ttl:I.FIVE_MINUTES,prompt:!0,tag:1100},res:{ttl:I.FIVE_MINUTES,prompt:!1,tag:1101},reject:{ttl:I.FIVE_MINUTES,prompt:!1,tag:1120},autoReject:{ttl:I.FIVE_MINUTES,prompt:!1,tag:1121}},wc_sessionSettle:{req:{ttl:I.FIVE_MINUTES,prompt:!1,tag:1102},res:{ttl:I.FIVE_MINUTES,prompt:!1,tag:1103}},wc_sessionUpdate:{req:{ttl:I.ONE_DAY,prompt:!1,tag:1104},res:{ttl:I.ONE_DAY,prompt:!1,tag:1105}},wc_sessionExtend:{req:{ttl:I.ONE_DAY,prompt:!1,tag:1106},res:{ttl:I.ONE_DAY,prompt:!1,tag:1107}},wc_sessionRequest:{req:{ttl:I.FIVE_MINUTES,prompt:!0,tag:1108},res:{ttl:I.FIVE_MINUTES,prompt:!1,tag:1109}},wc_sessionEvent:{req:{ttl:I.FIVE_MINUTES,prompt:!0,tag:1110},res:{ttl:I.FIVE_MINUTES,prompt:!1,tag:1111}},wc_sessionDelete:{req:{ttl:I.ONE_DAY,prompt:!1,tag:1112},res:{ttl:I.ONE_DAY,prompt:!1,tag:1113}},wc_sessionPing:{req:{ttl:I.ONE_DAY,prompt:!1,tag:1114},res:{ttl:I.ONE_DAY,prompt:!1,tag:1115}},wc_sessionAuthenticate:{req:{ttl:I.ONE_HOUR,prompt:!0,tag:1116},res:{ttl:I.ONE_HOUR,prompt:!1,tag:1117},reject:{ttl:I.FIVE_MINUTES,prompt:!1,tag:1118},autoReject:{ttl:I.FIVE_MINUTES,prompt:!1,tag:1119}}},z={min:I.FIVE_MINUTES,max:I.SEVEN_DAYS},L={idle:"IDLE",active:"ACTIVE"},Ne={eth_sendTransaction:{key:""},eth_sendRawTransaction:{key:""},wallet_sendCalls:{key:""},solana_signTransaction:{key:"signature"},solana_signAllTransactions:{key:"transactions"},solana_signAndSendTransaction:{key:"signature"},sui_signAndExecuteTransaction:{key:"digest"},sui_signTransaction:{key:""},hedera_signAndExecuteTransaction:{key:"transactionId"},hedera_executeTransaction:{key:"transactionId"},near_signTransaction:{key:""},near_signTransactions:{key:""},tron_signTransaction:{key:"txID"},xrpl_signTransaction:{key:""},xrpl_signTransactionFor:{key:""},algo_signTxn:{key:""},sendTransfer:{key:"txid"},stacks_stxTransfer:{key:"txId"},polkadot_signTransaction:{key:""},cosmos_signDirect:{key:""}},ve="request",Pe=["wc_sessionPropose","wc_sessionRequest","wc_authRequest","wc_sessionAuthenticate"],Oe="wc",He=1.5,qe="auth",Ae="authKeys",Ce="pairingTopics",Ve="requests",G=`${Oe}@${1.5}:${qe}:`,F=`${G}:PUB_KEY`;var Je=Object.defineProperty,Qe=Object.defineProperties,Xe=Object.getOwnPropertyDescriptors,be=Object.getOwnPropertySymbols,ze=Object.prototype.hasOwnProperty,Be=Object.prototype.propertyIsEnumerable,de=(T,a,t)=>a in T?Je(T,a,{enumerable:!0,configurable:!0,writable:!0,value:t}):T[a]=t,N=(T,a)=>{for(var t in a||(a={}))ze.call(a,t)&&de(T,t,a[t]);if(be)for(var t of be(a))Be.call(a,t)&&de(T,t,a[t]);return T},A=(T,a)=>Qe(T,Xe(a)),l=(T,a,t)=>de(T,typeof a!="symbol"?a+"":a,t);class We extends Se.IEngine{constructor(a){super(a),l(this,"name",fe),l(this,"events",new Ue.default),l(this,"initialized",!1),l(this,"requestQueue",{state:L.idle,queue:[]}),l(this,"sessionRequestQueue",{state:L.idle,queue:[]}),l(this,"emittedSessionRequests",new r.LimitedSet({limit:500})),l(this,"requestQueueDelay",I.ONE_SECOND),l(this,"expectedPairingMethodMap",new Map),l(this,"recentlyDeletedMap",new Map),l(this,"recentlyDeletedLimit",200),l(this,"relayMessageCache",[]),l(this,"pendingSessions",new Map),l(this,"init",async()=>{this.initialized||(await this.cleanup(),this.registerRelayerEvents(),this.registerExpirerEvents(),this.registerPairingEvents(),await this.registerLinkModeListeners(),this.client.core.pairing.register({methods:Object.keys(O)}),this.initialized=!0,setTimeout(async()=>{await this.processPendingMessageEvents(),this.sessionRequestQueue.queue=this.getPendingSessionRequests(),this.processSessionRequestQueue()},I.toMiliseconds(this.requestQueueDelay)))}),l(this,"connect",async t=>{this.isInitialized(),await this.confirmOnlineStateOrThrow();const e=A(N({},t),{requiredNamespaces:t.requiredNamespaces||{},optionalNamespaces:t.optionalNamespaces||{}});await this.isValidConnect(e),e.optionalNamespaces=r.mergeRequiredAndOptionalNamespaces(e.requiredNamespaces,e.optionalNamespaces),e.requiredNamespaces={};const{pairingTopic:s,requiredNamespaces:i,optionalNamespaces:n,sessionProperties:o,scopedProperties:c,relays:p}=e;let h=s,u,E=!1;try{if(h){const P=this.client.core.pairing.pairings.get(h);this.client.logger.warn("connect() with existing pairing topic is deprecated and will be removed in the next major release."),E=P.active}}catch(P){throw this.client.logger.error(`connect() -> pairing.get(${h}) failed`),P}if(!h||!E){const{topic:P,uri:M}=await this.client.core.pairing.create({internal:{skipSubscribe:!0}});h=P,u=M}if(!h){const{message:P}=r.getInternalError("NO_MATCHING_KEY",`connect() pairing topic: ${h}`);throw new Error(P)}const g=await this.client.core.crypto.generateKeyPair(),y=O.wc_sessionPropose.req.ttl||I.FIVE_MINUTES,m=r.calcExpiry(y),_=A(N(N({requiredNamespaces:i,optionalNamespaces:n,relays:p??[{protocol:d.RELAYER_DEFAULT_PROTOCOL}],proposer:{publicKey:g,metadata:this.client.metadata},expiryTimestamp:m,pairingTopic:h},o&&{sessionProperties:o}),c&&{scopedProperties:c}),{id:S.payloadId()}),f=r.engineEvent("session_connect",_.id),{reject:w,resolve:C,done:b}=r.createDelayedPromise(y,he),v=({id:P})=>{P===_.id&&(this.client.events.off("proposal_expire",v),this.pendingSessions.delete(_.id),this.events.emit(f,{error:{message:he,code:0}}))};return this.client.events.on("proposal_expire",v),this.events.once(f,({error:P,session:M})=>{this.client.events.off("proposal_expire",v),P?w(P):M&&C(M)}),await this.sendProposeSession({proposal:_,publishOpts:{internal:{throwOnFailedPublish:!0},tvf:{correlationId:_.id}}}),await this.setProposal(_.id,_),{uri:u,approval:b}}),l(this,"pair",async t=>{this.isInitialized(),await this.confirmOnlineStateOrThrow();try{return await this.client.core.pairing.pair(t)}catch(e){throw this.client.logger.error("pair() failed"),e}}),l(this,"approve",async t=>{var e,s,i;const n=this.client.core.eventClient.createEvent({properties:{topic:(e=t?.id)==null?void 0:e.toString(),trace:[d.EVENT_CLIENT_SESSION_TRACES.session_approve_started]}});try{this.isInitialized(),await this.confirmOnlineStateOrThrow()}catch(q){throw n.setError(d.EVENT_CLIENT_SESSION_ERRORS.no_internet_connection),q}try{await this.isValidProposalId(t?.id)}catch(q){throw this.client.logger.error(`approve() -> proposal.get(${t?.id}) failed`),n.setError(d.EVENT_CLIENT_SESSION_ERRORS.proposal_not_found),q}try{await this.isValidApprove(t)}catch(q){throw this.client.logger.error("approve() -> isValidApprove() failed"),n.setError(d.EVENT_CLIENT_SESSION_ERRORS.session_approve_namespace_validation_failure),q}const{id:o,relayProtocol:c,namespaces:p,sessionProperties:h,scopedProperties:u,sessionConfig:E}=t,g=this.client.proposal.get(o);this.client.core.eventClient.deleteEvent({eventId:n.eventId});const{pairingTopic:y,proposer:m,requiredNamespaces:_,optionalNamespaces:f}=g;let w=(s=this.client.core.eventClient)==null?void 0:s.getEvent({topic:y});w||(w=(i=this.client.core.eventClient)==null?void 0:i.createEvent({type:d.EVENT_CLIENT_SESSION_TRACES.session_approve_started,properties:{topic:y,trace:[d.EVENT_CLIENT_SESSION_TRACES.session_approve_started,d.EVENT_CLIENT_SESSION_TRACES.session_namespaces_validation_success]}}));const C=await this.client.core.crypto.generateKeyPair(),b=m.publicKey,v=await this.client.core.crypto.generateSharedKey(C,b),P=N(N(N({relay:{protocol:c??"irn"},namespaces:p,controller:{publicKey:C,metadata:this.client.metadata},expiry:r.calcExpiry(k)},h&&{sessionProperties:h}),u&&{scopedProperties:u}),E&&{sessionConfig:E}),M=d.TRANSPORT_TYPES.relay;w.addTrace(d.EVENT_CLIENT_SESSION_TRACES.subscribing_session_topic);try{await this.client.core.relayer.subscribe(v,{transportType:M,internal:{skipSubscribe:!0}})}catch(q){throw w.setError(d.EVENT_CLIENT_SESSION_ERRORS.subscribe_session_topic_failure),q}w.addTrace(d.EVENT_CLIENT_SESSION_TRACES.subscribe_session_topic_success);const W=A(N({},P),{topic:v,requiredNamespaces:_,optionalNamespaces:f,pairingTopic:y,acknowledged:!1,self:P.controller,peer:{publicKey:m.publicKey,metadata:m.metadata},controller:C,transportType:d.TRANSPORT_TYPES.relay});await this.client.session.set(v,W),w.addTrace(d.EVENT_CLIENT_SESSION_TRACES.store_session);try{await this.sendApproveSession({sessionTopic:v,proposal:g,pairingProposalResponse:{relay:{protocol:c??"irn"},responderPublicKey:C},sessionSettleRequest:P,publishOpts:{internal:{throwOnFailedPublish:!0},tvf:{correlationId:o}}}),w.addTrace(d.EVENT_CLIENT_SESSION_TRACES.session_approve_publish_success)}catch(q){throw this.client.logger.error(q),this.client.session.delete(v,r.getSdkError("USER_DISCONNECTED")),await this.client.core.relayer.unsubscribe(v),q}return this.client.core.eventClient.deleteEvent({eventId:w.eventId}),await this.client.core.pairing.updateMetadata({topic:y,metadata:m.metadata}),await this.deleteProposal(o),await this.client.core.pairing.activate({topic:y}),await this.setExpiry(v,r.calcExpiry(k)),{topic:v,acknowledged:()=>Promise.resolve(this.client.session.get(v))}}),l(this,"reject",async t=>{this.isInitialized(),await this.confirmOnlineStateOrThrow();try{await this.isValidReject(t)}catch(n){throw this.client.logger.error("reject() -> isValidReject() failed"),n}const{id:e,reason:s}=t;let i;try{i=this.client.proposal.get(e).pairingTopic}catch(n){throw this.client.logger.error(`reject() -> proposal.get(${e}) failed`),n}i&&await this.sendError({id:e,topic:i,error:s,rpcOpts:O.wc_sessionPropose.reject}),await this.deleteProposal(e)}),l(this,"update",async t=>{this.isInitialized(),await this.confirmOnlineStateOrThrow();try{await this.isValidUpdate(t)}catch(u){throw this.client.logger.error("update() -> isValidUpdate() failed"),u}const{topic:e,namespaces:s}=t,{done:i,resolve:n,reject:o}=r.createDelayedPromise(),c=S.payloadId(),p=S.getBigIntRpcId().toString(),h=this.client.session.get(e).namespaces;return this.events.once(r.engineEvent("session_update",c),({error:u})=>{u?o(u):n()}),await this.client.session.update(e,{namespaces:s}),await this.sendRequest({topic:e,method:"wc_sessionUpdate",params:{namespaces:s},throwOnFailedPublish:!0,clientRpcId:c,relayRpcId:p}).catch(u=>{this.client.logger.error(u),this.client.session.update(e,{namespaces:h}),o(u)}),{acknowledged:i}}),l(this,"extend",async t=>{this.isInitialized(),await this.confirmOnlineStateOrThrow();try{await this.isValidExtend(t)}catch(c){throw this.client.logger.error("extend() -> isValidExtend() failed"),c}const{topic:e}=t,s=S.payloadId(),{done:i,resolve:n,reject:o}=r.createDelayedPromise();return this.events.once(r.engineEvent("session_extend",s),({error:c})=>{c?o(c):n()}),await this.setExpiry(e,r.calcExpiry(k)),this.sendRequest({topic:e,method:"wc_sessionExtend",params:{},clientRpcId:s,throwOnFailedPublish:!0}).catch(c=>{o(c)}),{acknowledged:i}}),l(this,"request",async t=>{this.isInitialized();try{await this.isValidRequest(t)}catch(_){throw this.client.logger.error("request() -> isValidRequest() failed"),_}const{chainId:e,request:s,topic:i,expiry:n=O.wc_sessionRequest.req.ttl}=t,o=this.client.session.get(i);o?.transportType===d.TRANSPORT_TYPES.relay&&await this.confirmOnlineStateOrThrow();const c=S.payloadId(),p=S.getBigIntRpcId().toString(),{done:h,resolve:u,reject:E}=r.createDelayedPromise(n,"Request expired. Please try again.");this.events.once(r.engineEvent("session_request",c),({error:_,result:f})=>{_?E(_):u(f)});const g="wc_sessionRequest",y=this.getAppLinkIfEnabled(o.peer.metadata,o.transportType);if(y)return await this.sendRequest({clientRpcId:c,relayRpcId:p,topic:i,method:g,params:{request:A(N({},s),{expiryTimestamp:r.calcExpiry(n)}),chainId:e},expiry:n,throwOnFailedPublish:!0,appLink:y}).catch(_=>E(_)),this.client.events.emit("session_request_sent",{topic:i,request:s,chainId:e,id:c}),await h();const m={request:A(N({},s),{expiryTimestamp:r.calcExpiry(n)}),chainId:e};return await Promise.all([new Promise(async _=>{await this.sendRequest({clientRpcId:c,relayRpcId:p,topic:i,method:g,params:m,expiry:n,throwOnFailedPublish:!0,tvf:this.getTVFParams(c,m)}).catch(f=>E(f)),this.client.events.emit("session_request_sent",{topic:i,request:s,chainId:e,id:c}),_()}),new Promise(async _=>{var f;if(!((f=o.sessionConfig)!=null&&f.disableDeepLink)){const w=await r.getDeepLink(this.client.core.storage,pe);await r.handleDeeplinkRedirect({id:c,topic:i,wcDeepLink:w})}_()}),h()]).then(_=>_[2])}),l(this,"respond",async t=>{this.isInitialized(),await this.isValidRespond(t);const{topic:e,response:s}=t,{id:i}=s,n=this.client.session.get(e);n.transportType===d.TRANSPORT_TYPES.relay&&await this.confirmOnlineStateOrThrow();const o=this.getAppLinkIfEnabled(n.peer.metadata,n.transportType);S.isJsonRpcResult(s)?await this.sendResult({id:i,topic:e,result:s.result,throwOnFailedPublish:!0,appLink:o}):S.isJsonRpcError(s)&&await this.sendError({id:i,topic:e,error:s.error,appLink:o}),this.cleanupAfterResponse(t)}),l(this,"ping",async t=>{this.isInitialized(),await this.confirmOnlineStateOrThrow();try{await this.isValidPing(t)}catch(s){throw this.client.logger.error("ping() -> isValidPing() failed"),s}const{topic:e}=t;if(this.client.session.keys.includes(e)){const s=S.payloadId(),i=S.getBigIntRpcId().toString(),{done:n,resolve:o,reject:c}=r.createDelayedPromise();this.events.once(r.engineEvent("session_ping",s),({error:p})=>{p?c(p):o()}),await Promise.all([this.sendRequest({topic:e,method:"wc_sessionPing",params:{},throwOnFailedPublish:!0,clientRpcId:s,relayRpcId:i}),n()])}else this.client.core.pairing.pairings.keys.includes(e)&&(this.client.logger.warn("ping() on pairing topic is deprecated and will be removed in the next major release."),await this.client.core.pairing.ping({topic:e}))}),l(this,"emit",async t=>{this.isInitialized(),await this.confirmOnlineStateOrThrow(),await this.isValidEmit(t);const{topic:e,event:s,chainId:i}=t,n=S.getBigIntRpcId().toString(),o=S.payloadId();await this.sendRequest({topic:e,method:"wc_sessionEvent",params:{event:s,chainId:i},throwOnFailedPublish:!0,relayRpcId:n,clientRpcId:o})}),l(this,"disconnect",async t=>{this.isInitialized(),await this.confirmOnlineStateOrThrow(),await this.isValidDisconnect(t);const{topic:e}=t;if(this.client.session.keys.includes(e))await this.sendRequest({topic:e,method:"wc_sessionDelete",params:r.getSdkError("USER_DISCONNECTED"),throwOnFailedPublish:!0}),await this.deleteSession({topic:e,emitEvent:!1});else if(this.client.core.pairing.pairings.keys.includes(e))await this.client.core.pairing.disconnect({topic:e});else{const{message:s}=r.getInternalError("MISMATCHED_TOPIC",`Session or pairing topic not found: ${e}`);throw new Error(s)}}),l(this,"find",t=>(this.isInitialized(),this.client.session.getAll().filter(e=>r.isSessionCompatible(e,t)))),l(this,"getPendingSessionRequests",()=>this.client.pendingRequest.getAll()),l(this,"authenticate",async(t,e)=>{var s;this.isInitialized(),this.isValidAuthenticate(t);const i=e&&this.client.core.linkModeSupportedApps.includes(e)&&((s=this.client.metadata.redirect)==null?void 0:s.linkMode),n=i?d.TRANSPORT_TYPES.link_mode:d.TRANSPORT_TYPES.relay;n===d.TRANSPORT_TYPES.relay&&await this.confirmOnlineStateOrThrow();const{chains:o,statement:c="",uri:p,domain:h,nonce:u,type:E,exp:g,nbf:y,methods:m=[],expiry:_}=t,f=[...t.resources||[]],{topic:w,uri:C}=await this.client.core.pairing.create({methods:["wc_sessionAuthenticate"],transportType:n});this.client.logger.info({message:"Generated new pairing",pairing:{topic:w,uri:C}});const b=await this.client.core.crypto.generateKeyPair(),v=r.hashKey(b);if(await Promise.all([this.client.auth.authKeys.set(F,{responseTopic:v,publicKey:b}),this.client.auth.pairingTopics.set(v,{topic:v,pairingTopic:w})]),await this.client.core.relayer.subscribe(v,{transportType:n}),this.client.logger.info(`sending request to new pairing topic: ${w}`),m.length>0){const{namespace:V}=r.parseChainId(o[0]);let x=r.createEncodedRecap(V,"request",m);r.getRecapFromResources(f)&&(x=r.mergeEncodedRecaps(x,f.pop())),f.push(x)}const P=_&&_>O.wc_sessionAuthenticate.req.ttl?_:O.wc_sessionAuthenticate.req.ttl,M={authPayload:{type:E??"caip122",chains:o,statement:c,aud:p,domain:h,version:"1",nonce:u,iat:new Date().toISOString(),exp:g,nbf:y,resources:f},requester:{publicKey:b,metadata:this.client.metadata},expiryTimestamp:r.calcExpiry(P)},W={eip155:{chains:o,methods:[...new Set(["personal_sign",...m])],events:["chainChanged","accountsChanged"]}},q={requiredNamespaces:{},optionalNamespaces:W,relays:[{protocol:"irn"}],pairingTopic:w,proposer:{publicKey:b,metadata:this.client.metadata},expiryTimestamp:r.calcExpiry(O.wc_sessionPropose.req.ttl),id:S.payloadId()},{done:Le,resolve:ge,reject:Z}=r.createDelayedPromise(P,"Request expired"),U=S.payloadId(),Y=r.engineEvent("session_connect",q.id),ee=r.engineEvent("session_request",U),j=async({error:V,session:x})=>{this.events.off(ee,te),V?Z(V):x&&ge({session:x})},te=async V=>{var x,Ee,ye;if(await this.deletePendingAuthRequest(U,{message:"fulfilled",code:0}),V.error){const K=r.getSdkError("WC_METHOD_UNSUPPORTED","wc_sessionAuthenticate");return V.error.code===K.code?void 0:(this.events.off(Y,j),Z(V.error.message))}await this.deleteProposal(q.id),this.events.off(Y,j);const{cacaos:me,responder:D}=V.result,ie=[],_e=[];for(const K of me){await r.validateSignedCacao({cacao:K,projectId:this.client.core.projectId})||(this.client.logger.error(K,"Signature verification failed"),Z(r.getSdkError("SESSION_SETTLEMENT_FAILED","Signature verification failed")));const{p:re}=K,ne=r.getRecapFromResources(re.resources),we=[r.getNamespacedDidChainId(re.iss)],Me=r.getDidAddress(re.iss);if(ne){const oe=r.getMethodsFromRecap(ne),De=r.getChainsFromRecap(ne);ie.push(...oe),we.push(...De)}for(const oe of we)_e.push(`${oe}:${Me}`)}const $=await this.client.core.crypto.generateSharedKey(b,D.publicKey);let H;ie.length>0&&(H={topic:$,acknowledged:!0,self:{publicKey:b,metadata:this.client.metadata},peer:D,controller:D.publicKey,expiry:r.calcExpiry(k),requiredNamespaces:{},optionalNamespaces:{},relay:{protocol:"irn"},pairingTopic:w,namespaces:r.buildNamespacesFromAuth([...new Set(ie)],[...new Set(_e)]),transportType:n},await this.client.core.relayer.subscribe($,{transportType:n}),await this.client.session.set($,H),w&&await this.client.core.pairing.updateMetadata({topic:w,metadata:D.metadata}),H=this.client.session.get($)),(x=this.client.metadata.redirect)!=null&&x.linkMode&&(Ee=D.metadata.redirect)!=null&&Ee.linkMode&&(ye=D.metadata.redirect)!=null&&ye.universal&&e&&(this.client.core.addLinkModeSupportedApp(D.metadata.redirect.universal),this.client.session.update($,{transportType:d.TRANSPORT_TYPES.link_mode})),ge({auths:me,session:H})};this.events.once(Y,j),this.events.once(ee,te);let se;try{if(i){const V=S.formatJsonRpcRequest("wc_sessionAuthenticate",M,U);this.client.core.history.set(w,V);const x=await this.client.core.crypto.encode("",V,{type:r.TYPE_2,encoding:r.BASE64URL});se=r.getLinkModeURL(e,w,x)}else await Promise.all([this.sendRequest({topic:w,method:"wc_sessionAuthenticate",params:M,expiry:t.expiry,throwOnFailedPublish:!0,clientRpcId:U}),this.sendRequest({topic:w,method:"wc_sessionPropose",params:q,expiry:O.wc_sessionPropose.req.ttl,throwOnFailedPublish:!0,clientRpcId:q.id})])}catch(V){throw this.events.off(Y,j),this.events.off(ee,te),V}return await this.setProposal(q.id,q),await this.setAuthRequest(U,{request:A(N({},M),{verifyContext:{}}),pairingTopic:w,transportType:n}),{uri:se??C,response:Le}}),l(this,"approveSessionAuthenticate",async t=>{const{id:e,auths:s}=t,i=this.client.core.eventClient.createEvent({properties:{topic:e.toString(),trace:[d.EVENT_CLIENT_AUTHENTICATE_TRACES.authenticated_session_approve_started]}});try{this.isInitialized()}catch(_){throw i.setError(d.EVENT_CLIENT_AUTHENTICATE_ERRORS.no_internet_connection),_}const n=this.getPendingAuthRequest(e);if(!n)throw i.setError(d.EVENT_CLIENT_AUTHENTICATE_ERRORS.authenticated_session_pending_request_not_found),new Error(`Could not find pending auth request with id ${e}`);const o=n.transportType||d.TRANSPORT_TYPES.relay;o===d.TRANSPORT_TYPES.relay&&await this.confirmOnlineStateOrThrow();const c=n.requester.publicKey,p=await this.client.core.crypto.generateKeyPair(),h=r.hashKey(c),u={type:r.TYPE_1,receiverPublicKey:c,senderPublicKey:p},E=[],g=[];for(const _ of s){if(!await r.validateSignedCacao({cacao:_,projectId:this.client.core.projectId})){i.setError(d.EVENT_CLIENT_AUTHENTICATE_ERRORS.invalid_cacao);const v=r.getSdkError("SESSION_SETTLEMENT_FAILED","Signature verification failed");throw await this.sendError({id:e,topic:h,error:v,encodeOpts:u}),new Error(v.message)}i.addTrace(d.EVENT_CLIENT_AUTHENTICATE_TRACES.cacaos_verified);const{p:f}=_,w=r.getRecapFromResources(f.resources),C=[r.getNamespacedDidChainId(f.iss)],b=r.getDidAddress(f.iss);if(w){const v=r.getMethodsFromRecap(w),P=r.getChainsFromRecap(w);E.push(...v),C.push(...P)}for(const v of C)g.push(`${v}:${b}`)}const y=await this.client.core.crypto.generateSharedKey(p,c);i.addTrace(d.EVENT_CLIENT_AUTHENTICATE_TRACES.create_authenticated_session_topic);let m;if(E?.length>0){m={topic:y,acknowledged:!0,self:{publicKey:p,metadata:this.client.metadata},peer:{publicKey:c,metadata:n.requester.metadata},controller:c,expiry:r.calcExpiry(k),authentication:s,requiredNamespaces:{},optionalNamespaces:{},relay:{protocol:"irn"},pairingTopic:n.pairingTopic,namespaces:r.buildNamespacesFromAuth([...new Set(E)],[...new Set(g)]),transportType:o},i.addTrace(d.EVENT_CLIENT_AUTHENTICATE_TRACES.subscribing_authenticated_session_topic);try{await this.client.core.relayer.subscribe(y,{transportType:o})}catch(_){throw i.setError(d.EVENT_CLIENT_AUTHENTICATE_ERRORS.subscribe_authenticated_session_topic_failure),_}i.addTrace(d.EVENT_CLIENT_AUTHENTICATE_TRACES.subscribe_authenticated_session_topic_success),await this.client.session.set(y,m),i.addTrace(d.EVENT_CLIENT_AUTHENTICATE_TRACES.store_authenticated_session),await this.client.core.pairing.updateMetadata({topic:n.pairingTopic,metadata:n.requester.metadata})}i.addTrace(d.EVENT_CLIENT_AUTHENTICATE_TRACES.publishing_authenticated_session_approve);try{await this.sendResult({topic:h,id:e,result:{cacaos:s,responder:{publicKey:p,metadata:this.client.metadata}},encodeOpts:u,throwOnFailedPublish:!0,appLink:this.getAppLinkIfEnabled(n.requester.metadata,o)})}catch(_){throw i.setError(d.EVENT_CLIENT_AUTHENTICATE_ERRORS.authenticated_session_approve_publish_failure),_}return await this.client.auth.requests.delete(e,{message:"fulfilled",code:0}),await this.client.core.pairing.activate({topic:n.pairingTopic}),this.client.core.eventClient.deleteEvent({eventId:i.eventId}),{session:m}}),l(this,"rejectSessionAuthenticate",async t=>{this.isInitialized();const{id:e,reason:s}=t,i=this.getPendingAuthRequest(e);if(!i)throw new Error(`Could not find pending auth request with id ${e}`);i.transportType===d.TRANSPORT_TYPES.relay&&await this.confirmOnlineStateOrThrow();const n=i.requester.publicKey,o=await this.client.core.crypto.generateKeyPair(),c=r.hashKey(n),p={type:r.TYPE_1,receiverPublicKey:n,senderPublicKey:o};await this.sendError({id:e,topic:c,error:s,encodeOpts:p,rpcOpts:O.wc_sessionAuthenticate.reject,appLink:this.getAppLinkIfEnabled(i.requester.metadata,i.transportType)}),await this.client.auth.requests.delete(e,{message:"rejected",code:0}),await this.deleteProposal(e)}),l(this,"formatAuthMessage",t=>{this.isInitialized();const{request:e,iss:s}=t;return r.formatMessage(e,s)}),l(this,"processRelayMessageCache",()=>{setTimeout(async()=>{if(this.relayMessageCache.length!==0)for(;this.relayMessageCache.length>0;)try{const t=this.relayMessageCache.shift();t&&await this.onRelayMessage(t)}catch(t){this.client.logger.error(t)}},50)}),l(this,"cleanupDuplicatePairings",async t=>{if(t.pairingTopic)try{const e=this.client.core.pairing.pairings.get(t.pairingTopic),s=this.client.core.pairing.pairings.getAll().filter(i=>{var n,o;return((n=i.peerMetadata)==null?void 0:n.url)&&((o=i.peerMetadata)==null?void 0:o.url)===t.peer.metadata.url&&i.topic&&i.topic!==e.topic});if(s.length===0)return;this.client.logger.info(`Cleaning up ${s.length} duplicate pairing(s)`),await Promise.all(s.map(i=>this.client.core.pairing.disconnect({topic:i.topic}))),this.client.logger.info("Duplicate pairings clean up finished")}catch(e){this.client.logger.error(e)}}),l(this,"deleteSession",async t=>{var e;const{topic:s,expirerHasDeleted:i=!1,emitEvent:n=!0,id:o=0}=t,{self:c}=this.client.session.get(s);await this.client.core.relayer.unsubscribe(s),await this.client.session.delete(s,r.getSdkError("USER_DISCONNECTED")),this.addToRecentlyDeleted(s,"session"),this.client.core.crypto.keychain.has(c.publicKey)&&await this.client.core.crypto.deleteKeyPair(c.publicKey),this.client.core.crypto.keychain.has(s)&&await this.client.core.crypto.deleteSymKey(s),i||this.client.core.expirer.del(s),this.client.core.storage.removeItem(pe).catch(p=>this.client.logger.warn(p)),this.getPendingSessionRequests().forEach(p=>{p.topic===s&&this.deletePendingSessionRequest(p.id,r.getSdkError("USER_DISCONNECTED"))}),s===((e=this.sessionRequestQueue.queue[0])==null?void 0:e.topic)&&(this.sessionRequestQueue.state=L.idle),n&&this.client.events.emit("session_delete",{id:o,topic:s})}),l(this,"deleteProposal",async(t,e)=>{if(e)try{const s=this.client.proposal.get(t),i=this.client.core.eventClient.getEvent({topic:s.pairingTopic});i?.setError(d.EVENT_CLIENT_SESSION_ERRORS.proposal_expired)}catch{}await Promise.all([this.client.proposal.delete(t,r.getSdkError("USER_DISCONNECTED")),e?Promise.resolve():this.client.core.expirer.del(t)]),this.addToRecentlyDeleted(t,"proposal")}),l(this,"deletePendingSessionRequest",async(t,e,s=!1)=>{await Promise.all([this.client.pendingRequest.delete(t,e),s?Promise.resolve():this.client.core.expirer.del(t)]),this.addToRecentlyDeleted(t,"request"),this.sessionRequestQueue.queue=this.sessionRequestQueue.queue.filter(i=>i.id!==t),s&&(this.sessionRequestQueue.state=L.idle,this.client.events.emit("session_request_expire",{id:t}))}),l(this,"deletePendingAuthRequest",async(t,e,s=!1)=>{await Promise.all([this.client.auth.requests.delete(t,e),s?Promise.resolve():this.client.core.expirer.del(t)])}),l(this,"setExpiry",async(t,e)=>{this.client.session.keys.includes(t)&&(this.client.core.expirer.set(t,e),await this.client.session.update(t,{expiry:e}))}),l(this,"setProposal",async(t,e)=>{this.client.core.expirer.set(t,r.calcExpiry(O.wc_sessionPropose.req.ttl)),await this.client.proposal.set(t,e)}),l(this,"setAuthRequest",async(t,e)=>{const{request:s,pairingTopic:i,transportType:n=d.TRANSPORT_TYPES.relay}=e;this.client.core.expirer.set(t,s.expiryTimestamp),await this.client.auth.requests.set(t,{authPayload:s.authPayload,requester:s.requester,expiryTimestamp:s.expiryTimestamp,id:t,pairingTopic:i,verifyContext:s.verifyContext,transportType:n})}),l(this,"setPendingSessionRequest",async t=>{const{id:e,topic:s,params:i,verifyContext:n}=t,o=i.request.expiryTimestamp||r.calcExpiry(O.wc_sessionRequest.req.ttl);this.client.core.expirer.set(e,o),await this.client.pendingRequest.set(e,{id:e,topic:s,params:i,verifyContext:n})}),l(this,"sendRequest",async t=>{const{topic:e,method:s,params:i,expiry:n,relayRpcId:o,clientRpcId:c,throwOnFailedPublish:p,appLink:h,tvf:u,publishOpts:E={}}=t,g=S.formatJsonRpcRequest(s,i,c);let y;const m=!!h;try{const w=m?r.BASE64URL:r.BASE64;y=await this.client.core.crypto.encode(e,g,{encoding:w})}catch(w){throw await this.cleanup(),this.client.logger.error(`sendRequest() -> core.crypto.encode() for topic ${e} failed`),w}let _;if(Pe.includes(s)){const w=r.hashMessage(JSON.stringify(g)),C=r.hashMessage(y);_=await this.client.core.verify.register({id:C,decryptedId:w})}const f=N(N({},O[s].req),E);if(f.attestation=_,n&&(f.ttl=n),o&&(f.id=o),this.client.core.history.set(e,g),m){const w=r.getLinkModeURL(h,e,y);await global.Linking.openURL(w,this.client.name)}else f.tvf=A(N({},u),{correlationId:g.id}),p?(f.internal=A(N({},f.internal),{throwOnFailedPublish:!0}),await this.client.core.relayer.publish(e,y,f)):this.client.core.relayer.publish(e,y,f).catch(w=>this.client.logger.error(w));return g.id}),l(this,"sendProposeSession",async t=>{const{proposal:e,publishOpts:s}=t,i=S.formatJsonRpcRequest("wc_sessionPropose",e,e.id);this.client.core.history.set(e.pairingTopic,i);const n=await this.client.core.crypto.encode(e.pairingTopic,i,{encoding:r.BASE64}),o=r.hashMessage(JSON.stringify(i)),c=r.hashMessage(n),p=await this.client.core.verify.register({id:c,decryptedId:o});await this.client.core.relayer.publishCustom({payload:{pairingTopic:e.pairingTopic,sessionProposal:n},opts:A(N({},s),{publishMethod:"wc_proposeSession",attestation:p})})}),l(this,"sendApproveSession",async t=>{const{sessionTopic:e,pairingProposalResponse:s,proposal:i,sessionSettleRequest:n,publishOpts:o}=t,c=S.formatJsonRpcResult(i.id,s),p=await this.client.core.crypto.encode(i.pairingTopic,c,{encoding:r.BASE64}),h=S.formatJsonRpcRequest("wc_sessionSettle",n,o?.id),u=await this.client.core.crypto.encode(e,h,{encoding:r.BASE64});this.client.core.history.set(e,h),await this.client.core.relayer.publishCustom({payload:{sessionTopic:e,pairingTopic:i.pairingTopic,sessionProposalResponse:p,sessionSettlementRequest:u},opts:A(N({},o),{publishMethod:"wc_approveSession"})})}),l(this,"sendResult",async t=>{const{id:e,topic:s,result:i,throwOnFailedPublish:n,encodeOpts:o,appLink:c}=t,p=S.formatJsonRpcResult(e,i);let h;const u=c&&typeof(global==null?void 0:global.Linking)<"u";try{const y=u?r.BASE64URL:r.BASE64;h=await this.client.core.crypto.encode(s,p,A(N({},o||{}),{encoding:y}))}catch(y){throw await this.cleanup(),this.client.logger.error(`sendResult() -> core.crypto.encode() for topic ${s} failed`),y}let E,g;try{E=await this.client.core.history.get(s,e);const y=E.request;try{g=this.getTVFParams(e,y.params,i)}catch(m){this.client.logger.warn(`sendResult() -> getTVFParams() failed: ${m?.message}`)}}catch(y){throw this.client.logger.error(`sendResult() -> history.get(${s}, ${e}) failed`),y}if(u){const y=r.getLinkModeURL(c,s,h);await global.Linking.openURL(y,this.client.name)}else{const y=E.request.method,m=O[y].res;m.tvf=A(N({},g),{correlationId:e}),n?(m.internal=A(N({},m.internal),{throwOnFailedPublish:!0}),await this.client.core.relayer.publish(s,h,m)):this.client.core.relayer.publish(s,h,m).catch(_=>this.client.logger.error(_))}await this.client.core.history.resolve(p)}),l(this,"sendError",async t=>{const{id:e,topic:s,error:i,encodeOpts:n,rpcOpts:o,appLink:c}=t,p=S.formatJsonRpcError(e,i);let h;const u=c&&typeof(global==null?void 0:global.Linking)<"u";try{const g=u?r.BASE64URL:r.BASE64;h=await this.client.core.crypto.encode(s,p,A(N({},n||{}),{encoding:g}))}catch(g){throw await this.cleanup(),this.client.logger.error(`sendError() -> core.crypto.encode() for topic ${s} failed`),g}let E;try{E=await this.client.core.history.get(s,e)}catch(g){throw this.client.logger.error(`sendError() -> history.get(${s}, ${e}) failed`),g}if(u){const g=r.getLinkModeURL(c,s,h);await global.Linking.openURL(g,this.client.name)}else{const g=E.request.method,y=o||O[g].res;this.client.core.relayer.publish(s,h,y)}await this.client.core.history.resolve(p)}),l(this,"cleanup",async()=>{const t=[],e=[];this.client.session.getAll().forEach(s=>{let i=!1;r.isExpired(s.expiry)&&(i=!0),this.client.core.crypto.keychain.has(s.topic)||(i=!0),i&&t.push(s.topic)}),this.client.proposal.getAll().forEach(s=>{r.isExpired(s.expiryTimestamp)&&e.push(s.id)}),await Promise.all([...t.map(s=>this.deleteSession({topic:s})),...e.map(s=>this.deleteProposal(s))])}),l(this,"onProviderMessageEvent",async t=>{!this.initialized||this.relayMessageCache.length>0?this.relayMessageCache.push(t):await this.onRelayMessage(t)}),l(this,"onRelayEventRequest",async t=>{this.requestQueue.queue.push(t),await this.processRequestsQueue()}),l(this,"processRequestsQueue",async()=>{if(this.requestQueue.state===L.active){this.client.logger.info("Request queue already active, skipping...");return}for(this.client.logger.info(`Request queue starting with ${this.requestQueue.queue.length} requests`);this.requestQueue.queue.length>0;){this.requestQueue.state=L.active;const t=this.requestQueue.queue.shift();if(t)try{await this.processRequest(t)}catch(e){this.client.logger.warn(e)}}this.requestQueue.state=L.idle}),l(this,"processRequest",async t=>{const{topic:e,payload:s,attestation:i,transportType:n,encryptedId:o}=t,c=s.method;if(!this.shouldIgnorePairingRequest({topic:e,requestMethod:c}))switch(c){case"wc_sessionPropose":return await this.onSessionProposeRequest({topic:e,payload:s,attestation:i,encryptedId:o});case"wc_sessionSettle":return await this.onSessionSettleRequest(e,s);case"wc_sessionUpdate":return await this.onSessionUpdateRequest(e,s);case"wc_sessionExtend":return await this.onSessionExtendRequest(e,s);case"wc_sessionPing":return await this.onSessionPingRequest(e,s);case"wc_sessionDelete":return await this.onSessionDeleteRequest(e,s);case"wc_sessionRequest":return await this.onSessionRequest({topic:e,payload:s,attestation:i,encryptedId:o,transportType:n});case"wc_sessionEvent":return await this.onSessionEventRequest(e,s);case"wc_sessionAuthenticate":return await this.onSessionAuthenticateRequest({topic:e,payload:s,attestation:i,encryptedId:o,transportType:n});default:return this.client.logger.info(`Unsupported request method ${c}`)}}),l(this,"onRelayEventResponse",async t=>{const{topic:e,payload:s,transportType:i}=t,n=(await this.client.core.history.get(e,s.id)).request.method;switch(n){case"wc_sessionPropose":return this.onSessionProposeResponse(e,s,i);case"wc_sessionSettle":return this.onSessionSettleResponse(e,s);case"wc_sessionUpdate":return this.onSessionUpdateResponse(e,s);case"wc_sessionExtend":return this.onSessionExtendResponse(e,s);case"wc_sessionPing":return this.onSessionPingResponse(e,s);case"wc_sessionRequest":return this.onSessionRequestResponse(e,s);case"wc_sessionAuthenticate":return this.onSessionAuthenticateResponse(e,s);default:return this.client.logger.info(`Unsupported response method ${n}`)}}),l(this,"onRelayEventUnknownPayload",t=>{const{topic:e}=t,{message:s}=r.getInternalError("MISSING_OR_INVALID",`Decoded payload on topic ${e} is not identifiable as a JSON-RPC request or a response.`);throw new Error(s)}),l(this,"shouldIgnorePairingRequest",t=>{const{topic:e,requestMethod:s}=t,i=this.expectedPairingMethodMap.get(e);return!i||i.includes(s)?!1:!!(i.includes("wc_sessionAuthenticate")&&this.client.events.listenerCount("session_authenticate")>0)}),l(this,"onSessionProposeRequest",async t=>{const{topic:e,payload:s,attestation:i,encryptedId:n}=t,{params:o,id:c}=s;try{const p=this.client.core.eventClient.getEvent({topic:e});this.client.events.listenerCount("session_proposal")===0&&(console.warn("No listener for session_proposal event"),p?.setError(d.EVENT_CLIENT_PAIRING_ERRORS.proposal_listener_not_found)),this.isValidConnect(N({},s.params));const h=o.expiryTimestamp||r.calcExpiry(O.wc_sessionPropose.req.ttl),u=N({id:c,pairingTopic:e,expiryTimestamp:h,attestation:i,encryptedId:n},o);await this.setProposal(c,u);const E=await this.getVerifyContext({attestationId:i,hash:r.hashMessage(JSON.stringify(s)),encryptedId:n,metadata:u.proposer.metadata});p?.addTrace(d.EVENT_CLIENT_PAIRING_TRACES.emit_session_proposal),this.client.events.emit("session_proposal",{id:c,params:u,verifyContext:E})}catch(p){await this.sendError({id:c,topic:e,error:p,rpcOpts:O.wc_sessionPropose.autoReject}),this.client.logger.error(p)}}),l(this,"onSessionProposeResponse",async(t,e,s)=>{const{id:i}=e;if(S.isJsonRpcResult(e)){const{result:n}=e;this.client.logger.trace({type:"method",method:"onSessionProposeResponse",result:n});const o=this.client.proposal.get(i);this.client.logger.trace({type:"method",method:"onSessionProposeResponse",proposal:o});const c=o.proposer.publicKey;this.client.logger.trace({type:"method",method:"onSessionProposeResponse",selfPublicKey:c});const p=n.responderPublicKey;this.client.logger.trace({type:"method",method:"onSessionProposeResponse",peerPublicKey:p});const h=await this.client.core.crypto.generateSharedKey(c,p);this.pendingSessions.set(i,{sessionTopic:h,pairingTopic:t,proposalId:i,publicKey:c});const u=await this.client.core.relayer.subscribe(h,{transportType:s});this.client.logger.trace({type:"method",method:"onSessionProposeResponse",subscriptionId:u}),await this.client.core.pairing.activate({topic:t})}else if(S.isJsonRpcError(e)){await this.deleteProposal(i);const n=r.engineEvent("session_connect",i);if(this.events.listenerCount(n)===0)throw new Error(`emitting ${n} without any listeners, 954`);this.events.emit(n,{error:e.error})}}),l(this,"onSessionSettleRequest",async(t,e)=>{const{id:s,params:i}=e;try{this.isValidSessionSettleRequest(i);const{relay:n,controller:o,expiry:c,namespaces:p,sessionProperties:h,scopedProperties:u,sessionConfig:E}=e.params,g=[...this.pendingSessions.values()].find(_=>_.sessionTopic===t);if(!g)return this.client.logger.error(`Pending session not found for topic ${t}`);const y=this.client.proposal.get(g.proposalId),m=A(N(N(N({topic:t,relay:n,expiry:c,namespaces:p,acknowledged:!0,pairingTopic:g.pairingTopic,requiredNamespaces:y.requiredNamespaces,optionalNamespaces:y.optionalNamespaces,controller:o.publicKey,self:{publicKey:g.publicKey,metadata:this.client.metadata},peer:{publicKey:o.publicKey,metadata:o.metadata}},h&&{sessionProperties:h}),u&&{scopedProperties:u}),E&&{sessionConfig:E}),{transportType:d.TRANSPORT_TYPES.relay});await this.client.session.set(m.topic,m),await this.setExpiry(m.topic,m.expiry),await this.client.core.pairing.updateMetadata({topic:g.pairingTopic,metadata:m.peer.metadata}),this.client.events.emit("session_connect",{session:m}),this.events.emit(r.engineEvent("session_connect",g.proposalId),{session:m}),this.pendingSessions.delete(g.proposalId),this.deleteProposal(g.proposalId,!1),this.cleanupDuplicatePairings(m),await this.sendResult({id:e.id,topic:t,result:!0})}catch(n){await this.sendError({id:s,topic:t,error:n}),this.client.logger.error(n)}}),l(this,"onSessionSettleResponse",async(t,e)=>{const{id:s}=e;S.isJsonRpcResult(e)?(await this.client.session.update(t,{acknowledged:!0}),this.events.emit(r.engineEvent("session_approve",s),{})):S.isJsonRpcError(e)&&(await this.client.session.delete(t,r.getSdkError("USER_DISCONNECTED")),this.events.emit(r.engineEvent("session_approve",s),{error:e.error}))}),l(this,"onSessionUpdateRequest",async(t,e)=>{const{params:s,id:i}=e;try{const n=`${t}_session_update`,o=r.MemoryStore.get(n);if(o&&this.isRequestOutOfSync(o,i)){this.client.logger.warn(`Discarding out of sync request - ${i}`),this.sendError({id:i,topic:t,error:r.getSdkError("INVALID_UPDATE_REQUEST")});return}this.isValidUpdate(N({topic:t},s));try{r.MemoryStore.set(n,i),await this.client.session.update(t,{namespaces:s.namespaces}),await this.sendResult({id:i,topic:t,result:!0})}catch(c){throw r.MemoryStore.delete(n),c}this.client.events.emit("session_update",{id:i,topic:t,params:s})}catch(n){await this.sendError({id:i,topic:t,error:n}),this.client.logger.error(n)}}),l(this,"isRequestOutOfSync",(t,e)=>e.toString().slice(0,-3)<t.toString().slice(0,-3)),l(this,"onSessionUpdateResponse",(t,e)=>{const{id:s}=e,i=r.engineEvent("session_update",s);if(this.events.listenerCount(i)===0)throw new Error(`emitting ${i} without any listeners`);S.isJsonRpcResult(e)?this.events.emit(r.engineEvent("session_update",s),{}):S.isJsonRpcError(e)&&this.events.emit(r.engineEvent("session_update",s),{error:e.error})}),l(this,"onSessionExtendRequest",async(t,e)=>{const{id:s}=e;try{this.isValidExtend({topic:t}),await this.setExpiry(t,r.calcExpiry(k)),await this.sendResult({id:s,topic:t,result:!0}),this.client.events.emit("session_extend",{id:s,topic:t})}catch(i){await this.sendError({id:s,topic:t,error:i}),this.client.logger.error(i)}}),l(this,"onSessionExtendResponse",(t,e)=>{const{id:s}=e,i=r.engineEvent("session_extend",s);if(this.events.listenerCount(i)===0)throw new Error(`emitting ${i} without any listeners`);S.isJsonRpcResult(e)?this.events.emit(r.engineEvent("session_extend",s),{}):S.isJsonRpcError(e)&&this.events.emit(r.engineEvent("session_extend",s),{error:e.error})}),l(this,"onSessionPingRequest",async(t,e)=>{const{id:s}=e;try{this.isValidPing({topic:t}),await this.sendResult({id:s,topic:t,result:!0,throwOnFailedPublish:!0}),this.client.events.emit("session_ping",{id:s,topic:t})}catch(i){await this.sendError({id:s,topic:t,error:i}),this.client.logger.error(i)}}),l(this,"onSessionPingResponse",(t,e)=>{const{id:s}=e,i=r.engineEvent("session_ping",s);setTimeout(()=>{if(this.events.listenerCount(i)===0)throw new Error(`emitting ${i} without any listeners 2176`);S.isJsonRpcResult(e)?this.events.emit(r.engineEvent("session_ping",s),{}):S.isJsonRpcError(e)&&this.events.emit(r.engineEvent("session_ping",s),{error:e.error})},500)}),l(this,"onSessionDeleteRequest",async(t,e)=>{const{id:s}=e;try{this.isValidDisconnect({topic:t,reason:e.params}),await Promise.all([new Promise(i=>{this.client.core.relayer.once(d.RELAYER_EVENTS.publish,async()=>{i(await this.deleteSession({topic:t,id:s}))})}),this.sendResult({id:s,topic:t,result:!0}),this.cleanupPendingSentRequestsForTopic({topic:t,error:r.getSdkError("USER_DISCONNECTED")})]).catch(i=>this.client.logger.error(i))}catch(i){this.client.logger.error(i)}}),l(this,"onSessionRequest",async t=>{var e,s,i;const{topic:n,payload:o,attestation:c,encryptedId:p,transportType:h}=t,{id:u,params:E}=o;try{await this.isValidRequest(N({topic:n},E));const g=this.client.session.get(n),y=await this.getVerifyContext({attestationId:c,hash:r.hashMessage(JSON.stringify(S.formatJsonRpcRequest("wc_sessionRequest",E,u))),encryptedId:p,metadata:g.peer.metadata,transportType:h}),m={id:u,topic:n,params:E,verifyContext:y};await this.setPendingSessionRequest(m),h===d.TRANSPORT_TYPES.link_mode&&(e=g.peer.metadata.redirect)!=null&&e.universal&&this.client.core.addLinkModeSupportedApp((s=g.peer.metadata.redirect)==null?void 0:s.universal),(i=this.client.signConfig)!=null&&i.disableRequestQueue?this.emitSessionRequest(m):(this.addSessionRequestToSessionRequestQueue(m),this.processSessionRequestQueue())}catch(g){await this.sendError({id:u,topic:n,error:g}),this.client.logger.error(g)}}),l(this,"onSessionRequestResponse",(t,e)=>{const{id:s}=e,i=r.engineEvent("session_request",s);if(this.events.listenerCount(i)===0)throw new Error(`emitting ${i} without any listeners`);S.isJsonRpcResult(e)?this.events.emit(r.engineEvent("session_request",s),{result:e.result}):S.isJsonRpcError(e)&&this.events.emit(r.engineEvent("session_request",s),{error:e.error})}),l(this,"onSessionEventRequest",async(t,e)=>{const{id:s,params:i}=e;try{const n=`${t}_session_event_${i.event.name}`,o=r.MemoryStore.get(n);if(o&&this.isRequestOutOfSync(o,s)){this.client.logger.info(`Discarding out of sync request - ${s}`);return}this.isValidEmit(N({topic:t},i)),this.client.events.emit("session_event",{id:s,topic:t,params:i}),r.MemoryStore.set(n,s)}catch(n){await this.sendError({id:s,topic:t,error:n}),this.client.logger.error(n)}}),l(this,"onSessionAuthenticateResponse",(t,e)=>{const{id:s}=e;this.client.logger.trace({type:"method",method:"onSessionAuthenticateResponse",topic:t,payload:e}),S.isJsonRpcResult(e)?this.events.emit(r.engineEvent("session_request",s),{result:e.result}):S.isJsonRpcError(e)&&this.events.emit(r.engineEvent("session_request",s),{error:e.error})}),l(this,"onSessionAuthenticateRequest",async t=>{var e;const{topic:s,payload:i,attestation:n,encryptedId:o,transportType:c}=t;try{const{requester:p,authPayload:h,expiryTimestamp:u}=i.params,E=await this.getVerifyContext({attestationId:n,hash:r.hashMessage(JSON.stringify(i)),encryptedId:o,metadata:p.metadata,transportType:c}),g={requester:p,pairingTopic:s,id:i.id,authPayload:h,verifyContext:E,expiryTimestamp:u};await this.setAuthRequest(i.id,{request:g,pairingTopic:s,transportType:c}),c===d.TRANSPORT_TYPES.link_mode&&(e=p.metadata.redirect)!=null&&e.universal&&this.client.core.addLinkModeSupportedApp(p.metadata.redirect.universal),this.client.events.emit("session_authenticate",{topic:s,params:i.params,id:i.id,verifyContext:E})}catch(p){this.client.logger.error(p);const h=i.params.requester.publicKey,u=await this.client.core.crypto.generateKeyPair(),E=this.getAppLinkIfEnabled(i.params.requester.metadata,c),g={type:r.TYPE_1,receiverPublicKey:h,senderPublicKey:u};await this.sendError({id:i.id,topic:s,error:p,encodeOpts:g,rpcOpts:O.wc_sessionAuthenticate.autoReject,appLink:E})}}),l(this,"addSessionRequestToSessionRequestQueue",t=>{this.sessionRequestQueue.queue.push(t)}),l(this,"cleanupAfterResponse",t=>{this.deletePendingSessionRequest(t.response.id,{message:"fulfilled",code:0}),setTimeout(()=>{this.sessionRequestQueue.state=L.idle,this.processSessionRequestQueue()},I.toMiliseconds(this.requestQueueDelay))}),l(this,"cleanupPendingSentRequestsForTopic",({topic:t,error:e})=>{const s=this.client.core.history.pending;s.length>0&&s.filter(i=>i.topic===t&&i.request.method==="wc_sessionRequest").forEach(i=>{const n=i.request.id,o=r.engineEvent("session_request",n);if(this.events.listenerCount(o)===0)throw new Error(`emitting ${o} without any listeners`);this.events.emit(r.engineEvent("session_request",i.request.id),{error:e})})}),l(this,"processSessionRequestQueue",()=>{if(this.sessionRequestQueue.state===L.active){this.client.logger.info("session request queue is already active.");return}const t=this.sessionRequestQueue.queue[0];if(!t){this.client.logger.info("session request queue is empty.");return}try{this.emitSessionRequest(t)}catch(e){this.client.logger.error(e)}}),l(this,"emitSessionRequest",t=>{if(this.emittedSessionRequests.has(t.id)){this.client.logger.warn({id:t.id},`Skipping emitting \`session_request\` event for duplicate request. id: ${t.id}`);return}this.sessionRequestQueue.state=L.active,this.emittedSessionRequests.add(t.id),this.client.events.emit("session_request",t)}),l(this,"onPairingCreated",t=>{if(t.methods&&this.expectedPairingMethodMap.set(t.topic,t.methods),t.active)return;const e=this.client.proposal.getAll().find(s=>s.pairingTopic===t.topic);e&&this.onSessionProposeRequest({topic:t.topic,payload:S.formatJsonRpcRequest("wc_sessionPropose",A(N({},e),{requiredNamespaces:e.requiredNamespaces,optionalNamespaces:e.optionalNamespaces,relays:e.relays,proposer:e.proposer,sessionProperties:e.sessionProperties,scopedProperties:e.scopedProperties}),e.id),attestation:e.attestation,encryptedId:e.encryptedId})}),l(this,"isValidConnect",async t=>{if(!r.isValidParams(t)){const{message:p}=r.getInternalError("MISSING_OR_INVALID",`connect() params: ${JSON.stringify(t)}`);throw new Error(p)}const{pairingTopic:e,requiredNamespaces:s,optionalNamespaces:i,sessionProperties:n,scopedProperties:o,relays:c}=t;if(r.isUndefined(e)||await this.isValidPairingTopic(e),!r.isValidRelays(c,!0)){const{message:p}=r.getInternalError("MISSING_OR_INVALID",`connect() relays: ${c}`);throw new Error(p)}if(!r.isUndefined(s)&&r.isValidObject(s)!==0){const p="requiredNamespaces are deprecated and are automatically assigned to optionalNamespaces";["fatal","error","silent"].includes(this.client.logger.level)?console.warn(p):this.client.logger.warn(p),this.validateNamespaces(s,"requiredNamespaces")}if(!r.isUndefined(i)&&r.isValidObject(i)!==0&&this.validateNamespaces(i,"optionalNamespaces"),r.isUndefined(n)||this.validateSessionProps(n,"sessionProperties"),!r.isUndefined(o)){this.validateSessionProps(o,"scopedProperties");const p=Object.keys(s||{}).concat(Object.keys(i||{}));if(!Object.keys(o).every(h=>p.includes(h.split(":")[0])))throw new Error(`Scoped properties must be a subset of required/optional namespaces, received: ${JSON.stringify(o)}, required/optional namespaces: ${JSON.stringify(p)}`)}}),l(this,"validateNamespaces",(t,e)=>{const s=r.isValidRequiredNamespaces(t,"connect()",e);if(s)throw new Error(s.message)}),l(this,"isValidApprove",async t=>{if(!r.isValidParams(t))throw new Error(r.getInternalError("MISSING_OR_INVALID",`approve() params: ${t}`).message);const{id:e,namespaces:s,relayProtocol:i,sessionProperties:n,scopedProperties:o}=t;this.checkRecentlyDeleted(e),await this.isValidProposalId(e);const c=this.client.proposal.get(e),p=r.isValidNamespaces(s,"approve()");if(p)throw new Error(p.message);const h=r.isConformingNamespaces(c.requiredNamespaces,s,"approve()");if(h)throw new Error(h.message);if(!r.isValidString(i,!0)){const{message:u}=r.getInternalError("MISSING_OR_INVALID",`approve() relayProtocol: ${i}`);throw new Error(u)}if(r.isUndefined(n)||this.validateSessionProps(n,"sessionProperties"),!r.isUndefined(o)){this.validateSessionProps(o,"scopedProperties");const u=new Set(Object.keys(s));if(!Object.keys(o).every(E=>u.has(E.split(":")[0])))throw new Error(`Scoped properties must be a subset of approved namespaces, received: ${JSON.stringify(o)}, approved namespaces: ${Array.from(u).join(", ")}`)}}),l(this,"isValidReject",async t=>{if(!r.isValidParams(t)){const{message:i}=r.getInternalError("MISSING_OR_INVALID",`reject() params: ${t}`);throw new Error