@wormhole-foundation/sdk-solana 0.5.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/cjs/address.d.ts +26 -0
- package/dist/cjs/address.d.ts.map +1 -0
- package/dist/cjs/address.js +56 -0
- package/dist/cjs/address.js.map +1 -0
- package/dist/cjs/chain.d.ts +6 -0
- package/dist/cjs/chain.d.ts.map +1 -0
- package/dist/cjs/chain.js +19 -0
- package/dist/cjs/chain.js.map +1 -0
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +24 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/platform.d.ts +29 -0
- package/dist/cjs/platform.d.ts.map +1 -0
- package/dist/cjs/platform.js +130 -0
- package/dist/cjs/platform.js.map +1 -0
- package/dist/cjs/signer.d.ts +38 -0
- package/dist/cjs/signer.d.ts.map +1 -0
- package/dist/cjs/signer.js +173 -0
- package/dist/cjs/signer.js.map +1 -0
- package/dist/cjs/testing/debug.d.ts +3 -0
- package/dist/cjs/testing/debug.d.ts.map +1 -0
- package/dist/cjs/testing/debug.js +14 -0
- package/dist/cjs/testing/debug.js.map +1 -0
- package/dist/cjs/testing/index.d.ts +7 -0
- package/dist/cjs/testing/index.d.ts.map +1 -0
- package/dist/cjs/testing/index.js +37 -0
- package/dist/cjs/testing/index.js.map +1 -0
- package/dist/cjs/testing/sendSigner.d.ts +18 -0
- package/dist/cjs/testing/sendSigner.d.ts.map +1 -0
- package/dist/cjs/testing/sendSigner.js +119 -0
- package/dist/cjs/testing/sendSigner.js.map +1 -0
- package/dist/cjs/testing/signer.d.ts +15 -0
- package/dist/cjs/testing/signer.d.ts.map +1 -0
- package/dist/cjs/testing/signer.js +39 -0
- package/dist/cjs/testing/signer.js.map +1 -0
- package/dist/cjs/types.d.ts +16 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +10 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/unsignedTransaction.d.ts +16 -0
- package/dist/cjs/unsignedTransaction.d.ts.map +1 -0
- package/dist/cjs/unsignedTransaction.js +19 -0
- package/dist/cjs/unsignedTransaction.js.map +1 -0
- package/dist/cjs/utils/anchor/common.d.ts +3 -0
- package/dist/cjs/utils/anchor/common.d.ts.map +1 -0
- package/dist/cjs/utils/anchor/common.js +95 -0
- package/dist/cjs/utils/anchor/common.js.map +1 -0
- package/dist/cjs/utils/anchor/error.d.ts +4 -0
- package/dist/cjs/utils/anchor/error.d.ts.map +1 -0
- package/dist/cjs/utils/anchor/error.js +14 -0
- package/dist/cjs/utils/anchor/error.js.map +1 -0
- package/dist/cjs/utils/anchor/idl.d.ts +123 -0
- package/dist/cjs/utils/anchor/idl.d.ts.map +1 -0
- package/dist/cjs/utils/anchor/idl.js +58 -0
- package/dist/cjs/utils/anchor/idl.js.map +1 -0
- package/dist/cjs/utils/anchor/index.d.ts +4 -0
- package/dist/cjs/utils/anchor/index.d.ts.map +1 -0
- package/dist/cjs/utils/anchor/index.js +20 -0
- package/dist/cjs/utils/anchor/index.js.map +1 -0
- package/dist/cjs/utils/index.d.ts +5 -0
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/utils/index.js +43 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/utils/account.d.ts +34 -0
- package/dist/cjs/utils/utils/account.d.ts.map +1 -0
- package/dist/cjs/utils/utils/account.js +59 -0
- package/dist/cjs/utils/utils/account.js.map +1 -0
- package/dist/cjs/utils/utils/bpfLoaderUpgradeable.d.ts +6 -0
- package/dist/cjs/utils/utils/bpfLoaderUpgradeable.d.ts.map +1 -0
- package/dist/cjs/utils/utils/bpfLoaderUpgradeable.js +14 -0
- package/dist/cjs/utils/utils/bpfLoaderUpgradeable.js.map +1 -0
- package/dist/cjs/utils/utils/connection.d.ts +4 -0
- package/dist/cjs/utils/utils/connection.d.ts.map +1 -0
- package/dist/cjs/utils/utils/connection.js +11 -0
- package/dist/cjs/utils/utils/connection.js.map +1 -0
- package/dist/cjs/utils/utils/index.d.ts +6 -0
- package/dist/cjs/utils/utils/index.d.ts.map +1 -0
- package/dist/cjs/utils/utils/index.js +27 -0
- package/dist/cjs/utils/utils/index.js.map +1 -0
- package/dist/cjs/utils/utils/secp256k1.d.ts +30 -0
- package/dist/cjs/utils/utils/secp256k1.d.ts.map +1 -0
- package/dist/cjs/utils/utils/secp256k1.js +111 -0
- package/dist/cjs/utils/utils/secp256k1.js.map +1 -0
- package/dist/cjs/utils/utils/splMetadata.d.ts +62 -0
- package/dist/cjs/utils/utils/splMetadata.d.ts.map +1 -0
- package/dist/cjs/utils/utils/splMetadata.js +212 -0
- package/dist/cjs/utils/utils/splMetadata.js.map +1 -0
- package/dist/cjs/utils/utils/transaction.d.ts +63 -0
- package/dist/cjs/utils/utils/transaction.d.ts.map +1 -0
- package/dist/cjs/utils/utils/transaction.js +128 -0
- package/dist/cjs/utils/utils/transaction.js.map +1 -0
- package/dist/esm/address.d.ts +26 -0
- package/dist/esm/address.d.ts.map +1 -0
- package/dist/esm/address.js +52 -0
- package/dist/esm/address.js.map +1 -0
- package/dist/esm/chain.d.ts +6 -0
- package/dist/esm/chain.d.ts.map +1 -0
- package/dist/esm/chain.js +15 -0
- package/dist/esm/chain.js.map +1 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/platform.d.ts +29 -0
- package/dist/esm/platform.d.ts.map +1 -0
- package/dist/esm/platform.js +126 -0
- package/dist/esm/platform.js.map +1 -0
- package/dist/esm/signer.d.ts +38 -0
- package/dist/esm/signer.d.ts.map +1 -0
- package/dist/esm/signer.js +165 -0
- package/dist/esm/signer.js.map +1 -0
- package/dist/esm/testing/debug.d.ts +3 -0
- package/dist/esm/testing/debug.d.ts.map +1 -0
- package/dist/esm/testing/debug.js +10 -0
- package/dist/esm/testing/debug.js.map +1 -0
- package/dist/esm/testing/index.d.ts +7 -0
- package/dist/esm/testing/index.d.ts.map +1 -0
- package/dist/esm/testing/index.js +18 -0
- package/dist/esm/testing/index.js.map +1 -0
- package/dist/esm/testing/sendSigner.d.ts +18 -0
- package/dist/esm/testing/sendSigner.d.ts.map +1 -0
- package/dist/esm/testing/sendSigner.js +115 -0
- package/dist/esm/testing/sendSigner.js.map +1 -0
- package/dist/esm/testing/signer.d.ts +15 -0
- package/dist/esm/testing/signer.d.ts.map +1 -0
- package/dist/esm/testing/signer.js +35 -0
- package/dist/esm/testing/signer.js.map +1 -0
- package/dist/esm/types.d.ts +16 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +7 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/unsignedTransaction.d.ts +16 -0
- package/dist/esm/unsignedTransaction.d.ts.map +1 -0
- package/dist/esm/unsignedTransaction.js +15 -0
- package/dist/esm/unsignedTransaction.js.map +1 -0
- package/dist/esm/utils/anchor/common.d.ts +3 -0
- package/dist/esm/utils/anchor/common.d.ts.map +1 -0
- package/dist/esm/utils/anchor/common.js +91 -0
- package/dist/esm/utils/anchor/common.js.map +1 -0
- package/dist/esm/utils/anchor/error.d.ts +4 -0
- package/dist/esm/utils/anchor/error.d.ts.map +1 -0
- package/dist/esm/utils/anchor/error.js +10 -0
- package/dist/esm/utils/anchor/error.js.map +1 -0
- package/dist/esm/utils/anchor/idl.d.ts +123 -0
- package/dist/esm/utils/anchor/idl.d.ts.map +1 -0
- package/dist/esm/utils/anchor/idl.js +28 -0
- package/dist/esm/utils/anchor/idl.js.map +1 -0
- package/dist/esm/utils/anchor/index.d.ts +4 -0
- package/dist/esm/utils/anchor/index.d.ts.map +1 -0
- package/dist/esm/utils/anchor/index.js +4 -0
- package/dist/esm/utils/anchor/index.js.map +1 -0
- package/dist/esm/utils/index.d.ts +5 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +15 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/utils/account.d.ts +34 -0
- package/dist/esm/utils/utils/account.d.ts.map +1 -0
- package/dist/esm/utils/utils/account.js +52 -0
- package/dist/esm/utils/utils/account.js.map +1 -0
- package/dist/esm/utils/utils/bpfLoaderUpgradeable.d.ts +6 -0
- package/dist/esm/utils/utils/bpfLoaderUpgradeable.d.ts.map +1 -0
- package/dist/esm/utils/utils/bpfLoaderUpgradeable.js +9 -0
- package/dist/esm/utils/utils/bpfLoaderUpgradeable.js.map +1 -0
- package/dist/esm/utils/utils/connection.d.ts +4 -0
- package/dist/esm/utils/utils/connection.d.ts.map +1 -0
- package/dist/esm/utils/utils/connection.js +7 -0
- package/dist/esm/utils/utils/connection.js.map +1 -0
- package/dist/esm/utils/utils/index.d.ts +6 -0
- package/dist/esm/utils/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/utils/index.js +9 -0
- package/dist/esm/utils/utils/index.js.map +1 -0
- package/dist/esm/utils/utils/secp256k1.d.ts +30 -0
- package/dist/esm/utils/utils/secp256k1.d.ts.map +1 -0
- package/dist/esm/utils/utils/secp256k1.js +106 -0
- package/dist/esm/utils/utils/secp256k1.js.map +1 -0
- package/dist/esm/utils/utils/splMetadata.d.ts +62 -0
- package/dist/esm/utils/utils/splMetadata.d.ts.map +1 -0
- package/dist/esm/utils/utils/splMetadata.js +202 -0
- package/dist/esm/utils/utils/splMetadata.js.map +1 -0
- package/dist/esm/utils/utils/transaction.d.ts +63 -0
- package/dist/esm/utils/utils/transaction.d.ts.map +1 -0
- package/dist/esm/utils/utils/transaction.js +120 -0
- package/dist/esm/utils/utils/transaction.js.map +1 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { PlatformContext, Wormhole, chainToPlatform, decimals, nativeChainIds, networkPlatformConfigs, isNative, } from '@wormhole-foundation/sdk-connect';
|
|
2
|
+
import { SolanaChain } from './chain';
|
|
3
|
+
import { TOKEN_PROGRAM_ID } from '@solana/spl-token';
|
|
4
|
+
import { Connection, PublicKey, } from '@solana/web3.js';
|
|
5
|
+
import { SolanaAddress, SolanaZeroAddress } from './address';
|
|
6
|
+
import { _platform, } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* @category Solana
|
|
9
|
+
*/
|
|
10
|
+
export class SolanaPlatform extends PlatformContext {
|
|
11
|
+
static _platform = _platform;
|
|
12
|
+
constructor(network, config) {
|
|
13
|
+
super(network, config ?? networkPlatformConfigs(network, SolanaPlatform._platform));
|
|
14
|
+
}
|
|
15
|
+
getRpc(chain, config = {
|
|
16
|
+
commitment: 'confirmed',
|
|
17
|
+
disableRetryOnRateLimit: true,
|
|
18
|
+
}) {
|
|
19
|
+
if (chain in this.config)
|
|
20
|
+
return new Connection(this.config[chain].rpc, config);
|
|
21
|
+
throw new Error('No configuration available for chain: ' + chain);
|
|
22
|
+
}
|
|
23
|
+
getChain(chain, rpc) {
|
|
24
|
+
if (chain in this.config)
|
|
25
|
+
return new SolanaChain(chain, this, rpc);
|
|
26
|
+
throw new Error('No configuration available for chain: ' + chain);
|
|
27
|
+
}
|
|
28
|
+
static nativeTokenId(network, chain) {
|
|
29
|
+
if (!SolanaPlatform.isSupportedChain(chain))
|
|
30
|
+
throw new Error(`invalid chain: ${chain}`);
|
|
31
|
+
return Wormhole.chainAddress(chain, SolanaZeroAddress);
|
|
32
|
+
}
|
|
33
|
+
static isNativeTokenId(network, chain, tokenId) {
|
|
34
|
+
if (!this.isSupportedChain(chain))
|
|
35
|
+
return false;
|
|
36
|
+
if (tokenId.chain !== chain)
|
|
37
|
+
return false;
|
|
38
|
+
const native = this.nativeTokenId(network, chain);
|
|
39
|
+
return native == tokenId;
|
|
40
|
+
}
|
|
41
|
+
static isSupportedChain(chain) {
|
|
42
|
+
const platform = chainToPlatform(chain);
|
|
43
|
+
return platform === SolanaPlatform._platform;
|
|
44
|
+
}
|
|
45
|
+
static async getDecimals(chain, rpc, token) {
|
|
46
|
+
if (isNative(token))
|
|
47
|
+
return decimals.nativeDecimals(SolanaPlatform._platform);
|
|
48
|
+
let mint = await rpc.getParsedAccountInfo(new SolanaAddress(token).unwrap());
|
|
49
|
+
if (!mint || !mint.value)
|
|
50
|
+
throw new Error('could not fetch token details');
|
|
51
|
+
const { decimals: numDecimals } = mint.value.data
|
|
52
|
+
.parsed.info;
|
|
53
|
+
return numDecimals;
|
|
54
|
+
}
|
|
55
|
+
static async getBalance(chain, rpc, walletAddress, token) {
|
|
56
|
+
if (isNative(token))
|
|
57
|
+
return BigInt(await rpc.getBalance(new PublicKey(walletAddress)));
|
|
58
|
+
const splToken = await rpc.getTokenAccountsByOwner(new PublicKey(walletAddress), { mint: new SolanaAddress(token).unwrap() });
|
|
59
|
+
if (!splToken.value[0])
|
|
60
|
+
return null;
|
|
61
|
+
const balance = await rpc.getTokenAccountBalance(splToken.value[0].pubkey);
|
|
62
|
+
return BigInt(balance.value.amount);
|
|
63
|
+
}
|
|
64
|
+
static async getBalances(chain, rpc, walletAddress, tokens) {
|
|
65
|
+
let native;
|
|
66
|
+
if (tokens.includes('native')) {
|
|
67
|
+
native = BigInt(await rpc.getBalance(new PublicKey(walletAddress)));
|
|
68
|
+
}
|
|
69
|
+
const splParsedTokenAccounts = await rpc.getParsedTokenAccountsByOwner(new PublicKey(walletAddress), {
|
|
70
|
+
programId: new PublicKey(TOKEN_PROGRAM_ID),
|
|
71
|
+
});
|
|
72
|
+
const balancesArr = tokens.map((token) => {
|
|
73
|
+
if (isNative(token)) {
|
|
74
|
+
return { ['native']: native };
|
|
75
|
+
}
|
|
76
|
+
const addrString = new SolanaAddress(token).toString();
|
|
77
|
+
const amount = splParsedTokenAccounts.value.find((v) => v?.account.data.parsed?.info?.mint === token)?.account.data.parsed?.info?.tokenAmount?.amount;
|
|
78
|
+
if (!amount)
|
|
79
|
+
return { [addrString]: null };
|
|
80
|
+
return { [addrString]: BigInt(amount) };
|
|
81
|
+
});
|
|
82
|
+
return balancesArr.reduce((obj, item) => Object.assign(obj, item), {});
|
|
83
|
+
}
|
|
84
|
+
static async sendWait(chain, rpc, stxns, opts) {
|
|
85
|
+
const { blockhash, lastValidBlockHeight } = await this.latestBlock(rpc);
|
|
86
|
+
const txhashes = await Promise.all(stxns.map((stxn) => rpc.sendRawTransaction(stxn,
|
|
87
|
+
// Set the commitment level to match the rpc commitment level
|
|
88
|
+
// otherwise, it defaults to finalized
|
|
89
|
+
opts ?? { preflightCommitment: rpc.commitment })));
|
|
90
|
+
const results = await Promise.all(txhashes.map((signature) => {
|
|
91
|
+
return rpc.confirmTransaction({
|
|
92
|
+
signature,
|
|
93
|
+
blockhash,
|
|
94
|
+
lastValidBlockHeight,
|
|
95
|
+
}, rpc.commitment);
|
|
96
|
+
}));
|
|
97
|
+
const erroredTxs = results
|
|
98
|
+
.filter((result) => result.value.err)
|
|
99
|
+
.map((result) => result.value.err);
|
|
100
|
+
if (erroredTxs.length > 0)
|
|
101
|
+
throw new Error(`Failed to confirm transaction: ${erroredTxs}`);
|
|
102
|
+
return txhashes;
|
|
103
|
+
}
|
|
104
|
+
static async latestBlock(rpc, commitment) {
|
|
105
|
+
return rpc.getLatestBlockhash(commitment ?? rpc.commitment);
|
|
106
|
+
}
|
|
107
|
+
static async getLatestBlock(rpc) {
|
|
108
|
+
return await rpc.getSlot();
|
|
109
|
+
}
|
|
110
|
+
static async getLatestFinalizedBlock(rpc) {
|
|
111
|
+
const { lastValidBlockHeight } = await this.latestBlock(rpc, 'finalized');
|
|
112
|
+
return lastValidBlockHeight;
|
|
113
|
+
}
|
|
114
|
+
static chainFromChainId(genesisHash) {
|
|
115
|
+
const netChain = nativeChainIds.platformNativeChainIdToNetworkChain(SolanaPlatform._platform, genesisHash);
|
|
116
|
+
if (!netChain)
|
|
117
|
+
throw new Error(`No matching genesis hash to determine network and chain: ${genesisHash}`);
|
|
118
|
+
const [network, chain] = netChain;
|
|
119
|
+
return [network, chain];
|
|
120
|
+
}
|
|
121
|
+
static async chainFromRpc(rpc) {
|
|
122
|
+
const gh = await rpc.getGenesisHash();
|
|
123
|
+
return SolanaPlatform.chainFromChainId(gh);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Connection, Keypair, SendOptions, Transaction } from '@solana/web3.js';
|
|
3
|
+
import { Network, SignAndSendSigner, SignOnlySigner, Signer, UnsignedTransaction } from '@wormhole-foundation/sdk-connect';
|
|
4
|
+
import { SolanaChains } from './types';
|
|
5
|
+
import { SolanaUnsignedTransaction } from './unsignedTransaction';
|
|
6
|
+
export declare function getSolanaSigner(rpc: Connection, privateKey: string): Promise<Signer>;
|
|
7
|
+
export declare function getSolanaSignAndSendSigner(rpc: Connection, privateKey: string, opts?: {
|
|
8
|
+
debug?: boolean;
|
|
9
|
+
sendOpts?: SendOptions;
|
|
10
|
+
priorityFeeAmount?: bigint;
|
|
11
|
+
computeLimit?: bigint;
|
|
12
|
+
}): Promise<Signer>;
|
|
13
|
+
export declare class SolanaSigner<N extends Network, C extends SolanaChains = 'Solana'> implements SignOnlySigner<N, C> {
|
|
14
|
+
private _chain;
|
|
15
|
+
private _keypair;
|
|
16
|
+
private _rpc;
|
|
17
|
+
private _debug;
|
|
18
|
+
constructor(_chain: C, _keypair: Keypair, _rpc: Connection, _debug?: boolean);
|
|
19
|
+
chain(): C;
|
|
20
|
+
address(): string;
|
|
21
|
+
sign(tx: SolanaUnsignedTransaction<N>[]): Promise<Buffer[]>;
|
|
22
|
+
}
|
|
23
|
+
export declare class SolanaSendSigner<N extends Network, C extends SolanaChains = 'Solana'> implements SignAndSendSigner<N, C> {
|
|
24
|
+
private _rpc;
|
|
25
|
+
private _chain;
|
|
26
|
+
private _keypair;
|
|
27
|
+
private _debug;
|
|
28
|
+
private _sendOpts?;
|
|
29
|
+
private _priotifyFeeAmount?;
|
|
30
|
+
private _computeUnitLimit?;
|
|
31
|
+
constructor(_rpc: Connection, _chain: C, _keypair: Keypair, _debug?: boolean, _sendOpts?: SendOptions | undefined, _priotifyFeeAmount?: bigint | undefined, _computeUnitLimit?: bigint | undefined);
|
|
32
|
+
chain(): C;
|
|
33
|
+
address(): string;
|
|
34
|
+
private retryable;
|
|
35
|
+
signAndSend(tx: UnsignedTransaction[]): Promise<any[]>;
|
|
36
|
+
}
|
|
37
|
+
export declare function logTxDetails(transaction: Transaction): void;
|
|
38
|
+
//# sourceMappingURL=signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/signer.ts"],"names":[],"mappings":";AAAA,OAAO,EAEL,UAAU,EACV,OAAO,EACP,WAAW,EAEX,WAAW,EAEZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,cAAc,EACd,MAAM,EACN,mBAAmB,EAEpB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAGlE,wBAAsB,eAAe,CACnC,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAOjB;AAGD,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE;IACL,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GACA,OAAO,CAAC,MAAM,CAAC,CAWjB;AAED,qBAAa,YAAY,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,YAAY,GAAG,QAAQ,CAC5E,YAAW,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IAG7B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;gBAHN,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,OAAO,EACjB,IAAI,EAAE,UAAU,EAChB,MAAM,GAAE,OAAe;IAGjC,KAAK,IAAI,CAAC;IAIV,OAAO,IAAI,MAAM;IAIX,IAAI,CAAC,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAoBlE;AAED,qBAAa,gBAAgB,CAC3B,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,YAAY,GAAG,QAAQ,CACjC,YAAW,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;IAGhC,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS,CAAC;IAClB,OAAO,CAAC,kBAAkB,CAAC;IAC3B,OAAO,CAAC,iBAAiB,CAAC;gBANlB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,OAAO,EACjB,MAAM,GAAE,OAAe,EACvB,SAAS,CAAC,yBAAa,EACvB,kBAAkB,CAAC,oBAAQ,EAC3B,iBAAiB,CAAC,oBAAQ;IAOpC,KAAK,IAAI,CAAC;IAIV,OAAO,IAAI,MAAM;IASjB,OAAO,CAAC,SAAS;IA4BX,WAAW,CAAC,EAAE,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;CAoF7D;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,WAAW,QAWpD"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { ComputeBudgetProgram, Keypair, SendTransactionError, TransactionExpiredBlockheightExceededError, } from '@solana/web3.js';
|
|
2
|
+
import { encoding, } from '@wormhole-foundation/sdk-connect';
|
|
3
|
+
import { SolanaPlatform } from './platform';
|
|
4
|
+
// returns a SignOnlySigner for the Solana platform
|
|
5
|
+
export async function getSolanaSigner(rpc, privateKey) {
|
|
6
|
+
const [_, chain] = await SolanaPlatform.chainFromRpc(rpc);
|
|
7
|
+
return new SolanaSigner(chain, Keypair.fromSecretKey(encoding.b58.decode(privateKey)), rpc);
|
|
8
|
+
}
|
|
9
|
+
// returns a SignAndSendSigner for the Solana platform
|
|
10
|
+
export async function getSolanaSignAndSendSigner(rpc, privateKey, opts) {
|
|
11
|
+
const [_, chain] = await SolanaPlatform.chainFromRpc(rpc);
|
|
12
|
+
return new SolanaSendSigner(rpc, chain, Keypair.fromSecretKey(encoding.b58.decode(privateKey)), opts?.debug ?? false, opts?.sendOpts, opts?.priorityFeeAmount, opts?.computeLimit);
|
|
13
|
+
}
|
|
14
|
+
export class SolanaSigner {
|
|
15
|
+
_chain;
|
|
16
|
+
_keypair;
|
|
17
|
+
_rpc;
|
|
18
|
+
_debug;
|
|
19
|
+
constructor(_chain, _keypair, _rpc, _debug = false) {
|
|
20
|
+
this._chain = _chain;
|
|
21
|
+
this._keypair = _keypair;
|
|
22
|
+
this._rpc = _rpc;
|
|
23
|
+
this._debug = _debug;
|
|
24
|
+
}
|
|
25
|
+
chain() {
|
|
26
|
+
return this._chain;
|
|
27
|
+
}
|
|
28
|
+
address() {
|
|
29
|
+
return this._keypair.publicKey.toBase58();
|
|
30
|
+
}
|
|
31
|
+
async sign(tx) {
|
|
32
|
+
const { blockhash } = await SolanaPlatform.latestBlock(this._rpc);
|
|
33
|
+
const signed = [];
|
|
34
|
+
for (const txn of tx) {
|
|
35
|
+
const { description, transaction: { transaction, signers: extraSigners }, } = txn;
|
|
36
|
+
console.log(`Signing: ${description} for ${this.address()}`);
|
|
37
|
+
if (this._debug)
|
|
38
|
+
logTxDetails(transaction);
|
|
39
|
+
transaction.recentBlockhash = blockhash;
|
|
40
|
+
transaction.partialSign(this._keypair, ...(extraSigners ?? []));
|
|
41
|
+
signed.push(transaction.serialize());
|
|
42
|
+
}
|
|
43
|
+
return signed;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class SolanaSendSigner {
|
|
47
|
+
_rpc;
|
|
48
|
+
_chain;
|
|
49
|
+
_keypair;
|
|
50
|
+
_debug;
|
|
51
|
+
_sendOpts;
|
|
52
|
+
_priotifyFeeAmount;
|
|
53
|
+
_computeUnitLimit;
|
|
54
|
+
constructor(_rpc, _chain, _keypair, _debug = false, _sendOpts, _priotifyFeeAmount, _computeUnitLimit) {
|
|
55
|
+
this._rpc = _rpc;
|
|
56
|
+
this._chain = _chain;
|
|
57
|
+
this._keypair = _keypair;
|
|
58
|
+
this._debug = _debug;
|
|
59
|
+
this._sendOpts = _sendOpts;
|
|
60
|
+
this._priotifyFeeAmount = _priotifyFeeAmount;
|
|
61
|
+
this._computeUnitLimit = _computeUnitLimit;
|
|
62
|
+
this._sendOpts = this._sendOpts ?? {
|
|
63
|
+
preflightCommitment: this._rpc.commitment,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
chain() {
|
|
67
|
+
return this._chain;
|
|
68
|
+
}
|
|
69
|
+
address() {
|
|
70
|
+
return this._keypair.publicKey.toBase58();
|
|
71
|
+
}
|
|
72
|
+
// Handles retrying a Transaction if the error is deemed to be
|
|
73
|
+
// recoverable. Currently handles:
|
|
74
|
+
// - Transaction expired
|
|
75
|
+
// - Blockhash not found
|
|
76
|
+
// - Not enough bytes (storage account not seen yet)
|
|
77
|
+
retryable(e) {
|
|
78
|
+
// Tx expired, set a new block hash and retry
|
|
79
|
+
if (e instanceof TransactionExpiredBlockheightExceededError)
|
|
80
|
+
return true;
|
|
81
|
+
// Besides tx expiry, only handle SendTransactionError
|
|
82
|
+
if (!(e instanceof SendTransactionError))
|
|
83
|
+
return false;
|
|
84
|
+
// Only handle simulation errors
|
|
85
|
+
if (!e.message.includes('Transaction simulation failed'))
|
|
86
|
+
return false;
|
|
87
|
+
// Blockhash not found, similar to expired, resend with new blockhash
|
|
88
|
+
if (e.message.includes('Blockhash not found'))
|
|
89
|
+
return true;
|
|
90
|
+
// Find the log message with the error details
|
|
91
|
+
const loggedErr = e.logs?.find((log) => log.startsWith('Program log: Error: '));
|
|
92
|
+
// who knows
|
|
93
|
+
if (!loggedErr)
|
|
94
|
+
return false;
|
|
95
|
+
// Probably caused by storage account not seen yet
|
|
96
|
+
if (loggedErr.includes('Not enough bytes'))
|
|
97
|
+
return true;
|
|
98
|
+
if (loggedErr.includes('Unexpected length of input'))
|
|
99
|
+
return true;
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
async signAndSend(tx) {
|
|
103
|
+
let { blockhash, lastValidBlockHeight } = await SolanaPlatform.latestBlock(this._rpc);
|
|
104
|
+
const txids = [];
|
|
105
|
+
for (const txn of tx) {
|
|
106
|
+
const { description, transaction: { transaction, signers: extraSigners }, } = txn;
|
|
107
|
+
console.log(`Signing: ${description} for ${this.address()}`);
|
|
108
|
+
if (this._priotifyFeeAmount)
|
|
109
|
+
transaction.add(ComputeBudgetProgram.setComputeUnitPrice({
|
|
110
|
+
microLamports: this._priotifyFeeAmount,
|
|
111
|
+
}));
|
|
112
|
+
if (this._computeUnitLimit)
|
|
113
|
+
transaction.add(ComputeBudgetProgram.setComputeUnitLimit({
|
|
114
|
+
units: Number(this._computeUnitLimit),
|
|
115
|
+
}));
|
|
116
|
+
if (this._debug)
|
|
117
|
+
logTxDetails(transaction);
|
|
118
|
+
// Try to send the transaction up to 5 times
|
|
119
|
+
const maxRetries = 5;
|
|
120
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
121
|
+
try {
|
|
122
|
+
transaction.recentBlockhash = blockhash;
|
|
123
|
+
transaction.partialSign(this._keypair, ...(extraSigners ?? []));
|
|
124
|
+
const txid = await this._rpc.sendRawTransaction(transaction.serialize(), this._sendOpts);
|
|
125
|
+
txids.push(txid);
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
// No point checking if retryable if we're on the last retry
|
|
130
|
+
if (i === maxRetries - 1)
|
|
131
|
+
throw e;
|
|
132
|
+
// If it's not retryable, throw
|
|
133
|
+
if (!this.retryable(e))
|
|
134
|
+
throw e;
|
|
135
|
+
// If it is retryable, we need to grab a new block hash
|
|
136
|
+
const { blockhash: newBlockhash, lastValidBlockHeight: newBlockHeight, } = await SolanaPlatform.latestBlock(this._rpc);
|
|
137
|
+
lastValidBlockHeight = newBlockHeight;
|
|
138
|
+
blockhash = newBlockhash;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Wait for finalization
|
|
143
|
+
const results = await Promise.all(txids.map((signature) => this._rpc.confirmTransaction({
|
|
144
|
+
signature,
|
|
145
|
+
blockhash,
|
|
146
|
+
lastValidBlockHeight,
|
|
147
|
+
}, this._rpc.commitment)));
|
|
148
|
+
const erroredTxs = results
|
|
149
|
+
.filter((result) => result.value.err)
|
|
150
|
+
.map((result) => result.value.err);
|
|
151
|
+
if (erroredTxs.length > 0)
|
|
152
|
+
throw new Error(`Failed to confirm transaction: ${erroredTxs}`);
|
|
153
|
+
return txids;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
export function logTxDetails(transaction) {
|
|
157
|
+
console.log(transaction.signatures);
|
|
158
|
+
console.log(transaction.feePayer);
|
|
159
|
+
transaction.instructions.forEach((ix) => {
|
|
160
|
+
console.log('Program', ix.programId.toBase58());
|
|
161
|
+
console.log('Data: ', ix.data.toString('hex'));
|
|
162
|
+
console.log('Keys: ', ix.keys.map((k) => [k, k.pubkey.toBase58()]));
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/signer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../src/testing/debug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,wBAAgB,YAAY,CAAC,WAAW,EAAE,WAAW,QAWpD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function logTxDetails(transaction) {
|
|
2
|
+
console.log(transaction.signatures);
|
|
3
|
+
console.log(transaction.feePayer);
|
|
4
|
+
transaction.instructions.forEach((ix) => {
|
|
5
|
+
console.log('Program', ix.programId.toBase58());
|
|
6
|
+
console.log('Data: ', ix.data.toString('hex'));
|
|
7
|
+
console.log('Keys: ', ix.keys.map((k) => [k, k.pubkey.toBase58()]));
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../src/testing/debug.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,WAAwB;IACnD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACtC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CACT,QAAQ,EACR,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAC7C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Connection } from '@solana/web3.js';
|
|
2
|
+
import { Signer } from '@wormhole-foundation/connect-sdk';
|
|
3
|
+
export declare function getSolanaSigner(rpc: Connection, privateKey: string): Promise<Signer>;
|
|
4
|
+
export declare function getSolanaSignAndSendSigner(rpc: Connection, privateKey: string): Promise<Signer>;
|
|
5
|
+
export * from './signer';
|
|
6
|
+
export * from './sendSigner';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAW,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAE,MAAM,EAAY,MAAM,kCAAkC,CAAC;AAIpE,wBAAsB,eAAe,CACnC,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAOjB;AAGD,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Keypair } from '@solana/web3.js';
|
|
2
|
+
import { SolanaPlatform } from '../platform';
|
|
3
|
+
import { SolanaSigner } from './signer';
|
|
4
|
+
import { encoding } from '@wormhole-foundation/connect-sdk';
|
|
5
|
+
import { SolanaSendSigner } from './sendSigner';
|
|
6
|
+
// returns a SignOnlySigner for the Solana platform
|
|
7
|
+
export async function getSolanaSigner(rpc, privateKey) {
|
|
8
|
+
const [_, chain] = await SolanaPlatform.chainFromRpc(rpc);
|
|
9
|
+
return new SolanaSigner(chain, Keypair.fromSecretKey(encoding.b58.decode(privateKey)), rpc);
|
|
10
|
+
}
|
|
11
|
+
// returns a SignAndSendSigner for the Solana platform
|
|
12
|
+
export async function getSolanaSignAndSendSigner(rpc, privateKey) {
|
|
13
|
+
const [_, chain] = await SolanaPlatform.chainFromRpc(rpc);
|
|
14
|
+
return new SolanaSendSigner(rpc, chain, Keypair.fromSecretKey(encoding.b58.decode(privateKey)));
|
|
15
|
+
}
|
|
16
|
+
export * from './signer';
|
|
17
|
+
export * from './sendSigner';
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAU,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,mDAAmD;AACnD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAe,EACf,UAAkB;IAElB,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1D,OAAO,IAAI,YAAY,CACrB,KAAK,EACL,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EACtD,GAAG,CACJ,CAAC;AACJ,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,GAAe,EACf,UAAkB;IAElB,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1D,OAAO,IAAI,gBAAgB,CACzB,GAAG,EACH,KAAK,EACL,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Connection, Keypair, SendOptions } from '@solana/web3.js';
|
|
2
|
+
import { SignAndSendSigner, UnsignedTransaction } from '@wormhole-foundation/connect-sdk';
|
|
3
|
+
import { Network } from '@wormhole-foundation/sdk-base/src';
|
|
4
|
+
import { SolanaChains } from '../types';
|
|
5
|
+
export declare class SolanaSendSigner<N extends Network, C extends SolanaChains = 'Solana'> implements SignAndSendSigner<N, C> {
|
|
6
|
+
private _rpc;
|
|
7
|
+
private _chain;
|
|
8
|
+
private _keypair;
|
|
9
|
+
private _debug;
|
|
10
|
+
private _sendOpts?;
|
|
11
|
+
private _priotifyFeeAmount?;
|
|
12
|
+
constructor(_rpc: Connection, _chain: C, _keypair: Keypair, _debug?: boolean, _sendOpts?: SendOptions | undefined, _priotifyFeeAmount?: bigint | undefined);
|
|
13
|
+
chain(): C;
|
|
14
|
+
address(): string;
|
|
15
|
+
private retryable;
|
|
16
|
+
signAndSend(tx: UnsignedTransaction[]): Promise<any[]>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=sendSigner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendSigner.d.ts","sourceRoot":"","sources":["../../../src/testing/sendSigner.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,OAAO,EACP,WAAW,EAGZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAOxC,qBAAa,gBAAgB,CAC3B,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,YAAY,GAAG,QAAQ,CACjC,YAAW,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;IAGhC,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS,CAAC;IAClB,OAAO,CAAC,kBAAkB,CAAC;gBALnB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,OAAO,EACjB,MAAM,GAAE,OAAe,EACvB,SAAS,CAAC,yBAAa,EACvB,kBAAkB,CAAC,oBAAQ;IAOrC,KAAK,IAAI,CAAC;IAIV,OAAO,IAAI,MAAM;IASjB,OAAO,CAAC,SAAS;IA4BX,WAAW,CAAC,EAAE,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;CAqF7D"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { ComputeBudgetProgram, SendTransactionError, TransactionExpiredBlockheightExceededError, } from '@solana/web3.js';
|
|
2
|
+
import { SolanaPlatform } from '../platform';
|
|
3
|
+
import { logTxDetails } from './debug';
|
|
4
|
+
// Number of blocks to wait before considering a transaction expired
|
|
5
|
+
const SOLANA_EXPIRED_BLOCKHEIGHT = 150;
|
|
6
|
+
export class SolanaSendSigner {
|
|
7
|
+
_rpc;
|
|
8
|
+
_chain;
|
|
9
|
+
_keypair;
|
|
10
|
+
_debug;
|
|
11
|
+
_sendOpts;
|
|
12
|
+
_priotifyFeeAmount;
|
|
13
|
+
constructor(_rpc, _chain, _keypair, _debug = false, _sendOpts, _priotifyFeeAmount) {
|
|
14
|
+
this._rpc = _rpc;
|
|
15
|
+
this._chain = _chain;
|
|
16
|
+
this._keypair = _keypair;
|
|
17
|
+
this._debug = _debug;
|
|
18
|
+
this._sendOpts = _sendOpts;
|
|
19
|
+
this._priotifyFeeAmount = _priotifyFeeAmount;
|
|
20
|
+
this._sendOpts = this._sendOpts ?? {
|
|
21
|
+
preflightCommitment: this._rpc.commitment,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
chain() {
|
|
25
|
+
return this._chain;
|
|
26
|
+
}
|
|
27
|
+
address() {
|
|
28
|
+
return this._keypair.publicKey.toBase58();
|
|
29
|
+
}
|
|
30
|
+
// Handles retrying a Transaction if the error is deemed to be
|
|
31
|
+
// recoverable. Currently handles:
|
|
32
|
+
// - Transaction expired
|
|
33
|
+
// - Blockhash not found
|
|
34
|
+
// - Not enough bytes (storage account not seen yet)
|
|
35
|
+
retryable(e) {
|
|
36
|
+
// Tx expired, set a new block hash and retry
|
|
37
|
+
if (e instanceof TransactionExpiredBlockheightExceededError)
|
|
38
|
+
return true;
|
|
39
|
+
// Besides tx expiry, only handle SendTransactionError
|
|
40
|
+
if (!(e instanceof SendTransactionError))
|
|
41
|
+
return false;
|
|
42
|
+
// Only handle simulation errors
|
|
43
|
+
if (!e.message.includes('Transaction simulation failed'))
|
|
44
|
+
return false;
|
|
45
|
+
// Blockhash not found, similar to expired, resend with new blockhash
|
|
46
|
+
if (e.message.includes('Blockhash not found'))
|
|
47
|
+
return true;
|
|
48
|
+
// Find the log message with the error details
|
|
49
|
+
const loggedErr = e.logs?.find((log) => log.startsWith('Program log: Error: '));
|
|
50
|
+
// who knows
|
|
51
|
+
if (!loggedErr)
|
|
52
|
+
return false;
|
|
53
|
+
// Probably caused by storage account not seen yet
|
|
54
|
+
if (loggedErr.includes('Not enough bytes'))
|
|
55
|
+
return true;
|
|
56
|
+
if (loggedErr.includes('Unexpected length of input'))
|
|
57
|
+
return true;
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
async signAndSend(tx) {
|
|
61
|
+
let { blockhash, lastValidBlockHeight } = await SolanaPlatform.latestBlock(this._rpc);
|
|
62
|
+
const txids = [];
|
|
63
|
+
for (const txn of tx) {
|
|
64
|
+
const { description, transaction: { transaction, signers: extraSigners }, } = txn;
|
|
65
|
+
console.log(`Signing: ${description} for ${this.address()}`);
|
|
66
|
+
if (this._priotifyFeeAmount)
|
|
67
|
+
transaction.add(ComputeBudgetProgram.setComputeUnitPrice({
|
|
68
|
+
microLamports: this._priotifyFeeAmount,
|
|
69
|
+
}));
|
|
70
|
+
if (this._debug)
|
|
71
|
+
logTxDetails(transaction);
|
|
72
|
+
// Try to send the transaction up to 5 times
|
|
73
|
+
const maxRetries = 5;
|
|
74
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
75
|
+
try {
|
|
76
|
+
transaction.recentBlockhash = blockhash;
|
|
77
|
+
transaction.partialSign(this._keypair, ...(extraSigners ?? []));
|
|
78
|
+
const txid = await this._rpc.sendRawTransaction(transaction.serialize(), this._sendOpts);
|
|
79
|
+
txids.push(txid);
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
// No point checking if retryable if we're on the last retry
|
|
84
|
+
if (i === maxRetries - 1)
|
|
85
|
+
throw e;
|
|
86
|
+
// If it's not retryable, throw
|
|
87
|
+
if (!this.retryable(e))
|
|
88
|
+
throw e;
|
|
89
|
+
// If it is retryable, we need to grab a new block hash
|
|
90
|
+
const { blockhash: newBlockhash, lastValidBlockHeight: newBlockHeight, } = await SolanaPlatform.latestBlock(this._rpc);
|
|
91
|
+
// But we should _not_ submit if the blockhash hasnt expired
|
|
92
|
+
if (newBlockHeight - lastValidBlockHeight <
|
|
93
|
+
SOLANA_EXPIRED_BLOCKHEIGHT) {
|
|
94
|
+
throw e;
|
|
95
|
+
}
|
|
96
|
+
lastValidBlockHeight = newBlockHeight;
|
|
97
|
+
blockhash = newBlockhash;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Wait for finalization
|
|
102
|
+
const results = await Promise.all(txids.map((signature) => this._rpc.confirmTransaction({
|
|
103
|
+
signature,
|
|
104
|
+
blockhash,
|
|
105
|
+
lastValidBlockHeight,
|
|
106
|
+
}, this._rpc.commitment)));
|
|
107
|
+
const erroredTxs = results
|
|
108
|
+
.filter((result) => result.value.err)
|
|
109
|
+
.map((result) => result.value.err);
|
|
110
|
+
if (erroredTxs.length > 0)
|
|
111
|
+
throw new Error(`Failed to confirm transaction: ${erroredTxs}`);
|
|
112
|
+
return txids;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=sendSigner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendSigner.js","sourceRoot":"","sources":["../../../src/testing/sendSigner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Connection, Keypair } from '@solana/web3.js';
|
|
2
|
+
import { SignOnlySigner, UnsignedTransaction } from '@wormhole-foundation/connect-sdk';
|
|
3
|
+
import { Network } from '@wormhole-foundation/sdk-base/src';
|
|
4
|
+
import { SolanaChains } from '../types';
|
|
5
|
+
export declare class SolanaSigner<N extends Network, C extends SolanaChains = 'Solana'> implements SignOnlySigner<N, C> {
|
|
6
|
+
private _chain;
|
|
7
|
+
private _keypair;
|
|
8
|
+
private _rpc;
|
|
9
|
+
private _debug;
|
|
10
|
+
constructor(_chain: C, _keypair: Keypair, _rpc: Connection, _debug?: boolean);
|
|
11
|
+
chain(): C;
|
|
12
|
+
address(): string;
|
|
13
|
+
sign(tx: UnsignedTransaction[]): Promise<any[]>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../../src/testing/signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EACL,cAAc,EACd,mBAAmB,EACpB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,qBAAa,YAAY,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,YAAY,GAAG,QAAQ,CAC5E,YAAW,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IAG7B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;gBAHN,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,OAAO,EACjB,IAAI,EAAE,UAAU,EAChB,MAAM,GAAE,OAAe;IAGjC,KAAK,IAAI,CAAC;IAIV,OAAO,IAAI,MAAM;IAIX,IAAI,CAAC,EAAE,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;CAoBtD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { SolanaPlatform } from '../platform';
|
|
2
|
+
import { logTxDetails } from './debug';
|
|
3
|
+
export class SolanaSigner {
|
|
4
|
+
_chain;
|
|
5
|
+
_keypair;
|
|
6
|
+
_rpc;
|
|
7
|
+
_debug;
|
|
8
|
+
constructor(_chain, _keypair, _rpc, _debug = false) {
|
|
9
|
+
this._chain = _chain;
|
|
10
|
+
this._keypair = _keypair;
|
|
11
|
+
this._rpc = _rpc;
|
|
12
|
+
this._debug = _debug;
|
|
13
|
+
}
|
|
14
|
+
chain() {
|
|
15
|
+
return this._chain;
|
|
16
|
+
}
|
|
17
|
+
address() {
|
|
18
|
+
return this._keypair.publicKey.toBase58();
|
|
19
|
+
}
|
|
20
|
+
async sign(tx) {
|
|
21
|
+
const { blockhash } = await SolanaPlatform.latestBlock(this._rpc);
|
|
22
|
+
const signed = [];
|
|
23
|
+
for (const txn of tx) {
|
|
24
|
+
const { description, transaction: { transaction, signers: extraSigners }, } = txn;
|
|
25
|
+
console.log(`Signing: ${description} for ${this.address()}`);
|
|
26
|
+
if (this._debug)
|
|
27
|
+
logTxDetails(transaction);
|
|
28
|
+
transaction.recentBlockhash = blockhash;
|
|
29
|
+
transaction.partialSign(this._keypair, ...(extraSigners ?? []));
|
|
30
|
+
signed.push(transaction.serialize());
|
|
31
|
+
}
|
|
32
|
+
return signed;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../../../src/testing/signer.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,OAAO,YAAY;IAIb;IACA;IACA;IACA;IAJV,YACU,MAAS,EACT,QAAiB,EACjB,IAAgB,EAChB,SAAkB,KAAK;QAHvB,WAAM,GAAN,MAAM,CAAG;QACT,aAAQ,GAAR,QAAQ,CAAS;QACjB,SAAI,GAAJ,IAAI,CAAY;QAChB,WAAM,GAAN,MAAM,CAAiB;IAC9B,CAAC;IAEJ,KAAK;QACH,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAyB;QAClC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElE,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,GAAG,IAAI,EAAE,EAAE;YACpB,MAAM,EACJ,WAAW,EACX,WAAW,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,GACpD,GAAG,GAAG,CAAC;YAER,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,QAAQ,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAE7D,IAAI,IAAI,CAAC,MAAM;gBAAE,YAAY,CAAC,WAAW,CAAC,CAAC;YAE3C,WAAW,CAAC,eAAe,GAAG,SAAS,CAAC;YACxC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;SACtC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|