diff --git a/modules/ecash-agora/.eslintrc.js b/modules/ecash-agora/.eslintrc.js
new file mode 100644
--- /dev/null
+++ b/modules/ecash-agora/.eslintrc.js
@@ -0,0 +1,45 @@
+// Copyright (c) 2024 The Bitcoin developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+const headerArray = [
+    {
+        pattern:
+            '^ Copyright \\(c\\) 2[0-9]{3}(-2[0-9]{3})? The Bitcoin developers$',
+        template: ` Copyright (c) ${new Date().getFullYear()} The Bitcoin developers`,
+    },
+    ' Distributed under the MIT software license, see the accompanying',
+    ' file COPYING or http://www.opensource.org/licenses/mit-license.php.',
+];
+
+module.exports = {
+    env: {
+        node: true,
+        commonjs: true,
+        es2021: true,
+        mocha: true,
+    },
+    overrides: [],
+    extends: [
+        'eslint:recommended',
+        'plugin:@typescript-eslint/recommended', // Add TypeScript recommended rules
+    ],
+    parserOptions: {
+        ecmaVersion: 'latest',
+        sourceType: 'module', // If you're using ES modules
+        parser: '@typescript-eslint/parser', // Use the TS parser
+    },
+    plugins: [
+        'header',
+        '@typescript-eslint', // Add the TypeScript plugin
+    ],
+    rules: {
+        'strict': 'error',
+        'header/header': [2, 'line', headerArray, 2],
+        'no-unused-vars': 'off',
+        '@typescript-eslint/no-unused-vars': [
+            'error',
+            { varsIgnorePattern: '^_' },
+        ],
+    },
+};
diff --git a/modules/ecash-agora/eslint.config.js b/modules/ecash-agora/eslint.config.js
deleted file mode 100644
--- a/modules/ecash-agora/eslint.config.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2024 The Bitcoin developers
-// Distributed under the MIT software license, see the accompanying
-// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-// @ts-check
-
-import eslint from '@eslint/js';
-import tseslint from 'typescript-eslint';
-
-export default tseslint.config(
-    eslint.configs.recommended,
-    ...tseslint.configs.recommended,
-    {
-        ignores: ['dist/*'],
-    },
-);
diff --git a/modules/ecash-agora/package-lock.json b/modules/ecash-agora/package-lock.json
--- a/modules/ecash-agora/package-lock.json
+++ b/modules/ecash-agora/package-lock.json
@@ -18,6 +18,7 @@
                 "@types/chai-as-promised": "^7.1.8",
                 "@types/mocha": "^10.0.6",
                 "@types/node": "^20.12.7",
+                "@typescript-eslint/parser": "^7.6.0",
                 "chai": "^4.4.1",
                 "chai-as-promised": "^7.1.1",
                 "eslint-plugin-header": "^3.1.1",
@@ -32,7 +33,7 @@
             }
         },
         "../chronik-client": {
-            "version": "0.28.0",
+            "version": "1.3.1",
             "license": "MIT",
             "dependencies": {
                 "@types/ws": "^8.2.1",
@@ -65,8 +66,11 @@
             }
         },
         "../ecash-lib": {
-            "version": "0.1.1",
+            "version": "0.2.1",
             "license": "MIT",
+            "dependencies": {
+                "ecashaddrjs": "file:../ecashaddrjs"
+            },
             "devDependencies": {
                 "@istanbuljs/nyc-config-typescript": "^1.0.2",
                 "@types/chai": "^4.3.14",
@@ -1321,6 +1325,7 @@
             "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.6.0.tgz",
             "integrity": "sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==",
             "dev": true,
+            "license": "MIT",
             "dependencies": {
                 "@eslint-community/regexpp": "^4.10.0",
                 "@typescript-eslint/scope-manager": "7.6.0",
@@ -1351,26 +1356,12 @@
                 }
             }
         },
-        "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-            "dev": true,
-            "dependencies": {
-                "yallist": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
         "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
-            "version": "7.6.0",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
-            "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+            "version": "7.6.3",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+            "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
             "dev": true,
-            "dependencies": {
-                "lru-cache": "^6.0.0"
-            },
+            "license": "ISC",
             "bin": {
                 "semver": "bin/semver.js"
             },
@@ -1378,17 +1369,12 @@
                 "node": ">=10"
             }
         },
