使用荷兰式拍卖模型以最优惠的价格出售您的 NFT

使用荷兰式拍卖模型以最优惠的价格出售您的 NFT

未标题-3

img

拍卖是一种流行的方法,它可以以最好的价格出售NFT。

有一些拍卖技巧是为了出售我们的NFT收藏品,但荷兰式拍卖不同于其他技巧,它的使用频率更高。

与常规拍卖不同的是,在荷兰式拍卖中,价格开始时很高,然后在预定的时间间隔内慢慢下降。

img

简单地说,在荷兰式拍卖中,NFT的价格从初始价格(上限)开始,并定期下降一个固定额度(例如,每 10 分钟下降 0.1 ETH),直到它达到最低价格。

荷兰式拍卖为何如此受欢迎?

其中一个原因可能与区块链上的gas战争有关。

Gas Wars是指在交易吞吐量较低的以太坊等区块链上同时启动大量交易时,会出现区块链 Gas 费用的飙升。

荷兰式拍卖被用来将多余的铸币费从矿工转移到艺术家身上,或用于资助特定的慈善机构或社区 DAO。

先决条件

在Remix IDE中创建一个名为NFT.sol的新文件并粘贴我们之前使用的合约。

编写智能合约

在我们的Remix IDE中创建一个新的solidity文件,并将其命名为DutchAuction.sol。

创建一个IERC-721接口,然后初始化Dutch Auction合约。

请参考以下代码:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;interface IERC721 {
    function transferFrom(
        address _from,
        address _to,
        uint _nftId
    ) external;
}
contract DutchAuction { }

初始化合约后,我们将定义一些必须在合约中使用的变量。

  • 首先,我们要定义拍卖的持续时间。这意味着NFT的拍卖将在此期限后终止。我们将定义持续时间为2天。
  • 接下来,我们需要存储NFT的地址和它的ID。因此,我们将使用IERC721接口来存储NFT。

我们将这个变量设置为不可变的,这样一旦部署合约,它的值就不会改变。

  • 然后,我们将存储卖家的地址。因此,我们将定义变量seller,它将存储卖家的地址。
  • 荷兰式拍卖需要一个起拍价。我们将定义一个变量startingPrice
  • 我们还需要拍卖开始和结束的时间戳。因此,我们将定义两个变量startAt和expiresAt,它们将存储各自的值。
  • 最后,我们将定义discountRate. DiscountRate 将确定价格下降的速率。
uint private constant DURATION = 2 days;
IERC721 public immutable nft;
uint public immutable nftId;
address public immutable seller;
uint public immutable startingPrice;
uint public immutable startAt;
uint public immutable expiresAt;
uint public immutable discountRate;

接下来,我们将在构造函数中初始化这些状态变量。

在其中,我们将传入*_startingPrice、_discountRate、_nft_nftId。*

constructor(
        uint _startingPrice,
        uint _discountRate,
        address _nft,
        uint _nftId
    ) { }
  • 在构造函数中,我们将卖家设置为该合约的部署者。并且一旦NFT被售出,我们需要将 ETH 转移给卖家,我们会进行支付。
seller = payable(msg.sender);
  • 我们将获取用户的输入,以获得startingPrice、discountRate、startAt 和expireAt。因此,我们将其写成:
startingPrice = _startingPrice;
discountRate = _discountRate;
startAt = block.timestamp;
expiresAt = block.timestamp + DURATION;
  • 我们也会检查NFT的价格是否总是大于零。
_startingPrice >= _discountRate * DURATION, "Starting Price is less than the discount offered"

_discountRate * DURATION 是应用于startingPrice 的最大价格扣除额

  • 最后,我们输入设置NFT。所以我们可以说:
nft = IERC721(_nft);
nftId = _nftId;

我们的构造函数已经完成了。

接下来,我们将定义两个将进一步使用的函数:currentPrice()和buyNow()

  • 使用currentPrice(),我们将知道NFT在特定时间里的价格。

代码:

function currentPrice() public view returns (uint) {
        uint timeElapsed = block.timestamp - startAt;
        uint discount = discountRate * timeElapsed;
        return startingPrice - discount;
}
  • 接下来,使用buyNow()函数,用户将能够购买NFT。
function buy() external payable {
        require(block.timestamp < expiresAt, "Auction expired! :(");
        uint price = currentPrice();
        require(msg.value >= price, "ETH is less than the price");
        nft.transferFrom(seller, msg.sender, nftId);
        selfdestruct(seller);
    }

在这个函数中,首先,我们将检查拍卖是否过期。

如果拍卖没有到期,那么我们将获取当前价格并使用currentPrice函数将其存储在price变量中。

接下来,我们将检查发送的金额是否大于或等于价格。

一旦我们知道 msg.sender已经发送了足够的ETH来购买NFT,我们将使用3个参数来转移NFT的所有权:seller、msg.sender、nftId。

最后,我们使用了selfdestruct()函数来结束拍卖。因此,我们将在函数内部传递卖家地址。

我们的合约应该是这样的:

img

接下来,我们将通过销售NFT测试荷兰拍卖智能合约。

使用tokenURI来创建我们的NFT

现在我们将部署这个NFT,然后使用它的tokenURI调用mint函数。

img

一旦我们创造了NFT。接下来我们要使用我们的荷兰拍卖合约。

部署荷兰式拍卖合约

编写荷兰式拍卖合约,然后部署它。

为了部署我们的合约,我们必须传递一些参数。

设置startingPrice为1000000, discountRate为1,我们刚刚部署的NFT地址,最后,我们必须提供等于1的tokenId 。

添加了参数后,单击Deploy按钮部署我们的合约。

img

只要我们的荷兰式拍卖合约生效。我们接下来要做的是批准荷兰式拍卖来使用我们的NFT。

为此,我们将打开部署合约下的NFT,并执行审批功能。

我们需要传递荷兰式的部署地址和NFT的代币id来运行审批函数。

img

要检查荷兰式拍卖是否已经启动,请打开已部署的荷兰式拍卖合约,并运行currentPrice函数几次。你会注意到每次你运行这个函数,都会得到一个递减的价格值。

现在是时候出售我们的NFT了。

使用荷兰式拍卖合约来出售我们的NFT

首先,运行currentPrice函数并复制价格值。

然后切换到我们想从中购买 NFT 的其他帐户,并将价格值粘贴到value选项下。

然后运行buyNow函数。

img

回到我们的NFT合约并运行ownerOf函数,就可以看到合约的所有者被更新了。

这就是我们如何使用荷兰式拍卖出售我们的NFT。

Source:https://medium.com/uv-labs/learn-how-to-sell-your-nfts-at-the-best-price-using-the-dutch-auction-model-2881261b09e3

关于

ChinaDeFi - ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。

Layer 2道友 - 欢迎对Layer 2感兴趣的区块链技术爱好者、研究分析人与Gavin(微信: chinadefi)联系,共同探讨Layer 2带来的落地机遇。敬请关注我们的微信公众号 “去中心化金融社区”

img

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值