Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@
/.yarn/plugins/**/* binary
/.yarn/releases/* binary
/.pnp.* binary linguist-generated
./nix/pkgs/onchain-interactions/yarn-manifest.generated.nix linguist-generated
205 changes: 205 additions & 0 deletions .yarn/plugins/@yarnpkg/plugin-yarnpnp2nix.cjs

Large diffs are not rendered by default.

9 changes: 8 additions & 1 deletion .yarnrc.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
checksumBehavior: ignore
checksumBehavior: update

plugins:
- checksum: 2ed3d777072e2e1466f393a34f237f4d340a37d0dc00d7db1218d9266df77206808ed744ad1901fa586cc9fa3b76896bbc87931a5ff8c110271f3c72f4adee6f
path: .yarn/plugins/@yarnpkg/plugin-yarnpnp2nix.cjs
spec: "https://raw.githubusercontent.com/blocksense-network/yarnpnp2nix/master/plugin/dist/plugin-yarnpnp2nix.js"

yarnpnp2nixManifestPath: ./nix/pkgs/onchain-interactions/yarn-manifest.generated.nix

logFilters:
# https://yarnpkg.com/advanced/error-codes
Expand Down
33 changes: 32 additions & 1 deletion flake.lock

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

6 changes: 6 additions & 0 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@
};
nix2container.follows = "mcl-blockchain/nix2container";
mk-shell-bin.url = "github:rrbutani/nix-mk-shell-bin";
yarnpnp2nix = {
url = "github:blocksense-network/yarnpnp2nix";
inputs.nixpkgs.follows = "nixpkgs";
inputs.flake-compat.follows = "mcl-blockchain/nixos-modules/flake-compat";
inputs.utils.follows = "mcl-blockchain/nixos-modules/flake-utils";
};
blama = {
url = "github:blocksense-network/blama";
flake = false;
Expand Down
133 changes: 133 additions & 0 deletions libs/ts/onchain-interactions/build.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
#!/usr/bin/env node
import { execSync } from 'child_process';
import { readFileSync, writeFileSync, mkdirSync, chmodSync } from 'fs';
import { join } from 'path';

const scripts = [
{ src: 'balance-script', bin: 'balance-script' },
{ src: 'check-pending-tx', bin: 'check-pending-tx' },
{ src: 'cost-calculations', bin: 'cost-calculations' },
{ src: 'unstuck-transaction', bin: 'unstuck-transaction' }
];

const outDir = 'dist/scripts';

// Determine build mode
const useEsbuild = process.env.USE_ESBUILD === 'true' || process.env.NIX_BUILD === 'true';
const format = process.env.BUILD_FORMAT || (useEsbuild ? 'cjs' : 'esm');

console.log(`[onchain-interactions] Building with ${useEsbuild ? 'esbuild' : 'tsc'} (format: ${format})...`);

// Create output directory
mkdirSync(outDir, { recursive: true });

if (useEsbuild) {
// Esbuild approach - better for Nix and production
for (const script of scripts) {
console.log(`[onchain-interactions] Building ${script.src}...`);

// Use yarn to run esbuild if not in Nix environment
const esbuildCmd = process.env.NIX_BUILD === 'true' ? 'esbuild' : 'yarn esbuild';
const cmd = [
esbuildCmd,
`src/scripts/${script.src}.ts`,
'--bundle',
'--platform=node',
'--target=node18',
`--format=${format}`,
`--outfile=${outDir}/${script.bin}.js`,
'--external:prom-client',
'--external:web3',
'--external:viem',
'--external:yargs',
'--external:yargs/helpers',
'--external:axios',
'--external:dotenv',
'--external:express',
'--external:@blocksense/contracts',
'--external:@blocksense/base-utils',
'--external:@blocksense/base-utils/*',
'--external:chalk',
'--external:zod',
'--minify-whitespace',
'--keep-names'
].join(' ');

try {
execSync(cmd, { stdio: 'inherit' });

// Add shebang and fix imports
let content = readFileSync(`${outDir}/${script.bin}.js`, 'utf8');

// Add shebang if not present
if (!content.startsWith('#!')) {
content = `#!/usr/bin/env node\n${content}`;
}

// Fix web3 import interop for CommonJS
if (format === 'cjs') {
content = content.replace(/import_web3\.default/g, 'import_web3.Web3');
content = content.replace(/new import_web3\(/g, 'new import_web3.Web3(');
}

writeFileSync(`${outDir}/${script.bin}.js`, content);
chmodSync(`${outDir}/${script.bin}.js`, 0o755);

} catch (error) {
console.error(`Error building ${script.src}:`, error.message);
process.exit(1);
}
}
} else {
// TypeScript compiler approach - for development
console.log('[onchain-interactions] Compiling with TypeScript...');

try {
// Use yarn to run tsc if not in Nix environment
const tscCommand = process.env.NIX_BUILD === 'true' ? 'tsc -p tsconfig.json' : 'yarn tsc -p tsconfig.json';
execSync(tscCommand, { stdio: 'inherit' });

// Add shebangs to compiled files
for (const script of scripts) {
const filePath = `${outDir}/${script.bin}.js`;
let content = readFileSync(filePath, 'utf8');

if (!content.startsWith('#!')) {
content = `#!/usr/bin/env node\n${content}`;
writeFileSync(filePath, content);
}

chmodSync(filePath, 0o755);
}
} catch (error) {
console.error('TypeScript compilation failed:', error.message);
process.exit(1);
}
}

// Update package.json for CommonJS builds
if (format === 'cjs') {
const packageJson = JSON.parse(readFileSync('package.json', 'utf8'));

// Save original type if present
if (packageJson.type && !packageJson._originalType) {
packageJson._originalType = packageJson.type;
}

// Remove type: module for CommonJS builds
delete packageJson.type;

writeFileSync('package.json', JSON.stringify(packageJson, null, 2));
console.log('[onchain-interactions] Updated package.json for CommonJS');
} else if (process.env.RESTORE_PACKAGE_JSON === 'true') {
// Restore original package.json
const packageJson = JSON.parse(readFileSync('package.json', 'utf8'));
if (packageJson._originalType) {
packageJson.type = packageJson._originalType;
delete packageJson._originalType;
writeFileSync('package.json', JSON.stringify(packageJson, null, 2));
console.log('[onchain-interactions] Restored package.json');
}
}

console.log('[onchain-interactions] Build completed!');
16 changes: 13 additions & 3 deletions libs/ts/onchain-interactions/package.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
{
"name": "@blocksense/onchain-interactions",
"type": "module",
"scripts": {
"ts": "yarn node --import tsx --no-deprecation",
"get-wallets-balances": "yarn ts src/scripts/balance-script.ts",
"calculate-cost": "FORCE_COLOR=1 yarn ts src/scripts/cost-calculations.ts \"$@\" | tee cost-calculations.log",
"unstuck-transaction": "yarn ts src/scripts/unstuck-transaction.ts",
"check-pending-tx": "yarn ts src/scripts/check-pending-tx.ts"
"check-pending-tx": "yarn ts src/scripts/check-pending-tx.ts",
"build": "node build.mjs",
"build:tsc": "tsc -p tsconfig.json",
"prepublishOnly": "npm run build"
},
"bin": {
"onchain-calculate-cost": "./dist/scripts/cost-calculations.js",
"onchain-check-pending-tx": "./dist/scripts/check-pending-tx.js",
"onchain-get-wallets-balances": "./dist/scripts/balance-script.js",
"onchain-unstuck-transaction": "./dist/scripts/unstuck-transaction.js"
},
"dependencies": {
"@blocksense/base-utils": "workspace:*",
Expand All @@ -24,6 +32,8 @@
"@types/express": "^5",
"@types/yargs": "^17.0.33",
"@vitest/coverage-v8": "^3.2.4",
"esbuild": "^0.25.0",
"tsx": "^4.20.5"
}
},
"_originalType": "module"
}
11 changes: 11 additions & 0 deletions nix/pkgs/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
pkgs,
inputs',
self',
config,
system,
...
}:
let
Expand Down Expand Up @@ -50,6 +52,12 @@

# Blama
blama = pkgs.callPackage ./blama { blama-src = inputs.blama.outPath; };

# Onchain Interactions
yarn-packages = pkgs.callPackage ./onchain-interactions {
inherit (inputs.yarnpnp2nix.lib.${system}) mkYarnPackagesFromManifest;
};
onchain-interactions = yarn-packages."@blocksense/onchain-interactions@workspace:libs/ts/onchain-interactions";
in
{
apps = {
Expand All @@ -65,6 +73,9 @@
inherit blama;
};
legacyPackages = {
inherit yarn-packages;
inherit onchain-interactions;

oracle-scripts = {
cex-price-feeds = mkOracleScript "cex-price-feeds";
exsat-holdings = mkOracleScript "exsat-holdings";
Expand Down
Loading
Loading