Skip to content

Build decentralized verification apps on the Devery Protocol using Javascript

License

Notifications You must be signed in to change notification settings

devery/deveryjs

Repository files navigation

Devery.js

npm version Coverage Status Build Status

Javascript library for the Devery protocol.

You can check the full documentation with examples here ==> Devery.js documentation.

Installation:

The installation process is quite simple - you just need to install it using NPM or YARN.

npm install --save @devery/devery

That's it - now you can start using devery.js inside your app.

Importing:

You can use require or import like syntax to access devery classes

  1. require like syntax:
    const devery = require('@devery/devery');
    const DeveryRegistry = devery.DeveryRegistry;
    
    let deveryRegistryClient = new DeveryRegistry();

or alternatively you can use this.

  1. ES6 import syntax:
    import {DeveryRegistry} from '@devery/devery';
    
    let deveryRegistryClient = new DeveryRegistry();

Simple usage example

Important Read the permissioning session, to be aware of possible gotchas and pitfalls.

  1. Checking if a product has been marked.

      // first you need to get a {@link DeveryRegistry} instance
      let deveryRegistryClient = new DeveryRegistry();
    
      // check product by specified address
      deveryRegistryClient.check("0x627306090abaB3A6e1400e9345bC60c78a8BEf57").then(item => {
           console.log('product brand',item.brandAccount);
           // other stuff
      });
    
      // or with the async syntax
    
      async function foo() {
               let item = await deveryRegistryClient.check("0x627306090abaB3A6e1400e9345bC60c78a8BEf57")
               console.log('product brand',item.brandAccount);
      }

    usefull snippets

Create and mark a product for an existing brand

      import { DeveryRegistry, Utils } from '@devery/devery'
      async function markProduct (){
        let deveryRegistry = new DeveryRegistry();
        const address = Utils.getRandomAddress();

        let txn = await deveryRegistry.addProduct(product.productAccount, "product description", "product details", 2020, "Aukland")
        let provider = deveryRegistry.getProvider()
        await provider.provider.waitForTransaction(txn.hash)
        let hash = await deveryRegistry.addressHash(address)
        txn = await deveryRegistry.mark(address, hash)
        await provider.provider.waitForTransaction(txn.hash)
      }
      markProduct();

Mint token for an existing product

import { DeveryERC721, Utils } from '@devery/devery'

async function claim (){
        let deveryErc721 = new DeveryERC721();
        
        let txn = await deveryErc721.claimProduct(product.address, quantity)
        let provider = deveryErc721.getProvider()
        await provider.provider.waitForTransaction(txn.hash)
        
      }

      claim();

Access to the ethereum network

Devery.js will try to automatically get the web3 object instance presented in your context(page, app etc). If this is not possible then it will fallback to a read only provider pointing to the main network. As the fallback does not contain a signer you will not be able to perform write operations.

Permissioning

web3 permissioning

Metamask requires you to give permission to your app by default. So it's very important to call web3.currentProvider.enable() to open Metamask permission window. It's a good idea to safeguard your code for the case when web3 is not presented. One example of how to request these permissions safely would be:

// init metamask
try {
  if (web3 && web3.currentProvider && web3.currentProvider.isMetaMask) {
    // TODO: move this to deveryjs
    web3.currentProvider.enable();
  }
} 
catch(e) {
    // Handle exceptions here
}

If you don't do this you will not be able to interact with the contracts using Metamask.

Fee charge permissions

Some operations may charge a fee from the message sender. Example of these transactions is marking a product and claiming a token for a marked item. The contracts that charge these fees need your permission, you can pre approve these transfers by calling the approve EveToken.

Here's a full example on how to check the current allowance and try to increase the approval if it's bellow a certain number

export async function checkAndUpdateAllowance (address, minAllowance , total) {
  try {
    // creates a new eve token instance
    let eveTokenClient = new EveToken();
    // get the current ethereum network connection provider
    let provider = eveTokenClient.getProvider();
    // check the current allowance for the requested contract
    let currentAllowance = await eveToken.allowance(web3.eth.accounts[0], address);
    // we need to do the division by 10e17 because devery token uses the base 18
    if(parseFloat(currentAllowance.toString()) / 10e17 < minAllowance) {
        // here in the approve function we need to add the 17 0s for the same reason
        let txn = await eveTokenClient.approve(address, total + '000000000000000000');
        await provider.provider.waitForTransaction(txn.hash);
    }
   
  } catch (e) {
      // Add your exception handling here
  }
}

// checks and approves the allowance for the deveryRegistry contract
checkAndUpdateAllowance('0x0364a98148b7031451e79b93449b20090d79702a',40,100);

// checks and approves the allowance for the deveryErc721 contract
checkAndUpdateAllowance('0x032ef0359eb068d3dddd6e91021c02f397afce5a',40,100);

This example would check and approve the allowance for both transactions (marking and claiming tokens) in the live network, you can always improve and change the code to fit your needs.

Main Classes documentation.

  1. DeveryRegistry
  2. DeveryERC721
  3. EveToken

About

Build decentralized verification apps on the Devery Protocol using Javascript

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published