@mojito-inc/secondary-market
Version:
Mojito secondary market is the platform to purchase NFT.
2 lines (1 loc) • 10.3 kB
JavaScript
import{ethers as e,utils as n}from"ethers";import i from"moment";import{LAMPORTS_PER_SOL as o,Transaction as r,ComputeBudgetProgram as t,PublicKey as a,Connection as l,clusterApiUrl as s,TransactionInstruction as u}from"@solana/web3.js";import c from"bs58";import d from"bn.js";import{getAccount as v}from"@solana/spl-token";import f from"../constant/contractABI/BalanceWMATIC.js";import g from"../constant/contractABI/BalanceWETH.js";import m from"../constant/contractABI/BuyOrSell.js";import{ErrorsType as b}from"../constant/index.js";import{getSolanaEnvByChainId as p}from"./getEtherScanURL.utils.js";import{getOrInitializeAccount as h}from"./getOrInitializeAccount.utils.js";import{getVinTokenAddress as w}from"./getVinTokenAddress.utils.js";import{customErrorMessage as y}from"./customErrorMessage.utils.js";import{getSolanaBalance as k}from"./getSolanaBalance.utils.js";import{fetchSolanaPriorityFee as S}from"./fetchSolanaPriorityFee.utils.js";async function A(n,i,o,r){try{const t=o.getSigner(),a=80001===r||137===r?f.abi:g.abi,l=new e.Contract(i,a,t);return(await l.balanceOf(n)/1e18).toFixed(6)}catch(e){return"0"}}const T=async({tokenId:o,price:r,buyerAddress:t,quantity:a,tax:l,contractAddress:s,marketPlaceContractAddress:u,random:c,expiryDate:d,proofOfApproval:v,networkContractAddress:f,provider:g})=>{try{const b=r*l/100,p=g.getSigner(),h=await p.getAddress(),w=new e.Contract(u,m.abi,p),y=await w.sell([c,o,s,a,h,n.parseEther(String(r)),f,n.parseEther(String(b)),e.constants.AddressZero,0,0,t],v,i(d).unix(),f);return await g.waitForTransaction(y.hash,1),y.hash}catch(e){return""}},E=async(e,n,i,f,g,m,A,T,E,I=.00228288)=>{var B,W,C,D,P,j,V,L,U,R,x,N,O,F,H,_,M,z,J,q,K,Y;try{if(!i)return{success:!1,error:"Your wallet session has been closed. Please reconnect your wallet to continue."};const n=p(m),K=await k(e,n,T),{err:Y,instruction:Z,connectedPublicKey:G,connection:Q,usedBalance:X,buyerVinTokenAccount:$,pda:ee}=await(async(e,n,i,o,r,t,v,f)=>{var g,m,b,y,k,S,A,T,E,I,B,W,C,D,P,j,V,L,U,R,x,N,O,F,H,_,M,z,J,q;try{const K=new a(e),Y=p(r),Z=new l(f||s(Y),{confirmTransactionInitialTimeout:3e5,commitment:"confirmed"}),G=new a(null!==(g=null==v?void 0:v.commissionVinTokenAccount)&&void 0!==g?g:""),Q=new a(null!==(m=null==v?void 0:v.platformVinTokenAccount)&&void 0!==m?m:""),X=new a(null!==(b=null==v?void 0:v.initializeAccount)&&void 0!==b?b:""),$=new a(null!==(y=null==v?void 0:v.mintAccount)&&void 0!==y?y:""),ee=new a(null!==(k=null==v?void 0:v.sellerVinTokenAccount)&&void 0!==k?k:""),ne=w(Y,f),ie=new a(ne),oe=await h(Z,ee,K,ie,K,n,i,o,t,f);if(!oe.isAvailable)throw new Error("Insufficient SOL for initiating the transaction.");const re=new a(null!==(S=null==v?void 0:v.offer)&&void 0!==S?S:""),te=new a(null!==(A=null==v?void 0:v.offerEscrow)&&void 0!==A?A:""),ae=[Buffer.from("marketplace")],[le,se]=a.findProgramAddressSync(ae,te),ue=new a(null!==(T=null==v?void 0:v.offerEscrow)&&void 0!==T?T:""),ce=new a(null!==(E=null==v?void 0:v.tokenProgram)&&void 0!==E?E:""),de=new a(null!==(I=null==v?void 0:v.systemProgram)&&void 0!==I?I:""),ve=new a(null!==(B=null==v?void 0:v.buyer)&&void 0!==B?B:""),fe=c.decode(null!==(C=null===(W=null==v?void 0:v.bubblegumArg)||void 0===W?void 0:W.root)&&void 0!==C?C:""),ge=Array.from(Array(10).keys()).map((e=>{var n,i,o;return{pubkey:new a(null!==(o=null===(i=null===(n=null==v?void 0:v.bubblegumArg)||void 0===n?void 0:n.proof)||void 0===i?void 0:i[e])&&void 0!==o?o:""),isSigner:!1,isWritable:!1}})),me=c.decode(null!==(P=null===(D=null==v?void 0:v.bubblegumArg)||void 0===D?void 0:D.dataHash)&&void 0!==P?P:""),be=c.decode(null!==(V=null===(j=null==v?void 0:v.bubblegumArg)||void 0===j?void 0:j.creatorHash)&&void 0!==V?V:"");if(32!==me.length||32!==be.length)throw new Error("Hash length is not 32 bytes");const pe=new a(null!==(L=null==v?void 0:v.buyerVinTokenAccount)&&void 0!==L?L:""),he=new a(null!==(U=null==v?void 0:v.bubblegumProgram)&&void 0!==U?U:""),we=new a(null!==(R=null==v?void 0:v.compressionProgram)&&void 0!==R?R:""),ye=new a(null!==(x=null==v?void 0:v.treeAuthority)&&void 0!==x?x:"");let ke;ke=(null==v?void 0:v.leafDelegate)?new a(null!==(N=null==v?void 0:v.leafDelegate)&&void 0!==N?N:""):K;const Se=new a(null!==(O=null==v?void 0:v.buyer)&&void 0!==O?O:""),Ae=new a(null!==(F=null==v?void 0:v.logWrapper)&&void 0!==F?F:""),Te=new a(null!==(H=null==v?void 0:v.merkleTree)&&void 0!==H?H:"");return{instruction:new u({programId:ue,keys:[{pubkey:K,isSigner:!0,isWritable:!0},{pubkey:ve,isSigner:!1,isWritable:!0},{pubkey:re,isSigner:!1,isWritable:!0},{pubkey:$,isSigner:!1,isWritable:!0},{pubkey:pe,isSigner:!1,isWritable:!0},{pubkey:ee,isSigner:!1,isWritable:!0},{pubkey:G,isSigner:!1,isWritable:!0},{pubkey:Q,isSigner:!1,isWritable:!0},{pubkey:X,isSigner:!1,isWritable:!0},{pubkey:le,isSigner:!1,isWritable:!0},{pubkey:ce,isSigner:!1,isWritable:!0},{pubkey:de,isSigner:!1,isWritable:!0},{pubkey:he,isSigner:!1,isWritable:!0},{pubkey:we,isSigner:!1,isWritable:!0},{pubkey:ye,isSigner:!1,isWritable:!0},{pubkey:K,isSigner:!1,isWritable:!0},{pubkey:ke,isSigner:!1,isWritable:!0},{pubkey:Se,isSigner:!1,isWritable:!0},{pubkey:Ae,isSigner:!1,isWritable:!0},{pubkey:Te,isSigner:!1,isWritable:!0},...ge],data:Buffer.concat([Buffer.from(null!==(_=null==v?void 0:v.acceptOfferDiscriminator)&&void 0!==_?_:[]),Buffer.from(Uint8Array.of(...fe,...me,...be,...new d(null!==(z=null===(M=null==v?void 0:v.bubblegumArg)||void 0===M?void 0:M.nonce)&&void 0!==z?z:0).toArray("le",8),...new d(null!==(q=null===(J=null==v?void 0:v.bubblegumArg)||void 0===J?void 0:J.index)&&void 0!==q?q:0).toArray("le",8)))])}),connectedPublicKey:K,connection:Z,err:null,usedBalance:oe.usedBalance,buyerVinTokenAccount:pe,pda:le}}catch(e){return{err:null==e?void 0:e.message}}})(e,g,i,f,m,K.native,A,T);if(!Y&&Z){const a={nonNative:K.nonNative,native:K.native-X/o};g("Verifying token balance from the offer account");const l=await v(Q,$),s=(null!==(W=null===(B=l.delegate)||void 0===B?void 0:B.toString())&&void 0!==W?W:"")===ee.toString();if(!l.delegate||!s||l.delegatedAmount<(null!==(D=null===(C=null==A?void 0:A.bubblegumArg)||void 0===C?void 0:C.amount)&&void 0!==D?D:0))return{success:!1,error:"Not enough VIN tokens or approval in the offer account. Try again later or review other offers."};const u=await k(null!==(P=null==A?void 0:A.buyer)&&void 0!==P?P:"",n,T);if(u.nonNative*o<(null!==(V=null===(j=null==A?void 0:A.bubblegumArg)||void 0===j?void 0:j.amount)&&void 0!==V?V:0))return{success:!1,error:"Not enough VIN tokens or approval in the offer account. Try again later or review other offers."};if("phantom"===f.toLowerCase()||"backpack"===f.toLowerCase()){const n=new r({feePayer:G}).add(Z),l=await Q.getLatestBlockhash("confirmed");n.recentBlockhash=l.blockhash,n.lastValidBlockHeight=l.lastValidBlockHeight,n.add(t.setComputeUnitLimit({units:14e5}));const s=await S(T,n.serialize({verifySignatures:!1})),u=t.setComputeUnitPrice({microLamports:s});n.add(u);const c=await Q.getFeeForMessage(n.compileMessage(),"confirmed"),d=a.native*o,v=(null!==(L=null==c?void 0:c.value)&&void 0!==L?L:0)+I*o;if(d<=0||d<v)return{success:!1,error:"Insufficient SOL for initiating the transaction."};try{g("Initiating accept offer transaction.");const e=await(null===(R=null===(U=null==i?void 0:i.adapter)||void 0===U?void 0:U.sendTransaction)||void 0===R?void 0:R.call(U,n,Q,{skipPreflight:!0,preflightCommitment:"confirmed"}));await Q.confirmTransaction(Object.assign({signature:e},l),"confirmed");const o=await Q.getSignatureStatus(e);return null===(null===(x=null==o?void 0:o.value)||void 0===x?void 0:x.err)?{success:!0,response:{hash:e}}:{success:!1,error:"Transaction Failed"}}catch(n){return(null===(O=null===(N=null==n?void 0:n.message)||void 0===N?void 0:N.includes)||void 0===O?void 0:O.call(N,b.USER_REJECTED))||(null===(F=null==n?void 0:n.includes)||void 0===F?void 0:F.call(n,b.USER_REJECTED))||(null===(H=null==n?void 0:n.includes)||void 0===H?void 0:H.call(n,b.USER_DENIED))||(null===(M=null===(_=null==n?void 0:n.message)||void 0===_?void 0:_.includes)||void 0===M?void 0:M.call(_,b.USER_DENIED))?{success:!1,error:"Transaction has been cancelled by user"}:(null==E||E({key:"Additional Data",value:{address:e,balance:K,newBalance:a,providerType:f,chainId:m,path:"Inside an Accept offer solana contract function - 351"}},{exception:n,hint:{data:{path:"Inside an Accept offer solana contract function"}}}),{success:!1,error:y(n)})}}if("magic"===f.toLowerCase()){const e=new r({feePayer:G}).add(Z),n=await Q.getLatestBlockhash("confirmed");e.recentBlockhash=n.blockhash,e.lastValidBlockHeight=n.lastValidBlockHeight,e.add(t.setComputeUnitLimit({units:14e5}));const l=await S(T,e.serialize({verifySignatures:!1})),s=t.setComputeUnitPrice({microLamports:l});e.add(s);const u=await Q.getFeeForMessage(e.compileMessage(),"confirmed"),c=a.native*o,d=(null!==(z=null==u?void 0:u.value)&&void 0!==z?z:0)+I*o;if(c<=0||c<d)return{success:!1,error:"Insufficient SOL for initiating the transaction."};g("Initiating accept offer transaction.");const v=await(null===(J=null==i?void 0:i.solana)||void 0===J?void 0:J.signTransaction(e,{requireAllSignatures:!1,verifySignatures:!0})),f=await Q.sendRawTransaction(Buffer.from(v.rawTransaction,"base64"),{skipPreflight:!0,preflightCommitment:"confirmed"});await Q.confirmTransaction(Object.assign({signature:f},n),"confirmed");const m=await Q.getSignatureStatus(f);return null===(null===(q=null==m?void 0:m.value)||void 0===q?void 0:q.err)?{success:!0,response:{hash:f}}:{success:!1,error:"Transaction Failed"}}}return Y?(null==E||E({key:"Additional Data",value:{address:e,balance:K,providerType:f,chainId:m,path:"Inside an Accept offer solana contract function - 432"}},{exception:Y,hint:{data:{path:"Inside an Accept offer solana contract function - 438"}}}),{success:!1,error:y(Y)}):null}catch(i){return(null===(K=i.message)||void 0===K?void 0:K.includes(b.USER_REJECTED))||(null===(Y=i.message)||void 0===Y?void 0:Y.includes(b.USER_DENIED))?{success:!1,error:"Transaction has been cancelled by user"}:(null==E||E({key:"Additional Data",value:{address:e,_balance:n,providerType:f,chainId:m,path:"Inside an Accept offer solana contract function - 465"}},{exception:i,hint:{data:{path:"Inside an Accept offer solana contract function - 465"}}}),{success:!1,error:y(i)})}};export{T as acceptOfferApproval,E as acceptOfferSolana,A as buyerBalance};