@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.
Files changed (188) hide show
  1. package/README.md +1 -0
  2. package/dist/cjs/address.d.ts +26 -0
  3. package/dist/cjs/address.d.ts.map +1 -0
  4. package/dist/cjs/address.js +56 -0
  5. package/dist/cjs/address.js.map +1 -0
  6. package/dist/cjs/chain.d.ts +6 -0
  7. package/dist/cjs/chain.d.ts.map +1 -0
  8. package/dist/cjs/chain.js +19 -0
  9. package/dist/cjs/chain.js.map +1 -0
  10. package/dist/cjs/index.d.ts +8 -0
  11. package/dist/cjs/index.d.ts.map +1 -0
  12. package/dist/cjs/index.js +24 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/platform.d.ts +29 -0
  15. package/dist/cjs/platform.d.ts.map +1 -0
  16. package/dist/cjs/platform.js +130 -0
  17. package/dist/cjs/platform.js.map +1 -0
  18. package/dist/cjs/signer.d.ts +38 -0
  19. package/dist/cjs/signer.d.ts.map +1 -0
  20. package/dist/cjs/signer.js +173 -0
  21. package/dist/cjs/signer.js.map +1 -0
  22. package/dist/cjs/testing/debug.d.ts +3 -0
  23. package/dist/cjs/testing/debug.d.ts.map +1 -0
  24. package/dist/cjs/testing/debug.js +14 -0
  25. package/dist/cjs/testing/debug.js.map +1 -0
  26. package/dist/cjs/testing/index.d.ts +7 -0
  27. package/dist/cjs/testing/index.d.ts.map +1 -0
  28. package/dist/cjs/testing/index.js +37 -0
  29. package/dist/cjs/testing/index.js.map +1 -0
  30. package/dist/cjs/testing/sendSigner.d.ts +18 -0
  31. package/dist/cjs/testing/sendSigner.d.ts.map +1 -0
  32. package/dist/cjs/testing/sendSigner.js +119 -0
  33. package/dist/cjs/testing/sendSigner.js.map +1 -0
  34. package/dist/cjs/testing/signer.d.ts +15 -0
  35. package/dist/cjs/testing/signer.d.ts.map +1 -0
  36. package/dist/cjs/testing/signer.js +39 -0
  37. package/dist/cjs/testing/signer.js.map +1 -0
  38. package/dist/cjs/types.d.ts +16 -0
  39. package/dist/cjs/types.d.ts.map +1 -0
  40. package/dist/cjs/types.js +10 -0
  41. package/dist/cjs/types.js.map +1 -0
  42. package/dist/cjs/unsignedTransaction.d.ts +16 -0
  43. package/dist/cjs/unsignedTransaction.d.ts.map +1 -0
  44. package/dist/cjs/unsignedTransaction.js +19 -0
  45. package/dist/cjs/unsignedTransaction.js.map +1 -0
  46. package/dist/cjs/utils/anchor/common.d.ts +3 -0
  47. package/dist/cjs/utils/anchor/common.d.ts.map +1 -0
  48. package/dist/cjs/utils/anchor/common.js +95 -0
  49. package/dist/cjs/utils/anchor/common.js.map +1 -0
  50. package/dist/cjs/utils/anchor/error.d.ts +4 -0
  51. package/dist/cjs/utils/anchor/error.d.ts.map +1 -0
  52. package/dist/cjs/utils/anchor/error.js +14 -0
  53. package/dist/cjs/utils/anchor/error.js.map +1 -0
  54. package/dist/cjs/utils/anchor/idl.d.ts +123 -0
  55. package/dist/cjs/utils/anchor/idl.d.ts.map +1 -0
  56. package/dist/cjs/utils/anchor/idl.js +58 -0
  57. package/dist/cjs/utils/anchor/idl.js.map +1 -0
  58. package/dist/cjs/utils/anchor/index.d.ts +4 -0
  59. package/dist/cjs/utils/anchor/index.d.ts.map +1 -0
  60. package/dist/cjs/utils/anchor/index.js +20 -0
  61. package/dist/cjs/utils/anchor/index.js.map +1 -0
  62. package/dist/cjs/utils/index.d.ts +5 -0
  63. package/dist/cjs/utils/index.d.ts.map +1 -0
  64. package/dist/cjs/utils/index.js +43 -0
  65. package/dist/cjs/utils/index.js.map +1 -0
  66. package/dist/cjs/utils/utils/account.d.ts +34 -0
  67. package/dist/cjs/utils/utils/account.d.ts.map +1 -0
  68. package/dist/cjs/utils/utils/account.js +59 -0
  69. package/dist/cjs/utils/utils/account.js.map +1 -0
  70. package/dist/cjs/utils/utils/bpfLoaderUpgradeable.d.ts +6 -0
  71. package/dist/cjs/utils/utils/bpfLoaderUpgradeable.d.ts.map +1 -0
  72. package/dist/cjs/utils/utils/bpfLoaderUpgradeable.js +14 -0
  73. package/dist/cjs/utils/utils/bpfLoaderUpgradeable.js.map +1 -0
  74. package/dist/cjs/utils/utils/connection.d.ts +4 -0
  75. package/dist/cjs/utils/utils/connection.d.ts.map +1 -0
  76. package/dist/cjs/utils/utils/connection.js +11 -0
  77. package/dist/cjs/utils/utils/connection.js.map +1 -0
  78. package/dist/cjs/utils/utils/index.d.ts +6 -0
  79. package/dist/cjs/utils/utils/index.d.ts.map +1 -0
  80. package/dist/cjs/utils/utils/index.js +27 -0
  81. package/dist/cjs/utils/utils/index.js.map +1 -0
  82. package/dist/cjs/utils/utils/secp256k1.d.ts +30 -0
  83. package/dist/cjs/utils/utils/secp256k1.d.ts.map +1 -0
  84. package/dist/cjs/utils/utils/secp256k1.js +111 -0
  85. package/dist/cjs/utils/utils/secp256k1.js.map +1 -0
  86. package/dist/cjs/utils/utils/splMetadata.d.ts +62 -0
  87. package/dist/cjs/utils/utils/splMetadata.d.ts.map +1 -0
  88. package/dist/cjs/utils/utils/splMetadata.js +212 -0
  89. package/dist/cjs/utils/utils/splMetadata.js.map +1 -0
  90. package/dist/cjs/utils/utils/transaction.d.ts +63 -0
  91. package/dist/cjs/utils/utils/transaction.d.ts.map +1 -0
  92. package/dist/cjs/utils/utils/transaction.js +128 -0
  93. package/dist/cjs/utils/utils/transaction.js.map +1 -0
  94. package/dist/esm/address.d.ts +26 -0
  95. package/dist/esm/address.d.ts.map +1 -0
  96. package/dist/esm/address.js +52 -0
  97. package/dist/esm/address.js.map +1 -0
  98. package/dist/esm/chain.d.ts +6 -0
  99. package/dist/esm/chain.d.ts.map +1 -0
  100. package/dist/esm/chain.js +15 -0
  101. package/dist/esm/chain.js.map +1 -0
  102. package/dist/esm/index.d.ts +8 -0
  103. package/dist/esm/index.d.ts.map +1 -0
  104. package/dist/esm/index.js +8 -0
  105. package/dist/esm/index.js.map +1 -0
  106. package/dist/esm/platform.d.ts +29 -0
  107. package/dist/esm/platform.d.ts.map +1 -0
  108. package/dist/esm/platform.js +126 -0
  109. package/dist/esm/platform.js.map +1 -0
  110. package/dist/esm/signer.d.ts +38 -0
  111. package/dist/esm/signer.d.ts.map +1 -0
  112. package/dist/esm/signer.js +165 -0
  113. package/dist/esm/signer.js.map +1 -0
  114. package/dist/esm/testing/debug.d.ts +3 -0
  115. package/dist/esm/testing/debug.d.ts.map +1 -0
  116. package/dist/esm/testing/debug.js +10 -0
  117. package/dist/esm/testing/debug.js.map +1 -0
  118. package/dist/esm/testing/index.d.ts +7 -0
  119. package/dist/esm/testing/index.d.ts.map +1 -0
  120. package/dist/esm/testing/index.js +18 -0
  121. package/dist/esm/testing/index.js.map +1 -0
  122. package/dist/esm/testing/sendSigner.d.ts +18 -0
  123. package/dist/esm/testing/sendSigner.d.ts.map +1 -0
  124. package/dist/esm/testing/sendSigner.js +115 -0
  125. package/dist/esm/testing/sendSigner.js.map +1 -0
  126. package/dist/esm/testing/signer.d.ts +15 -0
  127. package/dist/esm/testing/signer.d.ts.map +1 -0
  128. package/dist/esm/testing/signer.js +35 -0
  129. package/dist/esm/testing/signer.js.map +1 -0
  130. package/dist/esm/types.d.ts +16 -0
  131. package/dist/esm/types.d.ts.map +1 -0
  132. package/dist/esm/types.js +7 -0
  133. package/dist/esm/types.js.map +1 -0
  134. package/dist/esm/unsignedTransaction.d.ts +16 -0
  135. package/dist/esm/unsignedTransaction.d.ts.map +1 -0
  136. package/dist/esm/unsignedTransaction.js +15 -0
  137. package/dist/esm/unsignedTransaction.js.map +1 -0
  138. package/dist/esm/utils/anchor/common.d.ts +3 -0
  139. package/dist/esm/utils/anchor/common.d.ts.map +1 -0
  140. package/dist/esm/utils/anchor/common.js +91 -0
  141. package/dist/esm/utils/anchor/common.js.map +1 -0
  142. package/dist/esm/utils/anchor/error.d.ts +4 -0
  143. package/dist/esm/utils/anchor/error.d.ts.map +1 -0
  144. package/dist/esm/utils/anchor/error.js +10 -0
  145. package/dist/esm/utils/anchor/error.js.map +1 -0
  146. package/dist/esm/utils/anchor/idl.d.ts +123 -0
  147. package/dist/esm/utils/anchor/idl.d.ts.map +1 -0
  148. package/dist/esm/utils/anchor/idl.js +28 -0
  149. package/dist/esm/utils/anchor/idl.js.map +1 -0
  150. package/dist/esm/utils/anchor/index.d.ts +4 -0
  151. package/dist/esm/utils/anchor/index.d.ts.map +1 -0
  152. package/dist/esm/utils/anchor/index.js +4 -0
  153. package/dist/esm/utils/anchor/index.js.map +1 -0
  154. package/dist/esm/utils/index.d.ts +5 -0
  155. package/dist/esm/utils/index.d.ts.map +1 -0
  156. package/dist/esm/utils/index.js +15 -0
  157. package/dist/esm/utils/index.js.map +1 -0
  158. package/dist/esm/utils/utils/account.d.ts +34 -0
  159. package/dist/esm/utils/utils/account.d.ts.map +1 -0
  160. package/dist/esm/utils/utils/account.js +52 -0
  161. package/dist/esm/utils/utils/account.js.map +1 -0
  162. package/dist/esm/utils/utils/bpfLoaderUpgradeable.d.ts +6 -0
  163. package/dist/esm/utils/utils/bpfLoaderUpgradeable.d.ts.map +1 -0
  164. package/dist/esm/utils/utils/bpfLoaderUpgradeable.js +9 -0
  165. package/dist/esm/utils/utils/bpfLoaderUpgradeable.js.map +1 -0
  166. package/dist/esm/utils/utils/connection.d.ts +4 -0
  167. package/dist/esm/utils/utils/connection.d.ts.map +1 -0
  168. package/dist/esm/utils/utils/connection.js +7 -0
  169. package/dist/esm/utils/utils/connection.js.map +1 -0
  170. package/dist/esm/utils/utils/index.d.ts +6 -0
  171. package/dist/esm/utils/utils/index.d.ts.map +1 -0
  172. package/dist/esm/utils/utils/index.js +9 -0
  173. package/dist/esm/utils/utils/index.js.map +1 -0
  174. package/dist/esm/utils/utils/secp256k1.d.ts +30 -0
  175. package/dist/esm/utils/utils/secp256k1.d.ts.map +1 -0
  176. package/dist/esm/utils/utils/secp256k1.js +106 -0
  177. package/dist/esm/utils/utils/secp256k1.js.map +1 -0
  178. package/dist/esm/utils/utils/splMetadata.d.ts +62 -0
  179. package/dist/esm/utils/utils/splMetadata.d.ts.map +1 -0
  180. package/dist/esm/utils/utils/splMetadata.js +202 -0
  181. package/dist/esm/utils/utils/splMetadata.js.map +1 -0
  182. package/dist/esm/utils/utils/transaction.d.ts +63 -0
  183. package/dist/esm/utils/utils/transaction.d.ts.map +1 -0
  184. package/dist/esm/utils/utils/transaction.js +120 -0
  185. package/dist/esm/utils/utils/transaction.js.map +1 -0
  186. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  187. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  188. 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,3 @@
1
+ import { Transaction } from '@solana/web3.js';
2
+ export declare function logTxDetails(transaction: Transaction): void;
3
+ //# sourceMappingURL=debug.d.ts.map
@@ -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"}