@layerzerolabs/lz-corekit-solana 2.3.16 → 2.3.18

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 CHANGED
@@ -1,5 +1,26 @@
1
1
  # @layerzerolabs/lz-corekit-solana
2
2
 
3
+ ## 2.3.18
4
+
5
+ ### Patch Changes
6
+
7
+ - d7ddb1e: Make `solana-sdk` compatible with browsers
8
+ - Updated dependencies [d7ddb1e]
9
+ - @layerzerolabs/lz-core@2.3.18
10
+
11
+ ## 2.3.17
12
+
13
+ ### Patch Changes
14
+
15
+ - 7e1d72a: minor update & fix some bugs
16
+ - a255697: SEI mainnet
17
+ - Updated dependencies [7e1d72a]
18
+ - Updated dependencies [a255697]
19
+ - @layerzerolabs/lz-core@2.3.17
20
+ - @layerzerolabs/tron-utilities@2.3.17
21
+ - @layerzerolabs/lz-utilities@2.3.17
22
+ - @layerzerolabs/lz-aptos-sdk-v1@2.3.17
23
+
3
24
  ## 2.3.16
4
25
 
5
26
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
+ var bytes = require('@ethersproject/bytes');
3
4
  var web3_js = require('@solana/web3.js');
4
- var utils = require('ethers/lib/utils');
5
5
  var lzCore = require('@layerzerolabs/lz-core');
6
6
  var common = require('@coral-xyz/anchor/dist/cjs/utils/common');
7
7
  var bip39 = require('bip39');
8
8
  var ed25519HdKey = require('ed25519-hd-key');
9
- var lzUtilities = require('@layerzerolabs/lz-utilities');
9
+ var secp256k1 = require('@noble/secp256k1');
10
10
 
11
11
  function _interopNamespace(e) {
12
12
  if (e && e.__esModule) return e;
@@ -102,25 +102,41 @@ var SolanaProvider = class _SolanaProvider {
102
102
  }
103
103
  async sendTransaction(transaction, sendOptions) {
104
104
  const _transaction = transaction.signed;
105
- const response = await this.nativeProvider.sendRawTransaction(Buffer.from(utils.arrayify(_transaction)), sendOptions);
105
+ const response = await this.nativeProvider.sendRawTransaction(Buffer.from(bytes.arrayify(_transaction)), sendOptions);
106
106
  return lzCore.TransactionPending.from(response);
107
107
  }
108
108
  async sendAndConfirm(transaction, opts) {
109
109
  const _transaction = transaction.signed;
110
110
  const response = await web3_js.sendAndConfirmRawTransaction(
111
111
  this.nativeProvider,
112
- Buffer.from(utils.arrayify(_transaction)),
112
+ Buffer.from(bytes.arrayify(_transaction)),
113
113
  opts
114
114
  );
115
115
  return lzCore.TransactionReceipt.from(response);
116
116
  }
117
117
  };
