MoralisWeb3.js 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _ethers = require("ethers");
  7. var _events = _interopRequireDefault(require("events"));
  8. var _ParseObject = _interopRequireDefault(require("./ParseObject"));
  9. var _ParseQuery = _interopRequireDefault(require("./ParseQuery"));
  10. var _ParseUser = _interopRequireDefault(require("./ParseUser"));
  11. var _ParseACL = _interopRequireDefault(require("./ParseACL"));
  12. var _MoralisErd = _interopRequireDefault(require("./MoralisErd"));
  13. var _MoralisDot = _interopRequireDefault(require("./MoralisDot"));
  14. var _MoralisSol = _interopRequireDefault(require("./MoralisSol"));
  15. var _TransferUtils = _interopRequireDefault(require("./TransferUtils"));
  16. var _Cloud = require("./Cloud");
  17. var _createSigningData = _interopRequireDefault(require("./createSigningData"));
  18. var _WalletConnectWeb3Connector = _interopRequireDefault(require("./Web3Connector/WalletConnectWeb3Connector"));
  19. var _InjectedWeb3Connector = _interopRequireDefault(require("./Web3Connector/InjectedWeb3Connector"));
  20. var _NetworkWeb3Connector = _interopRequireDefault(require("./Web3Connector/NetworkWeb3Connector"));
  21. var _ParseError = _interopRequireDefault(require("./ParseError"));
  22. var _InternalWeb3Provider = _interopRequireWildcard(require("./InternalWeb3Provider"));
  23. var _detectProvider = _interopRequireDefault(require("@metamask/detect-provider"));
  24. var _MagicWeb3Connector = _interopRequireDefault(require("./Web3Connector/MagicWeb3Connector"));
  25. var _Web3AuthConnector = require("./Web3Connector/Web3AuthConnector");
  26. function _getRequireWildcardCache(nodeInterop) {
  27. if (typeof WeakMap !== "function") return null;
  28. var cacheBabelInterop = new WeakMap();
  29. var cacheNodeInterop = new WeakMap();
  30. return (_getRequireWildcardCache = function (nodeInterop) {
  31. return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  32. })(nodeInterop);
  33. }
  34. function _interopRequireWildcard(obj, nodeInterop) {
  35. if (!nodeInterop && obj && obj.__esModule) {
  36. return obj;
  37. }
  38. if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
  39. return {
  40. default: obj
  41. };
  42. }
  43. var cache = _getRequireWildcardCache(nodeInterop);
  44. if (cache && cache.has(obj)) {
  45. return cache.get(obj);
  46. }
  47. var newObj = {};
  48. var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
  49. for (var key in obj) {
  50. if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
  51. var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
  52. if (desc && (desc.get || desc.set)) {
  53. Object.defineProperty(newObj, key, desc);
  54. } else {
  55. newObj[key] = obj[key];
  56. }
  57. }
  58. }
  59. newObj.default = obj;
  60. if (cache) {
  61. cache.set(obj, newObj);
  62. }
  63. return newObj;
  64. }
  65. function _interopRequireDefault(obj) {
  66. return obj && obj.__esModule ? obj : {
  67. default: obj
  68. };
  69. }
  70. function _defineProperty(obj, key, value) {
  71. if (key in obj) {
  72. Object.defineProperty(obj, key, {
  73. value: value,
  74. enumerable: true,
  75. configurable: true,
  76. writable: true
  77. });
  78. } else {
  79. obj[key] = value;
  80. }
  81. return obj;
  82. }
  83. const MoralisEmitter = new _events.default();
  84. const WARNING = 'Non ethereum enabled browser';
  85. const ERROR_WEB3_MISSING = 'Missing web3 instance, make sure to call Moralis.enableWeb3() or Moralis.authenticate()';
  86. class MoralisWeb3 {
  87. // Ethers.js instance that will be set after calling enableWeb3
  88. // Internal web3 provider, containing the Ethers.js Web3 library for internal usage for handling transactions, contracts etc.
  89. static addListener(eventName, listener) {
  90. MoralisEmitter.on(eventName, listener);
  91. return () => MoralisEmitter.removeListener(eventName, listener);
  92. }
  93. static on(eventName, listener) {
  94. MoralisEmitter.on(eventName, listener);
  95. return () => MoralisEmitter.removeListener(eventName, listener);
  96. }
  97. static once(eventName, listener) {
  98. MoralisEmitter.once(eventName, listener);
  99. return () => MoralisEmitter.removeListener(eventName, listener);
  100. }
  101. static removeListener(eventName, listener) {
  102. return MoralisEmitter.removeListener(eventName, listener);
  103. }
  104. static off(eventName, listener) {
  105. return MoralisEmitter.off(eventName, listener);
  106. }
  107. static removeAllListeners(eventName, listener) {
  108. return MoralisEmitter.removeAllListeners(eventName, listener);
  109. }
  110. static isWeb3Enabled() {
  111. return this.ensureWeb3IsInstalled();
  112. }
  113. static handleWeb3AccountChanged(account) {
  114. MoralisEmitter.emit(_InternalWeb3Provider.InternalWeb3Events.ACCOUNT_CHANGED, account);
  115. }
  116. static handleWeb3ChainChanged(chainId) {
  117. var _this$internalWeb3Pro;
  118. this.web3 = (_this$internalWeb3Pro = this.internalWeb3Provider) === null || _this$internalWeb3Pro === void 0 ? void 0 : _this$internalWeb3Pro.web3;
  119. MoralisEmitter.emit(_InternalWeb3Provider.InternalWeb3Events.CHAIN_CHANGED, chainId);
  120. }
  121. static handleWeb3Connect(connectInfo) {
  122. MoralisEmitter.emit(_InternalWeb3Provider.InternalWeb3Events.PROVIDER_CONNECT, connectInfo);
  123. }
  124. static handleWeb3Disconnect(error) {
  125. if ((error === null || error === void 0 ? void 0 : error.message) === 'MetaMask: Disconnected from chain. Attempting to connect.') {
  126. return;
  127. }
  128. this.cleanup();
  129. MoralisEmitter.emit(_InternalWeb3Provider.InternalWeb3Events.PROVIDER_DISCONNECT, error);
  130. }
  131. static async enableWeb3(options = {}) {
  132. if (this.isEnablingWeb3) {
  133. throw new Error('Cannot execute Moralis.enableWeb3(), as Moralis Moralis.enableWeb3() already has been called, but is not finished yet ');
  134. }
  135. try {
  136. var _options$connector;
  137. this.isEnablingWeb3 = true;
  138. if (this.speedyNodeApiKey) {
  139. options.speedyNodeApiKey = this.speedyNodeApiKey;
  140. options.provider = 'network';
  141. }
  142. const Connector = (_options$connector = options === null || options === void 0 ? void 0 : options.connector) !== null && _options$connector !== void 0 ? _options$connector : MoralisWeb3.getWeb3Connector(options === null || options === void 0 ? void 0 : options.provider);
  143. const connector = new Connector(options);
  144. const anyNetwork = (options === null || options === void 0 ? void 0 : options.anyNetwork) === true ? true : false;
  145. this.internalWeb3Provider = new _InternalWeb3Provider.default(connector, anyNetwork, options.privateKey);
  146. this.internalWeb3Provider.on(_InternalWeb3Provider.InternalWeb3Events.ACCOUNT_CHANGED, args => this.handleWeb3AccountChanged(args));
  147. this.internalWeb3Provider.on(_InternalWeb3Provider.InternalWeb3Events.CHAIN_CHANGED, args => this.handleWeb3ChainChanged(args));
  148. this.internalWeb3Provider.on(_InternalWeb3Provider.InternalWeb3Events.PROVIDER_CONNECT, args => this.handleWeb3Connect(args));
  149. this.internalWeb3Provider.on(_InternalWeb3Provider.InternalWeb3Events.PROVIDER_DISCONNECT, args => this.handleWeb3Disconnect(args));
  150. let provider;
  151. let chainId;
  152. let account;
  153. let internalWeb3;
  154. try {
  155. ({
  156. provider,
  157. chainId,
  158. account,
  159. web3: internalWeb3
  160. } = await this.internalWeb3Provider.activate(options));
  161. if (!provider) {
  162. throw new Error('Failed to activate, no provider returned');
  163. }
  164. } catch (error) {
  165. await this.cleanup();
  166. throw error;
  167. }
  168. const web3 = internalWeb3;
  169. this.web3 = internalWeb3;
  170. MoralisEmitter.emit(_InternalWeb3Provider.InternalWeb3Events.WEB3_ENABLED, {
  171. chainId,
  172. account,
  173. connector,
  174. provider,
  175. web3
  176. });
  177. return web3; // eslint-disable-next-line no-useless-catch
  178. } catch (error) {
  179. throw error;
  180. } finally {
  181. this.isEnablingWeb3 = false;
  182. }
  183. }
  184. static isDotAuth(options) {
  185. switch (options === null || options === void 0 ? void 0 : options.type) {
  186. case 'dot':
  187. case 'polkadot':
  188. case 'kusama':
  189. return true;
  190. default:
  191. return false;
  192. }
  193. }
  194. static isElrondAuth(options) {
  195. switch (options === null || options === void 0 ? void 0 : options.type) {
  196. case 'erd':
  197. case 'elrond':
  198. return true;
  199. default:
  200. return false;
  201. }
  202. }
  203. static isSolAuth(options) {
  204. switch (options === null || options === void 0 ? void 0 : options.type) {
  205. case 'sol':
  206. return true;
  207. default:
  208. return false;
  209. }
  210. }
  211. static getWeb3Connector(provider) {
  212. switch (provider) {
  213. case 'walletconnect':
  214. case 'walletConnect':
  215. case 'wc':
  216. return _WalletConnectWeb3Connector.default;
  217. case 'network':
  218. return _NetworkWeb3Connector.default;
  219. case 'magicLink':
  220. return _MagicWeb3Connector.default;
  221. case 'web3Auth':
  222. return _Web3AuthConnector.Web3Auth;
  223. default:
  224. return _InjectedWeb3Connector.default;
  225. }
  226. }
  227. static async deactivateWeb3() {
  228. return this.cleanup();
  229. }
  230. /**
  231. * Cleanup previously established provider
  232. */
  233. static async cleanup() {
  234. if (this.isEnablingWeb3) {
  235. return;
  236. }
  237. if (this.web3 && this.internalWeb3Provider) {
  238. MoralisEmitter.emit(_InternalWeb3Provider.InternalWeb3Events.WEB3_DEACTIVATED, {
  239. connector: this.internalWeb3Provider.connector,
  240. provider: this.internalWeb3Provider.provider
  241. });
  242. }
  243. if (this.internalWeb3Provider) {
  244. this.internalWeb3Provider.removeListener(_InternalWeb3Provider.InternalWeb3Events.ACCOUNT_CHANGED, this.handleWeb3AccountChanged);
  245. this.internalWeb3Provider.removeListener(_InternalWeb3Provider.InternalWeb3Events.CHAIN_CHANGED, this.handleWeb3ChainChanged);
  246. this.internalWeb3Provider.removeListener(_InternalWeb3Provider.InternalWeb3Events.PROVIDER_CONNECT, this.handleWeb3Connect);
  247. this.internalWeb3Provider.removeListener(_InternalWeb3Provider.InternalWeb3Events.PROVIDER_DISCONNECT, this.handleWeb3Disconnect); // For example, if walletconnect has been enabled, then later on metamask, then wc is not the internalProvider, but still has an active connection
  248. try {
  249. await this.internalWeb3Provider.deactivate();
  250. } catch (error) {// Do nothing
  251. }
  252. }
  253. this.internalWeb3Provider = null;
  254. this.web3 = null;
  255. }
  256. static async authenticate(options) {
  257. const isLoggedIn = await _ParseUser.default.currentAsync();
  258. if (isLoggedIn) {
  259. await _ParseUser.default.logOut();
  260. }
  261. if (MoralisWeb3.isDotAuth(options)) {
  262. return _MoralisDot.default.authenticate(options);
  263. }
  264. if (MoralisWeb3.isElrondAuth(options)) {
  265. return _MoralisErd.default.authenticate(options);
  266. }
  267. if (MoralisWeb3.isSolAuth(options)) {
  268. return _MoralisSol.default.authenticate(options);
  269. }
  270. await this.enableWeb3(options);
  271. const {
  272. account,
  273. web3: internalWeb3,
  274. signer
  275. } = this.getInternalWeb3Provider();
  276. if (!account) {
  277. throw new Error('Cannot authenticate, no account returned from provider');
  278. }
  279. const message = (options === null || options === void 0 ? void 0 : options.signingMessage) || MoralisWeb3.getSigningData();
  280. const data = await (0, _createSigningData.default)(message);
  281. const ethAddress = account.toLowerCase();
  282. if (!ethAddress) throw new Error('Address not found');
  283. const signature = await signer.signMessage(data);
  284. if (!signature) throw new Error('Data not signed');
  285. const user = await _ParseUser.default.logInWith('moralisEth', {
  286. authData: {
  287. id: ethAddress,
  288. signature,
  289. data
  290. }
  291. });
  292. if (!user) throw new Error('Could not get user');
  293. await user.setACL(new _ParseACL.default(user));
  294. user.addAllUnique('accounts', [ethAddress]);
  295. user.set('ethAddress', ethAddress);
  296. await user.save(null, options);
  297. return user;
  298. }
  299. static async link(account, options) {
  300. const {
  301. signer
  302. } = this.getInternalWeb3Provider();
  303. const message = (options === null || options === void 0 ? void 0 : options.signingMessage) || MoralisWeb3.getSigningData();
  304. const user = await _ParseUser.default.currentAsync();
  305. const ethAddress = account.toLowerCase();
  306. const EthAddress = _ParseObject.default.extend('_EthAddress');
  307. const query = new _ParseQuery.default(EthAddress);
  308. const ethAddressRecord = await query.get(ethAddress).catch(() => null);
  309. if (!ethAddressRecord) {
  310. const data = await (0, _createSigningData.default)(message);
  311. const signature = await signer.signMessage(data);
  312. if (!signature) throw new Error('Data not signed');
  313. await user.linkWith('moralisEth', {
  314. authData: {
  315. id: ethAddress,
  316. signature,
  317. data
  318. }
  319. });
  320. }
  321. user.addAllUnique('accounts', [ethAddress]);
  322. user.set('ethAddress', ethAddress);
  323. await user.save(null, options);
  324. return user;
  325. }
  326. static async unlink(account) {
  327. var _user$get;
  328. const accountsLower = account.toLowerCase();
  329. const EthAddress = _ParseObject.default.extend('_EthAddress');
  330. const query = new _ParseQuery.default(EthAddress);
  331. const ethAddressRecord = await query.get(accountsLower);
  332. await ethAddressRecord.destroy();
  333. const user = await _ParseUser.default.currentAsync();
  334. const accounts = (_user$get = user.get('accounts')) !== null && _user$get !== void 0 ? _user$get : [];
  335. const nextAccounts = accounts.filter(v => v !== accountsLower);
  336. user.set('accounts', nextAccounts);
  337. user.set('ethAddress', nextAccounts[0]);
  338. await user._unlinkFrom('moralisEth');
  339. await user.save();
  340. return user;
  341. }
  342. static async initPlugins(installedPlugins) {
  343. const specs = installedPlugins || (await (0, _Cloud.run)('getPluginSpecs'));
  344. if (!this.Plugins) this.Plugins = {};
  345. if (!specs) return;
  346. const allPlugins = this.Plugins;
  347. specs.forEach(plugin => {
  348. allPlugins[plugin.name] = {};
  349. plugin.functions.forEach(f => {
  350. allPlugins[plugin.name][f] = async (params, options) => {
  351. if (!options) options = {};
  352. const response = await (0, _Cloud.run)(`${plugin.name}_${f}`, params);
  353. if (!response.data.success) {
  354. const error = JSON.stringify(response.data.data, null, 2);
  355. throw new Error(`Something went wrong\n${error}`);
  356. }
  357. if (options.disableTriggers !== true) {
  358. const triggerReturn = await this.handleTriggers(response.data.result.triggers, response.data.result.data);
  359. if (triggerReturn) return triggerReturn;
  360. }
  361. return response.data.result;
  362. };
  363. });
  364. });
  365. this.Plugins = allPlugins;
  366. }
  367. static async handleTriggers(triggersArray, payload) {
  368. var _triggersArray$i, _triggersArray$i$data, _triggersArray$i2, _triggersArray$i2$dat, _triggersArray$i$data2, _triggersArray$i3, _triggersArray$i3$dat, _triggersArray$i4, _triggersArray$i4$dat, _triggersArray$i5, _triggersArray$i6, _triggersArray$i7, _triggersArray$i8, _triggersArray$i9, _triggersArray$i10, _triggersArray$i11, _triggersArray$i12, _triggersArray$i13, _triggersArray$i14, _triggersArray$i15, _triggersArray$i16, _triggersArray$i17, _triggersArray$i18, _triggersArray$i20, _triggersArray$i22, _triggersArray$i23, _triggersArray$i24;
  369. if (!triggersArray) return;
  370. for (let i = 0; i < triggersArray.length; i++) {
  371. switch (triggersArray[i].name) {
  372. // Handles `openUrl` trigger
  373. case 'openUrl':
  374. if (triggersArray[i].newTab) window.open(triggersArray[i].url);else window.open(triggersArray[i].url, '_self');
  375. break;
  376. // Handles `web3Transaction` trigger
  377. case 'web3Transaction':
  378. // Trigger a web3 transaction (await)
  379. response = await this.getInternalWeb3Provider().signer.sendTransaction({
  380. from: (_triggersArray$i = triggersArray[i]) === null || _triggersArray$i === void 0 ? void 0 : (_triggersArray$i$data = _triggersArray$i.data) === null || _triggersArray$i$data === void 0 ? void 0 : _triggersArray$i$data.from,
  381. to: (_triggersArray$i2 = triggersArray[i]) === null || _triggersArray$i2 === void 0 ? void 0 : (_triggersArray$i2$dat = _triggersArray$i2.data) === null || _triggersArray$i2$dat === void 0 ? void 0 : _triggersArray$i2$dat.to,
  382. value: _ethers.ethers.BigNumber.from((_triggersArray$i$data2 = (_triggersArray$i3 = triggersArray[i]) === null || _triggersArray$i3 === void 0 ? void 0 : (_triggersArray$i3$dat = _triggersArray$i3.data) === null || _triggersArray$i3$dat === void 0 ? void 0 : _triggersArray$i3$dat.value) !== null && _triggersArray$i$data2 !== void 0 ? _triggersArray$i$data2 : 0),
  383. data: (_triggersArray$i4 = triggersArray[i]) === null || _triggersArray$i4 === void 0 ? void 0 : (_triggersArray$i4$dat = _triggersArray$i4.data) === null || _triggersArray$i4$dat === void 0 ? void 0 : _triggersArray$i4$dat.data
  384. });
  385. if (((_triggersArray$i5 = triggersArray[i]) === null || _triggersArray$i5 === void 0 ? void 0 : _triggersArray$i5.shouldAwait) === true) {
  386. response = await response.wait();
  387. } // Save the response returned by the web3 trasanction
  388. if (((_triggersArray$i6 = triggersArray[i]) === null || _triggersArray$i6 === void 0 ? void 0 : _triggersArray$i6.saveResponse) === true) this.memoryCard.save(response); // Return payload and response
  389. if (((_triggersArray$i7 = triggersArray[i]) === null || _triggersArray$i7 === void 0 ? void 0 : _triggersArray$i7.shouldReturnPayload) === true) return {
  390. payload: payload,
  391. response: response
  392. }; // Only return response
  393. if (((_triggersArray$i8 = triggersArray[i]) === null || _triggersArray$i8 === void 0 ? void 0 : _triggersArray$i8.shouldReturnResponse) === true) return response;
  394. break;
  395. // Handles `web3Sign` trigger
  396. case 'web3Sign':
  397. if (!triggersArray[i].message) throw new Error('web3Sign trigger does not have a message to sign');
  398. if (!triggersArray[i].signer) throw new Error('web3Sign trigger signer address missing or invalid'); // eslint-disable-next-line no-case-declarations
  399. const message = JSON.parse(triggersArray[i].message);
  400. delete message.types.EIP712Domain; // eslint-disable-next-line no-case-declarations
  401. let response = await this.getInternalWeb3Provider().signer._signTypedData(message.domain, message.types, message.message); // Save response
  402. if (((_triggersArray$i9 = triggersArray[i]) === null || _triggersArray$i9 === void 0 ? void 0 : _triggersArray$i9.saveResponse) === true) this.memoryCard.save(response); // Return payload and response
  403. if (((_triggersArray$i10 = triggersArray[i]) === null || _triggersArray$i10 === void 0 ? void 0 : _triggersArray$i10.shouldReturnPayload) === true) return {
  404. payload: payload,
  405. response: response
  406. }; // Only return response
  407. if (((_triggersArray$i11 = triggersArray[i]) === null || _triggersArray$i11 === void 0 ? void 0 : _triggersArray$i11.shouldReturnResponse) === true) return response;
  408. break;
  409. // Calls a given plugin endpoint
  410. case 'callPluginEndpoint':
  411. if (!triggersArray[i].pluginName) throw new Error('callPluginEndpoint trigger does not have an plugin name to call');
  412. if (!triggersArray[i].endpoint) throw new Error('callPluginEndpoint trigger does not have an endpoint to call'); // Call a plugin endpoint (await)
  413. if (((_triggersArray$i12 = triggersArray[i]) === null || _triggersArray$i12 === void 0 ? void 0 : _triggersArray$i12.shouldAwait) === true) {
  414. // Check if a saved response has to be used to fill a parameter needed by the plugin
  415. if (triggersArray[i].useSavedResponse === true) {
  416. triggersArray[i].params[triggersArray[i].savedResponseAs] = this.memoryCard.get(triggersArray[i].savedResponseAt);
  417. } // Call the endpoint
  418. response = await (0, _Cloud.run)(`${triggersArray[i].pluginName}_${triggersArray[i].endpoint}`, triggersArray[i].params);
  419. } // Call a plugin endpoint (does NOT await)
  420. if (((_triggersArray$i13 = triggersArray[i]) === null || _triggersArray$i13 === void 0 ? void 0 : _triggersArray$i13.shouldAwait) === false) {
  421. // Check if a saved response has to be used to fill a parameter needed by the plugin
  422. if (triggersArray[i].useSavedResponse === true) {
  423. triggersArray[i].params[triggersArray[i].savedResponseAs] = this.memoryCard.get(triggersArray[i].savedResponseAt);
  424. } // Call the endpoint
  425. response = (0, _Cloud.run)(`${triggersArray[i].pluginName}_${triggersArray[i].endpoint}`, triggersArray[i].params);
  426. } // If the response contains a trigger, run it
  427. if (triggersArray[i].runResponseTrigger === true) {
  428. response = await this.handleTriggers(response.data.result.triggers, response.data.result.data);
  429. } // Save response
  430. if (((_triggersArray$i14 = triggersArray[i]) === null || _triggersArray$i14 === void 0 ? void 0 : _triggersArray$i14.saveResponse) === true) this.memoryCard.save(response); // If should not run the response trigger, continues the loop and does not return (to avoid breaking the loop execution and run other pending triggers)
  431. if (((_triggersArray$i15 = triggersArray[i]) === null || _triggersArray$i15 === void 0 ? void 0 : _triggersArray$i15.runResponseTrigger) === false) continue; // Return payload and response
  432. if (((_triggersArray$i16 = triggersArray[i]) === null || _triggersArray$i16 === void 0 ? void 0 : _triggersArray$i16.shouldReturnPayload) === true) return {
  433. payload: 'payload',
  434. response: response
  435. }; // Only return response
  436. if (((_triggersArray$i17 = triggersArray[i]) === null || _triggersArray$i17 === void 0 ? void 0 : _triggersArray$i17.shouldReturnResponse) === true) return response;
  437. break;
  438. case 'web3SignV4':
  439. if (!triggersArray[i].parameters) throw new Error('web3SignV4 trigger does not have `parameters` to sign');
  440. if (!triggersArray[i].from) throw new Error('web3SignV4 trigger does not have a `from` address');
  441. if (((_triggersArray$i18 = triggersArray[i]) === null || _triggersArray$i18 === void 0 ? void 0 : _triggersArray$i18.shouldAwait) === true) {
  442. try {
  443. var _triggersArray$i19;
  444. const {
  445. domain,
  446. types,
  447. message
  448. } = JSON.parse(triggersArray[i].parameters[1]);
  449. if (types.EIP712Domain) {
  450. // Ethers.js will compute this automatically
  451. delete types.EIP712Domain;
  452. }
  453. const signature = await this.getInternalWeb3Provider().signer._signTypedData(domain, types, message);
  454. const result = {
  455. result: signature
  456. };
  457. if (((_triggersArray$i19 = triggersArray[i]) === null || _triggersArray$i19 === void 0 ? void 0 : _triggersArray$i19.saveResponse) === true) this.memoryCard.save(result);
  458. response = result;
  459. } catch (error) {
  460. throw new Error(error.message || error);
  461. }
  462. }
  463. if (((_triggersArray$i20 = triggersArray[i]) === null || _triggersArray$i20 === void 0 ? void 0 : _triggersArray$i20.shouldAwait) === false) {
  464. const {
  465. domain,
  466. types,
  467. message
  468. } = JSON.parse(triggersArray[i].parameters[1]);
  469. if (types.EIP712Domain) {
  470. // Ethers.js will compute this automatically
  471. delete types.EIP712Domain;
  472. }
  473. this.getInternalWeb3Provider().signer._signTypedData(domain, types, message) // eslint-disable-next-line no-loop-func
  474. .then(signature => {
  475. var _triggersArray$i21;
  476. const result = {
  477. result: signature
  478. };
  479. if (((_triggersArray$i21 = triggersArray[i]) === null || _triggersArray$i21 === void 0 ? void 0 : _triggersArray$i21.saveResponse) === true) this.memoryCard.save(result);
  480. response = result;
  481. }).catch(error => {
  482. throw new Error(error.message || error);
  483. });
  484. } // Return payload and response
  485. if (((_triggersArray$i22 = triggersArray[i]) === null || _triggersArray$i22 === void 0 ? void 0 : _triggersArray$i22.shouldReturnPayload) === true) return {
  486. payload: payload,
  487. response: response
  488. }; // Only return response
  489. if (((_triggersArray$i23 = triggersArray[i]) === null || _triggersArray$i23 === void 0 ? void 0 : _triggersArray$i23.shouldReturnResponse) === true) return response;
  490. break;
  491. default:
  492. throw new Error(`Unknown trigger: "${(_triggersArray$i24 = triggersArray[i]) === null || _triggersArray$i24 === void 0 ? void 0 : _triggersArray$i24.name}"`);
  493. }
  494. } // Delete all saved data
  495. this.memoryCard.deleteSaved();
  496. }
  497. static async getAllERC20({
  498. chain,
  499. address
  500. } = {}) {
  501. const result = await (0, _Cloud.run)('getAllERC20', {
  502. chain,
  503. address
  504. });
  505. return result;
  506. }
  507. static async getERC20({
  508. chain,
  509. address,
  510. symbol,
  511. tokenAddress
  512. } = {}) {
  513. const result = (0, _Cloud.run)('getERC20', {
  514. chain,
  515. address,
  516. symbol,
  517. tokenAddress
  518. });
  519. return result;
  520. }
  521. static getNFTs({
  522. chain = 'Eth',
  523. address = ''
  524. } = {}) {
  525. return (0, _Cloud.run)('getNFTs_old', {
  526. chain,
  527. address
  528. });
  529. }
  530. static getNFTsCount({
  531. chain = 'Eth',
  532. address = ''
  533. } = {}) {
  534. return (0, _Cloud.run)('getNFTsCount_old', {
  535. chain,
  536. address
  537. });
  538. }
  539. static getTransactions({
  540. chain = 'Eth',
  541. address = '',
  542. order = 'desc'
  543. } = {}) {
  544. return (0, _Cloud.run)('getTransactions', {
  545. chain,
  546. address,
  547. order
  548. });
  549. }
  550. static getTransactionsCount({
  551. chain = 'Eth',
  552. address = ''
  553. } = {}) {
  554. return (0, _Cloud.run)('getTransactionsCount', {
  555. chain,
  556. address
  557. });
  558. }
  559. static async transfer({
  560. type = 'native',
  561. receiver = '',
  562. contractAddress = '',
  563. // eslint-disable-next-line camelcase
  564. contract_address,
  565. amount = '',
  566. tokenId = '',
  567. // eslint-disable-next-line camelcase
  568. token_id,
  569. system = 'evm'
  570. } = {}) {
  571. // Allow snake-case for backwards compatibility
  572. // eslint-disable-next-line camelcase
  573. contractAddress = contractAddress || contract_address; // eslint-disable-next-line camelcase
  574. tokenId = tokenId || token_id;
  575. const options = {
  576. receiver,
  577. contractAddress,
  578. amount,
  579. tokenId,
  580. system
  581. };
  582. _TransferUtils.default.isSupportedType(type);
  583. _TransferUtils.default.validateInput(type, options);
  584. const {
  585. web3: internalWeb3,
  586. account: sender,
  587. signer
  588. } = this.getInternalWeb3Provider();
  589. if (!sender) throw new Error('Sender address not found');
  590. let transferOperation;
  591. let customToken;
  592. if (tokenId) _TransferUtils.default.isUint256(tokenId);
  593. if (type !== 'native') {
  594. customToken = new _ethers.ethers.Contract(contractAddress, _TransferUtils.default.abi[type], signer);
  595. }
  596. switch (type) {
  597. case 'native':
  598. transferOperation = signer.sendTransaction({
  599. to: receiver,
  600. value: _ethers.ethers.BigNumber.from(amount)
  601. });
  602. break;
  603. case 'erc20':
  604. transferOperation = customToken.transfer(receiver, amount, {
  605. from: sender
  606. });
  607. break;
  608. case 'erc721':
  609. transferOperation = customToken.safeTransferFrom(sender, receiver, `${tokenId}`, {
  610. from: sender
  611. });
  612. break;
  613. case 'erc1155':
  614. transferOperation = customToken.safeTransferFrom(sender, receiver, `${tokenId}`, amount, '0x', {
  615. from: sender
  616. });
  617. break;
  618. default:
  619. throw new Error(`Unknown transfer type: "${type}"`);
  620. }
  621. const result = await transferOperation;
  622. return result;
  623. }
  624. static async executeFunction({
  625. contractAddress,
  626. abi,
  627. functionName,
  628. msgValue,
  629. params = {},
  630. overrides = {}
  631. } = {}) {
  632. var _functionData;
  633. const {
  634. account,
  635. web3: internalWeb3,
  636. provider,
  637. signerOrProvider
  638. } = this.getInternalWeb3Provider(); // Check if function is an overloaded function definition. ex "getMessage(string)", or "getMessage()"
  639. const overloadedFunction = functionName.match(/^(.+)\((.*)\)$/);
  640. let functionData;
  641. if (overloadedFunction) {
  642. // Get functiondata from overloaded function
  643. const nameWithoutTopics = overloadedFunction[1];
  644. const topics = overloadedFunction[2].split(',').map(topic => topic.trim()).filter(topic => !!topic);
  645. const functionDataArray = abi.filter(x => x.name === nameWithoutTopics);
  646. if (functionDataArray.length === 0) {
  647. throw new Error('Function does not exist in abi');
  648. }
  649. functionData = functionDataArray.find(data => {
  650. var _data$inputs$length;
  651. return ((_data$inputs$length = data === null || data === void 0 ? void 0 : data.inputs.length) !== null && _data$inputs$length !== void 0 ? _data$inputs$length : 0) === topics.length && data.inputs.every((input, index) => input.type === topics[index]);
  652. });
  653. if (!functionData) {
  654. const possibleTopics = functionDataArray.map(data => `${data.name}(${data.inputs.map(input => input.type).join(',')})`);
  655. throw new Error(`Function with the provided topic does not exist in abi. Possible funcationNames: ${possibleTopics.join(' ,')}`);
  656. }
  657. } else {
  658. // Get functiondata from 'normal' function
  659. const functionDataArray = abi.filter(x => x.name === functionName);
  660. if (functionDataArray.length === 0) {
  661. throw new Error('Function does not exist in abi');
  662. }
  663. if (functionDataArray.length > 1) {
  664. const possibleTopics = functionDataArray.map(data => `${data.name}(${data.inputs.map(input => input.type).join(',')})`);
  665. throw new Error(`Multiple function definitions found in the abi. Please include the topic in the functionName. Possible funcationNames: ${possibleTopics.join(' ,')}`);
  666. }
  667. functionData = functionDataArray[0];
  668. }
  669. const stateMutability = (_functionData = functionData) === null || _functionData === void 0 ? void 0 : _functionData.stateMutability;
  670. if (!(stateMutability === 'view' || stateMutability === 'pure')) {
  671. if (!params.from) {
  672. const currentAddress = account;
  673. if (!currentAddress) throw new Error('From address is required');
  674. ({}).from = currentAddress;
  675. }
  676. }
  677. const errors = [];
  678. for (const input of functionData.inputs) {
  679. const value = params[input.name];
  680. if (!value && typeof value !== 'number' && typeof value !== 'boolean' && input.name !== '') {
  681. errors.push(`${input.name} is required`);
  682. }
  683. }
  684. if (errors.length > 0) {
  685. throw errors;
  686. }
  687. const parsedInputs = functionData.inputs.map(x => {
  688. return params[x.name];
  689. });
  690. const contract = new _ethers.ethers.Contract(contractAddress, abi, signerOrProvider);
  691. const contractMethod = contract[functionName];
  692. if (!contractMethod) {
  693. throw new Error(`Cannot find function "${functionName}" on the contract`);
  694. }
  695. const response = await contractMethod(...Object.values(parsedInputs), msgValue ? {
  696. value: _ethers.ethers.BigNumber.from(`${msgValue}`)
  697. } : {});
  698. return response;
  699. }
  700. static getSigningData() {
  701. return `Moralis Authentication`;
  702. }
  703. static ensureWeb3IsInstalled() {
  704. return this.internalWeb3Provider && this.internalWeb3Provider.web3 ? true : false;
  705. }
  706. /**
  707. * Gets the internalWeb3Provider with validation to make sure it has been instansiated with 'enableWeb3()'
  708. */
  709. static getInternalWeb3Provider() {
  710. if (!this.ensureWeb3IsInstalled()) throw new Error(ERROR_WEB3_MISSING);
  711. return this.internalWeb3Provider;
  712. }
  713. /**
  714. * Gets web3 from the internalWeb3Provider with validation to make sure it has been instansiated with 'enableWeb3()'
  715. */
  716. static getInternalWeb3() {
  717. return this.getInternalWeb3Provider().web3;
  718. }
  719. static get provider() {
  720. var _this$internalWeb3Pro2, _this$internalWeb3Pro3;
  721. return (_this$internalWeb3Pro2 = (_this$internalWeb3Pro3 = this.internalWeb3Provider) === null || _this$internalWeb3Pro3 === void 0 ? void 0 : _this$internalWeb3Pro3.provider) !== null && _this$internalWeb3Pro2 !== void 0 ? _this$internalWeb3Pro2 : null;
  722. }
  723. static get connector() {
  724. var _this$internalWeb3Pro4, _this$internalWeb3Pro5;
  725. return (_this$internalWeb3Pro4 = (_this$internalWeb3Pro5 = this.internalWeb3Provider) === null || _this$internalWeb3Pro5 === void 0 ? void 0 : _this$internalWeb3Pro5.connector) !== null && _this$internalWeb3Pro4 !== void 0 ? _this$internalWeb3Pro4 : null;
  726. }
  727. static get connectorType() {
  728. var _this$connector$type, _this$connector;
  729. return (_this$connector$type = (_this$connector = this.connector) === null || _this$connector === void 0 ? void 0 : _this$connector.type) !== null && _this$connector$type !== void 0 ? _this$connector$type : null;
  730. }
  731. static get network() {
  732. var _this$connector$netwo, _this$connector2;
  733. return (_this$connector$netwo = (_this$connector2 = this.connector) === null || _this$connector2 === void 0 ? void 0 : _this$connector2.network) !== null && _this$connector$netwo !== void 0 ? _this$connector$netwo : null;
  734. }
  735. static get account() {
  736. var _this$internalWeb3Pro6, _this$internalWeb3Pro7;
  737. return (_this$internalWeb3Pro6 = (_this$internalWeb3Pro7 = this.internalWeb3Provider) === null || _this$internalWeb3Pro7 === void 0 ? void 0 : _this$internalWeb3Pro7.account) !== null && _this$internalWeb3Pro6 !== void 0 ? _this$internalWeb3Pro6 : null;
  738. }
  739. static get chainId() {
  740. var _this$internalWeb3Pro8, _this$internalWeb3Pro9;
  741. return (_this$internalWeb3Pro8 = (_this$internalWeb3Pro9 = this.internalWeb3Provider) === null || _this$internalWeb3Pro9 === void 0 ? void 0 : _this$internalWeb3Pro9.chainId) !== null && _this$internalWeb3Pro8 !== void 0 ? _this$internalWeb3Pro8 : null;
  742. }
  743. static getChainId() {
  744. return this.chainId;
  745. }
  746. static get web3Library() {
  747. return _ethers.ethers;
  748. }
  749. static _forwardToConnector(methodName, args) {
  750. const {
  751. connector
  752. } = this.getInternalWeb3Provider();
  753. const hasMethod = Boolean(connector[methodName]);
  754. if (!hasMethod) {
  755. throw new Error(`Cannot call ${methodName}, as it does not exist on connector type "${connector.type}"`);
  756. }
  757. return connector[methodName](...args);
  758. }
  759. static switchNetwork(...args) {
  760. return this._forwardToConnector('switchNetwork', args);
  761. }
  762. static addNetwork(...args) {
  763. return this._forwardToConnector('addNetwork', args);
  764. }
  765. static async isMetaMaskInstalled() {
  766. return (await (0, _detectProvider.default)()) ? true : false;
  767. }
  768. }
  769. _defineProperty(MoralisWeb3, "speedyNodeApiKey", void 0);
  770. _defineProperty(MoralisWeb3, "web3", null);
  771. _defineProperty(MoralisWeb3, "internalWeb3Provider", null);
  772. _defineProperty(MoralisWeb3, "Plugins", {});
  773. _defineProperty(MoralisWeb3, "isEnablingWeb3", false);
  774. _defineProperty(MoralisWeb3, "memoryCard", {
  775. save(what) {
  776. this.saved = what;
  777. },
  778. get(where) {
  779. if (!this.saved) throw new Error('Nothing saved to memory card'); // In case the saved data is not an object but a simple string or number
  780. if (where.length === 0) return this.getSaved();
  781. let tmp;
  782. let savedTmp = this.saved;
  783. for (let i = 0; i < where.length; i++) {
  784. tmp = savedTmp[where[i]];
  785. savedTmp = tmp;
  786. }
  787. return savedTmp;
  788. },
  789. getSaved() {
  790. return this.saved;
  791. },
  792. deleteSaved() {
  793. this.saved = undefined;
  794. }
  795. });
  796. MoralisWeb3.onConnect = MoralisWeb3.on.bind(MoralisWeb3, _InternalWeb3Provider.InternalWeb3Events.PROVIDER_CONNECT);
  797. MoralisWeb3.onDisconnect = MoralisWeb3.on.bind(MoralisWeb3, _InternalWeb3Provider.InternalWeb3Events.PROVIDER_DISCONNECT);
  798. MoralisWeb3.onWeb3Enabled = MoralisWeb3.on.bind(MoralisWeb3, _InternalWeb3Provider.InternalWeb3Events.WEB3_ENABLED);
  799. MoralisWeb3.onWeb3Deactivated = MoralisWeb3.on.bind(MoralisWeb3, _InternalWeb3Provider.InternalWeb3Events.WEB3_DEACTIVATED);
  800. MoralisWeb3.onChainChanged = MoralisWeb3.on.bind(MoralisWeb3, _InternalWeb3Provider.InternalWeb3Events.CHAIN_CHANGED);
  801. MoralisWeb3.onAccountChanged = MoralisWeb3.on.bind(MoralisWeb3, _InternalWeb3Provider.InternalWeb3Events.ACCOUNT_CHANGED);
  802. var _default = MoralisWeb3;
  803. exports.default = _default;