āĻāĻĢāĻāĻŋāĻāĻŽ āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻā§āϏā§āĻāύā§āĻā§ āĻāĻāĻ-āĻā§āύāĻžāϰā§āĻā§āĻĄ āĻāϰā§āĻ āĻāύāĻāĻĢāĻāĻŋ āĻŽāĻŋāύā§āĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻĒāύāĻžāϰ āύāĻŋāĻāϏā§āĻŦ āĻā§āĻā§āϏāĻ-āĻā§ āĻāĻŽā§āĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϏāĻš āĻāĻāĻāĻŋ DApp āϤā§āϰāĻŋ, āĻāĻžāϞāĻžāύ⧠āĻāĻŦāĻ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āύāĻŋāϰā§āĻĻā§āĻļāĻŋāĻāĻž! āϏā§āĻāĻŋāĻĒāϤā§āϰ đŠâđģ āĻāĻŽāϰāĻž āĻāĻŋ āĻāϰāĻŦā§... đ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰ āĻĄāĻžāϝāĻŧāĻžāĻā§āϰāĻžāĻŽ (āĻāĻāϰāĻāĻŽ) đĨ DApp āĻĒā§āϰāϝā§āĻā§āϤāĻŋ āϏā§āĻā§āϝāĻžāĻ đī¸ āĻĒāĻžāĻāĻĨāύ āĻā§āĻā§āϏāĻ-āĻā§-āĻāĻŽā§āĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϤā§āϰāĻŋ āĻāϰāĻž âī¸ āϏāϞāĻŋāĻĄāĻŋāĻāĻŋ āĻāύāĻāĻĢāĻāĻŋ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϤā§āϰāĻŋ āĻāĻŦāĻ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻž đŦ āĻĢā§āϰāύā§āĻ-āĻāύā§āĻĄ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻāĻļāύ āϤā§āϰāĻŋ āĻāϰāĻž āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻĒā§āϰāĻŦāĻžāĻš Bacalhau āĻŽāĻŋāĻĨāϏā§āĻā§āϰāĻŋāϝāĻŧāĻž NFT. āϏā§āĻā§āϰā§āĻ āĻā§āĻā§āϤāĻŋ āĻŽāĻŋāĻĨāϏā§āĻā§āϰāĻŋāϝāĻŧāĻž đ āĻā§āĻĄāĻŧāĻžāύā§āϤ āĻāĻŋāύā§āϤāĻžāĻāĻžāĻŦāύāĻž: āĻāĻāĻ āĻāĻŦāĻ āĻŦā§āϞāĻāĻā§āĻāύā§āϰ āϏāĻŽā§āĻāĻžāĻŦāύāĻž đ āĻŦāĻžāĻāĻžāϞāĻšāĻžāĻ āϰā§āĻĄāĻŽā§āϝāĻžāĻĒ âī¸ āϝā§āĻāĻžāϝā§āĻ āϰāĻžāĻā§āύ! đĻ āĻĻā§āϰā§āϤ āϞāĻŋāĻā§āĻ: āĻāĻŋāĻĄāĻŋāĻ āϏāĻāϏā§āĻāϰāĻŖ āĻāĻŋāĻāĻšāĻžāĻŦ āĻā§āĻĄ Bacalhau āĻĄāĻā§āϏ āϏā§āϞāĻžāĻāĻĄāĻļā§āϝāĻŧāĻžāϰ đŠâđģ āĻāĻŽāϰāĻž āĻāĻŋ āĻāϰāĻŦā§... āĻāĻ āĻŦā§āϞāĻāĻāĻŋ āĻāĻĒāύāĻžāĻā§ āĻā§āĻāĻžāĻŦā§ āϤāĻž āύāĻŋāϝāĻŧā§ āϝā§āϤ⧠āĻšāĻŦā§ Tensorflow āĻāϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āĻāĻāĻāĻŋ āĻāĻĒā§āύāϏā§āϰā§āϏ āĻĒāĻžāĻāĻĨāύ-āĻāĻŋāϤā§āϤāĻŋāĻ āĻā§āĻā§āϏāĻ-āĻā§-āĻāĻŽā§āĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϤā§āϰāĻŋ āĻāϰā§āύ (āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻāĻā§āϰāĻšā§āϰ āύāĻž āĻšāϞ⧠āĻāĻĒāύāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ Bacalhau HTTP āĻāύā§āĻĄāĻĒāϝāĻŧā§āύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ) Bacalhau-āĻ āĻāĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻāĻŋ āĻāĻžāϞāĻžāύ (āĻāĻāĻāĻŋ āĻā§āϞāĻž p2p āĻ āĻĢ-āĻā§āĻāύ āĻāĻŽā§āĻĒāĻŋāĻāĻ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ) āϏāϞāĻŋāĻĄāĻŋāĻāĻŋāϤ⧠āĻāĻāĻāĻŋ NFT āĻā§āĻā§āϤāĻŋ āϤā§āϰāĻŋ āĻāϰā§āύ (āĻāĻāĻāĻŋ āĻāĻĒā§āύ āĻā§āĻĒā§āϞāĻŋāύ ERC721 āĻā§āĻā§āϤāĻŋāϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰā§) Filecoin āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ āĻŽā§āĻļāĻŋāύ (FVM) āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻā§āϏā§āĻāύā§āĻā§ āĻšāĻžāϰā§āĻĄāĻšāĻžāĻā§āϰ āϏāĻžāĻĨā§ NFT āĻā§āĻā§āϤāĻŋ āϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āύ āĻĢā§āϰāύā§āĻ-āĻāύā§āĻĄ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻāĻļāύ - āĻŦāĻžāĻāĻžāϞāĻšāĻžāĻ āĻā§āĻā§āϏāĻ-āĻā§-āĻāĻŽā§āĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻžāϤ⧠āĻāĻĒāύāĻžāϰ NFT āĻā§āĻā§āϤāĻŋāϰ āϏāĻžāĻĨā§ āĻā§āĻāĻžāĻŦā§ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻā§āĻ āĻāϰāĻŦā§āύ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻĒāύāĻžāϰ NFT āĻŽā§āĻāĻžāĻĄā§āĻāĻž NFT.Storage āĻ āϏāĻāϰāĻā§āώāĻŖ āĻāϰāĻŦā§āύ āĻā§āĻāĻžāĻŦā§ āĻāĻĒāύāĻžāϰ āĻĢā§āϰāύā§āĻ-āĻāύā§āĻĄ āĻĄāĻŋāĻāĻĒāĻā§ āĻĢā§āϞāĻŋāĻā§ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻŦā§āύ āĻāĻŽāĻŋ āĻāĻā§āĻāĻžāĻā§āϤāĻāĻžāĻŦā§ āĻāĻ āϏā§āĻā§āϝāĻžāĻā§ āĻāĻĒāϞāĻŦā§āϧ āϝāϤāĻāĻž āĻāĻĒā§āύ āϏā§āϰā§āϏ āĻāĻŦāĻ āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻā§āϤ āĻĒā§āϰāϝā§āĻā§āϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻŦā§āĻā§ āύāĻŋāϝāĻŧā§āĻāĻŋāĨ¤ āĻāĻ āĻŦā§āϞāĻāĻāĻŋ āĻŦā§āĻļ āĻĻā§āϰā§āĻ āĻšāϤ⧠āĻāϞā§āĻā§ (āĻāϰ⧠- āĻāĻŽāĻŋ āϏāĻŽāϏā§āϤ āϤāĻĨā§āϝ āĻĻāĻŋāϤ⧠āĻāĻžāĻ āĻāĻŦāĻ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻāĻžāĻ āϝ⧠āĻāĻŽāϰāĻž āĻļāĻŋāĻā§āώāĻžāύāĻŦāĻŋāϏ-āĻŦāĻžāύā§āϧāĻŦ āĻāĻŦāĻ āĻ āύā§āϤāϰā§āĻā§āĻā§āϤ āĻāϰāĻāĻŋ!) - āϤāĻžāĻ āĻā§āĻŦāĻŋāϞ⧠āĻāĻĒāύāĻžāϰ āĻāύā§āϝ āĻāĻĒāϝā§āĻā§ āĻ āĻāĻļāĻā§āϞāĻŋ āĻāĻĄāĻŧāĻŋāϝāĻŧā§ āϝā§āϤ⧠āĻĻā§āĻŦāĻŋāϧāĻž āĻŦā§āϧ āĻāϰā§āύ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠<3 đ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰ āĻĄāĻžāϝāĻŧāĻžāĻā§āϰāĻžāĻŽ (āĻāĻāϰāĻāĻŽ) đĨ DApp āĻĒā§āϰāϝā§āĻā§āϤāĻŋ āϏā§āĻā§āϝāĻžāĻ (āĻāĻāĻŋ āĻĒāĻžāύ - āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻĒā§āϝāĻžāύāĻā§āĻ āϏā§āĻā§āϝāĻžāĻ #sorrynotsorry) āĻāĻĒā§āύ āϏā§āϰā§āϏ āĻāĻŦāĻ āĻāϝāĻŧā§āĻŦ3-āĻŽā§āϞā§āϝ āĻĨā§āĻā§ :) [āϏāϞāĻŋāĻĄāĻŋāĻāĻŋ, āĻāĻĒā§āύ āĻā§āĻĒā§āϞāĻŋāύ] āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋ āĻšāϞ āĻāĻĨā§āϰāĻŋāϝāĻŧāĻžāĻŽ (āĻāĻāĻŋāĻāĻŽ)-āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ āĻŦā§āϞāĻāĻā§āĻāύā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ OO āϏā§āĻŽāĻžāϰā§āĻ āĻāύā§āĻā§āϰāĻžāĻā§āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āĻāĻžāώāĻž āϏāϞāĻŋāĻĄāĻŋāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋ āĻāĻĒāĻžāĻĻāĻžāύ āĻāĻŦāĻ āĻā§āĻā§āϤāĻŋāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž-āύāĻŋāϰā§āĻā§āώāĻŋāϤ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻ āĻĢāĻžāϰ āĻāϰ⧠āĻāĻĒā§āύ āĻā§āĻĒā§āϞāĻŋāύ [āĻšāĻžāϰā§āϧāĻžāϤ] āϏā§āĻŽāĻžāϰā§āĻ āĻāύā§āĻā§āϰāĻžāĻā§āĻ āĻāĻāĻĄāĻŋāĻ āĻšāϞ Ethereum āϏāĻĢā§āĻāĻāϝāĻŧā§āϝāĻžāϰ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž, āĻāĻŽā§āĻĒāĻžāĻāϞ, āĻĄāĻŋāĻŦāĻžāĻāĻŋāĻ āĻāĻŦāĻ āϏā§āĻĨāĻžāĻĒāύā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻāύā§āύāϝāĻŧāύ āĻĒāϰāĻŋāĻŦā§āĻļ Hardhat [āĻĢāĻžāĻāϞāĻāϝāĻŧā§āύ āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ āĻŽā§āĻļāĻŋāύ āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ] āĻŦā§āϞāĻāĻā§āĻāύ āĻā§āϏā§āĻāύā§āĻ āĻšāϞ āĻĢāĻžāĻāϞāĻāϝāĻŧā§āύ āĻŦā§āϞāĻāĻā§āĻāύ⧠āύāĻŋāϰā§āĻŽāĻŋāϤ āĻāĻāĻāĻŋ āĻāĻāĻŋāĻāĻŽ-āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ āĻā§āϏā§āĻāύā§āĻ FVM āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ [NFT.Storage] NFT āĻŽā§āĻāĻžāĻĄā§āĻāĻž āϏā§āĻā§āϰā§āĻ āĻšāϞ IPFS āĻāĻŦāĻ Filecoin-āĻāϰ āĻāĻĒāϰ⧠āύāĻŋāϰā§āĻŽāĻŋāϤ āĻāĻāĻāĻŋ āϏāϰā§āĻŦāĻāύā§āύ āĻāĻŋāύāĻŋāϏ āϝāĻž NFT āĻŽā§āĻāĻžāĻĄā§āĻāĻž āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύā§āϝāĻŧāĻāĻžāĻŦā§ āĻāĻŦāĻ āĻ āĻŦāĻŋāϰāĻžāĻŽāĻāĻžāĻŦā§ āϏāĻā§āĻāϝāĻŧ āĻāϰ⧠āĻāĻŦāĻ NFTs āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ sdk-āĻāϰ āĻāύā§āϝ āĻŦāĻŋāύāĻžāĻŽā§āϞā§āϝ⧠āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻā§āϤ āϏā§āĻā§āϰā§āĻ āĻ āĻĢāĻžāϰ āĻāϰā§āĨ¤ NFT.Storage [NextJS/React + NPM] āĻĢā§āϰāύā§āĻ-āĻāύā§āĻĄ āĻāĻŽāϰāĻž āϏāĻŽā§āĻāĻŦāϤ āĻāĻ āϏāĻŦ āĻāĻžāύāĻŋ... āϤāĻžāĻ āύāĻž? :āĻĒāĻŋ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻĨā§āĻā§ [āĻŽā§āĻāĻžāĻŽāĻžāϏā§āĻ, āĻāĻĨāĻžāϰāϏ, āĻā§āĻāύāϏā§āĻā§āϝāĻžāĻ RPC āύā§āĻĄ] āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻāĻļāύ āĻāĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠- āĻāĻŽāĻŋ āĻāĻŽāĻžāϰ āĻŦā§āϞāĻāĻā§āύ āĻā§āĻā§āϤāĻŋāϰ āϏāĻžāĻĨā§ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĒāĻ āύāϝā§āĻā§āϝ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻāĻļāύ āĻĒā§āϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āĻĒāĻžāĻŦāϞāĻŋāĻ RPC āύā§āĻĄ āĻāĻāĻāĻŋ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āϰ (āĻŦāĻž āĻ āύā§āϰā§āĻĒ āĻāϝāĻŧāĻžāϞā§āĻ āϝāĻž āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ ), āĻāĻŽāϰāĻž āĻŦā§āϞāĻāĻā§āĻāύ āĻā§āĻā§āϤāĻŋāϤ⧠āĻāϞ āϞāĻŋāĻāϤ⧠āϏāĻā§āώāĻŽ āĻāϰāĻŋāĨ¤ Metamask EIP-1193 Ethereum API āĻŦā§āϰāĻžāĻāĻāĻžāϰ⧠āĻāύāĻā§āĻā§āĻ āĻāϰ⧠āĻā§āĻāϏ āĻāĻāĻŋāĻāĻŽ-āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋāϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻā§āĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻāĻĨāĻžāϰāϏ āĻāĻāĻ [āĻĒāĻžāĻāĻĨāύ, āĻā§āύāϏāϰāĻĢā§āϞā§] āĻā§āĻā§āϏāĻ-āĻā§-āĻāĻŽā§āĻ āϏā§āĻā§āϝāĻžāĻŦāϞ āĻĄāĻŋāĻĢāĻŋāĻāĻļāύ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻšāϞ āĻāĻāĻāĻŋ āĻāĻĒā§āύ-āϏā§āϰā§āϏ āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ āĻāĻŦāĻ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āϝāĻž āĻĒā§āϰāĻžāĻ-āĻĒā§āϰāĻļāĻŋāĻā§āώāĻŋāϤ āĻŽāĻĄā§āϞ āĻāĻŦāĻ āĻ āύā§āϝāĻžāύā§āϝ āĻĄā§āĻāĻž āĻāĻŦāĻ ML āĻā§āϞ āϏāϰāĻŦāϰāĻžāĻš āĻāϰā§āĨ¤ TensorFlow āĻāĻāĻ āĻā§āĻā§āϏāĻ-āĻā§-āĻāĻŽā§āĻ āĻā§āύāĻžāϰā§āĻļāύā§āϰ āĻāύā§āϝ āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻā§āϤ [āĻŦāĻžāĻāĻžāϞāĻšāĻžāĻ] āĻ āĻĢ-āĻā§āĻāύ āĻāĻŽā§āĻĒāĻŋāĻāĻ āĻšāϞ āĻāĻāĻāĻŋ āĻĒāĻŋāϝāĻŧāĻžāϰ-āĻā§-āĻĒāĻŋāϝāĻŧāĻžāϰ āĻāĻĒā§āύ āĻāĻŽā§āĻĒāĻŋāĻāĻā§āĻļāύ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āϝāĻž āϏāϰā§āĻŦāĻāύā§āύ, āϏā§āĻŦāĻā§āĻ āĻāĻŦāĻ āĻāĻā§āĻāĻŋāĻāĻāĻžāĻŦā§ āϝāĻžāĻāĻžāĻāϝā§āĻā§āϝ āĻāĻŖāύāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§āĨ¤ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻā§āϤ āĻ āĻĢ-āĻā§āĻāύ āĻĄā§āĻāĻž āĻāĻŖāύāĻž āϏā§āϤāϰāĨ¤ Bacalhau āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻā§āϤ [āĻĢā§āϞāĻŋāĻ] DApp āϏā§āĻĨāĻžāĻĒāύāĻž IPFS āĻāĻŦāĻ Filecoin-āĻ āĻāϝāĻŧā§āĻŦāϏāĻžāĻāĻ āϏā§āĻĨāĻžāĻĒāύā§āϰ āĻĒā§āϰāϏā§āϤāĻžāĻŦ āĻĻā§āϝāĻŧāĨ¤ āĻāĻāĻŋ Vercel āĻŦāĻž Netlify-āĻāϰ āĻāϝāĻŧā§āĻŦ3 āϏāĻāϏā§āĻāϰāĻŖ - āĻŦāϞāϤ⧠āĻĒāĻžāϰāĻŋ āύāĻž āϝ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āϏāϤā§āϝāĻŋāĻ āĻāĻāĻāĻŋ āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻā§āϤ āĻ ā§āϝāĻžāĻĒ āĻāĻā§ āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āĻāĻāĻŋāĻā§ āĻāϝāĻŧā§āĻŦ2-āĻ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻž āĻšāĻŦā§! :D Fleek đī¸ āĻĒāĻžāĻāĻĨāύ āĻā§āĻā§āϏāĻ-āĻā§-āĻāĻŽā§āĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϤā§āϰāĻŋ āĻāϰāĻž đĄ đĄ TLDR āĻāĻŋāĻĒ āĻāĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ CLI āĻāĻŦāĻ āĻāĻāĻāĻŋ HTTP āĻāύā§āĻĄāĻĒāϝāĻŧā§āύā§āĻā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ Bacalhau-āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻāύā§āϝ āĻāĻĒāϞāĻŦā§āϧ, āϤāĻžāĻ āύāĻŋāϰā§āĻĻā§āĻŦāĻŋāϧāĻžāϝāĻŧ āĻāĻ āĻ āĻāĻļāĻāĻŋ āĻāĻĄāĻŧāĻŋāϝāĻŧā§ āϝāĻžāύāĨ¤ āϏā§āĻĨāĻŋāϤāĻŋāĻļā§āϞ āĻŦāĻŋāϏā§āϤāĻžāϰā§āϰ āĻāύā§āϝ āĻĻā§āϰā§āϤ āĻā§āĻŽāĻŋāĻāĻž āϏā§āĻā§āϝāĻžāĻŦāϞ āĻĄāĻŋāĻĢāĻŋāĻāĻļāύ āĻŦāϰā§āϤāĻŽāĻžāύ⧠āĻā§āĻā§āϏāĻ-āĻā§-āĻāĻŽā§āĻ āĻĒā§āϰāϏā§āϏāĻŋāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻĒā§āϰāϧāĻžāύ āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻ āĻŽāĻĄā§āϞ (āĻāĻŦāĻ āĻāĻāĻ āĻŽāĻĄā§āϞ āĻĄāĻžāϞ-āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§)āĨ¤ āĻāĻāĻŋ āĻāĻ āϧāϰāύā§āϰ āĻĄāĻŋāĻĒ āϞāĻžāϰā§āύāĻŋāĻ - āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻāϝāĻŧā§āϰ āĻāĻāĻāĻŋ āĻāĻĒāϏā§āĻ āϝāĻž āύāĻŋāĻā§āĻā§ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāĻžāĻ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻāϰāϤ⧠āĻļā§āĻāĻžāϝāĻŧ - āĻāĻ āĻā§āώā§āϤā§āϰ⧠āĻāĻāĻāĻŋ āĻĒāĻžāĻ ā§āϝ āĻāύāĻĒā§āĻāĻā§ āĻāĻāĻāĻŋ āĻāĻŋāϤā§āϰ āĻāĻāĻāĻĒā§āĻā§ āϰā§āĻĒāĻžāύā§āϤāϰ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻ āĻāĻĻāĻžāĻšāϰāĻŖā§, āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻĄāĻŋāĻĢāĻŋāĻāĻļāύ āĻĒā§āϰā§āĻŦā§āĻŦāĻŋāϞāĻŋāϏā§āĻāĻŋāĻ āĻŽāĻĄā§āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻāĻŋ āϝāĻž āĻā§āĻā§āϏāĻ āĻĨā§āĻā§ āĻāĻŽā§āĻ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻāĻāĻāĻŋ āĻā§āϰāĻžāύā§āϏāĻĢāϰāĻŽāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĨ¤ āϝāĻžāĻāĻšā§āĻ āĻāĻŋāύā§āϤāĻž āĻāϰāĻŦā§āύ āύāĻž - āĻāϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰāĻā§ āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻ āĻŽāĻĄā§āϞ⧠āĻāĻŋāϝāĻŧā§ āĻĒā§āϰāĻļāĻŋāĻā§āώāĻŖ āĻĻā§āĻāϝāĻŧāĻžāϰ āĻĻāϰāĻāĻžāϰ āύā§āĻ (āϝāĻĻāĻŋāĻ āĻāϰ⧠- āϝāĻĻāĻŋ āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻāĻŋāύāĻŋāϏ āĻšāϝāĻŧ - āĻāĻĒāύāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ!) āĻĒāϰāĻŋāĻŦāϰā§āϤā§, āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻĒāĻžāĻāĻĨāύ āϏā§āĻā§āϰāĻŋāĻĒā§āĻā§ Google-āĻāϰ TensorFlow āĻāĻĒā§āύ-āϏā§āϰā§āϏ āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻĒā§āϰāĻžāĻ-āĻĒā§āϰāĻļāĻŋāĻā§āώāĻŋāϤ āĻŽāĻĄā§āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āϝāĻžāĻā§āĻāĻŋ āĻāĻžāϰāĻŖ āĻāĻŽāĻžāĻĻā§āϰ āĻāύā§āϝ ML āĻāĻāύāĻā§āϞāĻŋ āĻĒā§āϰāĻžāĻ-āĻāĻŖāύāĻž āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤ āĻāϰāĻ āϏāĻ āĻŋāĻāĻāĻžāĻŦā§, āĻāĻŽāϰāĻž āĻāϏāϞ āĻāĻŽāĻāϞ āĻŽāĻĄā§āϞā§āϰ āĻāĻāĻāĻŋ āĻ āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻ āĻāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻāĻŋāĨ¤ āĻā§āϰāĻžāϏ/āĻā§āύāϏāϰāĻĢā§āϞ⧠āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻĢāϰā§āĻ āĻĒāĻžāĻāĻĨāύ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ đĻ āĻāĻĒāύāĻŋ āĻā§āĻāĻžāĻŦā§ āĻāĻ āĻā§āĻā§āϏāĻ-āĻā§-āĻāĻŽā§āĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻāĻŋ āϤā§āϰāĻŋ āĻāϰāĻŦā§āύ āĻāĻŦāĻ āĻĄāĻāĻžāϰāĻžāĻāĻ āĻāϰāĻŦā§āύ āϤāĻžāϰ āĻāϝāĻŧāĻžāĻāĻĨā§āϰ⧠āĻā§āĻāĻā§ āĻĒāĻžāĻŦā§āύ āĻāĻŦāĻ āĻāĻāĻŋ āĻāĻŦāĻ āĻāĻ āĻāĻžāϞāĻžāύāĨ¤ đĻ āĻāĻĒāύāĻŋ āĻāĻ āĻāĻāĻŋ āĻāĻžāϞāĻžāϤ⧠āĻĒāĻžāϰā§āύ āϏāĻŽā§āĻĒā§āϰā§āĻŖ Bacalhau āĻĄāĻā§āϏ⧠@BacalhauProject YouTube āĻāĻŋāĻĄāĻŋāĻāϤ⧠Google Collabs āύā§āĻāĻŦā§āĻā§āĻ āĻāĻāĻžāύ⧠āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻĒāĻžāĻāĻĨāύ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ! import argparse from stable_diffusion_tf.stable_diffusion import Text2Image from PIL import Image import os parser = argparse.ArgumentParser(description="Stable Diffusion") parser.add_argument("--h",dest="height", type=int,help="height of the image",default=512) parser.add_argument("--w",dest="width", type=int,help="width of the image",default=512) parser.add_argument("--p",dest="prompt", type=str,help="Description of the image you want to generate",default="cat") parser.add_argument("--n",dest="numSteps", type=int,help="Number of Steps",default=50) parser.add_argument("--u",dest="unconditionalGuidanceScale", type=float,help="Number of Steps",default=7.5) parser.add_argument("--t",dest="temperature", type=int,help="Number of Steps",default=1) parser.add_argument("--b",dest="batchSize", type=int,help="Number of Images",default=1) parser.add_argument("--o",dest="output", type=str,help="Output Folder where to store the Image",default="./") args=parser.parse_args() height=args.height width=args.width prompt=args.prompt numSteps=args.numSteps unconditionalGuidanceScale=args.unconditionalGuidanceScale temperature=args.temperature batchSize=args.batchSize output=args.output generator = Text2Image( img_height=height, img_width=width, jit_compile=False, # You can try True as well (different performance profile) ) img = generator.generate( prompt, num_steps=numSteps, unconditional_guidance_scale=unconditionalGuidanceScale, temperature=temperature, batch_size=batchSize, ) for i in range(0,batchSize): pil_img = Image.fromarray(img[i]) image = pil_img.save(f"{output}/image{i}.png") āĻāĻĒāϰā§āϰ āϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻāĻŋ āĻā§āĻŦāϞ āĻāĻāĻāĻŋ āĻā§āĻā§āϏāĻ āĻĒā§āϰāĻŽā§āĻĒāĻ āĻāύāĻĒā§āĻ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻāĻŦāĻ āĻāĻŋāĻā§ āĻ āύā§āϝāĻžāύā§āϝ āĻāĻā§āĻāĻŋāĻ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āĻā§āϰāĻšāĻŖ āĻāϰ⧠āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ⧠āĻāĻžāĻāĻāĻžāϝā§āĻā§āϤ āĻā§āύāϏāϰāĻĢā§āϞ⧠āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋāϤ⧠āĻāϞ āĻāϰ⧠āĻāĻŦāĻŋ (āĻā§āϞāĻŋ) āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻāĻŦāĻ āϏā§āĻā§āϞāĻŋāĻā§ āĻāĻāĻāĻŋ āĻāĻāĻāĻĒā§āĻ āĻĢāĻžāĻāϞ⧠āϏāĻāϰāĻā§āώāĻŖ āĻāϰā§ā§ˇ āĻāĻāĻžāύ⧠āĻāϰāĻž āϏāĻŽāϏā§āϤ āĻāĻžāϰ⧠āĻāϤā§āϤā§āϞāύ āύā§āĻā§āϰ āĻŦāĻŋāĻāĻžāĻā§ āĻāĻā§ - āĻāĻāĻžāύā§āĻ āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻ āĻŽāĻĄā§āϞ āϤāĻžāϰ āĻāĻžāĻĻā§ āĻāϰā§āĨ¤ đĒ generator = Text2Image( img_height=height, img_width=width, jit_compile=False, ) img = generator.generate( prompt, num_steps=numSteps, unconditional_guidance_scale=unconditionalGuidanceScale, temperature=temperature, batch_size=batchSize, ) āĻĻāĻžāϰā§āĻŖ, āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻā§āĻā§āϏāĻ āĻĒā§āϰāĻŽā§āĻĒāĻ āĻĨā§āĻā§ āĻāĻŦāĻŋ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ, āĻāĻŋāύā§āϤ⧠āĻāĻŽ... āĻāĻ GPU-āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻāĻŋ āĻā§āĻĨāĻžāϝāĻŧ āĻāĻžāϞāĻžāϤ⧠āĻšāĻŦā§..... đ¤đ¤ āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āĻāĻŋāύāĻŋāϏ āĻĨāĻžāĻā§ āϝ⧠āĻŦā§āϞāĻāĻā§āĻāύ āĻĒā§āϰāϝā§āĻā§āϤāĻŋ āϏāĻšāĻāĻžāϤāĻāĻžāĻŦā§ āĻāĻžāϞ āĻāĻžāĻ āĻāϰ⧠āύāĻž, āϤāĻž āĻšāϞ āĻŦāĻĄāĻŧ āĻĄā§āĻāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖāĨ¤ āĻāĻāĻŋ āύāĻŋāϰā§āĻāϰāϝā§āĻā§āϝāϤāĻž āĻāĻŦāĻ āϏā§āύā§āϏāϰāĻļāĻŋāĻĒ āĻĒā§āϰāϤāĻŋāϰā§āϧā§āϰ āĻŽāϤ āĻ āύā§āϝāĻžāύā§āϝ āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻĒā§āϰāĻĻāĻžāύā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻŦāĻŋāϤāϰāĻŖ āĻāϰāĻž āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻāĻĒāϰ āĻāĻŽā§āĻĒāĻŋāĻāĻāĻŋāĻ āĻāϰāĻā§āϰ āĻāĻžāϰāĻŖā§āĨ¤ āĻā§āĻ āĻāĻĻāĻžāĻšāϰāĻŖā§āϰ āĻāύā§āϝ āĻāĻĒāύāĻžāϰ āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻŽā§āĻļāĻŋāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϏāĻŽā§āĻāĻŦ - āĻāϏāϞ⧠āĻāĻŽāĻŋ āĻāĻ āĻŦāĻŋāĻļā§āώ āĻāĻĻāĻžāĻšāϰāĻŖāĻāĻŋ āĻāĻŽāĻžāϰ (āĻāĻāĻŋ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻā§āĻŦ āĻ āϏāύā§āϤā§āώā§āĻ) āĻŽā§āϝāĻžāĻ āĻāĻŽ 1 āĻ āĻāĻžāĻ āĻāϰāϤ⧠āĻĒā§āϰā§āĻāĻŋ, āϤāĻŦā§, āĻāĻāĻŋ āĻĢāϞāĻžāĻĢāϞā§āϰ āĻāύā§āϝ āĻā§āĻŦ āĻĻā§āϰā§āĻ āĻ āĻĒā§āĻā§āώāĻž āĻāĻŋāϞ (āĻā§āĻŦāĻŋāϞ āĻā§āύāĻŋāϏā§āϰ āĻā§āϞāĻž āĻā§āĻ?) āϏā§āϤāϰāĻžāĻ, āĻāĻāĻŦāĻžāϰ āĻāĻĒāύāĻŋ āĻŦāĻĄāĻŧ āĻĄā§āĻāĻž āĻĒā§āϰāϏā§āϏāĻŋāĻ āĻāϰāĻž āĻļā§āϰ⧠āĻāϰāϞā§, āĻāĻĒāύāĻžāϰ āĻāϰāĻ āĻā§āϝāĻžāϏā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāĻŦā§ (āĻļā§āϞā§āώā§āϰ āĻāĻĻā§āĻĻā§āĻļā§āϝā§) āĻāĻŦāĻ āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ āĻŦāĻžāĻĄāĻŧāĻŋāϰ āĻāĻļā§āĻĒāĻžāĻļā§ āĻāĻāĻāĻŋ āĻĄā§āĻĄāĻŋāĻā§āĻā§āĻĄ āϏāĻžāϰā§āĻāĻžāϰ āύāĻž āĻĨāĻžāĻā§, āϤāĻžāĻšāϞ⧠āĻāĻĒāύāĻžāĻā§ āĻāĻāĻāĻŋ āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ āĻŽā§āĻļāĻŋāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšāĻŦā§ āĻā§āϞāĻžāĻāĻĄ āĻāĻŽā§āĻĒāĻŋāĻāĻāĻŋāĻ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽāĨ¤ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻŋ āĻā§āύā§āĻĻā§āϰā§āĻā§āϤ āύāϝāĻŧ, āĻāĻāĻŋ āĻ āĻĻāĻā§āώāĻ - āĻāĻŖāύāĻž āĻŽā§āĻļāĻŋāύ āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻ āĻāĻžāύāĻž āĻĻā§āϰāϤā§āĻŦā§āϰ āĻāĻžāϰāĻŖā§ āĻāĻŦāĻ āĻāĻāĻŋ āĻĻā§āϰā§āϤ āĻŦā§āϝāϝāĻŧāĻŦāĻšā§āϞ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻŽāĻŋ āĻāĻŽāύ āĻā§āύ⧠āĻĢā§āϰāĻŋ-āĻāĻžāϝāĻŧāĻžāϰ āĻā§āϞāĻžāĻāĻĄ āĻāĻŽā§āĻĒāĻŋāĻāĻāĻŋāĻ āĻĒāϰāĻŋāώā§āĻŦāĻž āĻā§āĻāĻā§ āĻĒāĻžāĻāύāĻŋ āϝāĻž āĻāϰ āĻāύā§āϝ GPU āĻĒā§āϰāϏā§āϏāĻŋāĻ āĻ āĻĢāĻžāϰ āĻāϰ⧠(āĻā§āĻ āĻāĻŋ āĻŦāϞā§āĻā§ āĻā§āϰāĻŋāĻĒā§āĻā§ āĻŽāĻžāĻāύāĻŋāĻ āύāĻŋāώāĻŋāĻĻā§āϧ..?) āĻāĻŦāĻ āĻĒāϰāĻŋāĻāϞā§āĻĒāύāĻžāĻā§āϞāĻŋ āĻĒā§āϰāϤāĻŋ āĻŽāĻžāϏ⧠āĻāϏā§āĻā§ (āύāĻž āϧāύā§āϝāĻŦāĻžāĻĻ)āĨ¤ 400 āĻŽāĻžāϰā§āĻāĻŋāύ āĻĄāϞāĻžāϰ⧠āĻŦāĻžāĻāĻžāϞāĻšāĻžāĻ ! āĻāĻžāĻā§āϝāĻā§āϰāĻŽā§ āϝāĻĻāĻŋāĻ, āĻāĻ āϏāĻŽāϏā§āϝāĻžāĻā§āϞāĻŋ āĻāĻŋāĻā§ āϏāĻŽāϏā§āϝāĻž āϝāĻž Bacalhau āϏāĻŽāĻžāϧāĻžāύ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻā§āĨ¤ āĻĄā§āĻāĻž āĻĒā§āϰāϏā§āϏāĻŋāĻ āĻāĻŦāĻ āĻāĻŖāύāĻžāĻā§ āϏāĻāϞā§āϰ āĻāύā§āϝ āĻāύā§āĻŽā§āĻā§āϤ āĻāĻŦāĻ āĻāĻĒāϞāĻŦā§āϧ āĻāϰāĻž āĻāĻŦāĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖā§āϰ āϏāĻŽāϝāĻŧ āĻĻā§āϰā§āϤ āĻāϰāĻž Bacalhau-āϤ⧠āϏāĻŽā§āĻāĻŦ, āĻĒā§āϰāĻĨāĻŽāϤ - āĻāĻāĻžāϧāĻŋāĻ āύā§āĻĄ āĻā§āĻĄāĻŧā§ āĻŦā§āϝāĻžāĻ āĻĒā§āϰāϏā§āϏāĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŦāĻ āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧāϤ āϝā§āĻāĻžāύ⧠āĻĄā§āĻāĻž āĻŦāĻžāϏ āĻāϰ⧠āϏā§āĻāĻžāύ⧠āĻĒā§āϰāϏā§āϏāĻŋāĻ āύā§āĻĄ āϏā§āĻĨāĻžāĻĒāύ āĻāϰā§! Bacalhau āĻāĻāĻĒāĻŋāĻāĻĢāĻāϏ, āĻĢāĻžāĻāϞāĻāϝāĻŧā§āύ āĻāĻŦāĻ āĻāϝāĻŧā§āĻŦ3 āĻāϰ āĻ āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤ āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻāϰāĻŖ āĻŽāĻžāύāĻā§āϞāĻŋāĻā§ āĻāϰāĻ āĻŦāĻŋāϏā§āϤā§āϤāĻāĻžāĻŦā§ āĻĒāϰāĻŋāϤā§āϝāĻžāĻ āύāĻž āĻāϰ⧠āĻĄā§āĻāĻžāϰ āĻāĻĒāϰ āĻ āĻĢ-āĻā§āĻāύ āĻāĻŖāύāĻž āϏāĻā§āώāĻŽ āĻāϰ⧠āĻĄā§āĻāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖā§āϰ āĻāĻŦāĻŋāώā§āϝāϤāĻā§ āĻāĻŖāϤāĻžāύā§āϤā§āϰāĻŋāĻ āĻāϰāϤ⧠āϏāĻšāĻžāϝāĻŧāϤāĻž āĻāϰāĻžāϰ āϞāĻā§āώā§āϝ⧠āϰāϝāĻŧā§āĻā§ā§ˇ āĻšāϞ āĻāĻāĻāĻŋ āĻĒāĻŋāϝāĻŧāĻžāϰ-āĻā§-āĻĒāĻŋāϝāĻŧāĻžāϰ āĻāĻĒā§āύ āĻāĻŽā§āĻĒāĻŋāĻāĻā§āĻļāύ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āϝāĻž āϏāϰā§āĻŦāĻāύā§āύ, āϏā§āĻŦāĻā§āĻ āĻāĻŦāĻ āĻāĻā§āĻāĻŋāĻāĻāĻžāĻŦā§ āϝāĻžāĻāĻžāĻāϝā§āĻā§āϝ āĻāĻŖāύāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠āϝā§āĻāĻžāύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰāĻž āĻāĻāĻĒāĻŋāĻāĻĢāĻāϏ (āĻāĻŦāĻ āĻļā§āĻā§āϰāĻ āĻĢāĻžāĻāϞāĻāϝāĻŧā§āύ) āĻ āϏāĻā§āĻāĻŋāϤ āĻĄā§āĻāĻž āϏāĻš āĻĄā§āĻāĻžāϰ āĻŦāĻŋāϰā§āĻĻā§āϧ⧠āĻāĻžāĻ āĻšāĻŋāϏāĻžāĻŦā§ āĻĄāĻāĻžāϰ āĻāύā§āĻā§āĻāύāĻžāϰ āĻŦāĻž āĻāϝāĻŧā§āĻŦ āĻ ā§āϝāĻžāϏā§āĻŽā§āĻŦāϞāĻŋ āĻāĻŦāĻŋ āĻāĻžāϞāĻžāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻŽāύāĻāĻŋ āĻāĻāĻŋāϰ GPU āĻāĻžāĻā§āϰ āĻāύā§āϝ āϏāĻŽāϰā§āĻĨāύ āϰāϝāĻŧā§āĻā§ āĻāĻŦāĻ US$400 āĻŦāĻž āϤāĻžāϰ āĻŦā§āĻļāĻŋ āύāϝāĻŧ! Bacalhau āϝā§āĻā§āύ⧠Bacalhau āϤ⧠āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻāĻžāϞāĻžāύ⧠āĻāĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻāĻŋ āĻāĻžāϞāĻžāύā§āϰ āĻāύā§āϝ, āĻāĻŽāϰāĻž āĻāĻāĻŋāĻā§ Bacalhau-āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻāύā§āϝ Dockerise āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻāĻŋ āĻāϰāϤ⧠āĻļāĻŋāĻāϤ⧠āĻāĻžāύ āϤāĻŦā§ āĻāĻĒāύāĻŋ āĻ āύā§āϏāϰāĻŖ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ⧎ āϤāĻžāϰāĻĒāϰ⧠āĻāĻŽāϰāĻž āĻāĻāĻŋāĻā§ Bacalhau CLI-āĻāϰ āϏāĻžāĻĨā§ āĻŽāĻžāϤā§āϰ āĻāĻ āϞāĻžāĻāύā§āϰ āĻā§āĻĄ āĻĻāĻŋāϝāĻŧā§ āĻāĻžāϞāĻžāϤ⧠āĻĒāĻžāϰāĻŋ (āĻ āύā§āϝ āĻāĻ-āϞāĻžāĻāύāĻžāϰ āĻĻāĻŋāϝāĻŧā§ āĻĒāϰā§): āĻāĻāĻžāύ⧠āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞāĻāĻŋ Bacalhau āĻāύāϏā§āĻāϞ āĻāϰāĻžāϰ bacalhau docker run --gpu 1 ghcr.io/bacalhau-project/examples/stable-diffusion-gpu:0.0.1 -- python main.py --o ./outputs --p "Rainbow Unicorn" āϝāĻĻāĻŋāĻ āĻāĻ āĻāĻĻāĻžāĻšāϰāĻŖā§, āĻāĻŽāĻŋ āĻāĻāĻāĻŋ āĻāĻāĻāĻāĻŋāĻāĻŋāĻĒāĻŋ āĻāύā§āĻĄāĻĒāϝāĻŧā§āύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āϝāĻžāĻā§āĻāĻŋ āϝāĻž āĻāĻŽāĻžāĻā§ āĻāĻ āĻĄāĻāĻžāϰāĻžāĻāĻāĻĄ āϏā§āĻā§āϝāĻžāĻŦāϞ āĻĄāĻŋāĻĢāĻŋāĻāĻļāύ āϏā§āĻā§āϰāĻŋāĻĒā§āĻā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻā§āϤ āĻāϰā§, āϝāĻž āĻāĻŽāĻŋ āĻāĻĒāύāĻžāĻā§ āĻāύā§āĻāĻŋāĻā§āϰā§āĻļāύ āĻŦāĻŋāĻāĻžāĻā§ āĻĻā§āĻāĻžāĻŦ! āϝāĻĻāĻŋāĻ āĻāĻŽāĻŋ āĻāĻāĻžāύ⧠āύā§āĻ āĻāϰāĻŦ, āĻāĻāĻŋ āĻĄā§āĻāĻž āĻāĻŖāύāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāĻžāϞāĻžāύā§āϰ āĻāĻāĻāĻŋ āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āĻāĻŦāĻ āύāĻŽāύā§āϝāĻŧ āĻāĻĒāĻžāϝāĻŧ āϝāĻž āĻāϝāĻŧā§āĻŦ3 āĻŦāύā§āϧā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ - āĻāĻŽāϰāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻ āĻāĻāĻāĻŋ āĻā§āĻ āĻŽāĻĄā§āϞā§āϰ āĻŽāϧā§āϝ⧠āϏā§āĻŽāĻžāĻŦāĻĻā§āϧ āύāĻāĨ¤ āĻāϞā§āύ NFT āϏā§āĻā§āϰāĻŋāĻĒā§āĻā§ āϝāĻžāĻāĻšā§āĻ! :) âī¸ āϏāϞāĻŋāĻĄāĻŋāĻāĻŋ āĻāύāĻāĻĢāĻāĻŋ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϤā§āϰāĻŋ āĻāĻŦāĻ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻž āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋ NFT āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋāĻāĻŋ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āϤā§āϰāĻŋ āĻāĻŋāύā§āϤ⧠ERC721URIStorage āϏāĻāϏā§āĻāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āϝāĻžāϰ āĻŽāϧā§āϝ⧠āĻŽā§āĻāĻžāĻĄā§āĻāĻž āϏā§āĻā§āϝāĻžāύā§āĻĄāĻžāϰā§āĻĄ āĻāĻā§āϏāĻā§āύāĻļāύ āϰāϝāĻŧā§āĻā§ (āϤāĻžāĻ āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ IPFS-āĻ ā§āϝāĻžāĻĄā§āϰā§āϏāĻĄ āĻŽā§āĻāĻžāĻĄā§āĻāĻž āĻĒāĻžāϏ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ - āϝāĻž āĻāĻŽāϰāĻž āĻā§āĻā§āϤāĻŋāϤ⧠NFT.Storage-āĻ āϏāĻāϰāĻā§āώāĻŖ āĻāϰāĻŦ) . āĻāĻĒā§āύ āĻā§āĻĒā§āϞāĻŋāύā§āϰ ERC721 āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύā§āϰ āĻāĻ āĻŦā§āϏ āĻāύā§āĻā§āϰāĻžāĻā§āĻ āĻ āϤāĻŋāϰāĻŋāĻā§āϤāĻāĻžāĻŦā§ āĻāĻŽāĻžāĻĻā§āϰ āĻāύā§āϝ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāĻŋāϤ āĻŽāĻŋāύā§āĻ() āĻāĻŦāĻ āĻā§āϰāĻžāύā§āϏāĻĢāĻžāϰ() āĻāϰ āĻŽāϤ⧠āĻĢāĻžāĻāĻļāύ āϏāĻš āĻāĻāĻāĻŋ NFT āĻā§āĻā§āϤāĻŋāϰ āϏāĻžāϧāĻžāϰāĻŖ āĻāĻžāϰā§āϝāĻāĻžāϰāĻŋāϤāĻž āĻĻā§āϝāĻŧāĨ¤ āĻāĻĒāύāĻŋ āϞāĻā§āώā§āϝ āĻāϰāĻŦā§āύ āϝ⧠āĻāĻŽāĻŋ āĻāĻŽāĻžāϰ āϏāĻžāĻŽāύā§āϰ āĻĒā§āϰāĻžāύā§āϤā§āϰ āĻāύā§āϝ āĻĄā§āĻāĻž āĻāύāĻžāϰ āĻāύā§āϝ āĻāϝāĻŧā§āĻāĻāĻŋ āĻā§āĻāĻžāϰ āĻĢāĻžāĻāĻļāύ āϝā§āĻ āĻāϰā§āĻāĻŋ āϏā§āĻāϏāĻžāĻĨā§ āĻāĻāĻāĻŋ āĻāĻā§āύā§āĻ āϝāĻž āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻāĻāĻāĻŋ āύāϤā§āύ NFT āĻŽāĻŋāύā§āĻ āĻāϰāĻž āĻšāϞ⧠āĻ āύ-āĻā§āĻāύ āύāĻŋāϰā§āĻāϤ āĻšāĻŦā§āĨ¤ āĻāĻāĻŋ DApp āĻĨā§āĻā§ āĻ āύ-āĻā§āĻāύ āĻāĻā§āύā§āĻāĻā§āϞāĻŋ āĻļā§āύāĻžāϰ āĻā§āώāĻŽāϤāĻž āĻĻā§āϝāĻŧ⧎ đĄ đĄ āϰāĻŋāĻŽāĻŋāĻā§āϏ⧠āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĻā§āĻā§āύ āĻāĻŦāĻ āĻāĻ āϞāĻŋāĻā§āĻā§ āĻā§āϞāĻŋāĻ āĻāϰ⧠āϏāĻŽāϏā§āϤ āĻāĻĒāϞāĻŦā§āϧ āĻĢāĻžāĻāĻļāύ āĻĻā§āĻā§āύ! BacalhauFRC721.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@hardhat/console.sol"; contract BacalhauFRC721 is ERC721URIStorage { /** @notice Counter keeps track of the token ID number for each unique NFT minted in the NFT collection */ using Counters for Counters.Counter; Counters.Counter private _tokenIds; /** @notice This struct stores information about each NFT minted */ struct bacalhauFRC721NFT { address owner; string tokenURI; uint256 tokenId; } /** @notice Keeping an array for each of the NFT's minted on this contract allows me to get information on them all with a read-only front end call */ bacalhauFRC721NFT[] public nftCollection; /** @notice The mapping allows me to find NFT's owned by a particular wallet address. I'm only handling the case where an NFT is minted to an owner in this contract - but you'd need to handle others in a mainnet contract like sending to other wallets */ mapping(address => bacalhauFRC721NFT[]) public nftCollectionByOwner; /** @notice This event will be triggered (emitted) each time a new NFT is minted - which I will watch for on my front end in order to load new information that comes in about the collection as it happens */ event NewBacalhauFRC721NFTMinted( address indexed sender, uint256 indexed tokenId, string tokenURI ); /** @notice Creates the NFT Collection Contract with a Name and Symbol */ constructor() ERC721("Bacalhau NFTs", "BAC") { console.log("Hello Fil-ders! Now creating Bacalhau FRC721 NFT contract!"); } /** @notice The main function which will mint each NFT. The ipfsURI is a link to the ipfs content identifier hash of the NFT metadata stored on NFT.Storage. This data minimally includes name, description and the image in a JSON. */ function mintBacalhauNFT(address owner, string memory ipfsURI) public returns (uint256) { // get the tokenID for this new NFT uint256 newItemId = _tokenIds.current(); // Format info for saving to our array bacalhauFRC721NFT memory newNFT = bacalhauFRC721NFT({ owner: msg.sender, tokenURI: ipfsURI, tokenId: newItemId }); //mint the NFT to the chain _mint(owner, newItemId); //Set the NFT Metadata for this NFT _setTokenURI(newItemId, ipfsURI); _tokenIds.increment(); //Add it to our collection array & owner mapping nftCollection.push(newNFT); nftCollectionByOwner[owner].push(newNFT); // Emit an event on-chain to say we've minted an NFT emit NewBacalhauFRC721NFTMinted( msg.sender, newItemId, ipfsURI ); return newItemId; } /** * @notice helper function to display NFTs for frontends */ function getNFTCollection() public view returns (bacalhauFRC721NFT[] memory) { return nftCollection; } /** * @notice helper function to fetch NFT's by owner */ function getNFTCollectionByOwner(address owner) public view returns (bacalhauFRC721NFT[] memory){ return nftCollectionByOwner[owner]; } āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧāϤāĻž āĻāĻŽāĻŋ āĻāĻ āĻā§āĻā§āϤāĻŋāĻāĻŋ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻŦ, āϤāĻŦā§ āĻāĻĒāύāĻŋ āĻāĻ āĻā§āĻā§āϤāĻŋāĻāĻŋ āĻĒāϞāĻŋāĻāύ, BSC, āĻ āĻĒāĻāĻŋāĻŽāĻŋāĻāĻŽ, āĻāϰā§āĻŦāĻŋāĻā§āϰāĻžāĻŽ, āĻ ā§āϝāĻžāĻāĻžāϞāĻžāĻā§āĻ āĻāĻŦāĻ āĻāϰāĻ āĻ āύā§āĻ āĻāĻŋāĻā§ āϏāĻš āϝā§āĻā§āύ EVM-āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ āĻā§āĻāύ⧠āϏā§āĻĨāĻžāĻĒāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻŽāύāĻāĻŋ āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻŽāĻžāϞā§āĻāĻŋ-āĻā§āĻāύ āĻāύāĻāĻĢāĻāĻŋ (āĻāĻā§āĻāĻŋāϤ: ) āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻāĻĒāύāĻžāϰ āϏāĻžāĻŽāύā§āϰ āĻĒā§āϰāĻžāύā§āϤ⧠āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ! Filecoin āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ āĻŽā§āĻļāĻŋāύ āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻā§āϏā§āĻāύā§āĻā§ āĻāĻ āϰā§āĻĒā§ āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻā§āϏā§āĻāύā§āĻā§ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāĻŦā§ āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻā§āϏā§āĻāύā§āĻā§ āĻŽā§āĻāĻžāĻŽāĻžāϏā§āĻ āĻāϝāĻŧāĻžāϞā§āĻ āϏā§āĻ āĻāĻĒ āĻāϰā§āύ āĻāĻŦāĻ āϏāĻāϝā§āĻā§āϤ āĻāϰā§āύ āĻāĻāĻāĻŋ āĻāϞ āĻĨā§āĻā§ āĻāĻŋāĻā§ āĻĒāϰā§āĻā§āώāĻž āĻāĻŋāĻāĻĢāĻāĻāĻāϞ āϤāĻšāĻŦāĻŋāϞ āĻĒāĻžāύ ( āĻŦāĻž ) āϝā§āĻ āĻā§āύāĻĄāĻžāĻā§āϏ Hardhat āϏāĻā§āĻā§ āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋ āϏā§āĻĨāĻžāĻĒāύ āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻā§āϏā§āĻāύā§āĻā§ āĻāĻ āĻā§āĻā§āϤāĻŋāĻāĻŋ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāϤ⧠āĻāĻŽāĻŋ āĻšāĻžāϰā§āĻĄāĻšā§āϝāĻžāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻāĻŋāĨ¤ đ¸ āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ RPC āĻāĻŦāĻ āĻŦā§āϞāĻāĻāĻā§āϏāĻĒā§āϞā§āϰāĻžāϰ āĻŦāĻŋāĻāϞā§āĻĒ: āĻĒāĻžāĻŦāϞāĻŋāĻ RPC āĻāύā§āĻĄāĻĒāϝāĻŧā§āύā§āĻ āĻŦā§āϞāĻāĻāĻā§āϏāĻĒā§āϞā§āϰāĻžāϰ https://filecoin-hyperspace.chainstacklabs.com/rpc/v0 https://beryx.zondax.ch/ https://hyperspace.filfox.info/rpc/v0 https://fvm.starboard.ventures/contracts/ https://rpc.ankr.com/filecoin_testnet https://explorer.glif.io/?network=hyperspacenet : API āĻā§āϞā§āύ beryx.zondax.ch https://hyperspace.filfox.info/en āĻāύāĻĢāĻŋāĻāĻžāϰ āϏā§āĻ-āĻāĻĒā§āϰ āĻāύā§āϝ, āĻāĻŽāϰāĻž āĻāĻĒāϞāĻŦā§āϧ āϝ⧠āĻā§āύ⧠āĻĒāĻžāĻŦāϞāĻŋāĻ RPC āĻāύā§āĻĄāĻĒāϝāĻŧā§āύā§āĻ āĻĨā§āĻā§ āĻŦā§āĻā§ āύāĻŋāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ hardhat.config.ts import '@nomicfoundation/hardhat-toolbox'; import { config as dotenvConfig } from 'dotenv'; import { HardhatUserConfig } from 'hardhat/config'; import { resolve } from 'path'; //Import our customised tasks // import './pages/api/hardhat/tasks'; const dotenvConfigPath: string = process.env.DOTENV_CONFIG_PATH || './.env'; dotenvConfig({ path: resolve(__dirname, dotenvConfigPath) }); // Ensure that we have all the environment variables we need. const walletPrivateKey: string | undefined = process.env.WALLET_PRIVATE_KEY; if (!walletPrivateKey) { throw new Error('Please set your Wallet private key in a .env file'); } const config: HardhatUserConfig = { solidity: '0.8.17', defaultNetwork: 'filecoinHyperspace', networks: { hardhat: {}, filecoinHyperspace: { url: 'https://api.hyperspace.node.glif.io/rpc/v1', chainId: 3141, accounts: [process.env.WALLET_PRIVATE_KEY ?? 'undefined'], }, // bleeding edge often-reset FVM testnet filecoinWallaby: { url: 'https://wallaby.node.glif.io/rpc/v0', chainId: 31415, accounts: [process.env.WALLET_PRIVATE_KEY ?? 'undefined'], //explorer: https://wallaby.filscan.io/ and starboard }, }, // I am using the path mapping so I can keep my hardhat deployment within the /pages folder of my DApp and therefore access the contract ABI for use on my frontend paths: { root: './pages/api/hardhat', tests: './pages/api/hardhat/tests', //who names a directory in the singular?!!! Grammarly would not be happy cache: './pages/api/hardhat/cache', }, }; export default config; āĻāĻŦāĻ āϏā§āĻŽāĻžāϰā§āĻ āĻāύā§āĻā§āϰāĻžāĻā§āĻ āĻĄāĻŋāĻĒā§āϞāϝāĻŧ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻĄāĻŋāĻĒā§āϞā§āϝāĻŧ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϤā§āϰāĻŋ āĻāϰāĻŋ - āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ āϝ⧠āĻāĻŽāĻŋ āĻāĻāĻžāύ⧠āĻāϝāĻŧāĻžāϞā§āĻ āĻ ā§āϝāĻžāĻĄā§āϰā§āϏāĻāĻŋ āϏā§āĻŦāĻžāĻā§āώāϰāĻāĻžāϰ⧠(āĻŽāĻžāϞāĻŋāĻ) āĻšāĻŋāϏāĻžāĻŦā§ āϏā§āĻ āĻāϰāĻāĻŋ - āϞā§āĻāĻžāϰ āϏāĻŽāϝāĻŧ FEVM-āĻ āĻāĻŋāĻā§ āĻŽā§āϝāĻžāĻĒāĻŋāĻ āϤā§āϰā§āĻāĻŋ āĻāĻāύāĻ āĻāĻžāĻ āĻāϰāĻž āĻšāĻā§āĻā§ āϝāĻž āĻšāϤ⧠āĻĒāĻžāϰ⧠āĻāĻŋāĻā§ āĻ āĻĻā§āĻā§āϤ āĻāĻāϰāĻŖāĨ¤ deploy/deployBacalhauFRC721.ts import hre from 'hardhat'; import type { BacalhauFRC721 } from '../typechain-types/contracts/BacalhauFRC721'; import type { BacalhauFRC721__factory } from '../typechain-types/factories/contracts/BacalhauFRC721__factory'; async function main() { console.log('Bacalhau721 deploying....'); // !!!needed as hardhat's default does not map correctly to the FEVM const owner = new hre.ethers.Wallet( process.env.WALLET_PRIVATE_KEY || 'undefined', hre.ethers.provider ); const bacalhauFRC721Factory: BacalhauFRC721__factory = < BacalhauFRC721__factory > await hre.ethers.getContractFactory('BacalhauFRC721', owner); const bacalhauFRC721: BacalhauFRC721 = <BacalhauFRC721>( await bacalhauFRC721Factory.deploy() ); await bacalhauFRC721.deployed(); console.log('bacalhauFRC721 deployed to ', bacalhauFRC721.address); // optionally log to a file here } main().catch((error) => { console.error(error); process.exitCode = 1; }); āϏā§āĻĨāĻžāĻĒāύ āĻāϰāϤā§, āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻā§āĻĄāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻžāϰā§āĻŽāĻŋāύāĻžāϞ⧠āĻāĻĒāϰā§āϰ āϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻāĻŋ āĻāĻžāϞāĻžāύ (NB: āϝā§āĻšā§āϤ⧠āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻāύāĻĢāĻŋāĻāĻžāϰ⧠filecoinHyperspace-āĻ āĻĄāĻŋāĻĢāϞā§āĻ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āϏā§āĻ āĻāϰā§āĻāĻŋ, āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻĒāϤāĻžāĻāĻž āĻĒāĻžāϏ āĻāϰāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āύā§āĻ āϝāĻĻāĻŋāĻ āĻāĻāĻŋ āύā§āĻā§ āĻĻā§āĻāĻžāύ⧠āĻšāϝāĻŧā§āĻā§) > cd ./pages/hardhat/deploy/ npx hardhat run ./deployBacalhauFRC721.ts --network filecoinHyperspace āĻāĻĻāϝāĻžāĻĒāύ! āĻāĻŽāϰāĻž āĻāĻāĻŽāĻžāϤā§āϰ āĻĢāĻžāĻāϞāĻāϝāĻŧā§āύ āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻā§āϏā§āĻāύā§āĻā§ āĻāĻŽāĻžāĻĻā§āϰ NFT āĻā§āĻā§āϤāĻŋ āϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āĻāĻŋ! đŦ āĻĢā§āϰāύā§āĻ-āĻāύā§āĻĄ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻāĻļāύ āϤā§āϰāĻŋ āĻāϰāĻž āϏā§āύā§āĻĻāϰ āĻ āĻāĻļā§āϰ āĻāĻĒāϰ āĻāĻšā§... āĻāĻŦāĻ āϏā§āĻ āĻāĻ āĻžāĻ āϝāĻž āĻāĻāĻžāύ⧠āϏāĻŦ āĻāĻāϏāĻžāĻĨā§ āϧāϰ⧠āϰāĻžāĻā§ :) āϏāĻžāĻŽāύā§āϰ āĻĒā§āϰāĻžāύā§āϤāĻāĻŋ āϤā§āϰāĻŋ āĻāϰāϤā§, āĻāĻŽāĻŋ NextJS āĻāĻŦāĻ Typescript āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻāĻŋāĨ¤ āϝāĻĻāĻŋāĻ, āϏāϤā§āϝāĻŋ āĻāĻĨāĻž āĻŦāϞāϤ⧠- āĻāĻŽāĻŋ āύā§āĻā§āϏāĻāĻā§āĻāϏ-āĻāϰ SSR (āϏāĻžāϰā§āĻāĻžāϰ-āϏāĻžāĻāĻĄ āϰā§āύā§āĻĄāĻžāϰāĻŋāĻ) āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞāĻŋāϰ āĻā§āύāĻ āϏā§āĻŦāĻŋāϧāĻž āύāĻŋāĻā§āĻāĻŋ āύāĻž āĻāĻŦāĻ āĻāĻŽāĻŋ āϤāĻžāĻĻā§āϰ āĻĒā§āώā§āĻ āĻž āϰāĻžāĻāĻāĻŋāĻāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŋ āύāĻž (āϝā§āĻšā§āϤ⧠āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻāĻāĻ-āĻĒā§āώā§āĻ āĻžāϰ Dapp), āϤāĻžāĻ āĻāĻĒāύāĻŋ āϏāϤā§āϝāĻŋāĻ āϝā§āϤ⧠āĻĒāĻžāϰā§āύ āĻā§āϝāĻžāύāĻŋāϞāĻž āϰāĻŋāĻ ā§āϝāĻžāĻā§āĻ āϏā§āĻ āĻāĻĒ āϏāĻš (āĻŦāĻž āĻ āĻŦāĻļā§āϝāĻ āĻāĻĒāύāĻžāϰ āĻĒāĻāύā§āĻĻā§āϰ āϝā§āĻā§āύ āĻĢā§āϰā§āĻŽāĻāϝāĻŧāĻžāϰā§āĻ!) āĻāĻžāĻāĻĒāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§āϰ āĻāύā§āϝ ... āĻāĻžāϞ, āĻāĻŽāĻŋ āĻāĻāĻŋāĻā§ āĻāĻŋāĻā§āĻāĻž āϤāĻžāĻĄāĻŧāĻžāĻšā§āĻĄāĻŧā§ āĻāϰ⧠āϤā§āϰāĻŋ āĻāϰā§āĻāĻŋ āĻāĻŦāĻ āϏā§āĻŦā§āĻāĻžāϰ āĻāϰāϤ⧠āĻšāĻŦā§ āĻāĻāĻŋ āĻāĻžāĻāĻĒāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§āϰ āĻā§āĻŦ āĻāĻžāϞ āĻāĻĻāĻžāĻšāϰāĻŖ āύāϝāĻŧ - āϝāĻĻāĻŋāĻ āĻāĻžāϰāĻā§āϞāĻŋ āĻā§āĻļāĻŋ āĻŦāϞ⧠āĻŽāύ⧠āĻšāĻā§āĻā§... ;) Anyhoo - āĻāĻ āĻŦāĻŋāĻāĻžāĻā§āϰ āĻŽā§āϞ āĻĒāϝāĻŧā§āύā§āĻāĻāĻŋ āĻāĻĒāύāĻžāĻā§ āĻĻā§āĻāĻžāύā§āϰ āĻāύā§āϝ āύāϝāĻŧ āϝ⧠āĻā§āĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻĢā§āϰāύā§āĻ āĻāύā§āĻĄ āĻā§āĻĄ āĻāϰāϤ⧠āĻšāϝāĻŧ, āϤāĻŦā§ āĻāĻĒāύāĻžāĻā§ āĻĻā§āĻāĻžāύā§āϰ āĻāύā§āϝ āĻāĻŋāĻāĻžāĻŦā§ āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋāϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻā§āĻ āĻāϰāϤ⧠āĻšāϝāĻŧ, Bacalhau (āĻāĻŽāĻžāĻĻā§āϰ āϏā§āĻĨāĻŋāϤāĻŋāĻļā§āϞ āĻĄāĻŋāĻĢāĻŋāĻāĻļāύ āĻāĻŽāĻāϞ āĻŽāĻĄā§āϞ āϏāĻš) āĻāĻŦāĻ āĻ āĻŦāĻļā§āϝāĻ, NFT.Storage - # NotOnIPFSNotYourNFT. āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻĒā§āϰāĻŦāĻžāĻš [āĻāϰā§āύ: āĻāĻāĻāĻŋ āĻĢā§āϞ⧠āĻāĻžāϰā§āĻ āĻĄāĻžāϝāĻŧāĻžāĻā§āϰāĻžāĻŽ āϤā§āϰāĻŋ āĻāϰā§āύ] āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻāύāĻĒā§āĻ āĻā§āώā§āϤā§āϰ⧠āĻāĻāĻāĻŋ āĻā§āĻā§āϏāĻ āĻĒā§āϰāĻŽā§āĻĒāĻ āĻĒā§āϰāĻŦā§āĻļ āĻāϰāĻžāύ -> āĻāĻŦāĻŋ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻŦā§āϤāĻžāĻŽā§ āĻā§āϞāĻŋāĻ āĻāϰā§āύ -> āĻāĻŦāĻŋ āϤā§āϰāĻŋ āĻāϰāϤ⧠Bacalhau āĻāĻŦāĻā§ āĻāϞ āĻāϰā§āύ Bacalhau āĻāĻžāĻ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻšāϝāĻŧ -> āĻĢāϰāĻŽā§āϝāĻžāĻ NFT āĻŽā§āĻāĻžāĻĄā§āĻāĻž JSON āĻ āĻŦāĻā§āĻā§āĻā§ āĻĢāĻŋāϰ⧠āĻāϏ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻā§āϞāĻŋāĻ āĻŽāĻŋāύā§āĻ NFT āĻŦā§āϤāĻžāĻŽ -> NFT. āϏā§āĻā§āϰā§āĻāĻā§ NFT āĻŽā§āĻāĻžāĻĄā§āĻāĻž āϏāĻāϰāĻā§āώāĻŖ āĻāϰāϤ⧠āĻŦāϞāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āĻĢā§āϞā§āĻĄāĻžāϰā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ IPFS CID āϏāĻš āĻĢā§āϰāϤ āĻāϏ⧠-> āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋāϰ āĻŽāĻŋāύā§āĻ NFT āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻāĻ IPFS_URI-āĻāϰ āϏāĻžāĻĨā§ āĻāĻ āĻŽā§āĻāĻžāĻĄā§āĻāĻž āĻĻāĻŋāϝāĻŧā§ āĻāĻāĻāĻŋ NFT āĻŽāĻŋāύā§āĻ āĻāϰāϤ⧠āĻāϞ āĻāϰāĻž āĻšāϝāĻŧ -> !! [āĻāĻĢāĻāĻāĻŋāĻāĻŽ āĻā§āĻāĻāĻž] -> āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻ āĻĢāϞāĻžāĻĢāϞā§āϰ TX (āϞā§āύāĻĻā§āύ āĻšā§āϝāĻžāĻļ) āĻĢāĻŋāϰ⧠āĻāϏāĻžāϰ āĻāύā§āϝ āĻ āĻĒā§āĻā§āώāĻž āĻāϰāĻŦ, āĻāĻŋāύā§āϤ⧠āĻāĻāĻŋ āĻŦāϰā§āϤāĻŽāĻžāύ⧠āĻāĻžāĻ āĻāϰāĻā§ āύāĻž, āϤāĻžāĻ āĻāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠āĻāĻŽāϰāĻž āĻāĻāύ āĻāĻāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻšāĻŦā§ āϤāĻž āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻā§āĻā§āϤāĻŋ āĻāĻā§āύā§āĻ āϞāĻŋāϏā§āύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻāĻŋāĨ¤ āϏāĻŽā§āĻĒāύā§āύ! -> āĻāĻāύ āϝā§āĻā§āύ āĻĄāĻŋāϏāĻĒā§āϞ⧠āĻĄā§āĻāĻž āĻĒā§āύāϰāĻžāϝāĻŧ āĻāύāϤ⧠āĻĒāĻžāϰ⧠āĻāĻŦāĻ āĻŽāĻŋāύā§āĻāĻŋāĻāϝāĻŧā§āϰ āĻāĻĒāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āϏā§āĻĨāĻŋāϤāĻŋ āϏāĻžāĻĢāϞā§āϝā§āϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻŽā§āĻāĻžāϰ - āĻāϏā§āύ āĻĻā§āĻāĻŋ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻŽāϰāĻž āĻā§āĻĄā§ āĻāĻāĻŋ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻāϰāĻŋ! Bacalhau āĻŽāĻŋāĻĨāϏā§āĻā§āϰāĻŋāϝāĻŧāĻž Bacalhau-āĻāϰ āĻāύā§āϝ āĻĢā§āϰāύā§āĻ-āĻāύā§āĻĄ API āĻāύā§āĻĄāĻĒāϝāĻŧā§āύā§āĻ āϤā§āϰāĻŋ āĻāϰāĻž āĻĒā§āϰāĻā§āĻļāϞ⧠āύāĻĨāĻŋāĻā§āĻā§āϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤ āϞā§āĻ āĻŽāĻžāϰā§āϏāĻĄā§āύā§āϰ āĻāĻ āĻĒā§āϰāĻāϞā§āĻĒ āĻĒā§āϰāϤāĻŋāĻŦā§āĻĻāύ⧠API āĻŦāϰā§āϤāĻŽāĻžāύ⧠āĻāĻ āĻŦā§āϞāĻā§ āύāĻĨāĻŋāĻā§āĻā§āϤ āϏā§āĻĨāĻŋāϤāĻŋāĻļā§āϞ āĻŦāĻŋāĻā§āĻā§āϰāĻŖ āϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻā§āϞāĻŋāϤ⧠āϏāϰāĻžāϏāϰāĻŋ āĻāĻāĻžāϤ āĻāϰā§, āϤāĻŦā§, āĻĻāϞāĻāĻŋ āĻāĻāĻŋāĻā§ āĻāϰāĻ āϏāĻžāϧāĻžāϰāĻŖ API-āĻ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰāĻžāϰ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāϧā§āύ āϰāϝāĻŧā§āĻā§ āϝāĻžāϤ⧠āĻāĻĒāύāĻŋ āϝā§āĻā§āύāĻ āĻāĻĻāĻžāĻšāϰāĻŖ āĻāϞ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āĻāĻŦāĻ āĻāĻāĻāĻŋ HTTP āĻĨā§āĻā§ āĻāĻĒāύāĻžāϰ āύāĻŋāĻā§āϰ āύāĻŋāϝāĻŧā§āĻāĻŋāϤ āϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻā§āϞāĻŋāĻ REST APIāĨ¤ āĻŦāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻžāύ⧠FilecoinProject āϏā§āϞā§āϝāĻžāĻā§āϰ #bacalhau āĻā§āϝāĻžāύā§āϞ⧠āĻāĻāĻŋāϰ āĻāĻĒāϰ āύāĻāϰ āϰāĻžāĻā§āύāĨ¤ >run/test in terminal curl -XPOST -d '{"prompt": "rainbow unicorn"}' 'http://dashboard.bacalhau.org:1000/api/v1/stablediffusion'; >react / typescript code import { CID } from 'multiformats/cid'; export const callBacalhauJob = async (promptInput: string) => { //Bacalahau HTTP Stable Diffusion Endpoint const url = 'http://dashboard.bacalhau.org:1000/api/v1/stablediffusion'; const headers = { 'Content-Type': 'application/x-www-form-urlencoded', }; const data = { prompt: promptInput, //The user text prompt! }; /* FETCH FROM BACALHAU ENDPOINT */ const cid = await fetch(url, { method: 'POST', body: JSON.stringify(data), headers: headers, }) .then(async (res) => { let body = await res.json(); if (body.cid) { /* Bacalhau returns a V0 CID which we want to convert to a V1 CID for easier usage with http gateways (ie. displaying the image on web), so I'm using the IPFS multiformats package to convert it here */ return CID.parse(body.cid).toV1().toString(); } }) .catch((err) => { console.log('error in bac job', err); }); return cid; }; āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻāĻāĻāĻŋ āĻāĻāĻĒāĻŋāĻāĻĢāĻāϏ āϏāĻŋāĻāĻāĻĄāĻŋ (āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻļāύāĻžāĻā§āϤāĻāĻžāϰā§) āĻĒā§āϰāĻĻāĻžāύ āĻāϰāĻŦā§ āϝāĻž āύā§āĻā§āϰ āĻŽāϤ āĻāĻāĻāĻŋ āĻĢā§āϞā§āĻĄāĻžāϰ āĻāĻžāĻ āĻžāĻŽā§ āϏāĻšāĨ¤ āϤāĻžāϰāĻĒāϰ⧠āĻāĻŦāĻŋāĻāĻŋ āĻāϰ āĻ āϧā§āύ⧠āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāĻŦā§āĨ¤ /outputs/image0.png đĄ đĄ ! āĻāĻāĻžāύ⧠āĻā§āϞāĻŋāĻ āĻāϰ⧠āύāĻŋāĻā§āϰ āĻāύā§āϝ āĻāĻāĻŋ āĻĻā§āĻā§āύ āĻāĻšāĻš āϰā§āĻāύāĻŦā§ āĻāĻāύāĻŋāĻāϰā§āύ... āĻāĻŋ āĻāĻžāϞ⧠āϞāĻžāĻā§ āύāĻž! NFT. āϏā§āĻā§āϰā§āĻ NFT.Storage āĻšāϞ āĻāĻāĻāĻŋ āĻĒāĻžāĻŦāϞāĻŋāĻ āĻā§āĻĄ (āĻāϰāĻĢā§ āĻĢā§āϰāĻŋ) āϝāĻž āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻŦāĻž HTTP SDK āϏāĻš IPFS āĻāĻŦāĻ Filecoin-āĻ āϏā§āĻĨāĻžāϝāĻŧā§āĻāĻžāĻŦā§ NFT āĻŽā§āĻāĻžāĻĄā§āĻāĻž āϏāĻāϰāĻā§āώāĻŖ āĻāϰāĻž āϏāĻšāĻ āĻāϰā§āĨ¤ NFT āĻŽā§āĻāĻžāĻĄā§āĻāĻž āĻšāϞ āĻāĻāĻāĻŋ JSON āύāĻĨāĻŋ āϝāĻž āύā§āĻā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖā§āϰ āĻŽāϤ⧠āĻĻā§āĻāϤ⧠- āϝāĻž āϏāϰāĻžāϏāϰāĻŋ āĻāĻĒā§āύ āĻā§āĻĒā§āϞāĻŋāύ āĻĄāĻā§āϏ āĻĨā§āĻā§ āύā§āĻāϝāĻŧāĻž āĻšāϝāĻŧā§āĻā§: āĻāύāĻāĻĢāĻāĻŋ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāĻāĻž āĻŽāύ⧠āϰāĻžāĻāĻž āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āϝ⧠āĻāĻĒāύāĻŋ āĻŽā§āĻāĻžāĻĄā§āĻāĻž āĻ āύ-āĻā§āĻāύ⧠(āϝāĻž āĻŦāĻĄāĻŧ āĻĢāĻžāĻāϞā§āϰ āĻāύā§āϝ āύāĻŋāώā§āϧāĻŽā§āϞāĻāĻāĻžāĻŦā§ āĻŦā§āϝāϝāĻŧāĻŦāĻšā§āϞ āĻšāϝāĻŧā§ āĻāĻ āϤ⧠āĻĒāĻžāϰā§) āϏāĻāϰāĻā§āώāĻŖ āĻāϰāĻā§āύ āύāĻž, āϤāĻžāĻšāϞ⧠āĻāĻāĻāĻŋ āĻā§āĻā§āύā§āϰ 'āύāύ-āĻĢāĻžāĻā§āĻāĻŋāĻŦāĻŋāϞāĻŋāĻāĻŋ'-āĻāϰ āϏāĻžāĻĨā§ āϏāĻžāĻŽāĻā§āĻāϏā§āϝ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻĒāύāĻžāϰ āϏā§āĻā§āϰā§āĻ āĻĒā§āϰāϝāĻŧā§āĻāύ āϝāĻž āĻ āĻŦāĻŋāĻāϞ, āύāĻŋāϰā§āĻāϰāϝā§āĻā§āϝ āĻāĻŦāĻ āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύā§āϝāĻŧāĨ¤ āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ NFT-āĻ āĻāĻĒāϰā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖā§āϰ āĻŽāϤ⧠āĻāĻāĻāĻŋ āĻ āĻŦāϏā§āĻĨāĻžāύ-āĻāĻŋāϤā§āϤāĻŋāĻ āĻ āĻŋāĻāĻžāύāĻž āĻĨāĻžāĻā§, āϤāĻžāĻšāϞ⧠āĻŦāĻŋāĻā§āϰāϝāĻŧā§āϰ āĻĒāϰ⧠āĻāĻ āĻ āĻŦāϏā§āĻĨāĻžāύā§āϰ āĻĒāĻĨāĻāĻŋ āϏā§āϝā§āĻāĻ āĻāĻāĻ āĻāϰāĻž āĻŽā§āĻāĻžāĻŽā§āĻāĻŋ āϏāĻšāĻ, āĻŽāĻžāύ⧠āĻāĻĒāύāĻŋ āϝ⧠āĻāύāĻāĻĢāĻāĻŋ āĻāĻŋāύā§āĻā§āύ āϤāĻž āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻāĻŋāύā§āύ āĻāĻŋāĻā§ āĻšāϝāĻŧā§ āĻā§āĻā§ - āĻŦāĻž āĻā§āώā§āϤā§āϰ⧠āĻāĻāĻāĻŋ āĻāĻā§āώāϰāĻŋāĻ āϰāĻžāĻ āĻāĻžāύ āύā§āĻā§ āϝā§āĻāĻžāύ⧠āĻāύāĻāĻĢāĻāĻŋ āϏā§āϰāώā§āĻāĻž āϰāĻžāĻāĻā§āϞāĻŋāϰ āĻāĻŦāĻŋāϰ āĻāύā§āϝ āĻļāĻŋāϞā§āĻĒ āĻāĻŋāϤā§āϰāĻā§āϞāĻŋāĻā§ āϏā§āĻāĻ āĻāĻāĻ āĻāϰā§āĻā§āύ⧎ āĻāĻŋāĻā§ āĻāĻŽāύāĻāĻŋ āĻā§āϞāĻž Zeppelin āϏāĻŽā§āĻĒāϰā§āĻā§ āϏāϤāϰā§āĻ! NFT.Storage āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻ āϰā§āĻĨ āĻšāϞ āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻŽā§āĻāĻžāĻĄā§āĻāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύā§āϝāĻŧ IPFS āĻĢāĻžāĻāϞ CID ( - āĻ āĻŦāϏā§āĻĨāĻžāύ āύāϝāĻŧ - āĻāύāĻāĻŋāĻĢāĻžāϝāĻŧāĻžāϰ) āĻĒāĻžāĻ āϝāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ IPFS-āĻ āĻĒāĻŋāύ āĻāϰāĻž āĻšāϝāĻŧ āύāĻž āĻāĻŋāύā§āϤ⧠āϤāĻžāϰāĻĒāϰ⧠āĻ āϧā§āϝāĻŦāϏāĻžāϝāĻŧā§āϰ āĻāύā§āϝ Filecoin-āĻ āϏāĻāϰāĻā§āώāĻŖ āĻāϰāĻž āĻšāϝāĻŧ⧎ āĻāĻĒāύāĻžāĻā§ āĻā§āĻŦāϞ āϏāĻžāĻāύ āĻāĻĒ āĻāϰāϤ⧠āĻšāĻŦā§ NFT.Storage āĻāĻŦāĻ āĻāĻāĻŋāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ (āĻāĻĒāύāĻžāϰ .env āĻĢāĻžāĻāϞ⧠āϏāĻāϰāĻā§āώāĻŖ āĻāϰāϤā§) āĻĒāĻžāύāĨ¤ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻāĻāĻĄāĻŋ API āĻā§ .env example NEXT_PUBLIC_NFT_STORAGE_API_KEY=xxx āĻāĻŽāĻžāĻĻā§āϰ āĻāĻāĻžāĻ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻšāĻŦā§ āϝ⧠āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āĻāĻ āĻŋāϤ āĻŽā§āĻāĻžāĻĄā§āĻāĻž JSON āϤā§āϰāĻŋ āĻāϰā§āĻāĻŋ - āĻāĻžāϰāĻŖ FVM-āĻāϰ (āĻāĻāύāĻ!) NFT āĻŽāĻžāϰā§āĻā§āĻāĻĒā§āϞā§āϏ āύā§āĻ... āĻāĻŽāϰāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻāĻžāĻ āϝ⧠āϝāĻāύ āĻāĻāĻŋ āĻā§āĻšā§āϤ āĻšāϝāĻŧ āϤāĻāύāĻ āĻāĻŽāĻžāĻĻā§āϰ NFT āĻāĻļāĻž āĻāϰāĻŋ āĻŽāĻžāύ āĻŽā§āύ⧠āĻāϞ⧠. import { NFTStorage } from 'nft.storage'; //connect to NFT.Storage Client const NFTStorageClient = new NFTStorage({ token: process.env.NEXT_PUBLIC_NFT_STORAGE_API_KEY, }); const createNFTMetadata = async ( promptInput: string, imageIPFSOrigin: string, //the ipfs path eg. ipfs://[CID] imageHTTPURL: string //an ipfs address fetchable through http for the front end to use (ie. including an ipfs http gateway on it like https://[CID].ipfs.nftstorage.link) ) => { console.log('Creating NFT Metadata...'); let nftJSON; // let's get the image data Blob from the IPFS CID that was returned from Bacalhau earlier... await getImageBlob(status, setStatus, imageHTTPURL).then( async (imageData) => { // Now let's create a unique CID for that image data - since we don't really want the rest of the data returned from the Bacalhau job.. await NFTStorageClient.storeBlob(imageData) .then((imageIPFS) => { console.log(imageIPFS); //Here's the JSON construction - only name, description and image are required fields- but I also want to save some other properties like the ipfs link and perhaps you have other properties that give your NFT's rarity to add as well nftJSON = { name: 'Bacalhau Hyperspace NFTs 2023', description: promptInput, image: imageIPFSOrigin, properties: { prompt: promptInput, type: 'stable-diffusion-image', origins: { ipfs: `ipfs://${imageIPFS}`, bacalhauipfs: imageIPFSOrigin, }, innovation: 100, content: { 'text/markdown': promptInput, }, }, }; }) .catch((err) => console.log('error creating blob cid', err)); } ); return nftJSON; }; āĻāĻāύ āĻāĻ āĻŽā§āĻāĻžāĻĄā§āĻāĻž NFT.Storage āĻ āϏāĻāϰāĻā§āώāĻŖ āĻāϰāĻž āϝāĻžāĻ! await NFTStorageClient.store(nftJson) .then((metadata) => { // DONE! - do something with this returned metadata! console.log('NFT Data pinned to IPFS & stored on Filecoin!'); console.log('Metadata URI: ', metadata.url); // once saved we can use it to mint the NFT // mintNFT(metadata); }) .catch((err) => { console.log('error uploading to nft.storage'); }); Woot - āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ Bacalhau āĻĨā§āĻā§ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻŽā§āĻ āĻāĻā§, āĻāĻŽāϰāĻž NFT.Strorage-āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻŽāĻžāĻĻā§āϰ āĻŽā§āĻāĻžāĻĄā§āĻāĻž āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύā§āϝāĻŧ āĻāĻŦāĻ āĻ āĻŦāĻŋāϰāĻžāĻŽāĻāĻžāĻŦā§ āϏāĻāϰāĻā§āώāĻŖ āĻāϰā§āĻāĻŋ, āĻāĻāύ āĻāϏā§āύ āĻāĻŽāĻžāĻĻā§āϰ NFT āĻŽāĻŋāύā§āĻ āĻāϰāĻŋ! đĄ đĄNFT.Storage āĻāĻāĻžāĻĄāĻŧāĻžāĻ āϏā§āĻā§āϰ āĻāĻžāϰ āĻāĻŦāĻ āϏā§āĻā§āϰ āĻĄāĻžāĻāϰā§āĻā§āĻāϰāĻŋ āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻŽāϤ⧠āĻ āύā§āϝāĻžāύā§āϝ āĻāĻāĻāĻŋ āĻĒāϰāĻŋāϏāϰāĻ āĻ āĻĢāĻžāϰ āĻāϰ⧠- āϝāĻž āĻāĻāĻāĻŋ CID-āĻāϰ IPFS āĻĒāĻŋāύāĻŋāĻ āĻāĻŦāĻ āĻĢāĻžāĻāϞāĻāϝāĻŧā§āύ āϏā§āĻā§āϰā§āĻ āĻĄāĻŋāϞ āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠-> āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻĻā§āϰā§āĻĻāĻžāύā§āϤ āϏāĻāϝā§āĻāύ āĻšāϤ⧠āĻĒāĻžāϰ⧠NFT-āĻāϰ āϏā§āĻĨāĻŋāϤāĻŋ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ FEVM DApp (āĻŦāĻž FEVM āĻŽā§āĻāύāύā§āĻ āϰāĻŋāϞāĻŋāĻ āĻšāĻŋāĻ āĻšāϞ⧠FEVM-āĻ NFT āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ)āĨ¤ āĻĻā§āϰā§āϤ āĻāĻŋāĻĒ āϏā§āĻā§āϝāĻžāĻāĻžāϏ() āĻĢāĻžāĻāĻļāύā§āϰ API āĻāϞāĻā§āϞāĻŋāϰ āĻā§āĻā§āϤāĻŋ āĻŽāĻŋāĻĨāϏā§āĻā§āϰāĻŋāϝāĻŧāĻž āĻāĻāĻžāύ⧠3 āϧāϰāύā§āϰ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻāĻļāύ āϰāϝāĻŧā§āĻā§ (āĻāĻŦāĻ āĻāϝāĻŧā§āĻāĻāĻŋ FEVM āĻā§āĻāĻāĻž - āĻŦāĻŋāĻāĻž āĻĒā§āϰāϝā§āĻā§āϤāĻŋāϤ⧠āϏāĻŦāϏāĻŽāϝāĻŧ āĻāĻŋāĻā§ āĻ āĻĻā§āĻā§āϤ āĻŦāĻžāĻ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻĨāĻžāĻāĻŦā§!) āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāĻžāĻĄāĻŧāĻžāĻ āĻā§āĻāύ āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāĻžāϰ āĻāύā§āϝ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĒāĻ āύāϝā§āĻā§āϝ āĻāϞ āĻāĻŽāύ āĻāϞ āϞāĻŋāĻā§āύ āϝāĻžāϤ⧠āϏāĻžāĻāύ āĻāύ āĻāϰāϤ⧠āĻāĻŦāĻ āĻā§āϝāĻžāϏ āĻĒāϰāĻŋāĻļā§āϧ āĻāϰāϤ⧠āĻāĻāĻāĻŋ āĻāϝāĻŧāĻžāϞā§āĻ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāϝāĻŧāĨ¤ āϝ⧠āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋ āĻā§āĻāύā§āϰ āĻ āĻŦāϏā§āĻĨāĻž āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰā§, āϝā§āĻŽāύ NFT āĻŽāĻŋāύā§āĻ āĻāϰāĻž! āĻāĻā§āύā§āĻ āĻļā§āϰā§āϤāĻž - āϝāĻžāϰāĻž āĻā§āĻā§āϤāĻŋ āĻĨā§āĻā§ āύāĻŋāϰā§āĻāϤ āĻāĻā§āύā§āĻā§āϰ āĻāύā§āϝ āĻļā§āύ⧠āĻāĻ āϏāĻŽāϏā§āϤ āĻĢāĻžāĻāĻļāύā§āϰ āĻāύā§āϝ, āĻāĻŽāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦ - Ethereum API-āĻāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻšāĻžāϞāĻāĻž āĻŽā§āĻĄāĻŧāĻ, āĻāĻŽāĻžāĻĻā§āϰ āĻā§āĻā§āϤāĻŋāϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻ āĻāϰāϤ⧠āĻāĻŦāĻ āĻāϤ⧠āĻāϞ āĻāϰāϤā§āĨ¤ ethers.js āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻāĻāĻāĻŋ āĻĒāĻžāĻŦāϞāĻŋāĻ RPC āĻāϰ āϏāĻžāĻĨā§ āĻŽā§āĻĄā§ āĻā§āĻā§āϤāĻŋāϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻā§āϤ āĻšāĻā§āĻā§: āϰāĻŋāĻĄ //The compiled contract found in pages/api/hardhat/artifacts/contracts import BacalhauCompiledContract from '@Contracts/BacalhauFRC721.sol/BacalhauFRC721.json'; //On-chain address of the contract const contractAddressHyperspace = '0x773d8856dd7F78857490e5Eea65111D8d466A646'; //A public RPC Endpoint (see table from contract section) const rpc = 'https://api.hyperspace.node.glif.io/rpc/v1'; const provider = new ethers.providers.JsonRpcProvider(rpc); const connectedReadBacalhauContract = new ethers.Contract( contractAddressHyperspace, BacalhauCompiledContract.abi, provider ); āĻā§āĻā§āϤāĻŋāϤ⧠āĻāĻā§āύā§āĻā§āϰ āĻāύā§āϝ āĻļā§āύāĻž. āϝā§āĻšā§āϤ⧠āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĒāĻ āύāϝā§āĻā§āϝ (āĻĒāĻžāĻāϝāĻŧāĻž) āĻāĻā§āύā§āĻ, āϤāĻžāĻ āĻāĻŽāϰāĻž āĻ āύ-āĻā§āĻāύ āĻāĻā§āύā§āĻ āύāĻŋāϰā§āĻāĻŽāύā§āϰ āĻāύā§āϝ āĻļā§āύāϤ⧠āĻĒāĻžāĻŦāϞāĻŋāĻ RPC āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ //use the read-only connected Bacalhau Contract connectedReadBacalhauContract.on( // Listen for the specific event we made in our contract 'NewBacalhauFRC721NFTMinted', (sender: string, tokenId: number, tokenURI: string) => { //DO STUFF WHEN AN EVENT COMES IN // eg. re-fetch NFT's, store in state and change page status } ); āĻŽā§āĻĄā§ āĻā§āĻā§āϤāĻŋāϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻ āĻāϰāĻž - āĻāϰ āĻāύā§āϝ āĻĒā§āϰāϝāĻŧā§āĻāύ āϝ⧠Ethereum āĻŦāϏā§āϤā§āĻāĻŋ āĻāĻāĻāĻŋ āĻāϝāĻŧāĻžāϞā§āĻ āĻĻā§āĻŦāĻžāϰāĻž āĻāϝāĻŧā§āĻŦ āĻŦā§āϰāĻžāĻāĻāĻžāϰ⧠āĻāύāĻā§āĻāĻļāύ āĻāϰāĻž āĻšāĻā§āĻā§ āϝāĻžāϤ⧠āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻāĻāĻāĻŋ āϞā§āύāĻĻā§āύā§āϰ āĻāύā§āϝ āϏāĻžāĻāύ āĻāύ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻāĻŦāĻ āĻā§āϝāĻžāϏā§āϰ āĻāύā§āϝ āĻ āϰā§āĻĨ āĻĒā§āϰāĻĻāĻžāύ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠- āĻāĻ āĻāĻžāϰāĻŖā§āĻ āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ window.ethereum āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻāĻŋ āĻŦāϏā§āϤ⧠āϞā§āĻāĻžāϰ //Typescript needs to know window is an object with potentially and ethereum value. There might be a better way to do this? Open to tips! declare let window: any; //The compiled contract found in pages/api/hardhat/artifacts/contracts import BacalhauCompiledContract from '@Contracts/BacalhauFRC721.sol/BacalhauFRC721.json'; //On-chain address of the contract const contractAddressHyperspace = '0x773d8856dd7F78857490e5Eea65111D8d466A646'; //check for the ethereum object if (!window.ethereum) { //ask user to install a wallet or connect //abort this } // else there's a wallet provider else { // same function - different provider - this one has a signer - the user's connected wallet address const provider = new ethers.providers.Web3Provider(window.ethereum); const contract = new ethers.Contract( contractAddressHyperspace, BacalhauCompiledContract.abi, provider ); const signer = provider.getSigner(); const connectedWriteBacalhauContract = contract.connect(signer); } āϞāĻŋāĻā§āύ āϏāĻāϝā§āĻā§āϤ āĻā§āĻā§āϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŽāĻŋāύā§āĻ āĻĢāĻžāĻāĻļāύ āĻāϞ āĻāϰāĻž. āĻĒā§āϰāĻĨāĻŽāϤ, āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰā§āύ āϝ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāĻžāĻ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻāϝāĻŧāĻžāϞā§āĻ āĻ āĻŋāĻāĻžāύāĻž āĻāĻā§ āĻāĻŦāĻ āĻāĻŽāϰāĻž FVM āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻā§āĻāύ⧠āĻāĻāĻŋāĨ¤ āĻāĻāĻžāύ⧠āĻāϝāĻŧā§āĻāĻāĻŋ āϏāĻšāĻžāϝāĻŧāĻ āĻāϝāĻŧāĻžāϞā§āĻ āĻĢāĻžāĻāĻļāύ āϰāϝāĻŧā§āĻā§ āϝāĻž āĻāĻĒāύāĻŋ āĻāĻžāĻāϤ⧠āĻĒāĻžāϰā§āύ, āϝāĻžāϰ āĻŽāϧā§āϝ⧠āϰāϝāĻŧā§āĻā§ āĻā§āĻāĻžāĻŦā§ āĻā§āĻāύāĻāĻāĻĄāĻŋ āĻā§āĻ āĻāϰāĻŦā§āύ āĻāĻŦāĻ āĻā§āĻāĻžāĻŦā§ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϝāĻžāĻāĻŋāĻāĻāĻžāĻŦā§ āĻŽā§āĻāĻžāĻŽāĻžāϏā§āĻ/āĻāϝāĻŧāĻžāϞā§āĻā§ āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āϝā§āĻā§āϤ āĻāϰāĻŦā§āύāĨ¤ āĻāĻĒāύāĻŋ āϏāϰāĻžāϏāϰāĻŋ āĻāĻĨā§āϰāĻŋāϝāĻŧāĻžāĻŽ āĻ āĻŦāĻā§āĻā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦāĻž ethers.js āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāϝāĻŧāĻžāϞā§āĻā§āϰ āϏāĻžāĻĨā§ āϝā§āĻāĻžāϝā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ declare let window: any; const fetchWalletAccounts = async () => { console.log('Fetching wallet accounts...'); await window.ethereum //use ethers? .request({ method: 'eth_requestAccounts' }) .then((accounts: string[]) => { return accounts; }) .catch((error: any) => { if (error.code === 4001) { // EIP-1193 userRejectedRequest error console.log('Please connect to MetaMask.'); } else { console.error(error); } }); }; const fetchChainId = async () => { console.log('Fetching chainId...'); await window.ethereum .request({ method: 'eth_chainId' }) .then((chainId: string[]) => { return chainId; }) .catch((error: any) => { if (error.code === 4001) { // EIP-1193 userRejectedRequest error console.log('Please connect to MetaMask.'); } else { console.error(error); } }); }; //!! This function checks for a wallet connection WITHOUT being intrusive to to the user or opening their wallet export const checkForWalletConnection = async () => { if (window.ethereum) { console.log('Checking for Wallet Connection...'); await window.ethereum .request({ method: 'eth_accounts' }) .then(async (accounts: String[]) => { console.log('Connected to wallet...'); // Found a user wallet return true; }) .catch((err: Error) => { console.log('Error fetching wallet', err); return false; }); } else { //Handle no wallet connection return false; } }; //Subscribe to changes on a user's wallet export const setWalletListeners = () => { console.log('Setting up wallet event listeners...'); if (window.ethereum) { // subscribe to provider events compatible with EIP-1193 standard. window.ethereum.on('accountsChanged', (accounts: any) => { //logic to check if disconnected accounts[] is empty if (accounts.length < 1) { //handle the locked wallet case } if (userWallet.accounts[0] !== accounts[0]) { //user has changed address } }); // Subscribe to chainId change window.ethereum.on('chainChanged', () => { // handle changed chain case }); } else { //handle the no wallet case } }; export const changeWalletChain = async (newChainId: string) => { console.log('Changing wallet chain...'); const provider = window.ethereum; try { await provider.request({ method: 'wallet_switchEthereumChain', params: [{ chainId: newChainId }], //newChainId }); } catch (error: any) { alert(error.message); } }; //AddHyperspaceChain export const addHyperspaceNetwork = async () => { console.log('Adding the Hyperspace Network to Wallet...'); if (window.ethereum) { window.ethereum .request({ method: 'wallet_addEthereumChain', params: [ { chainId: '0xc45', rpcUrls: [ 'https://hyperspace.filfox.info/rpc/v0', 'https://filecoin-hyperspace.chainstacklabs.com/rpc/v0', ], chainName: 'Filecoin Hyperspace', nativeCurrency: { name: 'tFIL', symbol: 'tFIL', decimals: 18, }, blockExplorerUrls: [ 'https://fvm.starboard.ventures/contracts/', 'https://hyperspace.filscan.io/', 'https://beryx.zondax.chfor', ], }, ], }) .then((res: XMLHttpRequestResponseType) => { console.log('added hyperspace successfully', res); }) .catch((err: ErrorEvent) => { console.log('Error adding hyperspace network', err); }); } }; āϞāĻŋāĻāĻŋāϤ āĻŽā§āĻĄā§ āĻā§āĻā§āϤāĻŋ āĻŽāĻŋāύā§āĻ āĻĢāĻžāĻāĻļāύ āĻāϞ āĻāϰā§āύ.... // Pass in the metadata return from saving to NFT.Storage const mintNFT = async (metadata: any) => { await connectedWriteBacalhauContract // The name of our function in our smart contract .mintBacalhauNFT( userWallet.accounts[0], //users account to use metadata.url //test ipfs address ) .then(async (data: any) => { console.log('CALLED CONTRACT MINT FUNCTION', data); await data .wait() .then(async (tx: any) => { console.log('tx', tx); //CURRENTLY NOT RETURNING TX - (I use event triggering to know when this function is complete) let tokenId = tx.events[1].args.tokenId.toString(); console.log('tokenId args', tokenId); setStatus({ ...INITIAL_TRANSACTION_STATE, success: successMintingNFTmsg(data), }); }) .catch((err: any) => { console.log('ERROR', err); setStatus({ ...status, loading: '', error: errorMsg(err.message, 'Error minting NFT'), }); }); }) .catch((err: any) => { console.log('ERROR1', err); setStatus({ ...status, loading: '', error: errorMsg( err && err.message ? err.message : null, 'Error minting NFT' ), }); }); } āĻāĻ - āĻāύāĻāĻĢāĻāĻŋ āĻŽāĻŋāύā§āĻā§āĻĄ!! āĻāĻāύāĻŋāĻāϰā§āύ āĻĄāĻžāύā§āϏ āĻŽā§āĻĄ āϏāĻŽāϝāĻŧ! đ āĻā§āĻĄāĻŧāĻžāύā§āϤ āĻāĻŋāύā§āϤāĻžāĻāĻžāĻŦāύāĻž: āĻāĻāĻ āĻāĻŦāĻ āĻŦā§āϞāĻāĻā§āĻāύā§āϰ āϏāĻŽā§āĻāĻžāĻŦāύāĻž Bacalhau āĻĄā§āĻāĻžāϰ āĻāĻĒāϰ āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋāĻŽā§āϞāĻ, āύāĻŋāϰā§āϧāĻžāϰāĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖā§āϰ āĻāĻžāĻāĻā§āϞāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻāϰāϤ⧠āύāĻŋāĻā§āĻā§ āĻāĻžāϞāĻāĻžāĻŦā§ āϧāĻžāϰ āĻĻā§āϝāĻŧāĨ¤ ETL āĻĒā§āϰāϏā§āϏ āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻ āĻāĻŦāĻ āĻāĻāĻ āĻāĻāĻāĻāĻŋ āĻĄā§āĻāĻž āĻāύā§āĻāĻŋāĻā§āϰā§āĻļāύ āĻāύā§āϝ āϏāĻš āĻŦā§āϝāĻžāĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āĻāϰā§āĻĨāĻŋāĻ āĻāĻŦāĻ āĻŦāĻžāĻāĻžāϰ āϤāĻĨā§āϝ āĻāĻŋāĻĄāĻŋāĻ āĻāĻŦāĻ āĻāĻŋāϤā§āϰ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ - āϏā§āĻāύāĻļā§āϞāĻĻā§āϰ āĻāύā§āϝ āĻĻā§āϰā§āĻĻāĻžāύā§āϤ āĻāĻāĻžāϧāĻŋāĻ āĻāĻĻāĻžāĻšāϰāĻŖ āĻāĻā§ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻĒāϰā§āϰ āĻāĻŋāĻā§ āĻ āϰā§āĻāύ āĻāϰāĻž āϝāĻžāϝāĻŧāĨ¤ Bacalhau āĻĄāĻā§āϏ⧠āϝāĻāύ Bacalhau FEVM āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋāĻā§āϞāĻŋ āĻĨā§āĻā§ Bacalhau āĻā§ āϏāϰāĻžāϏāϰāĻŋ āĻāϞ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻāύā§āĻāĻŋāĻā§āϰā§āĻļāύ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻŦā§āϝāϏā§āϤ, āĻāĻāĻžāύ⧠Bacalhau x FVM āϏāĻšāϝā§āĻāĻŋāϤāĻžāϰ āĻŦāĻŋāώāϝāĻŧā§ āĻāĻŋāĻā§ āĻāĻŋāύā§āϤāĻžāĻāĻžāĻŦāύāĻž āϰāϝāĻŧā§āĻā§: āĻāĻŦāĻŋāώā§āϝāϤ⧠āĻĢāĻžāĻāϞāĻāϝāĻŧā§āύ āĻĄā§āĻāĻž āĻ āύāĻŦā§āϰā§āĻĄāĻŋāĻ āĻāĻŦāĻ āĻ āĻĢāĻŦā§āϰā§āĻĄāĻŋāĻāϝāĻŧā§ āϏāĻšāĻžāϝāĻŧāϤāĻž āĻāϰā§āύ āĻĄāĻŋāϞ āĻāĻŦāĻ āϏā§āĻā§āϰā§āĻ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āĻĻā§āϰ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻā§āĻāύ⧠āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāĻž āĻĄā§āĻāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ Filecoin-āĻāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻā§āϝāĻžāϤāĻŋ āĻāĻŦāĻ āĻĒāϰāĻŋāώā§āĻŦāĻžāϰ āĻā§āĻŖāĻŽāĻžāύ āϤā§āϰāĻŋ āĻāϰāϤ⧠āϏāĻšāĻžāϝāĻŧāϤāĻž āĻāϰā§āύāĨ¤ Bacalhau āĻŦāĻžāĻāĻžāϰ āĻāĻŦāĻ āĻĒā§āĻŽā§āύā§āĻ āĻĄā§āĻāĻžāϰ āĻāύā§āϝ āĻāĻŖāύāĻž āĻĒā§āϰāĻĻāĻžāύ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠Bacalhau DAO's & DataDAOs āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖā§ āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰāϤ⧠āĻĒāĻžāϰā§ā§ˇ Bacalhau āĻāĻŋāĻĄāĻŋāĻ āĻāĻŦāĻ āĻāĻŋāϤā§āϰ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖā§āϰ āĻŽāϤ⧠āϏā§āĻāύāĻļā§āϞ āĻĒā§āϰāĻā§āώā§āĻāĻžāϰ āĻāύā§āϝ āĻāϰāĻ āĻ āĻā§āĻŽā§āĻļāύāĻā§ āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āĻāϰāϤ⧠āϏāĻšāĻžāϝāĻŧāϤāĻž āĻāϰāϤ⧠āĻĒāĻžāϰ⧠Bacalhau VR āĻāĻŦāĻ AR āϏāĻš āĻā§āĻŽ āĻāĻŦāĻ āĻŽā§āĻāĻžāĻāĻžāϰā§āϏ āĻĄā§āĻāĻž āĻĒā§āϰāϏā§āϏāĻŋāĻ āϏāĻā§āώāĻŽ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ Bacalhau, IOT āĻāĻŦāĻ āϏāĻŋāĻŽā§āϞā§āĻļāύ āϏāĻŽā§āĻāĻŦ āĻāĻāĻ āĻāĻŦāĻ āĻāĻŽāĻāϞ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ đ āĻŦāĻžāĻāĻžāϞāĻšāĻžāĻ āϰā§āĻĄāĻŽā§āϝāĻžāĻĒ āĻāĻŽāϰāĻž āĻŦāϰā§āϤāĻŽāĻžāύ⧠āĻāĻĒāύāĻžāϰ āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋ āĻĨā§āĻā§ āϏāϰāĻžāϏāϰāĻŋ Bacalhau āĻāĻžāϞāĻžāύā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻāĻĒāĻžāϝāĻŧ āϤā§āϰāĻŋ āĻāϰāĻāĻŋ!!!! āĻāĻ āĻĒā§āϰāĻāϞā§āĻĒāĻāĻŋāĻā§ āĻŦāϞāĻž āĻšāϝāĻŧ āĻĒā§āϰāĻā§āĻā§āĻ āĻĢā§āϰāĻ/āĻĒā§āϰāĻā§āĻā§āĻ āϞāĻŋāϞāĻŋāĻĒā§āϝāĻžāĻĄ - āĻāĻŦāĻ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻāύā§āĻāĻŋāĻā§āϰā§āĻļāύ āϞā§āϝāĻŧāĻžāϰ āĻšāĻŦā§ āϝāĻž FEVM āϏā§āĻŽāĻžāϰā§āĻ āĻāύā§āĻā§āϰāĻžāĻā§āĻ āĻĨā§āĻā§ Bacalhau āĻāĻŦ āĻāϞ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻāϰāĻŦā§āĨ¤ āĻāĻŽāĻžāĻĻā§āϰ āύāĻŋāĻāĻāϞā§āĻāĻžāϰā§āϰ āĻāύā§āϝ āϏāĻžāĻāύ āĻāĻĒ āĻāϰ⧠āĻŦāĻž āύā§āĻā§āϰ āϏāĻžāĻŽāĻžāĻāĻŋāĻāĻā§āϞāĻŋāϤ⧠āϝā§āĻāĻĻāĻžāύ āĻāϰ⧠āĻāϰ āĻ āĻā§āϰāĻāϤāĻŋāϰ āĻāĻĒāϰ āύāĻāϰ āϰāĻžāĻā§āύāĨ¤ âī¸ āϝā§āĻāĻžāϝā§āĻ āϰāĻžāĻā§āύ! āĻ āĻāĻŋāύāύā§āĻĻāύ āϝāĻĻāĻŋ āĻāĻĒāύāĻŋ āĻĒā§āϰ⧠āĻĒāĻĨ āĻĒāĻĄāĻŧā§āύ!!! āĻāĻŽāĻŋ āĻāĻāĻāĻŋ āϞāĻžāĻāĻ, āĻŽāύā§āϤāĻŦā§āϝ, āĻ āύā§āϏāϰāĻŖ āĻŦāĻž āĻļā§āϝāĻŧāĻžāϰ āĻā§āϤāĻā§āĻ āϝāĻĻāĻŋ āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻāύā§āϝ āĻĻāϰāĻāĻžāϰ⧠āĻāĻŋāϞ! <3 Bacalhau āϏāĻžāĻĨā§ āϝā§āĻāĻžāϝā§āĻ āϰāĻžāĻā§āύ! āĻā§āĻāĻāĻžāϰ @BacalhauProject YouTube @BacalhauProject āĻĢāĻžāĻāϞāĻāϝāĻŧā§āύ āĻĒā§āϰāĻā§āĻā§āĻ āϏā§āϞā§āϝāĻžāĻ #bacalhau @filecoinproject Github@bacalhau.org āĻĢā§āϰāĻžāĻŽ github.com/filecoin-project/bacalhau/discussions âĨī¸ āϏāĻžāĻĨā§ āĻĄā§āĻā§āϞāĻĒāĻžāϰāĻ ā§āϝāĻžāϞāĻŋāϰ āĻāĻĒāύāĻŋ āĻāĻ āύāĻŋāĻŦāύā§āϧāĻāĻŋ āĻŽā§āϞā§āϝāĻŦāĻžāύ āĻā§āĻāĻā§ āĻĒā§āϝāĻŧā§āĻā§āύ? āĻāĻāĻāύ āϏā§āĻĒāύāϏāϰ āĻšāϝāĻŧā§ āϏāĻŽāϰā§āĻĨāύ āĻāϰā§āύāĨ¤ āĻā§āύ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻĒā§āϰāĻļāĻāϏāĻž āĻāϰāĻž āĻšāϝāĻŧ! āĻ ā§āϝāĻžāϞāĻŋāϏāύ āĻšā§āϝāĻŧāĻžāϰāĻā§ āĻšā§āϝāĻžāĻļāύā§āĻĄ āϏā§āĻĒāύāϏāϰ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻāĻžāύā§āύ āĻāĻāĻžāĻĄāĻŧāĻžāĻ āĻĒā§āϰāĻāĻžāĻļāĻŋāϤ. āĻāĻāĻžāύā§