@moltium/world-core 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2195 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1234 -0
- package/dist/index.d.ts +1234 -0
- package/dist/index.js +2158 -0
- package/dist/index.js.map +1 -0
- package/lib/forge-std/.gitattributes +1 -0
- package/lib/forge-std/.github/CODEOWNERS +1 -0
- package/lib/forge-std/.github/dependabot.yml +6 -0
- package/lib/forge-std/.github/workflows/ci.yml +125 -0
- package/lib/forge-std/.github/workflows/sync.yml +36 -0
- package/lib/forge-std/CONTRIBUTING.md +193 -0
- package/lib/forge-std/LICENSE-APACHE +203 -0
- package/lib/forge-std/LICENSE-MIT +25 -0
- package/lib/forge-std/README.md +268 -0
- package/lib/forge-std/RELEASE_CHECKLIST.md +12 -0
- package/lib/forge-std/foundry.toml +18 -0
- package/lib/forge-std/package.json +16 -0
- package/lib/forge-std/scripts/vm.py +636 -0
- package/lib/forge-std/src/Base.sol +48 -0
- package/lib/forge-std/src/Config.sol +60 -0
- package/lib/forge-std/src/LibVariable.sol +477 -0
- package/lib/forge-std/src/Script.sol +28 -0
- package/lib/forge-std/src/StdAssertions.sol +779 -0
- package/lib/forge-std/src/StdChains.sol +295 -0
- package/lib/forge-std/src/StdCheats.sol +825 -0
- package/lib/forge-std/src/StdConfig.sol +632 -0
- package/lib/forge-std/src/StdConstants.sol +30 -0
- package/lib/forge-std/src/StdError.sol +15 -0
- package/lib/forge-std/src/StdInvariant.sol +120 -0
- package/lib/forge-std/src/StdJson.sol +275 -0
- package/lib/forge-std/src/StdMath.sol +47 -0
- package/lib/forge-std/src/StdStorage.sol +475 -0
- package/lib/forge-std/src/StdStyle.sol +333 -0
- package/lib/forge-std/src/StdToml.sol +275 -0
- package/lib/forge-std/src/StdUtils.sol +200 -0
- package/lib/forge-std/src/Test.sol +32 -0
- package/lib/forge-std/src/Vm.sol +2500 -0
- package/lib/forge-std/src/console.sol +1551 -0
- package/lib/forge-std/src/console2.sol +4 -0
- package/lib/forge-std/src/interfaces/IERC1155.sol +105 -0
- package/lib/forge-std/src/interfaces/IERC165.sol +12 -0
- package/lib/forge-std/src/interfaces/IERC20.sol +43 -0
- package/lib/forge-std/src/interfaces/IERC4626.sol +190 -0
- package/lib/forge-std/src/interfaces/IERC6909.sol +72 -0
- package/lib/forge-std/src/interfaces/IERC721.sol +164 -0
- package/lib/forge-std/src/interfaces/IERC7540.sol +144 -0
- package/lib/forge-std/src/interfaces/IERC7575.sol +241 -0
- package/lib/forge-std/src/interfaces/IMulticall3.sol +68 -0
- package/lib/forge-std/src/safeconsole.sol +13248 -0
- package/lib/forge-std/test/CommonBase.t.sol +44 -0
- package/lib/forge-std/test/Config.t.sol +381 -0
- package/lib/forge-std/test/LibVariable.t.sol +452 -0
- package/lib/forge-std/test/StdAssertions.t.sol +141 -0
- package/lib/forge-std/test/StdChains.t.sol +227 -0
- package/lib/forge-std/test/StdCheats.t.sol +638 -0
- package/lib/forge-std/test/StdConstants.t.sol +38 -0
- package/lib/forge-std/test/StdError.t.sol +119 -0
- package/lib/forge-std/test/StdJson.t.sol +49 -0
- package/lib/forge-std/test/StdMath.t.sol +202 -0
- package/lib/forge-std/test/StdStorage.t.sol +485 -0
- package/lib/forge-std/test/StdStyle.t.sol +110 -0
- package/lib/forge-std/test/StdToml.t.sol +49 -0
- package/lib/forge-std/test/StdUtils.t.sol +342 -0
- package/lib/forge-std/test/Vm.t.sol +18 -0
- package/lib/forge-std/test/compilation/CompilationScript.sol +8 -0
- package/lib/forge-std/test/compilation/CompilationScriptBase.sol +8 -0
- package/lib/forge-std/test/compilation/CompilationTest.sol +8 -0
- package/lib/forge-std/test/compilation/CompilationTestBase.sol +8 -0
- package/lib/forge-std/test/fixtures/broadcast.log.json +187 -0
- package/lib/forge-std/test/fixtures/config.toml +81 -0
- package/lib/forge-std/test/fixtures/test.json +8 -0
- package/lib/forge-std/test/fixtures/test.toml +6 -0
- package/lib/openzeppelin-contracts/.changeset/config.json +12 -0
- package/lib/openzeppelin-contracts/.codecov.yml +16 -0
- package/lib/openzeppelin-contracts/.editorconfig +21 -0
- package/lib/openzeppelin-contracts/.gitattributes +3 -0
- package/lib/openzeppelin-contracts/.github/CODEOWNERS +10 -0
- package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/bug_report.md +21 -0
- package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/config.yml +4 -0
- package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/feature_request.md +14 -0
- package/lib/openzeppelin-contracts/.github/PULL_REQUEST_TEMPLATE.md +20 -0
- package/lib/openzeppelin-contracts/.github/actions/gas-compare/action.yml +51 -0
- package/lib/openzeppelin-contracts/.github/actions/setup/action.yml +22 -0
- package/lib/openzeppelin-contracts/.github/actions/storage-layout/action.yml +57 -0
- package/lib/openzeppelin-contracts/.github/workflows/actionlint.yml +18 -0
- package/lib/openzeppelin-contracts/.github/workflows/changeset.yml +28 -0
- package/lib/openzeppelin-contracts/.github/workflows/checks.yml +132 -0
- package/lib/openzeppelin-contracts/.github/workflows/docs.yml +19 -0
- package/lib/openzeppelin-contracts/.github/workflows/formal-verification.yml +88 -0
- package/lib/openzeppelin-contracts/.github/workflows/release-cycle.yml +214 -0
- package/lib/openzeppelin-contracts/.github/workflows/upgradeable.yml +34 -0
- package/lib/openzeppelin-contracts/.gitmodules +10 -0
- package/lib/openzeppelin-contracts/.husky/pre-commit +2 -0
- package/lib/openzeppelin-contracts/.mocharc.js +4 -0
- package/lib/openzeppelin-contracts/.prettierrc +15 -0
- package/lib/openzeppelin-contracts/.solcover.js +21 -0
- package/lib/openzeppelin-contracts/CHANGELOG.md +1355 -0
- package/lib/openzeppelin-contracts/CODE_OF_CONDUCT.md +73 -0
- package/lib/openzeppelin-contracts/CONTRIBUTING.md +36 -0
- package/lib/openzeppelin-contracts/FUNDING.json +10 -0
- package/lib/openzeppelin-contracts/GUIDELINES.md +170 -0
- package/lib/openzeppelin-contracts/LICENSE +22 -0
- package/lib/openzeppelin-contracts/README.md +106 -0
- package/lib/openzeppelin-contracts/RELEASING.md +45 -0
- package/lib/openzeppelin-contracts/SECURITY.md +43 -0
- package/lib/openzeppelin-contracts/audits/2017-03.md +292 -0
- package/lib/openzeppelin-contracts/audits/2018-10.pdf +0 -0
- package/lib/openzeppelin-contracts/audits/2022-10-Checkpoints.pdf +0 -0
- package/lib/openzeppelin-contracts/audits/2022-10-ERC4626.pdf +0 -0
- package/lib/openzeppelin-contracts/audits/2023-05-v4.9.pdf +0 -0
- package/lib/openzeppelin-contracts/audits/2023-10-v5.0.pdf +0 -0
- package/lib/openzeppelin-contracts/audits/2024-10-v5.1.pdf +0 -0
- package/lib/openzeppelin-contracts/audits/2024-12-v5.2.pdf +0 -0
- package/lib/openzeppelin-contracts/audits/2025-04-v5.3.pdf +0 -0
- package/lib/openzeppelin-contracts/audits/2025-07-v5.4.pdf +0 -0
- package/lib/openzeppelin-contracts/audits/README.md +21 -0
- package/lib/openzeppelin-contracts/certora/Makefile +54 -0
- package/lib/openzeppelin-contracts/certora/README.md +60 -0
- package/lib/openzeppelin-contracts/certora/diff/access_manager_AccessManager.sol.patch +97 -0
- package/lib/openzeppelin-contracts/certora/diff/account_extensions_draft-AccountERC7579.sol.patch +25 -0
- package/lib/openzeppelin-contracts/certora/diff/token_ERC721_ERC721.sol.patch +11 -0
- package/lib/openzeppelin-contracts/certora/harnesses/AccessControlDefaultAdminRulesHarness.sol +46 -0
- package/lib/openzeppelin-contracts/certora/harnesses/AccessControlHarness.sol +6 -0
- package/lib/openzeppelin-contracts/certora/harnesses/AccessManagedHarness.sol +36 -0
- package/lib/openzeppelin-contracts/certora/harnesses/AccessManagerHarness.sol +116 -0
- package/lib/openzeppelin-contracts/certora/harnesses/AccountHarness.sol +60 -0
- package/lib/openzeppelin-contracts/certora/harnesses/DoubleEndedQueueHarness.sol +58 -0
- package/lib/openzeppelin-contracts/certora/harnesses/ERC20FlashMintHarness.sol +36 -0
- package/lib/openzeppelin-contracts/certora/harnesses/ERC20PermitHarness.sol +16 -0
- package/lib/openzeppelin-contracts/certora/harnesses/ERC20WrapperHarness.sol +22 -0
- package/lib/openzeppelin-contracts/certora/harnesses/ERC3156FlashBorrowerHarness.sol +13 -0
- package/lib/openzeppelin-contracts/certora/harnesses/ERC721Harness.sol +37 -0
- package/lib/openzeppelin-contracts/certora/harnesses/ERC721ReceiverHarness.sol +11 -0
- package/lib/openzeppelin-contracts/certora/harnesses/EnumerableMapHarness.sol +55 -0
- package/lib/openzeppelin-contracts/certora/harnesses/EnumerableSetHarness.sol +35 -0
- package/lib/openzeppelin-contracts/certora/harnesses/InitializableHarness.sol +23 -0
- package/lib/openzeppelin-contracts/certora/harnesses/NoncesHarness.sol +14 -0
- package/lib/openzeppelin-contracts/certora/harnesses/Ownable2StepHarness.sol +10 -0
- package/lib/openzeppelin-contracts/certora/harnesses/OwnableHarness.sol +10 -0
- package/lib/openzeppelin-contracts/certora/harnesses/PausableHarness.sol +18 -0
- package/lib/openzeppelin-contracts/certora/harnesses/TimelockControllerHarness.sol +13 -0
- package/lib/openzeppelin-contracts/certora/reports/2021-10.pdf +0 -0
- package/lib/openzeppelin-contracts/certora/reports/2022-03.pdf +0 -0
- package/lib/openzeppelin-contracts/certora/reports/2022-05.pdf +0 -0
- package/lib/openzeppelin-contracts/certora/run.js +68 -0
- package/lib/openzeppelin-contracts/certora/specs/AccessControl.conf +8 -0
- package/lib/openzeppelin-contracts/certora/specs/AccessControl.spec +119 -0
- package/lib/openzeppelin-contracts/certora/specs/AccessControlDefaultAdminRules.conf +8 -0
- package/lib/openzeppelin-contracts/certora/specs/AccessControlDefaultAdminRules.spec +467 -0
- package/lib/openzeppelin-contracts/certora/specs/AccessManaged.conf +14 -0
- package/lib/openzeppelin-contracts/certora/specs/AccessManaged.spec +49 -0
- package/lib/openzeppelin-contracts/certora/specs/AccessManager.conf +10 -0
- package/lib/openzeppelin-contracts/certora/specs/AccessManager.spec +837 -0
- package/lib/openzeppelin-contracts/certora/specs/Account.conf +9 -0
- package/lib/openzeppelin-contracts/certora/specs/Account.spec +490 -0
- package/lib/openzeppelin-contracts/certora/specs/DoubleEndedQueue.conf +8 -0
- package/lib/openzeppelin-contracts/certora/specs/DoubleEndedQueue.spec +300 -0
- package/lib/openzeppelin-contracts/certora/specs/ERC20.conf +9 -0
- package/lib/openzeppelin-contracts/certora/specs/ERC20.spec +352 -0
- package/lib/openzeppelin-contracts/certora/specs/ERC20FlashMint.conf +10 -0
- package/lib/openzeppelin-contracts/certora/specs/ERC20FlashMint.spec +55 -0
- package/lib/openzeppelin-contracts/certora/specs/ERC20Wrapper.conf +13 -0
- package/lib/openzeppelin-contracts/certora/specs/ERC20Wrapper.spec +226 -0
- package/lib/openzeppelin-contracts/certora/specs/ERC721.conf +10 -0
- package/lib/openzeppelin-contracts/certora/specs/ERC721.spec +695 -0
- package/lib/openzeppelin-contracts/certora/specs/EnumerableMap.conf +8 -0
- package/lib/openzeppelin-contracts/certora/specs/EnumerableMap.spec +364 -0
- package/lib/openzeppelin-contracts/certora/specs/EnumerableSet.conf +8 -0
- package/lib/openzeppelin-contracts/certora/specs/EnumerableSet.spec +272 -0
- package/lib/openzeppelin-contracts/certora/specs/Initializable.conf +8 -0
- package/lib/openzeppelin-contracts/certora/specs/Initializable.spec +176 -0
- package/lib/openzeppelin-contracts/certora/specs/Nonces.conf +8 -0
- package/lib/openzeppelin-contracts/certora/specs/Nonces.spec +92 -0
- package/lib/openzeppelin-contracts/certora/specs/Ownable.conf +8 -0
- package/lib/openzeppelin-contracts/certora/specs/Ownable.spec +77 -0
- package/lib/openzeppelin-contracts/certora/specs/Ownable2Step.conf +8 -0
- package/lib/openzeppelin-contracts/certora/specs/Ownable2Step.spec +108 -0
- package/lib/openzeppelin-contracts/certora/specs/Pausable.conf +8 -0
- package/lib/openzeppelin-contracts/certora/specs/Pausable.spec +96 -0
- package/lib/openzeppelin-contracts/certora/specs/TimelockController.conf +10 -0
- package/lib/openzeppelin-contracts/certora/specs/TimelockController.spec +299 -0
- package/lib/openzeppelin-contracts/certora/specs/helpers/helpers.spec +13 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IAccessControl.spec +8 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IAccessControlDefaultAdminRules.spec +36 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IAccessManaged.spec +5 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IAccessManager.spec +33 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IAccount.spec +34 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC20.spec +11 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC2612.spec +5 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC3156FlashBorrower.spec +3 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC3156FlashLender.spec +5 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC5313.spec +3 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC721.spec +17 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC721Receiver.spec +3 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IOwnable.spec +5 -0
- package/lib/openzeppelin-contracts/certora/specs/methods/IOwnable2Step.spec +7 -0
- package/lib/openzeppelin-contracts/contracts/access/AccessControl.sol +207 -0
- package/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol +98 -0
- package/lib/openzeppelin-contracts/contracts/access/Ownable.sol +100 -0
- package/lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol +67 -0
- package/lib/openzeppelin-contracts/contracts/access/README.adoc +45 -0
- package/lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol +372 -0
- package/lib/openzeppelin-contracts/contracts/access/extensions/AccessControlEnumerable.sol +81 -0
- package/lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlDefaultAdminRules.sol +192 -0
- package/lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlEnumerable.sol +31 -0
- package/lib/openzeppelin-contracts/contracts/access/manager/AccessManaged.sol +112 -0
- package/lib/openzeppelin-contracts/contracts/access/manager/AccessManager.sol +741 -0
- package/lib/openzeppelin-contracts/contracts/access/manager/AuthorityUtils.sol +36 -0
- package/lib/openzeppelin-contracts/contracts/access/manager/IAccessManaged.sol +32 -0
- package/lib/openzeppelin-contracts/contracts/access/manager/IAccessManager.sol +399 -0
- package/lib/openzeppelin-contracts/contracts/access/manager/IAuthority.sol +14 -0
- package/lib/openzeppelin-contracts/contracts/account/Account.sol +151 -0
- package/lib/openzeppelin-contracts/contracts/account/README.adoc +30 -0
- package/lib/openzeppelin-contracts/contracts/account/extensions/draft-AccountERC7579.sol +419 -0
- package/lib/openzeppelin-contracts/contracts/account/extensions/draft-AccountERC7579Hooked.sol +107 -0
- package/lib/openzeppelin-contracts/contracts/account/extensions/draft-ERC7821.sol +70 -0
- package/lib/openzeppelin-contracts/contracts/account/utils/EIP7702Utils.sol +21 -0
- package/lib/openzeppelin-contracts/contracts/account/utils/draft-ERC4337Utils.sol +159 -0
- package/lib/openzeppelin-contracts/contracts/account/utils/draft-ERC7579Utils.sol +280 -0
- package/lib/openzeppelin-contracts/contracts/crosschain/ERC7786Recipient.sol +70 -0
- package/lib/openzeppelin-contracts/contracts/crosschain/README.adoc +12 -0
- package/lib/openzeppelin-contracts/contracts/finance/README.adoc +14 -0
- package/lib/openzeppelin-contracts/contracts/finance/VestingWallet.sol +159 -0
- package/lib/openzeppelin-contracts/contracts/finance/VestingWalletCliff.sol +54 -0
- package/lib/openzeppelin-contracts/contracts/governance/Governor.sol +818 -0
- package/lib/openzeppelin-contracts/contracts/governance/IGovernor.sol +454 -0
- package/lib/openzeppelin-contracts/contracts/governance/README.adoc +197 -0
- package/lib/openzeppelin-contracts/contracts/governance/TimelockController.sol +471 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingFractional.sol +190 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingOverridable.sol +222 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingSimple.sol +96 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorNoncesKeyed.sol +91 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorPreventLateQuorum.sol +92 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorProposalGuardian.sol +59 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorSequentialProposalId.sol +75 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorSettings.sol +106 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorStorage.sol +125 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorSuperQuorum.sol +59 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockAccess.sol +346 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockCompound.sol +165 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockControl.sol +167 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotes.sol +63 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesQuorumFraction.sol +113 -0
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesSuperQuorumFraction.sol +135 -0
- package/lib/openzeppelin-contracts/contracts/governance/utils/IVotes.sol +60 -0
- package/lib/openzeppelin-contracts/contracts/governance/utils/Votes.sol +252 -0
- package/lib/openzeppelin-contracts/contracts/governance/utils/VotesExtended.sol +84 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1155.sol +6 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1155MetadataURI.sol +6 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1155Receiver.sol +6 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol +17 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol +86 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Receiver.sol +32 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Spender.sol +26 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol +6 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Implementer.sol +20 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Registry.sol +112 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol +24 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol +6 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sol +6 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC2309.sol +19 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC2612.sol +8 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol +26 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC3156.sol +7 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashBorrower.sol +27 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashLender.sol +41 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol +230 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC4906.sol +20 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol +28 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC5313.sol +16 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC5805.sol +9 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC6372.sol +17 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC6909.sol +125 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC721.sol +6 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC721Enumerable.sol +6 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC721Metadata.sol +6 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC721Receiver.sol +6 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC7751.sol +12 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC777.sol +200 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC777Recipient.sol +35 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC777Sender.sol +35 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC7913.sol +18 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/README.adoc +111 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol +20 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC4337.sol +253 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol +162 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC7579.sol +227 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC7674.sol +17 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC7786.sol +64 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC7802.sol +32 -0
- package/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC7821.sol +44 -0
- package/lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol +90 -0
- package/lib/openzeppelin-contracts/contracts/metatx/ERC2771Forwarder.sol +372 -0
- package/lib/openzeppelin-contracts/contracts/metatx/README.adoc +17 -0
- package/lib/openzeppelin-contracts/contracts/mocks/AccessManagedTarget.sol +34 -0
- package/lib/openzeppelin-contracts/contracts/mocks/AccessManagerMock.sol +20 -0
- package/lib/openzeppelin-contracts/contracts/mocks/ArraysMock.sol +171 -0
- package/lib/openzeppelin-contracts/contracts/mocks/AuthorityMock.sol +69 -0
- package/lib/openzeppelin-contracts/contracts/mocks/Base64Dirty.sol +19 -0
- package/lib/openzeppelin-contracts/contracts/mocks/BatchCaller.sol +20 -0
- package/lib/openzeppelin-contracts/contracts/mocks/CallReceiverMock.sol +106 -0
- package/lib/openzeppelin-contracts/contracts/mocks/ConstructorMock.sol +34 -0
- package/lib/openzeppelin-contracts/contracts/mocks/ContextMock.sol +35 -0
- package/lib/openzeppelin-contracts/contracts/mocks/DummyImplementation.sol +65 -0
- package/lib/openzeppelin-contracts/contracts/mocks/EIP712Verifier.sol +16 -0
- package/lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol +24 -0
- package/lib/openzeppelin-contracts/contracts/mocks/ERC165Mock.sol +100 -0
- package/lib/openzeppelin-contracts/contracts/mocks/ERC2771ContextMock.sol +28 -0
- package/lib/openzeppelin-contracts/contracts/mocks/ERC3156FlashBorrowerMock.sol +53 -0
- package/lib/openzeppelin-contracts/contracts/mocks/EtherReceiverMock.sol +17 -0
- package/lib/openzeppelin-contracts/contracts/mocks/InitializableMock.sol +130 -0
- package/lib/openzeppelin-contracts/contracts/mocks/MerkleProofCustomHashMock.sol +62 -0
- package/lib/openzeppelin-contracts/contracts/mocks/MerkleTreeMock.sol +52 -0
- package/lib/openzeppelin-contracts/contracts/mocks/MulticallHelper.sol +23 -0
- package/lib/openzeppelin-contracts/contracts/mocks/MultipleInheritanceInitializableMocks.sol +131 -0
- package/lib/openzeppelin-contracts/contracts/mocks/PausableMock.sol +31 -0
- package/lib/openzeppelin-contracts/contracts/mocks/ReentrancyAttack.sol +17 -0
- package/lib/openzeppelin-contracts/contracts/mocks/ReentrancyMock.sol +59 -0
- package/lib/openzeppelin-contracts/contracts/mocks/ReentrancyTransientMock.sol +59 -0
- package/lib/openzeppelin-contracts/contracts/mocks/RegressionImplementation.sol +61 -0
- package/lib/openzeppelin-contracts/contracts/mocks/SingleInheritanceInitializableMocks.sol +49 -0
- package/lib/openzeppelin-contracts/contracts/mocks/Stateless.sol +61 -0
- package/lib/openzeppelin-contracts/contracts/mocks/StorageSlotMock.sol +87 -0
- package/lib/openzeppelin-contracts/contracts/mocks/TimelockReentrant.sol +26 -0
- package/lib/openzeppelin-contracts/contracts/mocks/TransientSlotMock.sol +61 -0
- package/lib/openzeppelin-contracts/contracts/mocks/UpgradeableBeaconMock.sol +27 -0
- package/lib/openzeppelin-contracts/contracts/mocks/VotesExtendedMock.sol +42 -0
- package/lib/openzeppelin-contracts/contracts/mocks/VotesMock.sol +42 -0
- package/lib/openzeppelin-contracts/contracts/mocks/account/AccountMock.sol +181 -0
- package/lib/openzeppelin-contracts/contracts/mocks/account/modules/ERC7579Mock.sol +122 -0
- package/lib/openzeppelin-contracts/contracts/mocks/account/utils/ERC7579UtilsMock.sol +23 -0
- package/lib/openzeppelin-contracts/contracts/mocks/compound/CompTimelock.sol +174 -0
- package/lib/openzeppelin-contracts/contracts/mocks/crosschain/ERC7786GatewayMock.sol +56 -0
- package/lib/openzeppelin-contracts/contracts/mocks/crosschain/ERC7786RecipientMock.sol +31 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/ERC20WithAutoMinerReward.sol +22 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/ERC4626Fees.sol +109 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/MyNFT.sol +9 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintBase.sol +25 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintMissing.sol +24 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintOnlyRole.sol +23 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlModified.sol +14 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessManagedERC20MintBase.sol +16 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/MyContractOwnable.sol +17 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/account/MyAccountERC7702.sol +20 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/account/MyFactoryAccount.sol +37 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyGovernor.sol +80 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyToken.sol +21 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyTokenTimestampBased.sol +32 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyTokenWrapped.sol +28 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/token/ERC1155/GameItems.sol +21 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/token/ERC1155/MyERC115HolderContract.sol +7 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/token/ERC20/GLDToken.sol +11 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/token/ERC6909/ERC6909GameItems.sol +26 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/token/ERC721/GameItem.sol +19 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/utilities/Base64NFT.sol +27 -0
- package/lib/openzeppelin-contracts/contracts/mocks/docs/utilities/Multicall.sol +15 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorCountingOverridableMock.sol +18 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorFractionalMock.sol +14 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorMock.sol +14 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorNoncesKeyedMock.sol +44 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorPreventLateQuorumMock.sol +40 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorProposalGuardianMock.sol +27 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorSequentialProposalIdMock.sol +39 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorStorageMock.sol +79 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorSuperQuorumMock.sol +95 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockAccessMock.sol +70 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockCompoundMock.sol +69 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockControlMock.sol +69 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorVoteMock.sol +20 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorVotesSuperQuorumFractionMock.sol +37 -0
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorWithParamsMock.sol +51 -0
- package/lib/openzeppelin-contracts/contracts/mocks/proxy/BadBeacon.sol +11 -0
- package/lib/openzeppelin-contracts/contracts/mocks/proxy/ClashingImplementation.sol +19 -0
- package/lib/openzeppelin-contracts/contracts/mocks/proxy/UUPSUpgradeableMock.sol +35 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC1155ReceiverMock.sol +74 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC1363ForceApproveMock.sol +13 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC1363NoReturnMock.sol +33 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC1363ReceiverMock.sol +52 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC1363ReturnFalseMock.sol +34 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC1363SpenderMock.sol +47 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ApprovalMock.sol +10 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20BridgeableMock.sol +26 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20DecimalsMock.sol +17 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ExcessDecimalsMock.sol +9 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20FlashMintMock.sol +26 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ForceApproveMock.sol +13 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20GetterHelper.sol +38 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20Mock.sol +16 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20MulticallMock.sol +8 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20NoReturnMock.sol +30 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20Reentrant.sol +39 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ReturnFalseMock.sol +19 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20VotesAdditionalCheckpointsMock.sol +31 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20VotesLegacyMock.sol +253 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20VotesTimestampMock.sol +29 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626LimitsMock.sol +23 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626Mock.sol +17 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626OffsetMock.sol +17 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC4646FeesMock.sol +40 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ConsecutiveEnumerableMock.sol +42 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ConsecutiveMock.sol +61 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ReceiverMock.sol +47 -0
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC721URIStorageMock.sol +17 -0
- package/lib/openzeppelin-contracts/contracts/mocks/utils/cryptography/ERC7739Mock.sol +12 -0
- package/lib/openzeppelin-contracts/contracts/package.json +32 -0
- package/lib/openzeppelin-contracts/contracts/proxy/Clones.sol +294 -0
- package/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol +40 -0
- package/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol +177 -0
- package/lib/openzeppelin-contracts/contracts/proxy/Proxy.sol +69 -0
- package/lib/openzeppelin-contracts/contracts/proxy/README.adoc +87 -0
- package/lib/openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sol +57 -0
- package/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol +16 -0
- package/lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol +70 -0
- package/lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol +45 -0
- package/lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol +118 -0
- package/lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol +238 -0
- package/lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol +148 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sol +389 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol +123 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol +59 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/README.adoc +43 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol +28 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Pausable.sol +38 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Supply.sol +88 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol +61 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol +20 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol +42 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Utils.sol +88 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol +305 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol +79 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/README.adoc +78 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC1363.sol +135 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sol +39 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Capped.sol +54 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20FlashMint.sol +134 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Pausable.sol +33 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Permit.sol +77 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Votes.sol +83 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Wrapper.sol +89 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC4626.sol +305 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol +26 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol +90 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sol +51 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-ERC20TemporaryApproval.sol +119 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/utils/ERC1363Utils.sol +95 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol +280 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC6909/ERC6909.sol +224 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC6909/README.adoc +27 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC6909/extensions/ERC6909ContentURI.sol +53 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC6909/extensions/ERC6909Metadata.sol +77 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC6909/extensions/ERC6909TokenSupply.sol +35 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol +430 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol +135 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol +28 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/README.adoc +69 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Burnable.sol +26 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Consecutive.sol +176 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Enumerable.sol +164 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Pausable.sol +37 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Royalty.sol +26 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721URIStorage.sol +58 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Votes.sol +47 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Wrapper.sol +102 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sol +29 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol +27 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol +26 -0
- package/lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Utils.sol +50 -0
- package/lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol +139 -0
- package/lib/openzeppelin-contracts/contracts/token/common/README.adoc +10 -0
- package/lib/openzeppelin-contracts/contracts/utils/Address.sol +167 -0
- package/lib/openzeppelin-contracts/contracts/utils/Arrays.sol +735 -0
- package/lib/openzeppelin-contracts/contracts/utils/Base58.sol +240 -0
- package/lib/openzeppelin-contracts/contracts/utils/Base64.sol +234 -0
- package/lib/openzeppelin-contracts/contracts/utils/Blockhash.sol +54 -0
- package/lib/openzeppelin-contracts/contracts/utils/Bytes.sol +247 -0
- package/lib/openzeppelin-contracts/contracts/utils/CAIP10.sol +54 -0
- package/lib/openzeppelin-contracts/contracts/utils/CAIP2.sol +51 -0
- package/lib/openzeppelin-contracts/contracts/utils/Calldata.sol +25 -0
- package/lib/openzeppelin-contracts/contracts/utils/Comparators.sol +19 -0
- package/lib/openzeppelin-contracts/contracts/utils/Context.sol +28 -0
- package/lib/openzeppelin-contracts/contracts/utils/Create2.sol +91 -0
- package/lib/openzeppelin-contracts/contracts/utils/Errors.sol +34 -0
- package/lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol +127 -0
- package/lib/openzeppelin-contracts/contracts/utils/Memory.sol +135 -0
- package/lib/openzeppelin-contracts/contracts/utils/Multicall.sol +37 -0
- package/lib/openzeppelin-contracts/contracts/utils/Nonces.sol +46 -0
- package/lib/openzeppelin-contracts/contracts/utils/NoncesKeyed.sol +74 -0
- package/lib/openzeppelin-contracts/contracts/utils/Packing.sol +1656 -0
- package/lib/openzeppelin-contracts/contracts/utils/Panic.sol +57 -0
- package/lib/openzeppelin-contracts/contracts/utils/Pausable.sol +112 -0
- package/lib/openzeppelin-contracts/contracts/utils/README.adoc +160 -0
- package/lib/openzeppelin-contracts/contracts/utils/RLP.sol +382 -0
- package/lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol +119 -0
- package/lib/openzeppelin-contracts/contracts/utils/ReentrancyGuardTransient.sol +84 -0
- package/lib/openzeppelin-contracts/contracts/utils/RelayedCall.sol +133 -0
- package/lib/openzeppelin-contracts/contracts/utils/ShortStrings.sol +122 -0
- package/lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol +155 -0
- package/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol +143 -0
- package/lib/openzeppelin-contracts/contracts/utils/Strings.sol +508 -0
- package/lib/openzeppelin-contracts/contracts/utils/TransientSlot.sol +183 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol +284 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol +160 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/Hashes.sol +31 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol +514 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol +99 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/P256.sol +408 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/README.adoc +73 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/RSA.sol +154 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/SignatureChecker.sol +164 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/WebAuthn.sol +261 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/draft-ERC7739Utils.sol +208 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/signers/AbstractSigner.sol +23 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/signers/MultiSignerERC7913.sol +252 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol +208 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/signers/SignerECDSA.sol +56 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/signers/SignerEIP7702.sol +25 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/signers/SignerERC7913.sol +63 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/signers/SignerP256.sol +64 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/signers/SignerRSA.sol +65 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/signers/SignerWebAuthn.sol +51 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/signers/draft-ERC7739.sol +98 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/verifiers/ERC7913P256Verifier.sol +29 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/verifiers/ERC7913RSAVerifier.sol +23 -0
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/verifiers/ERC7913WebAuthnVerifier.sol +35 -0
- package/lib/openzeppelin-contracts/contracts/utils/draft-InteroperableAddress.sol +235 -0
- package/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol +25 -0
- package/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol +142 -0
- package/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol +25 -0
- package/lib/openzeppelin-contracts/contracts/utils/math/Math.sol +756 -0
- package/lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol +1162 -0
- package/lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol +68 -0
- package/lib/openzeppelin-contracts/contracts/utils/structs/Accumulators.sol +130 -0
- package/lib/openzeppelin-contracts/contracts/utils/structs/BitMaps.sol +60 -0
- package/lib/openzeppelin-contracts/contracts/utils/structs/Checkpoints.sol +833 -0
- package/lib/openzeppelin-contracts/contracts/utils/structs/CircularBuffer.sol +141 -0
- package/lib/openzeppelin-contracts/contracts/utils/structs/DoubleEndedQueue.sol +156 -0
- package/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol +1319 -0
- package/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol +792 -0
- package/lib/openzeppelin-contracts/contracts/utils/structs/Heap.sol +256 -0
- package/lib/openzeppelin-contracts/contracts/utils/structs/MerkleTree.sol +267 -0
- package/lib/openzeppelin-contracts/contracts/utils/types/Time.sol +133 -0
- package/lib/openzeppelin-contracts/contracts/vendor/compound/ICompoundTimelock.sol +86 -0
- package/lib/openzeppelin-contracts/contracts/vendor/compound/LICENSE +11 -0
- package/lib/openzeppelin-contracts/docs/README.md +16 -0
- package/lib/openzeppelin-contracts/docs/antora.yml +7 -0
- package/lib/openzeppelin-contracts/docs/config.js +21 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/access-control-multiple.svg +97 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/access-manager-functions.svg +47 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/access-manager.svg +99 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-3a.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-3b.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-6.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-deposit.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-mint.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-linear.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-loglog.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-loglogext.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-exec.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-vote.png +0 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/nav.adoc +29 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/access-control.adoc +295 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/account-abstraction.adoc +100 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/accounts.adoc +354 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/backwards-compatibility.adoc +50 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/eoa-delegation.adoc +143 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc1155.adoc +118 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20-supply.adoc +71 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20.adoc +67 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc4626.adoc +214 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc6909.adoc +47 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc721.adoc +58 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/extending-contracts.adoc +51 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/faq.adoc +13 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/governance.adoc +239 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/index.adoc +70 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/multisig.adoc +306 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/tokens.adoc +31 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/upgradeable.adoc +77 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/utilities.adoc +634 -0
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/wizard.adoc +15 -0
- package/lib/openzeppelin-contracts/docs/templates/contract.hbs +141 -0
- package/lib/openzeppelin-contracts/docs/templates/helpers.js +46 -0
- package/lib/openzeppelin-contracts/docs/templates/page.hbs +4 -0
- package/lib/openzeppelin-contracts/docs/templates/properties.js +88 -0
- package/lib/openzeppelin-contracts/eslint.config.mjs +26 -0
- package/lib/openzeppelin-contracts/foundry.toml +20 -0
- package/lib/openzeppelin-contracts/fv-requirements.txt +4 -0
- package/lib/openzeppelin-contracts/hardhat/async-test-sanity.js +10 -0
- package/lib/openzeppelin-contracts/hardhat/env-artifacts.js +29 -0
- package/lib/openzeppelin-contracts/hardhat/ignore-unreachable-warnings.js +45 -0
- package/lib/openzeppelin-contracts/hardhat/remappings.js +18 -0
- package/lib/openzeppelin-contracts/hardhat/skip-foundry-tests.js +6 -0
- package/lib/openzeppelin-contracts/hardhat/task-test-get-files.js +25 -0
- package/lib/openzeppelin-contracts/hardhat.config.js +125 -0
- package/lib/openzeppelin-contracts/lib/erc4626-tests/ERC4626.prop.sol +404 -0
- package/lib/openzeppelin-contracts/lib/erc4626-tests/ERC4626.test.sol +356 -0
- package/lib/openzeppelin-contracts/lib/erc4626-tests/LICENSE +661 -0
- package/lib/openzeppelin-contracts/lib/erc4626-tests/README.md +116 -0
- package/lib/openzeppelin-contracts/lib/forge-std/.gitattributes +1 -0
- package/lib/openzeppelin-contracts/lib/forge-std/.github/workflows/ci.yml +128 -0
- package/lib/openzeppelin-contracts/lib/forge-std/.github/workflows/sync.yml +31 -0
- package/lib/openzeppelin-contracts/lib/forge-std/CONTRIBUTING.md +193 -0
- package/lib/openzeppelin-contracts/lib/forge-std/LICENSE-APACHE +203 -0
- package/lib/openzeppelin-contracts/lib/forge-std/LICENSE-MIT +25 -0
- package/lib/openzeppelin-contracts/lib/forge-std/README.md +266 -0
- package/lib/openzeppelin-contracts/lib/forge-std/foundry.toml +23 -0
- package/lib/openzeppelin-contracts/lib/forge-std/package.json +16 -0
- package/lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py +646 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/Base.sol +35 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/Script.sol +27 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdAssertions.sol +669 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdChains.sol +287 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdCheats.sol +829 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdError.sol +15 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdInvariant.sol +122 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdJson.sol +283 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdMath.sol +43 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdStorage.sol +473 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdStyle.sol +333 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdToml.sol +283 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdUtils.sol +209 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/Test.sol +33 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/Vm.sol +2263 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/console.sol +1560 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/console2.sol +4 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC1155.sol +105 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC165.sol +12 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC20.sol +43 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC4626.sol +190 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC721.sol +164 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IMulticall3.sol +73 -0
- package/lib/openzeppelin-contracts/lib/forge-std/src/safeconsole.sol +13937 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdAssertions.t.sol +141 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdChains.t.sol +227 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdCheats.t.sol +618 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdError.t.sol +120 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdJson.t.sol +49 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdMath.t.sol +202 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdStorage.t.sol +488 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdStyle.t.sol +110 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdToml.t.sol +49 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdUtils.t.sol +342 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/Vm.t.sol +18 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScript.sol +10 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol +10 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTest.sol +10 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTestBase.sol +10 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/broadcast.log.json +187 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/test.json +8 -0
- package/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/test.toml +6 -0
- package/lib/openzeppelin-contracts/lib/halmos-cheatcodes/LICENSE +661 -0
- package/lib/openzeppelin-contracts/lib/halmos-cheatcodes/README.md +97 -0
- package/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/SVM.sol +49 -0
- package/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/SymTest.sol +11 -0
- package/lib/openzeppelin-contracts/logo.svg +15 -0
- package/lib/openzeppelin-contracts/netlify.toml +3 -0
- package/lib/openzeppelin-contracts/package-lock.json +11090 -0
- package/lib/openzeppelin-contracts/package.json +107 -0
- package/lib/openzeppelin-contracts/remappings.txt +1 -0
- package/lib/openzeppelin-contracts/renovate.json +4 -0
- package/lib/openzeppelin-contracts/scripts/checks/compare-layout.js +28 -0
- package/lib/openzeppelin-contracts/scripts/checks/compareGasReports.js +249 -0
- package/lib/openzeppelin-contracts/scripts/checks/coverage.sh +24 -0
- package/lib/openzeppelin-contracts/scripts/checks/extract-layout.js +39 -0
- package/lib/openzeppelin-contracts/scripts/checks/generation.sh +6 -0
- package/lib/openzeppelin-contracts/scripts/checks/inheritance-ordering.js +55 -0
- package/lib/openzeppelin-contracts/scripts/checks/pragma-validity.js +45 -0
- package/lib/openzeppelin-contracts/scripts/fetch-common-contracts.js +50 -0
- package/lib/openzeppelin-contracts/scripts/gen-nav.js +81 -0
- package/lib/openzeppelin-contracts/scripts/generate/format-lines.js +16 -0
- package/lib/openzeppelin-contracts/scripts/generate/helpers/sanitize.js +5 -0
- package/lib/openzeppelin-contracts/scripts/generate/run.js +61 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/Arrays.js +454 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/Arrays.opts.js +9 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.js +242 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.opts.js +18 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.t.js +141 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/Enumerable.opts.js +53 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableMap.js +463 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableSet.js +469 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/MerkleProof.js +187 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/MerkleProof.opts.js +11 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/Packing.js +92 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/Packing.opts.js +3 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/Packing.t.js +48 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/SafeCast.js +136 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/Slot.opts.js +15 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/SlotDerivation.js +119 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/SlotDerivation.t.js +127 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/StorageSlot.js +77 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/StorageSlotMock.js +57 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/TransientSlot.js +80 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/TransientSlotMock.js +35 -0
- package/lib/openzeppelin-contracts/scripts/generate/templates/conversion.js +30 -0
- package/lib/openzeppelin-contracts/scripts/get-contracts-metadata.js +55 -0
- package/lib/openzeppelin-contracts/scripts/git-user-config.sh +6 -0
- package/lib/openzeppelin-contracts/scripts/helpers.js +7 -0
- package/lib/openzeppelin-contracts/scripts/minimize-pragma.js +138 -0
- package/lib/openzeppelin-contracts/scripts/prepack.sh +23 -0
- package/lib/openzeppelin-contracts/scripts/prepare-docs.sh +26 -0
- package/lib/openzeppelin-contracts/scripts/release/format-changelog.js +33 -0
- package/lib/openzeppelin-contracts/scripts/release/synchronize-versions.js +15 -0
- package/lib/openzeppelin-contracts/scripts/release/update-comment.js +34 -0
- package/lib/openzeppelin-contracts/scripts/release/version.sh +11 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/exit-prerelease.sh +8 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/github-release.js +48 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/integrity-check.sh +20 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/pack.sh +26 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/publish.sh +26 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/rerun.js +7 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/set-changesets-pr-title.js +17 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/start.sh +35 -0
- package/lib/openzeppelin-contracts/scripts/release/workflow/state.js +112 -0
- package/lib/openzeppelin-contracts/scripts/remove-ignored-artifacts.js +45 -0
- package/lib/openzeppelin-contracts/scripts/set-max-old-space-size.sh +10 -0
- package/lib/openzeppelin-contracts/scripts/solc-versions.js +15 -0
- package/lib/openzeppelin-contracts/scripts/solhint-custom/index.js +118 -0
- package/lib/openzeppelin-contracts/scripts/solhint-custom/package.json +8 -0
- package/lib/openzeppelin-contracts/scripts/update-docs-branch.js +65 -0
- package/lib/openzeppelin-contracts/scripts/upgradeable/README.md +21 -0
- package/lib/openzeppelin-contracts/scripts/upgradeable/alias/Initializable.sol +5 -0
- package/lib/openzeppelin-contracts/scripts/upgradeable/alias/UUPSUpgradeable.sol +5 -0
- package/lib/openzeppelin-contracts/scripts/upgradeable/patch-apply.sh +19 -0
- package/lib/openzeppelin-contracts/scripts/upgradeable/patch-save.sh +18 -0
- package/lib/openzeppelin-contracts/scripts/upgradeable/transpile-onto.sh +54 -0
- package/lib/openzeppelin-contracts/scripts/upgradeable/transpile.sh +49 -0
- package/lib/openzeppelin-contracts/scripts/upgradeable/upgradeable.patch +425 -0
- package/lib/openzeppelin-contracts/slither.config.json +4 -0
- package/lib/openzeppelin-contracts/solhint.config.js +29 -0
- package/lib/openzeppelin-contracts/test/TESTING.md +3 -0
- package/lib/openzeppelin-contracts/test/access/AccessControl.behavior.js +874 -0
- package/lib/openzeppelin-contracts/test/access/AccessControl.test.js +19 -0
- package/lib/openzeppelin-contracts/test/access/Ownable.test.js +79 -0
- package/lib/openzeppelin-contracts/test/access/Ownable2Step.test.js +102 -0
- package/lib/openzeppelin-contracts/test/access/extensions/AccessControlDefaultAdminRules.test.js +32 -0
- package/lib/openzeppelin-contracts/test/access/extensions/AccessControlEnumerable.test.js +24 -0
- package/lib/openzeppelin-contracts/test/access/manager/AccessManaged.test.js +146 -0
- package/lib/openzeppelin-contracts/test/access/manager/AccessManager.behavior.js +257 -0
- package/lib/openzeppelin-contracts/test/access/manager/AccessManager.predicate.js +456 -0
- package/lib/openzeppelin-contracts/test/access/manager/AccessManager.test.js +2489 -0
- package/lib/openzeppelin-contracts/test/access/manager/AuthorityUtils.test.js +112 -0
- package/lib/openzeppelin-contracts/test/account/Account.behavior.js +144 -0
- package/lib/openzeppelin-contracts/test/account/Account.test.js +48 -0
- package/lib/openzeppelin-contracts/test/account/AccountECDSA.test.js +52 -0
- package/lib/openzeppelin-contracts/test/account/AccountERC7702.t.sol +113 -0
- package/lib/openzeppelin-contracts/test/account/AccountERC7702.test.js +52 -0
- package/lib/openzeppelin-contracts/test/account/AccountERC7913.test.js +138 -0
- package/lib/openzeppelin-contracts/test/account/AccountMultiSigner.test.js +326 -0
- package/lib/openzeppelin-contracts/test/account/AccountMultiSignerWeighted.test.js +312 -0
- package/lib/openzeppelin-contracts/test/account/AccountP256.test.js +58 -0
- package/lib/openzeppelin-contracts/test/account/AccountRSA.test.js +58 -0
- package/lib/openzeppelin-contracts/test/account/AccountWebAuthn.test.js +88 -0
- package/lib/openzeppelin-contracts/test/account/examples/AccountERC7702WithModulesMock.test.js +99 -0
- package/lib/openzeppelin-contracts/test/account/extensions/AccountERC7579.behavior.js +601 -0
- package/lib/openzeppelin-contracts/test/account/extensions/AccountERC7579.test.js +60 -0
- package/lib/openzeppelin-contracts/test/account/extensions/AccountERC7579Hooked.test.js +60 -0
- package/lib/openzeppelin-contracts/test/account/extensions/ERC7821.behavior.js +145 -0
- package/lib/openzeppelin-contracts/test/account/utils/EIP7702Utils.test.js +53 -0
- package/lib/openzeppelin-contracts/test/account/utils/draft-ERC4337Utils.test.js +289 -0
- package/lib/openzeppelin-contracts/test/account/utils/draft-ERC7579Utils.t.sol +434 -0
- package/lib/openzeppelin-contracts/test/account/utils/draft-ERC7579Utils.test.js +399 -0
- package/lib/openzeppelin-contracts/test/crosschain/ERC7786Recipient.test.js +73 -0
- package/lib/openzeppelin-contracts/test/finance/VestingWallet.behavior.js +87 -0
- package/lib/openzeppelin-contracts/test/finance/VestingWallet.test.js +65 -0
- package/lib/openzeppelin-contracts/test/finance/VestingWalletCliff.test.js +70 -0
- package/lib/openzeppelin-contracts/test/governance/Governor.t.sol +59 -0
- package/lib/openzeppelin-contracts/test/governance/Governor.test.js +980 -0
- package/lib/openzeppelin-contracts/test/governance/TimelockController.test.js +1279 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorCountingFractional.test.js +248 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorCountingOverridable.test.js +346 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorERC721.test.js +131 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorNoncesKeyed.test.js +244 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorPreventLateQuorum.test.js +185 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorProposalGuardian.test.js +132 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorSequentialProposalId.test.js +202 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorStorage.test.js +155 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorSuperQuorum.test.js +168 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorSuperQuorumGreaterThanQuorum.t.sol +83 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockAccess.test.js +864 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockCompound.test.js +448 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockControl.test.js +504 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorVotesQuorumFraction.test.js +165 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorVotesSuperQuorumFraction.test.js +160 -0
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorWithParams.test.js +245 -0
- package/lib/openzeppelin-contracts/test/governance/utils/ERC6372.behavior.js +28 -0
- package/lib/openzeppelin-contracts/test/governance/utils/Votes.behavior.js +325 -0
- package/lib/openzeppelin-contracts/test/governance/utils/Votes.test.js +102 -0
- package/lib/openzeppelin-contracts/test/governance/utils/VotesExtended.test.js +152 -0
- package/lib/openzeppelin-contracts/test/helpers/access-manager.js +85 -0
- package/lib/openzeppelin-contracts/test/helpers/account.js +14 -0
- package/lib/openzeppelin-contracts/test/helpers/chains.js +56 -0
- package/lib/openzeppelin-contracts/test/helpers/constants.js +7 -0
- package/lib/openzeppelin-contracts/test/helpers/deploy.js +14 -0
- package/lib/openzeppelin-contracts/test/helpers/eip712-types.js +61 -0
- package/lib/openzeppelin-contracts/test/helpers/eip712.js +45 -0
- package/lib/openzeppelin-contracts/test/helpers/enums.js +14 -0
- package/lib/openzeppelin-contracts/test/helpers/erc4337.js +217 -0
- package/lib/openzeppelin-contracts/test/helpers/erc7579.js +58 -0
- package/lib/openzeppelin-contracts/test/helpers/erc7739.js +118 -0
- package/lib/openzeppelin-contracts/test/helpers/governance.js +217 -0
- package/lib/openzeppelin-contracts/test/helpers/iterate.js +41 -0
- package/lib/openzeppelin-contracts/test/helpers/math.js +33 -0
- package/lib/openzeppelin-contracts/test/helpers/methods.js +14 -0
- package/lib/openzeppelin-contracts/test/helpers/precompiles.js +12 -0
- package/lib/openzeppelin-contracts/test/helpers/random.js +24 -0
- package/lib/openzeppelin-contracts/test/helpers/signers.js +222 -0
- package/lib/openzeppelin-contracts/test/helpers/storage.js +48 -0
- package/lib/openzeppelin-contracts/test/helpers/strings.js +5 -0
- package/lib/openzeppelin-contracts/test/helpers/time.js +33 -0
- package/lib/openzeppelin-contracts/test/helpers/txpool.js +29 -0
- package/lib/openzeppelin-contracts/test/metatx/ERC2771Context.test.js +109 -0
- package/lib/openzeppelin-contracts/test/metatx/ERC2771Forwarder.t.sol +279 -0
- package/lib/openzeppelin-contracts/test/metatx/ERC2771Forwarder.test.js +384 -0
- package/lib/openzeppelin-contracts/test/proxy/Clones.behaviour.js +160 -0
- package/lib/openzeppelin-contracts/test/proxy/Clones.t.sol +91 -0
- package/lib/openzeppelin-contracts/test/proxy/Clones.test.js +177 -0
- package/lib/openzeppelin-contracts/test/proxy/ERC1967/ERC1967Proxy.test.js +23 -0
- package/lib/openzeppelin-contracts/test/proxy/ERC1967/ERC1967Utils.test.js +162 -0
- package/lib/openzeppelin-contracts/test/proxy/Proxy.behaviour.js +185 -0
- package/lib/openzeppelin-contracts/test/proxy/beacon/BeaconProxy.test.js +141 -0
- package/lib/openzeppelin-contracts/test/proxy/beacon/UpgradeableBeacon.test.js +55 -0
- package/lib/openzeppelin-contracts/test/proxy/transparent/ProxyAdmin.test.js +82 -0
- package/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js +357 -0
- package/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.test.js +28 -0
- package/lib/openzeppelin-contracts/test/proxy/utils/Initializable.test.js +216 -0
- package/lib/openzeppelin-contracts/test/proxy/utils/UUPSUpgradeable.test.js +120 -0
- package/lib/openzeppelin-contracts/test/sanity.test.js +27 -0
- package/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.behavior.js +763 -0
- package/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.test.js +213 -0
- package/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Burnable.test.js +66 -0
- package/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Pausable.test.js +105 -0
- package/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Supply.test.js +119 -0
- package/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155URIStorage.test.js +70 -0
- package/lib/openzeppelin-contracts/test/token/ERC1155/utils/ERC1155Holder.test.js +56 -0
- package/lib/openzeppelin-contracts/test/token/ERC1155/utils/ERC1155Utils.test.js +299 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/ERC20.behavior.js +269 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/ERC20.test.js +199 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC1363.test.js +370 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.test.js +105 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.test.js +55 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20FlashMint.test.js +164 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Pausable.test.js +129 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Permit.test.js +109 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Votes.test.js +546 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Wrapper.test.js +203 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC4626.t.sol +41 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC4626.test.js +888 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/draft-ERC20Bridgeable.test.js +89 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/draft-ERC20TemporaryApproval.test.js +142 -0
- package/lib/openzeppelin-contracts/test/token/ERC20/utils/SafeERC20.test.js +463 -0
- package/lib/openzeppelin-contracts/test/token/ERC6909/ERC6909.behavior.js +216 -0
- package/lib/openzeppelin-contracts/test/token/ERC6909/ERC6909.test.js +104 -0
- package/lib/openzeppelin-contracts/test/token/ERC6909/extensions/ERC6909ContentURI.test.js +49 -0
- package/lib/openzeppelin-contracts/test/token/ERC6909/extensions/ERC6909Metadata.test.js +58 -0
- package/lib/openzeppelin-contracts/test/token/ERC6909/extensions/ERC6909TokenSupply.test.js +53 -0
- package/lib/openzeppelin-contracts/test/token/ERC721/ERC721.behavior.js +946 -0
- package/lib/openzeppelin-contracts/test/token/ERC721/ERC721.test.js +23 -0
- package/lib/openzeppelin-contracts/test/token/ERC721/ERC721Enumerable.test.js +28 -0
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Burnable.test.js +77 -0
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Consecutive.t.sol +187 -0
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Consecutive.test.js +228 -0
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Pausable.test.js +81 -0
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Royalty.test.js +57 -0
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721URIStorage.test.js +121 -0
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Votes.test.js +194 -0
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Wrapper.test.js +201 -0
- package/lib/openzeppelin-contracts/test/token/ERC721/utils/ERC721Holder.test.js +20 -0
- package/lib/openzeppelin-contracts/test/token/ERC721/utils/ERC721Utils.test.js +94 -0
- package/lib/openzeppelin-contracts/test/token/common/ERC2981.behavior.js +152 -0
- package/lib/openzeppelin-contracts/test/utils/Address.test.js +332 -0
- package/lib/openzeppelin-contracts/test/utils/Arrays.t.sol +248 -0
- package/lib/openzeppelin-contracts/test/utils/Arrays.test.js +284 -0
- package/lib/openzeppelin-contracts/test/utils/Base58.t.sol +24 -0
- package/lib/openzeppelin-contracts/test/utils/Base58.test.js +65 -0
- package/lib/openzeppelin-contracts/test/utils/Base64.t.sol +36 -0
- package/lib/openzeppelin-contracts/test/utils/Base64.test.js +79 -0
- package/lib/openzeppelin-contracts/test/utils/Blockhash.t.sol +101 -0
- package/lib/openzeppelin-contracts/test/utils/Blockhash.test.js +59 -0
- package/lib/openzeppelin-contracts/test/utils/Bytes.t.sol +251 -0
- package/lib/openzeppelin-contracts/test/utils/Bytes.test.js +359 -0
- package/lib/openzeppelin-contracts/test/utils/CAIP.test.js +56 -0
- package/lib/openzeppelin-contracts/test/utils/Calldata.test.js +22 -0
- package/lib/openzeppelin-contracts/test/utils/Context.behavior.js +48 -0
- package/lib/openzeppelin-contracts/test/utils/Context.test.js +18 -0
- package/lib/openzeppelin-contracts/test/utils/Create2.t.sol +17 -0
- package/lib/openzeppelin-contracts/test/utils/Create2.test.js +190 -0
- package/lib/openzeppelin-contracts/test/utils/LowLevelCall.test.js +257 -0
- package/lib/openzeppelin-contracts/test/utils/Memory.t.sol +38 -0
- package/lib/openzeppelin-contracts/test/utils/Memory.test.js +106 -0
- package/lib/openzeppelin-contracts/test/utils/Multicall.test.js +72 -0
- package/lib/openzeppelin-contracts/test/utils/Nonces.behavior.js +189 -0
- package/lib/openzeppelin-contracts/test/utils/Nonces.test.js +16 -0
- package/lib/openzeppelin-contracts/test/utils/NoncesKeyed.t.sol +51 -0
- package/lib/openzeppelin-contracts/test/utils/NoncesKeyed.test.js +17 -0
- package/lib/openzeppelin-contracts/test/utils/Packing.t.sol +993 -0
- package/lib/openzeppelin-contracts/test/utils/Packing.test.js +70 -0
- package/lib/openzeppelin-contracts/test/utils/Panic.test.js +37 -0
- package/lib/openzeppelin-contracts/test/utils/Pausable.test.js +90 -0
- package/lib/openzeppelin-contracts/test/utils/RLP.t.sol +135 -0
- package/lib/openzeppelin-contracts/test/utils/RLP.test.js +149 -0
- package/lib/openzeppelin-contracts/test/utils/ReentrancyGuard.test.js +58 -0
- package/lib/openzeppelin-contracts/test/utils/RelayedCall.test.js +217 -0
- package/lib/openzeppelin-contracts/test/utils/ShortStrings.t.sol +109 -0
- package/lib/openzeppelin-contracts/test/utils/ShortStrings.test.js +64 -0
- package/lib/openzeppelin-contracts/test/utils/SlotDerivation.t.sol +248 -0
- package/lib/openzeppelin-contracts/test/utils/SlotDerivation.test.js +58 -0
- package/lib/openzeppelin-contracts/test/utils/StorageSlot.test.js +73 -0
- package/lib/openzeppelin-contracts/test/utils/Strings.t.sol +50 -0
- package/lib/openzeppelin-contracts/test/utils/Strings.test.js +360 -0
- package/lib/openzeppelin-contracts/test/utils/TransientSlot.test.js +59 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/ECDSA.test.js +318 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/EIP712.test.js +105 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/ERC1271.behavior.js +111 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/ERC7739.test.js +42 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/ERC7739Utils.test.js +203 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/MerkleProof.test.js +213 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/MessageHashUtils.t.sol +33 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/MessageHashUtils.test.js +97 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/P256.t.sol +65 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/P256.test.js +182 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/RSA.helper.js +17 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/RSA.test.js +102 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/SigVer15_186-3.rsp +3850 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/SignatureChecker.test.js +422 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/WebAuthn.t.sol +297 -0
- package/lib/openzeppelin-contracts/test/utils/cryptography/ecdsa_secp256r1_sha256_p1363_test.json +3719 -0
- package/lib/openzeppelin-contracts/test/utils/draft-InteroperableAddress.t.sol +99 -0
- package/lib/openzeppelin-contracts/test/utils/draft-InteroperableAddress.test.js +170 -0
- package/lib/openzeppelin-contracts/test/utils/introspection/ERC165.test.js +18 -0
- package/lib/openzeppelin-contracts/test/utils/introspection/ERC165Checker.test.js +272 -0
- package/lib/openzeppelin-contracts/test/utils/introspection/SupportsInterface.behavior.js +166 -0
- package/lib/openzeppelin-contracts/test/utils/math/Math.t.sol +370 -0
- package/lib/openzeppelin-contracts/test/utils/math/Math.test.js +746 -0
- package/lib/openzeppelin-contracts/test/utils/math/SafeCast.test.js +159 -0
- package/lib/openzeppelin-contracts/test/utils/math/SignedMath.t.sol +81 -0
- package/lib/openzeppelin-contracts/test/utils/math/SignedMath.test.js +53 -0
- package/lib/openzeppelin-contracts/test/utils/structs/Accumulators.t.sol +35 -0
- package/lib/openzeppelin-contracts/test/utils/structs/BitMap.test.js +149 -0
- package/lib/openzeppelin-contracts/test/utils/structs/Checkpoints.t.sol +440 -0
- package/lib/openzeppelin-contracts/test/utils/structs/Checkpoints.test.js +147 -0
- package/lib/openzeppelin-contracts/test/utils/structs/CircularBuffer.test.js +83 -0
- package/lib/openzeppelin-contracts/test/utils/structs/DoubleEndedQueue.test.js +102 -0
- package/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.behavior.js +214 -0
- package/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.test.js +83 -0
- package/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.behavior.js +175 -0
- package/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.test.js +66 -0
- package/lib/openzeppelin-contracts/test/utils/structs/Heap.t.sol +74 -0
- package/lib/openzeppelin-contracts/test/utils/structs/Heap.test.js +113 -0
- package/lib/openzeppelin-contracts/test/utils/structs/MerkleTree.test.js +180 -0
- package/lib/openzeppelin-contracts/test/utils/types/Time.test.js +135 -0
- package/package.json +3 -3
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __esm = (fn, res) => function __init() {
|
|
9
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
10
|
+
};
|
|
11
|
+
var __export = (target, all) => {
|
|
12
|
+
for (var name in all)
|
|
13
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
14
|
+
};
|
|
15
|
+
var __copyProps = (to, from, except, desc) => {
|
|
16
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
17
|
+
for (let key of __getOwnPropNames(from))
|
|
18
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
19
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
20
|
+
}
|
|
21
|
+
return to;
|
|
22
|
+
};
|
|
23
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
24
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
25
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
26
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
27
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
28
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
29
|
+
mod
|
|
30
|
+
));
|
|
31
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
32
|
+
|
|
33
|
+
// src/persistence/adapters/SQLiteAdapter.ts
|
|
34
|
+
var SQLiteAdapter_exports = {};
|
|
35
|
+
__export(SQLiteAdapter_exports, {
|
|
36
|
+
SQLiteAdapter: () => SQLiteAdapter
|
|
37
|
+
});
|
|
38
|
+
var import_better_sqlite3, SQLiteAdapter;
|
|
39
|
+
var init_SQLiteAdapter = __esm({
|
|
40
|
+
"src/persistence/adapters/SQLiteAdapter.ts"() {
|
|
41
|
+
"use strict";
|
|
42
|
+
import_better_sqlite3 = __toESM(require("better-sqlite3"), 1);
|
|
43
|
+
SQLiteAdapter = class {
|
|
44
|
+
constructor(config) {
|
|
45
|
+
this.config = config;
|
|
46
|
+
}
|
|
47
|
+
db;
|
|
48
|
+
async connect() {
|
|
49
|
+
this.db = new import_better_sqlite3.default(this.config.filename);
|
|
50
|
+
this.initSchema();
|
|
51
|
+
}
|
|
52
|
+
initSchema() {
|
|
53
|
+
this.db.exec(`
|
|
54
|
+
CREATE TABLE IF NOT EXISTS world_state (
|
|
55
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
56
|
+
phase TEXT NOT NULL,
|
|
57
|
+
tick INTEGER NOT NULL,
|
|
58
|
+
round INTEGER NOT NULL,
|
|
59
|
+
timestamp INTEGER NOT NULL,
|
|
60
|
+
metadata TEXT
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
64
|
+
id TEXT PRIMARY KEY,
|
|
65
|
+
type TEXT NOT NULL,
|
|
66
|
+
agent_url TEXT,
|
|
67
|
+
timestamp INTEGER NOT NULL,
|
|
68
|
+
data TEXT
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
72
|
+
url TEXT PRIMARY KEY,
|
|
73
|
+
name TEXT NOT NULL,
|
|
74
|
+
protocol_version TEXT NOT NULL,
|
|
75
|
+
skills TEXT NOT NULL,
|
|
76
|
+
capabilities TEXT NOT NULL,
|
|
77
|
+
joined_at INTEGER NOT NULL,
|
|
78
|
+
role TEXT,
|
|
79
|
+
metadata TEXT,
|
|
80
|
+
wallet_address TEXT
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
CREATE INDEX IF NOT EXISTS idx_events_type ON events(type);
|
|
84
|
+
CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);
|
|
85
|
+
CREATE INDEX IF NOT EXISTS idx_events_agent ON events(agent_url);
|
|
86
|
+
`);
|
|
87
|
+
}
|
|
88
|
+
async saveState(state) {
|
|
89
|
+
const stmt = this.db.prepare(`
|
|
90
|
+
INSERT OR REPLACE INTO world_state (id, phase, tick, round, timestamp, metadata)
|
|
91
|
+
VALUES (1, ?, ?, ?, ?, ?)
|
|
92
|
+
`);
|
|
93
|
+
stmt.run(
|
|
94
|
+
state.phase,
|
|
95
|
+
state.tick,
|
|
96
|
+
state.round,
|
|
97
|
+
state.timestamp,
|
|
98
|
+
JSON.stringify(state.metadata)
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
async loadState() {
|
|
102
|
+
const stmt = this.db.prepare("SELECT * FROM world_state WHERE id = 1");
|
|
103
|
+
const row = stmt.get();
|
|
104
|
+
if (!row) return null;
|
|
105
|
+
return {
|
|
106
|
+
phase: row.phase,
|
|
107
|
+
tick: row.tick,
|
|
108
|
+
round: row.round,
|
|
109
|
+
timestamp: row.timestamp,
|
|
110
|
+
metadata: JSON.parse(row.metadata || "{}")
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
async saveEvent(event) {
|
|
114
|
+
const stmt = this.db.prepare(`
|
|
115
|
+
INSERT INTO events (id, type, agent_url, timestamp, data)
|
|
116
|
+
VALUES (?, ?, ?, ?, ?)
|
|
117
|
+
`);
|
|
118
|
+
stmt.run(
|
|
119
|
+
event.id,
|
|
120
|
+
event.type,
|
|
121
|
+
event.agentUrl || null,
|
|
122
|
+
event.timestamp,
|
|
123
|
+
JSON.stringify(event.data || {})
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
async getEvents(filter) {
|
|
127
|
+
let query = "SELECT * FROM events WHERE 1=1";
|
|
128
|
+
const params = [];
|
|
129
|
+
if (filter?.type) {
|
|
130
|
+
query += " AND type = ?";
|
|
131
|
+
params.push(filter.type);
|
|
132
|
+
}
|
|
133
|
+
if (filter?.agentUrl) {
|
|
134
|
+
query += " AND agent_url = ?";
|
|
135
|
+
params.push(filter.agentUrl);
|
|
136
|
+
}
|
|
137
|
+
if (filter?.fromTimestamp) {
|
|
138
|
+
query += " AND timestamp >= ?";
|
|
139
|
+
params.push(filter.fromTimestamp);
|
|
140
|
+
}
|
|
141
|
+
if (filter?.toTimestamp) {
|
|
142
|
+
query += " AND timestamp <= ?";
|
|
143
|
+
params.push(filter.toTimestamp);
|
|
144
|
+
}
|
|
145
|
+
query += " ORDER BY timestamp DESC";
|
|
146
|
+
if (filter?.limit) {
|
|
147
|
+
query += " LIMIT ?";
|
|
148
|
+
params.push(filter.limit);
|
|
149
|
+
}
|
|
150
|
+
const stmt = this.db.prepare(query);
|
|
151
|
+
const rows = stmt.all(...params);
|
|
152
|
+
return rows.map((row) => ({
|
|
153
|
+
id: row.id,
|
|
154
|
+
type: row.type,
|
|
155
|
+
timestamp: row.timestamp,
|
|
156
|
+
agentUrl: row.agent_url || void 0,
|
|
157
|
+
data: JSON.parse(row.data || "{}")
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
160
|
+
async saveAgent(profile) {
|
|
161
|
+
const stmt = this.db.prepare(`
|
|
162
|
+
INSERT OR REPLACE INTO agents
|
|
163
|
+
(url, name, protocol_version, skills, capabilities, joined_at, role, metadata, wallet_address)
|
|
164
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
165
|
+
`);
|
|
166
|
+
stmt.run(
|
|
167
|
+
profile.url,
|
|
168
|
+
profile.name,
|
|
169
|
+
profile.protocolVersion,
|
|
170
|
+
JSON.stringify(profile.skills),
|
|
171
|
+
JSON.stringify(profile.capabilities),
|
|
172
|
+
profile.joinedAt,
|
|
173
|
+
profile.role || null,
|
|
174
|
+
JSON.stringify(profile.metadata || {}),
|
|
175
|
+
profile.walletAddress || null
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
async removeAgent(agentUrl) {
|
|
179
|
+
const stmt = this.db.prepare("DELETE FROM agents WHERE url = ?");
|
|
180
|
+
stmt.run(agentUrl);
|
|
181
|
+
}
|
|
182
|
+
async getAgents() {
|
|
183
|
+
const stmt = this.db.prepare("SELECT * FROM agents ORDER BY joined_at ASC");
|
|
184
|
+
const rows = stmt.all();
|
|
185
|
+
return rows.map((row) => ({
|
|
186
|
+
url: row.url,
|
|
187
|
+
name: row.name,
|
|
188
|
+
protocolVersion: row.protocol_version,
|
|
189
|
+
skills: JSON.parse(row.skills),
|
|
190
|
+
capabilities: JSON.parse(row.capabilities),
|
|
191
|
+
joinedAt: row.joined_at,
|
|
192
|
+
role: row.role || void 0,
|
|
193
|
+
metadata: JSON.parse(row.metadata || "{}"),
|
|
194
|
+
walletAddress: row.wallet_address || void 0
|
|
195
|
+
}));
|
|
196
|
+
}
|
|
197
|
+
async getAgent(agentUrl) {
|
|
198
|
+
const stmt = this.db.prepare("SELECT * FROM agents WHERE url = ?");
|
|
199
|
+
const row = stmt.get(agentUrl);
|
|
200
|
+
if (!row) return null;
|
|
201
|
+
return {
|
|
202
|
+
url: row.url,
|
|
203
|
+
name: row.name,
|
|
204
|
+
protocolVersion: row.protocol_version,
|
|
205
|
+
skills: JSON.parse(row.skills),
|
|
206
|
+
capabilities: JSON.parse(row.capabilities),
|
|
207
|
+
joinedAt: row.joined_at,
|
|
208
|
+
role: row.role || void 0,
|
|
209
|
+
metadata: JSON.parse(row.metadata || "{}"),
|
|
210
|
+
walletAddress: row.wallet_address || void 0
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
async disconnect() {
|
|
214
|
+
this.db.close();
|
|
215
|
+
}
|
|
216
|
+
async healthCheck() {
|
|
217
|
+
try {
|
|
218
|
+
const stmt = this.db.prepare("SELECT 1");
|
|
219
|
+
stmt.get();
|
|
220
|
+
return true;
|
|
221
|
+
} catch {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async clear() {
|
|
226
|
+
this.db.exec(`
|
|
227
|
+
DELETE FROM world_state;
|
|
228
|
+
DELETE FROM events;
|
|
229
|
+
DELETE FROM agents;
|
|
230
|
+
`);
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
// src/persistence/adapters/PostgresAdapter.ts
|
|
237
|
+
var PostgresAdapter_exports = {};
|
|
238
|
+
__export(PostgresAdapter_exports, {
|
|
239
|
+
PostgresAdapter: () => PostgresAdapter
|
|
240
|
+
});
|
|
241
|
+
var import_pg, Pool, PostgresAdapter;
|
|
242
|
+
var init_PostgresAdapter = __esm({
|
|
243
|
+
"src/persistence/adapters/PostgresAdapter.ts"() {
|
|
244
|
+
"use strict";
|
|
245
|
+
import_pg = __toESM(require("pg"), 1);
|
|
246
|
+
({ Pool } = import_pg.default);
|
|
247
|
+
PostgresAdapter = class {
|
|
248
|
+
constructor(config) {
|
|
249
|
+
this.config = config;
|
|
250
|
+
this.pool = new Pool({
|
|
251
|
+
host: config.host,
|
|
252
|
+
port: config.port || 5432,
|
|
253
|
+
database: config.database,
|
|
254
|
+
user: config.user,
|
|
255
|
+
password: config.password,
|
|
256
|
+
ssl: config.ssl ? { rejectUnauthorized: false } : void 0,
|
|
257
|
+
max: config.max || 10
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
pool;
|
|
261
|
+
connected = false;
|
|
262
|
+
async connect() {
|
|
263
|
+
try {
|
|
264
|
+
await this.pool.query("SELECT NOW()");
|
|
265
|
+
await this.initSchema();
|
|
266
|
+
this.connected = true;
|
|
267
|
+
} catch (error) {
|
|
268
|
+
throw new Error(`PostgreSQL connection failed: ${error.message}`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
async initSchema() {
|
|
272
|
+
const client = await this.pool.connect();
|
|
273
|
+
try {
|
|
274
|
+
await client.query("BEGIN");
|
|
275
|
+
await client.query(`
|
|
276
|
+
CREATE TABLE IF NOT EXISTS world_state (
|
|
277
|
+
id SERIAL PRIMARY KEY,
|
|
278
|
+
phase VARCHAR(50) NOT NULL,
|
|
279
|
+
tick INTEGER NOT NULL,
|
|
280
|
+
round INTEGER NOT NULL,
|
|
281
|
+
timestamp BIGINT NOT NULL,
|
|
282
|
+
metadata JSONB DEFAULT '{}'::jsonb,
|
|
283
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
284
|
+
)
|
|
285
|
+
`);
|
|
286
|
+
await client.query(`
|
|
287
|
+
CREATE TABLE IF NOT EXISTS world_events (
|
|
288
|
+
id VARCHAR(255) PRIMARY KEY,
|
|
289
|
+
type VARCHAR(100) NOT NULL,
|
|
290
|
+
timestamp BIGINT NOT NULL,
|
|
291
|
+
agent_url VARCHAR(500),
|
|
292
|
+
data JSONB DEFAULT '{}'::jsonb,
|
|
293
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
294
|
+
)
|
|
295
|
+
`);
|
|
296
|
+
await client.query(`
|
|
297
|
+
CREATE INDEX IF NOT EXISTS idx_events_type ON world_events(type)
|
|
298
|
+
`);
|
|
299
|
+
await client.query(`
|
|
300
|
+
CREATE INDEX IF NOT EXISTS idx_events_timestamp ON world_events(timestamp)
|
|
301
|
+
`);
|
|
302
|
+
await client.query(`
|
|
303
|
+
CREATE TABLE IF NOT EXISTS agent_profiles (
|
|
304
|
+
url VARCHAR(500) PRIMARY KEY,
|
|
305
|
+
name VARCHAR(255) NOT NULL,
|
|
306
|
+
protocol_version VARCHAR(50) NOT NULL,
|
|
307
|
+
skills JSONB NOT NULL,
|
|
308
|
+
capabilities JSONB NOT NULL,
|
|
309
|
+
joined_at BIGINT NOT NULL,
|
|
310
|
+
role VARCHAR(100),
|
|
311
|
+
metadata JSONB DEFAULT '{}'::jsonb,
|
|
312
|
+
wallet_address VARCHAR(255),
|
|
313
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
314
|
+
)
|
|
315
|
+
`);
|
|
316
|
+
await client.query("COMMIT");
|
|
317
|
+
} catch (error) {
|
|
318
|
+
await client.query("ROLLBACK");
|
|
319
|
+
throw error;
|
|
320
|
+
} finally {
|
|
321
|
+
client.release();
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
async saveState(state) {
|
|
325
|
+
await this.pool.query(
|
|
326
|
+
`INSERT INTO world_state (phase, tick, round, timestamp, metadata)
|
|
327
|
+
VALUES ($1, $2, $3, $4, $5)`,
|
|
328
|
+
[state.phase, state.tick, state.round, state.timestamp, JSON.stringify(state.metadata)]
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
async loadState() {
|
|
332
|
+
const result = await this.pool.query(
|
|
333
|
+
"SELECT * FROM world_state ORDER BY id DESC LIMIT 1"
|
|
334
|
+
);
|
|
335
|
+
if (result.rows.length === 0) {
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
const row = result.rows[0];
|
|
339
|
+
return {
|
|
340
|
+
phase: row.phase,
|
|
341
|
+
tick: row.tick,
|
|
342
|
+
round: row.round,
|
|
343
|
+
timestamp: parseInt(row.timestamp),
|
|
344
|
+
metadata: row.metadata
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
async saveEvent(event) {
|
|
348
|
+
await this.pool.query(
|
|
349
|
+
`INSERT INTO world_events (id, type, timestamp, agent_url, data)
|
|
350
|
+
VALUES ($1, $2, $3, $4, $5)`,
|
|
351
|
+
[event.id, event.type, event.timestamp, event.agentUrl || null, JSON.stringify(event.data)]
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
async getEvents(filter) {
|
|
355
|
+
let query = "SELECT * FROM world_events WHERE 1=1";
|
|
356
|
+
const params = [];
|
|
357
|
+
let paramCount = 1;
|
|
358
|
+
if (filter?.type) {
|
|
359
|
+
query += ` AND type = $${paramCount++}`;
|
|
360
|
+
params.push(filter.type);
|
|
361
|
+
}
|
|
362
|
+
if (filter?.agentUrl) {
|
|
363
|
+
query += ` AND agent_url = $${paramCount++}`;
|
|
364
|
+
params.push(filter.agentUrl);
|
|
365
|
+
}
|
|
366
|
+
if (filter?.since) {
|
|
367
|
+
query += ` AND timestamp >= $${paramCount++}`;
|
|
368
|
+
params.push(filter.since);
|
|
369
|
+
}
|
|
370
|
+
if (filter?.until) {
|
|
371
|
+
query += ` AND timestamp <= $${paramCount++}`;
|
|
372
|
+
params.push(filter.until);
|
|
373
|
+
}
|
|
374
|
+
query += " ORDER BY timestamp DESC";
|
|
375
|
+
if (filter?.limit) {
|
|
376
|
+
query += ` LIMIT $${paramCount++}`;
|
|
377
|
+
params.push(filter.limit);
|
|
378
|
+
}
|
|
379
|
+
const result = await this.pool.query(query, params);
|
|
380
|
+
return result.rows.map((row) => ({
|
|
381
|
+
id: row.id,
|
|
382
|
+
type: row.type,
|
|
383
|
+
timestamp: parseInt(row.timestamp),
|
|
384
|
+
agentUrl: row.agent_url,
|
|
385
|
+
data: row.data
|
|
386
|
+
}));
|
|
387
|
+
}
|
|
388
|
+
async saveAgent(profile) {
|
|
389
|
+
await this.pool.query(
|
|
390
|
+
`INSERT INTO agent_profiles
|
|
391
|
+
(url, name, protocol_version, skills, capabilities, joined_at, role, metadata, wallet_address)
|
|
392
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
|
|
393
|
+
ON CONFLICT (url) DO UPDATE SET
|
|
394
|
+
name = EXCLUDED.name,
|
|
395
|
+
protocol_version = EXCLUDED.protocol_version,
|
|
396
|
+
skills = EXCLUDED.skills,
|
|
397
|
+
capabilities = EXCLUDED.capabilities,
|
|
398
|
+
role = EXCLUDED.role,
|
|
399
|
+
metadata = EXCLUDED.metadata,
|
|
400
|
+
wallet_address = EXCLUDED.wallet_address`,
|
|
401
|
+
[
|
|
402
|
+
profile.url,
|
|
403
|
+
profile.name,
|
|
404
|
+
profile.protocolVersion,
|
|
405
|
+
JSON.stringify(profile.skills),
|
|
406
|
+
JSON.stringify(profile.capabilities),
|
|
407
|
+
profile.joinedAt,
|
|
408
|
+
profile.role || null,
|
|
409
|
+
JSON.stringify(profile.metadata || {}),
|
|
410
|
+
profile.walletAddress || null
|
|
411
|
+
]
|
|
412
|
+
);
|
|
413
|
+
}
|
|
414
|
+
async removeAgent(agentUrl) {
|
|
415
|
+
await this.pool.query("DELETE FROM agent_profiles WHERE url = $1", [agentUrl]);
|
|
416
|
+
}
|
|
417
|
+
async getAgents() {
|
|
418
|
+
const result = await this.pool.query(
|
|
419
|
+
"SELECT * FROM agent_profiles ORDER BY joined_at ASC"
|
|
420
|
+
);
|
|
421
|
+
return result.rows.map((row) => ({
|
|
422
|
+
url: row.url,
|
|
423
|
+
name: row.name,
|
|
424
|
+
protocolVersion: row.protocol_version,
|
|
425
|
+
skills: row.skills,
|
|
426
|
+
capabilities: row.capabilities,
|
|
427
|
+
joinedAt: parseInt(row.joined_at),
|
|
428
|
+
role: row.role,
|
|
429
|
+
metadata: row.metadata,
|
|
430
|
+
walletAddress: row.wallet_address
|
|
431
|
+
}));
|
|
432
|
+
}
|
|
433
|
+
async getAgent(agentUrl) {
|
|
434
|
+
const result = await this.pool.query(
|
|
435
|
+
"SELECT * FROM agent_profiles WHERE url = $1",
|
|
436
|
+
[agentUrl]
|
|
437
|
+
);
|
|
438
|
+
if (result.rows.length === 0) {
|
|
439
|
+
return null;
|
|
440
|
+
}
|
|
441
|
+
const row = result.rows[0];
|
|
442
|
+
return {
|
|
443
|
+
url: row.url,
|
|
444
|
+
name: row.name,
|
|
445
|
+
protocolVersion: row.protocol_version,
|
|
446
|
+
skills: row.skills,
|
|
447
|
+
capabilities: row.capabilities,
|
|
448
|
+
joinedAt: parseInt(row.joined_at),
|
|
449
|
+
role: row.role,
|
|
450
|
+
metadata: row.metadata,
|
|
451
|
+
walletAddress: row.wallet_address
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
async disconnect() {
|
|
455
|
+
await this.pool.end();
|
|
456
|
+
this.connected = false;
|
|
457
|
+
}
|
|
458
|
+
async healthCheck() {
|
|
459
|
+
try {
|
|
460
|
+
await this.pool.query("SELECT 1");
|
|
461
|
+
return true;
|
|
462
|
+
} catch {
|
|
463
|
+
return false;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
async clear() {
|
|
467
|
+
const client = await this.pool.connect();
|
|
468
|
+
try {
|
|
469
|
+
await client.query("BEGIN");
|
|
470
|
+
await client.query("TRUNCATE world_state, world_events, agent_profiles");
|
|
471
|
+
await client.query("COMMIT");
|
|
472
|
+
} catch (error) {
|
|
473
|
+
await client.query("ROLLBACK");
|
|
474
|
+
throw error;
|
|
475
|
+
} finally {
|
|
476
|
+
client.release();
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
// src/persistence/adapters/RedisAdapter.ts
|
|
484
|
+
var RedisAdapter_exports = {};
|
|
485
|
+
__export(RedisAdapter_exports, {
|
|
486
|
+
RedisAdapter: () => RedisAdapter
|
|
487
|
+
});
|
|
488
|
+
var import_ioredis, RedisAdapter;
|
|
489
|
+
var init_RedisAdapter = __esm({
|
|
490
|
+
"src/persistence/adapters/RedisAdapter.ts"() {
|
|
491
|
+
"use strict";
|
|
492
|
+
import_ioredis = require("ioredis");
|
|
493
|
+
RedisAdapter = class {
|
|
494
|
+
constructor(config) {
|
|
495
|
+
this.config = config;
|
|
496
|
+
this.keyPrefix = config.keyPrefix || "world:";
|
|
497
|
+
this.client = new import_ioredis.Redis({
|
|
498
|
+
host: config.host,
|
|
499
|
+
port: config.port || 6379,
|
|
500
|
+
password: config.password,
|
|
501
|
+
db: config.db || 0
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
client;
|
|
505
|
+
connected = false;
|
|
506
|
+
keyPrefix;
|
|
507
|
+
async connect() {
|
|
508
|
+
try {
|
|
509
|
+
await this.client.ping();
|
|
510
|
+
this.connected = true;
|
|
511
|
+
} catch (error) {
|
|
512
|
+
throw new Error(`Redis connection failed: ${error.message}`);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
async saveState(state) {
|
|
516
|
+
const key = `${this.keyPrefix}state`;
|
|
517
|
+
await this.client.set(key, JSON.stringify(state));
|
|
518
|
+
const historyKey = `${this.keyPrefix}state:history`;
|
|
519
|
+
await this.client.zadd(historyKey, state.timestamp, JSON.stringify(state));
|
|
520
|
+
}
|
|
521
|
+
async loadState() {
|
|
522
|
+
const key = `${this.keyPrefix}state`;
|
|
523
|
+
const data = await this.client.get(key);
|
|
524
|
+
if (!data) {
|
|
525
|
+
return null;
|
|
526
|
+
}
|
|
527
|
+
return JSON.parse(data);
|
|
528
|
+
}
|
|
529
|
+
async saveEvent(event) {
|
|
530
|
+
const eventsKey = `${this.keyPrefix}events`;
|
|
531
|
+
await this.client.zadd(eventsKey, event.timestamp, JSON.stringify(event));
|
|
532
|
+
const typeKey = `${this.keyPrefix}events:type:${event.type}`;
|
|
533
|
+
await this.client.zadd(typeKey, event.timestamp, JSON.stringify(event));
|
|
534
|
+
if (event.agentUrl) {
|
|
535
|
+
const agentKey = `${this.keyPrefix}events:agent:${event.agentUrl}`;
|
|
536
|
+
await this.client.zadd(agentKey, event.timestamp, JSON.stringify(event));
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
async getEvents(filter) {
|
|
540
|
+
let key = `${this.keyPrefix}events`;
|
|
541
|
+
if (filter?.type) {
|
|
542
|
+
key = `${this.keyPrefix}events:type:${filter.type}`;
|
|
543
|
+
} else if (filter?.agentUrl) {
|
|
544
|
+
key = `${this.keyPrefix}events:agent:${filter.agentUrl}`;
|
|
545
|
+
}
|
|
546
|
+
const min = filter?.since || "-inf";
|
|
547
|
+
const max = filter?.until || "+inf";
|
|
548
|
+
const count = filter?.limit || -1;
|
|
549
|
+
const results = await this.client.zrevrangebyscore(
|
|
550
|
+
key,
|
|
551
|
+
max,
|
|
552
|
+
min,
|
|
553
|
+
"LIMIT",
|
|
554
|
+
0,
|
|
555
|
+
count === -1 ? 100 : count
|
|
556
|
+
);
|
|
557
|
+
return results.map((r) => JSON.parse(r));
|
|
558
|
+
}
|
|
559
|
+
async saveAgent(profile) {
|
|
560
|
+
const key = `${this.keyPrefix}agent:${profile.url}`;
|
|
561
|
+
await this.client.set(key, JSON.stringify(profile));
|
|
562
|
+
const agentsKey = `${this.keyPrefix}agents`;
|
|
563
|
+
await this.client.sadd(agentsKey, profile.url);
|
|
564
|
+
}
|
|
565
|
+
async removeAgent(agentUrl) {
|
|
566
|
+
const key = `${this.keyPrefix}agent:${agentUrl}`;
|
|
567
|
+
await this.client.del(key);
|
|
568
|
+
const agentsKey = `${this.keyPrefix}agents`;
|
|
569
|
+
await this.client.srem(agentsKey, agentUrl);
|
|
570
|
+
}
|
|
571
|
+
async getAgents() {
|
|
572
|
+
const agentsKey = `${this.keyPrefix}agents`;
|
|
573
|
+
const urls = await this.client.smembers(agentsKey);
|
|
574
|
+
if (urls.length === 0) {
|
|
575
|
+
return [];
|
|
576
|
+
}
|
|
577
|
+
const keys = urls.map((url) => `${this.keyPrefix}agent:${url}`);
|
|
578
|
+
const results = await this.client.mget(...keys);
|
|
579
|
+
return results.filter((r) => r !== null).map((r) => JSON.parse(r));
|
|
580
|
+
}
|
|
581
|
+
async getAgent(agentUrl) {
|
|
582
|
+
const key = `${this.keyPrefix}agent:${agentUrl}`;
|
|
583
|
+
const data = await this.client.get(key);
|
|
584
|
+
if (!data) {
|
|
585
|
+
return null;
|
|
586
|
+
}
|
|
587
|
+
return JSON.parse(data);
|
|
588
|
+
}
|
|
589
|
+
async disconnect() {
|
|
590
|
+
await this.client.quit();
|
|
591
|
+
this.connected = false;
|
|
592
|
+
}
|
|
593
|
+
async healthCheck() {
|
|
594
|
+
try {
|
|
595
|
+
await this.client.ping();
|
|
596
|
+
return true;
|
|
597
|
+
} catch {
|
|
598
|
+
return false;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
async clear() {
|
|
602
|
+
const pattern = `${this.keyPrefix}*`;
|
|
603
|
+
const keys = await this.client.keys(pattern);
|
|
604
|
+
if (keys.length > 0) {
|
|
605
|
+
await this.client.del(...keys);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
};
|
|
609
|
+
}
|
|
610
|
+
});
|
|
611
|
+
|
|
612
|
+
// src/persistence/adapters/MongoAdapter.ts
|
|
613
|
+
var MongoAdapter_exports = {};
|
|
614
|
+
__export(MongoAdapter_exports, {
|
|
615
|
+
MongoAdapter: () => MongoAdapter
|
|
616
|
+
});
|
|
617
|
+
var import_mongodb, MongoAdapter;
|
|
618
|
+
var init_MongoAdapter = __esm({
|
|
619
|
+
"src/persistence/adapters/MongoAdapter.ts"() {
|
|
620
|
+
"use strict";
|
|
621
|
+
import_mongodb = require("mongodb");
|
|
622
|
+
MongoAdapter = class {
|
|
623
|
+
constructor(config) {
|
|
624
|
+
this.config = config;
|
|
625
|
+
this.client = new import_mongodb.MongoClient(config.url, {
|
|
626
|
+
useUnifiedTopology: config.useUnifiedTopology !== false
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
client;
|
|
630
|
+
db;
|
|
631
|
+
stateCollection;
|
|
632
|
+
eventsCollection;
|
|
633
|
+
agentsCollection;
|
|
634
|
+
connected = false;
|
|
635
|
+
async connect() {
|
|
636
|
+
try {
|
|
637
|
+
await this.client.connect();
|
|
638
|
+
this.db = this.client.db(this.config.database);
|
|
639
|
+
this.stateCollection = this.db.collection("world_state");
|
|
640
|
+
this.eventsCollection = this.db.collection("world_events");
|
|
641
|
+
this.agentsCollection = this.db.collection("agent_profiles");
|
|
642
|
+
await this.initIndexes();
|
|
643
|
+
this.connected = true;
|
|
644
|
+
} catch (error) {
|
|
645
|
+
throw new Error(`MongoDB connection failed: ${error.message}`);
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
async initIndexes() {
|
|
649
|
+
await this.eventsCollection.createIndex({ type: 1 });
|
|
650
|
+
await this.eventsCollection.createIndex({ timestamp: -1 });
|
|
651
|
+
await this.eventsCollection.createIndex({ agentUrl: 1 });
|
|
652
|
+
await this.eventsCollection.createIndex({ type: 1, timestamp: -1 });
|
|
653
|
+
await this.agentsCollection.createIndex({ url: 1 }, { unique: true });
|
|
654
|
+
await this.agentsCollection.createIndex({ joinedAt: 1 });
|
|
655
|
+
await this.stateCollection.createIndex({ timestamp: -1 });
|
|
656
|
+
}
|
|
657
|
+
async saveState(state) {
|
|
658
|
+
await this.stateCollection.insertOne({
|
|
659
|
+
...state,
|
|
660
|
+
_createdAt: /* @__PURE__ */ new Date()
|
|
661
|
+
});
|
|
662
|
+
}
|
|
663
|
+
async loadState() {
|
|
664
|
+
const doc = await this.stateCollection.findOne(
|
|
665
|
+
{},
|
|
666
|
+
{ sort: { timestamp: -1 } }
|
|
667
|
+
);
|
|
668
|
+
if (!doc) {
|
|
669
|
+
return null;
|
|
670
|
+
}
|
|
671
|
+
const { _id, _createdAt, ...state } = doc;
|
|
672
|
+
return state;
|
|
673
|
+
}
|
|
674
|
+
async saveEvent(event) {
|
|
675
|
+
await this.eventsCollection.insertOne({
|
|
676
|
+
_id: event.id,
|
|
677
|
+
...event,
|
|
678
|
+
_createdAt: /* @__PURE__ */ new Date()
|
|
679
|
+
});
|
|
680
|
+
}
|
|
681
|
+
async getEvents(filter) {
|
|
682
|
+
const query = {};
|
|
683
|
+
if (filter?.type) {
|
|
684
|
+
query.type = filter.type;
|
|
685
|
+
}
|
|
686
|
+
if (filter?.agentUrl) {
|
|
687
|
+
query.agentUrl = filter.agentUrl;
|
|
688
|
+
}
|
|
689
|
+
if (filter?.since || filter?.until) {
|
|
690
|
+
query.timestamp = {};
|
|
691
|
+
if (filter.since) {
|
|
692
|
+
query.timestamp.$gte = filter.since;
|
|
693
|
+
}
|
|
694
|
+
if (filter.until) {
|
|
695
|
+
query.timestamp.$lte = filter.until;
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
const cursor = this.eventsCollection.find(query).sort({ timestamp: -1 });
|
|
699
|
+
if (filter?.limit) {
|
|
700
|
+
cursor.limit(filter.limit);
|
|
701
|
+
}
|
|
702
|
+
const docs = await cursor.toArray();
|
|
703
|
+
return docs.map((doc) => {
|
|
704
|
+
const { _id, _createdAt, ...event } = doc;
|
|
705
|
+
return event;
|
|
706
|
+
});
|
|
707
|
+
}
|
|
708
|
+
async saveAgent(profile) {
|
|
709
|
+
await this.agentsCollection.updateOne(
|
|
710
|
+
{ url: profile.url },
|
|
711
|
+
{ $set: { ...profile, _updatedAt: /* @__PURE__ */ new Date() } },
|
|
712
|
+
{ upsert: true }
|
|
713
|
+
);
|
|
714
|
+
}
|
|
715
|
+
async removeAgent(agentUrl) {
|
|
716
|
+
await this.agentsCollection.deleteOne({ url: agentUrl });
|
|
717
|
+
}
|
|
718
|
+
async getAgents() {
|
|
719
|
+
const docs = await this.agentsCollection.find({}).sort({ joinedAt: 1 }).toArray();
|
|
720
|
+
return docs.map((doc) => {
|
|
721
|
+
const { _id, _updatedAt, ...profile } = doc;
|
|
722
|
+
return profile;
|
|
723
|
+
});
|
|
724
|
+
}
|
|
725
|
+
async getAgent(agentUrl) {
|
|
726
|
+
const doc = await this.agentsCollection.findOne({ url: agentUrl });
|
|
727
|
+
if (!doc) {
|
|
728
|
+
return null;
|
|
729
|
+
}
|
|
730
|
+
const { _id, _updatedAt, ...profile } = doc;
|
|
731
|
+
return profile;
|
|
732
|
+
}
|
|
733
|
+
async disconnect() {
|
|
734
|
+
await this.client.close();
|
|
735
|
+
this.connected = false;
|
|
736
|
+
}
|
|
737
|
+
async healthCheck() {
|
|
738
|
+
try {
|
|
739
|
+
await this.db.admin().ping();
|
|
740
|
+
return true;
|
|
741
|
+
} catch {
|
|
742
|
+
return false;
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
async clear() {
|
|
746
|
+
await Promise.all([
|
|
747
|
+
this.stateCollection.deleteMany({}),
|
|
748
|
+
this.eventsCollection.deleteMany({}),
|
|
749
|
+
this.agentsCollection.deleteMany({})
|
|
750
|
+
]);
|
|
751
|
+
}
|
|
752
|
+
};
|
|
753
|
+
}
|
|
754
|
+
});
|
|
755
|
+
|
|
756
|
+
// src/persistence/adapters/LevelDBAdapter.ts
|
|
757
|
+
var LevelDBAdapter_exports = {};
|
|
758
|
+
__export(LevelDBAdapter_exports, {
|
|
759
|
+
LevelDBAdapter: () => LevelDBAdapter
|
|
760
|
+
});
|
|
761
|
+
var import_level, LevelDBAdapter;
|
|
762
|
+
var init_LevelDBAdapter = __esm({
|
|
763
|
+
"src/persistence/adapters/LevelDBAdapter.ts"() {
|
|
764
|
+
"use strict";
|
|
765
|
+
import_level = require("level");
|
|
766
|
+
LevelDBAdapter = class {
|
|
767
|
+
constructor(config) {
|
|
768
|
+
this.config = config;
|
|
769
|
+
}
|
|
770
|
+
db;
|
|
771
|
+
connected = false;
|
|
772
|
+
async connect() {
|
|
773
|
+
try {
|
|
774
|
+
this.db = new import_level.Level(this.config.path, {
|
|
775
|
+
valueEncoding: "json"
|
|
776
|
+
});
|
|
777
|
+
await this.db.open();
|
|
778
|
+
this.connected = true;
|
|
779
|
+
} catch (error) {
|
|
780
|
+
throw new Error(`LevelDB connection failed: ${error.message}`);
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
async saveState(state) {
|
|
784
|
+
await this.db.put("state:current", JSON.stringify(state));
|
|
785
|
+
const historyKey = `state:history:${state.timestamp}`;
|
|
786
|
+
await this.db.put(historyKey, JSON.stringify(state));
|
|
787
|
+
}
|
|
788
|
+
async loadState() {
|
|
789
|
+
try {
|
|
790
|
+
const data = await this.db.get("state:current");
|
|
791
|
+
return JSON.parse(data);
|
|
792
|
+
} catch (error) {
|
|
793
|
+
if (error.code === "LEVEL_NOT_FOUND") {
|
|
794
|
+
return null;
|
|
795
|
+
}
|
|
796
|
+
throw error;
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
async saveEvent(event) {
|
|
800
|
+
const key = `event:${event.timestamp}:${event.id}`;
|
|
801
|
+
await this.db.put(key, JSON.stringify(event));
|
|
802
|
+
const typeKey = `event:type:${event.type}:${event.timestamp}:${event.id}`;
|
|
803
|
+
await this.db.put(typeKey, JSON.stringify(event));
|
|
804
|
+
if (event.agentUrl) {
|
|
805
|
+
const agentKey = `event:agent:${event.agentUrl}:${event.timestamp}:${event.id}`;
|
|
806
|
+
await this.db.put(agentKey, JSON.stringify(event));
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
async getEvents(filter) {
|
|
810
|
+
const events = [];
|
|
811
|
+
let prefix = "event:";
|
|
812
|
+
if (filter?.type) {
|
|
813
|
+
prefix = `event:type:${filter.type}:`;
|
|
814
|
+
} else if (filter?.agentUrl) {
|
|
815
|
+
prefix = `event:agent:${filter.agentUrl}:`;
|
|
816
|
+
}
|
|
817
|
+
const iterator = this.db.iterator({
|
|
818
|
+
gte: prefix,
|
|
819
|
+
lte: prefix + "\uFFFF",
|
|
820
|
+
reverse: true,
|
|
821
|
+
// Most recent first
|
|
822
|
+
limit: filter?.limit || -1
|
|
823
|
+
});
|
|
824
|
+
for await (const [key, value] of iterator) {
|
|
825
|
+
const event = JSON.parse(value);
|
|
826
|
+
if (filter?.since && event.timestamp < filter.since) continue;
|
|
827
|
+
if (filter?.until && event.timestamp > filter.until) continue;
|
|
828
|
+
if (filter?.type && !prefix.includes("type:") && event.type !== filter.type) {
|
|
829
|
+
continue;
|
|
830
|
+
}
|
|
831
|
+
if (filter?.agentUrl && !prefix.includes("agent:") && event.agentUrl !== filter.agentUrl) {
|
|
832
|
+
continue;
|
|
833
|
+
}
|
|
834
|
+
events.push(event);
|
|
835
|
+
if (filter?.limit && events.length >= filter.limit) {
|
|
836
|
+
break;
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
return events;
|
|
840
|
+
}
|
|
841
|
+
async saveAgent(profile) {
|
|
842
|
+
const key = `agent:${profile.url}`;
|
|
843
|
+
await this.db.put(key, JSON.stringify(profile));
|
|
844
|
+
const listKey = `agent:list:${profile.joinedAt}:${profile.url}`;
|
|
845
|
+
await this.db.put(listKey, profile.url);
|
|
846
|
+
}
|
|
847
|
+
async removeAgent(agentUrl) {
|
|
848
|
+
const key = `agent:${agentUrl}`;
|
|
849
|
+
try {
|
|
850
|
+
const data = await this.db.get(key);
|
|
851
|
+
const profile = JSON.parse(data);
|
|
852
|
+
await this.db.del(key);
|
|
853
|
+
const listKey = `agent:list:${profile.joinedAt}:${agentUrl}`;
|
|
854
|
+
await this.db.del(listKey);
|
|
855
|
+
} catch (error) {
|
|
856
|
+
if (error.code !== "LEVEL_NOT_FOUND") {
|
|
857
|
+
throw error;
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
async getAgents() {
|
|
862
|
+
const agents = [];
|
|
863
|
+
const iterator = this.db.iterator({
|
|
864
|
+
gte: "agent:list:",
|
|
865
|
+
lte: "agent:list:\uFFFF"
|
|
866
|
+
});
|
|
867
|
+
for await (const [key, agentUrl] of iterator) {
|
|
868
|
+
try {
|
|
869
|
+
const data = await this.db.get(`agent:${agentUrl}`);
|
|
870
|
+
agents.push(JSON.parse(data));
|
|
871
|
+
} catch (error) {
|
|
872
|
+
if (error.code !== "LEVEL_NOT_FOUND") {
|
|
873
|
+
throw error;
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
return agents;
|
|
878
|
+
}
|
|
879
|
+
async getAgent(agentUrl) {
|
|
880
|
+
try {
|
|
881
|
+
const data = await this.db.get(`agent:${agentUrl}`);
|
|
882
|
+
return JSON.parse(data);
|
|
883
|
+
} catch (error) {
|
|
884
|
+
if (error.code === "LEVEL_NOT_FOUND") {
|
|
885
|
+
return null;
|
|
886
|
+
}
|
|
887
|
+
throw error;
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
async disconnect() {
|
|
891
|
+
await this.db.close();
|
|
892
|
+
this.connected = false;
|
|
893
|
+
}
|
|
894
|
+
async healthCheck() {
|
|
895
|
+
try {
|
|
896
|
+
await this.db.get("health:check").catch(() => {
|
|
897
|
+
});
|
|
898
|
+
return true;
|
|
899
|
+
} catch {
|
|
900
|
+
return false;
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
async clear() {
|
|
904
|
+
await this.db.clear();
|
|
905
|
+
}
|
|
906
|
+
};
|
|
907
|
+
}
|
|
908
|
+
});
|
|
909
|
+
|
|
910
|
+
// src/logger.ts
|
|
911
|
+
function createLogger(moduleName) {
|
|
912
|
+
return logger.child({ module: moduleName });
|
|
913
|
+
}
|
|
914
|
+
var import_winston, logLevel, logger;
|
|
915
|
+
var init_logger = __esm({
|
|
916
|
+
"src/logger.ts"() {
|
|
917
|
+
"use strict";
|
|
918
|
+
import_winston = __toESM(require("winston"), 1);
|
|
919
|
+
logLevel = process.env.LOG_LEVEL || "info";
|
|
920
|
+
logger = import_winston.default.createLogger({
|
|
921
|
+
level: logLevel,
|
|
922
|
+
format: import_winston.default.format.combine(
|
|
923
|
+
import_winston.default.format.timestamp(),
|
|
924
|
+
import_winston.default.format.colorize(),
|
|
925
|
+
import_winston.default.format.printf(({ level, message, timestamp, ...meta }) => {
|
|
926
|
+
const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : "";
|
|
927
|
+
return `${timestamp} [${level}] ${message}${metaStr}`;
|
|
928
|
+
})
|
|
929
|
+
),
|
|
930
|
+
transports: [new import_winston.default.transports.Console()]
|
|
931
|
+
});
|
|
932
|
+
}
|
|
933
|
+
});
|
|
934
|
+
|
|
935
|
+
// src/discovery/CardFetcher.ts
|
|
936
|
+
var CardFetcher_exports = {};
|
|
937
|
+
__export(CardFetcher_exports, {
|
|
938
|
+
CardFetcher: () => CardFetcher,
|
|
939
|
+
normalizeAgentUrl: () => normalizeAgentUrl
|
|
940
|
+
});
|
|
941
|
+
function normalizeAgentUrl(url) {
|
|
942
|
+
try {
|
|
943
|
+
const parsed = new URL(url);
|
|
944
|
+
return `${parsed.protocol}//${parsed.host}`;
|
|
945
|
+
} catch {
|
|
946
|
+
return url;
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
var logger2, CardFetcher;
|
|
950
|
+
var init_CardFetcher = __esm({
|
|
951
|
+
"src/discovery/CardFetcher.ts"() {
|
|
952
|
+
"use strict";
|
|
953
|
+
init_logger();
|
|
954
|
+
logger2 = createLogger("CardFetcher");
|
|
955
|
+
CardFetcher = class {
|
|
956
|
+
/**
|
|
957
|
+
* Fetch an agent's card from their A2A endpoint.
|
|
958
|
+
*
|
|
959
|
+
* @param agentUrl Base URL of the agent (e.g., http://localhost:3000)
|
|
960
|
+
* @returns Fetch result with card or error
|
|
961
|
+
*/
|
|
962
|
+
async fetchCard(agentUrl) {
|
|
963
|
+
try {
|
|
964
|
+
const cardUrl = new URL("/.well-known/agent-card.json", agentUrl).toString();
|
|
965
|
+
logger2.debug(`Fetching agent card from ${cardUrl}`);
|
|
966
|
+
const response = await fetch(cardUrl, {
|
|
967
|
+
method: "GET",
|
|
968
|
+
headers: {
|
|
969
|
+
"Accept": "application/json",
|
|
970
|
+
"User-Agent": "@moltium/world-core/0.1.0"
|
|
971
|
+
},
|
|
972
|
+
signal: AbortSignal.timeout(5e3)
|
|
973
|
+
// 5 second timeout
|
|
974
|
+
});
|
|
975
|
+
if (!response.ok) {
|
|
976
|
+
return {
|
|
977
|
+
success: false,
|
|
978
|
+
error: `HTTP ${response.status}: ${response.statusText}`
|
|
979
|
+
};
|
|
980
|
+
}
|
|
981
|
+
const card = await response.json();
|
|
982
|
+
if (!card.name || !card.protocolVersion || !card.url || !card.skills) {
|
|
983
|
+
return {
|
|
984
|
+
success: false,
|
|
985
|
+
error: "Invalid agent card: missing required fields"
|
|
986
|
+
};
|
|
987
|
+
}
|
|
988
|
+
logger2.info(`Successfully fetched card for agent: ${card.name}`, {
|
|
989
|
+
protocolVersion: card.protocolVersion,
|
|
990
|
+
skillCount: card.skills.length
|
|
991
|
+
});
|
|
992
|
+
return {
|
|
993
|
+
success: true,
|
|
994
|
+
card
|
|
995
|
+
};
|
|
996
|
+
} catch (error) {
|
|
997
|
+
logger2.error(`Failed to fetch agent card from ${agentUrl}:`, error.message);
|
|
998
|
+
return {
|
|
999
|
+
success: false,
|
|
1000
|
+
error: error.message || "Unknown error"
|
|
1001
|
+
};
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
/**
|
|
1005
|
+
* Fetch multiple agent cards in parallel.
|
|
1006
|
+
*
|
|
1007
|
+
* @param agentUrls Array of agent URLs
|
|
1008
|
+
* @returns Array of fetch results
|
|
1009
|
+
*/
|
|
1010
|
+
async fetchCards(agentUrls) {
|
|
1011
|
+
logger2.info(`Fetching ${agentUrls.length} agent cards...`);
|
|
1012
|
+
const results = await Promise.all(
|
|
1013
|
+
agentUrls.map((url) => this.fetchCard(url))
|
|
1014
|
+
);
|
|
1015
|
+
const successCount = results.filter((r) => r.success).length;
|
|
1016
|
+
logger2.info(`Fetched ${successCount}/${agentUrls.length} agent cards successfully`);
|
|
1017
|
+
return results;
|
|
1018
|
+
}
|
|
1019
|
+
/**
|
|
1020
|
+
* Verify that an agent card is valid for A2A protocol v0.3.0.
|
|
1021
|
+
*
|
|
1022
|
+
* @param card Agent card to verify
|
|
1023
|
+
* @returns True if valid
|
|
1024
|
+
*/
|
|
1025
|
+
verifyCard(card) {
|
|
1026
|
+
if (!card.name || !card.protocolVersion || !card.url || !card.skills) {
|
|
1027
|
+
logger2.warn("Agent card missing required fields", { name: card.name });
|
|
1028
|
+
return false;
|
|
1029
|
+
}
|
|
1030
|
+
if (!card.protocolVersion.startsWith("0.3")) {
|
|
1031
|
+
logger2.warn("Agent card has incompatible protocol version", {
|
|
1032
|
+
name: card.name,
|
|
1033
|
+
version: card.protocolVersion
|
|
1034
|
+
});
|
|
1035
|
+
return false;
|
|
1036
|
+
}
|
|
1037
|
+
if (!Array.isArray(card.skills) || card.skills.length === 0) {
|
|
1038
|
+
logger2.warn("Agent card has no skills", { name: card.name });
|
|
1039
|
+
return false;
|
|
1040
|
+
}
|
|
1041
|
+
if (!card.capabilities || typeof card.capabilities !== "object") {
|
|
1042
|
+
logger2.warn("Agent card missing capabilities", { name: card.name });
|
|
1043
|
+
return false;
|
|
1044
|
+
}
|
|
1045
|
+
return true;
|
|
1046
|
+
}
|
|
1047
|
+
};
|
|
1048
|
+
}
|
|
1049
|
+
});
|
|
1050
|
+
|
|
1051
|
+
// src/index.ts
|
|
1052
|
+
var index_exports = {};
|
|
1053
|
+
__export(index_exports, {
|
|
1054
|
+
AdmissionRulesSchema: () => AdmissionRulesSchema,
|
|
1055
|
+
AgentEvaluator: () => AgentEvaluator,
|
|
1056
|
+
BlockchainClient: () => BlockchainClient,
|
|
1057
|
+
BlockchainConfigSchema: () => BlockchainConfigSchema,
|
|
1058
|
+
CardFetcher: () => CardFetcher,
|
|
1059
|
+
InMemoryAdapter: () => InMemoryAdapter,
|
|
1060
|
+
PersistenceConfigSchema: () => PersistenceConfigSchema,
|
|
1061
|
+
TokenConfigSchema: () => TokenConfigSchema,
|
|
1062
|
+
World: () => World,
|
|
1063
|
+
WorldConfigSchema: () => WorldConfigSchema,
|
|
1064
|
+
createLogger: () => createLogger,
|
|
1065
|
+
createPersistence: () => createPersistence,
|
|
1066
|
+
createWorldApp: () => createWorldApp,
|
|
1067
|
+
isValidWorldConfig: () => isValidWorldConfig,
|
|
1068
|
+
logger: () => logger,
|
|
1069
|
+
normalizeAgentUrl: () => normalizeAgentUrl,
|
|
1070
|
+
profileFromCard: () => profileFromCard,
|
|
1071
|
+
startWorldServer: () => startWorldServer,
|
|
1072
|
+
validateWorldConfig: () => validateWorldConfig
|
|
1073
|
+
});
|
|
1074
|
+
module.exports = __toCommonJS(index_exports);
|
|
1075
|
+
|
|
1076
|
+
// src/config/types.ts
|
|
1077
|
+
function profileFromCard(card, walletAddress) {
|
|
1078
|
+
return {
|
|
1079
|
+
url: card.url,
|
|
1080
|
+
name: card.name,
|
|
1081
|
+
protocolVersion: card.protocolVersion,
|
|
1082
|
+
skills: card.skills,
|
|
1083
|
+
capabilities: {
|
|
1084
|
+
streaming: card.capabilities.streaming ?? false,
|
|
1085
|
+
pushNotifications: card.capabilities.pushNotifications ?? false,
|
|
1086
|
+
stateTransitionHistory: card.capabilities.stateTransitionHistory
|
|
1087
|
+
},
|
|
1088
|
+
joinedAt: Date.now(),
|
|
1089
|
+
walletAddress
|
|
1090
|
+
};
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
// src/config/validator.ts
|
|
1094
|
+
var import_zod = require("zod");
|
|
1095
|
+
var AdmissionRulesSchema = import_zod.z.object({
|
|
1096
|
+
maxAgents: import_zod.z.number().int().positive().optional(),
|
|
1097
|
+
requiredSkills: import_zod.z.array(import_zod.z.string()).optional(),
|
|
1098
|
+
requiredTags: import_zod.z.array(import_zod.z.string()).optional(),
|
|
1099
|
+
minProtocolVersion: import_zod.z.string().optional(),
|
|
1100
|
+
customEvaluator: import_zod.z.function().optional()
|
|
1101
|
+
});
|
|
1102
|
+
var SQLiteConfigSchema = import_zod.z.object({
|
|
1103
|
+
filename: import_zod.z.string(),
|
|
1104
|
+
memory: import_zod.z.boolean().optional()
|
|
1105
|
+
});
|
|
1106
|
+
var PostgresConfigSchema = import_zod.z.object({
|
|
1107
|
+
host: import_zod.z.string(),
|
|
1108
|
+
port: import_zod.z.number().optional(),
|
|
1109
|
+
database: import_zod.z.string(),
|
|
1110
|
+
user: import_zod.z.string(),
|
|
1111
|
+
password: import_zod.z.string(),
|
|
1112
|
+
ssl: import_zod.z.boolean().optional(),
|
|
1113
|
+
max: import_zod.z.number().optional()
|
|
1114
|
+
});
|
|
1115
|
+
var RedisConfigSchema = import_zod.z.object({
|
|
1116
|
+
host: import_zod.z.string(),
|
|
1117
|
+
port: import_zod.z.number().optional(),
|
|
1118
|
+
password: import_zod.z.string().optional(),
|
|
1119
|
+
db: import_zod.z.number().optional(),
|
|
1120
|
+
keyPrefix: import_zod.z.string().optional()
|
|
1121
|
+
});
|
|
1122
|
+
var MongoDBConfigSchema = import_zod.z.object({
|
|
1123
|
+
url: import_zod.z.string(),
|
|
1124
|
+
database: import_zod.z.string(),
|
|
1125
|
+
useUnifiedTopology: import_zod.z.boolean().optional()
|
|
1126
|
+
});
|
|
1127
|
+
var LevelDBConfigSchema = import_zod.z.object({
|
|
1128
|
+
path: import_zod.z.string()
|
|
1129
|
+
});
|
|
1130
|
+
var PersistenceConfigSchema = import_zod.z.object({
|
|
1131
|
+
type: import_zod.z.enum(["memory", "postgres", "redis", "mongodb", "sqlite", "leveldb"]),
|
|
1132
|
+
sqlite: SQLiteConfigSchema.optional(),
|
|
1133
|
+
postgres: PostgresConfigSchema.optional(),
|
|
1134
|
+
redis: RedisConfigSchema.optional(),
|
|
1135
|
+
mongodb: MongoDBConfigSchema.optional(),
|
|
1136
|
+
leveldb: LevelDBConfigSchema.optional(),
|
|
1137
|
+
autoSaveIntervalMs: import_zod.z.number().int().positive().optional()
|
|
1138
|
+
});
|
|
1139
|
+
var BlockchainConfigSchema = import_zod.z.object({
|
|
1140
|
+
rpcUrl: import_zod.z.string().url(),
|
|
1141
|
+
privateKey: import_zod.z.string().regex(/^0x[a-fA-F0-9]{64}$/, "Invalid private key format"),
|
|
1142
|
+
entryFee: import_zod.z.number().nonnegative(),
|
|
1143
|
+
requireMembership: import_zod.z.boolean().optional(),
|
|
1144
|
+
enforceOnChainValidation: import_zod.z.boolean().optional(),
|
|
1145
|
+
agentRegistryAddress: import_zod.z.string().optional(),
|
|
1146
|
+
membershipContractAddress: import_zod.z.string().optional(),
|
|
1147
|
+
worldTokenAddress: import_zod.z.string().optional(),
|
|
1148
|
+
chainId: import_zod.z.number().int().optional()
|
|
1149
|
+
});
|
|
1150
|
+
var TokenConfigSchema = import_zod.z.object({
|
|
1151
|
+
deploy: import_zod.z.boolean(),
|
|
1152
|
+
name: import_zod.z.string().optional(),
|
|
1153
|
+
symbol: import_zod.z.string().optional(),
|
|
1154
|
+
initialSupply: import_zod.z.number().positive().optional(),
|
|
1155
|
+
decimals: import_zod.z.number().int().min(0).max(18).optional()
|
|
1156
|
+
});
|
|
1157
|
+
var WorldConfigSchema = import_zod.z.object({
|
|
1158
|
+
name: import_zod.z.string().min(1, "World name is required"),
|
|
1159
|
+
description: import_zod.z.string().optional(),
|
|
1160
|
+
type: import_zod.z.string().optional(),
|
|
1161
|
+
server: import_zod.z.object({
|
|
1162
|
+
port: import_zod.z.number().int().min(1).max(65535),
|
|
1163
|
+
host: import_zod.z.string()
|
|
1164
|
+
}),
|
|
1165
|
+
a2a: import_zod.z.object({
|
|
1166
|
+
baseUrl: import_zod.z.string().url(),
|
|
1167
|
+
pushNotifications: import_zod.z.boolean().optional(),
|
|
1168
|
+
streaming: import_zod.z.boolean().optional()
|
|
1169
|
+
}).optional(),
|
|
1170
|
+
admission: AdmissionRulesSchema,
|
|
1171
|
+
simulation: import_zod.z.object({
|
|
1172
|
+
tickIntervalMs: import_zod.z.number().int().positive().optional(),
|
|
1173
|
+
maxTicks: import_zod.z.number().int().positive().optional(),
|
|
1174
|
+
autoStart: import_zod.z.boolean().optional()
|
|
1175
|
+
}).optional(),
|
|
1176
|
+
persistence: PersistenceConfigSchema.optional(),
|
|
1177
|
+
blockchain: BlockchainConfigSchema.optional(),
|
|
1178
|
+
token: TokenConfigSchema.optional(),
|
|
1179
|
+
rules: import_zod.z.array(import_zod.z.any()).optional(),
|
|
1180
|
+
agentUrls: import_zod.z.array(import_zod.z.string().url()).optional()
|
|
1181
|
+
});
|
|
1182
|
+
function validateWorldConfig(config) {
|
|
1183
|
+
try {
|
|
1184
|
+
WorldConfigSchema.parse(config);
|
|
1185
|
+
} catch (error) {
|
|
1186
|
+
if (error instanceof import_zod.z.ZodError) {
|
|
1187
|
+
const messages = error.errors.map((e) => `${e.path.join(".")}: ${e.message}`).join(", ");
|
|
1188
|
+
throw new Error(`Invalid world configuration: ${messages}`);
|
|
1189
|
+
}
|
|
1190
|
+
throw error;
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
function isValidWorldConfig(config) {
|
|
1194
|
+
try {
|
|
1195
|
+
WorldConfigSchema.parse(config);
|
|
1196
|
+
return true;
|
|
1197
|
+
} catch {
|
|
1198
|
+
return false;
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
// src/persistence/adapters/InMemoryAdapter.ts
|
|
1203
|
+
var InMemoryAdapter = class {
|
|
1204
|
+
state = null;
|
|
1205
|
+
events = [];
|
|
1206
|
+
agents = /* @__PURE__ */ new Map();
|
|
1207
|
+
async connect() {
|
|
1208
|
+
}
|
|
1209
|
+
async saveState(state) {
|
|
1210
|
+
this.state = { ...state };
|
|
1211
|
+
}
|
|
1212
|
+
async loadState() {
|
|
1213
|
+
return this.state ? { ...this.state } : null;
|
|
1214
|
+
}
|
|
1215
|
+
async saveEvent(event) {
|
|
1216
|
+
this.events.push({ ...event });
|
|
1217
|
+
}
|
|
1218
|
+
async getEvents(filter) {
|
|
1219
|
+
let filtered = [...this.events];
|
|
1220
|
+
if (filter?.type) {
|
|
1221
|
+
filtered = filtered.filter((e) => e.type === filter.type);
|
|
1222
|
+
}
|
|
1223
|
+
if (filter?.agentUrl) {
|
|
1224
|
+
filtered = filtered.filter((e) => e.agentUrl === filter.agentUrl);
|
|
1225
|
+
}
|
|
1226
|
+
if (filter?.fromTimestamp) {
|
|
1227
|
+
filtered = filtered.filter((e) => e.timestamp >= filter.fromTimestamp);
|
|
1228
|
+
}
|
|
1229
|
+
if (filter?.toTimestamp) {
|
|
1230
|
+
filtered = filtered.filter((e) => e.timestamp <= filter.toTimestamp);
|
|
1231
|
+
}
|
|
1232
|
+
filtered.sort((a, b) => b.timestamp - a.timestamp);
|
|
1233
|
+
if (filter?.limit) {
|
|
1234
|
+
filtered = filtered.slice(0, filter.limit);
|
|
1235
|
+
}
|
|
1236
|
+
return filtered;
|
|
1237
|
+
}
|
|
1238
|
+
async saveAgent(profile) {
|
|
1239
|
+
this.agents.set(profile.url, { ...profile });
|
|
1240
|
+
}
|
|
1241
|
+
async removeAgent(agentUrl) {
|
|
1242
|
+
this.agents.delete(agentUrl);
|
|
1243
|
+
}
|
|
1244
|
+
async getAgents() {
|
|
1245
|
+
return Array.from(this.agents.values()).map((a) => ({ ...a }));
|
|
1246
|
+
}
|
|
1247
|
+
async getAgent(agentUrl) {
|
|
1248
|
+
const agent = this.agents.get(agentUrl);
|
|
1249
|
+
return agent ? { ...agent } : null;
|
|
1250
|
+
}
|
|
1251
|
+
async disconnect() {
|
|
1252
|
+
}
|
|
1253
|
+
async healthCheck() {
|
|
1254
|
+
return true;
|
|
1255
|
+
}
|
|
1256
|
+
async clear() {
|
|
1257
|
+
this.state = null;
|
|
1258
|
+
this.events = [];
|
|
1259
|
+
this.agents.clear();
|
|
1260
|
+
}
|
|
1261
|
+
};
|
|
1262
|
+
|
|
1263
|
+
// src/persistence/PersistenceFactory.ts
|
|
1264
|
+
function createPersistence(config) {
|
|
1265
|
+
switch (config.type) {
|
|
1266
|
+
case "memory":
|
|
1267
|
+
return new InMemoryAdapter();
|
|
1268
|
+
case "sqlite":
|
|
1269
|
+
return createSQLiteAdapter(config.sqlite || { filename: "./world.db" });
|
|
1270
|
+
case "postgres":
|
|
1271
|
+
if (!config.postgres) {
|
|
1272
|
+
throw new Error("PostgreSQL configuration is required");
|
|
1273
|
+
}
|
|
1274
|
+
return createPostgresAdapter(config.postgres);
|
|
1275
|
+
case "redis":
|
|
1276
|
+
if (!config.redis) {
|
|
1277
|
+
throw new Error("Redis configuration is required");
|
|
1278
|
+
}
|
|
1279
|
+
return createRedisAdapter(config.redis);
|
|
1280
|
+
case "mongodb":
|
|
1281
|
+
if (!config.mongodb) {
|
|
1282
|
+
throw new Error("MongoDB configuration is required");
|
|
1283
|
+
}
|
|
1284
|
+
return createMongoAdapter(config.mongodb);
|
|
1285
|
+
case "leveldb":
|
|
1286
|
+
if (!config.leveldb) {
|
|
1287
|
+
throw new Error("LevelDB configuration is required");
|
|
1288
|
+
}
|
|
1289
|
+
return createLevelDBAdapter(config.leveldb);
|
|
1290
|
+
default:
|
|
1291
|
+
throw new Error(`Unknown persistence type: ${config.type}`);
|
|
1292
|
+
}
|
|
1293
|
+
}
|
|
1294
|
+
function createSQLiteAdapter(config) {
|
|
1295
|
+
try {
|
|
1296
|
+
const { SQLiteAdapter: SQLiteAdapter2 } = (init_SQLiteAdapter(), __toCommonJS(SQLiteAdapter_exports));
|
|
1297
|
+
return new SQLiteAdapter2(config);
|
|
1298
|
+
} catch (error) {
|
|
1299
|
+
if (error.code === "MODULE_NOT_FOUND") {
|
|
1300
|
+
throw new Error(
|
|
1301
|
+
"SQLite adapter requires better-sqlite3. Install it with: npm install better-sqlite3"
|
|
1302
|
+
);
|
|
1303
|
+
}
|
|
1304
|
+
throw error;
|
|
1305
|
+
}
|
|
1306
|
+
}
|
|
1307
|
+
function createPostgresAdapter(config) {
|
|
1308
|
+
try {
|
|
1309
|
+
const { PostgresAdapter: PostgresAdapter2 } = (init_PostgresAdapter(), __toCommonJS(PostgresAdapter_exports));
|
|
1310
|
+
return new PostgresAdapter2(config);
|
|
1311
|
+
} catch (error) {
|
|
1312
|
+
if (error.code === "MODULE_NOT_FOUND") {
|
|
1313
|
+
throw new Error(
|
|
1314
|
+
"PostgreSQL adapter requires pg. Install it with: npm install pg"
|
|
1315
|
+
);
|
|
1316
|
+
}
|
|
1317
|
+
throw error;
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1320
|
+
function createRedisAdapter(config) {
|
|
1321
|
+
try {
|
|
1322
|
+
const { RedisAdapter: RedisAdapter2 } = (init_RedisAdapter(), __toCommonJS(RedisAdapter_exports));
|
|
1323
|
+
return new RedisAdapter2(config);
|
|
1324
|
+
} catch (error) {
|
|
1325
|
+
if (error.code === "MODULE_NOT_FOUND") {
|
|
1326
|
+
throw new Error(
|
|
1327
|
+
"Redis adapter requires ioredis. Install it with: npm install ioredis"
|
|
1328
|
+
);
|
|
1329
|
+
}
|
|
1330
|
+
throw error;
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1333
|
+
function createMongoAdapter(config) {
|
|
1334
|
+
try {
|
|
1335
|
+
const { MongoAdapter: MongoAdapter2 } = (init_MongoAdapter(), __toCommonJS(MongoAdapter_exports));
|
|
1336
|
+
return new MongoAdapter2(config);
|
|
1337
|
+
} catch (error) {
|
|
1338
|
+
if (error.code === "MODULE_NOT_FOUND") {
|
|
1339
|
+
throw new Error(
|
|
1340
|
+
"MongoDB adapter requires mongodb. Install it with: npm install mongodb"
|
|
1341
|
+
);
|
|
1342
|
+
}
|
|
1343
|
+
throw error;
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
function createLevelDBAdapter(config) {
|
|
1347
|
+
try {
|
|
1348
|
+
const { LevelDBAdapter: LevelDBAdapter2 } = (init_LevelDBAdapter(), __toCommonJS(LevelDBAdapter_exports));
|
|
1349
|
+
return new LevelDBAdapter2(config);
|
|
1350
|
+
} catch (error) {
|
|
1351
|
+
if (error.code === "MODULE_NOT_FOUND") {
|
|
1352
|
+
throw new Error(
|
|
1353
|
+
"LevelDB adapter requires level. Install it with: npm install level"
|
|
1354
|
+
);
|
|
1355
|
+
}
|
|
1356
|
+
throw error;
|
|
1357
|
+
}
|
|
1358
|
+
}
|
|
1359
|
+
|
|
1360
|
+
// src/index.ts
|
|
1361
|
+
init_logger();
|
|
1362
|
+
|
|
1363
|
+
// src/engine/World.ts
|
|
1364
|
+
var import_uuid = require("uuid");
|
|
1365
|
+
init_CardFetcher();
|
|
1366
|
+
|
|
1367
|
+
// src/discovery/AgentEvaluator.ts
|
|
1368
|
+
init_logger();
|
|
1369
|
+
var logger3 = createLogger("AgentEvaluator");
|
|
1370
|
+
var AgentEvaluator = class {
|
|
1371
|
+
constructor(rules) {
|
|
1372
|
+
this.rules = rules;
|
|
1373
|
+
}
|
|
1374
|
+
/**
|
|
1375
|
+
* Evaluate whether an agent should be admitted.
|
|
1376
|
+
*
|
|
1377
|
+
* @param card Agent's A2A card
|
|
1378
|
+
* @param currentAgentCount Current number of agents in world
|
|
1379
|
+
* @param walletAddress Optional wallet address for blockchain membership
|
|
1380
|
+
* @returns Admission decision
|
|
1381
|
+
*/
|
|
1382
|
+
async evaluate(card, currentAgentCount, walletAddress) {
|
|
1383
|
+
logger3.debug(`Evaluating agent: ${card.name}`, {
|
|
1384
|
+
currentAgents: currentAgentCount,
|
|
1385
|
+
maxAgents: this.rules.maxAgents
|
|
1386
|
+
});
|
|
1387
|
+
if (this.rules.maxAgents && currentAgentCount >= this.rules.maxAgents) {
|
|
1388
|
+
logger3.info(`Agent ${card.name} rejected: world is full`, {
|
|
1389
|
+
current: currentAgentCount,
|
|
1390
|
+
max: this.rules.maxAgents
|
|
1391
|
+
});
|
|
1392
|
+
return {
|
|
1393
|
+
admitted: false,
|
|
1394
|
+
reason: `World is full (${this.rules.maxAgents} agents maximum)`
|
|
1395
|
+
};
|
|
1396
|
+
}
|
|
1397
|
+
if (this.rules.minProtocolVersion) {
|
|
1398
|
+
if (!this.meetsProtocolVersion(card.protocolVersion, this.rules.minProtocolVersion)) {
|
|
1399
|
+
logger3.info(`Agent ${card.name} rejected: protocol version too old`, {
|
|
1400
|
+
agent: card.protocolVersion,
|
|
1401
|
+
required: this.rules.minProtocolVersion
|
|
1402
|
+
});
|
|
1403
|
+
return {
|
|
1404
|
+
admitted: false,
|
|
1405
|
+
reason: `Protocol version ${card.protocolVersion} is below minimum ${this.rules.minProtocolVersion}`
|
|
1406
|
+
};
|
|
1407
|
+
}
|
|
1408
|
+
}
|
|
1409
|
+
if (this.rules.requiredSkills && this.rules.requiredSkills.length > 0) {
|
|
1410
|
+
const agentSkillIds = card.skills.map((s) => s.id.toLowerCase());
|
|
1411
|
+
const missingSkills = this.rules.requiredSkills.filter(
|
|
1412
|
+
(required) => !agentSkillIds.includes(required.toLowerCase())
|
|
1413
|
+
);
|
|
1414
|
+
if (missingSkills.length > 0) {
|
|
1415
|
+
logger3.info(`Agent ${card.name} rejected: missing required skills`, {
|
|
1416
|
+
missing: missingSkills
|
|
1417
|
+
});
|
|
1418
|
+
return {
|
|
1419
|
+
admitted: false,
|
|
1420
|
+
reason: `Missing required skills: ${missingSkills.join(", ")}`
|
|
1421
|
+
};
|
|
1422
|
+
}
|
|
1423
|
+
}
|
|
1424
|
+
if (this.rules.requiredTags && this.rules.requiredTags.length > 0) {
|
|
1425
|
+
const agentTags = card.skills.flatMap((s) => s.tags || []).map((t) => t.toLowerCase());
|
|
1426
|
+
const hasRequiredTag = this.rules.requiredTags.some(
|
|
1427
|
+
(required) => agentTags.includes(required.toLowerCase())
|
|
1428
|
+
);
|
|
1429
|
+
if (!hasRequiredTag) {
|
|
1430
|
+
logger3.info(`Agent ${card.name} rejected: no matching tags`, {
|
|
1431
|
+
required: this.rules.requiredTags
|
|
1432
|
+
});
|
|
1433
|
+
return {
|
|
1434
|
+
admitted: false,
|
|
1435
|
+
reason: `Must have at least one of these tags: ${this.rules.requiredTags.join(", ")}`
|
|
1436
|
+
};
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
if (this.rules.customEvaluator) {
|
|
1440
|
+
const profile = profileFromCard(card, walletAddress);
|
|
1441
|
+
const customDecision = await this.rules.customEvaluator(profile);
|
|
1442
|
+
if (!customDecision.admitted) {
|
|
1443
|
+
logger3.info(`Agent ${card.name} rejected by custom evaluator`, {
|
|
1444
|
+
reason: customDecision.reason
|
|
1445
|
+
});
|
|
1446
|
+
return customDecision;
|
|
1447
|
+
}
|
|
1448
|
+
if (customDecision.role || customDecision.metadata) {
|
|
1449
|
+
logger3.debug(`Custom evaluator assigned role/metadata to ${card.name}`, {
|
|
1450
|
+
role: customDecision.role
|
|
1451
|
+
});
|
|
1452
|
+
}
|
|
1453
|
+
return customDecision;
|
|
1454
|
+
}
|
|
1455
|
+
logger3.info(`Agent ${card.name} admitted to world`);
|
|
1456
|
+
return {
|
|
1457
|
+
admitted: true,
|
|
1458
|
+
reason: "All admission criteria met"
|
|
1459
|
+
};
|
|
1460
|
+
}
|
|
1461
|
+
/**
|
|
1462
|
+
* Check if agent's protocol version meets minimum requirement.
|
|
1463
|
+
* Simple semver comparison (major.minor).
|
|
1464
|
+
*/
|
|
1465
|
+
meetsProtocolVersion(agentVersion, minVersion) {
|
|
1466
|
+
const parse = (v) => {
|
|
1467
|
+
const parts = v.split(".");
|
|
1468
|
+
return {
|
|
1469
|
+
major: parseInt(parts[0] || "0", 10),
|
|
1470
|
+
minor: parseInt(parts[1] || "0", 10)
|
|
1471
|
+
};
|
|
1472
|
+
};
|
|
1473
|
+
const agent = parse(agentVersion);
|
|
1474
|
+
const min = parse(minVersion);
|
|
1475
|
+
if (agent.major > min.major) return true;
|
|
1476
|
+
if (agent.major < min.major) return false;
|
|
1477
|
+
return agent.minor >= min.minor;
|
|
1478
|
+
}
|
|
1479
|
+
};
|
|
1480
|
+
|
|
1481
|
+
// src/blockchain/BlockchainClient.ts
|
|
1482
|
+
var import_ethers = require("ethers");
|
|
1483
|
+
init_logger();
|
|
1484
|
+
var logger4 = createLogger("BlockchainClient");
|
|
1485
|
+
var AGENT_REGISTRY_ABI = [
|
|
1486
|
+
"function registerAgent(string agentUrl, string name) external",
|
|
1487
|
+
"function isAgentValid(address wallet) external view returns (bool)",
|
|
1488
|
+
"function getAgent(address wallet) external view returns (tuple(address walletAddress, string agentUrl, string name, uint256 registeredAt, bool isActive))",
|
|
1489
|
+
"function getWalletByUrl(string agentUrl) external view returns (address)",
|
|
1490
|
+
"event AgentRegistered(address indexed wallet, string agentUrl, string name)"
|
|
1491
|
+
];
|
|
1492
|
+
var WORLD_MEMBERSHIP_ABI = [
|
|
1493
|
+
"function mintMembership(address agent) external payable",
|
|
1494
|
+
"function revokeMembership(address agent) external",
|
|
1495
|
+
"function hasMembership(address agent) external view returns (bool)",
|
|
1496
|
+
"function entryFee() external view returns (uint256)",
|
|
1497
|
+
"function totalMembers() external view returns (uint256)",
|
|
1498
|
+
"function withdrawFees() external",
|
|
1499
|
+
"event MembershipMinted(address indexed agent, uint256 indexed tokenId, uint256 feePaid)"
|
|
1500
|
+
];
|
|
1501
|
+
var WORLD_TOKEN_ABI = [
|
|
1502
|
+
"function mint(address to, uint256 amount) external",
|
|
1503
|
+
"function burn(address from, uint256 amount) external",
|
|
1504
|
+
"function balanceOf(address account) external view returns (uint256)",
|
|
1505
|
+
"function transfer(address to, uint256 amount) external returns (bool)"
|
|
1506
|
+
];
|
|
1507
|
+
var BlockchainClient = class {
|
|
1508
|
+
constructor(config) {
|
|
1509
|
+
this.config = config;
|
|
1510
|
+
this.provider = new import_ethers.ethers.JsonRpcProvider(config.rpcUrl);
|
|
1511
|
+
this.wallet = new import_ethers.ethers.Wallet(config.privateKey, this.provider);
|
|
1512
|
+
logger4.info("Blockchain client initialized", {
|
|
1513
|
+
network: config.rpcUrl,
|
|
1514
|
+
wallet: this.wallet.address
|
|
1515
|
+
});
|
|
1516
|
+
}
|
|
1517
|
+
provider;
|
|
1518
|
+
wallet;
|
|
1519
|
+
agentRegistry;
|
|
1520
|
+
membershipContract;
|
|
1521
|
+
worldToken;
|
|
1522
|
+
/**
|
|
1523
|
+
* Initialize contract connections
|
|
1524
|
+
*/
|
|
1525
|
+
async init() {
|
|
1526
|
+
if (this.config.agentRegistryAddress) {
|
|
1527
|
+
this.agentRegistry = new import_ethers.ethers.Contract(
|
|
1528
|
+
this.config.agentRegistryAddress,
|
|
1529
|
+
AGENT_REGISTRY_ABI,
|
|
1530
|
+
this.wallet
|
|
1531
|
+
);
|
|
1532
|
+
logger4.info("Connected to AgentRegistry", {
|
|
1533
|
+
address: this.config.agentRegistryAddress
|
|
1534
|
+
});
|
|
1535
|
+
}
|
|
1536
|
+
if (this.config.membershipContractAddress) {
|
|
1537
|
+
this.membershipContract = new import_ethers.ethers.Contract(
|
|
1538
|
+
this.config.membershipContractAddress,
|
|
1539
|
+
WORLD_MEMBERSHIP_ABI,
|
|
1540
|
+
this.wallet
|
|
1541
|
+
);
|
|
1542
|
+
logger4.info("Connected to WorldMembership", {
|
|
1543
|
+
address: this.config.membershipContractAddress
|
|
1544
|
+
});
|
|
1545
|
+
}
|
|
1546
|
+
if (this.config.worldTokenAddress) {
|
|
1547
|
+
this.worldToken = new import_ethers.ethers.Contract(
|
|
1548
|
+
this.config.worldTokenAddress,
|
|
1549
|
+
WORLD_TOKEN_ABI,
|
|
1550
|
+
this.wallet
|
|
1551
|
+
);
|
|
1552
|
+
logger4.info("Connected to WorldToken", {
|
|
1553
|
+
address: this.config.worldTokenAddress
|
|
1554
|
+
});
|
|
1555
|
+
}
|
|
1556
|
+
logger4.info("Blockchain client ready");
|
|
1557
|
+
}
|
|
1558
|
+
/**
|
|
1559
|
+
* Validate agent on-chain
|
|
1560
|
+
* @param walletAddress Agent's wallet address
|
|
1561
|
+
* @returns True if agent is registered and valid
|
|
1562
|
+
*/
|
|
1563
|
+
async validateAgent(walletAddress) {
|
|
1564
|
+
if (!this.agentRegistry) {
|
|
1565
|
+
logger4.warn("AgentRegistry not configured, skipping on-chain validation");
|
|
1566
|
+
return true;
|
|
1567
|
+
}
|
|
1568
|
+
try {
|
|
1569
|
+
const isValid = await this.agentRegistry.isAgentValid(walletAddress);
|
|
1570
|
+
logger4.debug("Agent validation result", {
|
|
1571
|
+
wallet: walletAddress,
|
|
1572
|
+
isValid
|
|
1573
|
+
});
|
|
1574
|
+
return isValid;
|
|
1575
|
+
} catch (error) {
|
|
1576
|
+
logger4.error("Failed to validate agent on-chain", {
|
|
1577
|
+
wallet: walletAddress,
|
|
1578
|
+
error: error.message
|
|
1579
|
+
});
|
|
1580
|
+
return false;
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
/**
|
|
1584
|
+
* Mint membership NFT for an agent
|
|
1585
|
+
* @param agentWallet Agent's wallet address
|
|
1586
|
+
* @returns Transaction hash
|
|
1587
|
+
*/
|
|
1588
|
+
async mintMembership(agentWallet) {
|
|
1589
|
+
if (!this.membershipContract) {
|
|
1590
|
+
throw new Error("WorldMembership contract not configured");
|
|
1591
|
+
}
|
|
1592
|
+
try {
|
|
1593
|
+
const entryFee = await this.membershipContract.entryFee();
|
|
1594
|
+
logger4.info("Minting membership NFT", {
|
|
1595
|
+
agent: agentWallet,
|
|
1596
|
+
entryFee: import_ethers.ethers.formatEther(entryFee)
|
|
1597
|
+
});
|
|
1598
|
+
const tx = await this.membershipContract.mintMembership(agentWallet, {
|
|
1599
|
+
value: entryFee
|
|
1600
|
+
});
|
|
1601
|
+
const receipt = await tx.wait();
|
|
1602
|
+
logger4.info("Membership NFT minted", {
|
|
1603
|
+
agent: agentWallet,
|
|
1604
|
+
txHash: receipt.hash,
|
|
1605
|
+
blockNumber: receipt.blockNumber
|
|
1606
|
+
});
|
|
1607
|
+
return receipt.hash;
|
|
1608
|
+
} catch (error) {
|
|
1609
|
+
logger4.error("Failed to mint membership NFT", {
|
|
1610
|
+
agent: agentWallet,
|
|
1611
|
+
error: error.message
|
|
1612
|
+
});
|
|
1613
|
+
throw error;
|
|
1614
|
+
}
|
|
1615
|
+
}
|
|
1616
|
+
/**
|
|
1617
|
+
* Check if agent has membership
|
|
1618
|
+
* @param agentWallet Agent's wallet address
|
|
1619
|
+
* @returns True if agent has membership
|
|
1620
|
+
*/
|
|
1621
|
+
async hasMembership(agentWallet) {
|
|
1622
|
+
if (!this.membershipContract) {
|
|
1623
|
+
logger4.warn("WorldMembership not configured, skipping membership check");
|
|
1624
|
+
return true;
|
|
1625
|
+
}
|
|
1626
|
+
try {
|
|
1627
|
+
const hasMembership = await this.membershipContract.hasMembership(agentWallet);
|
|
1628
|
+
return hasMembership;
|
|
1629
|
+
} catch (error) {
|
|
1630
|
+
logger4.error("Failed to check membership", {
|
|
1631
|
+
agent: agentWallet,
|
|
1632
|
+
error: error.message
|
|
1633
|
+
});
|
|
1634
|
+
return false;
|
|
1635
|
+
}
|
|
1636
|
+
}
|
|
1637
|
+
/**
|
|
1638
|
+
* Revoke membership NFT
|
|
1639
|
+
* @param agentWallet Agent's wallet address
|
|
1640
|
+
* @returns Transaction hash
|
|
1641
|
+
*/
|
|
1642
|
+
async revokeMembership(agentWallet) {
|
|
1643
|
+
if (!this.membershipContract) {
|
|
1644
|
+
throw new Error("WorldMembership contract not configured");
|
|
1645
|
+
}
|
|
1646
|
+
try {
|
|
1647
|
+
logger4.info("Revoking membership", { agent: agentWallet });
|
|
1648
|
+
const tx = await this.membershipContract.revokeMembership(agentWallet);
|
|
1649
|
+
const receipt = await tx.wait();
|
|
1650
|
+
logger4.info("Membership revoked", {
|
|
1651
|
+
agent: agentWallet,
|
|
1652
|
+
txHash: receipt.hash
|
|
1653
|
+
});
|
|
1654
|
+
return receipt.hash;
|
|
1655
|
+
} catch (error) {
|
|
1656
|
+
logger4.error("Failed to revoke membership", {
|
|
1657
|
+
agent: agentWallet,
|
|
1658
|
+
error: error.message
|
|
1659
|
+
});
|
|
1660
|
+
throw error;
|
|
1661
|
+
}
|
|
1662
|
+
}
|
|
1663
|
+
/**
|
|
1664
|
+
* Get total number of members
|
|
1665
|
+
*/
|
|
1666
|
+
async getTotalMembers() {
|
|
1667
|
+
if (!this.membershipContract) {
|
|
1668
|
+
return 0;
|
|
1669
|
+
}
|
|
1670
|
+
try {
|
|
1671
|
+
const total = await this.membershipContract.totalMembers();
|
|
1672
|
+
return Number(total);
|
|
1673
|
+
} catch (error) {
|
|
1674
|
+
logger4.error("Failed to get total members", { error: error.message });
|
|
1675
|
+
return 0;
|
|
1676
|
+
}
|
|
1677
|
+
}
|
|
1678
|
+
/**
|
|
1679
|
+
* Withdraw collected entry fees (world owner only)
|
|
1680
|
+
*/
|
|
1681
|
+
async withdrawFees() {
|
|
1682
|
+
if (!this.membershipContract) {
|
|
1683
|
+
throw new Error("WorldMembership contract not configured");
|
|
1684
|
+
}
|
|
1685
|
+
try {
|
|
1686
|
+
logger4.info("Withdrawing entry fees");
|
|
1687
|
+
const tx = await this.membershipContract.withdrawFees();
|
|
1688
|
+
const receipt = await tx.wait();
|
|
1689
|
+
logger4.info("Fees withdrawn", {
|
|
1690
|
+
txHash: receipt.hash,
|
|
1691
|
+
blockNumber: receipt.blockNumber
|
|
1692
|
+
});
|
|
1693
|
+
return receipt.hash;
|
|
1694
|
+
} catch (error) {
|
|
1695
|
+
logger4.error("Failed to withdraw fees", { error: error.message });
|
|
1696
|
+
throw error;
|
|
1697
|
+
}
|
|
1698
|
+
}
|
|
1699
|
+
/**
|
|
1700
|
+
* Get world owner's wallet address
|
|
1701
|
+
*/
|
|
1702
|
+
getWalletAddress() {
|
|
1703
|
+
return this.wallet.address;
|
|
1704
|
+
}
|
|
1705
|
+
/**
|
|
1706
|
+
* Get entry fee in MON
|
|
1707
|
+
*/
|
|
1708
|
+
async getEntryFee() {
|
|
1709
|
+
if (!this.membershipContract) {
|
|
1710
|
+
return "0";
|
|
1711
|
+
}
|
|
1712
|
+
try {
|
|
1713
|
+
const fee = await this.membershipContract.entryFee();
|
|
1714
|
+
return import_ethers.ethers.formatEther(fee);
|
|
1715
|
+
} catch (error) {
|
|
1716
|
+
logger4.error("Failed to get entry fee", { error: error.message });
|
|
1717
|
+
return "0";
|
|
1718
|
+
}
|
|
1719
|
+
}
|
|
1720
|
+
};
|
|
1721
|
+
|
|
1722
|
+
// src/engine/World.ts
|
|
1723
|
+
init_logger();
|
|
1724
|
+
var logger5 = createLogger("World");
|
|
1725
|
+
var World = class {
|
|
1726
|
+
constructor(config) {
|
|
1727
|
+
this.config = config;
|
|
1728
|
+
validateWorldConfig(config);
|
|
1729
|
+
this.state = {
|
|
1730
|
+
phase: "idle",
|
|
1731
|
+
tick: 0,
|
|
1732
|
+
round: 0,
|
|
1733
|
+
timestamp: Date.now(),
|
|
1734
|
+
metadata: {}
|
|
1735
|
+
};
|
|
1736
|
+
this.agents = /* @__PURE__ */ new Map();
|
|
1737
|
+
this.cardFetcher = new CardFetcher();
|
|
1738
|
+
this.evaluator = new AgentEvaluator(config.admission);
|
|
1739
|
+
logger5.info(`World "${config.name}" created`, {
|
|
1740
|
+
type: config.type || "generic",
|
|
1741
|
+
maxAgents: config.admission.maxAgents
|
|
1742
|
+
});
|
|
1743
|
+
}
|
|
1744
|
+
state;
|
|
1745
|
+
agents;
|
|
1746
|
+
persistence = null;
|
|
1747
|
+
blockchainClient = null;
|
|
1748
|
+
cardFetcher;
|
|
1749
|
+
evaluator;
|
|
1750
|
+
tickInterval = null;
|
|
1751
|
+
autoSaveInterval = null;
|
|
1752
|
+
/**
|
|
1753
|
+
* Initialize the world (connect persistence, restore state, discover agents)
|
|
1754
|
+
*/
|
|
1755
|
+
async init() {
|
|
1756
|
+
logger5.info("Initializing world...");
|
|
1757
|
+
this.setState("initializing");
|
|
1758
|
+
try {
|
|
1759
|
+
if (this.config.persistence) {
|
|
1760
|
+
logger5.info("Connecting to persistence backend:", this.config.persistence.type);
|
|
1761
|
+
this.persistence = createPersistence(this.config.persistence);
|
|
1762
|
+
await this.persistence.connect();
|
|
1763
|
+
const savedState = await this.persistence.loadState();
|
|
1764
|
+
if (savedState) {
|
|
1765
|
+
this.state = savedState;
|
|
1766
|
+
logger5.info("Restored world state from persistence", {
|
|
1767
|
+
phase: savedState.phase,
|
|
1768
|
+
tick: savedState.tick
|
|
1769
|
+
});
|
|
1770
|
+
const savedAgents = await this.persistence.getAgents();
|
|
1771
|
+
for (const agent of savedAgents) {
|
|
1772
|
+
this.agents.set(agent.url, agent);
|
|
1773
|
+
}
|
|
1774
|
+
logger5.info(`Restored ${savedAgents.length} agents from persistence`);
|
|
1775
|
+
}
|
|
1776
|
+
}
|
|
1777
|
+
if (this.config.blockchain) {
|
|
1778
|
+
logger5.info("Initializing blockchain client...");
|
|
1779
|
+
this.blockchainClient = new BlockchainClient(this.config.blockchain);
|
|
1780
|
+
await this.blockchainClient.init();
|
|
1781
|
+
}
|
|
1782
|
+
if (this.config.agentUrls && this.config.agentUrls.length > 0) {
|
|
1783
|
+
logger5.info(`Discovering ${this.config.agentUrls.length} pre-configured agents...`);
|
|
1784
|
+
const results = await this.cardFetcher.fetchCards(this.config.agentUrls);
|
|
1785
|
+
for (let i = 0; i < results.length; i++) {
|
|
1786
|
+
const result = results[i];
|
|
1787
|
+
if (result.success && result.card) {
|
|
1788
|
+
try {
|
|
1789
|
+
await this.admitAgent(result.card);
|
|
1790
|
+
} catch (error) {
|
|
1791
|
+
logger5.warn(`Failed to admit pre-configured agent:`, error.message);
|
|
1792
|
+
}
|
|
1793
|
+
}
|
|
1794
|
+
}
|
|
1795
|
+
}
|
|
1796
|
+
if (this.persistence) {
|
|
1797
|
+
this.startAutoSave();
|
|
1798
|
+
}
|
|
1799
|
+
this.setState("ready");
|
|
1800
|
+
logger5.info("World initialized successfully", {
|
|
1801
|
+
agents: this.agents.size,
|
|
1802
|
+
persistence: this.config.persistence?.type || "none"
|
|
1803
|
+
});
|
|
1804
|
+
} catch (error) {
|
|
1805
|
+
logger5.error("Failed to initialize world:", error);
|
|
1806
|
+
this.setState("failed");
|
|
1807
|
+
throw error;
|
|
1808
|
+
}
|
|
1809
|
+
}
|
|
1810
|
+
/**
|
|
1811
|
+
* Start the world simulation
|
|
1812
|
+
*/
|
|
1813
|
+
async start() {
|
|
1814
|
+
if (this.state.phase === "running") {
|
|
1815
|
+
logger5.warn("World is already running");
|
|
1816
|
+
return;
|
|
1817
|
+
}
|
|
1818
|
+
logger5.info("Starting world simulation...");
|
|
1819
|
+
this.setState("running");
|
|
1820
|
+
await this.logEvent({
|
|
1821
|
+
id: (0, import_uuid.v4)(),
|
|
1822
|
+
type: "world_started",
|
|
1823
|
+
timestamp: Date.now()
|
|
1824
|
+
});
|
|
1825
|
+
if (this.config.simulation?.tickIntervalMs) {
|
|
1826
|
+
this.startTicking();
|
|
1827
|
+
}
|
|
1828
|
+
}
|
|
1829
|
+
/**
|
|
1830
|
+
* Stop the world simulation
|
|
1831
|
+
*/
|
|
1832
|
+
async stop() {
|
|
1833
|
+
logger5.info("Stopping world...");
|
|
1834
|
+
this.setState("stopped");
|
|
1835
|
+
if (this.tickInterval) {
|
|
1836
|
+
clearInterval(this.tickInterval);
|
|
1837
|
+
this.tickInterval = null;
|
|
1838
|
+
}
|
|
1839
|
+
if (this.autoSaveInterval) {
|
|
1840
|
+
clearInterval(this.autoSaveInterval);
|
|
1841
|
+
this.autoSaveInterval = null;
|
|
1842
|
+
}
|
|
1843
|
+
if (this.persistence) {
|
|
1844
|
+
await this.persistence.saveState(this.state);
|
|
1845
|
+
}
|
|
1846
|
+
await this.logEvent({
|
|
1847
|
+
id: (0, import_uuid.v4)(),
|
|
1848
|
+
type: "world_stopped",
|
|
1849
|
+
timestamp: Date.now()
|
|
1850
|
+
});
|
|
1851
|
+
logger5.info("World stopped");
|
|
1852
|
+
}
|
|
1853
|
+
/**
|
|
1854
|
+
* Admit an agent to the world
|
|
1855
|
+
*/
|
|
1856
|
+
async admitAgent(card, walletAddress) {
|
|
1857
|
+
const decision = await this.evaluator.evaluate(card, this.agents.size, walletAddress);
|
|
1858
|
+
if (!decision.admitted) {
|
|
1859
|
+
throw new Error(`Agent admission denied: ${decision.reason}`);
|
|
1860
|
+
}
|
|
1861
|
+
if (this.blockchainClient && this.config.blockchain?.enforceOnChainValidation && walletAddress) {
|
|
1862
|
+
const isValid = await this.blockchainClient.validateAgent(walletAddress);
|
|
1863
|
+
if (!isValid) {
|
|
1864
|
+
throw new Error("Agent not registered in on-chain AgentRegistry");
|
|
1865
|
+
}
|
|
1866
|
+
logger5.info(`Agent validated on-chain: ${card.name}`);
|
|
1867
|
+
}
|
|
1868
|
+
if (this.blockchainClient && this.config.blockchain?.requireMembership && walletAddress) {
|
|
1869
|
+
const hasMembership = await this.blockchainClient.hasMembership(walletAddress);
|
|
1870
|
+
if (!hasMembership) {
|
|
1871
|
+
logger5.info(`Minting membership NFT for agent: ${card.name}`);
|
|
1872
|
+
await this.blockchainClient.mintMembership(walletAddress);
|
|
1873
|
+
} else {
|
|
1874
|
+
logger5.info(`Agent already has membership: ${card.name}`);
|
|
1875
|
+
}
|
|
1876
|
+
}
|
|
1877
|
+
const profile = {
|
|
1878
|
+
url: card.url,
|
|
1879
|
+
name: card.name,
|
|
1880
|
+
protocolVersion: card.protocolVersion,
|
|
1881
|
+
skills: card.skills,
|
|
1882
|
+
capabilities: {
|
|
1883
|
+
streaming: card.capabilities.streaming ?? false,
|
|
1884
|
+
pushNotifications: card.capabilities.pushNotifications ?? false,
|
|
1885
|
+
stateTransitionHistory: card.capabilities.stateTransitionHistory
|
|
1886
|
+
},
|
|
1887
|
+
joinedAt: Date.now(),
|
|
1888
|
+
role: decision.role,
|
|
1889
|
+
metadata: decision.metadata,
|
|
1890
|
+
walletAddress
|
|
1891
|
+
};
|
|
1892
|
+
this.agents.set(profile.url, profile);
|
|
1893
|
+
if (this.persistence) {
|
|
1894
|
+
await this.persistence.saveAgent(profile);
|
|
1895
|
+
}
|
|
1896
|
+
await this.logEvent({
|
|
1897
|
+
id: (0, import_uuid.v4)(),
|
|
1898
|
+
type: "agent_joined",
|
|
1899
|
+
timestamp: Date.now(),
|
|
1900
|
+
agentUrl: profile.url,
|
|
1901
|
+
data: { name: profile.name, role: profile.role }
|
|
1902
|
+
});
|
|
1903
|
+
logger5.info(`Agent admitted: ${profile.name}`, {
|
|
1904
|
+
role: profile.role,
|
|
1905
|
+
totalAgents: this.agents.size
|
|
1906
|
+
});
|
|
1907
|
+
}
|
|
1908
|
+
/**
|
|
1909
|
+
* Remove an agent from the world
|
|
1910
|
+
*/
|
|
1911
|
+
async removeAgent(agentUrl) {
|
|
1912
|
+
const agent = this.agents.get(agentUrl);
|
|
1913
|
+
if (!agent) {
|
|
1914
|
+
throw new Error(`Agent not found: ${agentUrl}`);
|
|
1915
|
+
}
|
|
1916
|
+
this.agents.delete(agentUrl);
|
|
1917
|
+
if (this.persistence) {
|
|
1918
|
+
await this.persistence.removeAgent(agentUrl);
|
|
1919
|
+
}
|
|
1920
|
+
await this.logEvent({
|
|
1921
|
+
id: (0, import_uuid.v4)(),
|
|
1922
|
+
type: "agent_left",
|
|
1923
|
+
timestamp: Date.now(),
|
|
1924
|
+
agentUrl,
|
|
1925
|
+
data: { name: agent.name }
|
|
1926
|
+
});
|
|
1927
|
+
logger5.info(`Agent removed: ${agent.name}`, {
|
|
1928
|
+
totalAgents: this.agents.size
|
|
1929
|
+
});
|
|
1930
|
+
}
|
|
1931
|
+
/**
|
|
1932
|
+
* Get all agents in the world
|
|
1933
|
+
*/
|
|
1934
|
+
getAgents() {
|
|
1935
|
+
return Array.from(this.agents.values());
|
|
1936
|
+
}
|
|
1937
|
+
/**
|
|
1938
|
+
* Get current world state
|
|
1939
|
+
*/
|
|
1940
|
+
getState() {
|
|
1941
|
+
return { ...this.state };
|
|
1942
|
+
}
|
|
1943
|
+
/**
|
|
1944
|
+
* Log an event
|
|
1945
|
+
*/
|
|
1946
|
+
async logEvent(event) {
|
|
1947
|
+
if (this.persistence) {
|
|
1948
|
+
await this.persistence.saveEvent(event);
|
|
1949
|
+
}
|
|
1950
|
+
}
|
|
1951
|
+
/**
|
|
1952
|
+
* Set world phase
|
|
1953
|
+
*/
|
|
1954
|
+
setState(phase) {
|
|
1955
|
+
this.state.phase = phase;
|
|
1956
|
+
this.state.timestamp = Date.now();
|
|
1957
|
+
}
|
|
1958
|
+
/**
|
|
1959
|
+
* Start auto-save interval
|
|
1960
|
+
*/
|
|
1961
|
+
startAutoSave() {
|
|
1962
|
+
const interval = this.config.persistence?.autoSaveIntervalMs || 1e4;
|
|
1963
|
+
this.autoSaveInterval = setInterval(async () => {
|
|
1964
|
+
if (this.persistence) {
|
|
1965
|
+
await this.persistence.saveState(this.state);
|
|
1966
|
+
logger5.debug("Auto-saved world state");
|
|
1967
|
+
}
|
|
1968
|
+
}, interval);
|
|
1969
|
+
logger5.info(`Auto-save enabled (interval: ${interval}ms)`);
|
|
1970
|
+
}
|
|
1971
|
+
/**
|
|
1972
|
+
* Start simulation ticking
|
|
1973
|
+
*/
|
|
1974
|
+
startTicking() {
|
|
1975
|
+
const interval = this.config.simulation.tickIntervalMs;
|
|
1976
|
+
this.tickInterval = setInterval(async () => {
|
|
1977
|
+
this.state.tick++;
|
|
1978
|
+
await this.logEvent({
|
|
1979
|
+
id: (0, import_uuid.v4)(),
|
|
1980
|
+
type: "tick",
|
|
1981
|
+
timestamp: Date.now(),
|
|
1982
|
+
data: { tick: this.state.tick }
|
|
1983
|
+
});
|
|
1984
|
+
logger5.debug(`Tick ${this.state.tick}`);
|
|
1985
|
+
if (this.config.simulation?.maxTicks && this.state.tick >= this.config.simulation.maxTicks) {
|
|
1986
|
+
logger5.info("Max ticks reached, stopping world");
|
|
1987
|
+
await this.stop();
|
|
1988
|
+
}
|
|
1989
|
+
}, interval);
|
|
1990
|
+
logger5.info(`Simulation ticking enabled (interval: ${interval}ms)`);
|
|
1991
|
+
}
|
|
1992
|
+
};
|
|
1993
|
+
|
|
1994
|
+
// src/index.ts
|
|
1995
|
+
init_CardFetcher();
|
|
1996
|
+
|
|
1997
|
+
// src/server/app.ts
|
|
1998
|
+
var import_express = __toESM(require("express"), 1);
|
|
1999
|
+
init_logger();
|
|
2000
|
+
var logger6 = createLogger("WorldServer");
|
|
2001
|
+
function createWorldApp(world) {
|
|
2002
|
+
const app = (0, import_express.default)();
|
|
2003
|
+
app.use(import_express.default.json());
|
|
2004
|
+
app.use(import_express.default.urlencoded({ extended: true }));
|
|
2005
|
+
app.use((req, res, next) => {
|
|
2006
|
+
logger6.debug(`${req.method} ${req.path}`, {
|
|
2007
|
+
query: req.query,
|
|
2008
|
+
ip: req.ip
|
|
2009
|
+
});
|
|
2010
|
+
next();
|
|
2011
|
+
});
|
|
2012
|
+
app.get("/", (req, res) => {
|
|
2013
|
+
res.json({
|
|
2014
|
+
name: world.config.name,
|
|
2015
|
+
description: world.config.description,
|
|
2016
|
+
type: world.config.type || "generic",
|
|
2017
|
+
state: world.getState(),
|
|
2018
|
+
agentCount: world.getAgents().length,
|
|
2019
|
+
maxAgents: world.config.admission.maxAgents || null,
|
|
2020
|
+
admission: {
|
|
2021
|
+
requiredSkills: world.config.admission.requiredSkills || [],
|
|
2022
|
+
requiredTags: world.config.admission.requiredTags || [],
|
|
2023
|
+
minProtocolVersion: world.config.admission.minProtocolVersion || null
|
|
2024
|
+
}
|
|
2025
|
+
});
|
|
2026
|
+
});
|
|
2027
|
+
app.post("/world/join", async (req, res) => {
|
|
2028
|
+
try {
|
|
2029
|
+
const { agentUrl, walletAddress } = req.body;
|
|
2030
|
+
if (!agentUrl) {
|
|
2031
|
+
return res.status(400).json({
|
|
2032
|
+
success: false,
|
|
2033
|
+
error: "agentUrl is required"
|
|
2034
|
+
});
|
|
2035
|
+
}
|
|
2036
|
+
logger6.info(`Agent join request from: ${agentUrl}`, {
|
|
2037
|
+
wallet: walletAddress || "none"
|
|
2038
|
+
});
|
|
2039
|
+
const cardFetcher = new (await Promise.resolve().then(() => (init_CardFetcher(), CardFetcher_exports))).CardFetcher();
|
|
2040
|
+
const result = await cardFetcher.fetchCard(agentUrl);
|
|
2041
|
+
if (!result.success || !result.card) {
|
|
2042
|
+
return res.status(400).json({
|
|
2043
|
+
success: false,
|
|
2044
|
+
error: `Failed to fetch agent card: ${result.error}`
|
|
2045
|
+
});
|
|
2046
|
+
}
|
|
2047
|
+
await world.admitAgent(result.card, walletAddress);
|
|
2048
|
+
res.json({
|
|
2049
|
+
success: true,
|
|
2050
|
+
message: "Agent admitted to world",
|
|
2051
|
+
world: {
|
|
2052
|
+
name: world.config.name,
|
|
2053
|
+
agentCount: world.getAgents().length
|
|
2054
|
+
}
|
|
2055
|
+
});
|
|
2056
|
+
} catch (error) {
|
|
2057
|
+
logger6.error("Failed to process join request:", error);
|
|
2058
|
+
res.status(400).json({
|
|
2059
|
+
success: false,
|
|
2060
|
+
error: error.message || "Failed to join world"
|
|
2061
|
+
});
|
|
2062
|
+
}
|
|
2063
|
+
});
|
|
2064
|
+
app.get("/world/agents", (req, res) => {
|
|
2065
|
+
const agents = world.getAgents().map((agent) => ({
|
|
2066
|
+
url: agent.url,
|
|
2067
|
+
name: agent.name,
|
|
2068
|
+
protocolVersion: agent.protocolVersion,
|
|
2069
|
+
skills: agent.skills.map((s) => s.id),
|
|
2070
|
+
joinedAt: agent.joinedAt,
|
|
2071
|
+
role: agent.role
|
|
2072
|
+
}));
|
|
2073
|
+
res.json({
|
|
2074
|
+
agents,
|
|
2075
|
+
count: agents.length
|
|
2076
|
+
});
|
|
2077
|
+
});
|
|
2078
|
+
app.get("/world/state", (req, res) => {
|
|
2079
|
+
res.json(world.getState());
|
|
2080
|
+
});
|
|
2081
|
+
app.post("/world/start", async (req, res) => {
|
|
2082
|
+
try {
|
|
2083
|
+
await world.start();
|
|
2084
|
+
res.json({
|
|
2085
|
+
success: true,
|
|
2086
|
+
message: "World simulation started",
|
|
2087
|
+
state: world.getState()
|
|
2088
|
+
});
|
|
2089
|
+
} catch (error) {
|
|
2090
|
+
res.status(400).json({
|
|
2091
|
+
success: false,
|
|
2092
|
+
error: error.message
|
|
2093
|
+
});
|
|
2094
|
+
}
|
|
2095
|
+
});
|
|
2096
|
+
app.post("/world/stop", async (req, res) => {
|
|
2097
|
+
try {
|
|
2098
|
+
await world.stop();
|
|
2099
|
+
res.json({
|
|
2100
|
+
success: true,
|
|
2101
|
+
message: "World simulation stopped",
|
|
2102
|
+
state: world.getState()
|
|
2103
|
+
});
|
|
2104
|
+
} catch (error) {
|
|
2105
|
+
res.status(400).json({
|
|
2106
|
+
success: false,
|
|
2107
|
+
error: error.message
|
|
2108
|
+
});
|
|
2109
|
+
}
|
|
2110
|
+
});
|
|
2111
|
+
app.delete("/world/agents/:agentUrl", async (req, res) => {
|
|
2112
|
+
try {
|
|
2113
|
+
const agentUrlParam = req.params.agentUrl;
|
|
2114
|
+
const agentUrl = typeof agentUrlParam === "string" ? decodeURIComponent(agentUrlParam) : decodeURIComponent(agentUrlParam[0]);
|
|
2115
|
+
await world.removeAgent(agentUrl);
|
|
2116
|
+
res.json({
|
|
2117
|
+
success: true,
|
|
2118
|
+
message: "Agent removed from world"
|
|
2119
|
+
});
|
|
2120
|
+
} catch (error) {
|
|
2121
|
+
res.status(400).json({
|
|
2122
|
+
success: false,
|
|
2123
|
+
error: error.message
|
|
2124
|
+
});
|
|
2125
|
+
}
|
|
2126
|
+
});
|
|
2127
|
+
app.use((req, res) => {
|
|
2128
|
+
res.status(404).json({
|
|
2129
|
+
error: "Not found",
|
|
2130
|
+
path: req.path
|
|
2131
|
+
});
|
|
2132
|
+
});
|
|
2133
|
+
app.use((err, req, res, next) => {
|
|
2134
|
+
logger6.error("Server error:", err);
|
|
2135
|
+
res.status(500).json({
|
|
2136
|
+
error: "Internal server error",
|
|
2137
|
+
message: err.message
|
|
2138
|
+
});
|
|
2139
|
+
});
|
|
2140
|
+
return app;
|
|
2141
|
+
}
|
|
2142
|
+
async function startWorldServer(world) {
|
|
2143
|
+
const app = createWorldApp(world);
|
|
2144
|
+
const server = app.listen(world.config.server.port, world.config.server.host, () => {
|
|
2145
|
+
const { host, port } = world.config.server;
|
|
2146
|
+
logger6.info(`World "${world.config.name}" server started`);
|
|
2147
|
+
logger6.info(` http://${host}:${port}`);
|
|
2148
|
+
logger6.info("");
|
|
2149
|
+
logger6.info("Endpoints:");
|
|
2150
|
+
logger6.info(` GET / - World info`);
|
|
2151
|
+
logger6.info(` POST /world/join - Agent join request`);
|
|
2152
|
+
logger6.info(` GET /world/agents - List agents`);
|
|
2153
|
+
logger6.info(` GET /world/state - World state`);
|
|
2154
|
+
logger6.info(` POST /world/start - Start simulation`);
|
|
2155
|
+
logger6.info(` POST /world/stop - Stop simulation`);
|
|
2156
|
+
logger6.info(` DELETE /world/agents/:url - Remove agent`);
|
|
2157
|
+
});
|
|
2158
|
+
process.on("SIGTERM", async () => {
|
|
2159
|
+
logger6.info("SIGTERM received, shutting down gracefully...");
|
|
2160
|
+
server.close(async () => {
|
|
2161
|
+
await world.stop();
|
|
2162
|
+
process.exit(0);
|
|
2163
|
+
});
|
|
2164
|
+
});
|
|
2165
|
+
process.on("SIGINT", async () => {
|
|
2166
|
+
logger6.info("SIGINT received, shutting down gracefully...");
|
|
2167
|
+
server.close(async () => {
|
|
2168
|
+
await world.stop();
|
|
2169
|
+
process.exit(0);
|
|
2170
|
+
});
|
|
2171
|
+
});
|
|
2172
|
+
}
|
|
2173
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
2174
|
+
0 && (module.exports = {
|
|
2175
|
+
AdmissionRulesSchema,
|
|
2176
|
+
AgentEvaluator,
|
|
2177
|
+
BlockchainClient,
|
|
2178
|
+
BlockchainConfigSchema,
|
|
2179
|
+
CardFetcher,
|
|
2180
|
+
InMemoryAdapter,
|
|
2181
|
+
PersistenceConfigSchema,
|
|
2182
|
+
TokenConfigSchema,
|
|
2183
|
+
World,
|
|
2184
|
+
WorldConfigSchema,
|
|
2185
|
+
createLogger,
|
|
2186
|
+
createPersistence,
|
|
2187
|
+
createWorldApp,
|
|
2188
|
+
isValidWorldConfig,
|
|
2189
|
+
logger,
|
|
2190
|
+
normalizeAgentUrl,
|
|
2191
|
+
profileFromCard,
|
|
2192
|
+
startWorldServer,
|
|
2193
|
+
validateWorldConfig
|
|
2194
|
+
});
|
|
2195
|
+
//# sourceMappingURL=index.cjs.map
|