@leather.io/stacks 1.7.5 → 1.7.6

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
@@ -186,6 +186,8 @@ declare function isValidStacksAddress(address: string): boolean;
186
186
  declare function isValidAddressChain(address: string, chainId: ChainId$1): boolean;
187
187
  declare function validatePayerNotRecipient(senderAddress: string, recipientAddress: string): boolean;
188
188
 
189
+ declare function isValidStacksMemo(memo: string): boolean;
190
+
189
191
  interface StacksTransaction {
190
192
  amount: Money;
191
193
  payer: string;
@@ -196,4 +198,4 @@ interface StacksTransaction {
196
198
  }
197
199
  declare function isValidStacksTransaction({ amount, availableBalance, fee, payer, recipient, chainId, }: StacksTransaction): boolean;
198
200
 
199
- 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, getPostCondition, getPostConditionFromString, getPostConditions, getPrincipalFromAssetString, getStacksAssetStringParts, getStacksBurnAddress, getStacksContractAssetName, getStacksContractName, getUnsignedContractCallParsedOptions, getUnsignedContractDeployParsedOptions, getUnsignedStxTokenTransferParsedOptions, initNonce, initalizeStacksSigner, isTransactionTypeSupported, isValidAddressChain, isValidStacksAddress, isValidStacksTransaction, makeAccountIndexDerivationPathFactory, makeStxDerivationPath, signMessage, signStacksTransaction, signStructuredDataMessage, stacksChainIdToCoreNetworkMode, stacksRootKeychainToAccountDescriptor, stxDerivationWithAccount, validatePayerNotRecipient, whenStacksChainId };
201
+ 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, 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
@@ -328,6 +328,15 @@ function validatePayerNotRecipient(senderAddress, recipientAddress) {
328
328
  return true;
329
329
  }
330
330
 
331
+ // src/validation/memo-validation.ts
332
+ import { MEMO_MAX_LENGTH_BYTES } from "@stacks/transactions";
333
+ function exceedsMaxLengthBytes(value, maxLengthBytes) {
334
+ return value ? Buffer.from(value).length > maxLengthBytes : false;
335
+ }
336
+ function isValidStacksMemo(memo) {
337
+ return !exceedsMaxLengthBytes(memo, MEMO_MAX_LENGTH_BYTES);
338
+ }
339
+
331
340
  // src/validation/amount-validation.ts
332
341
  import BigNumber2 from "bignumber.js";
333
342
  import { isDefined, stxToMicroStx } from "@leather.io/utils";
@@ -423,6 +432,7 @@ export {
423
432
  isTransactionTypeSupported,
424
433
  isValidAddressChain,
425
434
  isValidStacksAddress,
435
+ isValidStacksMemo,
426
436
  isValidStacksTransaction,
427
437
  makeAccountIndexDerivationPathFactory,
428
438
  makeStxDerivationPath,
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/validation/stacks-error.ts","../src/validation/address-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 { 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 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","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/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 { 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","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.7.5",
5
+ "version": "1.7.6",
6
6
  "license": "MIT",
7
7
  "type": "module",
8
8
  "exports": {
@@ -18,13 +18,13 @@
18
18
  "@stacks/transactions": "7.0.5",
19
19
  "bignumber.js": "9.1.2",
20
20
  "c32check": "2.0.0",
21
- "@leather.io/constants": "0.18.1",
22
- "@leather.io/crypto": "1.6.53",
23
- "@leather.io/utils": "0.31.0",
24
- "@leather.io/models": "0.30.0"
21
+ "@leather.io/constants": "0.19.0",
22
+ "@leather.io/crypto": "1.6.54",
23
+ "@leather.io/models": "0.30.0",
24
+ "@leather.io/utils": "0.31.1"
25
25
  },
26
26
  "devDependencies": {
27
- "tsup": "8.1.0",
27
+ "tsup": "8.4.0",
28
28
  "vitest": "2.1.9"
29
29
  },
30
30
  "files": [