npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@freemarket/client-sdk

v0.3.5

Published

<a name="readme-top"></a>

Downloads

27

Readme

About The Project

FMP-SDK is a TypeScript library for programmatic integrate with Free Market Protocol. It works with NodeJS and modern web browsers. It provides:

  • A Workflow data structure that provides a strongly typed workflows data model in Typescript.
  • A JSON Schema for defining workflows as a JSON file.
  • Classes and method for validating and executing workflows.

Getting Started

Prerequisites

To use this package you'll need a recent version of NodeJS, and NPM or an equivalent package manager. Examples shown here assume you're using NPM.

Installation

FMP-SDK is currently in an early pre-release state it very likely to undergo breaking changes as we approach the first official public release. We recommend you pin your dependency to a specific version.

To install:

npm install --save @freemarket/[email protected]

Components

The high level components provided by FreeMarket SDK are:

Workflow

Workflow is a strongly typed Typescript interface used to represent the static configuration of a Workflow. Workflows are also plain old JavaScript objects thus are easily serialized to JSON. The SDK also provides a JSON Schema for validating such JSONs.

Below is a complete workflow in Typescript that simply wraps ETH into WETH:

import { Workflow } from '@freemarket/sdk'

const wrapEtherWorkflow: Workflow = {
  parameters: [
    {
      name: 'inputAmount',                    // 1. Declare a runtime parameter
      type: 'amount',
    },
  ],
  steps: [
    {
      type: 'add-asset',                     // 2. Add an asset to the workflow
      asset: {
        type: 'native',
      },
      amount: '{{ inputAmount }}',
    },
    {
      type: 'wrap-native',                   // 3. Wrap the (native) asset from #2
      amount: '100%',
    },
  ],
}

Let's look a bit closer at the top level properties of a Workflow.

Parameters

The parameters property defines the runtime parameters of the workflow. In the step definitions, parameters are referenced using the {{ parameterName }} syntax. The type of the parameter must match the expected type where it is used in a step or there will be a runtime validation error.

Steps

Steps are the building blocks of a workflow. Each step is an object with a type property that defines the type of step. In the example above, the type property of the first step is add-asset, which has the effect of transferring ETH from the caller into the workflow engine. The type of then second step is wrap-native, which wraps the ETH from step one, producing WETH. Note that after the workflow is complete, the WETH is trans to the caller.

FungibleTokens and AssetReferences

The third top level attribute of a workflow is fungibleTokens which provide details about a custom tokens that appears in a workflow.

Within a step definition, assets are referenced by defining a type property (either native or fungible-token) and if the asset reference is a fungible token, also a symbol property. The Engine is pre-configured to know about all native assets on supported blockchains (e.g., ETH, AVAX, BNB, etc.), as well as the most common fungible tokens (e.g., 'USDT', 'WETH', 'LINK', etc.). Consider the following workflow that first withdrawals from Aave, and then swaps the resulting USDT for WETH:

const wrapEtherWorkflow: Workflow = {
  steps: [
    {
      type: 'add-asset',            // add aUSDT to the workflow, referencing aUSDT by symbol
      asset: {
        type: 'fungible-token',
        symbol: 'aUSDT',
      },
      amount: '100%',
    },
    {
      type: 'aave-withdrawal',     // withdraw aUSDT from Aave, producing USDT
      inputAsset: {
        asset: {
          type: 'fungible-token',
          symbol: 'aUSDT',
        },

        amount: '100%',
      },
    },
    {
      type: 'uniswap-exact-in',    // swap USDT for WETH
      inputSymbol: 'USDT',
      outputSymbol: 'WETH',
      amount: '100%',
    },
  ],
  fungibleTokens: [
    {
      type: 'fungible-token',     // define aUSDT as a fungible token, because it is not pre-configured
      symbol: 'aUSDT',
      chains: {
        ethereum: {
          address: '0x71fc860F7D3A592A4a98740e39dB31d25db65ae8',
          decimals: 6,
        },
      },
    },
  ],
}

In the example above, aUSDT is not pre-configured by the Engine and thus must be defined in the assets property of the workflow. Once defined, it can be referenced by symbol as needed in the step definitions.

The full list of pre-configured assets can be found at: https://metadata.fmprotocol.com/tokens.json. These asset definitions are provided for the most common assets so workflow authors do not have to manually define common tokens like WETH and USDT in every workflow. However the pre-configured token list is a best effort non-authoritative list and far from complete and not necessarily guaranteed to be correct. If you need to reference an asset that is not pre-configured or if an error is found, you can define it in the assets property of the workflow.

WorkflowInstance

A WorkflowInstance is a runtime instance of a Workflow. It's main responsibility is workflow validation. It is created by passing a Workflow to the WorkflowInstance constructor. The constructor will validate the workflow and throw an error if it is invalid. The WorkflowInstance class also provides a validate method that can be used to validate a workflow instance against a set of runtime parameters.

Once a Workflow is valid has been fed into a WorkflowInstance, it can be used to create a WorkflowRunner:

// given a valid workflow in the variable `workflow`:
// and the caller's address in the variable `userAddress`

const workflowInstance = new WorkflowInstance(workflow)

// set providers for the workflow (they must be EIP-1193 compliant)
// a provider must be provided for each blockchain that is referenced in the workflow
// 'start-chain' used as the name of the blockchain that the workflow starts on (in this case, Avalanche)
instance.setProvider('start-chain', stdAvalancheProvider)

// the workflow will bridge and continue on Arbitrum
instance.setProvider('arbitrum', stdArbitrumProvider)

// acquire the runner
const runner = await instance.getRunner(userAddress)

WorkflowRunner

A WorkflowRunner is used to bind arguments to parameters and execute the workflow. You can provide a callback to receive status updates as the workflow progresses:

import { ExecutionEvent } from '@freemarket/sdk'

function workflowEventListener(event ExecutionEvent) {
  console.log('workflow event:', event.message)
}

const runner.addEventHandler(workflowEventListener)
const workflowArguments = {
  inputAmount: '1.0'
}
await runner.run(workflowArguments)

License

Distributed under the MIT License. See LICENSE.txt for more information.

Contact

Marty Saxton - [email protected]

Project Link: https://github.com/free-market/protocol/