@layerzerolabs/lz-corekit-solana 2.3.8 → 2.3.10

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,27 @@
1
1
  # @layerzerolabs/lz-corekit-solana
2
2
 
3
+ ## 2.3.10
4
+
5
+ ### Patch Changes
6
+
7
+ - b9804e1: export tron and zksync artifacts to sdk
8
+ - Updated dependencies [b9804e1]
9
+ - @layerzerolabs/lz-core@2.3.10
10
+ - @layerzerolabs/tron-utilities@2.3.10
11
+ - @layerzerolabs/lz-utilities@2.3.10
12
+ - @layerzerolabs/lz-aptos-sdk-v1@2.3.10
13
+
14
+ ## 2.3.9
15
+
16
+ ### Patch Changes
17
+
18
+ - c208955: minor update & fix some bugs
19
+ - Updated dependencies [c208955]
20
+ - @layerzerolabs/lz-core@2.3.9
21
+ - @layerzerolabs/tron-utilities@2.3.9
22
+ - @layerzerolabs/lz-utilities@2.3.9
23
+ - @layerzerolabs/lz-aptos-sdk-v1@2.3.9
24
+
3
25
  ## 2.3.8
4
26
 
5
27
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -6,6 +6,7 @@ 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
10
 
10
11
  function _interopNamespace(e) {
11
12
  if (e && e.__esModule) return e;
@@ -118,6 +119,9 @@ var SolanaSigner = class {
118
119
  constructor(keypair, ecdsaPrivateKey) {
119
120
  this.keypair = keypair;
120
121
  this.ecdsaPrivateKey = ecdsaPrivateKey;
122
+ if (ecdsaPrivateKey) {
123
+ this.ecdsaPublicKey = lzUtilities.getECDSAPublicKey(ecdsaPrivateKey);
124
+ }
121
125
  }
122
126
  static from(source, path) {
123
127
  if (source instanceof web3_js.Keypair) {
@@ -157,6 +161,12 @@ var SolanaSigner = class {
157
161
  }
158
162
  return this.ecdsaPrivateKey;
159
163
  }
164
+ get ECDSAPublicKey() {
165
+ if (!this.ecdsaPublicKey) {
166
+ throw new Error("ECDSA public key is not available");
167
+ }
168
+ return this.ecdsaPublicKey;
169
+ }
160
170
  async sendAndConfirm(transaction, opts) {
161
171
  const provider = this.assetAndGetProvider();
162
172
  const stx = utils.arrayify(transaction.signed);
@@ -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'\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"]}
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"]}
package/dist/index.d.mts CHANGED
@@ -34,6 +34,7 @@ declare class SolanaSigner implements Signer$1 {
34
34
  private readonly keypair;
35
35
  private provider?;
36
36
  private ecdsaPrivateKey?;
37
+ private ecdsaPublicKey?;
37
38
  private constructor();
38
39
  static from(source: Keypair): SolanaSigner;
39
40
  static from(mnemonic: string, path: string): SolanaSigner;
@@ -44,6 +45,7 @@ declare class SolanaSigner implements Signer$1 {
44
45
  get publicKey(): PublicKey;
45
46
  get secretKey(): Uint8Array;
46
47
  get ECDSAPrivateKey(): string;
48
+ get ECDSAPublicKey(): string;
47
49
  sendAndConfirm(transaction: SignedTransaction, opts?: ConfirmOptions): Promise<TransactionReceipt>;
48
50
  sendTransaction(transaction: SignedTransaction, sendOptions?: SendOptions): Promise<TransactionPending>;
49
51
  signTransaction(transaction: TransactionRequest, opts?: SendOptions): Promise<SignedTransaction>;
package/dist/index.d.ts CHANGED
@@ -34,6 +34,7 @@ declare class SolanaSigner implements Signer$1 {
34
34
  private readonly keypair;
35
35
  private provider?;
36
36
  private ecdsaPrivateKey?;
37
+ private ecdsaPublicKey?;
37
38
  private constructor();
38
39
  static from(source: Keypair): SolanaSigner;
39
40
  static from(mnemonic: string, path: string): SolanaSigner;
@@ -44,6 +45,7 @@ declare class SolanaSigner implements Signer$1 {
44
45
  get publicKey(): PublicKey;
45
46
  get secretKey(): Uint8Array;
46
47
  get ECDSAPrivateKey(): string;
48
+ get ECDSAPublicKey(): string;
47
49
  sendAndConfirm(transaction: SignedTransaction, opts?: ConfirmOptions): Promise<TransactionReceipt>;
48
50
  sendTransaction(transaction: SignedTransaction, sendOptions?: SendOptions): Promise<TransactionPending>;
49
51
  signTransaction(transaction: TransactionRequest, opts?: SendOptions): Promise<SignedTransaction>;
package/dist/index.mjs CHANGED
@@ -4,6 +4,7 @@ import { Block, TransactionResponse, TransactionReceipt, BlockWithTransactions,
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
8
 
8
9
  // src/providers/solana.ts
9
10
  var SolanaProvider = class _SolanaProvider {
@@ -96,6 +97,9 @@ var SolanaSigner = class {
96
97
  constructor(keypair, ecdsaPrivateKey) {
97
98
  this.keypair = keypair;
98
99
  this.ecdsaPrivateKey = ecdsaPrivateKey;
100
+ if (ecdsaPrivateKey) {
101
+ this.ecdsaPublicKey = getECDSAPublicKey(ecdsaPrivateKey);
102
+ }
99
103
  }
100
104
  static from(source, path) {
101
105
  if (source instanceof Keypair) {
@@ -135,6 +139,12 @@ var SolanaSigner = class {
135
139
  }
136
140
  return this.ecdsaPrivateKey;
137
141
  }
142
+ get ECDSAPublicKey() {
143
+ if (!this.ecdsaPublicKey) {
144
+ throw new Error("ECDSA public key is not available");
145
+ }
146
+ return this.ecdsaPublicKey;
147
+ }
138
148
  async sendAndConfirm(transaction, opts) {
139
149
  const provider = this.assetAndGetProvider();
140
150
  const stx = arrayify(transaction.signed);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/providers/solana.ts","../src/signers/solana.ts"],"names":["Connection","sendAndConfirmRawTransaction","arrayify","SignedTransaction","TransactionPending","TransactionReceipt"],"mappings":";AAAA;AAAA,EAEI;AAAA,EAIA;AAAA,EAGA;AAAA,OACG;AACP,SAAS,gBAAgB;AAEzB;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;AAAA,EAEI,cAAAA;AAAA,EACA;AAAA,EAIA;AAAA,EAGA,gCAAAC;AAAA,OACG;AACP,YAAY,WAAW;AACvB,SAAS,kBAAkB;AAC3B,SAAS,YAAAC,WAAU,eAAe;AAElC;AAAA,EAEI,qBAAAC;AAAA,EAEA,sBAAAC;AAAA,EACA,sBAAAC;AAAA,OAEG;AASA,IAAM,eAAN,MAAqC;AAAA,EAKhC,YAAY,SAAkB,iBAA0B;AAC5D,SAAK,UAAU;AACf,SAAK,kBAAkB;AAAA,EAC3B;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,kBAAkBL,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,CAAC,KAAK,iBAAiB;AACvB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACxD;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,eAAe,aAAgC,MAAoD;AACrG,UAAM,WAAW,KAAK,oBAAoB;AAC1C,UAAM,MAAME,UAAS,YAAY,MAAgB;AACjD,UAAM,WAAW,MAAMD,8BAA6B,UAAU,OAAO,KAAK,GAAG,GAAG,IAAI;AACpF,WAAOI,oBAAmB,KAAK,QAAQ;AAAA,EAC3C;AAAA,EAEA,MAAM,gBAAgB,aAAgC,aAAwD;AAC1G,UAAM,WAAW,KAAK,oBAAoB;AAC1C,UAAM,MAAMH,UAAS,YAAY,MAAgB;AACjD,UAAM,WAAW,MAAM,SAAS,mBAAmB,KAAK,WAAW;AACnE,WAAOE,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,WAAW,QAAQ,GAAG,UAAU,CAAC;AACvC,WAAOD,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,iBAAiB,QAAQ,UAAU,GAAG,SAAS,QAAQ,SAAS,UAAU,EAAE;AACzF","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"]}
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@layerzerolabs/lz-corekit-solana",
3
- "version": "2.3.8",
3
+ "version": "2.3.10",
4
4
  "description": "LayerZero Core Library",
5
5
  "license": "BUSL-1.1",
6
6
  "exports": {
@@ -24,10 +24,10 @@
24
24
  },
25
25
  "dependencies": {
26
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",
27
+ "@layerzerolabs/lz-aptos-sdk-v1": "^2.3.10",
28
+ "@layerzerolabs/lz-core": "^2.3.10",
29
+ "@layerzerolabs/lz-utilities": "^2.3.10",
30
+ "@layerzerolabs/tron-utilities": "^2.3.10",
31
31
  "@solana/web3.js": "^1.91.8",
32
32
  "aptos": "^1.20.0",
33
33
  "bip39": "^3.1.0",
@@ -40,8 +40,8 @@
40
40
  "devDependencies": {
41
41
  "@jest/globals": "^29.7.0",
42
42
  "@layerzerolabs/tronweb-typescript": "^0.0.0",
43
- "@layerzerolabs/tsup-config-next": "^2.3.8",
44
- "@layerzerolabs/typescript-config-next": "^2.3.8",
43
+ "@layerzerolabs/tsup-config-next": "^2.3.10",
44
+ "@layerzerolabs/typescript-config-next": "^2.3.10",
45
45
  "@types/jest": "^29.5.10",
46
46
  "@types/tronweb": "npm:@layerzerolabs/tronweb-typescript@workspace:^",
47
47
  "jest": "^29.7.0",