{"_id":"@3flabs/guardian-coordinator","_rev":"5-c136c6d36e107042b432edbb26ec362a","name":"@3flabs/guardian-coordinator","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"@3flabs/guardian-coordinator","version":"0.1.0","license":"MIT","_id":"@3flabs/guardian-coordinator@0.1.0","maintainers":[{"name":"maxencerb","email":"maxenceraballand00@gmail.com"}],"homepage":"https://github.com/3FLabs/3f-guardian#readme","bugs":{"url":"https://github.com/3FLabs/3f-guardian/issues"},"bin":{"guardian-coordinator":"dist/cli.js"},"dist":{"shasum":"806bd023f05fbcc0f71219cbb78b05308806cd48","tarball":"https://registry.npmjs.org/@3flabs/guardian-coordinator/-/guardian-coordinator-0.1.0.tgz","fileCount":12,"integrity":"sha512-Shh1d8LQv6BAdpz9t92o5+0EGKhSgeti2YWdWAPLZ8h91wCfItgcCSTexaSRxxPNy4SlXjIIWyvbFeTemDMhmw==","signatures":[{"sig":"MEYCIQCHWyOAahBCrnnes0Zo8oEZW6KLhyRWBjVJQCnxuBjFVAIhAJ3IwHMhZmPmYLWama7v/UcjcOA1D8rVk8uUEeZUW3RY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74000},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"}},"gitHead":"05e8e55f66fbcb536e052f8f2630c6c144cab530","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","start":"bun run src/cli.ts","typecheck":"tsc --noEmit","test:watch":"vitest","build:clean":"rm -rf dist && bun run build"},"_npmUser":{"name":"maxencerb","email":"maxenceraballand00@gmail.com"},"repository":{"url":"git+https://github.com/3FLabs/3f-guardian.git","type":"git","directory":"packages/guardian-coordinator"},"_npmVersion":"11.12.1","description":"Lite in-process coordinator that submits @3flabs/guardian signatures to grunt-api.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"zod":"^4.0.0","viem":"^2.52.2","better-result":"^2.9.2","@3flabs/guardian":"workspace:*","@3flabs/guardian-defaults":"workspace:*"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.8","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/guardian-coordinator_0.1.0_1782133368256_0.9025542743944293","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@3flabs/guardian-coordinator","version":"0.2.0","license":"MIT","_id":"@3flabs/guardian-coordinator@0.2.0","maintainers":[{"name":"maxencerb","email":"maxenceraballand00@gmail.com"}],"homepage":"https://github.com/3FLabs/3f-guardian#readme","bugs":{"url":"https://github.com/3FLabs/3f-guardian/issues"},"bin":{"guardian-coordinator":"dist/cli.js"},"dist":{"shasum":"a661096e74c01208505a135217029bc8bff26d24","tarball":"https://registry.npmjs.org/@3flabs/guardian-coordinator/-/guardian-coordinator-0.2.0.tgz","fileCount":12,"integrity":"sha512-/O4BTq8SmVDg4aHH3mQERlM+MXQcAaGet1fHvx+uT+C+50bs1I1RksS49ljCuw+vY32w/2+XI2FnXqN1JVH2jw==","signatures":[{"sig":"MEUCIQDUSUMgqaq2QjW5AGAwjhCpz6YatzyqZHKoaaFhxA0tOwIgBr7LtDr6M6kLwKhDFX8S7AKGtocF8I45W63U5SJHTxk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@3flabs%2fguardian-coordinator@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":73988},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"}},"gitHead":"ed1bdf49697ffe9cd9113eb98e6066c224797adf","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","start":"bun run src/cli.ts","typecheck":"tsc --noEmit","test:watch":"vitest","build:clean":"rm -rf dist && bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:557e4f08-403c-4324-b298-705e3978a86c"}},"repository":{"url":"git+https://github.com/3FLabs/3f-guardian.git","type":"git","directory":"packages/guardian-coordinator"},"_npmVersion":"11.13.0","description":"Lite in-process coordinator that submits @3flabs/guardian signatures to grunt-api.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"zod":"^4.0.0","viem":"^2.52.2","better-result":"^2.9.2","@3flabs/guardian":"0.5.0","@3flabs/guardian-defaults":"0.3.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.8","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/guardian-coordinator_0.2.0_1782133817172_0.6954925622288113","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@3flabs/guardian-coordinator","version":"0.2.1","description":"Lite in-process coordinator that submits @3flabs/guardian signatures to grunt-api.","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","bin":{"guardian-coordinator":"dist/cli.js"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"}},"publishConfig":{"access":"public","provenance":true},"scripts":{"build":"tsc -p tsconfig.build.json","build:clean":"rm -rf dist && bun run build","start":"bun run src/cli.ts","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest"},"dependencies":{"@3flabs/guardian":"0.5.0","@3flabs/guardian-defaults":"0.3.2","@aws-sdk/client-kms":"^3.1075.0","@google-cloud/kms":"^5.5.1","@noble/curves":"1.9.1","better-result":"^2.9.2","viem":"^2.52.2","zod":"^4.0.0"},"devDependencies":{"typescript":"^5.9.3","vitest":"^4.1.8"},"repository":{"type":"git","url":"git+https://github.com/3FLabs/3f-guardian.git","directory":"packages/guardian-coordinator"},"license":"MIT","sideEffects":false,"gitHead":"f54c2abe347a8d8d1744b54c032618346a792cf5","_id":"@3flabs/guardian-coordinator@0.2.1","bugs":{"url":"https://github.com/3FLabs/3f-guardian/issues"},"homepage":"https://github.com/3FLabs/3f-guardian#readme","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-DqoHl00knZj4r/OCCONDaWQcA1LC7t6nwAc/6jeaoYrgrkINRJcjpKCmfSiIiiKExrqjt1E+Ajvmk3YwrlJ4WA==","shasum":"1c7a429c2c63c343fe0e2c322dc63dbdffb66da4","tarball":"https://registry.npmjs.org/@3flabs/guardian-coordinator/-/guardian-coordinator-0.2.1.tgz","fileCount":17,"unpackedSize":137505,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@3flabs%2fguardian-coordinator@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDxeyc6imzOzi7Kbx5cW+pF3CF8zbBTYGXdudvyIhFPhAIgC51FI6bcAHuzcgN4jlFdkGKZzVGJr3kVFJjHQwRAE3k="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:557e4f08-403c-4324-b298-705e3978a86c"}},"directories":{},"maintainers":[{"name":"maxencerb","email":"me@maxencerb.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/guardian-coordinator_0.2.1_1785404600794_0.5960857633345586"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-22T13:02:48.107Z","modified":"2026-07-30T09:43:21.290Z","0.1.0":"2026-06-22T13:02:48.388Z","0.2.0":"2026-06-22T13:10:17.350Z","0.2.1":"2026-07-30T09:43:20.935Z"},"bugs":{"url":"https://github.com/3FLabs/3f-guardian/issues"},"license":"MIT","homepage":"https://github.com/3FLabs/3f-guardian#readme","repository":{"type":"git","url":"git+https://github.com/3FLabs/3f-guardian.git","directory":"packages/guardian-coordinator"},"description":"Lite in-process coordinator that submits @3flabs/guardian signatures to grunt-api.","maintainers":[{"name":"maxencerb","email":"me@maxencerb.com"}],"readme":"# @3flabs/guardian-coordinator\n\nLite coordinator for polling grunt-api signing requests, signing them in-process,\nand submitting the signatures back to grunt-api.\n\nFrom this repo:\n\n```sh\nbun run --cwd packages/guardian-coordinator start\n```\n\nFrom an installed package:\n\n```sh\nguardian-coordinator\n```\n\nRequired env:\n\n- `COORDINATOR_BASE_URL` (`https://`, or `http://localhost` for local dev)\n- `COORDINATOR_API_KEY`\n- `GUARDIAN_SIGNER_KEY` when `GUARDIAN_SIGNER_PROVIDER` is unset or `private_key`\n- `GUARDIAN_SIGNER_ADDRESS` and `GUARDIAN_REMOTE_SIGNER_URL` when\n  `GUARDIAN_SIGNER_PROVIDER=remote_http`. The remote signer URL must use\n  `https://`, except localhost URLs may use `http://` for local development.\n- `GUARDIAN_SIGNER_ADDRESS` and `GUARDIAN_AWS_KMS_KEY_ID` when\n  `GUARDIAN_SIGNER_PROVIDER=aws_kms`\n- `GUARDIAN_SIGNER_ADDRESS` and `GUARDIAN_GCP_KMS_KEY_VERSION` when\n  `GUARDIAN_SIGNER_PROVIDER=gcp_kms`\n- `GUARDIAN_CHAIN_RPC_URLS` as `chainId=url,chainId=url`\n- `GUARDIAN_REQUEST_FACTORIES` as `chainId=addr,addr;chainId=addr`\n- `GUARDIAN_REQUEST_OWNERS`\n- `GUARDIAN_REQUEST_PULLERS`\n- `GUARDIAN_REQUEST_CONSUMERS`\n- `GUARDIAN_ACCEPTED_FUNDS`\n- `GUARDIAN_FUND_OWNERS`\n- `GUARDIAN_PM_FACTORIES`\n- `GUARDIAN_PM_OWNERS`\n\nOptional env:\n\n- `POLL_INTERVAL_MS` default `5000`\n- `PAGE_SIZE` default `100`\n- `CHAIN_IDS` comma-separated signing-request filter\n- `FACILITIES` comma-separated signing-request filter (facility, or whitelist book for\n  `request_whitelisting`)\n- `GUARDIAN_SIGNER_PROVIDER` default `private_key`; supported values are `private_key`,\n  `remote_http`, `aws_kms`, and `gcp_kms`\n- `GUARDIAN_REMOTE_SIGNER_BEARER_TOKEN` bearer token for `remote_http`\n- `GUARDIAN_REMOTE_SIGNER_TIMEOUT_MS` default `6000`; request timeout for\n  `remote_http`\n- `AWS_REGION` or `AWS_DEFAULT_REGION` for `aws_kms` when the default AWS SDK chain\n  cannot infer a region\n- `GUARDIAN_MAX_DEADLINE_SECONDS_AHEAD` default `600`\n- `GUARDIAN_EVENT_SCAN_BLOCK_RANGE` default `10000`\n- `GUARDIAN_EVENT_SCAN_MAX_LOOKBACK_BLOCKS` default `1000000`\n- `GUARDIAN_MAX_NONCE_ABOVE_FLOOR` default `100`, for request-whitelisting nonce windows\n- `GUARDIAN_FLASH_LOAN_REQUEST_FACTORIES` optional `chainId=addr,addr;chainId=addr`\n- `GUARDIAN_FLASH_LOAN_REQUEST_EXECUTORS` optional `chainId=addr,addr;chainId=addr`\n- `GUARDIAN_ACCEPTED_WHITELIST_BOOKS` optional `chainId=addr,addr;chainId=addr`\n- `GUARDIAN_TRUSTED_REQUEST_CONTRACTS` optional `chainId=addr,addr;chainId=addr`.\n  Request contracts on this list skip factory-provenance, owner, and puller / consumer /\n  executor role verification for both `set_request` and `request_whitelisting`, with no\n  on-chain read at all — only the deadline check still applies. Unset (the default)\n  validates every request contract. The Guardian will sign for a listed contract\n  whatever its owner and role holders turn out to be, including grants made after it was\n  listed, so keep it to contracts whose configuration is under the same control as the\n  Guardian's own key material. Every bypass is logged at warn level.\n- `GUARDIAN_SIGN_TIMEOUT_MS` default `6000`; budget for one whole validate-and-sign\n  call, including the on-chain reads. Raise it when role-events scans over a wide\n  `GUARDIAN_EVENT_SCAN_MAX_LOOKBACK_BLOCKS` — or `request_whitelisting` batches, which\n  scan per request contract — need longer than the default.\n- `GUARDIAN_SWAP_PRICE_TOLERANCE_BPS` default `1`\n\nFor `remote_http`, the coordinator sends:\n\n```json\n{ \"typedData\": { \"domain\": {}, \"types\": {}, \"primaryType\": \"...\", \"message\": {} } }\n```\n\nThe remote signer must return either `{ \"signature\": \"0x...\" }` or the signature\nas a JSON string. The returned signature must recover to\n`GUARDIAN_SIGNER_ADDRESS`; otherwise signing fails before submission.\n\nFor `aws_kms`, the KMS key must be an asymmetric `ECC_SECG_P256K1` key with\n`SIGN_VERIFY` usage. The coordinator signs the EIP-712 digest with AWS KMS\n`ECDSA_SHA_256` / `MessageType=DIGEST`.\n\nFor `gcp_kms`, the key version must use `EC_SIGN_SECP256K1_SHA256`.\n\nFor both KMS providers, the returned signature must recover to\n`GUARDIAN_SIGNER_ADDRESS`; otherwise signing fails before submission.\n\nProgrammatic use is still available:\n\n```ts\nimport {\n  loadCoordinatorConfig,\n  runGuardianCoordinator,\n} from \"@3flabs/guardian-coordinator\";\nimport { buildGuardianFromEnv } from \"@3flabs/guardian-coordinator/cli\";\n\nawait runGuardianCoordinator({\n  ...loadCoordinatorConfig(process.env),\n  guardian: buildGuardianFromEnv(process.env),\n});\n```\n","readmeFilename":"README.md"}