【问题标题】:Buying NFT from opensea从 opensea 购买 NFT
【发布时间】:2022-10-18 09:45:29
【问题描述】:

是否可以在不使用 SDK 的情况下从 OpenSea 市场购买 NFT?

我试图从 OpenSea 浏览器获取 TX 数据,但我认为这是不可能的,因为有 SDK。

按下购买按钮时,我正在检查请求和响应,但没有请求与购买相关,并且没有响应包括 TX 数据。

【问题讨论】:

    标签: ethereum nft opensea


    【解决方案1】:

    您需要从 Opensea API 中提取订单结构和签名,然后只需发送带有买家签名(您必须提示)的订单即可完成订单。 过程:

    1. 从 Opensea API 获取订单
    2. 获取买家签名
    3. 向Seaport SDK提交订单以完成订单

      这是1)的代码

       var contract = req.query.contract;
              var token_id = req.query.tokenID;
              const options = {
                  method: 'GET',
                  headers: { Accept: 'application/json', 'X-API-KEY': API-KEY }
              };
      
              fetch('https://api.opensea.io/api/v1/assets?token_ids=' + token_id + '&order_direction=desc&asset_contract_address=' + contract + '&limit=20&include_orders=true', options)
                  .then(response => response.json())
                  .then(response => {
                      console.log(response)
                      res.send(
                          {
                              wyvern_orders: response.assets[0].sell_orders,
                              seaport_sell_orders: response.assets[0].seaport_sell_orders
                          }
                      )
                  })
                  .catch(err => {
                      res.send({ msg: "error", err: err })
                  });
      

      我将上面的这个集成到一个不同的 api 中单独调用,所以在下面你会看到它是一个对那个 url 的获取来获取那个数据。此外,您会看到我提示用户签名,然后,我会将订单发送到 Seaport 的履行订单。

      export async function buyNFT(contract_address, token_id) {
      
              const buy = async() => {
                  try {
                      // create the seaport instance with the provider
                      const provider = new ethers.providers.Web3Provider(window.ethereum);
                      const seaport = new Seaport(provider);
                      const url = "www.personalApiURl.com/..."
                      const options = {
                          method: "GET",
                      }
                      // get the buyer and order
                      let buyer = await getBuyer()
                      let data = await fetch(url, options)
                      let res = await data.json()
                      if (res["seaport_sell_orders"] === null) {
                          console.log("Error getting orders, may not exist for NFT")
                          return
                      }
                      // get the order for that listing
                      let full_order = res["seaport_sell_orders"][0]["protocol_data"]
                      // calculate the tip
                      let new_tip = await getTip(full_order["parameters"])
                      if (new_tip === "E") { 
                          console.log("error getting tip")
                          return 
                      } // return if can't get price
                      // now execute buy order
                      if (typeof seaport !== "undefined" && full_order) {
                          const { executeAllActions: executeAllFullfillActions} = await seaport.fulfillOrder({
                              order: full_order,
                              tips: new_tip,
                              accountAddress: buyer
                          })
                          const transaction = await executeAllFullfillActions()
                          if (transaction[code] === 4001) {
                              console.log("They denied transaction")
                              return
                          }
                      }
                  } catch(error) {
                      console.log("Error in purchasing NFT")
                      console.log(error)
                  }
              }
      
              async function doAll() {
                  // await sell()
                  await buy()
              }
              doAll()
          }
      

      这也是 calculateTip 函数。如果您想向另一个地址添加额外的小费或费用,则需要这样做。这是通过 Seaport SDK 启用的。

      async function getTip(full_order) {
              // calculate the tip pricing 
              const receiver_address = "0x0"
              //get the full real price without fees
              let real_price = getRealPrice(full_order["consideration"])
              if (real_price === "E") {return "E"}
              // if you have a price, calculate tip
              let tip_percent = ethers.BigNumber.from("100")
              let price = ethers.BigNumber.from(real_price)
              let tipping_price = price.div(tip_percent)
              // create the tip
              let new_tip = [{
                  itemType: 0, //ETH
                  token: "0x0000000000000000000000000000000000000000", 
                  identifier: "0",
                  amount: tipping_price,
                  recipient: receiver_address
              }]
              return new_tip
          }
      

    【讨论】:

      猜你喜欢
      • 2022-12-10
      • 2021-11-21
      • 1970-01-01
      • 2022-07-04
      • 2022-03-08
      • 2022-08-22
      • 2022-12-03
      • 2022-12-11
      • 2022-11-19
      相关资源
      最近更新 更多