stxer 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stxer.esm.js","sources":["../src/index.ts"],"sourcesContent":["import { type AccountDataResponse, getNodeInfo, richFetch } from 'ts-clarity';\nimport type { Block } from '@stacks/stacks-blockchain-api-types';\nimport { StacksMainnet } from '@stacks/network';\nimport {\n AnchorMode,\n type ClarityValue,\n PostConditionMode,\n type StacksTransaction,\n bufferCV,\n contractPrincipalCV,\n makeUnsignedContractCall,\n makeUnsignedContractDeploy,\n makeUnsignedSTXTokenTransfer,\n serializeCV,\n stringAsciiCV,\n tupleCV,\n uintCV,\n} from '@stacks/transactions';\nimport { c32addressDecode } from 'c32check';\n\n// current beta api endpoint\nconst SIMULATION_API_ENDPOINT = 'https://api.stxer.xyz/simulations';\n\nfunction runTx(tx: StacksTransaction) {\n // type 0: run transaction\n return tupleCV({ type: uintCV(0), data: bufferCV(tx.serialize()) });\n}\n\nexport interface SimulationEval {\n contract_id: string;\n code: string;\n}\n\nexport function runEval({ contract_id, code }: SimulationEval) {\n const [contract_address, contract_name] = contract_id.split('.');\n // type 1: eval arbitrary code inside a contract\n return tupleCV({\n type: uintCV(1),\n data: bufferCV(\n serializeCV(\n tupleCV({\n contract: contractPrincipalCV(contract_address, contract_name),\n code: stringAsciiCV(code),\n })\n )\n ),\n });\n}\n\nexport async function runSimulation(\n block_hash: string,\n block_height: number,\n txs: (StacksTransaction | SimulationEval)[]\n) {\n const body = Buffer.concat([\n Buffer.from('sim-v1'),\n Buffer.alloc(8),\n Buffer.from(\n block_hash.startsWith('0x') ? block_hash.substring(2) : block_hash,\n 'hex'\n ),\n ...txs\n .map((t) => {\n return 'contract_id' in t && 'code' in t ? runEval(t) : runTx(t);\n })\n .map((t) => serializeCV(t)),\n ]);\n body.writeBigUInt64BE(BigInt(block_height), 6);\n const rs = await fetch(SIMULATION_API_ENDPOINT, {\n method: 'POST',\n body,\n }).then(async (rs) => {\n const response = await rs.text();\n if (!response.startsWith('{')) {\n throw new Error(`failed to submit simulation: ${response}`);\n }\n // console.log(response);\n return JSON.parse(response) as { id: string };\n });\n return rs.id;\n}\n\nexport class SimulationBuilder {\n public static new() {\n return new SimulationBuilder();\n }\n // biome-ignore lint/style/useNumberNamespace: <explanation>\n private block = NaN;\n private sender = '';\n private steps: (\n | {\n // contract call\n contract_id: string;\n function_name: string;\n function_args?: ClarityValue[];\n sender: string;\n fee: number;\n }\n | {\n // contract deploy\n contract_name: string;\n source_code: string;\n deployer: string;\n fee: number;\n }\n | {\n // STX transfer\n recipient: string;\n amount: number;\n sender: string;\n fee: number;\n }\n | SimulationEval\n )[] = [];\n\n public useBlockHeight(block: number) {\n this.block = block;\n return this;\n }\n public withSender(address: string) {\n this.sender = address;\n return this;\n }\n public addSTXTransfer(params: {\n recipient: string;\n amount: number;\n sender?: string;\n fee?: number;\n }) {\n if (params.sender == null && this.sender === '') {\n throw new Error(\n 'Please specify a sender with useSender or adding a sender paramenter'\n );\n }\n this.steps.push({\n ...params,\n sender: params.sender ?? this.sender,\n fee: params.fee ?? 0,\n });\n return this;\n }\n public addContractCall(params: {\n contract_id: string;\n function_name: string;\n function_args?: ClarityValue[];\n sender?: string;\n fee?: number;\n }) {\n if (params.sender == null && this.sender === '') {\n throw new Error(\n 'Please specify a sender with useSender or adding a sender paramenter'\n );\n }\n this.steps.push({\n ...params,\n sender: params.sender ?? this.sender,\n fee: params.fee ?? 0,\n });\n return this;\n }\n public addContractDeploy(params: {\n contract_name: string;\n source_code: string;\n deployer?: string;\n fee?: number;\n }) {\n if (params.deployer == null && this.sender === '') {\n throw new Error(\n 'Please specify a deployer with useSender or adding a deployer paramenter'\n );\n }\n this.steps.push({\n ...params,\n deployer: params.deployer ?? this.sender,\n fee: params.fee ?? 0,\n });\n return this;\n }\n public addEvalCode(inside_contract_id: string, code: string) {\n this.steps.push({\n contract_id: inside_contract_id,\n code,\n });\n return this;\n }\n public addMapRead(contract_id: string, map: string, key: string) {\n this.steps.push({\n contract_id,\n code: `(map-get ${map} ${key})`,\n });\n return this;\n }\n public addVarRead(contract_id: string, variable: string) {\n this.steps.push({\n contract_id,\n code: `(var-get ${variable})`,\n });\n return this;\n }\n\n private async getBlockInfo() {\n if (Number.isNaN(this.block)) {\n const { stacks_tip_height } = await getNodeInfo();\n this.block = stacks_tip_height;\n }\n const info: Block = await richFetch(\n `https://api.hiro.so/extended/v1/block/by_height/${this.block}?unanchored=true`\n ).then((r) => r.json());\n if (\n info.height !== this.block ||\n typeof info.hash !== 'string' ||\n !info.hash.startsWith('0x')\n ) {\n throw new Error(\n `failed to get block info for block height ${this.block}`\n );\n }\n return {\n block_height: this.block,\n block_hash: info.hash.substring(2),\n index_block_hash: info.index_block_hash.substring(2),\n };\n }\n\n public async run() {\n console.log(\n `--------------------------------\nThis product can never exist without your support!\n\nWe receive sponsorship funds with:\nSP212Y5JKN59YP3GYG07K3S8W5SSGE4KH6B5STXER\n\nFeedbacks and feature requests are welcome.\nTo get in touch: contact@stxer.xyz\n--------------------------------`\n );\n const block = await this.getBlockInfo();\n console.log(\n `Using block height ${block.block_height} hash 0x${block.block_hash} to run simulation.`\n );\n const txs: (StacksTransaction | SimulationEval)[] = [];\n const nonce_by_address = new Map<string, number>();\n const nextNonce = async (sender: string) => {\n let nonce = nonce_by_address.get(sender);\n if (nonce == null) {\n const url = `https://api.hiro.so/v2/accounts/${sender}?proof=${false}&tip=${\n block.index_block_hash\n }`;\n const account: AccountDataResponse = await richFetch(url).then((r) =>\n r.json()\n );\n nonce_by_address.set(sender, account.nonce + 1);\n return account.nonce;\n }\n nonce_by_address.set(sender, nonce + 1);\n return nonce;\n };\n for (const step of this.steps) {\n if ('sender' in step && 'function_name' in step) {\n const nonce = await nextNonce(step.sender);\n const [contractAddress, contractName] = step.contract_id.split('.');\n const tx = await makeUnsignedContractCall({\n contractAddress,\n contractName,\n functionName: step.function_name,\n functionArgs: step.function_args ?? [],\n nonce,\n network: new StacksMainnet(),\n publicKey: '',\n postConditionMode: PostConditionMode.Allow,\n anchorMode: AnchorMode.Any,\n fee: step.fee,\n });\n tx.auth.spendingCondition.signer = c32addressDecode(step.sender)[1];\n txs.push(tx);\n } else if ('sender' in step && 'recipient' in step) {\n const nonce = await nextNonce(step.sender);\n const tx = await makeUnsignedSTXTokenTransfer({\n recipient: step.recipient,\n amount: step.amount,\n nonce,\n network: new StacksMainnet(),\n publicKey: '',\n anchorMode: AnchorMode.Any,\n fee: step.fee,\n });\n tx.auth.spendingCondition.signer = c32addressDecode(step.sender)[1];\n txs.push(tx);\n } else if ('deployer' in step) {\n const nonce = await nextNonce(step.deployer);\n const tx = await makeUnsignedContractDeploy({\n contractName: step.contract_name,\n codeBody: step.source_code,\n nonce,\n network: new StacksMainnet(),\n publicKey: '',\n postConditionMode: PostConditionMode.Allow,\n anchorMode: AnchorMode.Any,\n fee: step.fee,\n });\n tx.auth.spendingCondition.signer = c32addressDecode(step.deployer)[1];\n txs.push(tx);\n } else if ('code' in step) {\n txs.push(step);\n } else {\n console.log(`Invalid simulation step:`, step);\n }\n }\n const id = await runSimulation(block.block_hash, block.block_height, txs);\n console.log(\n `Simulation will be available at: https://stxer.xyz/simulations/mainnet/${id}`\n );\n return id;\n }\n}\n"],"names":["SIMULATION_API_ENDPOINT","runTx","tx","tupleCV","type","uintCV","data","bufferCV","serialize","runEval","_ref","contract_id","code","_contract_id$split","split","contract_address","contract_name","serializeCV","contract","contractPrincipalCV","stringAsciiCV","runSimulation","_x","_x2","_x3","_runSimulation","apply","arguments","_asyncToGenerator","_regeneratorRuntime","mark","_callee5","block_hash","block_height","txs","body","rs","wrap","_callee5$","_context5","prev","next","Buffer","concat","from","alloc","startsWith","substring","map","t","writeBigUInt64BE","BigInt","fetch","method","then","_ref3","_callee4","response","_callee4$","_context4","text","sent","Error","abrupt","JSON","parse","stop","_x5","id","SimulationBuilder","block","NaN","sender","steps","new","_proto","prototype","useBlockHeight","withSender","address","addSTXTransfer","params","_params$sender","_params$fee","push","_extends","fee","addContractCall","_params$sender2","_params$fee2","addContractDeploy","_params$deployer","_params$fee3","deployer","addEvalCode","inside_contract_id","addMapRead","key","addVarRead","variable","getBlockInfo","_getBlockInfo","_callee","_yield$getNodeInfo","stacks_tip_height","info","_callee$","_context","Number","isNaN","getNodeInfo","richFetch","r","json","height","hash","index_block_hash","run","_run","_callee3","nonce_by_address","nextNonce","_iterator","_step","step","_step$function_args","nonce","_step$contract_id$spl","contractAddress","contractName","_nonce","_tx","_nonce2","_tx2","_callee3$","_context3","console","log","Map","_ref2","_callee2","url","account","_callee2$","_context2","get","set","_x4","_createForOfIteratorHelperLoose","done","value","makeUnsignedContractCall","functionName","function_name","functionArgs","function_args","network","StacksMainnet","publicKey","postConditionMode","PostConditionMode","Allow","anchorMode","AnchorMode","Any","auth","spendingCondition","signer","c32addressDecode","makeUnsignedSTXTokenTransfer","recipient","amount","makeUnsignedContractDeploy","codeBody","source_code"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "stxer",
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "author": "Kyle Fang",
6
+ "main": "dist/index.js",
7
+ "module": "dist/stxer.esm.js",
8
+ "typings": "dist/index.d.ts",
9
+ "files": [
10
+ "dist",
11
+ "src"
12
+ ],
13
+ "husky": {
14
+ "hooks": {
15
+ "pre-commit": "dts lint"
16
+ }
17
+ },
18
+ "prettier": {
19
+ "printWidth": 80,
20
+ "semi": true,
21
+ "singleQuote": true,
22
+ "trailingComma": "es5"
23
+ },
24
+ "jest": {
25
+ "testEnvironment": "node"
26
+ },
27
+ "engines": {
28
+ "node": ">=12"
29
+ },
30
+ "size-limit": [
31
+ {
32
+ "path": "dist/stxer.cjs.production.min.js",
33
+ "limit": "10 KB"
34
+ },
35
+ {
36
+ "path": "dist/stxer.esm.js",
37
+ "limit": "10 KB"
38
+ }
39
+ ],
40
+ "devDependencies": {
41
+ "@size-limit/preset-small-lib": "^11.1.5",
42
+ "@tsconfig/recommended": "^1.0.7",
43
+ "dts-cli": "^2.0.5",
44
+ "husky": "^9.1.6",
45
+ "size-limit": "^11.1.5",
46
+ "tslib": "^2.7.0",
47
+ "typescript": "^5.6.2"
48
+ },
49
+ "dependencies": {
50
+ "@stacks/network": "^6.16.0",
51
+ "@stacks/stacks-blockchain-api-types": "^7.14.1",
52
+ "@stacks/transactions": "^6.16.1",
53
+ "c32check": "^2.0.0",
54
+ "ts-clarity": "^0.0.26"
55
+ },
56
+ "scripts": {
57
+ "analyze": "size-limit --why",
58
+ "build": "dts build",
59
+ "lint": "dts lint",
60
+ "size": "size-limit",
61
+ "start": "dts watch",
62
+ "test": "dts test"
63
+ }
64
+ }
package/src/index.ts ADDED
@@ -0,0 +1,315 @@
1
+ import { type AccountDataResponse, getNodeInfo, richFetch } from 'ts-clarity';
2
+ import type { Block } from '@stacks/stacks-blockchain-api-types';
3
+ import { StacksMainnet } from '@stacks/network';
4
+ import {
5
+ AnchorMode,
6
+ type ClarityValue,
7
+ PostConditionMode,
8
+ type StacksTransaction,
9
+ bufferCV,
10
+ contractPrincipalCV,
11
+ makeUnsignedContractCall,
12
+ makeUnsignedContractDeploy,
13
+ makeUnsignedSTXTokenTransfer,
14
+ serializeCV,
15
+ stringAsciiCV,
16
+ tupleCV,
17
+ uintCV,
18
+ } from '@stacks/transactions';
19
+ import { c32addressDecode } from 'c32check';
20
+
21
+ // current beta api endpoint
22
+ const SIMULATION_API_ENDPOINT = 'https://api.stxer.xyz/simulations';
23
+
24
+ function runTx(tx: StacksTransaction) {
25
+ // type 0: run transaction
26
+ return tupleCV({ type: uintCV(0), data: bufferCV(tx.serialize()) });
27
+ }
28
+
29
+ export interface SimulationEval {
30
+ contract_id: string;
31
+ code: string;
32
+ }
33
+
34
+ export function runEval({ contract_id, code }: SimulationEval) {
35
+ const [contract_address, contract_name] = contract_id.split('.');
36
+ // type 1: eval arbitrary code inside a contract
37
+ return tupleCV({
38
+ type: uintCV(1),
39
+ data: bufferCV(
40
+ serializeCV(
41
+ tupleCV({
42
+ contract: contractPrincipalCV(contract_address, contract_name),
43
+ code: stringAsciiCV(code),
44
+ })
45
+ )
46
+ ),
47
+ });
48
+ }
49
+
50
+ export async function runSimulation(
51
+ block_hash: string,
52
+ block_height: number,
53
+ txs: (StacksTransaction | SimulationEval)[]
54
+ ) {
55
+ const body = Buffer.concat([
56
+ Buffer.from('sim-v1'),
57
+ Buffer.alloc(8),
58
+ Buffer.from(
59
+ block_hash.startsWith('0x') ? block_hash.substring(2) : block_hash,
60
+ 'hex'
61
+ ),
62
+ ...txs
63
+ .map((t) => {
64
+ return 'contract_id' in t && 'code' in t ? runEval(t) : runTx(t);
65
+ })
66
+ .map((t) => serializeCV(t)),
67
+ ]);
68
+ body.writeBigUInt64BE(BigInt(block_height), 6);
69
+ const rs = await fetch(SIMULATION_API_ENDPOINT, {
70
+ method: 'POST',
71
+ body,
72
+ }).then(async (rs) => {
73
+ const response = await rs.text();
74
+ if (!response.startsWith('{')) {
75
+ throw new Error(`failed to submit simulation: ${response}`);
76
+ }
77
+ // console.log(response);
78
+ return JSON.parse(response) as { id: string };
79
+ });
80
+ return rs.id;
81
+ }
82
+
83
+ export class SimulationBuilder {
84
+ public static new() {
85
+ return new SimulationBuilder();
86
+ }
87
+ // biome-ignore lint/style/useNumberNamespace: <explanation>
88
+ private block = NaN;
89
+ private sender = '';
90
+ private steps: (
91
+ | {
92
+ // contract call
93
+ contract_id: string;
94
+ function_name: string;
95
+ function_args?: ClarityValue[];
96
+ sender: string;
97
+ fee: number;
98
+ }
99
+ | {
100
+ // contract deploy
101
+ contract_name: string;
102
+ source_code: string;
103
+ deployer: string;
104
+ fee: number;
105
+ }
106
+ | {
107
+ // STX transfer
108
+ recipient: string;
109
+ amount: number;
110
+ sender: string;
111
+ fee: number;
112
+ }
113
+ | SimulationEval
114
+ )[] = [];
115
+
116
+ public useBlockHeight(block: number) {
117
+ this.block = block;
118
+ return this;
119
+ }
120
+ public withSender(address: string) {
121
+ this.sender = address;
122
+ return this;
123
+ }
124
+ public addSTXTransfer(params: {
125
+ recipient: string;
126
+ amount: number;
127
+ sender?: string;
128
+ fee?: number;
129
+ }) {
130
+ if (params.sender == null && this.sender === '') {
131
+ throw new Error(
132
+ 'Please specify a sender with useSender or adding a sender paramenter'
133
+ );
134
+ }
135
+ this.steps.push({
136
+ ...params,
137
+ sender: params.sender ?? this.sender,
138
+ fee: params.fee ?? 0,
139
+ });
140
+ return this;
141
+ }
142
+ public addContractCall(params: {
143
+ contract_id: string;
144
+ function_name: string;
145
+ function_args?: ClarityValue[];
146
+ sender?: string;
147
+ fee?: number;
148
+ }) {
149
+ if (params.sender == null && this.sender === '') {
150
+ throw new Error(
151
+ 'Please specify a sender with useSender or adding a sender paramenter'
152
+ );
153
+ }
154
+ this.steps.push({
155
+ ...params,
156
+ sender: params.sender ?? this.sender,
157
+ fee: params.fee ?? 0,
158
+ });
159
+ return this;
160
+ }
161
+ public addContractDeploy(params: {
162
+ contract_name: string;
163
+ source_code: string;
164
+ deployer?: string;
165
+ fee?: number;
166
+ }) {
167
+ if (params.deployer == null && this.sender === '') {
168
+ throw new Error(
169
+ 'Please specify a deployer with useSender or adding a deployer paramenter'
170
+ );
171
+ }
172
+ this.steps.push({
173
+ ...params,
174
+ deployer: params.deployer ?? this.sender,
175
+ fee: params.fee ?? 0,
176
+ });
177
+ return this;
178
+ }
179
+ public addEvalCode(inside_contract_id: string, code: string) {
180
+ this.steps.push({
181
+ contract_id: inside_contract_id,
182
+ code,
183
+ });
184
+ return this;
185
+ }
186
+ public addMapRead(contract_id: string, map: string, key: string) {
187
+ this.steps.push({
188
+ contract_id,
189
+ code: `(map-get ${map} ${key})`,
190
+ });
191
+ return this;
192
+ }
193
+ public addVarRead(contract_id: string, variable: string) {
194
+ this.steps.push({
195
+ contract_id,
196
+ code: `(var-get ${variable})`,
197
+ });
198
+ return this;
199
+ }
200
+
201
+ private async getBlockInfo() {
202
+ if (Number.isNaN(this.block)) {
203
+ const { stacks_tip_height } = await getNodeInfo();
204
+ this.block = stacks_tip_height;
205
+ }
206
+ const info: Block = await richFetch(
207
+ `https://api.hiro.so/extended/v1/block/by_height/${this.block}?unanchored=true`
208
+ ).then((r) => r.json());
209
+ if (
210
+ info.height !== this.block ||
211
+ typeof info.hash !== 'string' ||
212
+ !info.hash.startsWith('0x')
213
+ ) {
214
+ throw new Error(
215
+ `failed to get block info for block height ${this.block}`
216
+ );
217
+ }
218
+ return {
219
+ block_height: this.block,
220
+ block_hash: info.hash.substring(2),
221
+ index_block_hash: info.index_block_hash.substring(2),
222
+ };
223
+ }
224
+
225
+ public async run() {
226
+ console.log(
227
+ `--------------------------------
228
+ This product can never exist without your support!
229
+
230
+ We receive sponsorship funds with:
231
+ SP212Y5JKN59YP3GYG07K3S8W5SSGE4KH6B5STXER
232
+
233
+ Feedbacks and feature requests are welcome.
234
+ To get in touch: contact@stxer.xyz
235
+ --------------------------------`
236
+ );
237
+ const block = await this.getBlockInfo();
238
+ console.log(
239
+ `Using block height ${block.block_height} hash 0x${block.block_hash} to run simulation.`
240
+ );
241
+ const txs: (StacksTransaction | SimulationEval)[] = [];
242
+ const nonce_by_address = new Map<string, number>();
243
+ const nextNonce = async (sender: string) => {
244
+ let nonce = nonce_by_address.get(sender);
245
+ if (nonce == null) {
246
+ const url = `https://api.hiro.so/v2/accounts/${sender}?proof=${false}&tip=${
247
+ block.index_block_hash
248
+ }`;
249
+ const account: AccountDataResponse = await richFetch(url).then((r) =>
250
+ r.json()
251
+ );
252
+ nonce_by_address.set(sender, account.nonce + 1);
253
+ return account.nonce;
254
+ }
255
+ nonce_by_address.set(sender, nonce + 1);
256
+ return nonce;
257
+ };
258
+ for (const step of this.steps) {
259
+ if ('sender' in step && 'function_name' in step) {
260
+ const nonce = await nextNonce(step.sender);
261
+ const [contractAddress, contractName] = step.contract_id.split('.');
262
+ const tx = await makeUnsignedContractCall({
263
+ contractAddress,
264
+ contractName,
265
+ functionName: step.function_name,
266
+ functionArgs: step.function_args ?? [],
267
+ nonce,
268
+ network: new StacksMainnet(),
269
+ publicKey: '',
270
+ postConditionMode: PostConditionMode.Allow,
271
+ anchorMode: AnchorMode.Any,
272
+ fee: step.fee,
273
+ });
274
+ tx.auth.spendingCondition.signer = c32addressDecode(step.sender)[1];
275
+ txs.push(tx);
276
+ } else if ('sender' in step && 'recipient' in step) {
277
+ const nonce = await nextNonce(step.sender);
278
+ const tx = await makeUnsignedSTXTokenTransfer({
279
+ recipient: step.recipient,
280
+ amount: step.amount,
281
+ nonce,
282
+ network: new StacksMainnet(),
283
+ publicKey: '',
284
+ anchorMode: AnchorMode.Any,
285
+ fee: step.fee,
286
+ });
287
+ tx.auth.spendingCondition.signer = c32addressDecode(step.sender)[1];
288
+ txs.push(tx);
289
+ } else if ('deployer' in step) {
290
+ const nonce = await nextNonce(step.deployer);
291
+ const tx = await makeUnsignedContractDeploy({
292
+ contractName: step.contract_name,
293
+ codeBody: step.source_code,
294
+ nonce,
295
+ network: new StacksMainnet(),
296
+ publicKey: '',
297
+ postConditionMode: PostConditionMode.Allow,
298
+ anchorMode: AnchorMode.Any,
299
+ fee: step.fee,
300
+ });
301
+ tx.auth.spendingCondition.signer = c32addressDecode(step.deployer)[1];
302
+ txs.push(tx);
303
+ } else if ('code' in step) {
304
+ txs.push(step);
305
+ } else {
306
+ console.log(`Invalid simulation step:`, step);
307
+ }
308
+ }
309
+ const id = await runSimulation(block.block_hash, block.block_height, txs);
310
+ console.log(
311
+ `Simulation will be available at: https://stxer.xyz/simulations/mainnet/${id}`
312
+ );
313
+ return id;
314
+ }
315
+ }