From 212d9c793d166f8bc2ee6446f5f257ce23b36d9a Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Wed, 29 May 2019 21:15:44 +0200 Subject: [PATCH 1/4] Decouple window implementation from ethereum provider interface --- EIPS/eip-1193.md | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/EIPS/eip-1193.md b/EIPS/eip-1193.md index 7398f75db8804c..f740d133c229c5 100644 --- a/EIPS/eip-1193.md +++ b/EIPS/eip-1193.md @@ -11,7 +11,7 @@ created: 2018-06-30 ## Summary -This EIP formalizes an Ethereum Provider JavaScript API for consistency across clients and applications. The provider is designed to be minimal and is intended to be available on `window.ethereum` for cross environment compatibility. +This EIP formalizes an Ethereum Provider JavaScript API for consistency across clients and applications. The provider is designed to be minimal and compatible cross environments. ## API @@ -108,7 +108,7 @@ The event emits with `accounts`, an array of the accounts' addresses. ## Examples ```js -const ethereum = window.ethereum; +const ethereum = new EthereumProvider(); // A) Set provider in web3.js var web3 = new Web3(ethereum); @@ -283,10 +283,25 @@ Appropriate error codes **SHOULD** follow the table of [`CloseEvent` status code ## Sample Class Implementation ```js + +// Example Transport for Mist +class Transport { + on(event, callback) { + window.addEventListener(event, callback); + } + send(message) { + window.postMessage(message, targetOrigin); + } +} + +// Example EthereumProvider class EthereumProvider extends EventEmitter { - constructor() { + constructor(transport) { // Call super for `this` to be defined super(); + + // Assign Transport + this._transport = transport; // Init storage this._nextJsonrpcId = 0; @@ -296,7 +311,7 @@ class EthereumProvider extends EventEmitter { this._connect(); // Listen for jsonrpc responses - window.addEventListener('message', this._handleJsonrpcMessage.bind(this)); + this._transsport.on('message', this._handleJsonrpcMessage.bind(this)); } /* Methods */ @@ -318,10 +333,9 @@ class EthereumProvider extends EventEmitter { this._promises[payload.id] = { resolve, reject }; }); - // Send jsonrpc request to Mist - window.postMessage( - { type: 'mistAPI_ethereum_provider_write', message: payload }, - targetOrigin + // Send jsonrpc request to Transport + this._transport.send( + { type: 'mistAPI_ethereum_provider_write', message: payload } ); return promise; @@ -375,10 +389,9 @@ class EthereumProvider extends EventEmitter { /* Connection handling */ _connect() { - // Send to Mist - window.postMessage( - { type: 'mistAPI_ethereum_provider_connect' }, - targetOrigin + // Send to Transport + this._transport.send( + { type: 'mistAPI_ethereum_provider_connect' } ); // Reconnect on close From 301e13876dfde3d689757f088d33debea1ef894b Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Thu, 30 May 2019 12:13:16 +0200 Subject: [PATCH 2/4] Update eip-1193.md --- EIPS/eip-1193.md | 33 +++++++++------------------------ 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/EIPS/eip-1193.md b/EIPS/eip-1193.md index f740d133c229c5..10c1bd5cb724bf 100644 --- a/EIPS/eip-1193.md +++ b/EIPS/eip-1193.md @@ -108,8 +108,6 @@ The event emits with `accounts`, an array of the accounts' addresses. ## Examples ```js -const ethereum = new EthereumProvider(); - // A) Set provider in web3.js var web3 = new Web3(ethereum); @@ -283,25 +281,10 @@ Appropriate error codes **SHOULD** follow the table of [`CloseEvent` status code ## Sample Class Implementation ```js - -// Example Transport for Mist -class Transport { - on(event, callback) { - window.addEventListener(event, callback); - } - send(message) { - window.postMessage(message, targetOrigin); - } -} - -// Example EthereumProvider class EthereumProvider extends EventEmitter { constructor(transport) { // Call super for `this` to be defined super(); - - // Assign Transport - this._transport = transport; // Init storage this._nextJsonrpcId = 0; @@ -311,7 +294,7 @@ class EthereumProvider extends EventEmitter { this._connect(); // Listen for jsonrpc responses - this._transsport.on('message', this._handleJsonrpcMessage.bind(this)); + window.addEventListener('message', this._handleJsonrpcMessage.bind(this)); } /* Methods */ @@ -333,9 +316,10 @@ class EthereumProvider extends EventEmitter { this._promises[payload.id] = { resolve, reject }; }); - // Send jsonrpc request to Transport - this._transport.send( - { type: 'mistAPI_ethereum_provider_write', message: payload } + // Send jsonrpc request to Mist + window.postMessage( + { type: 'mistAPI_ethereum_provider_write', message: payload }, + targetOrigin ); return promise; @@ -389,9 +373,10 @@ class EthereumProvider extends EventEmitter { /* Connection handling */ _connect() { - // Send to Transport - this._transport.send( - { type: 'mistAPI_ethereum_provider_connect' } + // Send to Mist + window.postMessage( + { type: 'mistAPI_ethereum_provider_connect' }, + targetOrigin ); // Reconnect on close From c2f81df20a640873eb9b6f60cf333b9b95864779 Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Thu, 30 May 2019 12:22:42 +0200 Subject: [PATCH 3/4] Update eip-1193.md --- EIPS/eip-1193.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EIPS/eip-1193.md b/EIPS/eip-1193.md index 10c1bd5cb724bf..2871c160401d36 100644 --- a/EIPS/eip-1193.md +++ b/EIPS/eip-1193.md @@ -282,7 +282,7 @@ Appropriate error codes **SHOULD** follow the table of [`CloseEvent` status code ```js class EthereumProvider extends EventEmitter { - constructor(transport) { + constructor() { // Call super for `this` to be defined super(); From 76fb04cab50249f200ecfe40fe5e65c8abb44142 Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Thu, 30 May 2019 18:27:24 +0200 Subject: [PATCH 4/4] Update eip-1193.md --- EIPS/eip-1193.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EIPS/eip-1193.md b/EIPS/eip-1193.md index 2871c160401d36..185c7fce596235 100644 --- a/EIPS/eip-1193.md +++ b/EIPS/eip-1193.md @@ -11,7 +11,7 @@ created: 2018-06-30 ## Summary -This EIP formalizes an Ethereum Provider JavaScript API for consistency across clients and applications. The provider is designed to be minimal and compatible cross environments. +This EIP formalizes an Ethereum Provider JavaScript API for consistency across clients and applications. The provider is designed to be minimal and compatible across environments. ## API