UNPKG

@web3auth/no-modal

Version:
145 lines (141 loc) 6.29 kB
'use strict'; var _objectSpread = require('@babel/runtime/helpers/objectSpread2'); var _defineProperty = require('@babel/runtime/helpers/defineProperty'); var kit = require('@solana/kit'); var walletStandardFeatures = require('@solana/wallet-standard-features'); var features = require('@wallet-standard/features'); var wsEmbed = require('@web3auth/ws-embed'); require('@segment/analytics-next'); require('../../base/loglevel.js'); require('@toruslabs/base-controllers'); require('@toruslabs/session-manager'); require('@web3auth/auth'); require('../../base/errors/index.js'); require('@toruslabs/constants'); require('@toruslabs/http-helpers'); var constants = require('../../base/constants.js'); var index = require('../../base/wallet/index.js'); require('../../base/connector/connectorStatus.js'); require('../../base/connector/constants.js'); require('jwt-decode'); require('../../base/plugin/errors.js'); require('../../base/plugin/IPlugin.js'); var walletConnectV2Utils = require('./walletConnectV2Utils.js'); var solana = require('../../base/wallet/solana.js'); const base58Encoder = kit.getBase58Encoder(); const base58Decoder = kit.getBase58Decoder(); const base64Decoder = kit.getBase64Decoder(); const base64Encoder = kit.getBase64Encoder(); const transactionDecoder = kit.getTransactionDecoder(); /** * WCSolanaWallet implements the Wallet Standard interface by routing directly to * a WalletConnect SignClient — no intermediate JRPC engine needed. */ class WCSolanaWallet { constructor(connector, wcCaipChainId, chainIdentifier, accounts) { _defineProperty(this, "version", "1.0.0"); _defineProperty(this, "name", "WalletConnect"); _defineProperty(this, "icon", index.WEB3AUTH_ICON); _defineProperty(this, "chains", void 0); _defineProperty(this, "features", void 0); _defineProperty(this, "_accounts", void 0); _defineProperty(this, "_listeners", {}); this.chains = chainIdentifier ? [chainIdentifier] : []; this._accounts = accounts; this.features = { [features.StandardConnect]: { version: "1.0.0", connect: async () => ({ accounts: this._accounts }) }, [features.StandardDisconnect]: { version: "1.0.0", disconnect: async () => {} }, [features.StandardEvents]: { version: "1.0.0", on: (event, listener) => { var _this$_listeners, _this$_listeners$even; ((_this$_listeners$even = (_this$_listeners = this._listeners)[event]) !== null && _this$_listeners$even !== void 0 ? _this$_listeners$even : _this$_listeners[event] = new Set()).add(listener); return () => this._listeners[event].delete(listener); } }, [walletStandardFeatures.SolanaSignAndSendTransaction]: { version: "1.0.0", supportedTransactionVersions: ["legacy", 0], signAndSendTransaction: async (...inputs) => { return Promise.all(inputs.map(async input => { const base64Tx = base64Decoder.decode(input.transaction); const result = await walletConnectV2Utils.sendJrpcRequest(connector, wcCaipChainId, "solana_signAndSendTransaction", { transaction: base64Tx }); return { signature: new Uint8Array(base58Encoder.encode(result.signature)) }; })); } }, [walletStandardFeatures.SolanaSignMessage]: { version: "1.0.0", signMessage: async (...inputs) => { return Promise.all(inputs.map(async input => { const base58Message = base58Decoder.decode(new Uint8Array(input.message)); const result = await walletConnectV2Utils.sendJrpcRequest(connector, wcCaipChainId, wsEmbed.SOLANA_METHOD_TYPES.SIGN_MESSAGE, { message: base58Message }); return { signedMessage: new Uint8Array(input.message), signature: new Uint8Array(base58Encoder.encode(result.signature)) }; })); } }, [walletStandardFeatures.SolanaSignTransaction]: { version: "1.0.0", supportedTransactionVersions: ["legacy", 0], signTransaction: async (...inputs) => { return Promise.all(inputs.map(async input => { const base64Tx = base64Decoder.decode(input.transaction); const result = await walletConnectV2Utils.sendJrpcRequest(connector, wcCaipChainId, wsEmbed.SOLANA_METHOD_TYPES.SIGN_TRANSACTION, { transaction: base64Tx }); // Reconstruct signed transaction by inserting signature into decoded tx const sigBytes = new Uint8Array(base58Encoder.encode(result.signature)); const decodedTx = transactionDecoder.decode(input.transaction); const signedTx = _objectSpread(_objectSpread({}, decodedTx), {}, { signatures: _objectSpread(_objectSpread({}, decodedTx.signatures), {}, { [input.account.address]: sigBytes }) }); const signedBase64 = kit.getBase64EncodedWireTransaction(signedTx); return { signedTransaction: new Uint8Array(base64Encoder.encode(signedBase64)) }; })); } } }; } get accounts() { return this._accounts; } /** * Creates a WCSolanaWallet by reading accounts from the active WC session. */ static async create(connector, chainConfig) { const chainIdentifier = solana.getSolanaChainByChainConfig(chainConfig); const wcCaipChainId = `solana:${constants.SOLANA_CAIP_CHAIN_MAP[chainConfig.chainId]}`; const addresses = await walletConnectV2Utils.getSolanaAccounts(connector); if (!addresses.length) return null; const accountFeatures = [walletStandardFeatures.SolanaSignAndSendTransaction, walletStandardFeatures.SolanaSignMessage, walletStandardFeatures.SolanaSignTransaction]; const accounts = addresses.map(address => ({ address, publicKey: new Uint8Array(base58Encoder.encode(address)), chains: chainIdentifier ? [chainIdentifier] : [], features: accountFeatures })); return new WCSolanaWallet(connector, wcCaipChainId, chainIdentifier, accounts); } } exports.WCSolanaWallet = WCSolanaWallet;