@leather.io/stacks 1.9.0 → 1.10.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,7 +1,7 @@
1
1
  import * as _stacks_common from '@stacks/common';
2
2
  import { PrivateKey } from '@stacks/common';
3
3
  import * as _stacks_transactions from '@stacks/transactions';
4
- import { ClarityValue, StacksTransactionWire, AssetString, UnsignedContractCallOptions, UnsignedContractDeployOptions, UnsignedTokenTransferOptions, PostConditionWire, PostCondition, TxBroadcastResultRejected } from '@stacks/transactions';
4
+ import { ClarityValue, StacksTransactionWire, AssetString, ContractIdString, UnsignedContractCallOptions, UnsignedContractDeployOptions, UnsignedTokenTransferOptions, PostConditionWire, PostCondition, TxBroadcastResultRejected } from '@stacks/transactions';
5
5
  import { Signer } from '@leather.io/crypto';
6
6
  import { NetworkModes, ReplaceTypes, Money, TransactionErrorKey, ChainId as ChainId$1 } from '@leather.io/models';
7
7
  import { HDKey } from '@scure/bip32';
@@ -24,6 +24,8 @@ declare const TEST_TESTNET_ACCOUNT_2_STX_ADDRESS_SN = "SNXH3HNBPM5YP15VH16ZXZ9AX
24
24
 
25
25
  declare function signStacksTransaction(tx: StacksTransactionWire, privateKey: string): StacksTransactionWire;
26
26
  type StacksSignerFn = (tx: StacksTransactionWire) => Promise<StacksTransactionWire>;
