@leather.io/stacks 1.3.6 → 1.5.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/dist/index.d.ts CHANGED
@@ -1,8 +1,68 @@
1
1
  import * as _stacks_transactions from '@stacks/transactions';
2
- import { ChainID, StacksPrivateKey, ClarityValue, StacksTransaction } from '@stacks/transactions';
3
- import { HDKey } from '@scure/bip32';
4
- import { NetworkModes } from '@leather.io/models';
2
+ import { StacksTransaction, UnsignedContractCallOptions, UnsignedContractDeployOptions, UnsignedTokenTransferOptions, PostCondition, ChainID, StacksPrivateKey, ClarityValue } from '@stacks/transactions';
5
3
  import { Signer } from '@leather.io/crypto';
4
+ import { NetworkModes, ReplaceTypes, Money } from '@leather.io/models';
5
+ import BigNumber from 'bignumber.js';
6
+ import { HDKey } from '@scure/bip32';
7
+
8
+ declare function signStacksTransaction(tx: StacksTransaction, privateKey: string): StacksTransaction;
9
+ type StacksSignerFn = (tx: StacksTransaction) => Promise<StacksTransaction>;
10
+ interface StacksSigner extends Signer {
11
+ descriptor: string;
12
+ keyOrigin: string;
13
+ address: string;
14
+ accountIndex: number;
15
+ network: NetworkModes;
16
+ sign: StacksSignerFn;
17
+ }
18
+ declare function createSignFnFromMnemonic(keyOrigin: string, getMnemonicFn: () => Promise<{
19
+ mnemonic: string;
20
+ passphrase?: string;
21
+ }>): (tx: StacksTransaction) => Promise<StacksTransaction>;
22
+ interface InitalizeStacksSignerArgs {
23
+ descriptor: string;
24
+ network: NetworkModes;
25
+ signFn: StacksSignerFn;
26
+ }
27
+ declare function initalizeStacksSigner(args: InitalizeStacksSignerArgs): StacksSigner;
28
+
29
+ declare enum TransactionTypes {
30
+ ContractCall = "contract_call",
31
+ ContractDeploy = "smart_contract",
32
+ StxTokenTransfer = "token_transfer"
33
+ }
34
+ declare function isTransactionTypeSupported(txType: TransactionTypes): txType is TransactionTypes;
35
+ type StacksUnsignedContractCallOptions = ReplaceTypes<UnsignedContractCallOptions, {
36
+ fee: Money;
37
+ functionArgs: string[];
38
+ nonce: number | string;
39
+ }> & {
40
+ txType: TransactionTypes.ContractCall;
41
+ };
42
+ type StacksUnsignedContractDeployOptions = ReplaceTypes<UnsignedContractDeployOptions, {
43
+ fee: Money;
44
+ nonce: number | string;
45
+ }> & {
46
+ txType: TransactionTypes.ContractDeploy;
47
+ };
48
+ type StacksUnsignedTokenTransferOptions = ReplaceTypes<UnsignedTokenTransferOptions, {
49
+ amount: Money;
50
+ fee: Money;
51
+ nonce: number | string;
52
+ }> & {
53
+ txType: TransactionTypes.StxTokenTransfer;
54
+ };
55
+ type StacksUnsignedTransactionOptions = StacksUnsignedContractCallOptions | StacksUnsignedContractDeployOptions | StacksUnsignedTokenTransferOptions;
56
+
57
+ declare function initNonce(nonce: number | string): BigNumber;
58
+ declare function generateUnsignedContractCall(options: StacksUnsignedContractCallOptions): Promise<_stacks_transactions.StacksTransaction>;
59
+ declare function generateUnsignedContractDeploy(options: StacksUnsignedContractDeployOptions): Promise<_stacks_transactions.StacksTransaction>;
60
+ declare function generateUnsignedStxTokenTransfer(options: StacksUnsignedTokenTransferOptions): Promise<_stacks_transactions.StacksTransaction>;
61
+ declare function generateStacksUnsignedTransaction(options: StacksUnsignedTransactionOptions): Promise<_stacks_transactions.StacksTransaction>;
62
+
63
+ declare function getPostConditionFromString(postCondition: string): PostCondition;
64
+ declare function getPostCondition(postCondition: string | PostCondition): PostCondition;
65
+ declare function getPostConditions(postConditions?: (string | PostCondition)[]): PostCondition[] | undefined;
6
66
 
7
67
  declare const stxDerivationWithAccount = "m/44'/5757'/0'/0/{account}";
8
68
  declare function makeAccountIndexDerivationPathFactory(derivationPath: string): (account: number) => string;
@@ -27,6 +87,29 @@ declare function deriveStxPublicKey({ keychain, index }: {
27
87
  }): _stacks_transactions.StacksPublicKey;
28
88
  declare function stacksRootKeychainToAccountDescriptor(keychain: HDKey, accountIndex: number): string;
29
89
  declare function getStacksBurnAddress(chainId: ChainID): string;
90
+ declare function cleanHex(hexWithMaybePrefix: string): string;
91
+ /**
92
+ * Gets the contract name of a fully qualified name of an asset.
93
+ *
94
+ * @param contractId - the source string: [principal].[contract-name] or [principal].[contract-name]::[asset-name]
95
+ */
96
+ declare function getStacksContractName(contractId: string): string;
97
+ /**
98
+ * Gets the asset name from a a fully qualified name of an asset.
99
+ *
100
+ * @param contractId - the fully qualified name of the asset: [principal].[contract-name]::[asset-name]
101
+ */
102
+ declare function getStacksContractAssetName(contractId: string): string;
103
+ /**
104
+ * Gets the parts that make up a fully qualified name of an asset.
105
+ *
106
+ * @param contractId - the fully qualified name of the asset: [principal].[contract-name]::[asset-name]
107
+ */
108
+ declare function getStacksContractIdStringParts(contractId: string): {
109
+ contractAddress: string;
110
+ contractAssetName: string;
111
+ contractName: string;
112
+ };
30
113
 
