initial commit
This commit is contained in:
commit
8036986f65
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"comments": false,
|
||||
"compact": false,
|
||||
"env": {
|
||||
"node": {
|
||||
"plugins": [
|
||||
["@babel/plugin-transform-runtime", {
|
||||
"corejs": 2
|
||||
}]
|
||||
],
|
||||
"presets": [
|
||||
["@babel/env", {
|
||||
"targets": {"node": "8.11.3"}
|
||||
}]
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
# Dependency directory
|
||||
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
|
||||
node_modules
|
||||
|
||||
dist
|
||||
package
|
||||
|
||||
.idea
|
||||
.vscode
|
||||
.eslintrc.json
|
||||
|
||||
embark-omg-*.tgz
|
||||
NOTES
|
||||
npm-debug.log
|
||||
TODO
|
|
@ -0,0 +1,21 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2018 Iuri Matias
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -0,0 +1,4 @@
|
|||
# Embark-Omg Setup
|
||||
Embark-omg is a plugin for [Embark](https://github.com/embark-framework/embark) that ...
|
||||
|
||||
#### Please report any other issues you find, thank you!
|
|
@ -0,0 +1,55 @@
|
|||
{
|
||||
"name": "embark-omg",
|
||||
"version": "1.0.0",
|
||||
"description": "OmiseGO plugin for Embark",
|
||||
"main": "dist/index.js",
|
||||
"files": [
|
||||
"dist",
|
||||
"src"
|
||||
],
|
||||
"scripts": {
|
||||
"lint": "./node_modules/.bin/eslint src/",
|
||||
"babel": "npm run babel:node",
|
||||
"babel:node": "cross-env BABEL_ENV=node babel --out-dir dist src --source-maps",
|
||||
"build": "npm run clean && npm run babel",
|
||||
"clean": "rimraf dist embark-status-*.tgz package",
|
||||
"prepare": "npm run build",
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/emizzle/embark-omg.git"
|
||||
},
|
||||
"keywords": [
|
||||
"Embark",
|
||||
"OmiseGO",
|
||||
"blockchain"
|
||||
],
|
||||
"author": "eric.mastro@gmail.com",
|
||||
"license": "ISC",
|
||||
"bugs": {
|
||||
"url": "https://github.com/emizzle/embark-omg/issues"
|
||||
},
|
||||
"homepage": "https://github.com/emizzle/embark-omg#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime-corejs2": "7.3.1",
|
||||
"@omisego/omg-js": "1.2.2",
|
||||
"@omisego/omg-js-childchain": "1.2.1",
|
||||
"@omisego/omg-js-rootchain": "1.2.2",
|
||||
"@omisego/omg-js-util": "1.2.1",
|
||||
"embark-utils": "^4.1.0-beta.2",
|
||||
"ethers": "4.0.28"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/cli": "7.2.3",
|
||||
"@babel/core": "7.2.2",
|
||||
"@babel/plugin-transform-runtime": "7.4.0",
|
||||
"@babel/preset-env": "7.4.1",
|
||||
"cross-env": "5.2.0",
|
||||
"eslint": "4.19.1",
|
||||
"rimraf": "2.6.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.11.3"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,203 @@
|
|||
import { embarkPath, dappPath } from "embark-utils";
|
||||
import { BigNumber } from "ethers/utils";
|
||||
import ChildChain from "@omisego/omg-js-childchain";
|
||||
import RootChain from "@omisego/omg-js-rootchain";
|
||||
import { transaction } from "@omisego/omg-js-util";
|
||||
|
||||
// const WEB3_PROVIDER_URL = "https://rinkeby.infura.io/";
|
||||
// const WATCHER_URL = "https://watcher.ari.omg.network/";
|
||||
// const CHILDCHAIN_URL = "https://ari.omg.network/";
|
||||
// const PLASMA_CONTRACT_ADDRESS = "0x44de0ec539b8c4a4b530c78620fe8320167f2f74";
|
||||
|
||||
// Service check constants
|
||||
const SERVICE_CHECK_ON = 'on';
|
||||
const SERVICE_CHECK_OFF = 'off';
|
||||
|
||||
|
||||
// var web3 = new Web3()
|
||||
let globalKeystore;
|
||||
let rootChain;
|
||||
let childChain;
|
||||
|
||||
const ADDRESS = "0x1e8df8b7d4212084bf5329fddc730b9e5aaba238";
|
||||
const ADDRESS_PK = "0x0f7aa58edd2758334a819516b3421953b6c453c3e8ed85b071ce1edf3aedfab8";
|
||||
|
||||
/**
|
||||
* Plugin that connects an Embark dApp to the Status app, and allows the dApp
|
||||
* to be run in the Status browser.
|
||||
*/
|
||||
class EmbarkOmg {
|
||||
constructor(embark) {
|
||||
this.embark = embark;
|
||||
this.events = this.embark.events;
|
||||
this.pluginConfig = this.embark.pluginConfig;
|
||||
this.deviceIp = this.pluginConfig.deviceIp;
|
||||
this.logger = this.embark.logger;
|
||||
this.fs = embark.fs;
|
||||
|
||||
// plugin opts
|
||||
this.plasmaContractAddress = this.pluginConfig.PLASMA_CONTRACT_ADDRESS;
|
||||
this.web3ProviderUrl = this.pluginConfig.WEB3_PROVIDER_URL;
|
||||
this.watcherUrl = this.pluginConfig.WATCHER_URL;
|
||||
this.childChainUrl = this.pluginConfig.CHILDCHAIN_URL;
|
||||
|
||||
|
||||
|
||||
this.webServerConfig = {};
|
||||
this.blockchainConfig = {};
|
||||
|
||||
// gets hydrated webserver config from embark
|
||||
this.events.on('config:load:webserver', webServerConfig => {
|
||||
this.webServerConfig = webServerConfig;
|
||||
});
|
||||
|
||||
// gets hydrated blockchain config from embark
|
||||
this.events.on('config:load:blockchain', blockchainConfig => {
|
||||
this.blockchainConfig = blockchainConfig;
|
||||
});
|
||||
|
||||
// register service check
|
||||
//this._registerServiceCheck();
|
||||
|
||||
this.init();
|
||||
|
||||
}
|
||||
|
||||
async txChildChain() {
|
||||
const val = "555";
|
||||
const toAddress = "0x38d5beb778b6e62d82e3ba4633e08987e6d0f990";
|
||||
const utxos = await this.childChain.getUtxos(ADDRESS);
|
||||
const utxosToSpend = this.selectUtxos(utxos, val, transaction.ETH_CURRENCY);
|
||||
if (!utxosToSpend) {
|
||||
return console.error(`No utxo big enough to cover the amount ${val}`);
|
||||
}
|
||||
|
||||
const txBody = {
|
||||
inputs: utxosToSpend,
|
||||
outputs: [{
|
||||
owner: toAddress,
|
||||
currency: transaction.ETH_CURRENCY,
|
||||
amount: Number(val)
|
||||
}]
|
||||
};
|
||||
|
||||
if (utxosToSpend[0].amount > val) {
|
||||
// specify the change amount back to yourself
|
||||
const CHANGE_AMOUNT = utxosToSpend[0].amount - val;
|
||||
txBody.outputs.push({
|
||||
owner: ADDRESS,
|
||||
currency: transaction.ETH_CURRENCY,
|
||||
amount: CHANGE_AMOUNT
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
const unsignedTx = await this.childChain.createTransaction(txBody);
|
||||
|
||||
const signatures = await this.childChain.signTransaction(unsignedTx, [ADDRESS_PK]);
|
||||
|
||||
const signedTx = await this.childChain.buildSignedTransaction(unsignedTx, signatures);
|
||||
|
||||
const result = await this.childChain.submitTransaction(signedTx);
|
||||
|
||||
console.log(`Submitted tx: ${JSON.stringify(result)}`);
|
||||
}
|
||||
catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
async deposit() {
|
||||
const DEPOSIT_AMT = "100000";
|
||||
|
||||
const depositTx = transaction.encodeDeposit(ADDRESS, DEPOSIT_AMT, transaction.ETH_CURRENCY);
|
||||
try {
|
||||
const receipt = await this.rootChain.depositEth(depositTx, DEPOSIT_AMT, { from: ADDRESS, privateKey: ADDRESS_PK });
|
||||
console.log(receipt);
|
||||
}
|
||||
catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
async init() {
|
||||
let web3Location = await this.getWeb3Location();
|
||||
web3Location = web3Location.replace(/\\/g, '/');
|
||||
|
||||
const Web3 = require(web3Location);
|
||||
|
||||
this.web3 = new Web3;
|
||||
|
||||
const web3Provider = new Web3.providers.HttpProvider(this.web3ProviderUrl);
|
||||
this.web3.setProvider(web3Provider);
|
||||
|
||||
this.rootChain = new RootChain(this.web3, this.plasmaContractAddress);
|
||||
this.childChain = new ChildChain(this.watcherUrl, this.childChainUrl);
|
||||
|
||||
await this.deposit();
|
||||
await this.txChildChain();
|
||||
}
|
||||
|
||||
selectUtxos(utxos, amount, currency) {
|
||||
const correctCurrency = utxos.filter(utxo => utxo.currency === currency)
|
||||
// Just find the first utxo that can fulfill the amount
|
||||
const selected = correctCurrency.find(utxo => new BigNumber(utxo.amount).gte(new BigNumber(amount)));
|
||||
if (selected) {
|
||||
return [selected];
|
||||
}
|
||||
}
|
||||
|
||||
getWeb3Location() {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.events.request("version:get:web3", (web3Version) => {
|
||||
if (web3Version === "1.0.0-beta") {
|
||||
const nodePath = embarkPath('node_modules');
|
||||
const web3Path = require.resolve("web3", { paths: [nodePath] });
|
||||
return resolve(web3Path);
|
||||
}
|
||||
this.events.request("version:getPackageLocation", "web3", web3Version, (err, location) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
const locationPath = embarkPath(location);
|
||||
resolve(locationPath);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers this plugin for Embark service checks and sets up log messages for
|
||||
* connection and disconnection events. The service check pings the Status app.
|
||||
*
|
||||
* @returns {void}
|
||||
*/
|
||||
_registerServiceCheck() {
|
||||
// const serviceCheckQueue = queue((task, callback) => {
|
||||
// this.statusApi.ping((err, isOnline) => {
|
||||
// if (!err && isOnline) this.events.emit('embark-status:connect');
|
||||
// const stateName = (isOnline ? SERVICE_CHECK_ON : SERVICE_CHECK_OFF);
|
||||
// task.cb({ name: `Status.im (${this.deviceIp})`, status: stateName });
|
||||
// });
|
||||
// callback();
|
||||
// }, 1);
|
||||
this.embark.registerServiceCheck('OmiseGO', (cb) => {
|
||||
//serviceCheckQueue.push({ cb });
|
||||
cb({ name: `OmiseGO network (${this.deviceIp})`, status: SERVICE_CHECK_ON });
|
||||
});
|
||||
|
||||
this.embark.events.on('check:backOnline:OmiseGO', () => {
|
||||
this.logger.info("------------------");
|
||||
this.logger.info("Connected to the OmiseGO network!");
|
||||
this.logger.info("------------------");
|
||||
});
|
||||
|
||||
this.embark.events.on('check:wentOffline:OmiseGO', () => {
|
||||
this.logger.error("------------------");
|
||||
this.logger.error("Couldn't connect or lost connection to the OmiseGO network...");
|
||||
this.logger.error("------------------");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export default EmbarkOmg;
|
|
@ -0,0 +1,10 @@
|
|||
// import { BN } from "we";
|
||||
|
||||
// function selectUtxos (utxos, amount, currency) {
|
||||
// const correctCurrency = utxos.filter(utxo => utxo.currency === currency)
|
||||
// // Just find the first utxo that can fulfill the amount
|
||||
// const selected = correctCurrency.find(utxo => new BigNumber(utxo.amount).gte(new BigNumber(amount)))
|
||||
// if (selected) {
|
||||
// return [selected]
|
||||
// }
|
||||
// }
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue