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 updatesudo apt-get install nodejssudo apt-get install npmsudo apt-get install nodejs-legacy
# On Mac: sudo brew updatesudo brew install nodejssudo 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 Tokenlet to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB"; let erc20: ERC20 = tokenContractAddress;let intentAction: IntentAction = erc20;const credentials = web3ethaccounts; let contractAddress: string = "0xDc3914BEd4Fc2E387d0388B2E3868e671c143944";let intentBuilder: IntentBuilder = ;intentBuilder let intent: Intent = intentBuilder;
Sign a intent
const signedIntent: SignedIntent = Utils;
Send a intent
let relayClient: RelayClient = "http://ec2-3-16-37-20.us-east-2.compute.amazonaws.com/relay";relayClient; # 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 Tokenlet to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB"; let erc20: ERC20 = tokenContractAddress;let intentAction: IntentAction = erc20;const credentials = web3ethaccounts; let contractAddress: string = "0xDc3914BEd4Fc2E387d0388B2E3868e671c143944";let intentBuilder: IntentBuilder = ;intentBuilder let intent: Intent = intentBuilder;
/* Test with: - balanceOf - Signer - Wallet (0x692a70d2e424a56d2c6c27aa97d1a86395877b3a) - IntentAction (0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB, 1)*/let tokenContractAddress: string = "0x2f45b6fb2f28a73f110400386da31044b2e953d4"; // RCN Tokenlet to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB"; let erc20: ERC20 = tokenContractAddress;let intentAction: IntentAction = erc20;const credentials = web3ethaccounts; let contractAddress: string = "0xbbf289d846208c16edc8474705c748aff07732db";let intentBuilder: IntentBuilder = ;intentBuilder let intent: Intent = intentBuilder;
/* Test with: - balanceOf - Signer - dependencies (0xee2e1b62b008e27a5a3d66352f87e760ed85e723b6834e622f38b626090f536e) - Wallet (0x692a70d2e424a56d2c6c27aa97d1a86395877b3a) - IntentAction (0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB, 1)*/let tokenContractAddress: string = "0x2f45b6fb2f28a73f110400386da31044b2e953d4"; // RCN Tokenlet to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB"; let erc20: ERC20 = tokenContractAddress;let intentAction: IntentAction = erc20;const credentials = web3ethaccounts; let contractAddress: string = "0xbbf289d846208c16edc8474705c748aff07732db";let intentBuilder: IntentBuilder = ;intentBuilder let intent: Intent = intentBuilder;
/* Test with: - balanceOf - Signer - dependencies ( 0xee2e1b62b008e27a5a3d66352f87e760ed85e723b6834e622f38b626090f536e, 0x6b67aac6eda8798297b1591da36a215bfbe1fed666c4676faf5a214d54e9e928 ) - Wallet (0x692a70d2e424a56d2c6c27aa97d1a86395877b3a) - IntentAction (0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB, 1)*/let tokenContractAddress: string = "0x2f45b6fb2f28a73f110400386da31044b2e953d4"; // RCN Tokenlet to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB"; let erc20: ERC20 = tokenContractAddress;let intentAction: IntentAction = erc20;const credentials = web3ethaccounts; let contractAddress: string = "0xbbf289d846208c16edc8474705c748aff07732db";let intentBuilder: IntentBuilder = ;intentBuilder let intent: Intent = intentBuilder;
/*Test with: - balanceOf - Signer - dependencies ( 0xee2e1b62b008e27a5a3d66352f87e760ed85e723b6834e622f38b626090f536e, 0x6b67aac6eda8798297b1591da36a215bfbe1fed666c4676faf5a214d54e9e928 ) - Wallet (0x692a70d2e424a56d2c6c27aa97d1a86395877b3a) - Min gas 300000 - Max gas 999999 - IntentAction (0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB, 1)*/let tokenContractAddress: string = "0x2f45b6fb2f28a73f110400386da31044b2e953d4"; // RCN Tokenlet to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB"; let erc20: ERC20 = tokenContractAddress;let intentAction: IntentAction = erc20;const credentials = web3ethaccounts; let contractAddress: string = "0xbbf289d846208c16edc8474705c748aff07732db";let intentBuilder: IntentBuilder = ;intentBuilder let intent: Intent = intentBuilder;
/*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 Tokenlet to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB"; let erc20: ERC20 = tokenContractAddress;let intentAction: IntentAction = erc20;const credentials = web3ethaccounts; let contractAddress: string = "0xbbf289d846208c16edc8474705c748aff07732db";let intentBuilder: IntentBuilder = ;intentBuilder let intent: Intent = intentBuilder;
/* 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 Tokenlet to: string = "0x7F5EB5bB5cF88cfcEe9613368636f458800e62CB"; let erc20: ERC20 = tokenContractAddress;let intentAction: IntentAction = erc20;const credentials = web3ethaccounts; let contractAddress: string = "0xbbf289d846208c16edc8474705c748aff07732db";let intentBuilder: IntentBuilder = ;intentBuilder let intent: Intent = intentBuilder;
Other implementations
- Java marmoj-sdk
- Python marmopy-sdk