@secondlayer/stacks 0.1.0 → 0.2.1
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/shared/stacks-2ar4prfz.cjs +328 -0
- package/dist/shared/stacks-2ar4prfz.cjs.map +11 -0
- package/dist/shared/stacks-61rvzkz1.cjs.map +1 -1
- package/dist/shared/{stacks-d1fmkv3p.js → stacks-9avax1yf.js} +2 -2
- package/dist/shared/{stacks-ph4a6322.js → stacks-9mdk86wp.js} +16 -18
- package/dist/shared/{stacks-ph4a6322.js.map → stacks-9mdk86wp.js.map} +2 -2
- package/dist/shared/stacks-an5k8n4t.cjs.map +2 -2
- package/dist/shared/stacks-dr5en54r.cjs +119 -0
- package/dist/shared/stacks-dr5en54r.cjs.map +10 -0
- package/dist/shared/{stacks-b008c3w8.cjs → stacks-fedzr2ka.js} +134 -2
- package/dist/shared/stacks-fedzr2ka.js.map +13 -0
- package/dist/shared/{stacks-j2cy7qtt.js → stacks-ky14tdf6.cjs} +109 -24
- package/dist/shared/stacks-ky14tdf6.cjs.map +13 -0
- package/dist/shared/stacks-mrk6tkkh.cjs +41 -0
- package/dist/shared/{stacks-2gdt3aqj.cjs.map → stacks-mrk6tkkh.cjs.map} +1 -1
- package/dist/shared/{stacks-1ddg6mbv.js → stacks-qcx67vqa.js} +3 -3
- package/dist/shared/stacks-qcx67vqa.js.map +10 -0
- package/dist/shared/stacks-qyt8m5v0.js +282 -0
- package/dist/shared/stacks-qyt8m5v0.js.map +11 -0
- package/dist/shared/{stacks-hfem9dck.cjs → stacks-vbke9mqw.cjs} +328 -87
- package/dist/shared/stacks-vbke9mqw.cjs.map +15 -0
- package/dist/shared/{stacks-md6e5ta0.js → stacks-vd9jcp0b.js} +13 -17
- package/dist/shared/{stacks-md6e5ta0.js.map → stacks-vd9jcp0b.js.map} +3 -3
- package/dist/shared/stacks-vdfag81a.cjs.map +2 -2
- package/dist/shared/{stacks-xtz0n62y.js → stacks-vyb9rx8q.js} +341 -106
- package/dist/shared/stacks-vyb9rx8q.js.map +15 -0
- package/dist/shared/{stacks-m2dc5xwg.js → stacks-wrb1es85.js} +7 -11
- package/dist/shared/{stacks-m2dc5xwg.js.map → stacks-wrb1es85.js.map} +3 -3
- package/dist/shared/stacks-yfveb68e.js +121 -0
- package/dist/shared/stacks-yfveb68e.js.map +10 -0
- package/dist/src/accounts/index.js +1 -2
- package/dist/src/accounts/index.js.map +2 -2
- package/dist/src/actions/index.d.cts +3 -5
- package/dist/src/actions/index.d.ts +3 -5
- package/dist/src/actions/index.js +8 -11
- package/dist/src/actions/index.js.map +1 -1
- package/dist/src/bns/index.cjs +13 -13
- package/dist/src/bns/index.cjs.map +3 -3
- package/dist/src/bns/index.js +22 -25
- package/dist/src/bns/index.js.map +3 -3
- package/dist/src/chains/index.js +1 -2
- package/dist/src/chains/index.js.map +1 -1
- package/dist/src/clarity/index.cjs +1 -326
- package/dist/src/clarity/index.cjs.map +3 -5
- package/dist/src/clarity/index.js +18 -272
- package/dist/src/clarity/index.js.map +3 -5
- package/dist/src/connect/index.cjs +19 -9
- package/dist/src/connect/index.cjs.map +2 -2
- package/dist/src/connect/walletconnect/index.cjs +19 -9
- package/dist/src/connect/walletconnect/index.cjs.map +4 -4
- package/dist/src/connect/walletconnect/index.js +1 -1
- package/dist/src/connect/walletconnect/index.js.map +4 -4
- package/dist/src/index.cjs +1 -2
- package/dist/src/index.cjs.map +5 -5
- package/dist/src/index.js +9 -16
- package/dist/src/index.js.map +5 -5
- package/dist/src/postconditions/index.cjs +1 -117
- package/dist/src/postconditions/index.cjs.map +3 -4
- package/dist/src/postconditions/index.js +5 -119
- package/dist/src/postconditions/index.js.map +3 -4
- package/dist/src/pox/index.cjs +9 -9
- package/dist/src/pox/index.cjs.map +4 -4
- package/dist/src/pox/index.js +17 -20
- package/dist/src/pox/index.js.map +4 -4
- package/dist/src/stackingdao/index.cjs +13 -13
- package/dist/src/stackingdao/index.cjs.map +3 -3
- package/dist/src/stackingdao/index.js +21 -24
- package/dist/src/stackingdao/index.js.map +3 -3
- package/dist/src/subscriptions/index.js +1 -2
- package/dist/src/subscriptions/index.js.map +1 -1
- package/dist/src/transactions/index.js +18 -22
- package/dist/src/transactions/index.js.map +1 -1
- package/dist/src/utils/index.cjs.map +2 -2
- package/dist/src/utils/index.js +4 -5
- package/dist/src/utils/index.js.map +3 -3
- package/package.json +1 -1
- package/dist/shared/stacks-1aqm7c2h.cjs +0 -110
- package/dist/shared/stacks-1aqm7c2h.cjs.map +0 -11
- package/dist/shared/stacks-1ddg6mbv.js.map +0 -10
- package/dist/shared/stacks-2gdt3aqj.cjs +0 -44
- package/dist/shared/stacks-8yykgdww.js +0 -125
- package/dist/shared/stacks-8yykgdww.js.map +0 -11
- package/dist/shared/stacks-b008c3w8.cjs.map +0 -11
- package/dist/shared/stacks-hfem9dck.cjs.map +0 -13
- package/dist/shared/stacks-j2cy7qtt.js.map +0 -11
- package/dist/shared/stacks-njvyj3ab.js +0 -23
- package/dist/shared/stacks-njvyj3ab.js.map +0 -9
- package/dist/shared/stacks-pz73cn97.js +0 -285
- package/dist/shared/stacks-pz73cn97.js.map +0 -11
- package/dist/shared/stacks-xtz0n62y.js.map +0 -13
- package/dist/shared/stacks-zyv9qqme.cjs +0 -249
- package/dist/shared/stacks-zyv9qqme.cjs.map +0 -11
- /package/dist/shared/{stacks-d1fmkv3p.js.map → stacks-9avax1yf.js.map} +0 -0
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
// src/transactions/signer.ts
|
|
2
|
-
function txid(tx) {
|
|
3
|
-
return txidFromBytes(serializeTransaction(tx));
|
|
4
|
-
}
|
|
5
|
-
function signBegin(tx) {
|
|
6
|
-
const cleared = {
|
|
7
|
-
...tx,
|
|
8
|
-
auth: intoInitialSighashAuth(tx.auth)
|
|
9
|
-
};
|
|
10
|
-
return txid(cleared);
|
|
11
|
-
}
|
|
12
|
-
function signTransaction(tx, privateKey) {
|
|
13
|
-
const sigHash = signBegin(tx);
|
|
14
|
-
const condition = tx.auth.spendingCondition;
|
|
15
|
-
const { nextSig, nextSigHash } = nextSignature(sigHash, AuthType.Standard, condition.fee, condition.nonce, privateKey);
|
|
16
|
-
return {
|
|
17
|
-
...tx,
|
|
18
|
-
auth: {
|
|
19
|
-
...tx.auth,
|
|
20
|
-
spendingCondition: {
|
|
21
|
-
...condition,
|
|
22
|
-
signature: nextSig
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
async function signTransactionWithAccount(tx, account) {
|
|
28
|
-
const sigHash = signBegin(tx);
|
|
29
|
-
const condition = tx.auth.spendingCondition;
|
|
30
|
-
const sigHashPre = sigHashPreSign(sigHash, AuthType.Standard, condition.fee, condition.nonce);
|
|
31
|
-
const sigBytes = await account.sign(hexToBytes(sigHashPre));
|
|
32
|
-
const nextSig = bytesToHex(sigBytes);
|
|
33
|
-
const pubKeyBytes = hexToBytes(account.publicKey);
|
|
34
|
-
const pubKeyEncoding = pubKeyBytes.length === 33 ? PubKeyEncoding.Compressed : PubKeyEncoding.Uncompressed;
|
|
35
|
-
return {
|
|
36
|
-
...tx,
|
|
37
|
-
auth: {
|
|
38
|
-
...tx.auth,
|
|
39
|
-
spendingCondition: {
|
|
40
|
-
...condition,
|
|
41
|
-
signature: nextSig
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
function getTransactionId(tx) {
|
|
47
|
-
return txid(tx);
|
|
48
|
-
}
|
|
49
|
-
function getOriginSigHash(tx) {
|
|
50
|
-
const condition = tx.auth.spendingCondition;
|
|
51
|
-
if ("fields" in condition) {
|
|
52
|
-
return replayMultiSigSigHash(tx);
|
|
53
|
-
}
|
|
54
|
-
const initialSigHash = signBegin(tx);
|
|
55
|
-
const sc = condition;
|
|
56
|
-
const preSign = sigHashPreSign(initialSigHash, AuthType.Standard, sc.fee, sc.nonce);
|
|
57
|
-
return sigHashPostSign(preSign, sc.keyEncoding, sc.signature);
|
|
58
|
-
}
|
|
59
|
-
function signSponsor(tx, privateKey) {
|
|
60
|
-
if (tx.auth.authType !== AuthType.Sponsored) {
|
|
61
|
-
throw new Error("Transaction must be sponsored");
|
|
62
|
-
}
|
|
63
|
-
const auth = tx.auth;
|
|
64
|
-
const sponsorCondition = auth.sponsorSpendingCondition;
|
|
65
|
-
const originSigHash = getOriginSigHash(tx);
|
|
66
|
-
const { nextSig } = nextSignature(originSigHash, AuthType.Sponsored, sponsorCondition.fee, sponsorCondition.nonce, privateKey);
|
|
67
|
-
return {
|
|
68
|
-
...tx,
|
|
69
|
-
auth: {
|
|
70
|
-
...auth,
|
|
71
|
-
sponsorSpendingCondition: {
|
|
72
|
-
...sponsorCondition,
|
|
73
|
-
signature: nextSig
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
async function signSponsorWithAccount(tx, account) {
|
|
79
|
-
if (tx.auth.authType !== AuthType.Sponsored) {
|
|
80
|
-
throw new Error("Transaction must be sponsored");
|
|
81
|
-
}
|
|
82
|
-
const auth = tx.auth;
|
|
83
|
-
const sponsorCondition = auth.sponsorSpendingCondition;
|
|
84
|
-
const originSigHash = getOriginSigHash(tx);
|
|
85
|
-
const sigHashPre = sigHashPreSign(originSigHash, AuthType.Sponsored, sponsorCondition.fee, sponsorCondition.nonce);
|
|
86
|
-
const sigBytes = await account.sign(hexToBytes(sigHashPre));
|
|
87
|
-
const nextSig = bytesToHex(sigBytes);
|
|
88
|
-
return {
|
|
89
|
-
...tx,
|
|
90
|
-
auth: {
|
|
91
|
-
...auth,
|
|
92
|
-
sponsorSpendingCondition: {
|
|
93
|
-
...sponsorCondition,
|
|
94
|
-
signature: nextSig
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// src/transactions/build.ts
|
|
101
|
-
function resolvePcMode(mode) {
|
|
102
|
-
return mode === "allow" ? PostConditionModeWire.Allow : PostConditionModeWire.Deny;
|
|
103
|
-
}
|
|
104
|
-
function convertPostConditions(pcs) {
|
|
105
|
-
if (!pcs || pcs.length === 0)
|
|
106
|
-
return [];
|
|
107
|
-
return pcs.map(convertPostCondition);
|
|
108
|
-
}
|
|
109
|
-
function resolvePrincipal(address) {
|
|
110
|
-
if (address === "origin")
|
|
111
|
-
return { type: "origin" };
|
|
112
|
-
const [addr, name] = address.split(".");
|
|
113
|
-
if (name) {
|
|
114
|
-
return { type: "contract", address: addr, contractName: name };
|
|
115
|
-
}
|
|
116
|
-
return { type: "standard", address: addr };
|
|
117
|
-
}
|
|
118
|
-
var FUNGIBLE_CODE_MAP = {
|
|
119
|
-
eq: FungibleConditionCode.Equal,
|
|
120
|
-
gt: FungibleConditionCode.Greater,
|
|
121
|
-
gte: FungibleConditionCode.GreaterEqual,
|
|
122
|
-
lt: FungibleConditionCode.Less,
|
|
123
|
-
lte: FungibleConditionCode.LessEqual
|
|
124
|
-
};
|
|
125
|
-
function convertPostCondition(pc) {
|
|
126
|
-
switch (pc.type) {
|
|
127
|
-
case "stx-postcondition":
|
|
128
|
-
return {
|
|
129
|
-
type: "stx",
|
|
130
|
-
principal: resolvePrincipal(pc.address),
|
|
131
|
-
conditionCode: FUNGIBLE_CODE_MAP[pc.condition],
|
|
132
|
-
amount: intToBigInt(pc.amount)
|
|
133
|
-
};
|
|
134
|
-
case "ft-postcondition": {
|
|
135
|
-
const [contractId, tokenName] = pc.asset.split("::");
|
|
136
|
-
const [addr, name] = parseContractId(contractId);
|
|
137
|
-
return {
|
|
138
|
-
type: "ft",
|
|
139
|
-
principal: resolvePrincipal(pc.address),
|
|
140
|
-
asset: { address: addr, contractName: name, assetName: tokenName },
|
|
141
|
-
conditionCode: FUNGIBLE_CODE_MAP[pc.condition],
|
|
142
|
-
amount: intToBigInt(pc.amount)
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
case "nft-postcondition": {
|
|
146
|
-
const [contractId, tokenName] = pc.asset.split("::");
|
|
147
|
-
const [addr, name] = parseContractId(contractId);
|
|
148
|
-
return {
|
|
149
|
-
type: "nft",
|
|
150
|
-
principal: resolvePrincipal(pc.address),
|
|
151
|
-
asset: { address: addr, contractName: name, assetName: tokenName },
|
|
152
|
-
conditionCode: pc.condition === "sent" ? NonFungibleConditionCode.Sends : NonFungibleConditionCode.DoesNotSend,
|
|
153
|
-
assetId: pc.assetId
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
function resolveSpendingCondition(opts, nonce, fee) {
|
|
159
|
-
if (opts.publicKeys) {
|
|
160
|
-
return createMultiSigSpendingCondition(opts.publicKeys, opts.signaturesRequired, nonce, fee, opts.hashMode);
|
|
161
|
-
}
|
|
162
|
-
return createSingleSigSpendingCondition(opts.publicKey, nonce, fee);
|
|
163
|
-
}
|
|
164
|
-
function resolveAuth(spendingCondition, sponsored) {
|
|
165
|
-
return sponsored ? createSponsoredAuth(spendingCondition) : createStandardAuth(spendingCondition);
|
|
166
|
-
}
|
|
167
|
-
function resolveVersionAndChainId(chain) {
|
|
168
|
-
if (!chain)
|
|
169
|
-
return { version: 0, chainId: 1 };
|
|
170
|
-
return { version: chain.transactionVersion, chainId: chain.id };
|
|
171
|
-
}
|
|
172
|
-
function buildTokenTransfer(options) {
|
|
173
|
-
const { version, chainId } = resolveVersionAndChainId(options.chain);
|
|
174
|
-
const fee = intToBigInt(options.fee);
|
|
175
|
-
const nonce = intToBigInt(options.nonce);
|
|
176
|
-
const spendingCondition = resolveSpendingCondition(options, nonce, fee);
|
|
177
|
-
const recipient = Cl.principal(options.recipient);
|
|
178
|
-
const tx = {
|
|
179
|
-
version,
|
|
180
|
-
chainId,
|
|
181
|
-
auth: resolveAuth(spendingCondition, options.sponsored),
|
|
182
|
-
anchorMode: AnchorMode.Any,
|
|
183
|
-
postConditionMode: resolvePcMode(options.postConditionMode),
|
|
184
|
-
postConditions: convertPostConditions(options.postConditions),
|
|
185
|
-
payload: {
|
|
186
|
-
payloadType: PayloadType.TokenTransfer,
|
|
187
|
-
recipient,
|
|
188
|
-
amount: intToBigInt(options.amount),
|
|
189
|
-
memo: options.memo ?? ""
|
|
190
|
-
}
|
|
191
|
-
};
|
|
192
|
-
if (options.publicKeys) {
|
|
193
|
-
tx._multisig = { publicKeys: options.publicKeys };
|
|
194
|
-
}
|
|
195
|
-
return tx;
|
|
196
|
-
}
|
|
197
|
-
function buildContractCall(options) {
|
|
198
|
-
const { version, chainId } = resolveVersionAndChainId(options.chain);
|
|
199
|
-
const fee = intToBigInt(options.fee);
|
|
200
|
-
const nonce = intToBigInt(options.nonce);
|
|
201
|
-
const spendingCondition = resolveSpendingCondition(options, nonce, fee);
|
|
202
|
-
const tx = {
|
|
203
|
-
version,
|
|
204
|
-
chainId,
|
|
205
|
-
auth: resolveAuth(spendingCondition, options.sponsored),
|
|
206
|
-
anchorMode: AnchorMode.Any,
|
|
207
|
-
postConditionMode: resolvePcMode(options.postConditionMode),
|
|
208
|
-
postConditions: convertPostConditions(options.postConditions),
|
|
209
|
-
payload: {
|
|
210
|
-
payloadType: PayloadType.ContractCall,
|
|
211
|
-
contractAddress: options.contractAddress,
|
|
212
|
-
contractName: options.contractName,
|
|
213
|
-
functionName: options.functionName,
|
|
214
|
-
functionArgs: options.functionArgs
|
|
215
|
-
}
|
|
216
|
-
};
|
|
217
|
-
if (options.publicKeys) {
|
|
218
|
-
tx._multisig = { publicKeys: options.publicKeys };
|
|
219
|
-
}
|
|
220
|
-
return tx;
|
|
221
|
-
}
|
|
222
|
-
function buildContractDeploy(options) {
|
|
223
|
-
const { version, chainId } = resolveVersionAndChainId(options.chain);
|
|
224
|
-
const fee = intToBigInt(options.fee);
|
|
225
|
-
const nonce = intToBigInt(options.nonce);
|
|
226
|
-
const spendingCondition = resolveSpendingCondition(options, nonce, fee);
|
|
227
|
-
const useVersioned = options.clarityVersion !== undefined;
|
|
228
|
-
const tx = {
|
|
229
|
-
version,
|
|
230
|
-
chainId,
|
|
231
|
-
auth: resolveAuth(spendingCondition, options.sponsored),
|
|
232
|
-
anchorMode: AnchorMode.Any,
|
|
233
|
-
postConditionMode: resolvePcMode(options.postConditionMode),
|
|
234
|
-
postConditions: convertPostConditions(options.postConditions),
|
|
235
|
-
payload: {
|
|
236
|
-
payloadType: useVersioned ? PayloadType.VersionedSmartContract : PayloadType.SmartContract,
|
|
237
|
-
clarityVersion: options.clarityVersion,
|
|
238
|
-
contractName: options.contractName,
|
|
239
|
-
codeBody: options.codeBody
|
|
240
|
-
}
|
|
241
|
-
};
|
|
242
|
-
if (options.publicKeys) {
|
|
243
|
-
tx._multisig = { publicKeys: options.publicKeys };
|
|
244
|
-
}
|
|
245
|
-
return tx;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
//# debugId=B2AF18736399320664756E2164756E21
|
|
249
|
-
//# sourceMappingURL=stacks-zyv9qqme.cjs.map
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/transactions/signer.ts", "../src/transactions/build.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import { bytesToHex, hexToBytes } from \"../utils/encoding.ts\";\nimport { txidFromBytes } from \"../utils/hash.ts\";\nimport {\n intoInitialSighashAuth,\n nextSignature,\n sigHashPreSign,\n sigHashPostSign,\n createSingleSigSpendingCondition,\n} from \"./authorization.ts\";\nimport { replayMultiSigSigHash } from \"./multisig.ts\";\nimport { serializeTransaction } from \"./wire/serialize.ts\";\nimport {\n AuthType,\n PubKeyEncoding,\n RECOVERABLE_ECDSA_SIG_LENGTH_BYTES,\n type StacksTransaction,\n type SingleSigSpendingCondition,\n type MultiSigSpendingCondition,\n type SponsoredAuthorization,\n} from \"./types.ts\";\nimport type { LocalAccount, CustomAccount } from \"../accounts/types.ts\";\n\nfunction txid(tx: StacksTransaction): string {\n return txidFromBytes(serializeTransaction(tx));\n}\n\n/** Compute the initial sighash for a transaction */\nexport function signBegin(tx: StacksTransaction): string {\n const cleared: StacksTransaction = {\n ...tx,\n auth: intoInitialSighashAuth(tx.auth),\n };\n return txid(cleared);\n}\n\n/** Sign a single-sig transaction with a private key, returning the signed transaction */\nexport function signTransaction(\n tx: StacksTransaction,\n privateKey: string\n): StacksTransaction {\n const sigHash = signBegin(tx);\n const condition = tx.auth.spendingCondition as SingleSigSpendingCondition;\n\n // Origin always signs with AuthType.Standard (even for sponsored txs)\n const { nextSig, nextSigHash } = nextSignature(\n sigHash,\n AuthType.Standard,\n condition.fee,\n condition.nonce,\n privateKey\n );\n\n return {\n ...tx,\n auth: {\n ...tx.auth,\n spendingCondition: {\n ...condition,\n signature: nextSig,\n },\n },\n };\n}\n\n/** Sign a single-sig transaction using an account (LocalAccount or CustomAccount) */\nexport async function signTransactionWithAccount(\n tx: StacksTransaction,\n account: LocalAccount | CustomAccount\n): Promise<StacksTransaction> {\n const sigHash = signBegin(tx);\n const condition = tx.auth.spendingCondition as SingleSigSpendingCondition;\n\n // Origin always signs with AuthType.Standard (even for sponsored txs)\n const sigHashPre = sigHashPreSign(\n sigHash,\n AuthType.Standard,\n condition.fee,\n condition.nonce\n );\n\n // account.sign returns 65-byte VRS (recovery + r + s)\n const sigBytes = await account.sign(hexToBytes(sigHashPre));\n const nextSig = bytesToHex(sigBytes);\n\n const pubKeyBytes = hexToBytes(account.publicKey);\n const pubKeyEncoding =\n pubKeyBytes.length === 33\n ? PubKeyEncoding.Compressed\n : PubKeyEncoding.Uncompressed;\n\n return {\n ...tx,\n auth: {\n ...tx.auth,\n spendingCondition: {\n ...condition,\n signature: nextSig,\n },\n },\n };\n}\n\n/** Get the txid of a transaction */\nexport function getTransactionId(tx: StacksTransaction): string {\n return txid(tx);\n}\n\n/** Reconstruct the sighash after origin signing (needed for sponsor signing) */\nexport function getOriginSigHash(tx: StacksTransaction): string {\n const condition = tx.auth.spendingCondition;\n\n // Multi-sig: replay through all fields\n if (\"fields\" in condition) {\n return replayMultiSigSigHash(tx);\n }\n\n // Single-sig\n const initialSigHash = signBegin(tx);\n const sc = condition as SingleSigSpendingCondition;\n const preSign = sigHashPreSign(initialSigHash, AuthType.Standard, sc.fee, sc.nonce);\n return sigHashPostSign(preSign, sc.keyEncoding, sc.signature);\n}\n\n/** Sign a sponsored transaction as the sponsor with a private key */\nexport function signSponsor(tx: StacksTransaction, privateKey: string): StacksTransaction {\n if (tx.auth.authType !== AuthType.Sponsored) {\n throw new Error(\"Transaction must be sponsored\");\n }\n const auth = tx.auth as SponsoredAuthorization;\n const sponsorCondition = auth.sponsorSpendingCondition as SingleSigSpendingCondition;\n const originSigHash = getOriginSigHash(tx);\n\n const { nextSig } = nextSignature(\n originSigHash,\n AuthType.Sponsored,\n sponsorCondition.fee,\n sponsorCondition.nonce,\n privateKey\n );\n\n return {\n ...tx,\n auth: {\n ...auth,\n sponsorSpendingCondition: {\n ...sponsorCondition,\n signature: nextSig,\n },\n },\n };\n}\n\n/** Sign a sponsored transaction as the sponsor using an account */\nexport async function signSponsorWithAccount(\n tx: StacksTransaction,\n account: LocalAccount | CustomAccount\n): Promise<StacksTransaction> {\n if (tx.auth.authType !== AuthType.Sponsored) {\n throw new Error(\"Transaction must be sponsored\");\n }\n const auth = tx.auth as SponsoredAuthorization;\n const sponsorCondition = auth.sponsorSpendingCondition as SingleSigSpendingCondition;\n const originSigHash = getOriginSigHash(tx);\n\n const sigHashPre = sigHashPreSign(\n originSigHash,\n AuthType.Sponsored,\n sponsorCondition.fee,\n sponsorCondition.nonce\n );\n\n const sigBytes = await account.sign(hexToBytes(sigHashPre));\n const nextSig = bytesToHex(sigBytes);\n\n return {\n ...tx,\n auth: {\n ...auth,\n sponsorSpendingCondition: {\n ...sponsorCondition,\n signature: nextSig,\n },\n },\n };\n}\n",
|
|
6
|
-
"import type { StacksChain } from \"../chains/types.ts\";\nimport type { ClarityValue } from \"../clarity/types.ts\";\nimport type { PostCondition } from \"../postconditions/types.ts\";\nimport type { MultiSigHashMode, SpendingCondition } from \"./types.ts\";\nimport {\n createSingleSigSpendingCondition,\n createStandardAuth,\n createSponsoredAuth,\n} from \"./authorization.ts\";\nimport { createMultiSigSpendingCondition } from \"./multisig.ts\";\nimport {\n PayloadType,\n AnchorMode,\n PostConditionModeWire,\n FungibleConditionCode,\n NonFungibleConditionCode,\n PostConditionPrincipalId,\n type StacksTransaction,\n type PostConditionWire,\n type PostConditionPrincipalWire,\n type ClarityVersion,\n} from \"./types.ts\";\nimport { Cl } from \"../clarity/values.ts\";\nimport { intToBigInt, type IntegerType } from \"../utils/encoding.ts\";\nimport { validateStacksAddress, parseContractId } from \"../utils/address.ts\";\n\ntype MultiSigOptions = {\n publicKeys?: string[];\n signaturesRequired?: number;\n hashMode?: MultiSigHashMode;\n};\n\nexport type BuildTokenTransferOptions = MultiSigOptions & {\n recipient: string;\n amount: IntegerType;\n memo?: string;\n fee: IntegerType;\n nonce: IntegerType;\n publicKey?: string;\n chain?: StacksChain;\n postConditionMode?: \"allow\" | \"deny\";\n postConditions?: PostCondition[];\n sponsored?: boolean;\n};\n\nexport type BuildContractCallOptions = MultiSigOptions & {\n contractAddress: string;\n contractName: string;\n functionName: string;\n functionArgs: ClarityValue[];\n fee: IntegerType;\n nonce: IntegerType;\n publicKey?: string;\n chain?: StacksChain;\n postConditionMode?: \"allow\" | \"deny\";\n postConditions?: PostCondition[];\n sponsored?: boolean;\n};\n\nexport type BuildContractDeployOptions = MultiSigOptions & {\n contractName: string;\n codeBody: string;\n clarityVersion?: ClarityVersion;\n fee: IntegerType;\n nonce: IntegerType;\n publicKey?: string;\n chain?: StacksChain;\n postConditionMode?: \"allow\" | \"deny\";\n postConditions?: PostCondition[];\n sponsored?: boolean;\n};\n\nfunction resolvePcMode(mode?: \"allow\" | \"deny\"): PostConditionModeWire {\n return mode === \"allow\" ? PostConditionModeWire.Allow : PostConditionModeWire.Deny;\n}\n\nfunction convertPostConditions(pcs?: PostCondition[]): PostConditionWire[] {\n if (!pcs || pcs.length === 0) return [];\n return pcs.map(convertPostCondition);\n}\n\nfunction resolvePrincipal(address: string): PostConditionPrincipalWire {\n if (address === \"origin\") return { type: \"origin\" };\n const [addr, name] = address.split(\".\");\n if (name) {\n return { type: \"contract\", address: addr!, contractName: name };\n }\n return { type: \"standard\", address: addr! };\n}\n\nconst FUNGIBLE_CODE_MAP: Record<string, number> = {\n eq: FungibleConditionCode.Equal,\n gt: FungibleConditionCode.Greater,\n gte: FungibleConditionCode.GreaterEqual,\n lt: FungibleConditionCode.Less,\n lte: FungibleConditionCode.LessEqual,\n};\n\nfunction convertPostCondition(pc: PostCondition): PostConditionWire {\n switch (pc.type) {\n case \"stx-postcondition\":\n return {\n type: \"stx\",\n principal: resolvePrincipal(pc.address),\n conditionCode: FUNGIBLE_CODE_MAP[pc.condition]!,\n amount: intToBigInt(pc.amount),\n };\n case \"ft-postcondition\": {\n const [contractId, tokenName] = pc.asset.split(\"::\");\n const [addr, name] = parseContractId(contractId!);\n return {\n type: \"ft\",\n principal: resolvePrincipal(pc.address),\n asset: { address: addr, contractName: name, assetName: tokenName! },\n conditionCode: FUNGIBLE_CODE_MAP[pc.condition]!,\n amount: intToBigInt(pc.amount),\n };\n }\n case \"nft-postcondition\": {\n const [contractId, tokenName] = pc.asset.split(\"::\");\n const [addr, name] = parseContractId(contractId!);\n return {\n type: \"nft\",\n principal: resolvePrincipal(pc.address),\n asset: { address: addr, contractName: name, assetName: tokenName! },\n conditionCode: pc.condition === \"sent\" ? NonFungibleConditionCode.Sends : NonFungibleConditionCode.DoesNotSend,\n assetId: pc.assetId,\n };\n }\n }\n}\n\nimport type { Authorization } from \"./types.ts\";\n\nfunction resolveSpendingCondition(\n opts: MultiSigOptions & { publicKey?: string },\n nonce: bigint,\n fee: bigint\n): SpendingCondition {\n if (opts.publicKeys) {\n return createMultiSigSpendingCondition(\n opts.publicKeys,\n opts.signaturesRequired!,\n nonce,\n fee,\n opts.hashMode\n );\n }\n return createSingleSigSpendingCondition(opts.publicKey!, nonce, fee);\n}\n\nfunction resolveAuth(spendingCondition: any, sponsored?: boolean): Authorization {\n return sponsored\n ? createSponsoredAuth(spendingCondition)\n : createStandardAuth(spendingCondition);\n}\n\nfunction resolveVersionAndChainId(chain?: StacksChain): { version: number; chainId: number } {\n if (!chain) return { version: 0x00, chainId: 0x00000001 }; // mainnet defaults\n return { version: chain.transactionVersion, chainId: chain.id };\n}\n\nexport function buildTokenTransfer(options: BuildTokenTransferOptions): StacksTransaction {\n const { version, chainId } = resolveVersionAndChainId(options.chain);\n const fee = intToBigInt(options.fee);\n const nonce = intToBigInt(options.nonce);\n\n const spendingCondition = resolveSpendingCondition(options, nonce, fee);\n const recipient = Cl.principal(options.recipient);\n\n const tx: StacksTransaction = {\n version,\n chainId,\n auth: resolveAuth(spendingCondition, options.sponsored),\n anchorMode: AnchorMode.Any,\n postConditionMode: resolvePcMode(options.postConditionMode),\n postConditions: convertPostConditions(options.postConditions),\n payload: {\n payloadType: PayloadType.TokenTransfer,\n recipient,\n amount: intToBigInt(options.amount),\n memo: options.memo ?? \"\",\n },\n };\n\n if (options.publicKeys) {\n (tx as any)._multisig = { publicKeys: options.publicKeys };\n }\n return tx;\n}\n\nexport function buildContractCall(options: BuildContractCallOptions): StacksTransaction {\n const { version, chainId } = resolveVersionAndChainId(options.chain);\n const fee = intToBigInt(options.fee);\n const nonce = intToBigInt(options.nonce);\n\n const spendingCondition = resolveSpendingCondition(options, nonce, fee);\n\n const tx: StacksTransaction = {\n version,\n chainId,\n auth: resolveAuth(spendingCondition, options.sponsored),\n anchorMode: AnchorMode.Any,\n postConditionMode: resolvePcMode(options.postConditionMode),\n postConditions: convertPostConditions(options.postConditions),\n payload: {\n payloadType: PayloadType.ContractCall,\n contractAddress: options.contractAddress,\n contractName: options.contractName,\n functionName: options.functionName,\n functionArgs: options.functionArgs,\n },\n };\n\n if (options.publicKeys) {\n (tx as any)._multisig = { publicKeys: options.publicKeys };\n }\n return tx;\n}\n\nexport function buildContractDeploy(options: BuildContractDeployOptions): StacksTransaction {\n const { version, chainId } = resolveVersionAndChainId(options.chain);\n const fee = intToBigInt(options.fee);\n const nonce = intToBigInt(options.nonce);\n\n const spendingCondition = resolveSpendingCondition(options, nonce, fee);\n const useVersioned = options.clarityVersion !== undefined;\n\n const tx: StacksTransaction = {\n version,\n chainId,\n auth: resolveAuth(spendingCondition, options.sponsored),\n anchorMode: AnchorMode.Any,\n postConditionMode: resolvePcMode(options.postConditionMode),\n postConditions: convertPostConditions(options.postConditions),\n payload: {\n payloadType: useVersioned ? PayloadType.VersionedSmartContract : PayloadType.SmartContract,\n clarityVersion: options.clarityVersion,\n contractName: options.contractName,\n codeBody: options.codeBody,\n },\n };\n\n if (options.publicKeys) {\n (tx as any)._multisig = { publicKeys: options.publicKeys };\n }\n return tx;\n}\n"
|
|
7
|
-
],
|
|
8
|
-
"mappings": "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",
|
|
9
|
-
"debugId": "B2AF18736399320664756E2164756E21",
|
|
10
|
-
"names": []
|
|
11
|
-
}
|
|
File without changes
|