@dynamic-labs-wallet/svm 1.1.34 → 1.1.35
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/index.cjs +70 -6
- package/index.esm.js +70 -6
- package/package.json +2 -2
- package/src/svm/client.d.ts +37 -1
- package/src/svm/client.d.ts.map +1 -1
package/index.cjs
CHANGED
|
@@ -168,6 +168,59 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
|
|
|
168
168
|
throw error;
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* Signs a Solana transaction for Dynamic to broadcast.
|
|
173
|
+
*
|
|
174
|
+
* @param params.senderAddress - The wallet's address.
|
|
175
|
+
* @param params.transaction - The transaction message as hex, the same bytes `signTransaction` signs.
|
|
176
|
+
* @param params.chainId - The Solana network id (e.g. `101`). Dynamic checks it against the wallet's network.
|
|
177
|
+
* @param params.skipPreflight - Skip the network's pre-send dry run. Faster, but a doomed transaction still costs a fee.
|
|
178
|
+
* @param params.requestedCertainty - How sure to be before calling it confirmed: `fast`, `safe` or `final`, or `chain:` plus a chain-specific value. Defaults to `safe`.
|
|
179
|
+
* @param params.externalReference - Your own label, returned on every event. Not unique.
|
|
180
|
+
* @param params.idempotencyKey - Makes a retry safe: the same key replays the stored answer instead of sending twice. A new one is made when omitted.
|
|
181
|
+
* @param params.password - The wallet's backup password, if it has one.
|
|
182
|
+
* @param params.signedSessionId - The signed-in session, used to unlock the wallet's key share.
|
|
183
|
+
* @param params.mfaToken - Proof of the user's multi-factor check, when the wallet needs one.
|
|
184
|
+
* @param params.elevatedAccessToken - Proof of a recent re-login, when the wallet needs one.
|
|
185
|
+
* @param params.approvalQuorum - Approvers' consent for a governed wallet, sent on the retry after `intent_required`.
|
|
186
|
+
* @param params.onError - Called with the failure's message, never the raw error.
|
|
187
|
+
* @param params.traceContext - Ties this call's logs to the server's, across retries. Created when omitted.
|
|
188
|
+
* @returns The transaction record.
|
|
189
|
+
* @throws Error when `chainId` is missing.
|
|
190
|
+
*/ async signAndBroadcastTransaction({ senderAddress, transaction, chainId, skipPreflight, password = undefined, signedSessionId, mfaToken, elevatedAccessToken, approvalQuorum, requestedCertainty, externalReference, idempotencyKey, onError, traceContext }) {
|
|
191
|
+
if (!chainId) {
|
|
192
|
+
throw new Error('Sign and broadcast on Solana needs the network id as `chainId`');
|
|
193
|
+
}
|
|
194
|
+
const base58SerializedTransaction = this.prepareTransactionForSigning(transaction);
|
|
195
|
+
return await this.signAndBroadcast({
|
|
196
|
+
accountAddress: senderAddress,
|
|
197
|
+
chainName: this.chainName,
|
|
198
|
+
contexts: [
|
|
199
|
+
{
|
|
200
|
+
svmTransaction: this.buildSvmTransactionContext({
|
|
201
|
+
chainId,
|
|
202
|
+
base58SerializedTransaction
|
|
203
|
+
})
|
|
204
|
+
}
|
|
205
|
+
],
|
|
206
|
+
broadcastOptions: skipPreflight === undefined ? undefined : {
|
|
207
|
+
skipPreflight
|
|
208
|
+
},
|
|
209
|
+
messages: [
|
|
210
|
+
transaction
|
|
211
|
+
],
|
|
212
|
+
password,
|
|
213
|
+
signedSessionId,
|
|
214
|
+
mfaToken,
|
|
215
|
+
elevatedAccessToken,
|
|
216
|
+
approvalQuorum,
|
|
217
|
+
requestedCertainty,
|
|
218
|
+
externalReference,
|
|
219
|
+
idempotencyKey,
|
|
220
|
+
onError,
|
|
221
|
+
traceContext
|
|
222
|
+
});
|
|
223
|
+
}
|
|
171
224
|
prepareTransactionForSigning(transaction) {
|
|
172
225
|
const transactionBytes = new Uint8Array(Buffer.from(transaction, 'hex'));
|
|
173
226
|
const deserializedTransaction = web3_js.VersionedMessage.deserialize(transactionBytes);
|
|
@@ -175,6 +228,20 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
|
|
|
175
228
|
const serializedTransaction = versionedTransaction.serialize();
|
|
176
229
|
return bs58.encode(serializedTransaction);
|
|
177
230
|
}
|
|
231
|
+
/**
|
|
232
|
+
* The Solana part of a signing context: which network, how it is sent, and the transaction in base58. Shared by sign and sign-and-broadcast so both describe it the same way.
|
|
233
|
+
*
|
|
234
|
+
* @param params.chainId - The Solana network id.
|
|
235
|
+
* @param params.base58SerializedTransaction - The transaction, base58-encoded.
|
|
236
|
+
*/ buildSvmTransactionContext({ chainId, base58SerializedTransaction }) {
|
|
237
|
+
return {
|
|
238
|
+
chainId,
|
|
239
|
+
method: 'signAndSendTransaction',
|
|
240
|
+
serializedTransactions: [
|
|
241
|
+
base58SerializedTransaction
|
|
242
|
+
]
|
|
243
|
+
};
|
|
244
|
+
}
|
|
178
245
|
buildSignParams({ transaction, senderAddress, password, signedSessionId, mfaToken, elevatedAccessToken, chainId, base58SerializedTransaction, context, approvalQuorum }) {
|
|
179
246
|
const signParams = {
|
|
180
247
|
message: transaction,
|
|
@@ -188,13 +255,10 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
|
|
|
188
255
|
};
|
|
189
256
|
if (chainId !== undefined) {
|
|
190
257
|
signParams.context = _extends({}, context, {
|
|
191
|
-
svmTransaction: {
|
|
258
|
+
svmTransaction: this.buildSvmTransactionContext({
|
|
192
259
|
chainId,
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
base58SerializedTransaction
|
|
196
|
-
]
|
|
197
|
-
}
|
|
260
|
+
base58SerializedTransaction
|
|
261
|
+
})
|
|
198
262
|
});
|
|
199
263
|
}
|
|
200
264
|
return signParams;
|
package/index.esm.js
CHANGED
|
@@ -166,6 +166,59 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
|
|
|
166
166
|
throw error;
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Signs a Solana transaction for Dynamic to broadcast.
|
|
171
|
+
*
|
|
172
|
+
* @param params.senderAddress - The wallet's address.
|
|
173
|
+
* @param params.transaction - The transaction message as hex, the same bytes `signTransaction` signs.
|
|
174
|
+
* @param params.chainId - The Solana network id (e.g. `101`). Dynamic checks it against the wallet's network.
|
|
175
|
+
* @param params.skipPreflight - Skip the network's pre-send dry run. Faster, but a doomed transaction still costs a fee.
|
|
176
|
+
* @param params.requestedCertainty - How sure to be before calling it confirmed: `fast`, `safe` or `final`, or `chain:` plus a chain-specific value. Defaults to `safe`.
|
|
177
|
+
* @param params.externalReference - Your own label, returned on every event. Not unique.
|
|
178
|
+
* @param params.idempotencyKey - Makes a retry safe: the same key replays the stored answer instead of sending twice. A new one is made when omitted.
|
|
179
|
+
* @param params.password - The wallet's backup password, if it has one.
|
|
180
|
+
* @param params.signedSessionId - The signed-in session, used to unlock the wallet's key share.
|
|
181
|
+
* @param params.mfaToken - Proof of the user's multi-factor check, when the wallet needs one.
|
|
182
|
+
* @param params.elevatedAccessToken - Proof of a recent re-login, when the wallet needs one.
|
|
183
|
+
* @param params.approvalQuorum - Approvers' consent for a governed wallet, sent on the retry after `intent_required`.
|
|
184
|
+
* @param params.onError - Called with the failure's message, never the raw error.
|
|
185
|
+
* @param params.traceContext - Ties this call's logs to the server's, across retries. Created when omitted.
|
|
186
|
+
* @returns The transaction record.
|
|
187
|
+
* @throws Error when `chainId` is missing.
|
|
188
|
+
*/ async signAndBroadcastTransaction({ senderAddress, transaction, chainId, skipPreflight, password = undefined, signedSessionId, mfaToken, elevatedAccessToken, approvalQuorum, requestedCertainty, externalReference, idempotencyKey, onError, traceContext }) {
|
|
189
|
+
if (!chainId) {
|
|
190
|
+
throw new Error('Sign and broadcast on Solana needs the network id as `chainId`');
|
|
191
|
+
}
|
|
192
|
+
const base58SerializedTransaction = this.prepareTransactionForSigning(transaction);
|
|
193
|
+
return await this.signAndBroadcast({
|
|
194
|
+
accountAddress: senderAddress,
|
|
195
|
+
chainName: this.chainName,
|
|
196
|
+
contexts: [
|
|
197
|
+
{
|
|
198
|
+
svmTransaction: this.buildSvmTransactionContext({
|
|
199
|
+
chainId,
|
|
200
|
+
base58SerializedTransaction
|
|
201
|
+
})
|
|
202
|
+
}
|
|
203
|
+
],
|
|
204
|
+
broadcastOptions: skipPreflight === undefined ? undefined : {
|
|
205
|
+
skipPreflight
|
|
206
|
+
},
|
|
207
|
+
messages: [
|
|
208
|
+
transaction
|
|
209
|
+
],
|
|
210
|
+
password,
|
|
211
|
+
signedSessionId,
|
|
212
|
+
mfaToken,
|
|
213
|
+
elevatedAccessToken,
|
|
214
|
+
approvalQuorum,
|
|
215
|
+
requestedCertainty,
|
|
216
|
+
externalReference,
|
|
217
|
+
idempotencyKey,
|
|
218
|
+
onError,
|
|
219
|
+
traceContext
|
|
220
|
+
});
|
|
221
|
+
}
|
|
169
222
|
prepareTransactionForSigning(transaction) {
|
|
170
223
|
const transactionBytes = new Uint8Array(Buffer.from(transaction, 'hex'));
|
|
171
224
|
const deserializedTransaction = VersionedMessage.deserialize(transactionBytes);
|
|
@@ -173,6 +226,20 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
|
|
|
173
226
|
const serializedTransaction = versionedTransaction.serialize();
|
|
174
227
|
return bs58.encode(serializedTransaction);
|
|
175
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* The Solana part of a signing context: which network, how it is sent, and the transaction in base58. Shared by sign and sign-and-broadcast so both describe it the same way.
|
|
231
|
+
*
|
|
232
|
+
* @param params.chainId - The Solana network id.
|
|
233
|
+
* @param params.base58SerializedTransaction - The transaction, base58-encoded.
|
|
234
|
+
*/ buildSvmTransactionContext({ chainId, base58SerializedTransaction }) {
|
|
235
|
+
return {
|
|
236
|
+
chainId,
|
|
237
|
+
method: 'signAndSendTransaction',
|
|
238
|
+
serializedTransactions: [
|
|
239
|
+
base58SerializedTransaction
|
|
240
|
+
]
|
|
241
|
+
};
|
|
242
|
+
}
|
|
176
243
|
buildSignParams({ transaction, senderAddress, password, signedSessionId, mfaToken, elevatedAccessToken, chainId, base58SerializedTransaction, context, approvalQuorum }) {
|
|
177
244
|
const signParams = {
|
|
178
245
|
message: transaction,
|
|
@@ -186,13 +253,10 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
|
|
|
186
253
|
};
|
|
187
254
|
if (chainId !== undefined) {
|
|
188
255
|
signParams.context = _extends({}, context, {
|
|
189
|
-
svmTransaction: {
|
|
256
|
+
svmTransaction: this.buildSvmTransactionContext({
|
|
190
257
|
chainId,
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
base58SerializedTransaction
|
|
194
|
-
]
|
|
195
|
-
}
|
|
258
|
+
base58SerializedTransaction
|
|
259
|
+
})
|
|
196
260
|
});
|
|
197
261
|
}
|
|
198
262
|
return signParams;
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-labs-wallet/svm",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.35",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@dynamic-labs-wallet/browser": "1.1.
|
|
7
|
+
"@dynamic-labs-wallet/browser": "1.1.35",
|
|
8
8
|
"@solana/web3.js": "^1.98.2",
|
|
9
9
|
"bs58": "^6.0.0",
|
|
10
10
|
"@dynamic-labs/sdk-api-core": "0.50.0"
|
package/src/svm/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DynamicWalletClient, type Ed25519KeygenResult, type ThresholdSignatureScheme, type TraceContext, type RequestWithElevatedAccessToken, type BaseSignParams } from '@dynamic-labs-wallet/browser';
|
|
1
|
+
import { DynamicWalletClient, type Ed25519KeygenResult, type ThresholdSignatureScheme, type TraceContext, type RequestWithElevatedAccessToken, type BaseSignParams, type SignAndBroadcastResponse } from '@dynamic-labs-wallet/browser';
|
|
2
2
|
export declare class DynamicSvmWalletClient extends DynamicWalletClient {
|
|
3
3
|
readonly chainName = "SVM";
|
|
4
4
|
accountAddress?: string;
|
|
@@ -37,7 +37,43 @@ export declare class DynamicSvmWalletClient extends DynamicWalletClient {
|
|
|
37
37
|
transaction: string;
|
|
38
38
|
chainId?: string;
|
|
39
39
|
} & BaseSignParams): Promise<string>;
|
|
40
|
+
/**
|
|
41
|
+
* Signs a Solana transaction for Dynamic to broadcast.
|
|
42
|
+
*
|
|
43
|
+
* @param params.senderAddress - The wallet's address.
|
|
44
|
+
* @param params.transaction - The transaction message as hex, the same bytes `signTransaction` signs.
|
|
45
|
+
* @param params.chainId - The Solana network id (e.g. `101`). Dynamic checks it against the wallet's network.
|
|
46
|
+
* @param params.skipPreflight - Skip the network's pre-send dry run. Faster, but a doomed transaction still costs a fee.
|
|
47
|
+
* @param params.requestedCertainty - How sure to be before calling it confirmed: `fast`, `safe` or `final`, or `chain:` plus a chain-specific value. Defaults to `safe`.
|
|
48
|
+
* @param params.externalReference - Your own label, returned on every event. Not unique.
|
|
49
|
+
* @param params.idempotencyKey - Makes a retry safe: the same key replays the stored answer instead of sending twice. A new one is made when omitted.
|
|
50
|
+
* @param params.password - The wallet's backup password, if it has one.
|
|
51
|
+
* @param params.signedSessionId - The signed-in session, used to unlock the wallet's key share.
|
|
52
|
+
* @param params.mfaToken - Proof of the user's multi-factor check, when the wallet needs one.
|
|
53
|
+
* @param params.elevatedAccessToken - Proof of a recent re-login, when the wallet needs one.
|
|
54
|
+
* @param params.approvalQuorum - Approvers' consent for a governed wallet, sent on the retry after `intent_required`.
|
|
55
|
+
* @param params.onError - Called with the failure's message, never the raw error.
|
|
56
|
+
* @param params.traceContext - Ties this call's logs to the server's, across retries. Created when omitted.
|
|
57
|
+
* @returns The transaction record.
|
|
58
|
+
* @throws Error when `chainId` is missing.
|
|
59
|
+
*/
|
|
60
|
+
signAndBroadcastTransaction({ senderAddress, transaction, chainId, skipPreflight, password, signedSessionId, mfaToken, elevatedAccessToken, approvalQuorum, requestedCertainty, externalReference, idempotencyKey, onError, traceContext, }: {
|
|
61
|
+
senderAddress: string;
|
|
62
|
+
transaction: string;
|
|
63
|
+
chainId: string;
|
|
64
|
+
skipPreflight?: boolean;
|
|
65
|
+
requestedCertainty?: string;
|
|
66
|
+
externalReference?: string;
|
|
67
|
+
idempotencyKey?: string;
|
|
68
|
+
} & Pick<BaseSignParams, 'password' | 'signedSessionId' | 'mfaToken' | 'elevatedAccessToken' | 'approvalQuorum' | 'onError' | 'traceContext'>): Promise<SignAndBroadcastResponse>;
|
|
40
69
|
private prepareTransactionForSigning;
|
|
70
|
+
/**
|
|
71
|
+
* The Solana part of a signing context: which network, how it is sent, and the transaction in base58. Shared by sign and sign-and-broadcast so both describe it the same way.
|
|
72
|
+
*
|
|
73
|
+
* @param params.chainId - The Solana network id.
|
|
74
|
+
* @param params.base58SerializedTransaction - The transaction, base58-encoded.
|
|
75
|
+
*/
|
|
76
|
+
private buildSvmTransactionContext;
|
|
41
77
|
private buildSignParams;
|
|
42
78
|
/**
|
|
43
79
|
* Exports the private key for a given account address
|
package/src/svm/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/svm/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAUnB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EACjB,KAAK,8BAA8B,EAEnC,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/svm/client.ts"],"names":[],"mappings":"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"}
|