@web3auth/no-modal
Version:
Multi chain wallet aggregator for web3Auth
145 lines (141 loc) • 6.29 kB
JavaScript
;
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;