Skip to content

Commit e04bf64

Browse files
authored
feat: Stacks 2.1 PoX-2 support in Rosetta (#1339)
* feat: working setup for local krypton stacks-node miner with regtest bitcoind and auto-mining script * feat: detect when stx mining starts for faster krypton stacks-node startup * feat: use stacsk2.1-transition image for krypton debug deployment * feat: update `/extended/v1/debug/broadcast/stack` endpoint to work with PoX-2 * chore: use PoX address decoding code from the WIP @stacks/stacking lib * chore: update Rosetta PoX address parsing function * chore(rosetta): skip extra /v2/info request when constructing stack-stx operation in Stacks 2.1 * feat: option in debug endpoint to use Rosetta to construct and submit Stacking transactions * chore: simplify internal rosetta calls * fix: Rosetta bug where parsing Stacking operations fails when the contract ABI is missing * feat: Rosetta support for parsing PoX-2 contract calls * feat: Rosetta support for parsing new Bitcoin address formats * chore: remove no longer used testing configs and scripts * chore: remove no longer used testing configs and scripts * chore: debug page cleanup * chore: configs for launching Stacks2.1-transition environment, and launching directly into Stacks2.1 * chore: task naming nit * test: initial Stacks2.1 test suite * chore: vscode debugger for 2.1 test suite * ci: run 2.1 tests * ci: possible fix for mapping host.docker.internal on linux * chore: bitcoin address decoding without depending on try/catches for version detection * chore: pin stacks2.1 images to hash * chore: comment fix
1 parent 97fbbd7 commit e04bf64

19 files changed

+1120
-128
lines changed

.github/workflows/ci.yml

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,65 @@ jobs:
345345
flag-name: run-${{ github.job }}
346346
parallel: true
347347

348+
test-2_1:
349+
runs-on: ubuntu-latest
350+
steps:
351+
- uses: actions/checkout@v2
352+
353+
- name: Use Node.js
354+
uses: actions/setup-node@v2
355+
with:
356+
node-version-file: '.nvmrc'
357+
358+
- name: Cache node modules
359+
uses: actions/cache@v2
360+
env:
361+
cache-name: cache-node-modules
362+
with:
363+
path: |
364+
~/.npm
365+
**/node_modules
366+
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
367+
restore-keys: |
368+
${{ runner.os }}-build-${{ env.cache-name }}-
369+
${{ runner.os }}-build-
370+
${{ runner.os }}-
371+
372+
- name: Install deps
373+
run: npm ci --audit=false
374+
375+
- name: Setup env vars
376+
run: echo "STACKS_CORE_EVENT_HOST=http://0.0.0.0" >> $GITHUB_ENV
377+
378+
- name: Setup integration environment
379+
run: |
380+
sudo ufw disable
381+
npm run devenv:deploy:2.1 -- -d
382+
npm run devenv:logs:2.1 -- --no-color &> docker-compose-logs.txt &
383+
384+
- name: Run tests
385+
run: npm run test:2.1
386+
387+
- name: Print integration environment logs
388+
run: cat docker-compose-logs.txt
389+
if: failure()
390+
391+
- name: Teardown integration environment
392+
run: npm run devenv:stop:2.1
393+
if: always()
394+
395+
- name: Upload coverage to Codecov
396+
uses: codecov/codecov-action@v2
397+
if: always()
398+
399+
- name: Upload coverage to Coveralls
400+
uses: coverallsapp/github-action@master
401+
if: always()
402+
with:
403+
github-token: ${{ secrets.github_token }}
404+
flag-name: run-${{ github.job }}
405+
parallel: true
406+
348407
test-rosetta:
349408
runs-on: ubuntu-latest
350409
steps:
@@ -587,6 +646,7 @@ jobs:
587646
runs-on: ubuntu-latest
588647
needs:
589648
- test
649+
- test-2_1
590650
- test-bns
591651
- test-rosetta
592652
- test-rosetta-cli-construction
@@ -605,6 +665,7 @@ jobs:
605665
- lint
606666
- lint-docs
607667
- test
668+
- test-2_1
608669
- test-bns
609670
- test-rosetta
610671
- test-rosetta-cli-construction

.vscode/launch.json

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,46 @@
4848
},
4949
"killBehavior": "polite",
5050
},
51+
{
52+
"type": "node",
53+
"request": "launch",
54+
"name": "Launch: krypton 2.1",
55+
"skipFiles": [
56+
"<node_internals>/**"
57+
],
58+
"runtimeArgs": ["-r", "ts-node/register/transpile-only", "-r", "tsconfig-paths/register"],
59+
"args": ["${workspaceFolder}/src/index.ts"],
60+
"outputCapture": "std",
61+
"internalConsoleOptions": "openOnSessionStart",
62+
"preLaunchTask": "deploy:krypton",
63+
"postDebugTask": "stop:krypton",
64+
"env": {
65+
"STACKS_CHAIN_ID": "0x80000000",
66+
"NODE_ENV": "development",
67+
"TS_NODE_SKIP_IGNORE": "true"
68+
},
69+
"killBehavior": "polite",
70+
},
71+
{
72+
"type": "node",
73+
"request": "launch",
74+
"name": "Launch: krypton 2.1-transition",
75+
"skipFiles": [
76+
"<node_internals>/**"
77+
],
78+
"runtimeArgs": ["-r", "ts-node/register/transpile-only", "-r", "tsconfig-paths/register"],
79+
"args": ["${workspaceFolder}/src/index.ts"],
80+
"outputCapture": "std",
81+
"internalConsoleOptions": "openOnSessionStart",
82+
"preLaunchTask": "deploy:krypton-2.1-transition",
83+
"postDebugTask": "stop:krypton-2.1-transition",
84+
"env": {
85+
"STACKS_CHAIN_ID": "0x80000000",
86+
"NODE_ENV": "development",
87+
"TS_NODE_SKIP_IGNORE": "true"
88+
},
89+
"killBehavior": "polite",
90+
},
5191
{
5292
"type": "node",
5393
"request": "launch",
@@ -172,6 +212,23 @@
172212
"preLaunchTask": "stacks-node:deploy-dev",
173213
"postDebugTask": "stacks-node:stop-dev"
174214
},
215+
{
216+
"type": "node",
217+
"request": "launch",
218+
"name": "Jest: 2.1",
219+
"program": "${workspaceFolder}/node_modules/.bin/jest",
220+
"args": [
221+
"--testTimeout=3600000",
222+
"--runInBand",
223+
"--no-cache",
224+
"--config",
225+
"${workspaceRoot}/tests/jest.config.2.1.js"
226+
],
227+
"outputCapture": "std",
228+
"console": "integratedTerminal",
229+
"preLaunchTask": "deploy:krypton",
230+
"postDebugTask": "stop:krypton"
231+
},
175232
{
176233
"type": "node",
177234
"request": "launch",

.vscode/tasks.json

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,52 @@
2222
},
2323
"presentation": { "echo": true, "reveal": "always", "focus": false, "panel": "dedicated", "clear": false }
2424
},
25+
{
26+
"label": "deploy:krypton",
27+
"type": "shell",
28+
"command": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-krypton.yml up",
29+
"isBackground": true,
30+
"problemMatcher": {
31+
"pattern": { "regexp": ".", "file": 1, "location": 2, "message": 3 },
32+
"background": { "activeOnStart": true, "beginsPattern": ".", "endsPattern": "." }
33+
},
34+
"presentation": { "echo": true, "reveal": "always", "focus": false, "panel": "dedicated", "clear": false }
35+
},
36+
{
37+
"label": "stop:krypton",
38+
"type": "shell",
39+
"command": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-krypton.yml down -v -t 0",
40+
"presentation": {
41+
"echo": true,
42+
"reveal": "silent",
43+
"focus": false,
44+
"panel": "shared",
45+
"clear": false
46+
}
47+
},
48+
{
49+
"label": "deploy:krypton-2.1-transition",
50+
"type": "shell",
51+
"command": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-krypton-2.1-transition.yml up",
52+
"isBackground": true,
53+
"problemMatcher": {
54+
"pattern": { "regexp": ".", "file": 1, "location": 2, "message": 3 },
55+
"background": { "activeOnStart": true, "beginsPattern": ".", "endsPattern": "." }
56+
},
57+
"presentation": { "echo": true, "reveal": "always", "focus": false, "panel": "dedicated", "clear": false }
58+
},
59+
{
60+
"label": "stop:krypton-2.1-transition",
61+
"type": "shell",
62+
"command": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-krypton-2.1-transition.yml down -v -t 0",
63+
"presentation": {
64+
"echo": true,
65+
"reveal": "silent",
66+
"focus": false,
67+
"panel": "shared",
68+
"clear": false
69+
}
70+
},
2571
{
2672
"label": "stacks-node:deploy-follower",
2773
"type": "shell",
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
version: '3.7'
2+
services:
3+
stacks-blockchain:
4+
image: "zone117x/stacks-api-e2e:stacks2.1-transition-dd8f051"
5+
ports:
6+
- "18443:18443"
7+
- "18444:18444"
8+
- "20443:20443"
9+
- "20444:20444"
10+
environment:
11+
MINE_INTERVAL: 2s
12+
STACKS_EVENT_OBSERVER: host.docker.internal:3700
13+
NOP_BLOCKSTACK_DEBUG: 1
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
version: '3.7'
2+
services:
3+
stacks-blockchain:
4+
image: "zone117x/stacks-api-e2e:stacks2.1-dd8f051"
5+
ports:
6+
- "18443:18443"
7+
- "18444:18444"
8+
- "20443:20443"
9+
- "20444:20444"
10+
environment:
11+
MINE_INTERVAL: 2s
12+
STACKS_EVENT_OBSERVER: host.docker.internal:3700
13+
NOP_BLOCKSTACK_DEBUG: 1
14+
extra_hosts:
15+
- "host.docker.internal:host-gateway"

package-lock.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"dev:integrated": "npm run devenv:build && concurrently npm:dev npm:devenv:deploy",
99
"dev:follower": "npm run devenv:build && concurrently npm:dev npm:devenv:follower",
1010
"test": "cross-env NODE_ENV=development jest --config ./tests/jest.config.js --coverage --runInBand",
11+
"test:2.1": "cross-env NODE_ENV=development jest --config ./tests/jest.config.2.1.js --coverage --runInBand",
1112
"test:rosetta": "cross-env NODE_ENV=development jest --config ./tests/jest.config.rosetta.js --coverage --runInBand",
1213
"test:rosetta-cli:data": "cross-env NODE_ENV=development STACKS_CHAIN_ID=0x80000000 jest --config ./tests/jest.config.rosetta-cli-data.js --coverage --runInBand",
1314
"test:rosetta-cli:construction": "cross-env NODE_ENV=development STACKS_CHAIN_ID=0x80000000 jest --config ./tests/jest.config.rosetta-cli-construction.js --coverage --runInBand",
@@ -17,6 +18,7 @@
1718
"test:tokens": "cross-env NODE_ENV=development jest --config ./tests/jest.config.tokens.js --coverage --runInBand",
1819
"test:watch": "cross-env NODE_ENV=development jest --config ./tests/jest.config.js --watch",
1920
"test:integration": "concurrently \"docker-compose -f docker/docker-compose.dev.postgres.yml up\" \"cross-env NODE_ENV=development jest --config ./tests/jest.config.js --no-cache --runInBand; npm run devenv:stop:pg\"",
21+
"test:integration:2.1": "concurrently \"npm:devenv:deploy:2.1\" \"cross-env NODE_ENV=development jest --config ./tests/jest.config.2.1.js --no-cache --runInBand; npm run devenv:stop:2.1\"",
2022
"test:integration:rosetta": "concurrently \"docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-blockchain.yml up\" \"cross-env NODE_ENV=development jest --config ./tests/jest.config.rosetta.js --no-cache --runInBand; npm run devenv:stop\"",
2123
"test:integration:rosetta-cli:data": "concurrently \"docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-blockchain.yml up\" \"cross-env NODE_ENV=development STACKS_CHAIN_ID=0x80000000 jest --config ./tests/jest.config.rosetta-cli-data.js --no-cache --runInBand; npm run devenv:stop\"",
2224
"test:integration:rosetta-cli:construction": "concurrently \"docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-blockchain.yml up\" \"cross-env NODE_ENV=development STACKS_CHAIN_ID=0x80000000 jest --config ./tests/jest.config.rosetta-cli-construction.js --no-cache --runInBand\"",
@@ -39,8 +41,11 @@
3941
"devenv:deploy": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-blockchain.yml -f docker/docker-compose.dev.bitcoind.yml up",
4042
"devenv:follower": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-blockchain-follower.yml up",
4143
"devenv:stop": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-blockchain.yml -f docker/docker-compose.dev.bitcoind.yml down -v -t 0",
44+
"devenv:deploy:2.1": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-krypton.yml up",
45+
"devenv:stop:2.1": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-krypton.yml down -v -t 0",
4246
"devenv:stop:pg": "docker-compose -f docker/docker-compose.dev.postgres.yml down -v -t 0",
43-
"devenv:logs": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-blockchain.yml -f docker/docker-compose.dev.bitcoind.yml logs -t -f"
47+
"devenv:logs": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-blockchain.yml -f docker/docker-compose.dev.bitcoind.yml logs -t -f",
48+
"devenv:logs:2.1": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-krypton.yml logs -t -f"
4449
},
4550
"repository": {
4651
"type": "git",
@@ -100,6 +105,7 @@
100105
"@promster/express": "6.0.0",
101106
"@promster/server": "6.0.6",
102107
"@promster/types": "3.2.3",
108+
"@scure/base": "1.1.1",
103109
"@stacks/network": "4.4.0-stacks2.1-alpha.0",
104110
"@stacks/stacking": "4.4.0-stacks2.1-alpha.0",
105111
"@stacks/transactions": "4.4.0-stacks2.1-alpha.0",

src/api/rosetta-constants.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,13 @@ export const RosettaSchemas: Record<string, SchemaFiles> = {
476476
},
477477
};
478478

479-
export const enum PoxContractIdentifier {
480-
mainnet = 'SP000000000000000000002Q6VF78.pox',
481-
testnet = 'ST000000000000000000002AMW42H.pox',
482-
}
479+
export const PoxContractIdentifier = {
480+
pox1: {
481+
mainnet: 'SP000000000000000000002Q6VF78.pox',
482+
testnet: 'ST000000000000000000002AMW42H.pox',
483+
},
484+
pox2: {
485+
mainnet: 'SP000000000000000000002Q6VF78.pox-2',
486+
testnet: 'ST000000000000000000002AMW42H.pox-2',
487+
},
488+
} as const;

0 commit comments

Comments
 (0)