@multiplatform.one/web3 7.18.0 → 7.19.0
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/README.md +60 -0
- package/dist/cjs/clients/adapter.cjs +33 -0
- package/dist/cjs/clients/adapter.native.js +36 -0
- package/dist/cjs/clients/adapter.native.js.map +1 -0
- package/dist/cjs/clients/bitcoin.cjs +46 -0
- package/dist/cjs/clients/bitcoin.native.js +51 -0
- package/dist/cjs/clients/bitcoin.native.js.map +1 -0
- package/dist/cjs/clients/connector.cjs +45 -0
- package/dist/cjs/clients/connector.native.js +49 -0
- package/dist/cjs/clients/connector.native.js.map +1 -0
- package/dist/cjs/clients/evm.cjs +171 -0
- package/dist/cjs/clients/evm.native.js +198 -0
- package/dist/cjs/clients/evm.native.js.map +1 -0
- package/dist/cjs/clients/gpg.cjs +31 -0
- package/dist/cjs/clients/gpg.native.js +34 -0
- package/dist/cjs/clients/gpg.native.js.map +1 -0
- package/dist/cjs/clients/hooks.cjs +78 -0
- package/dist/cjs/clients/hooks.native.js +85 -0
- package/dist/cjs/clients/hooks.native.js.map +1 -0
- package/dist/cjs/clients/index.cjs +49 -0
- package/dist/cjs/clients/index.native.js +52 -0
- package/dist/cjs/clients/index.native.js.map +1 -0
- package/dist/cjs/clients/solana.cjs +322 -0
- package/dist/cjs/clients/solana.native.js +511 -0
- package/dist/cjs/clients/solana.native.js.map +1 -0
- package/dist/cjs/clients/solanaMessage.cjs +38 -0
- package/dist/cjs/clients/solanaMessage.native.js +44 -0
- package/dist/cjs/clients/solanaMessage.native.js.map +1 -0
- package/dist/cjs/clients/sui.cjs +46 -0
- package/dist/cjs/clients/sui.native.js +51 -0
- package/dist/cjs/clients/sui.native.js.map +1 -0
- package/dist/cjs/clients/types.cjs +37 -0
- package/dist/cjs/clients/types.native.js +160 -0
- package/dist/cjs/clients/types.native.js.map +1 -0
- package/dist/cjs/clients/useSolanaClient.cjs +50 -0
- package/dist/cjs/clients/useSolanaClient.native.js +57 -0
- package/dist/cjs/clients/useSolanaClient.native.js.map +1 -0
- package/dist/cjs/clients/walletStandard.cjs +63 -0
- package/dist/cjs/clients/walletStandard.native.js +71 -0
- package/dist/cjs/clients/walletStandard.native.js.map +1 -0
- package/dist/cjs/connectkit/connectors/walletAdapterConnector.cjs +2 -0
- package/dist/cjs/connectkit/connectors/walletAdapterConnector.native.js +2 -0
- package/dist/cjs/connectkit/connectors/walletAdapterConnector.native.js.map +1 -1
- package/dist/cjs/connectkit/siwe/SIWEProvider.cjs +4 -5
- package/dist/cjs/connectkit/siwe/SIWEProvider.native.js +4 -5
- package/dist/cjs/connectkit/siwe/SIWEProvider.native.js.map +1 -1
- package/dist/cjs/index.cjs +2 -1
- package/dist/cjs/index.native.js +1 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/solana.cjs +41 -0
- package/dist/cjs/solana.native.js +44 -0
- package/dist/cjs/solana.native.js.map +1 -0
- package/dist/esm/clients/adapter.mjs +8 -0
- package/dist/esm/clients/adapter.mjs.map +1 -0
- package/dist/esm/clients/adapter.native.js +8 -0
- package/dist/esm/clients/adapter.native.js.map +1 -0
- package/dist/esm/clients/bitcoin.mjs +21 -0
- package/dist/esm/clients/bitcoin.mjs.map +1 -0
- package/dist/esm/clients/bitcoin.native.js +23 -0
- package/dist/esm/clients/bitcoin.native.js.map +1 -0
- package/dist/esm/clients/connector.mjs +20 -0
- package/dist/esm/clients/connector.mjs.map +1 -0
- package/dist/esm/clients/connector.native.js +21 -0
- package/dist/esm/clients/connector.native.js.map +1 -0
- package/dist/esm/clients/evm.mjs +146 -0
- package/dist/esm/clients/evm.mjs.map +1 -0
- package/dist/esm/clients/evm.native.js +170 -0
- package/dist/esm/clients/evm.native.js.map +1 -0
- package/dist/esm/clients/gpg.mjs +3 -0
- package/dist/esm/clients/gpg.mjs.map +1 -0
- package/dist/esm/clients/gpg.native.js +3 -0
- package/dist/esm/clients/gpg.native.js.map +1 -0
- package/dist/esm/clients/hooks.mjs +51 -0
- package/dist/esm/clients/hooks.mjs.map +1 -0
- package/dist/esm/clients/hooks.native.js +55 -0
- package/dist/esm/clients/hooks.native.js.map +1 -0
- package/dist/esm/clients/index.mjs +11 -0
- package/dist/esm/clients/index.mjs.map +1 -0
- package/dist/esm/clients/index.native.js +11 -0
- package/dist/esm/clients/index.native.js.map +1 -0
- package/dist/esm/clients/solana.mjs +289 -0
- package/dist/esm/clients/solana.mjs.map +1 -0
- package/dist/esm/clients/solana.native.js +475 -0
- package/dist/esm/clients/solana.native.js.map +1 -0
- package/dist/esm/clients/solanaMessage.mjs +13 -0
- package/dist/esm/clients/solanaMessage.mjs.map +1 -0
- package/dist/esm/clients/solanaMessage.native.js +16 -0
- package/dist/esm/clients/solanaMessage.native.js.map +1 -0
- package/dist/esm/clients/sui.mjs +21 -0
- package/dist/esm/clients/sui.mjs.map +1 -0
- package/dist/esm/clients/sui.native.js +23 -0
- package/dist/esm/clients/sui.native.js.map +1 -0
- package/dist/esm/clients/types.mjs +12 -0
- package/dist/esm/clients/types.mjs.map +1 -0
- package/dist/esm/clients/types.native.js +132 -0
- package/dist/esm/clients/types.native.js.map +1 -0
- package/dist/esm/clients/useSolanaClient.mjs +25 -0
- package/dist/esm/clients/useSolanaClient.mjs.map +1 -0
- package/dist/esm/clients/useSolanaClient.native.js +29 -0
- package/dist/esm/clients/useSolanaClient.native.js.map +1 -0
- package/dist/esm/clients/walletStandard.mjs +33 -0
- package/dist/esm/clients/walletStandard.mjs.map +1 -0
- package/dist/esm/clients/walletStandard.native.js +38 -0
- package/dist/esm/clients/walletStandard.native.js.map +1 -0
- package/dist/esm/connectkit/connectors/walletAdapterConnector.mjs +2 -0
- package/dist/esm/connectkit/connectors/walletAdapterConnector.mjs.map +1 -1
- package/dist/esm/connectkit/connectors/walletAdapterConnector.native.js +2 -0
- package/dist/esm/connectkit/connectors/walletAdapterConnector.native.js.map +1 -1
- package/dist/esm/connectkit/siwe/SIWEProvider.mjs +4 -5
- package/dist/esm/connectkit/siwe/SIWEProvider.mjs.map +1 -1
- package/dist/esm/connectkit/siwe/SIWEProvider.native.js +4 -5
- package/dist/esm/connectkit/siwe/SIWEProvider.native.js.map +1 -1
- package/dist/esm/index.mjs +1 -0
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +1 -0
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/solana.mjs +5 -0
- package/dist/esm/solana.mjs.map +1 -0
- package/dist/esm/solana.native.js +5 -0
- package/dist/esm/solana.native.js.map +1 -0
- package/dist/jsx/clients/adapter.mjs +8 -0
- package/dist/jsx/clients/adapter.mjs.map +1 -0
- package/dist/jsx/clients/adapter.native.js +36 -0
- package/dist/jsx/clients/adapter.native.js.map +1 -0
- package/dist/jsx/clients/bitcoin.mjs +21 -0
- package/dist/jsx/clients/bitcoin.mjs.map +1 -0
- package/dist/jsx/clients/bitcoin.native.js +51 -0
- package/dist/jsx/clients/bitcoin.native.js.map +1 -0
- package/dist/jsx/clients/connector.mjs +20 -0
- package/dist/jsx/clients/connector.mjs.map +1 -0
- package/dist/jsx/clients/connector.native.js +49 -0
- package/dist/jsx/clients/connector.native.js.map +1 -0
- package/dist/jsx/clients/evm.mjs +146 -0
- package/dist/jsx/clients/evm.mjs.map +1 -0
- package/dist/jsx/clients/evm.native.js +198 -0
- package/dist/jsx/clients/evm.native.js.map +1 -0
- package/dist/jsx/clients/gpg.mjs +3 -0
- package/dist/jsx/clients/gpg.mjs.map +1 -0
- package/dist/jsx/clients/gpg.native.js +34 -0
- package/dist/jsx/clients/gpg.native.js.map +1 -0
- package/dist/jsx/clients/hooks.mjs +51 -0
- package/dist/jsx/clients/hooks.mjs.map +1 -0
- package/dist/jsx/clients/hooks.native.js +85 -0
- package/dist/jsx/clients/hooks.native.js.map +1 -0
- package/dist/jsx/clients/index.mjs +11 -0
- package/dist/jsx/clients/index.mjs.map +1 -0
- package/dist/jsx/clients/index.native.js +52 -0
- package/dist/jsx/clients/index.native.js.map +1 -0
- package/dist/jsx/clients/solana.mjs +289 -0
- package/dist/jsx/clients/solana.mjs.map +1 -0
- package/dist/jsx/clients/solana.native.js +511 -0
- package/dist/jsx/clients/solana.native.js.map +1 -0
- package/dist/jsx/clients/solanaMessage.mjs +13 -0
- package/dist/jsx/clients/solanaMessage.mjs.map +1 -0
- package/dist/jsx/clients/solanaMessage.native.js +44 -0
- package/dist/jsx/clients/solanaMessage.native.js.map +1 -0
- package/dist/jsx/clients/sui.mjs +21 -0
- package/dist/jsx/clients/sui.mjs.map +1 -0
- package/dist/jsx/clients/sui.native.js +51 -0
- package/dist/jsx/clients/sui.native.js.map +1 -0
- package/dist/jsx/clients/types.mjs +12 -0
- package/dist/jsx/clients/types.mjs.map +1 -0
- package/dist/jsx/clients/types.native.js +160 -0
- package/dist/jsx/clients/types.native.js.map +1 -0
- package/dist/jsx/clients/useSolanaClient.mjs +25 -0
- package/dist/jsx/clients/useSolanaClient.mjs.map +1 -0
- package/dist/jsx/clients/useSolanaClient.native.js +57 -0
- package/dist/jsx/clients/useSolanaClient.native.js.map +1 -0
- package/dist/jsx/clients/walletStandard.mjs +33 -0
- package/dist/jsx/clients/walletStandard.mjs.map +1 -0
- package/dist/jsx/clients/walletStandard.native.js +71 -0
- package/dist/jsx/clients/walletStandard.native.js.map +1 -0
- package/dist/jsx/connectkit/connectors/walletAdapterConnector.mjs +2 -0
- package/dist/jsx/connectkit/connectors/walletAdapterConnector.mjs.map +1 -1
- package/dist/jsx/connectkit/connectors/walletAdapterConnector.native.js +2 -0
- package/dist/jsx/connectkit/connectors/walletAdapterConnector.native.js.map +1 -1
- package/dist/jsx/connectkit/siwe/SIWEProvider.mjs +4 -5
- package/dist/jsx/connectkit/siwe/SIWEProvider.mjs.map +1 -1
- package/dist/jsx/connectkit/siwe/SIWEProvider.native.js +4 -5
- package/dist/jsx/connectkit/siwe/SIWEProvider.native.js.map +1 -1
- package/dist/jsx/index.js +1 -0
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +1 -0
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +1 -0
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/solana.mjs +5 -0
- package/dist/jsx/solana.mjs.map +1 -0
- package/dist/jsx/solana.native.js +44 -0
- package/dist/jsx/solana.native.js.map +1 -0
- package/package.json +13 -6
- package/src/clients/adapter.ts +13 -0
- package/src/clients/bitcoin.ts +42 -0
- package/src/clients/connector.spec.ts +78 -0
- package/src/clients/connector.ts +36 -0
- package/src/clients/evm.spec.ts +265 -0
- package/src/clients/evm.ts +223 -0
- package/src/clients/gpg.spec.ts +169 -0
- package/src/clients/gpg.ts +8 -0
- package/src/clients/hooks.spec.tsx +113 -0
- package/src/clients/hooks.ts +51 -0
- package/src/clients/index.ts +40 -0
- package/src/clients/solana.spec.ts +444 -0
- package/src/clients/solana.ts +465 -0
- package/src/clients/solanaMessage.ts +34 -0
- package/src/clients/sui.ts +42 -0
- package/src/clients/types.ts +40 -0
- package/src/clients/useSolanaClient.ts +31 -0
- package/src/clients/walletStandard.ts +87 -0
- package/src/connectkit/connectors/walletAdapterConnector.ts +2 -0
- package/src/connectkit/siwe/SIWEProvider.spec.tsx +112 -0
- package/src/connectkit/siwe/SIWEProvider.tsx +6 -10
- package/src/index.ts +4 -0
- package/src/solana.ts +30 -0
- package/types/clients/adapter.d.ts +5 -0
- package/types/clients/adapter.d.ts.map +1 -0
- package/types/clients/bitcoin.d.ts +21 -0
- package/types/clients/bitcoin.d.ts.map +1 -0
- package/types/clients/connector.d.ts +14 -0
- package/types/clients/connector.d.ts.map +1 -0
- package/types/clients/evm.d.ts +68 -0
- package/types/clients/evm.d.ts.map +1 -0
- package/types/clients/gpg.d.ts +2 -0
- package/types/clients/gpg.d.ts.map +1 -0
- package/types/clients/hooks.d.ts +16 -0
- package/types/clients/hooks.d.ts.map +1 -0
- package/types/clients/index.d.ts +10 -0
- package/types/clients/index.d.ts.map +1 -0
- package/types/clients/solana.d.ts +111 -0
- package/types/clients/solana.d.ts.map +1 -0
- package/types/clients/solanaMessage.d.ts +18 -0
- package/types/clients/solanaMessage.d.ts.map +1 -0
- package/types/clients/sui.d.ts +21 -0
- package/types/clients/sui.d.ts.map +1 -0
- package/types/clients/types.d.ts +27 -0
- package/types/clients/types.d.ts.map +1 -0
- package/types/clients/useSolanaClient.d.ts +11 -0
- package/types/clients/useSolanaClient.d.ts.map +1 -0
- package/types/clients/walletStandard.d.ts +63 -0
- package/types/clients/walletStandard.d.ts.map +1 -0
- package/types/connectkit/connectors/walletAdapterConnector.d.ts.map +1 -1
- package/types/connectkit/siwe/SIWEProvider.d.ts.map +1 -1
- package/types/index.d.ts +1 -0
- package/types/index.d.ts.map +1 -1
- package/types/solana.d.ts +4 -0
- package/types/solana.d.ts.map +1 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all) __defProp(target, name, {
|
|
7
|
+
get: all[name],
|
|
8
|
+
enumerable: true
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
14
|
+
get: () => from[key],
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
|
|
21
|
+
value: true
|
|
22
|
+
}), mod);
|
|
23
|
+
var solana_exports = {};
|
|
24
|
+
__export(solana_exports, {
|
|
25
|
+
SolanaConfirmationError: () => SolanaConfirmationError,
|
|
26
|
+
connectSolanaWallet: () => connectSolanaWallet,
|
|
27
|
+
findSolanaSigner: () => findSolanaSigner,
|
|
28
|
+
injectedSolanaSigner: () => injectedSolanaSigner,
|
|
29
|
+
solanaChainFromRpcUrl: () => solanaChainFromRpcUrl,
|
|
30
|
+
solanaClient: () => solanaClient,
|
|
31
|
+
solanaRpcUrls: () => solanaRpcUrls,
|
|
32
|
+
standardSolanaSigner: () => standardSolanaSigner,
|
|
33
|
+
transferSolInstruction: () => transferSolInstruction
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(solana_exports);
|
|
36
|
+
var import_kit = require("@solana/kit");
|
|
37
|
+
var import_types = require("./types.cjs");
|
|
38
|
+
var import_walletStandard = require("./walletStandard.cjs");
|
|
39
|
+
const solanaRpcUrls = {
|
|
40
|
+
"solana:mainnet": "https://api.mainnet-beta.solana.com",
|
|
41
|
+
"solana:devnet": "https://api.devnet.solana.com",
|
|
42
|
+
"solana:testnet": "https://api.testnet.solana.com",
|
|
43
|
+
"solana:localnet": "http://127.0.0.1:8899"
|
|
44
|
+
};
|
|
45
|
+
function solanaChainFromRpcUrl(rpcUrl) {
|
|
46
|
+
if (!rpcUrl) return "solana:mainnet";
|
|
47
|
+
if (/devnet/i.test(rpcUrl)) return "solana:devnet";
|
|
48
|
+
if (/testnet/i.test(rpcUrl)) return "solana:testnet";
|
|
49
|
+
if (/\/\/(localhost|127\.0\.0\.1|10\.0\.2\.2|\[::1\])[:/]/i.test(rpcUrl)) return "solana:localnet";
|
|
50
|
+
return "solana:mainnet";
|
|
51
|
+
}
|
|
52
|
+
class SolanaConfirmationError extends Error {
|
|
53
|
+
constructor(signature, reason, detail) {
|
|
54
|
+
const mayStillLand = reason === "timeout";
|
|
55
|
+
super(`solana transaction ${signature} ${detail}; ${mayStillLand ? "it may still land, so do not resend it until its blockhash expires" : "it will not land, so it is safe to retry"}`);
|
|
56
|
+
this.signature = signature;
|
|
57
|
+
this.reason = reason;
|
|
58
|
+
this.name = "SolanaConfirmationError";
|
|
59
|
+
this.mayStillLand = mayStillLand;
|
|
60
|
+
}
|
|
61
|
+
signature;
|
|
62
|
+
reason;
|
|
63
|
+
mayStillLand;
|
|
64
|
+
}
|
|
65
|
+
const capabilities = ["signMessage", "signTransaction", "signAndSendTransaction", "sendTransaction"];
|
|
66
|
+
const systemProgram = (0, import_kit.address)("11111111111111111111111111111111");
|
|
67
|
+
const maxU64 = 0xffffffffffffffffn;
|
|
68
|
+
function transferSolInstruction(from, to, lamports) {
|
|
69
|
+
if (lamports < 0n || lamports > maxU64) {
|
|
70
|
+
throw new RangeError(`lamports must fit a u64, got ${lamports}`);
|
|
71
|
+
}
|
|
72
|
+
const data = new Uint8Array(12);
|
|
73
|
+
data[0] = 2;
|
|
74
|
+
let value = lamports;
|
|
75
|
+
for (let i = 4; i < 12; i++) {
|
|
76
|
+
data[i] = Number(value & 0xffn);
|
|
77
|
+
value >>= 8n;
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
programAddress: systemProgram,
|
|
81
|
+
accounts: [{
|
|
82
|
+
address: from,
|
|
83
|
+
role: import_kit.AccountRole.WRITABLE_SIGNER
|
|
84
|
+
}, {
|
|
85
|
+
address: to,
|
|
86
|
+
role: import_kit.AccountRole.WRITABLE
|
|
87
|
+
}],
|
|
88
|
+
data
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const toWire = transaction => transaction instanceof Uint8Array ? transaction : Uint8Array.from((0, import_kit.getTransactionEncoder)().encode(transaction));
|
|
92
|
+
const fromWire = bytes => (0, import_kit.getTransactionDecoder)().decode(bytes);
|
|
93
|
+
const toSignature = bytes => (0, import_kit.getBase58Decoder)().decode(bytes);
|
|
94
|
+
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
95
|
+
const lastValidBlockHeightOf = transaction => {
|
|
96
|
+
if (transaction instanceof Uint8Array) return void 0;
|
|
97
|
+
const lifetime = transaction.lifetimeConstraint;
|
|
98
|
+
return lifetime?.lastValidBlockHeight;
|
|
99
|
+
};
|
|
100
|
+
const reached = (status, commitment) => status?.confirmationStatus === "finalized" || commitment === "confirmed" && status?.confirmationStatus === "confirmed";
|
|
101
|
+
function solanaClient(config) {
|
|
102
|
+
const {
|
|
103
|
+
signer
|
|
104
|
+
} = config;
|
|
105
|
+
const chain = config.chain ?? solanaChainFromRpcUrl(config.rpcUrl);
|
|
106
|
+
const rpc = config.rpc ?? (0, import_kit.createSolanaRpc)(config.rpcUrl ?? solanaRpcUrls[chain]);
|
|
107
|
+
const owner = (0, import_kit.address)(signer.address);
|
|
108
|
+
const signTransaction = async transaction => fromWire(await signer.signTransaction(toWire(transaction)));
|
|
109
|
+
const broadcast = transaction => {
|
|
110
|
+
const tx = transaction instanceof Uint8Array ? fromWire(transaction) : transaction;
|
|
111
|
+
return rpc.sendTransaction((0, import_kit.getBase64EncodedWireTransaction)(tx), {
|
|
112
|
+
encoding: "base64"
|
|
113
|
+
}).send();
|
|
114
|
+
};
|
|
115
|
+
const sendTransaction = async transaction => ({
|
|
116
|
+
signature: await broadcast(transaction),
|
|
117
|
+
lastValidBlockHeight: lastValidBlockHeightOf(transaction)
|
|
118
|
+
});
|
|
119
|
+
const signAndSendTransaction = async transaction => {
|
|
120
|
+
const lastValidBlockHeight = lastValidBlockHeightOf(transaction);
|
|
121
|
+
const wire = toWire(transaction);
|
|
122
|
+
if (signer.signAndSendTransaction) {
|
|
123
|
+
try {
|
|
124
|
+
const signature = toSignature(await signer.signAndSendTransaction(wire));
|
|
125
|
+
return {
|
|
126
|
+
signature,
|
|
127
|
+
lastValidBlockHeight
|
|
128
|
+
};
|
|
129
|
+
} catch (error) {
|
|
130
|
+
if (!(error instanceof import_types.UnsupportedClientMethodError)) throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
signature: await broadcast(await signer.signTransaction(wire)),
|
|
135
|
+
lastValidBlockHeight
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
const statusOf = async signature => {
|
|
139
|
+
const {
|
|
140
|
+
value
|
|
141
|
+
} = await rpc.getSignatureStatuses([signature], {
|
|
142
|
+
searchTransactionHistory: true
|
|
143
|
+
}).send();
|
|
144
|
+
const status = value[0];
|
|
145
|
+
if (status?.err) {
|
|
146
|
+
throw new SolanaConfirmationError(signature, "failed", `failed on chain: ${JSON.stringify(status.err, (_, v) => typeof v === "bigint" ? `${v}` : v)}`);
|
|
147
|
+
}
|
|
148
|
+
return status;
|
|
149
|
+
};
|
|
150
|
+
return {
|
|
151
|
+
family: "solana",
|
|
152
|
+
address: owner,
|
|
153
|
+
chainId: chain,
|
|
154
|
+
capabilities,
|
|
155
|
+
rpc,
|
|
156
|
+
signer,
|
|
157
|
+
async signMessage(message) {
|
|
158
|
+
const bytes = typeof message === "string" ? new TextEncoder().encode(message) : message;
|
|
159
|
+
return (0, import_kit.getBase58Decoder)().decode(await signer.signMessage(bytes));
|
|
160
|
+
},
|
|
161
|
+
signTransaction,
|
|
162
|
+
signAndSendTransaction,
|
|
163
|
+
sendTransaction,
|
|
164
|
+
async confirmTransaction(submission, options = {}) {
|
|
165
|
+
const {
|
|
166
|
+
signature,
|
|
167
|
+
lastValidBlockHeight: submitted
|
|
168
|
+
} = typeof submission === "string" ? {
|
|
169
|
+
signature: submission
|
|
170
|
+
} : submission;
|
|
171
|
+
const {
|
|
172
|
+
commitment = "confirmed",
|
|
173
|
+
lastValidBlockHeight = submitted,
|
|
174
|
+
timeoutMs = 9e4,
|
|
175
|
+
pollMs = 500
|
|
176
|
+
} = options;
|
|
177
|
+
const deadline = Date.now() + timeoutMs;
|
|
178
|
+
for (;;) {
|
|
179
|
+
if (reached(await statusOf(signature), commitment)) return;
|
|
180
|
+
if (lastValidBlockHeight !== void 0) {
|
|
181
|
+
const height = await rpc.getBlockHeight({
|
|
182
|
+
commitment
|
|
183
|
+
}).send();
|
|
184
|
+
if (height > lastValidBlockHeight) {
|
|
185
|
+
const status = await statusOf(signature);
|
|
186
|
+
if (reached(status, commitment)) return;
|
|
187
|
+
if (!status) {
|
|
188
|
+
throw new SolanaConfirmationError(signature, "expired", `expired: block height ${height} passed ${lastValidBlockHeight}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
} else if (Date.now() > deadline) {
|
|
192
|
+
throw new SolanaConfirmationError(signature, "timeout", `not ${commitment} after ${timeoutMs}ms`);
|
|
193
|
+
}
|
|
194
|
+
await sleep(pollMs);
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
async getBalance(target) {
|
|
198
|
+
const {
|
|
199
|
+
value
|
|
200
|
+
} = await rpc.getBalance(target ? (0, import_kit.address)(target) : owner).send();
|
|
201
|
+
return value;
|
|
202
|
+
},
|
|
203
|
+
async transferSol({
|
|
204
|
+
to,
|
|
205
|
+
lamports
|
|
206
|
+
}) {
|
|
207
|
+
const {
|
|
208
|
+
value: latestBlockhash
|
|
209
|
+
} = await rpc.getLatestBlockhash().send();
|
|
210
|
+
const message = (0, import_kit.pipe)((0, import_kit.createTransactionMessage)({
|
|
211
|
+
version: 0
|
|
212
|
+
}), m => (0, import_kit.setTransactionMessageFeePayer)(owner, m), m => (0, import_kit.setTransactionMessageLifetimeUsingBlockhash)(latestBlockhash, m), m => (0, import_kit.appendTransactionMessageInstruction)(transferSolInstruction(owner, (0, import_kit.address)(to), lamports), m));
|
|
213
|
+
const {
|
|
214
|
+
signature
|
|
215
|
+
} = await signAndSendTransaction((0, import_kit.compileTransaction)(message));
|
|
216
|
+
return {
|
|
217
|
+
signature,
|
|
218
|
+
lastValidBlockHeight: latestBlockhash.lastValidBlockHeight
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function walletFeature(wallet, name) {
|
|
224
|
+
const feature = wallet.features[name];
|
|
225
|
+
if (!feature) {
|
|
226
|
+
throw new import_types.UnsupportedClientMethodError("solana", name, `${wallet.name} does not implement it`);
|
|
227
|
+
}
|
|
228
|
+
return feature;
|
|
229
|
+
}
|
|
230
|
+
function standardSolanaSigner(wallet, account, chain = "solana:mainnet") {
|
|
231
|
+
const signer = {
|
|
232
|
+
address: account.address,
|
|
233
|
+
async signMessage(message) {
|
|
234
|
+
const feature = walletFeature(wallet, import_walletStandard.SolanaSignMessage);
|
|
235
|
+
const [output] = await feature.signMessage({
|
|
236
|
+
account,
|
|
237
|
+
message
|
|
238
|
+
});
|
|
239
|
+
return output.signature;
|
|
240
|
+
},
|
|
241
|
+
async signTransaction(transaction) {
|
|
242
|
+
const feature = walletFeature(wallet, import_walletStandard.SolanaSignTransaction);
|
|
243
|
+
const [output] = await feature.signTransaction({
|
|
244
|
+
account,
|
|
245
|
+
transaction,
|
|
246
|
+
chain
|
|
247
|
+
});
|
|
248
|
+
return output.signedTransaction;
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
if (wallet.features[import_walletStandard.SolanaSignAndSendTransaction]) {
|
|
252
|
+
signer.signAndSendTransaction = async transaction => {
|
|
253
|
+
const feature = walletFeature(wallet, import_walletStandard.SolanaSignAndSendTransaction);
|
|
254
|
+
const [output] = await feature.signAndSendTransaction({
|
|
255
|
+
account,
|
|
256
|
+
transaction,
|
|
257
|
+
chain
|
|
258
|
+
});
|
|
259
|
+
return output.signature;
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
return signer;
|
|
263
|
+
}
|
|
264
|
+
function findSolanaSigner(owner, chain) {
|
|
265
|
+
for (const wallet of (0, import_walletStandard.getSolanaWallets)()) {
|
|
266
|
+
const account = wallet.accounts.find(a => a.address === owner);
|
|
267
|
+
if (account) return standardSolanaSigner(wallet, account, chain);
|
|
268
|
+
}
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
async function connectSolanaWallet(options = {}) {
|
|
272
|
+
const wallets = (0, import_walletStandard.getSolanaWallets)();
|
|
273
|
+
const wallet = options.wallet ? wallets.find(w => w.name.toLowerCase() === options.wallet?.toLowerCase()) : wallets[0];
|
|
274
|
+
if (!wallet) {
|
|
275
|
+
throw new Error(options.wallet ? `No Solana wallet named ${options.wallet} is installed` : "No Solana wallet found. Install Phantom, Solflare or Backpack.");
|
|
276
|
+
}
|
|
277
|
+
const {
|
|
278
|
+
accounts
|
|
279
|
+
} = await walletFeature(wallet, import_walletStandard.StandardConnect).connect({
|
|
280
|
+
silent: options.silent
|
|
281
|
+
});
|
|
282
|
+
const chain = options.chain ?? "solana:mainnet";
|
|
283
|
+
const account = accounts.find(a => a.chains.includes(chain)) ?? accounts[0];
|
|
284
|
+
if (!account) throw new Error(`${wallet.name} returned no Solana account`);
|
|
285
|
+
return standardSolanaSigner(wallet, account, chain);
|
|
286
|
+
}
|
|
287
|
+
const utf8 = bytes => {
|
|
288
|
+
try {
|
|
289
|
+
return new TextDecoder("utf-8", {
|
|
290
|
+
fatal: true
|
|
291
|
+
}).decode(bytes);
|
|
292
|
+
} catch {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
function injectedSolanaSigner(adapter, chain) {
|
|
297
|
+
const owner = adapter.address;
|
|
298
|
+
if (!owner) throw new Error("injectedSolanaSigner: connect a Solana wallet first");
|
|
299
|
+
const standard = method => {
|
|
300
|
+
const signer = findSolanaSigner(owner, chain);
|
|
301
|
+
if (!signer) {
|
|
302
|
+
throw new import_types.UnsupportedClientMethodError("solana", method, `no Wallet Standard wallet holds ${owner}; connect Phantom, Solflare or Backpack`);
|
|
303
|
+
}
|
|
304
|
+
return signer;
|
|
305
|
+
};
|
|
306
|
+
return {
|
|
307
|
+
address: owner,
|
|
308
|
+
async signMessage(message) {
|
|
309
|
+
const text = utf8(message);
|
|
310
|
+
if (text === null) return standard("signMessage").signMessage(message);
|
|
311
|
+
return Uint8Array.from((0, import_kit.getBase58Encoder)().encode(await adapter.signMessage(text)));
|
|
312
|
+
},
|
|
313
|
+
signTransaction: async transaction => standard("signTransaction").signTransaction(transaction),
|
|
314
|
+
async signAndSendTransaction(transaction) {
|
|
315
|
+
const signer = standard("signAndSendTransaction");
|
|
316
|
+
if (!signer.signAndSendTransaction) {
|
|
317
|
+
throw new import_types.UnsupportedClientMethodError("solana", "signAndSendTransaction");
|
|
318
|
+
}
|
|
319
|
+
return signer.signAndSendTransaction(transaction);
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
}
|