Skip to content

Instantly share code, notes, and snippets.

View xavierlepretre's full-sized avatar
🤯

Xavier Leprêtre xavierlepretre

🤯
View GitHub Profile
"use strict";
const Rx = require('rx');
module.exports = function addFilterObservableToWeb3(web3) {
web3.eth.filterObservable = function(_options) {
const filter = web3.eth.filter(_options);
return Rx.Observable.create(function(observer) {
@xavierlepretre
xavierlepretre / sequentialPromiseNamed.js
Last active May 25, 2019 10:56
Like `Promise.all()` but where all promises are started sequentially and it takes an object.
const Promise = require("bluebird");
/**
* @param {!Object.<function.<Promise.<Any>>>} promiseObject. Each key maps to a function
* that returns a promise.
* @returns {!Promise.<Object.<Any>>} The results of the promises passed to the function.
*/
module.exports = function sequentialPromiseNamed(promiseObject) {
const result = Object.keys(promiseObject).reduce(
(reduced, key) => {
@xavierlepretre
xavierlepretre / sequentialPromise.js
Last active April 25, 2023 16:03
Like `Promise.all()` but where all promises are started sequentially.
const Promise = require("bluebird");
/**
* @param {!Array.<function.Promise.<Any>>} promiseArray.
* @returns {!Promise.<Array.<Any>>} The results of the promises passed to the function.
*/
module.exports = function sequentialPromise(promiseArray) {
const result = promiseArray.reduce(
(reduced, promise, index) => {
reduced.results.push(undefined);
@xavierlepretre
xavierlepretre / promisifyWeb3.js
Created January 8, 2017 17:36
Convert `web3` asynchronous calls into Promises.
module.exports = {
promisify: function (web3) {
// Pipes values from a Web3 callback.
var callbackToResolve = function (resolve, reject) {
return function (error, value) {
if (error) {
reject(error);
} else {
resolve(value);
}
@xavierlepretre
xavierlepretre / rxifyWeb3.js
Last active September 12, 2019 22:29
Convert `web3.eth` asynchronous calls into Rx observables.
const Rx = require('rx');
module.exports = {
rxify: function (web3) {
// List synchronous functions masquerading as values.
var syncGetters = {
db: [],
eth: [ "accounts", "blockNumber", "coinbase", "gasPrice", "hashrate",
"mining", "protocolVersion", "syncing" ],
net: [ "listening", "peerCount" ],
@xavierlepretre
xavierlepretre / getEventsPromise.js
Last active September 7, 2017 16:42
Get a Promise on events fired
getEventsPromise= function (myFilter, count, timeOut) {
timeOut = timeOut ? timeOut : 30000;
var promise = new Promise(function (resolve, reject) {
count = (typeof count !== "undefined") ? count : 1;
var results = [];
var toClear = setTimeout(function () {
reject("Timed out");
}, timeOut);
myFilter.watch(function (error, result) {
if (error) {
web3.eth.filter("pending").watch(function() {
if (eth.mining) return;
console.log(new Date() + "-- Transactions detected, so starting mining.");
miner.start(1);
});
web3.eth.filter('latest', function(error, result) {
console.log(new Date() + "-- Got latest, so stopping mining");
miner.stop();
if (txpool.status.pending > 0) {
@xavierlepretre
xavierlepretre / expected_exception_testRPC_and_geth.js
Last active November 28, 2019 17:57
When TestRPC and Geth throw, they behave in a different manner. This Gist is an example on how to cover such a situation.
"use strict";
/**
* @param {!Function.<!Promise>} action.
* @param {!Number | !string | !BigNumber} gasToUse.
* @returns {!Promise} which throws unless it hit a valid error.
*/
module.exports = function expectedExceptionPromise(action, gasToUse) {
return new Promise(function (resolve, reject) {
try {
@xavierlepretre
xavierlepretre / getFirstAccountPromise.js
Last active March 16, 2018 09:25
Get the Promise of an account on Web3 or Mist.
web3.eth.getFirstAccountPromise = function () {
// https://gist.github.com/xavierlepretre/ed82f210df0f9300493d5ca79893806a
return web3.eth.getAccountsPromise()
.then(function (accounts) {
if (accounts.length > 0) {
return accounts[0];
} else if (typeof(mist) !== "undefined") {
// https://gist.github.com/xavierlepretre/ee456323b2544dd4da22cd5fa6d2894c
return mist.requestAccountPromise();
} else {
@xavierlepretre
xavierlepretre / mistRequestAccountPromise.js
Created July 19, 2016 11:23
Get the Promise of an account on Ethereum Mist.
if (typeof(mist) !== "undefined") {
mist.requestAccountPromise = function () {
return new Promise (function (resolve, reject) {
mist.requestAccount(function(e, account) {
if(e != null) {
reject(e);
} else {
resolve(account);
}
});