И почему вы хотите сделать это в первую очередь прежде чем совершать покупки и иные виды транзакций.
Чтение смарт-контракта дает вам представление о популярности проекта, о том, насколько распределено владение (ownership) внутри него и на что он способен, то есть его функционал.
Кроме того, вы можете исследовать детали каждой транзакции. Большое преимущество в web3.
Когда-нибудь такого рода информацию, вероятно, будут преподавать в школах.
1. Во-первых, что такое смарт-контракт?
Это программа, которая выполняет код в блокчейне при соблюдении условий. Стороны подписывают контракт в цифровой форме, давая разрешение на его исполнение.
Это может быть что угодно, от отправки денег другу до дробления (fractionalization) NFT.
2. Как найти смарт-контракт?
Контракты, транзакции и кошельки Ethereum доступны для просмотра на Etherscan.
Чтобы найти контракт NFT, перейдите к списку на OpenSea и нажмите «Подробности». Это показывает ссылку «Контрактный адрес». Нажмите на нее.
Здесь есть на что посмотреть, так что давайте разберемся.
Balance + Value: Это показывает, сколько монет содержится в контракте.
My name tag: Если вы вошли в систему, вы можете создавать личные заметки для себя здесь.
Creator: Кошелек, создавший контракт, и ссылка на исходный txn. Нажмите на него.
Здесь у нас есть подробная информация о транзакции, которая создала контракт.
Мы можем видеть:
— Подтверждение сделки (Transaction confirmation)
— Временная метка (Timestamp)
— Количество отчеканенных каждого токена (Quantity minted of each token)
— Создатель контракта (Contract creator)
— Сборы уплачены (Fees paid)
Хорошая вещь. Теперь вернемся к основному контракту.
3. Трекер
Нажмите, чтобы узнать:
— Минимальная стоимость токена (minimum token value)
— Максимальное общее количество токена (если установлен максимум) (max total supply of the token)
— Сколько кошельков держат токен (how many wallets hold the token)
— Сколько перемещений произошло (how many transfers have occurred)
Очень ценная информация. Но есть еще одна интересная вещь, о которой большинство людей не знает.
4. Нажмите «Holders» в списке вкладок.
Это отображает рейтинг тех, у кого больше всего токенов в контракте.
Если вы нажмете «Token holders chart», вы даже сможете увидеть диаграмму.
Хорошо, вернемся на главную страницу контракта.
5. Переходим во вкладку «Transactions»
Столбец 1 представляет собой хронологический список всех транзакций. На каждую можно нажать.
Далее идет «Метод». Это функции, выполняемые через контракт. Каждый контракт уникален, но общие для большинства контрактов методы включают mint, transfer и approval.
6. Теперь давайте исследуем вкладку «Contracts»
Code: отображает исходный код контракта.
Reading contract: отображение функций.
Write Contract: позволяет инициировать функции (если у вашего кошелька есть разрешение), такие как сжигание токенов, предоставление ролей, приостановка и многое другое.
7. Наконец, давайте проверим «Analytics»
Здесь мы находим графики, демонстрирующие транзакции, комиссии, баланс ETH и многое другое. На приведенной ниже диаграмме показан рост Cryptopunks.
Я также рекомендую @nansen_ai для получения более подробной информации об объеме, перекрытиях кошельков проектов, известных держателях токенов и многом другом.
Автор: Chris Cantino
Перейти к контенту
Чтобы найти адрес смарт контракта NFT на OpenSea, нажмите [Details], и вы увидите адрес контракта и идентификатор токена. Адрес контракта относится к адресу, где контракт развернут на Ethereum, в то время как Token ID относится к этому конкретному NFT.
В качестве примера мы будем использовать токен ERC-721.
Всегда выбирайте совместимую сеть (ETH / BSC) для вашего NFT, иначе ваш актив может быть потерян и не может быть восстановлен.
Для гарантий успешного ввода и вывода NFT просто вставьте адрес контракта в [Адрес контракта] во время процесса депозита. Не вводите адрес вручную.
Как найти адрес контракта NFT на BinanceNFT
Для того что бы узнать адрес смарт контракта NFT на бирже Binance NFT: нажмите на интересующий вас NFT, информация будет слева внизу, в описании «Подробнее»
( 1 оценка, среднее 5 из 5 )
Время на прочтение
15 мин
Количество просмотров 11K
Примерно раз в год у меня появляется неутолимая жажда накопать много данных и что-то с ними сделать. В этот раз мой выбор пал на маркетплейс NFT OpenSea. Меня осенило что блокчейн – это про открытые данные, а учитывая 1.2 миллиона транзакций в сети ETH каждый день – то это ещё и много данных, так что точно должно быть интересно.
В этом туториале я расскажу откуда можно достать данные о транзакциях блокчейна ETH, и как эти данные анализировать, в частности, как находить самые дорогие транзакции. И самое главное – бонус, небольшая игра в сыщиков в конце статьи.
Где достать данные?
Вопросов с тем, откуда доставать данные у меня практически не было. Наверняка, большинство из тех кто имел дело с ETH знает что такое Etherscan. Если кратко, то это платформа, на которой можно посмотреть детальную информацию по каждой транзакции и в целом краткую статистику про Etherium. Оставалось надеяться на то, что у них есть API.
Регистрируемся и забираем 100 тысяч бесплатных обращений в день, достаточно щедро, вряд ли нам понадобится больше.
Давайте разберёмся с тем, какие эндпоинты API нам понадобятся. Находим достаточно удобный, возвращающий логи исполнения смарт контрактов. Находим адрес смарт контракта OpenSea и пишем достаточно простой запрос.
OPENSEA_CONTRACT = '0x7Be8076f4EA4A4AD08075C2508e481d6C946D12b'
url = '<https://api.etherscan.io/api>'
params = {
'module': 'logs',
'action': 'getLogs',
'fromBlock' : BLOCK_START,
'toBlock': 'latest',
'address': OPENSEA_CONTRACT,
'apikey': API_KEY
}
r = requests.get(url, params=params)
json_data = json.loads(r.text)["result"]
Данный эндпоинт в качестве входных данных также принимает номер блока, начиная с которого он собирает логи смарт контракта. Узнать номер текущего последнего сгенерированного блока можно либо на сайте Etherscan, либо можно обратиться к ещё одному эндпоинту, который в качестве параметра принимает время, timestamp и возвращает номер блока ближайшего к этому времени. Передав текущее время получаем номер последнего сгенерированного блока.
url = '<https://api.etherscan.io/api>'
params = {
'module': 'block',
'action': 'getblocknobytime',
'timestamp' : int(time.time() // 1),
'closest': 'before',
'apikey': API_KEY
}
r = requests.get(url, params=params)
json_data = json.loads(r.text)["result"]
LATEST_BLOCK = int(json_data)
В силу того, что первый эндпоинт возвращает максимум 1000 транзакций получить сразу все транзакции с OpenSea за один запрос у нас не получится. Путём экспериментов я установил, что примерно в 40 блоках набирается 600-900 транзакций с OpenSea. Таким образом:
BLOCK_START = LATEST_BLOCK - 40
Давайте разберёмся с тем, какие данные отдаёт нам наш эндпоинт. А отдаёт он нам массив примерно таких вот структур.
{ 'address': '0x7be8076f4ea4a4ad08075c2508e481d6c946d12b',
'topics':
['0xc4109843e0b7d514e4c093114b863f8e7d8d9a458c372cd51bfe526b588006c9',
'0x000000000000000000000000c6ac8a42344b750b9de0e71289292b620c328131',
'0x0000000000000000000000007f61d795439562fa791c3d468e8738125f0a9866',
'0x0000000000000000000000000000000000000000000000000000000000000000'],
'data': '0x00000000000000000000000000000000000000000000000000000000000000007656e0665c6bdc38947d580d2e8c4c19ba8fa4019abb8fef31cfaa1b7645f00d000000000000000000000000000000000000000000000000027f7d0bdb920000',
'blockNumber': '0xd82788',
'timeStamp': '0x62027a71',
'gasPrice': '0xdb7c42e2a',
'gasUsed': '0x2f283',
'logIndex': '0x182',
'transactionHash': '0xcfff81e158623e66ab53be47f342e1cb170f05a1461c56b8c0523f96ea042409',
'transactionIndex': '0x116'}
Выглядит устрашающе, но давайте разбираться. Для начала отмечу, что все данные тут в hex формате, то есть в системе счисления с основанием 16. Самая вкуснятинка и нужные нам данные кроются в topics
и data
, но что это такое и как это понимать?
Как устроены Логи транзакций
Во время своей работы смарт контракты создают события, таким образом они уведомляют о том что была вызвана какия-либо функция или метод. Лог транзакции состоит из событий, сгенерированных смарт контрактами, с которых было взаимодействие в рамках транзакции. В случае смарт контракта OpenSea при продаже NFT от одного пользователя другому создаётся событие с названием OrdersMatched
.
Вот так вот выглядит это событие, при просмотре деталей транзакции через Etherscan.
Данные, передаваемые событием хранятся в объекте topics
и data
.
topics
– это массив, который содержит в себе данные о событии и его параметрах. Максимальный размер массива topics
– 4 элемента. topics[0]
, нулевой элемент массива – это “подписанное” название метода. Остальные элементы массива topics
и “кусок даных” data
содержат в себе более детальные данные о транзакции – продавца, покупателя и цену сделки.
Более детально рассмотрим эти данные, на базе нашего метода и примера ответа API:
Событие OrdersMatched вместе со всеми своими параметрами.
OrdersMatched (bytes32 buyHash, bytes32 sellHash,
index_topic_1 address maker, index_topic_2 address taker,
uint256 price, index_topic_3 bytes32 metadata)
{'topics':
['0xc4109843e0b7d514e4c093114b863f8e7d8d9a458c372cd51bfe526b588006c9',
'0x000000000000000000000000c6ac8a42344b750b9de0e71289292b620c328131',
'0x0000000000000000000000007f61d795439562fa791c3d468e8738125f0a9866',
'0x0000000000000000000000000000000000000000000000000000000000000000'],
'data': '0x00000000000000000000000000000000000000000000000000000000000000007656e0665c6bdc38947d580d2e8c4c19ba8fa4019abb8fef31cfaa1b7645f00d000000000000000000000000000000000000000000000000027f7d0bdb920000'
}
-
topics[0]
– подписанное название метода и типов данных его параметров.
Таким образом подписывается название метода OrdersMatched
, совместно с типами параметров метода:
from Crypto.Hash import keccak
method = b'OrdersMatched(bytes32,bytes32,address,address,uint256,bytes32)'
k = keccak.new(digest_bits=256)
k.update(method)
print('0x'+k.hexdigest())
Out[]: 0xc4109843e0b7d514e4c093114b863f8e7d8d9a458c372cd51bfe526b588006c9
-
topics[1]
–index_topic_1 address maker
адрес продавца, 20 байтов, который дополнен нулями до 32.
topics[1] = '0x000000000000000000000000c6ac8a42344b750b9de0e71289292b620c328131'
address_maker = '0xc6ac8a42344b750b9de0e71289292b620c328131'
-
topics[2]
–index_topic_2 address taker
адрес покупателя, также 20 байт, дополненные нулями до 32.
topics[2] = '0x0000000000000000000000007f61d795439562fa791c3d468e8738125f0a9866'
address_taker = '0x7f61d795439562fa791c3d468e8738125f0a9866'
-
topics[3]
–index_topic_3 bytes32 metadata
метаданные, по опыту скарпинга транзакций в большей части случаев – нулевые данные.
Все те параметры функции, которые “не влезли” в topics
передаются в data
. В случае рассматриваемой функции это будут bytes32 buyHash
, bytes32 sellHash
и uint256 price
. Все три этих параметра просто напросто конкатенированы в один кусок данных в порядке их указания в параметрах функции.
Наиболее интересный нам параметр, цена сделки, хранится в последних 256 битах куска данных (то есть 32 байта и 64 символа hex представления). Аккуратно взяв кусочек строки и конвертировав его в число мы сможем узнать цену:
data = "0x00000000000000000000000000000000000000000000000000000000000000007656e0665c6bdc38947d580d2e8c4c19ba8fa4019abb8fef31cfaa1b7645f00d000000000000000000000000000000000000000000000000027f7d0bdb920000"
price_wei = int("0x" + data[-64:], 16)
price_eth = price_wei / 10**18
Помним о том, что смарт контракты оперируют с wei – наименьшей делимой частью ETH.
Собирая всё вместе, получаем приблизительно такой код:
# Получаем последние транзакции как в прошлом разделе
transactions = get_latest_transactions()
# Подпись нужного нам метода
OrdersMatchedSig = "0xc4109843e0b7d514e4c093114b863f8e7d8d9a458c372cd51bfe526b588006c9"
# Для конвертации wei в ETH
DIVIDER = 10**18
# тут будут уже обработанные транзакции
transactions_refactored = []
for tr in transactions:
result = {}
if tr['topics'][0] == OrdersMatchedSig:
result['maker'] = '0x' + (sample['topics'][1])[26:]
result['taker'] = '0x' + (sample['topics'][2])[26:]
result['price'] = int('0x' + sample['data'][-32:], 16) / DIVIDER
# .... Также можно добавить в result любые нужные данные из tr
# .... По типу timeStamp, blockNumber, итд.
transactions_refactored.append(result)
Более детально про транзакции – Определение валюты
У описанного выше метода есть один небольшой недостаток, с которым я столкнулся, проанализировав несколько тысяч транзакций. Недостаток этот заключается в том, что в параметрах события метода OrdersMatched
не передаётся валюта, в которой была совершена покупка NFT. В большинстве случаев эта валюта, разумеется, ETH, однако иногда проскакивают и другие токены.
Давайте разберёмся с тем, как же определять валюту транзакции. Возьмём для примера две транзакции, одна была проведена в эфирах, другая в ASH. Транзакция раз, транзакция два.
150 ASH
115 ETH
В рамках того эндпоинта, который возвращает нам логи событий транзакций, эти две выглядят практически одинаково, не считая цены. Однако 115 ETH это куда больше чем 150 ASH. Нам нужен метод, который позволит надёжно определять валюту транзакций.
Более детально покопавшись в API Etherscan можно найти метод eth_getTransactionReceipt
, который по хэшу транзакции возвращает более детальную сводку событий смарт контрактов, связанную с этой транзакцией.
В контексте Python обратиться к этому эндпоинту можно вот так:
def get_transaction_receipt(txn):
url = '<https://api.etherscan.io/api>'
params = {
'module': 'proxy',
'action': 'eth_getTransactionReceipt',
'apikey': API_KEY,
'txhash' : txn
}
r = requests.get(url, params=params)
json_data = json.loads(r.text)["result"]
return json_data
Для транзакции в 150 ASH ответ будет выглядеть вот так:
json_data
{'blockHash': '0x43cca3bae64e6d5dfaf9e682948349dfb66a1390c6f0d056007b30443912bbc9',
'blockNumber': '0xd831b2',
'contractAddress': None,
'cumulativeGasUsed': '0x1321b40',
'effectiveGasPrice': '0x1343f99739',
'from': '0xd4fc759d1dd10936438a5d4c5dc711a85f086c8c',
'gasUsed': '0x31a43',
'logs': [{'address': '0x64d91f12ece7362f91a6f8e7940cd55f05060b92',
'topics': ['0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
'0x000000000000000000000000d4fc759d1dd10936438a5d4c5dc711a85f086c8c',
'0x00000000000000000000000041f33855fe7bff95a6d8204cf93e8905cefa0485'],
'data': '0x00000000000000000000000000000000000000000000000821ab0d4414980000',
'blockNumber': '0xd831b2',
'transactionHash': '0xae0d18bec807c1968b501002502bd4a4494480de90b4caa027a84865713b8228',
'transactionIndex': '0xee',
'blockHash': '0x43cca3bae64e6d5dfaf9e682948349dfb66a1390c6f0d056007b30443912bbc9',
'logIndex': '0x192',
'removed': False},
{'address': '0x64d91f12ece7362f91a6f8e7940cd55f05060b92',
'topics': ['0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925',
'0x000000000000000000000000d4fc759d1dd10936438a5d4c5dc711a85f086c8c',
'0x000000000000000000000000e5c783ee536cf5e63e792988335c4255169be4e1'],
'data': '0xfffffffffffffffffffffffffffffffffffffffffffffff3a3dd47feeaefffff',
'blockNumber': '0xd831b2',
'transactionHash': '0xae0d18bec807c1968b501002502bd4a4494480de90b4caa027a84865713b8228',
'transactionIndex': '0xee',
'blockHash': '0x43cca3bae64e6d5dfaf9e682948349dfb66a1390c6f0d056007b30443912bbc9',
'logIndex': '0x193',
'removed': False},
{'address': '0x64d91f12ece7362f91a6f8e7940cd55f05060b92',
'topics': ['0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
'0x00000000000000000000000041f33855fe7bff95a6d8204cf93e8905cefa0485',
'0x0000000000000000000000005b3256965e7c3cf26e11fcaf296dfc8807c01073'],
'data': '0x000000000000000000000000000000000000000000000001043561a882930000',
'blockNumber': '0xd831b2',
'transactionHash': '0xae0d18bec807c1968b501002502bd4a4494480de90b4caa027a84865713b8228',
'transactionIndex': '0xee',
'blockHash': '0x43cca3bae64e6d5dfaf9e682948349dfb66a1390c6f0d056007b30443912bbc9',
'logIndex': '0x194',
'removed': False},
{'address': '0x64d91f12ece7362f91a6f8e7940cd55f05060b92',
'topics': ['0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925',
'0x00000000000000000000000041f33855fe7bff95a6d8204cf93e8905cefa0485',
'0x000000000000000000000000e5c783ee536cf5e63e792988335c4255169be4e1'],
'data': '0xfffffffffffffffffffffffffffffffffffffffffffffffaa59186332e2cffff',
'blockNumber': '0xd831b2',
'transactionHash': '0xae0d18bec807c1968b501002502bd4a4494480de90b4caa027a84865713b8228',
'transactionIndex': '0xee',
'blockHash': '0x43cca3bae64e6d5dfaf9e682948349dfb66a1390c6f0d056007b30443912bbc9',
'logIndex': '0x195',
'removed': False},
{'address': '0x495f947276749ce646f68ac8c248420045cb7b5e',
'topics': ['0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62',
'0x0000000000000000000000000474e1cff596114577cf641d3bf41617c48c2042',
'0x00000000000000000000000041f33855fe7bff95a6d8204cf93e8905cefa0485',
'0x000000000000000000000000d4fc759d1dd10936438a5d4c5dc711a85f086c8c'],
'data': '0xbc307bdf50fe05db053c7217e904f9c77e9d51250000000000000b000000022b0000000000000000000000000000000000000000000000000000000000000001',
'blockNumber': '0xd831b2',
'transactionHash': '0xae0d18bec807c1968b501002502bd4a4494480de90b4caa027a84865713b8228',
'transactionIndex': '0xee',
'blockHash': '0x43cca3bae64e6d5dfaf9e682948349dfb66a1390c6f0d056007b30443912bbc9',
'logIndex': '0x196',
'removed': False},
{'address': '0x7be8076f4ea4a4ad08075c2508e481d6c946d12b',
'topics': ['0xc4109843e0b7d514e4c093114b863f8e7d8d9a458c372cd51bfe526b588006c9',
'0x00000000000000000000000041f33855fe7bff95a6d8204cf93e8905cefa0485',
'0x000000000000000000000000d4fc759d1dd10936438a5d4c5dc711a85f086c8c',
'0x0000000000000000000000000000000000000000000000000000000000000000'],
'data': '0x0000000000000000000000000000000000000000000000000000000000000000bcf6a0125547a86ac1fa18dc1e9e3fa2b3826bd95aacf93545d4b79dc5009e6b00000000000000000000000000000000000000000000000821ab0d4414980000',
'blockNumber': '0xd831b2',
'transactionHash': '0xae0d18bec807c1968b501002502bd4a4494480de90b4caa027a84865713b8228',
'transactionIndex': '0xee',
'blockHash': '0x43cca3bae64e6d5dfaf9e682948349dfb66a1390c6f0d056007b30443912bbc9',
'logIndex': '0x197',
'removed': False}],
'logsBloom': '0x0000000000000000000000000000000100000000000000000000000400000000000000000000002000006080000000000200800000000000000000000020201000000000000001000000000800880000000000000000000000000000000000000000000002000000000000000000080000000000000000000000003000000010100000000000000000100000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000180000000000000240000000200000000000001000000000040a000000000000020020000010000000000000000400000000000000000000200000000000080000000000',
'status': '0x1',
'to': '0x7be8076f4ea4a4ad08075c2508e481d6c946d12b',
'transactionHash': '0xae0d18bec807c1968b501002502bd4a4494480de90b4caa027a84865713b8228',
'transactionIndex': '0xee',
'type': '0x2'}
Более читаемый вид
Ссылка на такой формат
Самая приятная часть ответа данного эндпоинта заключается в том, что в нём содержатся все события, сгенерированные смарт контрактами, с которыми было взаимодействие в рамках данной транзакции.
Это значит, что в случае покупки NFT за ERC-20 токен, в транзакции отобразится взаимодействие со смарт контрактом данного ERC-20 токена.
В контексте упомянутой выше транзакции на 150 ASH это будут методы Approval
и Transfer
смарт контракта ASH.
Можно заметить, что в методе Transfer в качестве одного из параметров присутствует цена транзакции в 150 * 10**18
. Этого инсайта нам хватит для того, чтобы написать парсер, который будет также понимать валюту транзакции.
Функция определения валюты транзакции, реализованная на Python
WETH_CONTRACT = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'
OPENSEA_CONTRACT = '0x7be8076f4ea4a4ad08075c2508e481d6c946d12b'
TRANSFER_METHOD = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
# txn - хэш транзакции
def determine_currency(txn):
# описанная ранее функция
transaction_receipt = get_transaction_receipt(txn)
currency = 'ETH'
# Лог события OrdersMatched будет последним с списке событий
price_hex = transaction_receipt['logs'][-1]['data'][-64:]
for s in transaction_receipt['logs']:
if s['topics'][0] == TRANSFER_METHOD:
# Проверяем, есть ли цена сделки в логе события
if price_hex in s['data']:
# Дополнительная проверка на Wrapped ETH
if s['address'] == WETH_CONTRACT:
currency = 'WETH'
else:
currency = 'NONETH-' +s['address']
return currency
Логика работы этой функции заключается в том, что мы смотрим на все события смарт контрактов, связанные с нашей транзакцией. Если в данных одного из событий метода Transfer
фигурирует цена сделки, то это будет обращение к смарт контракту ERC-20 токена. На базе адреса смарт контракта этого токена мы сможем установить, что это за валюта.
Более детально про транзакции – смарт контракты коллекции
Смотреть на то, как кто-то продаёт кому-то токены ERC-721 – это конечно же интересно. Но куда более интересно ещё и знать что это за токены: как называется их коллекции и каков порядковый номер токена.
Упомянутый в первом разделе статьи эндпоинт также не возвращает данные касательно токена ERC-721, фигурирующего в транзакции. Однако эндпоинт eth_getTransactionReceipt
возвращает все связанные с транзакцией события смарт контрактов, а значит там должны быть и детали касательно токенов ERC-721.
Действительно, при более детальном рассмотрении событий смарт контрактов можно понять что именно купили в транзакции. На примере транзакции в ETH можно заметить что помимо события OrdersMatched есть ещё два других события – Approval
и Transfer
. Так как в данной транзакции не было обращения к смарт контрактам ERC-20 токенов, можно предположить, что это события смарт контракта ERC-721 токена.
Более детально рассмотрев адрес смарт контракта можно понять, что это адрес коллекции BoredApeYachtClub (BAYC). А в методе Transfer
фигурирует номер токена коллекции, который был переведён.
Таким образом, с помощью эндпоинта eth_getTransactionReceipt
можно также получить более детальную информацию о токене NFT, который был куплен.
Оборачивая написанный текст в код, получим:
TRANSFER_METHOD = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
# txn - хэш транзакции
def determine_collection_contract(txn):
# описанная ранее функция
transaction_receipt = get_transaction_receipt(txn)
# Лог события OrdersMatched будет последним с списке событий
price_hex = transaction_receipt['logs'][-1]['data'][-64:]
collection_contract = ''
token_number = -1
for s in transaction_receipt['logs']:
if (s['topics'][0] == TRANSFER_METHOD):
# Исключаем ERC-20 контракты
if price_hex not in s['data']:
collection_contract = s['address']
token_number = int(s['topics'][3], 16)
return collection_contract, token_number
Логика работа функции похожая на логику функцию из предыдущего раздела, только в данном примере мы берём данные из метода Transfer
, не связанного с ERC-20 смарт контрактами (где не фигурирует цена сделки).
Да, я знаю что тут есть редкий баг
-
В рамках данной функции может случиться такое, что номер токена коллекции совпадёт с ценой (это крайне маловероятно, но всё же). Данной проблемы можно избежать дополнительно проверяя параметры события
Approval
.Так выглядит событие
Approval
для ERC-721 токенаApproval event для ERC-721 токена А вот так для ERC-20
Approval event для ERC-20 токена С помощью такой дополнительной проверки можно исключить упомянутый выше баг.
Для того чтобы на базе адреса контракта коллекции можно было получить название мне пришлось воспользоваться API BlockScout. В целом API хорошее и удобное, даже есть GraphQL интерфейс, однако каким-то невероятным образом в базе данных этой системы нет части транзакций, причём целыми блоками, что делает этот сервис не самым надёжным основным источником данных.
Однако же данные касательно смарт контрактов в данном сервисе достаточно полноценны. Написанный ниже код на Python на базе адреса смарт контракта ERC-721 токена возвращает название коллекции.
def get_collection_name(contract_adress):
url = '<https://blockscout.com/eth/mainnet/api>'
params = {
'module' : 'token',
'action' : 'getToken',
'contractaddress' : contract_adress
}
r = requests.get(url, params=params)
if r.status_code == 200:
json_data = json.loads(r.text)
if (json_data != None) and (json_data['message'] == 'OK'):
return json_data['result']['name']
else:
return "None"
else:
return "None"
Весь же ответ данного эндпоинта выглядит вот так:
{'message': 'OK',
'result': {
'cataloged': True,
'contractAddress': '0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d',
'decimals': '',
'name': 'BoredApeYachtClub',
'symbol': 'BAYC',
'totalSupply': '10000',
'type': 'ERC-721'},
'status': '1'}
Пример для коллекции BoredApeYachtClub.
Упаковка по микросервисам
Разобрались с тем как данные получать и анализировать, давайте это всё дело автоматизируем и красиво упакуем. На базе ранее написанного кода можно собрать полноценный скарпер и парсер транзакций, остально только написать скрипт по его периодическому запуску и сохранять данные в базу данных.
В своих предыдущих проектах я зачастую прибегал к слегка костыльному подходу для запуска скриптов по расписанию – использовал crontab внутри докера. В этот раз захотелось сделать что-то понадёжнее и поинтереснее.
Не буду опускаться в детали касательно реализации системы в рамках данного поста, но приведу краткую сводку касательно выбранной архитектуры. После небольшого ресёрча мой выбор пал на Celery + RabbitMQ для запуска проектов по расписанию. Результаты скарпинга я решил сохранять в Redis и каждый час через Celery запускать процесс по их анализу и сохранению результатов в MongoDB. Ну и для полной красоты процесса я ещё использовал Mongo-Express и Redisinsight для того чтобы следить что с базами данных всё в порядке.
В рамках своего проекта я решил каждый час публиковать статистику по объёму торгов за час и несколько самых крупных транзакций с помощью телеграм бота и бота в твиттере. А сделал я это с помощью библиотек telebot и tweepy. В целом, хочется сказать, что у Твиттера оказалось на удивление простое и приятное API.
Бонус – немного игры в сыщиков
В какой-то момент финальных стадий разработки этого проекта столкнулся с тем, что все крупные транзакции за час – была перепродажа одного и того же экземпляра NFT. Сначала я подумал что это баг, перепроверил весь свой код, но так и ничего не нашёл, пришлось внимательно изучать транзакции вокруг Auidioglyphs #1935. Предлагаю читателям включить режим сыщиков и разобраться что же не так с этими транзакциями.
Так в чём же подвох
Если кратко, то кто-то сознательно или бессознательно накручивал объём продаж вокруг данной коллекции. В среднем цена на OpenSea за один экземпляр данной коллекции колеблется около 0.01 – 0.1 ETH за штуку, а каждая транзация с Auidiogluphs #1935 была примерно на 180 – 190 ETH.
Интересно отметить, что OpenSea достаточно быстро заметили данную накрутку и перестали регистрировать похожие транзакции в статистике объёма примерно на следующий день.
Более того, название коллекции подозрительно на коллекцию известной студии Larva Labs – Autoglyphs.
Таким образом, некий аноним, вывев с биржи FTX порядка 200ETH в второй трети января промотал порядка 30 из них на такие вот транзакции (и знатно поспамил моим ботам).
Поразбиравшись с транзакциями я решил в итоге забанить коллекцию в выдаче твиттер и телеграм ботов и побарагузил об этом в твиттере и телеграм канале.
P.S. Ещё одно интересное наблюдение, которое также можно сделать небольшим расследованием. На заставке данной статьи, как и на заставке моих ботов, изображения из коллекции Cryptopunks. Они торгуются на OpenSea, там же можно посмотреть статистику по их продажам, а вот на смарт контракте OpenSea это никак не отображается, разберётесь в чём загвоздка?
Итак, вы хотите купить свой первый NFT? Технология блокчейн предоставила каждому возможность самостоятельно владеть уникальным цифровым активом без необходимости подтверждения подлинности через какой-либо центральный орган.
NFT может представлять из себя много чего – от уникального произведения цифрового искусства, до участка земли в игре. Владельцы покупают и хранят эти вещи, используя кошелек DApp (децентрализованное приложение), который, в свою очередь, взаимодействует с блокчейном Ethereum.
Мир NFT развивается очень быстро, и для участия в рынке необходимо постараться максимально изучить эту отрасль. Если вы хотите узнать, как найти NFT, определить его стоимость и затем купить, то вы попали по адресу. Эта статья сэкономит вам бесчисленные часы на сбор разбросанной по интернету информации о NFT.
Чтобы купить NFT, вы должны создать свой собственный кошелек. Например, MetaMask. MetaMask — самый популярный кошелек NFT, также доступный в виде расширения для браузера или мобильного приложения.
После загрузки кошелька следуйте инструкциям в MetaMask. Самый важный шаг — записать и сохранить введенную вами фразу для восстановления.
Одна из прекрасных особенностей децентрализованного владения заключается в том, что для управления вашими активами не требуется никакой регулирующий орган. Минус же состоит в том, что это исключает возможность обратиться за помощью, если что-то пойдет не так. Вся ответственность ложится только на вас.
Секретная фраза для восстановления — это ваш личный ключ к вашим средствам и NFT, которые вы храните в кошельке. С помощью этих 12 слов вы имеете доступ к своему кошельку с любого устройства, которое поддерживает MetaMask.
Однако это также означает, что, во-первых, любой, кто знает вашу фразу для восстановления, может получить доступ к вашему кошельку, а во-вторых, если вы потеряете или забудете эту фразу, вы можете навсегда потерять доступ к своему кошельку.
Чтобы сохранить и не потерять фразу для восстановления, я бы советовал вам следующее:
1. Записать фразу на листе бумаги и хранить этот лист в надежном месте.
2. Сохраните фразу в безопасном менеджере паролей, таком как, например, 1Password или LastPass.
Также, вы можете сохранить фразу в любом текстовом файле или облачном хранилище, таком как Google Drive или Dropbox, однако эти способы менее безопасные для сохранности вашей фразы, так как любой, кто получит доступ к вашему компьютеру или облачному диску, потенциально может украсть ваш кошелек.
Будьте бдительны, мир NFT изобилует мошенничеством. Банальный, но самый важный совет, который я могу вам дать, — никому не сообщайте свою секретную фразу для восстановления. Используйте ее только в том случае, когда возникнет необходимость восстановить свой кошелек.
Сотрудники MetaMask или любой другой компании никогда не спросят вашу фразу для восстановления. Хакеры и воры часто выдают себя за сотрудников авторитетных компаний или даже за создателей проектов NFT, поэтому будьте внимательны, иначе рискуете потерять все.
Если вы защитите свою фразу для восстановления, вы избежите почти всех рисков потери своих счетов.
Эфир
Ethereum — самый популярный протокол блокчейна, используемый для покупки, продажи и хранения NFT. Существуют и альтернативные протоколы, поддерживающие NFT, такие как, например, Solana, но Ethereum, является самым первым, который создал концепцию смарт-контрактов, и именно поэтому в этом руководстве мы сосредоточимся только на нем.
Создатели Ethereum представляли себе «мировой компьютер», который мог бы запускать программы, называемые смарт-контрактами. Прорывная концепция Ethereum заключается в том, что программисты могут создавать смарт-контракты в блокчейне Ethereum и позволять любому использовать их без помощи какого-либо стороннего сервера или третьей стороны. Таким образом, смарт-контракты представляют собой децентрализованные программы.
Для запуска смарт-контракта протокол Ethereum требует газ. Газ заставляет смарт-контракт работать. Пользователи Ethereum платят за газ с помощью эфира. Эфир — это транзакционный токен, используемый для работы по стандарту Ethereum.
Эфир, как я уже сказал, это взаимозаменяемый токен, то есть каждая единица эфира идентична и может быть разделена на более мелкие части. В то же время, NFT или невзаимозаменяемый токен — это уникальный актив, созданный на основе смарт-контракта. Каждому токену присваивается уникальный идентификатор, который представляет его уникальность. Не существует двух одинаковых NFT.
Пополнение кошелька
Вы должны пополнить свой кошелек эфиром, чтобы затем вы могли заплатить за газ, необходимый для покупки NFT. Вы также можете приобрести эфир непосредственно в MetaMask или перевести эфир с криптовалютной биржи.
Если у вашей криптовалютной биржи есть мобильное приложение, поддерживающее QR-коды, вы можете сгенерировать свой публичный адрес в виде QR-кода, щелкнув три точки в правом верхнем углу MetaMask, а затем нажав «Сведения об учетной записи». Это сгенерирует QR-код, который вы сможете отсканировать с помощью мобильного приложения вашей биржи, вместо того чтобы копировать и вставлять свой публичный адрес. Это позволяет избежать любой возможности опечаток или ошибок при копировании публичного адреса в исходящую транзакцию.
Вы можете свободно делиться своим общедоступным адресом для получения NFT или эфира. Единственный риск заключается в том, что вы можете поставить под угрозу свою конфиденциальность, если адрес содержит какой-либо намек на вашу реальную личность.
Для передачи эфира требуется газ, и ваша биржа либо вычитает, либо добавляет необходимое количество газа из окончательной суммы, отправленной на ваш кошелек DApp. Если вы получили сумму меньше, чем отправили, то, скорее всего, биржа вычла газ из суммы эфира, которую вы ввели для отправки.
Поиск и покупка NFT
Итак, теперь у вас есть полный кошелек эфира, и вы готовы купить свой первый NFT. Но как найти тот самый NFT? Что делает NFT ценным? И как на самом деле происходит процесс покупки NFT?
Свойства и редкость
В данной статье основное внимание будет уделено оценке проектов или коллекций NFT. Проекты обычно выпускают тысячи подобных NFT со своими уникальными задумками или характеристиками. Возможно, вы слышали о самых популярных NFT этого типа, таких как Cryptopunks или Bored Ape Yacht Club.
Коллекции NFT выпускаются группами людей, объединившихся для запуска проекта NFT. Проект NFT — это команда людей, которые создают, продают и продвигают NFT.
NFT на основе коллекции отличаются от NFT продаваемых на таких биржах, как SuperRare. NFT 1:1 означает, что в коллекции есть только 1 NFT подобного вида. Ценность NFT 1:1 является субъективной, так как она основана на известности художника, создавшего тот или иной арт. И если вы всерьез подходите к NFT как к инвестициям, вам необходимо понять, почему одни NFT имеют большую ценность, нежели другие.
Подобно традиционному искусству, чем реже и уникальнее коллекции NFT, тем они ценнее.
Редкость устанавливается двумя способами:
1. Количество NFT в данной коллекции.
2. Свойства NFT в коллекции.
Большинство коллекций NFT насчитывают от 5 000 до 10 000 единиц уникального арта. В связи с этим, логично было бы предположить, что NFT в коллекции из 5000 единиц, будет более ценен, чем NFT в аналогичной коллекции из 10 000 единиц.
Каждый NFT в коллекции будет иметь свойства, которые могут сделать его более редким, чем другие NFT в той же коллекции. Давайте посмотрим на этот NFT Lazy Lions в коллекции MetaVerbal:
Если вы перейдете к списку OpenSea для этого льва, и посмотрите на раздел «свойства», вы увидите следующее:
Этот лев имеет набор уникальных свойств. Грива, кожа, цвет фона, глаза, тело и рот — все это «свойства», которые отличают этого льва от других предметов в коллекции.
Некоторые свойства встречаются реже, чем другие. OpenSea отображает, какой % всех NFT в коллекции имеет общий атрибут. Самым редким свойством нашего льва является его грива «Ледяной узел на макушке», и только 2% или 200 из всех 10 000 львов имеют такую гриву.
Минимальная цена
Минимальная цена коллекции NFT — это самая низкая цена продажи коллекции. Минимальная цена является значимым показателем, поскольку это наименьшее значение, которое вы получили бы, если бы захотели продать NFT из данной коллекции.
Поиск ценного NFT
Найти NFT для покупки не очень сложно. Перейдите на OpenSea, и вы найдете там бесконечный каталог NFT. Огромный выбор NFT, который пополняется ежедневно, может ошеломить любого покупателя-новичка.
Найти NFT несложно, гораздо сложнее найти ценный NFT. Я поделюсь с вами некоторыми инструментами и стратегиями, которые помогут вам начать свое путешествие по миру NFT.
Есть четыре незаменимых инструмента, которые должен использовать каждый покупатель NFT.
OpenSea
OpenSea является самой популярной торговой площадкой для поиска и покупки NFT.
Начать свои поиски подходящего NFT можно с раздела рейтинга OpenSea. В этом разделе будут отображаться лучшие коллекции NFT по объему за последние 7 дней или 24 часа. Объем — это общая сумма, потраченная на коллекцию за определенный период времени. Если 5 NFT в коллекции были проданы за 10 ETH за последние 24 часа, то 24-часовой объем составит 50 ETH.
Наблюдение за объемом может дать вам представление о текущей ликвидности, то есть о том, насколько быстро или легко вы могли бы продать NFT из коллекции. Поиск покупателя для вашего NFT может занять часы, дни или недели. Таким образом, если коллекция имеет высокий % прироста объема за последние 24 часа или 7 дней, то можно предположить, что покупатель найдется довольно быстро.
Просматривая коллекцию NFT в OpenSea, вы можете просмотреть все NFT, доступные для продажи, и отфильтровать отображаемые NFT по их уникальным параметрам.
Здесь также стоит быть бдительными, так как мошенники создают одноименные проекты, чтобы запутать покупателей. Подтвержденные проекты отмечены синей галочкой рядом с их названием.
Если вы хотите быстро найти самые дешевые доступные NFT в коллекции, перейдите к самой коллекции, и щелкните поле «floor price», в котором отображается текущая минимальная цена.
Далее стоит сказать о том, какие свойства являются редкими или ценными?
Rarity.tools
Rarity.tools — это платформа с простым интерфейсом, которая поможет вам определить редкость NFT и отфильтровать коллекции на основе определенных свойств. Перед покупкой любого NFT рекомендуется подключить этот NFT к Rarity.tools.
Найдите коллекцию с помощью строки поиска вверху. Как только вы перейдете на страницу коллекции, вы увидите сетку NFT в этой коллекции. Стоит отметить, что Rarity.tools по умолчанию сортирует все NFT от самых редких до наименее уникальных.
Если вы хотите увидеть более подробную информацию о конкретном NFT, вы можете либо щелкнуть на само изображение NFT, либо вставить идентификатор NFT в поле «ID» в верхнем левом углу, а затем нажать «Поиск». Вы можете найти идентификатор NFT на странице листинга на OpenSea либо в заголовке NFT, либо в разделе сведений в левой части страницы в поле tokenID .
Например, посмотрите на этот Roboto NFT. Первое, что вы увидите, это показатель редкости. Эта оценка рассчитывается путем сложения оценок, которые Rarity.tools присваивает каждому отдельному свойству.
Если вы нажмете фильтр с самой высокой минимальной ценой, вы заметите, что некоторые черты ценятся больше, даже если они менее редки. Именно здесь вступает в игру субъективная природа NFT.
В примере Roboto NFT вы, вероятно, заметите, что черта «Пиратская шляпа» имеет самую высокую минимальную цену, хотя это третье по редкости свойсва. Из этого можно сделать вывод, что многие члены сообщества Roboto NFT считают, что пиратская шляпа выглядит круто, и поэтому они оценивают ее выше. По этой причине Rarity.tools предлагает фильтр с самой высокой минимальной ценой.
Если вы нажмете на фильтр «пиратская шляпа», а затем щелкнете за пределами диалогового окна, вы увидите список всех роботов в пиратской шляпе. Платформа изначально сортирует NFT по редкости, но если вы хотите купить определенной темы NFT, вы также можете изменить фильтр от самой низкой до самой высокой цены.
Итак, теперь вы знаете, что мир NFT, как и мир искусства, имеет показатель субъективности, чего нет при торговле криптовалютой или акциями. Так как же держать руку на пульсе того, что круто, и что в тренде? Вот где стоит обратить внимание на следующие два инструмента.
Discord
Discord — это платформа для общения. Когда вы покупаете NFT из коллекции, вы не просто покупаете арт, вы покупаете также доступ в сообщество в Discord.
Перейдя к любому профилю коллекции в OpenSea, вы найдете ссылку на Discord этого проекта. После присоединения к Discord, вы увидите много разных каналов. Но вы не увидите скрытые каналов, которые доступны только владельцам NFT этого проекта.
Для разблокировки скрытых каналов, многие проекты используют бота Discord для подключения вашего кошелька, чтобы убедиться, что вы владеете NFT. Вам нужно будет отправить сообщение боту, и тогда он предоставит вам ссылку для подключения вашего кошелька, чтобы подтвердить, что вы являетесь его владельцем.
Если вы действительно хотите узнать подробнее о проекте, вы можете присоединиться к его Discord, чтобы понять, насколько вовлечена команда в развитие своего проекта, на что они нацелены и активны в своем сообществе.
Иначе говоря, чем более вовлеченное и активное сообщество, чем больше шумихи они создают вокруг проекта, тем больше шансов, что их коллекции будут пользоваться популярностью.
Помимо использования Discord для оценки ценности проекта NFT, вы можете просто весело проводить время в Discord просто общаясь. Многие люди присоединяются к проектам просто потому, что сообщество веселое и гостеприимное.
Discord создает сплоченные сообщества, но иногда проектам нужно очень постараться, чтобы завлечь как можно больше единомышленников. Вот где следующий инструмент вступает в игру.
Твиттер играет ключевую роль в мире NFT с тех пор, как коллекционеры начали заменять свои PFP (изображения профиля) в Твиттере на свои любимые NFT. Если вы проведете какое-то время в Твиттере NFT, вы увидите PFP обезьян, панков, львов, уток и любых других видов животных.
Использование пользователями NFT в качестве своих PFP побудило компанию начать изучение возможности реализации функции аутентификации NFT, чтобы подтвердить, что вы действительно владеете своим PFP.
Изображения профиля в Твиттере, возможно, создали вирусный эффект, что привело к резкому росту популярности NFT. Twitter также является основным местом, где можно узнать о проектах NFT и быть в курсе последних тенденций NFT.
Ажиотаж играет решающую роль в мире NFT. Чем популярнее проект, тем больше у него шансов выйти на более широкую аудиторию покупателей. Прежде чем покупать какой-либо NFT, поищите профиль этого проекта в Твиттере и посмотрите, насколько оно «тонет», в хорошем смысле слова, в обсуждениях.
Как купить NFT?
Теперь самое интересное. Вы пополнили свой кошелек, просмотрели OpenSea и Rarity.tools, оценили сообщество и нашли NFT, который хотите приобрести.
Этот рабочий процесс предназначен только для листингов в стиле «купить сейчас», а не для аукционов.
1. Наведите курсор на значок в правом верхнем углу OpenSea.
2. Нажмите «Профиль».
3. Нажмите «Войти», чтобы войти с помощью MetaMask.
4. Перейдите к списку OpenSea для вашего NFT.
5. Нажмите «Купить сейчас».
6. Установите флажок, чтобы принять правила и условия OpenSea.
7. Нажмите «Оформить заказ».
8. Появится диалоговое окно MetaMask. Проверьте общую сумму + сборы за газ, чтобы подтвердить, что вы готовы их оплатить.
9. Нажмите «Подтвердить» в диалоговом окне MetaMask.
Затем вы должны увидеть страницу OpenSea с анимацией загрузки, указывающей на то, что транзакция обрабатывается. Как только транзакция будет обработана, на странице OpenSea появится подтверждение.
Вернувшись на страницу своего профиля OpenSea, вы увидите NFT под своей учетной записью.
Газ
MetaMask автоматически предложит цену за газ. Однако цены на газ могут сильно колебаться в течение дня в зависимости от того, сколько транзакций отправляется в сеть Ethereum. Если плата за газ кажется вам слишком высокой, вы можете подождать, пока нагрузка на сеть уменьшится.
Вы можете использовать инструменты проверки стоимости газа, как blocknative, чтобы проверить текущие цены на газ. Я бы счел все, что превышает базовую плату в 150 GWEI, высокой. (GWEI равно 0,000000001 ETH).
Время обработки
Большинство транзакций занимает от 15 до 60 секунд. Транзакция может занять чуть больше времени, если на этот момент сеть перегружена. Ваш кошелек транслирует транзакцию в сеть, и NFT перейдет из кошелька предыдущего владельца в ваш кошелек.
MetaMask позволяет вам настроить плату за газ, если вы нажмете кнопку «Изменить» рядом со значениями платы за газ. Вы можете установить низкий, средний или высокий уровень газа, что соответственно уменьшит или повысит комиссию за газ, а также отобразит ожидаемое время, необходимое для совершения транзакции.
Время обработки имеет значение в некоторых конкретных сценариях. Минтинг NFT — один из таких сценариев. Минтинг означает покупку NFT непосредственно у проекта во время первоначальной продажи. Вы участвуете в гонке со всеми остальными за то, чтобы ваша транзакция была подтверждена во время минтинга, поэтому повышение платы за газ для сокращения времени обработки является необходимостью. Однако, будьте с этим осторожны. В противном случае, вы можете потратиться на оплату более высокой комиссии за газ, но так и не получить желаемый NFT.
При покупке NFT на OpenSea вам, вероятно, следует беспокоиться о времени обработки только в том случае, если вы покупаете NFT в больших объемах. У этих NFT, как правило, больше покупателей, а, следовательно, и конкуренции при покупке.
Роялти
Когда вы нажмете «купить сейчас» в OpenSea, вы увидите поле под названием «роялти» в %. Роялти — это сумма продажной цены, которая останется у проекта, если вы продаете NFT.
Вы должны учитывать эту сумму, чтобы не потерять деньги, потому что при продаже NFT вам нужно будет учитывать как лицензионный сбор, так и комиссию OpenSea в размере 2,5%.
Так, например, если вы купили NFT за 1 ETH с 5% роялти, вам нужно будет продавать его за 1,075 ETH. Это связано с тем, что OpenSea сохранит 0,025 ETH, а проект сохранит 0,05 ETH (1 + 0,05 + 0,025 = 1,075).
Проведите собственное исследование
Цель этой статьи — настроить вас провести собственное исследование, прежде чем погрузиться в проект NFT и понять, для чего вы делаете покупку.
Даже если какой-либо проект вам запал в душу, вы все равно хотели бы сохранить свои инвестиции, не так ли? Вот почему необходимо разработать собственную стратегию оценки проектов NFT.
Поделиться:
Asked
1 year, 5 months ago
Viewed
12k times
I want to see my NFTs in metamask, where can I get the contract address to add to metamask
asked Nov 19, 2021 at 21:42
If you are trying to use the browser extension of Metamask you wont be able to visualise your NFTs according to a Metamask article released 7 days ago.
You can however view them if you have the Metamask mobile app. If your NFTs are on Ethereum they should populate automatically. If they dont populate automatically you can try the steps that are outlined in that article:
- Find the NFT’s address. On OpenSea, for example, on the NFT’s page under Details, there is a blue hyperlinked value labelled “Contract Address”. If you click on this, it will take you to the contract’s address on Etherscan; at the top-left of that page, there should be an icon labelled “Contract”, and to the right, a long string of letters and numbers. This is the address of the contract that created your NFT. Click on the “copy” icon to the right of the address, and you’ll have it on your clipboard.
- In MetaMask Mobile, tap on the ‘NFTs’ tab, scroll down and tap on the “+ ADD NFTs” link. Paste the NFT’s address from your clipboard into the “Address” box.
- Find the NFT’s ID. A collectible’s ID is a unique identifier since no two NFTs are alike. Again, on OpenSea this number is under “Details”. Make a note of it, or copy it onto your clipboard.
- Paste the ID into the box marked “ID” in MetaMask Mobile, tap on the “ADD” button, and your NFTs should appear under the NFTs tab.
answered Nov 19, 2021 at 22:10
4