@intuweb3/sdk
Version:
INTU SDK - Modern blockchain interaction toolkit
1 lines • 29.2 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{getProviderForChain}from"../tools/chainList.js";import{getDataWithFallback}from"./direct/index.js";let getGraphEndpoint;async function createIntuAccount(e,t,a,r,n,i,o=!1){var s=(await createSeed()).seed,l=(await createRandomMessage()).message;return await createVault(e,t,a,r,n,l,s,i,o)}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(),i=t.provider;var o=(await i.getNetwork()).chainId,s=process.env.INDEXER_URL||process.env.REACT_APP_INDEXER_URL||getGraphEndpoint(o),o=(console.log("🔍 preRegistration debug:"),console.log(" - chainId:",o),console.log(" - INTU_NETWORK env:",process.env.INTU_NETWORK),console.log(" - REACT_APP_INTU_NETWORK env:",process.env.REACT_APP_INTU_NETWORK),console.log(" - INDEXER_URL env:",process.env.INDEXER_URL),console.log(" - REACT_APP_INDEXER_URL env:",process.env.REACT_APP_INDEXER_URL),console.log(" - getGraphEndpoint result:",getGraphEndpoint(o)),console.log(" - final indexerUrl:",s),await getDataWithFallback(()=>getUserPreRegisterInfos(e,n,i),i,s,25));if(o.registered)return console.log("user already preregistered : ",n),"User already preregistered : "+n;let l;l=a||await getUserSignature(e,t);var{encryptionKey:s,megaPublicKey:o,encMegaSecretKey:a}=await preRegister(l),g=(await getPolybaseKey(l)).key,g=getPublicKey(hexToBytes(String(g)));return preRegisterStep(e,s,o,a,g,t,r||!1)}async function automateRegistration(e,t,a,r){if(console.log("Starting automated registration for vault:",e),"undefined"==typeof window&&void 0===global.WebSocket)try{var n=require("ws");global.WebSocket=n,console.log("WebSocket polyfill loaded for Node.js environment")}catch(e){console.log("WebSocket polyfill not available")}let p=Date.now(),h=0,m=200,y="",i=t=>new Promise(e=>setTimeout(e,t)),o=(y=r||await getUserSignature(e,t),await t.getAddress());let{users:w,createdDate:d}=await(await getVaultContract(e,t.provider)).vaultInfos(),f,s,b,v,T,l,S=w.findIndex(e=>o==e);var g=await getUtilsParams(e,o,t.provider);for(f=g.seed,b=g.index,v=g.megaPkArray,T=g.encMegaSecretKey[S],s=g.threshold,l=g.dbKeyArray,console.log("Waiting for all users to complete pre-registration...");l.filter(Boolean).length<w.length;){if(!(h<m)){console.log("⚠️ [AutoReg] Max retries reached, proceeding anyway (this will probably fail)");break}console.log(`Waiting for pre-registration: ${l.filter(Boolean).length}/${w.length} users ready`),await i(750),g=await getUtilsParams(e,o,t.provider),l=[...g.dbKeyArray],f=g.seed,b=g.index,v=g.megaPkArray,T=g.encMegaSecretKey[S],s=g.threshold,h++}console.log("All users pre-registered, proceeding to NOSTR setup"),h=0;let k=Math.ceil(v.length*s/100),R=[],A=[],N=[],E=[],P=[],U=[],D=[],_=[],I=[],O=[],B=[],M=[],J=[],u=[],C=[],z=[],$=[],F=[],G=[],X=[];C=new Array(w.length).fill(""),z=new Array(w.length).fill(""),$=new Array(w.length).fill(""),F=new Array(w.length).fill(""),G=new Array(w.length).fill(""),X=new Array(w.length).fill(""),console.log("Setting up NOSTR relays...");var c,n=["wss://nostr.intu.xyz"];a&&n.unshift(a);let x=[];for(c of n)try{await Relay.connect(c),x.push(c),console.log("Connected to NOSTR relay: "+c);break}catch(e){console.error(`Error connecting to relay ${c}:`,e)}if(0===x.length)throw console.error("No NOSTR relays available"),new Error("No relays available");let L=new SimplePool,V=(await getPolybaseKey(y)).key,K;try{if(!(K=L.subscribeMany(x,[{kinds:[1],since:Number(d)}],{onevent(e){try{var t=JSON.parse(e.content);"pedersen_key_dealing"in t?(E[t.u]=t.pedersen_key_dealing,P[t.u]=t.pedersen_kappa_dealing,U[t.u]=t.pedersen_lambda_dealing,R[t.u]=1):"simple_key_dealing"in t?(D[t.u]=t.pedersen_key_opening,_[t.u]=t.pedersen_kappa_opening,I[t.u]=t.pedersen_lambda_opening,O[t.u]=t.simple_key_dealing,B[t.u]=t.simple_lambda_dealing,M[t.u]=t.pedersen_key_transcript,J[t.u]=t.pedersen_kappa_transcript,u[t.u]=t.pedersen_lambda_transcript,A[t.u]=1):"dealing_kappa_times_lambda"in t&&(z[t.u]=t.simple_key_opening,$[t.u]=t.simple_kappa_opening,F[t.u]=t.dealing_key_times_lambda,C[t.u]=t.dealing_kappa_times_lambda,G[t.u]=t.simple_key_transcript,X[t.u]=t.simple_kappa_transcript,N[t.u]=1)}catch(e){console.error("❌ [AutoReg] Error parsing NOSTR event:",e)}}})))throw new Error("Failed to create subscription")}catch(e){throw console.error("Error connecting to NOSTR relay(s): "+x+" ERROR: ",e),e}console.log("🚀 [AutoReg] Starting registration step 1...");r=(await registerStepOne(f,k,b,v)).pedersenDealingArray,a={u:S,pedersen_key_dealing:r[0],pedersen_kappa_dealing:r[1],pedersen_lambda_dealing:r[2]},n={kind:1,created_at:Math.floor(Date.now()/1e3),content:JSON.stringify(a),tags:[]},r=finalizeEvent(n,hexToBytes(String(V)));console.log("📤 [AutoReg] Publishing step 1 data to NOSTR..."),await L.publish(x,r),console.log("✅ [AutoReg] Step 1 data published successfully");let W=!1;a=await(async()=>{try{for(console.log("🔄 [AutoReg] Starting main processing loop...");!W;)try{if(await i(500),++h%20==0&&console.log(`🔄 [AutoReg] Loop iteration ${h}/`+m),!await(async()=>{try{if(h>m)return console.log("⚠️ [AutoReg] Max retries reached in bigUpdater"),!1;var e,t,a,r,n,i,o,s,l,g,c,p,d=R.filter(Number).length,_=A.filter(Number).length,u=N.filter(Number).length;if(E.length===w.length&&O.length===w.length&&C.length===w.length&&C.every(Boolean)&&(console.log("🎉 [AutoReg] All rounds complete!"),W=!0),!W)if(h%10==0&&console.log(`📊 [AutoReg] Progress: R1:${d}/${w.length}, R2:${_}/${w.length}, R3:${u}/`+w.length),R.filter(Number).length!==w.length||D[S]?D[S]&&A.filter(Number).length!==w.length&&h%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(f,k,b,v,y,T,E,P,U),r={u:S,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(V))),console.log("📤 [AutoReg] Publishing step 2 data to NOSTR..."),await L.publish(x,i),console.log("✅ [AutoReg] Step 2 completed and published")),A.filter(Number).length!==w.length||C[S]?C[S]&&N.filter(Number).length!==w.length&&h%20==0&&console.log("⏳ [AutoReg] Current user completed all steps! Waiting for others to complete step 3..."):(console.log("🚀 [AutoReg] All users completed step 2, starting step 3..."),{simpleOpeningArray:o,multiplyDealingArray:s,simpleTranscriptArray:l}=await registerStepThree(f,k,b,v,y,T,O,B,M[S],J[S],I[S]),g={u:S,simple_key_opening:o[0],simple_kappa_opening:o[1],dealing_key_times_lambda:s[0],dealing_kappa_times_lambda:s[1],simple_key_transcript:l[0],simple_kappa_transcript:l[1]},c={kind:1,created_at:Math.floor(Date.now()/1e3),content:JSON.stringify(g),tags:[]},p=finalizeEvent(c,hexToBytes(String(V))),console.log("📤 [AutoReg] Publishing step 3 data to NOSTR..."),await L.publish(x,p),console.log("✅ [AutoReg] Step 3 completed and published")),N.filter(Number).length===w.length)W=!0,await K.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-p} ms`),W}catch(e){return console.error("❌ [AutoReg] Error in keepCheckingUntilTrue:",e),!1}})();return await K.close(),a}async function registerAllSteps(e,t,a,r,n){let i="";n=n||!1;i=a||await getUserSignature(e,t);let o="",s="",l="",g="",c="",p="",d="",_="",u=[],h=[],m,y;var w,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=require("ws");global.WebSocket=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(w of b)try{console.log("🔌 Attempting to connect to NOSTR relay: "+w);await Relay.connect(w);v.push(w),console.log("✅ Successfully connected to NOSTR relay: "+w);break}catch(e){console.error(`Error connecting to relay ${w}:`,e)}if(0===v.length)throw new Error("No relays available");let S=f.subscribeMany(v,[{authors:[a]}],{onevent(e){e=JSON.parse(e.content);e.pedersen_key_dealing&&(u=[e.pedersen_key_dealing,e.pedersen_kappa_dealing,e.pedersen_lambda_dealing]),e.pedersen_key_opening&&(o=e.pedersen_key_opening),e.pedersen_kappa_opening&&(s=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&&(_=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<u.length&&(m=btoa(JSON.stringify(u))),1<h.length&&(y=btoa(JSON.stringify(h)))},oneose(){S.close()}});for(;!(m&&o&&s&&l&&g&&c&&p&&d&&_&&y);)await(t=>new Promise(e=>setTimeout(e,t)))(500);return registerUserAll(e,m,o,s,l,g,c,p,d,_,y,t,n)}async function registerAllReshareSteps(e,t,a,r,n){let i="",o=(i=a||await getUserSignature(e,t),""),s="",l="",g="",c="",p="",d="",_="",u,h,m=[],y=[];var w,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(w of b)try{await Relay.connect(w),v.push(w);break}catch(e){console.error(`Error connecting to relay ${w}:`,e)}if(0===v.length)throw new Error("No relays available");let T=f.subscribeMany(v,[{authors:[n]}],{onevent(e){e=JSON.parse(e.content);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&&(o=e.simple_key_opening_reshared_once),e.simple_kappa_opening_reshared_once&&(s=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&&(_=e.transcript_lambda_reshared_once),e.simple_key_opening_reshared_twice&&(y=[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&&(u=btoa(JSON.stringify(m))),1<y.length&&(h=btoa(JSON.stringify(y)))},oneose(){T.close()}});for(;!(u&&o&&s&&l&&g&&c&&p&&d&&_&&h);)await(t=>new Promise(e=>setTimeout(e,t)))(500);return registerUserAllReshare(e,u,o,s,l,g,c,p,d,_,h,t,a)}async function completeVault(g,c,p){let d=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)),d(t,a-1,r)}};return d(async()=>{var e=p||!1;let t=await getVaultContract(g,c.provider);var{users:a,completed:r}=await d(()=>t.vaultInfos(),5,2e3);if(r)return"Vault is already completed.";if(3<=a.length){r=[a[0],a[1],a[2]];let t=await c.getAddress();try{var n=await getUserRegistrationAllInfos(g,c.provider);if(!n||0===n.length)throw console.log("❌ [CompleteVault] No user registration data available yet, retrying..."),new Error("No user registration data available yet");if(!n.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 i=a.findIndex(e=>e.toLowerCase()===t.toLowerCase());if(-1===i)throw new Error("User not found in vault members");if(!n[0]||!n[1]||!n[2])throw console.log("⏳ [CompleteVault] Registration data not available for all users, retrying..."),new Error("Registration data not available for all users");if(!n[i])throw console.log(`❌ [CompleteVault] User registration data not yet available for user ${i}, retrying...`),new Error("User registration data not yet available");var o=n[i].step3Crypto;if(!o)throw console.log("❌ [CompleteVault] Step 3 crypto data not yet available, retrying..."),new Error("Step 3 crypto data not yet available");try{var s=JSON.parse(atob(o));if(!Array.isArray(s)||s.length<5)throw new Error("Invalid step3Result format: "+JSON.stringify(s));var l=await getMasterPublicKey(s[4]);return await userCompleteVault(g,r,"0x"+l,c,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,o,s,l,g="n/a",c=!1,p){var d=new Date;let _;_=p?"string"==typeof p?new ethers.providers.StaticJsonRpcProvider(p):p:await getProviderForChain(a);p=await createViemClientForTransaction(_);await l.getAddress();let u;var h=await _.getFeeData();if(null==i||""===i){if(!h.gasPrice)throw new Error("Unable to determine gas price");u=h.gasPrice.mul(105).div(100)}else u=ethers.BigNumber.from(i);let m=null;h=(await(await getVaultContract(s,l.provider)).vaultInfos()).masterPublicKey;try{m=n?await p.estimateGas({account:h,to:e,value:parseEther(String(t)),data:n}):await p.estimateGas({account:h,to:e,value:parseEther(String(t))})}catch(e){return console.warn(`You are likely experiencing an error because the account ${h} doesn't have enough funds to cover the gas+value being requested to transfer on `+a),void console.log(e)}let y;if(null==o||""===o){if(!m)throw new Error("Unable to determine gas limit");y=ethers.BigNumber.from(m).mul(105).div(100)}else y=ethers.BigNumber.from(o);i=await formTransaction(e,String(t),String(a),String(r),String(n),u.toString(),y.toString(),String(18)),p=await proposeTransaction(s,i,l,g,c),h=new Date;return process.env.DEBUG&&console.log("SUBMIT TX TIME : ",h.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,o){var s=new Date;let l=await r.getAddress(),g="",c,e,p,d,_,u;o=o||!1;g=n||await getUserSignature(t,r);var{users:n,resharingOccurred:h}=await(await getVaultContract(t,r.provider)).vaultInfos(),n=n.findIndex(e=>l==e),m=(d&&_&&u&&e&&p||(m=await getUtilsParams(t,l,r.provider),d=m.seed,_=m.threshold,u=m.index,e=m.megaPkArray,p=m.encMegaSecretKey[n]),Math.ceil(e.length*_/100));if("bigint"==typeof a?a=Number(a):"string"==typeof a&&(a=parseInt(a,10)),!c){var y=await getTransactionLean(t,a,r.provider);if(!y)throw new Error("Transaction not found : "+t+" "+a);if(""===y.transactionData)throw new Error("Transaction data is empty : "+t+" "+a);console.log("Transaction data type:",typeof y.transactionData),console.log("Transaction data:",y.transactionData),c=y.transactionData}var y=await getUserRegistrationAllInfos(t,r.provider),n=y[n],w=m;if(y&&""!==n.step3Crypto){var f,y=JSON.parse(atob(n.step3Crypto));let e;h?(h=n.pedersenOpeningLambdaReshare,f=await getRegistrationReshareStep3InfosDB(t,r.provider),e=await reshareSignTransaction(d,w,u,c,g,p,f.pedersenDealingsLambdaReshareArray,f.dealingsKeyXLambdaReshareArray,f.dealingsKappaXLambdaReshareArray,h||"",y[4],y[5])):({dealingKeyXLambdaArray:w,dealingKappaXLambdaArray:f}=await getRegistrationStep3InfosDB(t,r.provider),i?e=await signTransactionWithoutLambda(d,c,g,y[0],y[1],y[4],y[5]):(h=new Date,e=await signTransaction(d,m,u,c,g,p,w,f,n.pedersenOpeningLambda||"",y[4],y[5],n.pedersenTranscriptLambda||""),i=new Date,console.log("sign transaction CRYPTO : "+(i.getTime()-h.getTime())/1e3)));m=new Date;return process.env.DEBUG&&console.log("Time to sign : "+(m.getTime()-s.getTime())/1e3),userConfirmTx(t,a,e.signedTransaction,r,o)}}async function combineSignedTx(t,e,a,r){let n=await a.getAddress();var i;let o=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)),o(t,a-1,r)}},s,l,g,c,p=await getVaultContract(t,a.provider),d=(await o(()=>p.vaultInfos(),5,2e3)).users;var _;d.findIndex(e=>n==e);if(s&&l&&g||(u=await getUtilsParams(t,n,a.provider),s=u.seed,l=u.threshold,g=u.megaPkArray),!c){let e=null;for(_ of await getUserRegistrationAllInfos(t,a.provider))if(_&&_.user&&_.user.toLowerCase()===n.toLowerCase()){e=_;break}c=e.step3Crypto}var u=JSON.parse(atob(c)),h=Math.ceil(g.length*l/100);let m=0,y=new Array(d.length).fill(""),w;for(;y.filter(e=>""!==e).length<h&&m<10;)console.log("checking for signatures, attempt : "+m),m++,i=await getTransaction(t,e="bigint"==typeof e?Number(e):e,a.provider),console.log("tx : ",i),w=i.transactionData,i.userSignedTransactions.forEach(t=>{var e=d.findIndex(e=>e.toLowerCase()===t.user.toLowerCase());-1!==e?y[e]=t.signedTransaction:y.push("")}),await(t=>new Promise(e=>setTimeout(e,t)))(1e3);let f;if(y.length<2)throw new Error("Hmm, one of the signing nodes failed to do it's job, sorry about that, please try again!");var b=y.filter(e=>""!==e);if(r){if(console.log("signedTransactions 2 : ",y),1<y.length)return(f=await combineSignedTransactionsWithoutLambda(s,h,w||"",y,u[4],u[5])).finalSignedTransaction}else if(1<b.length)return(f=await combineSignedTransactions(s,h,w||"",y,u[4],u[5])).finalSignedTransaction}async function getVaults(t,a){var e;return console.log("start get vaults"),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}(async()=>{var e=await import("../tools/constants.js");getGraphEndpoint=e.getGraphEndpoint})(),"undefined"==typeof window&&import("ws").then(e=>{global.WebSocket=e.default||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")})}async function getTransactionLean(a,r,n){return retryWithDelay(async()=>{var e,t=await _getTransactionLean(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")})}async function automateRotateRegistration(e,t,a){let d=await getUserSignature(e,t);var r=await t.getAddress();let n=await getVaultContract(e,t.provider),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)}};var{users:o,createdDate:s}=await i(()=>n.vaultInfos(),5,2e3);let _,l,u,h,g,m,y;var c=[],p=await n.getUserToAdd();let w=await n.getUserToRemove();if(r===w[0])throw new Error("User being removed cannot particpate");let L=t=>new Promise(e=>setTimeout(e,t)),f=await t.getAddress(),b=(c=o.concat(p)).findIndex(e=>f==e);console.log("encMegaSecretKey being set to this userindex : "+b);o=await getUtilsParams(e,f,t.provider);_=o.seed,u=o.megaPkArray,h=o.encMegaSecretKey[b],l=o.threshold,g=o.dbKeyArray;let v;w&&w[0]&&""!==w[0]?(T=c.findIndex(e=>w[0]==e),console.log("userIndexToBeRemoved : "+T),m=c.length-1,p&&p[0]&&p[0]==f||b):m=c.length;var T=c.findIndex(e=>e===w[0]),o=(0<=T&&1===p.length&&(console.log(T+" : "+w[0]),c[T]=c[c.length-1],g[T]=g[c.length-1],u[T]=u[c.length-1],h=o.encMegaSecretKey[b],c.pop(),g.pop(),u.pop()),p[0]===f&&(b=T),v=Math.ceil(u.length*l/100),await getUserRegistrationAllInfos(e,t.provider));let V,S=(""!==(V=(p.includes(r)?o[0]:o[b]).step3Crypto)&&(c=JSON.parse(atob(V)),y=c[4]),await L(500),[]),k=[],R=[],A=[],N=[],E=[],P=[],K=[],W=[],B=[],M=[],J=[],z=[],$=[],F=[],G=[],X=[],U=[],j=[],Y=[];var D,T=["wss://nostr.intu.xyz"];a&&T.unshift(a);let I=[];for(D of T)try{await Relay.connect(D),I.push(D);break}catch(e){console.error(`Error connecting to relay ${D}:`,e)}if(0===I.length)throw new Error("No relays available");let O=(await getPolybaseKey(d)).key,C=new SimplePool;try{C.subscribeMany(I,[{kinds:[1],since:Number(s)}],{onevent(e){e=JSON.parse(e.content);console.log("data : "+e.u),"simple_kappa_dealing_reshared_once"in e?(A[e.u]=e.simple_key_dealing_reshared_once,N[e.u]=e.simple_kappa_dealing_reshared_once,E[e.u]=e.simple_lambda_dealing_reshared_once,S[e.u]=1):"simple_key_opening_reshared_once"in e?(P[e.u]=e.simple_key_opening_reshared_once,K[e.u]=e.simple_kappa_opening_reshared_once,W[e.u]=e.simple_lambda_opening_reshared_once,B[e.u]=e.simple_key_dealing_reshared_twice,M[e.u]=e.simple_kappa_dealing_reshared,J[e.u]=e.transcript_key_reshared_once,z[e.u]=e.transcript_kappa_reshared_once,$[e.u]=e.transcript_lambda_reshared_once,k[e.u]=1):"simple_key_opening_reshared_twice"in e&&(F[e.u]=e.simple_key_opening_reshared_twice,G[e.u]=e.simple_kappa_opening_reshared_twice,X[e.u]=e.dealing_key_times_lambda_reshare,U[e.u]=e.dealing_kappa_times_lambda_reshare,j[e.u]=e.simple_key_transcript_reshared_twice,Y[e.u]=e.simple_kappa_transcript_reshared_twice,R[e.u]=1)}})}catch(e){console.error("Error subscribing to relays:",e)}p.includes(r)?(o=(await reshareStepOneByNewUser(_,v,b,u)).reshareDealings,c={u:b,simple_key_dealing_reshared_once:"",simple_kappa_dealing_reshared_once:o[0],simple_lambda_dealing_reshared_once:o[1]},a={kind:1,created_at:Math.floor(Date.now()/1e3),content:JSON.stringify(c),tags:[]},T=finalizeEvent(a,hexToBytes(String(O))),await C.publish(I,T),console.log("resharestep1done")):(s=await getUserSignature(e,t),p=await getUserRegistrationAllInfos(e,t.provider),r=JSON.parse(atob(p[b].step3Crypto))[0],o=(await reshareStepByOriginalGroup(_,v,b,s,r,u)).reshareDealings,c={u:b,simple_key_dealing_reshared_once:o[0],simple_kappa_dealing_reshared_once:o[1],simple_lambda_dealing_reshared_once:o[2]},a={kind:1,created_at:Math.floor(Date.now()/1e3),content:JSON.stringify(c),tags:[]},T=finalizeEvent(a,hexToBytes(String(O))),await C.publish(I,T));let x=!1,q=async()=>{try{var e,t,a,r,n,i,o,s,l,g,c,p;if(E.length===m&&B.length===m&&U.length===m&&U.every(e=>e&&0<e.length)&&(console.log("Completing"),x=!0),!x)if(console.log("Round1counter "+S.filter(Number).length),S.filter(Number).length!==m||P[b]?P[b]&&(k.filter(Number).length,m):(A=A.filter(e=>""!==e),N.includes("")&&(N=N.filter(e=>""!==e)),E.includes("")&&(E=E.filter(e=>""!==e)),{reshareOpenings:e,reshareDealings:t,reshareTranscripts:a}=await reshareStepTwo(_,v,b,u,d,h,A,y,N,E),r={u:b,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(O))),await C.publish(I,i),console.log("resharestep2done")),console.log("Round2counter "+k.filter(Number).length),k.filter(Number).length!==m||F[b]?U[b]&&R.filter(Number).length!==m&&console.log("You are all done! Waiting on others to perform step3 so we can complete vault"):(console.log("doingstep3"),{reshareOpenings:o,reshareDealings:s,reshareTranscripts:l}=await reshareStepThree(_,v,b,u,d,h,M,W,A,J[b],z[b]),g={u:b,simple_key_opening_reshared_twice:o[0],simple_kappa_opening_reshared_twice:o[1],dealing_key_times_lambda_reshare:s[0],dealing_kappa_times_lambda_reshare:s[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(O))),await C.publish(I,p),console.log("resharestep3done")),R.filter(Number).length===m)return console.log("EVERYONE IS DONE"),x=!0}catch(e){}return!0};return q(),await(async()=>{for(;!x;)if(await L(1e3),!await q()){console.log("❌ [AutoReg] bigUpdater returned false - max retries reached, exiting loop");break}return x})(),await C.close(I),!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{createIntuAccount,createPolybaseKey,preRegistration,automateRegistration,registerAllSteps,registerAllReshareSteps,completeVault,submitTransaction,submitTransactionSolana,signTx,combineSignedTx,getVaults,getVaultSingle,getVaultsWithoutTransactions,getVaultSingleWithDEOA,getAllTransactions,getTransaction,getTransactionLean,automateRotateRegistration,getProposal,getProposedUser,getUserCompletedRotationRegistrationCount};