MoralisSol.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _createSigningData = _interopRequireDefault(require("./createSigningData"));
  7. var _ParseUser = _interopRequireDefault(require("./ParseUser"));
  8. var _ParseQuery = _interopRequireDefault(require("./ParseQuery"));
  9. var _ParseObject = _interopRequireDefault(require("./ParseObject"));
  10. var _ParseACL = _interopRequireDefault(require("./ParseACL"));
  11. function _interopRequireDefault(obj) {
  12. return obj && obj.__esModule ? obj : {
  13. default: obj
  14. };
  15. }
  16. function _defineProperty(obj, key, value) {
  17. if (key in obj) {
  18. Object.defineProperty(obj, key, {
  19. value: value,
  20. enumerable: true,
  21. configurable: true,
  22. writable: true
  23. });
  24. } else {
  25. obj[key] = value;
  26. }
  27. return obj;
  28. }
  29. const base64 = {
  30. decode: s => Uint8Array.from(atob(s), c => c.charCodeAt(0)),
  31. encode: b => btoa(String.fromCharCode(...new Uint8Array(b)))
  32. };
  33. class MoralisSol {
  34. static async authenticate(options) {
  35. var _user$get;
  36. const phantom = await MoralisSol.enable();
  37. if (!phantom) throw new Error('Phantom wallet not available');
  38. const solAddress = phantom.publicKey.toString();
  39. if (!solAddress) throw new Error('Address not found');
  40. const message = (options === null || options === void 0 ? void 0 : options.signingMessage) || MoralisSol.getSigningData();
  41. const data = await (0, _createSigningData.default)(message);
  42. const signature = await MoralisSol.sign(data);
  43. const user = await _ParseUser.default.logInWith('moralisSol', {
  44. authData: {
  45. id: solAddress,
  46. signature,
  47. data
  48. }
  49. });
  50. await user.setACL(new _ParseACL.default(user));
  51. if (!user) throw new Error('Could not get user');
  52. user.set('solAccounts', uniq([].concat([solAddress], (_user$get = user.get('solAccounts')) !== null && _user$get !== void 0 ? _user$get : [])));
  53. user.set('solAddress', solAddress);
  54. await user.save();
  55. return user;
  56. }
  57. static async link(account, options) {
  58. var _user$get2;
  59. const message = (options === null || options === void 0 ? void 0 : options.signingMessage) || MoralisSol.getSigningData();
  60. const user = await _ParseUser.default.current();
  61. const solAddress = account;
  62. const SolAddress = _ParseObject.default.extend('_SolAddress');
  63. const query = new _ParseQuery.default(SolAddress);
  64. const solAddressRecord = await query.get(solAddress).catch(() => null);
  65. if (!solAddressRecord) {
  66. const data = await (0, _createSigningData.default)(message);
  67. const signature = await MoralisSol.sign(solAddress, data);
  68. await user.linkWith('moralisSol', {
  69. authData: {
  70. id: solAddress,
  71. signature,
  72. data
  73. }
  74. });
  75. }
  76. user.set('SolAccounts', uniq([solAddress].concat((_user$get2 = user.get('SolAccounts')) !== null && _user$get2 !== void 0 ? _user$get2 : [])));
  77. user.set('solAddress', solAddress);
  78. await user.save();
  79. return user;
  80. }
  81. static async unlink(account) {
  82. var _user$get3;
  83. const accountsLower = account;
  84. const SolAddress = _ParseObject.default.extend('_SolAddress');
  85. const query = new _ParseQuery.default(SolAddress);
  86. const solAddressRecord = await query.get(accountsLower);
  87. await solAddressRecord.destroy();
  88. const user = await _ParseUser.default.current();
  89. const accounts = (_user$get3 = user.get('solAccounts')) !== null && _user$get3 !== void 0 ? _user$get3 : [];
  90. const nextAccounts = accounts.filter(v => v !== accountsLower);
  91. user.set('solAccounts', nextAccounts);
  92. user.set('solAddress', nextAccounts[0]);
  93. await user._unlinkFrom('moralisSol');
  94. await user.save();
  95. return user;
  96. }
  97. static async sign(message) {
  98. const phantom = await MoralisSol.enable();
  99. const encodedMessage = new TextEncoder().encode(message);
  100. const signedMessage = await phantom.signMessage(encodedMessage, 'utf8');
  101. return base64.encode(signedMessage.signature);
  102. }
  103. static getSigningData() {
  104. return 'Moralis Authentication';
  105. }
  106. }
  107. _defineProperty(MoralisSol, "enable", async () => {
  108. if (window && 'solana' in window) {
  109. const provider = window.solana;
  110. if (provider.isPhantom) {
  111. try {
  112. await provider.connect({
  113. onlyIfTrusted: true
  114. });
  115. } catch (error) {
  116. if (error.message === 'User rejected the request.') await provider.connect();else throw error;
  117. }
  118. return provider;
  119. }
  120. }
  121. throw new Error('Phantom wallet not available');
  122. });
  123. function toHexString(buffer
  124. /*: Buffer*/
  125. ) {
  126. return buffer.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');
  127. }
  128. function uniq(arr) {
  129. return arr.filter((v, i) => arr.indexOf(v) === i);
  130. }
  131. var _default = MoralisSol;
  132. exports.default = _default;