InternalWeb3Provider.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = exports.InternalWeb3Events = void 0;
  6. var _events = _interopRequireDefault(require("events"));
  7. var _events2 = require("./Web3Connector/events");
  8. var _ethers = require("ethers");
  9. var _convert = require("./utils/convert");
  10. function _interopRequireDefault(obj) {
  11. return obj && obj.__esModule ? obj : {
  12. default: obj
  13. };
  14. } // Events emitted by Moralis
  15. const InternalWeb3Events = Object.freeze({
  16. ACCOUNT_CHANGED: 'accountChanged',
  17. CHAIN_CHANGED: 'chainChanged',
  18. PROVIDER_CONNECT: 'provider-connect',
  19. PROVIDER_DISCONNECT: 'provider-disconnect',
  20. WEB3_ENABLED: 'web3Enabled',
  21. WEB3_DEACTIVATED: 'web3Deactivated'
  22. });
  23. /**
  24. * Wrapper for the internal web3 provider,
  25. * responsible for syncing data when connector connects/deactivates
  26. * Gives access to ethers functionalities, initialized by the connector
  27. */
  28. exports.InternalWeb3Events = InternalWeb3Events;
  29. class InternalWeb3Provider extends _events.default {
  30. constructor(connector, anyNetwork = false, privateKey = null) {
  31. super();
  32. if (!connector) {
  33. throw new Error('Cannot initialize InternalWeb3Provider without a connector');
  34. }
  35. this.connector = connector;
  36. this.anyNetwork = anyNetwork;
  37. this.privateKey = privateKey;
  38. this.handleAccountChanged = this.handleAccountChanged.bind(this);
  39. this.handleChainChanged = this.handleChainChanged.bind(this);
  40. this.handleConnect = this.handleConnect.bind(this);
  41. this.handleDisconnect = this.handleDisconnect.bind(this);
  42. }
  43. async activate(options) {
  44. if (!this.connector) {
  45. throw new Error('Cannot acticate InternalWeb3Provider without a connector');
  46. }
  47. const {
  48. provider,
  49. chainId,
  50. account
  51. } = await this.connector.activate(options);
  52. this.provider = provider;
  53. this.chainId = chainId;
  54. this.account = account;
  55. const network = this.anyNetwork ? 'any' : (0, _convert.fromHexToDecimal)(chainId);
  56. this.web3 = new _ethers.ethers.providers.Web3Provider(provider, network);
  57. if (this.connector.on) {
  58. this.connector.on(_events2.ConnectorEvents.ACCOUNT_CHANGED, this.handleAccountChanged);
  59. this.connector.on(_events2.ConnectorEvents.CHAIN_CHANGED, this.handleChainChanged);
  60. this.connector.on(_events2.ConnectorEvents.CONNECT, this.handleConnect);
  61. this.connector.on(_events2.ConnectorEvents.DISCONNECT, this.handleDisconnect);
  62. }
  63. return {
  64. provider,
  65. chainId,
  66. account,
  67. web3: this.web3
  68. };
  69. } // Returns a provider (or wallet if a privateKey is provided) that can sign messages (throws if not possible, ie. the account cannot sign)
  70. get signer() {
  71. return this.privateKey != null ? new _ethers.ethers.Wallet(this.privateKey, this.web3) : this.web3.getSigner(this.account);
  72. } // Returns a provider (or wallet if a privateKey is provided) that can sign messages or the normal web3 provider as fallback
  73. get signerOrProvider() {
  74. try {
  75. if (this.account) {
  76. return this.privateKey != null ? new _ethers.ethers.Wallet(this.privateKey, this.web3) : this.web3.getSigner(this.account);
  77. }
  78. return this.web3;
  79. } catch (error) {
  80. return this.web3;
  81. }
  82. }
  83. handleChainChanged(chainId) {
  84. this.chainId = chainId;
  85. this.web3 = new _ethers.ethers.providers.Web3Provider(this.provider, (0, _convert.fromHexToDecimal)(chainId));
  86. this.emit(InternalWeb3Events.CHAIN_CHANGED, chainId);
  87. }
  88. handleAccountChanged(account) {
  89. this.account = account;
  90. this.emit(InternalWeb3Events.ACCOUNT_CHANGED, account);
  91. } // Handle Connect events fired from connectors
  92. handleConnect(connectInfo) {
  93. this.emit(InternalWeb3Events.PROVIDER_CONNECT, connectInfo);
  94. } // Handle Disconnect events fired from connectors
  95. handleDisconnect(error) {
  96. this.emit(InternalWeb3Events.PROVIDER_DISCONNECT, error);
  97. }
  98. async deactivate() {
  99. this.account = null;
  100. this.chianId = null;
  101. this.web3 = null;
  102. this.provider = null;
  103. this.privateKey = null;
  104. if (this.connector) {
  105. if (this.connector.removeListener) {
  106. this.connector.removeListener(InternalWeb3Events.CHAIN_CHANGED, this.handleChainChanged);
  107. this.connector.removeListener(InternalWeb3Events.ACCOUNT_CHANGED, this.handleAccountChanged);
  108. this.connector.removeListener(InternalWeb3Events.PROVIDER_CONNECT, this.handleConnect);
  109. this.connector.removeListener(InternalWeb3Events.PROVIDER_DISCONNECT, this.handleDisconnect);
  110. }
  111. if (this.connector.deactivate) {
  112. await this.connector.deactivate();
  113. }
  114. }
  115. this.connector = null;
  116. }
  117. }
  118. var _default = InternalWeb3Provider;
  119. exports.default = _default;