@mojito-inc/secondary-market
Version:
Mojito secondary market is the platform to purchase NFT.
2 lines (1 loc) • 10.6 kB
JavaScript
"use strict";var e=require("ethers"),i=require("@solana/web3.js"),n=require("bn.js"),r=require("bs58"),t=require("@solana/spl-token"),o=require("buffer"),l=require("../constant/index.js"),a=require("../constant/contractABI/BuyOrSell.js"),s=require("./getEtherScanURL.utils.js"),u=require("./customErrorMessage.utils.js"),c=require("./getSolanaBalance.utils.js"),d=require("./fetchSolanaPriorityFee.utils.js");exports.buySolanaNFT=async(e,a,v,b,g,y,m,p,h,f=.00228288)=>{var w,S,k,E,A,P,T,I,R,C,L,B,W,_,D,K,O,N,M,U,q,j,F,V,x,H,z,J,Z,G,Y,Q,X,$,ee,ie,ne,re,te,oe,le,ae,se,ue,ce,de;if(!b)return{success:!1,error:"Your wallet session has been closed. Please reconnect your wallet to continue."};const ve=s.getSolanaEnvByChainId(g),be=new i.Connection(p||i.clusterApiUrl(ve),{confirmTransactionInitialTimeout:3e5,commitment:"confirmed"}),ge=new i.PublicKey(e),ye=await c.getSolanaBalance(e,ve,p),me=new i.PublicKey(null!==(w=null==m?void 0:m.mintAccount)&&void 0!==w?w:""),pe=new i.PublicKey(null!==(S=null==m?void 0:m.seller)&&void 0!==S?S:"");let he;try{const a=new i.PublicKey(null!==(k=null==m?void 0:m.marketplaceAddress)&&void 0!==k?k:""),s=new i.PublicKey(null!==(E=null==m?void 0:m.bubblegumProgram)&&void 0!==E?E:""),c=new i.PublicKey(null!==(A=null==m?void 0:m.systemProgram)&&void 0!==A?A:""),w=new i.PublicKey(null!==(P=null==m?void 0:m.compressionProgram)&&void 0!==P?P:""),S=new i.PublicKey(null!==(T=null==m?void 0:m.newLeafDelegate)&&void 0!==T?T:""),ve=new i.PublicKey(null!==(I=null==m?void 0:m.listing)&&void 0!==I?I:""),fe=new i.PublicKey(null!==(R=null==m?void 0:m.leafDelegate)&&void 0!==R?R:""),we=new i.PublicKey(null!==(C=null==m?void 0:m.commissionVinTokenAccount)&&void 0!==C?C:""),Se=new i.PublicKey(null!==(L=null==m?void 0:m.platformVinTokenAccount)&&void 0!==L?L:""),ke=new i.PublicKey(null!==(B=null==m?void 0:m.initializeAccount)&&void 0!==B?B:""),Ee=new i.PublicKey(null!==(W=null==m?void 0:m.buyerVinTokenAccount)&&void 0!==W?W:"");let Ae;const Pe=await t.getAccount(be,new i.PublicKey(null!==(_=null==m?void 0:m.sellerVinTokenAccount)&&void 0!==_?_:""),"confirmed");if(!(null==m?void 0:m.buyerTokenAccount)||!(null==Pe?void 0:Pe.isInitialized))return{success:!1,error:"seller vin token account is not initialized"};Ae=new i.PublicKey(null!==(D=null==m?void 0:m.sellerVinTokenAccount)&&void 0!==D?D:"");const Te=new n(null===(K=null==m?void 0:m.bubblegumArg)||void 0===K?void 0:K.nonce).toArray("le",8),Ie=Array.from(Array(10).keys()).map((e=>{var n,r,t;return{pubkey:new i.PublicKey(null!==(t=null===(r=null===(n=null==m?void 0:m.bubblegumArg)||void 0===n?void 0:n.proof)||void 0===r?void 0:r[e])&&void 0!==t?t:""),isSigner:!1,isWritable:!1}})),Re=r.decode(null!==(N=null===(O=null==m?void 0:m.bubblegumArg)||void 0===O?void 0:O.root)&&void 0!==N?N:""),Ce=r.decode(null!==(U=null===(M=null==m?void 0:m.bubblegumArg)||void 0===M?void 0:M.dataHash)&&void 0!==U?U:""),Le=r.decode(null!==(j=null===(q=null==m?void 0:m.bubblegumArg)||void 0===q?void 0:q.creatorHash)&&void 0!==j?j:"");if(32!==Ce.length||32!==Le.length)throw new Error("Hash length is not 32 bytes");const Be=new i.TransactionInstruction({programId:a,keys:[{pubkey:ge,isSigner:!0,isWritable:!0},{pubkey:pe,isSigner:!1,isWritable:!0},{pubkey:Ee,isSigner:!1,isWritable:!0},{pubkey:Ae,isSigner:!1,isWritable:!0},{pubkey:we,isSigner:!1,isWritable:!0},{pubkey:Se,isSigner:!1,isWritable:!0},{pubkey:me,isSigner:!1,isWritable:!0},{pubkey:ke,isSigner:!1,isWritable:!0},{pubkey:ve,isSigner:!1,isWritable:!0},{pubkey:t.TOKEN_PROGRAM_ID,isSigner:!1,isWritable:!0},{pubkey:c,isSigner:!1,isWritable:!0},{pubkey:s,isSigner:!1,isWritable:!0},{pubkey:w,isSigner:!1,isWritable:!0},{pubkey:new i.PublicKey(null!==(F=null==m?void 0:m.treeAuthority)&&void 0!==F?F:""),isSigner:!1,isWritable:!0},{pubkey:pe,isSigner:!1,isWritable:!0},{pubkey:fe,isSigner:!1,isWritable:!0},{pubkey:S,isSigner:!1,isWritable:!0},{pubkey:new i.PublicKey(null!==(V=null==m?void 0:m.logWrapper)&&void 0!==V?V:""),isSigner:!1,isWritable:!0},{pubkey:new i.PublicKey(null!==(x=null==m?void 0:m.merkleTree)&&void 0!==x?x:""),isSigner:!1,isWritable:!0},...Ie],data:o.Buffer.concat([o.Buffer.from(null!==(H=null==m?void 0:m.buyDiscriminator)&&void 0!==H?H:[]),o.Buffer.from(Uint8Array.of(...Re,...Ce,...Le,...Te,...new n(null===(z=null==m?void 0:m.bubblegumArg)||void 0===z?void 0:z.index).toArray("le",8)))])});try{if("backpack"===(null==v?void 0:v.toLowerCase())||"phantom"===(null==v?void 0:v.toLowerCase())){const n=ye.nonNative*i.LAMPORTS_PER_SOL;if(n<=0||n<(null!==(Z=null===(J=null==m?void 0:m.bubblegumArg)||void 0===J?void 0:J.amount)&&void 0!==Z?Z:0))return{success:!1,error:"Insufficient VIN for initiating the transaction."};try{he=ye;const n=new i.Transaction({feePayer:ge}).add(Be),r=await be.getLatestBlockhash("confirmed");n.recentBlockhash=r.blockhash,n.lastValidBlockHeight=r.lastValidBlockHeight,n.add(i.ComputeBudgetProgram.setComputeUnitLimit({units:14e5}));const t=await d.fetchSolanaPriorityFee(p,n.serialize({verifySignatures:!1})),o=i.ComputeBudgetProgram.setComputeUnitPrice({microLamports:t});n.add(o);const l=await be.getFeeForMessage(n.compileMessage(),"confirmed"),a=he.native*i.LAMPORTS_PER_SOL,s=(null!==(G=null==l?void 0:l.value)&&void 0!==G?G:0)+f*i.LAMPORTS_PER_SOL;if(a<=0||a<s)return{success:!1,error:"Insufficient SOL for initiating the transaction."};y("Initiating item purchase transaction.");const u=await(null===(Q=null===(Y=null==b?void 0:b.adapter)||void 0===Y?void 0:Y.sendTransaction)||void 0===Q?void 0:Q.call(Y,n,be,{skipPreflight:!0,preflightCommitment:"confirmed"}));await be.confirmTransaction(Object.assign({signature:u},r),"confirmed");const c=await be.getSignatureStatus(u);return null===(null===(X=null==c?void 0:c.value)||void 0===X?void 0:X.err)?{success:!0,response:{hash:u}}:(null==h||h({key:"Additional Data",value:{address:e,balance:ye,providerType:v,chainId:g,path:"Inside an buynow solana contract function - 461"}},{exception:null===($=null==c?void 0:c.value)||void 0===$?void 0:$.err}),{success:!1,error:"Transaction Failed"})}catch(i){return(null===(ie=null===(ee=null==i?void 0:i.message)||void 0===ee?void 0:ee.includes)||void 0===ie?void 0:ie.call(ee,l.ErrorsType.USER_REJECTED))||(null===(ne=null==i?void 0:i.includes)||void 0===ne?void 0:ne.call(i,l.ErrorsType.USER_REJECTED))||(null===(re=null==i?void 0:i.includes)||void 0===re?void 0:re.call(i,l.ErrorsType.USER_DENIED))||(null===(oe=null===(te=null==i?void 0:i.message)||void 0===te?void 0:te.includes)||void 0===oe?void 0:oe.call(te,l.ErrorsType.USER_DENIED))?{success:!1,error:"Transaction has been cancelled by user"}:(null==h||h({key:"Additional Data",value:{address:e,balance:ye,providerType:v,chainId:g,path:"Inside an buynow solana contract function - 489"}},{exception:i}),{success:!1,error:u.customErrorMessage(i)})}}if("magic"===(null==v?void 0:v.toLowerCase())){const n=ye.nonNative*i.LAMPORTS_PER_SOL;if(n<=0||n<(null!==(ae=null===(le=null==m?void 0:m.bubblegumArg)||void 0===le?void 0:le.amount)&&void 0!==ae?ae:0))return{success:!1,error:"Insufficient VIN for initiating the transaction."};he=ye,y("Initiating item purchase transaction.");const r=new i.Transaction({feePayer:ge}).add(Be),t=await be.getLatestBlockhash("confirmed");r.recentBlockhash=t.blockhash,r.lastValidBlockHeight=t.lastValidBlockHeight,r.add(i.ComputeBudgetProgram.setComputeUnitLimit({units:14e5}));const l=await d.fetchSolanaPriorityFee(p,r.serialize({verifySignatures:!1})),a=i.ComputeBudgetProgram.setComputeUnitPrice({microLamports:l});r.add(a);const s=await be.getFeeForMessage(r.compileMessage(),"confirmed"),u=he.native*i.LAMPORTS_PER_SOL,c=(null!==(se=null==s?void 0:s.value)&&void 0!==se?se:0)+f*i.LAMPORTS_PER_SOL;if(u<=0||u<c)return{success:!1,error:"Insufficient SOL for initiating the transaction."};const w=await(null===(ue=null==b?void 0:b.solana)||void 0===ue?void 0:ue.signTransaction(r,{requireAllSignatures:!1,verifySignatures:!0})),S=await be.sendRawTransaction(o.Buffer.from(w.rawTransaction,"base64"),{skipPreflight:!0,preflightCommitment:"confirmed"});await be.confirmTransaction(Object.assign({signature:S},t),"confirmed");const k=await be.getSignatureStatus(S);return null===(null===(ce=null==k?void 0:k.value)||void 0===ce?void 0:ce.err)?{success:!0,response:{hash:S}}:(null==h||h({key:"Additional Data",value:{address:e,balance:ye,providerType:v,chainId:g,path:"Inside an buynow solana contract function - 631"}},{exception:null===(de=null==k?void 0:k.value)||void 0===de?void 0:de.err}),{success:!1,error:"Transaction Failed"})}}catch(i){return null==h||h({key:"Additional Data",value:{address:e,balance:ye,providerType:v,chainId:g,path:"Inside an buynow solana contract function - 648"}},{exception:i}),{success:!1,error:u.customErrorMessage(i)}}return null}catch(i){return null==h||h({key:"Additional Data",value:{address:e,balance:ye,providerType:v,chainId:g,path:"Inside an buynow solana contract function - 667"}},{exception:i}),{success:!1,error:u.customErrorMessage(i)}}},exports.buyTokenWithNativeCurrency=async function({tokenId:i,price:n,owner:r,random:t,proofOfApproval:o,contractAddress:s,selectedAddress:u,currencyContractAddress:c,marketPlaceContractAddress:d,provider:v}){var b,g;try{const l=Number(n),b=v.getSigner(),g=await b.getAddress(),y=new e.ethers.Contract(d,a.default.abi,b),m=1,p=0,h=await y.buy([t,e.BigNumber.from(i),s,m,r,e.utils.parseEther(n),c,e.utils.parseEther("0"),e.ethers.constants.AddressZero,p,p,g],o,u,{value:e.utils.parseEther(String(l))}),f=await v.waitForTransaction(h.hash,1);return 0===(null==f?void 0:f.status)?{status:!1,message:h.hash}:{status:!0,message:h.hash}}catch(e){return(null===(b=e.message)||void 0===b?void 0:b.includes(l.ErrorsType.USER_REJECTED))||(null===(g=e.message)||void 0===g?void 0:g.includes(l.ErrorsType.USER_DENIED))?{status:!1,message:"Reject"}:{status:!1,message:"Error"}}},exports.buyTokenWithNonNativeCurrency=async function({tokenId:i,price:n,contractAddress:r,owner:t,random:o,proofOfApproval:s,selectedAddress:u,currencyContractAddress:c,marketPlaceContractAddress:d,provider:v}){var b,g;try{const l=v.getSigner(),b=await l.getAddress(),g=new e.ethers.Contract(d,a.default.abi,l),y=1,m=0,p=await g.buy([o,e.BigNumber.from(i),r,y,t,e.utils.parseEther(n),c,e.utils.parseEther("0"),e.ethers.constants.AddressZero,m,m,b],s,u),h=await v.waitForTransaction(p.hash,1);return 0===(null==h?void 0:h.status)?{status:!1,message:p.hash}:{status:!0,message:p.hash}}catch(e){return(null===(b=e.message)||void 0===b?void 0:b.includes(l.ErrorsType.USER_REJECTED))||(null===(g=e.message)||void 0===g?void 0:g.includes(l.ErrorsType.USER_DENIED))?{status:!1,message:"Reject"}:{status:!1,message:"Error"}}};