118
+ async function signWithECDSA(data, privateKey) {
119
+ const [signature, recoveryId] = await secp256k1.sign(data, privateKey.replace("0x", ""), {
120
+ canonical: true,
121
+ recovered: true,
122
+ der: false
123
+ });
124
+ return {
125
+ signature,
126
+ recoveryId
127
+ };
128
+ }
129
+ function getECDSAPublicKey(privateKey) {
130
+ return bytes.hexlify(secp256k1.getPublicKey(privateKey.replace("0x", "")).subarray(1));
131
+ }
132
+
133
+ // src/signers/solana.ts
118
134
  var SolanaSigner = class {
119
135
  constructor(keypair, ecdsaPrivateKey) {
120
136
  this.keypair = keypair;
121
137
  this.ecdsaPrivateKey = ecdsaPrivateKey;
122
- if (ecdsaPrivateKey) {
123
- this.ecdsaPublicKey = lzUtilities.getECDSAPublicKey(ecdsaPrivateKey);
138
+ if (ecdsaPrivateKey !== void 0) {
139
+ this.ecdsaPublicKey = getECDSAPublicKey(ecdsaPrivateKey);
124
140
  }
125
141
  }
126
142
  static from(source, path) {
@@ -156,26 +172,26 @@ var SolanaSigner = class {
156
172
  return this.keypair.secretKey;
157
173
  }
158
174
  get ECDSAPrivateKey() {
159
- if (!this.ecdsaPrivateKey) {
175
+ if (this.ecdsaPrivateKey === void 0) {
160
176
  throw new Error("ECDSA private key is not available");
161
177
  }
162
178
  return this.ecdsaPrivateKey;
163
179
  }
164
180
  get ECDSAPublicKey() {
165
- if (!this.ecdsaPublicKey) {
181
+ if (this.ecdsaPublicKey === void 0) {
166
182
  throw new Error("ECDSA public key is not available");
167
183
  }
168
184
  return this.ecdsaPublicKey;
169
185
  }
170
186
  async sendAndConfirm(transaction, opts) {
171
187
  const provider = this.assetAndGetProvider();
172
- const stx = utils.arrayify(transaction.signed);
188
+ const stx = bytes.arrayify(transaction.signed);
173
189
  const response = await web3_js.sendAndConfirmRawTransaction(provider, Buffer.from(stx), opts);
174
190
  return lzCore.TransactionReceipt.from(response);
175
191
  }
176
192
  async sendTransaction(transaction, sendOptions) {
177
193
  const provider = this.assetAndGetProvider();
178
- const stx = utils.arrayify(transaction.signed);
194
+ const stx = bytes.arrayify(transaction.signed);
179
195
  const response = await provider.sendRawTransaction(stx, sendOptions);
180
196
  return lzCore.TransactionPending.from(response);
181
197
  }
@@ -203,7 +219,7 @@ var SolanaSigner = class {
203
219
  }
204
220
  tx.partialSign(this.keypair);
205
221
  }
206
- const response = utils.hexlify(tx.serialize());
222
+ const response = bytes.hexlify(tx.serialize());
207
223
  return lzCore.SignedTransaction.from(response);
208
224
  }
209
225
  async signBuffer(_buffer) {
@@ -232,10 +248,16 @@ var SolanaSigner = class {
232
248
  function getKeypair(mnemonic, path = "m/44'/501'/0'/0'") {
233
249
  const seed = bip39__namespace.mnemonicToSeedSync(mnemonic, "");
234
250
  const privateKey = ed25519HdKey.derivePath(path, seed.toString("hex")).key;
235
- return { ecdsaPrivateKey: utils.hexlify(privateKey), keypair: web3_js.Keypair.fromSeed(privateKey) };
251
+ return { ecdsaPrivateKey: bytes.hexlify(privateKey), keypair: web3_js.Keypair.fromSeed(privateKey) };
236
252
  }
237
253
 
254
+ Object.defineProperty(exports, "recoverPublicKey", {
255
+ enumerable: true,
256
+ get: function () { return secp256k1.recoverPublicKey; }
257
+ });
238
258
  exports.SolanaProvider = SolanaProvider;
239
259
  exports.SolanaSigner = SolanaSigner;
260
+ exports.getECDSAPublicKey = getECDSAPublicKey;
261
+ exports.signWithECDSA = signWithECDSA;
240
262
  //# sourceMappingURL=out.js.map
241
263
  //# sourceMappingURL=index.cjs.map
@@ -1 +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'\nimport { getECDSAPublicKey } from '@layerzerolabs/lz-utilities'\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 private ecdsaPublicKey?: string\n\n private constructor(keypair: Keypair, ecdsaPrivateKey?: string) {\n this.keypair = keypair\n this.ecdsaPrivateKey = ecdsaPrivateKey\n if (ecdsaPrivateKey) {\n this.ecdsaPublicKey = getECDSAPublicKey(ecdsaPrivateKey)\n }\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 get ECDSAPublicKey(): string {\n if (!this.ecdsaPublicKey) {\n throw new Error('ECDSA public key is not available')\n }\n return this.ecdsaPublicKey\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"]}
1
+ {"version":3,"sources":["../src/providers/solana.ts","../src/signers/solana.ts","../src/ecdsa.ts"],"names":["arrayify","hexlify","Connection","sendAndConfirmRawTransaction","SignedTransaction","TransactionPending","TransactionReceipt"],"mappings":"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","sourcesContent":["import { arrayify } from '@ethersproject/bytes'\nimport {\n ConfirmOptions,\n Connection,\n Finality,\n GetVersionedTransactionConfig,\n ParsedTransactionWithMeta,\n PublicKey,\n SendOptions,\n TransactionSignature,\n sendAndConfirmRawTransaction,\n} from '@solana/web3.js'\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 { arrayify, hexlify } from '@ethersproject/bytes'\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'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\n\nimport { getECDSAPublicKey } from '../ecdsa'\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 private ecdsaPublicKey?: string\n\n private constructor(keypair: Keypair, ecdsaPrivateKey?: string) {\n this.keypair = keypair\n this.ecdsaPrivateKey = ecdsaPrivateKey\n if (ecdsaPrivateKey !== undefined) {\n this.ecdsaPublicKey = getECDSAPublicKey(ecdsaPrivateKey)\n }\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 === undefined) {\n throw new Error('ECDSA private key is not available')\n }\n return this.ecdsaPrivateKey\n }\n\n get ECDSAPublicKey(): string {\n if (this.ecdsaPublicKey === undefined) {\n throw new Error('ECDSA public key is not available')\n }\n return this.ecdsaPublicKey\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","import { hexlify } from '@ethersproject/bytes'\nimport { getPublicKey, sign } from '@noble/secp256k1'\n\nexport { recoverPublicKey } from '@noble/secp256k1'\n\nexport async function signWithECDSA(\n data: Buffer,\n privateKey: string\n): Promise<{ signature: Uint8Array; recoveryId: number }> {\n const [signature, recoveryId] = await sign(data, privateKey.replace('0x', ''), {\n canonical: true,\n recovered: true,\n der: false,\n })\n return {\n signature,\n recoveryId,\n }\n}\n\nexport function getECDSAPublicKey(privateKey: string): string {\n // remove the compression byte\n return hexlify(getPublicKey(privateKey.replace('0x', '')).subarray(1))\n}\n"]}
package/dist/index.d.mts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Connection, Finality, SendOptions, ConfirmOptions, TransactionInstruction, Signer, PublicKey, Keypair, Transaction, VersionedTransaction } from '@solana/web3.js';
2
2
  import { Provider, Block, TransactionResponse, TransactionReceipt, BlockTag, BlockWithTransactions, SignedTransaction, TransactionPending, Signer as Signer$1, TransactionRequest } from '@layerzerolabs/lz-core';
3
+ export { recoverPublicKey } from '@noble/secp256k1';
3
4
 
4
5
  declare class SolanaProvider implements Provider {
5
6
  nativeProvider: Connection;
@@ -55,4 +56,10 @@ declare class SolanaSigner implements Signer$1 {
55
56
  private assetAndGetProvider;
56
57
  }
57
58
 
58
- export { type SolanaPopulatedTransaction, SolanaProvider, SolanaSigner };
59
+ declare function signWithECDSA(data: Buffer, privateKey: string): Promise<{
60
+ signature: Uint8Array;
61
+ recoveryId: number;
62
+ }>;
63
+ declare function getECDSAPublicKey(privateKey: string): string;
64
+
65
+ export { type SolanaPopulatedTransaction, SolanaProvider, SolanaSigner, getECDSAPublicKey, signWithECDSA };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Connection, Finality, SendOptions, ConfirmOptions, TransactionInstruction, Signer, PublicKey, Keypair, Transaction, VersionedTransaction } from '@solana/web3.js';
2
2
  import { Provider, Block, TransactionResponse, TransactionReceipt, BlockTag, BlockWithTransactions, SignedTransaction, TransactionPending, Signer as Signer$1, TransactionRequest } from '@layerzerolabs/lz-core';
3
+ export { recoverPublicKey } from '@noble/secp256k1';
3
4
 
4
5
  declare class SolanaProvider implements Provider {
5
6
  nativeProvider: Connection;
@@ -55,4 +56,10 @@ declare class SolanaSigner implements Signer$1 {
55
56
  private assetAndGetProvider;
56
57
  }
57
58
 
58
- export { type SolanaPopulatedTransaction, SolanaProvider, SolanaSigner };
59
+ declare function signWithECDSA(data: Buffer, privateKey: string): Promise<{
60
+ signature: Uint8Array;
61
+ recoveryId: number;
62
+ }>;
63
+ declare function getECDSAPublicKey(privateKey: string): string;
64
+
65
+ export { type SolanaPopulatedTransaction, SolanaProvider, SolanaSigner, getECDSAPublicKey, signWithECDSA };
package/dist/index.mjs CHANGED
@@ -1,10 +1,11 @@
1
+ import { arrayify, hexlify } from '@ethersproject/bytes';
1
2
  import { Connection, PublicKey, sendAndConfirmRawTransaction, Keypair, Transaction } from '@solana/web3.js';
2
- import { arrayify, hexlify } from 'ethers/lib/utils';
3
3
  import { Block, TransactionResponse, TransactionReceipt, BlockWithTransactions, TransactionPending, SignedTransaction } from '@layerzerolabs/lz-core';
4
4
  import { isVersionedTransaction } from '@coral-xyz/anchor/dist/cjs/utils/common';
5
5
  import * as bip39 from 'bip39';
6
6
  import { derivePath } from 'ed25519-hd-key';
7
- import { getECDSAPublicKey } from '@layerzerolabs/lz-utilities';
7
+ import { sign, getPublicKey } from '@noble/secp256k1';
8
+ export { recoverPublicKey } from '@noble/secp256k1';
8
9
 
9
10
  // src/providers/solana.ts
10
11
  var SolanaProvider = class _SolanaProvider {
@@ -93,11 +94,27 @@ var SolanaProvider = class _SolanaProvider {
93
94
  return TransactionReceipt.from(response);
94
95
  }
95
96
  };
97
+ async function signWithECDSA(data, privateKey) {
98
+ const [signature, recoveryId] = await sign(data, privateKey.replace("0x", ""), {
99
+ canonical: true,
100
+ recovered: true,
101
+ der: false
102
+ });
103
+ return {
104
+ signature,
105
+ recoveryId
106
+ };
107
+ }
108
+ function getECDSAPublicKey(privateKey) {
109
+ return hexlify(getPublicKey(privateKey.replace("0x", "")).subarray(1));
110
+ }
111
+
112
+ // src/signers/solana.ts
96
113
  var SolanaSigner = class {
97
114
  constructor(keypair, ecdsaPrivateKey) {
98
115
  this.keypair = keypair;
99
116
  this.ecdsaPrivateKey = ecdsaPrivateKey;
100
- if (ecdsaPrivateKey) {
117
+ if (ecdsaPrivateKey !== void 0) {
101
118
  this.ecdsaPublicKey = getECDSAPublicKey(ecdsaPrivateKey);
102
119
  }
103
120
  }
@@ -134,13 +151,13 @@ var SolanaSigner = class {
134
151
  return this.keypair.secretKey;
135
152
  }
136
153
  get ECDSAPrivateKey() {
137
- if (!this.ecdsaPrivateKey) {
154
+ if (this.ecdsaPrivateKey === void 0) {
138
155
  throw new Error("ECDSA private key is not available");
139
156
  }
140
157
  return this.ecdsaPrivateKey;
141
158
  }
142
159
  get ECDSAPublicKey() {
143
- if (!this.ecdsaPublicKey) {
160
+ if (this.ecdsaPublicKey === void 0) {
144
161
  throw new Error("ECDSA public key is not available");
145
162
  }
146
163
  return this.ecdsaPublicKey;
@@ -213,6 +230,6 @@ function getKeypair(mnemonic, path = "m/44'/501'/0'/0'") {
213
230
  return { ecdsaPrivateKey: hexlify(privateKey), keypair: Keypair.fromSeed(privateKey) };
214
231
  }
215
232
 
216
- export { SolanaProvider, SolanaSigner };
233
+ export { SolanaProvider, SolanaSigner, getECDSAPublicKey, signWithECDSA };
217
234
  //# sourceMappingURL=out.js.map
218
235
  //# sourceMappingURL=index.mjs.map
@@ -1 +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'\nimport { getECDSAPublicKey } from '@layerzerolabs/lz-utilities'\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 private ecdsaPublicKey?: string\n\n private constructor(keypair: Keypair, ecdsaPrivateKey?: string) {\n this.keypair = keypair\n this.ecdsaPrivateKey = ecdsaPrivateKey\n if (ecdsaPrivateKey) {\n this.ecdsaPublicKey = getECDSAPublicKey(ecdsaPrivateKey)\n }\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 get ECDSAPublicKey(): string {\n if (!this.ecdsaPublicKey) {\n throw new Error('ECDSA public key is not available')\n }\n return this.ecdsaPublicKey\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"]}
1
+ {"version":3,"sources":["../src/providers/solana.ts","../src/signers/solana.ts","../src/ecdsa.ts"],"names":["arrayify","hexlify","Connection","sendAndConfirmRawTransaction","SignedTransaction","TransactionPending","TransactionReceipt"],"mappings":";AAAA,SAAS,gBAAgB;AACzB;AAAA,EAEI;AAAA,EAIA;AAAA,EAGA;AAAA,OACG;AAEP;AAAA,EACI;AAAA,EAEA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AAEA,IAAM,iBAAN,MAAM,gBAAmC;AAAA,EAG5C,YAAY,KAAa;AACrB,SAAK,iBAAiB,IAAI,WAAW,KAAK,WAAW;AAAA,EACzD;AAAA,EAIA,OAAO,KAAK,QAAgC;AACxC,QAAI,OAAO,WAAW,UAAU;AAC5B,aAAO,IAAI,gBAAe,MAAM;AAAA,IACpC,OAAO;AACH,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACxC;AAAA,EACJ;AAAA,EAEA,IAAI,SAAkB;AAClB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,WAAW,SAAkC;AAC/C,WAAO,KAAK,eAAe,WAAW,IAAI,UAAU,OAAO,CAAC,EAAE,KAAK,CAAC,YAAY,QAAQ,SAAS,CAAC;AAAA,EACtG;AAAA,EAEA,MAAM,SAAS,MAAuC;AAClD,UAAM,WAAW,MAAM,KAAK,eAAe,eAAe,SAAS,KAAK,SAAS,CAAC,GAAG;AAAA,MACjF,YAAY;AAAA,IAChB,CAAC;AACD,WAAO,MAAM,KAAK,QAAQ;AAAA,EAC9B;AAAA,EAEA,MAAM,iBAAkC;AACpC,WAAO,KAAK,eAAe,eAAe,EAAE,YAAY,YAAY,CAAC;AAAA,EACzE;AAAA,EAEA,MAAM,QAAQ,UAAsC;AAChD,WAAO,KAAK,eAAe,QAAQ,QAAQ;AAAA,EAC/C;AAAA,EAEA,MAAM,kBAAkB,MAAwC;AAC5D,UAAM,IAAI,MAAM,KAAK,eAAe,aAAa,SAAS,KAAK,SAAS,CAAC,CAAC;AAC1E,QAAI,MAAM,MAAM;AACZ,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACnD;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,QAA8C;AAC/D,UAAM,WAA6C,MAAM,KAAK,eAAe,qBAAqB,QAAQ;AAAA,MACtG,YAAY;AAAA,IAChB,CAAC;AACD,WAAO,oBAAoB,KAAK,QAAQ;AAAA,EAC5C;AAAA,EAEA,MAAM,sBAAsB,QAA6C;AACrE,UAAM,WAA6C,MAAM,KAAK,eAAe,qBAAqB,QAAQ;AAAA,MACtG,YAAY;AAAA,IAChB,CAAyC;AACzC,QAAI,aAAa,MAAM;AACnB,YAAM,IAAI,MAAM,uBAAuB;AAAA,IAC3C;AACA,WAAO,mBAAmB,KAAK,QAAQ;AAAA,EAC3C;AAAA;AAAA,EAGA,MAAM,oBACF,gBACA,WACe;AACf,UAAM,QAAQ,QAAQ;AACtB,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EAEA,MAAM,yBAAyB,UAA2D;AACtF,QAAI,OAAO,aAAa,UAAU;AAC9B,iBAAW,SAAS,QAAQ;AAAA,IAChC;AACA,UAAM,WAAW,MAAM,KAAK,eAAe,SAAS,UAAU,EAAE,oBAAoB,OAAO,CAAC;AAC5F,QAAI,aAAa,MAAM;AACnB,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACrC;AACA,WAAO,sBAAsB,KAAK,QAAQ;AAAA,EAC9C;AAAA,EAEA,MAAM,gBAAgB,aAAgC,aAAwD;AAC1G,UAAM,eAAe,YAAY;AAEjC,UAAM,WAAW,MAAM,KAAK,eAAe,mBAAmB,OAAO,KAAK,SAAS,YAAY,CAAC,GAAG,WAAW;AAC9G,WAAO,mBAAmB,KAAK,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAM,eAAe,aAAgC,MAAoD;AACrG,UAAM,eAAe,YAAY;AACjC,UAAM,WAAiC,MAAM;AAAA,MACzC,KAAK;AAAA,MACL,OAAO,KAAK,SAAS,YAAY,CAAC;AAAA,MAClC;AAAA,IACJ;AACA,WAAO,mBAAmB,KAAK,QAAQ;AAAA,EAC3C;AACJ;;;AClIA,SAAS,8BAA8B;AACvC,SAAS,YAAAA,WAAU,WAAAC,gBAAe;AAClC;AAAA,EAEI,cAAAC;AAAA,EACA;AAAA,EAIA;AAAA,EAGA,gCAAAC;AAAA,OACG;AACP,YAAY,WAAW;AACvB,SAAS,kBAAkB;AAE3B;AAAA,EAEI,qBAAAC;AAAA,EAEA,sBAAAC;AAAA,EACA,sBAAAC;AAAA,OAEG;;;ACxBP,SAAS,eAAe;AACxB,SAAS,cAAc,YAAY;AAEnC,SAAS,wBAAwB;AAEjC,eAAsB,cAClB,MACA,YACsD;AACtD,QAAM,CAAC,WAAW,UAAU,IAAI,MAAM,KAAK,MAAM,WAAW,QAAQ,MAAM,EAAE,GAAG;AAAA,IAC3E,WAAW;AAAA,IACX,WAAW;AAAA,IACX,KAAK;AAAA,EACT,CAAC;AACD,SAAO;AAAA,IACH;AAAA,IACA;AAAA,EACJ;AACJ;AAEO,SAAS,kBAAkB,YAA4B;AAE1D,SAAO,QAAQ,aAAa,WAAW,QAAQ,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AACzE;;;ADYO,IAAM,eAAN,MAAqC;AAAA,EAMhC,YAAY,SAAkB,iBAA0B;AAC5D,SAAK,UAAU;AACf,SAAK,kBAAkB;AACvB,QAAI,oBAAoB,QAAW;AAC/B,WAAK,iBAAiB,kBAAkB,eAAe;AAAA,IAC3D;AAAA,EACJ;AAAA,EAKA,OAAO,KAAK,QAA0B,MAA6B;AAC/D,QAAI,kBAAkB,SAAS;AAC3B,aAAO,IAAI,KAAK,MAAM;AAAA,IAC1B,WAAW,OAAO,WAAW,UAAU;AACnC,YAAM,EAAE,iBAAiB,QAAQ,IAAI,WAAW,QAAQ,IAAI;AAC5D,aAAO,IAAI,KAAK,SAAS,eAAe;AAAA,IAC5C,OAAO;AACH,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACxC;AAAA,EACJ;AAAA,EAEA,IAAI,SAAkB;AAClB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,QAAQ,UAA0B;AAC9B,QAAI,EAAE,SAAS,kBAAkBJ,cAAa;AAC1C,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACnE;AACA,SAAK,WAAW,SAAS;AACzB,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,aAA8B;AAChC,WAAO,QAAQ,QAAQ,KAAK,QAAQ,UAAU,SAAS,CAAC;AAAA,EAC5D;AAAA,EAEA,IAAI,UAAkB;AAClB,WAAO,KAAK,UAAU,SAAS;AAAA,EACnC;AAAA,EAEA,IAAI,YAAuB;AACvB,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,IAAI,YAAwB;AACxB,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,IAAI,kBAA0B;AAC1B,QAAI,KAAK,oBAAoB,QAAW;AACpC,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACxD;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,iBAAyB;AACzB,QAAI,KAAK,mBAAmB,QAAW;AACnC,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACvD;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,eAAe,aAAgC,MAAoD;AACrG,UAAM,WAAW,KAAK,oBAAoB;AAC1C,UAAM,MAAMF,UAAS,YAAY,MAAgB;AACjD,UAAM,WAAW,MAAMG,8BAA6B,UAAU,OAAO,KAAK,GAAG,GAAG,IAAI;AACpF,WAAOG,oBAAmB,KAAK,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAM,gBAAgB,aAAgC,aAAwD;AAC1G,UAAM,WAAW,KAAK,oBAAoB;AAC1C,UAAM,MAAMN,UAAS,YAAY,MAAgB;AACjD,UAAM,WAAW,MAAM,SAAS,mBAAmB,KAAK,WAAW;AACnE,WAAOK,oBAAmB,KAAK,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAM,gBAAgB,aAAiC,MAAgD;AAEnG,UAAM,uBAAuB,YAAY;AAEzC,UAAM,WAAW,KAAK,oBAAoB;AAE1C,UAAM,KAAK,KAAK,qBAAqB,oBAAoB;AACzD,QAAI,uBAAuB,EAAE,GAAG;AAC5B,UAAI,qBAAqB,SAAS;AAC9B,WAAG,KAAK,qBAAqB,OAAO;AAAA,MACxC;AAGA,SAAG,KAAK,CAAC,KAAK,OAAO,CAAC;AAAA,IAC1B,OAAO;AACH,SAAG,WAAW,GAAG,YAAY,KAAK;AAClC,SAAG,mBAAmB,MAAM,SAAS,mBAAmB,MAAM,mBAAmB,GAAG;AAEpF,UAAI,qBAAqB,SAAS;AAC9B,mBAAW,UAAU,qBAAqB,SAAS;AAC/C,aAAG,YAAY,MAAM;AAAA,QACzB;AAAA,MACJ;AACA,UAAI,qBAAqB,WAAW;AAChC,mBAAW,UAAU,qBAAqB,WAAW;AACjD,iBAAO,YAAY,EAAE;AAAA,QACzB;AAAA,MACJ;AAEA,SAAG,YAAY,KAAK,OAAO;AAAA,IAC/B;AACA,UAAM,WAAWJ,SAAQ,GAAG,UAAU,CAAC;AACvC,WAAOG,mBAAkB,KAAK,QAAQ;AAAA,EAC1C;AAAA,EAEA,MAAM,WAAW,SAA0C;AACvD,UAAM,QAAQ,QAAQ;AACtB,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EAEA,YAAY,IAA8C;AACtD,QAAI,uBAAuB,EAAE,GAAG;AAC5B,SAAG,KAAK,CAAC,KAAK,OAAO,CAAC;AAAA,IAC1B,OAAO;AACH,SAAG,YAAY,KAAK,OAAO;AAAA,IAC/B;AAAA,EACJ;AAAA,EAEQ,qBAAqB,sBAAsF;AAO/G,UAAM,KAAK,IAAI,YAAY;AAG3B,OAAG,IAAI,GAAG,qBAAqB,YAAY;AAE3C,WAAO;AAAA,EACX;AAAA,EAEQ,sBAAkC;AACtC,QAAI,CAAC,KAAK,UAAU;AAChB,YAAM,IAAI,MAAM,gFAAgF;AAAA,IACpG;AACA,WAAO,KAAK;AAAA,EAChB;AACJ;AAEA,SAAS,WAAW,UAAkB,OAAO,oBAAmE;AAC5G,QAAM,OAAa,yBAAmB,UAAU,EAAE;AAClD,QAAM,aAAa,WAAW,MAAM,KAAK,SAAS,KAAK,CAAC,EAAE;AAC1D,SAAO,EAAE,iBAAiBH,SAAQ,UAAU,GAAG,SAAS,QAAQ,SAAS,UAAU,EAAE;AACzF","sourcesContent":["import { arrayify } from '@ethersproject/bytes'\nimport {\n ConfirmOptions,\n Connection,\n Finality,\n GetVersionedTransactionConfig,\n ParsedTransactionWithMeta,\n PublicKey,\n SendOptions,\n TransactionSignature,\n sendAndConfirmRawTransaction,\n} from '@solana/web3.js'\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 { arrayify, hexlify } from '@ethersproject/bytes'\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'\n\nimport {\n Provider,\n SignedTransaction,\n Signer,\n TransactionPending,\n TransactionReceipt,\n TransactionRequest,\n} from '@layerzerolabs/lz-core'\n\nimport { getECDSAPublicKey } from '../ecdsa'\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 private ecdsaPublicKey?: string\n\n private constructor(keypair: Keypair, ecdsaPrivateKey?: string) {\n this.keypair = keypair\n this.ecdsaPrivateKey = ecdsaPrivateKey\n if (ecdsaPrivateKey !== undefined) {\n this.ecdsaPublicKey = getECDSAPublicKey(ecdsaPrivateKey)\n }\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 === undefined) {\n throw new Error('ECDSA private key is not available')\n }\n return this.ecdsaPrivateKey\n }\n\n get ECDSAPublicKey(): string {\n if (this.ecdsaPublicKey === undefined) {\n throw new Error('ECDSA public key is not available')\n }\n return this.ecdsaPublicKey\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","import { hexlify } from '@ethersproject/bytes'\nimport { getPublicKey, sign } from '@noble/secp256k1'\n\nexport { recoverPublicKey } from '@noble/secp256k1'\n\nexport async function signWithECDSA(\n data: Buffer,\n privateKey: string\n): Promise<{ signature: Uint8Array; recoveryId: number }> {\n const [signature, recoveryId] = await sign(data, privateKey.replace('0x', ''), {\n canonical: true,\n recovered: true,\n der: false,\n })\n return {\n signature,\n recoveryId,\n }\n}\n\nexport function getECDSAPublicKey(privateKey: string): string {\n // remove the compression byte\n return hexlify(getPublicKey(privateKey.replace('0x', '')).subarray(1))\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@layerzerolabs/lz-corekit-solana",
3
- "version": "2.3.16",
3
+ "version": "2.3.18",
4
4
  "description": "LayerZero Core Library",
5
5
  "license": "BUSL-1.1",
6
6
  "exports": {
@@ -24,24 +24,21 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@coral-xyz/anchor": "^0.29.0",
27
- "@layerzerolabs/lz-aptos-sdk-v1": "^2.3.16",
28
- "@layerzerolabs/lz-core": "^2.3.16",
29
- "@layerzerolabs/lz-utilities": "^2.3.16",
30
- "@layerzerolabs/tron-utilities": "^2.3.16",
27
+ "@ethersproject/bytes": "^5.7.0",
28
+ "@layerzerolabs/lz-core": "^2.3.18",
29
+ "@noble/hashes": "^1.3.2",
30
+ "@noble/secp256k1": "^1.7.1",
31
31
  "@solana/web3.js": "^1.91.8",
32
- "aptos": "^1.20.0",
33
32
  "bip39": "^3.1.0",
34
33
  "ed25519-hd-key": "^1.3.0",
35
- "ethers": "^5.7.2",
36
34
  "mem": "^8.1.1",
37
- "tiny-invariant": "^1.3.1",
38
- "tronweb": "^5.3.1"
35
+ "tiny-invariant": "^1.3.1"
39
36
  },
40
37
  "devDependencies": {
41
38
  "@jest/globals": "^29.7.0",
42
39
  "@layerzerolabs/tronweb-typescript": "^0.0.0",
43
- "@layerzerolabs/tsup-config-next": "^2.3.16",
44
- "@layerzerolabs/typescript-config-next": "^2.3.16",
40
+ "@layerzerolabs/tsup-config-next": "^2.3.18",
41
+ "@layerzerolabs/typescript-config-next": "^2.3.18",
45
42
  "@types/jest": "^29.5.10",
46
43
  "@types/tronweb": "npm:@layerzerolabs/tronweb-typescript@workspace:^",
47
44
  "jest": "^29.7.0",