Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 2x 2x 2x 2x 2x 2x 2x 2x 1x 1x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x | import { TransactionVersion } from 'micro-stacks/common';
import { StacksMainnet } from 'micro-stacks/network';
import { AddressHashMode, PostConditionMode } from '../common/constants';
import { PostCondition } from '../postcondition';
import { StacksTransaction } from '../transaction';
import { createSmartContractPayload } from '../payload';
import {
  createStacksPrivateKey,
  getPublicKeyFromStacksPrivateKey,
  publicKeyToString,
} from '../keys';
import {
  createSingleSigSpendingCondition,
  createSponsoredAuth,
  createStandardAuth,
} from '../authorization';
import { createLPList } from '../types';
import { publicKeyToStxAddress, StacksNetworkVersion } from 'micro-stacks/crypto';
import { TransactionSigner } from '../signer';
import { ContractDeployOptions } from './types';
import { getNonce } from '../fetchers/get-nonce';
import { estimateContractDeploy } from '../fetchers/estimate-contract-deploy';
 
/**
 * Generates a Clarity smart contract deploy transaction
 *
 * @param  {ContractDeployOptions} txOptions - an options object for the contract deploy
 *
 * Returns a signed Stacks smart contract deploy transaction.
 *
 * @return {StacksTransaction}
 */
export async function makeContractDeploy(
  txOptions: ContractDeployOptions
): Promise<StacksTransaction> {
  const defaultOptions = {
    fee: BigInt(0),
    nonce: BigInt(0),
    network: new StacksMainnet(),
    postConditionMode: PostConditionMode.Deny,
    sponsored: false,
  };
 
  const options = Object.assign(defaultOptions, txOptions);
 
  const payload = createSmartContractPayload(options.contractName, options.codeBody);
 
  const addressHashMode = AddressHashMode.SerializeP2PKH;
  const privKey = createStacksPrivateKey(options.senderKey);
  const pubKey = getPublicKeyFromStacksPrivateKey(privKey);
 
  let authorization = null;
 
  const spendingCondition = createSingleSigSpendingCondition(
    addressHashMode,
    publicKeyToString(pubKey),
    options.nonce,
    options.fee
  );
 
  if (options.sponsored) {
    authorization = createSponsoredAuth(spendingCondition);
  } else {
    authorization = createStandardAuth(spendingCondition);
  }
 
  const postConditions: PostCondition[] = [];
  Iif (options.postConditions && options.postConditions.length > 0) {
    options.postConditions.forEach(postCondition => {
      postConditions.push(postCondition);
    });
  }
 
  const lpPostConditions = createLPList(postConditions);
  const transaction = new StacksTransaction(
    options.network.version,
    authorization,
    payload,
    lpPostConditions,
    options.postConditionMode,
    options.anchorMode,
    options.network.chainId
  );
 
  Iif (txOptions.fee === undefined || txOptions.fee === null) {
    const txFee = await estimateContractDeploy(transaction, options.network);
    transaction.setFee(txFee);
  }
 
  Iif (txOptions.nonce === undefined || txOptions.nonce === null) {
    const addressVersion =
      options.network.version === TransactionVersion.Mainnet
        ? StacksNetworkVersion.mainnetP2PKH
        : StacksNetworkVersion.testnetP2PKH;
    const senderAddress = publicKeyToStxAddress(publicKeyToString(pubKey), addressVersion);
    const txNonce = await getNonce(senderAddress, options.network);
    transaction.setNonce(txNonce);
  }
 
  if (options.senderKey) {
    const signer = new TransactionSigner(transaction);
    await signer.signOrigin(privKey);
  }
 
  return transaction;
}
  |