@layerzerolabs/lz-corekit-solana 2.3.8

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/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ # @layerzerolabs/lz-corekit-solana
2
+
3
+ ## 2.3.8
4
+
5
+ ### Patch Changes
6
+
7
+ - e0f5d04: deploy contracts to Ebi mainnet
8
+ - Updated dependencies [e0f5d04]
9
+ - @layerzerolabs/lz-core@2.3.8
10
+ - @layerzerolabs/tron-utilities@2.3.8
11
+ - @layerzerolabs/lz-utilities@2.3.8
12
+ - @layerzerolabs/lz-aptos-sdk-v1@2.3.8
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # @layerzerolabs/lz-corekit
package/dist/index.cjs ADDED
@@ -0,0 +1,231 @@
1
+ 'use strict';
2
+
3
+ var web3_js = require('@solana/web3.js');
4
+ var utils = require('ethers/lib/utils');
5
+ var lzCore = require('@layerzerolabs/lz-core');
6
+ var common = require('@coral-xyz/anchor/dist/cjs/utils/common');
7
+ var bip39 = require('bip39');
8
+ var ed25519HdKey = require('ed25519-hd-key');
9
+
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
26
+ }
27
+
28
+ var bip39__namespace = /*#__PURE__*/_interopNamespace(bip39);
29
+
30
+ // src/providers/solana.ts
31
+ var SolanaProvider = class _SolanaProvider {
32
+ constructor(url) {
33
+ this.nativeProvider = new web3_js.Connection(url, "confirmed");
34
+ }
35
+ static from(source) {
36
+ if (typeof source === "string") {
37
+ return new _SolanaProvider(source);
38
+ } else {
39
+ throw new Error("Invalid parameters");
40
+ }
41
+ }
42
+ get native() {
43
+ return this.nativeProvider;
44
+ }
45
+ async getBalance(address) {
46
+ return this.nativeProvider.getBalance(new web3_js.PublicKey(address)).then((balance) => balance.toString());
47
+ }
48
+ async getBlock(slot) {
49
+ const response = await this.nativeProvider.getParsedBlock(parseInt(slot.toString()), {
50
+ commitment: "confirmed"
51
+ });
52
+ return lzCore.Block.from(response);
53
+ }
54
+ async getBlockNumber() {
55
+ return this.nativeProvider.getBlockHeight({ commitment: "confirmed" });
56
+ }
57
+ async getSlot(finality) {
58
+ return this.nativeProvider.getSlot(finality);
59
+ }
60
+ async getBlockTimestamp(slot) {
61
+ const t = await this.nativeProvider.getBlockTime(parseInt(slot.toString()));
62
+ if (t === null) {
63
+ throw new Error("Block timestamp not available");
64
+ }
65
+ return t;
66
+ }
67
+ /**
68
+ *
69
+ * @param txHash string The transaction hash is TransactionSignature in Solana
70
+ * @returns TransactionResponse
71
+ */
72
+ async getTransaction(txHash) {
73
+ const response = await this.nativeProvider.getParsedTransaction(txHash, {
74
+ commitment: "confirmed"
75
+ });
76
+ return lzCore.TransactionResponse.from(response);
77
+ }
78
+ async getTransactionReceipt(txHash) {
79
+ const response = await this.nativeProvider.getParsedTransaction(txHash, {
80
+ commitment: "confirmed"
81
+ });
82
+ if (response === null) {
83
+ throw new Error("Transaction not found");
84
+ }
85
+ return lzCore.TransactionReceipt.from(response);
86
+ }
87
+ // eslint-disable-next-line @typescript-eslint/require-await
88
+ async getTransactionCount(_addressOrName, _blockTag) {
89
+ await Promise.resolve();
90
+ throw new Error("Method not implemented.");
91
+ }
92
+ async getBlockWithTransactions(blockTag) {
93
+ if (typeof blockTag === "string") {
94
+ blockTag = parseInt(blockTag);
95
+ }
96
+ const response = await this.nativeProvider.getBlock(blockTag, { transactionDetails: "full" });
97
+ if (response === null) {
98
+ throw new Error("Block not found");
99
+ }
100
+ return lzCore.BlockWithTransactions.from(response);
101
+ }
102
+ async sendTransaction(transaction, sendOptions) {
103
+ const _transaction = transaction.signed;
104
+ const response = await this.nativeProvider.sendRawTransaction(Buffer.from(utils.arrayify(_transaction)), sendOptions);
105
+ return lzCore.TransactionPending.from(response);
106
+ }
107
+ async sendAndConfirm(transaction, opts) {
108
+ const _transaction = transaction.signed;
109
+ const response = await web3_js.sendAndConfirmRawTransaction(
110
+ this.nativeProvider,
111
+ Buffer.from(utils.arrayify(_transaction)),
112
+ opts
113
+ );
114
+ return lzCore.TransactionReceipt.from(response);
115
+ }
116
+ };
117
+ var SolanaSigner = class {
118
+ constructor(keypair, ecdsaPrivateKey) {
119
+ this.keypair = keypair;
120
+ this.ecdsaPrivateKey = ecdsaPrivateKey;
121
+ }
122
+ static from(source, path) {
123
+ if (source instanceof web3_js.Keypair) {
124
+ return new this(source);
125
+ } else if (typeof source === "string") {
126
+ const { ecdsaPrivateKey, keypair } = getKeypair(source, path);
127
+ return new this(keypair, ecdsaPrivateKey);
128
+ } else {
129
+ throw new Error("Invalid parameters");
130
+ }
131
+ }
132
+ get native() {
133
+ return this.keypair;
134
+ }
135
+ connect(provider) {
136
+ if (!(provider.native instanceof web3_js.Connection)) {
137
+ throw new Error("Only @solana/web3.js Connection is supported.");
138
+ }
139
+ this.provider = provider.native;
140
+ return this;
141
+ }
142
+ async getAddress() {
143
+ return Promise.resolve(this.keypair.publicKey.toBase58());
144
+ }
145
+ get address() {
146
+ return this.publicKey.toBase58();
147
+ }
148
+ get publicKey() {
149
+ return this.keypair.publicKey;
150
+ }
151
+ get secretKey() {
152
+ return this.keypair.secretKey;
153
+ }
154
+ get ECDSAPrivateKey() {
155
+ if (!this.ecdsaPrivateKey) {
156
+ throw new Error("ECDSA private key is not available");
157
+ }
158
+ return this.ecdsaPrivateKey;
159
+ }
160
+ async sendAndConfirm(transaction, opts) {
161
+ const provider = this.assetAndGetProvider();
162
+ const stx = utils.arrayify(transaction.signed);
163
+ const response = await web3_js.sendAndConfirmRawTransaction(provider, Buffer.from(stx), opts);
164
+ return lzCore.TransactionReceipt.from(response);
165
+ }
166
+ async sendTransaction(transaction, sendOptions) {
167
+ const provider = this.assetAndGetProvider();
168
+ const stx = utils.arrayify(transaction.signed);
169
+ const response = await provider.sendRawTransaction(stx, sendOptions);
170
+ return lzCore.TransactionPending.from(response);
171
+ }
172
+ async signTransaction(transaction, opts) {
173
+ const populatedTransaction = transaction.request;
174
+ const provider = this.assetAndGetProvider();
175
+ const tx = this.buildTxByPopulatedTx(populatedTransaction);
176
+ if (common.isVersionedTransaction(tx)) {
177
+ if (populatedTransaction.signers) {
178
+ tx.sign(populatedTransaction.signers);
179
+ }
180
+ tx.sign([this.keypair]);
181
+ } else {
182
+ tx.feePayer = tx.feePayer ?? this.publicKey;
183
+ tx.recentBlockhash = (await provider.getLatestBlockhash(opts?.preflightCommitment)).blockhash;
184
+ if (populatedTransaction.signers) {
185
+ for (const signer of populatedTransaction.signers) {
186
+ tx.partialSign(signer);
187
+ }
188
+ }
189
+ if (populatedTransaction.lzSingers) {
190
+ for (const signer of populatedTransaction.lzSingers) {
191
+ signer.partialSign(tx);
192
+ }
193
+ }
194
+ tx.partialSign(this.keypair);
195
+ }
196
+ const response = utils.hexlify(tx.serialize());
197
+ return lzCore.SignedTransaction.from(response);
198
+ }
199
+ async signBuffer(_buffer) {
200
+ await Promise.resolve();
201
+ throw new Error("Method not implemented.");
202
+ }
203
+ partialSign(tx) {
204
+ if (common.isVersionedTransaction(tx)) {
205
+ tx.sign([this.keypair]);
206
+ } else {
207
+ tx.partialSign(this.keypair);
208
+ }
209
+ }
210
+ buildTxByPopulatedTx(populatedTransaction) {
211
+ const tx = new web3_js.Transaction();
212
+ tx.add(...populatedTransaction.instructions);
213
+ return tx;
214
+ }
215
+ assetAndGetProvider() {
216
+ if (!this.provider) {
217
+ throw new Error("Signer was not connected to a provider, did you forgot to connect to provider?");
218
+ }
219
+ return this.provider;
220
+ }
221
+ };
222
+ function getKeypair(mnemonic, path = "m/44'/501'/0'/0'") {
223
+ const seed = bip39__namespace.mnemonicToSeedSync(mnemonic, "");
224
+ const privateKey = ed25519HdKey.derivePath(path, seed.toString("hex")).key;
225
+ return { ecdsaPrivateKey: utils.hexlify(privateKey), keypair: web3_js.Keypair.fromSeed(privateKey) };
226
+ }
227
+
228
+ exports.SolanaProvider = SolanaProvider;
229
+ exports.SolanaSigner = SolanaSigner;
230
+ //# sourceMappingURL=out.js.map
231
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/solana.ts","../src/signers/solana.ts"],"names":["Connection","sendAndConfirmRawTransaction","arrayify","SignedTransaction","TransactionPending","TransactionReceipt"],"mappings":"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","sourcesContent":["import {\n ConfirmOptions,\n Connection,\n Finality,\n GetVersionedTransactionConfig,\n ParsedTransactionWithMeta,\n PublicKey,\n SendOptions,\n TransactionSignature,\n sendAndConfirmRawTransaction,\n} from '@solana/web3.js'\nimport { arrayify } from 'ethers/lib/utils'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\n\nexport class SolanaProvider implements Provider {\n nativeProvider: Connection\n\n constructor(url: string) {\n this.nativeProvider = new Connection(url, 'confirmed')\n }\n\n static from(url: string): SolanaProvider\n\n static from(source: string): SolanaProvider {\n if (typeof source === 'string') {\n return new SolanaProvider(source)\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.nativeProvider\n }\n\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.getBalance(new PublicKey(address)).then((balance) => balance.toString())\n }\n\n async getBlock(slot: string | number): Promise<Block> {\n const response = await this.nativeProvider.getParsedBlock(parseInt(slot.toString()), {\n commitment: 'confirmed',\n })\n return Block.from(response)\n }\n\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.getBlockHeight({ commitment: 'confirmed' })\n }\n\n async getSlot(finality?: Finality): Promise<number> {\n return this.nativeProvider.getSlot(finality)\n }\n\n async getBlockTimestamp(slot: string | number): Promise<number> {\n const t = await this.nativeProvider.getBlockTime(parseInt(slot.toString()))\n if (t === null) {\n throw new Error('Block timestamp not available')\n }\n return t\n }\n\n /**\n *\n * @param txHash string The transaction hash is TransactionSignature in Solana\n * @returns TransactionResponse\n */\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response: ParsedTransactionWithMeta | null = await this.nativeProvider.getParsedTransaction(txHash, {\n commitment: 'confirmed',\n })\n return TransactionResponse.from(response)\n }\n\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n const response: ParsedTransactionWithMeta | null = await this.nativeProvider.getParsedTransaction(txHash, {\n commitment: 'confirmed',\n } satisfies GetVersionedTransactionConfig)\n if (response === null) {\n throw new Error('Transaction not found')\n }\n return TransactionReceipt.from(response)\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n if (typeof blockTag === 'string') {\n blockTag = parseInt(blockTag)\n }\n const response = await this.nativeProvider.getBlock(blockTag, { transactionDetails: 'full' })\n if (response === null) {\n throw new Error('Block not found')\n }\n return BlockWithTransactions.from(response)\n }\n\n async sendTransaction(transaction: SignedTransaction, sendOptions?: SendOptions): Promise<TransactionPending> {\n const _transaction = transaction.signed as string\n\n const response = await this.nativeProvider.sendRawTransaction(Buffer.from(arrayify(_transaction)), sendOptions)\n return TransactionPending.from(response)\n }\n\n async sendAndConfirm(transaction: SignedTransaction, opts?: ConfirmOptions): Promise<TransactionReceipt> {\n const _transaction = transaction.signed as string\n const response: TransactionSignature = await sendAndConfirmRawTransaction(\n this.nativeProvider,\n Buffer.from(arrayify(_transaction)),\n opts\n )\n return TransactionReceipt.from(response)\n }\n}\n","import { isVersionedTransaction } from '@coral-xyz/anchor/dist/cjs/utils/common'\nimport {\n ConfirmOptions,\n Connection,\n Keypair,\n Signer as NativeSolanaSigner,\n PublicKey,\n SendOptions,\n Transaction,\n TransactionInstruction,\n VersionedTransaction,\n sendAndConfirmRawTransaction,\n} from '@solana/web3.js'\nimport * as bip39 from 'bip39'\nimport { derivePath } from 'ed25519-hd-key'\nimport { arrayify, hexlify } from 'ethers/lib/utils'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\n\nexport interface SolanaPopulatedTransaction {\n instructions: TransactionInstruction[]\n signers?: NativeSolanaSigner[]\n lzSingers?: SolanaSigner[]\n table?: PublicKey\n}\n\nexport class SolanaSigner implements Signer {\n private readonly keypair: Keypair\n private provider?: Connection\n private ecdsaPrivateKey?: string\n\n private constructor(keypair: Keypair, ecdsaPrivateKey?: string) {\n this.keypair = keypair\n this.ecdsaPrivateKey = ecdsaPrivateKey\n }\n\n static from(source: Keypair): SolanaSigner\n static from(mnemonic: string, path: string): SolanaSigner\n\n static from(source: Keypair | string, path?: string): SolanaSigner {\n if (source instanceof Keypair) {\n return new this(source)\n } else if (typeof source === 'string') {\n const { ecdsaPrivateKey, keypair } = getKeypair(source, path)\n return new this(keypair, ecdsaPrivateKey)\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.keypair\n }\n\n connect(provider: Provider): this {\n if (!(provider.native instanceof Connection)) {\n throw new Error('Only @solana/web3.js Connection is supported.')\n }\n this.provider = provider.native\n return this\n }\n\n async getAddress(): Promise<string> {\n return Promise.resolve(this.keypair.publicKey.toBase58())\n }\n\n get address(): string {\n return this.publicKey.toBase58()\n }\n\n get publicKey(): PublicKey {\n return this.keypair.publicKey\n }\n\n get secretKey(): Uint8Array {\n return this.keypair.secretKey\n }\n\n get ECDSAPrivateKey(): string {\n if (!this.ecdsaPrivateKey) {\n throw new Error('ECDSA private key is not available')\n }\n return this.ecdsaPrivateKey\n }\n\n async sendAndConfirm(transaction: SignedTransaction, opts?: ConfirmOptions): Promise<TransactionReceipt> {\n const provider = this.assetAndGetProvider()\n const stx = arrayify(transaction.signed as string)\n const response = await sendAndConfirmRawTransaction(provider, Buffer.from(stx), opts)\n return TransactionReceipt.from(response)\n }\n\n async sendTransaction(transaction: SignedTransaction, sendOptions?: SendOptions): Promise<TransactionPending> {\n const provider = this.assetAndGetProvider()\n const stx = arrayify(transaction.signed as string)\n const response = await provider.sendRawTransaction(stx, sendOptions)\n return TransactionPending.from(response)\n }\n\n async signTransaction(transaction: TransactionRequest, opts?: SendOptions): Promise<SignedTransaction> {\n type NativePopulatedTransaction = Parameters<typeof this.buildTxByPopulatedTx>[0]\n const populatedTransaction = transaction.request as NativePopulatedTransaction\n\n const provider = this.assetAndGetProvider()\n\n const tx = this.buildTxByPopulatedTx(populatedTransaction)\n if (isVersionedTransaction(tx)) {\n if (populatedTransaction.signers) {\n tx.sign(populatedTransaction.signers)\n }\n\n // sign by keypair\n tx.sign([this.keypair])\n } else {\n tx.feePayer = tx.feePayer ?? this.publicKey\n tx.recentBlockhash = (await provider.getLatestBlockhash(opts?.preflightCommitment)).blockhash\n\n if (populatedTransaction.signers) {\n for (const signer of populatedTransaction.signers) {\n tx.partialSign(signer)\n }\n }\n if (populatedTransaction.lzSingers) {\n for (const signer of populatedTransaction.lzSingers) {\n signer.partialSign(tx)\n }\n }\n // sign by keypair\n tx.partialSign(this.keypair)\n }\n const response = hexlify(tx.serialize())\n return SignedTransaction.from(response)\n }\n\n async signBuffer(_buffer: Uint8Array): Promise<Uint8Array> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n partialSign(tx: Transaction | VersionedTransaction): void {\n if (isVersionedTransaction(tx)) {\n tx.sign([this.keypair])\n } else {\n tx.partialSign(this.keypair)\n }\n }\n\n private buildTxByPopulatedTx(populatedTransaction: SolanaPopulatedTransaction): Transaction | VersionedTransaction {\n // const versionedTx = await txWithAddressLookupTable(\n // this.anchorProvider.connection,\n // this.wallet.publicKey,\n // transaction.instructions,\n // transaction.table\n // )\n const tx = new Transaction()\n // TODO support address lookup table\n // FIXME: disabled temporarily when moved to corekit\n tx.add(...populatedTransaction.instructions)\n // TODO sign by signers\n return tx\n }\n\n private assetAndGetProvider(): Connection {\n if (!this.provider) {\n throw new Error('Signer was not connected to a provider, did you forgot to connect to provider?')\n }\n return this.provider\n }\n}\n\nfunction getKeypair(mnemonic: string, path = \"m/44'/501'/0'/0'\"): { ecdsaPrivateKey: string; keypair: Keypair } {\n const seed = bip39.mnemonicToSeedSync(mnemonic, '') // (mnemonic, password)\n const privateKey = derivePath(path, seed.toString('hex')).key\n return { ecdsaPrivateKey: hexlify(privateKey), keypair: Keypair.fromSeed(privateKey) }\n}\n"]}
@@ -0,0 +1,56 @@
1
+ import { Connection, Finality, SendOptions, ConfirmOptions, TransactionInstruction, Signer, PublicKey, Keypair, Transaction, VersionedTransaction } from '@solana/web3.js';
2
+ import { Provider, Block, TransactionResponse, TransactionReceipt, BlockTag, BlockWithTransactions, SignedTransaction, TransactionPending, Signer as Signer$1, TransactionRequest } from '@layerzerolabs/lz-core';
3
+
4
+ declare class SolanaProvider implements Provider {
5
+ nativeProvider: Connection;
6
+ constructor(url: string);
7
+ static from(url: string): SolanaProvider;
8
+ get native(): unknown;
9
+ getBalance(address: string): Promise<string>;
10
+ getBlock(slot: string | number): Promise<Block>;
11
+ getBlockNumber(): Promise<number>;
12
+ getSlot(finality?: Finality): Promise<number>;
13
+ getBlockTimestamp(slot: string | number): Promise<number>;
14
+ /**
15
+ *
16
+ * @param txHash string The transaction hash is TransactionSignature in Solana
17
+ * @returns TransactionResponse
18
+ */
19
+ getTransaction(txHash: string): Promise<TransactionResponse>;
20
+ getTransactionReceipt(txHash: string): Promise<TransactionReceipt>;
21
+ getTransactionCount(_addressOrName: string | Promise<string>, _blockTag?: BlockTag | Promise<BlockTag>): Promise<number>;
22
+ getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions>;
23
+ sendTransaction(transaction: SignedTransaction, sendOptions?: SendOptions): Promise<TransactionPending>;
24
+ sendAndConfirm(transaction: SignedTransaction, opts?: ConfirmOptions): Promise<TransactionReceipt>;
25
+ }
26
+
27
+ interface SolanaPopulatedTransaction {
28
+ instructions: TransactionInstruction[];
29
+ signers?: Signer[];
30
+ lzSingers?: SolanaSigner[];
31
+ table?: PublicKey;
32
+ }
33
+ declare class SolanaSigner implements Signer$1 {
34
+ private readonly keypair;
35
+ private provider?;
36
+ private ecdsaPrivateKey?;
37
+ private constructor();
38
+ static from(source: Keypair): SolanaSigner;
39
+ static from(mnemonic: string, path: string): SolanaSigner;
40
+ get native(): unknown;
41
+ connect(provider: Provider): this;
42
+ getAddress(): Promise<string>;
43
+ get address(): string;
44
+ get publicKey(): PublicKey;
45
+ get secretKey(): Uint8Array;
46
+ get ECDSAPrivateKey(): string;
47
+ sendAndConfirm(transaction: SignedTransaction, opts?: ConfirmOptions): Promise<TransactionReceipt>;
48
+ sendTransaction(transaction: SignedTransaction, sendOptions?: SendOptions): Promise<TransactionPending>;
49
+ signTransaction(transaction: TransactionRequest, opts?: SendOptions): Promise<SignedTransaction>;
50
+ signBuffer(_buffer: Uint8Array): Promise<Uint8Array>;
51
+ partialSign(tx: Transaction | VersionedTransaction): void;
52
+ private buildTxByPopulatedTx;
53
+ private assetAndGetProvider;
54
+ }
55
+
56
+ export { type SolanaPopulatedTransaction, SolanaProvider, SolanaSigner };
@@ -0,0 +1,56 @@
1
+ import { Connection, Finality, SendOptions, ConfirmOptions, TransactionInstruction, Signer, PublicKey, Keypair, Transaction, VersionedTransaction } from '@solana/web3.js';
2
+ import { Provider, Block, TransactionResponse, TransactionReceipt, BlockTag, BlockWithTransactions, SignedTransaction, TransactionPending, Signer as Signer$1, TransactionRequest } from '@layerzerolabs/lz-core';
3
+
4
+ declare class SolanaProvider implements Provider {
5
+ nativeProvider: Connection;
6
+ constructor(url: string);
7
+ static from(url: string): SolanaProvider;
8
+ get native(): unknown;
9
+ getBalance(address: string): Promise<string>;
10
+ getBlock(slot: string | number): Promise<Block>;
11
+ getBlockNumber(): Promise<number>;
12
+ getSlot(finality?: Finality): Promise<number>;
13
+ getBlockTimestamp(slot: string | number): Promise<number>;
14
+ /**
15
+ *
16
+ * @param txHash string The transaction hash is TransactionSignature in Solana
17
+ * @returns TransactionResponse
18
+ */
19
+ getTransaction(txHash: string): Promise<TransactionResponse>;
20
+ getTransactionReceipt(txHash: string): Promise<TransactionReceipt>;
21
+ getTransactionCount(_addressOrName: string | Promise<string>, _blockTag?: BlockTag | Promise<BlockTag>): Promise<number>;
22
+ getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions>;
23
+ sendTransaction(transaction: SignedTransaction, sendOptions?: SendOptions): Promise<TransactionPending>;
24
+ sendAndConfirm(transaction: SignedTransaction, opts?: ConfirmOptions): Promise<TransactionReceipt>;
25
+ }
26
+
27
+ interface SolanaPopulatedTransaction {
28
+ instructions: TransactionInstruction[];
29
+ signers?: Signer[];
30
+ lzSingers?: SolanaSigner[];
31
+ table?: PublicKey;
32
+ }
33
+ declare class SolanaSigner implements Signer$1 {
34
+ private readonly keypair;
35
+ private provider?;
36
+ private ecdsaPrivateKey?;
37
+ private constructor();
38
+ static from(source: Keypair): SolanaSigner;
39
+ static from(mnemonic: string, path: string): SolanaSigner;
40
+ get native(): unknown;
41
+ connect(provider: Provider): this;
42
+ getAddress(): Promise<string>;
43
+ get address(): string;
44
+ get publicKey(): PublicKey;
45
+ get secretKey(): Uint8Array;
46
+ get ECDSAPrivateKey(): string;
47
+ sendAndConfirm(transaction: SignedTransaction, opts?: ConfirmOptions): Promise<TransactionReceipt>;
48
+ sendTransaction(transaction: SignedTransaction, sendOptions?: SendOptions): Promise<TransactionPending>;
49
+ signTransaction(transaction: TransactionRequest, opts?: SendOptions): Promise<SignedTransaction>;
50
+ signBuffer(_buffer: Uint8Array): Promise<Uint8Array>;
51
+ partialSign(tx: Transaction | VersionedTransaction): void;
52
+ private buildTxByPopulatedTx;
53
+ private assetAndGetProvider;
54
+ }
55
+
56
+ export { type SolanaPopulatedTransaction, SolanaProvider, SolanaSigner };
package/dist/index.mjs ADDED
@@ -0,0 +1,208 @@
1
+ import { Connection, PublicKey, sendAndConfirmRawTransaction, Keypair, Transaction } from '@solana/web3.js';
2
+ import { arrayify, hexlify } from 'ethers/lib/utils';
3
+ import { Block, TransactionResponse, TransactionReceipt, BlockWithTransactions, TransactionPending, SignedTransaction } from '@layerzerolabs/lz-core';
4
+ import { isVersionedTransaction } from '@coral-xyz/anchor/dist/cjs/utils/common';
5
+ import * as bip39 from 'bip39';
6
+ import { derivePath } from 'ed25519-hd-key';
7
+
8
+ // src/providers/solana.ts
9
+ var SolanaProvider = class _SolanaProvider {
10
+ constructor(url) {
11
+ this.nativeProvider = new Connection(url, "confirmed");
12
+ }
13
+ static from(source) {
14
+ if (typeof source === "string") {
15
+ return new _SolanaProvider(source);
16
+ } else {
17
+ throw new Error("Invalid parameters");
18
+ }
19
+ }
20
+ get native() {
21
+ return this.nativeProvider;
22
+ }
23
+ async getBalance(address) {
24
+ return this.nativeProvider.getBalance(new PublicKey(address)).then((balance) => balance.toString());
25
+ }
26
+ async getBlock(slot) {
27
+ const response = await this.nativeProvider.getParsedBlock(parseInt(slot.toString()), {
28
+ commitment: "confirmed"
29
+ });
30
+ return Block.from(response);
31
+ }
32
+ async getBlockNumber() {
33
+ return this.nativeProvider.getBlockHeight({ commitment: "confirmed" });
34
+ }
35
+ async getSlot(finality) {
36
+ return this.nativeProvider.getSlot(finality);
37
+ }
38
+ async getBlockTimestamp(slot) {
39
+ const t = await this.nativeProvider.getBlockTime(parseInt(slot.toString()));
40
+ if (t === null) {
41
+ throw new Error("Block timestamp not available");
42
+ }
43
+ return t;
44
+ }
45
+ /**
46
+ *
47
+ * @param txHash string The transaction hash is TransactionSignature in Solana
48
+ * @returns TransactionResponse
49
+ */
50
+ async getTransaction(txHash) {
51
+ const response = await this.nativeProvider.getParsedTransaction(txHash, {
52
+ commitment: "confirmed"
53
+ });
54
+ return TransactionResponse.from(response);
55
+ }
56
+ async getTransactionReceipt(txHash) {
57
+ const response = await this.nativeProvider.getParsedTransaction(txHash, {
58
+ commitment: "confirmed"
59
+ });
60
+ if (response === null) {
61
+ throw new Error("Transaction not found");
62
+ }
63
+ return TransactionReceipt.from(response);
64
+ }
65
+ // eslint-disable-next-line @typescript-eslint/require-await
66
+ async getTransactionCount(_addressOrName, _blockTag) {
67
+ await Promise.resolve();
68
+ throw new Error("Method not implemented.");
69
+ }
70
+ async getBlockWithTransactions(blockTag) {
71
+ if (typeof blockTag === "string") {
72
+ blockTag = parseInt(blockTag);
73
+ }
74
+ const response = await this.nativeProvider.getBlock(blockTag, { transactionDetails: "full" });
75
+ if (response === null) {
76
+ throw new Error("Block not found");
77
+ }
78
+ return BlockWithTransactions.from(response);
79
+ }
80
+ async sendTransaction(transaction, sendOptions) {
81
+ const _transaction = transaction.signed;
82
+ const response = await this.nativeProvider.sendRawTransaction(Buffer.from(arrayify(_transaction)), sendOptions);
83
+ return TransactionPending.from(response);
84
+ }
85
+ async sendAndConfirm(transaction, opts) {
86
+ const _transaction = transaction.signed;
87
+ const response = await sendAndConfirmRawTransaction(
88
+ this.nativeProvider,
89
+ Buffer.from(arrayify(_transaction)),
90
+ opts
91
+ );
92
+ return TransactionReceipt.from(response);
93
+ }
94
+ };
95
+ var SolanaSigner = class {
96
+ constructor(keypair, ecdsaPrivateKey) {
97
+ this.keypair = keypair;
98
+ this.ecdsaPrivateKey = ecdsaPrivateKey;
99
+ }
100
+ static from(source, path) {
101
+ if (source instanceof Keypair) {
102
+ return new this(source);
103
+ } else if (typeof source === "string") {
104
+ const { ecdsaPrivateKey, keypair } = getKeypair(source, path);
105
+ return new this(keypair, ecdsaPrivateKey);
106
+ } else {
107
+ throw new Error("Invalid parameters");
108
+ }
109
+ }
110
+ get native() {
111
+ return this.keypair;
112
+ }
113
+ connect(provider) {
114
+ if (!(provider.native instanceof Connection)) {
115
+ throw new Error("Only @solana/web3.js Connection is supported.");
116
+ }
117
+ this.provider = provider.native;
118
+ return this;
119
+ }
120
+ async getAddress() {
121
+ return Promise.resolve(this.keypair.publicKey.toBase58());
122
+ }
123
+ get address() {
124
+ return this.publicKey.toBase58();
125
+ }
126
+ get publicKey() {
127
+ return this.keypair.publicKey;
128
+ }
129
+ get secretKey() {
130
+ return this.keypair.secretKey;
131
+ }
132
+ get ECDSAPrivateKey() {
133
+ if (!this.ecdsaPrivateKey) {
134
+ throw new Error("ECDSA private key is not available");
135
+ }
136
+ return this.ecdsaPrivateKey;
137
+ }
138
+ async sendAndConfirm(transaction, opts) {
139
+ const provider = this.assetAndGetProvider();
140
+ const stx = arrayify(transaction.signed);
141
+ const response = await sendAndConfirmRawTransaction(provider, Buffer.from(stx), opts);
142
+ return TransactionReceipt.from(response);
143
+ }
144
+ async sendTransaction(transaction, sendOptions) {
145
+ const provider = this.assetAndGetProvider();
146
+ const stx = arrayify(transaction.signed);
147
+ const response = await provider.sendRawTransaction(stx, sendOptions);
148
+ return TransactionPending.from(response);
149
+ }
150
+ async signTransaction(transaction, opts) {
151
+ const populatedTransaction = transaction.request;
152
+ const provider = this.assetAndGetProvider();
153
+ const tx = this.buildTxByPopulatedTx(populatedTransaction);
154
+ if (isVersionedTransaction(tx)) {
155
+ if (populatedTransaction.signers) {
156
+ tx.sign(populatedTransaction.signers);
157
+ }
158
+ tx.sign([this.keypair]);
159
+ } else {
160
+ tx.feePayer = tx.feePayer ?? this.publicKey;
161
+ tx.recentBlockhash = (await provider.getLatestBlockhash(opts?.preflightCommitment)).blockhash;
162
+ if (populatedTransaction.signers) {
163
+ for (const signer of populatedTransaction.signers) {
164
+ tx.partialSign(signer);
165
+ }
166
+ }
167
+ if (populatedTransaction.lzSingers) {
168
+ for (const signer of populatedTransaction.lzSingers) {
169
+ signer.partialSign(tx);
170
+ }
171
+ }
172
+ tx.partialSign(this.keypair);
173
+ }
174
+ const response = hexlify(tx.serialize());
175
+ return SignedTransaction.from(response);
176
+ }
177
+ async signBuffer(_buffer) {
178
+ await Promise.resolve();
179
+ throw new Error("Method not implemented.");
180
+ }
181
+ partialSign(tx) {
182
+ if (isVersionedTransaction(tx)) {
183
+ tx.sign([this.keypair]);
184
+ } else {
185
+ tx.partialSign(this.keypair);
186
+ }
187
+ }
188
+ buildTxByPopulatedTx(populatedTransaction) {
189
+ const tx = new Transaction();
190
+ tx.add(...populatedTransaction.instructions);
191
+ return tx;
192
+ }
193
+ assetAndGetProvider() {
194
+ if (!this.provider) {
195
+ throw new Error("Signer was not connected to a provider, did you forgot to connect to provider?");
196
+ }
197
+ return this.provider;
198
+ }
199
+ };
200
+ function getKeypair(mnemonic, path = "m/44'/501'/0'/0'") {
201
+ const seed = bip39.mnemonicToSeedSync(mnemonic, "");
202
+ const privateKey = derivePath(path, seed.toString("hex")).key;
203
+ return { ecdsaPrivateKey: hexlify(privateKey), keypair: Keypair.fromSeed(privateKey) };
204
+ }
205
+
206
+ export { SolanaProvider, SolanaSigner };
207
+ //# sourceMappingURL=out.js.map
208
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/solana.ts","../src/signers/solana.ts"],"names":["Connection","sendAndConfirmRawTransaction","arrayify","SignedTransaction","TransactionPending","TransactionReceipt"],"mappings":"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","sourcesContent":["import {\n ConfirmOptions,\n Connection,\n Finality,\n GetVersionedTransactionConfig,\n ParsedTransactionWithMeta,\n PublicKey,\n SendOptions,\n TransactionSignature,\n sendAndConfirmRawTransaction,\n} from '@solana/web3.js'\nimport { arrayify } from 'ethers/lib/utils'\n\nimport {\n Block,\n BlockTag,\n BlockWithTransactions,\n Provider,\n SignedTransaction,\n TransactionPending,\n TransactionReceipt,\n TransactionResponse,\n} from '@layerzerolabs/lz-core'\n\nexport class SolanaProvider implements Provider {\n nativeProvider: Connection\n\n constructor(url: string) {\n this.nativeProvider = new Connection(url, 'confirmed')\n }\n\n static from(url: string): SolanaProvider\n\n static from(source: string): SolanaProvider {\n if (typeof source === 'string') {\n return new SolanaProvider(source)\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.nativeProvider\n }\n\n async getBalance(address: string): Promise<string> {\n return this.nativeProvider.getBalance(new PublicKey(address)).then((balance) => balance.toString())\n }\n\n async getBlock(slot: string | number): Promise<Block> {\n const response = await this.nativeProvider.getParsedBlock(parseInt(slot.toString()), {\n commitment: 'confirmed',\n })\n return Block.from(response)\n }\n\n async getBlockNumber(): Promise<number> {\n return this.nativeProvider.getBlockHeight({ commitment: 'confirmed' })\n }\n\n async getSlot(finality?: Finality): Promise<number> {\n return this.nativeProvider.getSlot(finality)\n }\n\n async getBlockTimestamp(slot: string | number): Promise<number> {\n const t = await this.nativeProvider.getBlockTime(parseInt(slot.toString()))\n if (t === null) {\n throw new Error('Block timestamp not available')\n }\n return t\n }\n\n /**\n *\n * @param txHash string The transaction hash is TransactionSignature in Solana\n * @returns TransactionResponse\n */\n async getTransaction(txHash: string): Promise<TransactionResponse> {\n const response: ParsedTransactionWithMeta | null = await this.nativeProvider.getParsedTransaction(txHash, {\n commitment: 'confirmed',\n })\n return TransactionResponse.from(response)\n }\n\n async getTransactionReceipt(txHash: string): Promise<TransactionReceipt> {\n const response: ParsedTransactionWithMeta | null = await this.nativeProvider.getParsedTransaction(txHash, {\n commitment: 'confirmed',\n } satisfies GetVersionedTransactionConfig)\n if (response === null) {\n throw new Error('Transaction not found')\n }\n return TransactionReceipt.from(response)\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getTransactionCount(\n _addressOrName: string | Promise<string>,\n _blockTag?: BlockTag | Promise<BlockTag>\n ): Promise<number> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n async getBlockWithTransactions(blockTag: string | number): Promise<BlockWithTransactions> {\n if (typeof blockTag === 'string') {\n blockTag = parseInt(blockTag)\n }\n const response = await this.nativeProvider.getBlock(blockTag, { transactionDetails: 'full' })\n if (response === null) {\n throw new Error('Block not found')\n }\n return BlockWithTransactions.from(response)\n }\n\n async sendTransaction(transaction: SignedTransaction, sendOptions?: SendOptions): Promise<TransactionPending> {\n const _transaction = transaction.signed as string\n\n const response = await this.nativeProvider.sendRawTransaction(Buffer.from(arrayify(_transaction)), sendOptions)\n return TransactionPending.from(response)\n }\n\n async sendAndConfirm(transaction: SignedTransaction, opts?: ConfirmOptions): Promise<TransactionReceipt> {\n const _transaction = transaction.signed as string\n const response: TransactionSignature = await sendAndConfirmRawTransaction(\n this.nativeProvider,\n Buffer.from(arrayify(_transaction)),\n opts\n )\n return TransactionReceipt.from(response)\n }\n}\n","import { isVersionedTransaction } from '@coral-xyz/anchor/dist/cjs/utils/common'\nimport {\n ConfirmOptions,\n Connection,\n Keypair,\n Signer as NativeSolanaSigner,\n PublicKey,\n SendOptions,\n Transaction,\n TransactionInstruction,\n VersionedTransaction,\n sendAndConfirmRawTransaction,\n} from '@solana/web3.js'\nimport * as bip39 from 'bip39'\nimport { derivePath } from 'ed25519-hd-key'\nimport { arrayify, hexlify } from 'ethers/lib/utils'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\n\nexport interface SolanaPopulatedTransaction {\n instructions: TransactionInstruction[]\n signers?: NativeSolanaSigner[]\n lzSingers?: SolanaSigner[]\n table?: PublicKey\n}\n\nexport class SolanaSigner implements Signer {\n private readonly keypair: Keypair\n private provider?: Connection\n private ecdsaPrivateKey?: string\n\n private constructor(keypair: Keypair, ecdsaPrivateKey?: string) {\n this.keypair = keypair\n this.ecdsaPrivateKey = ecdsaPrivateKey\n }\n\n static from(source: Keypair): SolanaSigner\n static from(mnemonic: string, path: string): SolanaSigner\n\n static from(source: Keypair | string, path?: string): SolanaSigner {\n if (source instanceof Keypair) {\n return new this(source)\n } else if (typeof source === 'string') {\n const { ecdsaPrivateKey, keypair } = getKeypair(source, path)\n return new this(keypair, ecdsaPrivateKey)\n } else {\n throw new Error('Invalid parameters')\n }\n }\n\n get native(): unknown {\n return this.keypair\n }\n\n connect(provider: Provider): this {\n if (!(provider.native instanceof Connection)) {\n throw new Error('Only @solana/web3.js Connection is supported.')\n }\n this.provider = provider.native\n return this\n }\n\n async getAddress(): Promise<string> {\n return Promise.resolve(this.keypair.publicKey.toBase58())\n }\n\n get address(): string {\n return this.publicKey.toBase58()\n }\n\n get publicKey(): PublicKey {\n return this.keypair.publicKey\n }\n\n get secretKey(): Uint8Array {\n return this.keypair.secretKey\n }\n\n get ECDSAPrivateKey(): string {\n if (!this.ecdsaPrivateKey) {\n throw new Error('ECDSA private key is not available')\n }\n return this.ecdsaPrivateKey\n }\n\n async sendAndConfirm(transaction: SignedTransaction, opts?: ConfirmOptions): Promise<TransactionReceipt> {\n const provider = this.assetAndGetProvider()\n const stx = arrayify(transaction.signed as string)\n const response = await sendAndConfirmRawTransaction(provider, Buffer.from(stx), opts)\n return TransactionReceipt.from(response)\n }\n\n async sendTransaction(transaction: SignedTransaction, sendOptions?: SendOptions): Promise<TransactionPending> {\n const provider = this.assetAndGetProvider()\n const stx = arrayify(transaction.signed as string)\n const response = await provider.sendRawTransaction(stx, sendOptions)\n return TransactionPending.from(response)\n }\n\n async signTransaction(transaction: TransactionRequest, opts?: SendOptions): Promise<SignedTransaction> {\n type NativePopulatedTransaction = Parameters<typeof this.buildTxByPopulatedTx>[0]\n const populatedTransaction = transaction.request as NativePopulatedTransaction\n\n const provider = this.assetAndGetProvider()\n\n const tx = this.buildTxByPopulatedTx(populatedTransaction)\n if (isVersionedTransaction(tx)) {\n if (populatedTransaction.signers) {\n tx.sign(populatedTransaction.signers)\n }\n\n // sign by keypair\n tx.sign([this.keypair])\n } else {\n tx.feePayer = tx.feePayer ?? this.publicKey\n tx.recentBlockhash = (await provider.getLatestBlockhash(opts?.preflightCommitment)).blockhash\n\n if (populatedTransaction.signers) {\n for (const signer of populatedTransaction.signers) {\n tx.partialSign(signer)\n }\n }\n if (populatedTransaction.lzSingers) {\n for (const signer of populatedTransaction.lzSingers) {\n signer.partialSign(tx)\n }\n }\n // sign by keypair\n tx.partialSign(this.keypair)\n }\n const response = hexlify(tx.serialize())\n return SignedTransaction.from(response)\n }\n\n async signBuffer(_buffer: Uint8Array): Promise<Uint8Array> {\n await Promise.resolve()\n throw new Error('Method not implemented.')\n }\n\n partialSign(tx: Transaction | VersionedTransaction): void {\n if (isVersionedTransaction(tx)) {\n tx.sign([this.keypair])\n } else {\n tx.partialSign(this.keypair)\n }\n }\n\n private buildTxByPopulatedTx(populatedTransaction: SolanaPopulatedTransaction): Transaction | VersionedTransaction {\n // const versionedTx = await txWithAddressLookupTable(\n // this.anchorProvider.connection,\n // this.wallet.publicKey,\n // transaction.instructions,\n // transaction.table\n // )\n const tx = new Transaction()\n // TODO support address lookup table\n // FIXME: disabled temporarily when moved to corekit\n tx.add(...populatedTransaction.instructions)\n // TODO sign by signers\n return tx\n }\n\n private assetAndGetProvider(): Connection {\n if (!this.provider) {\n throw new Error('Signer was not connected to a provider, did you forgot to connect to provider?')\n }\n return this.provider\n }\n}\n\nfunction getKeypair(mnemonic: string, path = \"m/44'/501'/0'/0'\"): { ecdsaPrivateKey: string; keypair: Keypair } {\n const seed = bip39.mnemonicToSeedSync(mnemonic, '') // (mnemonic, password)\n const privateKey = derivePath(path, seed.toString('hex')).key\n return { ecdsaPrivateKey: hexlify(privateKey), keypair: Keypair.fromSeed(privateKey) }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@layerzerolabs/lz-corekit-solana",
3
+ "version": "2.3.8",
4
+ "description": "LayerZero Core Library",
5
+ "license": "BUSL-1.1",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.mjs",
10
+ "require": "./dist/index.cjs"
11
+ },
12
+ "./package.json": "./package.json"
13
+ },
14
+ "main": "./dist/index.cjs",
15
+ "types": "./dist/index.d.ts",
16
+ "files": [
17
+ "dist/**/*"
18
+ ],
19
+ "scripts": {
20
+ "build": "$npm_execpath clean-prebuild && $npm_execpath build-ts",
21
+ "build-ts": "$npm_execpath tsc --noEmit && $npm_execpath tsup",
22
+ "clean": "$npm_execpath clean-prebuild && rimraf .turbo",
23
+ "clean-prebuild": "rimraf dist"
24
+ },
25
+ "dependencies": {
26
+ "@coral-xyz/anchor": "^0.29.0",
27
+ "@layerzerolabs/lz-aptos-sdk-v1": "^2.3.8",
28
+ "@layerzerolabs/lz-core": "^2.3.8",
29
+ "@layerzerolabs/lz-utilities": "^2.3.8",
30
+ "@layerzerolabs/tron-utilities": "^2.3.8",
31
+ "@solana/web3.js": "^1.91.8",
32
+ "aptos": "^1.20.0",
33
+ "bip39": "^3.1.0",
34
+ "ed25519-hd-key": "^1.3.0",
35
+ "ethers": "^5.7.2",
36
+ "mem": "^8.1.1",
37
+ "tiny-invariant": "^1.3.1",
38
+ "tronweb": "^5.3.1"
39
+ },
40
+ "devDependencies": {
41
+ "@jest/globals": "^29.7.0",
42
+ "@layerzerolabs/tronweb-typescript": "^0.0.0",
43
+ "@layerzerolabs/tsup-config-next": "^2.3.8",
44
+ "@layerzerolabs/typescript-config-next": "^2.3.8",
45
+ "@types/jest": "^29.5.10",
46
+ "@types/tronweb": "npm:@layerzerolabs/tronweb-typescript@workspace:^",
47
+ "jest": "^29.7.0",
48
+ "jest-extended": "^4.0.2",
49
+ "rimraf": "^5.0.5",
50
+ "ts-jest": "^29.1.1",
51
+ "tsup": "^8.0.1",
52
+ "typescript": "~5.2.2"
53
+ },
54
+ "publishConfig": {
55
+ "access": "public"
56
+ }
57
+ }