Найти тему
TRON DAO Russia

Революция в торговле цифровыми активами: Лучшая торговая площадка NFT на BTTC

Оглавление

Добро пожаловать в будущее торговли цифровыми активами! Сегодня мы погрузимся в тонкости децентрализованного рынка NFT, построенного на BitTorrent Chain (BTTC). Эта торговая площадка предназначена для облегчения торговли невзаимозаменяемыми токенами (NFT), объединяя механизмы аукционов, комиссионные за транзакции и надежные функции безопасности. Независимо от того, являетесь ли вы создателем, коллекционером или трейдером, этот контракт обеспечивает безопасную и прозрачную среду для всех ваших транзакций NFT.

Контракт MarketPlace: ваш путь к децентрализованной торговле NFT

Контракт MarketPlace — это комплексное решение для управления транзакциями NFT. Он поддерживает создание и управление ордерами на продажу, участие в торгах на NFT и выполнение сделок. Давайте разберем ключевые компоненты и функции этого контракта.

Состояния переменных и структуры

Контракт определяет несколько переменных состояния и структур данных для управления ордерами, ставками и административными настройками:

-2

Ключевые функции

Административные функции

Эти функции позволяют администратору управлять различными аспектами рынка:

  • Установить адрес администратора: Обновляет кошелек администратора, куда будут поступать все комиссионные.
function setAdminAddress(address _newAdminWallet) external override returns (bool) {
require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Caller is not a admin");
require(_newAdminWallet != address(0), "Admin Wallet cannot be empty address");
emit UpdateAdminWallet(_adminAddress, _newAdminWallet);
_adminAddress = _newAdminWallet;
return true;
}
  • Установить процент комиссии: Обновляет процент комиссии администратора.
function setCommissionPercentage(uint8 _commissionPercentage) external override returns (bool) {
require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Caller is not a admin");
_adminCommissionPercentage = _commissionPercentage;
emit CommissionUpdated(_adminCommissionPercentage);
return true;
}
  • Обновить валюту: Обновляется валюта, принятая к участию в торгах.
function updateCurrency(address _tokenAddress, bool _status) external override returns (bool) {
require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Caller is not a admin");
approvedCurrency[_tokenAddress] = _status;
return true;
}
  • Обновление контракта NFT: добавляет новый NFT на рынок.
function updateNFTContract(address _tokenAddress, bool _status) external override returns (bool) {
require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Caller is not a admin");
approvedNfts[_tokenAddress] = _status;
return true;
}

Функции управления ордерами

Эти функции отвечают за создание, управление и выполнение ордеров:

  • Установить ордер: создает новый ордер на продажу NFT.
function setOrder(address _nftContract, uint256 _tokenId, address _currency, uint256 _askAmount, uint256 _expiryTime)
whenNotPaused
external
override
{
_orderIds += 1;

require(approvedNfts[_nftContract], "NFT is not approved by admin");
require(approvedCurrency[_currency], "Currency is not approved by admin");
require(_askAmount > 0, "Ask Amount Cannot be Zero");
require(_expiryTime > block.timestamp, "Expiry Time cannot be in Past");
ERC721 nftContract = ERC721(_nftContract);
require(nftContract.ownerOf(_tokenId) == msg.sender, "You are not owner of Token Id");
bool isAllTokenApproved = nftContract.isApprovedForAll(_msgSender(), address(this));
address approvedSpenderOfToken = nftContract.getApproved(_tokenId);
require((isAllTokenApproved || approvedSpenderOfToken == address(this)), "Market Contract is not allowed to manage this Token ID");

uint256 currentOrderId = _orderIds;
IUtils.Order storage order = _orders[currentOrderId];

order.orderId = currentOrderId;
order.sender = _msgSender();
order.askAmount = _askAmount;
order.currency = _currency;
order.nftContract = _nftContract;
order.tokenId = _tokenId;
order.expiryTime = _expiryTime;
order.orderStatus = IUtils.OrderStatus.OPEN;
order.createdAt = block.timestamp;
order.updatedAt = block.timestamp;

emit OrderCreated(currentOrderId, order);
}
  • Получить ордер: получает сведения о конкретном ордере по его идентификатору.
