marmojs-sdk

0.1.34 • Public • Published

Marmo Marmo wallet JS SDK.

Simple Summary

Allowing users to sign messages to show intent of execution, but allowing a third party relayer to execute them is an emerging pattern being used in many projects. This pattern simplifies the integration with any Ethereum based platform. Marmo relayer: (https://github.com/ripio/marmo-relayer).

Abstract

User pain points:

  • Users don't want to think about ether
  • Users want to be able to pay for transactions using whatever they have
  • Users don’t want to download apps/extensions (at least on the desktop) to connect to their apps

Ecosystem Graph

General WIKI ecosystem.
  • Work in progress.
API layer
  • Marmo relayer doc: (https://github.com/ripio/marmo-relayer/blob/master/README.md)
CORE layer
  • Marmo contracts doc: (https://github.com/ripio/marmo-contracts/blob/master/README.md)

Features

  • Complete implementation of Intent functionality for Marmo relay.
  • Ethereum wallet support.
  • Comprehensive integration tests demonstrating a number of the above scenarios.
Runtime dependencies:
  • Webpack
  • Mocha
  • Chai
  • Web3
  • Eslint
  • TypeScript

Getting started

Prerequisites
  • Node.js
  • npm
# On Linux: 
sudo apt-get update
sudo apt-get install nodejs
sudo apt-get install npm
sudo apt-get install nodejs-legacy
# On Mac: 
sudo brew update
sudo brew install nodejs
sudo brew install npm

Building (webpack)

npm build

Testing (Mocha)

npm test

Add the relevant dependency to your project:

NPM
npm i marmojs-sdk

how it works?

Intent Flowchart

Dependencies
  • T0 -> -
  • T1 -> -
  • T2 -> T1
  • T3 -> T1
  • T4 -> T1
  • T5 -> T1, T4
  • T6 -> T2
  • T7 -> T2
  • T8 -> T2
  • T9 -> T3
  • T10 -> T4
  • T11 -> T5
  • T12 -> T6
  • T13 -> T7
  • T14 -> T8
  • T15 -> T9
  • T16 -> T10
  • T17 -> T10
  • T18 -> T11
  • T19 -> T13
  • T20 -> T14
  • T21 -> T15
  • T22 -> T18
  • T23 -> T19
  • T24 -> T21
  • T25 -> T22
  • T26 -> T12, T23, T20, T15
  • T27 -> T24
  • T28 -> T25
  • T29 -> T27

Build a intent

let tokenContractAddress: string = "0x2f45b6fb2f28a73f110400386da31044b2e953d4"; // RCN Token
let to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB";
 
let erc20: ERC20 = new ERC20(tokenContractAddress);
let intentAction: IntentAction = erc20.transfer(to, 1);
const credentials = web3.eth.accounts.privateKeyToAccount('512850c7ebe3e1ade1d0f28ef6eebdd3ba4e78748e0682f8fda6fc2c2c5b334a');
 
let contractAddress: string = "0xDc3914BEd4Fc2E387d0388B2E3868e671c143944";
let intentBuilder: IntentBuilder = new IntentBuilder();
intentBuilder.withSigner(credentials.address)
    .withWallet(contractAddress)
    .withIntentAction(intentAction)
 
let intent: Intent = intentBuilder.build();

Sign a intent

const signedIntent: SignedIntent = Utils.sign(intent, "Private key");

Send a intent

 
let relayClient: RelayClient = new RelayClient("http://ec2-3-16-37-20.us-east-2.compute.amazonaws.com/relay");
relayClient.sent(signedIntent);
 
 # Post Example
 {
  "id": "0xacd5d801cecc1790b95c5395e4f48a40d964ae0c6b70051b3c907060e67da079",
  "dependencies": [
    "0xee2e1b62b008e27a5a3d66352f87e760ed85e723b6834e622f38b626090f536e",
    "0x6b67aac6eda8798297b1591da36a215bfbe1fed666c4676faf5a214d54e9e928"
  ],
  "wallet": "0xbbf289d846208c16edc8474705c748aff07732db",
  "tx": {
    "to": "0x2f45b6fb2f28a73f110400386da31044b2e953d4",
    "value": 0,
    "data": "0x70a082310000000000000000000000007f5eb5bb5cf88cfcee9613368636f458800e62cb",
    "minGasLimit": 300000,
    "maxGasPrice": 999999
  },
  "salt": "0x0000000000000000000000000000000000000000000000000000000000000002",
  "signer": "0x9d7713f5048c270d7c1dbe65f44644f4ea47f774",
  "signature": {
    "r": "0xed4eee4e05337e598b1886ef3941f775833f2c7e55bc233fe2cd66d032029649",
    "s": "0x502acc54e8c1ecb4d845a56afb1e43829743c77f3dd60c8b74b25cef33cd1b1e",
    "v": "0x1b"
  }
}

Structure of builder

Name Type Mandatory Default Description
id string yes Autogenerated A unique identifier for the intent.
dependencies string[] no Empty Define a correlation id for intent.
signer string yes - The address of the signer that sign the intent.
wallet string yes - Contract address or Marmo instance.
salt number no 0x0 Use to send the same intent many times if needed.
minGasLimit number no 0 Minimum gas price.
maxGasPrice number no 99999999 Maximum gas price.
intentAction IntentAction yes 0x0 IntentAction Example ->

Examples

/*
    Test with:
    - ERC20 Transfer
    - 1 Token
    - Signer
    - Wallet (0xDc3914BEd4Fc2E387d0388B2E3868e671c143944)
    - IntentAction (0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB, 1)
*/
let tokenContractAddress: string = "0x2f45b6fb2f28a73f110400386da31044b2e953d4"; // RCN Token
let to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB";
 
let erc20: ERC20 = new ERC20(tokenContractAddress);
let intentAction: IntentAction = erc20.transfer(to, 1);
const credentials = web3.eth.accounts.privateKeyToAccount('512850c7ebe3e1ade1d0f28ef6eebdd3ba4e78748e0682f8fda6fc2c2c5b334a');
 
let contractAddress: string = "0xDc3914BEd4Fc2E387d0388B2E3868e671c143944";
let intentBuilder: IntentBuilder = new IntentBuilder();
intentBuilder.withSigner(credentials.address)
    .withWallet(contractAddress)
    .withIntentAction(intentAction)
 
let intent: Intent = intentBuilder.build();
/*
    Test with:
    - balanceOf
    - Signer
    - Wallet (0x692a70d2e424a56d2c6c27aa97d1a86395877b3a)
    - IntentAction (0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB, 1)
*/
let tokenContractAddress: string = "0x2f45b6fb2f28a73f110400386da31044b2e953d4"; // RCN Token
let to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB";
 
let erc20: ERC20 = new ERC20(tokenContractAddress);
let intentAction: IntentAction = erc20.balanceOf(to);
const credentials = web3.eth.accounts.privateKeyToAccount('512850c7ebe3e1ade1d0f28ef6eebdd3ba4e78748e0682f8fda6fc2c2c5b334a');
 
let contractAddress: string = "0xbbf289d846208c16edc8474705c748aff07732db";
let intentBuilder: IntentBuilder = new IntentBuilder();
intentBuilder.withSigner(credentials.address)
    .withWallet(contractAddress)
    .withIntentAction(intentAction)
 
let intent: Intent = intentBuilder.build();
/*
    Test with:
    - balanceOf
    - Signer
    - dependencies (0xee2e1b62b008e27a5a3d66352f87e760ed85e723b6834e622f38b626090f536e)
    - Wallet (0x692a70d2e424a56d2c6c27aa97d1a86395877b3a)
    - IntentAction (0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB, 1)
*/
let tokenContractAddress: string = "0x2f45b6fb2f28a73f110400386da31044b2e953d4"; // RCN Token
let to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB";
 
let erc20: ERC20 = new ERC20(tokenContractAddress);
let intentAction: IntentAction = erc20.balanceOf(to);
const credentials = web3.eth.accounts.privateKeyToAccount('512850c7ebe3e1ade1d0f28ef6eebdd3ba4e78748e0682f8fda6fc2c2c5b334a');
 
let contractAddress: string = "0xbbf289d846208c16edc8474705c748aff07732db";
let intentBuilder: IntentBuilder = new IntentBuilder();
intentBuilder.withSigner(credentials.address)
    .withDependencies(['0xee2e1b62b008e27a5a3d66352f87e760ed85e723b6834e622f38b626090f536e'])
    .withWallet(contractAddress)
    .withIntentAction(intentAction)
 
let intent: Intent = intentBuilder.build();
/*
    Test with:
    - balanceOf
    - Signer
    - dependencies (
        0xee2e1b62b008e27a5a3d66352f87e760ed85e723b6834e622f38b626090f536e, 
        0x6b67aac6eda8798297b1591da36a215bfbe1fed666c4676faf5a214d54e9e928
    )
    - Wallet (0x692a70d2e424a56d2c6c27aa97d1a86395877b3a)
    - IntentAction (0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB, 1)
*/
let tokenContractAddress: string = "0x2f45b6fb2f28a73f110400386da31044b2e953d4"; // RCN Token
let to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB";
 
let erc20: ERC20 = new ERC20(tokenContractAddress);
let intentAction: IntentAction = erc20.balanceOf(to);
const credentials = web3.eth.accounts.privateKeyToAccount('512850c7ebe3e1ade1d0f28ef6eebdd3ba4e78748e0682f8fda6fc2c2c5b334a');
 
let contractAddress: string = "0xbbf289d846208c16edc8474705c748aff07732db";
let intentBuilder: IntentBuilder = new IntentBuilder();
intentBuilder.withSigner(credentials.address)
    .withDependencies([
        '0xee2e1b62b008e27a5a3d66352f87e760ed85e723b6834e622f38b626090f536e', 
        '0x6b67aac6eda8798297b1591da36a215bfbe1fed666c4676faf5a214d54e9e928'
    ])
    .withWallet(contractAddress)
    .withIntentAction(intentAction)
 
let intent: Intent = intentBuilder.build();
/*
Test with:
    - balanceOf
    - Signer
    - dependencies (
        0xee2e1b62b008e27a5a3d66352f87e760ed85e723b6834e622f38b626090f536e, 
        0x6b67aac6eda8798297b1591da36a215bfbe1fed666c4676faf5a214d54e9e928
    )
    - Wallet (0x692a70d2e424a56d2c6c27aa97d1a86395877b3a)
    - Min gas 300000
    - Max gas 999999
    - IntentAction (0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB, 1)
*/
let tokenContractAddress: string = "0x2f45b6fb2f28a73f110400386da31044b2e953d4"; // RCN Token
let to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB";
 
let erc20: ERC20 = new ERC20(tokenContractAddress);
let intentAction: IntentAction = erc20.balanceOf(to);
const credentials = web3.eth.accounts.privateKeyToAccount('512850c7ebe3e1ade1d0f28ef6eebdd3ba4e78748e0682f8fda6fc2c2c5b334a');
 
let contractAddress: string = "0xbbf289d846208c16edc8474705c748aff07732db";
let intentBuilder: IntentBuilder = new IntentBuilder();
intentBuilder.withSigner(credentials.address)
    .withDependencies(['0xee2e1b62b008e27a5a3d66352f87e760ed85e723b6834e622f38b626090f536e', '0x6b67aac6eda8798297b1591da36a215bfbe1fed666c4676faf5a214d54e9e928'])
    .withWallet(contractAddress)
    .withIntentAction(intentAction)
    .withMinGasLimit(300000)
    .withMaxGasLimit(999999)
 
let intent: Intent = intentBuilder.build();
/*
Test with:
    - balanceOf
    - Signer
    - dependencies (
        0xee2e1b62b008e27a5a3d66352f87e760ed85e723b6834e622f38b626090f536e, 
        0x6b67aac6eda8798297b1591da36a215bfbe1fed666c4676faf5a214d54e9e928
    )
    - Wallet (0x692a70d2e424a56d2c6c27aa97d1a86395877b3a)
    - Min gas 300000
    - Max gas 999999
    - IntentAction (0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB, 1)
    - Salt (0x0000000000000000000000000000000000000000000000000000000000000001)
*/
let tokenContractAddress: string = "0x2f45b6fb2f28a73f110400386da31044b2e953d4"; // RCN Token
let to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB";
 
let erc20: ERC20 = new ERC20(tokenContractAddress);
let intentAction: IntentAction = erc20.balanceOf(to);
const credentials = web3.eth.accounts.privateKeyToAccount('512850c7ebe3e1ade1d0f28ef6eebdd3ba4e78748e0682f8fda6fc2c2c5b334a');
 
let contractAddress: string = "0xbbf289d846208c16edc8474705c748aff07732db";
let intentBuilder: IntentBuilder = new IntentBuilder();
intentBuilder.withSigner(credentials.address)
    .withDependencies(['0xee2e1b62b008e27a5a3d66352f87e760ed85e723b6834e622f38b626090f536e', '0x6b67aac6eda8798297b1591da36a215bfbe1fed666c4676faf5a214d54e9e928'])
    .withWallet(contractAddress)
    .withIntentAction(intentAction)
    .withMinGasLimit(300000)
    .withMaxGasLimit(999999)
    .withSalt(1)
 
let intent: Intent = intentBuilder.build();
/*
    Test with:
    - balanceOf
    - Signer
    - dependencies (0xee2e1b62b008e27a5a3d66352f87e760ed85e723b6834e622f38b626090f536e, 0x6b67aac6eda8798297b1591da36a215bfbe1fed666c4676faf5a214d54e9e928)
    - Wallet (0x692a70d2e424a56d2c6c27aa97d1a86395877b3a)
    - Min gas 300000
    - Max gas 999999
    - IntentAction (0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB, 1)
    - Salt (0x0000000000000000000000000000000000000000000000000000000000000002)
*/
let tokenContractAddress: string = "0x2f45b6fb2f28a73f110400386da31044b2e953d4"; // RCN Token
let to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB";
 
let erc20: ERC20 = new ERC20(tokenContractAddress);
let intentAction: IntentAction = erc20.balanceOf(to);
const credentials = web3.eth.accounts.privateKeyToAccount('512850c7ebe3e1ade1d0f28ef6eebdd3ba4e78748e0682f8fda6fc2c2c5b334a');
 
let contractAddress: string = "0xbbf289d846208c16edc8474705c748aff07732db";
let intentBuilder: IntentBuilder = new IntentBuilder();
intentBuilder.withSigner(credentials.address)
    .withDependencies(['0xee2e1b62b008e27a5a3d66352f87e760ed85e723b6834e622f38b626090f536e', '0x6b67aac6eda8798297b1591da36a215bfbe1fed666c4676faf5a214d54e9e928'])
    .withWallet(contractAddress)
    .withIntentAction(intentAction)
    .withMinGasLimit(300000)
    .withMaxGasLimit(999999)
    .withSalt(2)
 
let intent: Intent = intentBuilder.build();

Other implementations

Readme

Keywords

none

Package Sidebar

Install

npm i marmojs-sdk

Weekly Downloads

70

Version

0.1.34

License

none

Unpacked Size

9.49 MB

Total Files

19

Last publish

Collaborators

  • jpgonzalezra