Giter Club home page Giter Club logo

robonomics-js's Introduction

Robonomics-js

NPM Version Build Status

Simple Javascript library to work with Robonomcis on Ethereum data

Install

Installation is performed via npm. To install, run:

> npm install robonomics-js --save

Or with yarn. To install, run:

> yarn add robonomics-js

Dependencies

Use

Create and return an instance of Robonomics.

const options = {...};
const robonomics = new Robonomics(options);

options

This is a properties object:

options.web3

That's an instance of web3.js

// metamask
const options = {
  web3: new Web3(window.ethereum),
  ...
};

// infura
const options = {
  web3: new Web3(
    new Web3.providers.WebsocketProvider(
      "wss://mainnet.infura.io/ws/v3/0b2f2a5026264b57b6d698b480332e89"
    )
  ),
  ...
};

options.messageProvider

That's an instance of MessageProviderIpfs, which uses the node of js-ipfs with pubsub option enabled.

const ipfs = new Ipfs({
  repo: 'robonomics-example',
  relay: {
    enabled: true,
    hop: {
      enabled: true
    }
  },
  EXPERIMENTAL: {
    pubsub: true
  },
  config: {
    Addresses: {
      Swarm: [
        '/dns4/ws-star.discovery.libp2p.io/tcp/443/wss/p2p-websocket-star',
        '/dns4/1.wsstar.aira.life/tcp/443/wss/p2p-websocket-star/',
        '/dns4/2.wsstar.aira.life/tcp/443/wss/p2p-websocket-star/',
        '/dns4/3.wsstar.aira.life/tcp/443/wss/p2p-websocket-star/'
      ]
    },
    Bootstrap: [
      '/dns4/ams-1.bootstrap.libp2p.io/tcp/443/wss/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd',
      '/dns4/lon-1.bootstrap.libp2p.io/tcp/443/wss/ipfs/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3',
      '/dns4/nyc-1.bootstrap.libp2p.io/tcp/443/wss/ipfs/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm',
      '/dns4/nyc-2.bootstrap.libp2p.io/tcp/443/wss/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64',
      '/dns4/node0.preload.ipfs.io/tcp/443/wss/ipfs/QmZMxNdpMkewiVZLMRxaNxUeZpDUb34pWjZ1kZvsd16Zic',
      '/dns4/node1.preload.ipfs.io/tcp/443/wss/ipfs/Qmbut9Ywz9YEDrz8ySBSgWyJk41Uvm2QJPhwDJzJyGFsD6',
      '/dns4/1.pubsub.aira.life/tcp/443/wss/ipfs/QmdfQmbmXt6sqjZyowxPUsmvBsgSGQjm4VXrV7WGy62dv8',
      '/dns4/2.pubsub.aira.life/tcp/443/wss/ipfs/QmPTFt7GJ2MfDuVYwJJTULr6EnsQtGVp8ahYn9NSyoxmd9',
      '/dns4/3.pubsub.aira.life/tcp/443/wss/ipfs/QmWZSKTEQQ985mnNzMqhGCrwQ1aTA6sxVsorsycQz9cQrw'
    ]
  }
})

const options = {
  messageProvider: new MessageProviderIpfs(ipfs),
  ...
};

options.account

This is an object of account's properties, the account to sing messages with. Pass either an account's address (it should be unlocked in prior), or teh account's private key (account's address will be derived out of the key).

isSignPrefix is responsible for adding a prefix to the message. Defaults to true.

const options = {
  account: {
    address: '0x0000000000000000000000000000000000000000',
    privateKey: '0x0000000000000000000000000000000000000000000000000000',
    isSignPrefix: true
  },
  ...
};

options.ens

This is a properties object of the ens contract. The parameter is optional. If necessary, set address of the contract (if using other than mainnet network). Suffix suffix for names, defaults to eth, for any sidechain it's sid. Version version of Robonomics network, defaults to the latest one.

const options = {
  ens: {
    address: '0x314159265dD8dbb310642f98f50C066173C1259b',
    suffix: 'eth',
    version: 5
  },
  ...
};

options.lighthouse

ENS lighthouse name, optional, defaults to airalab.lighthouse.5.robonomics.eth. It's possible to set the short name only: airalab.

const options = {
  lighthouse: 'airalab.lighthouse.5.robonomics.eth',
  ...
};

Wait for components initialization before use.

const options = {...};
const robonomics = new Robonomics(options);
robonomics.ready().then(() => {
  console.log('Robonomics instance ready')
})

API

Messages

Demand

Message format.

const demand = {
  // Required
  model: "QmSt69qQqGka1qwRRHbdmAWk4nCbsV1mqJwd8cWbEyhf1M", // model as an IPFS CID to a rosbag file
  objective: "QmSt69qQqGka1qwRRHbdmAWk4nCbsV1mqJwd8cWbEyhf2M", // task as an IPFS CID to a rosbag file
  token: robonomics.xrt.address, // payment token address
  cost: 1, // cost
  deadline: 9999999, // deadline block number

  // Optional
  lighthouse: "0x0000000000000000000000000000000000000000", // lighthouse address, defaults to the one set at initialization
  validator: "0x0000000000000000000000000000000000000000", // validator address in case proof of work needed
  validatorFee: 0, // validator fee
  nonce: 1 // nonce
};

