@layerzerolabs/lz-corekit-solana 2.3.17 → 2.3.19
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 +16 -0
- package/dist/index.cjs +31 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +8 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.mjs +26 -12
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @layerzerolabs/lz-corekit-solana
|
|
2
2
|
|
|
3
|
+
## 2.3.19
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 5fce234: minor update & fix some bugs
|
|
8
|
+
- Updated dependencies [5fce234]
|
|
9
|
+
- @layerzerolabs/lz-core@2.3.19
|
|
10
|
+
|
|
11
|
+
## 2.3.18
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- d7ddb1e: Make `solana-sdk` compatible with browsers
|
|
16
|
+
- Updated dependencies [d7ddb1e]
|
|
17
|
+
- @layerzerolabs/lz-core@2.3.18
|
|
18
|
+
|
|
3
19
|
## 2.3.17
|
|
4
20
|
|
|
5
21
|
### 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 ethers = require('ethers');
|
|
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
|
|
9
|
+
var secp256k1 = require('@noble/secp256k1');
|
|
10
10
|
|
|
11
11
|
function _interopNamespace(e) {
|
|
12
12
|
if (e && e.__esModule) return e;
|
|
@@ -102,28 +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(
|
|
106
|
-
Buffer.from(ethers.ethers.utils.arrayify(_transaction)),
|
|
107
|
-
sendOptions
|
|
108
|
-
);
|
|
105
|
+
const response = await this.nativeProvider.sendRawTransaction(Buffer.from(bytes.arrayify(_transaction)), sendOptions);
|
|
109
106
|
return lzCore.TransactionPending.from(response);
|
|
110
107
|
}
|
|
111
108
|
async sendAndConfirm(transaction, opts) {
|
|
112
109
|
const _transaction = transaction.signed;
|
|
113
110
|
const response = await web3_js.sendAndConfirmRawTransaction(
|
|
114
111
|
this.nativeProvider,
|
|
115
|
-
Buffer.from(
|
|
112
|
+
Buffer.from(bytes.arrayify(_transaction)),
|
|
116
113
|
opts
|
|
117
114
|
);
|
|
118
115
|
return lzCore.TransactionReceipt.from(response);
|
|
119
116
|
}
|
|
120
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
|
|
121
134
|
var SolanaSigner = class {
|
|
122
135
|
constructor(keypair, ecdsaPrivateKey) {
|
|
123
136
|
this.keypair = keypair;
|
|
124
137
|
this.ecdsaPrivateKey = ecdsaPrivateKey;
|
|
125
138
|
if (ecdsaPrivateKey !== void 0) {
|
|
126
|
-
this.ecdsaPublicKey =
|
|
139
|
+
this.ecdsaPublicKey = getECDSAPublicKey(ecdsaPrivateKey);
|
|
127
140
|
}
|
|
128
141
|
}
|
|
129
142
|
static from(source, path) {
|
|
@@ -172,13 +185,13 @@ var SolanaSigner = class {
|
|
|
172
185
|
}
|
|
173
186
|
async sendAndConfirm(transaction, opts) {
|
|
174
187
|
const provider = this.assetAndGetProvider();
|
|
175
|
-
const stx =
|
|
188
|
+
const stx = bytes.arrayify(transaction.signed);
|
|
176
189
|
const response = await web3_js.sendAndConfirmRawTransaction(provider, Buffer.from(stx), opts);
|
|
177
190
|
return lzCore.TransactionReceipt.from(response);
|
|
178
191
|
}
|
|
179
192
|
async sendTransaction(transaction, sendOptions) {
|
|
180
193
|
const provider = this.assetAndGetProvider();
|
|
181
|
-
const stx =
|
|
194
|
+
const stx = bytes.arrayify(transaction.signed);
|
|
182
195
|
const response = await provider.sendRawTransaction(stx, sendOptions);
|
|
183
196
|
return lzCore.TransactionPending.from(response);
|
|
184
197
|
}
|
|
@@ -206,7 +219,7 @@ var SolanaSigner = class {
|
|
|
206
219
|
}
|
|
207
220
|
tx.partialSign(this.keypair);
|
|
208
221
|
}
|
|
209
|
-
const response =
|
|
222
|
+
const response = bytes.hexlify(tx.serialize());
|
|
210
223
|
return lzCore.SignedTransaction.from(response);
|
|
211
224
|
}
|
|
212
225
|
async signBuffer(_buffer) {
|
|
@@ -235,10 +248,16 @@ var SolanaSigner = class {
|
|
|
235
248
|
function getKeypair(mnemonic, path = "m/44'/501'/0'/0'") {
|
|
236
249
|
const seed = bip39__namespace.mnemonicToSeedSync(mnemonic, "");
|
|
237
250
|
const privateKey = ed25519HdKey.derivePath(path, seed.toString("hex")).key;
|
|
238
|
-
return { ecdsaPrivateKey:
|
|
251
|
+
return { ecdsaPrivateKey: bytes.hexlify(privateKey), keypair: web3_js.Keypair.fromSeed(privateKey) };
|
|
239
252
|
}
|
|
240
253
|
|
|
254
|
+
Object.defineProperty(exports, "recoverPublicKey", {
|
|
255
|
+
enumerable: true,
|
|
256
|
+
get: function () { return secp256k1.recoverPublicKey; }
|
|
257
|
+
});
|
|
241
258
|
exports.SolanaProvider = SolanaProvider;
|
|
242
259
|
exports.SolanaSigner = SolanaSigner;
|
|
260
|
+
exports.getECDSAPublicKey = getECDSAPublicKey;
|
|
261
|
+
exports.signWithECDSA = signWithECDSA;
|
|
243
262
|
//# sourceMappingURL=out.js.map
|
|
244
263
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/solana.ts","../src/signers/solana.ts"],"names":["Connection","sendAndConfirmRawTransaction","ethers","SignedTransaction","TransactionPending","TransactionReceipt"],"mappings":";AAAA;AAAA,EAEI;AAAA,EAIA;AAAA,EAGA;AAAA,OACG;AACP,SAAS,cAAc;AAEvB;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;AAAA,MACvC,OAAO,KAAK,OAAO,MAAM,SAAS,YAAY,CAAC;AAAA,MAC/C;AAAA,IACJ;AACA,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,OAAO,MAAM,SAAS,YAAY,CAAC;AAAA,MAC/C;AAAA,IACJ;AACA,WAAO,mBAAmB,KAAK,QAAQ;AAAA,EAC3C;AACJ;;;ACrIA,SAAS,8BAA8B;AACvC;AAAA,EAEI,cAAAA;AAAA,EACA;AAAA,EAIA;AAAA,EAGA,gCAAAC;AAAA,OACG;AACP,YAAY,WAAW;AACvB,SAAS,kBAAkB;AAC3B,SAAS,UAAAC,eAAc;AAEvB;AAAA,EAEI,qBAAAC;AAAA,EAEA,sBAAAC;AAAA,EACA,sBAAAC;AAAA,OAEG;AACP,SAAS,yBAAyB;AAS3B,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,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,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,MAAME,QAAO,MAAM,SAAS,YAAY,MAAgB;AAC9D,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,QAAO,MAAM,SAAS,YAAY,MAAgB;AAC9D,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,WAAWF,QAAO,MAAM,QAAQ,GAAG,UAAU,CAAC;AACpD,WAAOC,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,iBAAiBD,QAAO,MAAM,QAAQ,UAAU,GAAG,SAAS,QAAQ,SAAS,UAAU,EAAE;AACtG","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 { ethers } from 'ethers'\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(\n Buffer.from(ethers.utils.arrayify(_transaction)),\n sendOptions\n )\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(ethers.utils.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 { ethers } from 'ethers'\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 !== 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 = ethers.utils.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 = ethers.utils.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 = ethers.utils.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: ethers.utils.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
|
-
|
|
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
|
-
|
|
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 { ethers } from 'ethers';
|
|
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 {
|
|
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 {
|
|
@@ -80,22 +81,35 @@ var SolanaProvider = class _SolanaProvider {
|
|
|
80
81
|
}
|
|
81
82
|
async sendTransaction(transaction, sendOptions) {
|
|
82
83
|
const _transaction = transaction.signed;
|
|
83
|
-
const response = await this.nativeProvider.sendRawTransaction(
|
|
84
|
-
Buffer.from(ethers.utils.arrayify(_transaction)),
|
|
85
|
-
sendOptions
|
|
86
|
-
);
|
|
84
|
+
const response = await this.nativeProvider.sendRawTransaction(Buffer.from(arrayify(_transaction)), sendOptions);
|
|
87
85
|
return TransactionPending.from(response);
|
|
88
86
|
}
|
|
89
87
|
async sendAndConfirm(transaction, opts) {
|
|
90
88
|
const _transaction = transaction.signed;
|
|
91
89
|
const response = await sendAndConfirmRawTransaction(
|
|
92
90
|
this.nativeProvider,
|
|
93
|
-
Buffer.from(
|
|
91
|
+
Buffer.from(arrayify(_transaction)),
|
|
94
92
|
opts
|
|
95
93
|
);
|
|
96
94
|
return TransactionReceipt.from(response);
|
|
97
95
|
}
|
|
98
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
|
|
99
113
|
var SolanaSigner = class {
|
|
100
114
|
constructor(keypair, ecdsaPrivateKey) {
|
|
101
115
|
this.keypair = keypair;
|
|
@@ -150,13 +164,13 @@ var SolanaSigner = class {
|
|
|
150
164
|
}
|
|
151
165
|
async sendAndConfirm(transaction, opts) {
|
|
152
166
|
const provider = this.assetAndGetProvider();
|
|
153
|
-
const stx =
|
|
167
|
+
const stx = arrayify(transaction.signed);
|
|
154
168
|
const response = await sendAndConfirmRawTransaction(provider, Buffer.from(stx), opts);
|
|
155
169
|
return TransactionReceipt.from(response);
|
|
156
170
|
}
|
|
157
171
|
async sendTransaction(transaction, sendOptions) {
|
|
158
172
|
const provider = this.assetAndGetProvider();
|
|
159
|
-
const stx =
|
|
173
|
+
const stx = arrayify(transaction.signed);
|
|
160
174
|
const response = await provider.sendRawTransaction(stx, sendOptions);
|
|
161
175
|
return TransactionPending.from(response);
|
|
162
176
|
}
|
|
@@ -184,7 +198,7 @@ var SolanaSigner = class {
|
|
|
184
198
|
}
|
|
185
199
|
tx.partialSign(this.keypair);
|
|
186
200
|
}
|
|
187
|
-
const response =
|
|
201
|
+
const response = hexlify(tx.serialize());
|
|
188
202
|
return SignedTransaction.from(response);
|
|
189
203
|
}
|
|
190
204
|
async signBuffer(_buffer) {
|
|
@@ -213,9 +227,9 @@ var SolanaSigner = class {
|
|
|
213
227
|
function getKeypair(mnemonic, path = "m/44'/501'/0'/0'") {
|
|
214
228
|
const seed = bip39.mnemonicToSeedSync(mnemonic, "");
|
|
215
229
|
const privateKey = derivePath(path, seed.toString("hex")).key;
|
|
216
|
-
return { ecdsaPrivateKey:
|
|
230
|
+
return { ecdsaPrivateKey: hexlify(privateKey), keypair: Keypair.fromSeed(privateKey) };
|
|
217
231
|
}
|
|
218
232
|
|
|
219
|
-
export { SolanaProvider, SolanaSigner };
|
|
233
|
+
export { SolanaProvider, SolanaSigner, getECDSAPublicKey, signWithECDSA };
|
|
220
234
|
//# sourceMappingURL=out.js.map
|
|
221
235
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/solana.ts","../src/signers/solana.ts"],"names":["Connection","sendAndConfirmRawTransaction","ethers","SignedTransaction","TransactionPending","TransactionReceipt"],"mappings":";AAAA;AAAA,EAEI;AAAA,EAIA;AAAA,EAGA;AAAA,OACG;AACP,SAAS,cAAc;AAEvB;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;AAAA,MACvC,OAAO,KAAK,OAAO,MAAM,SAAS,YAAY,CAAC;AAAA,MAC/C;AAAA,IACJ;AACA,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,OAAO,MAAM,SAAS,YAAY,CAAC;AAAA,MAC/C;AAAA,IACJ;AACA,WAAO,mBAAmB,KAAK,QAAQ;AAAA,EAC3C;AACJ;;;ACrIA,SAAS,8BAA8B;AACvC;AAAA,EAEI,cAAAA;AAAA,EACA;AAAA,EAIA;AAAA,EAGA,gCAAAC;AAAA,OACG;AACP,YAAY,WAAW;AACvB,SAAS,kBAAkB;AAC3B,SAAS,UAAAC,eAAc;AAEvB;AAAA,EAEI,qBAAAC;AAAA,EAEA,sBAAAC;AAAA,EACA,sBAAAC;AAAA,OAEG;AACP,SAAS,yBAAyB;AAS3B,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,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,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,MAAME,QAAO,MAAM,SAAS,YAAY,MAAgB;AAC9D,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,QAAO,MAAM,SAAS,YAAY,MAAgB;AAC9D,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,WAAWF,QAAO,MAAM,QAAQ,GAAG,UAAU,CAAC;AACpD,WAAOC,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,iBAAiBD,QAAO,MAAM,QAAQ,UAAU,GAAG,SAAS,QAAQ,SAAS,UAAU,EAAE;AACtG","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 { ethers } from 'ethers'\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(\n Buffer.from(ethers.utils.arrayify(_transaction)),\n sendOptions\n )\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(ethers.utils.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 { ethers } from 'ethers'\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 !== 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 = ethers.utils.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 = ethers.utils.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 = ethers.utils.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: ethers.utils.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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layerzerolabs/lz-corekit-solana",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.19",
|
|
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
|
-
"@
|
|
28
|
-
"@layerzerolabs/lz-core": "^2.3.
|
|
29
|
-
"@
|
|
30
|
-
"@
|
|
27
|
+
"@ethersproject/bytes": "^5.7.0",
|
|
28
|
+
"@layerzerolabs/lz-core": "^2.3.19",
|
|
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.
|
|
44
|
-
"@layerzerolabs/typescript-config-next": "^2.3.
|
|
40
|
+
"@layerzerolabs/tsup-config-next": "^2.3.19",
|
|
41
|
+
"@layerzerolabs/typescript-config-next": "^2.3.19",
|
|
45
42
|
"@types/jest": "^29.5.10",
|
|
46
43
|
"@types/tronweb": "npm:@layerzerolabs/tronweb-typescript@workspace:^",
|
|
47
44
|
"jest": "^29.7.0",
|