function getOrder(uint256 _orderId) external override view returns (IUtils.Order memory) {
return _orders[_orderId];
}
Cancel Order: Allows the order creator or an admin to cancel an open order.
function cancelOrder(uint256 _orderId) whenNotPaused external override returns (bool) {
IUtils.Order storage order = _orders[_orderId];

require(order.sender != address(0), "Invalid Order Id");
require(order.orderStatus == IUtils.OrderStatus.OPEN, "Order status is not Open");
bool hasAdminRole = hasRole(DEFAULT_ADMIN_ROLE, _msgSender());
require(order.sender == _msgSender() || hasAdminRole, "You Don't have right to cancel order");

order.orderStatus = IUtils.OrderStatus.CANCELED;
emit OrderRemoved(_orderId, order);
return true;
}
  • Завершить ордер: Выполнение покупок NFT по открытым ордерам.
function completeOrder(uint256 _orderId) whenNotPaused external override returns (bool) {
IUtils.Order storage order = _orders[_orderId];

require(order.sender != address(0), "Invalid Order Id");
require(order.orderStatus == IUtils.OrderStatus.OPEN, "Order status is not Open");
IERC20 token = IERC20(order.currency);
ERC721 nft = ERC721(order.nftContract);
require(block.timestamp <= order.expiryTime, "Order is expired");
require(token.balanceOf(_msgSender()) >= order.askAmount, "Not enough funds available to buy");
require(token.allowance(_msgSender(), address(this)) >= order.askAmount, "Please Approve Tokens Before You Buy");

uint256 _amountToDistribute = order.askAmount;
uint256 adminCommission = (_amountToDistribute * (_adminCommissionPercentage * EXPO)) / (BASE);
uint256 _amount = _amountToDistribute - adminCommission;

token.safeTransferFrom(_msgSender(), _adminAddress, adminCommission);
token.safeTransferFrom(_msgSender(), order.sender, _amount);
nft.transferFrom(order.sender, _msgSender(), order.tokenId);

order.orderStatus = IUtils.OrderStatus.COMPLETED;
order.recipient = _msgSender();
emit OrderCompleted(order.orderId, order);
return true;
}

Функции управления ставками

Эти функции отвечают за создание, управление и выполнение ставков:

  • Добавить ставку: позволяет пользователям делать ставки на NFT.
function addBid(address _nftContract, uint256 _tokenId, address _currency, uint256 _bidAmount, uint256 _expiryTime)
whenNotPaused
external
override
{
_bidIds += 1;

require(approvedNfts[_nftContract], "NFT is not approved by admin");
require(approvedCurrency[_currency], "Currency is not approved by admin");
require(_bidAmount > 0, "Bid Amount Cannot be Zero");
require(_expiryTime > block.timestamp, "Expiry Time cannot be in Past");

ERC721 nft = ERC721(_nftContract);
require(nft.ownerOf(_tokenId) != msg.sender, "You Can't Bid on your Own Token");

IERC20 token = IERC20(_currency);
require(token.balanceOf(_msgSender()) >= _bidAmount, "Not enough funds available to add bid");
require(token.allowance(_msgSender(), address(this)) >= _bidAmount, "Please Approve Tokens Before You Bid");

uint256 currentBidId = _bidIds;
IUtils.Bid storage bid = _bids[currentBidId];

bid.bidId = currentBidId;
bid.sender = _msgSender();
bid.bidAmount = _bidAmount;
bid.currency = _currency;
bid.nftContract = _nftContract;
bid.tokenId = _tokenId;
bid.expiryTime = _expiryTime;
bid.bidStatus = IUtils.OrderStatus.OPEN;
bid.createdAt = block.timestamp;
bid.updatedAt = block.timestamp;

emit BidAdded(currentBidId, bid);
}
  • Отменить ставку: позволяет участнику публичных торгов, владельцу NFT или администратору отменить открытую ставку.
function cancelBid(uint256 _bidId) whenNotPaused external override returns (bool) {
IUtils.Bid storage bid = _bids[_bidId];

require(bid.sender != address(0), "Invalid Bid Id");
require(bid.bidStatus == IUtils.OrderStatus.OPEN, "Bid status is not Open");
bool hasAdminRole = hasRole(DEFAULT_ADMIN_ROLE, _msgSender());

ERC721 nft = ERC721(bid.nftContract);
require(bid.sender == _msgSender() || nft.ownerOf(bid.tokenId) == _msgSender() || hasAdminRole, "You Don't have right to cancel bid");

bid.bidStatus = IUtils.OrderStatus.CANCELED;
emit BidRemoved(_bidId, bid);
return true;
}
  • Принять ставку: позволяет владельцу NFT принять ставку, перечислив NFT участнику публичных торгов, а сумму ставки (за вычетом комиссии) владельцу NFT.
