pay-lobster 3.1.0 → 3.2.0
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/cli.js +657 -509
- package/dist/cli.js.map +1 -1
- package/lib/cli.ts +749 -540
- package/package.json +6 -3
- package/lib/openzeppelin-contracts/.changeset/config.json +0 -12
- package/lib/openzeppelin-contracts/.codecov.yml +0 -12
- package/lib/openzeppelin-contracts/.editorconfig +0 -21
- package/lib/openzeppelin-contracts/.eslintrc +0 -20
- package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/bug_report.md +0 -21
- package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/config.yml +0 -4
- package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/feature_request.md +0 -14
- package/lib/openzeppelin-contracts/.github/PULL_REQUEST_TEMPLATE.md +0 -20
- package/lib/openzeppelin-contracts/.github/actions/gas-compare/action.yml +0 -49
- package/lib/openzeppelin-contracts/.github/actions/setup/action.yml +0 -21
- package/lib/openzeppelin-contracts/.github/actions/storage-layout/action.yml +0 -55
- package/lib/openzeppelin-contracts/.github/workflows/actionlint.yml +0 -18
- package/lib/openzeppelin-contracts/.github/workflows/changeset.yml +0 -28
- package/lib/openzeppelin-contracts/.github/workflows/checks.yml +0 -118
- package/lib/openzeppelin-contracts/.github/workflows/docs.yml +0 -19
- package/lib/openzeppelin-contracts/.github/workflows/formal-verification.yml +0 -68
- package/lib/openzeppelin-contracts/.github/workflows/release-cycle.yml +0 -214
- package/lib/openzeppelin-contracts/.github/workflows/upgradeable.yml +0 -34
- package/lib/openzeppelin-contracts/.gitmodules +0 -7
- package/lib/openzeppelin-contracts/.mocharc.js +0 -4
- package/lib/openzeppelin-contracts/.prettierrc +0 -15
- package/lib/openzeppelin-contracts/.solcover.js +0 -13
- package/lib/openzeppelin-contracts/CHANGELOG.md +0 -972
- package/lib/openzeppelin-contracts/CODE_OF_CONDUCT.md +0 -73
- package/lib/openzeppelin-contracts/CONTRIBUTING.md +0 -36
- package/lib/openzeppelin-contracts/GUIDELINES.md +0 -148
- package/lib/openzeppelin-contracts/LICENSE +0 -22
- package/lib/openzeppelin-contracts/README.md +0 -107
- package/lib/openzeppelin-contracts/RELEASING.md +0 -45
- package/lib/openzeppelin-contracts/SECURITY.md +0 -42
- package/lib/openzeppelin-contracts/audits/2017-03.md +0 -292
- 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/README.md +0 -17
- package/lib/openzeppelin-contracts/certora/Makefile +0 -54
- package/lib/openzeppelin-contracts/certora/README.md +0 -60
- package/lib/openzeppelin-contracts/certora/diff/access_manager_AccessManager.sol.patch +0 -97
- package/lib/openzeppelin-contracts/certora/harnesses/AccessControlDefaultAdminRulesHarness.sol +0 -46
- package/lib/openzeppelin-contracts/certora/harnesses/AccessControlHarness.sol +0 -6
- package/lib/openzeppelin-contracts/certora/harnesses/DoubleEndedQueueHarness.sol +0 -58
- package/lib/openzeppelin-contracts/certora/harnesses/ERC20FlashMintHarness.sol +0 -36
- package/lib/openzeppelin-contracts/certora/harnesses/ERC20PermitHarness.sol +0 -16
- package/lib/openzeppelin-contracts/certora/harnesses/ERC20WrapperHarness.sol +0 -34
- package/lib/openzeppelin-contracts/certora/harnesses/ERC3156FlashBorrowerHarness.sol +0 -13
- package/lib/openzeppelin-contracts/certora/harnesses/ERC721Harness.sol +0 -33
- package/lib/openzeppelin-contracts/certora/harnesses/ERC721ReceiverHarness.sol +0 -11
- package/lib/openzeppelin-contracts/certora/harnesses/EnumerableMapHarness.sol +0 -55
- package/lib/openzeppelin-contracts/certora/harnesses/EnumerableSetHarness.sol +0 -35
- package/lib/openzeppelin-contracts/certora/harnesses/InitializableHarness.sol +0 -23
- package/lib/openzeppelin-contracts/certora/harnesses/Ownable2StepHarness.sol +0 -10
- package/lib/openzeppelin-contracts/certora/harnesses/OwnableHarness.sol +0 -10
- package/lib/openzeppelin-contracts/certora/harnesses/PausableHarness.sol +0 -18
- package/lib/openzeppelin-contracts/certora/harnesses/TimelockControllerHarness.sol +0 -13
- 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 +0 -160
- package/lib/openzeppelin-contracts/certora/specs/AccessControl.spec +0 -119
- package/lib/openzeppelin-contracts/certora/specs/AccessControlDefaultAdminRules.spec +0 -464
- package/lib/openzeppelin-contracts/certora/specs/DoubleEndedQueue.spec +0 -300
- package/lib/openzeppelin-contracts/certora/specs/ERC20.spec +0 -352
- package/lib/openzeppelin-contracts/certora/specs/ERC20FlashMint.spec +0 -55
- package/lib/openzeppelin-contracts/certora/specs/ERC20Wrapper.spec +0 -198
- package/lib/openzeppelin-contracts/certora/specs/ERC721.spec +0 -679
- package/lib/openzeppelin-contracts/certora/specs/EnumerableMap.spec +0 -333
- package/lib/openzeppelin-contracts/certora/specs/EnumerableSet.spec +0 -246
- package/lib/openzeppelin-contracts/certora/specs/Initializable.spec +0 -165
- package/lib/openzeppelin-contracts/certora/specs/Ownable.spec +0 -77
- package/lib/openzeppelin-contracts/certora/specs/Ownable2Step.spec +0 -108
- package/lib/openzeppelin-contracts/certora/specs/Pausable.spec +0 -96
- package/lib/openzeppelin-contracts/certora/specs/TimelockController.spec +0 -274
- package/lib/openzeppelin-contracts/certora/specs/helpers/helpers.spec +0 -7
- package/lib/openzeppelin-contracts/certora/specs/methods/IAccessControl.spec +0 -8
- package/lib/openzeppelin-contracts/certora/specs/methods/IAccessControlDefaultAdminRules.spec +0 -36
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC20.spec +0 -11
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC2612.spec +0 -5
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC3156FlashBorrower.spec +0 -3
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC3156FlashLender.spec +0 -5
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC5313.spec +0 -3
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC721.spec +0 -17
- package/lib/openzeppelin-contracts/certora/specs/methods/IERC721Receiver.spec +0 -3
- package/lib/openzeppelin-contracts/certora/specs/methods/IOwnable.spec +0 -5
- package/lib/openzeppelin-contracts/certora/specs/methods/IOwnable2Step.spec +0 -7
- package/lib/openzeppelin-contracts/certora/specs.json +0 -86
- package/lib/openzeppelin-contracts/contracts/access/AccessControl.sol +0 -209
- package/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol +0 -98
- package/lib/openzeppelin-contracts/contracts/access/Ownable.sol +0 -100
- package/lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol +0 -59
- package/lib/openzeppelin-contracts/contracts/access/README.adoc +0 -43
- package/lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol +0 -396
- package/lib/openzeppelin-contracts/contracts/access/extensions/AccessControlEnumerable.sol +0 -70
- package/lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlDefaultAdminRules.sol +0 -192
- package/lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlEnumerable.sol +0 -31
- package/lib/openzeppelin-contracts/contracts/access/manager/AccessManaged.sol +0 -113
- package/lib/openzeppelin-contracts/contracts/access/manager/AccessManager.sol +0 -730
- package/lib/openzeppelin-contracts/contracts/access/manager/AuthorityUtils.sol +0 -32
- package/lib/openzeppelin-contracts/contracts/access/manager/IAccessManaged.sol +0 -32
- package/lib/openzeppelin-contracts/contracts/access/manager/IAccessManager.sol +0 -392
- package/lib/openzeppelin-contracts/contracts/access/manager/IAuthority.sol +0 -14
- package/lib/openzeppelin-contracts/contracts/finance/README.adoc +0 -14
- package/lib/openzeppelin-contracts/contracts/finance/VestingWallet.sol +0 -154
- package/lib/openzeppelin-contracts/contracts/governance/Governor.sol +0 -850
- package/lib/openzeppelin-contracts/contracts/governance/IGovernor.sol +0 -427
- package/lib/openzeppelin-contracts/contracts/governance/README.adoc +0 -167
- package/lib/openzeppelin-contracts/contracts/governance/TimelockController.sol +0 -472
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingSimple.sol +0 -100
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorPreventLateQuorum.sol +0 -102
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorSettings.sol +0 -112
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorStorage.sol +0 -115
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockAccess.sol +0 -346
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockCompound.sol +0 -167
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockControl.sol +0 -173
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotes.sol +0 -64
- package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesQuorumFraction.sol +0 -110
- package/lib/openzeppelin-contracts/contracts/governance/utils/IVotes.sol +0 -59
- package/lib/openzeppelin-contracts/contracts/governance/utils/Votes.sol +0 -251
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1155.sol +0 -6
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1155MetadataURI.sol +0 -6
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1155Receiver.sol +0 -6
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol +0 -17
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol +0 -80
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Receiver.sol +0 -35
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Spender.sol +0 -29
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol +0 -6
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Implementer.sol +0 -20
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Registry.sol +0 -112
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol +0 -24
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol +0 -6
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sol +0 -6
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC2309.sol +0 -19
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC2612.sol +0 -8
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol +0 -23
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC3156.sol +0 -7
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashBorrower.sol +0 -27
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashLender.sol +0 -41
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol +0 -230
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC4906.sol +0 -20
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol +0 -28
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC5313.sol +0 -16
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC5805.sol +0 -9
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC6372.sol +0 -17
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC721.sol +0 -6
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC721Enumerable.sol +0 -6
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC721Metadata.sol +0 -6
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC721Receiver.sol +0 -6
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC777.sol +0 -200
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC777Recipient.sol +0 -35
- package/lib/openzeppelin-contracts/contracts/interfaces/IERC777Sender.sol +0 -35
- package/lib/openzeppelin-contracts/contracts/interfaces/README.adoc +0 -82
- package/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol +0 -20
- package/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol +0 -161
- package/lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol +0 -75
- package/lib/openzeppelin-contracts/contracts/metatx/ERC2771Forwarder.sol +0 -370
- package/lib/openzeppelin-contracts/contracts/metatx/README.adoc +0 -12
- package/lib/openzeppelin-contracts/contracts/mocks/AccessManagedTarget.sol +0 -34
- package/lib/openzeppelin-contracts/contracts/mocks/ArraysMock.sol +0 -51
- package/lib/openzeppelin-contracts/contracts/mocks/AuthorityMock.sol +0 -69
- package/lib/openzeppelin-contracts/contracts/mocks/CallReceiverMock.sol +0 -73
- package/lib/openzeppelin-contracts/contracts/mocks/ContextMock.sol +0 -35
- package/lib/openzeppelin-contracts/contracts/mocks/DummyImplementation.sol +0 -65
- package/lib/openzeppelin-contracts/contracts/mocks/EIP712Verifier.sol +0 -16
- package/lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol +0 -24
- package/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165InterfacesSupported.sol +0 -58
- package/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MaliciousData.sol +0 -12
- package/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MissingData.sol +0 -7
- package/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165NotSupported.sol +0 -5
- package/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165ReturnBomb.sol +0 -18
- package/lib/openzeppelin-contracts/contracts/mocks/ERC2771ContextMock.sol +0 -23
- package/lib/openzeppelin-contracts/contracts/mocks/ERC3156FlashBorrowerMock.sol +0 -53
- package/lib/openzeppelin-contracts/contracts/mocks/EtherReceiverMock.sol +0 -17
- package/lib/openzeppelin-contracts/contracts/mocks/InitializableMock.sol +0 -130
- package/lib/openzeppelin-contracts/contracts/mocks/MulticallTest.sol +0 -23
- package/lib/openzeppelin-contracts/contracts/mocks/MultipleInheritanceInitializableMocks.sol +0 -131
- package/lib/openzeppelin-contracts/contracts/mocks/PausableMock.sol +0 -31
- package/lib/openzeppelin-contracts/contracts/mocks/ReentrancyAttack.sol +0 -12
- package/lib/openzeppelin-contracts/contracts/mocks/ReentrancyMock.sol +0 -50
- package/lib/openzeppelin-contracts/contracts/mocks/RegressionImplementation.sol +0 -61
- package/lib/openzeppelin-contracts/contracts/mocks/SingleInheritanceInitializableMocks.sol +0 -49
- package/lib/openzeppelin-contracts/contracts/mocks/Stateless.sol +0 -36
- package/lib/openzeppelin-contracts/contracts/mocks/StorageSlotMock.sol +0 -77
- package/lib/openzeppelin-contracts/contracts/mocks/TimelockReentrant.sol +0 -26
- package/lib/openzeppelin-contracts/contracts/mocks/UpgradeableBeaconMock.sol +0 -27
- package/lib/openzeppelin-contracts/contracts/mocks/VotesMock.sol +0 -42
- package/lib/openzeppelin-contracts/contracts/mocks/compound/CompTimelock.sol +0 -174
- package/lib/openzeppelin-contracts/contracts/mocks/docs/ERC20WithAutoMinerReward.sol +0 -22
- package/lib/openzeppelin-contracts/contracts/mocks/docs/ERC4626Fees.sol +0 -103
- package/lib/openzeppelin-contracts/contracts/mocks/docs/MyContractOwnable.sol +0 -17
- package/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyGovernor.sol +0 -81
- package/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyToken.sol +0 -21
- package/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyTokenTimestampBased.sol +0 -32
- package/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyTokenWrapped.sol +0 -28
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorMock.sol +0 -14
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorPreventLateQuorumMock.sol +0 -46
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorStorageMock.sol +0 -79
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockAccessMock.sol +0 -70
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockCompoundMock.sol +0 -69
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockControlMock.sol +0 -69
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorVoteMock.sol +0 -20
- package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorWithParamsMock.sol +0 -51
- package/lib/openzeppelin-contracts/contracts/mocks/proxy/BadBeacon.sol +0 -11
- package/lib/openzeppelin-contracts/contracts/mocks/proxy/ClashingImplementation.sol +0 -19
- package/lib/openzeppelin-contracts/contracts/mocks/proxy/UUPSUpgradeableMock.sol +0 -35
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC1155ReceiverMock.sol +0 -74
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ApprovalMock.sol +0 -10
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20DecimalsMock.sol +0 -17
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ExcessDecimalsMock.sol +0 -9
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20FlashMintMock.sol +0 -26
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ForceApproveMock.sol +0 -13
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20Mock.sol +0 -16
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20MulticallMock.sol +0 -8
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20NoReturnMock.sol +0 -28
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20Reentrant.sol +0 -39
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ReturnFalseMock.sol +0 -19
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20VotesLegacyMock.sol +0 -253
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626LimitsMock.sol +0 -23
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626Mock.sol +0 -17
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626OffsetMock.sol +0 -17
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC4646FeesMock.sol +0 -40
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ConsecutiveEnumerableMock.sol +0 -42
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ConsecutiveMock.sol +0 -61
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ReceiverMock.sol +0 -47
- package/lib/openzeppelin-contracts/contracts/mocks/token/ERC721URIStorageMock.sol +0 -17
- package/lib/openzeppelin-contracts/contracts/mocks/token/VotesTimestamp.sol +0 -29
- package/lib/openzeppelin-contracts/contracts/package.json +0 -32
- package/lib/openzeppelin-contracts/contracts/proxy/Clones.sol +0 -95
- package/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol +0 -40
- package/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol +0 -193
- package/lib/openzeppelin-contracts/contracts/proxy/Proxy.sol +0 -69
- package/lib/openzeppelin-contracts/contracts/proxy/README.adoc +0 -87
- package/lib/openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sol +0 -57
- package/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol +0 -16
- package/lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol +0 -70
- package/lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol +0 -45
- package/lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol +0 -116
- package/lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol +0 -228
- package/lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol +0 -147
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sol +0 -468
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol +0 -128
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol +0 -59
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/README.adoc +0 -41
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol +0 -28
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Pausable.sol +0 -38
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Supply.sol +0 -87
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol +0 -61
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol +0 -20
- package/lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol +0 -42
- package/lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol +0 -316
- package/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol +0 -79
- package/lib/openzeppelin-contracts/contracts/token/ERC20/README.adoc +0 -67
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sol +0 -39
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Capped.sol +0 -56
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20FlashMint.sol +0 -134
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Pausable.sol +0 -33
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Permit.sol +0 -83
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Votes.sol +0 -83
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Wrapper.sol +0 -86
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC4626.sol +0 -286
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol +0 -26
- package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol +0 -90
- package/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol +0 -118
- package/lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol +0 -483
- package/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol +0 -135
- package/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol +0 -28
- package/lib/openzeppelin-contracts/contracts/token/ERC721/README.adoc +0 -67
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Burnable.sol +0 -26
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Consecutive.sol +0 -176
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Enumerable.sol +0 -172
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Pausable.sol +0 -37
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Royalty.sol +0 -27
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721URIStorage.sol +0 -61
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Votes.sol +0 -47
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Wrapper.sol +0 -102
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sol +0 -29
- package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol +0 -27
- package/lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol +0 -24
- package/lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol +0 -137
- package/lib/openzeppelin-contracts/contracts/token/common/README.adoc +0 -10
- package/lib/openzeppelin-contracts/contracts/utils/Address.sol +0 -159
- package/lib/openzeppelin-contracts/contracts/utils/Arrays.sol +0 -127
- package/lib/openzeppelin-contracts/contracts/utils/Base64.sol +0 -90
- package/lib/openzeppelin-contracts/contracts/utils/Context.sol +0 -24
- package/lib/openzeppelin-contracts/contracts/utils/Create2.sol +0 -96
- package/lib/openzeppelin-contracts/contracts/utils/Multicall.sol +0 -23
- package/lib/openzeppelin-contracts/contracts/utils/Nonces.sol +0 -46
- package/lib/openzeppelin-contracts/contracts/utils/Pausable.sol +0 -119
- package/lib/openzeppelin-contracts/contracts/utils/README.adoc +0 -88
- package/lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol +0 -84
- package/lib/openzeppelin-contracts/contracts/utils/ShortStrings.sol +0 -123
- package/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol +0 -135
- package/lib/openzeppelin-contracts/contracts/utils/Strings.sol +0 -94
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol +0 -174
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol +0 -160
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol +0 -232
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol +0 -86
- package/lib/openzeppelin-contracts/contracts/utils/cryptography/SignatureChecker.sol +0 -48
- package/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol +0 -27
- package/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol +0 -124
- package/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol +0 -25
- package/lib/openzeppelin-contracts/contracts/utils/math/Math.sol +0 -415
- package/lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol +0 -1153
- package/lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol +0 -43
- package/lib/openzeppelin-contracts/contracts/utils/structs/BitMaps.sol +0 -60
- package/lib/openzeppelin-contracts/contracts/utils/structs/Checkpoints.sol +0 -603
- package/lib/openzeppelin-contracts/contracts/utils/structs/DoubleEndedQueue.sol +0 -169
- package/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol +0 -533
- package/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol +0 -378
- package/lib/openzeppelin-contracts/contracts/utils/types/Time.sol +0 -130
- package/lib/openzeppelin-contracts/contracts/vendor/compound/ICompoundTimelock.sol +0 -86
- package/lib/openzeppelin-contracts/contracts/vendor/compound/LICENSE +0 -11
- package/lib/openzeppelin-contracts/docs/README.md +0 -16
- package/lib/openzeppelin-contracts/docs/antora.yml +0 -7
- package/lib/openzeppelin-contracts/docs/config.js +0 -21
- 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 +0 -23
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/access-control.adoc +0 -204
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/backwards-compatibility.adoc +0 -48
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/crowdsales.adoc +0 -11
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/drafts.adoc +0 -19
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc1155.adoc +0 -145
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20-supply.adoc +0 -71
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20.adoc +0 -77
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc4626.adoc +0 -214
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc721.adoc +0 -79
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/extending-contracts.adoc +0 -77
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/faq.adoc +0 -13
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/governance.adoc +0 -240
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/index.adoc +0 -79
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/tokens.adoc +0 -31
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/upgradeable.adoc +0 -77
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/utilities.adoc +0 -185
- package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/wizard.adoc +0 -15
- package/lib/openzeppelin-contracts/docs/templates/contract.hbs +0 -111
- package/lib/openzeppelin-contracts/docs/templates/helpers.js +0 -46
- package/lib/openzeppelin-contracts/docs/templates/page.hbs +0 -4
- package/lib/openzeppelin-contracts/docs/templates/properties.js +0 -64
- package/lib/openzeppelin-contracts/foundry.toml +0 -10
- package/lib/openzeppelin-contracts/hardhat/env-artifacts.js +0 -24
- package/lib/openzeppelin-contracts/hardhat/env-contract.js +0 -25
- package/lib/openzeppelin-contracts/hardhat/ignore-unreachable-warnings.js +0 -45
- package/lib/openzeppelin-contracts/hardhat/skip-foundry-tests.js +0 -6
- package/lib/openzeppelin-contracts/hardhat/task-test-get-files.js +0 -25
- package/lib/openzeppelin-contracts/hardhat.config.js +0 -131
- package/lib/openzeppelin-contracts/lib/erc4626-tests/ERC4626.prop.sol +0 -404
- package/lib/openzeppelin-contracts/lib/erc4626-tests/ERC4626.test.sol +0 -349
- package/lib/openzeppelin-contracts/lib/erc4626-tests/LICENSE +0 -661
- package/lib/openzeppelin-contracts/lib/erc4626-tests/README.md +0 -116
- package/lib/openzeppelin-contracts/lib/forge-std/.github/workflows/ci.yml +0 -92
- package/lib/openzeppelin-contracts/lib/forge-std/.gitmodules +0 -3
- package/lib/openzeppelin-contracts/lib/forge-std/LICENSE-APACHE +0 -203
- package/lib/openzeppelin-contracts/lib/forge-std/LICENSE-MIT +0 -25
- package/lib/openzeppelin-contracts/lib/forge-std/README.md +0 -250
- package/lib/openzeppelin-contracts/lib/forge-std/foundry.toml +0 -21
- package/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/LICENSE +0 -674
- package/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/Makefile +0 -14
- package/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/default.nix +0 -4
- package/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/demo/demo.sol +0 -222
- package/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/package.json +0 -15
- package/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/test.sol +0 -469
- package/lib/openzeppelin-contracts/lib/forge-std/package.json +0 -16
- package/lib/openzeppelin-contracts/lib/forge-std/src/Base.sol +0 -31
- package/lib/openzeppelin-contracts/lib/forge-std/src/Script.sol +0 -26
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdAssertions.sol +0 -209
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdChains.sol +0 -189
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdCheats.sol +0 -565
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdError.sol +0 -15
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdJson.sol +0 -179
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdMath.sol +0 -43
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdStorage.sol +0 -327
- package/lib/openzeppelin-contracts/lib/forge-std/src/StdUtils.sol +0 -123
- package/lib/openzeppelin-contracts/lib/forge-std/src/Test.sol +0 -28
- package/lib/openzeppelin-contracts/lib/forge-std/src/Vm.sol +0 -385
- package/lib/openzeppelin-contracts/lib/forge-std/src/console.sol +0 -1533
- package/lib/openzeppelin-contracts/lib/forge-std/src/console2.sol +0 -1546
- package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC1155.sol +0 -105
- package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC165.sol +0 -12
- package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC20.sol +0 -43
- package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC4626.sol +0 -190
- package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC721.sol +0 -164
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdAssertions.t.sol +0 -587
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdChains.t.sol +0 -123
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdCheats.t.sol +0 -305
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdError.t.sol +0 -118
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdMath.t.sol +0 -197
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdStorage.t.sol +0 -283
- package/lib/openzeppelin-contracts/lib/forge-std/test/StdUtils.t.sol +0 -191
- package/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScript.sol +0 -10
- package/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol +0 -10
- package/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTest.sol +0 -10
- package/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTestBase.sol +0 -10
- package/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/broadcast.log.json +0 -187
- package/lib/openzeppelin-contracts/logo.svg +0 -15
- package/lib/openzeppelin-contracts/netlify.toml +0 -3
- package/lib/openzeppelin-contracts/package-lock.json +0 -16544
- package/lib/openzeppelin-contracts/package.json +0 -96
- package/lib/openzeppelin-contracts/remappings.txt +0 -1
- package/lib/openzeppelin-contracts/renovate.json +0 -4
- package/lib/openzeppelin-contracts/requirements.txt +0 -1
- package/lib/openzeppelin-contracts/scripts/checks/compare-layout.js +0 -20
- package/lib/openzeppelin-contracts/scripts/checks/compareGasReports.js +0 -243
- package/lib/openzeppelin-contracts/scripts/checks/extract-layout.js +0 -38
- package/lib/openzeppelin-contracts/scripts/checks/generation.sh +0 -6
- package/lib/openzeppelin-contracts/scripts/checks/inheritance-ordering.js +0 -54
- package/lib/openzeppelin-contracts/scripts/gen-nav.js +0 -41
- package/lib/openzeppelin-contracts/scripts/generate/format-lines.js +0 -16
- package/lib/openzeppelin-contracts/scripts/generate/run.js +0 -49
- package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.js +0 -247
- package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.opts.js +0 -17
- package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.t.js +0 -146
- package/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableMap.js +0 -283
- package/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableSet.js +0 -250
- package/lib/openzeppelin-contracts/scripts/generate/templates/SafeCast.js +0 -126
- package/lib/openzeppelin-contracts/scripts/generate/templates/StorageSlot.js +0 -78
- package/lib/openzeppelin-contracts/scripts/generate/templates/conversion.js +0 -30
- package/lib/openzeppelin-contracts/scripts/git-user-config.sh +0 -6
- package/lib/openzeppelin-contracts/scripts/helpers.js +0 -37
- package/lib/openzeppelin-contracts/scripts/prepack.sh +0 -23
- package/lib/openzeppelin-contracts/scripts/prepare-docs.sh +0 -26
- package/lib/openzeppelin-contracts/scripts/release/format-changelog.js +0 -33
- package/lib/openzeppelin-contracts/scripts/release/synchronize-versions.js +0 -15
- package/lib/openzeppelin-contracts/scripts/release/update-comment.js +0 -34
- package/lib/openzeppelin-contracts/scripts/release/version.sh +0 -11
- package/lib/openzeppelin-contracts/scripts/release/workflow/exit-prerelease.sh +0 -8
- package/lib/openzeppelin-contracts/scripts/release/workflow/github-release.js +0 -48
- package/lib/openzeppelin-contracts/scripts/release/workflow/integrity-check.sh +0 -20
- package/lib/openzeppelin-contracts/scripts/release/workflow/pack.sh +0 -26
- package/lib/openzeppelin-contracts/scripts/release/workflow/publish.sh +0 -26
- package/lib/openzeppelin-contracts/scripts/release/workflow/rerun.js +0 -7
- package/lib/openzeppelin-contracts/scripts/release/workflow/set-changesets-pr-title.js +0 -17
- package/lib/openzeppelin-contracts/scripts/release/workflow/start.sh +0 -35
- package/lib/openzeppelin-contracts/scripts/release/workflow/state.js +0 -112
- package/lib/openzeppelin-contracts/scripts/remove-ignored-artifacts.js +0 -45
- package/lib/openzeppelin-contracts/scripts/solhint-custom/index.js +0 -84
- package/lib/openzeppelin-contracts/scripts/solhint-custom/package.json +0 -5
- package/lib/openzeppelin-contracts/scripts/update-docs-branch.js +0 -65
- package/lib/openzeppelin-contracts/scripts/upgradeable/README.md +0 -21
- package/lib/openzeppelin-contracts/scripts/upgradeable/patch-apply.sh +0 -19
- package/lib/openzeppelin-contracts/scripts/upgradeable/patch-save.sh +0 -18
- package/lib/openzeppelin-contracts/scripts/upgradeable/transpile-onto.sh +0 -54
- package/lib/openzeppelin-contracts/scripts/upgradeable/transpile.sh +0 -47
- package/lib/openzeppelin-contracts/scripts/upgradeable/upgradeable.patch +0 -360
- package/lib/openzeppelin-contracts/slither.config.json +0 -5
- package/lib/openzeppelin-contracts/solhint.config.js +0 -20
- package/lib/openzeppelin-contracts/test/TESTING.md +0 -3
- package/lib/openzeppelin-contracts/test/access/AccessControl.behavior.js +0 -909
- package/lib/openzeppelin-contracts/test/access/AccessControl.test.js +0 -12
- package/lib/openzeppelin-contracts/test/access/Ownable.test.js +0 -72
- package/lib/openzeppelin-contracts/test/access/Ownable2Step.test.js +0 -70
- package/lib/openzeppelin-contracts/test/access/extensions/AccessControlDefaultAdminRules.test.js +0 -26
- package/lib/openzeppelin-contracts/test/access/extensions/AccessControlEnumerable.test.js +0 -17
- package/lib/openzeppelin-contracts/test/access/manager/AccessManaged.test.js +0 -142
- package/lib/openzeppelin-contracts/test/access/manager/AccessManager.behavior.js +0 -711
- package/lib/openzeppelin-contracts/test/access/manager/AccessManager.test.js +0 -2683
- package/lib/openzeppelin-contracts/test/access/manager/AuthorityUtils.test.js +0 -91
- package/lib/openzeppelin-contracts/test/finance/VestingWallet.behavior.js +0 -59
- package/lib/openzeppelin-contracts/test/finance/VestingWallet.test.js +0 -69
- package/lib/openzeppelin-contracts/test/governance/Governor.t.sol +0 -55
- package/lib/openzeppelin-contracts/test/governance/Governor.test.js +0 -1024
- package/lib/openzeppelin-contracts/test/governance/TimelockController.test.js +0 -1286
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorERC721.test.js +0 -116
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorPreventLateQuorum.test.js +0 -195
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorStorage.test.js +0 -150
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockAccess.test.js +0 -777
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockCompound.test.js +0 -441
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockControl.test.js +0 -515
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorVotesQuorumFraction.test.js +0 -167
- package/lib/openzeppelin-contracts/test/governance/extensions/GovernorWithParams.test.js +0 -277
- package/lib/openzeppelin-contracts/test/governance/utils/EIP6372.behavior.js +0 -23
- package/lib/openzeppelin-contracts/test/governance/utils/Votes.behavior.js +0 -360
- package/lib/openzeppelin-contracts/test/governance/utils/Votes.test.js +0 -92
- package/lib/openzeppelin-contracts/test/helpers/access-manager.js +0 -69
- package/lib/openzeppelin-contracts/test/helpers/account.js +0 -14
- package/lib/openzeppelin-contracts/test/helpers/chainid.js +0 -10
- package/lib/openzeppelin-contracts/test/helpers/constants.js +0 -7
- package/lib/openzeppelin-contracts/test/helpers/create.js +0 -22
- package/lib/openzeppelin-contracts/test/helpers/customError.js +0 -43
- package/lib/openzeppelin-contracts/test/helpers/eip712.js +0 -67
- package/lib/openzeppelin-contracts/test/helpers/enums.js +0 -11
- package/lib/openzeppelin-contracts/test/helpers/erc1967.js +0 -43
- package/lib/openzeppelin-contracts/test/helpers/governance.js +0 -253
- package/lib/openzeppelin-contracts/test/helpers/iterate.js +0 -16
- package/lib/openzeppelin-contracts/test/helpers/math.js +0 -11
- package/lib/openzeppelin-contracts/test/helpers/methods.js +0 -5
- package/lib/openzeppelin-contracts/test/helpers/sign.js +0 -63
- package/lib/openzeppelin-contracts/test/helpers/time.js +0 -17
- package/lib/openzeppelin-contracts/test/helpers/txpool.js +0 -38
- package/lib/openzeppelin-contracts/test/metatx/ERC2771Context.test.js +0 -134
- package/lib/openzeppelin-contracts/test/metatx/ERC2771Forwarder.t.sol +0 -165
- package/lib/openzeppelin-contracts/test/metatx/ERC2771Forwarder.test.js +0 -541
- package/lib/openzeppelin-contracts/test/proxy/Clones.behaviour.js +0 -136
- package/lib/openzeppelin-contracts/test/proxy/Clones.test.js +0 -62
- package/lib/openzeppelin-contracts/test/proxy/ERC1967/ERC1967Proxy.test.js +0 -12
- package/lib/openzeppelin-contracts/test/proxy/ERC1967/ERC1967Utils.test.js +0 -172
- package/lib/openzeppelin-contracts/test/proxy/Proxy.behaviour.js +0 -182
- package/lib/openzeppelin-contracts/test/proxy/beacon/BeaconProxy.test.js +0 -152
- package/lib/openzeppelin-contracts/test/proxy/beacon/UpgradeableBeacon.test.js +0 -54
- package/lib/openzeppelin-contracts/test/proxy/transparent/ProxyAdmin.test.js +0 -103
- package/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js +0 -413
- package/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.test.js +0 -24
- package/lib/openzeppelin-contracts/test/proxy/utils/Initializable.test.js +0 -220
- package/lib/openzeppelin-contracts/test/proxy/utils/UUPSUpgradeable.test.js +0 -131
- package/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.behavior.js +0 -905
- package/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.test.js +0 -252
- package/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Burnable.test.js +0 -71
- package/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Pausable.test.js +0 -113
- package/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Supply.test.js +0 -116
- package/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155URIStorage.test.js +0 -66
- package/lib/openzeppelin-contracts/test/token/ERC1155/utils/ERC1155Holder.test.js +0 -64
- package/lib/openzeppelin-contracts/test/token/ERC20/ERC20.behavior.js +0 -340
- package/lib/openzeppelin-contracts/test/token/ERC20/ERC20.test.js +0 -202
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.behavior.js +0 -116
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.test.js +0 -20
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.behavior.js +0 -31
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.test.js +0 -24
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20FlashMint.test.js +0 -210
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Pausable.test.js +0 -136
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Permit.test.js +0 -118
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Votes.test.js +0 -593
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Wrapper.test.js +0 -211
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC4626.t.sol +0 -41
- package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC4626.test.js +0 -1109
- package/lib/openzeppelin-contracts/test/token/ERC20/utils/SafeERC20.test.js +0 -240
- package/lib/openzeppelin-contracts/test/token/ERC721/ERC721.behavior.js +0 -978
- package/lib/openzeppelin-contracts/test/token/ERC721/ERC721.test.js +0 -15
- package/lib/openzeppelin-contracts/test/token/ERC721/ERC721Enumerable.test.js +0 -20
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Burnable.test.js +0 -82
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Consecutive.t.sol +0 -181
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Consecutive.test.js +0 -221
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Pausable.test.js +0 -90
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Royalty.test.js +0 -47
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721URIStorage.test.js +0 -114
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Votes.test.js +0 -183
- package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Wrapper.test.js +0 -289
- package/lib/openzeppelin-contracts/test/token/ERC721/utils/ERC721Holder.test.js +0 -22
- package/lib/openzeppelin-contracts/test/token/common/ERC2981.behavior.js +0 -169
- package/lib/openzeppelin-contracts/test/utils/Address.test.js +0 -340
- package/lib/openzeppelin-contracts/test/utils/Arrays.test.js +0 -123
- package/lib/openzeppelin-contracts/test/utils/Base64.test.js +0 -33
- package/lib/openzeppelin-contracts/test/utils/Context.behavior.js +0 -42
- package/lib/openzeppelin-contracts/test/utils/Context.test.js +0 -17
- package/lib/openzeppelin-contracts/test/utils/Create2.test.js +0 -102
- package/lib/openzeppelin-contracts/test/utils/Multicall.test.js +0 -69
- package/lib/openzeppelin-contracts/test/utils/Nonces.test.js +0 -71
- package/lib/openzeppelin-contracts/test/utils/Pausable.test.js +0 -86
- package/lib/openzeppelin-contracts/test/utils/ReentrancyGuard.test.js +0 -44
- package/lib/openzeppelin-contracts/test/utils/ShortStrings.t.sol +0 -55
- package/lib/openzeppelin-contracts/test/utils/ShortStrings.test.js +0 -55
- package/lib/openzeppelin-contracts/test/utils/StorageSlot.test.js +0 -210
- package/lib/openzeppelin-contracts/test/utils/Strings.test.js +0 -153
- package/lib/openzeppelin-contracts/test/utils/cryptography/ECDSA.test.js +0 -245
- package/lib/openzeppelin-contracts/test/utils/cryptography/EIP712.test.js +0 -111
- package/lib/openzeppelin-contracts/test/utils/cryptography/MerkleProof.test.js +0 -207
- package/lib/openzeppelin-contracts/test/utils/cryptography/MessageHashUtils.test.js +0 -55
- package/lib/openzeppelin-contracts/test/utils/cryptography/SignatureChecker.test.js +0 -87
- package/lib/openzeppelin-contracts/test/utils/introspection/ERC165.test.js +0 -11
- package/lib/openzeppelin-contracts/test/utils/introspection/ERC165Checker.test.js +0 -300
- package/lib/openzeppelin-contracts/test/utils/introspection/SupportsInterface.behavior.js +0 -144
- package/lib/openzeppelin-contracts/test/utils/math/Math.t.sol +0 -216
- package/lib/openzeppelin-contracts/test/utils/math/Math.test.js +0 -469
- package/lib/openzeppelin-contracts/test/utils/math/SafeCast.test.js +0 -161
- package/lib/openzeppelin-contracts/test/utils/math/SignedMath.test.js +0 -95
- package/lib/openzeppelin-contracts/test/utils/structs/BitMap.test.js +0 -145
- package/lib/openzeppelin-contracts/test/utils/structs/Checkpoints.t.sol +0 -332
- package/lib/openzeppelin-contracts/test/utils/structs/Checkpoints.test.js +0 -158
- package/lib/openzeppelin-contracts/test/utils/structs/DoubleEndedQueue.test.js +0 -99
- package/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.behavior.js +0 -178
- package/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.test.js +0 -149
- package/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.behavior.js +0 -129
- package/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.test.js +0 -79
- package/lib/openzeppelin-contracts/test/utils/types/Time.test.js +0 -140
package/dist/cli.js
CHANGED
|
@@ -45,6 +45,7 @@ const ethers_1 = require("ethers");
|
|
|
45
45
|
const swap_1 = require("./swap");
|
|
46
46
|
const stats_1 = require("./stats");
|
|
47
47
|
const onramp_1 = require("./onramp");
|
|
48
|
+
const agent_1 = require("./agent");
|
|
48
49
|
const autonomous_1 = require("./autonomous");
|
|
49
50
|
// V3 Contract Addresses (Base Mainnet)
|
|
50
51
|
const V3_CONTRACTS = {
|
|
@@ -98,18 +99,11 @@ const DEFAULT_CONFIG = {
|
|
|
98
99
|
setupComplete: false,
|
|
99
100
|
version: '3.0.0',
|
|
100
101
|
};
|
|
101
|
-
//
|
|
102
|
+
// Simple header
|
|
102
103
|
function showBanner() {
|
|
103
104
|
console.log(`
|
|
104
|
-
${c.
|
|
105
|
-
|
|
106
|
-
██████╔╝███████║ ╚████╔╝ ██║ ██║ ██║██████╔╝███████╗ ██║ █████╗ ██████╔╝
|
|
107
|
-
██╔═══╝ ██╔══██║ ╚██╔╝ ██║ ██║ ██║██╔══██╗╚════██║ ██║ ██╔══╝ ██╔══██╗
|
|
108
|
-
██║ ██║ ██║ ██║ ███████╗╚██████╔╝██████╔╝███████║ ██║ ███████╗██║ ██║
|
|
109
|
-
╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝${c.reset}
|
|
110
|
-
|
|
111
|
-
${c.dim}🦞 Payment Infrastructure for AI Agents${c.reset}
|
|
112
|
-
${c.dim} Built on Base • Powered by USDC${c.reset}
|
|
105
|
+
${c.blue}🦞 Pay Lobster${c.reset}
|
|
106
|
+
${c.dim}Payment Infrastructure for AI Agents${c.reset}
|
|
113
107
|
`);
|
|
114
108
|
}
|
|
115
109
|
// Create readline interface
|
|
@@ -204,91 +198,86 @@ function getAddress(privateKey) {
|
|
|
204
198
|
async function runSetupWizard() {
|
|
205
199
|
const rl = createRL();
|
|
206
200
|
const config = loadConfig();
|
|
207
|
-
console.log(`\n${c.
|
|
208
|
-
console.log(
|
|
209
|
-
console.log(
|
|
210
|
-
console.log(
|
|
211
|
-
console.log(`${c.dim}Your configuration will be stored securely at: ${CONFIG_FILE}${c.reset}\n`);
|
|
201
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster Setup${c.reset}`);
|
|
202
|
+
console.log(` ${c.dim}──────────────────────${c.reset}\n`);
|
|
203
|
+
console.log(` ${c.dim}Configure Pay Lobster for your AI agent${c.reset}`);
|
|
204
|
+
console.log(` ${c.dim}Config: ${CONFIG_FILE}${c.reset}\n`);
|
|
212
205
|
// Step 1: Agent Name
|
|
213
|
-
console.log(
|
|
214
|
-
|
|
215
|
-
const agentName = await prompt(rl, `${c.green}❯${c.reset} Agent name: `);
|
|
206
|
+
console.log(` ${c.dim}Step 1/4: Agent Name${c.reset}\n`);
|
|
207
|
+
const agentName = await prompt(rl, ` ${c.blue}❯${c.reset} Agent name: `);
|
|
216
208
|
config.agentName = agentName || 'MyAgent';
|
|
217
|
-
console.log(
|
|
209
|
+
console.log(` ${c.green}✓${c.reset} ${config.agentName}\n`);
|
|
218
210
|
// Step 2: Network Selection
|
|
219
|
-
console.log(
|
|
220
|
-
console.log(
|
|
221
|
-
console.log(`
|
|
222
|
-
|
|
223
|
-
const networkChoice = await prompt(rl, `${c.green}❯${c.reset} Select network [1/2]: `);
|
|
211
|
+
console.log(` ${c.dim}Step 2/4: Network${c.reset}\n`);
|
|
212
|
+
console.log(` 1) Base Mainnet ${c.dim}(production)${c.reset}`);
|
|
213
|
+
console.log(` 2) Base Sepolia ${c.dim}(testnet)${c.reset}\n`);
|
|
214
|
+
const networkChoice = await prompt(rl, ` ${c.blue}❯${c.reset} Select [1/2]: `);
|
|
224
215
|
if (networkChoice === '2') {
|
|
225
216
|
config.network = 'base-sepolia';
|
|
226
217
|
config.rpcUrl = 'https://sepolia.base.org';
|
|
227
|
-
console.log(
|
|
218
|
+
console.log(` ${c.green}✓${c.reset} Base Sepolia (Testnet)\n`);
|
|
228
219
|
}
|
|
229
220
|
else {
|
|
230
221
|
config.network = 'base';
|
|
231
222
|
config.rpcUrl = 'https://mainnet.base.org';
|
|
232
|
-
console.log(
|
|
223
|
+
console.log(` ${c.green}✓${c.reset} Base Mainnet\n`);
|
|
233
224
|
}
|
|
234
225
|
// Step 3: Wallet Setup
|
|
235
|
-
console.log(
|
|
236
|
-
console.log(
|
|
237
|
-
console.log(`
|
|
238
|
-
console.log(`
|
|
239
|
-
|
|
240
|
-
const walletChoice = await prompt(rl, `${c.green}❯${c.reset} Select option [1/2/3]: `);
|
|
226
|
+
console.log(` ${c.dim}Step 3/4: Wallet${c.reset}\n`);
|
|
227
|
+
console.log(` 1) Generate new wallet`);
|
|
228
|
+
console.log(` 2) Import private key`);
|
|
229
|
+
console.log(` 3) Skip ${c.dim}(read-only)${c.reset}\n`);
|
|
230
|
+
const walletChoice = await prompt(rl, ` ${c.blue}❯${c.reset} Select [1/2/3]: `);
|
|
241
231
|
if (walletChoice === '1') {
|
|
242
232
|
// Generate new wallet
|
|
243
233
|
const wallet = ethers_1.ethers.Wallet.createRandom();
|
|
244
234
|
config.privateKey = wallet.privateKey;
|
|
245
|
-
console.log(`\n${c.green}✓${c.reset} New wallet generated
|
|
246
|
-
console.log(
|
|
247
|
-
console.log(
|
|
248
|
-
console.log(
|
|
249
|
-
console.log(
|
|
250
|
-
console.log(
|
|
251
|
-
console.log(
|
|
252
|
-
|
|
253
|
-
console.log(`${c.dim}If you lose it, you lose access to your funds forever.${c.reset}\n`);
|
|
254
|
-
await prompt(rl, `${c.yellow}Press Enter when you've saved your key...${c.reset}`);
|
|
235
|
+
console.log(`\n ${c.green}✓${c.reset} New wallet generated\n`);
|
|
236
|
+
console.log(` ${c.red}⚠️ SAVE THIS INFORMATION${c.reset}`);
|
|
237
|
+
console.log(` ${c.dim}──────────────────────────────────────────────────${c.reset}`);
|
|
238
|
+
console.log(` Address: ${c.green}${wallet.address}${c.reset}`);
|
|
239
|
+
console.log(` Private Key: ${c.yellow}${wallet.privateKey.slice(0, 20)}...${c.reset}`);
|
|
240
|
+
console.log(` ${c.dim}──────────────────────────────────────────────────${c.reset}\n`);
|
|
241
|
+
console.log(` ${c.dim}If you lose your key, you lose your funds forever.${c.reset}\n`);
|
|
242
|
+
await prompt(rl, ` ${c.dim}Press Enter when saved...${c.reset}`);
|
|
255
243
|
console.log();
|
|
256
244
|
}
|
|
257
245
|
else if (walletChoice === '2') {
|
|
258
246
|
// Import existing
|
|
259
|
-
console.log(`\n${c.dim}Enter
|
|
247
|
+
console.log(`\n ${c.dim}Enter private key (hidden):${c.reset}\n`);
|
|
260
248
|
let validKey = false;
|
|
261
249
|
while (!validKey) {
|
|
262
|
-
const privateKey = await promptSecret(rl,
|
|
250
|
+
const privateKey = await promptSecret(rl, ` ${c.blue}❯${c.reset} Private key: `);
|
|
263
251
|
if (isValidPrivateKey(privateKey)) {
|
|
264
252
|
config.privateKey = privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`;
|
|
265
253
|
const address = getAddress(config.privateKey);
|
|
266
|
-
|
|
254
|
+
const shortAddr = address.slice(0, 6) + '...' + address.slice(-4);
|
|
255
|
+
console.log(` ${c.green}✓${c.reset} Imported ${shortAddr}\n`);
|
|
267
256
|
validKey = true;
|
|
268
257
|
}
|
|
269
258
|
else {
|
|
270
|
-
console.log(
|
|
259
|
+
console.log(` ${c.red}✗${c.reset} Invalid key\n`);
|
|
271
260
|
}
|
|
272
261
|
}
|
|
273
262
|
}
|
|
274
263
|
else {
|
|
275
|
-
console.log(
|
|
264
|
+
console.log(` ${c.dim}Skipped. Read-only mode.${c.reset}\n`);
|
|
276
265
|
}
|
|
277
266
|
// Step 4: Verify & Complete
|
|
278
|
-
console.log(
|
|
267
|
+
console.log(` ${c.dim}Step 4/4: Verification${c.reset}\n`);
|
|
279
268
|
// Test RPC connection
|
|
280
|
-
process.stdout.write(
|
|
269
|
+
process.stdout.write(` ${c.dim}Testing ${config.network}...${c.reset} `);
|
|
281
270
|
try {
|
|
282
271
|
const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
|
|
283
272
|
const blockNumber = await provider.getBlockNumber();
|
|
284
|
-
console.log(`${c.green}✓${c.reset}
|
|
273
|
+
console.log(`${c.green}✓${c.reset} Block #${blockNumber}`);
|
|
285
274
|
}
|
|
286
275
|
catch (e) {
|
|
287
|
-
console.log(`${c.red}✗${c.reset} Failed
|
|
276
|
+
console.log(`${c.red}✗${c.reset} Failed`);
|
|
288
277
|
}
|
|
289
278
|
// Check balance if wallet configured
|
|
290
279
|
if (config.privateKey) {
|
|
291
|
-
process.stdout.write(
|
|
280
|
+
process.stdout.write(` ${c.dim}Checking balance...${c.reset} `);
|
|
292
281
|
try {
|
|
293
282
|
const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
|
|
294
283
|
const usdcAddress = config.network === 'base'
|
|
@@ -299,131 +288,93 @@ async function runSetupWizard() {
|
|
|
299
288
|
const address = getAddress(config.privateKey);
|
|
300
289
|
const balance = await usdc.balanceOf(address);
|
|
301
290
|
const formatted = ethers_1.ethers.formatUnits(balance, 6);
|
|
302
|
-
console.log(`${c.green}✓${c.reset}
|
|
291
|
+
console.log(`${c.green}✓${c.reset} $${formatted} USDC`);
|
|
303
292
|
}
|
|
304
293
|
catch (e) {
|
|
305
|
-
console.log(`${c.
|
|
294
|
+
console.log(`${c.dim}─${c.reset}`);
|
|
306
295
|
}
|
|
307
296
|
}
|
|
308
297
|
// Save config
|
|
309
298
|
config.setupComplete = true;
|
|
310
299
|
saveConfig(config);
|
|
311
|
-
console.log(`\n${c.green}✓${c.reset}
|
|
312
|
-
//
|
|
313
|
-
console.log(
|
|
314
|
-
console.log(
|
|
315
|
-
console.log(
|
|
316
|
-
console.log(
|
|
317
|
-
console.log(` ${c.cyan}paylobster balance${c.reset} Check your USDC balance`);
|
|
318
|
-
console.log(` ${c.cyan}paylobster send${c.reset} Send USDC to an address`);
|
|
319
|
-
console.log(` ${c.cyan}paylobster escrow create${c.reset} Create a new escrow`);
|
|
320
|
-
console.log(` ${c.cyan}paylobster discover${c.reset} Find agents by capability`);
|
|
321
|
-
console.log(` ${c.cyan}paylobster help${c.reset} Show all commands\n`);
|
|
300
|
+
console.log(`\n ${c.green}✓${c.reset} Setup complete\n`);
|
|
301
|
+
// Quick start
|
|
302
|
+
console.log(` ${c.bright}Quick Start${c.reset}\n`);
|
|
303
|
+
console.log(` paylobster balance Check balance`);
|
|
304
|
+
console.log(` paylobster send Send USDC`);
|
|
305
|
+
console.log(` paylobster help All commands\n`);
|
|
322
306
|
if (config.network === 'base' && config.privateKey) {
|
|
323
307
|
const address = getAddress(config.privateKey);
|
|
324
|
-
|
|
325
|
-
console.log(
|
|
308
|
+
const shortAddr = address.slice(0, 10) + '...' + address.slice(-8);
|
|
309
|
+
console.log(` ${c.dim}Your address: ${shortAddr}${c.reset}\n`);
|
|
326
310
|
}
|
|
327
|
-
console.log(`${c.dim}Docs: https://paylobster.com/docs${c.reset}`);
|
|
328
|
-
console.log(`${c.dim}GitHub: https://github.com/itsGustav/Pay-Lobster${c.reset}\n`);
|
|
329
311
|
rl.close();
|
|
330
312
|
}
|
|
331
313
|
// Show help
|
|
332
314
|
function showHelp() {
|
|
333
315
|
console.log(`
|
|
334
|
-
${c.
|
|
316
|
+
${c.blue}🦞 Pay Lobster${c.reset} v3.1.0
|
|
335
317
|
|
|
336
|
-
${c.bright}
|
|
337
|
-
|
|
318
|
+
${c.bright}PAYMENTS${c.reset}
|
|
319
|
+
send <address> <amount> Send USDC
|
|
320
|
+
escrow create/list/release Manage escrows
|
|
321
|
+
fund <amount> Buy USDC with card
|
|
322
|
+
balance Check balance
|
|
323
|
+
receive Show deposit address
|
|
338
324
|
|
|
339
|
-
${c.bright}
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
${c.cyan}receive${c.reset} Show your wallet address
|
|
344
|
-
${c.cyan}fund <amount>${c.reset} Fund wallet with card (Coinbase Onramp)
|
|
345
|
-
${c.cyan}swap <amt> <from> to <to>${c.reset} Swap tokens (ETH/USDC)
|
|
346
|
-
${c.cyan}quote <from> <to>${c.reset} Get swap quote
|
|
347
|
-
${c.cyan}escrow create${c.reset} Create new escrow
|
|
348
|
-
${c.cyan}escrow list${c.reset} List your escrows
|
|
349
|
-
${c.cyan}escrow release <id>${c.reset} Release escrow funds
|
|
350
|
-
${c.cyan}trust <agent>${c.reset} Check agent trust score
|
|
351
|
-
${c.cyan}discover${c.reset} Find agents by capability
|
|
352
|
-
${c.cyan}register${c.reset} Register your agent
|
|
353
|
-
${c.cyan}stats${c.reset} Show global volume stats
|
|
354
|
-
${c.cyan}volume${c.reset} Alias for stats
|
|
355
|
-
${c.cyan}leaderboard${c.reset} Top wallets by volume
|
|
356
|
-
|
|
357
|
-
${c.bright}V3 CREDIT SCORE${c.reset}
|
|
358
|
-
${c.cyan}score [address]${c.reset} Check LOBSTER credit score (300-850)
|
|
359
|
-
${c.cyan}credit${c.reset} Your credit limit & available
|
|
360
|
-
${c.cyan}tier${c.reset} Your tier (Standard/Bronze/Silver/Gold/Elite)
|
|
361
|
-
${c.cyan}credit-history${c.reset} Credit usage history
|
|
362
|
-
|
|
363
|
-
${c.bright}V3 CREDIT ESCROW${c.reset}
|
|
364
|
-
${c.cyan}repay <loanId>${c.reset} Repay credit portion of escrow
|
|
365
|
-
${c.cyan}loans${c.reset} List active credit loans
|
|
366
|
-
${c.cyan}loan <loanId>${c.reset} Loan details
|
|
367
|
-
|
|
368
|
-
${c.bright}V3 REPUTATION${c.reset}
|
|
369
|
-
${c.cyan}reputation [addr]${c.reset} Full trust vector breakdown
|
|
370
|
-
${c.cyan}trust-history${c.reset} How trust changed over time
|
|
371
|
-
|
|
372
|
-
${c.bright}V3 IDENTITY${c.reset}
|
|
373
|
-
${c.cyan}identity [address]${c.reset} Agent NFT details
|
|
374
|
-
${c.cyan}agents${c.reset} List all registered agents
|
|
375
|
-
|
|
376
|
-
${c.cyan}config${c.reset} Show current configuration
|
|
377
|
-
${c.cyan}help${c.reset} Show this help message
|
|
325
|
+
${c.bright}IDENTITY${c.reset}
|
|
326
|
+
register <name> Register agent
|
|
327
|
+
discover [search] Find agents
|
|
328
|
+
identity [address] View identity
|
|
378
329
|
|
|
379
|
-
${c.bright}
|
|
380
|
-
|
|
381
|
-
|
|
330
|
+
${c.bright}REPUTATION${c.reset}
|
|
331
|
+
score [address] LOBSTER score
|
|
332
|
+
credit Credit status
|
|
333
|
+
trust <address> Trust info
|
|
334
|
+
reputation [address] Full reputation
|
|
382
335
|
|
|
383
|
-
${c.
|
|
384
|
-
|
|
336
|
+
${c.bright}CREDIT LOANS${c.reset}
|
|
337
|
+
loans Active loans
|
|
338
|
+
loan <id> Loan details
|
|
339
|
+
repay <id> Repay loan
|
|
385
340
|
|
|
386
|
-
${c.
|
|
387
|
-
|
|
341
|
+
${c.bright}SETTINGS${c.reset}
|
|
342
|
+
setup Initial setup
|
|
343
|
+
trust-gate Trust gate config
|
|
344
|
+
limits Spending limits
|
|
345
|
+
config Show config
|
|
388
346
|
|
|
389
|
-
${c.
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
Escrow V3: ${c.dim}${V3_CONTRACTS.escrow}${c.reset}
|
|
347
|
+
${c.dim}Examples:${c.reset}
|
|
348
|
+
paylobster send 0x8b3f...2e1a 50
|
|
349
|
+
paylobster score
|
|
350
|
+
paylobster credit
|
|
394
351
|
|
|
395
|
-
${c.dim}
|
|
352
|
+
${c.dim}Docs: https://paylobster.com/docs${c.reset}
|
|
396
353
|
`);
|
|
397
354
|
}
|
|
398
355
|
// Show config
|
|
399
356
|
function showConfig() {
|
|
400
357
|
const config = loadConfig();
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
console.log(
|
|
404
|
-
console.log(`
|
|
405
|
-
console.log(`
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
}
|
|
410
|
-
else {
|
|
411
|
-
console.log(` Wallet: ${c.yellow}Not configured${c.reset}`);
|
|
412
|
-
}
|
|
413
|
-
console.log(` Setup: ${config.setupComplete ? `${c.green}Complete${c.reset}` : `${c.yellow}Incomplete${c.reset}`}`);
|
|
414
|
-
console.log();
|
|
358
|
+
const address = config.privateKey ? getAddress(config.privateKey) : null;
|
|
359
|
+
const shortAddr = address ? address.slice(0, 10) + '...' + address.slice(-8) : 'None';
|
|
360
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Configuration\n`);
|
|
361
|
+
console.log(` Agent ${config.agentName || 'Not set'}`);
|
|
362
|
+
console.log(` Network ${config.network}`);
|
|
363
|
+
console.log(` Wallet ${address ? c.green + shortAddr + c.reset : c.dim + 'None' + c.reset}`);
|
|
364
|
+
console.log(` Setup ${config.setupComplete ? c.green + '✓' + c.reset : c.yellow + '…' + c.reset}\n`);
|
|
365
|
+
console.log(` ${c.dim}Config: ${CONFIG_FILE}${c.reset}\n`);
|
|
415
366
|
}
|
|
416
367
|
// Check balance command
|
|
417
368
|
async function checkBalance() {
|
|
418
369
|
const config = loadConfig();
|
|
419
370
|
if (!config.privateKey) {
|
|
420
|
-
console.log(
|
|
371
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
421
372
|
return;
|
|
422
373
|
}
|
|
423
|
-
console.log(`\n${c.dim}🔍 Querying ${config.network}...${c.reset}\n`);
|
|
424
374
|
try {
|
|
425
375
|
const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
|
|
426
376
|
const address = getAddress(config.privateKey);
|
|
377
|
+
const shortAddr = address.slice(0, 10) + '...' + address.slice(-8);
|
|
427
378
|
// USDC contract
|
|
428
379
|
const usdcAddress = config.network === 'base'
|
|
429
380
|
? '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
|
|
@@ -431,82 +382,76 @@ async function checkBalance() {
|
|
|
431
382
|
const usdcAbi = ['function balanceOf(address) view returns (uint256)'];
|
|
432
383
|
const usdc = new ethers_1.ethers.Contract(usdcAddress, usdcAbi, provider);
|
|
433
384
|
const balance = await usdc.balanceOf(address);
|
|
434
|
-
const formatted = ethers_1.ethers.formatUnits(balance, 6)
|
|
385
|
+
const formatted = parseFloat(ethers_1.ethers.formatUnits(balance, 6)).toLocaleString('en-US', {
|
|
386
|
+
minimumFractionDigits: 2,
|
|
387
|
+
maximumFractionDigits: 2
|
|
388
|
+
});
|
|
435
389
|
// Get ETH balance for gas
|
|
436
390
|
const ethBalance = await provider.getBalance(address);
|
|
437
|
-
const ethFormatted = ethers_1.ethers.formatEther(ethBalance);
|
|
438
|
-
console.log(
|
|
439
|
-
console.log(
|
|
440
|
-
console.log(
|
|
441
|
-
console.log(
|
|
442
|
-
console.log(`${c.cyan}│${c.reset} ETH: ${c.dim}${parseFloat(ethFormatted).toFixed(6).padStart(15)} ETH${c.reset} ${c.cyan}│${c.reset}`);
|
|
443
|
-
console.log(`${c.cyan}└─────────────────────────────────────┘${c.reset}`);
|
|
444
|
-
console.log(`\n${c.dim}Wallet: ${address}${c.reset}`);
|
|
445
|
-
console.log(`${c.dim}Network: ${config.network}${c.reset}\n`);
|
|
391
|
+
const ethFormatted = parseFloat(ethers_1.ethers.formatEther(ethBalance)).toFixed(6);
|
|
392
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Balance\n`);
|
|
393
|
+
console.log(` ${c.bright}$${formatted} USDC${c.reset}`);
|
|
394
|
+
console.log(` ${c.dim}── on ${config.network} (${shortAddr})${c.reset}\n`);
|
|
395
|
+
console.log(` ${c.dim}Gas: ${ethFormatted} ETH${c.reset}\n`);
|
|
446
396
|
}
|
|
447
397
|
catch (e) {
|
|
448
|
-
console.log(
|
|
398
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
449
399
|
}
|
|
450
400
|
}
|
|
451
401
|
// Show receive address
|
|
452
402
|
function showReceive() {
|
|
453
403
|
const config = loadConfig();
|
|
454
404
|
if (!config.privateKey) {
|
|
455
|
-
console.log(
|
|
405
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
456
406
|
return;
|
|
457
407
|
}
|
|
458
408
|
const address = getAddress(config.privateKey);
|
|
459
|
-
console.log(`\n${c.
|
|
460
|
-
console.log(
|
|
461
|
-
console.log(
|
|
462
|
-
console.log(
|
|
463
|
-
console.log(`\n${c.dim}Network: ${config.network}${c.reset}`);
|
|
464
|
-
console.log(`${c.dim}Send USDC on Base to this address.${c.reset}\n`);
|
|
409
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Receive\n`);
|
|
410
|
+
console.log(` ${c.green}${address}${c.reset}\n`);
|
|
411
|
+
console.log(` ${c.dim}Network: ${config.network}${c.reset}`);
|
|
412
|
+
console.log(` ${c.dim}Send USDC on Base to this address${c.reset}\n`);
|
|
465
413
|
}
|
|
466
414
|
// Handle swap command: paylobster swap 0.01 ETH to USDC
|
|
467
415
|
async function handleSwap(args) {
|
|
468
416
|
const config = loadConfig();
|
|
469
417
|
if (!config.privateKey) {
|
|
470
|
-
console.log(
|
|
418
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
471
419
|
return;
|
|
472
420
|
}
|
|
473
421
|
// Parse: swap <amount> <from> to <to>
|
|
474
|
-
// Example: swap 0.01 ETH to USDC
|
|
475
422
|
if (args.length < 4) {
|
|
476
|
-
console.log(`\n${c.bright}Usage:${c.reset} paylobster swap <amount> <from> to <to>\n`);
|
|
477
|
-
console.log(
|
|
478
|
-
console.log(` ${c.
|
|
479
|
-
console.log(` ${c.cyan}paylobster swap 50 USDC to ETH${c.reset}\n`);
|
|
423
|
+
console.log(`\n ${c.bright}Usage:${c.reset} paylobster swap <amount> <from> to <to>\n`);
|
|
424
|
+
console.log(` ${c.dim}paylobster swap 0.01 ETH to USDC${c.reset}`);
|
|
425
|
+
console.log(` ${c.dim}paylobster swap 50 USDC to ETH${c.reset}\n`);
|
|
480
426
|
return;
|
|
481
427
|
}
|
|
482
428
|
const amount = args[0];
|
|
483
429
|
const fromToken = args[1].toUpperCase();
|
|
484
430
|
const toToken = args[3]?.toUpperCase() || args[2]?.toUpperCase();
|
|
485
431
|
if (!amount || !fromToken || !toToken) {
|
|
486
|
-
console.log(
|
|
432
|
+
console.log(`\n ${c.red}✗${c.reset} Invalid format\n`);
|
|
487
433
|
return;
|
|
488
434
|
}
|
|
489
|
-
console.log(`\n${c.bright}🦞 Pay Lobster Swap${c.reset}\n`);
|
|
490
435
|
try {
|
|
491
436
|
// Get quote first
|
|
492
|
-
console.log(
|
|
437
|
+
console.log(`\n ${c.dim}…${c.reset} Getting quote ${amount} ${fromToken} → ${toToken}\n`);
|
|
493
438
|
const quote = await (0, swap_1.getSwapQuote)({
|
|
494
439
|
from: fromToken,
|
|
495
440
|
to: toToken,
|
|
496
441
|
amount: amount,
|
|
497
442
|
});
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
console.log(
|
|
503
|
-
console.log(
|
|
504
|
-
console.log(
|
|
443
|
+
const buyFormatted = parseFloat(quote.buyAmount).toLocaleString('en-US', {
|
|
444
|
+
minimumFractionDigits: 2,
|
|
445
|
+
maximumFractionDigits: 6
|
|
446
|
+
});
|
|
447
|
+
console.log(` Sell ${quote.sellAmount} ${quote.sellToken}`);
|
|
448
|
+
console.log(` Buy ${buyFormatted} ${quote.buyToken}`);
|
|
449
|
+
console.log(` Rate 1 ${quote.sellToken} = ${quote.price} ${quote.buyToken}\n`);
|
|
505
450
|
if (quote.sources.length > 0) {
|
|
506
|
-
console.log(
|
|
451
|
+
console.log(` ${c.dim}Route: ${quote.sources.map(s => s.name).join(' → ')}${c.reset}\n`);
|
|
507
452
|
}
|
|
508
453
|
// Execute swap
|
|
509
|
-
console.log(
|
|
454
|
+
console.log(` ${c.dim}…${c.reset} Executing swap\n`);
|
|
510
455
|
const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
|
|
511
456
|
const signer = new ethers_1.ethers.Wallet(config.privateKey, provider);
|
|
512
457
|
const result = await (0, swap_1.executeSwap)(signer, {
|
|
@@ -514,50 +459,46 @@ async function handleSwap(args) {
|
|
|
514
459
|
to: toToken,
|
|
515
460
|
amount: amount,
|
|
516
461
|
});
|
|
517
|
-
|
|
518
|
-
console.log(` ${c.
|
|
519
|
-
console.log(`
|
|
520
|
-
console.log(
|
|
521
|
-
console.log(`\n ${c.dim}View: https://basescan.org/tx/${result.hash}${c.reset}\n`);
|
|
462
|
+
const txShort = result.hash.slice(0, 10) + '...' + result.hash.slice(-8);
|
|
463
|
+
console.log(` ${c.green}✓${c.reset} Swapped ${result.fromAmount} ${result.fromToken} → ${result.toAmount} ${result.toToken}`);
|
|
464
|
+
console.log(` Tx: ${txShort}`);
|
|
465
|
+
console.log(`\n ${c.dim}https://basescan.org/tx/${result.hash}${c.reset}\n`);
|
|
522
466
|
}
|
|
523
467
|
catch (e) {
|
|
524
|
-
console.log(`\n${c.red}✗${c.reset}
|
|
468
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
525
469
|
}
|
|
526
470
|
}
|
|
527
471
|
// Handle quote command: paylobster quote ETH USDC
|
|
528
472
|
async function handleQuote(args) {
|
|
529
473
|
if (args.length < 2) {
|
|
530
|
-
console.log(`\n${c.bright}Usage:${c.reset} paylobster quote <from> <to> [amount]\n`);
|
|
531
|
-
console.log(
|
|
532
|
-
console.log(` ${c.
|
|
533
|
-
console.log(` ${c.cyan}paylobster quote ETH USDC 0.5${c.reset} ${c.dim}(quote for 0.5 ETH)${c.reset}\n`);
|
|
474
|
+
console.log(`\n ${c.bright}Usage:${c.reset} paylobster quote <from> <to> [amount]\n`);
|
|
475
|
+
console.log(` ${c.dim}paylobster quote ETH USDC${c.reset}`);
|
|
476
|
+
console.log(` ${c.dim}paylobster quote ETH USDC 0.5${c.reset}\n`);
|
|
534
477
|
return;
|
|
535
478
|
}
|
|
536
479
|
const fromToken = args[0].toUpperCase();
|
|
537
480
|
const toToken = args[1].toUpperCase();
|
|
538
481
|
const amount = args[2] || '1';
|
|
539
|
-
console.log(`\n${c.dim}Getting quote for ${amount} ${fromToken} → ${toToken}...${c.reset}\n`);
|
|
540
482
|
try {
|
|
483
|
+
console.log(`\n ${c.dim}…${c.reset} Quote ${amount} ${fromToken} → ${toToken}\n`);
|
|
541
484
|
const quote = await (0, swap_1.getSwapQuote)({
|
|
542
485
|
from: fromToken,
|
|
543
486
|
to: toToken,
|
|
544
487
|
amount: amount,
|
|
545
488
|
});
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
console.log(
|
|
551
|
-
console.log(
|
|
552
|
-
console.log(
|
|
553
|
-
console.log(`${c.cyan}└─────────────────────────────────────┘${c.reset}`);
|
|
489
|
+
const buyFormatted = parseFloat(quote.buyAmount).toLocaleString('en-US', {
|
|
490
|
+
minimumFractionDigits: 2,
|
|
491
|
+
maximumFractionDigits: 6
|
|
492
|
+
});
|
|
493
|
+
console.log(` Sell ${quote.sellAmount} ${quote.sellToken}`);
|
|
494
|
+
console.log(` Buy ${buyFormatted} ${quote.buyToken}`);
|
|
495
|
+
console.log(` Rate 1 ${quote.sellToken} = ${quote.price} ${quote.buyToken}\n`);
|
|
554
496
|
if (quote.sources.length > 0) {
|
|
555
|
-
console.log(
|
|
497
|
+
console.log(` ${c.dim}Route: ${quote.sources.map(s => s.name).join(' + ')}${c.reset}\n`);
|
|
556
498
|
}
|
|
557
|
-
console.log();
|
|
558
499
|
}
|
|
559
500
|
catch (e) {
|
|
560
|
-
console.log(
|
|
501
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
561
502
|
}
|
|
562
503
|
}
|
|
563
504
|
// Show global volume stats
|
|
@@ -566,44 +507,33 @@ function showGlobalStats() {
|
|
|
566
507
|
const today = new Date().toISOString().split('T')[0];
|
|
567
508
|
const todayVolume = globalStats.dailyVolume[today] || '0';
|
|
568
509
|
console.log(`
|
|
569
|
-
${c.
|
|
570
|
-
${c.cyan}│${c.reset} 🦞 ${c.bright}PAY LOBSTER GLOBAL STATS${c.reset} ${c.cyan}│${c.reset}
|
|
571
|
-
${c.cyan}└─────────────────────────────────────────────────┘${c.reset}
|
|
572
|
-
|
|
573
|
-
${c.bright}💰 Total Volume:${c.reset} ${c.green}$${formatNumber(globalStats.totalVolume)} USDC${c.reset}
|
|
574
|
-
${c.bright}📊 Transactions:${c.reset} ${globalStats.totalTransactions.toLocaleString()}
|
|
575
|
-
${c.bright}🔒 Escrow Volume:${c.reset} ${c.green}$${formatNumber(globalStats.totalEscrowVolume)} USDC${c.reset}
|
|
576
|
-
${c.bright}📝 Escrows Created:${c.reset} ${globalStats.totalEscrowsCreated}
|
|
510
|
+
${c.blue}🦞 Pay Lobster${c.reset} — Global Stats
|
|
577
511
|
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
512
|
+
Volume $${formatNumber(globalStats.totalVolume)} USDC
|
|
513
|
+
Txns ${globalStats.totalTransactions.toLocaleString()}
|
|
514
|
+
Escrow $${formatNumber(globalStats.totalEscrowVolume)} USDC
|
|
515
|
+
|
|
516
|
+
Today $${formatNumber(todayVolume)} USDC
|
|
517
|
+
Wallets ${globalStats.trackedWallets.length}
|
|
582
518
|
|
|
583
|
-
${c.dim}
|
|
584
|
-
${c.dim}Stats stored at: ~/.paylobster/stats.json${c.reset}
|
|
519
|
+
${c.dim}Updated: ${new Date(globalStats.lastUpdated).toLocaleString()}${c.reset}
|
|
585
520
|
`);
|
|
586
521
|
}
|
|
587
522
|
// Show leaderboard of top wallets
|
|
588
523
|
function showLeaderboard() {
|
|
589
524
|
const leaderboard = stats_1.stats.getLeaderboard(10);
|
|
590
|
-
console.log(`
|
|
591
|
-
${c.cyan}┌─────────────────────────────────────────────────┐${c.reset}
|
|
592
|
-
${c.cyan}│${c.reset} 🏆 ${c.bright}PAY LOBSTER LEADERBOARD${c.reset} ${c.cyan}│${c.reset}
|
|
593
|
-
${c.cyan}└─────────────────────────────────────────────────┘${c.reset}
|
|
594
|
-
`);
|
|
525
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Leaderboard\n`);
|
|
595
526
|
if (leaderboard.length === 0) {
|
|
596
|
-
console.log(
|
|
597
|
-
console.log(`${c.dim} Start sending USDC to appear here!${c.reset}\n`);
|
|
527
|
+
console.log(` ${c.dim}No transactions yet${c.reset}\n`);
|
|
598
528
|
return;
|
|
599
529
|
}
|
|
600
|
-
console.log(
|
|
601
|
-
console.log(
|
|
530
|
+
console.log(` ${c.dim}Rank Address Volume Txns${c.reset}`);
|
|
531
|
+
console.log(` ${c.dim}──── ──────────────── ───────────── ────${c.reset}`);
|
|
602
532
|
for (const entry of leaderboard) {
|
|
603
533
|
const medal = entry.rank === 1 ? '🥇' : entry.rank === 2 ? '🥈' : entry.rank === 3 ? '🥉' : ' ';
|
|
604
534
|
const addr = entry.address.slice(0, 6) + '...' + entry.address.slice(-4);
|
|
605
|
-
const vol =
|
|
606
|
-
console.log(` ${medal}
|
|
535
|
+
const vol = '$' + formatNumber(entry.totalVolume);
|
|
536
|
+
console.log(` ${medal}${entry.rank.toString().padStart(3)} ${addr.padEnd(17)} ${c.green}${vol.padStart(12)}${c.reset} ${entry.transactions}`);
|
|
607
537
|
}
|
|
608
538
|
console.log();
|
|
609
539
|
}
|
|
@@ -619,58 +549,35 @@ function formatNumber(num) {
|
|
|
619
549
|
async function handleFund(args) {
|
|
620
550
|
const config = loadConfig();
|
|
621
551
|
if (!config.privateKey) {
|
|
622
|
-
console.log(
|
|
552
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
623
553
|
return;
|
|
624
554
|
}
|
|
625
555
|
const address = getAddress(config.privateKey);
|
|
626
556
|
const amount = args[0] ? parseFloat(args[0]) : 0;
|
|
627
557
|
if (!amount || amount < 5) {
|
|
628
|
-
console.log(`
|
|
629
|
-
${c.
|
|
630
|
-
|
|
631
|
-
${c.
|
|
632
|
-
paylobster fund <amount>
|
|
633
|
-
|
|
634
|
-
${c.bright}EXAMPLES${c.reset}
|
|
635
|
-
${c.cyan}paylobster fund 100${c.reset} ${c.dim}Fund wallet with $100 USD${c.reset}
|
|
636
|
-
${c.cyan}paylobster fund 50${c.reset} ${c.dim}Fund wallet with $50 USD${c.reset}
|
|
637
|
-
|
|
638
|
-
${c.bright}PAYMENT METHODS${c.reset}
|
|
639
|
-
• Debit/Credit card
|
|
640
|
-
• Apple Pay (US)
|
|
641
|
-
• Bank transfer
|
|
642
|
-
• Existing Coinbase balance
|
|
643
|
-
|
|
644
|
-
${c.bright}NOTE${c.reset}
|
|
645
|
-
Minimum amount: ${c.yellow}$5 USD${c.reset}
|
|
646
|
-
Fees: ~1.5% via Coinbase Onramp
|
|
647
|
-
`);
|
|
558
|
+
console.log(`\n ${c.bright}Usage:${c.reset} paylobster fund <amount>\n`);
|
|
559
|
+
console.log(` ${c.dim}paylobster fund 100${c.reset}`);
|
|
560
|
+
console.log(` ${c.dim}paylobster fund 50${c.reset}\n`);
|
|
561
|
+
console.log(` ${c.dim}Min: $5 USD • Fee: ~1.5%${c.reset}\n`);
|
|
648
562
|
return;
|
|
649
563
|
}
|
|
650
|
-
console.log(`\n${c.dim}🦞 Generating Coinbase Onramp URL...${c.reset}\n`);
|
|
651
564
|
try {
|
|
652
|
-
// Use simple URL (no CDP credentials needed)
|
|
653
565
|
const url = onramp_1.onramp.getSimpleUrl({
|
|
654
566
|
address,
|
|
655
567
|
amount,
|
|
656
568
|
asset: 'USDC'
|
|
657
569
|
});
|
|
658
|
-
|
|
659
|
-
console.log(
|
|
660
|
-
console.log(
|
|
661
|
-
console.log(
|
|
662
|
-
console.log(
|
|
663
|
-
console.log(
|
|
664
|
-
console.log(
|
|
665
|
-
console.log(
|
|
666
|
-
console.log();
|
|
667
|
-
console.log(`${c.green}${url}${c.reset}`);
|
|
668
|
-
console.log();
|
|
669
|
-
console.log(`${c.dim}Accepts: Cards, Apple Pay, Bank Transfer, Coinbase balance${c.reset}`);
|
|
670
|
-
console.log(`${c.dim}Fees: ~1.5% via Coinbase Onramp${c.reset}\n`);
|
|
570
|
+
const shortAddr = address.slice(0, 10) + '...' + address.slice(-8);
|
|
571
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Fund Wallet\n`);
|
|
572
|
+
console.log(` Amount $${amount.toFixed(2)} USD → USDC`);
|
|
573
|
+
console.log(` To ${c.dim}${shortAddr}${c.reset}\n`);
|
|
574
|
+
console.log(` ${c.bright}Complete purchase:${c.reset}\n`);
|
|
575
|
+
console.log(` ${c.green}${url}${c.reset}\n`);
|
|
576
|
+
console.log(` ${c.dim}Cards, Apple Pay, Bank, Coinbase${c.reset}`);
|
|
577
|
+
console.log(` ${c.dim}Fee: ~1.5%${c.reset}\n`);
|
|
671
578
|
}
|
|
672
579
|
catch (e) {
|
|
673
|
-
console.log(
|
|
580
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
674
581
|
}
|
|
675
582
|
}
|
|
676
583
|
// ═══════════════════════════════════════════════════════════
|
|
@@ -683,82 +590,80 @@ async function handleScore(args) {
|
|
|
683
590
|
const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
|
|
684
591
|
const creditContract = new ethers_1.ethers.Contract(V3_CONTRACTS.credit, V3_ABIS.credit, provider);
|
|
685
592
|
let address;
|
|
593
|
+
let shortAddr;
|
|
686
594
|
if (args.length > 0) {
|
|
687
595
|
address = args[0];
|
|
688
|
-
|
|
596
|
+
shortAddr = address.slice(0, 6) + '...' + address.slice(-4);
|
|
689
597
|
}
|
|
690
598
|
else {
|
|
691
599
|
if (!config.privateKey) {
|
|
692
|
-
console.log(
|
|
600
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
693
601
|
return;
|
|
694
602
|
}
|
|
695
603
|
address = getAddress(config.privateKey);
|
|
696
|
-
|
|
604
|
+
shortAddr = address.slice(0, 6) + '...' + address.slice(-4);
|
|
697
605
|
}
|
|
698
606
|
const [score, tier] = await creditContract.getCreditScore(address);
|
|
699
607
|
const scoreNum = Number(score);
|
|
700
608
|
// Calculate stars
|
|
701
609
|
const stars = scoreNum >= 850 ? 5 : scoreNum >= 750 ? 4 : scoreNum >= 650 ? 3 : scoreNum >= 550 ? 2 : 1;
|
|
702
610
|
const starStr = '⭐'.repeat(stars);
|
|
703
|
-
console.log(
|
|
704
|
-
console.log(
|
|
705
|
-
console.log(
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
console.log(`\n${c.dim}
|
|
611
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Credit Score\n`);
|
|
612
|
+
console.log(` Score ${c.bright}${scoreNum} / 850${c.reset} ${starStr}`);
|
|
613
|
+
console.log(` Tier ${tier}`);
|
|
614
|
+
if (args.length > 0) {
|
|
615
|
+
console.log(` Address ${c.dim}${shortAddr}${c.reset}\n`);
|
|
616
|
+
}
|
|
617
|
+
else {
|
|
618
|
+
console.log(`\n ${c.dim}See ${c.blue}paylobster credit${c.reset}${c.dim} for limits${c.reset}\n`);
|
|
711
619
|
}
|
|
712
620
|
}
|
|
713
621
|
catch (e) {
|
|
714
|
-
console.log(
|
|
622
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
715
623
|
}
|
|
716
624
|
}
|
|
717
625
|
// Handle credit command: paylobster credit
|
|
718
626
|
async function handleCredit() {
|
|
719
627
|
const config = loadConfig();
|
|
720
628
|
if (!config.privateKey) {
|
|
721
|
-
console.log(
|
|
629
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
722
630
|
return;
|
|
723
631
|
}
|
|
724
632
|
try {
|
|
725
633
|
const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
|
|
726
634
|
const creditContract = new ethers_1.ethers.Contract(V3_CONTRACTS.credit, V3_ABIS.credit, provider);
|
|
727
635
|
const address = getAddress(config.privateKey);
|
|
728
|
-
console.log(`\n${c.dim}Fetching credit status...${c.reset}\n`);
|
|
729
636
|
const [limit, available, inUse] = await creditContract.getCreditStatus(address);
|
|
730
637
|
const [score, tier] = await creditContract.getCreditScore(address);
|
|
731
|
-
const limitNum =
|
|
732
|
-
const availableNum =
|
|
733
|
-
const inUseNum =
|
|
734
|
-
const utilization = limitNum > 0 ? ((inUseNum / limitNum) * 100).toFixed(
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
console.log(
|
|
739
|
-
console.log(
|
|
740
|
-
console.log(
|
|
741
|
-
console.log(
|
|
742
|
-
console.log(
|
|
743
|
-
console.log(
|
|
744
|
-
console.log();
|
|
638
|
+
const limitNum = parseFloat(ethers_1.ethers.formatUnits(limit, 6));
|
|
639
|
+
const availableNum = parseFloat(ethers_1.ethers.formatUnits(available, 6));
|
|
640
|
+
const inUseNum = parseFloat(ethers_1.ethers.formatUnits(inUse, 6));
|
|
641
|
+
const utilization = limitNum > 0 ? ((inUseNum / limitNum) * 100).toFixed(0) : '0';
|
|
642
|
+
const limitFormatted = limitNum.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
643
|
+
const availFormatted = availableNum.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
644
|
+
const inUseFormatted = inUseNum.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
645
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Credit\n`);
|
|
646
|
+
console.log(` Tier ${tier}`);
|
|
647
|
+
console.log(` Limit $${limitFormatted}`);
|
|
648
|
+
console.log(` Available ${c.green}$${availFormatted}${c.reset}`);
|
|
649
|
+
console.log(` In Use $${inUseFormatted}`);
|
|
650
|
+
console.log(` Usage ${utilization}%\n`);
|
|
745
651
|
}
|
|
746
652
|
catch (e) {
|
|
747
|
-
console.log(
|
|
653
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
748
654
|
}
|
|
749
655
|
}
|
|
750
656
|
// Handle tier command: paylobster tier
|
|
751
657
|
async function handleTier() {
|
|
752
658
|
const config = loadConfig();
|
|
753
659
|
if (!config.privateKey) {
|
|
754
|
-
console.log(
|
|
660
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
755
661
|
return;
|
|
756
662
|
}
|
|
757
663
|
try {
|
|
758
664
|
const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
|
|
759
665
|
const creditContract = new ethers_1.ethers.Contract(V3_CONTRACTS.credit, V3_ABIS.credit, provider);
|
|
760
666
|
const address = getAddress(config.privateKey);
|
|
761
|
-
console.log(`\n${c.dim}Fetching tier status...${c.reset}\n`);
|
|
762
667
|
const [tier, score] = await creditContract.getTier(address);
|
|
763
668
|
const scoreNum = Number(score);
|
|
764
669
|
// Tier thresholds
|
|
@@ -773,70 +678,65 @@ async function handleTier() {
|
|
|
773
678
|
const currentTier = tiers[currentTierIndex];
|
|
774
679
|
const nextTier = currentTierIndex < tiers.length - 1 ? tiers[currentTierIndex + 1] : null;
|
|
775
680
|
const starStr = '⭐'.repeat(currentTier.stars);
|
|
776
|
-
console.log(
|
|
777
|
-
console.log(
|
|
778
|
-
console.log(
|
|
779
|
-
console.log(`${c.cyan}│${c.reset} Current: ${c.bright}${tier}${c.reset} ${starStr}${''.padStart(15 - tier.length - starStr.length)}${c.cyan}│${c.reset}`);
|
|
780
|
-
console.log(`${c.cyan}│${c.reset} Score: ${c.green}${scoreNum} / 850${c.reset}${''.padStart(15 - String(scoreNum).length)}${c.cyan}│${c.reset}`);
|
|
781
|
-
console.log(`${c.cyan}└─────────────────────────────────────┘${c.reset}`);
|
|
681
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Tier\n`);
|
|
682
|
+
console.log(` Current ${c.bright}${tier}${c.reset} ${starStr}`);
|
|
683
|
+
console.log(` Score ${scoreNum} / 850\n`);
|
|
782
684
|
if (nextTier) {
|
|
783
685
|
const needed = nextTier.min - scoreNum;
|
|
784
686
|
const progress = ((scoreNum - currentTier.min) / (nextTier.min - currentTier.min)) * 100;
|
|
785
687
|
const bars = Math.floor(progress / 5);
|
|
786
688
|
const progressBar = '█'.repeat(bars) + '░'.repeat(20 - bars);
|
|
787
|
-
console.log(
|
|
788
|
-
console.log(`[${c.green}${progressBar}${c.reset}] ${
|
|
789
|
-
console.log(
|
|
689
|
+
console.log(` ${c.dim}Progress to ${nextTier.name}${c.reset}`);
|
|
690
|
+
console.log(` [${c.green}${progressBar}${c.reset}] ${progress.toFixed(0)}%`);
|
|
691
|
+
console.log(` ${c.dim}Need: +${needed} points${c.reset}\n`);
|
|
790
692
|
}
|
|
791
693
|
else {
|
|
792
|
-
console.log(
|
|
694
|
+
console.log(` ${c.green}✓${c.reset} Highest tier!\n`);
|
|
793
695
|
}
|
|
794
696
|
}
|
|
795
697
|
catch (e) {
|
|
796
|
-
console.log(
|
|
698
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
797
699
|
}
|
|
798
700
|
}
|
|
799
701
|
// Handle credit-history command: paylobster credit-history
|
|
800
702
|
async function handleCreditHistory() {
|
|
801
703
|
const config = loadConfig();
|
|
802
704
|
if (!config.privateKey) {
|
|
803
|
-
console.log(
|
|
705
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
804
706
|
return;
|
|
805
707
|
}
|
|
806
708
|
try {
|
|
807
709
|
const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
|
|
808
710
|
const creditContract = new ethers_1.ethers.Contract(V3_CONTRACTS.credit, V3_ABIS.credit, provider);
|
|
809
711
|
const address = getAddress(config.privateKey);
|
|
810
|
-
console.log(`\n${c.dim}Fetching credit history...${c.reset}\n`);
|
|
811
712
|
const history = await creditContract.getCreditHistory(address);
|
|
812
|
-
const borrowed =
|
|
813
|
-
const repaid =
|
|
814
|
-
const active =
|
|
713
|
+
const borrowed = parseFloat(ethers_1.ethers.formatUnits(history.borrowed, 6));
|
|
714
|
+
const repaid = parseFloat(ethers_1.ethers.formatUnits(history.repaid, 6));
|
|
715
|
+
const active = parseFloat(ethers_1.ethers.formatUnits(history.active, 6));
|
|
815
716
|
const repaymentRate = Number(history.repaymentRate) / 100;
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
console.log(
|
|
820
|
-
console.log(
|
|
821
|
-
console.log(
|
|
822
|
-
console.log(
|
|
823
|
-
console.log(
|
|
824
|
-
console.log();
|
|
717
|
+
const borrowedFmt = borrowed.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
718
|
+
const repaidFmt = repaid.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
719
|
+
const activeFmt = active.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
720
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Credit History\n`);
|
|
721
|
+
console.log(` Borrowed $${borrowedFmt}`);
|
|
722
|
+
console.log(` Repaid $${repaidFmt}`);
|
|
723
|
+
console.log(` Active $${activeFmt}`);
|
|
724
|
+
console.log(` Rate ${c.green}${repaymentRate.toFixed(1)}%${c.reset}\n`);
|
|
825
725
|
}
|
|
826
726
|
catch (e) {
|
|
827
|
-
console.log(
|
|
727
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
828
728
|
}
|
|
829
729
|
}
|
|
830
730
|
// Handle repay command: paylobster repay <loanId>
|
|
831
731
|
async function handleRepay(args) {
|
|
832
732
|
const config = loadConfig();
|
|
833
733
|
if (!config.privateKey) {
|
|
834
|
-
console.log(
|
|
734
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
835
735
|
return;
|
|
836
736
|
}
|
|
837
737
|
if (args.length === 0) {
|
|
838
|
-
console.log(`\n${c.bright}Usage:${c.reset} paylobster repay <loanId>\n`);
|
|
839
|
-
console.log(
|
|
738
|
+
console.log(`\n ${c.bright}Usage:${c.reset} paylobster repay <loanId>\n`);
|
|
739
|
+
console.log(` ${c.dim}paylobster repay 47${c.reset}\n`);
|
|
840
740
|
return;
|
|
841
741
|
}
|
|
842
742
|
const loanId = args[0];
|
|
@@ -844,138 +744,130 @@ async function handleRepay(args) {
|
|
|
844
744
|
const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
|
|
845
745
|
const signer = new ethers_1.ethers.Wallet(config.privateKey, provider);
|
|
846
746
|
const escrowContract = new ethers_1.ethers.Contract(V3_CONTRACTS.escrow, V3_ABIS.escrow, signer);
|
|
847
|
-
console.log(`\n${c.dim}Fetching loan details...${c.reset}\n`);
|
|
848
747
|
const loan = await escrowContract.getLoanDetails(loanId);
|
|
849
|
-
const remaining =
|
|
748
|
+
const remaining = parseFloat(ethers_1.ethers.formatUnits(loan.remaining, 6));
|
|
850
749
|
if (remaining === 0) {
|
|
851
|
-
console.log(
|
|
750
|
+
console.log(`\n ${c.green}✓${c.reset} Loan #${loanId} already repaid\n`);
|
|
852
751
|
return;
|
|
853
752
|
}
|
|
854
|
-
|
|
855
|
-
console.log(
|
|
856
|
-
console.log(
|
|
857
|
-
console.log(
|
|
858
|
-
console.log(`${c.cyan}└─────────────────────────────────────┘${c.reset}`);
|
|
859
|
-
console.log();
|
|
860
|
-
console.log(`${c.dim}Sending repayment transaction...${c.reset}`);
|
|
753
|
+
const remainingFmt = remaining.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
754
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Repay Loan #${loanId}\n`);
|
|
755
|
+
console.log(` Amount Due $${remainingFmt}\n`);
|
|
756
|
+
console.log(` ${c.dim}…${c.reset} Sending repayment`);
|
|
861
757
|
const tx = await escrowContract.repayLoan(loanId, {
|
|
862
758
|
value: ethers_1.ethers.parseUnits(remaining.toString(), 6)
|
|
863
759
|
});
|
|
864
|
-
console.log(
|
|
760
|
+
console.log(` ${c.dim}…${c.reset} Confirming`);
|
|
865
761
|
await tx.wait();
|
|
866
|
-
|
|
867
|
-
console.log(
|
|
868
|
-
console.log(`
|
|
869
|
-
console.log(`\n
|
|
762
|
+
const txShort = tx.hash.slice(0, 10) + '...' + tx.hash.slice(-8);
|
|
763
|
+
console.log(`\n ${c.green}✓${c.reset} Repaid $${remainingFmt}`);
|
|
764
|
+
console.log(` Tx: ${txShort}`);
|
|
765
|
+
console.log(`\n ${c.dim}https://basescan.org/tx/${tx.hash}${c.reset}\n`);
|
|
870
766
|
}
|
|
871
767
|
catch (e) {
|
|
872
|
-
console.log(
|
|
768
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
873
769
|
}
|
|
874
770
|
}
|
|
875
771
|
// Handle loans command: paylobster loans
|
|
876
772
|
async function handleLoans() {
|
|
877
773
|
const config = loadConfig();
|
|
878
774
|
if (!config.privateKey) {
|
|
879
|
-
console.log(
|
|
775
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
880
776
|
return;
|
|
881
777
|
}
|
|
882
778
|
try {
|
|
883
779
|
const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
|
|
884
780
|
const escrowContract = new ethers_1.ethers.Contract(V3_CONTRACTS.escrow, V3_ABIS.escrow, provider);
|
|
885
781
|
const address = getAddress(config.privateKey);
|
|
886
|
-
console.log(`\n${c.dim}Fetching active loans...${c.reset}\n`);
|
|
887
782
|
const loans = await escrowContract.getActiveLoans(address);
|
|
888
783
|
if (loans.length === 0) {
|
|
889
|
-
console.log(
|
|
890
|
-
console.log(`${c.dim}Create a credit-backed escrow to borrow against your reputation!${c.reset}\n`);
|
|
784
|
+
console.log(`\n ${c.dim}No active loans${c.reset}\n`);
|
|
891
785
|
return;
|
|
892
786
|
}
|
|
893
|
-
console.log(
|
|
894
|
-
console.log(
|
|
895
|
-
console.log(
|
|
896
|
-
console.log(`${c.dim} ID Amount Due Date Status${c.reset}`);
|
|
897
|
-
console.log(`${c.dim} ────── ──────────── ───────────── ───────${c.reset}`);
|
|
787
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Active Loans\n`);
|
|
788
|
+
console.log(` ${c.dim}ID Amount Due Status${c.reset}`);
|
|
789
|
+
console.log(` ${c.dim}────── ──────────── ──────── ───────${c.reset}`);
|
|
898
790
|
let totalDue = 0;
|
|
899
791
|
const now = Math.floor(Date.now() / 1000);
|
|
900
792
|
for (const loan of loans) {
|
|
901
793
|
const id = Number(loan.id);
|
|
902
|
-
const remaining =
|
|
794
|
+
const remaining = parseFloat(ethers_1.ethers.formatUnits(loan.remaining, 6));
|
|
903
795
|
const dueDate = Number(loan.dueDate);
|
|
904
796
|
const daysUntil = Math.floor((dueDate - now) / 86400);
|
|
905
797
|
totalDue += remaining;
|
|
906
|
-
|
|
798
|
+
const remainingFmt = remaining.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
799
|
+
let status = '✓';
|
|
907
800
|
let statusColor = c.green;
|
|
801
|
+
let dueText = `${daysUntil}d`;
|
|
908
802
|
if (daysUntil < 0) {
|
|
909
|
-
status = '✗
|
|
803
|
+
status = '✗';
|
|
910
804
|
statusColor = c.red;
|
|
805
|
+
dueText = 'overdue';
|
|
911
806
|
}
|
|
912
807
|
else if (daysUntil < 3) {
|
|
913
|
-
status = '⚠
|
|
808
|
+
status = '⚠';
|
|
914
809
|
statusColor = c.yellow;
|
|
915
810
|
}
|
|
916
|
-
console.log(` #${id.toString().padEnd(
|
|
811
|
+
console.log(` #${id.toString().padEnd(7)}$${remainingFmt.padStart(12)} ${dueText.padEnd(8)} ${statusColor}${status}${c.reset}`);
|
|
917
812
|
}
|
|
918
|
-
|
|
919
|
-
console.log(` ${c.
|
|
813
|
+
const totalFmt = totalDue.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
814
|
+
console.log(` ${c.dim}────────────────────────────────────────────${c.reset}`);
|
|
815
|
+
console.log(` Total: $${totalFmt}\n`);
|
|
920
816
|
}
|
|
921
817
|
catch (e) {
|
|
922
|
-
console.log(
|
|
818
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
923
819
|
}
|
|
924
820
|
}
|
|
925
821
|
// Handle loan details command: paylobster loan <loanId>
|
|
926
822
|
async function handleLoanDetails(args) {
|
|
927
823
|
const config = loadConfig();
|
|
928
824
|
if (args.length === 0) {
|
|
929
|
-
console.log(`\n${c.bright}Usage:${c.reset} paylobster loan <loanId>\n`);
|
|
930
|
-
console.log(
|
|
825
|
+
console.log(`\n ${c.bright}Usage:${c.reset} paylobster loan <loanId>\n`);
|
|
826
|
+
console.log(` ${c.dim}paylobster loan 47${c.reset}\n`);
|
|
931
827
|
return;
|
|
932
828
|
}
|
|
933
829
|
const loanId = args[0];
|
|
934
830
|
try {
|
|
935
831
|
const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
|
|
936
832
|
const escrowContract = new ethers_1.ethers.Contract(V3_CONTRACTS.escrow, V3_ABIS.escrow, provider);
|
|
937
|
-
console.log(`\n${c.dim}Fetching loan details...${c.reset}\n`);
|
|
938
833
|
const loan = await escrowContract.getLoanDetails(loanId);
|
|
939
|
-
const original =
|
|
940
|
-
const remaining =
|
|
941
|
-
const paid =
|
|
834
|
+
const original = parseFloat(ethers_1.ethers.formatUnits(loan.original, 6));
|
|
835
|
+
const remaining = parseFloat(ethers_1.ethers.formatUnits(loan.remaining, 6));
|
|
836
|
+
const paid = parseFloat(ethers_1.ethers.formatUnits(loan.paid, 6));
|
|
942
837
|
const dueDate = new Date(Number(loan.dueDate) * 1000);
|
|
943
838
|
const now = new Date();
|
|
944
839
|
const daysUntil = Math.floor((dueDate.getTime() - now.getTime()) / 86400000);
|
|
945
|
-
|
|
840
|
+
const originalFmt = original.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
841
|
+
const remainingFmt = remaining.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
842
|
+
const paidFmt = paid.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
843
|
+
let status = '✓ On track';
|
|
946
844
|
let statusColor = c.green;
|
|
947
845
|
if (remaining === 0) {
|
|
948
|
-
status = '✓ Paid in
|
|
949
|
-
statusColor = c.green;
|
|
846
|
+
status = '✓ Paid in full';
|
|
950
847
|
}
|
|
951
848
|
else if (daysUntil < 0) {
|
|
952
849
|
status = '✗ Overdue';
|
|
953
850
|
statusColor = c.red;
|
|
954
851
|
}
|
|
955
852
|
else if (daysUntil < 3) {
|
|
956
|
-
status = '⚠
|
|
853
|
+
status = '⚠ Due soon';
|
|
957
854
|
statusColor = c.yellow;
|
|
958
855
|
}
|
|
959
|
-
|
|
960
|
-
console.log(
|
|
961
|
-
console.log(
|
|
962
|
-
console.log(
|
|
963
|
-
console.log(
|
|
964
|
-
console.log(
|
|
965
|
-
console.log(
|
|
966
|
-
console.log(
|
|
967
|
-
console.log(
|
|
968
|
-
console.log(`${c.cyan}│${c.reset} Seller: ${loan.seller.slice(0, 10)}... ${c.cyan}│${c.reset}`);
|
|
969
|
-
console.log(`${c.cyan}├─────────────────────────────────────┤${c.reset}`);
|
|
970
|
-
console.log(`${c.cyan}│${c.reset} Status: ${statusColor}${status}${c.reset}${''.padStart(20 - status.length)}${c.cyan}│${c.reset}`);
|
|
971
|
-
console.log(`${c.cyan}└─────────────────────────────────────┘${c.reset}`);
|
|
972
|
-
console.log();
|
|
856
|
+
const seller = loan.seller.slice(0, 10) + '...' + loan.seller.slice(-8);
|
|
857
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Loan #${loanId}\n`);
|
|
858
|
+
console.log(` Original $${originalFmt}`);
|
|
859
|
+
console.log(` Remaining $${remainingFmt}`);
|
|
860
|
+
console.log(` Paid $${paidFmt}`);
|
|
861
|
+
console.log(``);
|
|
862
|
+
console.log(` Due ${dueDate.toLocaleDateString()} (${daysUntil}d)`);
|
|
863
|
+
console.log(` Seller ${c.dim}${seller}${c.reset}`);
|
|
864
|
+
console.log(` Status ${statusColor}${status}${c.reset}\n`);
|
|
973
865
|
if (remaining > 0) {
|
|
974
|
-
console.log(
|
|
866
|
+
console.log(` ${c.dim}Repay: ${c.blue}paylobster repay ${loanId}${c.reset}\n`);
|
|
975
867
|
}
|
|
976
868
|
}
|
|
977
869
|
catch (e) {
|
|
978
|
-
console.log(
|
|
870
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
979
871
|
}
|
|
980
872
|
}
|
|
981
873
|
// Handle reputation command: paylobster reputation [address]
|
|
@@ -985,17 +877,18 @@ async function handleReputation(args) {
|
|
|
985
877
|
const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
|
|
986
878
|
const reputationContract = new ethers_1.ethers.Contract(V3_CONTRACTS.reputation, V3_ABIS.reputation, provider);
|
|
987
879
|
let address;
|
|
880
|
+
let shortAddr;
|
|
988
881
|
if (args.length > 0) {
|
|
989
882
|
address = args[0];
|
|
990
|
-
|
|
883
|
+
shortAddr = address.slice(0, 6) + '...' + address.slice(-4);
|
|
991
884
|
}
|
|
992
885
|
else {
|
|
993
886
|
if (!config.privateKey) {
|
|
994
|
-
console.log(
|
|
887
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
995
888
|
return;
|
|
996
889
|
}
|
|
997
890
|
address = getAddress(config.privateKey);
|
|
998
|
-
|
|
891
|
+
shortAddr = address.slice(0, 6) + '...' + address.slice(-4);
|
|
999
892
|
}
|
|
1000
893
|
const rep = await reputationContract.getReputation(address);
|
|
1001
894
|
const overall = Number(rep.overall);
|
|
@@ -1006,61 +899,55 @@ async function handleReputation(args) {
|
|
|
1006
899
|
const totalRatings = Number(rep.totalRatings);
|
|
1007
900
|
const stars = overall >= 90 ? 5 : overall >= 80 ? 4 : overall >= 70 ? 3 : overall >= 60 ? 2 : 1;
|
|
1008
901
|
const starStr = '⭐'.repeat(stars);
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
};
|
|
1013
|
-
console.log(
|
|
1014
|
-
console.log(
|
|
1015
|
-
console.log(
|
|
1016
|
-
console.log(
|
|
1017
|
-
console.log(
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
console.log(`${c.cyan}└─────────────────────────────────────────────────┘${c.reset}`);
|
|
1025
|
-
console.log();
|
|
902
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Reputation\n`);
|
|
903
|
+
console.log(` Overall ${c.bright}${overall}/100${c.reset} ${starStr}`);
|
|
904
|
+
console.log(``);
|
|
905
|
+
console.log(` Delivery ${delivery.toString().padStart(3)}/100`);
|
|
906
|
+
console.log(` Communication ${communication.toString().padStart(3)}/100`);
|
|
907
|
+
console.log(` Quality ${quality.toString().padStart(3)}/100`);
|
|
908
|
+
console.log(` Reliability ${reliability.toString().padStart(3)}/100`);
|
|
909
|
+
console.log(``);
|
|
910
|
+
console.log(` Ratings ${totalRatings}`);
|
|
911
|
+
if (args.length > 0) {
|
|
912
|
+
console.log(` Address ${c.dim}${shortAddr}${c.reset}\n`);
|
|
913
|
+
}
|
|
914
|
+
else {
|
|
915
|
+
console.log();
|
|
916
|
+
}
|
|
1026
917
|
}
|
|
1027
918
|
catch (e) {
|
|
1028
|
-
console.log(
|
|
919
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
1029
920
|
}
|
|
1030
921
|
}
|
|
1031
922
|
// Handle trust-history command: paylobster trust-history
|
|
1032
923
|
async function handleTrustHistory() {
|
|
1033
924
|
const config = loadConfig();
|
|
1034
925
|
if (!config.privateKey) {
|
|
1035
|
-
console.log(
|
|
926
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
1036
927
|
return;
|
|
1037
928
|
}
|
|
1038
929
|
try {
|
|
1039
930
|
const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
|
|
1040
931
|
const reputationContract = new ethers_1.ethers.Contract(V3_CONTRACTS.reputation, V3_ABIS.reputation, provider);
|
|
1041
932
|
const address = getAddress(config.privateKey);
|
|
1042
|
-
console.log(`\n${c.dim}Fetching trust history (last 90 days)...${c.reset}\n`);
|
|
1043
933
|
const history = await reputationContract.getTrustHistory(address, 90);
|
|
1044
934
|
if (history.length === 0) {
|
|
1045
|
-
console.log(
|
|
1046
|
-
console.log(`${c.dim}Complete transactions to build your reputation!${c.reset}\n`);
|
|
935
|
+
console.log(`\n ${c.dim}No trust history${c.reset}\n`);
|
|
1047
936
|
return;
|
|
1048
937
|
}
|
|
1049
|
-
console.log(
|
|
1050
|
-
console.log(
|
|
1051
|
-
console.log(
|
|
1052
|
-
console.log(`${c.dim} Date Score Event${c.reset}`);
|
|
1053
|
-
console.log(`${c.dim} ───────────── ────── ──────────────────${c.reset}`);
|
|
938
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Trust History\n`);
|
|
939
|
+
console.log(` ${c.dim}Date Score Event${c.reset}`);
|
|
940
|
+
console.log(` ${c.dim}──────────── ────── ──────────────────${c.reset}`);
|
|
1054
941
|
for (const entry of history.slice(0, 10)) {
|
|
1055
942
|
const date = new Date(Number(entry.timestamp) * 1000).toLocaleDateString();
|
|
1056
943
|
const score = Number(entry.score);
|
|
1057
944
|
const event = entry.event;
|
|
1058
|
-
console.log(` ${date.padEnd(
|
|
945
|
+
console.log(` ${date.padEnd(12)} ${score.toString().padStart(3)}/100 ${c.dim}${event}${c.reset}`);
|
|
1059
946
|
}
|
|
1060
947
|
console.log();
|
|
1061
948
|
}
|
|
1062
949
|
catch (e) {
|
|
1063
|
-
console.log(
|
|
950
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
1064
951
|
}
|
|
1065
952
|
}
|
|
1066
953
|
// Handle identity command: paylobster identity [address]
|
|
@@ -1070,17 +957,18 @@ async function handleIdentity(args) {
|
|
|
1070
957
|
const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
|
|
1071
958
|
const identityContract = new ethers_1.ethers.Contract(V3_CONTRACTS.identity, V3_ABIS.identity, provider);
|
|
1072
959
|
let address;
|
|
960
|
+
let shortAddr;
|
|
1073
961
|
if (args.length > 0) {
|
|
1074
962
|
address = args[0];
|
|
1075
|
-
|
|
963
|
+
shortAddr = address.slice(0, 10) + '...' + address.slice(-8);
|
|
1076
964
|
}
|
|
1077
965
|
else {
|
|
1078
966
|
if (!config.privateKey) {
|
|
1079
|
-
console.log(
|
|
967
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
1080
968
|
return;
|
|
1081
969
|
}
|
|
1082
970
|
address = getAddress(config.privateKey);
|
|
1083
|
-
|
|
971
|
+
shortAddr = address.slice(0, 10) + '...' + address.slice(-8);
|
|
1084
972
|
}
|
|
1085
973
|
const identity = await identityContract.getIdentity(address);
|
|
1086
974
|
const tokenId = Number(identity.tokenId);
|
|
@@ -1088,23 +976,22 @@ async function handleIdentity(args) {
|
|
|
1088
976
|
const registered = new Date(Number(identity.registered) * 1000);
|
|
1089
977
|
const capabilities = identity.capabilities;
|
|
1090
978
|
const daysAgo = Math.floor((Date.now() - registered.getTime()) / 86400000);
|
|
1091
|
-
console.log(
|
|
1092
|
-
console.log(
|
|
1093
|
-
console.log(
|
|
1094
|
-
console.log(
|
|
1095
|
-
console.log(
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
979
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Identity\n`);
|
|
980
|
+
console.log(` Token ID #${tokenId}`);
|
|
981
|
+
console.log(` Name ${c.bright}${name}${c.reset}`);
|
|
982
|
+
console.log(` Address ${c.dim}${shortAddr}${c.reset}`);
|
|
983
|
+
console.log(` Registered ${daysAgo}d ago`);
|
|
984
|
+
if (capabilities.length > 0) {
|
|
985
|
+
console.log(``);
|
|
986
|
+
console.log(` Capabilities`);
|
|
987
|
+
for (const cap of capabilities) {
|
|
988
|
+
console.log(` • ${cap}`);
|
|
989
|
+
}
|
|
1102
990
|
}
|
|
1103
|
-
console.log(`${c.cyan}└─────────────────────────────────────────────────┘${c.reset}`);
|
|
1104
991
|
console.log();
|
|
1105
992
|
}
|
|
1106
993
|
catch (e) {
|
|
1107
|
-
console.log(
|
|
994
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
1108
995
|
}
|
|
1109
996
|
}
|
|
1110
997
|
// Handle agents command: paylobster agents
|
|
@@ -1112,18 +999,14 @@ async function handleAgents(args) {
|
|
|
1112
999
|
try {
|
|
1113
1000
|
const provider = new ethers_1.ethers.JsonRpcProvider('https://mainnet.base.org');
|
|
1114
1001
|
const identityContract = new ethers_1.ethers.Contract(V3_CONTRACTS.identity, V3_ABIS.identity, provider);
|
|
1115
|
-
console.log(`\n${c.dim}Fetching registered agents...${c.reset}\n`);
|
|
1116
1002
|
const agents = await identityContract.getAllAgents(0, 10);
|
|
1117
1003
|
if (agents.length === 0) {
|
|
1118
|
-
console.log(
|
|
1119
|
-
console.log(`${c.dim}Be the first: ${c.cyan}paylobster register${c.reset}\n`);
|
|
1004
|
+
console.log(`\n ${c.dim}No agents registered${c.reset}\n`);
|
|
1120
1005
|
return;
|
|
1121
1006
|
}
|
|
1122
|
-
console.log(
|
|
1123
|
-
console.log(
|
|
1124
|
-
console.log(
|
|
1125
|
-
console.log(`${c.dim} Name Score Address${c.reset}`);
|
|
1126
|
-
console.log(`${c.dim} ────────────────────── ─────── ──────────────${c.reset}`);
|
|
1007
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Agents\n`);
|
|
1008
|
+
console.log(` ${c.dim}Name Score Address${c.reset}`);
|
|
1009
|
+
console.log(` ${c.dim}────────────────────── ─────── ──────────────${c.reset}`);
|
|
1127
1010
|
for (const agent of agents) {
|
|
1128
1011
|
const name = agent.name.padEnd(22);
|
|
1129
1012
|
const score = `${agent.score}/100`.padEnd(7);
|
|
@@ -1133,37 +1016,32 @@ async function handleAgents(args) {
|
|
|
1133
1016
|
console.log();
|
|
1134
1017
|
}
|
|
1135
1018
|
catch (e) {
|
|
1136
|
-
console.log(
|
|
1019
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
1137
1020
|
}
|
|
1138
1021
|
}
|
|
1139
1022
|
// Handle trust-gate status command
|
|
1140
1023
|
async function handleTrustGateStatus() {
|
|
1141
1024
|
const config = (0, autonomous_1.loadConfig)();
|
|
1142
1025
|
const tg = config.trustGate;
|
|
1143
|
-
console.log(`\n${c.
|
|
1144
|
-
console.log(
|
|
1145
|
-
console.log(
|
|
1146
|
-
console.log(
|
|
1147
|
-
console.log(
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
console.log(`${c.cyan}│${c.reset} ${c.bright}Exceptions (${tg.exceptions.length}):${c.reset}${''.padStart(30 - String(tg.exceptions.length).length)}${c.cyan}│${c.reset}`);
|
|
1152
|
-
if (tg.exceptions.length === 0) {
|
|
1153
|
-
console.log(`${c.cyan}│${c.reset} ${c.dim}(none)${c.reset}${''.padStart(40)}${c.cyan}│${c.reset}`);
|
|
1154
|
-
}
|
|
1155
|
-
else {
|
|
1026
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Trust Gate\n`);
|
|
1027
|
+
console.log(` Enabled ${tg.enabled ? c.green + '✓' : c.dim + '✗'}${c.reset}`);
|
|
1028
|
+
console.log(` Min Score ${tg.minScore}`);
|
|
1029
|
+
console.log(` Min Tier ${tg.minTier}`);
|
|
1030
|
+
console.log(` Allow Unscored ${tg.allowUnscored ? 'Yes' : 'No'}`);
|
|
1031
|
+
if (tg.exceptions.length > 0) {
|
|
1032
|
+
console.log(``);
|
|
1033
|
+
console.log(` Exceptions (${tg.exceptions.length})`);
|
|
1156
1034
|
for (const addr of tg.exceptions.slice(0, 5)) {
|
|
1157
1035
|
const short = addr.slice(0, 10) + '...' + addr.slice(-8);
|
|
1158
|
-
console.log(
|
|
1036
|
+
console.log(` • ${c.dim}${short}${c.reset}`);
|
|
1159
1037
|
}
|
|
1160
1038
|
if (tg.exceptions.length > 5) {
|
|
1161
|
-
console.log(
|
|
1039
|
+
console.log(` ${c.dim}...and ${tg.exceptions.length - 5} more${c.reset}`);
|
|
1162
1040
|
}
|
|
1163
1041
|
}
|
|
1164
|
-
console.log(
|
|
1042
|
+
console.log();
|
|
1165
1043
|
if (!tg.enabled) {
|
|
1166
|
-
console.log(
|
|
1044
|
+
console.log(` ${c.dim}Enable: ${c.blue}paylobster trust-gate set --enable${c.reset}\n`);
|
|
1167
1045
|
}
|
|
1168
1046
|
}
|
|
1169
1047
|
// Handle trust-gate set command
|
|
@@ -1271,49 +1149,48 @@ async function handleTrustGateRemoveException(args) {
|
|
|
1271
1149
|
async function handleLimitsStatus() {
|
|
1272
1150
|
const config = (0, autonomous_1.loadConfig)();
|
|
1273
1151
|
const sp = config.spending;
|
|
1274
|
-
console.log(`\n${c.
|
|
1275
|
-
console.log(
|
|
1276
|
-
console.log(`${c.cyan}├─────────────────────────────────────────────────┤${c.reset}`);
|
|
1277
|
-
console.log(`${c.cyan}│${c.reset} Enabled: ${sp.enabled ? c.green + '✓ Yes' : c.red + '✗ No'}${c.reset}${''.padStart(34 - (sp.enabled ? 5 : 4))}${c.cyan}│${c.reset}`);
|
|
1278
|
-
console.log(`${c.cyan}├─────────────────────────────────────────────────┤${c.reset}`);
|
|
1152
|
+
console.log(`\n ${c.blue}🦞 Pay Lobster${c.reset} — Spending Limits\n`);
|
|
1153
|
+
console.log(` Enabled ${sp.enabled ? c.green + '✓' : c.dim + '✗'}${c.reset}\n`);
|
|
1279
1154
|
if (sp.globalLimits) {
|
|
1280
1155
|
const gl = sp.globalLimits;
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
console.log(
|
|
1286
|
-
console.log(
|
|
1156
|
+
const maxTx = parseFloat(ethers_1.ethers.formatUnits(gl.maxTransaction, 6)).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
1157
|
+
const daily = parseFloat(ethers_1.ethers.formatUnits(gl.dailyLimit, 6)).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
1158
|
+
const weekly = parseFloat(ethers_1.ethers.formatUnits(gl.weeklyLimit, 6)).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
1159
|
+
const monthly = parseFloat(ethers_1.ethers.formatUnits(gl.monthlyLimit, 6)).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
1160
|
+
console.log(` Global Limits`);
|
|
1161
|
+
console.log(` Max Tx $${maxTx}`);
|
|
1162
|
+
console.log(` Daily $${daily}`);
|
|
1163
|
+
console.log(` Weekly $${weekly}`);
|
|
1164
|
+
console.log(` Monthly $${monthly}\n`);
|
|
1287
1165
|
// Show current usage
|
|
1288
1166
|
const summary = (0, autonomous_1.getSpendingSummary)();
|
|
1167
|
+
const dailyUsed = parseFloat(ethers_1.ethers.formatUnits(summary.daily, 6)).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
1168
|
+
const weeklyUsed = parseFloat(ethers_1.ethers.formatUnits(summary.weekly, 6)).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
1169
|
+
const monthlyUsed = parseFloat(ethers_1.ethers.formatUnits(summary.monthly, 6)).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
1289
1170
|
const dailyPct = gl.dailyLimit > 0n ? Number((summary.daily * 100n) / gl.dailyLimit) : 0;
|
|
1290
1171
|
const weeklyPct = gl.weeklyLimit > 0n ? Number((summary.weekly * 100n) / gl.weeklyLimit) : 0;
|
|
1291
1172
|
const monthlyPct = gl.monthlyLimit > 0n ? Number((summary.monthly * 100n) / gl.monthlyLimit) : 0;
|
|
1292
|
-
console.log(
|
|
1293
|
-
console.log(
|
|
1294
|
-
console.log(
|
|
1295
|
-
console.log(
|
|
1296
|
-
console.log(`${c.cyan}├─────────────────────────────────────────────────┤${c.reset}`);
|
|
1173
|
+
console.log(` Current Usage`);
|
|
1174
|
+
console.log(` Daily $${dailyUsed} (${dailyPct.toFixed(0)}%)`);
|
|
1175
|
+
console.log(` Weekly $${weeklyUsed} (${weeklyPct.toFixed(0)}%)`);
|
|
1176
|
+
console.log(` Monthly $${monthlyUsed} (${monthlyPct.toFixed(0)}%)\n`);
|
|
1297
1177
|
}
|
|
1298
1178
|
const perAgentCount = Object.keys(sp.perAgent).length;
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
console.log(`${c.cyan}│${c.reset} ${c.dim}(none)${c.reset}${''.padStart(40)}${c.cyan}│${c.reset}`);
|
|
1302
|
-
}
|
|
1303
|
-
else {
|
|
1179
|
+
if (perAgentCount > 0) {
|
|
1180
|
+
console.log(` Per-Agent Limits (${perAgentCount})`);
|
|
1304
1181
|
const agents = Object.entries(sp.perAgent).slice(0, 5);
|
|
1305
1182
|
for (const [addr, limit] of agents) {
|
|
1306
1183
|
const short = addr.slice(0, 6) + '...' + addr.slice(-4);
|
|
1307
|
-
const max = ethers_1.ethers.formatUnits(limit.maxAmount, 6);
|
|
1308
|
-
console.log(
|
|
1184
|
+
const max = parseFloat(ethers_1.ethers.formatUnits(limit.maxAmount, 6)).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
1185
|
+
console.log(` ${c.dim}${short}${c.reset} $${max}`);
|
|
1309
1186
|
}
|
|
1310
1187
|
if (perAgentCount > 5) {
|
|
1311
|
-
console.log(
|
|
1188
|
+
console.log(` ${c.dim}...and ${perAgentCount - 5} more${c.reset}`);
|
|
1312
1189
|
}
|
|
1190
|
+
console.log();
|
|
1313
1191
|
}
|
|
1314
|
-
console.log(`${c.cyan}└─────────────────────────────────────────────────┘${c.reset}\n`);
|
|
1315
1192
|
if (!sp.enabled) {
|
|
1316
|
-
console.log(
|
|
1193
|
+
console.log(` ${c.dim}Enable: ${c.blue}paylobster limits set-global --enable${c.reset}\n`);
|
|
1317
1194
|
}
|
|
1318
1195
|
}
|
|
1319
1196
|
// Handle limits set-global command
|
|
@@ -1536,6 +1413,288 @@ async function handleLimitsHistory(args) {
|
|
|
1536
1413
|
}
|
|
1537
1414
|
console.log();
|
|
1538
1415
|
}
|
|
1416
|
+
// ═══════════════════════════════════════════════════════════
|
|
1417
|
+
// PAYMENT & AGENT COMMANDS
|
|
1418
|
+
// ═══════════════════════════════════════════════════════════
|
|
1419
|
+
// Handle send command: paylobster send <address> <amount>
|
|
1420
|
+
async function handleSend(args) {
|
|
1421
|
+
const config = loadConfig();
|
|
1422
|
+
if (!config.privateKey) {
|
|
1423
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
1424
|
+
return;
|
|
1425
|
+
}
|
|
1426
|
+
if (args.length < 2) {
|
|
1427
|
+
console.log(`\n ${c.bright}Usage:${c.reset} paylobster send <address> <amount>\n`);
|
|
1428
|
+
console.log(` ${c.dim}paylobster send 0x742d... 25.50${c.reset}`);
|
|
1429
|
+
console.log(` ${c.dim}paylobster send agent:DataBot 100${c.reset}\n`);
|
|
1430
|
+
return;
|
|
1431
|
+
}
|
|
1432
|
+
const [address, amount] = args;
|
|
1433
|
+
const amountNum = parseFloat(amount);
|
|
1434
|
+
if (isNaN(amountNum) || amountNum <= 0) {
|
|
1435
|
+
console.log(`\n ${c.red}✗${c.reset} Invalid amount\n`);
|
|
1436
|
+
return;
|
|
1437
|
+
}
|
|
1438
|
+
// Confirmation prompt (this is real money!)
|
|
1439
|
+
const rl = createRL();
|
|
1440
|
+
const amountFmt = amountNum.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
1441
|
+
const shortAddr = address.slice(0, 10) + '...' + address.slice(-8);
|
|
1442
|
+
console.log(`\n ${c.yellow}⚠️ Sending real money${c.reset}\n`);
|
|
1443
|
+
console.log(` To ${c.dim}${shortAddr}${c.reset}`);
|
|
1444
|
+
console.log(` Amount ${c.bright}$${amountFmt} USDC${c.reset}`);
|
|
1445
|
+
console.log(` Network ${config.network}\n`);
|
|
1446
|
+
const confirm = await prompt(rl, ` ${c.blue}❯${c.reset} Type 'yes' to confirm: `);
|
|
1447
|
+
rl.close();
|
|
1448
|
+
if (confirm.toLowerCase() !== 'yes') {
|
|
1449
|
+
console.log(`\n ${c.dim}Cancelled${c.reset}\n`);
|
|
1450
|
+
return;
|
|
1451
|
+
}
|
|
1452
|
+
try {
|
|
1453
|
+
const agent = new agent_1.LobsterAgent({
|
|
1454
|
+
privateKey: config.privateKey,
|
|
1455
|
+
network: config.network,
|
|
1456
|
+
rpcUrl: config.rpcUrl
|
|
1457
|
+
});
|
|
1458
|
+
await agent.initialize();
|
|
1459
|
+
console.log(`\n ${c.dim}…${c.reset} Sending $${amountFmt} USDC\n`);
|
|
1460
|
+
const transfer = await agent.transfer({ to: address, amount });
|
|
1461
|
+
const txShort = transfer.hash.slice(0, 10) + '...' + transfer.hash.slice(-8);
|
|
1462
|
+
const toDisplay = transfer.toName || transfer.to.slice(0, 10) + '...' + transfer.to.slice(-8);
|
|
1463
|
+
console.log(` ${c.green}✓${c.reset} Sent $${transfer.amount} USDC to ${toDisplay}`);
|
|
1464
|
+
console.log(` Tx: ${txShort}`);
|
|
1465
|
+
console.log(`\n ${c.dim}https://basescan.org/tx/${transfer.hash}${c.reset}\n`);
|
|
1466
|
+
// Record in global stats
|
|
1467
|
+
stats_1.stats.recordTransfer(transfer.from, transfer.to, transfer.amount, transfer.hash || transfer.id);
|
|
1468
|
+
}
|
|
1469
|
+
catch (e) {
|
|
1470
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
// Handle escrow command: paylobster escrow <subcommand>
|
|
1474
|
+
async function handleEscrow(args) {
|
|
1475
|
+
const config = loadConfig();
|
|
1476
|
+
const subcommand = args[0]?.toLowerCase();
|
|
1477
|
+
if (!subcommand) {
|
|
1478
|
+
console.log(`\n ${c.bright}Usage:${c.reset} paylobster escrow <command>\n`);
|
|
1479
|
+
console.log(` create <address> <amount> <desc> New escrow`);
|
|
1480
|
+
console.log(` list List escrows`);
|
|
1481
|
+
console.log(` release <id> Release`);
|
|
1482
|
+
console.log(` refund <id> Refund\n`);
|
|
1483
|
+
console.log(` ${c.dim}paylobster escrow create 0x... 500 "Website dev"${c.reset}\n`);
|
|
1484
|
+
return;
|
|
1485
|
+
}
|
|
1486
|
+
if (!config.privateKey) {
|
|
1487
|
+
console.log(`\n ${c.red}✗${c.reset} No wallet. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
1488
|
+
return;
|
|
1489
|
+
}
|
|
1490
|
+
const agent = new agent_1.LobsterAgent({
|
|
1491
|
+
privateKey: config.privateKey,
|
|
1492
|
+
network: config.network,
|
|
1493
|
+
rpcUrl: config.rpcUrl
|
|
1494
|
+
});
|
|
1495
|
+
await agent.initialize();
|
|
1496
|
+
try {
|
|
1497
|
+
switch (subcommand) {
|
|
1498
|
+
case 'create': {
|
|
1499
|
+
if (args.length < 3) {
|
|
1500
|
+
console.log(`\n${c.bright}Usage:${c.reset} paylobster escrow create <address> <amount> [description]\n`);
|
|
1501
|
+
return;
|
|
1502
|
+
}
|
|
1503
|
+
const [, recipient, amount, ...descParts] = args;
|
|
1504
|
+
const description = descParts.join(' ') || 'Escrow payment';
|
|
1505
|
+
const amountNum = parseFloat(amount);
|
|
1506
|
+
if (isNaN(amountNum) || amountNum <= 0) {
|
|
1507
|
+
console.log(`${c.red}✗${c.reset} Invalid amount: ${amount}\n`);
|
|
1508
|
+
return;
|
|
1509
|
+
}
|
|
1510
|
+
console.log(`\n${c.dim}Creating escrow...${c.reset}\n`);
|
|
1511
|
+
console.log(` ${c.dim}To:${c.reset} ${recipient}`);
|
|
1512
|
+
console.log(` ${c.dim}Amount:${c.reset} ${c.green}$${amountNum.toFixed(2)} USDC${c.reset}`);
|
|
1513
|
+
console.log(` ${c.dim}Description:${c.reset} ${description}\n`);
|
|
1514
|
+
const escrow = await agent.createEscrow({
|
|
1515
|
+
recipient,
|
|
1516
|
+
amount: amount,
|
|
1517
|
+
conditions: {
|
|
1518
|
+
type: 'approval',
|
|
1519
|
+
description
|
|
1520
|
+
}
|
|
1521
|
+
});
|
|
1522
|
+
console.log(`\n${c.green}✓ Escrow Created!${c.reset}\n`);
|
|
1523
|
+
console.log(` ${c.dim}ID:${c.reset} ${c.bright}${escrow.id}${c.reset}`);
|
|
1524
|
+
console.log(` ${c.dim}Amount:${c.reset} ${c.green}$${escrow.amount} USDC${c.reset}`);
|
|
1525
|
+
console.log(` ${c.dim}Status:${c.reset} ${escrow.status}\n`);
|
|
1526
|
+
console.log(`${c.dim}Release with: ${c.cyan}paylobster escrow release ${escrow.id}${c.reset}\n`);
|
|
1527
|
+
break;
|
|
1528
|
+
}
|
|
1529
|
+
case 'list': {
|
|
1530
|
+
console.log(`\n${c.yellow}⚠${c.reset} Escrow listing requires indexing.`);
|
|
1531
|
+
console.log(`${c.dim}View your escrows at: https://basescan.org/address/${getAddress(config.privateKey)}${c.reset}\n`);
|
|
1532
|
+
break;
|
|
1533
|
+
}
|
|
1534
|
+
case 'release': {
|
|
1535
|
+
if (args.length < 2) {
|
|
1536
|
+
console.log(`\n${c.bright}Usage:${c.reset} paylobster escrow release <escrowId>\n`);
|
|
1537
|
+
return;
|
|
1538
|
+
}
|
|
1539
|
+
const escrowId = args[1];
|
|
1540
|
+
console.log(`\n${c.dim}Releasing escrow ${escrowId}...${c.reset}`);
|
|
1541
|
+
await agent.releaseEscrow(escrowId);
|
|
1542
|
+
console.log(`\n${c.green}✓ Escrow Released!${c.reset}`);
|
|
1543
|
+
console.log(`${c.dim}Funds have been transferred to the seller.${c.reset}\n`);
|
|
1544
|
+
break;
|
|
1545
|
+
}
|
|
1546
|
+
case 'refund': {
|
|
1547
|
+
if (args.length < 2) {
|
|
1548
|
+
console.log(`\n${c.bright}Usage:${c.reset} paylobster escrow refund <escrowId>\n`);
|
|
1549
|
+
return;
|
|
1550
|
+
}
|
|
1551
|
+
const escrowId = args[1];
|
|
1552
|
+
console.log(`\n${c.dim}Refunding escrow ${escrowId}...${c.reset}`);
|
|
1553
|
+
await agent.refundEscrow(escrowId);
|
|
1554
|
+
console.log(`\n${c.green}✓ Escrow Refunded!${c.reset}`);
|
|
1555
|
+
console.log(`${c.dim}Funds have been returned to you.${c.reset}\n`);
|
|
1556
|
+
break;
|
|
1557
|
+
}
|
|
1558
|
+
default:
|
|
1559
|
+
console.log(`${c.red}✗${c.reset} Unknown escrow command: ${subcommand}\n`);
|
|
1560
|
+
console.log(`Run ${c.cyan}paylobster escrow${c.reset} for help.\n`);
|
|
1561
|
+
}
|
|
1562
|
+
}
|
|
1563
|
+
catch (e) {
|
|
1564
|
+
console.log(`\n${c.red}✗${c.reset} Escrow operation failed: ${e.message}\n`);
|
|
1565
|
+
}
|
|
1566
|
+
}
|
|
1567
|
+
// Handle register command: paylobster register <name> [capabilities]
|
|
1568
|
+
async function handleRegister(args) {
|
|
1569
|
+
const config = loadConfig();
|
|
1570
|
+
if (!config.privateKey) {
|
|
1571
|
+
console.log(`${c.red}✗${c.reset} No wallet configured. Run ${c.cyan}paylobster setup${c.reset} first.`);
|
|
1572
|
+
return;
|
|
1573
|
+
}
|
|
1574
|
+
if (args.length < 1) {
|
|
1575
|
+
console.log(`\n${c.bright}Usage:${c.reset} paylobster register <name> [capabilities...]\n`);
|
|
1576
|
+
console.log(`${c.dim}Examples:${c.reset}`);
|
|
1577
|
+
console.log(` ${c.cyan}paylobster register DataAnalyzer data-processing analytics${c.reset}`);
|
|
1578
|
+
console.log(` ${c.cyan}paylobster register WebDevBot frontend backend api${c.reset}\n`);
|
|
1579
|
+
return;
|
|
1580
|
+
}
|
|
1581
|
+
const [name, ...capabilities] = args;
|
|
1582
|
+
const caps = capabilities.length > 0 ? capabilities : ['general'];
|
|
1583
|
+
console.log(`\n${c.dim}🦞 Registering agent on-chain...${c.reset}\n`);
|
|
1584
|
+
console.log(` ${c.dim}Name:${c.reset} ${c.bright}${name}${c.reset}`);
|
|
1585
|
+
console.log(` ${c.dim}Capabilities:${c.reset} ${caps.join(', ')}`);
|
|
1586
|
+
console.log(` ${c.dim}Network:${c.reset} ${config.network}\n`);
|
|
1587
|
+
try {
|
|
1588
|
+
const agent = new agent_1.LobsterAgent({
|
|
1589
|
+
privateKey: config.privateKey,
|
|
1590
|
+
network: config.network,
|
|
1591
|
+
rpcUrl: config.rpcUrl
|
|
1592
|
+
});
|
|
1593
|
+
await agent.initialize();
|
|
1594
|
+
await agent.registerAgent({ name, capabilities: caps });
|
|
1595
|
+
console.log(`\n${c.green}✓ Agent Registered!${c.reset}\n`);
|
|
1596
|
+
console.log(` ${c.dim}Your agent is now discoverable on-chain.${c.reset}`);
|
|
1597
|
+
console.log(` ${c.dim}Others can find you with: ${c.cyan}paylobster discover${c.reset}\n`);
|
|
1598
|
+
}
|
|
1599
|
+
catch (e) {
|
|
1600
|
+
console.log(`\n${c.red}✗${c.reset} Registration failed: ${e.message}\n`);
|
|
1601
|
+
}
|
|
1602
|
+
}
|
|
1603
|
+
// Handle discover command: paylobster discover [search]
|
|
1604
|
+
async function handleDiscover(args) {
|
|
1605
|
+
const config = loadConfig();
|
|
1606
|
+
const searchTerm = args[0]?.toLowerCase();
|
|
1607
|
+
try {
|
|
1608
|
+
console.log(`\n ${c.dim}…${c.reset} Discovering agents\n`);
|
|
1609
|
+
const agent = new agent_1.LobsterAgent({
|
|
1610
|
+
network: config.network || 'base',
|
|
1611
|
+
rpcUrl: config.rpcUrl
|
|
1612
|
+
});
|
|
1613
|
+
await agent.initialize();
|
|
1614
|
+
const agents = await agent.discoverAgents({ limit: 20 });
|
|
1615
|
+
if (agents.length === 0) {
|
|
1616
|
+
console.log(` ${c.dim}No agents found${c.reset}\n`);
|
|
1617
|
+
return;
|
|
1618
|
+
}
|
|
1619
|
+
// Filter by search term if provided
|
|
1620
|
+
const filtered = searchTerm
|
|
1621
|
+
? agents.filter(a => a.name.toLowerCase().includes(searchTerm) ||
|
|
1622
|
+
a.capabilities.some(c => c.toLowerCase().includes(searchTerm)))
|
|
1623
|
+
: agents;
|
|
1624
|
+
if (filtered.length === 0) {
|
|
1625
|
+
console.log(` ${c.dim}No matches for "${searchTerm}"${c.reset}\n`);
|
|
1626
|
+
return;
|
|
1627
|
+
}
|
|
1628
|
+
console.log(` ${c.blue}🦞 Pay Lobster${c.reset} — Agents\n`);
|
|
1629
|
+
console.log(` ${c.dim}Name Trust Address${c.reset}`);
|
|
1630
|
+
console.log(` ${c.dim}──────────────────────── ─────── ──────────────${c.reset}`);
|
|
1631
|
+
for (const ag of filtered.slice(0, 10)) {
|
|
1632
|
+
const name = ag.name.padEnd(24);
|
|
1633
|
+
const trust = ag.trustScore
|
|
1634
|
+
? `${ag.trustScore.score}/100`.padEnd(7)
|
|
1635
|
+
: 'N/A'.padEnd(7);
|
|
1636
|
+
const addr = ag.address.slice(0, 6) + '...' + ag.address.slice(-4);
|
|
1637
|
+
const trustColor = (ag.trustScore?.score || 0) >= 80 ? c.green :
|
|
1638
|
+
(ag.trustScore?.score || 0) >= 60 ? c.blue : c.dim;
|
|
1639
|
+
console.log(` ${name} ${trustColor}${trust}${c.reset} ${c.dim}${addr}${c.reset}`);
|
|
1640
|
+
}
|
|
1641
|
+
if (filtered.length > 10) {
|
|
1642
|
+
console.log(`\n ${c.dim}...and ${filtered.length - 10} more${c.reset}`);
|
|
1643
|
+
}
|
|
1644
|
+
console.log();
|
|
1645
|
+
}
|
|
1646
|
+
catch (e) {
|
|
1647
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
1648
|
+
}
|
|
1649
|
+
}
|
|
1650
|
+
// Handle trust command: paylobster trust <address>
|
|
1651
|
+
async function handleTrust(args) {
|
|
1652
|
+
const config = loadConfig();
|
|
1653
|
+
if (args.length < 1) {
|
|
1654
|
+
console.log(`\n${c.bright}Usage:${c.reset} paylobster trust <address>\n`);
|
|
1655
|
+
console.log(`${c.dim}Examples:${c.reset}`);
|
|
1656
|
+
console.log(` ${c.cyan}paylobster trust 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb${c.reset}`);
|
|
1657
|
+
console.log(` ${c.cyan}paylobster trust agent:DataBot${c.reset}\n`);
|
|
1658
|
+
return;
|
|
1659
|
+
}
|
|
1660
|
+
const address = args[0];
|
|
1661
|
+
const shortAddr = address.slice(0, 10) + '...' + address.slice(-8);
|
|
1662
|
+
try {
|
|
1663
|
+
console.log(`\n ${c.dim}…${c.reset} Checking trust\n`);
|
|
1664
|
+
const agent = new agent_1.LobsterAgent({
|
|
1665
|
+
network: config.network || 'base',
|
|
1666
|
+
rpcUrl: config.rpcUrl
|
|
1667
|
+
});
|
|
1668
|
+
await agent.initialize();
|
|
1669
|
+
const trustScore = await agent.getTrustScore(address);
|
|
1670
|
+
const stars = trustScore.score >= 90 ? 5 :
|
|
1671
|
+
trustScore.score >= 75 ? 4 :
|
|
1672
|
+
trustScore.score >= 60 ? 3 :
|
|
1673
|
+
trustScore.score >= 40 ? 2 : 1;
|
|
1674
|
+
const starStr = '⭐'.repeat(stars);
|
|
1675
|
+
const levelEmoji = trustScore.level === 'verified' ? '✅' :
|
|
1676
|
+
trustScore.level === 'trusted' ? '🔵' :
|
|
1677
|
+
trustScore.level === 'established' ? '🟢' : '🆕';
|
|
1678
|
+
console.log(` ${c.blue}🦞 Pay Lobster${c.reset} — Trust Score\n`);
|
|
1679
|
+
console.log(` Address ${c.dim}${shortAddr}${c.reset}`);
|
|
1680
|
+
console.log(` Score ${c.bright}${trustScore.score}/100${c.reset} ${starStr}`);
|
|
1681
|
+
console.log(` Level ${levelEmoji} ${trustScore.level}`);
|
|
1682
|
+
console.log(` Txns ${trustScore.totalTransactions}`);
|
|
1683
|
+
console.log(` Success ${trustScore.successRate}%\n`);
|
|
1684
|
+
if (trustScore.level === 'verified') {
|
|
1685
|
+
console.log(` ${c.green}✓${c.reset} Highly trusted\n`);
|
|
1686
|
+
}
|
|
1687
|
+
else if (trustScore.level === 'trusted') {
|
|
1688
|
+
console.log(` ${c.green}✓${c.reset} Good reputation\n`);
|
|
1689
|
+
}
|
|
1690
|
+
else if (trustScore.level === 'new') {
|
|
1691
|
+
console.log(` ${c.yellow}⚠${c.reset} New agent\n`);
|
|
1692
|
+
}
|
|
1693
|
+
}
|
|
1694
|
+
catch (e) {
|
|
1695
|
+
console.log(`\n ${c.red}✗${c.reset} ${e.message}\n`);
|
|
1696
|
+
}
|
|
1697
|
+
}
|
|
1539
1698
|
// Main CLI entry point
|
|
1540
1699
|
async function main() {
|
|
1541
1700
|
const args = process.argv.slice(2);
|
|
@@ -1550,8 +1709,7 @@ async function main() {
|
|
|
1550
1709
|
// Check if setup needed (allow some commands without setup)
|
|
1551
1710
|
const noSetupRequired = ['help', 'stats', 'volume', 'leaderboard', 'top'];
|
|
1552
1711
|
if (!config.setupComplete && !noSetupRequired.includes(command)) {
|
|
1553
|
-
console.log(`\n${c.yellow}⚠${c.reset}
|
|
1554
|
-
console.log(`Run ${c.cyan}paylobster setup${c.reset} to get started.\n`);
|
|
1712
|
+
console.log(`\n ${c.yellow}⚠${c.reset} Not configured. Run ${c.blue}paylobster setup${c.reset}\n`);
|
|
1555
1713
|
return;
|
|
1556
1714
|
}
|
|
1557
1715
|
switch (command) {
|
|
@@ -1577,27 +1735,19 @@ async function main() {
|
|
|
1577
1735
|
await handleFund(args.slice(1));
|
|
1578
1736
|
break;
|
|
1579
1737
|
case 'send':
|
|
1580
|
-
|
|
1581
|
-
console.log(`${c.dim}For now, use the library directly:${c.reset}\n`);
|
|
1582
|
-
console.log(` ${c.cyan}import { LobsterAgent } from 'pay-lobster';${c.reset}`);
|
|
1583
|
-
console.log(` ${c.cyan}const agent = new LobsterAgent({ privateKey });${c.reset}`);
|
|
1584
|
-
console.log(` ${c.cyan}await agent.transfer(recipientAddress, 25.00);${c.reset}\n`);
|
|
1738
|
+
await handleSend(args.slice(1));
|
|
1585
1739
|
break;
|
|
1586
1740
|
case 'escrow':
|
|
1587
|
-
|
|
1588
|
-
console.log(`${c.dim}For now, use the library directly. See docs.${c.reset}\n`);
|
|
1741
|
+
await handleEscrow(args.slice(1));
|
|
1589
1742
|
break;
|
|
1590
1743
|
case 'trust':
|
|
1591
|
-
|
|
1592
|
-
console.log(`${c.dim}Registry: 0x10BCa62Ce136A70F914c56D97e491a85d1e050E7${c.reset}\n`);
|
|
1744
|
+
await handleTrust(args.slice(1));
|
|
1593
1745
|
break;
|
|
1594
1746
|
case 'discover':
|
|
1595
|
-
|
|
1596
|
-
console.log(`${c.dim}Registry: 0x10BCa62Ce136A70F914c56D97e491a85d1e050E7${c.reset}\n`);
|
|
1747
|
+
await handleDiscover(args.slice(1));
|
|
1597
1748
|
break;
|
|
1598
1749
|
case 'register':
|
|
1599
|
-
|
|
1600
|
-
console.log(`${c.dim}For now, register directly via the contract.${c.reset}\n`);
|
|
1750
|
+
await handleRegister(args.slice(1));
|
|
1601
1751
|
break;
|
|
1602
1752
|
case 'swap':
|
|
1603
1753
|
await handleSwap(args.slice(1));
|
|
@@ -1667,12 +1817,11 @@ async function main() {
|
|
|
1667
1817
|
await handleTrustGateRemoveException(args.slice(2));
|
|
1668
1818
|
break;
|
|
1669
1819
|
default:
|
|
1670
|
-
console.log(`\n${c.bright}Usage:${c.reset} paylobster trust-gate <command>\n`);
|
|
1671
|
-
console.log(
|
|
1672
|
-
console.log(`
|
|
1673
|
-
console.log(`
|
|
1674
|
-
console.log(`
|
|
1675
|
-
console.log(` remove-exception <address> Remove from whitelist\n`);
|
|
1820
|
+
console.log(`\n ${c.bright}Usage:${c.reset} paylobster trust-gate <command>\n`);
|
|
1821
|
+
console.log(` status Show configuration`);
|
|
1822
|
+
console.log(` set [options] Configure settings`);
|
|
1823
|
+
console.log(` add-exception <address> Whitelist`);
|
|
1824
|
+
console.log(` remove-exception <addr> Remove from whitelist\n`);
|
|
1676
1825
|
}
|
|
1677
1826
|
break;
|
|
1678
1827
|
case 'limits':
|
|
@@ -1694,18 +1843,17 @@ async function main() {
|
|
|
1694
1843
|
await handleLimitsHistory(args.slice(2));
|
|
1695
1844
|
break;
|
|
1696
1845
|
default:
|
|
1697
|
-
console.log(`\n${c.bright}Usage:${c.reset} paylobster limits <command>\n`);
|
|
1698
|
-
console.log(
|
|
1699
|
-
console.log(`
|
|
1700
|
-
console.log(`
|
|
1701
|
-
console.log(`
|
|
1702
|
-
console.log(`
|
|
1703
|
-
console.log(` history [count] Show spending history\n`);
|
|
1846
|
+
console.log(`\n ${c.bright}Usage:${c.reset} paylobster limits <command>\n`);
|
|
1847
|
+
console.log(` status Show spending limits`);
|
|
1848
|
+
console.log(` set-global [opts] Configure global`);
|
|
1849
|
+
console.log(` set <addr> [opts] Per-agent limits`);
|
|
1850
|
+
console.log(` remove <address> Remove limits`);
|
|
1851
|
+
console.log(` history [count] Spending history\n`);
|
|
1704
1852
|
}
|
|
1705
1853
|
break;
|
|
1706
1854
|
default:
|
|
1707
|
-
console.log(`\n${c.red}✗${c.reset} Unknown command: ${command}`);
|
|
1708
|
-
console.log(`Run ${c.
|
|
1855
|
+
console.log(`\n ${c.red}✗${c.reset} Unknown command: ${command}`);
|
|
1856
|
+
console.log(` Run ${c.blue}paylobster help${c.reset}\n`);
|
|
1709
1857
|
}
|
|
1710
1858
|
}
|
|
1711
1859
|
main().catch(console.error);
|