arc-js2

This is a proof of concept for an alternative design for Arc.js. This means that most of the things are implemeted as stubs, except for the general architecture and a small subset of things that serve as examples on how the rest of the library would look

Usage no npm install needed!

<script type="module">
  import arcJs2 from 'https://cdn.skypack.dev/arc-js2';
</script>

README

ArcJs 2

This is a proof of concept for an alternative design for Arc.js. This means that most of the things are implemeted as stubs, except for the general architecture and a small subset of things that serve as examples on how the rest of the library would look like.

The need for such a design was motivated by these main common problems in alchemy:

  • Pointer chaing.
  • Handling changes.

Moreover I feel that the current Arc.js does not provide much abstraction over the backend. While using the current library, you still need to know a lot of things about how Arc works to be able to use it correctly.

Benefits:

  • Nice modular and composable API.
  • Fully abstracts the "contracts as a service" design of Arc.
  • Automatically verifies (also a security feature) and casts contracts addresses to their appropriate wrapper, by comparing the code at the address to deployedBytecode from known contracts.
  • Extensible - allows the user to dynamically register new types of global constraints and schemes.
  • Integrates well with popular frontend frameworks by treating properties of contracts as rxjs.Observables:
    • In Angular2 it's easy to bind the value of theses properties in the template by using the async pipe:
        <span>{{someProperty | async}}</span>
      
      This way the property is automatically updated in real-time.
    • Using redux-observable we can simple map property Observables to a stream of ON_CHANGE actions.
    • With React, we can simply use existing wrapper components from a library (like Frint) to map observable values to props for a component:
        const WrappedComponent = observe(() => someProperty.map(mapToProps))(Component);
      
    • We can also always simply convert an Observable to a regular Promise by observable.toPromise().
  • Validates Arc-specific errors and raises an exception as early as possible (e.g. registering a SchemeRegistrar without the required permissions).
  • Simulates transactions before sending to catch reverts before they reach the blockchain.
  • Automatically sets the gas limit for a transaction to be exactly the gas it will spend in order to prevent loss of funds.
  • Informative error messages that specify the contract address, method name, and arguments which led to a revert.
  • Set of utility functions for easily writing new wrappers for custom schemes and global constraints.