Skip to content

Commit

Permalink
Add web3 shim
Browse files Browse the repository at this point in the history
  • Loading branch information
rekmarks committed Nov 30, 2020
1 parent d603707 commit 5af1bde
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 2 deletions.
4 changes: 3 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
const MetaMaskInpageProvider = require('./src/MetaMaskInpageProvider')
const { initializeProvider, setGlobalProvider } = require('./src/initializeProvider')
const shimWeb3 = require('./src/shimWeb3')

module.exports = {
MetaMaskInpageProvider,
initializeProvider,
MetaMaskInpageProvider,
setGlobalProvider,
shimWeb3,
}
9 changes: 8 additions & 1 deletion src/initializeProvider.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const MetaMaskInpageProvider = require('./MetaMaskInpageProvider')
const shimWeb3 = require('./shimWeb3')

/**
* Initializes a MetaMaskInpageProvider and (optionally) assigns it as window.ethereum.
Expand All @@ -7,14 +8,16 @@ const MetaMaskInpageProvider = require('./MetaMaskInpageProvider')
* @param {Object} options.connectionStream - A Node.js stream.
* @param {number} options.maxEventListeners - The maximum number of event listeners.
* @param {boolean} options.shouldSendMetadata - Whether the provider should send page metadata.
* @param {boolean} options.shouldSetOnWindow - Whether the provider should be set as window.ethereum
* @param {boolean} options.shouldSetOnWindow - Whether the provider should be set as window.ethereum.
* @param {boolean} options.shouldShimWeb3 - Whether a window.web3 shim should be injected.
* @returns {MetaMaskInpageProvider | Proxy} The initialized provider (whether set or not).
*/
function initializeProvider ({
connectionStream,
maxEventListeners = 100,
shouldSendMetadata = true,
shouldSetOnWindow = true,
shouldShimWeb3 = false,
} = {}) {

let provider = new MetaMaskInpageProvider(
Expand All @@ -30,6 +33,10 @@ function initializeProvider ({
setGlobalProvider(provider)
}

if (shouldShimWeb3) {
shimWeb3(provider)
}

return provider
}

Expand Down
38 changes: 38 additions & 0 deletions src/shimWeb3.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/**
* If no existing window.web3 is found, this function injects a web3 "shim" to
* not break dapps that rely on window.web3.currentProvider.
*
* @param {import('./MetaMaskInpageProvider')} provider - The provider to set as window.web3.currentProvider.
*/
module.exports = function shimWeb3 (provider) {
if (!window.web3) {
const SHIM_IDENTIFIER = '__isMetaMaskShim__'
const web3Shim = new Proxy(
{
currentProvider: provider,
[SHIM_IDENTIFIER]: true,
},
{
get: (target, property, ...args) => {
if (property === 'currentProvider') {
console.warn(
'You are accessing the MetaMask window.web3.currentProvider shim. Just use window.ethereum instead. For details, see: https://docs.metamask.io/guide/provider-migration.html#replacing-window-web3',
)
} else if (property !== SHIM_IDENTIFIER) {
console.error(
`MetaMask no longer injects web3. For details, see: https://docs.metamask.io/guide/provider-migration.html#replacing-window-web3`,
)
}
return Reflect.get(target, property, ...args)
},
},
)

Object.defineProperty(window, 'web3', {
value: Object.freeze(web3Shim),
enumerable: false,
configurable: true,
writable: true,
})
}
}

0 comments on commit 5af1bde

Please sign in to comment.