31
114
  interface SignatureData {
32
115
  signature: string;
@@ -35,25 +118,4 @@ interface SignatureData {
35
118
  declare function signMessage(message: string, privateKey: StacksPrivateKey): SignatureData;
36
119
  declare function signStructuredDataMessage(message: ClarityValue, domain: ClarityValue, privateKey: StacksPrivateKey): SignatureData;
37
120
 
38
- declare function signStacksTransaction(tx: StacksTransaction, privateKey: string): StacksTransaction;
39
- type StacksSignerFn = (tx: StacksTransaction) => Promise<StacksTransaction>;
40
- interface StacksSigner extends Signer {
41
- descriptor: string;
42
- keyOrigin: string;
43
- address: string;
44
- accountIndex: number;
45
- network: NetworkModes;
46
- sign: StacksSignerFn;
47
- }
48
- declare function createSignFnFromMnemonic(keyOrigin: string, getMnemonicFn: () => Promise<{
49
- mnemonic: string;
50
- passphrase?: string;
51
- }>): (tx: StacksTransaction) => Promise<StacksTransaction>;
52
- interface InitalizeStacksSignerArgs {
53
- descriptor: string;
54
- network: NetworkModes;
55
- signFn: StacksSignerFn;
56
- }
57
- declare function initalizeStacksSigner(args: InitalizeStacksSignerArgs): StacksSigner;
58
-
59
- export { type StacksSigner, type StacksSignerFn, createSignFnFromMnemonic, deriveStxPrivateKey, deriveStxPublicKey, extractStacksDerivationPathAccountIndex, getStacksBurnAddress, initalizeStacksSigner, makeAccountIndexDerivationPathFactory, makeStxDerivationPath, signMessage, signStacksTransaction, signStructuredDataMessage, stacksChainIdToCoreNetworkMode, stacksRootKeychainToAccountDescriptor, stxDerivationWithAccount, whenStacksChainId };
121
+ export { type StacksSigner, type StacksSignerFn, type StacksUnsignedContractCallOptions, type StacksUnsignedContractDeployOptions, type StacksUnsignedTokenTransferOptions, type StacksUnsignedTransactionOptions, TransactionTypes, cleanHex, createSignFnFromMnemonic, deriveStxPrivateKey, deriveStxPublicKey, extractStacksDerivationPathAccountIndex, generateStacksUnsignedTransaction, generateUnsignedContractCall, generateUnsignedContractDeploy, generateUnsignedStxTokenTransfer, getPostCondition, getPostConditionFromString, getPostConditions, getStacksBurnAddress, getStacksContractAssetName, getStacksContractIdStringParts, getStacksContractName, initNonce, initalizeStacksSigner, isTransactionTypeSupported, makeAccountIndexDerivationPathFactory, makeStxDerivationPath, signMessage, signStacksTransaction, signStructuredDataMessage, stacksChainIdToCoreNetworkMode, stacksRootKeychainToAccountDescriptor, stxDerivationWithAccount, whenStacksChainId };
package/dist/index.js CHANGED
@@ -1,3 +1,18 @@
1
+ // src/signer/signer.ts
2
+ import {
3
+ AddressVersion,
4
+ TransactionSigner,
5
+ createStacksPrivateKey as createStacksPrivateKey2,
6
+ createStacksPublicKey,
7
+ publicKeyToAddress
8
+ } from "@stacks/transactions";
9
+ import {
10
+ decomposeDescriptor,
11
+ deriveRootKeychainFromMnemonic,
12
+ extractKeyFromDescriptor
13
+ } from "@leather.io/crypto";
14
+ import { whenNetwork } from "@leather.io/utils";
15
+
1
16
  // src/stacks.utils.ts
2
17
  import { bytesToHex } from "@noble/hashes/utils";
3
18
  import { compressPrivateKey } from "@stacks/encryption";
@@ -8,7 +23,7 @@ import {
8
23
  createKeyOriginPath,
9
24
  extractAddressIndexFromPath
10
25
  } from "@leather.io/crypto";
11
- import { assertIsTruthy, toHexString } from "@leather.io/utils";
26
+ import { assertIsTruthy, isString, toHexString } from "@leather.io/utils";
12
27
  var stxDerivationWithAccount = `m/44'/5757'/0'/0/{account}`;
13
28
  function makeAccountIndexDerivationPathFactory(derivationPath) {
14
29
  return (account) => derivationPath.replace("{account}", account.toString());
@@ -50,49 +65,43 @@ function getStacksBurnAddress(chainId) {
50
65
  return "ST000000000000000000002AMW42H";
51
66
  }
52
67
  }
53
-
54
- // src/message-signing.ts
55
- import { bytesToHex as bytesToHex2 } from "@noble/hashes/utils";
56
- import { hashMessage } from "@stacks/encryption";
57
- import {
58
- getPublicKey as getPublicKey2,
59
- publicKeyToString,
60
- signMessageHashRsv,
61
- signStructuredData
62
- } from "@stacks/transactions";
63
- function signMessage(message, privateKey) {
64
- const hash = hashMessage(message);
65
- return {
66
- signature: signMessageHashRsv({ privateKey, messageHash: bytesToHex2(hash) }).data,
67
- publicKey: publicKeyToString(getPublicKey2(privateKey))
68
- };
68
+ function cleanHex(hexWithMaybePrefix) {
69
+ if (!isString(hexWithMaybePrefix)) return hexWithMaybePrefix;
70
+ return hexWithMaybePrefix.startsWith("0x") ? hexWithMaybePrefix.replace("0x", "") : hexWithMaybePrefix;
69
71
  }
70
- function signStructuredDataMessage(message, domain, privateKey) {
71
- const signature = signStructuredData({
72
- message,
73
- domain,
74
- privateKey
75
- }).data;
72
+ function getStacksContractName(contractId) {
73
+ if (contractId.includes(".")) {
74
+ const parts = contractId?.split(".");
75
+ if (contractId.includes("::")) {
76
+ return parts[1].split("::")[0];
77
+ }
78
+ return parts[1];
79
+ }
80
+ return contractId;
81
+ }
82
+ function getStacksContractAssetName(contractId) {
83
+ if (!contractId.includes("::")) return contractId;
84
+ return contractId.split("::")[1];
85
+ }
86
+ function getStacksContractIdStringParts(contractId) {
87
+ if (!contractId.includes(".") || !contractId.includes("::")) {
88
+ return {
89
+ contractAddress: contractId,
90
+ contractAssetName: contractId,
91
+ contractName: contractId
92
+ };
93
+ }
94
+ const contractAddress = contractId.split(".")[0];
95
+ const contractAssetName = getStacksContractAssetName(contractId);
96
+ const contractName = getStacksContractName(contractId);
76
97
  return {
77
- signature,
78
- publicKey: publicKeyToString(getPublicKey2(privateKey))
98
+ contractAddress,
99
+ contractAssetName,
100
+ contractName
79
101
  };
80
102
  }
81
103
 
82
104
  // src/signer/signer.ts
83
- import {
84
- AddressVersion,
85
- TransactionSigner,
86
- createStacksPrivateKey as createStacksPrivateKey2,
87
- createStacksPublicKey,
88
- publicKeyToAddress
89
- } from "@stacks/transactions";
90
- import {
91
- decomposeDescriptor,
92
- deriveRootKeychainFromMnemonic,
93
- extractKeyFromDescriptor
94
- } from "@leather.io/crypto";
95
- import { whenNetwork } from "@leather.io/utils";
96
105
  function signStacksTransaction(tx, privateKey) {
97
106
  const signer = new TransactionSigner(tx);
98
107
  signer.signOrigin(createStacksPrivateKey2(privateKey));
@@ -114,6 +123,8 @@ function initalizeStacksSigner(args) {
114
123
  const publicKey = createStacksPublicKey(extractKeyFromDescriptor(descriptor));
115
124
  return {
116
125
  ...decomposeDescriptor(descriptor),
126
+ // here we overwrite the accountIndex with the derivation path account index for stx
127
+ accountIndex: extractStacksDerivationPathAccountIndex(descriptor),
117
128
  publicKey: publicKey.data,
118
129
  network,
119
130
  address: publicKeyToAddress(
@@ -126,13 +137,141 @@ function initalizeStacksSigner(args) {
126
137
  sign: signFn
127
138
  };
128
139
  }
140
+
141
+ // src/transactions/generate-unsigned-transaction.ts
142
+ import { hexToBytes as hexToBytes2 } from "@noble/hashes/utils";
143
+ import {
144
+ deserializeCV,
145
+ makeUnsignedContractCall,
146
+ makeUnsignedContractDeploy,
147
+ makeUnsignedSTXTokenTransfer
148
+ } from "@stacks/transactions";
149
+ import BigNumber from "bignumber.js";
150
+
151
+ // src/transactions/post-condition.utils.ts
152
+ import { hexToBytes } from "@noble/hashes/utils";
153
+ import { BytesReader, deserializePostCondition } from "@stacks/transactions";
154
+ import { isString as isString2 } from "@leather.io/utils";
155
+ function getPostConditionFromString(postCondition) {
156
+ try {
157
+ const reader = new BytesReader(hexToBytes(postCondition));
158
+ return deserializePostCondition(reader);
159
+ } catch (err) {
160
+ throw new Error("Not a serialized post condition");
161
+ }
162
+ }
163
+ function getPostCondition(postCondition) {
164
+ return isString2(postCondition) ? getPostConditionFromString(postCondition) : postCondition;
165
+ }
166
+ function getPostConditions(postConditions) {
167
+ return postConditions?.map(getPostCondition);
168
+ }
169
+
170
+ // src/transactions/transaction.types.ts
171
+ var TransactionTypes = /* @__PURE__ */ ((TransactionTypes2) => {
172
+ TransactionTypes2["ContractCall"] = "contract_call";
173
+ TransactionTypes2["ContractDeploy"] = "smart_contract";
174
+ TransactionTypes2["StxTokenTransfer"] = "token_transfer";
175
+ return TransactionTypes2;
176
+ })(TransactionTypes || {});
177
+ function isTransactionTypeSupported(txType) {
178
+ return txType === "contract_call" /* ContractCall */ || txType === "smart_contract" /* ContractDeploy */ || txType === "token_transfer" /* StxTokenTransfer */;
179
+ }
180
+
181
+ // src/transactions/generate-unsigned-transaction.ts
182
+ function initNonce(nonce) {
183
+ return new BigNumber(nonce, 10);
184
+ }
185
+ function generateUnsignedContractCall(options) {
186
+ const { fee, functionArgs, nonce, postConditions } = options;
187
+ const fnArgs = functionArgs.map((arg) => deserializeCV(hexToBytes2(cleanHex(arg))));
188
+ const parsedOptions = {
189
+ fee: fee.amount.toString(),
190
+ functionArgs: fnArgs,
191
+ nonce: initNonce(nonce).toString(),
192
+ postConditions: getPostConditions(postConditions)
193
+ };
194
+ return makeUnsignedContractCall({ ...options, ...parsedOptions });
195
+ }
196
+ function generateUnsignedContractDeploy(options) {
197
+ const { fee, nonce, postConditions } = options;
198
+ const parsedOptions = {
199
+ fee: fee.amount.toString(),
200
+ nonce: initNonce(nonce).toString(),
201
+ postConditions: getPostConditions(postConditions)
202
+ };
203
+ return makeUnsignedContractDeploy({ ...options, ...parsedOptions });
204
+ }
205
+ function generateUnsignedStxTokenTransfer(options) {
206
+ const { amount, fee, nonce } = options;
207
+ const parsedOptions = {
208
+ amount: amount.amount.toString(),
209
+ fee: fee.amount.toString(),
210
+ nonce: initNonce(nonce).toString()
211
+ };
212
+ return makeUnsignedSTXTokenTransfer({ ...options, ...parsedOptions });
213
+ }
214
+ async function generateStacksUnsignedTransaction(options) {
215
+ const isValid = isTransactionTypeSupported(options.txType);
216
+ if (!isValid) throw new Error(`Invalid Transaction Type: ${options.txType}`);
217
+ switch (options.txType) {
218
+ case "token_transfer" /* StxTokenTransfer */:
219
+ return generateUnsignedStxTokenTransfer(options);
220
+ case "contract_call" /* ContractCall */:
221
+ return generateUnsignedContractCall(options);
222
+ case "smart_contract" /* ContractDeploy */:
223
+ return generateUnsignedContractDeploy(options);
224
+ }
225
+ }
226
+
227
+ // src/message-signing.ts
228
+ import { bytesToHex as bytesToHex2 } from "@noble/hashes/utils";
229
+ import { hashMessage } from "@stacks/encryption";
230
+ import {
231
+ getPublicKey as getPublicKey2,
232
+ publicKeyToString,
233
+ signMessageHashRsv,
234
+ signStructuredData
235
+ } from "@stacks/transactions";
236
+ function signMessage(message, privateKey) {
237
+ const hash = hashMessage(message);
238
+ return {
239
+ signature: signMessageHashRsv({ privateKey, messageHash: bytesToHex2(hash) }).data,
240
+ publicKey: publicKeyToString(getPublicKey2(privateKey))
241
+ };
242
+ }
243
+ function signStructuredDataMessage(message, domain, privateKey) {
244
+ const signature = signStructuredData({
245
+ message,
246
+ domain,
247
+ privateKey
248
+ }).data;
249
+ return {
250
+ signature,
251
+ publicKey: publicKeyToString(getPublicKey2(privateKey))
252
+ };
253
+ }
129
254
  export {
255
+ TransactionTypes,
256
+ cleanHex,
130
257
  createSignFnFromMnemonic,
131
258
  deriveStxPrivateKey,
132
259
  deriveStxPublicKey,
133
260
  extractStacksDerivationPathAccountIndex,
261
+ generateStacksUnsignedTransaction,
262
+ generateUnsignedContractCall,
263
+ generateUnsignedContractDeploy,
264
+ generateUnsignedStxTokenTransfer,
265
+ getPostCondition,
266
+ getPostConditionFromString,
267
+ getPostConditions,
134
268
  getStacksBurnAddress,
269
+ getStacksContractAssetName,
270
+ getStacksContractIdStringParts,
271
+ getStacksContractName,
272
+ initNonce,
135
273
  initalizeStacksSigner,
274
+ isTransactionTypeSupported,
136
275
  makeAccountIndexDerivationPathFactory,
137
276
  makeStxDerivationPath,
138
277
  signMessage,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/stacks.utils.ts","../src/message-signing.ts","../src/signer/signer.ts"],"sourcesContent":["import { bytesToHex } from '@noble/hashes/utils';\nimport { HDKey } from '@scure/bip32';\nimport { compressPrivateKey } from '@stacks/encryption';\nimport { ChainID, createStacksPrivateKey, getPublicKey } from '@stacks/transactions';\n\nimport {\n DerivationPathDepth,\n createDescriptor,\n createKeyOriginPath,\n extractAddressIndexFromPath,\n} from '@leather.io/crypto';\nimport type { NetworkModes } from '@leather.io/models';\nimport { assertIsTruthy, toHexString } from '@leather.io/utils';\n\nexport const stxDerivationWithAccount = `m/44'/5757'/0'/0/{account}`;\n\nexport function makeAccountIndexDerivationPathFactory(derivationPath: string) {\n return (account: number) => derivationPath.replace('{account}', account.toString());\n}\n\nexport function extractStacksDerivationPathAccountIndex(path: string) {\n if (!path.includes('5757')) throw new Error('Not a valid Stacks derivation path: ' + path);\n return extractAddressIndexFromPath(path);\n}\n\n/**\n * Stacks accounts always use the same derivation path, regardless of network\n */\nexport const makeStxDerivationPath =\n makeAccountIndexDerivationPathFactory(stxDerivationWithAccount);\n\nexport function stacksChainIdToCoreNetworkMode(chainId: ChainID): NetworkModes {\n return whenStacksChainId(chainId)({ [ChainID.Mainnet]: 'mainnet', [ChainID.Testnet]: 'testnet' });\n}\n\ninterface WhenStacksChainIdMap<T> {\n [ChainID.Mainnet]: T;\n [ChainID.Testnet]: T;\n}\nexport function whenStacksChainId(chainId: ChainID) {\n return <T>(chainIdMap: WhenStacksChainIdMap<T>): T => chainIdMap[chainId];\n}\n\n// From `@stacks/wallet-sdk` package we are trying not to use\nexport function deriveStxPrivateKey({ keychain, index }: { keychain: HDKey; index: number }) {\n if (keychain.depth !== DerivationPathDepth.Root) throw new Error('Root keychain must be depth 0');\n const accountKeychain = keychain.derive(makeStxDerivationPath(index));\n assertIsTruthy(accountKeychain.privateKey);\n return bytesToHex(compressPrivateKey(accountKeychain.privateKey));\n}\n\nexport function deriveStxPublicKey({ keychain, index }: { keychain: HDKey; index: number }) {\n return getPublicKey(createStacksPrivateKey(deriveStxPrivateKey({ keychain, index })));\n}\n\nexport function stacksRootKeychainToAccountDescriptor(keychain: HDKey, accountIndex: number) {\n const fingerprint = toHexString(keychain.fingerprint);\n const publicKey = deriveStxPublicKey({ keychain, index: accountIndex });\n return createDescriptor(\n createKeyOriginPath(fingerprint, makeStxDerivationPath(accountIndex)),\n bytesToHex(publicKey.data)\n );\n}\n\nexport function getStacksBurnAddress(chainId: ChainID): string {\n switch (chainId) {\n case ChainID.Mainnet:\n return 'SP00000000000003SCNSJTCSE62ZF4MSE';\n case ChainID.Testnet:\n default:\n return 'ST000000000000000000002AMW42H';\n }\n}\n","import { bytesToHex } from '@noble/hashes/utils';\nimport { hashMessage } from '@stacks/encryption';\nimport {\n ClarityValue,\n StacksPrivateKey,\n getPublicKey,\n publicKeyToString,\n signMessageHashRsv,\n signStructuredData,\n} from '@stacks/transactions';\n\ninterface SignatureData {\n signature: string;\n publicKey: string;\n}\n\nexport function signMessage(message: string, privateKey: StacksPrivateKey): SignatureData {\n const hash = hashMessage(message);\n return {\n signature: signMessageHashRsv({ privateKey, messageHash: bytesToHex(hash) }).data,\n publicKey: publicKeyToString(getPublicKey(privateKey)),\n };\n}\n\nexport function signStructuredDataMessage(\n message: ClarityValue,\n domain: ClarityValue,\n privateKey: StacksPrivateKey\n): SignatureData {\n const signature = signStructuredData({\n message,\n domain,\n privateKey,\n }).data;\n\n return {\n signature,\n publicKey: publicKeyToString(getPublicKey(privateKey)),\n };\n}\n","import {\n AddressVersion,\n StacksTransaction,\n TransactionSigner,\n createStacksPrivateKey,\n createStacksPublicKey,\n publicKeyToAddress,\n} from '@stacks/transactions';\n\nimport {\n Signer,\n decomposeDescriptor,\n deriveRootKeychainFromMnemonic,\n extractKeyFromDescriptor,\n} from '@leather.io/crypto';\nimport { NetworkModes } from '@leather.io/models';\nimport { whenNetwork } from '@leather.io/utils';\n\nimport { deriveStxPrivateKey, extractStacksDerivationPathAccountIndex } from '../stacks.utils';\n\n// Warning: mutatitive. Ideally there would be a tx.clone() method\nexport function signStacksTransaction(tx: StacksTransaction, privateKey: string) {\n const signer = new TransactionSigner(tx);\n signer.signOrigin(createStacksPrivateKey(privateKey));\n return tx;\n}\n\nexport type StacksSignerFn = (tx: StacksTransaction) => Promise<StacksTransaction>;\n\nexport interface StacksSigner extends Signer {\n descriptor: string;\n keyOrigin: string;\n address: string;\n accountIndex: number;\n network: NetworkModes;\n sign: StacksSignerFn;\n}\n\nexport function createSignFnFromMnemonic(\n keyOrigin: string,\n getMnemonicFn: () => Promise<{ mnemonic: string; passphrase?: string }>\n) {\n return async (tx: StacksTransaction) => {\n const { mnemonic, passphrase } = await getMnemonicFn();\n const keychain = await deriveRootKeychainFromMnemonic(mnemonic, passphrase);\n const privateKey = deriveStxPrivateKey({\n keychain,\n index: extractStacksDerivationPathAccountIndex(keyOrigin),\n });\n return signStacksTransaction(tx, privateKey);\n };\n}\n\ninterface InitalizeStacksSignerArgs {\n descriptor: string;\n network: NetworkModes;\n signFn: StacksSignerFn;\n}\nexport function initalizeStacksSigner(args: InitalizeStacksSignerArgs): StacksSigner {\n const { descriptor, network, signFn } = args;\n\n const publicKey = createStacksPublicKey(extractKeyFromDescriptor(descriptor));\n\n return {\n ...decomposeDescriptor(descriptor),\n publicKey: publicKey.data,\n network,\n address: publicKeyToAddress(\n whenNetwork(network)({\n mainnet: AddressVersion.MainnetSingleSig,\n testnet: AddressVersion.TestnetSingleSig,\n }),\n publicKey\n ),\n sign: signFn,\n };\n}\n"],"mappings":"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","names":["bytesToHex","getPublicKey","createStacksPrivateKey","createStacksPrivateKey"]}
1
+ {"version":3,"sources":["../src/signer/signer.ts","../src/stacks.utils.ts","../src/transactions/generate-unsigned-transaction.ts","../src/transactions/post-condition.utils.ts","../src/transactions/transaction.types.ts","../src/message-signing.ts"],"sourcesContent":["import {\n AddressVersion,\n StacksTransaction,\n TransactionSigner,\n createStacksPrivateKey,\n createStacksPublicKey,\n publicKeyToAddress,\n} from '@stacks/transactions';\n\nimport {\n Signer,\n decomposeDescriptor,\n deriveRootKeychainFromMnemonic,\n extractKeyFromDescriptor,\n} from '@leather.io/crypto';\nimport { NetworkModes } from '@leather.io/models';\nimport { whenNetwork } from '@leather.io/utils';\n\nimport { deriveStxPrivateKey, extractStacksDerivationPathAccountIndex } from '../stacks.utils';\n\n// Warning: mutatitive. Ideally there would be a tx.clone() method\nexport function signStacksTransaction(tx: StacksTransaction, privateKey: string) {\n const signer = new TransactionSigner(tx);\n signer.signOrigin(createStacksPrivateKey(privateKey));\n return tx;\n}\n\nexport type StacksSignerFn = (tx: StacksTransaction) => Promise<StacksTransaction>;\n\nexport interface StacksSigner extends Signer {\n descriptor: string;\n keyOrigin: string;\n address: string;\n accountIndex: number;\n network: NetworkModes;\n sign: StacksSignerFn;\n}\n\nexport function createSignFnFromMnemonic(\n keyOrigin: string,\n getMnemonicFn: () => Promise<{ mnemonic: string; passphrase?: string }>\n) {\n return async (tx: StacksTransaction) => {\n const { mnemonic, passphrase } = await getMnemonicFn();\n const keychain = await deriveRootKeychainFromMnemonic(mnemonic, passphrase);\n const privateKey = deriveStxPrivateKey({\n keychain,\n index: extractStacksDerivationPathAccountIndex(keyOrigin),\n });\n return signStacksTransaction(tx, privateKey);\n };\n}\n\ninterface InitalizeStacksSignerArgs {\n descriptor: string;\n network: NetworkModes;\n signFn: StacksSignerFn;\n}\nexport function initalizeStacksSigner(args: InitalizeStacksSignerArgs): StacksSigner {\n const { descriptor, network, signFn } = args;\n\n const publicKey = createStacksPublicKey(extractKeyFromDescriptor(descriptor));\n\n return {\n ...decomposeDescriptor(descriptor),\n // here we overwrite the accountIndex with the derivation path account index for stx\n accountIndex: extractStacksDerivationPathAccountIndex(descriptor),\n publicKey: publicKey.data,\n network,\n address: publicKeyToAddress(\n whenNetwork(network)({\n mainnet: AddressVersion.MainnetSingleSig,\n testnet: AddressVersion.TestnetSingleSig,\n }),\n publicKey\n ),\n sign: signFn,\n };\n}\n","import { bytesToHex } from '@noble/hashes/utils';\nimport { HDKey } from '@scure/bip32';\nimport { compressPrivateKey } from '@stacks/encryption';\nimport { ChainID, createStacksPrivateKey, getPublicKey } from '@stacks/transactions';\n\nimport {\n DerivationPathDepth,\n createDescriptor,\n createKeyOriginPath,\n extractAddressIndexFromPath,\n} from '@leather.io/crypto';\nimport type { NetworkModes } from '@leather.io/models';\nimport { assertIsTruthy, isString, toHexString } from '@leather.io/utils';\n\nexport const stxDerivationWithAccount = `m/44'/5757'/0'/0/{account}`;\n\nexport function makeAccountIndexDerivationPathFactory(derivationPath: string) {\n return (account: number) => derivationPath.replace('{account}', account.toString());\n}\n\nexport function extractStacksDerivationPathAccountIndex(path: string) {\n if (!path.includes('5757')) throw new Error('Not a valid Stacks derivation path: ' + path);\n return extractAddressIndexFromPath(path);\n}\n\n/**\n * Stacks accounts always use the same derivation path, regardless of network\n */\nexport const makeStxDerivationPath =\n makeAccountIndexDerivationPathFactory(stxDerivationWithAccount);\n\nexport function stacksChainIdToCoreNetworkMode(chainId: ChainID): NetworkModes {\n return whenStacksChainId(chainId)({ [ChainID.Mainnet]: 'mainnet', [ChainID.Testnet]: 'testnet' });\n}\n\ninterface WhenStacksChainIdMap<T> {\n [ChainID.Mainnet]: T;\n [ChainID.Testnet]: T;\n}\nexport function whenStacksChainId(chainId: ChainID) {\n return <T>(chainIdMap: WhenStacksChainIdMap<T>): T => chainIdMap[chainId];\n}\n\n// From `@stacks/wallet-sdk` package we are trying not to use\nexport function deriveStxPrivateKey({ keychain, index }: { keychain: HDKey; index: number }) {\n if (keychain.depth !== DerivationPathDepth.Root) throw new Error('Root keychain must be depth 0');\n const accountKeychain = keychain.derive(makeStxDerivationPath(index));\n assertIsTruthy(accountKeychain.privateKey);\n return bytesToHex(compressPrivateKey(accountKeychain.privateKey));\n}\n\nexport function deriveStxPublicKey({ keychain, index }: { keychain: HDKey; index: number }) {\n return getPublicKey(createStacksPrivateKey(deriveStxPrivateKey({ keychain, index })));\n}\n\nexport function stacksRootKeychainToAccountDescriptor(keychain: HDKey, accountIndex: number) {\n const fingerprint = toHexString(keychain.fingerprint);\n const publicKey = deriveStxPublicKey({ keychain, index: accountIndex });\n return createDescriptor(\n createKeyOriginPath(fingerprint, makeStxDerivationPath(accountIndex)),\n bytesToHex(publicKey.data)\n );\n}\n\nexport function getStacksBurnAddress(chainId: ChainID): string {\n switch (chainId) {\n case ChainID.Mainnet:\n return 'SP00000000000003SCNSJTCSE62ZF4MSE';\n case ChainID.Testnet:\n default:\n return 'ST000000000000000000002AMW42H';\n }\n}\n\nexport function cleanHex(hexWithMaybePrefix: string): string {\n if (!isString(hexWithMaybePrefix)) return hexWithMaybePrefix;\n return hexWithMaybePrefix.startsWith('0x')\n ? hexWithMaybePrefix.replace('0x', '')\n : hexWithMaybePrefix;\n}\n\n/**\n * Gets the contract name of a fully qualified name of an asset.\n *\n * @param contractId - the source string: [principal].[contract-name] or [principal].[contract-name]::[asset-name]\n */\nexport function getStacksContractName(contractId: string): string {\n if (contractId.includes('.')) {\n const parts = contractId?.split('.');\n if (contractId.includes('::')) {\n return parts[1].split('::')[0];\n }\n return parts[1];\n }\n return contractId;\n}\n\n/**\n * Gets the asset name from a a fully qualified name of an asset.\n *\n * @param contractId - the fully qualified name of the asset: [principal].[contract-name]::[asset-name]\n */\nexport function getStacksContractAssetName(contractId: string): string {\n if (!contractId.includes('::')) return contractId;\n return contractId.split('::')[1];\n}\n\n/**\n * Gets the parts that make up a fully qualified name of an asset.\n *\n * @param contractId - the fully qualified name of the asset: [principal].[contract-name]::[asset-name]\n */\nexport function getStacksContractIdStringParts(contractId: string): {\n contractAddress: string;\n contractAssetName: string;\n contractName: string;\n} {\n if (!contractId.includes('.') || !contractId.includes('::')) {\n return {\n contractAddress: contractId,\n contractAssetName: contractId,\n contractName: contractId,\n };\n }\n\n const contractAddress = contractId.split('.')[0];\n const contractAssetName = getStacksContractAssetName(contractId);\n const contractName = getStacksContractName(contractId);\n\n return {\n contractAddress,\n contractAssetName,\n contractName,\n };\n}\n","import { hexToBytes } from '@noble/hashes/utils';\nimport {\n deserializeCV,\n makeUnsignedContractCall,\n makeUnsignedContractDeploy,\n makeUnsignedSTXTokenTransfer,\n} from '@stacks/transactions';\nimport BigNumber from 'bignumber.js';\n\nimport { cleanHex } from '../stacks.utils';\nimport { getPostConditions } from './post-condition.utils';\nimport {\n StacksUnsignedContractCallOptions,\n StacksUnsignedContractDeployOptions,\n StacksUnsignedTokenTransferOptions,\n StacksUnsignedTransactionOptions,\n TransactionTypes,\n isTransactionTypeSupported,\n} from './transaction.types';\n\nexport function initNonce(nonce: number | string) {\n return new BigNumber(nonce, 10);\n}\n\nexport function generateUnsignedContractCall(options: StacksUnsignedContractCallOptions) {\n const { fee, functionArgs, nonce, postConditions } = options;\n\n const fnArgs = functionArgs.map(arg => deserializeCV(hexToBytes(cleanHex(arg))));\n\n const parsedOptions = {\n fee: fee.amount.toString(),\n functionArgs: fnArgs,\n nonce: initNonce(nonce).toString(),\n postConditions: getPostConditions(postConditions),\n };\n\n return makeUnsignedContractCall({ ...options, ...parsedOptions });\n}\n\nexport function generateUnsignedContractDeploy(options: StacksUnsignedContractDeployOptions) {\n const { fee, nonce, postConditions } = options;\n\n const parsedOptions = {\n fee: fee.amount.toString(),\n nonce: initNonce(nonce).toString(),\n postConditions: getPostConditions(postConditions),\n };\n\n return makeUnsignedContractDeploy({ ...options, ...parsedOptions });\n}\n\nexport function generateUnsignedStxTokenTransfer(options: StacksUnsignedTokenTransferOptions) {\n const { amount, fee, nonce } = options;\n\n const parsedOptions = {\n amount: amount.amount.toString(),\n fee: fee.amount.toString(),\n nonce: initNonce(nonce).toString(),\n };\n\n return makeUnsignedSTXTokenTransfer({ ...options, ...parsedOptions });\n}\n\nexport async function generateStacksUnsignedTransaction(options: StacksUnsignedTransactionOptions) {\n const isValid = isTransactionTypeSupported(options.txType);\n\n if (!isValid) throw new Error(`Invalid Transaction Type: ${options.txType}`);\n\n switch (options.txType) {\n case TransactionTypes.StxTokenTransfer:\n return generateUnsignedStxTokenTransfer(options);\n case TransactionTypes.ContractCall:\n return generateUnsignedContractCall(options);\n case TransactionTypes.ContractDeploy:\n return generateUnsignedContractDeploy(options);\n }\n}\n","import { hexToBytes } from '@noble/hashes/utils';\nimport { BytesReader, PostCondition, deserializePostCondition } from '@stacks/transactions';\n\nimport { isString } from '@leather.io/utils';\n\nexport function getPostConditionFromString(postCondition: string): PostCondition {\n try {\n const reader = new BytesReader(hexToBytes(postCondition));\n return deserializePostCondition(reader);\n } catch (err) {\n throw new Error('Not a serialized post condition');\n }\n}\n\nexport function getPostCondition(postCondition: string | PostCondition): PostCondition {\n return isString(postCondition) ? getPostConditionFromString(postCondition) : postCondition;\n}\n\nexport function getPostConditions(\n postConditions?: (string | PostCondition)[]\n): PostCondition[] | undefined {\n return postConditions?.map(getPostCondition);\n}\n","import {\n UnsignedContractCallOptions,\n UnsignedContractDeployOptions,\n UnsignedTokenTransferOptions,\n} from '@stacks/transactions';\n\nimport { Money, ReplaceTypes } from '@leather.io/models';\n\nexport enum TransactionTypes {\n ContractCall = 'contract_call',\n ContractDeploy = 'smart_contract',\n StxTokenTransfer = 'token_transfer',\n}\n\nexport function isTransactionTypeSupported(txType: TransactionTypes) {\n return (\n txType === TransactionTypes.ContractCall ||\n txType === TransactionTypes.ContractDeploy ||\n txType === TransactionTypes.StxTokenTransfer\n );\n}\n\nexport type StacksUnsignedContractCallOptions = ReplaceTypes<\n UnsignedContractCallOptions,\n {\n fee: Money;\n functionArgs: string[];\n nonce: number | string;\n }\n> & { txType: TransactionTypes.ContractCall };\n\nexport type StacksUnsignedContractDeployOptions = ReplaceTypes<\n UnsignedContractDeployOptions,\n {\n fee: Money;\n nonce: number | string;\n }\n> & { txType: TransactionTypes.ContractDeploy };\n\nexport type StacksUnsignedTokenTransferOptions = ReplaceTypes<\n UnsignedTokenTransferOptions,\n {\n amount: Money;\n fee: Money;\n nonce: number | string;\n }\n> & { txType: TransactionTypes.StxTokenTransfer };\n\nexport type StacksUnsignedTransactionOptions =\n | StacksUnsignedContractCallOptions\n | StacksUnsignedContractDeployOptions\n | StacksUnsignedTokenTransferOptions;\n","import { bytesToHex } from '@noble/hashes/utils';\nimport { hashMessage } from '@stacks/encryption';\nimport {\n ClarityValue,\n StacksPrivateKey,\n getPublicKey,\n publicKeyToString,\n signMessageHashRsv,\n signStructuredData,\n} from '@stacks/transactions';\n\ninterface SignatureData {\n signature: string;\n publicKey: string;\n}\n\nexport function signMessage(message: string, privateKey: StacksPrivateKey): SignatureData {\n const hash = hashMessage(message);\n return {\n signature: signMessageHashRsv({ privateKey, messageHash: bytesToHex(hash) }).data,\n publicKey: publicKeyToString(getPublicKey(privateKey)),\n };\n}\n\nexport function signStructuredDataMessage(\n message: ClarityValue,\n domain: ClarityValue,\n privateKey: StacksPrivateKey\n): SignatureData {\n const signature = signStructuredData({\n message,\n domain,\n privateKey,\n }).data;\n\n return {\n signature,\n publicKey: publicKeyToString(getPublicKey(privateKey)),\n };\n}\n"],"mappings":"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","names":["createStacksPrivateKey","createStacksPrivateKey","hexToBytes","isString","TransactionTypes","hexToBytes","bytesToHex","getPublicKey"]}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@leather.io/stacks",
3
3
  "author": "leather.io",
4
4
  "description": "Stacks package for Leather",
5
- "version": "1.3.6",
5
+ "version": "1.5.0",
6
6
  "license": "MIT",
7
7
  "type": "module",
8
8
  "exports": {
@@ -12,13 +12,18 @@
12
12
  "@noble/hashes": "1.5.0",
13
13
  "@scure/bip32": "1.5.0",
14
14
  "@stacks/encryption": "6.16.1",
15
+ "@stacks/network": "6.13.0",
16
+ "@stacks/stacks-blockchain-api-types": "7.8.2",
15
17
  "@stacks/transactions": "6.17.0",
16
- "@leather.io/models": "0.21.0",
17
- "@leather.io/crypto": "1.6.13",
18
- "@leather.io/utils": "0.19.2"
18
+ "bignumber.js": "9.1.2",
19
+ "@leather.io/constants": "0.13.6",
20
+ "@leather.io/crypto": "1.6.15",
21
+ "@leather.io/models": "0.23.0",
22
+ "@leather.io/utils": "0.20.1"
19
23
  },
20
24
  "devDependencies": {
21
- "tsup": "8.1.0"
25
+ "tsup": "8.1.0",
26
+ "vitest": "2.1.5"
22
27
  },
23
28
  "files": [
24
29
  "dist"