MoralisSol.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. "use strict";
  2. var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
  3. var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
  4. _Object$defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));
  9. var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
  10. var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
  11. var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));
  12. var _padStart = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/pad-start"));
  13. var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));
  14. var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));
  15. var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));
  16. var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));
  17. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
  18. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toConsumableArray"));
  19. var _createSigningData = _interopRequireDefault(require("./createSigningData"));
  20. var _ParseUser = _interopRequireDefault(require("./ParseUser"));
  21. var _ParseQuery = _interopRequireDefault(require("./ParseQuery"));
  22. var _ParseObject = _interopRequireDefault(require("./ParseObject"));
  23. var _ParseACL = _interopRequireDefault(require("./ParseACL"));
  24. /* global window */
  25. /* global solanaWeb3 */
  26. var base64 = {
  27. decode: function (s) {
  28. return Uint8Array.from(atob(s), function (c) {
  29. return c.charCodeAt(0);
  30. });
  31. },
  32. encode: function (b) {
  33. return btoa(String.fromCharCode.apply(String, (0, _toConsumableArray2.default)(new Uint8Array(b))));
  34. }
  35. };
  36. var MoralisSol = /*#__PURE__*/function () {
  37. function MoralisSol() {
  38. (0, _classCallCheck2.default)(this, MoralisSol);
  39. }
  40. (0, _createClass2.default)(MoralisSol, null, [{
  41. key: "authenticate",
  42. value: function () {
  43. var _authenticate = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(options) {
  44. var _context, _user$get;
  45. var phantom, solAddress, accounts, message, data, signature, authData, user;
  46. return _regenerator.default.wrap(function (_context2) {
  47. while (1) {
  48. switch (_context2.prev = _context2.next) {
  49. case 0:
  50. _context2.next = 2;
  51. return MoralisSol.enable();
  52. case 2:
  53. phantom = _context2.sent;
  54. if (phantom) {
  55. _context2.next = 5;
  56. break;
  57. }
  58. throw new Error('Phantom wallet not available');
  59. case 5:
  60. solAddress = phantom.publicKey.toString();
  61. if (solAddress) {
  62. _context2.next = 8;
  63. break;
  64. }
  65. throw new Error('Address not found');
  66. case 8:
  67. accounts = [solAddress];
  68. message = (options === null || options === void 0 ? void 0 : options.signingMessage) || MoralisSol.getSigningData();
  69. _context2.next = 12;
  70. return (0, _createSigningData.default)(message);
  71. case 12:
  72. data = _context2.sent;
  73. _context2.next = 15;
  74. return MoralisSol.sign(data);
  75. case 15:
  76. signature = _context2.sent;
  77. authData = {
  78. id: solAddress,
  79. signature: signature,
  80. data: data
  81. };
  82. _context2.next = 19;
  83. return _ParseUser.default.logInWith('moralisSol', {
  84. authData: authData
  85. });
  86. case 19:
  87. user = _context2.sent;
  88. _context2.next = 22;
  89. return user.setACL(new _ParseACL.default(user));
  90. case 22:
  91. if (user) {
  92. _context2.next = 24;
  93. break;
  94. }
  95. throw new Error('Could not get user');
  96. case 24:
  97. user.set('solAccounts', uniq((0, _concat.default)(_context = []).call(_context, accounts, (_user$get = user.get('solAccounts')) !== null && _user$get !== void 0 ? _user$get : [])));
  98. user.set('solAddress', solAddress);
  99. _context2.next = 28;
  100. return user.save();
  101. case 28:
  102. return _context2.abrupt("return", user);
  103. case 29:
  104. case "end":
  105. return _context2.stop();
  106. }
  107. }
  108. }, _callee);
  109. }));
  110. return function () {
  111. return _authenticate.apply(this, arguments);
  112. };
  113. }()
  114. }, {
  115. key: "link",
  116. value: function () {
  117. var _link = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(account, options) {
  118. var _context3, _user$get2;
  119. var message, user, solAddress, SolAddress, query, solAddressRecord, data, signature, authData;
  120. return _regenerator.default.wrap(function (_context4) {
  121. while (1) {
  122. switch (_context4.prev = _context4.next) {
  123. case 0:
  124. message = (options === null || options === void 0 ? void 0 : options.signingMessage) || MoralisSol.getSigningData();
  125. _context4.next = 3;
  126. return _ParseUser.default.current();
  127. case 3:
  128. user = _context4.sent;
  129. solAddress = account;
  130. SolAddress = _ParseObject.default.extend('_SolAddress');
  131. query = new _ParseQuery.default(SolAddress);
  132. _context4.next = 9;
  133. return query.get(solAddress).catch(function () {
  134. return null;
  135. });
  136. case 9:
  137. solAddressRecord = _context4.sent;
  138. if (solAddressRecord) {
  139. _context4.next = 20;
  140. break;
  141. }
  142. _context4.next = 13;
  143. return (0, _createSigningData.default)(message);
  144. case 13:
  145. data = _context4.sent;
  146. _context4.next = 16;
  147. return MoralisSol.sign(solAddress, data);
  148. case 16:
  149. signature = _context4.sent;
  150. authData = {
  151. id: solAddress,
  152. signature: signature,
  153. data: data
  154. };
  155. _context4.next = 20;
  156. return user.linkWith('moralisSol', {
  157. authData: authData
  158. });
  159. case 20:
  160. user.set('SolAccounts', uniq((0, _concat.default)(_context3 = [solAddress]).call(_context3, (_user$get2 = user.get('SolAccounts')) !== null && _user$get2 !== void 0 ? _user$get2 : [])));
  161. user.set('solAddress', solAddress);
  162. _context4.next = 24;
  163. return user.save();
  164. case 24:
  165. return _context4.abrupt("return", user);
  166. case 25:
  167. case "end":
  168. return _context4.stop();
  169. }
  170. }
  171. }, _callee2);
  172. }));
  173. return function () {
  174. return _link.apply(this, arguments);
  175. };
  176. }()
  177. }, {
  178. key: "unlink",
  179. value: function () {
  180. var _unlink = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(account) {
  181. var _user$get3;
  182. var accountsLower, SolAddress, query, solAddressRecord, user, accounts, nextAccounts;
  183. return _regenerator.default.wrap(function (_context5) {
  184. while (1) {
  185. switch (_context5.prev = _context5.next) {
  186. case 0:
  187. accountsLower = account;
  188. SolAddress = _ParseObject.default.extend('_SolAddress');
  189. query = new _ParseQuery.default(SolAddress);
  190. _context5.next = 5;
  191. return query.get(accountsLower);
  192. case 5:
  193. solAddressRecord = _context5.sent;
  194. _context5.next = 8;
  195. return solAddressRecord.destroy();
  196. case 8:
  197. _context5.next = 10;
  198. return _ParseUser.default.current();
  199. case 10:
  200. user = _context5.sent;
  201. accounts = (_user$get3 = user.get('solAccounts')) !== null && _user$get3 !== void 0 ? _user$get3 : [];
  202. nextAccounts = (0, _filter.default)(accounts).call(accounts, function (v) {
  203. return v !== accountsLower;
  204. });
  205. user.set('solAccounts', nextAccounts);
  206. user.set('solAddress', nextAccounts[0]);
  207. _context5.next = 17;
  208. return user._unlinkFrom('moralisSol');
  209. case 17:
  210. _context5.next = 19;
  211. return user.save();
  212. case 19:
  213. return _context5.abrupt("return", user);
  214. case 20:
  215. case "end":
  216. return _context5.stop();
  217. }
  218. }
  219. }, _callee3);
  220. }));
  221. return function () {
  222. return _unlink.apply(this, arguments);
  223. };
  224. }()
  225. }, {
  226. key: "sign",
  227. value: function () {
  228. var _sign = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(message) {
  229. var phantom, encodedMessage, signedMessage;
  230. return _regenerator.default.wrap(function (_context6) {
  231. while (1) {
  232. switch (_context6.prev = _context6.next) {
  233. case 0:
  234. _context6.next = 2;
  235. return MoralisSol.enable();
  236. case 2:
  237. phantom = _context6.sent;
  238. encodedMessage = new TextEncoder().encode(message);
  239. _context6.next = 6;
  240. return phantom.signMessage(encodedMessage, 'utf8');
  241. case 6:
  242. signedMessage = _context6.sent;
  243. return _context6.abrupt("return", base64.encode(signedMessage.signature));
  244. case 8:
  245. case "end":
  246. return _context6.stop();
  247. }
  248. }
  249. }, _callee4);
  250. }));
  251. return function () {
  252. return _sign.apply(this, arguments);
  253. };
  254. }()
  255. }, {
  256. key: "getSigningData",
  257. value: function () {
  258. return 'Moralis Authentication';
  259. }
  260. }]);
  261. return MoralisSol;
  262. }();
  263. (0, _defineProperty2.default)(MoralisSol, "enable", /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {
  264. var provider;
  265. return _regenerator.default.wrap(function (_context8) {
  266. while (1) {
  267. switch (_context8.prev = _context8.next) {
  268. case 0:
  269. if (!(window && 'solana' in window)) {
  270. _context8.next = 17;
  271. break;
  272. }
  273. provider = window.solana;
  274. if (!provider.isPhantom) {
  275. _context8.next = 17;
  276. break;
  277. }
  278. _context8.prev = 3;
  279. _context8.next = 6;
  280. return provider.connect({
  281. onlyIfTrusted: true
  282. });
  283. case 6:
  284. _context8.next = 16;
  285. break;
  286. case 8:
  287. _context8.prev = 8;
  288. _context8.t0 = _context8["catch"](3);
  289. if (!(_context8.t0.message === 'User rejected the request.')) {
  290. _context8.next = 15;
  291. break;
  292. }
  293. _context8.next = 13;
  294. return provider.connect();
  295. case 13:
  296. _context8.next = 16;
  297. break;
  298. case 15:
  299. throw _context8.t0;
  300. case 16:
  301. return _context8.abrupt("return", provider);
  302. case 17:
  303. throw new Error('Phantom wallet not available');
  304. case 18:
  305. case "end":
  306. return _context8.stop();
  307. }
  308. }
  309. }, _callee5, null, [[3, 8]]);
  310. })));
  311. function toHexString(buffer
  312. /*: Buffer*/
  313. ) {
  314. return (0, _reduce.default)(buffer).call(buffer, function (str, byte) {
  315. var _context7;
  316. return str + (0, _padStart.default)(_context7 = byte.toString(16)).call(_context7, 2, '0');
  317. }, '');
  318. }
  319. function uniq(arr) {
  320. return (0, _filter.default)(arr).call(arr, function (v, i) {
  321. return (0, _indexOf.default)(arr).call(arr, v) === i;
  322. });
  323. }
  324. var _default = MoralisSol;
  325. exports.default = _default;