robonomics.sendDemand

Sign and send the demand. Returns liability.

robonomics.sendDemand(demand).then(liability => {
  console.log(liability.address);
});

robonomics.onDemand

Listens to demand messages for a passed model. If set model to null, listens to all the demands on a lighthouse.

robonomics.onDemand(model, message => {
  console.log(message);
});

Offer

Message format.

const offer = {
  // Required
  model: "QmSt69qQqGka1qwRRHbdmAWk4nCbsV1mqJwd8cWbEyhf1M", // model as an IPFS CID to a rosbag file
  objective: "QmSt69qQqGka1qwRRHbdmAWk4nCbsV1mqJwd8cWbEyhf2M", // task as an IPFS CID to a rosbag file
  token: robonomics.xrt.address, // payment token address
  cost: 1, // cost
  deadline: 9999999, // deadline block number

  // Optional
  lighthouse: "0x0000000000000000000000000000000000000000", // lighthouse address, defaults to the one set at initialization
  lighthouseFee: 0, // lighthouse fee
  validator: "0x0000000000000000000000000000000000000000", // validator address in case proof of work needed
  nonce: 1 // nonce
};

robonomics.sendOffer

Sign and send the offer. Returns liability.

robonomics.sendOffer(offer).then(liability => {
  console.log(liability.address);
});

robonomics.onOffer

Listens to offer messages for a passed model. If set model to null, listens to all the offers on a lighthouse.

robonomics.onOffer(model, message => {
  console.log(message);
});

Result

Message format.

const result = {
  // Required
  liability: "0x0000000000000000000000000000000000000000", // liability contract address
  success: true, // job success flag
  result: "QmWXk8D1Fh5XFJvBodcWbwgyw9htjc6FJg8qi1YYEoPnrg" // Result as an IPFS CID to a rosbag file
};

robonomics.sendResult

Sign and send offer message.

robonomics.sendResult(result).then(() => {
  console.log("ok");
});

robonomics.onResult

Listens to result messages in the network. Result is not supposed as valid. Valid result is to be obtained from the liability.

robonomics.onResult(result => {
  console.log(result);
});

Contracts

Liability

liability.getInfo

Returns an object of contract properties.

liability.getInfo().then(data => {
  console.log(data);
  /*
  {
    model,
    objective,
    result,
    token,
    cost,
    lighthouseFee,
    validatorFee,
    demandHash,
    offerHash,
    promisor,
    promisee,
    lighthouse,
    validator,
    isSuccess,
    isFinalized
  }
  */
});

liability.onResult

Waits for the contract to complete, returns result.

liability.onResult().then(result => {
  console.log(result);
});

Lighthouse

robonomics.lighthouse.getInfo

Returns an object of contract properties.

robonomics.lighthouse.getInfo().then(data => {
  console.log(data);
  /*
  {
    minimalStake,
    timeoutInBlocks,
    keepAliveBlock,
    marker,
    quota
  }
  */
});

robonomics.lighthouse.getProviders

Returns a list of provides working on a lighthouse.

robonomics.lighthouse.getProviders().then(list => {
  console.log(list);
});
Create a new lighthouse
const minimalFreeze = 1000 // Wn
const timeout = 25 // blocks
const name = 'mylighthouse' // lighthouse name
robonomics.factory.methods.createLighthouse(minimalFreeze, timeout, name).send({ from: robonomics.account.address })
    .then((tx) => console.log(tx))robonomics.factory.onLighthouse((lighthouse) => {
    console.log(lighthouse.name)
})
Become a lighthouse provider

First, XRT tokens approve needed:

const name = "mylighthouse"; // lighthouse name
const stake = 1000; // Wn
robonomics.lighthouse.methods
  .refill(stake)
  .send({ from: robonomics.account.address })
  .then(tx => console.log(tx));

Token

robonomics.xrt.getInfo

Returns an object of contract properties.

robonomics.xrt.getInfo().then(data => {
  console.log(data);
  /*
  {
    name,
    totalSupply,
    decimals,
    symbol
  }
  */
});
Check balance
robonomics.xrt.methods
  .balanceOf(robonomics.account.address)
  .call()
  .then(balance => console.log(balance));
Check number of approved tokens for the factory by its address
robonomics.xrt.methods
  .allowance(robonomics.account.address, robonomics.factory.address)
  .call()
  .then(allowance => console.log(allowance));
Approve tokens for the lighthouse address
robonomics.xrt.methods
  .approve(robonomics.lighthouse.address, 100)
  .send({
    from: robonomics.account.address
  })
  .then(tx => console.log(tx));

Links

Edit Robonomics Vue Template

robonomics-js's People

Contributors

ensrationis avatar patara43 avatar vol4tim avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

robonomics-js's Issues

Add typescript typings

Add typescript .d.ts typing definitions as part of the library.

This can be used by developers to make sure they are using the correct types and to provide an easier experience when working with robonomics-js. It can also be used by tools such as eslint and tsc to check validity.

These can be generated by using an auto-generation tool or by writing them manually.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.