;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Mais úteis do que colecionáveis: como a 2ª onda dos NFTs poderá convencer

Getty Images/iStock
Imagem: Getty Images/iStock

Em Nova York

25/05/2022 09h45

Objetos digitais certificados, conhecidos como NFTs, foram rotulados de várias maneiras: para alguns é uma moda, para outros uma farsa. Mas os primeiros adeptos consideram que têm um futuro como ferramentas para negócios, saúde e artes, algo que vai além do mero colecionismo digital.

A onda de NFTs (tokens não fungíveis), que estourou há pouco mais de um ano, deu ao mundo obras vendidas por milhões de dólares.

Se trata de um formato digital associado a um objeto virtual considerado único, seja uma foto, animação, pintura, vídeo ou até mesmo uma música. É um certificado de autenticidade registrado em blockchain - cadeia de blocos -, a tecnologia que também serve de base para as criptomoedas.

Esse mundo florescente de ativos digitais abriu um novo mercado bilionário e provocou debates sobre sua utilidade no mundo real.

"NFTs são muito rudimentares no momento", de acordo com Sandy Khaund, fundador da startup Credenza, que ajuda empresas que desejam adotar novas tecnologias de blockchain. Além do mundo da arte, "não têm muita funcionalidade ou utilidade", acrescentou.

No entanto, existe uma classe de ativos digitais que constroem uma ponte entre os mundos real e virtual.

A cadeia de cafeterias Starbucks, que se prepara para lançar os seus próprios NFTs, os considera um "ativo digital programável, que pode ser usado como marca e serve também como e de o".

Possuir um dos NFTs da gigante do café abrirá o caminho para "experiências únicas", assim como uma "comunidade", uma nova visão de um programa de fidelidade do cliente baseado em blockchain.

No âmbito institucional, a pequena república de San Marino lançou em julho um aporte de vacinação contra o coronavírus que utiliza a tecnologia NFT.

Enquanto o certificado digital europeu foi projetado apenas para a União Europeia, esse aporte foi planejado para poder ser verificado em qualquer lugar, sem a necessidade de um aplicativo específico para celular.

"Loucura garantida"

Por sua parte, a Credenza conversa com equipes e ligas esportivas para desenvolver uma visão para NFTs multiuso.

Jenn McMillen, da empresa de marketing Incendio, citou a banda de rock Kings of Leon, que integrou a tecnologia em seu trabalho

Como parte do lançamento NFT de seu álbum "When You See Yourself", o grupo emitiu oito "bilhetes dourados". Cada um deles garante quatro lugares na primeira fila em todos os shows das suas turnês futuras.

"Para uma marca, você precisa pensar nas experiências mais envolventes, no o mais exclusivo ou em algo que definitivamente se tornará viral e depois trabalhar a partir daí", disse McMillen.

"A loucura é garantida pela escassez", acrescentou.