UNPKG

@mojito-inc/secondary-market

Version:

Mojito secondary market is the platform to purchase NFT.

2 lines (1 loc) 9.7 kB
import{ethers as e}from"ethers";import{PublicKey as i,Connection as n,clusterApiUrl as t,TransactionInstruction as o,LAMPORTS_PER_SOL as r,Transaction as a,ComputeBudgetProgram as s}from"@solana/web3.js";import{getAssociatedTokenAddress as l}from"@solana/spl-token";import u from"bn.js";import c from"bs58";import{Buffer as d}from"buffer";import v from"../constant/contractABI/ListitemERC115.js";import m from"../constant/contractABI/ListitemERC721.js";import{ErrorsType as g}from"../constant/index.js";import{getSolanaEnvByChainId as p}from"./getEtherScanURL.utils.js";import{getVinTokenAddress as b}from"./getVinTokenAddress.utils.js";import{getOrInitializeAccount as f}from"./getOrInitializeAccount.utils.js";import{customErrorMessage as w}from"./customErrorMessage.utils.js";import{getSolanaBalance as h}from"./getSolanaBalance.utils.js";import{fetchSolanaPriorityFee as y}from"./fetchSolanaPriorityFee.utils.js";const k=async({marketPlaceContractAddress:i,tokenContractAddress:n,contractName:t,provider:o})=>{try{const r=o.getSigner(),a=await r.getAddress();if(t.includes("ERC721")){const t=new e.Contract(n,m.abi,r);return await t.isApprovedForAll(a,i)}const s=new e.Contract(n,v.abi,r);return await s.isApprovedForAll(a,i)}catch(e){return!1}},S=async({marketPlaceContractAddress:i,tokenContractAddress:n,contractName:t,provider:o})=>{var r,a;try{const r=o.getSigner();if(t.includes("ERC721")){const t=new e.Contract(n,m.abi,r);return{status:!0,message:await t.setApprovalForAll(i,!0)}}const a=new e.Contract(n,v.abi,r);return{status:!0,message:await a.setApprovalForAll(i,!0)}}catch(e){return(null===(r=e.message)||void 0===r?void 0:r.includes(g.USER_REJECTED))||(null===(a=e.message)||void 0===a?void 0:a.includes(g.USER_DENIED))?{status:!1,message:"Transaction has been cancelled by user"}:{status:!1,message:null==e?void 0:e.message}}},A=async e=>!!e&&(await e.wait(),!!(null==e?void 0:e.hash)),E=async(e,v,m,k,S,A,E,C,L,T=.00228288)=>{var D,I,R,U,P,W,B,j,F,N,_,x,H,V,O,J,M,z,q,Y,G,K,Q,X,Z,$,ee,ie,ne,te,oe,re,ae,se,le,ue,ce,de,ve,me,ge,pe,be,fe;try{if(!k)return{success:!1,error:"Your wallet session has been closed. Please reconnect your wallet to continue."};if(e){const v=new i(e),pe=p(A),be=new n(C||t(pe),{confirmTransactionInitialTimeout:3e5,commitment:"confirmed"}),fe=await h(e,pe,C),we=b(pe,C),he=new i(we),ye=await l(he,v);S("Checking token approval.");const ke=await f(be,ye,v,he,v,S,k,m,fe.native,C);if(!ke.isAvailable)throw new Error("Insufficient SOL for initiating the transaction.");const Se=new i(null!==(D=null==E?void 0:E.bubblegumProgram)&&void 0!==D?D:""),Ae=new i(null!==(I=null==E?void 0:E.compressionProgram)&&void 0!==I?I:""),Ee=new i(null!==(R=null==E?void 0:E.newLeafDelegate)&&void 0!==R?R:""),Ce=new i(null!==(U=null==E?void 0:E.mintAccount)&&void 0!==U?U:""),Le=new i(null!==(P=null==E?void 0:E.newLeafDelegate)&&void 0!==P?P:""),Te=new u(null===(W=null==E?void 0:E.bubblegumListArg)||void 0===W?void 0:W.nonce).toArray("le",8),De=[d.from("marketplace")],[Ie,Re]=i.findProgramAddressSync(De,Le),[Ue,Pe]=i.findProgramAddressSync([d.from("listing_account"),v.toBuffer(),Ce.toBuffer(),Te],Le),We=c.decode(null!==(j=null===(B=null==E?void 0:E.bubblegumListArg)||void 0===B?void 0:B.root)&&void 0!==j?j:""),Be=c.decode(null!==(N=null===(F=null==E?void 0:E.bubblegumListArg)||void 0===F?void 0:F.dataHash)&&void 0!==N?N:""),je=c.decode(null!==(x=null===(_=null==E?void 0:E.bubblegumListArg)||void 0===_?void 0:_.creatorHash)&&void 0!==x?x:"");if(32!==Be.length||32!==je.length)throw new Error("Hash length is not 32 bytes");const Fe=new i(null!==(H=null==E?void 0:E.systemProgram)&&void 0!==H?H:""),Ne=new i(null!==(V=null==E?void 0:E.tokenProgram)&&void 0!==V?V:""),_e=new i(null!==(O=null==E?void 0:E.rent)&&void 0!==O?O:""),xe=Array.from(Array(10).keys()).map((e=>{var n,t,o;return{pubkey:new i(null!==(o=null===(t=null===(n=null==E?void 0:E.bubblegumListArg)||void 0===n?void 0:n.proof)||void 0===t?void 0:t[e])&&void 0!==o?o:""),isSigner:!1,isWritable:!1}}));let He;He=(null==E?void 0:E.previousLeafDelegate)?new i(null==E?void 0:E.previousLeafDelegate):v;const Ve=new o({programId:Ee,keys:[{pubkey:v,isSigner:!0,isWritable:!0},{pubkey:Ce,isSigner:!1,isWritable:!0},{pubkey:Ue,isSigner:!1,isWritable:!0},{pubkey:Fe,isSigner:!1,isWritable:!0},{pubkey:Ne,isSigner:!1,isWritable:!0},{pubkey:_e,isSigner:!1,isWritable:!0},{pubkey:Se,isSigner:!1,isWritable:!0},{pubkey:Ae,isSigner:!1,isWritable:!0},{pubkey:new i(null!==(J=null==E?void 0:E.treeAuthority)&&void 0!==J?J:""),isSigner:!1,isWritable:!0},{pubkey:v,isSigner:!1,isWritable:!0},{pubkey:He,isSigner:!1,isWritable:!0},{pubkey:Ie,isSigner:!1,isWritable:!0},{pubkey:new i(null!==(M=null==E?void 0:E.logWrapper)&&void 0!==M?M:""),isSigner:!1,isWritable:!0},{pubkey:new i(null!==(z=null==E?void 0:E.merkleTree)&&void 0!==z?z:""),isSigner:!1,isWritable:!0},...xe],data:d.concat([d.from(null!==(q=null==E?void 0:E.listDiscriminator)&&void 0!==q?q:[]),d.from(Uint8Array.of(...new u(null!==(G=null===(Y=null==E?void 0:E.bubblegumListArg)||void 0===Y?void 0:Y.price)&&void 0!==G?G:0).toArray("le",8),...We,...Be,...je,...Te,...new u(null!==(Q=null===(K=null==E?void 0:E.bubblegumListArg)||void 0===K?void 0:K.index)&&void 0!==Q?Q:0).toArray("le",4),+(null!==(Z=null===(X=null==E?void 0:E.bubblegumListArg)||void 0===X?void 0:X.isUpdate)&&void 0!==Z&&Z)))])});try{const i={nonNative:fe.nonNative,native:fe.native-ke.usedBalance/r};if("backpack"===(null==m?void 0:m.toLowerCase())||"phantom"===(null==m?void 0:m.toLowerCase())){const n=new a({feePayer:v}).add(Ve),t=await be.getLatestBlockhash("confirmed");n.recentBlockhash=t.blockhash,n.lastValidBlockHeight=t.lastValidBlockHeight,n.add(s.setComputeUnitLimit({units:14e5}));const o=await y(C,n.serialize({verifySignatures:!1})),l=s.setComputeUnitPrice({microLamports:o});n.add(l);const u=await be.getFeeForMessage(n.compileMessage(),"confirmed"),c=i.native*r,d=(null!==($=null==u?void 0:u.value)&&void 0!==$?$:0)+T*r;if(c<=0||c<d)return{success:!1,error:"Insufficient SOL for initiating the transaction."};S("Initiating item listing transaction.");try{const e=await(null===(ie=null===(ee=null==k?void 0:k.adapter)||void 0===ee?void 0:ee.sendTransaction)||void 0===ie?void 0:ie.call(ee,n,be,{skipPreflight:!0,preflightCommitment:"confirmed"}));await be.confirmTransaction(Object.assign({signature:e},t),"confirmed");const i=await be.getSignatureStatus(e);return null===(null===(ne=null==i?void 0:i.value)||void 0===ne?void 0:ne.err)?{success:!0,response:{hash:e,listingReceipt:Ue.toString()}}:{success:!1,error:"Transaction Failed"}}catch(i){return(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,g.USER_REJECTED))||(null===(re=null==i?void 0:i.includes)||void 0===re?void 0:re.call(i,g.USER_REJECTED))||(null===(ae=null==i?void 0:i.includes)||void 0===ae?void 0:ae.call(i,g.USER_DENIED))||(null===(le=null===(se=null==i?void 0:i.message)||void 0===se?void 0:se.includes)||void 0===le?void 0:le.call(se,g.USER_DENIED))?{success:!1,error:"Transaction has been cancelled by user"}:(null==L||L({key:"Additional Data",value:{address:e,balance:fe,providerType:m,chainId:A,path:"Inside an list item solana contract function - 322"}},{exception:i}),{success:!1,error:w(i)})}}if("magic"===(null==m?void 0:m.toLowerCase())){const e=await be.getLatestBlockhash("confirmed"),n=new a({feePayer:v}).add(Ve);n.recentBlockhash=e.blockhash,n.lastValidBlockHeight=e.lastValidBlockHeight,n.add(s.setComputeUnitLimit({units:14e5}));const t=await y(C,n.serialize({verifySignatures:!1})),o=s.setComputeUnitPrice({microLamports:t});n.add(o);const l=await be.getFeeForMessage(n.compileMessage(),"confirmed"),u=i.native*r,c=(null!==(ue=null==l?void 0:l.value)&&void 0!==ue?ue:0)+T*r;if(u<=0||u<c)return{success:!1,error:"Insufficient SOL for initiating the transaction."};S("Initiating item listing transaction.");const m=await(null===(ce=null==k?void 0:k.solana)||void 0===ce?void 0:ce.signTransaction(n,{requireAllSignatures:!1,verifySignatures:!0})),g=await be.sendRawTransaction(d.from(m.rawTransaction,"base64"),{skipPreflight:!0,preflightCommitment:"confirmed"});await be.confirmTransaction(Object.assign({signature:g},e),"confirmed");const p=await be.getSignatureStatus(g);return null===(null===(de=null==p?void 0:p.value)||void 0===de?void 0:de.err)?{success:!0,response:{hash:g,listingReceipt:Ue.toString()}}:{success:!1,error:"Transaction Failed"}}return null}catch(i){return(null===(ve=i.message)||void 0===ve?void 0:ve.includes(g.USER_REJECTED))||(null===(me=i.message)||void 0===me?void 0:me.includes(g.USER_DENIED))?{success:!1,error:"Transaction has been cancelled by user"}:(null===(ge=null==i?void 0:i.message)||void 0===ge?void 0:ge.includes("Assertion failed"))?{success:!1,error:"A maximum of 9,000,000 VIN can be processed per transaction."}:(null==L||L({key:"Additional Data",value:{address:e,balance:fe,providerType:m,chainId:A,path:"Inside an list item solana contract function - 411"}},{exception:i}),{success:!1,error:w(i)})}}return null}catch(i){return(null===(pe=i.message)||void 0===pe?void 0:pe.includes(g.USER_REJECTED))||(null===(be=i.message)||void 0===be?void 0:be.includes(g.USER_DENIED))?{success:!1,error:"Transaction has been cancelled by user"}:(null===(fe=null==i?void 0:i.message)||void 0===fe?void 0:fe.includes("Assertion failed"))?{success:!1,error:"A maximum of 9,000,000 VIN can be processed per transaction."}:(null==L||L({key:"Additional Data",value:{address:e,providerType:m,chainId:A,path:"Inside an list item solana contract function - 445"}},{exception:i}),{success:!1,error:w(i)})}};export{S as approveToken,k as checkApproval,E as listItemSolana,A as waitForApproval};