Skip to content

Web3.js Plugin for IPFS Upload and register in Smart Contract

Notifications You must be signed in to change notification settings

ffmcgee725/web3js-ipfs-plugin

Folders and files

NameName
Last commit message
Last commit date
Nov 29, 2023
Dec 4, 2023
Nov 29, 2023
Nov 22, 2023
Aug 9, 2023
Nov 22, 2023
Nov 29, 2023
Nov 20, 2023
Nov 22, 2023
Nov 22, 2023
Nov 29, 2023
Aug 9, 2023
Nov 20, 2023
Nov 22, 2023

Repository files navigation

Web3.js IPFS Plugin

This is a plugin for Web3.js library, designed for uploading files to IPFS, storing CIDs in a smart contract, and listing all stored CIDs of given ethereum address.

Using the library

  1. Create a third web account and api key to use their IPFS network storage service here

  2. Declare thirdWebConfig object for your plugin to use

// this object should have your third web api secret key if you intend to use the plugin in a node server environment
const thirdWebConfig = { secretKey: "PLACE_YOUR_SECRET_KEY_HERE"}
// or, if the plugin is to be used in a web browser environment, pass the client id instead
const thirdWebConfig = { clientId: "PLACE_YOUR_CLIENT_ID_HERE"}
  1. Use your existing Web3.js instance and register the plugin
import { Web3 } from "web3";
import { IpfsPlugin } from "web3-ipfs-plugin";

// make sure to use library code to sign your main authenticated wallet address, as it will be necessary
// to pass it as a configuration to later call the registry contact store method
const providerAddress = web3.eth.wallet?.get(0)?.address;
const web3Config = { context: web3.getContextObject(), providerAddress };

web3.registerPlugin(new IpfsPlugin(thirdWebConfig, web3Config));
  1. Use uploadFile() to upload a file to IPFS network and store the generated CID in a Registry Smart Contract 0xA683BF985BC560c5dc99e8F33f3340d1e53736EB
// Calling this method will upload the file to IPFS, store the CID to a smart contract, and return the transaction receipt (or throws an error if something goes wrong)
try {
  const receipt = await web3.ipfs.uploadFile("path/to/file/");
} catch (e) {
  // handle error
}

NOTE: If calling from a web browser, the file data should be passed as an Iterable, as the 2nd argument (since file path implementation uses fs underneath the hood which is only supported on a node environment) We suggest using File System API to implement client-side code capable of fetching and manipulating this data accordingly

try {
  const receipt = await web3.ipfs.uploadFile(
    "this/path/becomes/irrelevant",
    data
  );
} catch (e) {
  // handle error
}
  1. Use listAllByAddress() to list all encoded CIDs for given Ethereum address (or throws an error if something goes wrong)
try {
  const cidStoredEvents = await web3.ipfs.listAllByAddress(
    "0xb9089c00f17B7c9Cf77f3Fb87164CbD0eC1F7d08"
  );
} catch (e) {
  // handle error
}

Running Tests

  1. To run unit tests, run the following command yarn test

  2. To run end to end tests, run the following command yarn test:e2e

  3. To run end to end tests on a web browser environment, run the following command yarn test:browser

NOTE: /!\ Make sure to add a private key (without the 0x prefix) to the P_KEY environment variable as specified from the .env.sample file, before running e2e tests. Do the same for your third web configurations, in the THIRD_WEB_SECRET_KEY and THIRD_WEB_CLIENT_ID environment variables If e2e test fails due to insufficient funds in the address you chose to use, just mint some SepoliaETH You can use this faucet /!\