UNPKG

@walletconnect/sign-client

Version:

Sign Client for WalletConnect Protocol

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