storacha-sol 0.0.8 → 0.1.0

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 CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var P=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var _=Object.prototype.hasOwnProperty;var H=(r,e)=>{for(var o in e)P(r,o,{get:e[o],enumerable:!0})},L=(r,e,o,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of B(e))!_.call(r,n)&&n!==o&&P(r,n,{get:()=>e[n],enumerable:!(t=F(e,n))||t.enumerable});return r};var q=r=>L(P({},"__esModule",{value:!0}),r);var M={};H(M,{Client:()=>g,Environment:()=>$,createDepositTxn:()=>D,fetchUserDepositHistory:()=>C,fetchUserUploadHistory:()=>C,getRpcUrl:()=>N,getStorageRenewalCost:()=>I,getUserUploadHistory:()=>C,renewStorageTxn:()=>k,useDeposit:()=>z,useUpload:()=>z});module.exports=q(M);var x=require("@solana/web3.js");var l=typeof window<"u"&&window.location.hostname==="localhost"?"http://localhost:5040":"https://storacha-solana-sdk-bshc.onrender.com",O=86400,j=1e9;var p=require("@solana/web3.js");async function D({file:r,duration:e,payer:o,connection:t,signTransaction:n,userEmail:i}){try{let a=new FormData;r.forEach(s=>a.append("file",s)),a.append("duration",e.toString()),a.append("publicKey",o.toBase58()),i&&a.append("userEmail",i);let d=r.length>1,y,m=await fetch(`${l}/api/solana/deposit`,{method:"POST",body:a});if(!m.ok)throw new Error("Failed to get deposit instructions");let c=await m.json();if(!c.instructions||!c.instructions.length)throw new Error("No instructions from deposit API");let S=await t.getLatestBlockhash("confirmed"),u=c.instructions[0],w=new p.TransactionInstruction({programId:new p.PublicKey(u.programId),keys:u.keys.map(s=>({pubkey:new p.PublicKey(s.pubkey),isSigner:s.isSigner,isWritable:s.isWritable})),data:Buffer.from(u.data,"base64")}),b=new p.Transaction;b.recentBlockhash=S.blockhash,b.feePayer=o,b.add(w);let v=await n(b),R;try{R=await t.sendRawTransaction(v.serialize(),{skipPreflight:!1,preflightCommitment:"confirmed"})}catch(s){throw s instanceof p.SendTransactionError?(s.logs??[]).some(A=>A.includes("already in use"))?new Error("This file has already been uploaded. You can find it in your dashboard."):new Error("Transaction failed during simulation. Please try again."):s}let E=await t.confirmTransaction({signature:R,blockhash:S.blockhash,lastValidBlockHeight:S.lastValidBlockHeight},"confirmed");if(E.value.err)throw console.error("Failed to confirm this transaction:",E.value.err),new Error(`Transaction failed: ${JSON.stringify(E.value.err)}`);try{await fetch(`${l}/api/user/update-transaction-hash`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cid:c.cid,transactionHash:R})})}catch(s){console.warn("Failed to update transaction hash:",s)}c.error&&(y=c.error);let U=new FormData;r.forEach(s=>U.append("file",s));let h;if(d?h=await fetch(`${l}/api/user/upload-files?cid=${encodeURIComponent(c.cid)}`,{method:"POST",body:U}):h=await fetch(`${l}/api/user/upload-file?cid=${encodeURIComponent(c.cid)}`,{method:"POST",body:U}),!h.ok){let s="Unknown error";try{let T=await h.json();s=T.message||T.error||s}catch{}throw new Error("Deposit API error: "+s)}let f=await h?.json();return{signature:R,success:!0,cid:c.cid,url:f.object.url,message:f.object.message,fileInfo:f.object?{filename:f.object.fileInfo?.filename||"",size:f?.object?.fileInfo?.size||0,uploadedAt:f?.object?.fileInfo?.uploadedAt||"",type:f?.object?.fileInfo?.type||""}:void 0}}catch(a){return console.error(a),a instanceof Error&&(console.error("Error name:",a.name),console.error("Error message:",a.message),console.error("Error stack:",a.stack)),{signature:"",success:!1,cid:"",url:"",message:"",fileInfo:void 0,error:a instanceof Error?a.message:"Unknown error occurred"}}}async function I(r,e){try{let o=await fetch(`${l}/api/user/renewal-cost?cid=${encodeURIComponent(r)}&duration=${e}`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!o.ok){let t=await o.json();throw new Error(t.message||"Failed to get storage renewal cost")}return await o.json()}catch(o){return console.error("Failed to get storage renewal cost",o),null}}async function k({cid:r,duration:e,payer:o,connection:t,signTransaction:n}){let i=await fetch(`${l}/api/user/renew-storage`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cid:r,duration:e,publicKey:o.toString()})});if(!i.ok){let u=await i.json().catch(()=>({}));throw new Error(u.message||"Failed to create renewal transaction")}let a=await i.json(),d=new p.Transaction;a.instructions.forEach(u=>{d.add({programId:new p.PublicKey(u.programId),keys:u.keys.map(w=>({pubkey:new p.PublicKey(w.pubkey),isSigner:w.isSigner,isWritable:w.isWritable})),data:Buffer.from(u.data,"base64")})});let{blockhash:y}=await t.getLatestBlockhash();d.recentBlockhash=y,d.feePayer=o;let m=await n(d),c=await t.sendRawTransaction(m.serialize());return await t.confirmTransaction(c,"confirmed"),(await fetch(`${l}/api/user/confirm-renewal`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cid:r,duration:e,transactionHash:c})})).ok||console.error("Failed to confirm renewal"),{success:!0,cid:r,signature:c,url:`https://w3s.link/ipfs/${r}`,message:"Storage renewed successfully"}}async function C(r,e={}){if(!r||typeof r!="string")throw new Error("User address is required and must be a string");let o=e.url||l;try{let t=await fetch(`${o}/api/user/user-upload-history?userAddress=${encodeURIComponent(r)}`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok){let i=await t.json().catch(()=>({}));throw new Error(i.message||`Failed to fetch upload 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 upload history")}}var $=(t=>(t.mainnet="mainnet-beta",t.testnet="testnet",t.devnet="devnet",t))($||{});function N(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 g=class{constructor(e){this.rpcUrl=N(e.environment)}async createDeposit({payer:e,file:o,durationDays:t,signTransaction:n,userEmail:i}){console.log("Creating deposit transaction with environment:",this.rpcUrl);let a=new x.Connection(this.rpcUrl,"confirmed");return await D({file:o,duration:t*O,payer:e,connection:a,signTransaction:n,userEmail:i})}async estimateStorageCost(e,o){let t=e.reduce((m,c)=>m+c.size,0),n=Math.floor(o/86400),i=await fetch(`${l}/api/user/get-quote?size=${t}&duration=${n}`);if(!i.ok)throw new Error("Failed to get storage cost estimate");let{quote:a}=await i.json(),d=a.totalCost;return{sol:d/j,lamports:d}}async getUserUploadHistory(e){return await C(e)}async getStorageRenewalCost(e,o){return await I(e,o)}async renewStorageDuration({cid:e,duration:o,payer:t,signTransaction:n}){let i=new x.Connection(this.rpcUrl,"confirmed");return await k({cid:e,duration:o,payer:t,connection:i,signTransaction:n})}async getSolPrice(){let e=await fetch(`${l}/api/user/sol-price`);if(!e.ok)throw new Error("Couldn't fetch SOL price");return(await e.json()).price}};var z=r=>new g({environment:r||"testnet"});0&&(module.exports={Client,Environment,createDepositTxn,fetchUserDepositHistory,fetchUserUploadHistory,getRpcUrl,getStorageRenewalCost,getUserUploadHistory,renewStorageTxn,useDeposit,useUpload});
1
+ "use strict";var C=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var q=Object.prototype.hasOwnProperty;var z=(o,e)=>{for(var r in e)C(o,r,{get:e[r],enumerable:!0})},M=(o,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of H(e))!q.call(o,t)&&t!==r&&C(o,t,{get:()=>e[t],enumerable:!(n=_(e,t))||n.enumerable});return o};var K=o=>M(C({},"__esModule",{value:!0}),o);var W={};z(W,{Client:()=>y,Environment:()=>A,createDepositTxn:()=>D,fetchUserDepositHistory:()=>O,fetchUserUploadHistory:()=>O,getRpcUrl:()=>N,getStorageRenewalCost:()=>I,getUserUploadHistory:()=>O,renewStorageTxn:()=>x,useDeposit:()=>J,useUpload:()=>J});module.exports=K(W);var j=require("@solana/web3.js");var U={local:"http://localhost:5040",staging:"https://storacha-solana-sdk-o9t9.onrender.com",production:"https://keep-sdk-prod.onrender.com"};function v(o){let e=o.toLowerCase();return e.includes("localhost")||e.includes("127.0.0.1")?U.local:e.includes("mainnet")?U.production:e.includes("testnet")||e.includes("devnet")?U.staging:U.production}var $=86400,F=1e9;var l=require("@solana/web3.js");async function D(o,e){let{file:r,duration:n,payer:t,connection:s,signTransaction:p,userEmail:d}=o;try{let i=new FormData;r.forEach(a=>i.append("file",a)),i.append("duration",n.toString()),i.append("publicKey",t.toBase58()),d&&i.append("userEmail",d);let f=r.length>1,g,S=await fetch(`${e}/api/solana/deposit`,{method:"POST",body:i});if(!S.ok)throw new Error("Failed to get deposit instructions");let c=await S.json();if(!c.instructions||!c.instructions.length)throw new Error("No instructions from deposit API");let E=await s.getLatestBlockhash("confirmed"),u=c.instructions[0],h=new l.TransactionInstruction({programId:new l.PublicKey(u.programId),keys:u.keys.map(a=>({pubkey:new l.PublicKey(a.pubkey),isSigner:a.isSigner,isWritable:a.isWritable})),data:Buffer.from(u.data,"base64")}),b=new l.Transaction;b.recentBlockhash=E.blockhash,b.feePayer=t,b.add(h);let B=await p(b),R;try{R=await s.sendRawTransaction(B.serialize(),{skipPreflight:!1,preflightCommitment:"confirmed"})}catch(a){throw a instanceof l.SendTransactionError?(a.logs??[]).some(L=>L.includes("already in use"))?new Error("This file has already been uploaded. You can find it in your dashboard."):new Error("Transaction failed during simulation. Please try again."):a}let T=await s.confirmTransaction({signature:R,blockhash:E.blockhash,lastValidBlockHeight:E.lastValidBlockHeight},"confirmed");if(T.value.err)throw console.error("Failed to confirm this transaction:",T.value.err),new Error(`Transaction failed: ${JSON.stringify(T.value.err)}`);try{await fetch(`${e}/api/user/update-transaction-hash`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cid:c.cid,transactionHash:R})})}catch(a){console.warn("Failed to update transaction hash:",a)}c.error&&(g=c.error);let k=new FormData;r.forEach(a=>k.append("file",a));let w;if(f?w=await fetch(`${e}/api/user/upload-files?cid=${encodeURIComponent(c.cid)}`,{method:"POST",body:k}):w=await fetch(`${e}/api/user/upload-file?cid=${encodeURIComponent(c.cid)}`,{method:"POST",body:k}),!w.ok){let a="Unknown error";try{let P=await w.json();a=P.message||P.error||a}catch{}throw new Error("Deposit API error: "+a)}let m=await w?.json();return{signature:R,success:!0,cid:c.cid,url:m.object.url,message:m.object.message,fileInfo:m.object?{filename:m.object.fileInfo?.filename||"",size:m?.object?.fileInfo?.size||0,uploadedAt:m?.object?.fileInfo?.uploadedAt||"",type:m?.object?.fileInfo?.type||""}:void 0}}catch(i){return console.error(i),i instanceof Error&&(console.error("Error name:",i.name),console.error("Error message:",i.message),console.error("Error stack:",i.stack)),{signature:"",success:!1,cid:"",url:"",message:"",fileInfo:void 0,error:i instanceof Error?i.message:"Unknown error occurred"}}}async function I(o,e,r){try{let n=await fetch(`${r}/api/user/renewal-cost?cid=${encodeURIComponent(o)}&duration=${e}`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!n.ok){let t=await n.json();throw new Error(t.message||"Failed to get storage renewal cost")}return await n.json()}catch(n){return console.error("Failed to get storage renewal cost",n),null}}async function x(o,e){let{cid:r,duration:n,payer:t,connection:s,signTransaction:p}=o,d=await fetch(`${e}/api/user/renew-storage`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cid:r,duration:n,publicKey:t.toString()})});if(!d.ok){let u=await d.json().catch(()=>({}));throw new Error(u.message||"Failed to create renewal transaction")}let i=await d.json(),f=new l.Transaction;i.instructions.forEach(u=>{f.add({programId:new l.PublicKey(u.programId),keys:u.keys.map(h=>({pubkey:new l.PublicKey(h.pubkey),isSigner:h.isSigner,isWritable:h.isWritable})),data:Buffer.from(u.data,"base64")})});let{blockhash:g}=await s.getLatestBlockhash();f.recentBlockhash=g,f.feePayer=t;let S=await p(f),c=await s.sendRawTransaction(S.serialize());return await s.confirmTransaction(c,"confirmed"),(await fetch(`${e}/api/user/confirm-renewal`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cid:r,duration:n,transactionHash:c})})).ok||console.error("Failed to confirm renewal"),{success:!0,cid:r,signature:c,url:`https://w3s.link/ipfs/${r}`,message:"Storage renewed successfully"}}async function O(o,e,r={}){if(!o||typeof o!="string")throw new Error("User address is required and must be a string");let n=r.url||e;try{let t=await fetch(`${n}/api/user/user-upload-history?userAddress=${encodeURIComponent(o)}`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok){let p=await t.json().catch(()=>({}));throw new Error(p.message||`Failed to fetch upload history: ${t.status} ${t.statusText}`)}let s=await t.json();if(typeof s!="object"||s===null)throw new Error("Invalid response format from server");if(typeof s.userAddress!="string")throw new Error("Invalid userAddress in response");return s}catch(t){throw t instanceof Error?t:new Error("Unknown error occurred while fetching upload history")}}var A=(n=>(n.mainnet="mainnet-beta",n.testnet="testnet",n.devnet="devnet",n))(A||{});function N(o){switch(o){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: ${o}`)}}var y=class{constructor(e){this.rpcUrl=N(e.environment),this.apiEndpoint=v(this.rpcUrl)}async createDeposit({payer:e,file:r,durationDays:n,signTransaction:t,userEmail:s}){console.log("Creating deposit transaction with environment:",this.rpcUrl);let p=new j.Connection(this.rpcUrl,"confirmed");return await D({file:r,duration:n*$,payer:e,connection:p,signTransaction:t,userEmail:s},this.apiEndpoint)}async estimateStorageCost(e,r){let n=e.reduce((f,g)=>f+g.size,0),t=Math.floor(r/86400),s=await fetch(`${this.apiEndpoint}/api/user/get-quote?size=${n}&duration=${t}`);if(!s.ok)throw new Error("Failed to get storage cost estimate");let{quote:p}=await s.json(),d=p.totalCost;return{sol:d/F,lamports:d}}async getUserUploadHistory(e){return await O(e,this.apiEndpoint)}async getStorageRenewalCost(e,r){return await I(e,r,this.apiEndpoint)}async renewStorageDuration({cid:e,duration:r,payer:n,signTransaction:t}){let s=new j.Connection(this.rpcUrl,"confirmed");return await x({cid:e,duration:r,payer:n,connection:s,signTransaction:t},this.apiEndpoint)}async getSolPrice(){let e=await fetch(`${this.apiEndpoint}/api/user/sol-price`);if(!e.ok)throw new Error("Couldn't fetch SOL price");return(await e.json()).price}};var J=o=>new y({environment:o||"testnet"});0&&(module.exports={Client,Environment,createDepositTxn,fetchUserDepositHistory,fetchUserUploadHistory,getRpcUrl,getStorageRenewalCost,getUserUploadHistory,renewStorageTxn,useDeposit,useUpload});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/constants.ts","../src/payment.ts","../src/upload-history.ts","../src/hooks.ts"],"sourcesContent":["export * from './client';\nexport * from './hooks';\nexport * from './payment';\nexport * from './types';\nexport * from './upload-history';\n","import { Connection, PublicKey } from '@solana/web3.js';\nimport {\n DAY_TIME_IN_SECONDS,\n ENDPOINT,\n ONE_BILLION_LAMPORTS,\n} from './constants';\nimport {\n createDepositTxn,\n getStorageRenewalCost,\n renewStorageTxn,\n} from './payment';\nimport {\n CreateDepositArgs,\n StorageRenewalCost,\n StorageRenewalParams,\n UploadResult,\n} from './types';\nimport { getUserUploadHistory } from './upload-history';\n\nexport enum Environment {\n mainnet = 'mainnet-beta',\n testnet = 'testnet',\n devnet = 'devnet',\n}\n\nexport function getRpcUrl(env: Environment): string {\n switch (env) {\n case Environment.mainnet:\n return 'https://api.mainnet-beta.solana.com';\n case Environment.testnet:\n return 'https://api.testnet.solana.com';\n case Environment.devnet:\n return 'https://api.devnet.solana.com';\n default:\n throw new Error(`Unsupported environment: ${env}`);\n }\n}\n\nexport interface ClientOptions {\n /** Solana RPC endpoint to use for chain interactions */\n environment: Environment;\n}\n\nexport interface UploadParams extends Pick<\n CreateDepositArgs,\n 'signTransaction' | 'userEmail'\n> {\n /** Wallet public key of the payer */\n payer: PublicKey;\n /** File(s) to be stored */\n file: File[];\n /** Duration in days to store the data */\n durationDays: number;\n}\n\n/**\n * @deprecated Use {@link UploadParams} instead.\n */\nexport type DepositParams = UploadParams;\n\n/**\n * Solana Storage Client — simplified (no fee estimation)\n */\nexport class Client {\n private rpcUrl: string;\n\n constructor(options: ClientOptions) {\n this.rpcUrl = getRpcUrl(options.environment);\n }\n\n /**\n * Creates a deposit transaction ready to be signed & sent by user's wallet.\n *\n * @param {Object} params\n * @param {PublicKey} params.payer - The public key (wallet address) of the connected wallet.\n * @param {File} params.file - The file to be uploaded.\n * @param {number} params.durationDays - How long (in days) the file should be stored.\n * @param {(tx: Transaction) => Promise<Transaction>} params.signTransaction -\n * A callback function to authorize the transaction via the Solana wallet library.\n *\n * @example\n * const { publicKey, signTransaction } = useSolanaWallet();\n * const result = await createDeposit({\n * payer: publicKey,\n * file,\n * durationDays: 30,\n * signTransaction,\n * });\n *\n * @returns {Promise<UploadResult>} The upload result after transaction is processed.\n */\n async createDeposit({\n payer,\n file,\n durationDays,\n signTransaction,\n userEmail,\n }: UploadParams): Promise<UploadResult> {\n console.log('Creating deposit transaction with environment:', this.rpcUrl);\n const connection = new Connection(this.rpcUrl, 'confirmed');\n\n return await createDepositTxn({\n file,\n duration: durationDays * DAY_TIME_IN_SECONDS,\n payer,\n connection,\n signTransaction,\n userEmail,\n });\n }\n\n /**\n * estimates the cost for a file based on the amount of days it should be stored for\n * @param {File} file - a file to be uploaded\n * @param {number} duration - how long (in seconds) the file should be stored for\n */\n async estimateStorageCost(file: File[], duration: number) {\n const fileSizeInBytes = file.reduce((acc, f) => acc + f.size, 0);\n const durationInDays = Math.floor(duration / 86400); // convert seconds to day\n\n const response = await fetch(\n `${ENDPOINT}/api/user/get-quote?size=${fileSizeInBytes}&duration=${durationInDays}`\n );\n\n if (!response.ok) throw new Error('Failed to get storage cost estimate');\n\n const { quote } = await response.json();\n const totalLamports = quote.totalCost;\n const totalSOL = totalLamports / ONE_BILLION_LAMPORTS;\n\n return {\n sol: totalSOL,\n lamports: totalLamports,\n };\n }\n\n async getUserUploadHistory(userAddress: string) {\n const response = await getUserUploadHistory(userAddress);\n return response;\n }\n\n /**\n * Get cost estimate for renewing storage duration\n *\n * @param {string} cid - Content identifier of the file to renew\n * @param {number} duration - Number of additional days to extend storage\n *\n * @example\n * const quote = await client.getRenewalQuote('bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi', 30);\n * console.log(`Renewal cost: ${quote.costInSOL} SOL`);\n *\n * @returns {Promise<StorageRenewalCost | null>} Cost breakdown and expiration details\n */\n async getStorageRenewalCost(\n cid: string,\n duration: number\n ): Promise<StorageRenewalCost | null> {\n return await getStorageRenewalCost(cid, duration);\n }\n\n /**\n * Renew storage for an existing deposit\n *\n * @param {Object} params\n * @param {string} params.cid - Content identifier of the file to renew\n * @param {number} params.duration - Number of additional days to extend storage\n * @param {PublicKey} params.payer - Wallet public key paying for the renewal\n * @param {(tx: Transaction) => Promise<Transaction>} params.signTransaction - Transaction signing callback\n *\n * @example\n * const { publicKey, signTransaction } = useSolanaWallet();\n * const result = await client.renewStorage({\n * cid: 'bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi',\n * duration: 30,\n * payer: publicKey,\n * signTransaction,\n * });\n *\n * @returns {Promise<UploadResult>} Result of the renewal transaction\n */\n async renewStorageDuration({\n cid,\n duration,\n payer,\n signTransaction,\n }: StorageRenewalParams): Promise<UploadResult> {\n const connection = new Connection(this.rpcUrl, 'confirmed');\n\n return await renewStorageTxn({\n cid,\n duration,\n payer,\n connection,\n signTransaction,\n });\n }\n\n /**\n * Gets the current SOL/USD price\n *\n * @example\n * const { price } = await client.getSolPrice();\n * console.log(`SOL price: $${price}`);\n *\n * @returns {Promise<{ price: number }>} Current SOL price in USD\n */\n async getSolPrice(): Promise<{ price: number }> {\n const request = await fetch(`${ENDPOINT}/api/user/sol-price`);\n if (!request.ok) throw new Error(\"Couldn't fetch SOL price\");\n const data = await request.json();\n return data.price;\n }\n}\n","export const ENDPOINT =\n typeof window !== 'undefined' && window.location.hostname === 'localhost'\n ? 'http://localhost:5040'\n : 'https://storacha-solana-sdk-bshc.onrender.com';\n\nexport const DAY_TIME_IN_SECONDS = 86400;\n\n/** 1 SOL in Lamports */\nexport const ONE_BILLION_LAMPORTS = 1_000_000_000;\n","import { Signature } from '@solana/kit';\nimport {\n PublicKey,\n SendTransactionError,\n Transaction,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport { ENDPOINT } from './constants';\nimport {\n CreateDepositArgs,\n DepositResult,\n RenewStorageDurationArgs,\n StorageRenewalCost,\n StorageRenewalResult,\n UploadResult,\n} from './types';\n\n/**\n * Calls the deposit API for on-chain storage and returns a Transaction\n * which must be signed and sent externally by the user.\n *\n * @param params - {\n * cid: string;\n * file: File;\n * duration: number;\n * payer: PublicKey;\n * connection: Connection;\n * }\n * @returns Transaction\n */\nexport async function createDepositTxn({\n file,\n duration,\n payer,\n connection,\n signTransaction,\n userEmail,\n}: CreateDepositArgs): Promise<UploadResult> {\n try {\n const formData = new FormData();\n file.forEach((f) => formData.append('file', f));\n formData.append('duration', duration.toString());\n formData.append('publicKey', payer.toBase58());\n if (userEmail) {\n formData.append('userEmail', userEmail);\n }\n\n const isMultipleFiles = file.length > 1;\n\n let uploadErr;\n\n const depositReq = await fetch(`${ENDPOINT}/api/solana/deposit`, {\n method: 'POST',\n body: formData,\n });\n if (!depositReq.ok) throw new Error('Failed to get deposit instructions');\n\n const depositRes: DepositResult = await depositReq.json();\n if (!depositRes.instructions || !depositRes.instructions.length)\n throw new Error('No instructions from deposit API');\n\n const latestBlockhash = await connection.getLatestBlockhash('confirmed');\n const instructions = depositRes.instructions[0];\n\n const depositInstruction = new TransactionInstruction({\n programId: new PublicKey(instructions.programId),\n keys: instructions.keys.map((k) => ({\n pubkey: new PublicKey(k.pubkey),\n isSigner: k.isSigner,\n isWritable: k.isWritable,\n })),\n data: Buffer.from(instructions.data, 'base64'),\n });\n\n const tx = new Transaction();\n tx.recentBlockhash = latestBlockhash.blockhash;\n tx.feePayer = payer;\n tx.add(depositInstruction);\n\n const signedTx = await signTransaction(tx);\n let signature: string;\n\n try {\n signature = await connection.sendRawTransaction(signedTx.serialize(), {\n skipPreflight: false, // not sure we should be disabling this verification step\n preflightCommitment: 'confirmed',\n });\n } catch (err) {\n if (err instanceof SendTransactionError) {\n const logs = err.logs ?? [];\n\n const isDuplicateUpload = logs.some((log) =>\n log.includes('already in use')\n );\n\n if (isDuplicateUpload) {\n throw new Error(\n 'This file has already been uploaded. You can find it in your dashboard.'\n );\n }\n\n throw new Error(\n 'Transaction failed during simulation. Please try again.'\n );\n }\n\n throw err;\n }\n const confirmation = await connection.confirmTransaction(\n {\n signature,\n blockhash: latestBlockhash.blockhash,\n lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,\n },\n 'confirmed'\n );\n\n if (confirmation.value.err) {\n console.error(\n 'Failed to confirm this transaction:',\n confirmation.value.err\n );\n throw new Error(\n `Transaction failed: ${JSON.stringify(confirmation.value.err)}`\n );\n }\n\n try {\n await fetch(`${ENDPOINT}/api/user/update-transaction-hash`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n cid: depositRes.cid,\n transactionHash: signature,\n }),\n });\n } catch (err) {\n console.warn('Failed to update transaction hash:', err);\n }\n\n if (depositRes.error) {\n uploadErr = depositRes.error;\n }\n\n const uploadForm = new FormData();\n file.forEach((f) => uploadForm.append('file', f));\n\n let fileUploadReq;\n // calls the upload functionality on our server with the file when deposit is successful\n if (isMultipleFiles) {\n fileUploadReq = await fetch(\n `${ENDPOINT}/api/user/upload-files?cid=${encodeURIComponent(\n depositRes.cid\n )}`,\n {\n method: 'POST',\n body: uploadForm,\n }\n );\n } else {\n fileUploadReq = await fetch(\n `${ENDPOINT}/api/user/upload-file?cid=${encodeURIComponent(\n depositRes.cid\n )}`,\n {\n method: 'POST',\n body: uploadForm,\n }\n );\n }\n\n if (!fileUploadReq.ok) {\n let err = 'Unknown error';\n try {\n const data: DepositResult = await fileUploadReq.json();\n err = data.message || data.error || err;\n } catch {}\n throw new Error('Deposit API error: ' + err);\n }\n\n const fileUploadRes: Pick<DepositResult, 'object' | 'cid' | 'message'> =\n await fileUploadReq?.json();\n\n return {\n signature: signature as Signature,\n success: true,\n cid: depositRes.cid,\n url: fileUploadRes.object.url,\n message: fileUploadRes.object.message,\n fileInfo: fileUploadRes.object\n ? {\n filename: fileUploadRes.object.fileInfo?.filename || '',\n size: fileUploadRes?.object?.fileInfo?.size || 0,\n uploadedAt: fileUploadRes?.object?.fileInfo?.uploadedAt || '',\n type: fileUploadRes?.object?.fileInfo?.type || '',\n }\n : undefined,\n };\n } catch (error) {\n console.error(error);\n if (error instanceof Error) {\n console.error('Error name:', error.name);\n console.error('Error message:', error.message);\n console.error('Error stack:', error.stack);\n }\n\n return {\n signature: '' as Signature,\n success: false,\n cid: '',\n url: '',\n message: '',\n fileInfo: undefined,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n}\n\n/**\n * Get cost estimate for renewing storage duration\n *\n * @param {string} cid - Content identifier of the uploaded data to renew\n * @param {number} duration - Number of additional days to extend storage\n *\n * @example\n * const quote = await client.getRenewalQuote('bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi', 30);\n * console.log(`Renewal cost: ${quote.costInSOL} SOL`);\n *\n * @returns {Promise<StorageRenewalCost | null>} Cost breakdown and expiration details\n */\nexport async function getStorageRenewalCost(\n cid: string,\n duration: number\n): Promise<StorageRenewalCost | null> {\n try {\n const request = await fetch(\n `${ENDPOINT}/api/user/renewal-cost?cid=${encodeURIComponent(\n cid\n )}&duration=${duration}`,\n {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n if (!request.ok) {\n const response = await request.json();\n throw new Error(response.message || 'Failed to get storage renewal cost');\n }\n\n return await request.json();\n } catch (error) {\n console.error('Failed to get storage renewal cost', error);\n return null;\n }\n}\n\n/**\n * Renew storage for an existing deposit\n *\n * @param {Object} params\n * @param {string} params.cid - Content identifier of the uploaded data to renew\n * @param {number} params.duration - Number of additional days to extend storage\n * @param {PublicKey} params.payer - Wallet public key paying for the renewal\n * @param {(tx: Transaction) => Promise<Transaction>} params.signTransaction - Transaction signing callback\n *\n * @example\n * const { publicKey, signTransaction } = useSolanaWallet();\n * const result = await client.renewStorage({\n * cid: 'bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi',\n * additionalDays: 30,\n * payer: publicKey,\n * signTransaction,\n * });\n *\n * @returns {Promise<UploadResult>} Result of the renewal transaction\n */\nexport async function renewStorageTxn({\n cid,\n duration,\n payer,\n connection,\n signTransaction,\n}: RenewStorageDurationArgs): Promise<UploadResult> {\n const renewalTransactionIx = await fetch(\n `${ENDPOINT}/api/user/renew-storage`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n cid,\n duration,\n publicKey: payer.toString(),\n }),\n }\n );\n\n if (!renewalTransactionIx.ok) {\n const errorData = await renewalTransactionIx.json().catch(() => ({}));\n throw new Error(\n errorData.message || 'Failed to create renewal transaction'\n );\n }\n\n const renewalData: StorageRenewalResult = await renewalTransactionIx.json();\n const transaction = new Transaction();\n\n renewalData.instructions.forEach((ix) => {\n transaction.add({\n programId: new PublicKey(ix.programId),\n keys: ix.keys.map((key) => ({\n pubkey: new PublicKey(key.pubkey),\n isSigner: key.isSigner,\n isWritable: key.isWritable,\n })),\n data: Buffer.from(ix.data, 'base64'),\n });\n });\n\n const { blockhash } = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockhash;\n transaction.feePayer = payer;\n\n const signed = await signTransaction(transaction);\n const signature = await connection.sendRawTransaction(signed.serialize());\n await connection.confirmTransaction(signature, 'confirmed');\n\n const confirmRenewalTx = await fetch(`${ENDPOINT}/api/user/confirm-renewal`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n cid,\n duration,\n transactionHash: signature,\n }),\n });\n\n if (!confirmRenewalTx.ok) {\n console.error('Failed to confirm renewal');\n }\n\n return {\n success: true,\n cid,\n signature: signature as Signature,\n url: `https://w3s.link/ipfs/${cid}`,\n message: 'Storage renewed successfully',\n };\n}\n","import { ENDPOINT } from './constants';\nimport { ServerOptions, UploadHistoryResponse } from './types';\n\n/**\n * Get the upload history for a given user address from the server\n *\n * @param userAddress - The wallet address of the user to fetch upload history for\n * @param options - Optional server configuration\n * @returns Promise<UploadHistoryResponse> - The user's upload history\n *\n * @example\n * ```typescript\n * const history = await getUserUploadHistory('9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM');\n * console.log('User upload history:', history.userHistory);\n * ```\n *\n * @throws {Error} When the user address is invalid or the request fails\n */\nexport async function getUserUploadHistory(\n userAddress: string,\n options: ServerOptions = {}\n): Promise<UploadHistoryResponse> {\n // Validate user address\n if (!userAddress || typeof userAddress !== 'string') {\n throw new Error('User address is required and must be a string');\n }\n\n // Use ENDPOINT constant, or allow override via options\n const baseUrl = options.url || ENDPOINT;\n\n try {\n const response = await fetch(\n `${baseUrl}/api/user/user-upload-history?userAddress=${encodeURIComponent(userAddress)}`,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n errorData.message ||\n `Failed to fetch upload history: ${response.status} ${response.statusText}`\n );\n }\n\n const data: UploadHistoryResponse = await response.json();\n\n // Validate response structure\n if (typeof data !== 'object' || data === null) {\n throw new Error('Invalid response format from server');\n }\n\n if (typeof data.userAddress !== 'string') {\n throw new Error('Invalid userAddress in response');\n }\n\n return data;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error('Unknown error occurred while fetching upload history');\n }\n}\n\n/**\n * @deprecated Use getUserUploadHistory instead\n */\nexport { getUserUploadHistory as fetchUserUploadHistory };\n\n/**\n * @deprecated Use getUserUploadHistory instead\n */\nexport { getUserUploadHistory as fetchUserDepositHistory };\n","import { Client, ClientOptions } from './client';\n\nexport const useUpload = (environment: ClientOptions['environment']) => {\n const client = new Client({ environment: environment || 'testnet' });\n return client;\n};\n\n/**\n * @deprecated Use {@link useUpload} instead.\n */\nexport { useUpload as useDeposit };\n"],"mappings":"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","names":["index_exports","__export","Client","Environment","createDepositTxn","getUserUploadHistory","getRpcUrl","getStorageRenewalCost","renewStorageTxn","useUpload","__toCommonJS","import_web3","ENDPOINT","DAY_TIME_IN_SECONDS","ONE_BILLION_LAMPORTS","import_web3","createDepositTxn","file","duration","payer","connection","signTransaction","userEmail","formData","f","isMultipleFiles","uploadErr","depositReq","ENDPOINT","depositRes","latestBlockhash","instructions","depositInstruction","k","tx","signedTx","signature","err","log","confirmation","uploadForm","fileUploadReq","data","fileUploadRes","error","getStorageRenewalCost","cid","request","response","renewStorageTxn","renewalTransactionIx","errorData","renewalData","transaction","ix","key","blockhash","signed","getUserUploadHistory","userAddress","options","baseUrl","ENDPOINT","response","errorData","data","error","Environment","getRpcUrl","env","Client","options","payer","file","durationDays","signTransaction","userEmail","connection","createDepositTxn","DAY_TIME_IN_SECONDS","duration","fileSizeInBytes","acc","f","durationInDays","response","ENDPOINT","quote","totalLamports","ONE_BILLION_LAMPORTS","userAddress","getUserUploadHistory","cid","getStorageRenewalCost","renewStorageTxn","request","useUpload","environment","Client"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/constants.ts","../src/payment.ts","../src/upload-history.ts","../src/hooks.ts"],"sourcesContent":["export * from './client';\nexport * from './hooks';\nexport * from './payment';\nexport * from './types';\nexport * from './upload-history';\n","import { Connection, PublicKey } from '@solana/web3.js';\nimport {\n DAY_TIME_IN_SECONDS,\n getEndpointForRpc,\n ONE_BILLION_LAMPORTS,\n} from './constants';\nimport {\n createDepositTxn,\n getStorageRenewalCost,\n renewStorageTxn,\n} from './payment';\nimport {\n CreateDepositArgs,\n StorageRenewalCost,\n StorageRenewalParams,\n UploadResult,\n} from './types';\nimport { getUserUploadHistory } from './upload-history';\n\nexport enum Environment {\n mainnet = 'mainnet-beta',\n testnet = 'testnet',\n devnet = 'devnet',\n}\n\nexport function getRpcUrl(env: Environment): string {\n switch (env) {\n case Environment.mainnet:\n return 'https://api.mainnet-beta.solana.com';\n case Environment.testnet:\n return 'https://api.testnet.solana.com';\n case Environment.devnet:\n return 'https://api.devnet.solana.com';\n default:\n throw new Error(`Unsupported environment: ${env}`);\n }\n}\n\nexport interface ClientOptions {\n /** Solana RPC endpoint to use for chain interactions */\n environment: Environment;\n}\n\nexport interface UploadParams extends Pick<\n CreateDepositArgs,\n 'signTransaction' | 'userEmail'\n> {\n /** Wallet public key of the payer */\n payer: PublicKey;\n /** File(s) to be stored */\n file: File[];\n /** Duration in days to store the data */\n durationDays: number;\n}\n\n/**\n * @deprecated Use {@link UploadParams} instead.\n */\nexport type DepositParams = UploadParams;\n\n/**\n * Solana Storage Client — simplified (no fee estimation)\n */\nexport class Client {\n private rpcUrl: string;\n private apiEndpoint: string;\n\n constructor(options: ClientOptions) {\n this.rpcUrl = getRpcUrl(options.environment);\n this.apiEndpoint = getEndpointForRpc(this.rpcUrl);\n }\n\n /**\n * Creates a deposit transaction ready to be signed & sent by user's wallet.\n *\n * @param {Object} params\n * @param {PublicKey} params.payer - The public key (wallet address) of the connected wallet.\n * @param {File} params.file - The file to be uploaded.\n * @param {number} params.durationDays - How long (in days) the file should be stored.\n * @param {(tx: Transaction) => Promise<Transaction>} params.signTransaction -\n * A callback function to authorize the transaction via the Solana wallet library.\n *\n * @example\n * const { publicKey, signTransaction } = useSolanaWallet();\n * const result = await createDeposit({\n * payer: publicKey,\n * file,\n * durationDays: 30,\n * signTransaction,\n * });\n *\n * @returns {Promise<UploadResult>} The upload result after transaction is processed.\n */\n async createDeposit({\n payer,\n file,\n durationDays,\n signTransaction,\n userEmail,\n }: UploadParams): Promise<UploadResult> {\n console.log('Creating deposit transaction with environment:', this.rpcUrl);\n const connection = new Connection(this.rpcUrl, 'confirmed');\n\n return await createDepositTxn(\n {\n file,\n duration: durationDays * DAY_TIME_IN_SECONDS,\n payer,\n connection,\n signTransaction,\n userEmail,\n },\n this.apiEndpoint\n );\n }\n\n /**\n * estimates the cost for a file based on the amount of days it should be stored for\n * @param {File} file - a file to be uploaded\n * @param {number} duration - how long (in seconds) the file should be stored for\n */\n async estimateStorageCost(file: File[], duration: number) {\n const fileSizeInBytes = file.reduce((acc, f) => acc + f.size, 0);\n const durationInDays = Math.floor(duration / 86400); // convert seconds to day\n\n const response = await fetch(\n `${this.apiEndpoint}/api/user/get-quote?size=${fileSizeInBytes}&duration=${durationInDays}`\n );\n\n if (!response.ok) throw new Error('Failed to get storage cost estimate');\n\n const { quote } = await response.json();\n const totalLamports = quote.totalCost;\n const totalSOL = totalLamports / ONE_BILLION_LAMPORTS;\n\n return {\n sol: totalSOL,\n lamports: totalLamports,\n };\n }\n\n async getUserUploadHistory(userAddress: string) {\n const response = await getUserUploadHistory(userAddress, this.apiEndpoint);\n return response;\n }\n\n /**\n * Get cost estimate for renewing storage duration\n *\n * @param {string} cid - Content identifier of the file to renew\n * @param {number} duration - Number of additional days to extend storage\n *\n * @example\n * const quote = await client.getRenewalQuote('bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi', 30);\n * console.log(`Renewal cost: ${quote.costInSOL} SOL`);\n *\n * @returns {Promise<StorageRenewalCost | null>} Cost breakdown and expiration details\n */\n async getStorageRenewalCost(\n cid: string,\n duration: number\n ): Promise<StorageRenewalCost | null> {\n return await getStorageRenewalCost(cid, duration, this.apiEndpoint);\n }\n\n /**\n * Renew storage for an existing deposit\n *\n * @param {Object} params\n * @param {string} params.cid - Content identifier of the file to renew\n * @param {number} params.duration - Number of additional days to extend storage\n * @param {PublicKey} params.payer - Wallet public key paying for the renewal\n * @param {(tx: Transaction) => Promise<Transaction>} params.signTransaction - Transaction signing callback\n *\n * @example\n * const { publicKey, signTransaction } = useSolanaWallet();\n * const result = await client.renewStorage({\n * cid: 'bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi',\n * duration: 30,\n * payer: publicKey,\n * signTransaction,\n * });\n *\n * @returns {Promise<UploadResult>} Result of the renewal transaction\n */\n async renewStorageDuration({\n cid,\n duration,\n payer,\n signTransaction,\n }: StorageRenewalParams): Promise<UploadResult> {\n const connection = new Connection(this.rpcUrl, 'confirmed');\n\n return await renewStorageTxn(\n {\n cid,\n duration,\n payer,\n connection,\n signTransaction,\n },\n this.apiEndpoint\n );\n }\n\n /**\n * Gets the current SOL/USD price\n *\n * @example\n * const { price } = await client.getSolPrice();\n * console.log(`SOL price: $${price}`);\n *\n * @returns {Promise<{ price: number }>} Current SOL price in USD\n */\n async getSolPrice(): Promise<number> {\n const request = await fetch(`${this.apiEndpoint}/api/user/sol-price`);\n if (!request.ok) throw new Error(\"Couldn't fetch SOL price\");\n const data = await request.json();\n return data.price;\n }\n}\n","const ENDPOINTS = {\n local: 'http://localhost:5040',\n staging: 'https://storacha-solana-sdk-o9t9.onrender.com',\n production: 'https://keep-sdk-prod.onrender.com',\n} as const;\n\n/**\n * Determines the appropriate backend endpoint based on Solana RPC URL\n */\nexport function getEndpointForRpc(rpcUrl: string): string {\n const url = rpcUrl.toLowerCase();\n\n if (url.includes('localhost') || url.includes('127.0.0.1')) {\n return ENDPOINTS.local;\n }\n\n if (url.includes('mainnet')) {\n return ENDPOINTS.production;\n }\n\n if (url.includes('testnet') || url.includes('devnet')) {\n return ENDPOINTS.staging;\n }\n\n return ENDPOINTS.production;\n}\n\nexport const DAY_TIME_IN_SECONDS = 86400;\n\n/** 1 SOL in Lamports */\nexport const ONE_BILLION_LAMPORTS = 1_000_000_000;\n","import { Signature } from '@solana/kit';\nimport {\n PublicKey,\n SendTransactionError,\n Transaction,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n CreateDepositArgs,\n DepositResult,\n RenewStorageDurationArgs,\n StorageRenewalCost,\n StorageRenewalResult,\n UploadResult,\n} from './types';\n\n/**\n * Calls the deposit API for on-chain storage and returns a Transaction\n * which must be signed and sent externally by the user.\n *\n * @param params - {\n * cid: string;\n * file: File;\n * duration: number;\n * payer: PublicKey;\n * connection: Connection;\n * }\n * @returns Transaction\n */\nexport async function createDepositTxn(\n args: CreateDepositArgs,\n apiEndpoint: string\n): Promise<UploadResult> {\n const { file, duration, payer, connection, signTransaction, userEmail } =\n args;\n try {\n const formData = new FormData();\n file.forEach((f) => formData.append('file', f));\n formData.append('duration', duration.toString());\n formData.append('publicKey', payer.toBase58());\n if (userEmail) {\n formData.append('userEmail', userEmail);\n }\n\n const isMultipleFiles = file.length > 1;\n\n let uploadErr;\n\n const depositReq = await fetch(`${apiEndpoint}/api/solana/deposit`, {\n method: 'POST',\n body: formData,\n });\n if (!depositReq.ok) throw new Error('Failed to get deposit instructions');\n\n const depositRes: DepositResult = await depositReq.json();\n if (!depositRes.instructions || !depositRes.instructions.length)\n throw new Error('No instructions from deposit API');\n\n const latestBlockhash = await connection.getLatestBlockhash('confirmed');\n const instructions = depositRes.instructions[0];\n\n const depositInstruction = new TransactionInstruction({\n programId: new PublicKey(instructions.programId),\n keys: instructions.keys.map((k) => ({\n pubkey: new PublicKey(k.pubkey),\n isSigner: k.isSigner,\n isWritable: k.isWritable,\n })),\n data: Buffer.from(instructions.data, 'base64'),\n });\n\n const tx = new Transaction();\n tx.recentBlockhash = latestBlockhash.blockhash;\n tx.feePayer = payer;\n tx.add(depositInstruction);\n\n const signedTx = await signTransaction(tx);\n let signature: string;\n\n try {\n signature = await connection.sendRawTransaction(signedTx.serialize(), {\n skipPreflight: false, // not sure we should be disabling this verification step\n preflightCommitment: 'confirmed',\n });\n } catch (err) {\n if (err instanceof SendTransactionError) {\n const logs = err.logs ?? [];\n\n const isDuplicateUpload = logs.some((log) =>\n log.includes('already in use')\n );\n\n if (isDuplicateUpload) {\n throw new Error(\n 'This file has already been uploaded. You can find it in your dashboard.'\n );\n }\n\n throw new Error(\n 'Transaction failed during simulation. Please try again.'\n );\n }\n\n throw err;\n }\n const confirmation = await connection.confirmTransaction(\n {\n signature,\n blockhash: latestBlockhash.blockhash,\n lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,\n },\n 'confirmed'\n );\n\n if (confirmation.value.err) {\n console.error(\n 'Failed to confirm this transaction:',\n confirmation.value.err\n );\n throw new Error(\n `Transaction failed: ${JSON.stringify(confirmation.value.err)}`\n );\n }\n\n try {\n await fetch(`${apiEndpoint}/api/user/update-transaction-hash`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n cid: depositRes.cid,\n transactionHash: signature,\n }),\n });\n } catch (err) {\n console.warn('Failed to update transaction hash:', err);\n }\n\n if (depositRes.error) {\n uploadErr = depositRes.error;\n }\n\n const uploadForm = new FormData();\n file.forEach((f) => uploadForm.append('file', f));\n\n let fileUploadReq;\n // calls the upload functionality on our server with the file when deposit is successful\n if (isMultipleFiles) {\n fileUploadReq = await fetch(\n `${apiEndpoint}/api/user/upload-files?cid=${encodeURIComponent(\n depositRes.cid\n )}`,\n {\n method: 'POST',\n body: uploadForm,\n }\n );\n } else {\n fileUploadReq = await fetch(\n `${apiEndpoint}/api/user/upload-file?cid=${encodeURIComponent(\n depositRes.cid\n )}`,\n {\n method: 'POST',\n body: uploadForm,\n }\n );\n }\n\n if (!fileUploadReq.ok) {\n let err = 'Unknown error';\n try {\n const data: DepositResult = await fileUploadReq.json();\n err = data.message || data.error || err;\n } catch {}\n throw new Error('Deposit API error: ' + err);\n }\n\n const fileUploadRes: Pick<DepositResult, 'object' | 'cid' | 'message'> =\n await fileUploadReq?.json();\n\n return {\n signature: signature as Signature,\n success: true,\n cid: depositRes.cid,\n url: fileUploadRes.object.url,\n message: fileUploadRes.object.message,\n fileInfo: fileUploadRes.object\n ? {\n filename: fileUploadRes.object.fileInfo?.filename || '',\n size: fileUploadRes?.object?.fileInfo?.size || 0,\n uploadedAt: fileUploadRes?.object?.fileInfo?.uploadedAt || '',\n type: fileUploadRes?.object?.fileInfo?.type || '',\n }\n : undefined,\n };\n } catch (error) {\n console.error(error);\n if (error instanceof Error) {\n console.error('Error name:', error.name);\n console.error('Error message:', error.message);\n console.error('Error stack:', error.stack);\n }\n\n return {\n signature: '' as Signature,\n success: false,\n cid: '',\n url: '',\n message: '',\n fileInfo: undefined,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n}\n\n/**\n * Get cost estimate for renewing storage duration\n *\n * @param {string} cid - Content identifier of the uploaded data to renew\n * @param {number} duration - Number of additional days to extend storage\n *\n * @example\n * const quote = await client.getRenewalQuote('bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi', 30);\n * console.log(`Renewal cost: ${quote.costInSOL} SOL`);\n *\n * @returns {Promise<StorageRenewalCost | null>} Cost breakdown and expiration details\n */\nexport async function getStorageRenewalCost(\n cid: string,\n duration: number,\n apiEndpoint: string\n): Promise<StorageRenewalCost | null> {\n try {\n const request = await fetch(\n `${apiEndpoint}/api/user/renewal-cost?cid=${encodeURIComponent(\n cid\n )}&duration=${duration}`,\n {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n }\n );\n\n if (!request.ok) {\n const response = await request.json();\n throw new Error(response.message || 'Failed to get storage renewal cost');\n }\n\n return await request.json();\n } catch (error) {\n console.error('Failed to get storage renewal cost', error);\n return null;\n }\n}\n\n/**\n * Renew storage for an existing deposit\n *\n * @param {Object} params\n * @param {string} params.cid - Content identifier of the uploaded data to renew\n * @param {number} params.duration - Number of additional days to extend storage\n * @param {PublicKey} params.payer - Wallet public key paying for the renewal\n * @param {(tx: Transaction) => Promise<Transaction>} params.signTransaction - Transaction signing callback\n *\n * @example\n * const { publicKey, signTransaction } = useSolanaWallet();\n * const result = await client.renewStorage({\n * cid: 'bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi',\n * additionalDays: 30,\n * payer: publicKey,\n * signTransaction,\n * });\n *\n * @returns {Promise<UploadResult>} Result of the renewal transaction\n */\nexport async function renewStorageTxn(\n args: RenewStorageDurationArgs,\n apiEndpoint: string\n): Promise<UploadResult> {\n const { cid, duration, payer, connection, signTransaction } = args;\n const renewalTransactionIx = await fetch(\n `${apiEndpoint}/api/user/renew-storage`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n cid,\n duration,\n publicKey: payer.toString(),\n }),\n }\n );\n\n if (!renewalTransactionIx.ok) {\n const errorData = await renewalTransactionIx.json().catch(() => ({}));\n throw new Error(\n errorData.message || 'Failed to create renewal transaction'\n );\n }\n\n const renewalData: StorageRenewalResult = await renewalTransactionIx.json();\n const transaction = new Transaction();\n\n renewalData.instructions.forEach((ix) => {\n transaction.add({\n programId: new PublicKey(ix.programId),\n keys: ix.keys.map((key) => ({\n pubkey: new PublicKey(key.pubkey),\n isSigner: key.isSigner,\n isWritable: key.isWritable,\n })),\n data: Buffer.from(ix.data, 'base64'),\n });\n });\n\n const { blockhash } = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockhash;\n transaction.feePayer = payer;\n\n const signed = await signTransaction(transaction);\n const signature = await connection.sendRawTransaction(signed.serialize());\n await connection.confirmTransaction(signature, 'confirmed');\n\n const confirmRenewalTx = await fetch(\n `${apiEndpoint}/api/user/confirm-renewal`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n cid,\n duration,\n transactionHash: signature,\n }),\n }\n );\n\n if (!confirmRenewalTx.ok) {\n console.error('Failed to confirm renewal');\n }\n\n return {\n success: true,\n cid,\n signature: signature as Signature,\n url: `https://w3s.link/ipfs/${cid}`,\n message: 'Storage renewed successfully',\n };\n}\n","import { ServerOptions, UploadHistoryResponse } from './types';\n\n/**\n * Get the upload history for a given user address from the server\n *\n * @param userAddress - The wallet address of the user to fetch upload history for\n * @param options - Optional server configuration\n * @returns Promise<UploadHistoryResponse> - The user's upload history\n *\n * @example\n * ```typescript\n * const history = await getUserUploadHistory('9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM');\n * console.log('User upload history:', history.userHistory);\n * ```\n *\n * @throws {Error} When the user address is invalid or the request fails\n */\nexport async function getUserUploadHistory(\n userAddress: string,\n apiEndpoint: string,\n options: ServerOptions = {}\n): Promise<UploadHistoryResponse> {\n // Validate user address\n if (!userAddress || typeof userAddress !== 'string') {\n throw new Error('User address is required and must be a string');\n }\n\n // Use provided apiEndpoint, or allow override via options\n const baseUrl = options.url || apiEndpoint;\n\n try {\n const response = await fetch(\n `${baseUrl}/api/user/user-upload-history?userAddress=${encodeURIComponent(userAddress)}`,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n errorData.message ||\n `Failed to fetch upload history: ${response.status} ${response.statusText}`\n );\n }\n\n const data: UploadHistoryResponse = await response.json();\n\n // Validate response structure\n if (typeof data !== 'object' || data === null) {\n throw new Error('Invalid response format from server');\n }\n\n if (typeof data.userAddress !== 'string') {\n throw new Error('Invalid userAddress in response');\n }\n\n return data;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error('Unknown error occurred while fetching upload history');\n }\n}\n\n/**\n * @deprecated Use getUserUploadHistory instead\n */\nexport { getUserUploadHistory as fetchUserUploadHistory };\n\n/**\n * @deprecated Use getUserUploadHistory instead\n */\nexport { getUserUploadHistory as fetchUserDepositHistory };\n","import { Client, ClientOptions } from './client';\n\nexport const useUpload = (environment: ClientOptions['environment']) => {\n const client = new Client({ environment: environment || 'testnet' });\n return client;\n};\n\n/**\n * @deprecated Use {@link useUpload} instead.\n */\nexport { useUpload as useDeposit };\n"],"mappings":"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","names":["index_exports","__export","Client","Environment","createDepositTxn","getUserUploadHistory","getRpcUrl","getStorageRenewalCost","renewStorageTxn","useUpload","__toCommonJS","import_web3","ENDPOINTS","getEndpointForRpc","rpcUrl","url","DAY_TIME_IN_SECONDS","ONE_BILLION_LAMPORTS","import_web3","createDepositTxn","args","apiEndpoint","file","duration","payer","connection","signTransaction","userEmail","formData","f","isMultipleFiles","uploadErr","depositReq","depositRes","latestBlockhash","instructions","depositInstruction","k","tx","signedTx","signature","err","log","confirmation","uploadForm","fileUploadReq","data","fileUploadRes","error","getStorageRenewalCost","cid","request","response","renewStorageTxn","renewalTransactionIx","errorData","renewalData","transaction","ix","key","blockhash","signed","getUserUploadHistory","userAddress","apiEndpoint","options","baseUrl","response","errorData","data","error","Environment","getRpcUrl","env","Client","options","getEndpointForRpc","payer","file","durationDays","signTransaction","userEmail","connection","createDepositTxn","DAY_TIME_IN_SECONDS","duration","fileSizeInBytes","acc","f","durationInDays","response","quote","totalLamports","ONE_BILLION_LAMPORTS","userAddress","getUserUploadHistory","cid","getStorageRenewalCost","renewStorageTxn","request","useUpload","environment","Client"]}
package/dist/index.d.cts CHANGED
@@ -291,6 +291,7 @@ type DepositParams = UploadParams;
291
291
  */
292
292
  declare class Client {
293
293
  private rpcUrl;
294
+ private apiEndpoint;
294
295
  constructor(options: ClientOptions);
295
296
  /**
296
297
  * Creates a deposit transaction ready to be signed & sent by user's wallet.
@@ -367,9 +368,7 @@ declare class Client {
367
368
  *
368
369
  * @returns {Promise<{ price: number }>} Current SOL price in USD
369
370
  */
370
- getSolPrice(): Promise<{
371
- price: number;
372
- }>;
371
+ getSolPrice(): Promise<number>;
373
372
  }
374
373
 
375
374
  declare const useUpload: (environment: ClientOptions["environment"]) => Client;
@@ -387,7 +386,7 @@ declare const useUpload: (environment: ClientOptions["environment"]) => Client;
387
386
  * }
388
387
  * @returns Transaction
389
388
  */
390
- declare function createDepositTxn({ file, duration, payer, connection, signTransaction, userEmail, }: CreateDepositArgs): Promise<UploadResult>;
389
+ declare function createDepositTxn(args: CreateDepositArgs, apiEndpoint: string): Promise<UploadResult>;
391
390
  /**
392
391
  * Get cost estimate for renewing storage duration
393
392
  *
@@ -400,7 +399,7 @@ declare function createDepositTxn({ file, duration, payer, connection, signTrans
400
399
  *
401
400
  * @returns {Promise<StorageRenewalCost | null>} Cost breakdown and expiration details
402
401
  */
403
- declare function getStorageRenewalCost(cid: string, duration: number): Promise<StorageRenewalCost | null>;
402
+ declare function getStorageRenewalCost(cid: string, duration: number, apiEndpoint: string): Promise<StorageRenewalCost | null>;
404
403
  /**
405
404
  * Renew storage for an existing deposit
406
405
  *
@@ -421,7 +420,7 @@ declare function getStorageRenewalCost(cid: string, duration: number): Promise<S
421
420
  *
422
421
  * @returns {Promise<UploadResult>} Result of the renewal transaction
423
422
  */
424
- declare function renewStorageTxn({ cid, duration, payer, connection, signTransaction, }: RenewStorageDurationArgs): Promise<UploadResult>;
423
+ declare function renewStorageTxn(args: RenewStorageDurationArgs, apiEndpoint: string): Promise<UploadResult>;
425
424
 
426
425
  /**
427
426
  * Get the upload history for a given user address from the server
@@ -438,6 +437,6 @@ declare function renewStorageTxn({ cid, duration, payer, connection, signTransac
438
437
  *
439
438
  * @throws {Error} When the user address is invalid or the request fails
440
439
  */
441
- declare function getUserUploadHistory(userAddress: string, options?: ServerOptions): Promise<UploadHistoryResponse>;
440
+ declare function getUserUploadHistory(userAddress: string, apiEndpoint: string, options?: ServerOptions): Promise<UploadHistoryResponse>;
442
441
 
443
442
  export { Client, type ClientOptions, type CreateDepositArgs, type DepositHistoryEntry, type DepositHistoryResponse, type DepositParams, type DepositResult, Environment, type OnChainConfig, type OnChainDeposit, type RenewStorageDurationArgs, type ServerOptions, type StorageRenewalCost, type StorageRenewalParams, type StorageRenewalResult, type Transaction, type UploadHistory, type UploadHistoryResponse, type UploadOptions, type UploadParams, type UploadResult, type WalletItem, createDepositTxn, getUserUploadHistory as fetchUserDepositHistory, getUserUploadHistory as fetchUserUploadHistory, getRpcUrl, getStorageRenewalCost, getUserUploadHistory, renewStorageTxn, useUpload as useDeposit, useUpload };
package/dist/index.d.ts CHANGED
@@ -291,6 +291,7 @@ type DepositParams = UploadParams;
291
291
  */
292
292
  declare class Client {
293
293
  private rpcUrl;
294
+ private apiEndpoint;
294
295
  constructor(options: ClientOptions);
295
296
  /**
296
297
  * Creates a deposit transaction ready to be signed & sent by user's wallet.
@@ -367,9 +368,7 @@ declare class Client {
367
368
  *
368
369
  * @returns {Promise<{ price: number }>} Current SOL price in USD
369
370
  */
370
- getSolPrice(): Promise<{
371
- price: number;
372
- }>;
371
+ getSolPrice(): Promise<number>;
373
372
  }
374
373
 
375
374
  declare const useUpload: (environment: ClientOptions["environment"]) => Client;
@@ -387,7 +386,7 @@ declare const useUpload: (environment: ClientOptions["environment"]) => Client;
387
386
  * }
388
387
  * @returns Transaction
389
388
  */
390
- declare function createDepositTxn({ file, duration, payer, connection, signTransaction, userEmail, }: CreateDepositArgs): Promise<UploadResult>;
389
+ declare function createDepositTxn(args: CreateDepositArgs, apiEndpoint: string): Promise<UploadResult>;
391
390
  /**
392
391
  * Get cost estimate for renewing storage duration
393
392
  *
@@ -400,7 +399,7 @@ declare function createDepositTxn({ file, duration, payer, connection, signTrans
400
399
  *
401
400
  * @returns {Promise<StorageRenewalCost | null>} Cost breakdown and expiration details
402
401
  */
403
- declare function getStorageRenewalCost(cid: string, duration: number): Promise<StorageRenewalCost | null>;
402
+ declare function getStorageRenewalCost(cid: string, duration: number, apiEndpoint: string): Promise<StorageRenewalCost | null>;
404
403
  /**
405
404
  * Renew storage for an existing deposit
406
405
  *
@@ -421,7 +420,7 @@ declare function getStorageRenewalCost(cid: string, duration: number): Promise<S
421
420
  *
422
421
  * @returns {Promise<UploadResult>} Result of the renewal transaction
423
422
  */
424
- declare function renewStorageTxn({ cid, duration, payer, connection, signTransaction, }: RenewStorageDurationArgs): Promise<UploadResult>;
423
+ declare function renewStorageTxn(args: RenewStorageDurationArgs, apiEndpoint: string): Promise<UploadResult>;
425
424
 
426
425
  /**
427
426
  * Get the upload history for a given user address from the server
@@ -438,6 +437,6 @@ declare function renewStorageTxn({ cid, duration, payer, connection, signTransac
438
437
  *
439
438
  * @throws {Error} When the user address is invalid or the request fails
440
439
  */
441
- declare function getUserUploadHistory(userAddress: string, options?: ServerOptions): Promise<UploadHistoryResponse>;
440
+ declare function getUserUploadHistory(userAddress: string, apiEndpoint: string, options?: ServerOptions): Promise<UploadHistoryResponse>;
442
441
 
443
442
  export { Client, type ClientOptions, type CreateDepositArgs, type DepositHistoryEntry, type DepositHistoryResponse, type DepositParams, type DepositResult, Environment, type OnChainConfig, type OnChainDeposit, type RenewStorageDurationArgs, type ServerOptions, type StorageRenewalCost, type StorageRenewalParams, type StorageRenewalResult, type Transaction, type UploadHistory, type UploadHistoryResponse, type UploadOptions, type UploadParams, type UploadResult, type WalletItem, createDepositTxn, getUserUploadHistory as fetchUserDepositHistory, getUserUploadHistory as fetchUserUploadHistory, getRpcUrl, getStorageRenewalCost, getUserUploadHistory, renewStorageTxn, useUpload as useDeposit, useUpload };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{Connection as j}from"@solana/web3.js";var l=typeof window<"u"&&window.location.hostname==="localhost"?"http://localhost:5040":"https://storacha-solana-sdk-bshc.onrender.com",P=86400,D=1e9;import{PublicKey as b,SendTransactionError as v,Transaction as I,TransactionInstruction as A}from"@solana/web3.js";async function k({file:o,duration:t,payer:r,connection:e,signTransaction:c,userEmail:s}){try{let n=new FormData;o.forEach(a=>n.append("file",a)),n.append("duration",t.toString()),n.append("publicKey",r.toBase58()),s&&n.append("userEmail",s);let p=o.length>1,h,f=await fetch(`${l}/api/solana/deposit`,{method:"POST",body:n});if(!f.ok)throw new Error("Failed to get deposit instructions");let i=await f.json();if(!i.instructions||!i.instructions.length)throw new Error("No instructions from deposit API");let g=await e.getLatestBlockhash("confirmed"),d=i.instructions[0],m=new A({programId:new b(d.programId),keys:d.keys.map(a=>({pubkey:new b(a.pubkey),isSigner:a.isSigner,isWritable:a.isWritable})),data:Buffer.from(d.data,"base64")}),y=new I;y.recentBlockhash=g.blockhash,y.feePayer=r,y.add(m);let $=await c(y),S;try{S=await e.sendRawTransaction($.serialize(),{skipPreflight:!1,preflightCommitment:"confirmed"})}catch(a){throw a instanceof v?(a.logs??[]).some(N=>N.includes("already in use"))?new Error("This file has already been uploaded. You can find it in your dashboard."):new Error("Transaction failed during simulation. Please try again."):a}let E=await e.confirmTransaction({signature:S,blockhash:g.blockhash,lastValidBlockHeight:g.lastValidBlockHeight},"confirmed");if(E.value.err)throw console.error("Failed to confirm this transaction:",E.value.err),new Error(`Transaction failed: ${JSON.stringify(E.value.err)}`);try{await fetch(`${l}/api/user/update-transaction-hash`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cid:i.cid,transactionHash:S})})}catch(a){console.warn("Failed to update transaction hash:",a)}i.error&&(h=i.error);let U=new FormData;o.forEach(a=>U.append("file",a));let w;if(p?w=await fetch(`${l}/api/user/upload-files?cid=${encodeURIComponent(i.cid)}`,{method:"POST",body:U}):w=await fetch(`${l}/api/user/upload-file?cid=${encodeURIComponent(i.cid)}`,{method:"POST",body:U}),!w.ok){let a="Unknown error";try{let T=await w.json();a=T.message||T.error||a}catch{}throw new Error("Deposit API error: "+a)}let u=await w?.json();return{signature:S,success:!0,cid:i.cid,url:u.object.url,message:u.object.message,fileInfo:u.object?{filename:u.object.fileInfo?.filename||"",size:u?.object?.fileInfo?.size||0,uploadedAt:u?.object?.fileInfo?.uploadedAt||"",type:u?.object?.fileInfo?.type||""}:void 0}}catch(n){return console.error(n),n instanceof Error&&(console.error("Error name:",n.name),console.error("Error message:",n.message),console.error("Error stack:",n.stack)),{signature:"",success:!1,cid:"",url:"",message:"",fileInfo:void 0,error:n instanceof Error?n.message:"Unknown error occurred"}}}async function C(o,t){try{let r=await fetch(`${l}/api/user/renewal-cost?cid=${encodeURIComponent(o)}&duration=${t}`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!r.ok){let e=await r.json();throw new Error(e.message||"Failed to get storage renewal cost")}return await r.json()}catch(r){return console.error("Failed to get storage renewal cost",r),null}}async function x({cid:o,duration:t,payer:r,connection:e,signTransaction:c}){let s=await fetch(`${l}/api/user/renew-storage`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cid:o,duration:t,publicKey:r.toString()})});if(!s.ok){let d=await s.json().catch(()=>({}));throw new Error(d.message||"Failed to create renewal transaction")}let n=await s.json(),p=new I;n.instructions.forEach(d=>{p.add({programId:new b(d.programId),keys:d.keys.map(m=>({pubkey:new b(m.pubkey),isSigner:m.isSigner,isWritable:m.isWritable})),data:Buffer.from(d.data,"base64")})});let{blockhash:h}=await e.getLatestBlockhash();p.recentBlockhash=h,p.feePayer=r;let f=await c(p),i=await e.sendRawTransaction(f.serialize());return await e.confirmTransaction(i,"confirmed"),(await fetch(`${l}/api/user/confirm-renewal`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cid:o,duration:t,transactionHash:i})})).ok||console.error("Failed to confirm renewal"),{success:!0,cid:o,signature:i,url:`https://w3s.link/ipfs/${o}`,message:"Storage renewed successfully"}}async function O(o,t={}){if(!o||typeof o!="string")throw new Error("User address is required and must be a string");let r=t.url||l;try{let e=await fetch(`${r}/api/user/user-upload-history?userAddress=${encodeURIComponent(o)}`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok){let s=await e.json().catch(()=>({}));throw new Error(s.message||`Failed to fetch upload history: ${e.status} ${e.statusText}`)}let c=await e.json();if(typeof c!="object"||c===null)throw new Error("Invalid response format from server");if(typeof c.userAddress!="string")throw new Error("Invalid userAddress in response");return c}catch(e){throw e instanceof Error?e:new Error("Unknown error occurred while fetching upload history")}}var F=(e=>(e.mainnet="mainnet-beta",e.testnet="testnet",e.devnet="devnet",e))(F||{});function B(o){switch(o){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: ${o}`)}}var R=class{constructor(t){this.rpcUrl=B(t.environment)}async createDeposit({payer:t,file:r,durationDays:e,signTransaction:c,userEmail:s}){console.log("Creating deposit transaction with environment:",this.rpcUrl);let n=new j(this.rpcUrl,"confirmed");return await k({file:r,duration:e*P,payer:t,connection:n,signTransaction:c,userEmail:s})}async estimateStorageCost(t,r){let e=t.reduce((f,i)=>f+i.size,0),c=Math.floor(r/86400),s=await fetch(`${l}/api/user/get-quote?size=${e}&duration=${c}`);if(!s.ok)throw new Error("Failed to get storage cost estimate");let{quote:n}=await s.json(),p=n.totalCost;return{sol:p/D,lamports:p}}async getUserUploadHistory(t){return await O(t)}async getStorageRenewalCost(t,r){return await C(t,r)}async renewStorageDuration({cid:t,duration:r,payer:e,signTransaction:c}){let s=new j(this.rpcUrl,"confirmed");return await x({cid:t,duration:r,payer:e,connection:s,signTransaction:c})}async getSolPrice(){let t=await fetch(`${l}/api/user/sol-price`);if(!t.ok)throw new Error("Couldn't fetch SOL price");return(await t.json()).price}};var ee=o=>new R({environment:o||"testnet"});export{R as Client,F as Environment,k as createDepositTxn,O as fetchUserDepositHistory,O as fetchUserUploadHistory,B as getRpcUrl,C as getStorageRenewalCost,O as getUserUploadHistory,x as renewStorageTxn,ee as useDeposit,ee as useUpload};
1
+ import{Connection as F}from"@solana/web3.js";var b={local:"http://localhost:5040",staging:"https://storacha-solana-sdk-o9t9.onrender.com",production:"https://keep-sdk-prod.onrender.com"};function C(s){let e=s.toLowerCase();return e.includes("localhost")||e.includes("127.0.0.1")?b.local:e.includes("mainnet")?b.production:e.includes("testnet")||e.includes("devnet")?b.staging:b.production}var D=86400,I=1e9;import{PublicKey as R,SendTransactionError as B,Transaction as x,TransactionInstruction as L}from"@solana/web3.js";async function O(s,e){let{file:t,duration:r,payer:o,connection:n,signTransaction:l,userEmail:p}=s;try{let i=new FormData;t.forEach(a=>i.append("file",a)),i.append("duration",r.toString()),i.append("publicKey",o.toBase58()),p&&i.append("userEmail",p);let u=t.length>1,m,w=await fetch(`${e}/api/solana/deposit`,{method:"POST",body:i});if(!w.ok)throw new Error("Failed to get deposit instructions");let c=await w.json();if(!c.instructions||!c.instructions.length)throw new Error("No instructions from deposit API");let y=await n.getLatestBlockhash("confirmed"),d=c.instructions[0],g=new L({programId:new R(d.programId),keys:d.keys.map(a=>({pubkey:new R(a.pubkey),isSigner:a.isSigner,isWritable:a.isWritable})),data:Buffer.from(d.data,"base64")}),S=new x;S.recentBlockhash=y.blockhash,S.feePayer=o,S.add(g);let A=await l(S),E;try{E=await n.sendRawTransaction(A.serialize(),{skipPreflight:!1,preflightCommitment:"confirmed"})}catch(a){throw a instanceof B?(a.logs??[]).some(N=>N.includes("already in use"))?new Error("This file has already been uploaded. You can find it in your dashboard."):new Error("Transaction failed during simulation. Please try again."):a}let T=await n.confirmTransaction({signature:E,blockhash:y.blockhash,lastValidBlockHeight:y.lastValidBlockHeight},"confirmed");if(T.value.err)throw console.error("Failed to confirm this transaction:",T.value.err),new Error(`Transaction failed: ${JSON.stringify(T.value.err)}`);try{await fetch(`${e}/api/user/update-transaction-hash`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cid:c.cid,transactionHash:E})})}catch(a){console.warn("Failed to update transaction hash:",a)}c.error&&(m=c.error);let k=new FormData;t.forEach(a=>k.append("file",a));let h;if(u?h=await fetch(`${e}/api/user/upload-files?cid=${encodeURIComponent(c.cid)}`,{method:"POST",body:k}):h=await fetch(`${e}/api/user/upload-file?cid=${encodeURIComponent(c.cid)}`,{method:"POST",body:k}),!h.ok){let a="Unknown error";try{let P=await h.json();a=P.message||P.error||a}catch{}throw new Error("Deposit API error: "+a)}let f=await h?.json();return{signature:E,success:!0,cid:c.cid,url:f.object.url,message:f.object.message,fileInfo:f.object?{filename:f.object.fileInfo?.filename||"",size:f?.object?.fileInfo?.size||0,uploadedAt:f?.object?.fileInfo?.uploadedAt||"",type:f?.object?.fileInfo?.type||""}:void 0}}catch(i){return console.error(i),i instanceof Error&&(console.error("Error name:",i.name),console.error("Error message:",i.message),console.error("Error stack:",i.stack)),{signature:"",success:!1,cid:"",url:"",message:"",fileInfo:void 0,error:i instanceof Error?i.message:"Unknown error occurred"}}}async function j(s,e,t){try{let r=await fetch(`${t}/api/user/renewal-cost?cid=${encodeURIComponent(s)}&duration=${e}`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!r.ok){let o=await r.json();throw new Error(o.message||"Failed to get storage renewal cost")}return await r.json()}catch(r){return console.error("Failed to get storage renewal cost",r),null}}async function v(s,e){let{cid:t,duration:r,payer:o,connection:n,signTransaction:l}=s,p=await fetch(`${e}/api/user/renew-storage`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cid:t,duration:r,publicKey:o.toString()})});if(!p.ok){let d=await p.json().catch(()=>({}));throw new Error(d.message||"Failed to create renewal transaction")}let i=await p.json(),u=new x;i.instructions.forEach(d=>{u.add({programId:new R(d.programId),keys:d.keys.map(g=>({pubkey:new R(g.pubkey),isSigner:g.isSigner,isWritable:g.isWritable})),data:Buffer.from(d.data,"base64")})});let{blockhash:m}=await n.getLatestBlockhash();u.recentBlockhash=m,u.feePayer=o;let w=await l(u),c=await n.sendRawTransaction(w.serialize());return await n.confirmTransaction(c,"confirmed"),(await fetch(`${e}/api/user/confirm-renewal`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cid:t,duration:r,transactionHash:c})})).ok||console.error("Failed to confirm renewal"),{success:!0,cid:t,signature:c,url:`https://w3s.link/ipfs/${t}`,message:"Storage renewed successfully"}}async function $(s,e,t={}){if(!s||typeof s!="string")throw new Error("User address is required and must be a string");let r=t.url||e;try{let o=await fetch(`${r}/api/user/user-upload-history?userAddress=${encodeURIComponent(s)}`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!o.ok){let l=await o.json().catch(()=>({}));throw new Error(l.message||`Failed to fetch upload history: ${o.status} ${o.statusText}`)}let n=await o.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(o){throw o instanceof Error?o:new Error("Unknown error occurred while fetching upload history")}}var _=(r=>(r.mainnet="mainnet-beta",r.testnet="testnet",r.devnet="devnet",r))(_||{});function H(s){switch(s){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: ${s}`)}}var U=class{constructor(e){this.rpcUrl=H(e.environment),this.apiEndpoint=C(this.rpcUrl)}async createDeposit({payer:e,file:t,durationDays:r,signTransaction:o,userEmail:n}){console.log("Creating deposit transaction with environment:",this.rpcUrl);let l=new F(this.rpcUrl,"confirmed");return await O({file:t,duration:r*D,payer:e,connection:l,signTransaction:o,userEmail:n},this.apiEndpoint)}async estimateStorageCost(e,t){let r=e.reduce((u,m)=>u+m.size,0),o=Math.floor(t/86400),n=await fetch(`${this.apiEndpoint}/api/user/get-quote?size=${r}&duration=${o}`);if(!n.ok)throw new Error("Failed to get storage cost estimate");let{quote:l}=await n.json(),p=l.totalCost;return{sol:p/I,lamports:p}}async getUserUploadHistory(e){return await $(e,this.apiEndpoint)}async getStorageRenewalCost(e,t){return await j(e,t,this.apiEndpoint)}async renewStorageDuration({cid:e,duration:t,payer:r,signTransaction:o}){let n=new F(this.rpcUrl,"confirmed");return await v({cid:e,duration:t,payer:r,connection:n,signTransaction:o},this.apiEndpoint)}async getSolPrice(){let e=await fetch(`${this.apiEndpoint}/api/user/sol-price`);if(!e.ok)throw new Error("Couldn't fetch SOL price");return(await e.json()).price}};var te=s=>new U({environment:s||"testnet"});export{U as Client,_ as Environment,O as createDepositTxn,$ as fetchUserDepositHistory,$ as fetchUserUploadHistory,H as getRpcUrl,j as getStorageRenewalCost,$ as getUserUploadHistory,v as renewStorageTxn,te as useDeposit,te as useUpload};
2
2
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "storacha-sol",
3
- "version": "0.0.8",
3
+ "version": "0.1.0",
4
4
  "type": "module",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",