-        "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-            "dev": true
-        },
         "node_modules/@typescript-eslint/parser": {
             "version": "7.6.0",
             "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.6.0.tgz",
             "integrity": "sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==",
             "dev": true,
+            "license": "BSD-2-Clause",
             "dependencies": {
                 "@typescript-eslint/scope-manager": "7.6.0",
                 "@typescript-eslint/types": "7.6.0",
@@ -1434,6 +1420,7 @@
             "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.6.0.tgz",
             "integrity": "sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==",
             "dev": true,
+            "license": "MIT",
             "dependencies": {
                 "@typescript-eslint/typescript-estree": "7.6.0",
                 "@typescript-eslint/utils": "7.6.0",
@@ -2363,6 +2350,7 @@
             "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz",
             "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==",
             "dev": true,
+            "license": "MIT",
             "peerDependencies": {
                 "eslint": ">=7.7.0"
             }
@@ -5718,28 +5706,10 @@
                 "ts-api-utils": "^1.3.0"
             },
             "dependencies": {
-                "lru-cache": {
-                    "version": "6.0.0",
-                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-                    "dev": true,
-                    "requires": {
-                        "yallist": "^4.0.0"
-                    }
-                },
                 "semver": {
-                    "version": "7.6.0",
-                    "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
-                    "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-                    "dev": true,
-                    "requires": {
-                        "lru-cache": "^6.0.0"
-                    }
-                },
-                "yallist": {
-                    "version": "4.0.0",
-                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "version": "7.6.3",
+                    "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+                    "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
                     "dev": true
                 }
             }
@@ -6353,6 +6323,7 @@
                 "@types/node": "^20.12.7",
                 "chai": "^5.1.0",
                 "chronik-client": "file:../chronik-client",
+                "ecashaddrjs": "file:../ecashaddrjs",
                 "eslint-plugin-header": "^3.1.1",
                 "mocha": "^10.4.0",
                 "mocha-junit-reporter": "^2.2.1",
diff --git a/modules/ecash-agora/package.json b/modules/ecash-agora/package.json
--- a/modules/ecash-agora/package.json
+++ b/modules/ecash-agora/package.json
@@ -32,6 +32,7 @@
         "@types/chai-as-promised": "^7.1.8",
         "@types/mocha": "^10.0.6",
         "@types/node": "^20.12.7",
+        "@typescript-eslint/parser": "^7.6.0",
         "chai": "^4.4.1",
         "chai-as-promised": "^7.1.1",
         "eslint-plugin-header": "^3.1.1",
diff --git a/modules/ecash-agora/src/agora.ts b/modules/ecash-agora/src/agora.ts
--- a/modules/ecash-agora/src/agora.ts
+++ b/modules/ecash-agora/src/agora.ts
@@ -222,7 +222,7 @@
                         ...params.extraOutputs,
                     ],
                 });
-            case 'PARTIAL':
+            case 'PARTIAL': {
                 if (params.acceptedTokens === undefined) {
                     throw new Error(
                         'Must set acceptedTokens for partial offers',
@@ -309,6 +309,7 @@
                 txBuild.outputs.push(...params.extraOutputs);
                 txBuild.locktime = agoraPartial.enforcedLockTime;
                 return txBuild;
+            }
             default:
                 throw new Error('Not implemented');
         }
diff --git a/modules/ecash-agora/tests/partial.locktime.test.ts b/modules/ecash-agora/tests/partial.locktime.test.ts
--- a/modules/ecash-agora/tests/partial.locktime.test.ts
+++ b/modules/ecash-agora/tests/partial.locktime.test.ts
@@ -11,7 +11,6 @@
     DEFAULT_DUST_LIMIT,
     Ecc,
     P2PKHSignatory,
-    SLP_FUNGIBLE,
     Script,
     TxBuilder,
     TxBuilderInput,
@@ -20,13 +19,11 @@
     fromHex,
     initWasm,
     shaRmd160,
-    slpSend,
     toHex,
 } from 'ecash-lib';
 import { TestRunner } from 'ecash-lib/dist/test/testRunner.js';
 
 import { AgoraPartial, AgoraPartialSignatory } from '../src/partial.js';
-import { makeSlpOffer, takeSlpOffer } from './partial-helper-slp.js';
 import { Agora, AgoraOffer } from '../src/agora.js';
 import { makeAlpGenesis } from './partial-helper-alp.js';
 
@@ -52,12 +49,10 @@
     let makerPk: Uint8Array;
     let makerPkh: Uint8Array;
     let makerScript: Script;
-    let makerScriptHex: string;
     let takerSk: Uint8Array;
     let takerPk: Uint8Array;
     let takerPkh: Uint8Array;
     let takerScript: Script;
-    let takerScriptHex: string;
 
     async function makeBuilderInputs(
         values: number[],
@@ -89,12 +84,10 @@
         makerPk = ecc.derivePubkey(makerSk);
         makerPkh = shaRmd160(makerPk);
         makerScript = Script.p2pkh(makerPkh);
-        makerScriptHex = toHex(makerScript.bytecode);
         takerSk = fromHex('44'.repeat(32));
         takerPk = ecc.derivePubkey(takerSk);
         takerPkh = shaRmd160(takerPk);
         takerScript = Script.p2pkh(takerPkh);
-        takerScriptHex = toHex(takerScript.bytecode);
     });
 
     after(() => {
@@ -181,7 +174,9 @@
 
         const agora = new Agora(chronik);
         const offers: (AgoraOffer & { variant: { type: 'PARTIAL' } })[] =
-            (await agora.activeOffersByTokenId(tokenId)) as any;
+            (await agora.activeOffersByTokenId(tokenId)) as (AgoraOffer & {
+                variant: { type: 'PARTIAL' };
+            })[];
         expect(offers.length).to.equal(3);
 
         const offersLocktime1 = offers.filter(
diff --git a/modules/ecash-agora/tests/partial.slp.bigsats.test.ts b/modules/ecash-agora/tests/partial.slp.bigsats.test.ts
--- a/modules/ecash-agora/tests/partial.slp.bigsats.test.ts
+++ b/modules/ecash-agora/tests/partial.slp.bigsats.test.ts
@@ -11,14 +11,12 @@
     Ecc,
     P2PKHSignatory,
     SLP_FUNGIBLE,
-    SLP_LOKAD_ID,
     Script,
     TxBuilderInput,
     fromHex,
     initWasm,
     shaRmd160,
     slpSend,
-    strToBytes,
     toHex,
 } from 'ecash-lib';
 import { TestRunner } from 'ecash-lib/dist/test/testRunner.js';