【发布时间】:2022-10-18 09:45:29
【问题描述】:
是否可以在不使用 SDK 的情况下从 OpenSea 市场购买 NFT?
我试图从 OpenSea 浏览器获取 TX 数据,但我认为这是不可能的,因为有 SDK。
按下购买按钮时,我正在检查请求和响应,但没有请求与购买相关,并且没有响应包括 TX 数据。
【问题讨论】:
是否可以在不使用 SDK 的情况下从 OpenSea 市场购买 NFT?
我试图从 OpenSea 浏览器获取 TX 数据,但我认为这是不可能的,因为有 SDK。
按下购买按钮时,我正在检查请求和响应,但没有请求与购买相关,并且没有响应包括 TX 数据。
【问题讨论】:
您需要从 Opensea API 中提取订单结构和签名,然后只需发送带有买家签名(您必须提示)的订单即可完成订单。 过程:
这是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
}
【讨论】: