From ab98b97eeef5aefc543b4d72090be7a02f8a9462 Mon Sep 17 00:00:00 2001 From: Matthew Little Date: Tue, 9 Apr 2024 17:05:51 +0200 Subject: [PATCH] chore: update to latest stacks image with epoch2.5 bootup, pox-4 test fixes (#1924) * chore: update to latest stacks image with epoch2.5 bootup * chore: upgrade stacks.js * fix: stack-extend increase * test: attempts * fix: stack cycle length * fix: attempt to fix stack extend in gha --------- Co-authored-by: Rafael Cardenas --- .gitpod.yml | 2 +- ...compose.dev.stacks-blockchain-follower.yml | 2 +- .../docker-compose.dev.stacks-blockchain.yml | 2 +- docker/docker-compose.dev.stacks-krypton.yml | 2 +- docker/docker-compose.dev.subnets.yml | 2 +- docker/docker-compose.override.yml | 2 +- docker/docker-compose.yml | 2 +- docker/rosetta.Dockerfile | 2 +- docker/standalone-regtest.Dockerfile | 4 +- package-lock.json | 92 ++++++++++++++++--- package.json | 3 +- src/ec-helpers.ts | 2 +- src/tests-2.5/pox-4-btc-address-formats.ts | 37 ++++++-- src/tests-2.5/pox-4-burnchain-delegate-stx.ts | 6 +- src/tests-2.5/pox-4-stack-extend-increase.ts | 78 +++++++++++++--- stacks-blockchain/docker/Dockerfile | 2 +- 16 files changed, 191 insertions(+), 49 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index ff631dded0..27a6526f9c 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -12,7 +12,7 @@ tasks: - init: npm ci command: npm run dev - openMode: split-right - command: stacks-node start --config=stacks-blockchain/Stacks-dev.toml + command: stacks-node start --config stacks-blockchain/Stacks-dev.toml github: prebuilds: diff --git a/docker/docker-compose.dev.stacks-blockchain-follower.yml b/docker/docker-compose.dev.stacks-blockchain-follower.yml index 7c2f2c0f82..c14f6201d9 100644 --- a/docker/docker-compose.dev.stacks-blockchain-follower.yml +++ b/docker/docker-compose.dev.stacks-blockchain-follower.yml @@ -3,7 +3,7 @@ services: stacks-blockchain: build: context: ../stacks-blockchain/docker - command: stacks-node start --config=/app/config/Stacks-follower.toml + command: stacks-node start --config /app/config/Stacks-follower.toml restart: on-failure environment: STACKS_EVENT_OBSERVER: host.docker.internal:3700 diff --git a/docker/docker-compose.dev.stacks-blockchain.yml b/docker/docker-compose.dev.stacks-blockchain.yml index c64f521581..d61fa5525c 100644 --- a/docker/docker-compose.dev.stacks-blockchain.yml +++ b/docker/docker-compose.dev.stacks-blockchain.yml @@ -1,7 +1,7 @@ version: '3.7' services: stacks-blockchain: - image: 'hirosystems/stacks-api-e2e:stacks3.0-457f270' + image: 'hirosystems/stacks-api-e2e:stacks3.0-1360a17' restart: on-failure environment: STACKS_EVENT_OBSERVER: host.docker.internal:3700 diff --git a/docker/docker-compose.dev.stacks-krypton.yml b/docker/docker-compose.dev.stacks-krypton.yml index c03cea42c6..b51440286f 100644 --- a/docker/docker-compose.dev.stacks-krypton.yml +++ b/docker/docker-compose.dev.stacks-krypton.yml @@ -1,7 +1,7 @@ version: '3.7' services: stacks-blockchain: - image: 'hirosystems/stacks-api-e2e:stacks3.0-457f270' + image: 'hirosystems/stacks-api-e2e:stacks3.0-1360a17' ports: - '18443:18443' # bitcoin regtest JSON-RPC interface - '18444:18444' # bitcoin regtest p2p diff --git a/docker/docker-compose.dev.subnets.yml b/docker/docker-compose.dev.subnets.yml index 30460407fd..de3381cadf 100644 --- a/docker/docker-compose.dev.subnets.yml +++ b/docker/docker-compose.dev.subnets.yml @@ -22,7 +22,7 @@ services: image: "hirosystems/stacks-subnets:7012d22" # build: # dockerfile: ./subnet-node.Dockerfile - command: subnet-node start --config=/app/config/Stacks-subnet.toml + command: subnet-node start --config /app/config/Stacks-subnet.toml ports: - "30443:30443" # subnet-node RPC interface - "30444:30444" # subnet-node p2p diff --git a/docker/docker-compose.override.yml b/docker/docker-compose.override.yml index 77300d346d..617db29de5 100644 --- a/docker/docker-compose.override.yml +++ b/docker/docker-compose.override.yml @@ -1,4 +1,4 @@ version: '3.7' services: stacks-blockchain: - command: stacks-node start --config=/app/config/Stacks-mocknet.toml + command: stacks-node start --config /app/config/Stacks-mocknet.toml diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 7a9b68b6f2..b9a4be63b8 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -14,7 +14,7 @@ services: stacks-blockchain: build: context: ../stacks-blockchain/docker - command: stacks-node start --config=/app/config/Stacks-follower.toml + command: stacks-node start --config /app/config/Stacks-follower.toml restart: on-failure environment: STACKS_EVENT_OBSERVER: stacks-blockchain-api:3700 diff --git a/docker/rosetta.Dockerfile b/docker/rosetta.Dockerfile index 09636a41ff..5fb4204cfc 100644 --- a/docker/rosetta.Dockerfile +++ b/docker/rosetta.Dockerfile @@ -152,7 +152,7 @@ case "${STACKS_NETWORK}" in ;; esac # start stacks-blockchain and store pid -${STACKS_BLOCKCHAIN_DIR}/stacks-node start --config=${STACKS_BLOCKCHAIN_DIR}/${STACKS_NETWORK}-follower-conf.toml 2>&1 & +${STACKS_BLOCKCHAIN_DIR}/stacks-node start --config ${STACKS_BLOCKCHAIN_DIR}/${STACKS_NETWORK}-follower-conf.toml 2>&1 & STACKS_BLOCKCHAIN_PID=$! # start stacks-blockchain-api and store pid diff --git a/docker/standalone-regtest.Dockerfile b/docker/standalone-regtest.Dockerfile index 17c7c6ae94..4b641d1b3f 100644 --- a/docker/standalone-regtest.Dockerfile +++ b/docker/standalone-regtest.Dockerfile @@ -295,7 +295,7 @@ RUN < config.toml - stacks-node start --config=config.toml & + stacks-node start --config config.toml & STACKS_PID=$! while true; do @@ -359,7 +359,7 @@ cat > run.sh <<'EOM' export STACKS_EVENT_OBSERVER="127.0.0.1:3700" envsubst < config.toml.in > config.toml - stacks-node start --config=config.toml & + stacks-node start --config config.toml & STACKS_PID=$! while true; do diff --git a/package-lock.json b/package-lock.json index 538249f37d..98c32b961b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,8 +17,9 @@ "@scure/base": "1.1.1", "@sinclair/typebox": "0.31.28", "@stacks/common": "6.10.0", + "@stacks/encryption": "6.13.1", "@stacks/network": "6.11.3", - "@stacks/stacking": "6.11.3", + "@stacks/stacking": "6.13.1", "@stacks/transactions": "6.11.3", "@types/express-list-endpoints": "4.0.1", "@types/lru-cache": "5.1.1", @@ -2559,14 +2560,14 @@ } }, "node_modules/@stacks/encryption": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.11.3.tgz", - "integrity": "sha512-nUA/21L8NnCw1vPetczWz3fjBCleqRgYfNGJX98AIDs9sjRQkxUfUGYz+3PlbpYgHWHIeRZafitQhMRpVhsbkQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.13.1.tgz", + "integrity": "sha512-y5IFX3/nGI3fCk70gE0JwH70GpshD8RhUfvhMLcL96oNaec1cCdj1ZUiQupeicfYTHuraaVBYU9xLls4TRmypg==", "dependencies": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", "@scure/bip39": "1.1.0", - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "@types/node": "^18.0.4", "base64-js": "^1.5.1", "bs58": "^5.0.0", @@ -2574,10 +2575,19 @@ "varuint-bitcoin": "^1.1.2" } }, + "node_modules/@stacks/encryption/node_modules/@stacks/common": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/common/-/common-6.13.0.tgz", + "integrity": "sha512-wwzyihjaSdmL6NxKvDeayy3dqM0L0Q2sawmdNtzJDi0FnXuJGm5PeapJj7bEfcI9XwI7Bw5jZoC6mCn9nc5YIw==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "@types/node": "^18.0.4" + } + }, "node_modules/@stacks/encryption/node_modules/@types/node": { - "version": "18.19.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.14.tgz", - "integrity": "sha512-EnQ4Us2rmOS64nHDWr0XqAD8DsO6f3XR6lf9UIIrZQpUzPVdN/oPuEzfDWNHSyXLvoGgjuEm/sPwFGSSs35Wtg==", + "version": "18.19.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.29.tgz", + "integrity": "sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==", "dependencies": { "undici-types": "~5.26.4" } @@ -2922,19 +2932,71 @@ } }, "node_modules/@stacks/stacking": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/@stacks/stacking/-/stacking-6.11.3.tgz", - "integrity": "sha512-b9SQ2KO2JFlQ+tnfmrVnmKtFe1b883NvVflKDV88EFOXbFreKjVr1FrRKOOM4x5GxlHDkcsYjgHGHm9hiNxwrg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@stacks/stacking/-/stacking-6.13.1.tgz", + "integrity": "sha512-X0NSV5V0ynOJ2SUymSa6mNVT0K/avplF1KGWNGbBFDXBOvDMYmRCGw6mv1qQDPFx3SR7fRWCajZS3YnR0TwY/g==", "dependencies": { + "@noble/hashes": "1.1.5", "@scure/base": "1.1.1", - "@stacks/common": "^6.10.0", - "@stacks/encryption": "^6.11.3", - "@stacks/network": "^6.11.3", + "@stacks/common": "^6.13.0", + "@stacks/encryption": "^6.13.1", + "@stacks/network": "^6.13.0", "@stacks/stacks-blockchain-api-types": "^0.61.0", - "@stacks/transactions": "^6.11.3", + "@stacks/transactions": "^6.13.1", "bs58": "^5.0.0" } }, + "node_modules/@stacks/stacking/node_modules/@stacks/common": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/common/-/common-6.13.0.tgz", + "integrity": "sha512-wwzyihjaSdmL6NxKvDeayy3dqM0L0Q2sawmdNtzJDi0FnXuJGm5PeapJj7bEfcI9XwI7Bw5jZoC6mCn9nc5YIw==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "@types/node": "^18.0.4" + } + }, + "node_modules/@stacks/stacking/node_modules/@stacks/network": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.13.0.tgz", + "integrity": "sha512-Ss/Da4BNyPBBj1OieM981fJ7SkevKqLPkzoI1+Yo7cYR2df+0FipIN++Z4RfpJpc8ne60vgcx7nJZXQsiGhKBQ==", + "dependencies": { + "@stacks/common": "^6.13.0", + "cross-fetch": "^3.1.5" + } + }, + "node_modules/@stacks/stacking/node_modules/@stacks/transactions": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.13.1.tgz", + "integrity": "sha512-PWw2I+2Fj3CaFYQIoVcqQN6E2qGHNhFv03nuR0CxMq0sx8stPgYZbdzUlnlBcJQdsFiHrw3sPeqnXDZt+Hg5YQ==", + "dependencies": { + "@noble/hashes": "1.1.5", + "@noble/secp256k1": "1.7.1", + "@stacks/common": "^6.13.0", + "@stacks/network": "^6.13.0", + "c32check": "^2.0.0", + "lodash.clonedeep": "^4.5.0" + } + }, + "node_modules/@stacks/stacking/node_modules/@types/node": { + "version": "18.19.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.29.tgz", + "integrity": "sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@stacks/stacking/node_modules/c32check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/c32check/-/c32check-2.0.0.tgz", + "integrity": "sha512-rpwfAcS/CMqo0oCqDf3r9eeLgScRE3l/xHDCXhM3UyrfvIn7PrLq63uHh7yYbv8NzaZn5MVsVhIRpQ+5GZ5HyA==", + "dependencies": { + "@noble/hashes": "^1.1.2", + "base-x": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@stacks/stacks-blockchain-api-types": { "version": "0.61.0", "resolved": "https://registry.npmjs.org/@stacks/stacks-blockchain-api-types/-/stacks-blockchain-api-types-0.61.0.tgz", diff --git a/package.json b/package.json index b4fa0eb110..3985060682 100644 --- a/package.json +++ b/package.json @@ -92,8 +92,9 @@ "@scure/base": "1.1.1", "@sinclair/typebox": "0.31.28", "@stacks/common": "6.10.0", + "@stacks/encryption": "6.13.1", "@stacks/network": "6.11.3", - "@stacks/stacking": "6.11.3", + "@stacks/stacking": "6.13.1", "@stacks/transactions": "6.11.3", "@types/express-list-endpoints": "4.0.1", "@types/lru-cache": "5.1.1", diff --git a/src/ec-helpers.ts b/src/ec-helpers.ts index 672e16d14a..3652ad1a0f 100644 --- a/src/ec-helpers.ts +++ b/src/ec-helpers.ts @@ -209,7 +209,7 @@ function p2trAddressFromKey(args: KeyInputArgs): KeyOutput { return { ecPair, address: pmnt.address }; } -export interface VerboseKeyOutput { +interface VerboseKeyOutput { address: string; wif: string; privateKey: Buffer; diff --git a/src/tests-2.5/pox-4-btc-address-formats.ts b/src/tests-2.5/pox-4-btc-address-formats.ts index 01d467eaf3..74d75a25ef 100644 --- a/src/tests-2.5/pox-4-btc-address-formats.ts +++ b/src/tests-2.5/pox-4-btc-address-formats.ts @@ -1,5 +1,5 @@ import { hexToBuffer, timeout } from '@hirosystems/api-toolkit'; -import { decodeBtcAddress } from '@stacks/stacking'; +import { StackingClient, decodeBtcAddress } from '@stacks/stacking'; import { AddressStxBalanceResponse, BurnchainRewardListResponse, @@ -8,9 +8,11 @@ import { } from '@stacks/stacks-blockchain-api-types'; import { AnchorMode, + StacksPrivateKey, bufferCV, makeContractCall, - randomBytes, + makeRandomPrivKey, + someCV, tupleCV, uintCV, } from '@stacks/transactions'; @@ -27,6 +29,8 @@ import { testEnv, } from '../test-utils/test-helpers'; import { RPCClient } from 'rpc-bitcoin'; +import { hexToBytes } from '@stacks/common'; +import { getPublicKeyFromPrivate } from '@stacks/encryption'; const BTC_PRIVATE_KEY = '0000000000000000000000000000000000000000000000000000000000000002'; @@ -41,7 +45,10 @@ describe.each([P2SH_P2WPKH, P2WPKH, P2WSH, P2TR])( let contractAddress: string; let contractName: string; let ustxAmount: bigint; - const cycleCount = 1; + let stackingClient: StackingClient; + let signerPrivKey: StacksPrivateKey; + let signerPubKey: string; + const cycleCount = 2; const { btcAddr, btcAddrDecoded, btcAddrRegtest, btcDescriptor } = addressSetup(); @@ -95,10 +102,25 @@ describe.each([P2SH_P2WPKH, P2WPKH, P2WSH, P2TR])( cycleBlockLength = cycleCount * poxInfo.reward_cycle_length; [contractAddress, contractName] = poxInfo.contract_id.split('.'); + stackingClient = new StackingClient(account.stacksAddress, testEnv.stacksNetwork); + signerPrivKey = makeRandomPrivKey(); + signerPubKey = getPublicKeyFromPrivate(signerPrivKey.data); + expect(contractName).toBe('pox-4'); }); test('stack-stx tx', async () => { + const signerSig = hexToBytes( + stackingClient.signPoxSignature({ + topic: 'stack-stx', + poxAddress: btcAddr, + rewardCycle: poxInfo.current_cycle.id, + period: cycleCount, + signerPrivateKey: signerPrivKey, + maxAmount: ustxAmount, + authId: 0, + }) + ); // Create and broadcast a `stack-stx` tx const tx = await makeContractCall({ senderKey: account.secretKey, @@ -113,7 +135,10 @@ describe.each([P2SH_P2WPKH, P2WPKH, P2WSH, P2TR])( }), // pox-addr uintCV(burnBlockHeight), // start-burn-ht uintCV(cycleCount), // lock-period - bufferCV(randomBytes(33)), // signer-key + someCV(bufferCV(signerSig)), // signer-sig + bufferCV(hexToBytes(signerPubKey)), // signer-key + uintCV(ustxAmount.toString()), // max-amount + uintCV(0), // auth-id ], network: testEnv.stacksNetwork, anchorMode: AnchorMode.OnChainOnly, @@ -160,7 +185,7 @@ describe.each([P2SH_P2WPKH, P2WPKH, P2WSH, P2TR])( test('stx unlocked - RPC balance', async () => { // Wait until account has unlocked (finished Stacking cycles) const rpcAccount = await testEnv.client.getAccount(account.stacksAddress); - await standByUntilBurnBlock(rpcAccount.unlock_height + 1); + await standByUntilBurnBlock(rpcAccount.unlock_height + poxInfo.reward_phase_block_length); // Check that STX are no longer reported as locked by the RPC endpoints: await timeout(200); // make sure unlock was processed @@ -182,7 +207,7 @@ describe.each([P2SH_P2WPKH, P2WPKH, P2WSH, P2TR])( test('stacking rewards - API', async () => { const slotStart = poxInfo.next_cycle.reward_phase_start_block_height; - const slotEnd = slotStart + 2; // early in the reward phase + const slotEnd = slotStart + 6; // early in the reward phase for the next-next cycle const rewards = await fetchGet( `/extended/v1/burnchain/rewards/${btcAddr}` diff --git a/src/tests-2.5/pox-4-burnchain-delegate-stx.ts b/src/tests-2.5/pox-4-burnchain-delegate-stx.ts index ad27ae7745..befcf4a614 100644 --- a/src/tests-2.5/pox-4-burnchain-delegate-stx.ts +++ b/src/tests-2.5/pox-4-burnchain-delegate-stx.ts @@ -7,10 +7,8 @@ import { } from '@stacks/stacks-blockchain-api-types'; import { AnchorMode, - bufferCV, makeContractCall, makeSTXTokenTransfer, - randomBytes, standardPrincipalCV, uintCV, } from '@stacks/transactions'; @@ -359,8 +357,8 @@ describe('PoX-4 - Stack using Bitcoin-chain delegate ops', () => { '(define-public (delegate-stx (amount-ustx uint) (delegate-to principal) (until-burn-ht (optional uint)) (pox-addr (optional (tuple (hashbytes (buff 32)) (version (buff 1)))))))', function_args: [ { - hex: '0x0100000000000000000007fe8f3d591000', - repr: 'u2250216000000000', + hex: '0x010000000000000000000ffd1e7ab22000', + repr: 'u4500432000000000', name: 'amount-ustx', type: 'uint', }, diff --git a/src/tests-2.5/pox-4-stack-extend-increase.ts b/src/tests-2.5/pox-4-stack-extend-increase.ts index 9bf3f24511..97e1e7bca3 100644 --- a/src/tests-2.5/pox-4-stack-extend-increase.ts +++ b/src/tests-2.5/pox-4-stack-extend-increase.ts @@ -1,7 +1,6 @@ import { testnetKeys } from '../api/routes/debug'; import { CoreRpcPoxInfo } from '../core-rpc/client'; -import { getBitcoinAddressFromKey, privateToPublicKey, VerboseKeyOutput } from '../ec-helpers'; - +import { getBitcoinAddressFromKey, privateToPublicKey } from '../ec-helpers'; import { AddressStxBalanceResponse, BurnchainRewardListResponse, @@ -10,9 +9,11 @@ import { } from '@stacks/stacks-blockchain-api-types'; import { AnchorMode, + StacksPrivateKey, bufferCV, makeContractCall, - randomBytes, + makeRandomPrivKey, + someCV, tupleCV, uintCV, } from '@stacks/transactions'; @@ -25,9 +26,11 @@ import { standByUntilBurnBlock, testEnv, } from '../test-utils/test-helpers'; -import { decodeBtcAddress } from '@stacks/stacking'; +import { decodeBtcAddress, StackingClient } from '@stacks/stacking'; import { hexToBuffer } from '@hirosystems/api-toolkit'; import * as assert from 'assert'; +import { hexToBytes } from '@stacks/common'; +import { getPublicKeyFromPrivate } from '@stacks/encryption'; describe('PoX-4 - Stack extend and increase operations', () => { const account = testnetKeys[1]; @@ -41,7 +44,10 @@ describe('PoX-4 - Stack extend and increase operations', () => { let contractAddress: string; let contractName: string; let ustxAmount: bigint; - const lockPeriod = 1; + let stackingClient: StackingClient; + let signerPrivKey: StacksPrivateKey; + let signerPubKey: string; + const lockPeriod = 3; const btcPrivateKey = '0000000000000000000000000000000000000000000000000000000000000002'; beforeAll(async () => { @@ -60,6 +66,10 @@ describe('PoX-4 - Stack extend and increase operations', () => { version: decodedBtcAddr.version, }).toEqual({ data: '06afd46bcdfd22ef94ac122aa11f241244a37ecc', version: 0 }); + stackingClient = new StackingClient(account.stacksAddress, testEnv.stacksNetwork); + signerPrivKey = makeRandomPrivKey(); + signerPubKey = getPublicKeyFromPrivate(signerPrivKey.data); + // Create a regtest address to use with bitcoind json-rpc since the krypton-stacks-node uses testnet addresses btcAddrRegtest = getBitcoinAddressFromKey({ privateKey: btcPrivateKey, @@ -78,6 +88,8 @@ describe('PoX-4 - Stack extend and increase operations', () => { }); expect(Object.keys(btcWalletAddrs)).toContain(btcAddrRegtest); + await standByForPoxCycle(); + poxInfo = await testEnv.client.getPox(); burnBlockHeight = poxInfo.current_burnchain_block_height as number; @@ -90,7 +102,17 @@ describe('PoX-4 - Stack extend and increase operations', () => { test('stack-stx tx', async () => { const coreBalancePreStackStx = await testEnv.client.getAccount(account.stacksAddress); - + const signerSig = hexToBytes( + stackingClient.signPoxSignature({ + topic: 'stack-stx', + poxAddress: btcAddr, + rewardCycle: poxInfo.current_cycle.id, + period: lockPeriod, + signerPrivateKey: signerPrivKey, + maxAmount: ustxAmount, + authId: 0, + }) + ); // Create and broadcast a `stack-stx` tx const txFee = 10000n; const stackStxTx = await makeContractCall({ @@ -106,7 +128,10 @@ describe('PoX-4 - Stack extend and increase operations', () => { }), // pox-addr uintCV(burnBlockHeight), // start-burn-ht uintCV(lockPeriod), // lock-period, - bufferCV(randomBytes(33)), // signer-key + someCV(bufferCV(signerSig)), // signer-sig + bufferCV(hexToBytes(signerPubKey)), // signer-key + uintCV(ustxAmount.toString()), // max-amount + uintCV(0), // auth-id ], network: testEnv.stacksNetwork, anchorMode: AnchorMode.OnChainOnly, @@ -188,17 +213,34 @@ describe('PoX-4 - Stack extend and increase operations', () => { }); test('stack-increase tx', async () => { + await standByForPoxCycle(); const coreBalancePreIncrease = await testEnv.client.getAccount(account.stacksAddress); - // Create and broadcast a `stack-increase` tx const stackIncreaseAmount = 123n; + const signerSig = hexToBytes( + stackingClient.signPoxSignature({ + topic: 'stack-increase', + poxAddress: btcAddr, + rewardCycle: poxInfo.current_cycle.id + 1, + period: lockPeriod, + signerPrivateKey: signerPrivKey, + maxAmount: ustxAmount + stackIncreaseAmount, + authId: 1, + }) + ); const stackIncreaseTxFee = 10000n; const stackIncreaseTx = await makeContractCall({ senderKey: account.secretKey, contractAddress, contractName, functionName: 'stack-increase', - functionArgs: [uintCV(stackIncreaseAmount)], + functionArgs: [ + uintCV(stackIncreaseAmount.toString()), // increase-by + someCV(bufferCV(signerSig)), // signer-sig + bufferCV(hexToBytes(signerPubKey)), // signer-key + uintCV((ustxAmount + stackIncreaseAmount).toString()), // max-amount + uintCV(1), // auth-id + ], network: testEnv.stacksNetwork, anchorMode: AnchorMode.OnChainOnly, fee: stackIncreaseTxFee, @@ -282,10 +324,21 @@ describe('PoX-4 - Stack extend and increase operations', () => { }); test('stack-extend tx', async () => { + await standByForPoxCycle(); const coreBalancePreStackExtend = await testEnv.client.getAccount(account.stacksAddress); - // Create and broadcast a `stack-extend` tx const extendCycleAmount = 1; + const signerSig = hexToBytes( + stackingClient.signPoxSignature({ + topic: 'stack-extend', + poxAddress: btcAddr, + rewardCycle: poxInfo.current_cycle.id + 2, + period: extendCycleAmount, + signerPrivateKey: signerPrivKey, + maxAmount: 0, + authId: 2, + }) + ); const txFee = 10000n; const stackExtendTx = await makeContractCall({ senderKey: account.secretKey, @@ -298,7 +351,10 @@ describe('PoX-4 - Stack extend and increase operations', () => { hashbytes: bufferCV(decodedBtcAddr.data), version: bufferCV(Buffer.from([decodedBtcAddr.version])), }), // pox-addr - bufferCV(randomBytes(33)), // signer-key + someCV(bufferCV(signerSig)), // signer-sig + bufferCV(hexToBytes(signerPubKey)), // signer-key + uintCV(0), // max-amount + uintCV(2), // auth-id ], network: testEnv.stacksNetwork, anchorMode: AnchorMode.OnChainOnly, diff --git a/stacks-blockchain/docker/Dockerfile b/stacks-blockchain/docker/Dockerfile index f5d5ae2db5..26c7cd69c1 100644 --- a/stacks-blockchain/docker/Dockerfile +++ b/stacks-blockchain/docker/Dockerfile @@ -1,5 +1,5 @@ # Pointed to stacks-blockchain `2.1.0.0.0` git tag -FROM --platform=linux/amd64 hirosystems/stacks-api-e2e:stacks3.0-457f270 as build +FROM --platform=linux/amd64 hirosystems/stacks-api-e2e:stacks3.0-1360a17 as build FROM --platform=linux/amd64 debian:bookworm