@meshconnect/uwc-injected-connector 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/injected-connector.d.ts +5 -1
- package/dist/injected-connector.d.ts.map +1 -1
- package/dist/injected-connector.js +8 -2
- package/dist/injected-connector.js.map +1 -1
- package/dist/services/connection-manager.d.ts +2 -2
- package/dist/services/connection-manager.d.ts.map +1 -1
- package/dist/services/connection-manager.js +2 -2
- package/dist/services/connection-manager.js.map +1 -1
- package/dist/services/ethereum/ethereum-transaction-builder.d.ts +14 -0
- package/dist/services/ethereum/ethereum-transaction-builder.d.ts.map +1 -0
- package/dist/services/ethereum/ethereum-transaction-builder.js +60 -0
- package/dist/services/ethereum/ethereum-transaction-builder.js.map +1 -0
- package/dist/services/ethereum/ethereum-transaction-service.d.ts +26 -0
- package/dist/services/ethereum/ethereum-transaction-service.d.ts.map +1 -0
- package/dist/services/ethereum/ethereum-transaction-service.js +145 -0
- package/dist/services/ethereum/ethereum-transaction-service.js.map +1 -0
- package/dist/services/ethereum/ethereum-wallet-service.d.ts +59 -0
- package/dist/services/ethereum/ethereum-wallet-service.d.ts.map +1 -0
- package/dist/services/ethereum/ethereum-wallet-service.js +173 -0
- package/dist/services/ethereum/ethereum-wallet-service.js.map +1 -0
- package/dist/services/ethereum-transaction-service.d.ts +3 -0
- package/dist/services/ethereum-transaction-service.d.ts.map +1 -1
- package/dist/services/ethereum-transaction-service.js +83 -34
- package/dist/services/ethereum-transaction-service.js.map +1 -1
- package/dist/services/index.d.ts +3 -3
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +3 -3
- package/dist/services/index.js.map +1 -1
- package/dist/services/solana/solana-transaction-builder.d.ts +20 -0
- package/dist/services/solana/solana-transaction-builder.d.ts.map +1 -0
- package/dist/services/solana/solana-transaction-builder.js +112 -0
- package/dist/services/solana/solana-transaction-builder.js.map +1 -0
- package/dist/services/solana/solana-transaction-service.d.ts +27 -0
- package/dist/services/solana/solana-transaction-service.d.ts.map +1 -0
- package/dist/services/solana/solana-transaction-service.js +136 -0
- package/dist/services/solana/solana-transaction-service.js.map +1 -0
- package/dist/services/solana/solana-wallet-service.d.ts +55 -0
- package/dist/services/solana/solana-wallet-service.d.ts.map +1 -0
- package/dist/services/solana/solana-wallet-service.js +129 -0
- package/dist/services/solana/solana-wallet-service.js.map +1 -0
- package/dist/services/transaction-service.d.ts +1 -13
- package/dist/services/transaction-service.d.ts.map +1 -1
- package/dist/services/transaction-service.js +4 -42
- package/dist/services/transaction-service.js.map +1 -1
- package/package.json +4 -2
- package/src/injected-connector.ts +13 -3
- package/src/services/connection-manager.ts +2 -2
- package/src/services/ethereum/ethereum-transaction-builder.ts +82 -0
- package/src/services/ethereum/ethereum-transaction-service.ts +192 -0
- package/src/services/{ethereum-wallet-service.ts → ethereum/ethereum-wallet-service.ts} +56 -3
- package/src/services/index.ts +3 -3
- package/src/services/solana/solana-transaction-builder.ts +214 -0
- package/src/services/solana/solana-transaction-service.ts +190 -0
- package/src/services/{solana-wallet-service.ts → solana/solana-wallet-service.ts} +2 -2
- package/src/services/transaction-service.ts +9 -67
- package/dist/injected-connector.old.d.ts +0 -44
- package/dist/injected-connector.old.d.ts.map +0 -1
- package/dist/injected-connector.old.js +0 -491
- package/dist/injected-connector.old.js.map +0 -1
- package/dist/providers/evm-provider.d.ts +0 -18
- package/dist/providers/evm-provider.d.ts.map +0 -1
- package/dist/providers/evm-provider.js +0 -86
- package/dist/providers/evm-provider.js.map +0 -1
- package/dist/providers/solana-provider.d.ts +0 -22
- package/dist/providers/solana-provider.d.ts.map +0 -1
- package/dist/providers/solana-provider.js +0 -137
- package/dist/providers/solana-provider.js.map +0 -1
- package/src/services/ethereum-transaction-service.ts +0 -196
- package/src/services/solana-transaction-service.ts +0 -68
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* EVM provider management
|
|
3
|
-
*/
|
|
4
|
-
import type { Network } from '@meshconnect/uwc-types';
|
|
5
|
-
export interface EVMProviderManager {
|
|
6
|
-
getProvider(eip155Name: string, injectedId?: string): any;
|
|
7
|
-
switchNetwork(provider: any, network: Network): Promise<void>;
|
|
8
|
-
}
|
|
9
|
-
export declare class EVMProvider implements EVMProviderManager {
|
|
10
|
-
private detectedEIP6963Wallets;
|
|
11
|
-
initialize(): Promise<void>;
|
|
12
|
-
getProvider(eip155Name: string, injectedId?: string): any;
|
|
13
|
-
switchNetwork(provider: any, network: Network): Promise<void>;
|
|
14
|
-
requestAccounts(provider: any): Promise<string[]>;
|
|
15
|
-
getAccounts(provider: any): Promise<string[]>;
|
|
16
|
-
getDetectedWallets(): any[];
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=evm-provider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"evm-provider.d.ts","sourceRoot":"","sources":["../../src/providers/evm-provider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAGrD,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;IACzD,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9D;AAED,qBAAa,WAAY,YAAW,kBAAkB;IACpD,OAAO,CAAC,sBAAsB,CAAY;IAEpC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,GAAG;IAuBnD,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA6C7D,eAAe,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAOjD,WAAW,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAOnD,kBAAkB,IAAI,GAAG,EAAE;CAG5B"}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* EVM provider management
|
|
3
|
-
*/
|
|
4
|
-
import { getAvailableWallets as getEIP6963Wallets } from '../eip6963-discovery';
|
|
5
|
-
export class EVMProvider {
|
|
6
|
-
detectedEIP6963Wallets = [];
|
|
7
|
-
async initialize() {
|
|
8
|
-
this.detectedEIP6963Wallets = await getEIP6963Wallets();
|
|
9
|
-
}
|
|
10
|
-
getProvider(eip155Name, injectedId) {
|
|
11
|
-
// First, try to find the provider from EIP-6963 discovered wallets
|
|
12
|
-
const detectedWallet = this.detectedEIP6963Wallets.find(wallet => wallet.name.toLowerCase() === eip155Name.toLowerCase());
|
|
13
|
-
if (detectedWallet && detectedWallet.provider) {
|
|
14
|
-
return detectedWallet.provider;
|
|
15
|
-
}
|
|
16
|
-
// Fall back to window.ethereum if no EIP-6963 provider found
|
|
17
|
-
const ethereum = window.ethereum;
|
|
18
|
-
if (ethereum) {
|
|
19
|
-
// Check if the specific wallet is available via injectedId
|
|
20
|
-
if (injectedId && !ethereum[injectedId]) {
|
|
21
|
-
throw new Error(`Wallet ${eip155Name} is not available`);
|
|
22
|
-
}
|
|
23
|
-
return ethereum;
|
|
24
|
-
}
|
|
25
|
-
throw new Error(`No provider found for ${eip155Name}`);
|
|
26
|
-
}
|
|
27
|
-
async switchNetwork(provider, network) {
|
|
28
|
-
// Get the current chain ID
|
|
29
|
-
const currentChainId = await provider.request({
|
|
30
|
-
method: 'eth_chainId'
|
|
31
|
-
});
|
|
32
|
-
// Parse the expected chain ID from the network ID (format: "eip155:1")
|
|
33
|
-
const expectedChainId = network.id.split(':')[1];
|
|
34
|
-
if (!expectedChainId) {
|
|
35
|
-
throw new Error('Invalid network ID format');
|
|
36
|
-
}
|
|
37
|
-
const expectedChainIdHex = '0x' + parseInt(expectedChainId).toString(16);
|
|
38
|
-
// Switch to the correct network if needed
|
|
39
|
-
if (currentChainId !== expectedChainIdHex) {
|
|
40
|
-
try {
|
|
41
|
-
await provider.request({
|
|
42
|
-
method: 'wallet_switchEthereumChain',
|
|
43
|
-
params: [{ chainId: expectedChainIdHex }]
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
catch (switchError) {
|
|
47
|
-
// This error code indicates that the chain has not been added
|
|
48
|
-
if (switchError.code === 4902) {
|
|
49
|
-
// Try to add the network
|
|
50
|
-
const networkParams = {
|
|
51
|
-
chainId: expectedChainIdHex,
|
|
52
|
-
chainName: network.name,
|
|
53
|
-
nativeCurrency: network.nativeCurrency,
|
|
54
|
-
rpcUrls: network.rpcUrls?.default.http || [],
|
|
55
|
-
blockExplorerUrls: network.blockExplorers
|
|
56
|
-
? [network.blockExplorers.default.url]
|
|
57
|
-
: []
|
|
58
|
-
};
|
|
59
|
-
await provider.request({
|
|
60
|
-
method: 'wallet_addEthereumChain',
|
|
61
|
-
params: [networkParams]
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
throw switchError;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
async requestAccounts(provider) {
|
|
71
|
-
const accounts = await provider.request({
|
|
72
|
-
method: 'eth_requestAccounts'
|
|
73
|
-
});
|
|
74
|
-
return accounts || [];
|
|
75
|
-
}
|
|
76
|
-
async getAccounts(provider) {
|
|
77
|
-
const accounts = await provider.request({
|
|
78
|
-
method: 'eth_accounts'
|
|
79
|
-
});
|
|
80
|
-
return accounts || [];
|
|
81
|
-
}
|
|
82
|
-
getDetectedWallets() {
|
|
83
|
-
return this.detectedEIP6963Wallets;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
//# sourceMappingURL=evm-provider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"evm-provider.js","sourceRoot":"","sources":["../../src/providers/evm-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Solana provider management
|
|
3
|
-
*/
|
|
4
|
-
import type { SolanaMetadata } from '@meshconnect/uwc-types';
|
|
5
|
-
export interface DetectedSolanaWallet {
|
|
6
|
-
name: string;
|
|
7
|
-
provider: any;
|
|
8
|
-
injectedId?: string;
|
|
9
|
-
}
|
|
10
|
-
export interface SolanaProviderManager {
|
|
11
|
-
getProvider(metadata?: SolanaMetadata): any;
|
|
12
|
-
detectWallets(): DetectedSolanaWallet[];
|
|
13
|
-
}
|
|
14
|
-
export declare class SolanaProvider implements SolanaProviderManager {
|
|
15
|
-
private detectedWallets;
|
|
16
|
-
initialize(): void;
|
|
17
|
-
getProvider(metadata?: SolanaMetadata): any;
|
|
18
|
-
detectWallets(): DetectedSolanaWallet[];
|
|
19
|
-
connect(provider: any): Promise<any>;
|
|
20
|
-
getDetectedWallets(): DetectedSolanaWallet[];
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=solana-provider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"solana-provider.d.ts","sourceRoot":"","sources":["../../src/providers/solana-provider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,GAAG,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,GAAG,CAAA;IAC3C,aAAa,IAAI,oBAAoB,EAAE,CAAA;CACxC;AAED,qBAAa,cAAe,YAAW,qBAAqB;IAC1D,OAAO,CAAC,eAAe,CAA6B;IAEpD,UAAU,IAAI,IAAI;IAIlB,WAAW,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,GAAG;IAsE3C,aAAa,IAAI,oBAAoB,EAAE;IAuEjC,OAAO,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAW1C,kBAAkB,IAAI,oBAAoB,EAAE;CAG7C"}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Solana provider management
|
|
3
|
-
*/
|
|
4
|
-
export class SolanaProvider {
|
|
5
|
-
detectedWallets = [];
|
|
6
|
-
initialize() {
|
|
7
|
-
this.detectedWallets = this.detectWallets();
|
|
8
|
-
}
|
|
9
|
-
getProvider(metadata) {
|
|
10
|
-
if (!metadata || !metadata.injectedId) {
|
|
11
|
-
// Fallback to checking common Solana provider locations
|
|
12
|
-
if (window.solana)
|
|
13
|
-
return window.solana;
|
|
14
|
-
if (window.phantom?.solana)
|
|
15
|
-
return window.phantom.solana;
|
|
16
|
-
if (window.solflare?.solana)
|
|
17
|
-
return window.solflare.solana;
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
20
|
-
const { injectedId, ignoredInjectedIds } = metadata;
|
|
21
|
-
// Helper function to validate provider
|
|
22
|
-
const isValidProvider = (provider) => {
|
|
23
|
-
if (!provider)
|
|
24
|
-
return false;
|
|
25
|
-
// Check if provider has ignored IDs (meaning it's the wrong wallet)
|
|
26
|
-
if (ignoredInjectedIds && ignoredInjectedIds.length > 0) {
|
|
27
|
-
for (const ignoredId of ignoredInjectedIds) {
|
|
28
|
-
if (provider[ignoredId] === true) {
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
// Check if provider has the required injectedId property
|
|
34
|
-
// For example, if injectedId is 'isPhantom', check provider.isPhantom === true
|
|
35
|
-
if (injectedId.startsWith('is')) {
|
|
36
|
-
return provider[injectedId] === true;
|
|
37
|
-
}
|
|
38
|
-
// For non-boolean identifiers, just check existence
|
|
39
|
-
return !!provider[injectedId];
|
|
40
|
-
};
|
|
41
|
-
// Strategy 1: Check window[walletName].solana (e.g., window.phantom.solana)
|
|
42
|
-
const walletName = injectedId.replace(/^is/, '').toLowerCase();
|
|
43
|
-
const nestedProvider = window[walletName]?.solana;
|
|
44
|
-
if (nestedProvider && isValidProvider(nestedProvider)) {
|
|
45
|
-
return nestedProvider;
|
|
46
|
-
}
|
|
47
|
-
// Strategy 2: Check window[walletName] directly (e.g., window.solflare)
|
|
48
|
-
const directProvider = window[walletName];
|
|
49
|
-
if (directProvider && isValidProvider(directProvider)) {
|
|
50
|
-
return directProvider;
|
|
51
|
-
}
|
|
52
|
-
// Strategy 3: Check window.solana with validation
|
|
53
|
-
if (window.solana && isValidProvider(window.solana)) {
|
|
54
|
-
return window.solana;
|
|
55
|
-
}
|
|
56
|
-
// Strategy 4: For wallets that might inject differently (e.g., window.trustwallet.solana)
|
|
57
|
-
// Check various common patterns
|
|
58
|
-
const commonPatterns = [
|
|
59
|
-
window[`${walletName}wallet`]?.solana,
|
|
60
|
-
window[`${walletName}Wallet`]?.solana,
|
|
61
|
-
window[walletName.replace('wallet', '')]?.solana
|
|
62
|
-
];
|
|
63
|
-
for (const provider of commonPatterns) {
|
|
64
|
-
if (provider && isValidProvider(provider)) {
|
|
65
|
-
return provider;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
detectWallets() {
|
|
71
|
-
const wallets = [];
|
|
72
|
-
// Check common Solana wallet locations and identify them
|
|
73
|
-
const checkProvider = (provider, name, injectedId) => {
|
|
74
|
-
if (provider && typeof provider.connect === 'function') {
|
|
75
|
-
if (injectedId) {
|
|
76
|
-
wallets.push({ name, provider, injectedId });
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
wallets.push({ name, provider });
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
// Check window.solana and identify the wallet type
|
|
84
|
-
if (window.solana) {
|
|
85
|
-
const provider = window.solana;
|
|
86
|
-
let name = 'Solana Wallet';
|
|
87
|
-
let injectedId;
|
|
88
|
-
if (provider.isPhantom) {
|
|
89
|
-
name = 'Phantom';
|
|
90
|
-
injectedId = 'isPhantom';
|
|
91
|
-
}
|
|
92
|
-
else if (provider.isSolflare) {
|
|
93
|
-
name = 'Solflare';
|
|
94
|
-
injectedId = 'isSolflare';
|
|
95
|
-
}
|
|
96
|
-
else if (provider.isTrust || provider.isTrustWallet) {
|
|
97
|
-
name = 'Trust Wallet';
|
|
98
|
-
injectedId = provider.isTrust ? 'isTrust' : 'isTrustWallet';
|
|
99
|
-
}
|
|
100
|
-
else if (provider.isExodus) {
|
|
101
|
-
name = 'Exodus';
|
|
102
|
-
injectedId = 'isExodus';
|
|
103
|
-
}
|
|
104
|
-
checkProvider(provider, name, injectedId);
|
|
105
|
-
}
|
|
106
|
-
// Check nested providers
|
|
107
|
-
if (window.phantom?.solana) {
|
|
108
|
-
checkProvider(window.phantom.solana, 'Phantom', 'isPhantom');
|
|
109
|
-
}
|
|
110
|
-
if (window.solflare) {
|
|
111
|
-
checkProvider(window.solflare, 'Solflare', 'isSolflare');
|
|
112
|
-
}
|
|
113
|
-
if (window.trustwallet?.solana) {
|
|
114
|
-
checkProvider(window.trustwallet.solana, 'Trust Wallet', 'isTrust');
|
|
115
|
-
}
|
|
116
|
-
if (window.exodus?.solana) {
|
|
117
|
-
checkProvider(window.exodus.solana, 'Exodus', 'isExodus');
|
|
118
|
-
}
|
|
119
|
-
// Remove duplicates based on provider reference
|
|
120
|
-
const uniqueWallets = wallets.filter((wallet, index, self) => index === self.findIndex(w => w.provider === wallet.provider));
|
|
121
|
-
return uniqueWallets;
|
|
122
|
-
}
|
|
123
|
-
async connect(provider) {
|
|
124
|
-
if (!provider.isConnected) {
|
|
125
|
-
const response = await provider.connect();
|
|
126
|
-
if (!response || !response.publicKey) {
|
|
127
|
-
throw new Error('Failed to connect to Solana wallet');
|
|
128
|
-
}
|
|
129
|
-
return response;
|
|
130
|
-
}
|
|
131
|
-
return { publicKey: provider.publicKey };
|
|
132
|
-
}
|
|
133
|
-
getDetectedWallets() {
|
|
134
|
-
return this.detectedWallets;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
//# sourceMappingURL=solana-provider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"solana-provider.js","sourceRoot":"","sources":["../../src/providers/solana-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import { ethers } from 'ethers'
|
|
2
|
-
import type { EthereumProvider } from '../eip6963-discovery'
|
|
3
|
-
import type {
|
|
4
|
-
EVMGasConfig,
|
|
5
|
-
EVMNativeTransferRequest,
|
|
6
|
-
EVMContractCallRequest,
|
|
7
|
-
EVMBatchTransactionRequest,
|
|
8
|
-
EVMCapabilities,
|
|
9
|
-
BatchTransactionResult
|
|
10
|
-
} from '@meshconnect/uwc-types'
|
|
11
|
-
import { parseError } from '../utils/error-utils'
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Service for handling Ethereum/EVM transaction operations
|
|
15
|
-
*/
|
|
16
|
-
export class EthereumTransactionService {
|
|
17
|
-
/**
|
|
18
|
-
* Send native token transfer (ETH, BNB, MATIC, etc.)
|
|
19
|
-
*/
|
|
20
|
-
async sendNativeTransfer(
|
|
21
|
-
provider: EthereumProvider,
|
|
22
|
-
request: EVMNativeTransferRequest
|
|
23
|
-
): Promise<string> {
|
|
24
|
-
try {
|
|
25
|
-
// Get current chain ID
|
|
26
|
-
const chainIdHex = await provider.request({
|
|
27
|
-
method: 'eth_chainId'
|
|
28
|
-
})
|
|
29
|
-
const chainId = parseInt(chainIdHex, 16)
|
|
30
|
-
|
|
31
|
-
// Create ethers provider and signer
|
|
32
|
-
const ethersProvider = new ethers.BrowserProvider(provider)
|
|
33
|
-
const signer = await ethersProvider.getSigner(request.from)
|
|
34
|
-
|
|
35
|
-
// Verify network hasn't changed
|
|
36
|
-
const network = await ethersProvider.getNetwork()
|
|
37
|
-
if (Number(network.chainId) !== chainId) {
|
|
38
|
-
throw new Error('Network changed during transaction setup')
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Build transaction
|
|
42
|
-
const tx = await signer.sendTransaction({
|
|
43
|
-
to: request.to,
|
|
44
|
-
value: request.amount,
|
|
45
|
-
...this.formatGasConfig(request.gasConfig)
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
// Wait for confirmation
|
|
49
|
-
const receipt = await tx.wait()
|
|
50
|
-
return receipt ? receipt.hash : ''
|
|
51
|
-
} catch (error) {
|
|
52
|
-
parseError(error)
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Send smart contract transaction (including ERC-20 transfers)
|
|
58
|
-
*/
|
|
59
|
-
async sendContractCall(
|
|
60
|
-
provider: EthereumProvider,
|
|
61
|
-
request: EVMContractCallRequest
|
|
62
|
-
): Promise<string> {
|
|
63
|
-
try {
|
|
64
|
-
// Get current chain ID
|
|
65
|
-
const chainIdHex = await provider.request({
|
|
66
|
-
method: 'eth_chainId'
|
|
67
|
-
})
|
|
68
|
-
const chainId = parseInt(chainIdHex, 16)
|
|
69
|
-
|
|
70
|
-
// Create ethers provider and signer
|
|
71
|
-
const ethersProvider = new ethers.BrowserProvider(provider)
|
|
72
|
-
const signer = await ethersProvider.getSigner(request.from)
|
|
73
|
-
|
|
74
|
-
// Verify network hasn't changed
|
|
75
|
-
const network = await ethersProvider.getNetwork()
|
|
76
|
-
if (Number(network.chainId) !== chainId) {
|
|
77
|
-
throw new Error('Network changed during transaction setup')
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Create contract instance
|
|
81
|
-
const contract = new ethers.Contract(
|
|
82
|
-
request.contractAddress,
|
|
83
|
-
request.abi,
|
|
84
|
-
signer
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
// Build transaction options
|
|
88
|
-
const txOptions: ethers.Overrides = {
|
|
89
|
-
...this.formatGasConfig(request.gasConfig)
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Add value for payable functions
|
|
93
|
-
if (request.value) {
|
|
94
|
-
txOptions.value = request.value
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Call the contract function
|
|
98
|
-
const contractFunction = contract[request.functionName]
|
|
99
|
-
if (!contractFunction) {
|
|
100
|
-
throw new Error(
|
|
101
|
-
`Function ${request.functionName} not found in contract`
|
|
102
|
-
)
|
|
103
|
-
}
|
|
104
|
-
const tx = await contractFunction(...request.args, txOptions)
|
|
105
|
-
|
|
106
|
-
// Wait for confirmation
|
|
107
|
-
const receipt = await tx.wait()
|
|
108
|
-
return receipt ? receipt.hash : ''
|
|
109
|
-
} catch (error) {
|
|
110
|
-
parseError(error)
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Send batch of transactions (EIP-5792)
|
|
116
|
-
*/
|
|
117
|
-
async sendBatch(
|
|
118
|
-
provider: EthereumProvider,
|
|
119
|
-
request: EVMBatchTransactionRequest
|
|
120
|
-
): Promise<string> {
|
|
121
|
-
try {
|
|
122
|
-
const ethersProvider = new ethers.BrowserProvider(provider)
|
|
123
|
-
|
|
124
|
-
// Send batch transaction
|
|
125
|
-
const response: { id: string } = await ethersProvider.send(
|
|
126
|
-
'wallet_sendCalls',
|
|
127
|
-
[request]
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
// Poll for completion
|
|
131
|
-
let result: BatchTransactionResult
|
|
132
|
-
do {
|
|
133
|
-
result = await ethersProvider.send('wallet_getCallsStatus', [
|
|
134
|
-
response.id
|
|
135
|
-
])
|
|
136
|
-
|
|
137
|
-
// Wait 1 second if still pending
|
|
138
|
-
if (result.status === 100) {
|
|
139
|
-
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
140
|
-
}
|
|
141
|
-
} while (result.status === 100)
|
|
142
|
-
|
|
143
|
-
// Check if successful
|
|
144
|
-
if (result.status !== 200) {
|
|
145
|
-
throw new Error('Batch transaction failed')
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Return first transaction hash
|
|
149
|
-
const firstReceipt = result.receipts.find(r => r)
|
|
150
|
-
if (!firstReceipt) {
|
|
151
|
-
throw new Error('No transaction receipt found')
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
return firstReceipt.transactionHash
|
|
155
|
-
} catch (error) {
|
|
156
|
-
parseError(error)
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Get wallet capabilities (EIP-5792 support)
|
|
162
|
-
*/
|
|
163
|
-
async getCapabilities(
|
|
164
|
-
provider: EthereumProvider,
|
|
165
|
-
from: string,
|
|
166
|
-
chainId: string
|
|
167
|
-
): Promise<EVMCapabilities> {
|
|
168
|
-
const ethersProvider = new ethers.BrowserProvider(provider)
|
|
169
|
-
const capabilities = await ethersProvider.send('wallet_getCapabilities', [
|
|
170
|
-
from,
|
|
171
|
-
[chainId]
|
|
172
|
-
])
|
|
173
|
-
return capabilities[chainId] || {}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Helper to format gas configuration for ethers
|
|
178
|
-
*/
|
|
179
|
-
private formatGasConfig(gasConfig?: EVMGasConfig): ethers.Overrides {
|
|
180
|
-
const txOptions: ethers.Overrides = {}
|
|
181
|
-
|
|
182
|
-
if (gasConfig?.gasLimit) {
|
|
183
|
-
txOptions.gasLimit = BigInt(Math.floor(gasConfig.gasLimit))
|
|
184
|
-
}
|
|
185
|
-
if (gasConfig?.maxFeePerGas) {
|
|
186
|
-
txOptions.maxFeePerGas = BigInt(Math.floor(gasConfig.maxFeePerGas))
|
|
187
|
-
}
|
|
188
|
-
if (gasConfig?.maxPriorityFeePerGas) {
|
|
189
|
-
txOptions.maxPriorityFeePerGas = BigInt(
|
|
190
|
-
Math.floor(gasConfig.maxPriorityFeePerGas)
|
|
191
|
-
)
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
return txOptions
|
|
195
|
-
}
|
|
196
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
PublicKey,
|
|
3
|
-
SystemProgram,
|
|
4
|
-
Transaction,
|
|
5
|
-
Connection
|
|
6
|
-
} from '@solana/web3.js'
|
|
7
|
-
import type { WalletAdapter } from '@solana/wallet-adapter-base'
|
|
8
|
-
import type { SolanaNativeTransferRequest, NetworkRpcMap, NetworkId } from '@meshconnect/uwc-types'
|
|
9
|
-
import { parseError } from '../utils/error-utils'
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Service for handling Solana transaction operations
|
|
13
|
-
*/
|
|
14
|
-
export class SolanaTransactionService {
|
|
15
|
-
private networkRpcMap: NetworkRpcMap
|
|
16
|
-
|
|
17
|
-
constructor(networkRpcMap: NetworkRpcMap = {}) {
|
|
18
|
-
this.networkRpcMap = networkRpcMap
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Send native SOL transfer
|
|
23
|
-
*/
|
|
24
|
-
async sendNativeTransfer(
|
|
25
|
-
adapter: WalletAdapter,
|
|
26
|
-
request: SolanaNativeTransferRequest,
|
|
27
|
-
networkId?: NetworkId
|
|
28
|
-
): Promise<string> {
|
|
29
|
-
try {
|
|
30
|
-
if (!adapter.publicKey) {
|
|
31
|
-
throw new Error('Wallet not connected')
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Verify the from address matches connected wallet
|
|
35
|
-
if (adapter.publicKey.toBase58() !== request.from) {
|
|
36
|
-
throw new Error('From address does not match connected wallet')
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Blockhash is required
|
|
40
|
-
if (!request.blockhash) {
|
|
41
|
-
throw new Error('Blockhash is required for Solana transactions')
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Create transaction
|
|
45
|
-
const transaction = new Transaction().add(
|
|
46
|
-
SystemProgram.transfer({
|
|
47
|
-
fromPubkey: new PublicKey(request.from),
|
|
48
|
-
toPubkey: new PublicKey(request.to),
|
|
49
|
-
lamports: Number(request.amount)
|
|
50
|
-
})
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
transaction.recentBlockhash = request.blockhash
|
|
54
|
-
transaction.feePayer = adapter.publicKey
|
|
55
|
-
|
|
56
|
-
// Get RPC URL from the network RPC map or fall back to public endpoint
|
|
57
|
-
const rpcUrl = networkId && this.networkRpcMap[networkId]
|
|
58
|
-
? this.networkRpcMap[networkId]
|
|
59
|
-
: 'https://api.mainnet-beta.solana.com'
|
|
60
|
-
const connection = new Connection(rpcUrl)
|
|
61
|
-
|
|
62
|
-
const signature = await adapter.sendTransaction(transaction, connection)
|
|
63
|
-
return signature
|
|
64
|
-
} catch (error) {
|
|
65
|
-
parseError(error)
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|