Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/140 track status of reveal and reclaim transactions #31

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions deploy-dev.sh
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,6 @@ printf "Finished....\n"
printf "\n-----------------------------------------------------------------------------------------------------\n";

exit 0;

# docker rm -f bridge_api
# docker run -t -i --name bridge_api -p 3010:3010 -e TARGET_ENV='development' -e btcRpcUser=${BTC_RPC_USER} -e btcRpcPwd=${BTC_RPC_PWD} -e btcNode=${BTC_NODE} -e mongoDbUrl=${MONGO_SBTC_URL} -e mongoDbName=${MONGO_SBTC_DBNAME} -e mongoUser=${MONGO_SBTC_USER} -e mongoPwd=${MONGO_SBTC_PWD} mijoco/bridge_api
8 changes: 4 additions & 4 deletions sbtc-bridge-api/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion sbtc-bridge-api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@
"morgan": "^1.10.0",
"node-cron": "^3.0.2",
"node-fetch": "^2.6.9",
"sbtc-bridge-lib": "^1.0.1",
"sbtc-bridge-lib": "^1.0.11",
"swagger-ui-express": "^4.6.2",
"tsoa": "^5.1.1",
"uninstall": "^0.0.0"
Expand Down
2 changes: 1 addition & 1 deletion sbtc-bridge-api/src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { serve, setup } from 'swagger-ui-express';
import { sbtcEventJob, peginRequestJob, revealCheckJob } from './controllers/JobScheduler.js';
import cors from "cors";
import { connect } from './lib/data/db_models.js'
import { MAGIC_BYTES_TESTNET } from 'sbtc-bridge-lib/src/index'
import { MAGIC_BYTES_TESTNET } from 'sbtc-bridge-lib'

