@zkid/zktls-js-sdk 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +520 -374
- package/dist/index.js.map +1 -1
- package/dist/types/messages.d.ts +15 -13
- package/dist/utils/index.d.ts +5 -5
- package/dist/utils/messages.d.ts +3 -2
- package/package.json +8 -11
- package/dist/api/index.js +0 -13
- package/dist/api/index.js.map +0 -1
- package/dist/classes/AttRequest.js +0 -64
- package/dist/classes/AttRequest.js.map +0 -1
- package/dist/config/constants.js +0 -21
- package/dist/config/constants.js.map +0 -1
- package/dist/constants/index.d.ts +0 -27
- package/dist/constants/index.js +0 -31
- package/dist/constants/index.js.map +0 -1
- package/dist/error.js +0 -70
- package/dist/error.js.map +0 -1
- package/dist/types/messages.js +0 -3
- package/dist/types/messages.js.map +0 -1
- package/dist/utils/httpRequest.js +0 -99
- package/dist/utils/httpRequest.js.map +0 -1
- package/dist/utils/index.js +0 -125
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/messages.js +0 -40
- package/dist/utils/messages.js.map +0 -1
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const A=require("ethers"),S=require("@solana/web3.js"),N=require("uuid"),_=1e3,k=60*_,I=1*_,U=2*k,L=5*k,b={development:"0xe02bd7a6c8aa401189aebb5bad755c2610940a73",production:"0xDB736B13E2f522dBE18B2015d0291E4b193D8eF6"},J="production",F={development:"https://api-dev.padolabs.org",production:"https://api.padolabs.org"},K=F[J],j={"00000":"Operation too frequent. Please try again later.","00001":"Algorithm startup exception.","00002":"The verification process timed out.","00003":"A verification process is in progress. Please try again later.","00004":"The user closes or cancels the verification process.","00005":"Wrong SDK parameters.","00012":"Invalid Template ID.","00013":"Target data missing. Please check whether the data json path in the request URL’s response aligns with your template.","00014":"The verification process timed out.","00104":"Not met the verification requirements.","01000":"Attestation timeout.",10001:"Unstable internet connection. Please try again.",10002:"Unstable internet connection. Please try again.",10003:"Unstable internet connection. Please try again.",10004:"Unstable internet connection. Please try again.",20001:"An internal error occurred.",20003:"Invalid algorithm parameters.",20005:"Can't complete the attestation due to some workflow error. Please try again later.",30001:"Response error. Please try again.",30002:"Response check error.",30004:"Response parse error.",40002:"SSLCertificateError",50001:"An internal error occurred.",50003:"The client encountered an unexpected error.",50004:"The client not started. Please try again.",50006:"The algorithm server not started. Please try again.",50007:"Algorithm execution issues.",50008:"Abnormal execution results.",50009:"Algorithm service timed out.",50010:"Compatibility issues during algorithm execution.",50011:"Unsupported TLS version.",99999:"Undefined error.","-1200010":"Invalid message.","-1002001":"Invalid App ID.","-1002002":"Invalid App Secret.","-1002003":"Trial quota exhausted.","-1002004":"Subscription expired.","-1002005":"Quota exhausted."};class h{code;message;data;constructor(e,t,r){this.message=t||j[e],this.code=e,this.data=r}}function G(s){const e={};return Object.keys(s).forEach(t=>{typeof s[t]!="function"&&(e[t]=s[t])}),e}function $(s){const e=A.ethers.utils.solidityPack(["bytes32","bytes32","bytes32","string","string","uint64","string"],[z(s.recipient),q(s.request),x(s.reponseResolve),s.data,s.attConditions,s.timestamp,s.additionParams]);return A.ethers.utils.keccak256(e)}function B(s){if(C(s.recipient))return $(s);{const e=A.ethers.utils.solidityPack(["address","bytes32","bytes32","string","string","uint64","string"],[s.recipient,q(s.request),x(s.reponseResolve),s.data,s.attConditions,s.timestamp,s.additionParams]);return A.ethers.utils.keccak256(e)}}function q(s){const e=A.ethers.utils.solidityPack(["string","string","string","string"],[s.url,s.header,s.method,s.body]);return A.ethers.utils.keccak256(e)}function x(s){let e="0x";for(let t=0;t<s.length;t++)e=A.ethers.utils.solidityPack(["bytes","string","string","string"],[e,s[t].keyName,s[t].parseType,s[t].parsePath]);return A.ethers.utils.keccak256(e)}async function V(s,e){try{const t=await fetch(s,e);if(!t.ok)throw new Error(`HTTP error! Status: ${t.status}`);return await t.json()}catch(t){throw console.error("Request failed:",t),t}}function C(s){try{const e=new S.PublicKey(s);return S.PublicKey.isOnCurve(e)}catch{return!1}}function z(s){const t=new S.PublicKey(s).toBytes();return`0x${H(t)}`}function H(s){return Array.from(s,e=>e.toString(16).padStart(2,"0")).join("")}class D{appId;attTemplateID;userAddress;timestamp;attMode;attConditions;additionParams;requestid;backUrl;computeMode;noProxy;allJsonResponseFlag;constructor(e){const{appId:t,attTemplateID:r,userAddress:i}=e;this.appId=t,this.attTemplateID=r,this.userAddress=i,this.timestamp=+new Date,this.attMode={algorithmType:"proxytls",resultType:"plain"},this.requestid=N.v4(),this.backUrl="",this.computeMode="normal",this.noProxy=!0,this.allJsonResponseFlag="false"}setAdditionParams(e){this.additionParams=e}setAttMode({algorithmType:e,resultType:t="plain"}){this.attMode={algorithmType:e,resultType:t}}setAttConditions(e){this.attConditions=e}setBackUrl(e){this.backUrl=e}setComputeMode(e){this.computeMode=e}setNoProxy(e){this.noProxy=e}setAllJsonResponseFlag(e){this.allJsonResponseFlag=e==="true"?"true":"false"}toJsonString(){return JSON.stringify(G(this))}}async function Q(s){const{url:e,method:t="GET",headers:r={},params:i,data:a,timeout:c=5e4,responseType:p="json"}=s,T=["POST","PUT","PATCH"].includes(t.toUpperCase());let d=e;if(!T&&i&&Object.keys(i).length>0){const o=new URL(e);Object.entries(i).forEach(([n,f])=>{f!=null&&o.searchParams.append(n,String(f))}),d=o.toString()}let u;if(T){const o=a!==void 0?a:i;if(o!=null){!r["Content-Type"]&&!r["content-type"]&&(r["Content-Type"]="application/json");const n=r["Content-Type"]||r["content-type"]||"";n.includes("application/json")?u=JSON.stringify(o):n.includes("application/x-www-form-urlencoded")?u=new URLSearchParams(o).toString():u=String(o)}}const m=new AbortController,l=c>0?setTimeout(()=>m.abort(),c):null;try{const o=await fetch(d,{method:t,headers:r,body:u,signal:m.signal});l&&clearTimeout(l);let n;try{switch(p){case"json":n=await o.json();break;case"text":n=await o.text();break;case"blob":n=await o.blob();break;case"arrayBuffer":n=await o.arrayBuffer();break;default:n=await o.json()}}catch{n=await o.text()}if(!o.ok){const f=new Error(`HTTP ${o.status}: ${o.statusText}`);throw f.status=o.status,f.statusText=o.statusText,f.data=n,f}return n}catch(o){if(l&&clearTimeout(l),o.name==="AbortError"){const n=new Error(`Request timeout after ${c}ms`);throw n.code="TIMEOUT",n}if(o instanceof TypeError&&o.message.includes("fetch")){const n=new Error(`Network error: ${o.message}`);throw n.code="NETWORK_ERROR",n}throw o}}function Z(s){return Q({url:`${K}/public/app/quote`,method:"GET",params:s})}const g={INIT:"init",START:"start",CHECK_DATA_SOURCE:"checkDataSource",CHECK_DATA_SOURCE_RES:"checkDataSourceRes",CLOSE_DATA_SOURCE:"closeDataSource",VISITED_PAGE_PATHS:"visitedPagePaths",FAVICON_URL_CHANGED:"faviconUrlChanged",INIT_ATT:"initAttestation",START_ATT:"startAttestation",GET_ATT_RESULT:"getAttestationResult",GET_ATT_RESULT_TIMEOUT:"getAttestationResultTimeout",INIT_ATT_RES:"initAttestationRes",GET_ATT_RES:"getAttestationRes",START_ATT_RES:"startAttestationRes",OFFSCREEN_RECEIVE_GET_ATT:"offscreenReceiveGetAttestation",OFFSCREEN_GET_ATT:"getAttestation",OFFSCREEN_GET_ATT_RESULT:"getAttestationResult",START_OFFLINE:"startOffline"},E={EXTENSION:"hashKeyExtension",ZKTLS_SDK:"zktlsSdk"};function R(s,e){window.postMessage({target:E.EXTENSION,origin:E.ZKTLS_SDK,method:s,data:e})}function v(s){const e=t=>{const r=t.data;if(!r||typeof r!="object")return;const i=r.target;if(i!==E.ZKTLS_SDK&&i!=="padoZKAttestationJSSDK")return;const a=r.method??r.name,c=r.data??r.params;a&&s({target:E.ZKTLS_SDK,method:a,data:c})};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)}const P="1.0.4";class W{_padoAddress;isInstalled;isInitialized;extensionVersion;appId;appSecret;options;extendedData;latestRunningMobileRequest;allJsonResponseFlag;_allJsonResponse;constructor(){this.isInitialized=!1,this.isInstalled=!1,this.extensionVersion="",this.appId="",this.options={platform:"pc",env:"production",openAndroidApp:!1},this._padoAddress=b.production,this.extendedData={},this.allJsonResponseFlag="false",this._allJsonResponse={}}init(e,t,r){this.appId=e,this.appSecret=t,r?.platform&&(this.options.platform=r.platform),r?.env&&(this.options.env=r?.env),r?.openAndroidApp&&(this.options.openAndroidApp=r?.openAndroidApp),this.options?.env!=="production"&&(this._padoAddress=b.development);const i=typeof process<"u"&&process.versions&&process.versions.node;if(r?.platform==="android"||r?.platform==="ios")return this.isInitialized=!0,Promise.resolve(!0);if(t&&i)return this.isInitialized=!0,Promise.resolve(!0);if(this.isInstalled=!!window.zkid,this.isInstalled)R(g.INIT_ATT,{sdkVersion:P});else{const a="00006";return Promise.reject(new h(a))}return console.time("initAttestationCost"),new Promise((a,c)=>{const p=v(T=>{if(T.method===g.INIT_ATT_RES){console.log("sdk receive initAttestationRes",T);const{result:d,errorData:u,data:m}=T.data;if(d)this.isInitialized=d,m?.extensionVersion&&(this.extensionVersion=m.extensionVersion),console.timeEnd("initAttestationCost"),p(),a(this.extensionVersion);else if(p(),u){const{code:l}=u;c(new h(l))}}})})}generateRequestParams(e,t){const r=t||"0x0000000000000000000000000000000000000000";return new D({appId:this.appId,attTemplateID:e,userAddress:r})}async sign(e){if(this.appSecret){const t=new A.ethers.Wallet(this.appSecret),r=A.ethers.utils.keccak256(new TextEncoder().encode(e)),i=await t.signMessage(r),a={attRequest:JSON.parse(e),appSignature:i};return JSON.stringify(a)}else throw new Error("Only call in App server environment.")}async startAttestation(e){if(!this.isInitialized){const t="00001";return Promise.reject(new h(t))}try{const t=JSON.parse(e);if(this._verifyAttestationParams(t),await this._checkAppQuote(),this.options?.platform==="android"||this.options?.platform==="ios")return this.startAttestationMobile(e);let r={...t,sdkVersion:P};return this.allJsonResponseFlag=t?.attRequest?.allJsonResponseFlag==="true"?"true":"false",R(g.START_ATT,r),console.time("startAttestCost"),new Promise((i,a)=>{let c,p;const T=v(d=>{if(d.method===g.GET_ATT_RES){console.log("sdk receive getAttestationRes",d.data);const{result:u,errorData:m}=d.data;if(u)p=setTimeout(()=>{c&&(clearInterval(c),R(g.GET_ATT_RESULT_TIMEOUT,{}),T(),a(new h("00002","The SDK reported a timeout.","")))},U),c=setInterval(()=>{R(g.GET_ATT_RESULT,{})},I);else{T();const{code:l,data:o}=m;a(new h(l,"",o))}}if(d.method===g.START_ATT_RES){const{result:u,data:m,errorData:l}=d.data;if(console.log("sdk-receive getAttestationResultRes",d.data),u){clearInterval(c),clearTimeout(p),console.timeEnd("startAttestCost"),T();const{extendedData:o,allJsonResponse:n,...f}=m;let y=t.attRequest.requestid?t.attRequest.requestid:"";this.extendedData[y]=o;const O=(f?.reponseResolve).map(w=>w?.keyName);this.allJsonResponseFlag==="true"&&(this._allJsonResponse[y]=n.map((w,M)=>({id:O[M],content:w})),f.requestid=y),i(f)}else{clearInterval(c),clearTimeout(p),console.timeEnd("startAttestCost"),T();const{code:o,data:n}=l;a(new h(o,"",n))}}})})}catch(t){return Promise.reject(t)}}async startAttestationMobile(e){this.latestRunningMobileRequest?e=this.latestRunningMobileRequest:this.latestRunningMobileRequest=e;const t=this.GetAttestationMobileUrl(e),r=window.open(t,"_self");console.log("startAttestationMobile newWin=",r);const i=JSON.parse(e),a=i.attRequest.requestid,c=i.attRequest.userAddress;let p=`https://api.padolabs.org/attestation/result?requestId=${a}&recipient=${c}`;return this.options?.env!=="production"&&(p=`https://api-dev.padolabs.org/attestation/result?requestId=${a}&recipient=${c}`),new Promise((T,d)=>{const u=setInterval(async()=>{try{const l=await V(p);if(console.log("query response=",l),console.log("query response.result.status=",l.result.status),l.rc===0&&l.result.status==="SUCCESS")clearInterval(u),clearTimeout(m),this.latestRunningMobileRequest=void 0,T(l.result.result);else if(l.rc===0&&l.result.status==="FAILED"){const o=l.result.result.errorCode,n=l.result.result.errorMessage;console.log(`reject error code=${o}, errorMsg=${n}`),clearInterval(u),clearTimeout(m),this.latestRunningMobileRequest=void 0,d(new h(o,"",n))}}catch{console.log("query moblie attestaion result error.")}},I),m=setTimeout(()=>{console.log("reject timeout"),clearInterval(u),this.latestRunningMobileRequest=void 0,d(new h("01000","",""))},L)})}GetAttestationMobileUrl(e){const t=encodeURIComponent(e);if(this.options?.platform==="android"){let r;return this.options.openAndroidApp?r=`primuslabs://primuslabs.xyz/attestation-processor?signedRequest=${t}`:r=`https://primuslabs.xyz/attestation-processor?signedRequest=${t}`,r}else if(this.options?.platform==="ios")return`https://appclip.apple.com/id?p=PrimusLabs.Primus.AppClip&signedRequest=${t}`;return""}verifyAttestation(e){const t=B(e),r=e.signatures[0],i=A.ethers.utils.recoverAddress(t,r);return console.log("sdk verifyAttestation recover address is ",i),this._padoAddress.toLowerCase()===i.toLowerCase()}getExtendedData(e){return this.extendedData[e]}async _checkAppQuote(){try{const{rc:e,result:t}=await Z({appId:this.appId});if(e!==0&&console.warn("App quote check failed:",t?.msg),!t)throw new h("-1002001");if(!t.expiryTime&&(!t.remainingQuota||t.remainingQuota<=0))throw new h("-1002003");if(t.expiryTime){if(t.expiryTime<Date.now())throw new h("-1002004");if(!t.remainingQuota||t.remainingQuota<=0)throw new h("-1002005")}}catch(e){if(e instanceof h)throw e;console.error("Failed to check app quote (network error or other exception):",e)}}_verifyAttestationParams(e){const{attRequest:{appId:t,attTemplateID:r,userAddress:i,timestamp:a},appSignature:c}=e,p=(d,u,m)=>{if(u){if(typeof u!==m)throw new h("00005",`Wrong ${d}!`)}else throw new h("00005",`Missing ${d}!`)};if(p("appId",t,"string"),p("attTemplateID",r,"string"),p("timestamp",a,"number"),p("appSignature",c,"string"),!(A.ethers.utils.isAddress(i)||C(i)))throw new h("00005","Wrong userAddress!");return!0}getAllJsonResponse(e){return this._allJsonResponse[e]}}exports.AttRequest=D;exports.PrimusZKTLS=W;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/config/constants.ts","../src/error.ts","../src/utils/index.ts","../src/classes/AttRequest.ts","../src/utils/httpRequest.ts","../src/api/index.ts","../node_modules/@zkid/bridge-spec/dist/constants/index.js","../src/utils/messages.ts","../src/index.ts"],"sourcesContent":["export const PADOEXTENSIONID = \"oeiomhmbaapihbilkfkhmlajkeegnjhe\";\n\nexport const ONESECOND = 1000;\nexport const ONEMINUTE = 60 * ONESECOND;\nexport const ATTESTATIONPOLLINGTIME = 1 * ONESECOND;\nexport const ATTESTATIONPOLLINGTIMEOUT = 2 * ONEMINUTE;\nexport const ATTESTATIONPOLLINGTIMEOUTMOBILE = 5 * ONEMINUTE;\n\nexport const PADOADDRESSMAP = {\n development: '0xe02bd7a6c8aa401189aebb5bad755c2610940a73',\n production: '0xDB736B13E2f522dBE18B2015d0291E4b193D8eF6',\n};\n\nexport const ENV = 'production';\nexport const BASEAPIMAP = {\n development: 'https://api-dev.padolabs.org',\n production: 'https://api.padolabs.org',\n // production: 'https://api.padolabs.org',\n};\nexport const BASEAPI = BASEAPIMAP[ENV]\n","export type AttestationErrorCode =\n | '00001'\n | '00002'\n | '00003'\n | '00004'\n | '00005'\n | '00006'\n | '00009'\n | '00010'\n | '00101'\n | '00102'\n | '00103'\n | '00104'\n | '01000'\n | '10001'\n | '10002'\n | '10003'\n | '10004'\n | '20001'\n | '20002'\n | '20003'\n | '20004'\n | '20005'\n | '30001'\n | '30002'\n | '30003'\n | '30004'\n | '40001'\n | '40002'\n | '50002'\n | '50003'\n | '50004'\n | '50005'\n | '50006'\n | '50007'\n | '50008'\n | '50009'\n | '50010'\n | '50011'\n | '99999'\n | '-1200010'\n | '-1002001'\n | '-1002002'\n | '-1002003'\n | '-1002004'\n | '-1002005';\n\nexport type OnChainErrorCode = '00007' | '00008';\n\nexport type ErrorCode = AttestationErrorCode | OnChainErrorCode;\n\nexport const ErrorCodeMAP = {\n '00000': 'Operation too frequent. Please try again later.',\n '00001': 'Algorithm startup exception.',\n '00002': 'The verification process timed out.',\n '00003': 'A verification process is in progress. Please try again later.',\n '00004': 'The user closes or cancels the verification process.',\n '00005': 'Wrong SDK parameters.',\n // '00006':'No ZKID extension version 0.3.15 or above was detected as installed.',\n // '00007':'Insufficient wallet balance.',\n // '00008':'Failed to submit the proof on-chain. Or other errors in the Wallet operations.',\n // '00009':'Your dApp is not registered. Please contact the ZKID team.',\n // '00010':'Verification failed. Please try again later.',\n // '00011':'Launch failed: unstable connection.',\n '00012': 'Invalid Template ID.',\n '00013':\n 'Target data missing. Please check whether the data json path in the request URL’s response aligns with your template.',\n '00014': 'The verification process timed out.',\n // \"00101\":'Insufficient assets in your Trading Account. Please confirm and try again later.',\n\n // '00102':'Attestation requirements not met. Insufficient assets balance in Binance Spot Account.',\n // \"00103\": 'This account may have already been bound to a wallet address, or your wallet address may already have a zkAttestation with another Binance account.',\n '00104': 'Not met the verification requirements.',\n\n '01000': 'Attestation timeout.',\n\n '10001': 'Unstable internet connection. Please try again.',\n '10002': 'Unstable internet connection. Please try again.',\n '10003': 'Unstable internet connection. Please try again.',\n '10004': 'Unstable internet connection. Please try again.',\n '20001': 'An internal error occurred.',\n // '20002':\"Something went wrong. Please try again later.\",\n '20003': 'Invalid algorithm parameters.',\n // '20004': \"Something went wrong. Please try again later.\",\n '20005': \"Can't complete the attestation due to some workflow error. Please try again later.\",\n '30001': 'Response error. Please try again.',\n '30002': 'Response check error.',\n // '30003': \"Can't complete the attestation flow due to response error. Please try again later.\",\n '30004': 'Response parse error.',\n // '40001':\"Something went wrong. Please try again later.\",\n '40002': 'SSLCertificateError',\n '50001': 'An internal error occurred.',\n // '50002': \"Something went wrong. Please try again later.\",\n '50003': 'The client encountered an unexpected error.',\n '50004': 'The client not started. Please try again.',\n // '50005':\"Something went wrong. Please try again later.\",\n '50006': 'The algorithm server not started. Please try again.',\n '50007': 'Algorithm execution issues.',\n '50008': 'Abnormal execution results.',\n '50009': 'Algorithm service timed out.',\n '50010': 'Compatibility issues during algorithm execution.',\n '50011': 'Unsupported TLS version.',\n '99999': 'Undefined error.',\n '-1200010': 'Invalid message.',\n '-1002001': 'Invalid App ID.',\n '-1002002': 'Invalid App Secret.',\n '-1002003': 'Trial quota exhausted.',\n '-1002004': 'Subscription expired.',\n '-1002005': 'Quota exhausted.'\n};\nexport class ZkAttestationError {\n code: ErrorCode;\n message: string;\n data?: any;\n constructor(code: ErrorCode, message?: string, data?: any) {\n this.message = message || ErrorCodeMAP[code as keyof typeof ErrorCodeMAP];\n this.code = code;\n this.data = data;\n }\n}\n","import { Attestation, AttNetworkRequest, AttNetworkResponseResolve } from '../types/index.d';\nimport { ethers } from 'ethers';\nimport { PublicKey } from '@solana/web3.js';\n\nexport function isValidNumericString(value: string) {\n const regex = /^[0-9]*$/;\n return typeof value === 'string' && regex.test(value);\n}\nexport function isValidLetterString(value: string) {\n const regex = /^[A-Za-z]+$/;\n return typeof value === 'string' && regex.test(value);\n}\n\nexport function isValidNumberString(value: string) {\n const regex = /^(0\\.(0*[1-9]\\d{0,5})|[1-9]\\d*(\\.\\d{1,6})?)$/;\n return typeof value === 'string' && regex.test(value);\n}\n\nexport function isValidTimestampString(value: string) {\n // Check if the value is of string type\n if (typeof value !== 'string') {\n return false;\n }\n\n // Attempt to parse the string into a number\n const timestamp = Number(value);\n\n // Check if the parsed number is finite (not NaN or Infinity)\n if (!Number.isFinite(timestamp)) {\n return false;\n }\n\n // Check if the number is within a reasonable timestamp range (optional but recommended)\n // JavaScript timestamps are typically milliseconds since 1970-01-01T00:00:00.000Z\n // Minimum value is -62135596800000 (milliseconds since 1601-01-01T00:00:00.000Z, but many environments do not support such early times)\n // Maximum value is Number.MAX_SAFE_INTEGER (2^53 - 1, approximately 9007199254740991 milliseconds, corresponding to the year 275760)\n // Note: JavaScript Date objects can handle timestamps beyond this range, but may lose precision\n const MIN_TIMESTAMP = -62135596800000; // Can be adjusted as needed\n const MAX_TIMESTAMP = Number.MAX_SAFE_INTEGER;\n\n return timestamp >= MIN_TIMESTAMP && timestamp <= MAX_TIMESTAMP;\n}\n\nexport function getInstanceProperties(instance: any) {\n const properties: any = {};\n Object.keys(instance).forEach((key) => {\n // Only copy the attributes, not the methods\n if (typeof instance[key] !== 'function') {\n properties[key] = instance[key];\n }\n });\n return properties;\n}\n\nexport function encodeSolanaAttestation(att: Attestation) {\n const encodedData = ethers.utils.solidityPack(\n ['bytes32', 'bytes32', 'bytes32', 'string', 'string', 'uint64', 'string'],\n [\n solanaAddressToBytes32(att.recipient),\n encodeRequest(att.request),\n encodeResponse(att.reponseResolve),\n att.data,\n att.attConditions,\n att.timestamp,\n att.additionParams\n ]\n );\n return ethers.utils.keccak256(encodedData);\n}\n\nexport function encodeAttestation(att: Attestation) {\n if (isSolanaAddress(att.recipient)) {\n return encodeSolanaAttestation(att);\n } else {\n const encodedData = ethers.utils.solidityPack(\n ['address', 'bytes32', 'bytes32', 'string', 'string', 'uint64', 'string'],\n [\n att.recipient,\n encodeRequest(att.request),\n encodeResponse(att.reponseResolve),\n att.data,\n att.attConditions,\n att.timestamp,\n att.additionParams\n ]\n );\n return ethers.utils.keccak256(encodedData);\n }\n}\nexport function encodeRequest(request: AttNetworkRequest) {\n const encodedData = ethers.utils.solidityPack(\n ['string', 'string', 'string', 'string'],\n [request.url, request.header, request.method, request.body]\n );\n return ethers.utils.keccak256(encodedData);\n}\nexport function encodeResponse(reponse: AttNetworkResponseResolve[]) {\n let encodeData = '0x';\n for (let i = 0; i < reponse.length; i++) {\n encodeData = ethers.utils.solidityPack(\n ['bytes', 'string', 'string', 'string'],\n [encodeData, reponse[i].keyName, reponse[i].parseType, reponse[i].parsePath]\n );\n }\n return ethers.utils.keccak256(encodeData);\n}\n\nexport async function sendRequest(url: string, options?: RequestInit): Promise<any> {\n try {\n const response = await fetch(url, options);\n if (!response.ok) {\n throw new Error(`HTTP error! Status: ${response.status}`);\n }\n return await response.json();\n } catch (error) {\n console.error('Request failed:', error);\n throw error;\n }\n}\n\nexport function isSolanaAddress(address: string) {\n try {\n const pk = new PublicKey(address);\n return PublicKey.isOnCurve(pk);\n } catch (e) {\n return false;\n }\n}\n\nfunction solanaAddressToBytes32(address: string) {\n const pubkey = new PublicKey(address);\n const bytes = pubkey.toBytes();\n return `0x${bytesToHex(bytes)}`;\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (value) => value.toString(16).padStart(2, '0')).join('');\n}\n","import type { AttMode, BaseAttestationParams, AttConditions, ComputeMode } from '../types/index.d';\nimport { getInstanceProperties } from '../utils';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport class AttRequest {\n appId: string;\n attTemplateID: string;\n userAddress: string;\n timestamp: number;\n attMode?: AttMode;\n attConditions?: AttConditions;\n additionParams?: string;\n requestid?: string;\n backUrl?: string;\n computeMode?: ComputeMode;\n noProxy?: boolean;\n allJsonResponseFlag?: 'true' | 'false';\n\n constructor(baseAttestationParams: BaseAttestationParams) {\n const { appId, attTemplateID, userAddress } = baseAttestationParams;\n this.appId = appId;\n this.attTemplateID = attTemplateID;\n this.userAddress = userAddress;\n this.timestamp = +new Date();\n this.attMode = {\n algorithmType: 'proxytls',\n resultType: 'plain'\n }; // TODO\n this.requestid = uuidv4();\n this.backUrl = '';\n this.computeMode = 'normal';\n this.noProxy = true;\n this.allJsonResponseFlag = 'false';\n }\n setAdditionParams(additionParams: string) {\n this.additionParams = additionParams;\n }\n setAttMode({ algorithmType, resultType = 'plain' }: AttMode) {\n this.attMode = {\n algorithmType,\n resultType\n };\n }\n setAttConditions(attConditions: AttConditions) {\n this.attConditions = attConditions;\n }\n setBackUrl(url: string) {\n this.backUrl = url;\n }\n setComputeMode(computeMode: ComputeMode) {\n this.computeMode = computeMode;\n }\n setNoProxy(noProxy: boolean) {\n this.noProxy = noProxy;\n }\n setAllJsonResponseFlag(allJsonResponseFlag: string) {\n this.allJsonResponseFlag = allJsonResponseFlag === 'true' ? 'true' : 'false';\n }\n toJsonString() {\n return JSON.stringify(getInstanceProperties(this));\n }\n}\n","/**\n * HTTP Request Utility - A wrapper based on fetch API\n */\n\nexport interface RequestConfig {\n url: string;\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';\n headers?: Record<string, string>;\n params?: Record<string, any>;\n data?: any;\n timeout?: number;\n responseType?: 'json' | 'text' | 'blob' | 'arrayBuffer';\n}\n\nexport async function request<T = any>(config: RequestConfig): Promise<T> {\n const {\n url,\n method = 'GET',\n headers = {},\n params,\n data,\n timeout = 50000,\n responseType = 'json'\n } = config;\n\n const hasBody = ['POST', 'PUT', 'PATCH'].includes(method.toUpperCase());\n \n let fullUrl = url;\n if (!hasBody && params && Object.keys(params).length > 0) {\n const urlObj = new URL(url);\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n urlObj.searchParams.append(key, String(value));\n }\n });\n fullUrl = urlObj.toString();\n }\n\n let body: string | undefined;\n if (hasBody) {\n const bodyData = data !== undefined ? data : params;\n if (bodyData !== undefined && bodyData !== null) {\n if (!headers['Content-Type'] && !headers['content-type']) {\n headers['Content-Type'] = 'application/json';\n }\n \n const contentType = headers['Content-Type'] || headers['content-type'] || '';\n if (contentType.includes('application/json')) {\n body = JSON.stringify(bodyData);\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n body = new URLSearchParams(bodyData as Record<string, string>).toString();\n } else {\n body = String(bodyData);\n }\n }\n }\n\n const controller = new AbortController();\n const timeoutId = timeout > 0 ? setTimeout(() => controller.abort(), timeout) : null;\n\n try {\n const response = await fetch(fullUrl, {\n method,\n headers,\n body,\n signal: controller.signal\n });\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n let responseData: any;\n try {\n switch (responseType) {\n case 'json':\n responseData = await response.json();\n break;\n case 'text':\n responseData = await response.text();\n break;\n case 'blob':\n responseData = await response.blob();\n break;\n case 'arrayBuffer':\n responseData = await response.arrayBuffer();\n break;\n default:\n responseData = await response.json();\n }\n } catch (parseError) {\n responseData = await response.text();\n }\n\n if (!response.ok) {\n const error = new Error(`HTTP ${response.status}: ${response.statusText}`) as any;\n error.status = response.status;\n error.statusText = response.statusText;\n error.data = responseData;\n throw error;\n }\n\n return responseData;\n } catch (error: any) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n if (error.name === 'AbortError') {\n const timeoutError = new Error(`Request timeout after ${timeout}ms`) as any;\n timeoutError.code = 'TIMEOUT';\n throw timeoutError;\n }\n\n if (error instanceof TypeError && error.message.includes('fetch')) {\n const networkError = new Error(`Network error: ${error.message}`) as any;\n networkError.code = 'NETWORK_ERROR';\n throw networkError;\n }\n\n throw error;\n }\n}\n","import { request } from '../utils/httpRequest';\nimport { BASEAPI } from '../config/constants';\n\nexport function getAppQuote(params: {appId: string}): Promise<{ rc: number; mc: string; msg: string; result: any }> {\n return request<{ rc: number; mc: string; msg: string; result: any }>({\n url: `${BASEAPI}/public/app/quote`,\n method: 'GET',\n params\n });\n}\n\n\n\n","const t = {\n INIT: \"init\",\n START: \"start\",\n CHECK_DATA_SOURCE: \"checkDataSource\",\n CHECK_DATA_SOURCE_RES: \"checkDataSourceRes\",\n CLOSE_DATA_SOURCE: \"closeDataSource\",\n VISITED_PAGE_PATHS: \"visitedPagePaths\",\n FAVICON_URL_CHANGED: \"faviconUrlChanged\",\n // attestation - outbound (SDK -> Extension)\n INIT_ATT: \"initAttestation\",\n START_ATT: \"startAttestation\",\n GET_ATT_RESULT: \"getAttestationResult\",\n GET_ATT_RESULT_TIMEOUT: \"getAttestationResultTimeout\",\n // attestation - inbound (Extension -> SDK)\n INIT_ATT_RES: \"initAttestationRes\",\n GET_ATT_RES: \"getAttestationRes\",\n START_ATT_RES: \"startAttestationRes\",\n // offscreen\n OFFSCREEN_RECEIVE_GET_ATT: \"offscreenReceiveGetAttestation\",\n OFFSCREEN_GET_ATT: \"getAttestation\",\n OFFSCREEN_GET_ATT_RESULT: \"getAttestationResult\",\n START_OFFLINE: \"startOffline\"\n}, T = {\n EXTENSION: \"hashKeyExtension\",\n DEVHUB: \"devhub\",\n // devhub\n SDK: \"sdk\",\n // network sdk or zktls sdk\n ZKTLS_SDK: \"zktlsSdk\",\n // for centralize zktls sdk\n NETWORK_SDK: \"networkSdk\",\n // for decentralize zktls sdk\n EXT_BACKGROUND: \"background\",\n EXT_CONTENT: \"content\",\n EXT_POPUP: \"popup\",\n EXT_SIDEPANEL: \"sidepanel\",\n EXT_OFFSCREEN: \"offscreen\",\n EXT_OFFSCREEN_ALGORITHM: \"offscreenAlgorithm\",\n EXT_OFFSCREEN_REPORT: \"offscreenReport\"\n}, E = {\n PROXY: \"proxytls\",\n MPC: \"mpctls\"\n}, e = {\n NETWORK: \"network\",\n ZKTLS: \"zktls\"\n};\nexport {\n E as ALGORITHM_TYPES,\n t as BRIDGE_METHODS,\n e as BRIDGE_SDK_TYPES,\n T as BRIDGE_TARGET\n};\n","import { BRIDGE_TARGET, BridgeMethod } from '@zkid/bridge-spec/constants';\nimport type { SDKInboundMessage } from '../types/messages';\n\n/**\n * Type-safe wrapper for sending messages to the Extension via postMessage.\n *\n * The discriminated union on `method` ensures `data` matches at compile time.\n */\nexport function sendToExtension(method: BridgeMethod, data: any): void {\n window.postMessage({\n target: BRIDGE_TARGET.EXTENSION,\n origin: BRIDGE_TARGET.ZKTLS_SDK,\n method,\n data\n });\n}\n\n/**\n * Listen for inbound messages from the Extension with type-safe callback.\n *\n * Handles both legacy format (`name`/`params`) and new format (`method`/`data`)\n * transparently — the callback always receives the normalised `SDKInboundMessage` shape.\n *\n * @returns A cleanup function that removes the event listener.\n */\nexport function onExtensionMessage(callback: (msg: SDKInboundMessage) => void): () => void {\n const handler = (event: MessageEvent) => {\n const raw = event.data;\n if (!raw || typeof raw !== 'object') return;\n\n const target = raw.target;\n if (target !== BRIDGE_TARGET.ZKTLS_SDK && target !== 'padoZKAttestationJSSDK') {\n return;\n }\n\n const method = raw.method ?? raw.name;\n const data = raw.data ?? raw.params;\n if (!method) return;\n\n callback({ target: BRIDGE_TARGET.ZKTLS_SDK, method, data } as SDKInboundMessage);\n };\n\n window.addEventListener('message', handler);\n return () => window.removeEventListener('message', handler);\n}\n","import { ethers } from 'ethers';\nimport {\n ATTESTATIONPOLLINGTIME,\n ATTESTATIONPOLLINGTIMEOUT,\n PADOADDRESSMAP,\n ATTESTATIONPOLLINGTIMEOUTMOBILE\n} from './config/constants';\nimport { Attestation, SignedAttRequest, InitOptions } from './types/index.d';\nimport { ZkAttestationError } from './error';\nimport { AttRequest } from './classes/AttRequest';\nimport { encodeAttestation, sendRequest, isSolanaAddress } from './utils';\nimport { getAppQuote } from './api';\nimport { sendToExtension, onExtensionMessage } from './utils/messages';\nimport { BRIDGE_METHODS } from '@zkid/bridge-spec/constants';\nimport { StartAttResPayload } from 'types/messages';\ndeclare const __SDK_VERSION__: string;\nconst sdkVersion = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : '0.0.0';\nclass PrimusZKTLS {\n private _padoAddress: string;\n // private _attestLoading: boolean;\n\n isInstalled?: boolean;\n isInitialized: boolean;\n extensionVersion: string;\n\n appId: string;\n appSecret?: string;\n options: InitOptions;\n extendedData: Record<string, any>;\n latestRunningMobileRequest?: string;\n allJsonResponseFlag?: 'true' | 'false';\n _allJsonResponse: any;\n\n constructor() {\n this.isInitialized = false;\n this.isInstalled = false;\n\n this.extensionVersion = '';\n\n this.appId = '';\n this.options = { platform: 'pc', env: 'production', openAndroidApp: false };\n this._padoAddress = (PADOADDRESSMAP as any)['production'];\n this.extendedData = {};\n this.allJsonResponseFlag = 'false';\n this._allJsonResponse = {};\n }\n\n init(appId: string, appSecret?: string, options?: InitOptions): Promise<string | boolean> {\n this.appId = appId;\n this.appSecret = appSecret;\n if (options?.platform) {\n this.options.platform = options.platform;\n }\n if (options?.env) {\n this.options.env = options?.env;\n }\n if (options?.openAndroidApp) {\n this.options.openAndroidApp = options?.openAndroidApp;\n }\n if (this.options?.env !== 'production') {\n this._padoAddress = (PADOADDRESSMAP as any)['development'];\n }\n const isNodeEnv = typeof process !== 'undefined' && process.versions && process.versions.node;\n if (options?.platform === 'android' || options?.platform === 'ios') {\n this.isInitialized = true;\n return Promise.resolve(true);\n } else if (appSecret && isNodeEnv) {\n this.isInitialized = true;\n return Promise.resolve(true);\n } else {\n this.isInstalled = !!window.zkid;\n if (this.isInstalled) {\n sendToExtension(BRIDGE_METHODS.INIT_ATT, {\n sdkVersion\n });\n } else {\n const errorCode = '00006';\n return Promise.reject(new ZkAttestationError(errorCode));\n }\n\n console.time('initAttestationCost');\n return new Promise((resolve, reject) => {\n const cleanup = onExtensionMessage((msg) => {\n if (msg.method === BRIDGE_METHODS.INIT_ATT_RES) {\n console.log('sdk receive initAttestationRes', msg);\n const { result, errorData, data } = msg.data;\n if (result) {\n this.isInitialized = result;\n\n if (data?.extensionVersion) {\n this.extensionVersion = data.extensionVersion;\n }\n console.timeEnd('initAttestationCost');\n cleanup();\n resolve(this.extensionVersion);\n } else {\n cleanup();\n if (errorData) {\n const { code } = errorData;\n reject(new ZkAttestationError(code));\n }\n }\n }\n });\n });\n }\n }\n\n generateRequestParams(attTemplateID: string, userAddress?: string): AttRequest {\n const userAddr = userAddress || '0x0000000000000000000000000000000000000000';\n\n return new AttRequest({\n appId: this.appId,\n attTemplateID,\n userAddress: userAddr\n });\n }\n\n async sign(signParams: string): Promise<string> {\n if (this.appSecret) {\n const wallet = new ethers.Wallet(this.appSecret);\n const messageHash = ethers.utils.keccak256(new TextEncoder().encode(signParams));\n const sig = await wallet.signMessage(messageHash);\n const result: SignedAttRequest = {\n attRequest: JSON.parse(signParams),\n appSignature: sig\n };\n return JSON.stringify(result);\n } else {\n throw new Error('Only call in App server environment.');\n }\n }\n\n async startAttestation(attestationParamsStr: string): Promise<Attestation> {\n if (!this.isInitialized) {\n const errorCode = '00001';\n return Promise.reject(new ZkAttestationError(errorCode));\n }\n // if (this._attestLoading) {\n // const errorCode = '00003'\n // return Promise.reject(new ZkAttestationError(errorCode))\n // }\n // this._attestLoading = true\n\n try {\n const attestationParams = JSON.parse(attestationParamsStr) as SignedAttRequest;\n this._verifyAttestationParams(attestationParams);\n\n // Check app quote before starting attestation\n await this._checkAppQuote();\n\n if (this.options?.platform === 'android' || this.options?.platform === 'ios') {\n return this.startAttestationMobile(attestationParamsStr);\n }\n\n let formatParams: any = { ...attestationParams, sdkVersion };\n this.allJsonResponseFlag = attestationParams?.attRequest?.allJsonResponseFlag === 'true' ? 'true' : 'false';\n sendToExtension(BRIDGE_METHODS.START_ATT, formatParams);\n console.time('startAttestCost');\n return new Promise((resolve, reject) => {\n let pollingTimer: any;\n let timeoutTimer: any;\n const cleanup = onExtensionMessage((msg) => {\n if (msg.method === BRIDGE_METHODS.GET_ATT_RES) {\n console.log('sdk receive getAttestationRes', msg.data);\n const { result, errorData } = msg.data;\n if (result) {\n timeoutTimer = setTimeout(() => {\n if (pollingTimer) {\n clearInterval(pollingTimer);\n sendToExtension(BRIDGE_METHODS.GET_ATT_RESULT_TIMEOUT, {});\n cleanup();\n reject(new ZkAttestationError('00002', 'The SDK reported a timeout.', ''));\n }\n }, ATTESTATIONPOLLINGTIMEOUT);\n pollingTimer = setInterval(() => {\n sendToExtension(BRIDGE_METHODS.GET_ATT_RESULT, {});\n }, ATTESTATIONPOLLINGTIME);\n } else {\n cleanup();\n const { code, data } = errorData;\n reject(new ZkAttestationError(code, '', data));\n }\n }\n if (msg.method === BRIDGE_METHODS.START_ATT_RES) {\n const { result, data, errorData } = msg.data as StartAttResPayload;\n console.log('sdk-receive getAttestationResultRes', msg.data);\n if (result) {\n clearInterval(pollingTimer);\n clearTimeout(timeoutTimer);\n console.timeEnd('startAttestCost');\n cleanup();\n const { extendedData, allJsonResponse, ...formatParams2 } = data as any;\n let requestid = attestationParams.attRequest.requestid ? attestationParams.attRequest.requestid : '';\n this.extendedData[requestid] = extendedData;\n\n // feat: allJsonResponse\n let responseResolvesObj = formatParams2?.reponseResolve;\n\n const responseIds = responseResolvesObj.map((i: any) => i?.keyName);\n\n if (this.allJsonResponseFlag === 'true') {\n this._allJsonResponse[requestid] = allJsonResponse.map((i: any, k: number) => {\n return {\n id: responseIds[k],\n content: i\n };\n });\n (formatParams2 as any).requestid = requestid;\n }\n\n resolve(formatParams2 as Attestation);\n } else {\n clearInterval(pollingTimer);\n clearTimeout(timeoutTimer);\n console.timeEnd('startAttestCost');\n cleanup();\n const { code, data } = errorData;\n reject(new ZkAttestationError(code, '', data));\n }\n }\n });\n });\n } catch (e: any) {\n // this._attestLoading = false\n return Promise.reject(e);\n }\n }\n\n async startAttestationMobile(attestationParamsStr: string): Promise<Attestation> {\n if (this.latestRunningMobileRequest) {\n attestationParamsStr = this.latestRunningMobileRequest;\n } else {\n this.latestRunningMobileRequest = attestationParamsStr;\n }\n const url = this.GetAttestationMobileUrl(attestationParamsStr);\n const newWin = window.open(url, '_self');\n console.log('startAttestationMobile newWin=', newWin);\n const attestationParams = JSON.parse(attestationParamsStr) as SignedAttRequest;\n const requestid = attestationParams.attRequest.requestid;\n const recipient = attestationParams.attRequest.userAddress;\n let queryurl = `https://api.padolabs.org/attestation/result?requestId=${requestid}&recipient=${recipient}`;\n if (this.options?.env !== 'production') {\n queryurl = `https://api-dev.padolabs.org/attestation/result?requestId=${requestid}&recipient=${recipient}`;\n }\n return new Promise((resolve, reject) => {\n const timer = setInterval(async () => {\n try {\n const response = await sendRequest(queryurl);\n console.log('query response=', response);\n console.log('query response.result.status=', response.result.status);\n if (response.rc === 0 && response.result.status === 'SUCCESS') {\n clearInterval(timer);\n clearTimeout(timeoutTimer);\n this.latestRunningMobileRequest = undefined;\n resolve(response.result.result);\n } else if (response.rc === 0 && response.result.status === 'FAILED') {\n const errorCode = response.result.result.errorCode;\n const errorMsg = response.result.result.errorMessage;\n console.log(`reject error code=${errorCode}, errorMsg=${errorMsg}`);\n clearInterval(timer);\n clearTimeout(timeoutTimer);\n this.latestRunningMobileRequest = undefined;\n reject(new ZkAttestationError(errorCode, '', errorMsg));\n }\n } catch (error) {\n console.log('query moblie attestaion result error.');\n }\n }, ATTESTATIONPOLLINGTIME);\n\n const timeoutTimer = setTimeout(() => {\n console.log('reject timeout');\n clearInterval(timer);\n this.latestRunningMobileRequest = undefined;\n reject(new ZkAttestationError('01000', '', ''));\n }, ATTESTATIONPOLLINGTIMEOUTMOBILE);\n });\n }\n\n GetAttestationMobileUrl(attestationParamsStr: string): string {\n const encodeParams = encodeURIComponent(attestationParamsStr);\n if (this.options?.platform === 'android') {\n let url;\n if (this.options.openAndroidApp) {\n url = `primuslabs://primuslabs.xyz/attestation-processor?signedRequest=${encodeParams}`;\n } else {\n url = `https://primuslabs.xyz/attestation-processor?signedRequest=${encodeParams}`;\n }\n return url;\n } else if (this.options?.platform === 'ios') {\n const url = `https://appclip.apple.com/id?p=PrimusLabs.Primus.AppClip&signedRequest=${encodeParams}`;\n return url;\n }\n return '';\n }\n\n verifyAttestation(attestation: Attestation): boolean {\n const encodeData = encodeAttestation(attestation);\n const signature = attestation.signatures[0];\n const result = ethers.utils.recoverAddress(encodeData, signature);\n console.log('sdk verifyAttestation recover address is ', result);\n const verifyResult = this._padoAddress.toLowerCase() === result.toLowerCase();\n return verifyResult;\n }\n\n getExtendedData(requestid: string): any {\n return this.extendedData[requestid];\n }\n\n /**\n * Check app quote and perform business logic based on the result\n * @private\n * @throws {ZkAttestationError} Only throws business logic errors, network errors are caught and ignored\n */\n private async _checkAppQuote(): Promise<void> {\n try {\n const { rc, result } = await getAppQuote({ appId: this.appId });\n // console.log('_checkAppQuote', result)\n // Business logic based on quote result\n if (rc !== 0) {\n // Handle error case - you can customize this based on your requirements\n console.warn('App quote check failed:', result?.msg);\n // Optionally throw error or handle differently based on business requirements\n // throw new ZkAttestationError('00005', result?.msg || 'App quote check failed');\n }\n if (!result) {\n throw new ZkAttestationError('-1002001');\n }\n if (!result.expiryTime && (!result.remainingQuota || result.remainingQuota <= 0)) {\n throw new ZkAttestationError('-1002003');\n }\n if (result.expiryTime) {\n if (result.expiryTime < Date.now()) {\n throw new ZkAttestationError('-1002004');\n }\n if (!result.remainingQuota || result.remainingQuota <= 0) {\n throw new ZkAttestationError('-1002005');\n }\n }\n\n // Add other business logic based on quoteResult.result if needed\n // For example:\n // if (quoteResult.result?.quotaExceeded) {\n // throw new ZkAttestationError('00005', 'Quota exceeded');\n // }\n } catch (error: any) {\n // If it's a business logic error (ZkAttestationError), rethrow it\n if (error instanceof ZkAttestationError) {\n throw error;\n }\n // For network errors or other exceptions, catch and log but don't throw\n // This allows the execution to continue even if the quote check fails\n console.error('Failed to check app quote (network error or other exception):', error);\n // Don't throw - allow execution to continue\n }\n }\n\n _verifyAttestationParams(attestationParams: SignedAttRequest): boolean {\n const {\n attRequest: { appId, attTemplateID, userAddress, timestamp },\n appSignature\n } = attestationParams;\n const checkFn = (label: string, value: any, valueType: string) => {\n if (!value) {\n throw new ZkAttestationError('00005', `Missing ${label}!`);\n } else {\n if (typeof value !== valueType) {\n throw new ZkAttestationError('00005', `Wrong ${label}!`);\n }\n }\n };\n checkFn('appId', appId, 'string');\n checkFn('attTemplateID', attTemplateID, 'string');\n // checkFn('userAddress', userAddress, 'string')\n checkFn('timestamp', timestamp, 'number');\n checkFn('appSignature', appSignature, 'string');\n const illgelAddr = ethers.utils.isAddress(userAddress) || isSolanaAddress(userAddress);\n if (!illgelAddr) {\n throw new ZkAttestationError('00005', `Wrong userAddress!`);\n }\n return true;\n }\n\n getAllJsonResponse(requestid: string): string | undefined {\n return this._allJsonResponse[requestid];\n }\n}\n\nexport { PrimusZKTLS, AttRequest };\n"],"names":["ONESECOND","ONEMINUTE","ATTESTATIONPOLLINGTIME","ATTESTATIONPOLLINGTIMEOUT","ATTESTATIONPOLLINGTIMEOUTMOBILE","PADOADDRESSMAP","ENV","BASEAPIMAP","BASEAPI","ErrorCodeMAP","ZkAttestationError","code","message","data","getInstanceProperties","instance","properties","key","encodeSolanaAttestation","att","encodedData","ethers","solanaAddressToBytes32","encodeRequest","encodeResponse","encodeAttestation","isSolanaAddress","request","reponse","encodeData","i","sendRequest","url","options","response","error","address","pk","PublicKey","bytes","bytesToHex","value","AttRequest","baseAttestationParams","appId","attTemplateID","userAddress","uuidv4","additionParams","algorithmType","resultType","attConditions","computeMode","noProxy","allJsonResponseFlag","config","method","headers","params","timeout","responseType","hasBody","fullUrl","urlObj","body","bodyData","contentType","controller","timeoutId","responseData","timeoutError","networkError","getAppQuote","t","T","sendToExtension","BRIDGE_TARGET","onExtensionMessage","callback","handler","event","raw","target","sdkVersion","PrimusZKTLS","appSecret","isNodeEnv","BRIDGE_METHODS","errorCode","resolve","reject","cleanup","msg","result","errorData","userAddr","signParams","wallet","messageHash","sig","attestationParamsStr","attestationParams","formatParams","pollingTimer","timeoutTimer","extendedData","allJsonResponse","formatParams2","requestid","responseIds","k","e","newWin","recipient","queryurl","timer","errorMsg","encodeParams","attestation","signature","rc","timestamp","appSignature","checkFn","label","valueType"],"mappings":"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","x_google_ignoreList":[6]}
|