MoralisSol.js 11 KB

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