@secondlayer/stacks 0.0.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/README.md +92 -0
- package/dist/shared/stacks-02actsrx.cjs +17 -0
- package/dist/shared/stacks-02actsrx.cjs.map +10 -0
- package/dist/shared/stacks-1aqm7c2h.cjs +110 -0
- package/dist/shared/stacks-1aqm7c2h.cjs.map +11 -0
- package/dist/shared/stacks-24h5k94q.cjs +74 -0
- package/dist/shared/stacks-24h5k94q.cjs.map +11 -0
- package/dist/shared/stacks-2ar4prfz.cjs +328 -0
- package/dist/shared/stacks-2ar4prfz.cjs.map +11 -0
- package/dist/shared/stacks-4py5pm0r.cjs +237 -0
- package/dist/shared/stacks-4py5pm0r.cjs.map +10 -0
- package/dist/shared/stacks-5tprhns9.cjs +54 -0
- package/dist/shared/stacks-5tprhns9.cjs.map +11 -0
- package/dist/shared/stacks-61rvzkz1.cjs +132 -0
- package/dist/shared/stacks-61rvzkz1.cjs.map +17 -0
- package/dist/shared/stacks-709tra19.js +30 -0
- package/dist/shared/stacks-709tra19.js.map +10 -0
- package/dist/shared/stacks-74k8cxgb.cjs +567 -0
- package/dist/shared/stacks-74k8cxgb.cjs.map +13 -0
- package/dist/shared/stacks-8m9byk2j.js +7 -0
- package/dist/shared/stacks-8m9byk2j.js.map +9 -0
- package/dist/shared/stacks-8yykgdww.js +125 -0
- package/dist/shared/stacks-8yykgdww.js.map +11 -0
- package/dist/shared/stacks-9g0jhab3.cjs +40 -0
- package/dist/shared/stacks-9g0jhab3.cjs.map +10 -0
- package/dist/shared/stacks-an5k8n4t.cjs +291 -0
- package/dist/shared/stacks-an5k8n4t.cjs.map +23 -0
- package/dist/shared/stacks-b008c3w8.cjs +214 -0
- package/dist/shared/stacks-b008c3w8.cjs.map +11 -0
- package/dist/shared/stacks-bnvfmt7y.cjs +31 -0
- package/dist/shared/stacks-bnvfmt7y.cjs.map +9 -0
- package/dist/shared/stacks-bycy6t9k.js +22 -0
- package/dist/shared/stacks-bycy6t9k.js.map +10 -0
- package/dist/shared/stacks-d1fmkv3p.js +258 -0
- package/dist/shared/stacks-d1fmkv3p.js.map +13 -0
- package/dist/shared/stacks-dr5en54r.cjs +119 -0
- package/dist/shared/stacks-dr5en54r.cjs.map +10 -0
- package/dist/shared/stacks-dxhntr76.js +278 -0
- package/dist/shared/stacks-dxhntr76.js.map +10 -0
- package/dist/shared/stacks-evnzth1q.cjs +35 -0
- package/dist/shared/stacks-evnzth1q.cjs.map +10 -0
- package/dist/shared/stacks-f3tk2k5s.js +27 -0
- package/dist/shared/stacks-f3tk2k5s.js.map +9 -0
- package/dist/shared/stacks-f7wdrzs3.js +285 -0
- package/dist/shared/stacks-f7wdrzs3.js.map +11 -0
- package/dist/shared/stacks-fcaefc5b.cjs +16 -0
- package/dist/shared/stacks-fcaefc5b.cjs.map +10 -0
- package/dist/shared/stacks-g9mcjcqg.cjs +3 -0
- package/dist/shared/stacks-g9mcjcqg.cjs.map +9 -0
- package/dist/shared/stacks-gck1sq7h.cjs +28 -0
- package/dist/shared/stacks-gck1sq7h.cjs.map +10 -0
- package/dist/shared/stacks-gjvbq6w7.js +46 -0
- package/dist/shared/stacks-gjvbq6w7.js.map +10 -0
- package/dist/shared/stacks-j2cy7qtt.js +237 -0
- package/dist/shared/stacks-j2cy7qtt.js.map +11 -0
- package/dist/shared/stacks-k08tgzyp.cjs +232 -0
- package/dist/shared/stacks-k08tgzyp.cjs.map +13 -0
- package/dist/shared/stacks-k2p5tv6x.js +37 -0
- package/dist/shared/stacks-k2p5tv6x.js.map +10 -0
- package/dist/shared/stacks-k58k970n.js +234 -0
- package/dist/shared/stacks-k58k970n.js.map +10 -0
- package/dist/shared/stacks-n2g56wgg.js +338 -0
- package/dist/shared/stacks-n2g56wgg.js.map +23 -0
- package/dist/shared/stacks-nqytwfcc.js +243 -0
- package/dist/shared/stacks-nqytwfcc.js.map +11 -0
- package/dist/shared/stacks-qcae5852.js +19 -0
- package/dist/shared/stacks-qcae5852.js.map +10 -0
- package/dist/shared/stacks-qt8ehebn.js +76 -0
- package/dist/shared/stacks-qt8ehebn.js.map +11 -0
- package/dist/shared/stacks-qvg7c24g.cjs +232 -0
- package/dist/shared/stacks-qvg7c24g.cjs.map +10 -0
- package/dist/shared/stacks-r1t6g3c3.cjs +241 -0
- package/dist/shared/stacks-r1t6g3c3.cjs.map +11 -0
- package/dist/shared/stacks-tjxmrssa.js +282 -0
- package/dist/shared/stacks-tjxmrssa.js.map +11 -0
- package/dist/shared/stacks-v9jqcpd4.js +18 -0
- package/dist/shared/stacks-v9jqcpd4.js.map +10 -0
- package/dist/shared/stacks-vdfag81a.cjs +121 -0
- package/dist/shared/stacks-vdfag81a.cjs.map +10 -0
- package/dist/shared/stacks-vdfs3e5v.js +134 -0
- package/dist/shared/stacks-vdfs3e5v.js.map +10 -0
- package/dist/shared/stacks-y3dh7hv1.js +60 -0
- package/dist/shared/stacks-y3dh7hv1.js.map +11 -0
- package/dist/shared/stacks-ya3x01yd.cjs +16 -0
- package/dist/shared/stacks-ya3x01yd.cjs.map +10 -0
- package/dist/shared/stacks-yfgsm6ap.js +599 -0
- package/dist/shared/stacks-yfgsm6ap.js.map +13 -0
- package/dist/shared/stacks-yfveb68e.js +121 -0
- package/dist/shared/stacks-yfveb68e.js.map +10 -0
- package/dist/shared/stacks-zm0b3tgy.js +160 -0
- package/dist/shared/stacks-zm0b3tgy.js.map +17 -0
- package/dist/shared/stacks-zyv9qqme.cjs +249 -0
- package/dist/shared/stacks-zyv9qqme.cjs.map +11 -0
- package/dist/src/accounts/index.cjs +90 -0
- package/dist/src/accounts/index.cjs.map +12 -0
- package/dist/src/accounts/index.d.cts +47 -0
- package/dist/src/accounts/index.d.ts +47 -0
- package/dist/src/accounts/index.js +104 -0
- package/dist/src/accounts/index.js.map +12 -0
- package/dist/src/actions/index.cjs +36 -0
- package/dist/src/actions/index.cjs.map +9 -0
- package/dist/src/actions/index.d.cts +886 -0
- package/dist/src/actions/index.d.ts +886 -0
- package/dist/src/actions/index.js +81 -0
- package/dist/src/actions/index.js.map +9 -0
- package/dist/src/bns/index.cjs +590 -0
- package/dist/src/bns/index.cjs.map +15 -0
- package/dist/src/bns/index.d.cts +241 -0
- package/dist/src/bns/index.d.ts +241 -0
- package/dist/src/bns/index.js +611 -0
- package/dist/src/bns/index.js.map +15 -0
- package/dist/src/chains/index.cjs +13 -0
- package/dist/src/chains/index.cjs.map +9 -0
- package/dist/src/chains/index.d.cts +53 -0
- package/dist/src/chains/index.d.ts +53 -0
- package/dist/src/chains/index.js +18 -0
- package/dist/src/chains/index.js.map +9 -0
- package/dist/src/clarity/index.cjs +3 -0
- package/dist/src/clarity/index.cjs.map +9 -0
- package/dist/src/clarity/index.d.cts +821 -0
- package/dist/src/clarity/index.d.ts +821 -0
- package/dist/src/clarity/index.js +145 -0
- package/dist/src/clarity/index.js.map +9 -0
- package/dist/src/connect/index.cjs +480 -0
- package/dist/src/connect/index.cjs.map +19 -0
- package/dist/src/connect/index.d.cts +110 -0
- package/dist/src/connect/index.d.ts +110 -0
- package/dist/src/connect/index.js +448 -0
- package/dist/src/connect/index.js.map +19 -0
- package/dist/src/connect/walletconnect/index.cjs +1322 -0
- package/dist/src/connect/walletconnect/index.cjs.map +18 -0
- package/dist/src/connect/walletconnect/index.d.cts +132 -0
- package/dist/src/connect/walletconnect/index.d.ts +132 -0
- package/dist/src/connect/walletconnect/index.js +1290 -0
- package/dist/src/connect/walletconnect/index.js.map +18 -0
- package/dist/src/index.cjs +557 -0
- package/dist/src/index.cjs.map +21 -0
- package/dist/src/index.d.cts +847 -0
- package/dist/src/index.d.ts +847 -0
- package/dist/src/index.js +629 -0
- package/dist/src/index.js.map +21 -0
- package/dist/src/postconditions/index.cjs +3 -0
- package/dist/src/postconditions/index.cjs.map +9 -0
- package/dist/src/postconditions/index.d.cts +91 -0
- package/dist/src/postconditions/index.d.ts +91 -0
- package/dist/src/postconditions/index.js +12 -0
- package/dist/src/postconditions/index.js.map +9 -0
- package/dist/src/pox/index.cjs +860 -0
- package/dist/src/pox/index.cjs.map +15 -0
- package/dist/src/pox/index.d.cts +244 -0
- package/dist/src/pox/index.d.ts +244 -0
- package/dist/src/pox/index.js +877 -0
- package/dist/src/pox/index.js.map +15 -0
- package/dist/src/stackingdao/index.cjs +300 -0
- package/dist/src/stackingdao/index.cjs.map +13 -0
- package/dist/src/stackingdao/index.d.cts +179 -0
- package/dist/src/stackingdao/index.d.ts +179 -0
- package/dist/src/stackingdao/index.js +318 -0
- package/dist/src/stackingdao/index.js.map +13 -0
- package/dist/src/subscriptions/index.cjs +14 -0
- package/dist/src/subscriptions/index.cjs.map +9 -0
- package/dist/src/subscriptions/index.d.cts +250 -0
- package/dist/src/subscriptions/index.d.ts +250 -0
- package/dist/src/subscriptions/index.js +21 -0
- package/dist/src/subscriptions/index.js.map +9 -0
- package/dist/src/transactions/index.cjs +50 -0
- package/dist/src/transactions/index.cjs.map +9 -0
- package/dist/src/transactions/index.d.cts +412 -0
- package/dist/src/transactions/index.d.ts +412 -0
- package/dist/src/transactions/index.js +101 -0
- package/dist/src/transactions/index.js.map +9 -0
- package/dist/src/utils/index.cjs +168 -0
- package/dist/src/utils/index.cjs.map +11 -0
- package/dist/src/utils/index.d.cts +140 -0
- package/dist/src/utils/index.d.ts +140 -0
- package/dist/src/utils/index.js +222 -0
- package/dist/src/utils/index.js.map +11 -0
- package/package.json +105 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import {
|
|
2
|
+
asciiToBytes,
|
|
3
|
+
bigIntToBytes,
|
|
4
|
+
bytesToHex,
|
|
5
|
+
c32addressDecode,
|
|
6
|
+
concatBytes,
|
|
7
|
+
hexToBytes,
|
|
8
|
+
intToHex,
|
|
9
|
+
toTwos,
|
|
10
|
+
utf8ToBytes,
|
|
11
|
+
writeUInt32BE
|
|
12
|
+
} from "./stacks-nqytwfcc.js";
|
|
13
|
+
|
|
14
|
+
// src/clarity/types.ts
|
|
15
|
+
var ClarityWireType = {
|
|
16
|
+
int: 0,
|
|
17
|
+
uint: 1,
|
|
18
|
+
buffer: 2,
|
|
19
|
+
true: 3,
|
|
20
|
+
false: 4,
|
|
21
|
+
address: 5,
|
|
22
|
+
contract: 6,
|
|
23
|
+
ok: 7,
|
|
24
|
+
err: 8,
|
|
25
|
+
none: 9,
|
|
26
|
+
some: 10,
|
|
27
|
+
list: 11,
|
|
28
|
+
tuple: 12,
|
|
29
|
+
ascii: 13,
|
|
30
|
+
utf8: 14
|
|
31
|
+
};
|
|
32
|
+
var wireTypeToClarity = Object.fromEntries(Object.entries(ClarityWireType).map(([k, v]) => [v, k]));
|
|
33
|
+
function clarityTypeFromByte(byte) {
|
|
34
|
+
const type = wireTypeToClarity[byte];
|
|
35
|
+
if (!type)
|
|
36
|
+
throw new Error(`Unknown clarity wire type: ${byte}`);
|
|
37
|
+
return type;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// src/clarity/serialize.ts
|
|
41
|
+
var CLARITY_INT_SIZE = 128n;
|
|
42
|
+
var CLARITY_INT_BYTE_SIZE = 16;
|
|
43
|
+
function typeIdByte(type) {
|
|
44
|
+
return ClarityWireType[type];
|
|
45
|
+
}
|
|
46
|
+
function withTypeId(type, bytes) {
|
|
47
|
+
return concatBytes(new Uint8Array([typeIdByte(type)]), bytes);
|
|
48
|
+
}
|
|
49
|
+
function serializeAddress(c32Address) {
|
|
50
|
+
const [version, hash160] = c32addressDecode(c32Address);
|
|
51
|
+
return concatBytes(new Uint8Array([version]), hexToBytes(hash160));
|
|
52
|
+
}
|
|
53
|
+
function serializeLPString(str, prefixBytes = 1) {
|
|
54
|
+
const content = utf8ToBytes(str);
|
|
55
|
+
const lengthPrefix = hexToBytes(intToHex(content.byteLength, prefixBytes));
|
|
56
|
+
return concatBytes(lengthPrefix, content);
|
|
57
|
+
}
|
|
58
|
+
function serializeCVBytes(value) {
|
|
59
|
+
switch (value.type) {
|
|
60
|
+
case "true":
|
|
61
|
+
case "false":
|
|
62
|
+
return new Uint8Array([typeIdByte(value.type)]);
|
|
63
|
+
case "int": {
|
|
64
|
+
const bytes = bigIntToBytes(toTwos(BigInt(value.value), CLARITY_INT_SIZE), CLARITY_INT_BYTE_SIZE);
|
|
65
|
+
return withTypeId(value.type, bytes);
|
|
66
|
+
}
|
|
67
|
+
case "uint": {
|
|
68
|
+
const bytes = bigIntToBytes(BigInt(value.value), CLARITY_INT_BYTE_SIZE);
|
|
69
|
+
return withTypeId(value.type, bytes);
|
|
70
|
+
}
|
|
71
|
+
case "buffer": {
|
|
72
|
+
const bufBytes = hexToBytes(value.value);
|
|
73
|
+
return withTypeId(value.type, concatBytes(writeUInt32BE(bufBytes.length), bufBytes));
|
|
74
|
+
}
|
|
75
|
+
case "none":
|
|
76
|
+
return new Uint8Array([typeIdByte(value.type)]);
|
|
77
|
+
case "some":
|
|
78
|
+
return withTypeId(value.type, serializeCVBytes(value.value));
|
|
79
|
+
case "ok":
|
|
80
|
+
case "err":
|
|
81
|
+
return withTypeId(value.type, serializeCVBytes(value.value));
|
|
82
|
+
case "address":
|
|
83
|
+
return withTypeId(value.type, serializeAddress(value.value));
|
|
84
|
+
case "contract": {
|
|
85
|
+
const [addr, name] = value.value.split(".");
|
|
86
|
+
if (!addr || !name)
|
|
87
|
+
throw new Error(`Invalid contract principal: ${value.value}`);
|
|
88
|
+
return withTypeId(value.type, concatBytes(serializeAddress(addr), serializeLPString(name)));
|
|
89
|
+
}
|
|
90
|
+
case "list": {
|
|
91
|
+
const parts = [writeUInt32BE(value.value.length)];
|
|
92
|
+
for (const item of value.value) {
|
|
93
|
+
parts.push(serializeCVBytes(item));
|
|
94
|
+
}
|
|
95
|
+
return withTypeId(value.type, concatBytes(...parts));
|
|
96
|
+
}
|
|
97
|
+
case "tuple": {
|
|
98
|
+
const keys = Object.keys(value.value).sort((a, b) => a.localeCompare(b));
|
|
99
|
+
const parts = [writeUInt32BE(keys.length)];
|
|
100
|
+
for (const key of keys) {
|
|
101
|
+
parts.push(serializeLPString(key));
|
|
102
|
+
parts.push(serializeCVBytes(value.value[key]));
|
|
103
|
+
}
|
|
104
|
+
return withTypeId(value.type, concatBytes(...parts));
|
|
105
|
+
}
|
|
106
|
+
case "ascii": {
|
|
107
|
+
const strBytes = asciiToBytes(value.value);
|
|
108
|
+
return withTypeId(value.type, concatBytes(writeUInt32BE(strBytes.length), strBytes));
|
|
109
|
+
}
|
|
110
|
+
case "utf8": {
|
|
111
|
+
const strBytes = utf8ToBytes(value.value);
|
|
112
|
+
return withTypeId(value.type, concatBytes(writeUInt32BE(strBytes.length), strBytes));
|
|
113
|
+
}
|
|
114
|
+
default:
|
|
115
|
+
throw new Error(`Cannot serialize unknown clarity type`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function serializeCV(value) {
|
|
119
|
+
return bytesToHex(serializeCVBytes(value));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export { ClarityWireType, clarityTypeFromByte, serializeCVBytes, serializeCV };
|
|
123
|
+
|
|
124
|
+
//# debugId=D83E478FA3033F0964756E2164756E21
|
|
125
|
+
//# sourceMappingURL=stacks-8yykgdww.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/clarity/types.ts", "../src/clarity/serialize.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export type ClarityType =\n | \"int\"\n | \"uint\"\n | \"buffer\"\n | \"true\"\n | \"false\"\n | \"address\"\n | \"contract\"\n | \"ok\"\n | \"err\"\n | \"none\"\n | \"some\"\n | \"list\"\n | \"tuple\"\n | \"ascii\"\n | \"utf8\";\n\n/** Wire type IDs matching the Stacks binary format (SIP-005) */\nexport const ClarityWireType = {\n int: 0x00,\n uint: 0x01,\n buffer: 0x02,\n true: 0x03,\n false: 0x04,\n address: 0x05,\n contract: 0x06,\n ok: 0x07,\n err: 0x08,\n none: 0x09,\n some: 0x0a,\n list: 0x0b,\n tuple: 0x0c,\n ascii: 0x0d,\n utf8: 0x0e,\n} as const satisfies Record<ClarityType, number>;\n\n/** Reverse lookup: wire byte → ClarityType string */\nconst wireTypeToClarity = Object.fromEntries(\n Object.entries(ClarityWireType).map(([k, v]) => [v, k])\n) as Record<number, ClarityType>;\n\nexport function clarityTypeFromByte(byte: number): ClarityType {\n const type = wireTypeToClarity[byte];\n if (!type) throw new Error(`Unknown clarity wire type: ${byte}`);\n return type;\n}\n\n// CV types\n\nexport type IntCV = { readonly type: \"int\"; readonly value: bigint };\nexport type UIntCV = { readonly type: \"uint\"; readonly value: bigint };\nexport type BooleanCV = TrueCV | FalseCV;\nexport type TrueCV = { readonly type: \"true\" };\nexport type FalseCV = { readonly type: \"false\" };\nexport type BufferCV = { readonly type: \"buffer\"; readonly value: string }; // hex\nexport type NoneCV = { readonly type: \"none\" };\nexport type SomeCV = {\n readonly type: \"some\";\n readonly value: ClarityValue;\n};\nexport type OptionalCV = NoneCV | SomeCV;\nexport type ResponseOkCV = {\n readonly type: \"ok\";\n readonly value: ClarityValue;\n};\nexport type ResponseErrorCV = {\n readonly type: \"err\";\n readonly value: ClarityValue;\n};\nexport type ResponseCV = ResponseOkCV | ResponseErrorCV;\nexport type StandardPrincipalCV = {\n readonly type: \"address\";\n readonly value: string;\n};\nexport type ContractPrincipalCV = {\n readonly type: \"contract\";\n readonly value: string; // \"address.name\"\n};\nexport type PrincipalCV = StandardPrincipalCV | ContractPrincipalCV;\nexport type ListCV = {\n type: \"list\";\n value: ClarityValue[];\n};\nexport type TupleData = {\n [key: string]: ClarityValue;\n};\nexport type TupleCV = {\n type: \"tuple\";\n value: TupleData;\n};\nexport type StringAsciiCV = {\n readonly type: \"ascii\";\n readonly value: string;\n};\nexport type StringUtf8CV = {\n readonly type: \"utf8\";\n readonly value: string;\n};\n\nexport type ClarityValue =\n | IntCV\n | UIntCV\n | BooleanCV\n | BufferCV\n | NoneCV\n | SomeCV\n | ResponseOkCV\n | ResponseErrorCV\n | StandardPrincipalCV\n | ContractPrincipalCV\n | ListCV\n | TupleCV\n | StringAsciiCV\n | StringUtf8CV;\n",
|
|
6
|
+
"import {\n bytesToHex,\n hexToBytes,\n concatBytes,\n bigIntToBytes,\n toTwos,\n asciiToBytes,\n utf8ToBytes,\n writeUInt32BE,\n intToHex,\n} from \"../utils/encoding.ts\";\nimport { c32addressDecode } from \"../utils/c32.ts\";\nimport { ClarityWireType, type ClarityValue, type ClarityType } from \"./types.ts\";\n\nconst CLARITY_INT_SIZE = 128n;\nconst CLARITY_INT_BYTE_SIZE = 16;\n\nfunction typeIdByte(type: ClarityType): number {\n return ClarityWireType[type];\n}\n\nfunction withTypeId(type: ClarityType, bytes: Uint8Array): Uint8Array {\n return concatBytes(new Uint8Array([typeIdByte(type)]), bytes);\n}\n\nfunction serializeAddress(c32Address: string): Uint8Array {\n const [version, hash160] = c32addressDecode(c32Address);\n return concatBytes(new Uint8Array([version]), hexToBytes(hash160));\n}\n\nfunction serializeLPString(str: string, prefixBytes = 1): Uint8Array {\n const content = utf8ToBytes(str);\n const lengthPrefix = hexToBytes(intToHex(content.byteLength, prefixBytes));\n return concatBytes(lengthPrefix, content);\n}\n\nexport function serializeCVBytes(value: ClarityValue): Uint8Array {\n switch (value.type) {\n case \"true\":\n case \"false\":\n return new Uint8Array([typeIdByte(value.type)]);\n\n case \"int\": {\n const bytes = bigIntToBytes(\n toTwos(BigInt(value.value), CLARITY_INT_SIZE),\n CLARITY_INT_BYTE_SIZE\n );\n return withTypeId(value.type, bytes);\n }\n\n case \"uint\": {\n const bytes = bigIntToBytes(BigInt(value.value), CLARITY_INT_BYTE_SIZE);\n return withTypeId(value.type, bytes);\n }\n\n case \"buffer\": {\n const bufBytes = hexToBytes(value.value);\n return withTypeId(\n value.type,\n concatBytes(writeUInt32BE(bufBytes.length), bufBytes)\n );\n }\n\n case \"none\":\n return new Uint8Array([typeIdByte(value.type)]);\n\n case \"some\":\n return withTypeId(value.type, serializeCVBytes(value.value));\n\n case \"ok\":\n case \"err\":\n return withTypeId(value.type, serializeCVBytes(value.value));\n\n case \"address\":\n return withTypeId(value.type, serializeAddress(value.value));\n\n case \"contract\": {\n const [addr, name] = value.value.split(\".\");\n if (!addr || !name) throw new Error(`Invalid contract principal: ${value.value}`);\n return withTypeId(\n value.type,\n concatBytes(serializeAddress(addr), serializeLPString(name))\n );\n }\n\n case \"list\": {\n const parts: Uint8Array[] = [writeUInt32BE(value.value.length)];\n for (const item of value.value) {\n parts.push(serializeCVBytes(item));\n }\n return withTypeId(value.type, concatBytes(...parts));\n }\n\n case \"tuple\": {\n const keys = Object.keys(value.value).sort((a, b) => a.localeCompare(b));\n const parts: Uint8Array[] = [writeUInt32BE(keys.length)];\n for (const key of keys) {\n parts.push(serializeLPString(key));\n parts.push(serializeCVBytes(value.value[key]!));\n }\n return withTypeId(value.type, concatBytes(...parts));\n }\n\n case \"ascii\": {\n const strBytes = asciiToBytes(value.value);\n return withTypeId(\n value.type,\n concatBytes(writeUInt32BE(strBytes.length), strBytes)\n );\n }\n\n case \"utf8\": {\n const strBytes = utf8ToBytes(value.value);\n return withTypeId(\n value.type,\n concatBytes(writeUInt32BE(strBytes.length), strBytes)\n );\n }\n\n default:\n throw new Error(`Cannot serialize unknown clarity type`);\n }\n}\n\nexport function serializeCV(value: ClarityValue): string {\n return bytesToHex(serializeCVBytes(value));\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "D83E478FA3033F0964756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// src/utils/address.ts
|
|
2
|
+
function validateStacksAddress(address) {
|
|
3
|
+
try {
|
|
4
|
+
c32addressDecode(address);
|
|
5
|
+
return true;
|
|
6
|
+
} catch {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
var isValidAddress = validateStacksAddress;
|
|
11
|
+
function parseContractId(contractId) {
|
|
12
|
+
const [address, name] = contractId.split(".");
|
|
13
|
+
if (!address || !name)
|
|
14
|
+
throw new Error(`Invalid contract identifier: ${contractId}`);
|
|
15
|
+
return [address, name];
|
|
16
|
+
}
|
|
17
|
+
function isClarityName(name) {
|
|
18
|
+
const regex = /^[a-zA-Z]([a-zA-Z0-9]|[-_!?+<>=/*])*$|^[-+=/*]$|^[<>]=?$/;
|
|
19
|
+
return regex.test(name) && name.length < 128;
|
|
20
|
+
}
|
|
21
|
+
function isAddressEqual(a, b) {
|
|
22
|
+
const [versionA, hashA] = c32addressDecode(a);
|
|
23
|
+
const [versionB, hashB] = c32addressDecode(b);
|
|
24
|
+
return versionA === versionB && hashA.toLowerCase() === hashB.toLowerCase();
|
|
25
|
+
}
|
|
26
|
+
function addressToVersion(address) {
|
|
27
|
+
return c32addressDecode(address)[0];
|
|
28
|
+
}
|
|
29
|
+
function getContractAddress(deployer, contractName) {
|
|
30
|
+
if (!validateStacksAddress(deployer)) {
|
|
31
|
+
throw new Error(`Invalid deployer address: ${deployer}`);
|
|
32
|
+
}
|
|
33
|
+
if (!isClarityName(contractName)) {
|
|
34
|
+
throw new Error(`Invalid contract name: ${contractName}`);
|
|
35
|
+
}
|
|
36
|
+
return `${deployer}.${contractName}`;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
//# debugId=82C1C5C89C391C3664756E2164756E21
|
|
40
|
+
//# sourceMappingURL=stacks-9g0jhab3.cjs.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/address.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { c32address, c32addressDecode } from \"./c32.ts\";\n\nexport { c32address, c32addressDecode };\n\nexport function validateStacksAddress(address: string): boolean {\n try {\n c32addressDecode(address);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Alias for validateStacksAddress — matches future.md naming. */\nexport const isValidAddress = validateStacksAddress;\n\nexport function parseContractId(contractId: string): [string, string] {\n const [address, name] = contractId.split(\".\");\n if (!address || !name)\n throw new Error(`Invalid contract identifier: ${contractId}`);\n return [address, name];\n}\n\nexport function isClarityName(name: string): boolean {\n const regex = /^[a-zA-Z]([a-zA-Z0-9]|[-_!?+<>=/*])*$|^[-+=/*]$|^[<>]=?$/;\n return regex.test(name) && name.length < 128;\n}\n\n/**\n * Compare two Stacks addresses for equality (case-insensitive, version-aware).\n * Throws if either address is invalid.\n */\nexport function isAddressEqual(a: string, b: string): boolean {\n const [versionA, hashA] = c32addressDecode(a);\n const [versionB, hashB] = c32addressDecode(b);\n return versionA === versionB && hashA.toLowerCase() === hashB.toLowerCase();\n}\n\n/** Extract the version byte from a Stacks address (22, 20, 26, or 21). */\nexport function addressToVersion(address: string): number {\n return c32addressDecode(address)[0];\n}\n\n/**\n * Build a contract address from deployer + contract name.\n * Validates both parts; returns `deployer.contractName`.\n */\nexport function getContractAddress(deployer: string, contractName: string): string {\n if (!validateStacksAddress(deployer)) {\n throw new Error(`Invalid deployer address: ${deployer}`);\n }\n if (!isClarityName(contractName)) {\n throw new Error(`Invalid contract name: ${contractName}`);\n }\n return `${deployer}.${contractName}`;\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AAIO,SAAS,qBAAqB,CAAC,SAA0B;AAAA,EAC9D,IAAI;AAAA,IACF,iBAAiB,OAAO;AAAA,IACxB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAKJ,IAAM,iBAAiB;AAEvB,SAAS,eAAe,CAAC,YAAsC;AAAA,EACpE,OAAO,SAAS,QAAQ,WAAW,MAAM,GAAG;AAAA,EAC5C,IAAI,CAAC,WAAW,CAAC;AAAA,IACf,MAAM,IAAI,MAAM,gCAAgC,YAAY;AAAA,EAC9D,OAAO,CAAC,SAAS,IAAI;AAAA;AAGhB,SAAS,aAAa,CAAC,MAAuB;AAAA,EACnD,MAAM,QAAQ;AAAA,EACd,OAAO,MAAM,KAAK,IAAI,KAAK,KAAK,SAAS;AAAA;AAOpC,SAAS,cAAc,CAAC,GAAW,GAAoB;AAAA,EAC5D,OAAO,UAAU,SAAS,iBAAiB,CAAC;AAAA,EAC5C,OAAO,UAAU,SAAS,iBAAiB,CAAC;AAAA,EAC5C,OAAO,aAAa,YAAY,MAAM,YAAY,MAAM,MAAM,YAAY;AAAA;AAIrE,SAAS,gBAAgB,CAAC,SAAyB;AAAA,EACxD,OAAO,iBAAiB,OAAO,EAAE;AAAA;AAO5B,SAAS,kBAAkB,CAAC,UAAkB,cAA8B;AAAA,EACjF,IAAI,CAAC,sBAAsB,QAAQ,GAAG;AAAA,IACpC,MAAM,IAAI,MAAM,6BAA6B,UAAU;AAAA,EACzD;AAAA,EACA,IAAI,CAAC,cAAc,YAAY,GAAG;AAAA,IAChC,MAAM,IAAI,MAAM,0BAA0B,cAAc;AAAA,EAC1D;AAAA,EACA,OAAO,GAAG,YAAY;AAAA;",
|
|
8
|
+
"debugId": "82C1C5C89C391C3664756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
// src/actions/public/getBalance.ts
|
|
2
|
+
async function getBalance(client, params) {
|
|
3
|
+
const data = await client.request(`/v2/accounts/${params.address}`, {
|
|
4
|
+
method: "GET"
|
|
5
|
+
});
|
|
6
|
+
return BigInt(data.balance);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// src/actions/public/getAccountInfo.ts
|
|
10
|
+
async function getAccountInfo(client, params) {
|
|
11
|
+
const data = await client.request(`/v2/accounts/${params.address}?proof=1`, { method: "GET" });
|
|
12
|
+
return {
|
|
13
|
+
balance: BigInt(data.balance),
|
|
14
|
+
nonce: BigInt(data.nonce),
|
|
15
|
+
balanceProof: data.balance_proof ?? "",
|
|
16
|
+
nonceProof: data.nonce_proof ?? ""
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// src/actions/public/getBlock.ts
|
|
21
|
+
async function getBlock(client, params) {
|
|
22
|
+
if (params?.hash) {
|
|
23
|
+
return client.request(`/extended/v2/blocks/${params.hash}`, { method: "GET" });
|
|
24
|
+
}
|
|
25
|
+
if (params?.height !== undefined) {
|
|
26
|
+
return client.request(`/extended/v2/blocks/${params.height}`, { method: "GET" });
|
|
27
|
+
}
|
|
28
|
+
return client.request("/extended/v2/blocks?limit=1", { method: "GET" });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// src/actions/public/getBlockHeight.ts
|
|
32
|
+
async function getBlockHeight(client) {
|
|
33
|
+
const data = await client.request("/v2/info", { method: "GET" });
|
|
34
|
+
return data.stacks_tip_height;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// src/actions/public/getContractAbi.ts
|
|
38
|
+
async function getContractAbi(client, params) {
|
|
39
|
+
const [address, name] = parseContractId(params.contract);
|
|
40
|
+
return client.request(`/v2/contracts/interface/${address}/${name}`, {
|
|
41
|
+
method: "GET"
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// src/actions/public/multicall.ts
|
|
46
|
+
async function multicall(client, params) {
|
|
47
|
+
const { calls, allowFailure = true } = params;
|
|
48
|
+
if (allowFailure) {
|
|
49
|
+
const settled = await Promise.allSettled(calls.map((call) => readContract(client, call)));
|
|
50
|
+
return settled.map((r) => r.status === "fulfilled" ? { status: "success", result: r.value } : { status: "failure", error: r.reason instanceof Error ? r.reason : new Error(String(r.reason)) });
|
|
51
|
+
}
|
|
52
|
+
const results = await Promise.all(calls.map((call) => readContract(client, call)));
|
|
53
|
+
return results;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// src/errors/simulation.ts
|
|
57
|
+
class SimulationError extends BaseError {
|
|
58
|
+
name = "SimulationError";
|
|
59
|
+
writesDetected;
|
|
60
|
+
constructor(message, options) {
|
|
61
|
+
super(message, { details: options.details });
|
|
62
|
+
this.writesDetected = options.writesDetected;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// src/actions/public/simulateCall.ts
|
|
67
|
+
async function simulateCall(client, params) {
|
|
68
|
+
const [address, name] = parseContractId(params.contract);
|
|
69
|
+
const sender = params.sender ?? address;
|
|
70
|
+
const serializedArgs = (params.args ?? []).map((arg) => with0x(bytesToHex(serializeCVBytes(arg))));
|
|
71
|
+
let path = `/v2/contracts/call-read/${address}/${name}/${params.functionName}`;
|
|
72
|
+
if (params.tip) {
|
|
73
|
+
path += `?tip=${params.tip}`;
|
|
74
|
+
}
|
|
75
|
+
const data = await client.request(path, {
|
|
76
|
+
method: "POST",
|
|
77
|
+
body: {
|
|
78
|
+
sender,
|
|
79
|
+
arguments: serializedArgs
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
if (data.okay) {
|
|
83
|
+
return { success: true, result: deserializeCVBytes(data.result) };
|
|
84
|
+
}
|
|
85
|
+
const cause = data.cause ?? "Simulation failed";
|
|
86
|
+
const writesDetected = cause.includes("NotReadOnly") || cause.includes("CostBalanceExceeded");
|
|
87
|
+
return {
|
|
88
|
+
success: false,
|
|
89
|
+
error: new SimulationError(writesDetected ? "Function mutates state and cannot be simulated" : "Simulation failed", { writesDetected, details: cause })
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// src/actions/public/simulateTransaction.ts
|
|
94
|
+
function isMultiSig(hashMode) {
|
|
95
|
+
return hashMode === AddressHashMode.P2SH || hashMode === AddressHashMode.P2WSH || hashMode === AddressHashMode.P2SH_NonSequential || hashMode === AddressHashMode.P2WSH_P2SH_NonSequential;
|
|
96
|
+
}
|
|
97
|
+
function extractSender(tx, client) {
|
|
98
|
+
const { hashMode, signer } = tx.auth.spendingCondition;
|
|
99
|
+
const chain = client.chain;
|
|
100
|
+
const version = isMultiSig(hashMode) ? chain?.addressVersion.multiSig ?? 20 : chain?.addressVersion.singleSig ?? 22;
|
|
101
|
+
return c32address(version, signer);
|
|
102
|
+
}
|
|
103
|
+
async function simulateTransaction(client, params) {
|
|
104
|
+
const { transaction, tip } = params;
|
|
105
|
+
const { payload } = transaction;
|
|
106
|
+
if (payload.payloadType === PayloadType.ContractCall) {
|
|
107
|
+
const sender = params.sender ?? extractSender(transaction, client);
|
|
108
|
+
const contract = `${payload.contractAddress}.${payload.contractName}`;
|
|
109
|
+
const [execution, fees2] = await Promise.all([
|
|
110
|
+
simulateCall(client, {
|
|
111
|
+
contract,
|
|
112
|
+
functionName: payload.functionName,
|
|
113
|
+
args: payload.functionArgs,
|
|
114
|
+
sender,
|
|
115
|
+
tip
|
|
116
|
+
}),
|
|
117
|
+
estimateFee(client, { transaction })
|
|
118
|
+
]);
|
|
119
|
+
return { type: "contract-call", execution, fees: fees2 };
|
|
120
|
+
}
|
|
121
|
+
const fees = await estimateFee(client, { transaction });
|
|
122
|
+
if (payload.payloadType === PayloadType.SmartContract || payload.payloadType === PayloadType.VersionedSmartContract) {
|
|
123
|
+
return { type: "contract-deploy", fees };
|
|
124
|
+
}
|
|
125
|
+
return { type: "token-transfer", fees };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// src/actions/wallet/signTransaction.ts
|
|
129
|
+
async function signTransactionAction(client, params) {
|
|
130
|
+
const account = client.account;
|
|
131
|
+
if (!account)
|
|
132
|
+
throw new Error("Account required");
|
|
133
|
+
if (isProviderAccount(account)) {
|
|
134
|
+
const hex = serializeTransactionHex(params.transaction);
|
|
135
|
+
const result = await account.provider.request("stx_signTransaction", {
|
|
136
|
+
transaction: hex
|
|
137
|
+
});
|
|
138
|
+
return deserializeTransaction(result.transaction);
|
|
139
|
+
}
|
|
140
|
+
const condition = params.transaction.auth.spendingCondition;
|
|
141
|
+
if ("fields" in condition) {
|
|
142
|
+
const publicKeys = params.signers ?? params.transaction._multisig?.publicKeys;
|
|
143
|
+
if (!publicKeys)
|
|
144
|
+
throw new Error("Multi-sig signing requires signers (publicKeys)");
|
|
145
|
+
return signMultiSigWithAccount(params.transaction, account, publicKeys);
|
|
146
|
+
}
|
|
147
|
+
return signTransactionWithAccount(params.transaction, account);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// src/actions/wallet/transferStx.ts
|
|
151
|
+
async function transferStx(client, params) {
|
|
152
|
+
const account = client.account;
|
|
153
|
+
if (!account)
|
|
154
|
+
throw new Error("Account required");
|
|
155
|
+
if (isProviderAccount(account)) {
|
|
156
|
+
const result2 = await account.provider.request("stx_transferStx", {
|
|
157
|
+
recipient: params.to,
|
|
158
|
+
amount: String(params.amount),
|
|
159
|
+
memo: params.memo
|
|
160
|
+
});
|
|
161
|
+
return result2.txid;
|
|
162
|
+
}
|
|
163
|
+
const nonce = params.nonce ?? await getNonce(client, { address: account.address });
|
|
164
|
+
const unsigned = buildTokenTransfer({
|
|
165
|
+
recipient: params.to,
|
|
166
|
+
amount: params.amount,
|
|
167
|
+
memo: params.memo,
|
|
168
|
+
fee: params.fee ?? 0n,
|
|
169
|
+
nonce,
|
|
170
|
+
publicKey: account.publicKey,
|
|
171
|
+
chain: client.chain,
|
|
172
|
+
postConditionMode: params.postConditionMode,
|
|
173
|
+
postConditions: params.postConditions
|
|
174
|
+
});
|
|
175
|
+
if (params.fee === undefined) {
|
|
176
|
+
const estimates = await estimateFee(client, { transaction: unsigned });
|
|
177
|
+
const mid = estimates[1] ?? estimates[0];
|
|
178
|
+
if (mid) {
|
|
179
|
+
unsigned.auth.spendingCondition.fee = BigInt(mid.fee);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const signed = await signTransactionWithAccount(unsigned, account);
|
|
183
|
+
const result = await sendTransaction(client, { transaction: signed });
|
|
184
|
+
return result.txid;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// src/actions/wallet/deployContract.ts
|
|
188
|
+
async function deployContract(client, params) {
|
|
189
|
+
const account = client.account;
|
|
190
|
+
if (!account)
|
|
191
|
+
throw new Error("Account required");
|
|
192
|
+
if (isProviderAccount(account)) {
|
|
193
|
+
const result2 = await account.provider.request("stx_deployContract", {
|
|
194
|
+
contractName: params.contractName,
|
|
195
|
+
codeBody: params.codeBody,
|
|
196
|
+
clarityVersion: params.clarityVersion
|
|
197
|
+
});
|
|
198
|
+
return result2.txid;
|
|
199
|
+
}
|
|
200
|
+
const nonce = params.nonce ?? await getNonce(client, { address: account.address });
|
|
201
|
+
const unsigned = buildContractDeploy({
|
|
202
|
+
contractName: params.contractName,
|
|
203
|
+
codeBody: params.codeBody,
|
|
204
|
+
clarityVersion: params.clarityVersion,
|
|
205
|
+
fee: params.fee ?? 0n,
|
|
206
|
+
nonce,
|
|
207
|
+
publicKey: account.publicKey,
|
|
208
|
+
chain: client.chain,
|
|
209
|
+
postConditionMode: params.postConditionMode,
|
|
210
|
+
postConditions: params.postConditions
|
|
211
|
+
});
|
|
212
|
+
if (params.fee === undefined) {
|
|
213
|
+
const estimates = await estimateFee(client, { transaction: unsigned });
|
|
214
|
+
const mid = estimates[1] ?? estimates[0];
|
|
215
|
+
if (mid) {
|
|
216
|
+
unsigned.auth.spendingCondition.fee = BigInt(mid.fee);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
const signed = await signTransactionWithAccount(unsigned, account);
|
|
220
|
+
const result = await sendTransaction(client, { transaction: signed });
|
|
221
|
+
return result.txid;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// src/actions/wallet/signMessage.ts
|
|
225
|
+
var import_sha2 = require("@noble/hashes/sha2.js");
|
|
226
|
+
var SIP018_PREFIX = new Uint8Array([83, 73, 80, 48, 49, 56]);
|
|
227
|
+
async function signMessage(client, params) {
|
|
228
|
+
const account = client.account;
|
|
229
|
+
if (!account)
|
|
230
|
+
throw new Error("Account required");
|
|
231
|
+
if (isProviderAccount(account)) {
|
|
232
|
+
const method = params.domain ? "stx_signStructuredMessage" : "stx_signMessage";
|
|
233
|
+
const result = await account.provider.request(method, {
|
|
234
|
+
message: params.message,
|
|
235
|
+
domain: params.domain
|
|
236
|
+
});
|
|
237
|
+
return result.signature;
|
|
238
|
+
}
|
|
239
|
+
const cv = typeof params.message === "string" ? Cl.stringAscii(params.message) : params.message;
|
|
240
|
+
const serializedMsg = serializeCVBytes(cv);
|
|
241
|
+
let hash;
|
|
242
|
+
if (params.domain) {
|
|
243
|
+
const domainCV = Cl.tuple({
|
|
244
|
+
name: Cl.stringAscii(params.domain.name),
|
|
245
|
+
version: Cl.stringAscii(params.domain.version),
|
|
246
|
+
"chain-id": Cl.uint(params.domain.chainId)
|
|
247
|
+
});
|
|
248
|
+
const serializedDomain = serializeCVBytes(domainCV);
|
|
249
|
+
hash = import_sha2.sha256(concatBytes(SIP018_PREFIX, serializedDomain, serializedMsg));
|
|
250
|
+
} else {
|
|
251
|
+
hash = import_sha2.sha256(serializedMsg);
|
|
252
|
+
}
|
|
253
|
+
const sigBytes = await account.sign(hash);
|
|
254
|
+
return bytesToHex(sigBytes);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// src/actions/wallet/sponsorTransaction.ts
|
|
258
|
+
async function sponsorTransaction(client, params) {
|
|
259
|
+
const { transaction } = params;
|
|
260
|
+
if (transaction.auth.authType !== AuthType.Sponsored) {
|
|
261
|
+
throw new Error("Transaction must have sponsored authorization");
|
|
262
|
+
}
|
|
263
|
+
const account = client.account;
|
|
264
|
+
if (!account)
|
|
265
|
+
throw new Error("Account required");
|
|
266
|
+
if (isProviderAccount(account)) {
|
|
267
|
+
throw new Error("Provider accounts cannot sponsor transactions");
|
|
268
|
+
}
|
|
269
|
+
const nonce = params.nonce != null ? intToBigInt(params.nonce) : await getNonce(client, { address: account.address });
|
|
270
|
+
let fee;
|
|
271
|
+
if (params.fee != null) {
|
|
272
|
+
fee = intToBigInt(params.fee);
|
|
273
|
+
} else {
|
|
274
|
+
const estimates = await estimateFee(client, { transaction });
|
|
275
|
+
const mid = estimates[1] ?? estimates[0];
|
|
276
|
+
fee = mid ? BigInt(mid.fee) : 0n;
|
|
277
|
+
}
|
|
278
|
+
const sponsorCondition = createSingleSigSpendingCondition(account.publicKey, nonce, fee);
|
|
279
|
+
const auth = transaction.auth;
|
|
280
|
+
const sponsored = {
|
|
281
|
+
...transaction,
|
|
282
|
+
auth: {
|
|
283
|
+
...auth,
|
|
284
|
+
sponsorSpendingCondition: sponsorCondition
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
return signSponsorWithAccount(sponsored, account);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
//# debugId=611DF286E29AA1A764756E2164756E21
|
|
291
|
+
//# sourceMappingURL=stacks-an5k8n4t.cjs.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/actions/public/getBalance.ts", "../src/actions/public/getAccountInfo.ts", "../src/actions/public/getBlock.ts", "../src/actions/public/getBlockHeight.ts", "../src/actions/public/getContractAbi.ts", "../src/actions/public/multicall.ts", "../src/errors/simulation.ts", "../src/actions/public/simulateCall.ts", "../src/actions/public/simulateTransaction.ts", "../src/actions/wallet/signTransaction.ts", "../src/actions/wallet/transferStx.ts", "../src/actions/wallet/deployContract.ts", "../src/actions/wallet/signMessage.ts", "../src/actions/wallet/sponsorTransaction.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { Client } from \"../../clients/types.ts\";\n\nexport type GetBalanceParams = {\n address: string;\n};\n\nexport async function getBalance(\n client: Client,\n params: GetBalanceParams\n): Promise<bigint> {\n const data = await client.request(`/v2/accounts/${params.address}`, {\n method: \"GET\",\n });\n return BigInt(data.balance);\n}\n",
|
|
6
|
+
"import type { Client } from \"../../clients/types.ts\";\n\nexport type GetAccountInfoParams = {\n address: string;\n};\n\nexport type AccountInfo = {\n balance: bigint;\n nonce: bigint;\n balanceProof: string;\n nonceProof: string;\n};\n\nexport async function getAccountInfo(\n client: Client,\n params: GetAccountInfoParams\n): Promise<AccountInfo> {\n const data = await client.request(\n `/v2/accounts/${params.address}?proof=1`,\n { method: \"GET\" }\n );\n return {\n balance: BigInt(data.balance),\n nonce: BigInt(data.nonce),\n balanceProof: data.balance_proof ?? \"\",\n nonceProof: data.nonce_proof ?? \"\",\n };\n}\n",
|
|
7
|
+
"import type { Client } from \"../../clients/types.ts\";\n\nexport type GetBlockParams = {\n height?: number;\n hash?: string;\n};\n\nexport async function getBlock(client: Client, params?: GetBlockParams): Promise<any> {\n if (params?.hash) {\n return client.request(`/extended/v2/blocks/${params.hash}`, { method: \"GET\" });\n }\n if (params?.height !== undefined) {\n return client.request(`/extended/v2/blocks/${params.height}`, { method: \"GET\" });\n }\n // Latest block\n return client.request(\"/extended/v2/blocks?limit=1\", { method: \"GET\" });\n}\n",
|
|
8
|
+
"import type { Client } from \"../../clients/types.ts\";\n\nexport async function getBlockHeight(client: Client): Promise<number> {\n const data = await client.request(\"/v2/info\", { method: \"GET\" });\n return data.stacks_tip_height;\n}\n",
|
|
9
|
+
"import type { Client } from \"../../clients/types.ts\";\nimport { parseContractId } from \"../../utils/address.ts\";\n\nexport type GetContractAbiParams = {\n contract: string; // \"address.name\"\n};\n\nexport async function getContractAbi(\n client: Client,\n params: GetContractAbiParams\n): Promise<any> {\n const [address, name] = parseContractId(params.contract);\n return client.request(`/v2/contracts/interface/${address}/${name}`, {\n method: \"GET\",\n });\n}\n",
|
|
10
|
+
"import type { Client } from \"../../clients/types.ts\";\nimport type { ClarityValue } from \"../../clarity/types.ts\";\nimport { readContract } from \"./readContract.ts\";\n\nexport type MulticallCall = {\n contract: string;\n functionName: string;\n args?: ClarityValue[];\n sender?: string;\n};\n\nexport type MulticallParams<TAllowFailure extends boolean = true> = {\n calls: readonly MulticallCall[];\n allowFailure?: TAllowFailure;\n};\n\nexport type MulticallSuccessResult = { status: \"success\"; result: ClarityValue };\nexport type MulticallFailureResult = { status: \"failure\"; error: Error };\n\nexport type MulticallResult<T extends boolean> = T extends true\n ? (MulticallSuccessResult | MulticallFailureResult)[]\n : ClarityValue[];\n\nexport async function multicall<TAllowFailure extends boolean = true>(\n client: Client,\n params: MulticallParams<TAllowFailure>\n): Promise<MulticallResult<TAllowFailure>> {\n const { calls, allowFailure = true } = params;\n\n if (allowFailure) {\n const settled = await Promise.allSettled(\n calls.map((call) => readContract(client, call))\n );\n return settled.map((r) =>\n r.status === \"fulfilled\"\n ? { status: \"success\" as const, result: r.value }\n : { status: \"failure\" as const, error: r.reason instanceof Error ? r.reason : new Error(String(r.reason)) }\n ) as MulticallResult<TAllowFailure>;\n }\n\n const results = await Promise.all(\n calls.map((call) => readContract(client, call))\n );\n return results as MulticallResult<TAllowFailure>;\n}\n",
|
|
11
|
+
"import { BaseError } from \"./base.ts\";\n\nexport class SimulationError extends BaseError {\n override name = \"SimulationError\";\n writesDetected: boolean;\n\n constructor(\n message: string,\n options: { writesDetected: boolean; details?: string }\n ) {\n super(message, { details: options.details });\n this.writesDetected = options.writesDetected;\n }\n}\n",
|
|
12
|
+
"import type { Client } from \"../../clients/types.ts\";\nimport type { ClarityValue } from \"../../clarity/types.ts\";\nimport { serializeCVBytes } from \"../../clarity/serialize.ts\";\nimport { deserializeCVBytes } from \"../../clarity/deserialize.ts\";\nimport { bytesToHex, with0x } from \"../../utils/encoding.ts\";\nimport { parseContractId } from \"../../utils/address.ts\";\nimport { SimulationError } from \"../../errors/simulation.ts\";\n\nexport type SimulateCallParams = {\n contract: string;\n functionName: string;\n args?: ClarityValue[];\n sender?: string;\n tip?: string;\n};\n\nexport type SimulateCallSuccess = { success: true; result: ClarityValue };\nexport type SimulateCallFailure = { success: false; error: SimulationError };\nexport type SimulateCallResult = SimulateCallSuccess | SimulateCallFailure;\n\nexport async function simulateCall(\n client: Client,\n params: SimulateCallParams\n): Promise<SimulateCallResult> {\n const [address, name] = parseContractId(params.contract);\n const sender = params.sender ?? address;\n\n const serializedArgs = (params.args ?? []).map((arg) =>\n with0x(bytesToHex(serializeCVBytes(arg)))\n );\n\n let path = `/v2/contracts/call-read/${address}/${name}/${params.functionName}`;\n if (params.tip) {\n path += `?tip=${params.tip}`;\n }\n\n const data = await client.request(path, {\n method: \"POST\",\n body: {\n sender,\n arguments: serializedArgs,\n },\n });\n\n if (data.okay) {\n return { success: true, result: deserializeCVBytes(data.result) };\n }\n\n const cause: string = data.cause ?? \"Simulation failed\";\n const writesDetected =\n cause.includes(\"NotReadOnly\") || cause.includes(\"CostBalanceExceeded\");\n\n return {\n success: false,\n error: new SimulationError(\n writesDetected\n ? \"Function mutates state and cannot be simulated\"\n : \"Simulation failed\",\n { writesDetected, details: cause }\n ),\n };\n}\n",
|
|
13
|
+
"import type { Client } from \"../../clients/types.ts\";\nimport type { StacksTransaction } from \"../../transactions/types.ts\";\nimport { PayloadType, AddressHashMode } from \"../../transactions/types.ts\";\nimport { c32address } from \"../../utils/address.ts\";\nimport { simulateCall, type SimulateCallResult } from \"./simulateCall.ts\";\nimport { estimateFee, type FeeEstimation } from \"./estimateFee.ts\";\n\nexport type SimulateTransactionParams = {\n transaction: StacksTransaction;\n sender?: string;\n tip?: string;\n};\n\nexport type SimulateContractCallResult = {\n type: \"contract-call\";\n execution: SimulateCallResult;\n fees: FeeEstimation[];\n};\n\nexport type SimulateTransferResult = {\n type: \"token-transfer\";\n fees: FeeEstimation[];\n};\n\nexport type SimulateDeployResult = {\n type: \"contract-deploy\";\n fees: FeeEstimation[];\n};\n\nexport type SimulateTransactionResult =\n | SimulateContractCallResult\n | SimulateTransferResult\n | SimulateDeployResult;\n\nfunction isMultiSig(hashMode: number): boolean {\n return (\n hashMode === AddressHashMode.P2SH ||\n hashMode === AddressHashMode.P2WSH ||\n hashMode === AddressHashMode.P2SH_NonSequential ||\n hashMode === AddressHashMode.P2WSH_P2SH_NonSequential\n );\n}\n\nfunction extractSender(tx: StacksTransaction, client: Client): string {\n const { hashMode, signer } = tx.auth.spendingCondition;\n const chain = client.chain;\n const version = isMultiSig(hashMode)\n ? chain?.addressVersion.multiSig ?? 20\n : chain?.addressVersion.singleSig ?? 22;\n return c32address(version, signer);\n}\n\nexport async function simulateTransaction(\n client: Client,\n params: SimulateTransactionParams,\n): Promise<SimulateTransactionResult> {\n const { transaction, tip } = params;\n const { payload } = transaction;\n\n if (payload.payloadType === PayloadType.ContractCall) {\n const sender = params.sender ?? extractSender(transaction, client);\n const contract = `${payload.contractAddress}.${payload.contractName}`;\n\n const [execution, fees] = await Promise.all([\n simulateCall(client, {\n contract,\n functionName: payload.functionName,\n args: payload.functionArgs,\n sender,\n tip,\n }),\n estimateFee(client, { transaction }),\n ]);\n\n return { type: \"contract-call\", execution, fees };\n }\n\n const fees = await estimateFee(client, { transaction });\n\n if (\n payload.payloadType === PayloadType.SmartContract ||\n payload.payloadType === PayloadType.VersionedSmartContract\n ) {\n return { type: \"contract-deploy\", fees };\n }\n\n return { type: \"token-transfer\", fees };\n}\n",
|
|
14
|
+
"import type { Client } from \"../../clients/types.ts\";\nimport { signTransactionWithAccount } from \"../../transactions/signer.ts\";\nimport { signMultiSigWithAccount } from \"../../transactions/multisig.ts\";\nimport { serializeTransactionHex } from \"../../transactions/wire/serialize.ts\";\nimport { deserializeTransaction } from \"../../transactions/wire/deserialize.ts\";\nimport type { StacksTransaction } from \"../../transactions/types.ts\";\nimport { isProviderAccount } from \"./utils.ts\";\n\nexport type SignTransactionParams = {\n transaction: StacksTransaction;\n /** Public keys for multi-sig signing (auto-detected from _multisig metadata if omitted) */\n signers?: string[];\n};\n\n/** Sign a transaction using the client's account */\nexport async function signTransactionAction(\n client: Client,\n params: SignTransactionParams\n): Promise<StacksTransaction> {\n const account = client.account;\n if (!account) throw new Error(\"Account required\");\n\n // Provider: send hex to wallet, get signed hex back\n if (isProviderAccount(account)) {\n const hex = serializeTransactionHex(params.transaction);\n const result = await account.provider.request(\"stx_signTransaction\", {\n transaction: hex,\n });\n return deserializeTransaction(result.transaction);\n }\n\n // Multi-sig: auto-detect from fields or _multisig metadata\n const condition = params.transaction.auth.spendingCondition;\n if (\"fields\" in condition) {\n const publicKeys = params.signers ?? (params.transaction as any)._multisig?.publicKeys;\n if (!publicKeys) throw new Error(\"Multi-sig signing requires signers (publicKeys)\");\n return signMultiSigWithAccount(params.transaction, account, publicKeys);\n }\n\n // Local/Custom: sign with account\n return signTransactionWithAccount(params.transaction, account);\n}\n",
|
|
15
|
+
"import type { Client } from \"../../clients/types.ts\";\nimport type { PostCondition } from \"../../postconditions/types.ts\";\nimport type { IntegerType } from \"../../utils/encoding.ts\";\nimport { buildTokenTransfer } from \"../../transactions/build.ts\";\nimport { signTransactionWithAccount } from \"../../transactions/signer.ts\";\nimport { sendTransaction } from \"./sendTransaction.ts\";\nimport { getNonce } from \"../public/getNonce.ts\";\nimport { estimateFee } from \"../public/estimateFee.ts\";\nimport { isProviderAccount } from \"./utils.ts\";\n\nexport type TransferStxParams = {\n to: string;\n amount: IntegerType;\n memo?: string;\n fee?: IntegerType;\n nonce?: IntegerType;\n postConditionMode?: \"allow\" | \"deny\";\n postConditions?: PostCondition[];\n};\n\n/** Build, sign, and broadcast an STX transfer */\nexport async function transferStx(\n client: Client,\n params: TransferStxParams\n): Promise<string> {\n const account = client.account;\n if (!account) throw new Error(\"Account required\");\n\n // Provider: delegate to wallet\n if (isProviderAccount(account)) {\n const result = await account.provider.request(\"stx_transferStx\", {\n recipient: params.to,\n amount: String(params.amount),\n memo: params.memo,\n });\n return result.txid;\n }\n\n // Local/Custom: build → sign → broadcast\n const nonce =\n params.nonce ?? await getNonce(client, { address: account.address });\n\n const unsigned = buildTokenTransfer({\n recipient: params.to,\n amount: params.amount,\n memo: params.memo,\n fee: params.fee ?? 0n,\n nonce,\n publicKey: account.publicKey,\n chain: client.chain,\n postConditionMode: params.postConditionMode,\n postConditions: params.postConditions,\n });\n\n if (params.fee === undefined) {\n const estimates = await estimateFee(client, { transaction: unsigned });\n const mid = estimates[1] ?? estimates[0];\n if (mid) {\n (unsigned.auth.spendingCondition as any).fee = BigInt(mid.fee);\n }\n }\n\n const signed = await signTransactionWithAccount(unsigned, account);\n const result = await sendTransaction(client, { transaction: signed });\n return result.txid;\n}\n",
|
|
16
|
+
"import type { Client } from \"../../clients/types.ts\";\nimport type { ClarityVersion } from \"../../transactions/types.ts\";\nimport type { PostCondition } from \"../../postconditions/types.ts\";\nimport type { IntegerType } from \"../../utils/encoding.ts\";\nimport { buildContractDeploy } from \"../../transactions/build.ts\";\nimport { signTransactionWithAccount } from \"../../transactions/signer.ts\";\nimport { sendTransaction } from \"./sendTransaction.ts\";\nimport { getNonce } from \"../public/getNonce.ts\";\nimport { estimateFee } from \"../public/estimateFee.ts\";\nimport { isProviderAccount } from \"./utils.ts\";\n\nexport type DeployContractParams = {\n contractName: string;\n codeBody: string;\n clarityVersion?: ClarityVersion;\n fee?: IntegerType;\n nonce?: IntegerType;\n postConditionMode?: \"allow\" | \"deny\";\n postConditions?: PostCondition[];\n};\n\n/** Build, sign, and broadcast a contract deploy */\nexport async function deployContract(\n client: Client,\n params: DeployContractParams\n): Promise<string> {\n const account = client.account;\n if (!account) throw new Error(\"Account required\");\n\n // Provider: delegate to wallet\n if (isProviderAccount(account)) {\n const result = await account.provider.request(\"stx_deployContract\", {\n contractName: params.contractName,\n codeBody: params.codeBody,\n clarityVersion: params.clarityVersion,\n });\n return result.txid;\n }\n\n // Local/Custom: build → sign → broadcast\n const nonce =\n params.nonce ?? await getNonce(client, { address: account.address });\n\n const unsigned = buildContractDeploy({\n contractName: params.contractName,\n codeBody: params.codeBody,\n clarityVersion: params.clarityVersion,\n fee: params.fee ?? 0n,\n nonce,\n publicKey: account.publicKey,\n chain: client.chain,\n postConditionMode: params.postConditionMode,\n postConditions: params.postConditions,\n });\n\n if (params.fee === undefined) {\n const estimates = await estimateFee(client, { transaction: unsigned });\n const mid = estimates[1] ?? estimates[0];\n if (mid) {\n (unsigned.auth.spendingCondition as any).fee = BigInt(mid.fee);\n }\n }\n\n const signed = await signTransactionWithAccount(unsigned, account);\n const result = await sendTransaction(client, { transaction: signed });\n return result.txid;\n}\n",
|
|
17
|
+
"import type { Client } from \"../../clients/types.ts\";\nimport type { ClarityValue } from \"../../clarity/types.ts\";\nimport { Cl } from \"../../clarity/values.ts\";\nimport { serializeCVBytes } from \"../../clarity/serialize.ts\";\nimport { concatBytes, bytesToHex } from \"../../utils/encoding.ts\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { isProviderAccount } from \"./utils.ts\";\n\nexport type SignMessageParams = {\n message: string | ClarityValue;\n domain?: {\n name: string;\n version: string;\n chainId: number;\n };\n};\n\nconst SIP018_PREFIX = new Uint8Array([0x53, 0x49, 0x50, 0x30, 0x31, 0x38]); // \"SIP018\"\n\n/** Sign a structured message per SIP-018 */\nexport async function signMessage(\n client: Client,\n params: SignMessageParams\n): Promise<string> {\n const account = client.account;\n if (!account) throw new Error(\"Account required\");\n\n // Provider: delegate to wallet\n if (isProviderAccount(account)) {\n const method = params.domain\n ? \"stx_signStructuredMessage\"\n : \"stx_signMessage\";\n const result = await account.provider.request(method, {\n message: params.message,\n domain: params.domain,\n });\n return result.signature;\n }\n\n // Local/Custom: sign locally\n const cv =\n typeof params.message === \"string\"\n ? Cl.stringAscii(params.message)\n : params.message;\n\n const serializedMsg = serializeCVBytes(cv);\n\n let hash: Uint8Array;\n\n if (params.domain) {\n const domainCV = Cl.tuple({\n name: Cl.stringAscii(params.domain.name),\n version: Cl.stringAscii(params.domain.version),\n \"chain-id\": Cl.uint(params.domain.chainId),\n });\n const serializedDomain = serializeCVBytes(domainCV);\n hash = sha256(concatBytes(SIP018_PREFIX, serializedDomain, serializedMsg));\n } else {\n hash = sha256(serializedMsg);\n }\n\n const sigBytes = await account.sign(hash);\n return bytesToHex(sigBytes);\n}\n",
|
|
18
|
+
"import type { Client } from \"../../clients/types.ts\";\nimport type { IntegerType } from \"../../utils/encoding.ts\";\nimport { intToBigInt } from \"../../utils/encoding.ts\";\nimport {\n AuthType,\n type StacksTransaction,\n type SponsoredAuthorization,\n type SingleSigSpendingCondition,\n} from \"../../transactions/types.ts\";\nimport { createSingleSigSpendingCondition } from \"../../transactions/authorization.ts\";\nimport { signSponsorWithAccount } from \"../../transactions/signer.ts\";\nimport { getNonce } from \"../public/getNonce.ts\";\nimport { estimateFee } from \"../public/estimateFee.ts\";\nimport { isProviderAccount } from \"./utils.ts\";\n\nexport type SponsorTransactionParams = {\n transaction: StacksTransaction;\n fee?: IntegerType;\n nonce?: IntegerType;\n};\n\n/** Sponsor a transaction: set sponsor spending condition, sign as sponsor */\nexport async function sponsorTransaction(\n client: Client,\n params: SponsorTransactionParams\n): Promise<StacksTransaction> {\n const { transaction } = params;\n\n if (transaction.auth.authType !== AuthType.Sponsored) {\n throw new Error(\"Transaction must have sponsored authorization\");\n }\n\n const account = client.account;\n if (!account) throw new Error(\"Account required\");\n if (isProviderAccount(account)) {\n throw new Error(\"Provider accounts cannot sponsor transactions\");\n }\n\n // Resolve sponsor nonce\n const nonce = params.nonce != null\n ? intToBigInt(params.nonce)\n : await getNonce(client, { address: account.address });\n\n // Resolve sponsor fee\n let fee: bigint;\n if (params.fee != null) {\n fee = intToBigInt(params.fee);\n } else {\n const estimates = await estimateFee(client, { transaction });\n const mid = estimates[1] ?? estimates[0];\n fee = mid ? BigInt(mid.fee) : 0n;\n }\n\n // Create sponsor spending condition\n const sponsorCondition = createSingleSigSpendingCondition(\n account.publicKey,\n nonce,\n fee\n );\n\n // Set sponsor spending condition on the tx\n const auth = transaction.auth as SponsoredAuthorization;\n const sponsored: StacksTransaction = {\n ...transaction,\n auth: {\n ...auth,\n sponsorSpendingCondition: sponsorCondition,\n },\n };\n\n // Sign as sponsor\n return signSponsorWithAccount(sponsored, account);\n}\n"
|
|
19
|
+
],
|
|
20
|
+
"mappings": "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",
|
|
21
|
+
"debugId": "611DF286E29AA1A764756E2164756E21",
|
|
22
|
+
"names": []
|
|
23
|
+
}
|