storacha-sol
Version:
Crypto-native payments for storage on Storacha with SOL. No credit card needed.
2 lines • 3.96 kB
JavaScript
import{Connection as R}from"@solana/web3.js";import{PublicKey as D,Transaction as x,TransactionInstruction as I}from"@solana/web3.js";var{NODE_ENV:P}=process.env,h=P==="development"?"http://localhost:5040":"https://storacha-solana-sdk-bshc.onrender.com";async function U({file:r,duration:o,payer:s,connection:t,signTransaction:n}){try{let e=new FormData;e.append("file",r),e.append("duration",o.toString()),e.append("publicKey",s.toBase58());let w,g=await fetch(`${h}/api/solana/deposit`,{method:"POST",body:e});if(!g.ok)throw new Error("Failed to get deposit instructions");let i=await g.json();if(!i.instructions||!i.instructions.length)throw new Error("No instructions from deposit API");let m=await t.getLatestBlockhash("confirmed"),d=i.instructions[0],k=new I({programId:new D(d.programId),keys:d.keys.map(c=>({pubkey:new D(c.pubkey),isSigner:c.isSigner,isWritable:c.isWritable})),data:Buffer.from(d.data,"base64")}),p=new x;p.recentBlockhash=m.blockhash,p.feePayer=s,p.add(k);let v=await n(p),y=await t.sendRawTransaction(v.serialize(),{skipPreflight:!1,preflightCommitment:"confirmed"}),f=await t.confirmTransaction({signature:y,blockhash:m.blockhash,lastValidBlockHeight:m.lastValidBlockHeight},"confirmed");if(f.value.err)throw console.error("Failed to confirm this transaction:",f.value.err),new Error(`Transaction failed: ${JSON.stringify(f.value.err)}`);i.error&&(w=i.error),new FormData().append("file",r);let u=await fetch(`${h}/api/user/uploadFile?cid=${encodeURIComponent(i.cid)}`,{method:"POST",body:e});if(!u.ok){let c="Unknown error";try{let b=await u.json();c=b.message||b.error||c}catch{}throw new Error("Deposit API error: "+c)}let a=await u.json();return{signature:y,success:!0,cid:i.cid,url:a.object.url,message:a.object.message,fileInfo:a.object?{filename:a.object.fileInfo?.filename||"",size:a?.object?.fileInfo?.size||0,uploadedAt:a?.object?.fileInfo?.uploadedAt||"",type:a?.object?.fileInfo?.type||""}:void 0}}catch(e){return console.error(e),e instanceof Error&&(console.error("Error name:",e.name),console.error("Error message:",e.message),console.error("Error stack:",e.stack)),{signature:"",success:!1,cid:"",url:"",message:"",fileInfo:void 0,error:e instanceof Error?e.message:"Unknown error occurred"}}}async function E(r,o={}){if(!r||typeof r!="string")throw new Error("User address is required and must be a string");let s=o.url||"http://localhost:3000";try{let t=await fetch(`${s}/getUserUploadHistory?userAddress=${encodeURIComponent(r)}`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok){let e=await t.json().catch(()=>({}));throw new Error(e.message||`Failed to fetch deposit history: ${t.status} ${t.statusText}`)}let n=await t.json();if(typeof n!="object"||n===null)throw new Error("Invalid response format from server");if(typeof n.userAddress!="string")throw new Error("Invalid userAddress in response");return n}catch(t){throw t instanceof Error?t:new Error("Unknown error occurred while fetching deposit history")}}var S=(t=>(t.mainnet="mainnet-beta",t.testnet="testnet",t.devnet="devnet",t))(S||{});function T(r){switch(r){case"mainnet-beta":return"https://api.mainnet-beta.solana.com";case"testnet":return"https://api.testnet.solana.com";case"devnet":return"https://api.devnet.solana.com";default:throw new Error(`Unsupported environment: ${r}`)}}var l=class{constructor(o){this.estimateStorageCost=(o,s)=>{let e=o.size*s*1e3;return{sol:e/1e9,lamports:e}};this.rpcUrl=T(o.environment)}async createDeposit({payer:o,file:s,durationDays:t,signTransaction:n}){console.log("Creating deposit transaction with environment:",this.rpcUrl);let e=new R(this.rpcUrl,"confirmed");return await U({file:s,duration:t*86400,payer:o,connection:e,signTransaction:n})}async getUserUploadHistory(o){return await E(o)}};var q=r=>new l({environment:r||"testnet"});export{l as Client,S as Environment,U as createDepositTxn,E as fetchUserDepositHistory,T as getRpcUrl,q as useDeposit};
//# sourceMappingURL=index.js.map