storacha-sol 0.0.1 → 0.0.2

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 g=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var C=(r,e)=>{for(var s in e)g(r,s,{get:e[s],enumerable:!0})},E=(r,e,s,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of S(e))!U.call(r,i)&&i!==s&&g(r,i,{get:()=>e[i],enumerable:!(o=I(e,i))||o.enumerable});return r};var B=r=>E(g({},"__esModule",{value:!0}),r);var T={};C(T,{Client:()=>l,Environment:()=>D,createDepositTxn:()=>h,getRpcUrl:()=>k,useDeposit:()=>R});module.exports=B(T);var b=require("@solana/web3.js");var c=require("@solana/web3.js");async function h({file:r,duration:e,payer:s,connection:o,signTransaction:i}){try{let t=new FormData;t.append("file",r),t.append("duration",e.toString()),t.append("publicKey",s.toBase58());let p=await fetch("http://localhost:5040/api/user/uploadFile",{method:"POST",body:t}),P;if(!p.ok){let a="Unknown error";try{let y=await p.json();a=y.message||y.error||a}catch{}throw new Error("Deposit API error: "+a)}let n=await p.json();if(!n.instructions||!n.instructions.length)throw new Error("No instructions from deposit API");let f=await o.getLatestBlockhash("confirmed"),u=n.instructions[0],x=new c.TransactionInstruction({programId:new c.PublicKey(u.programId),keys:u.keys.map(a=>({pubkey:new c.PublicKey(a.pubkey),isSigner:a.isSigner,isWritable:a.isWritable})),data:Buffer.from(u.data,"base64")});n.error&&(P=n.error);let m=new c.Transaction;m.recentBlockhash=f.blockhash,m.feePayer=s,m.add(x);let v=await i(m),w=await o.sendRawTransaction(v.serialize(),{skipPreflight:!1,preflightCommitment:"confirmed"}),d=await o.confirmTransaction({signature:w,blockhash:f.blockhash,lastValidBlockHeight:f.lastValidBlockHeight},"confirmed");if(d.value.err)throw console.error("Failed to confirm this transaction:",d.value.err),new Error(`Transaction failed: ${JSON.stringify(d.value.err)}`);return{signature:w,success:!0,cid:n.cid,url:n.object.url,message:n.message,fileInfo:n.object?{filename:n.object.fileInfo?.filename||"",size:n?.object?.fileInfo?.size||0,uploadedAt:n?.object?.fileInfo?.uploadedAt||"",type:n?.object?.fileInfo?.type||""}:void 0}}catch(t){return console.error(t),t instanceof Error&&(console.error("Error name:",t.name),console.error("Error message:",t.message),console.error("Error stack:",t.stack)),{signature:"",success:!1,cid:"",url:"",message:"",fileInfo:void 0,error:t instanceof Error?t.message:"Unknown error occurred"}}}var D=(o=>(o.mainnet="mainnet-beta",o.testnet="testnet",o.devnet="devnet",o))(D||{});function k(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(e){this.estimateStorageCost=(e,s)=>{let t=e.size*s*1e3;return{sol:t/1e9,lamports:t}};this.rpcUrl=k(e.environment)}async createDeposit({payer:e,file:s,durationDays:o,signTransaction:i}){console.log("Creating deposit transaction with environment:",this.rpcUrl);let t=new b.Connection(this.rpcUrl,"confirmed");return await h({file:s,duration:o*86400,payer:e,connection:t,signTransaction:i})}};var R=r=>new l({environment:r||"testnet"});0&&(module.exports={Client,Environment,createDepositTxn,getRpcUrl,useDeposit});
1
+ "use strict";var w=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var j=Object.prototype.hasOwnProperty;var C=(r,e)=>{for(var n in e)w(r,n,{get:e[n],enumerable:!0})},O=(r,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of T(e))!j.call(r,s)&&s!==n&&w(r,s,{get:()=>e[s],enumerable:!(t=S(e,s))||t.enumerable});return r};var B=r=>O(w({},"__esModule",{value:!0}),r);var H={};C(H,{Client:()=>l,Environment:()=>P,createDepositTxn:()=>y,fetchUserDepositHistory:()=>b,getRpcUrl:()=>x,useDeposit:()=>A});module.exports=B(H);var v=require("@solana/web3.js");var p=require("@solana/web3.js");var{NODE_ENV:F}=process.env,g=F==="development"?"http://localhost:5040":"https://storacha-solana-sdk-bshc.onrender.com";async function y({file:r,duration:e,payer:n,connection:t,signTransaction:s}){try{let o=new FormData;o.append("file",r),o.append("duration",e.toString()),o.append("publicKey",n.toBase58());let D,U=await fetch(`${g}/api/solana/deposit`,{method:"POST",body:o});if(!U.ok)throw new Error("Failed to get deposit instructions");let i=await U.json();if(!i.instructions||!i.instructions.length)throw new Error("No instructions from deposit API");let d=await t.getLatestBlockhash("confirmed"),f=i.instructions[0],I=new p.TransactionInstruction({programId:new p.PublicKey(f.programId),keys:f.keys.map(c=>({pubkey:new p.PublicKey(c.pubkey),isSigner:c.isSigner,isWritable:c.isWritable})),data:Buffer.from(f.data,"base64")}),m=new p.Transaction;m.recentBlockhash=d.blockhash,m.feePayer=n,m.add(I);let R=await s(m),E=await t.sendRawTransaction(R.serialize(),{skipPreflight:!1,preflightCommitment:"confirmed"}),u=await t.confirmTransaction({signature:E,blockhash:d.blockhash,lastValidBlockHeight:d.lastValidBlockHeight},"confirmed");if(u.value.err)throw console.error("Failed to confirm this transaction:",u.value.err),new Error(`Transaction failed: ${JSON.stringify(u.value.err)}`);i.error&&(D=i.error),new FormData().append("file",r);let h=await fetch(`${g}/api/user/uploadFile?cid=${encodeURIComponent(i.cid)}`,{method:"POST",body:o});if(!h.ok){let c="Unknown error";try{let k=await h.json();c=k.message||k.error||c}catch{}throw new Error("Deposit API error: "+c)}let a=await h.json();return{signature:E,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(o){return console.error(o),o instanceof Error&&(console.error("Error name:",o.name),console.error("Error message:",o.message),console.error("Error stack:",o.stack)),{signature:"",success:!1,cid:"",url:"",message:"",fileInfo:void 0,error:o instanceof Error?o.message:"Unknown error occurred"}}}async function b(r,e={}){if(!r||typeof r!="string")throw new Error("User address is required and must be a string");let n=e.url||"http://localhost:3000";try{let t=await fetch(`${n}/getUserUploadHistory?userAddress=${encodeURIComponent(r)}`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok){let o=await t.json().catch(()=>({}));throw new Error(o.message||`Failed to fetch deposit 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 deposit history")}}var P=(t=>(t.mainnet="mainnet-beta",t.testnet="testnet",t.devnet="devnet",t))(P||{});function x(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(e){this.estimateStorageCost=(e,n)=>{let o=e.size*n*1e3;return{sol:o/1e9,lamports:o}};this.rpcUrl=x(e.environment)}async createDeposit({payer:e,file:n,durationDays:t,signTransaction:s}){console.log("Creating deposit transaction with environment:",this.rpcUrl);let o=new v.Connection(this.rpcUrl,"confirmed");return await y({file:n,duration:t*86400,payer:e,connection:o,signTransaction:s})}async getUserUploadHistory(e){return await b(e)}};var A=r=>new l({environment:r||"testnet"});0&&(module.exports={Client,Environment,createDepositTxn,fetchUserDepositHistory,getRpcUrl,useDeposit});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/payment.ts","../src/hooks.ts"],"sourcesContent":["export * from \"./client\"\nexport * from \"./types\"\nexport * from \"./payment\"\nexport * from \"./hooks\"\n","import { PublicKey, Connection } from '@solana/web3.js';\nimport { createDepositTxn } from './payment';\nimport { CreateDepositArgs, UploadResult } from './types';\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 DepositParams\n extends Pick<CreateDepositArgs, 'signTransaction'> {\n /** Wallet public key of the payer */\n payer: PublicKey;\n /** File to be stored */\n file: File;\n /** Duration in days to store the data */\n durationDays: number;\n}\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 }: DepositParams): 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 * 86400,\n payer,\n connection,\n signTransaction,\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 estimateStorageCost = (file: File, duration: number) => {\n const ratePerBytePerDay = 1000; // this would be obtained from the program config later\n const fileSizeInBytes = file.size;\n const totalLamports = fileSizeInBytes * duration * ratePerBytePerDay;\n const totalSOL = totalLamports / 1_000_000_000;\n\n return {\n sol: totalSOL,\n lamports: totalLamports,\n };\n };\n}\n","import { Signature } from '@solana/kit';\nimport { CreateDepositArgs, DepositResult, UploadResult } from './types';\nimport {\n PublicKey,\n Transaction,\n TransactionInstruction,\n} from '@solana/web3.js';\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}: CreateDepositArgs): Promise<UploadResult> {\n try {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('duration', duration.toString());\n formData.append('publicKey', payer.toBase58());\n\n // calls the upload functionality on our server with the file to upload and\n // returns a response with the transaction instruction data\n const fileUploadReq = await fetch(\n 'http://localhost:5040/api/user/uploadFile',\n {\n method: 'POST',\n body: formData,\n }\n );\n let uploadErr;\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 body: DepositResult = await fileUploadReq.json();\n if (!body.instructions || !body.instructions.length) {\n throw new Error('No instructions from deposit API');\n }\n\n const latestBlockhash = await connection.getLatestBlockhash('confirmed');\n const instructions = body.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 if (body.error) {\n uploadErr = body.error;\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 const signature = await connection.sendRawTransaction(\n signedTx.serialize(),\n {\n skipPreflight: false, // not sure we should be disabling this verification step\n preflightCommitment: 'confirmed',\n }\n );\n const confirmation = await connection.confirmTransaction(\n {\n signature,\n blockhash: latestBlockhash.blockhash,\n lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,\n },\n 'confirmed'\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 return {\n signature: signature as Signature,\n success: true,\n cid: body.cid,\n url: body.object.url,\n message: body.message,\n fileInfo: body.object\n ? {\n filename: body.object.fileInfo?.filename || '',\n size: body?.object?.fileInfo?.size || 0,\n uploadedAt: body?.object?.fileInfo?.uploadedAt || '',\n type: body?.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","import { Client, ClientOptions } from './client';\n\nexport const useDeposit = (environment: ClientOptions['environment']) => {\n const client = new Client({ environment: environment || 'testnet' });\n return client;\n};\n"],"mappings":"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","names":["index_exports","__export","Client","Environment","createDepositTxn","getRpcUrl","useDeposit","__toCommonJS","import_web3","import_web3","createDepositTxn","file","duration","payer","connection","signTransaction","formData","fileUploadReq","uploadErr","err","data","body","latestBlockhash","instructions","depositInstruction","k","tx","signedTx","signature","confirmation","error","Environment","getRpcUrl","env","Client","options","file","duration","totalLamports","payer","durationDays","signTransaction","connection","createDepositTxn","useDeposit","environment","Client"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/payment.ts","../src/constants.ts","../src/depositHistory.ts","../src/hooks.ts"],"sourcesContent":["export * from \"./client\"\nexport * from \"./types\"\nexport * from \"./payment\"\nexport * from \"./hooks\"\nexport * from \"./depositHistory\"\n","import { PublicKey, Connection } from '@solana/web3.js';\nimport { createDepositTxn } from './payment';\nimport { CreateDepositArgs, UploadResult } from './types';\nimport { fetchUserDepositHistory } from './depositHistory';\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 DepositParams\n extends Pick<CreateDepositArgs, 'signTransaction'> {\n /** Wallet public key of the payer */\n payer: PublicKey;\n /** File to be stored */\n file: File;\n /** Duration in days to store the data */\n durationDays: number;\n}\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 }: DepositParams): 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 * 86400,\n payer,\n connection,\n signTransaction,\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 estimateStorageCost = (file: File, duration: number) => {\n const ratePerBytePerDay = 1000; // this would be obtained from the program config later\n const fileSizeInBytes = file.size;\n const totalLamports = fileSizeInBytes * duration * ratePerBytePerDay;\n const totalSOL = totalLamports / 1_000_000_000;\n\n return {\n sol: totalSOL,\n lamports: totalLamports,\n };\n };\n\n async getUserUploadHistory(userAddress: string) {\n const response = await fetchUserDepositHistory(userAddress);\n return response\n }\n}\n","import { Signature } from '@solana/kit';\nimport { CreateDepositArgs, DepositResult, UploadResult } from './types';\nimport {\n PublicKey,\n Transaction,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport { ENDPOINT } from './constants';\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}: CreateDepositArgs): Promise<UploadResult> {\n try {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('duration', duration.toString());\n formData.append('publicKey', payer.toBase58());\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 const signature = await connection.sendRawTransaction(\n signedTx.serialize(),\n {\n skipPreflight: false, // not sure we should be disabling this verification step\n preflightCommitment: 'confirmed',\n }\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 if (depositRes.error) {\n uploadErr = depositRes.error;\n }\n\n const uploadForm = new FormData();\n uploadForm.append('file', file);\n\n // calls the upload functionality on our server with the file when deposit is succesful\n const fileUploadReq = await fetch(\n `${ENDPOINT}/api/user/uploadFile?cid=${encodeURIComponent(depositRes.cid)}`,\n {\n method: 'POST',\n body: formData,\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","const { NODE_ENV } = process.env;\n\nexport const ENDPOINT =\n NODE_ENV === 'development'\n ? 'http://localhost:5040'\n : 'https://storacha-solana-sdk-bshc.onrender.com';\n","import { DepositHistoryResponse, ServerOptions } from './types';\n\n/**\n * Fetches the deposit history for a given user address from the backend\n * \n * @param userAddress - The wallet address of the user to fetch deposit history for\n * @param options - Optional server configuration\n * @returns Promise<DepositHistoryResponse> - The user's deposit history\n * \n * @example\n * ```typescript\n * const history = await fetchUserDepositHistory('9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM');\n * console.log('User deposit history:', history.userHistory);\n * ```\n * \n * @throws {Error} When the user address is invalid or the request fails\n */\nexport async function fetchUserDepositHistory(\n userAddress: string,\n options: ServerOptions = {}\n): Promise<DepositHistoryResponse> {\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 // Default backend URL - can be overridden via options\n const baseUrl = options.url || 'http://localhost:3000';\n \n try {\n const response = await fetch(\n `${baseUrl}/getUserUploadHistory?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 deposit history: ${response.status} ${response.statusText}`\n );\n }\n\n const data: DepositHistoryResponse = 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 deposit history');\n }\n}\n","import { Client, ClientOptions } from './client';\n\nexport const useDeposit = (environment: ClientOptions['environment']) => {\n const client = new Client({ environment: environment || 'testnet' });\n return client;\n};\n"],"mappings":"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","names":["index_exports","__export","Client","Environment","createDepositTxn","fetchUserDepositHistory","getRpcUrl","useDeposit","__toCommonJS","import_web3","import_web3","NODE_ENV","ENDPOINT","createDepositTxn","file","duration","payer","connection","signTransaction","formData","uploadErr","depositReq","ENDPOINT","depositRes","latestBlockhash","instructions","depositInstruction","k","tx","signedTx","signature","confirmation","fileUploadReq","err","data","fileUploadRes","error","fetchUserDepositHistory","userAddress","options","baseUrl","response","errorData","data","error","Environment","getRpcUrl","env","Client","options","file","duration","totalLamports","payer","durationDays","signTransaction","connection","createDepositTxn","userAddress","fetchUserDepositHistory","useDeposit","environment","Client"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { PublicKey, Connection, Transaction } from '@solana/web3.js';
2
1
  import { Address, Signature } from '@solana/kit';
2
+ import { PublicKey, Connection, Transaction } from '@solana/web3.js';
3
3
 
4
4
  interface ServerOptions {
5
5
  /** URL pointing to the backend (mostly Storacha's) */
@@ -118,6 +118,36 @@ interface CreateDepositArgs extends Omit<OnChainDeposit, 'depositAmount' | 'depo
118
118
  * */
119
119
  signTransaction: (tx: Transaction) => Promise<Transaction>;
120
120
  }
121
+ /**
122
+ * Individual deposit history entry from the backend
123
+ */
124
+ interface DepositHistoryEntry {
125
+ /** Unique identifier for the deposit */
126
+ id: number;
127
+ /** User's wallet address (deposit key) */
128
+ deposit_key: string;
129
+ /** Content identifier of the uploaded file */
130
+ content_cid: string;
131
+ /** Duration in days the file is stored for */
132
+ duration_days: number;
133
+ /** Amount deposited in lamports */
134
+ deposit_amount: number;
135
+ /** Slot when the deposit was made */
136
+ deposit_slot: number;
137
+ /** Last slot when rewards were claimed */
138
+ last_claimed_slot: number;
139
+ /** Timestamp when the deposit was created */
140
+ created_at: string;
141
+ }
142
+ /**
143
+ * Response from the getUserUploadHistory endpoint
144
+ */
145
+ interface DepositHistoryResponse {
146
+ /** Array of deposit history entries */
147
+ userHistory: DepositHistoryEntry[] | null;
148
+ /** The user address that was queried */
149
+ userAddress: string;
150
+ }
121
151
 
122
152
  declare enum Environment {
123
153
  mainnet = "mainnet-beta",
@@ -174,6 +204,7 @@ declare class Client {
174
204
  sol: number;
175
205
  lamports: number;
176
206
  };
207
+ getUserUploadHistory(userAddress: string): Promise<DepositHistoryResponse>;
177
208
  }
178
209
 
179
210
  /**
@@ -193,4 +224,21 @@ declare function createDepositTxn({ file, duration, payer, connection, signTrans
193
224
 
194
225
  declare const useDeposit: (environment: ClientOptions["environment"]) => Client;
195
226
 
196
- export { Client, type ClientOptions, type CreateDepositArgs, type DepositParams, type DepositResult, Environment, type OnChainConfig, type OnChainDeposit, type ServerOptions, type UploadOptions, type UploadResult, type WalletItem, createDepositTxn, getRpcUrl, useDeposit };
227
+ /**
228
+ * Fetches the deposit history for a given user address from the backend
229
+ *
230
+ * @param userAddress - The wallet address of the user to fetch deposit history for
231
+ * @param options - Optional server configuration
232
+ * @returns Promise<DepositHistoryResponse> - The user's deposit history
233
+ *
234
+ * @example
235
+ * ```typescript
236
+ * const history = await fetchUserDepositHistory('9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM');
237
+ * console.log('User deposit history:', history.userHistory);
238
+ * ```
239
+ *
240
+ * @throws {Error} When the user address is invalid or the request fails
241
+ */
242
+ declare function fetchUserDepositHistory(userAddress: string, options?: ServerOptions): Promise<DepositHistoryResponse>;
243
+
244
+ export { Client, type ClientOptions, type CreateDepositArgs, type DepositHistoryEntry, type DepositHistoryResponse, type DepositParams, type DepositResult, Environment, type OnChainConfig, type OnChainDeposit, type ServerOptions, type UploadOptions, type UploadResult, type WalletItem, createDepositTxn, fetchUserDepositHistory, getRpcUrl, useDeposit };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { PublicKey, Connection, Transaction } from '@solana/web3.js';
2
1
  import { Address, Signature } from '@solana/kit';
2
+ import { PublicKey, Connection, Transaction } from '@solana/web3.js';
3
3
 
4
4
  interface ServerOptions {
5
5
  /** URL pointing to the backend (mostly Storacha's) */
@@ -118,6 +118,36 @@ interface CreateDepositArgs extends Omit<OnChainDeposit, 'depositAmount' | 'depo
118
118
  * */
119
119
  signTransaction: (tx: Transaction) => Promise<Transaction>;
120
120
  }
121
+ /**
122
+ * Individual deposit history entry from the backend
123
+ */
124
+ interface DepositHistoryEntry {
125
+ /** Unique identifier for the deposit */
126
+ id: number;
127
+ /** User's wallet address (deposit key) */
128
+ deposit_key: string;
129
+ /** Content identifier of the uploaded file */
130
+ content_cid: string;
131
+ /** Duration in days the file is stored for */
132
+ duration_days: number;
133
+ /** Amount deposited in lamports */
134
+ deposit_amount: number;
135
+ /** Slot when the deposit was made */
136
+ deposit_slot: number;
137
+ /** Last slot when rewards were claimed */
138
+ last_claimed_slot: number;
139
+ /** Timestamp when the deposit was created */
140
+ created_at: string;
141
+ }
142
+ /**
143
+ * Response from the getUserUploadHistory endpoint
144
+ */
145
+ interface DepositHistoryResponse {
146
+ /** Array of deposit history entries */
147
+ userHistory: DepositHistoryEntry[] | null;
148
+ /** The user address that was queried */
149
+ userAddress: string;
150
+ }
121
151
 
122
152
  declare enum Environment {
123
153
  mainnet = "mainnet-beta",
@@ -174,6 +204,7 @@ declare class Client {
174
204
  sol: number;
175
205
  lamports: number;
176
206
  };
207
+ getUserUploadHistory(userAddress: string): Promise<DepositHistoryResponse>;
177
208
  }
178
209
 
179
210
  /**
@@ -193,4 +224,21 @@ declare function createDepositTxn({ file, duration, payer, connection, signTrans
193
224
 
194
225
  declare const useDeposit: (environment: ClientOptions["environment"]) => Client;
195
226
 
196
- export { Client, type ClientOptions, type CreateDepositArgs, type DepositParams, type DepositResult, Environment, type OnChainConfig, type OnChainDeposit, type ServerOptions, type UploadOptions, type UploadResult, type WalletItem, createDepositTxn, getRpcUrl, useDeposit };
227
+ /**
228
+ * Fetches the deposit history for a given user address from the backend
229
+ *
230
+ * @param userAddress - The wallet address of the user to fetch deposit history for
231
+ * @param options - Optional server configuration
232
+ * @returns Promise<DepositHistoryResponse> - The user's deposit history
233
+ *
234
+ * @example
235
+ * ```typescript
236
+ * const history = await fetchUserDepositHistory('9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM');
237
+ * console.log('User deposit history:', history.userHistory);
238
+ * ```
239
+ *
240
+ * @throws {Error} When the user address is invalid or the request fails
241
+ */
242
+ declare function fetchUserDepositHistory(userAddress: string, options?: ServerOptions): Promise<DepositHistoryResponse>;
243
+
244
+ export { Client, type ClientOptions, type CreateDepositArgs, type DepositHistoryEntry, type DepositHistoryResponse, type DepositParams, type DepositResult, Environment, type OnChainConfig, type OnChainDeposit, type ServerOptions, type UploadOptions, type UploadResult, type WalletItem, createDepositTxn, fetchUserDepositHistory, getRpcUrl, useDeposit };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{Connection as x}from"@solana/web3.js";import{PublicKey as h,Transaction as k,TransactionInstruction as P}from"@solana/web3.js";async function w({file:n,duration:o,payer:i,connection:r,signTransaction:a}){try{let e=new FormData;e.append("file",n),e.append("duration",o.toString()),e.append("publicKey",i.toBase58());let c=await fetch("http://localhost:5040/api/user/uploadFile",{method:"POST",body:e}),y;if(!c.ok){let s="Unknown error";try{let g=await c.json();s=g.message||g.error||s}catch{}throw new Error("Deposit API error: "+s)}let t=await c.json();if(!t.instructions||!t.instructions.length)throw new Error("No instructions from deposit API");let m=await r.getLatestBlockhash("confirmed"),f=t.instructions[0],b=new P({programId:new h(f.programId),keys:f.keys.map(s=>({pubkey:new h(s.pubkey),isSigner:s.isSigner,isWritable:s.isWritable})),data:Buffer.from(f.data,"base64")});t.error&&(y=t.error);let l=new k;l.recentBlockhash=m.blockhash,l.feePayer=i,l.add(b);let D=await a(l),d=await r.sendRawTransaction(D.serialize(),{skipPreflight:!1,preflightCommitment:"confirmed"}),u=await r.confirmTransaction({signature:d,blockhash:m.blockhash,lastValidBlockHeight:m.lastValidBlockHeight},"confirmed");if(u.value.err)throw console.error("Failed to confirm this transaction:",u.value.err),new Error(`Transaction failed: ${JSON.stringify(u.value.err)}`);return{signature:d,success:!0,cid:t.cid,url:t.object.url,message:t.message,fileInfo:t.object?{filename:t.object.fileInfo?.filename||"",size:t?.object?.fileInfo?.size||0,uploadedAt:t?.object?.fileInfo?.uploadedAt||"",type:t?.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"}}}var v=(r=>(r.mainnet="mainnet-beta",r.testnet="testnet",r.devnet="devnet",r))(v||{});function I(n){switch(n){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: ${n}`)}}var p=class{constructor(o){this.estimateStorageCost=(o,i)=>{let e=o.size*i*1e3;return{sol:e/1e9,lamports:e}};this.rpcUrl=I(o.environment)}async createDeposit({payer:o,file:i,durationDays:r,signTransaction:a}){console.log("Creating deposit transaction with environment:",this.rpcUrl);let e=new x(this.rpcUrl,"confirmed");return await w({file:i,duration:r*86400,payer:o,connection:e,signTransaction:a})}};var A=n=>new p({environment:n||"testnet"});export{p as Client,v as Environment,w as createDepositTxn,I as getRpcUrl,A as useDeposit};
1
+ 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};
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.1",
3
+ "version": "0.0.2",
4
4
  "main": "./dist/index.js",
5
5
  "scripts": {
6
6
  "build": "tsup src/index.ts --minify",
@@ -25,14 +25,21 @@
25
25
  "types": "./dist/index.d.ts",
26
26
  "type": "module",
27
27
  "module": "./dist/index.js",
28
- "keywords": ["solana", "storacha", "typescript", "rust", "dapp"],
28
+ "keywords": [
29
+ "solana",
30
+ "storacha",
31
+ "typescript",
32
+ "rust",
33
+ "dapp"
34
+ ],
29
35
  "author": "",
30
36
  "license": "ISC",
31
37
  "description": "",
32
38
  "packageManager": "pnpm@10.11.0",
33
39
  "dependencies": {
34
40
  "@solana/kit": "^2.3.0",
35
- "@solana/web3.js": "^1.98.2"
41
+ "@solana/web3.js": "^1.98.2",
42
+ "standard-version": "^9.5.0"
36
43
  },
37
44
  "devDependencies": {
38
45
  "esbuild": "^0.21.4",