27
+ type StacksSignMessageFn = (message: string) => Promise<SignatureData>;
28
+ type StacksSignStructuredMessageFn = (message: ClarityValue, domain: ClarityValue) => Promise<SignatureData>;
27
29
  interface StacksSigner extends Signer {
28
30
  descriptor: string;
29
31
  keyOrigin: string;
@@ -31,15 +33,27 @@ interface StacksSigner extends Signer {
31
33
  accountIndex: number;
32
34
  network: NetworkModes;
33
35
  sign: StacksSignerFn;
36
+ signMessage: StacksSignMessageFn;
37
+ signStructuredMessage: StacksSignStructuredMessageFn;
34
38
  }
35
39
  declare function createSignFnFromMnemonic(keyOrigin: string, getMnemonicFn: () => Promise<{
36
40
  mnemonic: string;
37
41
  passphrase?: string;
38
42
  }>): (tx: StacksTransactionWire) => Promise<StacksTransactionWire>;
43
+ declare function createSignMessageFnFromMnemonic(keyOrigin: string, getMnemonicFn: () => Promise<{
44
+ mnemonic: string;
45
+ passphrase?: string;
46
+ }>): (message: string) => Promise<SignatureData>;
47
+ declare function createSignStructuredDataMessageFnFromMnemonic(keyOrigin: string, getMnemonicFn: () => Promise<{
48
+ mnemonic: string;
49
+ passphrase?: string;
50
+ }>): (message: ClarityValue, domain: ClarityValue) => Promise<SignatureData>;
39
51
  interface InitalizeStacksSignerArgs {
40
52
  descriptor: string;
41
53
  network: NetworkModes;
42
54
  signFn: StacksSignerFn;
55
+ signMessageFn: StacksSignMessageFn;
56
+ signStructuredMessageFn: StacksSignStructuredMessageFn;
43
57
  }
44
58
  declare function initalizeStacksSigner(args: InitalizeStacksSignerArgs): StacksSigner;
45
59
 
@@ -75,6 +89,11 @@ interface FormatAssetStringArgs {
75
89
  assetName: string;
76
90
  }
77
91
  declare function formatAssetString({ contractAddress, contractName, assetName, }: FormatAssetStringArgs): AssetString;
92
+ interface FormatContractIdStringArgs {
93
+ contractAddress: string;
94
+ contractName: string;
95
+ }
96
+ declare function formatContractIdString({ contractAddress, contractName, }: FormatContractIdStringArgs): ContractIdString;
78
97
  /**
79
98
  * Gets the contract name.
80
99
  *
@@ -171,6 +190,19 @@ declare function getUnsignedStxTokenTransferParsedOptions(options: StacksUnsigne
171
190
  };
172
191
  declare function generateStacksUnsignedTransaction(options: StacksUnsignedTransactionOptions): Promise<_stacks_transactions.StacksTransactionWire>;
173
192
 
193
+ interface GetSip10FnArgs {
194
+ amount: number;
195
+ senderStacksAddress: string;
196
+ recipientStacksAddress: string;
197
+ }
198
+ declare function createSip10FnArgs({ amount, senderStacksAddress, recipientStacksAddress, }: GetSip10FnArgs): ClarityValue[];
199
+ interface GetSip9FnArgs {
200
+ assetId: string;
201
+ senderStacksAddress: string;
202
+ recipientStacksAddress: string;
203
+ }
204
+ declare function createSip9FnArgs({ assetId, senderStacksAddress, recipientStacksAddress, }: GetSip9FnArgs): ClarityValue[];
205
+
174
206
  declare function getPostConditionFromString(postCondition: string): PostConditionWire;
175
207
  declare function ensurePostConditionWireFormat(postCondition: string | PostCondition | PostConditionWire): PostConditionWire;
176
208
  declare function getPostCondition(postCondition: string | PostCondition | PostConditionWire): PostConditionWire;
@@ -200,4 +232,4 @@ interface StacksTransaction {
200
232
  }
201
233
  declare function isValidStacksTransaction({ amount, availableBalance, fee, payer, recipient, chainId, }: StacksTransaction): boolean;
202
234
 
203
- export { StacksError, type StacksErrorKey, type StacksSigner, type StacksSignerFn, type StacksUnsignedContractCallOptions, type StacksUnsignedContractDeployOptions, type StacksUnsignedTokenTransferOptions, type StacksUnsignedTransactionOptions, TEST_ACCOUNT_1_STX_ADDRESS, TEST_ACCOUNT_1_STX_ADDRESS_SM, TEST_ACCOUNT_2_STX_ADDRESS, TEST_TESTNET_ACCOUNT_2_STX_ADDRESS, TEST_TESTNET_ACCOUNT_2_STX_ADDRESS_SN, TransactionTypes, cleanHex, createSignFnFromMnemonic, deriveStxPrivateKey, deriveStxPublicKey, ensurePostConditionWireFormat, extractStacksDerivationPathAccountIndex, formatAssetString, formatContractId, generateStacksUnsignedTransaction, getErrorMessage, getPostCondition, getPostConditionFromString, getPostConditions, getPrincipalFromAssetString, getStacksAssetStringParts, getStacksBurnAddress, getStacksContractAssetName, getStacksContractName, getUnsignedContractCallParsedOptions, getUnsignedContractDeployParsedOptions, getUnsignedStxTokenTransferParsedOptions, initNonce, initalizeStacksSigner, isTransactionTypeSupported, isValidAddressChain, isValidStacksAddress, isValidStacksMemo, isValidStacksTransaction, makeAccountIndexDerivationPathFactory, makeStxDerivationPath, signMessage, signStacksTransaction, signStructuredDataMessage, stacksChainIdToCoreNetworkMode, stacksRootKeychainToAccountDescriptor, stxDerivationWithAccount, validatePayerNotRecipient, whenStacksChainId };
235
+ export { type SignatureData, StacksError, type StacksErrorKey, type StacksSignMessageFn, type StacksSignStructuredMessageFn, type StacksSigner, type StacksSignerFn, type StacksUnsignedContractCallOptions, type StacksUnsignedContractDeployOptions, type StacksUnsignedTokenTransferOptions, type StacksUnsignedTransactionOptions, TEST_ACCOUNT_1_STX_ADDRESS, TEST_ACCOUNT_1_STX_ADDRESS_SM, TEST_ACCOUNT_2_STX_ADDRESS, TEST_TESTNET_ACCOUNT_2_STX_ADDRESS, TEST_TESTNET_ACCOUNT_2_STX_ADDRESS_SN, TransactionTypes, cleanHex, createSignFnFromMnemonic, createSignMessageFnFromMnemonic, createSignStructuredDataMessageFnFromMnemonic, createSip10FnArgs, createSip9FnArgs, deriveStxPrivateKey, deriveStxPublicKey, ensurePostConditionWireFormat, extractStacksDerivationPathAccountIndex, formatAssetString, formatContractId, formatContractIdString, generateStacksUnsignedTransaction, getErrorMessage, getPostCondition, getPostConditionFromString, getPostConditions, getPrincipalFromAssetString, getStacksAssetStringParts, getStacksBurnAddress, getStacksContractAssetName, getStacksContractName, getUnsignedContractCallParsedOptions, getUnsignedContractDeployParsedOptions, getUnsignedStxTokenTransferParsedOptions, initNonce, initalizeStacksSigner, isTransactionTypeSupported, isValidAddressChain, isValidStacksAddress, isValidStacksMemo, isValidStacksTransaction, makeAccountIndexDerivationPathFactory, makeStxDerivationPath, signMessage, signStacksTransaction, signStructuredDataMessage, stacksChainIdToCoreNetworkMode, stacksRootKeychainToAccountDescriptor, stxDerivationWithAccount, validatePayerNotRecipient, whenStacksChainId };
package/dist/index.js CHANGED
@@ -46,7 +46,10 @@ import {
46
46
 
47
47
  // src/stacks.utils.ts
48
48
  import { ChainId } from "@stacks/network";
49
- import { compressPrivateKey, privateKeyToPublic as privateKeyToPublic2 } from "@stacks/transactions";
49
+ import {
50
+ compressPrivateKey,
51
+ privateKeyToPublic as privateKeyToPublic2
52
+ } from "@stacks/transactions";
50
53
  import {
51
54
  DerivationPathDepth,
52
55
  createDescriptor,
@@ -118,6 +121,12 @@ function formatAssetString({
118
121
  }) {
119
122
  return `${contractAddress}.${contractName}::${assetName}`;
120
123
  }
124
+ function formatContractIdString({
125
+ contractAddress,
126
+ contractName
127
+ }) {
128
+ return `${contractAddress}.${contractName}`;
129
+ }
121
130
  function getStacksContractName(identifier) {
122
131
  if (identifier.includes(".")) {
123
132
  const parts = identifier?.split(".");
@@ -156,19 +165,34 @@ function signStacksTransaction(tx, privateKey) {
156
165
  signer.signOrigin(privateKey);
157
166
  return tx;
158
167
  }
168
+ async function getPrivateKey(keyOrigin, getMnemonicFn) {
169
+ const { mnemonic, passphrase } = await getMnemonicFn();
170
+ const keychain = await deriveRootKeychainFromMnemonic(mnemonic, passphrase);
171
+ return deriveStxPrivateKey({
172
+ keychain,
173
+ index: extractStacksDerivationPathAccountIndex(keyOrigin)
174
+ });
175
+ }
159
176
  function createSignFnFromMnemonic(keyOrigin, getMnemonicFn) {
160
177
  return async (tx) => {
161
- const { mnemonic, passphrase } = await getMnemonicFn();
162
- const keychain = await deriveRootKeychainFromMnemonic(mnemonic, passphrase);
163
- const privateKey = deriveStxPrivateKey({
164
- keychain,
165
- index: extractStacksDerivationPathAccountIndex(keyOrigin)
166
- });
178
+ const privateKey = await getPrivateKey(keyOrigin, getMnemonicFn);
167
179
  return signStacksTransaction(tx, privateKey);
168
180
  };
169
181
  }
182
+ function createSignMessageFnFromMnemonic(keyOrigin, getMnemonicFn) {
183
+ return async (message) => {
184
+ const privateKey = await getPrivateKey(keyOrigin, getMnemonicFn);
185
+ return signMessage(message, privateKey);
186
+ };
187
+ }
188
+ function createSignStructuredDataMessageFnFromMnemonic(keyOrigin, getMnemonicFn) {
189
+ return async (message, domain) => {
190
+ const privateKey = await getPrivateKey(keyOrigin, getMnemonicFn);
191
+ return signStructuredDataMessage(message, domain, privateKey);
192
+ };
193
+ }
170
194
  function initalizeStacksSigner(args) {
171
- const { descriptor, network, signFn } = args;
195
+ const { descriptor, network, signFn, signMessageFn, signStructuredMessageFn } = args;
172
196
  const publicKey = createStacksPublicKey(extractKeyFromDescriptor(descriptor)).data;
173
197
  return {
174
198
  ...decomposeDescriptor(descriptor),
@@ -177,7 +201,9 @@ function initalizeStacksSigner(args) {
177
201
  publicKey,
178
202
  network,
179
203
  address: publicKeyToAddressSingleSig(publicKey, network),
180
- sign: signFn
204
+ sign: signFn,
205
+ signMessage: signMessageFn,
206
+ signStructuredMessage: signStructuredMessageFn
181
207
  };
182
208
  }
183
209
 
@@ -278,6 +304,41 @@ function generateStacksUnsignedTransaction(options) {
278
304
  }
279
305
  }
280
306
 
307
+ // src/transactions/get-contract-fn-args.ts
308
+ import {
309
+ createAddress,
310
+ deserializeCV as deserializeCV2,
311
+ noneCV,
312
+ standardPrincipalCVFromAddress,
313
+ uintCV
314
+ } from "@stacks/transactions";
315
+ function createSip10FnArgs({
316
+ amount,
317
+ senderStacksAddress,
318
+ recipientStacksAddress
319
+ }) {
320
+ const fnArgs = [
321
+ uintCV(amount),
322
+ standardPrincipalCVFromAddress(createAddress(senderStacksAddress)),
323
+ standardPrincipalCVFromAddress(createAddress(recipientStacksAddress)),
324
+ noneCV()
325
+ // Add memo to SIP-30?
326
+ ];
327
+ return fnArgs;
328
+ }
329
+ function createSip9FnArgs({
330
+ assetId,
331
+ senderStacksAddress,
332
+ recipientStacksAddress
333
+ }) {
334
+ const fnArgs = [
335
+ deserializeCV2(assetId),
336
+ standardPrincipalCVFromAddress(createAddress(senderStacksAddress)),
337
+ standardPrincipalCVFromAddress(createAddress(recipientStacksAddress))
338
+ ];
339
+ return fnArgs;
340
+ }
341
+
281
342
  // src/transactions/get-error-message.ts
282
343
  function getErrorMessage(reason) {
283
344
  switch (reason) {
@@ -463,12 +524,17 @@ export {
463
524
  TransactionTypes,
464
525
  cleanHex,
465
526
  createSignFnFromMnemonic,
527
+ createSignMessageFnFromMnemonic,
528
+ createSignStructuredDataMessageFnFromMnemonic,
529
+ createSip10FnArgs,
530
+ createSip9FnArgs,
466
531
  deriveStxPrivateKey,
467
532
  deriveStxPublicKey,
468
533
  ensurePostConditionWireFormat,
469
534
  extractStacksDerivationPathAccountIndex,
470
535
  formatAssetString,
471
536
  formatContractId,
537
+ formatContractIdString,
472
538
  generateStacksUnsignedTransaction,
473
539
  getErrorMessage,
474
540
  getPostCondition,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/message-signing.ts","../src/mocks/mocks.ts","../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/transactions/get-error-message.ts","../src/validation/stacks-error.ts","../src/validation/address-validation.ts","../src/validation/memo-validation.ts","../src/validation/amount-validation.ts","../src/validation/transaction-validation.ts"],"sourcesContent":["import { bytesToHex } from '@noble/hashes/utils';\nimport { PrivateKey } from '@stacks/common';\nimport { hashMessage } from '@stacks/encryption';\nimport {\n ClarityValue,\n privateKeyToPublic,\n signMessageHashRsv,\n signStructuredData,\n} from '@stacks/transactions';\n\ninterface SignatureData {\n signature: string;\n publicKey: string;\n}\nexport function signMessage(message: string, privateKey: PrivateKey): SignatureData {\n const hash = hashMessage(message);\n return {\n signature: signMessageHashRsv({ privateKey, messageHash: bytesToHex(hash) }),\n publicKey: privateKeyToPublic(privateKey) as string,\n };\n}\n\nexport function signStructuredDataMessage(\n message: ClarityValue,\n domain: ClarityValue,\n privateKey: PrivateKey\n): SignatureData {\n const signature = signStructuredData({\n message,\n domain,\n privateKey,\n });\n\n return {\n signature,\n publicKey: privateKeyToPublic(privateKey) as string,\n };\n}\n","// Stacks test addresses\nexport const TEST_ACCOUNT_1_STX_ADDRESS = 'SPS8CKF63P16J28AYF7PXW9E5AACH0NZNTEFWSFE';\nexport const TEST_ACCOUNT_2_STX_ADDRESS = 'SPXH3HNBPM5YP15VH16ZXZ9AX6CK289K3MCXRKCB';\nexport const TEST_TESTNET_ACCOUNT_2_STX_ADDRESS = 'STXH3HNBPM5YP15VH16ZXZ9AX6CK289K3NVR9T1P';\n// TODO ask about these prefixs\n// TEST_ACCOUNT_.. from extension mocks with prefix changed to SM / SN\nexport const TEST_ACCOUNT_1_STX_ADDRESS_SM = 'SM3FBR6RDNZYC5K4TZWV9VZJ6NGA4VX3YBQ8X2PQ';\nexport const TEST_TESTNET_ACCOUNT_2_STX_ADDRESS_SN = 'SNXH3HNBPM5YP15VH16ZXZ9AX6CK289K3NVR9T1P';\n","import {\n StacksTransactionWire,\n TransactionSigner,\n createStacksPublicKey,\n publicKeyToAddressSingleSig,\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';\n\nimport { deriveStxPrivateKey, extractStacksDerivationPathAccountIndex } from '../stacks.utils';\n\n// Warning: mutative. Ideally there would be a tx.clone() method\nexport function signStacksTransaction(tx: StacksTransactionWire, privateKey: string) {\n const signer = new TransactionSigner(tx);\n signer.signOrigin(privateKey);\n return tx;\n}\n\nexport type StacksSignerFn = (tx: StacksTransactionWire) => Promise<StacksTransactionWire>;\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: StacksTransactionWire) => {\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)).data;\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,\n network,\n address: publicKeyToAddressSingleSig(publicKey, network),\n sign: signFn,\n };\n}\n","import { HDKey } from '@scure/bip32';\nimport { ChainId } from '@stacks/network';\nimport { AssetString, compressPrivateKey, privateKeyToPublic } 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)({\n [ChainId.Mainnet]: 'mainnet',\n [ChainId.Testnet]: 'testnet',\n });\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 compressPrivateKey(accountKeychain.privateKey);\n}\n\nexport function deriveStxPublicKey({\n keychain,\n index,\n}: {\n keychain: HDKey;\n index: number;\n}): string {\n return privateKeyToPublic(deriveStxPrivateKey({ keychain, index })) as string;\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 publicKey\n );\n}\n\nexport function getStacksBurnAddress(chainIdChainId: ChainId): string {\n switch (chainIdChainId) {\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\nexport function getPrincipalFromAssetString(assetString: string) {\n return assetString.split('::')[0];\n}\n\nexport function formatContractId(address: string, name: string) {\n return `${address}.${name}`;\n}\n\ninterface FormatAssetStringArgs {\n contractAddress: string;\n contractName: string;\n assetName: string;\n}\nexport function formatAssetString({\n contractAddress,\n contractName,\n assetName,\n}: FormatAssetStringArgs): AssetString {\n return `${contractAddress}.${contractName}::${assetName}`;\n}\n\n/**\n * Gets the contract name.\n *\n * @param identifier - [principal].[contract-name] or [principal].[contract-name]::[asset-name]\n */\nexport function getStacksContractName(identifier: string): string {\n if (identifier.includes('.')) {\n const parts = identifier?.split('.');\n if (identifier.includes('::')) {\n return parts[1].split('::')[0];\n }\n return parts[1];\n }\n return identifier;\n}\n\n/**\n * Gets the asset name.\n *\n * @param identifier - [principal].[contract-name]::[asset-name]\n */\nexport function getStacksContractAssetName(identifier: string): string {\n if (!identifier.includes('::')) return identifier;\n return identifier.split('::')[1];\n}\n\n/**\n * Gets the parts that make up a fully qualified name of an asset.\n *\n * @param identifier - [principal].[contract-name]::[asset-name]\n */\nexport function getStacksAssetStringParts(identifier: string): {\n contractAddress: string;\n contractAssetName: string;\n contractName: string;\n} {\n if (!identifier.includes('.') && !identifier.includes('::')) {\n return {\n contractAddress: identifier,\n contractAssetName: identifier,\n contractName: identifier,\n };\n }\n\n const contractAddress = identifier.split('.')[0];\n const contractAssetName = getStacksContractAssetName(identifier);\n const contractName = getStacksContractName(identifier);\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 { assertUnreachable } from '@leather.io/utils';\n\nimport { cleanHex } from '../stacks.utils';\nimport { ensurePostConditionWireFormat, 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 getUnsignedContractCallParsedOptions(options: StacksUnsignedContractCallOptions) {\n return {\n ...options,\n fee: options.fee.amount.toString(),\n functionArgs: options.functionArgs.map(arg => deserializeCV(hexToBytes(cleanHex(arg)))),\n nonce: initNonce(options.nonce).toString(),\n postConditions: options.postConditions,\n };\n}\n\nexport function getUnsignedContractDeployParsedOptions(\n options: StacksUnsignedContractDeployOptions\n) {\n return {\n ...options,\n fee: options.fee.amount.toString(),\n nonce: initNonce(options.nonce).toString(),\n postConditions: getPostConditions(\n options.postConditions?.map(pc => ensurePostConditionWireFormat(pc))\n ),\n };\n}\n\nexport function getUnsignedStxTokenTransferParsedOptions(\n options: StacksUnsignedTokenTransferOptions\n) {\n return {\n ...options,\n amount: options.amount.amount.toString(),\n fee: options.fee.amount.toString(),\n nonce: initNonce(options.nonce).toString(),\n };\n}\n\nexport function generateStacksUnsignedTransaction(options: StacksUnsignedTransactionOptions) {\n const { txType } = options;\n\n const isValid = isTransactionTypeSupported(txType);\n\n if (!isValid) throw new Error(`Invalid Transaction Type: ${txType}`);\n\n switch (txType) {\n case TransactionTypes.StxTokenTransfer:\n return makeUnsignedSTXTokenTransfer(getUnsignedStxTokenTransferParsedOptions(options));\n case TransactionTypes.ContractCall:\n return makeUnsignedContractCall(getUnsignedContractCallParsedOptions(options));\n case TransactionTypes.ContractDeploy:\n return makeUnsignedContractDeploy(getUnsignedContractDeployParsedOptions(options));\n default:\n assertUnreachable(txType);\n }\n}\n","import { hexToBytes } from '@noble/hashes/utils';\nimport {\n BytesReader,\n PostCondition,\n PostConditionWire,\n deserializePostConditionWire,\n postConditionToWire,\n} from '@stacks/transactions';\n\nimport { isString } from '@leather.io/utils';\n\nexport function getPostConditionFromString(postCondition: string): PostConditionWire {\n try {\n const reader = new BytesReader(hexToBytes(postCondition));\n return deserializePostConditionWire(reader);\n } catch {\n throw new Error('Not a serialized post condition');\n }\n}\n\nexport function ensurePostConditionWireFormat(\n postCondition: string | PostCondition | PostConditionWire\n) {\n if (isString(postCondition)) return getPostConditionFromString(postCondition);\n if ('conditionType' in postCondition) return postCondition;\n return postConditionToWire(postCondition);\n}\n\nexport function getPostCondition(\n postCondition: string | PostCondition | PostConditionWire\n): PostConditionWire {\n return isString(postCondition)\n ? getPostConditionFromString(postCondition)\n : ensurePostConditionWireFormat(postCondition);\n}\n\nexport function getPostConditions(\n postConditions?: (string | PostCondition | PostConditionWire)[]\n): PostConditionWire[] | 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 { TxBroadcastResultRejected } from '@stacks/transactions';\n\nexport function getErrorMessage(\n reason:\n | TxBroadcastResultRejected['reason']\n | 'BadTransactionVersion'\n | 'ConflictingNonceInMempool'\n | 'EstimatorError'\n | 'TransferAmountMustBePositive'\n | 'TransferRecipientCannotEqualSender'\n) {\n switch (reason) {\n case 'BadAddressVersionByte':\n return 'Incorrect address';\n case 'BadFunctionArgument':\n return 'Incorrect function argument';\n case 'BadNonce':\n return 'Incorrect nonce';\n case 'BadTransactionVersion':\n return 'Incorrect transaction';\n case 'ConflictingNonceInMempool':\n return 'Nonce conflict';\n case 'ContractAlreadyExists':\n return 'Contract already exists';\n case 'Deserialization':\n return 'Deserialization failure';\n case 'EstimatorError':\n return 'Estimator error';\n case 'FeeTooLow':\n return 'Fee too low';\n case 'NoCoinbaseViaMempool':\n return 'No coinbase via mempool';\n case 'NoSuchContract':\n return 'Contract does not exist';\n case 'NoSuchPublicFunction':\n return 'Function does not exist';\n case 'NotEnoughFunds':\n return 'Not enough funds';\n case 'PoisonMicroblocksDoNotConflict':\n return 'Microblock conflict';\n case 'PoisonMicroblockHasUnknownPubKeyHash':\n return 'No anchor block with public key hash';\n case 'PoisonMicroblockIsInvalid':\n return 'Invalid microblock';\n case 'Serialization':\n return 'Serialization failure';\n case 'ServerFailureDatabase':\n return 'Database error';\n case 'ServerFailureNoSuchChainTip':\n return 'No such chain tip';\n case 'ServerFailureOther':\n return 'Server failure';\n case 'SignatureValidation':\n return 'Failed to validate signature';\n case 'TransferAmountMustBePositive':\n return 'Transfer amount must be positive';\n case 'TransferRecipientCannotEqualSender':\n return 'Cannot transfer STX to yourself';\n default:\n return 'Something went wrong';\n }\n}\n","import { TransactionErrorKey } from '@leather.io/models';\n\nexport type StacksErrorKey =\n | TransactionErrorKey\n | 'InvalidSameAddress'\n | 'UnknownBalance'\n | 'UnknownFee'\n | 'UnknownAmount';\n\nexport class StacksError extends Error {\n public message: StacksErrorKey;\n constructor(message: StacksErrorKey) {\n super(message);\n this.name = 'StacksError';\n this.message = message;\n\n // Fix the prototype chain\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { c32addressDecode } from 'c32check';\n\nimport { ChainId } from '@leather.io/models';\nimport { isEmptyString, isUndefined } from '@leather.io/utils';\n\n// taken from stacks-utils.ts\nexport function isValidStacksAddress(address: string) {\n if (isUndefined(address) || isEmptyString(address)) {\n return false;\n }\n try {\n c32addressDecode(address);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isValidAddressChain(address: string, chainId: ChainId) {\n if (!isValidStacksAddress(address)) {\n return false;\n }\n\n const prefix = address.slice(0, 2);\n switch (chainId) {\n case ChainId.Mainnet:\n return prefix === 'SM' || prefix === 'SP';\n case ChainId.Testnet:\n return prefix === 'SN' || prefix === 'ST';\n default:\n return false;\n }\n}\n\nexport function validatePayerNotRecipient(senderAddress: string, recipientAddress: string) {\n if (!isValidStacksAddress(senderAddress) || !isValidStacksAddress(recipientAddress)) {\n return false;\n }\n if (senderAddress === recipientAddress) {\n return false;\n }\n return true;\n}\n","import { MEMO_MAX_LENGTH_BYTES } from '@stacks/transactions';\n\nfunction exceedsMaxLengthBytes(value: string, maxLengthBytes: number): boolean {\n return value ? Buffer.from(value).length > maxLengthBytes : false;\n}\n\nexport function isValidStacksMemo(memo: string) {\n return !exceedsMaxLengthBytes(memo, MEMO_MAX_LENGTH_BYTES);\n}\n","import BigNumber from 'bignumber.js';\n\nimport { Money } from '@leather.io/models';\nimport { isDefined, stxToMicroStx } from '@leather.io/utils';\n\nimport { StacksError } from './stacks-error';\n\nfunction isMoneyAmountValid(amount: Money) {\n return amount && isDefined(amount.amount) && amount.amount;\n}\n\ninterface IsStxAmountValidArgs {\n availableBalance: Money;\n amount: Money;\n fee: Money;\n}\n\nexport function isStxAmountValid({ availableBalance, amount, fee }: IsStxAmountValidArgs) {\n if (!isMoneyAmountValid(amount)) {\n throw new StacksError('InvalidAmount');\n }\n if (!isMoneyAmountValid(availableBalance)) {\n throw new StacksError('UnknownBalance');\n }\n if (!isMoneyAmountValid(fee)) {\n throw new StacksError('UnknownFee');\n }\n return true;\n}\n\nexport function isStxBalanceSufficient({\n availableBalance: { amount: availableBalanceAmount },\n amount: { amount: desiredSpend },\n fee: { amount: feeAmount },\n}: IsStxAmountValidArgs) {\n const fee = new BigNumber(stxToMicroStx(feeAmount));\n\n if (!availableBalanceAmount) {\n throw new StacksError('UnknownBalance');\n }\n if (!fee.isFinite()) {\n throw new StacksError('UnknownFee');\n }\n\n const availableBalance = new BigNumber(stxToMicroStx(availableBalanceAmount));\n const spendableAmount = availableBalance.minus(fee);\n const amount = new BigNumber(stxToMicroStx(desiredSpend));\n return spendableAmount.isGreaterThanOrEqualTo(amount);\n}\n","import { ChainId, Money } from '@leather.io/models';\n\nimport {\n isValidAddressChain,\n isValidStacksAddress,\n validatePayerNotRecipient,\n} from './address-validation';\nimport { isStxAmountValid, isStxBalanceSufficient } from './amount-validation';\nimport { StacksError } from './stacks-error';\n\ninterface StacksTransaction {\n amount: Money;\n payer: string;\n recipient: string;\n chainId: ChainId;\n availableBalance: Money;\n fee: Money;\n}\n\nexport function isValidStacksTransaction({\n amount,\n availableBalance,\n fee,\n payer,\n recipient,\n chainId,\n}: StacksTransaction) {\n if (!isValidStacksAddress(payer) || !isValidStacksAddress(recipient)) {\n throw new StacksError('InvalidAddress');\n }\n if (!isValidAddressChain(payer, chainId) || !isValidAddressChain(recipient, chainId)) {\n throw new StacksError('InvalidNetworkAddress');\n }\n if (!validatePayerNotRecipient(payer, recipient)) {\n throw new StacksError('InvalidSameAddress');\n }\n\n if (!isStxAmountValid({ availableBalance, amount, fee })) {\n throw new StacksError('InvalidAmount');\n }\n if (!isStxBalanceSufficient({ availableBalance, amount, fee })) {\n throw new StacksError('InsufficientFunds');\n }\n return true;\n}\n"],"mappings":";AAAA,SAAS,kBAAkB;AAE3B,SAAS,mBAAmB;AAC5B;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMA,SAAS,YAAY,SAAiB,YAAuC;AAClF,QAAM,OAAO,YAAY,OAAO;AAChC,SAAO;AAAA,IACL,WAAW,mBAAmB,EAAE,YAAY,aAAa,WAAW,IAAI,EAAE,CAAC;AAAA,IAC3E,WAAW,mBAAmB,UAAU;AAAA,EAC1C;AACF;AAEO,SAAS,0BACd,SACA,QACA,YACe;AACf,QAAM,YAAY,mBAAmB;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,WAAW,mBAAmB,UAAU;AAAA,EAC1C;AACF;;;ACpCO,IAAM,6BAA6B;AACnC,IAAM,6BAA6B;AACnC,IAAM,qCAAqC;AAG3C,IAAM,gCAAgC;AACtC,IAAM,wCAAwC;;;ACPrD;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACXP,SAAS,eAAe;AACxB,SAAsB,oBAAoB,sBAAAA,2BAA0B;AAEpE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,gBAAgB,UAAU,mBAAmB;AAE/C,IAAM,2BAA2B;AAEjC,SAAS,sCAAsC,gBAAwB;AAC5E,SAAO,CAAC,YAAoB,eAAe,QAAQ,aAAa,QAAQ,SAAS,CAAC;AACpF;AAEO,SAAS,wCAAwC,MAAc;AACpE,MAAI,CAAC,KAAK,SAAS,MAAM,EAAG,OAAM,IAAI,MAAM,yCAAyC,IAAI;AACzF,SAAO,4BAA4B,IAAI;AACzC;AAKO,IAAM,wBACX,sCAAsC,wBAAwB;AAEzD,SAAS,+BAA+B,SAAgC;AAC7E,SAAO,kBAAkB,OAAO,EAAE;AAAA,IAChC,CAAC,QAAQ,OAAO,GAAG;AAAA,IACnB,CAAC,QAAQ,OAAO,GAAG;AAAA,EACrB,CAAC;AACH;AAMO,SAAS,kBAAkB,SAAkB;AAClD,SAAO,CAAI,eAA2C,WAAW,OAAO;AAC1E;AAGO,SAAS,oBAAoB,EAAE,UAAU,MAAM,GAAuC;AAC3F,MAAI,SAAS,UAAU,oBAAoB,KAAM,OAAM,IAAI,MAAM,+BAA+B;AAChG,QAAM,kBAAkB,SAAS,OAAO,sBAAsB,KAAK,CAAC;AACpE,iBAAe,gBAAgB,UAAU;AACzC,SAAO,mBAAmB,gBAAgB,UAAU;AACtD;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AACF,GAGW;AACT,SAAOA,oBAAmB,oBAAoB,EAAE,UAAU,MAAM,CAAC,CAAC;AACpE;AAEO,SAAS,sCAAsC,UAAiB,cAAsB;AAC3F,QAAM,cAAc,YAAY,SAAS,WAAW;AACpD,QAAM,YAAY,mBAAmB,EAAE,UAAU,OAAO,aAAa,CAAC;AACtE,SAAO;AAAA,IACL,oBAAoB,aAAa,sBAAsB,YAAY,CAAC;AAAA,IACpE;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB,gBAAiC;AACpE,UAAQ,gBAAgB;AAAA,IACtB,KAAK,QAAQ;AACX,aAAO;AAAA,IACT,KAAK,QAAQ;AAAA,IACb;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,SAAS,oBAAoC;AAC3D,MAAI,CAAC,SAAS,kBAAkB,EAAG,QAAO;AAC1C,SAAO,mBAAmB,WAAW,IAAI,IACrC,mBAAmB,QAAQ,MAAM,EAAE,IACnC;AACN;AAEO,SAAS,4BAA4B,aAAqB;AAC/D,SAAO,YAAY,MAAM,IAAI,EAAE,CAAC;AAClC;AAEO,SAAS,iBAAiB,SAAiB,MAAc;AAC9D,SAAO,GAAG,OAAO,IAAI,IAAI;AAC3B;AAOO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AACrC,SAAO,GAAG,eAAe,IAAI,YAAY,KAAK,SAAS;AACzD;AAOO,SAAS,sBAAsB,YAA4B;AAChE,MAAI,WAAW,SAAS,GAAG,GAAG;AAC5B,UAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,QAAI,WAAW,SAAS,IAAI,GAAG;AAC7B,aAAO,MAAM,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;AAAA,IAC/B;AACA,WAAO,MAAM,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAOO,SAAS,2BAA2B,YAA4B;AACrE,MAAI,CAAC,WAAW,SAAS,IAAI,EAAG,QAAO;AACvC,SAAO,WAAW,MAAM,IAAI,EAAE,CAAC;AACjC;AAOO,SAAS,0BAA0B,YAIxC;AACA,MAAI,CAAC,WAAW,SAAS,GAAG,KAAK,CAAC,WAAW,SAAS,IAAI,GAAG;AAC3D,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,kBAAkB,WAAW,MAAM,GAAG,EAAE,CAAC;AAC/C,QAAM,oBAAoB,2BAA2B,UAAU;AAC/D,QAAM,eAAe,sBAAsB,UAAU;AAErD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ADjJO,SAAS,sBAAsB,IAA2B,YAAoB;AACnF,QAAM,SAAS,IAAI,kBAAkB,EAAE;AACvC,SAAO,WAAW,UAAU;AAC5B,SAAO;AACT;AAaO,SAAS,yBACd,WACA,eACA;AACA,SAAO,OAAO,OAA8B;AAC1C,UAAM,EAAE,UAAU,WAAW,IAAI,MAAM,cAAc;AACrD,UAAM,WAAW,MAAM,+BAA+B,UAAU,UAAU;AAC1E,UAAM,aAAa,oBAAoB;AAAA,MACrC;AAAA,MACA,OAAO,wCAAwC,SAAS;AAAA,IAC1D,CAAC;AACD,WAAO,sBAAsB,IAAI,UAAU;AAAA,EAC7C;AACF;AAOO,SAAS,sBAAsB,MAA+C;AACnF,QAAM,EAAE,YAAY,SAAS,OAAO,IAAI;AAExC,QAAM,YAAY,sBAAsB,yBAAyB,UAAU,CAAC,EAAE;AAE9E,SAAO;AAAA,IACL,GAAG,oBAAoB,UAAU;AAAA;AAAA,IAEjC,cAAc,wCAAwC,UAAU;AAAA,IAChE;AAAA,IACA;AAAA,IACA,SAAS,4BAA4B,WAAW,OAAO;AAAA,IACvD,MAAM;AAAA,EACR;AACF;;;AErEA,SAAS,cAAAC,mBAAkB;AAC3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAAO,eAAe;AAEtB,SAAS,yBAAyB;;;ACTlC,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,YAAAC,iBAAgB;AAElB,SAAS,2BAA2B,eAA0C;AACnF,MAAI;AACF,UAAM,SAAS,IAAI,YAAY,WAAW,aAAa,CAAC;AACxD,WAAO,6BAA6B,MAAM;AAAA,EAC5C,QAAQ;AACN,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AACF;AAEO,SAAS,8BACd,eACA;AACA,MAAIA,UAAS,aAAa,EAAG,QAAO,2BAA2B,aAAa;AAC5E,MAAI,mBAAmB,cAAe,QAAO;AAC7C,SAAO,oBAAoB,aAAa;AAC1C;AAEO,SAAS,iBACd,eACmB;AACnB,SAAOA,UAAS,aAAa,IACzB,2BAA2B,aAAa,IACxC,8BAA8B,aAAa;AACjD;AAEO,SAAS,kBACd,gBACiC;AACjC,SAAO,gBAAgB,IAAI,gBAAgB;AAC7C;;;AChCO,IAAK,mBAAL,kBAAKC,sBAAL;AACL,EAAAA,kBAAA,kBAAe;AACf,EAAAA,kBAAA,oBAAiB;AACjB,EAAAA,kBAAA,sBAAmB;AAHT,SAAAA;AAAA,GAAA;AAML,SAAS,2BAA2B,QAA0B;AACnE,SACE,WAAW,sCACX,WAAW,yCACX,WAAW;AAEf;;;AFEO,SAAS,UAAU,OAAwB;AAChD,SAAO,IAAI,UAAU,OAAO,EAAE;AAChC;AAEO,SAAS,qCAAqC,SAA4C;AAC/F,SAAO;AAAA,IACL,GAAG;AAAA,IACH,KAAK,QAAQ,IAAI,OAAO,SAAS;AAAA,IACjC,cAAc,QAAQ,aAAa,IAAI,SAAO,cAAcC,YAAW,SAAS,GAAG,CAAC,CAAC,CAAC;AAAA,IACtF,OAAO,UAAU,QAAQ,KAAK,EAAE,SAAS;AAAA,IACzC,gBAAgB,QAAQ;AAAA,EAC1B;AACF;AAEO,SAAS,uCACd,SACA;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,KAAK,QAAQ,IAAI,OAAO,SAAS;AAAA,IACjC,OAAO,UAAU,QAAQ,KAAK,EAAE,SAAS;AAAA,IACzC,gBAAgB;AAAA,MACd,QAAQ,gBAAgB,IAAI,QAAM,8BAA8B,EAAE,CAAC;AAAA,IACrE;AAAA,EACF;AACF;AAEO,SAAS,yCACd,SACA;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,QAAQ,OAAO,OAAO,SAAS;AAAA,IACvC,KAAK,QAAQ,IAAI,OAAO,SAAS;AAAA,IACjC,OAAO,UAAU,QAAQ,KAAK,EAAE,SAAS;AAAA,EAC3C;AACF;AAEO,SAAS,kCAAkC,SAA2C;AAC3F,QAAM,EAAE,OAAO,IAAI;AAEnB,QAAM,UAAU,2BAA2B,MAAM;AAEjD,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,6BAA6B,MAAM,EAAE;AAEnE,UAAQ,QAAQ;AAAA,IACd;AACE,aAAO,6BAA6B,yCAAyC,OAAO,CAAC;AAAA,IACvF;AACE,aAAO,yBAAyB,qCAAqC,OAAO,CAAC;AAAA,IAC/E;AACE,aAAO,2BAA2B,uCAAuC,OAAO,CAAC;AAAA,IACnF;AACE,wBAAkB,MAAM;AAAA,EAC5B;AACF;;;AG3EO,SAAS,gBACd,QAOA;AACA,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;ACpDO,IAAM,cAAN,cAA0B,MAAM;AAAA,EAC9B;AAAA,EACP,YAAY,SAAyB;AACnC,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,UAAU;AAGf,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AACF;;;ACnBA,SAAS,wBAAwB;AAEjC,SAAS,WAAAC,gBAAe;AACxB,SAAS,eAAe,mBAAmB;AAGpC,SAAS,qBAAqB,SAAiB;AACpD,MAAI,YAAY,OAAO,KAAK,cAAc,OAAO,GAAG;AAClD,WAAO;AAAA,EACT;AACA,MAAI;AACF,qBAAiB,OAAO;AACxB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,SAAiB,SAAkB;AACrE,MAAI,CAAC,qBAAqB,OAAO,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,QAAQ,MAAM,GAAG,CAAC;AACjC,UAAQ,SAAS;AAAA,IACf,KAAKA,SAAQ;AACX,aAAO,WAAW,QAAQ,WAAW;AAAA,IACvC,KAAKA,SAAQ;AACX,aAAO,WAAW,QAAQ,WAAW;AAAA,IACvC;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,0BAA0B,eAAuB,kBAA0B;AACzF,MAAI,CAAC,qBAAqB,aAAa,KAAK,CAAC,qBAAqB,gBAAgB,GAAG;AACnF,WAAO;AAAA,EACT;AACA,MAAI,kBAAkB,kBAAkB;AACtC,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC1CA,SAAS,6BAA6B;AAEtC,SAAS,sBAAsB,OAAe,gBAAiC;AAC7E,SAAO,QAAQ,OAAO,KAAK,KAAK,EAAE,SAAS,iBAAiB;AAC9D;AAEO,SAAS,kBAAkB,MAAc;AAC9C,SAAO,CAAC,sBAAsB,MAAM,qBAAqB;AAC3D;;;ACRA,OAAOC,gBAAe;AAGtB,SAAS,WAAW,qBAAqB;AAIzC,SAAS,mBAAmB,QAAe;AACzC,SAAO,UAAU,UAAU,OAAO,MAAM,KAAK,OAAO;AACtD;AAQO,SAAS,iBAAiB,EAAE,kBAAkB,QAAQ,IAAI,GAAyB;AACxF,MAAI,CAAC,mBAAmB,MAAM,GAAG;AAC/B,UAAM,IAAI,YAAY,eAAe;AAAA,EACvC;AACA,MAAI,CAAC,mBAAmB,gBAAgB,GAAG;AACzC,UAAM,IAAI,YAAY,gBAAgB;AAAA,EACxC;AACA,MAAI,CAAC,mBAAmB,GAAG,GAAG;AAC5B,UAAM,IAAI,YAAY,YAAY;AAAA,EACpC;AACA,SAAO;AACT;AAEO,SAAS,uBAAuB;AAAA,EACrC,kBAAkB,EAAE,QAAQ,uBAAuB;AAAA,EACnD,QAAQ,EAAE,QAAQ,aAAa;AAAA,EAC/B,KAAK,EAAE,QAAQ,UAAU;AAC3B,GAAyB;AACvB,QAAM,MAAM,IAAIC,WAAU,cAAc,SAAS,CAAC;AAElD,MAAI,CAAC,wBAAwB;AAC3B,UAAM,IAAI,YAAY,gBAAgB;AAAA,EACxC;AACA,MAAI,CAAC,IAAI,SAAS,GAAG;AACnB,UAAM,IAAI,YAAY,YAAY;AAAA,EACpC;AAEA,QAAM,mBAAmB,IAAIA,WAAU,cAAc,sBAAsB,CAAC;AAC5E,QAAM,kBAAkB,iBAAiB,MAAM,GAAG;AAClD,QAAM,SAAS,IAAIA,WAAU,cAAc,YAAY,CAAC;AACxD,SAAO,gBAAgB,uBAAuB,MAAM;AACtD;;;AC7BO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,MAAI,CAAC,qBAAqB,KAAK,KAAK,CAAC,qBAAqB,SAAS,GAAG;AACpE,UAAM,IAAI,YAAY,gBAAgB;AAAA,EACxC;AACA,MAAI,CAAC,oBAAoB,OAAO,OAAO,KAAK,CAAC,oBAAoB,WAAW,OAAO,GAAG;AACpF,UAAM,IAAI,YAAY,uBAAuB;AAAA,EAC/C;AACA,MAAI,CAAC,0BAA0B,OAAO,SAAS,GAAG;AAChD,UAAM,IAAI,YAAY,oBAAoB;AAAA,EAC5C;AAEA,MAAI,CAAC,iBAAiB,EAAE,kBAAkB,QAAQ,IAAI,CAAC,GAAG;AACxD,UAAM,IAAI,YAAY,eAAe;AAAA,EACvC;AACA,MAAI,CAAC,uBAAuB,EAAE,kBAAkB,QAAQ,IAAI,CAAC,GAAG;AAC9D,UAAM,IAAI,YAAY,mBAAmB;AAAA,EAC3C;AACA,SAAO;AACT;","names":["privateKeyToPublic","hexToBytes","isString","TransactionTypes","hexToBytes","ChainId","BigNumber","BigNumber"]}
1
+ {"version":3,"sources":["../src/message-signing.ts","../src/mocks/mocks.ts","../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/transactions/get-contract-fn-args.ts","../src/transactions/get-error-message.ts","../src/validation/stacks-error.ts","../src/validation/address-validation.ts","../src/validation/memo-validation.ts","../src/validation/amount-validation.ts","../src/validation/transaction-validation.ts"],"sourcesContent":["import { bytesToHex } from '@noble/hashes/utils';\nimport { PrivateKey } from '@stacks/common';\nimport { hashMessage } from '@stacks/encryption';\nimport {\n ClarityValue,\n privateKeyToPublic,\n signMessageHashRsv,\n signStructuredData,\n} from '@stacks/transactions';\n\nexport interface SignatureData {\n signature: string;\n publicKey: string;\n}\nexport function signMessage(message: string, privateKey: PrivateKey): SignatureData {\n const hash = hashMessage(message);\n return {\n signature: signMessageHashRsv({ privateKey, messageHash: bytesToHex(hash) }),\n publicKey: privateKeyToPublic(privateKey) as string,\n };\n}\n\nexport function signStructuredDataMessage(\n message: ClarityValue,\n domain: ClarityValue,\n privateKey: PrivateKey\n): SignatureData {\n const signature = signStructuredData({\n message,\n domain,\n privateKey,\n });\n\n return {\n signature,\n publicKey: privateKeyToPublic(privateKey) as string,\n };\n}\n","// Stacks test addresses\nexport const TEST_ACCOUNT_1_STX_ADDRESS = 'SPS8CKF63P16J28AYF7PXW9E5AACH0NZNTEFWSFE';\nexport const TEST_ACCOUNT_2_STX_ADDRESS = 'SPXH3HNBPM5YP15VH16ZXZ9AX6CK289K3MCXRKCB';\nexport const TEST_TESTNET_ACCOUNT_2_STX_ADDRESS = 'STXH3HNBPM5YP15VH16ZXZ9AX6CK289K3NVR9T1P';\n// TODO ask about these prefixs\n// TEST_ACCOUNT_.. from extension mocks with prefix changed to SM / SN\nexport const TEST_ACCOUNT_1_STX_ADDRESS_SM = 'SM3FBR6RDNZYC5K4TZWV9VZJ6NGA4VX3YBQ8X2PQ';\nexport const TEST_TESTNET_ACCOUNT_2_STX_ADDRESS_SN = 'SNXH3HNBPM5YP15VH16ZXZ9AX6CK289K3NVR9T1P';\n","import {\n ClarityValue,\n StacksTransactionWire,\n TransactionSigner,\n createStacksPublicKey,\n publicKeyToAddressSingleSig,\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';\n\nimport { SignatureData, signMessage, signStructuredDataMessage } from '../message-signing';\nimport { deriveStxPrivateKey, extractStacksDerivationPathAccountIndex } from '../stacks.utils';\n\n// Warning: mutative. Ideally there would be a tx.clone() method\nexport function signStacksTransaction(tx: StacksTransactionWire, privateKey: string) {\n const signer = new TransactionSigner(tx);\n signer.signOrigin(privateKey);\n return tx;\n}\n\nexport type StacksSignerFn = (tx: StacksTransactionWire) => Promise<StacksTransactionWire>;\nexport type StacksSignMessageFn = (message: string) => Promise<SignatureData>;\nexport type StacksSignStructuredMessageFn = (\n message: ClarityValue,\n domain: ClarityValue\n) => Promise<SignatureData>;\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 signMessage: StacksSignMessageFn;\n signStructuredMessage: StacksSignStructuredMessageFn;\n}\n\nasync function getPrivateKey(\n keyOrigin: string,\n getMnemonicFn: () => Promise<{ mnemonic: string; passphrase?: string }>\n) {\n const { mnemonic, passphrase } = await getMnemonicFn();\n const keychain = await deriveRootKeychainFromMnemonic(mnemonic, passphrase);\n return deriveStxPrivateKey({\n keychain,\n index: extractStacksDerivationPathAccountIndex(keyOrigin),\n });\n}\n\nexport function createSignFnFromMnemonic(\n keyOrigin: string,\n getMnemonicFn: () => Promise<{ mnemonic: string; passphrase?: string }>\n) {\n return async (tx: StacksTransactionWire) => {\n const privateKey = await getPrivateKey(keyOrigin, getMnemonicFn);\n return signStacksTransaction(tx, privateKey);\n };\n}\n\nexport function createSignMessageFnFromMnemonic(\n keyOrigin: string,\n getMnemonicFn: () => Promise<{ mnemonic: string; passphrase?: string }>\n) {\n return async (message: string) => {\n const privateKey = await getPrivateKey(keyOrigin, getMnemonicFn);\n return signMessage(message, privateKey);\n };\n}\nexport function createSignStructuredDataMessageFnFromMnemonic(\n keyOrigin: string,\n getMnemonicFn: () => Promise<{ mnemonic: string; passphrase?: string }>\n) {\n return async (message: ClarityValue, domain: ClarityValue) => {\n const privateKey = await getPrivateKey(keyOrigin, getMnemonicFn);\n return signStructuredDataMessage(message, domain, privateKey);\n };\n}\n\ninterface InitalizeStacksSignerArgs {\n descriptor: string;\n network: NetworkModes;\n signFn: StacksSignerFn;\n signMessageFn: StacksSignMessageFn;\n signStructuredMessageFn: StacksSignStructuredMessageFn;\n}\nexport function initalizeStacksSigner(args: InitalizeStacksSignerArgs): StacksSigner {\n const { descriptor, network, signFn, signMessageFn, signStructuredMessageFn } = args;\n\n const publicKey = createStacksPublicKey(extractKeyFromDescriptor(descriptor)).data;\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,\n network,\n address: publicKeyToAddressSingleSig(publicKey, network),\n sign: signFn,\n signMessage: signMessageFn,\n signStructuredMessage: signStructuredMessageFn,\n };\n}\n","import { HDKey } from '@scure/bip32';\nimport { ChainId } from '@stacks/network';\nimport {\n AssetString,\n ContractIdString,\n compressPrivateKey,\n privateKeyToPublic,\n} 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)({\n [ChainId.Mainnet]: 'mainnet',\n [ChainId.Testnet]: 'testnet',\n });\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 compressPrivateKey(accountKeychain.privateKey);\n}\n\nexport function deriveStxPublicKey({\n keychain,\n index,\n}: {\n keychain: HDKey;\n index: number;\n}): string {\n return privateKeyToPublic(deriveStxPrivateKey({ keychain, index })) as string;\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 publicKey\n );\n}\n\nexport function getStacksBurnAddress(chainIdChainId: ChainId): string {\n switch (chainIdChainId) {\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\nexport function getPrincipalFromAssetString(assetString: string) {\n return assetString.split('::')[0];\n}\n\nexport function formatContractId(address: string, name: string) {\n return `${address}.${name}`;\n}\n\ninterface FormatAssetStringArgs {\n contractAddress: string;\n contractName: string;\n assetName: string;\n}\nexport function formatAssetString({\n contractAddress,\n contractName,\n assetName,\n}: FormatAssetStringArgs): AssetString {\n return `${contractAddress}.${contractName}::${assetName}`;\n}\n\ninterface FormatContractIdStringArgs {\n contractAddress: string;\n contractName: string;\n}\nexport function formatContractIdString({\n contractAddress,\n contractName,\n}: FormatContractIdStringArgs): ContractIdString {\n return `${contractAddress}.${contractName}`;\n}\n\n/**\n * Gets the contract name.\n *\n * @param identifier - [principal].[contract-name] or [principal].[contract-name]::[asset-name]\n */\nexport function getStacksContractName(identifier: string): string {\n if (identifier.includes('.')) {\n const parts = identifier?.split('.');\n if (identifier.includes('::')) {\n return parts[1].split('::')[0];\n }\n return parts[1];\n }\n return identifier;\n}\n\n/**\n * Gets the asset name.\n *\n * @param identifier - [principal].[contract-name]::[asset-name]\n */\nexport function getStacksContractAssetName(identifier: string): string {\n if (!identifier.includes('::')) return identifier;\n return identifier.split('::')[1];\n}\n\n/**\n * Gets the parts that make up a fully qualified name of an asset.\n *\n * @param identifier - [principal].[contract-name]::[asset-name]\n */\nexport function getStacksAssetStringParts(identifier: string): {\n contractAddress: string;\n contractAssetName: string;\n contractName: string;\n} {\n if (!identifier.includes('.') && !identifier.includes('::')) {\n return {\n contractAddress: identifier,\n contractAssetName: identifier,\n contractName: identifier,\n };\n }\n\n const contractAddress = identifier.split('.')[0];\n const contractAssetName = getStacksContractAssetName(identifier);\n const contractName = getStacksContractName(identifier);\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 { assertUnreachable } from '@leather.io/utils';\n\nimport { cleanHex } from '../stacks.utils';\nimport { ensurePostConditionWireFormat, 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 getUnsignedContractCallParsedOptions(options: StacksUnsignedContractCallOptions) {\n return {\n ...options,\n fee: options.fee.amount.toString(),\n functionArgs: options.functionArgs.map(arg => deserializeCV(hexToBytes(cleanHex(arg)))),\n nonce: initNonce(options.nonce).toString(),\n postConditions: options.postConditions,\n };\n}\n\nexport function getUnsignedContractDeployParsedOptions(\n options: StacksUnsignedContractDeployOptions\n) {\n return {\n ...options,\n fee: options.fee.amount.toString(),\n nonce: initNonce(options.nonce).toString(),\n postConditions: getPostConditions(\n options.postConditions?.map(pc => ensurePostConditionWireFormat(pc))\n ),\n };\n}\n\nexport function getUnsignedStxTokenTransferParsedOptions(\n options: StacksUnsignedTokenTransferOptions\n) {\n return {\n ...options,\n amount: options.amount.amount.toString(),\n fee: options.fee.amount.toString(),\n nonce: initNonce(options.nonce).toString(),\n };\n}\n\nexport function generateStacksUnsignedTransaction(options: StacksUnsignedTransactionOptions) {\n const { txType } = options;\n\n const isValid = isTransactionTypeSupported(txType);\n\n if (!isValid) throw new Error(`Invalid Transaction Type: ${txType}`);\n\n switch (txType) {\n case TransactionTypes.StxTokenTransfer:\n return makeUnsignedSTXTokenTransfer(getUnsignedStxTokenTransferParsedOptions(options));\n case TransactionTypes.ContractCall:\n return makeUnsignedContractCall(getUnsignedContractCallParsedOptions(options));\n case TransactionTypes.ContractDeploy:\n return makeUnsignedContractDeploy(getUnsignedContractDeployParsedOptions(options));\n default:\n assertUnreachable(txType);\n }\n}\n","import { hexToBytes } from '@noble/hashes/utils';\nimport {\n BytesReader,\n PostCondition,\n PostConditionWire,\n deserializePostConditionWire,\n postConditionToWire,\n} from '@stacks/transactions';\n\nimport { isString } from '@leather.io/utils';\n\nexport function getPostConditionFromString(postCondition: string): PostConditionWire {\n try {\n const reader = new BytesReader(hexToBytes(postCondition));\n return deserializePostConditionWire(reader);\n } catch {\n throw new Error('Not a serialized post condition');\n }\n}\n\nexport function ensurePostConditionWireFormat(\n postCondition: string | PostCondition | PostConditionWire\n) {\n if (isString(postCondition)) return getPostConditionFromString(postCondition);\n if ('conditionType' in postCondition) return postCondition;\n return postConditionToWire(postCondition);\n}\n\nexport function getPostCondition(\n postCondition: string | PostCondition | PostConditionWire\n): PostConditionWire {\n return isString(postCondition)\n ? getPostConditionFromString(postCondition)\n : ensurePostConditionWireFormat(postCondition);\n}\n\nexport function getPostConditions(\n postConditions?: (string | PostCondition | PostConditionWire)[]\n): PostConditionWire[] | 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 {\n ClarityValue,\n createAddress,\n deserializeCV,\n noneCV,\n standardPrincipalCVFromAddress,\n uintCV,\n} from '@stacks/transactions';\n\ninterface GetSip10FnArgs {\n amount: number;\n senderStacksAddress: string;\n recipientStacksAddress: string;\n}\n\nexport function createSip10FnArgs({\n amount,\n senderStacksAddress,\n recipientStacksAddress,\n}: GetSip10FnArgs) {\n const fnArgs: ClarityValue[] = [\n uintCV(amount),\n standardPrincipalCVFromAddress(createAddress(senderStacksAddress)),\n standardPrincipalCVFromAddress(createAddress(recipientStacksAddress)),\n noneCV(), // Add memo to SIP-30?\n ];\n return fnArgs;\n}\n\ninterface GetSip9FnArgs {\n assetId: string;\n senderStacksAddress: string;\n recipientStacksAddress: string;\n}\nexport function createSip9FnArgs({\n assetId,\n senderStacksAddress,\n recipientStacksAddress,\n}: GetSip9FnArgs) {\n const fnArgs: ClarityValue[] = [\n deserializeCV(assetId),\n standardPrincipalCVFromAddress(createAddress(senderStacksAddress)),\n standardPrincipalCVFromAddress(createAddress(recipientStacksAddress)),\n ];\n return fnArgs;\n}\n","import { TxBroadcastResultRejected } from '@stacks/transactions';\n\nexport function getErrorMessage(\n reason:\n | TxBroadcastResultRejected['reason']\n | 'BadTransactionVersion'\n | 'ConflictingNonceInMempool'\n | 'EstimatorError'\n | 'TransferAmountMustBePositive'\n | 'TransferRecipientCannotEqualSender'\n) {\n switch (reason) {\n case 'BadAddressVersionByte':\n return 'Incorrect address';\n case 'BadFunctionArgument':\n return 'Incorrect function argument';\n case 'BadNonce':\n return 'Incorrect nonce';\n case 'BadTransactionVersion':\n return 'Incorrect transaction';\n case 'ConflictingNonceInMempool':\n return 'Nonce conflict';\n case 'ContractAlreadyExists':\n return 'Contract already exists';\n case 'Deserialization':\n return 'Deserialization failure';\n case 'EstimatorError':\n return 'Estimator error';\n case 'FeeTooLow':\n return 'Fee too low';\n case 'NoCoinbaseViaMempool':\n return 'No coinbase via mempool';\n case 'NoSuchContract':\n return 'Contract does not exist';\n case 'NoSuchPublicFunction':\n return 'Function does not exist';\n case 'NotEnoughFunds':\n return 'Not enough funds';\n case 'PoisonMicroblocksDoNotConflict':\n return 'Microblock conflict';\n case 'PoisonMicroblockHasUnknownPubKeyHash':\n return 'No anchor block with public key hash';\n case 'PoisonMicroblockIsInvalid':\n return 'Invalid microblock';\n case 'Serialization':\n return 'Serialization failure';\n case 'ServerFailureDatabase':\n return 'Database error';\n case 'ServerFailureNoSuchChainTip':\n return 'No such chain tip';\n case 'ServerFailureOther':\n return 'Server failure';\n case 'SignatureValidation':\n return 'Failed to validate signature';\n case 'TransferAmountMustBePositive':\n return 'Transfer amount must be positive';\n case 'TransferRecipientCannotEqualSender':\n return 'Cannot transfer STX to yourself';\n default:\n return 'Something went wrong';\n }\n}\n","import { TransactionErrorKey } from '@leather.io/models';\n\nexport type StacksErrorKey =\n | TransactionErrorKey\n | 'InvalidSameAddress'\n | 'UnknownBalance'\n | 'UnknownFee'\n | 'UnknownAmount';\n\nexport class StacksError extends Error {\n public message: StacksErrorKey;\n constructor(message: StacksErrorKey) {\n super(message);\n this.name = 'StacksError';\n this.message = message;\n\n // Fix the prototype chain\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { c32addressDecode } from 'c32check';\n\nimport { ChainId } from '@leather.io/models';\nimport { isEmptyString, isUndefined } from '@leather.io/utils';\n\n// taken from stacks-utils.ts\nexport function isValidStacksAddress(address: string) {\n if (isUndefined(address) || isEmptyString(address)) {\n return false;\n }\n try {\n c32addressDecode(address);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isValidAddressChain(address: string, chainId: ChainId) {\n if (!isValidStacksAddress(address)) {\n return false;\n }\n\n const prefix = address.slice(0, 2);\n switch (chainId) {\n case ChainId.Mainnet:\n return prefix === 'SM' || prefix === 'SP';\n case ChainId.Testnet:\n return prefix === 'SN' || prefix === 'ST';\n default:\n return false;\n }\n}\n\nexport function validatePayerNotRecipient(senderAddress: string, recipientAddress: string) {\n if (!isValidStacksAddress(senderAddress) || !isValidStacksAddress(recipientAddress)) {\n return false;\n }\n if (senderAddress === recipientAddress) {\n return false;\n }\n return true;\n}\n","import { MEMO_MAX_LENGTH_BYTES } from '@stacks/transactions';\n\nfunction exceedsMaxLengthBytes(value: string, maxLengthBytes: number): boolean {\n return value ? Buffer.from(value).length > maxLengthBytes : false;\n}\n\nexport function isValidStacksMemo(memo: string) {\n return !exceedsMaxLengthBytes(memo, MEMO_MAX_LENGTH_BYTES);\n}\n","import BigNumber from 'bignumber.js';\n\nimport { Money } from '@leather.io/models';\nimport { isDefined, stxToMicroStx } from '@leather.io/utils';\n\nimport { StacksError } from './stacks-error';\n\nfunction isMoneyAmountValid(amount: Money) {\n return amount && isDefined(amount.amount) && amount.amount;\n}\n\ninterface IsStxAmountValidArgs {\n availableBalance: Money;\n amount: Money;\n fee: Money;\n}\n\nexport function isStxAmountValid({ availableBalance, amount, fee }: IsStxAmountValidArgs) {\n if (!isMoneyAmountValid(amount)) {\n throw new StacksError('InvalidAmount');\n }\n if (!isMoneyAmountValid(availableBalance)) {\n throw new StacksError('UnknownBalance');\n }\n if (!isMoneyAmountValid(fee)) {\n throw new StacksError('UnknownFee');\n }\n return true;\n}\n\nexport function isStxBalanceSufficient({\n availableBalance: { amount: availableBalanceAmount },\n amount: { amount: desiredSpend },\n fee: { amount: feeAmount },\n}: IsStxAmountValidArgs) {\n const fee = new BigNumber(stxToMicroStx(feeAmount));\n\n if (!availableBalanceAmount) {\n throw new StacksError('UnknownBalance');\n }\n if (!fee.isFinite()) {\n throw new StacksError('UnknownFee');\n }\n\n const availableBalance = new BigNumber(stxToMicroStx(availableBalanceAmount));\n const spendableAmount = availableBalance.minus(fee);\n const amount = new BigNumber(stxToMicroStx(desiredSpend));\n return spendableAmount.isGreaterThanOrEqualTo(amount);\n}\n","import { ChainId, Money } from '@leather.io/models';\n\nimport {\n isValidAddressChain,\n isValidStacksAddress,\n validatePayerNotRecipient,\n} from './address-validation';\nimport { isStxAmountValid, isStxBalanceSufficient } from './amount-validation';\nimport { StacksError } from './stacks-error';\n\ninterface StacksTransaction {\n amount: Money;\n payer: string;\n recipient: string;\n chainId: ChainId;\n availableBalance: Money;\n fee: Money;\n}\n\nexport function isValidStacksTransaction({\n amount,\n availableBalance,\n fee,\n payer,\n recipient,\n chainId,\n}: StacksTransaction) {\n if (!isValidStacksAddress(payer) || !isValidStacksAddress(recipient)) {\n throw new StacksError('InvalidAddress');\n }\n if (!isValidAddressChain(payer, chainId) || !isValidAddressChain(recipient, chainId)) {\n throw new StacksError('InvalidNetworkAddress');\n }\n if (!validatePayerNotRecipient(payer, recipient)) {\n throw new StacksError('InvalidSameAddress');\n }\n\n if (!isStxAmountValid({ availableBalance, amount, fee })) {\n throw new StacksError('InvalidAmount');\n }\n if (!isStxBalanceSufficient({ availableBalance, amount, fee })) {\n throw new StacksError('InsufficientFunds');\n }\n return true;\n}\n"],"mappings":"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","names":["privateKeyToPublic","hexToBytes","isString","TransactionTypes","hexToBytes","deserializeCV","ChainId","BigNumber","BigNumber"]}
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.9.0",
5
+ "version": "1.10.0",
6
6
  "license": "MIT",
7
7
  "type": "module",
8
8
  "exports": {
@@ -18,10 +18,10 @@
18
18
  "@stacks/transactions": "7.0.5",
19
19
  "bignumber.js": "9.1.2",
20
20
  "c32check": "2.0.0",
21
- "@leather.io/utils": "0.32.0",
21
+ "@leather.io/constants": "0.19.1",
22
22
  "@leather.io/models": "0.31.0",
23
- "@leather.io/crypto": "1.6.56",
24
- "@leather.io/constants": "0.19.1"
23
+ "@leather.io/utils": "0.32.0",
24
+ "@leather.io/crypto": "1.6.56"
25
25
  },
26
26
  "devDependencies": {
27
27
  "tsup": "8.4.0",