@intuweb3/sdk
Version:
INTU SDK - Modern blockchain interaction toolkit
1 lines • 33.6 kB
JavaScript
import{combineSignedTransactions,combineSignedTransactionsWithoutLambda,createRandomMessage,createSeed,formTransaction,getMasterPublicKey,parseTransaction,preRegister,registerStepOne,registerStepTwo,registerStepThree,reshareSignTransaction,reshareStepByOriginalGroup,reshareStepOneByNewUser,reshareStepThree,reshareStepTwo,signTransaction,signTransactionWithoutLambda,getPolybaseKey}from"./cryptography/index.js";import{createVault,preRegisterStep,proposeTransaction,userCompleteVault,userConfirmTx,registerUserAll,registerUserAllReshare}from"./web3/signerfunctions.js";import{getFilteredUserInitializedLogs,getFilteredUserInitializedLogsSingle,getFilteredUserInitializedLogsSingleWithDeoa,_getProposal,_getTransaction,_getTransactions,_getTransactionLean,getVault}from"./web3/providerfunctions.js";import{getUserPreRegisterInfos,getUserSignature,getUtilsParams,getUserRegistrationAllInfos,getRegistrationStep3InfosDB,getRegistrationReshareStep3InfosDB}from"./web3/utils.js";import{ethers}from"ethers";import{hexToBytes}from"@noble/hashes/utils";import{finalizeEvent,getPublicKey}from"nostr-tools/pure";import{Relay}from"nostr-tools/relay";import{SimplePool}from"nostr-tools";import{parseEther}from"viem";import{createViemClientForTransaction,getVaultContract}from"./web3/helper/index.js";import{getUserPreRegisterInfosDirect,getUserRegistrationAllInfosDirect,getDataWithFallback}from"./direct/index.js";let getGraphEndpoint;(async()=>{var e=await import("../tools/constants.js");getGraphEndpoint=e.getGraphEndpoint})();import{rpcOptimizer}from"../utils/rpc-optimizer.js";import{getBestProvider}from"../utils/reliable-provider.js";if("undefined"==typeof window)try{import("ws").then(e=>{global.WebSocket=e.default||e}).catch(e=>{})}catch(e){}async function createIntuAccount(e,t,a,r,n,i,s=!1){var o=(await createSeed()).seed,l=(await createRandomMessage()).message;return await createVault(e,t,a,r,n,l,o,i,s)}async function createPolybaseKey(e,t,a){let r="";return r=a||await getUserSignature(e,t),getPolybaseKey(r)}async function preRegistration(e,t,a,r){let n=await t.getAddress();var i=(await t.provider.getNetwork()).chainId;let s=await getBestProvider(i,t);i=process.env.INDEXER_URL||process.env.REACT_APP_INDEXER_URL||getGraphEndpoint(i);if((await getDataWithFallback(()=>getUserPreRegisterInfos(e,n,s),s,i,50,()=>getUserPreRegisterInfosDirect(e,n,s))).registered)return"User already preregistered : "+n;let o;o=a||await getUserSignature(e,t);var{encryptionKey:i,megaPublicKey:a,encMegaSecretKey:l}=await preRegister(o),g=(await getPolybaseKey(o)).key,g=getPublicKey(hexToBytes(String(g)));return preRegisterStep(e,i,a,l,g,t,r||!1)}async function automateRegistration(m,e,t,a){if(console.log("Starting automated registration for vault:",m),"undefined"==typeof window&&void 0===global.WebSocket)try{var r=await import("ws");global.WebSocket=r.default||r}catch(e){}let d=Date.now(),w=0,y=200,f="",u=t=>new Promise(e=>setTimeout(e,t));try{f=a||await getUserSignature(m,e)}catch(e){throw console.error("❌ Error getting signature:",e),e}let n=await e.getAddress();var r=(await e.provider.getNetwork()).chainId,i=await getBestProvider(r,e);let{users:b,createdDate:s}=await(await getVaultContract(m,i)).vaultInfos(),v,o,T,k,S,l,A=b.findIndex(e=>n==e);var g=await getUtilsParams(m,n,i);for(v=g.seed,T=g.index,k=g.megaPkArray,S=g.encMegaSecretKey[A],o=g.threshold,l=g.dbKeyArray;l.filter(Boolean).length<b.length&&w<y;)await u(750),g=await getUtilsParams(m,n,i),l=[...g.dbKeyArray],v=g.seed,T=g.index,k=g.megaPkArray,S=g.encMegaSecretKey[A],o=g.threshold,w++;console.log("All users pre-registered, proceeding to NOSTR setup"),w=0;let R=Math.ceil(k.length*o/100),P=[],N=[],I=[],E=[],K=[],$=[],W=[],_=[],D=[],U=[],C=[],x=[],B=[],h=[],O=[],z=[],J=[],X=[],j=[],F=[];O=new Array(b.length).fill(""),z=new Array(b.length).fill(""),J=new Array(b.length).fill(""),X=new Array(b.length).fill(""),j=new Array(b.length).fill(""),F=new Array(b.length).fill(""),U=new Array(b.length).fill(""),C=new Array(b.length).fill(""),x=new Array(b.length).fill(""),B=new Array(b.length).fill(""),h=new Array(b.length).fill(""),console.log("Setting up NOSTR relays...");var c,a=["wss://nostr.intu.xyz"];t&&a.unshift(t);let L=[];for(c of a)try{await Relay.connect(c),L.push(c),console.log("Connected to NOSTR relay: "+c);break}catch(e){console.error(`Error connecting to relay ${c}:`,e)}if(0===L.length)throw console.error("No NOSTR relays available"),new Error("No relays available");L=[...new Set(L)];let V=new SimplePool,G=(await getPolybaseKey(f)).key,H;try{let e;s&&(e="function"==typeof s.toNumber?s.toNumber():Number(s),isNaN(e)||e<=0)&&(e=void 0);var p={kinds:[1]},Y=(e&&(p.since=e),{onevent(e){try{var t=JSON.parse(e.content);t.vaultAddress&&t.vaultAddress!==m||(null==t.u||"number"!=typeof t.u?console.warn("⚠️ [AutoReg] Invalid data.u in nostr event:",t.u):t.u<0||t.u>=b.length?console.warn(`⚠️ [AutoReg] data.u (${t.u}) out of bounds for users array (length: ${b.length}), skipping event`):"pedersen_key_dealing"in t?(E[t.u]=t.pedersen_key_dealing,K[t.u]=t.pedersen_kappa_dealing,$[t.u]=t.pedersen_lambda_dealing,P[t.u]=1):"simple_key_dealing"in t?(W[t.u]=t.pedersen_key_opening,_[t.u]=t.pedersen_kappa_opening,D[t.u]=t.pedersen_lambda_opening,U[t.u]=t.simple_key_dealing,C[t.u]=t.simple_lambda_dealing,x[t.u]=t.pedersen_key_transcript,B[t.u]=t.pedersen_kappa_transcript,h[t.u]=t.pedersen_lambda_transcript,N[t.u]=1):"dealing_kappa_times_lambda"in t&&(z[t.u]=t.simple_key_opening,J[t.u]=t.simple_kappa_opening,X[t.u]=t.dealing_kappa_times_lambda,O[t.u]=t.dealing_kappa_times_lambda,j[t.u]=t.simple_key_transcript,F[t.u]=t.simple_kappa_transcript,I[t.u]=1))}catch(e){console.error("❌ [AutoReg] Error parsing NOSTR event:",e)}},onnotice(e){}});if(!(H=V.subscribeMany(L,p,Y)))throw new Error("Failed to create subscription")}catch(e){throw console.error("Error connecting to NOSTR relay(s): "+L+" ERROR: ",e),e}console.log("🚀 [AutoReg] Starting registration step 1...");r=(await registerStepOne(v,R,T,k)).pedersenDealingArray,e={u:A,vaultAddress:m,pedersen_key_dealing:r[0],pedersen_kappa_dealing:r[1],pedersen_lambda_dealing:r[2]},t={kind:1,created_at:Math.floor(Date.now()/1e3),content:JSON.stringify(e),tags:[]},a=finalizeEvent(t,hexToBytes(String(G)));console.log("📤 [AutoReg] Publishing step 1 data to NOSTR..."),await V.publish(L,a),console.log("✅ [AutoReg] Step 1 data published successfully");let M=!1;p=await(async()=>{try{for(console.log("🔄 [AutoReg] Starting main processing loop...");!M;)try{if(await u(500),++w%20==0&&console.log(`🔄 [AutoReg] Loop iteration ${w}/`+y),!await(async()=>{try{if(w>y)return console.log("⚠️ [AutoReg] Max retries reached in bigUpdater"),!1;var e,t,a,r,n,i,s=P.filter(Number).length,o=N.filter(Number).length,l=I.filter(Number).length;if(E.length===b.length&&U.length===b.length&&O.length===b.length&&O.every(Boolean)&&(console.log("🎉 [AutoReg] All rounds complete!"),M=!0),!M){if(w%10==0&&console.log(`📊 [AutoReg] Progress: R1:${s}/${b.length}, R2:${o}/${b.length}, R3:${l}/`+b.length),P.filter(Number).length!==b.length||W[A]?W[A]&&N.filter(Number).length!==b.length&&w%20==0&&console.log("⏳ [AutoReg] Waiting for other users to complete step 2..."):(console.log("🚀 [AutoReg] All users completed step 1, starting step 2..."),{pedersenOpeningArray:e,simpleDealingArray:t,pedersenTranscriptArray:a}=await registerStepTwo(v,R,T,k,f,S,E,K,$),r={u:A,vaultAddress:m,pedersen_key_opening:e[0],pedersen_kappa_opening:e[1],pedersen_lambda_opening:e[2],simple_key_dealing:t[0],simple_lambda_dealing:t[1],pedersen_key_transcript:a[0],pedersen_kappa_transcript:a[1],pedersen_lambda_transcript:a[2]},n={kind:1,created_at:Math.floor(Date.now()/1e3),content:JSON.stringify(r),tags:[]},i=finalizeEvent(n,hexToBytes(String(G))),console.log("📤 [AutoReg] Publishing step 2 data to NOSTR..."),await V.publish(L,i),console.log("✅ [AutoReg] Step 2 completed and published")),N.filter(Number).length!==b.length||O[A])O[A]&&I.filter(Number).length!==b.length&&w%20==0&&console.log("⏳ [AutoReg] Current user completed all steps! Waiting for others to complete step 3...");else{console.log("🚀 [AutoReg] All users completed step 2, starting step 3...");var g=[];for(let e=0;e<b.length;e++)U[e]&&0!==U[e].length||g.push(`simpleKeyDealingsArray[${e}]`),C[e]&&0!==C[e].length||g.push(`simpleLambdaDealingsArray[${e}]`);if(0<g.length)throw console.error("❌ [AutoReg] Missing step 3 data: "+g.join(", ")),console.error("❌ [AutoReg] simpleKeyDealingsArray:",U),console.error("❌ [AutoReg] simpleLambdaDealingsArray:",C),console.error("❌ [AutoReg] Vault address: "+m),new Error("Cannot proceed with step 3 - missing data: "+g.join(", "));if(!x[A]||0===x[A].length)throw new Error(`Missing pedersenKeyTranscriptsArray[${A}]`);if(!B[A]||0===B[A].length)throw new Error(`Missing pedersenKappaTranscriptsArray[${A}]`);if(!D[A]||0===D[A].length)throw new Error(`Missing pedersenOpeningsLambdaArray[${A}]`);console.log("✅ [AutoReg] Step 3 inputs validated - all data present");var{simpleOpeningArray:c,multiplyDealingArray:p,simpleTranscriptArray:d}=await registerStepThree(v,R,T,k,f,S,U,C,x[A],B[A],D[A]),u={u:A,vaultAddress:m,simple_key_opening:c[0],simple_kappa_opening:c[1],dealing_key_times_lambda:p[0],dealing_kappa_times_lambda:p[1],simple_key_transcript:d[0],simple_kappa_transcript:d[1]},_={kind:1,created_at:Math.floor(Date.now()/1e3),content:JSON.stringify(u),tags:[]},h=finalizeEvent(_,hexToBytes(String(G)));console.log("📤 [AutoReg] Publishing step 3 data to NOSTR..."),await V.publish(L,h),console.log("✅ [AutoReg] Step 3 completed and published")}if(I.filter(Number).length===b.length)M=!0,await H.close()}}catch(e){console.error("An error occurred in bigUpdater:",e)}return!0})()){console.log("❌ [AutoReg] bigUpdater returned false - max retries reached, exiting loop");break}}catch(e){console.error("❌ [AutoReg] Error in processing loop:",e);break}var e=Date.now();return console.log(`Registration completed in ${e-d} ms`),M}catch(e){return console.error("❌ [AutoReg] Error in keepCheckingUntilTrue:",e),!1}})();return await H.close(),p}async function registerAllSteps(t,e,a,r,n){let i="";n=n||!1;i=a||await getUserSignature(t,e);let s="",o="",l="",g="",c="",p="",d="",u="",_=[],h=[],m,w;var y,a=await getPolybaseKey(i),a=getPublicKey(hexToBytes(String(a.key))),f=new SimplePool,b=["wss://nostr.intu.xyz"],v=(r&&b.unshift(r),[]);if("undefined"==typeof window&&void 0===global.WebSocket)try{var T=await import("ws");global.WebSocket=T.default||T,console.log("✅ WebSocket polyfill loaded for NOSTR (registerAllSteps)")}catch(e){throw console.error("❌ Failed to load WebSocket polyfill for NOSTR:",e),new Error("WebSocket not available for NOSTR connections")}for(y of b)try{console.log("🔌 Attempting to connect to NOSTR relay: "+y);await Relay.connect(y);v.push(y),console.log("✅ Successfully connected to NOSTR relay: "+y);break}catch(e){console.error(`Error connecting to relay ${y}:`,e)}if(0===v.length)throw new Error("No relays available");let k=f.subscribeMany(v,{authors:[a]},{onevent(e){e=JSON.parse(e.content);e.vaultAddress&&e.vaultAddress!==t||(e.pedersen_key_dealing&&(_=[e.pedersen_key_dealing,e.pedersen_kappa_dealing,e.pedersen_lambda_dealing]),e.pedersen_key_opening&&(s=e.pedersen_key_opening),e.pedersen_kappa_opening&&(o=e.pedersen_kappa_opening),e.pedersen_lambda_opening&&(l=e.pedersen_lambda_opening),e.simple_key_dealing&&(g=e.simple_key_dealing),e.simple_lambda_dealing&&(c=e.simple_lambda_dealing),e.pedersen_key_transcript&&(p=e.pedersen_key_transcript),e.pedersen_kappa_transcript&&(d=e.pedersen_kappa_transcript),e.pedersen_lambda_transcript&&(u=e.pedersen_lambda_transcript),e.simple_key_opening&&(h=[e.simple_key_opening,e.simple_kappa_opening,e.dealing_key_times_lambda,e.dealing_kappa_times_lambda,e.simple_key_transcript,e.simple_kappa_transcript]),1<_.length&&(m=btoa(JSON.stringify(_))),1<h.length&&(w=btoa(JSON.stringify(h))))},oneose(){k.close()}});for(;!(m&&s&&o&&l&&g&&c&&p&&d&&u&&w);)await(t=>new Promise(e=>setTimeout(e,t)))(500);return registerUserAll(t,m,s,o,l,g,c,p,d,u,w,e,n)}async function registerAllReshareSteps(t,e,a,r,n){let i="",s=(i=a||await getUserSignature(t,e),""),o="",l="",g="",c="",p="",d="",u="",_,h,m=[],w=[];var y,a=n||!1,n=await getPolybaseKey(i),n=getPublicKey(hexToBytes(String(n.key))),f=new SimplePool,b=["wss://nostr.intu.xyz"],v=(r&&b.unshift(r),[]);for(y of b)try{await Relay.connect(y),v.push(y);break}catch(e){console.error(`Error connecting to relay ${y}:`,e)}if(0===v.length)throw new Error("No relays available");let T=f.subscribe(v,{authors:[n]},{onevent(e){e=JSON.parse(e.content);e.vaultAddress&&e.vaultAddress!==t||(e.simple_kappa_dealing_reshared_once&&(m=[e.simple_key_dealing_reshared_once,e.simple_kappa_dealing_reshared_once,e.simple_lambda_dealing_reshared_once]),e.simple_key_opening_reshared_once&&(s=e.simple_key_opening_reshared_once),e.simple_kappa_opening_reshared_once&&(o=e.simple_kappa_opening_reshared_once),e.simple_lambda_opening_reshared_once&&(l=e.simple_lambda_opening_reshared_once),e.simple_key_dealing_reshared_twice&&(g=e.simple_key_dealing_reshared_twice),e.simple_kappa_dealing_reshared&&(c=e.simple_kappa_dealing_reshared),e.transcript_key_reshared_once&&(p=e.transcript_key_reshared_once),e.transcript_kappa_reshared_once&&(d=e.transcript_kappa_reshared_once),e.transcript_lambda_reshared_once&&(u=e.transcript_lambda_reshared_once),e.simple_key_opening_reshared_twice&&(w=[e.simple_key_opening_reshared_twice,e.simple_kappa_opening_reshared_twice,e.dealing_key_times_lambda_reshare,e.dealing_kappa_times_lambda_reshare,e.simple_key_transcript_reshared_twice,e.simple_kappa_transcript_reshared_twice]),1<m.length&&(_=btoa(JSON.stringify(m))),1<w.length&&(h=btoa(JSON.stringify(w))))},oneose(){T.close()}});for(;!(_&&s&&o&&l&&g&&c&&p&&d&&u&&h);)await(t=>new Promise(e=>setTimeout(e,t)))(500);return registerUserAllReshare(t,_,s,o,l,g,c,p,d,u,h,e,a)}async function completeVault(d,u,_){let h=async(t,a=5,r=1e3)=>{try{return await t()}catch(e){if(console.log(`Attempt failed, retries left: ${a}. Error:`,e?.message||e),0===a)throw e;return await new Promise(e=>setTimeout(e,r)),h(t,a-1,r)}};return h(async()=>{var e=_||!1,a=(await u.provider.getNetwork()).chainId;let r=await getBestProvider(a,u),t=await getVaultContract(d,r);var{users:n,completed:i}=await h(()=>t.vaultInfos(),5,2e3);if(i)return"Vault is already completed.";if(3<=n.length){i=[n[0],n[1],n[2]];let t=await u.getAddress();try{var s=process.env.INDEXER_URL||process.env.REACT_APP_INDEXER_URL||getGraphEndpoint(a),o=await getDataWithFallback(()=>getUserRegistrationAllInfos(d,r),r,s,50,()=>getUserRegistrationAllInfosDirect(d,r));if(!o||0===o.length)throw console.log("❌ [CompleteVault] No user registration data available yet, retrying..."),new Error("No user registration data available yet");if(!o.some(e=>null!==e))throw console.log("❌ [CompleteVault] No user registration data has content yet, retrying..."),new Error("No user registration data has content yet");var l=n.findIndex(e=>e.toLowerCase()===t.toLowerCase());if(-1===l)throw new Error("User not found in vault members");if(!o[0]||!o[1]||!o[2])throw console.log("⏳ [CompleteVault] Registration data not available for all users, retrying..."),new Error("Registration data not available for all users");if(!o[l])throw console.log(`❌ [CompleteVault] User registration data not yet available for user ${l}, retrying...`),new Error("User registration data not yet available");var g=o[l].step3Crypto;if(!g)throw console.log("❌ [CompleteVault] Step 3 crypto data not yet available, retrying..."),new Error("Step 3 crypto data not yet available");try{var c=JSON.parse(atob(g));if(!Array.isArray(c)||c.length<5)throw new Error("Invalid step3Result format: "+JSON.stringify(c));var p=await getMasterPublicKey(c[4]);return await userCompleteVault(d,i,"0x"+p,u,e)}catch(e){throw console.error("❌ [CompleteVault] Error parsing step3Crypto:",e),e}}catch(e){throw e}}return"Not enough users or data not available"})}async function submitTransaction(e,t,a,r,n,i,s,o,l,g="n/a",c=!1,p){var d=new Date;let u;p?"string"==typeof p?(u=new ethers.providers.StaticJsonRpcProvider(p),console.log(`📤 [SUBMIT_TX] Using provided RPC string for chain ${a}: `+p)):(p=(u=p).connection?.url||"unknown",console.log(`📤 [SUBMIT_TX] Using provided provider for chain ${a}: `+p)):(p=(u=await getBestProvider(Number(a),l)).connection?.url||"unknown",console.log(`📤 [SUBMIT_TX] Using getBestProvider RPC for chain ${a}: `+p));p=await createViemClientForTransaction(u);await l.getAddress();let _;if(null==i||""===i)try{var h=await rpcOptimizer.getCachedGasPrice(u,Number(a));_=ethers.BigNumber.from(h.toString()).mul(105).div(100)}catch(e){console.warn("RPC optimizer failed, falling back to standard gas price:",e);h=await u.getFeeData();if(!h.gasPrice)throw new Error("Unable to determine gas price");_=h.gasPrice.mul(105).div(100)}else _=ethers.BigNumber.from(i);let m=null,w,y,f,b;h=(await l.provider.getNetwork()).chainId;if(421614===h||42161===h){w=h,y=await getBestProvider(w,l),f=await getVaultContract(o,y);try{b=await f.vaultInfos()}catch(e){w=421614===w?42161:421614,y=await getBestProvider(w,l),f=await getVaultContract(o,y),b=await f.vaultInfos()}}else try{w=421614,y=await getBestProvider(w,l),f=await getVaultContract(o,y),b=await f.vaultInfos()}catch(e){w=42161,y=await getBestProvider(w,l),f=await getVaultContract(o,y),b=await f.vaultInfos()}i=b.masterPublicKey;try{m=n?await p.estimateGas({account:i,to:e,value:parseEther(String(t)),data:n}):await p.estimateGas({account:i,to:e,value:parseEther(String(t))})}catch(e){return console.warn(`You are likely experiencing an error because the account ${i} doesn't have enough funds to cover the gas+value being requested to transfer on `+a),void console.log(e)}let v;if(null==s||""===s){if(!m)throw new Error("Unable to determine gas limit");v=ethers.BigNumber.from(m).mul(105).div(100)}else v=ethers.BigNumber.from(s);h=await formTransaction(e,String(t),String(a),String(r),String(n),_.toString(),v.toString(),String(18)),p=await proposeTransaction(o,h,l,g,c),i=new Date;return process.env.DEBUG&&console.log("SUBMIT TX TIME : ",i.getTime()-d.getTime()),p}async function submitTransactionSolana(e,t,a,r="n/a"){console.log("data being stored : ",e);var n=new Date,e=await formTransaction("0x0000000000000000000000000000000000000000","0","0","0",e,"0","0",String(0)),t=await proposeTransaction(t,e,a,r,!1),e=new Date;return process.env.DEBUG&&console.log("SUBMIT TX TIME : ",e.getTime()-n.getTime()),t}async function signTx(t,a,r,n,i,s){var o=new Date;let l=await r.getAddress(),g="",c,e,p,d,u,_;var s=s||!1,n=(g=n||await getUserSignature(t,r),(await r.provider.getNetwork()).chainId),h=await getBestProvider(n,r),{users:m,resharingOccurred:w}=await(await getVaultContract(t,h)).vaultInfos(),m=m.findIndex(e=>l==e),y=(d&&u&&_&&e&&p||(y=await getUtilsParams(t,l,h),d=y.seed,u=y.threshold,_=y.index,e=y.megaPkArray,p=y.encMegaSecretKey[m]),Math.ceil(e.length*u/100)),f=("bigint"==typeof a?a=Number(a):"string"==typeof a&&(a=parseInt(a,10)),process.env.INDEXER_URL||process.env.REACT_APP_INDEXER_URL||getGraphEndpoint(n)),{getBlockHeightFromRPC:b,getBlockHeightFromIndexer:v}=await import("./direct/index.js");let T=!1;try{50<await b(h)-await v(f,n)&&(T=!0)}catch(e){}if(!c){let e;if(!(e=T?(b=(await import("./direct/index.js")).getTransactionLeanDirect,await b(t,a,h)):await getTransactionLean(t,a,h)))throw new Error("Transaction not found : "+t+" "+a);if(""===e.transactionData)throw new Error("Transaction data is empty : "+t+" "+a);c=e.transactionData}let k;f=(k=T?(v=(await import("./direct/index.js")).getUserRegistrationAllInfosDirect,await v(t,h)):await getUserRegistrationAllInfos(t,h))[m],n=y;if(k&&""!==f.step3Crypto){b=JSON.parse(atob(f.step3Crypto));let e;w?(v=f.pedersenOpeningLambdaReshare,m=await getRegistrationReshareStep3InfosDB(t,h),e=await reshareSignTransaction(d,n,_,c,g,p,m.pedersenDealingsLambdaReshareArray,m.dealingsKeyXLambdaReshareArray,m.dealingsKappaXLambdaReshareArray,v||"",b[4],b[5])):({dealingKeyXLambdaArray:w,dealingKappaXLambdaArray:n}=await getRegistrationStep3InfosDB(t,h),i?e=await signTransactionWithoutLambda(d,c,g,b[0],b[1],b[4],b[5]):(m=new Date,e=await signTransaction(d,y,_,c,g,p,w,n,f.pedersenOpeningLambda||"",b[4],b[5],f.pedersenTranscriptLambda||""),v=new Date,console.log("sign transaction CRYPTO : "+(v.getTime()-m.getTime())/1e3)));h=new Date;return process.env.DEBUG&&console.log("Time to sign : "+(h.getTime()-o.getTime())/1e3),userConfirmTx(t,a,e.signedTransaction,r,s)}}async function combineSignedTx(t,e,a,r){let n=await a.getAddress();let i=async(t,a=5,r=1e3)=>{try{return await t()}catch(e){if(console.log(`Attempt failed, retries left: ${a}. Error:`,e?.message||e),0===a)throw e;return await new Promise(e=>setTimeout(e,r)),i(t,a-1,r)}},s,o,l,g,c;var p=(await a.provider.getNetwork()).chainId;let d,u,_;if(421614===p||42161===p){d=p,u=await getBestProvider(d,a),_=await getVaultContract(t,u);try{await _.vaultInfos()}catch(e){d=421614===d?42161:421614,u=await getBestProvider(d,a),await(_=await getVaultContract(t,u)).vaultInfos()}}else try{d=421614,u=await getBestProvider(d,a),await(_=await getVaultContract(t,u)).vaultInfos()}catch(e){d=42161,u=await getBestProvider(d,a),await(_=await getVaultContract(t,u)).vaultInfos()}let h=(await i(()=>_.vaultInfos(),5,2e3)).users;var p=process.env.INDEXER_URL||process.env.REACT_APP_INDEXER_URL||getGraphEndpoint(d),{getBlockHeightFromRPC:a,getBlockHeightFromIndexer:m}=await import("./direct/index.js");let w=!1;try{var y=await a(u)-await m(p,d);50<y&&(console.log(`⚠️ [COMBINE_TX] Indexer is ${y} blocks behind RPC (threshold: 50). Using RPC fallback.`),w=!0)}catch(e){console.log("⚠️ [COMBINE_TX] Block height check failed, proceeding with indexer")}var f;h.findIndex(e=>n==e);if(s&&o&&l||(a=await getUtilsParams(t,n,u),s=a.seed,o=a.threshold,l=a.megaPkArray),!c){let e=null;for(f of await getUserRegistrationAllInfos(t,u))if(f&&f.user&&f.user.toLowerCase()===n.toLowerCase()){e=f;break}c=e.step3Crypto}var b,v,m=JSON.parse(atob(c)),T=Math.ceil(l.length*o/100);let k=0,S=new Array(h.length).fill(""),A;for(;S.filter(e=>""!==e).length<T&&k<10;)console.log("checking for signatures, attempt : "+k),k++,e="bigint"==typeof e?Number(e):e,g=w?(b=(await import("./direct/index.js")).getTransactionLeanDirect,b=await b(t,e,u),v=await parseTransaction(b.transactionData),{id:b.id,transactionData:b.transactionData,transactionNotes:b.transactionNotes,signedTransactionsNeeded:b.signedTransactionsNeeded,userSignedTransactions:b.userSignedTransactions||[],chainId:v.chainId,data:v.data,gas:v.gas,gasPrice:v.gasPrice,nonce:v.nonce,to:v.to,value:v.value}):await getTransaction(t,e,u),console.log("tx : ",g),A=g.transactionData,g.userSignedTransactions.forEach(t=>{var e=h.findIndex(e=>e.toLowerCase()===t.user.toLowerCase());-1!==e?S[e]=t.signedTransaction:S.push("")}),await(t=>new Promise(e=>setTimeout(e,t)))(1e3);let R;if(S.length<2)throw new Error("Hmm, one of the signing nodes failed to do it's job, sorry about that, please try again!");p=S.filter(e=>""!==e);if(r){if(console.log("signedTransactions 2 : ",S),1<S.length)return(R=await combineSignedTransactionsWithoutLambda(s,T,A||"",S,m[4],m[5])).finalSignedTransaction}else if(1<p.length)return(R=await combineSignedTransactions(s,T,A||"",S,m[4],m[5])).finalSignedTransaction}async function getVaults(t,a){var e;return 0===await a.getTransactionCount(t)||(e=await getFilteredUserInitializedLogs(t,a))&&0===e.length||void 0===e?[]:(e=e&&await Promise.all(e.map(async e=>getVault(e,a))),Promise.all(e.filter(e=>e.users.some(e=>e.address===t)).map(async t=>{for(let e=1;e<=t.proposalCount;e++);var e=[],e=await getAllTransactions(t.vaultAddress,a);return{...t,proposals:[],transactions:e}})).then(e=>e))}async function getVaultSingle(e,t){if(0===await t.getTransactionCount(e))return null;e=await getFilteredUserInitializedLogsSingle(e,t);if(!e?.length)return null;var e=e[e.length-1],a=await getVault(e,t),r=[];for(let e=1;e<=a.proposalCount;e++)r.push(await getProposal(a.vaultAddress,e,t));e=await getAllTransactions(a.vaultAddress,t);return{...a,proposals:r,transactions:e}}async function getVaultsWithoutTransactions(e,t){return 0===await t.getTransactionCount(e)||(e=await getFilteredUserInitializedLogs(e,t))&&0===e.length||void 0===e?[]:e&&await Promise.all(e.map(async e=>getVault(e,t)))}async function getVaultSingleWithDEOA(e,r){var e=await getFilteredUserInitializedLogsSingleWithDeoa(e,r);return e&&0===e.length||void 0===e?[]:(e=e&&await Promise.all(e.map(async e=>getVault(e,r))),Promise.all(e.map(async t=>{var a=[];for(let e=1;e<=t.proposalCount;e++)a.push(await getProposal(t.vaultAddress,e,r));var e=[],e=await getAllTransactions(t.vaultAddress,r);return{...t,proposals:a,transactions:e}})).then(e=>e))}async function getAllTransactions(e,t){var a=new Date,e=await _getTransactions(e,t).then(async e=>Promise.all(e.map(async e=>{var t=await parseTransaction(e.transactionData);return{id:e.txId,transactionData:e.transactionHash,chainId:t.chainId,data:t.data,gas:t.gas,gasPrice:t.gasPrice,nonce:t.nonce,to:t.to,value:t.value,signedTransactionsNeeded:e.signedTransactionsNeeded,userSignedTransactions:e.userSignedTransactions,transactionNotes:e.transactionNotes}}))),t=new Date;return process.env.DEBUG&&console.log("Time to get all transactions : ",t.getTime()-a.getTime()),e}let retryWithDelay=async(t,a=3,r=1e3)=>{try{return await t()}catch(e){if(0===a)throw e;return await new Promise(e=>setTimeout(e,r)),retryWithDelay(t,a-1,r)}};async function getTransaction(a,r,n){return retryWithDelay(async()=>{var e,t=await _getTransaction(a,r,n);if(t?.transactionData)return e=await parseTransaction(t.transactionData),{...t,chainId:e.chainId,data:e.data,gas:e.gas,gasPrice:e.gasPrice,nonce:e.nonce,to:e.to,value:e.value};throw new Error(`Transaction data not available for txId ${r}. This may be due to subgraph indexing delays.`)},10,1500)}async function getTransactionLean(e,t,a){try{var r,n=await _getTransactionLean(e,t,a);if(n?.transactionData)return r=await parseTransaction(n.transactionData),{...n,chainId:r.chainId,data:r.data,gas:r.gas,gasPrice:r.gasPrice,nonce:r.nonce,to:r.to,value:r.value}}catch(e){console.log(`⚠️ [GET_TX_LEAN] Indexer failed for txId ${t}, trying RPC...`)}try{var i,s=(await import("./direct/index.js")).getTransactionLeanDirect,o=await s(e,t,a);if(o?.transactionData)return console.log("✅ [GET_TX_LEAN] RPC fallback successful for txId "+t),i=await parseTransaction(o.transactionData),{...o,chainId:i.chainId,data:i.data,gas:i.gas,gasPrice:i.gasPrice,nonce:i.nonce,to:i.to,value:i.value}}catch(e){console.log(`❌ [GET_TX_LEAN] RPC fallback also failed for txId ${t}:`,e)}throw new Error(`Transaction data not available for txId ${t}. Both indexer and RPC failed.`)}async function automateRotateRegistration(d,e,t){let u=await getUserSignature(d,e);var a=await e.getAddress(),r=(await e.provider.getNetwork()).chainId,r=await getBestProvider(r,e);let n=await getVaultContract(d,r),i=async(t,a=5,r=1e3)=>{try{return await t()}catch(e){if(console.log(`Attempt failed, retries left: ${a}. Error:`,e?.message||e),0===a)throw e;return await new Promise(e=>setTimeout(e,r)),i(t,a-1,r)}},{users:O,createdDate:L}=await i(()=>n.vaultInfos(),5,2e3),_,V,h,m,s,w,M;var o=[],l=await n.getUserToAdd();let g=await n.getUserToRemove();if(a===g[0])throw new Error("User being removed cannot particpate");let K=t=>new Promise(e=>setTimeout(e,t)),c=await e.getAddress(),y=(o=O.concat(l)).findIndex(e=>c==e);var p=await getUtilsParams(d,c,r);_=p.seed,h=p.megaPkArray,m=p.encMegaSecretKey[y],V=p.threshold,s=p.dbKeyArray;let f;g&&g[0]&&""!==g[0]?(b=o.findIndex(e=>g[0]==e),console.log("userIndexToBeRemoved : "+b),w=o.length-1,l&&l[0]&&l[0]==c||y):w=o.length;var b=o.findIndex(e=>e===g[0]),p=(0<=b&&1===l.length&&(console.log(b+" : "+g[0]),o[b]=o[o.length-1],s[b]=s[o.length-1],h[b]=h[o.length-1],m=p.encMegaSecretKey[y],o.pop(),s.pop(),h.pop()),l[0]===c&&(y=b),f=Math.ceil(h.length*V/100),await getUserRegistrationAllInfos(d,r));let $,v=(""!==($=(l.includes(a)?p[0]:p[y]).step3Crypto)&&(o=JSON.parse(atob($)),M=o[4]),await K(500),[]),T=[],k=[],S=[],A=[],R=[],P=[],W=[],z=[],J=[],X=[],j=[],F=[],G=[],H=[],Y=[],q=[],N=[],Q=[],Z=[];var I,E,D,b=["wss://nostr.intu.xyz"];t&&b.unshift(t);let U=[];for(I of b)try{await Relay.connect(I),U.push(I);break}catch(e){console.error(`Error connecting to relay ${I}:`,e)}if(0===U.length)throw new Error("No relays available");let C=(await getPolybaseKey(u)).key,x=new SimplePool;try{x.subscribeMany(U,(D={kinds:[1]},null!=L&&(E=Number(L),!isNaN(E))&&0<E&&(D.since=E),D),{onevent(e){e=JSON.parse(e.content);console.log("data : "+e.u),e.vaultAddress&&e.vaultAddress!==d||("simple_kappa_dealing_reshared_once"in e?(S[e.u]=e.simple_key_dealing_reshared_once,A[e.u]=e.simple_kappa_dealing_reshared_once,R[e.u]=e.simple_lambda_dealing_reshared_once,v[e.u]=1):"simple_key_opening_reshared_once"in e?(P[e.u]=e.simple_key_opening_reshared_once,W[e.u]=e.simple_kappa_opening_reshared_once,z[e.u]=e.simple_lambda_opening_reshared_once,J[e.u]=e.simple_key_dealing_reshared_twice,X[e.u]=e.simple_kappa_dealing_reshared,j[e.u]=e.transcript_key_reshared_once,F[e.u]=e.transcript_kappa_reshared_once,G[e.u]=e.transcript_lambda_reshared_once,T[e.u]=1):"simple_key_opening_reshared_twice"in e&&(H[e.u]=e.simple_key_opening_reshared_twice,Y[e.u]=e.simple_kappa_opening_reshared_twice,q[e.u]=e.dealing_key_times_lambda_reshare,N[e.u]=e.dealing_kappa_times_lambda_reshare,Q[e.u]=e.simple_key_transcript_reshared_twice,Z[e.u]=e.simple_kappa_transcript_reshared_twice,k[e.u]=1))}})}catch(e){console.error("Error subscribing to relays:",e)}l.includes(a)?(p=(await reshareStepOneByNewUser(_,f,y,h)).reshareDealings,o={u:y,vaultAddress:d,simple_key_dealing_reshared_once:"",simple_kappa_dealing_reshared_once:p[0],simple_lambda_dealing_reshared_once:p[1]},t={kind:1,created_at:Math.floor(Date.now()/1e3),content:JSON.stringify(o),tags:[]},b=finalizeEvent(t,hexToBytes(String(C))),await x.publish(U,b),console.log("resharestep1done")):(E=await getUserSignature(d,e),D=await getUserRegistrationAllInfos(d,r),l=JSON.parse(atob(D[y].step3Crypto))[0],a=(await reshareStepByOriginalGroup(_,f,y,E,l,h)).reshareDealings,p={u:y,vaultAddress:d,simple_key_dealing_reshared_once:a[0],simple_kappa_dealing_reshared_once:a[1],simple_lambda_dealing_reshared_once:a[2]},o={kind:1,created_at:Math.floor(Date.now()/1e3),content:JSON.stringify(p),tags:[]},t=finalizeEvent(o,hexToBytes(String(C))),await x.publish(U,t));let B=!1,ee=async()=>{try{var e,t,a,r,n,i,s,o,l,g,c,p;if(R.length===w&&J.length===w&&N.length===w&&N.every(e=>e&&0<e.length)&&(console.log("Completing"),B=!0),!B)if(console.log("Round1counter "+v.filter(Number).length),v.filter(Number).length!==w||P[y]?P[y]&&(T.filter(Number).length,w):(S=S.filter(e=>""!==e),A.includes("")&&(A=A.filter(e=>""!==e)),R.includes("")&&(R=R.filter(e=>""!==e)),{reshareOpenings:e,reshareDealings:t,reshareTranscripts:a}=await reshareStepTwo(_,f,y,h,u,m,S,M,A,R),r={u:y,vaultAddress:d,simple_key_opening_reshared_once:e[0],simple_kappa_opening_reshared_once:e[1],simple_lambda_opening_reshared_once:e[2],simple_key_dealing_reshared_twice:t[0],simple_kappa_dealing_reshared:t[1],transcript_key_reshared_once:a[0],transcript_kappa_reshared_once:a[1],transcript_lambda_reshared_once:a[2]},n={kind:1,created_at:Math.floor(Date.now()/1e3),content:JSON.stringify(r),tags:[]},i=finalizeEvent(n,hexToBytes(String(C))),await x.publish(U,i),console.log("resharestep2done")),console.log("Round2counter "+T.filter(Number).length),T.filter(Number).length!==w||H[y]?N[y]&&k.filter(Number).length!==w&&console.log("You are all done! Waiting on others to perform step3 so we can complete vault"):(console.log("doingstep3"),{reshareOpenings:s,reshareDealings:o,reshareTranscripts:l}=await reshareStepThree(_,f,y,h,u,m,X,z,S,j[y],F[y]),g={u:y,vaultAddress:d,simple_key_opening_reshared_twice:s[0],simple_kappa_opening_reshared_twice:s[1],dealing_key_times_lambda_reshare:o[0],dealing_kappa_times_lambda_reshare:o[1],simple_key_transcript_reshared_twice:l[0],simple_kappa_transcript_reshared_twice:l[1]},c={kind:1,created_at:Math.floor(Date.now()/1e3),content:JSON.stringify(g),tags:[]},p=finalizeEvent(c,hexToBytes(String(C))),await x.publish(U,p),console.log("resharestep3done")),k.filter(Number).length===w)return console.log("EVERYONE IS DONE"),B=!0}catch(e){}return!0};return ee(),await(async()=>{for(;!B;)if(await K(1e3),!await ee()){console.log("❌ [AutoReg] bigUpdater returned false - max retries reached, exiting loop");break}return B})(),await x.close(U),!0}async function getProposal(e,t,a){return _getProposal(e,t,a,ethers.utils.defaultAbiCoder)}async function getProposedUser(e,t){return(await getVaultContract(e,t)).getUserToAdd()}async function getUserCompletedRotationRegistrationCount(e,t){return(await getVault(e,t)).users.filter(e=>e.reshareComplete).length}export{getUserPreRegisterInfos,getUserSignature,getUtilsParams,getUserRegistrationAllInfos,getRegistrationStep3InfosDB,getRegistrationReshareStep3InfosDB}from"./web3/utils.js";export{configureProviderManager,getBestProvider,getReliableProvider}from"../utils/reliable-provider.js";export{createIntuAccount,createPolybaseKey,preRegistration,automateRegistration,registerAllSteps,registerAllReshareSteps,completeVault,submitTransaction,submitTransactionSolana,signTx,combineSignedTx,getVaults,getVaultSingle,getVaultsWithoutTransactions,getVaultSingleWithDEOA,getAllTransactions,getTransaction,getTransactionLean,automateRotateRegistration,getProposal,getProposedUser,getUserCompletedRotationRegistrationCount};