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;
}
|