UNPKG

@mojito-inc/secondary-market

Version:

Mojito secondary market is the platform to purchase NFT.

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