const app = express();
app.use(express.json());
Expand Down
5 changes: 2 additions & 3 deletions sbtc-bridge-api/src/controllers/StacksRPCController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ import { indexSbtcEvent, findSbtcEvents, fetchNoArgsReadOnly, saveSbtcEvents, sa
import { savePeginCommit, scanPeginCommitTransactions, scanPeginRRTransactions } from '../lib/bitcoin/rpc_commit.js';
import { getBlockCount } from "../lib/bitcoin/rpc_blockchain.js";
import { validateAddress } from "../lib/bitcoin/rpc_wallet.js";
import type { PeginRequestI } from '../types/pegin_request.js';
import { findPeginRequestById, findPeginRequestsByFilter } from '../lib/data/db_models.js';
import type { SbtcContractDataI } from 'sbtc-bridge-lib/src/index';
import type { PeginRequestI, SbtcContractDataI } from 'sbtc-bridge-lib';

export interface BalanceI {
balance: number;
Expand All @@ -15,7 +14,7 @@ export interface BalanceI {
export class DepositsController {

public async findPeginRequests(): Promise<any> {
const result = await findPeginRequestsByFilter(undefined);
const result = await findPeginRequestsByFilter({ status: {$gt: -1}});
return result;
}

Expand Down
88 changes: 47 additions & 41 deletions sbtc-bridge-api/src/lib/bitcoin/rpc_commit.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { fetchAddressTransactions } from './mempool_api.js';
import { updatePeginRequest, findPeginRequestsByFilter, saveNewPeginRequest } from '../data/db_models.js';
import type { PeginRequestI } from 'sbtc-bridge-lib/src/index'
import type { PeginRequestI } from 'sbtc-bridge-lib'

export async function savePeginCommit(peginRequest:PeginRequestI) {
if (!peginRequest.status || peginRequest.status < 1) peginRequest.status = 1;
Expand Down Expand Up @@ -47,46 +47,51 @@ async function matchCommitmentIn(txs:Array<any>, peginRequest:PeginRequestI):Pro
* @returns
*/
async function matchRevealOrReclaimIn(txs:Array<any>, peginRequest:PeginRequestI):Promise<number> {
let matchCount = 0;
let matchedTx;
for (const tx of txs) {
console.log('scanPeginCommitTransactions: tx: ', tx);
for (const vout of tx.vout) {
console.log('matchRevealOrReclaimIn: matching: ' + peginRequest.amount + ' to ' + vout.value)
if (peginRequest.fromBtcAddress === vout.scriptpubkey_address) {
// reveal path spent
const up = {
tries: (peginRequest.tries) ? peginRequest.tries + 1 : 1,
status: 3,
reclaim: {
btcTxid: tx.txid,
vout: vout
}
if (tx.txid !== peginRequest.btcTxid) { // filter out the commitment tx
matchedTx = await inspecTx(tx, peginRequest)
}
}
return matchedTx;
}

async function inspecTx(tx:any, peginRequest:PeginRequestI) {
let matchedTx = 0;
console.log('scanPeginCommitTransactions: tx: ', tx);
for (const vout of tx.vout) {
console.log('matchRevealOrReclaimIn: matching: ' + peginRequest.amount + ' to ' + vout.value)
if (peginRequest.fromBtcAddress === vout.scriptpubkey_address) {
// reveal path spent
const up = {
tries: (peginRequest.tries) ? peginRequest.tries + 1 : 1,
status: 3,
reclaim: {
btcTxid: tx.txid,
vout: vout
}
await updatePeginRequest(peginRequest, up);
console.log('matchRevealOrReclaimIn: changes: ', up);
matchCount++;
} else if (peginRequest.sbtcWalletAddress === vout.scriptpubkey_address) {
// reclaim path spent
const up = {
tries: (peginRequest.tries) ? peginRequest.tries + 1 : 1,
status: 3,
reveal: {
btcTxid: tx.txid,
vout: vout
}
}
await updatePeginRequest(peginRequest, up);
console.log('matchRevealOrReclaimIn: changes: ', up);
} else if (peginRequest.sbtcWalletAddress === vout.scriptpubkey_address) {
// reclaim path spent
const up = {
tries: (peginRequest.tries) ? peginRequest.tries + 1 : 1,
status: 3,
reveal: {
btcTxid: tx.txid,
vout: vout
}
await updatePeginRequest(peginRequest, up);
console.log('matchRevealOrReclaimIn: changes: ', up);
matchCount++;
} else {
await updatePeginRequest(peginRequest, { tries: ((peginRequest.tries || 1) + 1) });
console.log('matchRevealOrReclaimIn: saveNewPeginRequest: ', peginRequest);
}
}
await updatePeginRequest(peginRequest, up);
console.log('matchRevealOrReclaimIn: changes: ', up);
} else {
await updatePeginRequest(peginRequest, { tries: ((peginRequest.tries || 1) + 1) });
console.log('matchRevealOrReclaimIn: saveNewPeginRequest: ', peginRequest);
}
}
return matchCount;
return matchedTx;
}

export async function scanPeginCommitTransactions() {
let matchCount = 0;
const filter = { status: 1 };
Expand Down Expand Up @@ -117,20 +122,21 @@ export async function scanPeginRRTransactions() {
const filter = { status: 2 };
try {
const requests:any = await findPeginRequestsByFilter(filter);
console.log('scanPeginRRTransactions: processing: ' + requests);
console.log('scanPeginRRTransactions: processing1: ' + requests);
if (!requests || requests.length === 0) return;
for (const peginRequest of requests) {
console.log('scanPeginRRTransactions: processing: ', peginRequest);
if (peginRequest.commitTxScript.vout) {
const address = peginRequest.commitTxScript.vout.scriptpubkey_address;
console.log('scanPeginRRTransactions: processing2: ', peginRequest);
if (peginRequest.vout) {
const address = peginRequest.vout.scriptpubkey_address;
if (address !== peginRequest.commitTxScript.address) throw new Error('The vout address does not match the address the user spent the commit to?')
try {
const txs:Array<any> = await fetchAddressTransactions(address);
if (txs && txs.length > 0) {
console.log('scanPeginRRTransactions: processing: ' + txs.length + ' from ' + address);
console.log('scanPeginRRTransactions: processing3: ' + txs.length + ' from ' + address);
matchCount += await matchRevealOrReclaimIn(txs, peginRequest);
}
} catch(err:any) {
console.log('scanPeginRRTransactions: processing: ' + err.message);
console.log('scanPeginRRTransactions: processing4: ' + err.message);
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions sbtc-bridge-api/src/lib/bitcoin/rpc_transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import { BASE_URL, OPTIONS } from '../../controllers/BitcoinRPCController.js'
import { getBlock } from './rpc_blockchain.js';
import { fetchTransaction, fetchTransactionHex } from './mempool_api.js';
import { getConfig } from '../config.js';
import { readDepositValue, parseSbtcWalletAddress, parseOutputs } from 'sbtc-bridge-lib/src/index'
import type { payloadType } from 'sbtc-bridge-lib/src/index';
import { readDepositValue, parseOutputs, parseSbtcWalletAddress } from 'sbtc-bridge-lib'
import type { payloadType } from 'sbtc-bridge-lib';

export async function sendRawTxRpc(hex:string) {
const dataString = `{"jsonrpc":"1.0","id":"curltext","method":"sendrawtransaction","params":["${hex}]}`;
Expand Down
17 changes: 13 additions & 4 deletions sbtc-bridge-api/src/lib/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,14 +107,23 @@ export function setConfigOnStart() {
function setOverrides() {
if (isDev() || isLinode()) {
// Not Trust Machines Kit - so override the btc connection params with platform values;
if (process.env.mongoDbUrl) CONFIG.mongoDbUrl = process.env.mongoDbUrl;
if (process.env.mongoDbName) CONFIG.mongoDbName = process.env.mongoDbName;
if (process.env.mongoUser) CONFIG.mongoUser = process.env.mongoUser;
if (process.env.mongoPwd) CONFIG.mongoPwd = process.env.mongoPwd;
if (process.env.btcNode) CONFIG.btcNode = process.env.btcNode;
if (process.env.btcRpcUser) CONFIG.btcRpcUser = process.env.btcRpcUser;
if (process.env.btcRpcPwd) CONFIG.btcRpcPwd = process.env.btcRpcPwd;
}
if (process.env.mongoUser) CONFIG.mongoUser = process.env.mongoUser;
if (process.env.mongoPwd) CONFIG.mongoPwd = process.env.mongoPwd;
if (process.env.mongoDbUrl) CONFIG.mongoDbUrl = process.env.mongoDbUrl;
if (process.env.mongoDbName) CONFIG.mongoDbName = process.env.mongoDbName;
if (isDev()) {
//CONFIG.mongoUser = '';
//CONFIG.mongoPwd = '';
//CONFIG.mongoDbUrl = '';
//CONFIG.mongoDbName = '';
//CONFIG.btcNode = '';
//CONFIG.btcRpcUser = '';
//CONFIG.btcRpcPwd = '';
}
}

function isDev() {
Expand Down
1 change: 0 additions & 1 deletion sbtc-bridge-api/src/lib/data/db_models.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { MongoClient, ServerApiVersion, ObjectId } from 'mongodb';
import type { Collection } from 'mongodb';
import { getConfig } from '../config.js';
import { PeginRequestI } from "$types/pegin_request.js";

let sbtcContractEvent:Collection;
let peginRequest:Collection;
Expand Down
2 changes: 1 addition & 1 deletion sbtc-bridge-api/src/lib/sbtc_rpc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import fetch from 'node-fetch';
import type { BalanceI } from '../controllers/StacksRPCController.js';
import { findSbtcEventsByFilter, countSbtcEvents, saveNewSbtcEvent } from './data/db_models.js';
import util from 'util'
import type { payloadType, SbtcContractDataI } from 'sbtc-bridge-lib/src/index';
import type { payloadType, SbtcContractDataI } from 'sbtc-bridge-lib';

const limit = 10;

Expand Down
2 changes: 1 addition & 1 deletion sbtc-bridge-api/src/lib/structured-data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { tupleCV, bufferCV, uintCV, stringAsciiCV } from "micro-stacks/clarity";
import { getConfig } from './config.js';
import { verifyMessageSignature } from "micro-stacks/connect";
import { hexToBytes } from "micro-stacks/common";
import type { Message } from 'sbtc-bridge-lib/src/index'
import type { Message } from 'sbtc-bridge-lib'

const prefix = Uint8Array.from([0x53, 0x49, 0x50, 0x30, 0x31, 0x38]); // SIP018

Expand Down
2 changes: 1 addition & 1 deletion sbtc-bridge-api/src/routes/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import express from "express";
import { TransactionController, BlocksController, DefaultController, WalletController } from "../controllers/BitcoinRPCController.js";
import { SbtcWalletController, DepositsController } from "../controllers/StacksRPCController.js";
import { ConfigController } from "../controllers/ConfigController.js";
import type { PeginRequestI } from '../types/pegin_request.js';
import type { PeginRequestI } from 'sbtc-bridge-lib';

const router = express.Router();

Expand Down
28 changes: 0 additions & 28 deletions sbtc-bridge-api/src/types/pegin_request.ts
Original file line number Diff line number Diff line change
@@ -1,28 +0,0 @@
import type { VoutI, PeginScriptI } from 'sbtc-bridge-lib/src/index'

export type PeginRequestI = {
_id?:string;
status: number;
tries: number;
updated?: number;
amount: number;
mode: string,
requestType:string;
wallet?: string,
btcTxid?: string;
fromBtcAddress: string;
revealPub: string;
reclaimPub: string;
stacksAddress: string;
sbtcWalletAddress: string;
commitTxScript: PeginScriptI;
vout?: VoutI;
reveal?: {
btcTxid: string;
vout: VoutI;
},
reclaim?: {
btcTxid: string;
vout: VoutI;
}
}
4 changes: 2 additions & 2 deletions sbtc-bridge-api/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"compilerOptions": {
"target": "es2017",
"target": "es2020",
"module": "es2020",
"moduleResolution": "node",
"paths": {
Expand All @@ -17,7 +17,7 @@
"resolveJsonModule": true,
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"strict": false,
"types": ["vitest/globals"],
"outDir": "dist",
"experimentalDecorators": true,
Expand Down
Empty file added sbtc-bridge-lib/.npmignore
Empty file.
4 changes: 2 additions & 2 deletions sbtc-bridge-lib/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 5 additions & 3 deletions sbtc-bridge-lib/package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
{
"name": "sbtc-bridge-lib",
"version": "1.0.1",
"version": "1.0.11",
"description": "Library for sBTC Bridge web client and API apps ",
"main": "index.ts",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"type": "module",
"prepublish": "tsc",
"scripts": {
"build": "tsc",
"test": "vitest",
"watch": "vitest watch"
},
Expand Down