function acceptBid(uint256 _bidId) whenNotPaused external override returns (bool) {
IUtils.Bid storage bid = _bids[_bidId];

require(bid.sender != address(0), "Invalid Bid Id");
require(bid.bidStatus == IUtils.OrderStatus.OPEN, "Bid status is not Open");
require(block.timestamp <= bid.expiryTime, "Bid is expired");

IERC20 token = IERC20(bid.currency);
ERC721 nft = ERC721(bid.nftContract);
require(nft.ownerOf(bid.tokenId) == msg.sender, "You are not owner of Token Id");

require(token.balanceOf(bid.sender) >= bid.bidAmount, "Bidder doesn't have Enough Funds");
require(token.allowance(bid.sender, address(this)) >= bid.bidAmount, "Bidder has not Approved Tokens");

bool isAllTokenApproved = nft.isApprovedForAll(_msgSender(), address(this));
address approvedSpenderOfToken = nft.getApproved(bid.tokenId);
require((isAllTokenApproved || approvedSpenderOfToken == address(this)), "Market Contract is not allowed to manage this Token ID");

uint256 _amountToDistribute = bid.bidAmount;
uint256 adminCommission = (_amountToDistribute * (_adminCommissionPercentage * EXPO)) / (BASE);
uint256 _amount = _amountToDistribute - adminCommission;

nft.transferFrom(_msgSender(), bid.sender, bid.tokenId);
token.safeTransferFrom(bid.sender, _adminAddress, adminCommission);
token.safeTransferFrom(bid.sender, _msgSender(), _amount);

bid.bidStatus = IUtils.OrderStatus.COMPLETED;
bid.recipient = _msgSender();
emit BidAccepted(bid.bidId, bid);
return true;
}

Заключение

Контракт MarketPlace — это комплексное решение для управления транзакциями NFT. Используя силу смарт-контрактов, он обеспечивает прозрачность, безопасность и эффективность в процессе торговли. Независимо от того, создаете ли вы новые NFT, делаете ставки на уникальные цифровые активы или управляете торговой площадкой, этот контракт предоставляет инструменты, необходимые для успеха в динамичном мире цифровых активов на основе блокчейна.

Github URL:

https://github.com/adeelch9/bttc-examples/tree/master/projects/nft-marketplace

. . .

Бонусный раздел: более глубокий взгляд на смарт-контракты BTTC

Мы лишь вскользь упомянули о том, что возможно с помощью смарт-контрактов в сети BitTorrent. Для тех, кто хочет поднять свои навыки разработки блокчейна на новый уровень, в нашем репозитории на GitHub вас ждет сокровищница ресурсов!

🚀 Изучите весь проект

Перейдите в наш репозиторий примеров BTTC на GitHub, чтобы открыть для себя множество дополнительного контента и функций:

  1. Полный код контракта: хотя мы рассмотрели основные функции, репозиторий содержит полный код смарт-контракта, включая любые методы, которые мы не смогли здесь обсудить.
  2. Скрипты развертывания: Вы когда-нибудь задумывались, как развернуть свои смарт-контракты в сети BTTC? Мы подготовили для вас готовые сценарии развертывания, которые упрощают процесс.
  3. Комплексные тесты: Написание тестов для смарт-контрактов имеет решающее значение для обеспечения их надежности и безопасности. Наш репозиторий включает набор тестов, демонстрирующих лучшие практики в тестировании смарт-контрактов.
  4. Множество проектов: помимо контракта, который мы обсудили сегодня, вы найдете множество других примеров смарт-контрактов, от простых до сложных, демонстрирующих различные аспекты разработки блокчейна на BTTC.
  5. Документация: Подробные файлы README и встроенные примечания предоставляют дополнительный контекст и пояснения, облегчая понимание и модификацию кода для ваших собственных проектов.

🛠️подготовка к работе

Чтобы максимально эффективно использовать эти ресурсы:

  1. Клонировать репозиторий: git clone https://github.com/adeelch9/bttc-examples.git
  2. Перейти в каталог проекта по вашему выбору
  3. Следовать инструкциям по настройке в файле README проекта
  4. Поэкспериментировать с контрактами, запустите тесты и попробуйте развернуть их в тестовой сети

🌟 Почему это важно

Ознакомившись с полным репозиторием, вы получите:

- Более глубокое понимание разработки смарт-контрактов

- Практический опыт развертывания и тестирования

- Знакомство с лучшими практиками в разработке блокчейнов

- Вдохновение для ваших собственных проектов BTTC

Независимо от того, являетесь ли вы новичком, желающим учиться, или опытным разработчиком, стремящимся усовершенствовать свои навыки, наш репозиторий примеров BTTC — это ваш путь к освоению разработки смарт-контрактов в цепочке BitTorrent.

Удачного создания токенов, будущий криптомагнат!