@cityofzion/bs-solana 3.1.9 → 3.1.11
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/dist/BSSolana.d.ts +3 -2
- package/dist/BSSolana.js +2 -4
- package/dist/services/blockchain-data/RpcBDSSolana.js +16 -15
- package/dist/services/wallet-connect/WalletConnectServiceSolana.d.ts +35 -26
- package/dist/services/wallet-connect/WalletConnectServiceSolana.js +93 -71
- package/dist/types.d.ts +1 -0
- package/package.json +4 -3
package/dist/BSSolana.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { type TBSAccount, type TGetLedgerTransport, type IBlockchainDataService, type IExchangeDataService, type IExplorerService, type INftDataService, type ITokenService, type TBSNetwork, type TBSToken, type TPingNetworkResponse, type TTransferParams, type
|
|
1
|
+
import { type TBSAccount, type TGetLedgerTransport, type IBlockchainDataService, type IExchangeDataService, type IExplorerService, type INftDataService, type ITokenService, type TBSNetwork, type TBSToken, type TPingNetworkResponse, type TTransferParams, type TTransactionDefault } from '@cityofzion/blockchain-service';
|
|
2
2
|
import { Web3LedgerServiceSolana } from './services/ledger/Web3LedgerServiceSolana';
|
|
3
3
|
import type { IBSSolana, TBSSolanaName, TBSSolanaNetworkId } from './types';
|
|
4
4
|
import * as solanaKit from '@solana/kit';
|
|
5
|
+
import { WalletConnectServiceSolana } from './services/wallet-connect/WalletConnectServiceSolana';
|
|
5
6
|
export declare class BSSolana implements IBSSolana {
|
|
6
7
|
#private;
|
|
7
8
|
readonly name = "solana";
|
|
@@ -21,7 +22,7 @@ export declare class BSSolana implements IBSSolana {
|
|
|
21
22
|
nftDataService: INftDataService;
|
|
22
23
|
explorerService: IExplorerService;
|
|
23
24
|
tokenService: ITokenService;
|
|
24
|
-
walletConnectService:
|
|
25
|
+
walletConnectService: WalletConnectServiceSolana;
|
|
25
26
|
_solanaKitRpc: solanaKit.Rpc<solanaKit.SolanaRpcApi>;
|
|
26
27
|
constructor(network?: TBSNetwork<TBSSolanaNetworkId>, getLedgerTransport?: TGetLedgerTransport<TBSSolanaName>);
|
|
27
28
|
_signTransaction(transaction: solanaKit.Transaction, senderAccount: TBSAccount<TBSSolanaName>): Promise<solanaKit.Base64EncodedWireTransaction>;
|
package/dist/BSSolana.js
CHANGED
|
@@ -234,8 +234,7 @@ _BSSolana_instances = new WeakSet(), _BSSolana_buildTransferParams = async funct
|
|
|
234
234
|
const signer = solanaKit.createNoopSigner(solanaKit.address(params.senderAccount.address));
|
|
235
235
|
const instructions = [];
|
|
236
236
|
for (const intent of params.intents) {
|
|
237
|
-
const
|
|
238
|
-
const amount = Number(blockchain_service_1.BSBigNumberHelper.toDecimals(amountBn, intent.token.decimals));
|
|
237
|
+
const amount = new blockchain_service_1.BSBigHumanAmount(intent.amount, intent.token.decimals).toUnit().toBigInt();
|
|
239
238
|
const receiverAddress = solanaKit.address(intent.receiverAddress);
|
|
240
239
|
const isNative = this.tokenService.predicate(intent.token, BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN);
|
|
241
240
|
if (isNative) {
|
|
@@ -292,6 +291,5 @@ _BSSolana_instances = new WeakSet(), _BSSolana_buildTransferParams = async funct
|
|
|
292
291
|
if (!feeResponse.value) {
|
|
293
292
|
throw new blockchain_service_1.BSError('Failed to calculate fee', 'NO_CALCULATE_FEE');
|
|
294
293
|
}
|
|
295
|
-
|
|
296
|
-
return blockchain_service_1.BSBigNumberHelper.format(feeBn, { decimals: this.feeToken.decimals });
|
|
294
|
+
return new blockchain_service_1.BSBigUnitAmount(feeResponse.value.toString(), this.feeToken.decimals).toHuman().toFormatted();
|
|
297
295
|
};
|
|
@@ -55,6 +55,7 @@ const solanaKit = __importStar(require("@solana/kit"));
|
|
|
55
55
|
const solanaToken = __importStar(require("@solana-program/token"));
|
|
56
56
|
const solanaSystem = __importStar(require("@solana-program/system"));
|
|
57
57
|
const axios_1 = __importDefault(require("axios"));
|
|
58
|
+
const blockchain_service_2 = require("@cityofzion/blockchain-service");
|
|
58
59
|
class RpcBDSSolana {
|
|
59
60
|
constructor(service) {
|
|
60
61
|
_RpcBDSSolana_instances.add(this);
|
|
@@ -144,15 +145,16 @@ class RpcBDSSolana {
|
|
|
144
145
|
const splBalance = await __classPrivateFieldGet(this, _RpcBDSSolana_service, "f")._solanaKitRpc
|
|
145
146
|
.getTokenAccountsByOwner(solanaKitAddress, { programId: solanaToken.TOKEN_PROGRAM_ADDRESS }, { encoding: 'jsonParsed' })
|
|
146
147
|
.send();
|
|
147
|
-
const
|
|
148
|
-
|
|
148
|
+
const nativeBalanceAmount = new blockchain_service_1.BSBigUnitAmount(nativeBalance.value, BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN.decimals)
|
|
149
|
+
.toHuman()
|
|
150
|
+
.toFormatted();
|
|
149
151
|
const balances = [{ amount: nativeBalanceAmount, token: BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN }];
|
|
150
152
|
const promises = splBalance.value.map(async (item) => {
|
|
151
153
|
const token = await this.getTokenInfo(item.account.data.parsed.info.mint);
|
|
152
|
-
const amountBn = blockchain_service_1.
|
|
154
|
+
const amountBn = new blockchain_service_1.BSBigUnitAmount(item.account.data.parsed.info.tokenAmount.amount, token.decimals);
|
|
153
155
|
if (amountBn.isNaN() || amountBn.isLessThanOrEqualTo(0))
|
|
154
156
|
return;
|
|
155
|
-
const amount =
|
|
157
|
+
const amount = amountBn.toHuman().toFormatted();
|
|
156
158
|
balances.push({
|
|
157
159
|
amount,
|
|
158
160
|
token,
|
|
@@ -163,7 +165,7 @@ class RpcBDSSolana {
|
|
|
163
165
|
}
|
|
164
166
|
async getBlockHeight() {
|
|
165
167
|
const blockHeight = await __classPrivateFieldGet(this, _RpcBDSSolana_service, "f")._solanaKitRpc.getBlockHeight().send();
|
|
166
|
-
return
|
|
168
|
+
return blockchain_service_2.BSBigNumber.ensureNumber(blockHeight);
|
|
167
169
|
}
|
|
168
170
|
}
|
|
169
171
|
exports.RpcBDSSolana = RpcBDSSolana;
|
|
@@ -201,7 +203,7 @@ _RpcBDSSolana_service = new WeakMap(), _RpcBDSSolana_tokenCache = new WeakMap(),
|
|
|
201
203
|
token = {
|
|
202
204
|
symbol: 'UNKNOWN',
|
|
203
205
|
name: 'Unknown Token',
|
|
204
|
-
decimals:
|
|
206
|
+
decimals: blockchain_service_2.BSBigNumber.ensureNumber(info.tokenAmount.decimals),
|
|
205
207
|
hash: contractHash,
|
|
206
208
|
};
|
|
207
209
|
}
|
|
@@ -235,8 +237,7 @@ _RpcBDSSolana_service = new WeakMap(), _RpcBDSSolana_tokenCache = new WeakMap(),
|
|
|
235
237
|
nft,
|
|
236
238
|
};
|
|
237
239
|
}
|
|
238
|
-
const
|
|
239
|
-
const amount = blockchain_service_1.BSBigNumberHelper.format(amountBn, { decimals: token.decimals });
|
|
240
|
+
const amount = new blockchain_service_1.BSBigUnitAmount(tokenAmount, token.decimals).toHuman().toFormatted();
|
|
240
241
|
return {
|
|
241
242
|
eventType: 'token',
|
|
242
243
|
amount,
|
|
@@ -292,8 +293,7 @@ _RpcBDSSolana_service = new WeakMap(), _RpcBDSSolana_tokenCache = new WeakMap(),
|
|
|
292
293
|
nft,
|
|
293
294
|
};
|
|
294
295
|
}
|
|
295
|
-
const
|
|
296
|
-
const amount = blockchain_service_1.BSBigNumberHelper.format(amountBn, { decimals: token.decimals });
|
|
296
|
+
const amount = new blockchain_service_1.BSBigUnitAmount(info.amount, token.decimals).toHuman().toFormatted();
|
|
297
297
|
return {
|
|
298
298
|
eventType: 'token',
|
|
299
299
|
amount,
|
|
@@ -310,8 +310,7 @@ _RpcBDSSolana_service = new WeakMap(), _RpcBDSSolana_tokenCache = new WeakMap(),
|
|
|
310
310
|
const method = instruction.parsed.type;
|
|
311
311
|
if (!info || method !== 'transfer' || !info.lamports || !info.source || !info.destination)
|
|
312
312
|
return;
|
|
313
|
-
const
|
|
314
|
-
const amount = blockchain_service_1.BSBigNumberHelper.format(amountBn, { decimals: BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN.decimals });
|
|
313
|
+
const amount = new blockchain_service_1.BSBigUnitAmount(info.lamports, BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN.decimals).toHuman().toFormatted();
|
|
315
314
|
const from = info.source;
|
|
316
315
|
const to = info.destination;
|
|
317
316
|
return {
|
|
@@ -361,9 +360,11 @@ _RpcBDSSolana_service = new WeakMap(), _RpcBDSSolana_tokenCache = new WeakMap(),
|
|
|
361
360
|
relatedAddress,
|
|
362
361
|
txId,
|
|
363
362
|
txIdUrl,
|
|
364
|
-
block:
|
|
365
|
-
date: new Date(
|
|
366
|
-
networkFeeAmount: blockchain_service_1.
|
|
363
|
+
block: blockchain_service_2.BSBigNumber.ensureNumber(block),
|
|
364
|
+
date: new Date(new blockchain_service_2.BSBigNumber(blockTime).multipliedBy(1000).toNumber()).toJSON(),
|
|
365
|
+
networkFeeAmount: new blockchain_service_1.BSBigUnitAmount(transaction.meta.fee, __classPrivateFieldGet(this, _RpcBDSSolana_service, "f").feeToken.decimals)
|
|
366
|
+
.toHuman()
|
|
367
|
+
.toFormatted(),
|
|
367
368
|
view: 'default',
|
|
368
369
|
events,
|
|
369
370
|
};
|
|
@@ -1,34 +1,43 @@
|
|
|
1
|
-
import { type IWalletConnectService, type TWalletConnectServiceRequestMethodParams } from '@cityofzion/blockchain-service';
|
|
2
|
-
import type { IBSSolana, TBSSolanaName, TBSSolanaNetworkId } from '../../types';
|
|
3
|
-
import
|
|
4
|
-
|
|
1
|
+
import { type IWalletConnectService, type TWalletConnectServiceHandlers, type TWalletConnectServiceRequestMethodParams } from '@cityofzion/blockchain-service';
|
|
2
|
+
import type { IBSSolana, TBSSolanaName, TBSSolanaNetworkId, TWalletConnectServiceSolanaMethod } from '../../types';
|
|
3
|
+
import z from 'zod';
|
|
4
|
+
declare const signMessageParamsSchema: z.ZodObject<{
|
|
5
|
+
message: z.ZodString;
|
|
6
|
+
pubkey: z.ZodString;
|
|
7
|
+
}, z.core.$strip>;
|
|
8
|
+
declare const signTransactionParamsSchema: z.ZodObject<{
|
|
9
|
+
transaction: z.ZodString;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
declare const signAndSendTransactionParamsSchema: z.ZodObject<{
|
|
12
|
+
transactions: z.ZodArray<z.ZodString>;
|
|
13
|
+
}, z.core.$strip>;
|
|
14
|
+
declare const signAndSendTransactionOptionsSchema: z.ZodObject<{
|
|
15
|
+
transaction: z.ZodString;
|
|
16
|
+
sendOptions: z.ZodOptional<z.ZodObject<{
|
|
17
|
+
maxRetries: z.ZodOptional<z.ZodBigInt>;
|
|
18
|
+
preflightCommitment: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"confirmed">, z.ZodLiteral<"finalized">, z.ZodLiteral<"processed">]>>;
|
|
19
|
+
minContextSlot: z.ZodOptional<z.ZodBigInt>;
|
|
20
|
+
skipPreflight: z.ZodOptional<z.ZodBoolean>;
|
|
21
|
+
}, z.core.$strip>>;
|
|
22
|
+
}, z.core.$strip>;
|
|
23
|
+
export declare class WalletConnectServiceSolana implements IWalletConnectService<TBSSolanaName, TWalletConnectServiceSolanaMethod> {
|
|
5
24
|
#private;
|
|
6
25
|
static networkIdByNetworkType: Record<TBSSolanaNetworkId, string>;
|
|
7
26
|
readonly namespace = "solana";
|
|
8
27
|
readonly chain: string;
|
|
9
|
-
readonly supportedMethods:
|
|
28
|
+
readonly supportedMethods: TWalletConnectServiceSolanaMethod[];
|
|
10
29
|
readonly supportedEvents: string[];
|
|
11
|
-
readonly calculableMethods:
|
|
12
|
-
readonly autoApproveMethods:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}[]>;
|
|
21
|
-
solana_signMessage(args: TWalletConnectServiceRequestMethodParams<TBSSolanaName>): Promise<{
|
|
22
|
-
signature: string;
|
|
23
|
-
}>;
|
|
24
|
-
solana_signTransaction(args: TWalletConnectServiceRequestMethodParams<TBSSolanaName>): Promise<{
|
|
25
|
-
transaction: solanaKit.Base64EncodedWireTransaction;
|
|
26
|
-
}>;
|
|
27
|
-
solana_signAllTransactions(args: TWalletConnectServiceRequestMethodParams<TBSSolanaName>): Promise<{
|
|
28
|
-
transactions: solanaKit.Base64EncodedWireTransaction[];
|
|
29
|
-
}>;
|
|
30
|
-
solana_signAndSendTransaction(args: TWalletConnectServiceRequestMethodParams<TBSSolanaName>): Promise<{
|
|
31
|
-
signature: solanaKit.Signature;
|
|
30
|
+
readonly calculableMethods: TWalletConnectServiceSolanaMethod[];
|
|
31
|
+
readonly autoApproveMethods: TWalletConnectServiceSolanaMethod[];
|
|
32
|
+
handlers: TWalletConnectServiceHandlers<TBSSolanaName, {
|
|
33
|
+
solana_getAccounts: unknown;
|
|
34
|
+
solana_requestAccounts: unknown;
|
|
35
|
+
solana_signMessage: z.infer<typeof signMessageParamsSchema>;
|
|
36
|
+
solana_signTransaction: z.infer<typeof signTransactionParamsSchema>;
|
|
37
|
+
solana_signAllTransactions: z.infer<typeof signAndSendTransactionParamsSchema>;
|
|
38
|
+
solana_signAndSendTransaction: z.infer<typeof signAndSendTransactionOptionsSchema>;
|
|
32
39
|
}>;
|
|
40
|
+
constructor(service: IBSSolana);
|
|
33
41
|
calculateRequestFee(args: TWalletConnectServiceRequestMethodParams<TBSSolanaName>): Promise<string>;
|
|
34
42
|
}
|
|
43
|
+
export {};
|
|
@@ -43,94 +43,117 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
43
43
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
44
44
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
45
45
|
};
|
|
46
|
-
var
|
|
46
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
47
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
48
|
+
};
|
|
49
|
+
var _WalletConnectServiceSolana_instances, _WalletConnectServiceSolana_service, _WalletConnectServiceSolana_getAccountsHandler, _WalletConnectServiceSolana_signMessageHandler, _WalletConnectServiceSolana_signTransactionHandler, _WalletConnectServiceSolana_signAllTransactionsHandler, _WalletConnectServiceSolana_signAndSendTransactionHandler, _WalletConnectServiceSolana_parseTransaction;
|
|
47
50
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
51
|
exports.WalletConnectServiceSolana = void 0;
|
|
49
52
|
const blockchain_service_1 = require("@cityofzion/blockchain-service");
|
|
50
53
|
const solanaKit = __importStar(require("@solana/kit"));
|
|
54
|
+
const zod_1 = __importDefault(require("zod"));
|
|
55
|
+
const signMessageParamsSchema = zod_1.default.object({ message: zod_1.default.string(), pubkey: zod_1.default.string() });
|
|
56
|
+
const signTransactionParamsSchema = zod_1.default.object({ transaction: zod_1.default.string() });
|
|
57
|
+
const signAndSendTransactionParamsSchema = zod_1.default.object({ transactions: zod_1.default.array(zod_1.default.string()) });
|
|
58
|
+
const signAndSendTransactionOptionsSchema = zod_1.default.object({
|
|
59
|
+
transaction: zod_1.default.string(),
|
|
60
|
+
sendOptions: zod_1.default
|
|
61
|
+
.object({
|
|
62
|
+
maxRetries: zod_1.default.bigint().optional(),
|
|
63
|
+
preflightCommitment: zod_1.default.union([zod_1.default.literal('confirmed'), zod_1.default.literal('finalized'), zod_1.default.literal('processed')]).optional(),
|
|
64
|
+
minContextSlot: zod_1.default.bigint().optional(),
|
|
65
|
+
skipPreflight: zod_1.default.boolean().optional(),
|
|
66
|
+
})
|
|
67
|
+
.optional(),
|
|
68
|
+
});
|
|
51
69
|
class WalletConnectServiceSolana {
|
|
52
70
|
constructor(service) {
|
|
53
71
|
_WalletConnectServiceSolana_instances.add(this);
|
|
54
72
|
this.namespace = 'solana';
|
|
73
|
+
// prettier-ignore
|
|
55
74
|
this.supportedMethods = [
|
|
56
|
-
'solana_getAccounts',
|
|
57
|
-
'
|
|
58
|
-
'solana_signMessage',
|
|
59
|
-
'solana_signTransaction',
|
|
60
|
-
'solana_signAllTransactions',
|
|
61
|
-
'solana_signAndSendTransaction',
|
|
75
|
+
'solana_getAccounts', 'solana_requestAccounts', 'solana_signMessage', 'solana_signTransaction',
|
|
76
|
+
'solana_signAllTransactions', 'solana_signAndSendTransaction',
|
|
62
77
|
];
|
|
63
78
|
this.supportedEvents = [];
|
|
64
79
|
this.calculableMethods = ['solana_signAndSendTransaction'];
|
|
65
80
|
this.autoApproveMethods = ['solana_getAccounts', 'solana_requestAccounts'];
|
|
66
81
|
_WalletConnectServiceSolana_service.set(this, void 0);
|
|
82
|
+
_WalletConnectServiceSolana_getAccountsHandler.set(this, {
|
|
83
|
+
validate: async () => { },
|
|
84
|
+
process: async (args) => {
|
|
85
|
+
return [{ pubkey: args.account.address }];
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
_WalletConnectServiceSolana_signMessageHandler.set(this, {
|
|
89
|
+
validate: async (params) => await signMessageParamsSchema.parseAsync(params),
|
|
90
|
+
process: async (args) => {
|
|
91
|
+
if (args.params.pubkey !== args.account.address) {
|
|
92
|
+
throw new blockchain_service_1.BSError('Public key does not match account address', 'PUBKEY_MISMATCH');
|
|
93
|
+
}
|
|
94
|
+
const messageBytes = solanaKit.getBase58Codec().encode(args.params.message);
|
|
95
|
+
const keypair = await solanaKit.createKeyPairFromBytes(solanaKit.getBase58Encoder().encode(args.account.key));
|
|
96
|
+
const signatureBuffer = await crypto.subtle.sign('Ed25519', keypair.privateKey, new Uint8Array(messageBytes));
|
|
97
|
+
const signature = solanaKit.getBase58Codec().decode(new Uint8Array(signatureBuffer));
|
|
98
|
+
return { signature };
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
_WalletConnectServiceSolana_signTransactionHandler.set(this, {
|
|
102
|
+
validate: async (params) => await signTransactionParamsSchema.parseAsync(params),
|
|
103
|
+
process: async (args) => {
|
|
104
|
+
const parsedTransaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, args.params.transaction);
|
|
105
|
+
const signedTransaction = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._signTransaction(parsedTransaction, args.account);
|
|
106
|
+
return { transaction: signedTransaction };
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
_WalletConnectServiceSolana_signAllTransactionsHandler.set(this, {
|
|
110
|
+
validate: async (params) => await signAndSendTransactionParamsSchema.parseAsync(params),
|
|
111
|
+
process: async (args) => {
|
|
112
|
+
const signedTransactions = [];
|
|
113
|
+
for (const transaction of args.params.transactions) {
|
|
114
|
+
const parsedTransaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, transaction);
|
|
115
|
+
const signedTransaction = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._signTransaction(parsedTransaction, args.account);
|
|
116
|
+
signedTransactions.push(signedTransaction);
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
transactions: signedTransactions,
|
|
120
|
+
};
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
_WalletConnectServiceSolana_signAndSendTransactionHandler.set(this, {
|
|
124
|
+
validate: async (params) => await signAndSendTransactionOptionsSchema.parseAsync(params),
|
|
125
|
+
process: async (args) => {
|
|
126
|
+
const options = args.params.sendOptions ?? {};
|
|
127
|
+
const parsedTransaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, args.params.transaction);
|
|
128
|
+
const signedTransaction = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._signTransaction(parsedTransaction, args.account);
|
|
129
|
+
const signature = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._solanaKitRpc
|
|
130
|
+
.sendTransaction(signedTransaction, {
|
|
131
|
+
maxRetries: options.maxRetries,
|
|
132
|
+
preflightCommitment: options.preflightCommitment,
|
|
133
|
+
minContextSlot: options.minContextSlot,
|
|
134
|
+
skipPreflight: options.skipPreflight,
|
|
135
|
+
})
|
|
136
|
+
.send();
|
|
137
|
+
return { signature };
|
|
138
|
+
},
|
|
139
|
+
});
|
|
67
140
|
__classPrivateFieldSet(this, _WalletConnectServiceSolana_service, service, "f");
|
|
68
141
|
const networkId = WalletConnectServiceSolana.networkIdByNetworkType[__classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f").network.id];
|
|
69
142
|
this.chain = `${this.namespace}:${networkId}`;
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
async solana_signMessage(args) {
|
|
78
|
-
if (typeof args.params.message !== 'string' || typeof args.params.pubkey !== 'string') {
|
|
79
|
-
throw new Error('Invalid params');
|
|
80
|
-
}
|
|
81
|
-
if (args.params.pubkey !== args.account.address) {
|
|
82
|
-
throw new Error('Public key does not match account address');
|
|
83
|
-
}
|
|
84
|
-
const messageBytes = solanaKit.getBase58Codec().encode(args.params.message);
|
|
85
|
-
const keypair = await solanaKit.createKeyPairFromBytes(solanaKit.getBase58Encoder().encode(args.account.key));
|
|
86
|
-
const signatureBuffer = await crypto.subtle.sign('Ed25519', keypair.privateKey, new Uint8Array(messageBytes));
|
|
87
|
-
const signature = solanaKit.getBase58Codec().decode(new Uint8Array(signatureBuffer));
|
|
88
|
-
return { signature };
|
|
89
|
-
}
|
|
90
|
-
async solana_signTransaction(args) {
|
|
91
|
-
if (typeof args.params.transaction !== 'string') {
|
|
92
|
-
throw new Error('Invalid params');
|
|
93
|
-
}
|
|
94
|
-
const parsedTransaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, args.params.transaction);
|
|
95
|
-
const signedTransaction = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._signTransaction(parsedTransaction, args.account);
|
|
96
|
-
return { transaction: signedTransaction };
|
|
97
|
-
}
|
|
98
|
-
async solana_signAllTransactions(args) {
|
|
99
|
-
if (!Array.isArray(args.params.transactions)) {
|
|
100
|
-
throw new Error('Invalid params');
|
|
101
|
-
}
|
|
102
|
-
const signedTransactions = [];
|
|
103
|
-
for (const transaction of args.params.transactions) {
|
|
104
|
-
const parsedTransaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, transaction);
|
|
105
|
-
const signedTransaction = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._signTransaction(parsedTransaction, args.account);
|
|
106
|
-
signedTransactions.push(signedTransaction);
|
|
107
|
-
}
|
|
108
|
-
return {
|
|
109
|
-
transactions: signedTransactions,
|
|
143
|
+
this.handlers = {
|
|
144
|
+
solana_getAccounts: __classPrivateFieldGet(this, _WalletConnectServiceSolana_getAccountsHandler, "f"),
|
|
145
|
+
solana_requestAccounts: __classPrivateFieldGet(this, _WalletConnectServiceSolana_getAccountsHandler, "f"),
|
|
146
|
+
solana_signMessage: __classPrivateFieldGet(this, _WalletConnectServiceSolana_signMessageHandler, "f"),
|
|
147
|
+
solana_signTransaction: __classPrivateFieldGet(this, _WalletConnectServiceSolana_signTransactionHandler, "f"),
|
|
148
|
+
solana_signAllTransactions: __classPrivateFieldGet(this, _WalletConnectServiceSolana_signAllTransactionsHandler, "f"),
|
|
149
|
+
solana_signAndSendTransaction: __classPrivateFieldGet(this, _WalletConnectServiceSolana_signAndSendTransactionHandler, "f"),
|
|
110
150
|
};
|
|
111
151
|
}
|
|
112
|
-
async solana_signAndSendTransaction(args) {
|
|
113
|
-
if (typeof args.params.transaction !== 'string') {
|
|
114
|
-
throw new Error('Invalid params');
|
|
115
|
-
}
|
|
116
|
-
const options = args.params.sendOptions ?? {};
|
|
117
|
-
const parsedTransaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, args.params.transaction);
|
|
118
|
-
const signedTransaction = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._signTransaction(parsedTransaction, args.account);
|
|
119
|
-
const signature = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._solanaKitRpc
|
|
120
|
-
.sendTransaction(signedTransaction, {
|
|
121
|
-
maxRetries: options.maxRetries,
|
|
122
|
-
preflightCommitment: options.preflightCommitment,
|
|
123
|
-
minContextSlot: options.minContextSlot,
|
|
124
|
-
skipPreflight: options.skipPreflight,
|
|
125
|
-
})
|
|
126
|
-
.send();
|
|
127
|
-
return { signature };
|
|
128
|
-
}
|
|
129
152
|
async calculateRequestFee(args) {
|
|
130
|
-
|
|
131
|
-
throw new
|
|
132
|
-
}
|
|
133
|
-
const transaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this,
|
|
153
|
+
const params = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_signAndSendTransactionHandler, "f").validate(args.params).catch(error => {
|
|
154
|
+
throw new blockchain_service_1.BSError('Params validation failed: ' + error.message, 'INVALID_PARAMS');
|
|
155
|
+
});
|
|
156
|
+
const transaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, params.transaction);
|
|
134
157
|
const messageBase64 = solanaKit.getBase64Decoder().decode(transaction.messageBytes);
|
|
135
158
|
const feeResponse = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._solanaKitRpc
|
|
136
159
|
.getFeeForMessage(messageBase64, { commitment: 'confirmed' })
|
|
@@ -138,12 +161,11 @@ class WalletConnectServiceSolana {
|
|
|
138
161
|
if (!feeResponse.value) {
|
|
139
162
|
throw new Error('Failed to calculate fee');
|
|
140
163
|
}
|
|
141
|
-
|
|
142
|
-
return blockchain_service_1.BSBigNumberHelper.toNumber(feeBn).toString();
|
|
164
|
+
return new blockchain_service_1.BSBigUnitAmount(feeResponse.value.toString(), __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f").feeToken.decimals).toHuman().toFormatted();
|
|
143
165
|
}
|
|
144
166
|
}
|
|
145
167
|
exports.WalletConnectServiceSolana = WalletConnectServiceSolana;
|
|
146
|
-
_WalletConnectServiceSolana_service = new WeakMap(), _WalletConnectServiceSolana_instances = new WeakSet(), _WalletConnectServiceSolana_parseTransaction = function _WalletConnectServiceSolana_parseTransaction(encodedTransaction) {
|
|
168
|
+
_WalletConnectServiceSolana_service = new WeakMap(), _WalletConnectServiceSolana_getAccountsHandler = new WeakMap(), _WalletConnectServiceSolana_signMessageHandler = new WeakMap(), _WalletConnectServiceSolana_signTransactionHandler = new WeakMap(), _WalletConnectServiceSolana_signAllTransactionsHandler = new WeakMap(), _WalletConnectServiceSolana_signAndSendTransactionHandler = new WeakMap(), _WalletConnectServiceSolana_instances = new WeakSet(), _WalletConnectServiceSolana_parseTransaction = function _WalletConnectServiceSolana_parseTransaction(encodedTransaction) {
|
|
147
169
|
const transactionBytes = solanaKit.getBase64Encoder().encode(encodedTransaction);
|
|
148
170
|
const transaction = solanaKit.getTransactionCodec().decode(transactionBytes);
|
|
149
171
|
return transaction;
|
package/dist/types.d.ts
CHANGED
|
@@ -82,3 +82,4 @@ export type TMetaplexAssetResponse = {
|
|
|
82
82
|
export type TRpcBDSSolanaParsedInstruction = Extract<TransactionForFullJsonParsed<'legacy'>['transaction']['message']['instructions'][number], {
|
|
83
83
|
parsed: any;
|
|
84
84
|
}>;
|
|
85
|
+
export type TWalletConnectServiceSolanaMethod = 'solana_getAccounts' | 'solana_requestAccounts' | 'solana_signMessage' | 'solana_signTransaction' | 'solana_signAllTransactions' | 'solana_signAndSendTransaction';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cityofzion/bs-solana",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.11",
|
|
4
4
|
"repository": "https://github.com/CityOfZion/blockchain-services",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Coz",
|
|
@@ -15,9 +15,10 @@
|
|
|
15
15
|
"@solana-program/system": "~0.12.0",
|
|
16
16
|
"@solana-program/token": "~0.11.0",
|
|
17
17
|
"@solana/kit": "~6.1.0",
|
|
18
|
-
"axios": "~1.
|
|
18
|
+
"axios": "~1.15.0",
|
|
19
19
|
"date-fns": "~4.1.0",
|
|
20
|
-
"
|
|
20
|
+
"zod": "~4.3.6",
|
|
21
|
+
"@cityofzion/blockchain-service": "3.1.11"
|
|
21
22
|
},
|
|
22
23
|
"devDependencies": {
|
|
23
24
|
"@ledgerhq/hw-transport-node-hid": "~6.30.0",
|