āĻāĻĢāĻāĻŋāĻāĻŽ āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻā§āϏā§āĻāύā§āĻā§ āĻāĻāĻ-āĻā§āύāĻžāϰā§āĻā§āĻĄ āĻāϰā§āĻ āĻāύāĻāĻĢāĻāĻŋ āĻŽāĻŋāύā§āĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻĒāύāĻžāϰ āύāĻŋāĻāϏā§āĻŦ āĻā§āĻā§āϏāĻ-āĻā§ āĻāĻŽā§āĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϏāĻš āĻāĻāĻāĻŋ DApp āϤā§āϰāĻŋ, āĻāĻžāϞāĻžāύ⧠āĻāĻŦāĻ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āύāĻŋāϰā§āĻĻā§āĻļāĻŋāĻāĻž!
āϏā§āĻāĻŋāĻĒāϤā§āϰ
- đŠâđģ āĻāĻŽāϰāĻž āĻāĻŋ āĻāϰāĻŦā§...
- đ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰ āĻĄāĻžāϝāĻŧāĻžāĻā§āϰāĻžāĻŽ (āĻāĻāϰāĻāĻŽ)
- đĨ DApp āĻĒā§āϰāϝā§āĻā§āϤāĻŋ āϏā§āĻā§āϝāĻžāĻ
- đī¸ āĻĒāĻžāĻāĻĨāύ āĻā§āĻā§āϏāĻ-āĻā§-āĻāĻŽā§āĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϤā§āϰāĻŋ āĻāϰāĻž
- âī¸ āϏāϞāĻŋāĻĄāĻŋāĻāĻŋ āĻāύāĻāĻĢāĻāĻŋ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϤā§āϰāĻŋ āĻāĻŦāĻ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻž
- đŦ āĻĢā§āϰāύā§āĻ-āĻāύā§āĻĄ āĻāύā§āĻāĻžāϰāĻ
ā§āϝāĻžāĻāĻļāύ āϤā§āϰāĻŋ āĻāϰāĻž
- āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻĒā§āϰāĻŦāĻžāĻš
- Bacalhau āĻŽāĻŋāĻĨāϏā§āĻā§āϰāĻŋāϝāĻŧāĻž
- NFT. āϏā§āĻā§āϰā§āĻ
- āĻā§āĻā§āϤāĻŋ āĻŽāĻŋāĻĨāϏā§āĻā§āϰāĻŋāϝāĻŧāĻž
- đ āĻā§āĻĄāĻŧāĻžāύā§āϤ āĻāĻŋāύā§āϤāĻžāĻāĻžāĻŦāύāĻž: āĻāĻāĻ āĻāĻŦāĻ āĻŦā§āϞāĻāĻā§āĻāύā§āϰ āϏāĻŽā§āĻāĻžāĻŦāύāĻž
- đ āĻŦāĻžāĻāĻžāϞāĻšāĻžāĻ āϰā§āĻĄāĻŽā§āϝāĻžāĻĒ
- âī¸ āϝā§āĻāĻžāϝā§āĻ āϰāĻžāĻā§āύ!
đĻ āĻĻā§āϰā§āϤ āϞāĻŋāĻā§āĻ:
đŠâđģ āĻāĻŽāϰāĻž āĻāĻŋ āĻāϰāĻŦā§...
āĻāĻ āĻŦā§āϞāĻāĻāĻŋ āĻāĻĒāύāĻžāĻā§ āĻā§āĻāĻžāĻŦā§ āϤāĻž āύāĻŋāϝāĻŧā§ āϝā§āϤ⧠āĻšāĻŦā§
Tensorflow āĻāϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āĻāĻāĻāĻŋ āĻāĻĒā§āύāϏā§āϰā§āϏ āĻĒāĻžāĻāĻĨāύ-āĻāĻŋāϤā§āϤāĻŋāĻ āĻā§āĻā§āϏāĻ-āĻā§-āĻāĻŽā§āĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϤā§āϰāĻŋ āĻāϰā§āύ (āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻāĻā§āϰāĻšā§āϰ āύāĻž āĻšāϞ⧠āĻāĻĒāύāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ Bacalhau HTTP āĻāύā§āĻĄāĻĒāϝāĻŧā§āύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ)
Bacalhau-āĻ āĻāĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻāĻŋ āĻāĻžāϞāĻžāύ (āĻāĻāĻāĻŋ āĻā§āϞāĻž p2p āĻ āĻĢ-āĻā§āĻāύ āĻāĻŽā§āĻĒāĻŋāĻāĻ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ)
āϏāϞāĻŋāĻĄāĻŋāĻāĻŋāϤ⧠āĻāĻāĻāĻŋ NFT āĻā§āĻā§āϤāĻŋ āϤā§āϰāĻŋ āĻāϰā§āύ (āĻāĻāĻāĻŋ āĻāĻĒā§āύ āĻā§āĻĒā§āϞāĻŋāύ ERC721 āĻā§āĻā§āϤāĻŋāϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰā§)
Filecoin āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ āĻŽā§āĻļāĻŋāύ (FVM) āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻā§āϏā§āĻāύā§āĻā§ āĻšāĻžāϰā§āĻĄāĻšāĻžāĻā§āϰ āϏāĻžāĻĨā§ NFT āĻā§āĻā§āϤāĻŋ āϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āύ
āĻĢā§āϰāύā§āĻ-āĻāύā§āĻĄ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻāĻļāύ - āĻŦāĻžāĻāĻžāϞāĻšāĻžāĻ āĻā§āĻā§āϏāĻ-āĻā§-āĻāĻŽā§āĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻžāϤ⧠āĻāĻĒāύāĻžāϰ NFT āĻā§āĻā§āϤāĻŋāϰ āϏāĻžāĻĨā§ āĻā§āĻāĻžāĻŦā§ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻā§āĻ āĻāϰāĻŦā§āύ
āĻāĻŋāĻāĻžāĻŦā§ āĻāĻĒāύāĻžāϰ NFT āĻŽā§āĻāĻžāĻĄā§āĻāĻž NFT.Storage āĻ āϏāĻāϰāĻā§āώāĻŖ āĻāϰāĻŦā§āύ
āĻā§āĻāĻžāĻŦā§ āĻāĻĒāύāĻžāϰ āĻĢā§āϰāύā§āĻ-āĻāύā§āĻĄ āĻĄāĻŋāĻāĻĒāĻā§ āĻĢā§āϞāĻŋāĻā§ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻŦā§āύ
āĻāĻŽāĻŋ āĻāĻā§āĻāĻžāĻā§āϤāĻāĻžāĻŦā§ āĻāĻ āϏā§āĻā§āϝāĻžāĻā§ āĻāĻĒāϞāĻŦā§āϧ āϝāϤāĻāĻž āĻāĻĒā§āύ āϏā§āϰā§āϏ āĻāĻŦāĻ āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻā§āϤ āĻĒā§āϰāϝā§āĻā§āϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻŦā§āĻā§ āύāĻŋāϝāĻŧā§āĻāĻŋāĨ¤
āĻāĻ āĻŦā§āϞāĻāĻāĻŋ āĻŦā§āĻļ āĻĻā§āϰā§āĻ āĻšāϤ⧠āĻāϞā§āĻā§ (āĻāϰ⧠- āĻāĻŽāĻŋ āϏāĻŽāϏā§āϤ āϤāĻĨā§āϝ āĻĻāĻŋāϤ⧠āĻāĻžāĻ āĻāĻŦāĻ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻāĻžāĻ āϝ⧠āĻāĻŽāϰāĻž āĻļāĻŋāĻā§āώāĻžāύāĻŦāĻŋāϏ-āĻŦāĻžāύā§āϧāĻŦ āĻāĻŦāĻ āĻ āύā§āϤāϰā§āĻā§āĻā§āϤ āĻāϰāĻāĻŋ!) - āϤāĻžāĻ āĻā§āĻŦāĻŋāϞ⧠āĻāĻĒāύāĻžāϰ āĻāύā§āϝ āĻāĻĒāϝā§āĻā§ āĻ āĻāĻļāĻā§āϞāĻŋ āĻāĻĄāĻŧāĻŋāϝāĻŧā§ āϝā§āϤ⧠āĻĻā§āĻŦāĻŋāϧāĻž āĻŦā§āϧ āĻāϰā§āύ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠<3
đ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰ āĻĄāĻžāϝāĻŧāĻžāĻā§āϰāĻžāĻŽ (āĻāĻāϰāĻāĻŽ)
đĨ DApp āĻĒā§āϰāϝā§āĻā§āϤāĻŋ āϏā§āĻā§āϝāĻžāĻ
(āĻāĻāĻŋ āĻĒāĻžāύ - āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻĒā§āϝāĻžāύāĻā§āĻ āϏā§āĻā§āϝāĻžāĻ #sorrynotsorry)
āĻāĻĒā§āύ āϏā§āϰā§āϏ āĻāĻŦāĻ āĻāϝāĻŧā§āĻŦ3-āĻŽā§āϞā§āϝ āĻĨā§āĻā§ :)
- āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋ [āϏāϞāĻŋāĻĄāĻŋāĻāĻŋ, āĻāĻĒā§āύ āĻā§āĻĒā§āϞāĻŋāύ]
- āϏāϞāĻŋāĻĄāĻŋāĻāĻŋ āĻšāϞ āĻāĻĨā§āϰāĻŋāϝāĻŧāĻžāĻŽ (āĻāĻāĻŋāĻāĻŽ)-āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ āĻŦā§āϞāĻāĻā§āĻāύā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ OO āϏā§āĻŽāĻžāϰā§āĻ āĻāύā§āĻā§āϰāĻžāĻā§āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āĻāĻžāώāĻž
- āĻāĻĒā§āύ āĻā§āĻĒā§āϞāĻŋāύ āϏāĻžāϧāĻžāϰāĻŖ āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋ āĻāĻĒāĻžāĻĻāĻžāύ āĻāĻŦāĻ āĻā§āĻā§āϤāĻŋāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž-āύāĻŋāϰā§āĻā§āώāĻŋāϤ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻ āĻĢāĻžāϰ āĻāϰā§
- āϏā§āĻŽāĻžāϰā§āĻ āĻāύā§āĻā§āϰāĻžāĻā§āĻ āĻāĻāĻĄāĻŋāĻ [āĻšāĻžāϰā§āϧāĻžāϤ]
- Hardhat āĻšāϞ Ethereum āϏāĻĢā§āĻāĻāϝāĻŧā§āϝāĻžāϰ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž, āĻāĻŽā§āĻĒāĻžāĻāϞ, āĻĄāĻŋāĻŦāĻžāĻāĻŋāĻ āĻāĻŦāĻ āϏā§āĻĨāĻžāĻĒāύā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻāύā§āύāϝāĻŧāύ āĻĒāϰāĻŋāĻŦā§āĻļ
- āĻŦā§āϞāĻāĻā§āĻāύ āĻā§āϏā§āĻāύā§āĻ [āĻĢāĻžāĻāϞāĻāϝāĻŧā§āύ āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ āĻŽā§āĻļāĻŋāύ āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ]
- FVM āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻšāϞ āĻĢāĻžāĻāϞāĻāϝāĻŧā§āύ āĻŦā§āϞāĻāĻā§āĻāύ⧠āύāĻŋāϰā§āĻŽāĻŋāϤ āĻāĻāĻāĻŋ āĻāĻāĻŋāĻāĻŽ-āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ āĻā§āϏā§āĻāύā§āĻ
- NFT āĻŽā§āĻāĻžāĻĄā§āĻāĻž āϏā§āĻā§āϰā§āĻ [NFT.Storage]
- NFT.Storage āĻšāϞ IPFS āĻāĻŦāĻ Filecoin-āĻāϰ āĻāĻĒāϰ⧠āύāĻŋāϰā§āĻŽāĻŋāϤ āĻāĻāĻāĻŋ āϏāϰā§āĻŦāĻāύā§āύ āĻāĻŋāύāĻŋāϏ āϝāĻž NFT āĻŽā§āĻāĻžāĻĄā§āĻāĻž āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύā§āϝāĻŧāĻāĻžāĻŦā§ āĻāĻŦāĻ āĻ āĻŦāĻŋāϰāĻžāĻŽāĻāĻžāĻŦā§ āϏāĻā§āĻāϝāĻŧ āĻāϰ⧠āĻāĻŦāĻ NFTs āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ sdk-āĻāϰ āĻāύā§āϝ āĻŦāĻŋāύāĻžāĻŽā§āϞā§āϝ⧠āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻā§āϤ āϏā§āĻā§āϰā§āĻ āĻ āĻĢāĻžāϰ āĻāϰā§āĨ¤
- āĻĢā§āϰāύā§āĻ-āĻāύā§āĻĄ [NextJS/React + NPM]
- āĻāĻŽāϰāĻž āϏāĻŽā§āĻāĻŦāϤ āĻāĻ āϏāĻŦ āĻāĻžāύāĻŋ... āϤāĻžāĻ āύāĻž? :āĻĒāĻŋ
- āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻĨā§āĻā§ āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋ āĻāύā§āĻāĻžāϰāĻ
ā§āϝāĻžāĻāĻļāύ [āĻŽā§āĻāĻžāĻŽāĻžāϏā§āĻ, āĻāĻĨāĻžāϰāϏ, āĻā§āĻāύāϏā§āĻā§āϝāĻžāĻ RPC āύā§āĻĄ]
- āĻāĻāĻāĻŋ āĻĒāĻžāĻŦāϞāĻŋāĻ RPC āύā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠- āĻāĻŽāĻŋ āĻāĻŽāĻžāϰ āĻŦā§āϞāĻāĻā§āύ āĻā§āĻā§āϤāĻŋāϰ āϏāĻžāĻĨā§ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĒāĻ āύāϝā§āĻā§āϝ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻāĻļāύ āĻĒā§āϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
- āĻāĻāĻāĻŋ Metamask āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āϰ (āĻŦāĻž āĻ āύā§āϰā§āĻĒ āĻāϝāĻŧāĻžāϞā§āĻ āϝāĻž EIP-1193 āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ Ethereum API āĻŦā§āϰāĻžāĻāĻāĻžāϰ⧠āĻāύāĻā§āĻā§āĻ āĻāϰ⧠), āĻāĻŽāϰāĻž āĻŦā§āϞāĻāĻā§āĻāύ āĻā§āĻā§āϤāĻŋāϤ⧠āĻāϞ āϞāĻŋāĻāϤ⧠āϏāĻā§āώāĻŽ āĻāϰāĻŋāĨ¤
- āĻāĻĨāĻžāϰāϏ āĻā§āĻāϏ āĻāĻāĻŋāĻāĻŽ-āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋāϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻā§āĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ
- āĻāĻāĻ āĻā§āĻā§āϏāĻ-āĻā§-āĻāĻŽā§āĻ āϏā§āĻā§āϝāĻžāĻŦāϞ āĻĄāĻŋāĻĢāĻŋāĻāĻļāύ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ [āĻĒāĻžāĻāĻĨāύ, āĻā§āύāϏāϰāĻĢā§āϞā§]
- TensorFlow āĻšāϞ āĻāĻāĻāĻŋ āĻāĻĒā§āύ-āϏā§āϰā§āϏ āĻŽā§āĻļāĻŋāύ āϞāĻžāϰā§āύāĻŋāĻ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ āĻāĻŦāĻ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āϝāĻž āĻĒā§āϰāĻžāĻ-āĻĒā§āϰāĻļāĻŋāĻā§āώāĻŋāϤ āĻŽāĻĄā§āϞ āĻāĻŦāĻ āĻ āύā§āϝāĻžāύā§āϝ āĻĄā§āĻāĻž āĻāĻŦāĻ ML āĻā§āϞ āϏāϰāĻŦāϰāĻžāĻš āĻāϰā§āĨ¤
- āĻāĻāĻ āĻā§āĻā§āϏāĻ-āĻā§-āĻāĻŽā§āĻ āĻā§āύāĻžāϰā§āĻļāύā§āϰ āĻāύā§āϝ āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻā§āϤ āĻ
āĻĢ-āĻā§āĻāύ āĻāĻŽā§āĻĒāĻŋāĻāĻ [āĻŦāĻžāĻāĻžāϞāĻšāĻžāĻ]
- Bacalhau āĻšāϞ āĻāĻāĻāĻŋ āĻĒāĻŋāϝāĻŧāĻžāϰ-āĻā§-āĻĒāĻŋāϝāĻŧāĻžāϰ āĻāĻĒā§āύ āĻāĻŽā§āĻĒāĻŋāĻāĻā§āĻļāύ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āϝāĻž āϏāϰā§āĻŦāĻāύā§āύ, āϏā§āĻŦāĻā§āĻ āĻāĻŦāĻ āĻāĻā§āĻāĻŋāĻāĻāĻžāĻŦā§ āϝāĻžāĻāĻžāĻāϝā§āĻā§āϝ āĻāĻŖāύāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§āĨ¤ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻā§āϤ āĻ āĻĢ-āĻā§āĻāύ āĻĄā§āĻāĻž āĻāĻŖāύāĻž āϏā§āϤāϰāĨ¤
- āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻā§āϤ DApp āϏā§āĻĨāĻžāĻĒāύāĻž [āĻĢā§āϞāĻŋāĻ]
- Fleek IPFS āĻāĻŦāĻ Filecoin-āĻ āĻāϝāĻŧā§āĻŦāϏāĻžāĻāĻ āϏā§āĻĨāĻžāĻĒāύā§āϰ āĻĒā§āϰāϏā§āϤāĻžāĻŦ āĻĻā§āϝāĻŧāĨ¤ āĻāĻāĻŋ Vercel āĻŦāĻž Netlify-āĻāϰ āĻāϝāĻŧā§āĻŦ3 āϏāĻāϏā§āĻāϰāĻŖ - āĻŦāϞāϤ⧠āĻĒāĻžāϰāĻŋ āύāĻž āϝ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āϏāϤā§āϝāĻŋāĻ āĻāĻāĻāĻŋ āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻā§āϤ āĻ ā§āϝāĻžāĻĒ āĻāĻā§ āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āĻāĻāĻŋāĻā§ āĻāϝāĻŧā§āĻŦ2-āĻ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻž āĻšāĻŦā§! :D
đī¸ āĻĒāĻžāĻāĻĨāύ āĻā§āĻā§āϏāĻ-āĻā§-āĻāĻŽā§āĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϤā§āϰāĻŋ āĻāϰāĻž
đĄ 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 āĻāϰ āĻ āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤ āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻāϰāĻŖ āĻŽāĻžāύāĻā§āϞāĻŋāĻā§ āĻāϰāĻ āĻŦāĻŋāϏā§āϤā§āϤāĻāĻžāĻŦā§ āĻĒāϰāĻŋāϤā§āϝāĻžāĻ āύāĻž āĻāϰ⧠āĻĄā§āĻāĻžāϰ āĻāĻĒāϰ āĻ āĻĢ-āĻā§āĻāύ āĻāĻŖāύāĻž āϏāĻā§āώāĻŽ āĻāϰ⧠āĻĄā§āĻāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖā§āϰ āĻāĻŦāĻŋāώā§āϝāϤāĻā§ āĻāĻŖāϤāĻžāύā§āϤā§āϰāĻŋāĻ āĻāϰāϤ⧠āϏāĻšāĻžāϝāĻŧāϤāĻž āĻāϰāĻžāϰ āϞāĻā§āώā§āϝ⧠āϰāϝāĻŧā§āĻā§ā§ˇ
Bacalhau āĻšāϞ āĻāĻāĻāĻŋ āĻĒāĻŋāϝāĻŧāĻžāϰ-āĻā§-āĻĒāĻŋāϝāĻŧāĻžāϰ āĻāĻĒā§āύ āĻāĻŽā§āĻĒāĻŋāĻāĻā§āĻļāύ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āϝāĻž āϏāϰā§āĻŦāĻāύā§āύ, āϏā§āĻŦāĻā§āĻ āĻāĻŦāĻ āĻāĻā§āĻāĻŋāĻāĻāĻžāĻŦā§ āϝāĻžāĻāĻžāĻāϝā§āĻā§āϝ āĻāĻŖāύāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠āϝā§āĻāĻžāύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰāĻž āĻāĻāĻĒāĻŋāĻāĻĢāĻāϏ (āĻāĻŦāĻ āĻļā§āĻā§āϰāĻ āĻĢāĻžāĻāϞāĻāϝāĻŧā§āύ) āĻ āϏāĻā§āĻāĻŋāϤ āĻĄā§āĻāĻž āϏāĻš āϝā§āĻā§āύ⧠āĻĄā§āĻāĻžāϰ āĻŦāĻŋāϰā§āĻĻā§āϧ⧠āĻāĻžāĻ āĻšāĻŋāϏāĻžāĻŦā§ āĻĄāĻāĻžāϰ āĻāύā§āĻā§āĻāύāĻžāϰ āĻŦāĻž āĻāϝāĻŧā§āĻŦ āĻ ā§āϝāĻžāϏā§āĻŽā§āĻŦāϞāĻŋ āĻāĻŦāĻŋ āĻāĻžāϞāĻžāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻŽāύāĻāĻŋ āĻāĻāĻŋāϰ GPU āĻāĻžāĻā§āϰ āĻāύā§āϝ āϏāĻŽāϰā§āĻĨāύ āϰāϝāĻŧā§āĻā§ āĻāĻŦāĻ US$400 āĻŦāĻž āϤāĻžāϰ āĻŦā§āĻļāĻŋ āύāϝāĻŧ!
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 āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋāĻāĻŋ āĻāĻĒā§āύ āĻā§āĻĒā§āϞāĻŋāύā§āϰ ERC721 āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύā§āϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āϤā§āϰāĻŋ āĻāĻŋāύā§āϤ⧠ERC721URIStorage āϏāĻāϏā§āĻāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āϝāĻžāϰ āĻŽāϧā§āϝ⧠āĻŽā§āĻāĻžāĻĄā§āĻāĻž āϏā§āĻā§āϝāĻžāύā§āĻĄāĻžāϰā§āĻĄ āĻāĻā§āϏāĻā§āύāĻļāύ āϰāϝāĻŧā§āĻā§ (āϤāĻžāĻ āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ IPFS-āĻ ā§āϝāĻžāĻĄā§āϰā§āϏāĻĄ āĻŽā§āĻāĻžāĻĄā§āĻāĻž āĻĒāĻžāϏ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ - āϝāĻž āĻāĻŽāϰāĻž āĻā§āĻā§āϤāĻŋāϤ⧠NFT.Storage-āĻ āϏāĻāϰāĻā§āώāĻŖ āĻāϰāĻŦ) .
āĻāĻ āĻŦā§āϏ āĻāύā§āĻā§āϰāĻžāĻā§āĻ āĻ āϤāĻŋāϰāĻŋāĻā§āϤāĻāĻžāĻŦā§ āĻāĻŽāĻžāĻĻā§āϰ āĻāύā§āϝ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāĻŋāϤ āĻŽāĻŋāύā§āĻ() āĻāĻŦāĻ āĻā§āϰāĻžāύā§āϏāĻĢāĻžāϰ() āĻāϰ āĻŽāϤ⧠āĻĢāĻžāĻāĻļāύ āϏāĻš āĻāĻāĻāĻŋ 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]; }
āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧāϤāĻž
āĻāĻŽāĻŋ Filecoin āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ āĻŽā§āĻļāĻŋāύ āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻā§āϏā§āĻāύā§āĻā§ āĻāĻ āĻā§āĻā§āϤāĻŋāĻāĻŋ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻŦ, āϤāĻŦā§ āĻāĻĒāύāĻŋ āĻāĻ āĻā§āĻā§āϤāĻŋāĻāĻŋ āĻĒāϞāĻŋāĻāύ, BSC, āĻ āĻĒāĻāĻŋāĻŽāĻŋāĻāĻŽ, āĻāϰā§āĻŦāĻŋāĻā§āϰāĻžāĻŽ, āĻ ā§āϝāĻžāĻāĻžāϞāĻžāĻā§āĻ āĻāĻŦāĻ āĻāϰāĻ āĻ āύā§āĻ āĻāĻŋāĻā§ āϏāĻš āϝā§āĻā§āύ EVM-āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ āĻā§āĻāύ⧠āϏā§āĻĨāĻžāĻĒāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻŽāύāĻāĻŋ āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻŽāĻžāϞā§āĻāĻŋ-āĻā§āĻāύ āĻāύāĻāĻĢāĻāĻŋ (āĻāĻā§āĻāĻŋāϤ: āĻāĻ āϰā§āĻĒā§ ) āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻāĻĒāύāĻžāϰ āϏāĻžāĻŽāύā§āϰ āĻĒā§āϰāĻžāύā§āϤ⧠āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ!
āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻā§āϏā§āĻāύā§āĻā§ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāĻŦā§
- āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻā§āϏā§āĻāύā§āĻā§ āĻŽā§āĻāĻžāĻŽāĻžāϏā§āĻ āĻāϝāĻŧāĻžāϞā§āĻ āϏā§āĻ āĻāĻĒ āĻāϰā§āύ āĻāĻŦāĻ āϏāĻāϝā§āĻā§āϤ āĻāϰā§āύ
- āĻāĻāĻāĻŋ āĻāϞ āĻĨā§āĻā§ āĻāĻŋāĻā§ āĻĒāϰā§āĻā§āώāĻž āĻāĻŋāĻāĻĢāĻāĻāĻāϞ āϤāĻšāĻŦāĻŋāϞ āĻĒāĻžāύ ( āϝā§āĻ āĻŦāĻž āĻā§āύāĻĄāĻžāĻā§āϏ )
Hardhat āϏāĻā§āĻā§ āϏā§āĻŽāĻžāϰā§āĻ āĻā§āĻā§āϤāĻŋ āϏā§āĻĨāĻžāĻĒāύ
āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ āĻā§āϏā§āĻāύā§āĻā§ āĻāĻ āĻā§āĻā§āϤāĻŋāĻāĻŋ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāϤ⧠āĻāĻŽāĻŋ āĻšāĻžāϰā§āĻĄāĻšā§āϝāĻžāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻāĻŋāĨ¤
đ¸ āĻšāĻžāĻāĻĒāĻžāϰāϏā§āĻĒā§āϏ RPC āĻāĻŦāĻ āĻŦā§āϞāĻāĻāĻā§āϏāĻĒā§āϞā§āϰāĻžāϰ āĻŦāĻŋāĻāϞā§āĻĒ:
āĻĒāĻžāĻŦāϞāĻŋāĻ RPC āĻāύā§āĻĄāĻĒāϝāĻŧā§āύā§āĻ
āĻŦā§āϞāĻāĻāĻā§āϏāĻĒā§āϞā§āϰāĻžāϰ
https://filecoin-hyperspace.chainstacklabs.com/rpc/v0
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
āĻāύāĻĢāĻŋāĻāĻžāϰ āϏā§āĻ-āĻāĻĒā§āϰ āĻāύā§āϝ, āĻāĻŽāϰāĻž āĻāĻĒāϞāĻŦā§āϧ āϝ⧠āĻā§āύ⧠āĻĒāĻžāĻŦāϞāĻŋāĻ 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 āĻāĻŦāĻ āĻāĻāĻŋāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ API āĻā§ (āĻāĻĒāύāĻžāϰ .env āĻĢāĻžāĻāϞ⧠āϏāĻāϰāĻā§āώāĻŖ āĻāϰāϤā§) āĻĒāĻžāύāĨ¤
.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 āĻāĻāĻžāĻĄāĻŧāĻžāĻ āϏā§āĻā§āϰ āĻāĻžāϰ āĻāĻŦāĻ āϏā§āĻā§āϰ āĻĄāĻžāĻāϰā§āĻā§āĻāϰāĻŋ āĻāĻŦāĻ āĻāĻāĻāĻŋ āϏā§āĻā§āϝāĻžāĻāĻžāϏ() āĻĢāĻžāĻāĻļāύā§āϰ āĻŽāϤ⧠āĻ āύā§āϝāĻžāύā§āϝ API āĻāϞāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āĻĒāϰāĻŋāϏāϰāĻ āĻ āĻĢāĻžāϰ āĻāϰ⧠- āϝāĻž āĻāĻāĻāĻŋ CID-āĻāϰ IPFS āĻĒāĻŋāύāĻŋāĻ āĻāĻŦāĻ āĻĢāĻžāĻāϞāĻāϝāĻŧā§āύ āϏā§āĻā§āϰā§āĻ āĻĄāĻŋāϞ āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠-> āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻĻā§āϰā§āĻĻāĻžāύā§āϤ āϏāĻāϝā§āĻāύ āĻšāϤ⧠āĻĒāĻžāϰ⧠NFT-āĻāϰ āϏā§āĻĨāĻŋāϤāĻŋ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ FEVM DApp (āĻŦāĻž FEVM āĻŽā§āĻāύāύā§āĻ āϰāĻŋāϞāĻŋāĻ āĻšāĻŋāĻ āĻšāϞ⧠FEVM-āĻ NFT āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ)āĨ¤
āĻā§āĻā§āϤāĻŋ āĻŽāĻŋāĻĨāϏā§āĻā§āϰāĻŋāϝāĻŧāĻž
āĻāĻāĻžāύ⧠3 āϧāϰāύā§āϰ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻāĻļāύ āϰāϝāĻŧā§āĻā§ (āĻāĻŦāĻ āĻāϝāĻŧā§āĻāĻāĻŋ FEVM āĻā§āĻāĻāĻž - āĻŦāĻŋāĻāĻž āĻĒā§āϰāϝā§āĻā§āϤāĻŋāϤ⧠āϏāĻŦāϏāĻŽāϝāĻŧ āĻāĻŋāĻā§ āĻ āĻĻā§āĻā§āϤ āĻŦāĻžāĻ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻĨāĻžāĻāĻŦā§!)
āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāĻžāĻĄāĻŧāĻžāĻ āĻā§āĻāύ āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāĻžāϰ āĻāύā§āϝ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĒāĻ āύāϝā§āĻā§āϝ āĻāϞ
āĻāĻŽāύ āĻāϞ āϞāĻŋāĻā§āύ āϝāĻžāϤ⧠āϏāĻžāĻāύ āĻāύ āĻāϰāϤ⧠āĻāĻŦāĻ āĻā§āϝāĻžāϏ āĻĒāϰāĻŋāĻļā§āϧ āĻāϰāϤ⧠āĻāĻāĻāĻŋ āĻāϝāĻŧāĻžāϞā§āĻ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāϝāĻŧāĨ¤ āϝ⧠āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋ āĻā§āĻāύā§āϰ āĻ āĻŦāϏā§āĻĨāĻž āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰā§, āϝā§āĻŽāύ NFT āĻŽāĻŋāύā§āĻ āĻāϰāĻž!
āĻāĻā§āύā§āĻ āĻļā§āϰā§āϤāĻž - āϝāĻžāϰāĻž āĻā§āĻā§āϤāĻŋ āĻĨā§āĻā§ āύāĻŋāϰā§āĻāϤ āĻāĻā§āύā§āĻā§āϰ āĻāύā§āϝ āĻļā§āύā§
āĻāĻ āϏāĻŽāϏā§āϤ āĻĢāĻžāĻāĻļāύā§āϰ āĻāύā§āϝ, āĻāĻŽāϰāĻž ethers.js āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦ - Ethereum API-āĻāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻšāĻžāϞāĻāĻž āĻŽā§āĻĄāĻŧāĻ, āĻāĻŽāĻžāĻĻā§āϰ āĻā§āĻā§āϤāĻŋāϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻ āĻāϰāϤ⧠āĻāĻŦāĻ āĻāϤ⧠āĻāϞ āĻāϰāϤā§āĨ¤
āĻāĻāĻāĻŋ āĻĒāĻžāĻŦāϞāĻŋāĻ 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
âĨī¸ āĻĄā§āĻā§āϞāĻĒāĻžāϰāĻ ā§āϝāĻžāϞāĻŋāϰ āϏāĻžāĻĨā§
āĻāĻĒāύāĻŋ āĻāĻ āύāĻŋāĻŦāύā§āϧāĻāĻŋ āĻŽā§āϞā§āϝāĻŦāĻžāύ āĻā§āĻāĻā§ āĻĒā§āϝāĻŧā§āĻā§āύ?
āĻāĻāĻāύ āϏā§āĻĒāύāϏāϰ āĻšāϝāĻŧā§ āĻ ā§āϝāĻžāϞāĻŋāϏāύ āĻšā§āϝāĻŧāĻžāϰāĻā§ āϏāĻŽāϰā§āĻĨāύ āĻāϰā§āύāĨ¤ āĻā§āύ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻĒā§āϰāĻļāĻāϏāĻž āĻāϰāĻž āĻšāϝāĻŧ!
āĻšā§āϝāĻžāĻļāύā§āĻĄ āϏā§āĻĒāύāϏāϰ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻāĻžāύā§āύ
āĻāĻāĻžāĻĄāĻŧāĻžāĻ āĻāĻāĻžāύ⧠āĻĒā§āϰāĻāĻžāĻļāĻŋāϤ.