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.
Files changed (586) hide show
  1. package/dist/cli.js +657 -509
  2. package/dist/cli.js.map +1 -1
  3. package/lib/cli.ts +749 -540
  4. package/package.json +6 -3
  5. package/lib/openzeppelin-contracts/.changeset/config.json +0 -12
  6. package/lib/openzeppelin-contracts/.codecov.yml +0 -12
  7. package/lib/openzeppelin-contracts/.editorconfig +0 -21
  8. package/lib/openzeppelin-contracts/.eslintrc +0 -20
  9. package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/bug_report.md +0 -21
  10. package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/config.yml +0 -4
  11. package/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/feature_request.md +0 -14
  12. package/lib/openzeppelin-contracts/.github/PULL_REQUEST_TEMPLATE.md +0 -20
  13. package/lib/openzeppelin-contracts/.github/actions/gas-compare/action.yml +0 -49
  14. package/lib/openzeppelin-contracts/.github/actions/setup/action.yml +0 -21
  15. package/lib/openzeppelin-contracts/.github/actions/storage-layout/action.yml +0 -55
  16. package/lib/openzeppelin-contracts/.github/workflows/actionlint.yml +0 -18
  17. package/lib/openzeppelin-contracts/.github/workflows/changeset.yml +0 -28
  18. package/lib/openzeppelin-contracts/.github/workflows/checks.yml +0 -118
  19. package/lib/openzeppelin-contracts/.github/workflows/docs.yml +0 -19
  20. package/lib/openzeppelin-contracts/.github/workflows/formal-verification.yml +0 -68
  21. package/lib/openzeppelin-contracts/.github/workflows/release-cycle.yml +0 -214
  22. package/lib/openzeppelin-contracts/.github/workflows/upgradeable.yml +0 -34
  23. package/lib/openzeppelin-contracts/.gitmodules +0 -7
  24. package/lib/openzeppelin-contracts/.mocharc.js +0 -4
  25. package/lib/openzeppelin-contracts/.prettierrc +0 -15
  26. package/lib/openzeppelin-contracts/.solcover.js +0 -13
  27. package/lib/openzeppelin-contracts/CHANGELOG.md +0 -972
  28. package/lib/openzeppelin-contracts/CODE_OF_CONDUCT.md +0 -73
  29. package/lib/openzeppelin-contracts/CONTRIBUTING.md +0 -36
  30. package/lib/openzeppelin-contracts/GUIDELINES.md +0 -148
  31. package/lib/openzeppelin-contracts/LICENSE +0 -22
  32. package/lib/openzeppelin-contracts/README.md +0 -107
  33. package/lib/openzeppelin-contracts/RELEASING.md +0 -45
  34. package/lib/openzeppelin-contracts/SECURITY.md +0 -42
  35. package/lib/openzeppelin-contracts/audits/2017-03.md +0 -292
  36. package/lib/openzeppelin-contracts/audits/2018-10.pdf +0 -0
  37. package/lib/openzeppelin-contracts/audits/2022-10-Checkpoints.pdf +0 -0
  38. package/lib/openzeppelin-contracts/audits/2022-10-ERC4626.pdf +0 -0
  39. package/lib/openzeppelin-contracts/audits/2023-05-v4.9.pdf +0 -0
  40. package/lib/openzeppelin-contracts/audits/2023-10-v5.0.pdf +0 -0
  41. package/lib/openzeppelin-contracts/audits/README.md +0 -17
  42. package/lib/openzeppelin-contracts/certora/Makefile +0 -54
  43. package/lib/openzeppelin-contracts/certora/README.md +0 -60
  44. package/lib/openzeppelin-contracts/certora/diff/access_manager_AccessManager.sol.patch +0 -97
  45. package/lib/openzeppelin-contracts/certora/harnesses/AccessControlDefaultAdminRulesHarness.sol +0 -46
  46. package/lib/openzeppelin-contracts/certora/harnesses/AccessControlHarness.sol +0 -6
  47. package/lib/openzeppelin-contracts/certora/harnesses/DoubleEndedQueueHarness.sol +0 -58
  48. package/lib/openzeppelin-contracts/certora/harnesses/ERC20FlashMintHarness.sol +0 -36
  49. package/lib/openzeppelin-contracts/certora/harnesses/ERC20PermitHarness.sol +0 -16
  50. package/lib/openzeppelin-contracts/certora/harnesses/ERC20WrapperHarness.sol +0 -34
  51. package/lib/openzeppelin-contracts/certora/harnesses/ERC3156FlashBorrowerHarness.sol +0 -13
  52. package/lib/openzeppelin-contracts/certora/harnesses/ERC721Harness.sol +0 -33
  53. package/lib/openzeppelin-contracts/certora/harnesses/ERC721ReceiverHarness.sol +0 -11
  54. package/lib/openzeppelin-contracts/certora/harnesses/EnumerableMapHarness.sol +0 -55
  55. package/lib/openzeppelin-contracts/certora/harnesses/EnumerableSetHarness.sol +0 -35
  56. package/lib/openzeppelin-contracts/certora/harnesses/InitializableHarness.sol +0 -23
  57. package/lib/openzeppelin-contracts/certora/harnesses/Ownable2StepHarness.sol +0 -10
  58. package/lib/openzeppelin-contracts/certora/harnesses/OwnableHarness.sol +0 -10
  59. package/lib/openzeppelin-contracts/certora/harnesses/PausableHarness.sol +0 -18
  60. package/lib/openzeppelin-contracts/certora/harnesses/TimelockControllerHarness.sol +0 -13
  61. package/lib/openzeppelin-contracts/certora/reports/2021-10.pdf +0 -0
  62. package/lib/openzeppelin-contracts/certora/reports/2022-03.pdf +0 -0
  63. package/lib/openzeppelin-contracts/certora/reports/2022-05.pdf +0 -0
  64. package/lib/openzeppelin-contracts/certora/run.js +0 -160
  65. package/lib/openzeppelin-contracts/certora/specs/AccessControl.spec +0 -119
  66. package/lib/openzeppelin-contracts/certora/specs/AccessControlDefaultAdminRules.spec +0 -464
  67. package/lib/openzeppelin-contracts/certora/specs/DoubleEndedQueue.spec +0 -300
  68. package/lib/openzeppelin-contracts/certora/specs/ERC20.spec +0 -352
  69. package/lib/openzeppelin-contracts/certora/specs/ERC20FlashMint.spec +0 -55
  70. package/lib/openzeppelin-contracts/certora/specs/ERC20Wrapper.spec +0 -198
  71. package/lib/openzeppelin-contracts/certora/specs/ERC721.spec +0 -679
  72. package/lib/openzeppelin-contracts/certora/specs/EnumerableMap.spec +0 -333
  73. package/lib/openzeppelin-contracts/certora/specs/EnumerableSet.spec +0 -246
  74. package/lib/openzeppelin-contracts/certora/specs/Initializable.spec +0 -165
  75. package/lib/openzeppelin-contracts/certora/specs/Ownable.spec +0 -77
  76. package/lib/openzeppelin-contracts/certora/specs/Ownable2Step.spec +0 -108
  77. package/lib/openzeppelin-contracts/certora/specs/Pausable.spec +0 -96
  78. package/lib/openzeppelin-contracts/certora/specs/TimelockController.spec +0 -274
  79. package/lib/openzeppelin-contracts/certora/specs/helpers/helpers.spec +0 -7
  80. package/lib/openzeppelin-contracts/certora/specs/methods/IAccessControl.spec +0 -8
  81. package/lib/openzeppelin-contracts/certora/specs/methods/IAccessControlDefaultAdminRules.spec +0 -36
  82. package/lib/openzeppelin-contracts/certora/specs/methods/IERC20.spec +0 -11
  83. package/lib/openzeppelin-contracts/certora/specs/methods/IERC2612.spec +0 -5
  84. package/lib/openzeppelin-contracts/certora/specs/methods/IERC3156FlashBorrower.spec +0 -3
  85. package/lib/openzeppelin-contracts/certora/specs/methods/IERC3156FlashLender.spec +0 -5
  86. package/lib/openzeppelin-contracts/certora/specs/methods/IERC5313.spec +0 -3
  87. package/lib/openzeppelin-contracts/certora/specs/methods/IERC721.spec +0 -17
  88. package/lib/openzeppelin-contracts/certora/specs/methods/IERC721Receiver.spec +0 -3
  89. package/lib/openzeppelin-contracts/certora/specs/methods/IOwnable.spec +0 -5
  90. package/lib/openzeppelin-contracts/certora/specs/methods/IOwnable2Step.spec +0 -7
  91. package/lib/openzeppelin-contracts/certora/specs.json +0 -86
  92. package/lib/openzeppelin-contracts/contracts/access/AccessControl.sol +0 -209
  93. package/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol +0 -98
  94. package/lib/openzeppelin-contracts/contracts/access/Ownable.sol +0 -100
  95. package/lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol +0 -59
  96. package/lib/openzeppelin-contracts/contracts/access/README.adoc +0 -43
  97. package/lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol +0 -396
  98. package/lib/openzeppelin-contracts/contracts/access/extensions/AccessControlEnumerable.sol +0 -70
  99. package/lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlDefaultAdminRules.sol +0 -192
  100. package/lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlEnumerable.sol +0 -31
  101. package/lib/openzeppelin-contracts/contracts/access/manager/AccessManaged.sol +0 -113
  102. package/lib/openzeppelin-contracts/contracts/access/manager/AccessManager.sol +0 -730
  103. package/lib/openzeppelin-contracts/contracts/access/manager/AuthorityUtils.sol +0 -32
  104. package/lib/openzeppelin-contracts/contracts/access/manager/IAccessManaged.sol +0 -32
  105. package/lib/openzeppelin-contracts/contracts/access/manager/IAccessManager.sol +0 -392
  106. package/lib/openzeppelin-contracts/contracts/access/manager/IAuthority.sol +0 -14
  107. package/lib/openzeppelin-contracts/contracts/finance/README.adoc +0 -14
  108. package/lib/openzeppelin-contracts/contracts/finance/VestingWallet.sol +0 -154
  109. package/lib/openzeppelin-contracts/contracts/governance/Governor.sol +0 -850
  110. package/lib/openzeppelin-contracts/contracts/governance/IGovernor.sol +0 -427
  111. package/lib/openzeppelin-contracts/contracts/governance/README.adoc +0 -167
  112. package/lib/openzeppelin-contracts/contracts/governance/TimelockController.sol +0 -472
  113. package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingSimple.sol +0 -100
  114. package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorPreventLateQuorum.sol +0 -102
  115. package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorSettings.sol +0 -112
  116. package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorStorage.sol +0 -115
  117. package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockAccess.sol +0 -346
  118. package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockCompound.sol +0 -167
  119. package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockControl.sol +0 -173
  120. package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotes.sol +0 -64
  121. package/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesQuorumFraction.sol +0 -110
  122. package/lib/openzeppelin-contracts/contracts/governance/utils/IVotes.sol +0 -59
  123. package/lib/openzeppelin-contracts/contracts/governance/utils/Votes.sol +0 -251
  124. package/lib/openzeppelin-contracts/contracts/interfaces/IERC1155.sol +0 -6
  125. package/lib/openzeppelin-contracts/contracts/interfaces/IERC1155MetadataURI.sol +0 -6
  126. package/lib/openzeppelin-contracts/contracts/interfaces/IERC1155Receiver.sol +0 -6
  127. package/lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol +0 -17
  128. package/lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol +0 -80
  129. package/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Receiver.sol +0 -35
  130. package/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Spender.sol +0 -29
  131. package/lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol +0 -6
  132. package/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Implementer.sol +0 -20
  133. package/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Registry.sol +0 -112
  134. package/lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol +0 -24
  135. package/lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol +0 -6
  136. package/lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sol +0 -6
  137. package/lib/openzeppelin-contracts/contracts/interfaces/IERC2309.sol +0 -19
  138. package/lib/openzeppelin-contracts/contracts/interfaces/IERC2612.sol +0 -8
  139. package/lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol +0 -23
  140. package/lib/openzeppelin-contracts/contracts/interfaces/IERC3156.sol +0 -7
  141. package/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashBorrower.sol +0 -27
  142. package/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashLender.sol +0 -41
  143. package/lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol +0 -230
  144. package/lib/openzeppelin-contracts/contracts/interfaces/IERC4906.sol +0 -20
  145. package/lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol +0 -28
  146. package/lib/openzeppelin-contracts/contracts/interfaces/IERC5313.sol +0 -16
  147. package/lib/openzeppelin-contracts/contracts/interfaces/IERC5805.sol +0 -9
  148. package/lib/openzeppelin-contracts/contracts/interfaces/IERC6372.sol +0 -17
  149. package/lib/openzeppelin-contracts/contracts/interfaces/IERC721.sol +0 -6
  150. package/lib/openzeppelin-contracts/contracts/interfaces/IERC721Enumerable.sol +0 -6
  151. package/lib/openzeppelin-contracts/contracts/interfaces/IERC721Metadata.sol +0 -6
  152. package/lib/openzeppelin-contracts/contracts/interfaces/IERC721Receiver.sol +0 -6
  153. package/lib/openzeppelin-contracts/contracts/interfaces/IERC777.sol +0 -200
  154. package/lib/openzeppelin-contracts/contracts/interfaces/IERC777Recipient.sol +0 -35
  155. package/lib/openzeppelin-contracts/contracts/interfaces/IERC777Sender.sol +0 -35
  156. package/lib/openzeppelin-contracts/contracts/interfaces/README.adoc +0 -82
  157. package/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol +0 -20
  158. package/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol +0 -161
  159. package/lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol +0 -75
  160. package/lib/openzeppelin-contracts/contracts/metatx/ERC2771Forwarder.sol +0 -370
  161. package/lib/openzeppelin-contracts/contracts/metatx/README.adoc +0 -12
  162. package/lib/openzeppelin-contracts/contracts/mocks/AccessManagedTarget.sol +0 -34
  163. package/lib/openzeppelin-contracts/contracts/mocks/ArraysMock.sol +0 -51
  164. package/lib/openzeppelin-contracts/contracts/mocks/AuthorityMock.sol +0 -69
  165. package/lib/openzeppelin-contracts/contracts/mocks/CallReceiverMock.sol +0 -73
  166. package/lib/openzeppelin-contracts/contracts/mocks/ContextMock.sol +0 -35
  167. package/lib/openzeppelin-contracts/contracts/mocks/DummyImplementation.sol +0 -65
  168. package/lib/openzeppelin-contracts/contracts/mocks/EIP712Verifier.sol +0 -16
  169. package/lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol +0 -24
  170. package/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165InterfacesSupported.sol +0 -58
  171. package/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MaliciousData.sol +0 -12
  172. package/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MissingData.sol +0 -7
  173. package/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165NotSupported.sol +0 -5
  174. package/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165ReturnBomb.sol +0 -18
  175. package/lib/openzeppelin-contracts/contracts/mocks/ERC2771ContextMock.sol +0 -23
  176. package/lib/openzeppelin-contracts/contracts/mocks/ERC3156FlashBorrowerMock.sol +0 -53
  177. package/lib/openzeppelin-contracts/contracts/mocks/EtherReceiverMock.sol +0 -17
  178. package/lib/openzeppelin-contracts/contracts/mocks/InitializableMock.sol +0 -130
  179. package/lib/openzeppelin-contracts/contracts/mocks/MulticallTest.sol +0 -23
  180. package/lib/openzeppelin-contracts/contracts/mocks/MultipleInheritanceInitializableMocks.sol +0 -131
  181. package/lib/openzeppelin-contracts/contracts/mocks/PausableMock.sol +0 -31
  182. package/lib/openzeppelin-contracts/contracts/mocks/ReentrancyAttack.sol +0 -12
  183. package/lib/openzeppelin-contracts/contracts/mocks/ReentrancyMock.sol +0 -50
  184. package/lib/openzeppelin-contracts/contracts/mocks/RegressionImplementation.sol +0 -61
  185. package/lib/openzeppelin-contracts/contracts/mocks/SingleInheritanceInitializableMocks.sol +0 -49
  186. package/lib/openzeppelin-contracts/contracts/mocks/Stateless.sol +0 -36
  187. package/lib/openzeppelin-contracts/contracts/mocks/StorageSlotMock.sol +0 -77
  188. package/lib/openzeppelin-contracts/contracts/mocks/TimelockReentrant.sol +0 -26
  189. package/lib/openzeppelin-contracts/contracts/mocks/UpgradeableBeaconMock.sol +0 -27
  190. package/lib/openzeppelin-contracts/contracts/mocks/VotesMock.sol +0 -42
  191. package/lib/openzeppelin-contracts/contracts/mocks/compound/CompTimelock.sol +0 -174
  192. package/lib/openzeppelin-contracts/contracts/mocks/docs/ERC20WithAutoMinerReward.sol +0 -22
  193. package/lib/openzeppelin-contracts/contracts/mocks/docs/ERC4626Fees.sol +0 -103
  194. package/lib/openzeppelin-contracts/contracts/mocks/docs/MyContractOwnable.sol +0 -17
  195. package/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyGovernor.sol +0 -81
  196. package/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyToken.sol +0 -21
  197. package/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyTokenTimestampBased.sol +0 -32
  198. package/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyTokenWrapped.sol +0 -28
  199. package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorMock.sol +0 -14
  200. package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorPreventLateQuorumMock.sol +0 -46
  201. package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorStorageMock.sol +0 -79
  202. package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockAccessMock.sol +0 -70
  203. package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockCompoundMock.sol +0 -69
  204. package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockControlMock.sol +0 -69
  205. package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorVoteMock.sol +0 -20
  206. package/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorWithParamsMock.sol +0 -51
  207. package/lib/openzeppelin-contracts/contracts/mocks/proxy/BadBeacon.sol +0 -11
  208. package/lib/openzeppelin-contracts/contracts/mocks/proxy/ClashingImplementation.sol +0 -19
  209. package/lib/openzeppelin-contracts/contracts/mocks/proxy/UUPSUpgradeableMock.sol +0 -35
  210. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC1155ReceiverMock.sol +0 -74
  211. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ApprovalMock.sol +0 -10
  212. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20DecimalsMock.sol +0 -17
  213. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ExcessDecimalsMock.sol +0 -9
  214. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20FlashMintMock.sol +0 -26
  215. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ForceApproveMock.sol +0 -13
  216. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20Mock.sol +0 -16
  217. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20MulticallMock.sol +0 -8
  218. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20NoReturnMock.sol +0 -28
  219. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20Reentrant.sol +0 -39
  220. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ReturnFalseMock.sol +0 -19
  221. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC20VotesLegacyMock.sol +0 -253
  222. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626LimitsMock.sol +0 -23
  223. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626Mock.sol +0 -17
  224. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626OffsetMock.sol +0 -17
  225. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC4646FeesMock.sol +0 -40
  226. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ConsecutiveEnumerableMock.sol +0 -42
  227. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ConsecutiveMock.sol +0 -61
  228. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ReceiverMock.sol +0 -47
  229. package/lib/openzeppelin-contracts/contracts/mocks/token/ERC721URIStorageMock.sol +0 -17
  230. package/lib/openzeppelin-contracts/contracts/mocks/token/VotesTimestamp.sol +0 -29
  231. package/lib/openzeppelin-contracts/contracts/package.json +0 -32
  232. package/lib/openzeppelin-contracts/contracts/proxy/Clones.sol +0 -95
  233. package/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol +0 -40
  234. package/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol +0 -193
  235. package/lib/openzeppelin-contracts/contracts/proxy/Proxy.sol +0 -69
  236. package/lib/openzeppelin-contracts/contracts/proxy/README.adoc +0 -87
  237. package/lib/openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sol +0 -57
  238. package/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol +0 -16
  239. package/lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol +0 -70
  240. package/lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol +0 -45
  241. package/lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol +0 -116
  242. package/lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol +0 -228
  243. package/lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol +0 -147
  244. package/lib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sol +0 -468
  245. package/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol +0 -128
  246. package/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol +0 -59
  247. package/lib/openzeppelin-contracts/contracts/token/ERC1155/README.adoc +0 -41
  248. package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol +0 -28
  249. package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Pausable.sol +0 -38
  250. package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Supply.sol +0 -87
  251. package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol +0 -61
  252. package/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol +0 -20
  253. package/lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol +0 -42
  254. package/lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol +0 -316
  255. package/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol +0 -79
  256. package/lib/openzeppelin-contracts/contracts/token/ERC20/README.adoc +0 -67
  257. package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sol +0 -39
  258. package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Capped.sol +0 -56
  259. package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20FlashMint.sol +0 -134
  260. package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Pausable.sol +0 -33
  261. package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Permit.sol +0 -83
  262. package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Votes.sol +0 -83
  263. package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Wrapper.sol +0 -86
  264. package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC4626.sol +0 -286
  265. package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol +0 -26
  266. package/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol +0 -90
  267. package/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol +0 -118
  268. package/lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol +0 -483
  269. package/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol +0 -135
  270. package/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol +0 -28
  271. package/lib/openzeppelin-contracts/contracts/token/ERC721/README.adoc +0 -67
  272. package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Burnable.sol +0 -26
  273. package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Consecutive.sol +0 -176
  274. package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Enumerable.sol +0 -172
  275. package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Pausable.sol +0 -37
  276. package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Royalty.sol +0 -27
  277. package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721URIStorage.sol +0 -61
  278. package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Votes.sol +0 -47
  279. package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Wrapper.sol +0 -102
  280. package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sol +0 -29
  281. package/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol +0 -27
  282. package/lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol +0 -24
  283. package/lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol +0 -137
  284. package/lib/openzeppelin-contracts/contracts/token/common/README.adoc +0 -10
  285. package/lib/openzeppelin-contracts/contracts/utils/Address.sol +0 -159
  286. package/lib/openzeppelin-contracts/contracts/utils/Arrays.sol +0 -127
  287. package/lib/openzeppelin-contracts/contracts/utils/Base64.sol +0 -90
  288. package/lib/openzeppelin-contracts/contracts/utils/Context.sol +0 -24
  289. package/lib/openzeppelin-contracts/contracts/utils/Create2.sol +0 -96
  290. package/lib/openzeppelin-contracts/contracts/utils/Multicall.sol +0 -23
  291. package/lib/openzeppelin-contracts/contracts/utils/Nonces.sol +0 -46
  292. package/lib/openzeppelin-contracts/contracts/utils/Pausable.sol +0 -119
  293. package/lib/openzeppelin-contracts/contracts/utils/README.adoc +0 -88
  294. package/lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol +0 -84
  295. package/lib/openzeppelin-contracts/contracts/utils/ShortStrings.sol +0 -123
  296. package/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol +0 -135
  297. package/lib/openzeppelin-contracts/contracts/utils/Strings.sol +0 -94
  298. package/lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol +0 -174
  299. package/lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol +0 -160
  300. package/lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol +0 -232
  301. package/lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol +0 -86
  302. package/lib/openzeppelin-contracts/contracts/utils/cryptography/SignatureChecker.sol +0 -48
  303. package/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol +0 -27
  304. package/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol +0 -124
  305. package/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol +0 -25
  306. package/lib/openzeppelin-contracts/contracts/utils/math/Math.sol +0 -415
  307. package/lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol +0 -1153
  308. package/lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol +0 -43
  309. package/lib/openzeppelin-contracts/contracts/utils/structs/BitMaps.sol +0 -60
  310. package/lib/openzeppelin-contracts/contracts/utils/structs/Checkpoints.sol +0 -603
  311. package/lib/openzeppelin-contracts/contracts/utils/structs/DoubleEndedQueue.sol +0 -169
  312. package/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol +0 -533
  313. package/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol +0 -378
  314. package/lib/openzeppelin-contracts/contracts/utils/types/Time.sol +0 -130
  315. package/lib/openzeppelin-contracts/contracts/vendor/compound/ICompoundTimelock.sol +0 -86
  316. package/lib/openzeppelin-contracts/contracts/vendor/compound/LICENSE +0 -11
  317. package/lib/openzeppelin-contracts/docs/README.md +0 -16
  318. package/lib/openzeppelin-contracts/docs/antora.yml +0 -7
  319. package/lib/openzeppelin-contracts/docs/config.js +0 -21
  320. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-3a.png +0 -0
  321. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-3b.png +0 -0
  322. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-6.png +0 -0
  323. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack.png +0 -0
  324. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-deposit.png +0 -0
  325. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-mint.png +0 -0
  326. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-linear.png +0 -0
  327. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-loglog.png +0 -0
  328. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-loglogext.png +0 -0
  329. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-exec.png +0 -0
  330. package/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-vote.png +0 -0
  331. package/lib/openzeppelin-contracts/docs/modules/ROOT/nav.adoc +0 -23
  332. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/access-control.adoc +0 -204
  333. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/backwards-compatibility.adoc +0 -48
  334. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/crowdsales.adoc +0 -11
  335. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/drafts.adoc +0 -19
  336. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc1155.adoc +0 -145
  337. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20-supply.adoc +0 -71
  338. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20.adoc +0 -77
  339. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc4626.adoc +0 -214
  340. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc721.adoc +0 -79
  341. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/extending-contracts.adoc +0 -77
  342. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/faq.adoc +0 -13
  343. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/governance.adoc +0 -240
  344. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/index.adoc +0 -79
  345. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/tokens.adoc +0 -31
  346. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/upgradeable.adoc +0 -77
  347. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/utilities.adoc +0 -185
  348. package/lib/openzeppelin-contracts/docs/modules/ROOT/pages/wizard.adoc +0 -15
  349. package/lib/openzeppelin-contracts/docs/templates/contract.hbs +0 -111
  350. package/lib/openzeppelin-contracts/docs/templates/helpers.js +0 -46
  351. package/lib/openzeppelin-contracts/docs/templates/page.hbs +0 -4
  352. package/lib/openzeppelin-contracts/docs/templates/properties.js +0 -64
  353. package/lib/openzeppelin-contracts/foundry.toml +0 -10
  354. package/lib/openzeppelin-contracts/hardhat/env-artifacts.js +0 -24
  355. package/lib/openzeppelin-contracts/hardhat/env-contract.js +0 -25
  356. package/lib/openzeppelin-contracts/hardhat/ignore-unreachable-warnings.js +0 -45
  357. package/lib/openzeppelin-contracts/hardhat/skip-foundry-tests.js +0 -6
  358. package/lib/openzeppelin-contracts/hardhat/task-test-get-files.js +0 -25
  359. package/lib/openzeppelin-contracts/hardhat.config.js +0 -131
  360. package/lib/openzeppelin-contracts/lib/erc4626-tests/ERC4626.prop.sol +0 -404
  361. package/lib/openzeppelin-contracts/lib/erc4626-tests/ERC4626.test.sol +0 -349
  362. package/lib/openzeppelin-contracts/lib/erc4626-tests/LICENSE +0 -661
  363. package/lib/openzeppelin-contracts/lib/erc4626-tests/README.md +0 -116
  364. package/lib/openzeppelin-contracts/lib/forge-std/.github/workflows/ci.yml +0 -92
  365. package/lib/openzeppelin-contracts/lib/forge-std/.gitmodules +0 -3
  366. package/lib/openzeppelin-contracts/lib/forge-std/LICENSE-APACHE +0 -203
  367. package/lib/openzeppelin-contracts/lib/forge-std/LICENSE-MIT +0 -25
  368. package/lib/openzeppelin-contracts/lib/forge-std/README.md +0 -250
  369. package/lib/openzeppelin-contracts/lib/forge-std/foundry.toml +0 -21
  370. package/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/LICENSE +0 -674
  371. package/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/Makefile +0 -14
  372. package/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/default.nix +0 -4
  373. package/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/demo/demo.sol +0 -222
  374. package/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/package.json +0 -15
  375. package/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/test.sol +0 -469
  376. package/lib/openzeppelin-contracts/lib/forge-std/package.json +0 -16
  377. package/lib/openzeppelin-contracts/lib/forge-std/src/Base.sol +0 -31
  378. package/lib/openzeppelin-contracts/lib/forge-std/src/Script.sol +0 -26
  379. package/lib/openzeppelin-contracts/lib/forge-std/src/StdAssertions.sol +0 -209
  380. package/lib/openzeppelin-contracts/lib/forge-std/src/StdChains.sol +0 -189
  381. package/lib/openzeppelin-contracts/lib/forge-std/src/StdCheats.sol +0 -565
  382. package/lib/openzeppelin-contracts/lib/forge-std/src/StdError.sol +0 -15
  383. package/lib/openzeppelin-contracts/lib/forge-std/src/StdJson.sol +0 -179
  384. package/lib/openzeppelin-contracts/lib/forge-std/src/StdMath.sol +0 -43
  385. package/lib/openzeppelin-contracts/lib/forge-std/src/StdStorage.sol +0 -327
  386. package/lib/openzeppelin-contracts/lib/forge-std/src/StdUtils.sol +0 -123
  387. package/lib/openzeppelin-contracts/lib/forge-std/src/Test.sol +0 -28
  388. package/lib/openzeppelin-contracts/lib/forge-std/src/Vm.sol +0 -385
  389. package/lib/openzeppelin-contracts/lib/forge-std/src/console.sol +0 -1533
  390. package/lib/openzeppelin-contracts/lib/forge-std/src/console2.sol +0 -1546
  391. package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC1155.sol +0 -105
  392. package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC165.sol +0 -12
  393. package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC20.sol +0 -43
  394. package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC4626.sol +0 -190
  395. package/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC721.sol +0 -164
  396. package/lib/openzeppelin-contracts/lib/forge-std/test/StdAssertions.t.sol +0 -587
  397. package/lib/openzeppelin-contracts/lib/forge-std/test/StdChains.t.sol +0 -123
  398. package/lib/openzeppelin-contracts/lib/forge-std/test/StdCheats.t.sol +0 -305
  399. package/lib/openzeppelin-contracts/lib/forge-std/test/StdError.t.sol +0 -118
  400. package/lib/openzeppelin-contracts/lib/forge-std/test/StdMath.t.sol +0 -197
  401. package/lib/openzeppelin-contracts/lib/forge-std/test/StdStorage.t.sol +0 -283
  402. package/lib/openzeppelin-contracts/lib/forge-std/test/StdUtils.t.sol +0 -191
  403. package/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScript.sol +0 -10
  404. package/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol +0 -10
  405. package/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTest.sol +0 -10
  406. package/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTestBase.sol +0 -10
  407. package/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/broadcast.log.json +0 -187
  408. package/lib/openzeppelin-contracts/logo.svg +0 -15
  409. package/lib/openzeppelin-contracts/netlify.toml +0 -3
  410. package/lib/openzeppelin-contracts/package-lock.json +0 -16544
  411. package/lib/openzeppelin-contracts/package.json +0 -96
  412. package/lib/openzeppelin-contracts/remappings.txt +0 -1
  413. package/lib/openzeppelin-contracts/renovate.json +0 -4
  414. package/lib/openzeppelin-contracts/requirements.txt +0 -1
  415. package/lib/openzeppelin-contracts/scripts/checks/compare-layout.js +0 -20
  416. package/lib/openzeppelin-contracts/scripts/checks/compareGasReports.js +0 -243
  417. package/lib/openzeppelin-contracts/scripts/checks/extract-layout.js +0 -38
  418. package/lib/openzeppelin-contracts/scripts/checks/generation.sh +0 -6
  419. package/lib/openzeppelin-contracts/scripts/checks/inheritance-ordering.js +0 -54
  420. package/lib/openzeppelin-contracts/scripts/gen-nav.js +0 -41
  421. package/lib/openzeppelin-contracts/scripts/generate/format-lines.js +0 -16
  422. package/lib/openzeppelin-contracts/scripts/generate/run.js +0 -49
  423. package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.js +0 -247
  424. package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.opts.js +0 -17
  425. package/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.t.js +0 -146
  426. package/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableMap.js +0 -283
  427. package/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableSet.js +0 -250
  428. package/lib/openzeppelin-contracts/scripts/generate/templates/SafeCast.js +0 -126
  429. package/lib/openzeppelin-contracts/scripts/generate/templates/StorageSlot.js +0 -78
  430. package/lib/openzeppelin-contracts/scripts/generate/templates/conversion.js +0 -30
  431. package/lib/openzeppelin-contracts/scripts/git-user-config.sh +0 -6
  432. package/lib/openzeppelin-contracts/scripts/helpers.js +0 -37
  433. package/lib/openzeppelin-contracts/scripts/prepack.sh +0 -23
  434. package/lib/openzeppelin-contracts/scripts/prepare-docs.sh +0 -26
  435. package/lib/openzeppelin-contracts/scripts/release/format-changelog.js +0 -33
  436. package/lib/openzeppelin-contracts/scripts/release/synchronize-versions.js +0 -15
  437. package/lib/openzeppelin-contracts/scripts/release/update-comment.js +0 -34
  438. package/lib/openzeppelin-contracts/scripts/release/version.sh +0 -11
  439. package/lib/openzeppelin-contracts/scripts/release/workflow/exit-prerelease.sh +0 -8
  440. package/lib/openzeppelin-contracts/scripts/release/workflow/github-release.js +0 -48
  441. package/lib/openzeppelin-contracts/scripts/release/workflow/integrity-check.sh +0 -20
  442. package/lib/openzeppelin-contracts/scripts/release/workflow/pack.sh +0 -26
  443. package/lib/openzeppelin-contracts/scripts/release/workflow/publish.sh +0 -26
  444. package/lib/openzeppelin-contracts/scripts/release/workflow/rerun.js +0 -7
  445. package/lib/openzeppelin-contracts/scripts/release/workflow/set-changesets-pr-title.js +0 -17
  446. package/lib/openzeppelin-contracts/scripts/release/workflow/start.sh +0 -35
  447. package/lib/openzeppelin-contracts/scripts/release/workflow/state.js +0 -112
  448. package/lib/openzeppelin-contracts/scripts/remove-ignored-artifacts.js +0 -45
  449. package/lib/openzeppelin-contracts/scripts/solhint-custom/index.js +0 -84
  450. package/lib/openzeppelin-contracts/scripts/solhint-custom/package.json +0 -5
  451. package/lib/openzeppelin-contracts/scripts/update-docs-branch.js +0 -65
  452. package/lib/openzeppelin-contracts/scripts/upgradeable/README.md +0 -21
  453. package/lib/openzeppelin-contracts/scripts/upgradeable/patch-apply.sh +0 -19
  454. package/lib/openzeppelin-contracts/scripts/upgradeable/patch-save.sh +0 -18
  455. package/lib/openzeppelin-contracts/scripts/upgradeable/transpile-onto.sh +0 -54
  456. package/lib/openzeppelin-contracts/scripts/upgradeable/transpile.sh +0 -47
  457. package/lib/openzeppelin-contracts/scripts/upgradeable/upgradeable.patch +0 -360
  458. package/lib/openzeppelin-contracts/slither.config.json +0 -5
  459. package/lib/openzeppelin-contracts/solhint.config.js +0 -20
  460. package/lib/openzeppelin-contracts/test/TESTING.md +0 -3
  461. package/lib/openzeppelin-contracts/test/access/AccessControl.behavior.js +0 -909
  462. package/lib/openzeppelin-contracts/test/access/AccessControl.test.js +0 -12
  463. package/lib/openzeppelin-contracts/test/access/Ownable.test.js +0 -72
  464. package/lib/openzeppelin-contracts/test/access/Ownable2Step.test.js +0 -70
  465. package/lib/openzeppelin-contracts/test/access/extensions/AccessControlDefaultAdminRules.test.js +0 -26
  466. package/lib/openzeppelin-contracts/test/access/extensions/AccessControlEnumerable.test.js +0 -17
  467. package/lib/openzeppelin-contracts/test/access/manager/AccessManaged.test.js +0 -142
  468. package/lib/openzeppelin-contracts/test/access/manager/AccessManager.behavior.js +0 -711
  469. package/lib/openzeppelin-contracts/test/access/manager/AccessManager.test.js +0 -2683
  470. package/lib/openzeppelin-contracts/test/access/manager/AuthorityUtils.test.js +0 -91
  471. package/lib/openzeppelin-contracts/test/finance/VestingWallet.behavior.js +0 -59
  472. package/lib/openzeppelin-contracts/test/finance/VestingWallet.test.js +0 -69
  473. package/lib/openzeppelin-contracts/test/governance/Governor.t.sol +0 -55
  474. package/lib/openzeppelin-contracts/test/governance/Governor.test.js +0 -1024
  475. package/lib/openzeppelin-contracts/test/governance/TimelockController.test.js +0 -1286
  476. package/lib/openzeppelin-contracts/test/governance/extensions/GovernorERC721.test.js +0 -116
  477. package/lib/openzeppelin-contracts/test/governance/extensions/GovernorPreventLateQuorum.test.js +0 -195
  478. package/lib/openzeppelin-contracts/test/governance/extensions/GovernorStorage.test.js +0 -150
  479. package/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockAccess.test.js +0 -777
  480. package/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockCompound.test.js +0 -441
  481. package/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockControl.test.js +0 -515
  482. package/lib/openzeppelin-contracts/test/governance/extensions/GovernorVotesQuorumFraction.test.js +0 -167
  483. package/lib/openzeppelin-contracts/test/governance/extensions/GovernorWithParams.test.js +0 -277
  484. package/lib/openzeppelin-contracts/test/governance/utils/EIP6372.behavior.js +0 -23
  485. package/lib/openzeppelin-contracts/test/governance/utils/Votes.behavior.js +0 -360
  486. package/lib/openzeppelin-contracts/test/governance/utils/Votes.test.js +0 -92
  487. package/lib/openzeppelin-contracts/test/helpers/access-manager.js +0 -69
  488. package/lib/openzeppelin-contracts/test/helpers/account.js +0 -14
  489. package/lib/openzeppelin-contracts/test/helpers/chainid.js +0 -10
  490. package/lib/openzeppelin-contracts/test/helpers/constants.js +0 -7
  491. package/lib/openzeppelin-contracts/test/helpers/create.js +0 -22
  492. package/lib/openzeppelin-contracts/test/helpers/customError.js +0 -43
  493. package/lib/openzeppelin-contracts/test/helpers/eip712.js +0 -67
  494. package/lib/openzeppelin-contracts/test/helpers/enums.js +0 -11
  495. package/lib/openzeppelin-contracts/test/helpers/erc1967.js +0 -43
  496. package/lib/openzeppelin-contracts/test/helpers/governance.js +0 -253
  497. package/lib/openzeppelin-contracts/test/helpers/iterate.js +0 -16
  498. package/lib/openzeppelin-contracts/test/helpers/math.js +0 -11
  499. package/lib/openzeppelin-contracts/test/helpers/methods.js +0 -5
  500. package/lib/openzeppelin-contracts/test/helpers/sign.js +0 -63
  501. package/lib/openzeppelin-contracts/test/helpers/time.js +0 -17
  502. package/lib/openzeppelin-contracts/test/helpers/txpool.js +0 -38
  503. package/lib/openzeppelin-contracts/test/metatx/ERC2771Context.test.js +0 -134
  504. package/lib/openzeppelin-contracts/test/metatx/ERC2771Forwarder.t.sol +0 -165
  505. package/lib/openzeppelin-contracts/test/metatx/ERC2771Forwarder.test.js +0 -541
  506. package/lib/openzeppelin-contracts/test/proxy/Clones.behaviour.js +0 -136
  507. package/lib/openzeppelin-contracts/test/proxy/Clones.test.js +0 -62
  508. package/lib/openzeppelin-contracts/test/proxy/ERC1967/ERC1967Proxy.test.js +0 -12
  509. package/lib/openzeppelin-contracts/test/proxy/ERC1967/ERC1967Utils.test.js +0 -172
  510. package/lib/openzeppelin-contracts/test/proxy/Proxy.behaviour.js +0 -182
  511. package/lib/openzeppelin-contracts/test/proxy/beacon/BeaconProxy.test.js +0 -152
  512. package/lib/openzeppelin-contracts/test/proxy/beacon/UpgradeableBeacon.test.js +0 -54
  513. package/lib/openzeppelin-contracts/test/proxy/transparent/ProxyAdmin.test.js +0 -103
  514. package/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js +0 -413
  515. package/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.test.js +0 -24
  516. package/lib/openzeppelin-contracts/test/proxy/utils/Initializable.test.js +0 -220
  517. package/lib/openzeppelin-contracts/test/proxy/utils/UUPSUpgradeable.test.js +0 -131
  518. package/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.behavior.js +0 -905
  519. package/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.test.js +0 -252
  520. package/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Burnable.test.js +0 -71
  521. package/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Pausable.test.js +0 -113
  522. package/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Supply.test.js +0 -116
  523. package/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155URIStorage.test.js +0 -66
  524. package/lib/openzeppelin-contracts/test/token/ERC1155/utils/ERC1155Holder.test.js +0 -64
  525. package/lib/openzeppelin-contracts/test/token/ERC20/ERC20.behavior.js +0 -340
  526. package/lib/openzeppelin-contracts/test/token/ERC20/ERC20.test.js +0 -202
  527. package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.behavior.js +0 -116
  528. package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.test.js +0 -20
  529. package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.behavior.js +0 -31
  530. package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.test.js +0 -24
  531. package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20FlashMint.test.js +0 -210
  532. package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Pausable.test.js +0 -136
  533. package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Permit.test.js +0 -118
  534. package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Votes.test.js +0 -593
  535. package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Wrapper.test.js +0 -211
  536. package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC4626.t.sol +0 -41
  537. package/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC4626.test.js +0 -1109
  538. package/lib/openzeppelin-contracts/test/token/ERC20/utils/SafeERC20.test.js +0 -240
  539. package/lib/openzeppelin-contracts/test/token/ERC721/ERC721.behavior.js +0 -978
  540. package/lib/openzeppelin-contracts/test/token/ERC721/ERC721.test.js +0 -15
  541. package/lib/openzeppelin-contracts/test/token/ERC721/ERC721Enumerable.test.js +0 -20
  542. package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Burnable.test.js +0 -82
  543. package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Consecutive.t.sol +0 -181
  544. package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Consecutive.test.js +0 -221
  545. package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Pausable.test.js +0 -90
  546. package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Royalty.test.js +0 -47
  547. package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721URIStorage.test.js +0 -114
  548. package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Votes.test.js +0 -183
  549. package/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Wrapper.test.js +0 -289
  550. package/lib/openzeppelin-contracts/test/token/ERC721/utils/ERC721Holder.test.js +0 -22
  551. package/lib/openzeppelin-contracts/test/token/common/ERC2981.behavior.js +0 -169
  552. package/lib/openzeppelin-contracts/test/utils/Address.test.js +0 -340
  553. package/lib/openzeppelin-contracts/test/utils/Arrays.test.js +0 -123
  554. package/lib/openzeppelin-contracts/test/utils/Base64.test.js +0 -33
  555. package/lib/openzeppelin-contracts/test/utils/Context.behavior.js +0 -42
  556. package/lib/openzeppelin-contracts/test/utils/Context.test.js +0 -17
  557. package/lib/openzeppelin-contracts/test/utils/Create2.test.js +0 -102
  558. package/lib/openzeppelin-contracts/test/utils/Multicall.test.js +0 -69
  559. package/lib/openzeppelin-contracts/test/utils/Nonces.test.js +0 -71
  560. package/lib/openzeppelin-contracts/test/utils/Pausable.test.js +0 -86
  561. package/lib/openzeppelin-contracts/test/utils/ReentrancyGuard.test.js +0 -44
  562. package/lib/openzeppelin-contracts/test/utils/ShortStrings.t.sol +0 -55
  563. package/lib/openzeppelin-contracts/test/utils/ShortStrings.test.js +0 -55
  564. package/lib/openzeppelin-contracts/test/utils/StorageSlot.test.js +0 -210
  565. package/lib/openzeppelin-contracts/test/utils/Strings.test.js +0 -153
  566. package/lib/openzeppelin-contracts/test/utils/cryptography/ECDSA.test.js +0 -245
  567. package/lib/openzeppelin-contracts/test/utils/cryptography/EIP712.test.js +0 -111
  568. package/lib/openzeppelin-contracts/test/utils/cryptography/MerkleProof.test.js +0 -207
  569. package/lib/openzeppelin-contracts/test/utils/cryptography/MessageHashUtils.test.js +0 -55
  570. package/lib/openzeppelin-contracts/test/utils/cryptography/SignatureChecker.test.js +0 -87
  571. package/lib/openzeppelin-contracts/test/utils/introspection/ERC165.test.js +0 -11
  572. package/lib/openzeppelin-contracts/test/utils/introspection/ERC165Checker.test.js +0 -300
  573. package/lib/openzeppelin-contracts/test/utils/introspection/SupportsInterface.behavior.js +0 -144
  574. package/lib/openzeppelin-contracts/test/utils/math/Math.t.sol +0 -216
  575. package/lib/openzeppelin-contracts/test/utils/math/Math.test.js +0 -469
  576. package/lib/openzeppelin-contracts/test/utils/math/SafeCast.test.js +0 -161
  577. package/lib/openzeppelin-contracts/test/utils/math/SignedMath.test.js +0 -95
  578. package/lib/openzeppelin-contracts/test/utils/structs/BitMap.test.js +0 -145
  579. package/lib/openzeppelin-contracts/test/utils/structs/Checkpoints.t.sol +0 -332
  580. package/lib/openzeppelin-contracts/test/utils/structs/Checkpoints.test.js +0 -158
  581. package/lib/openzeppelin-contracts/test/utils/structs/DoubleEndedQueue.test.js +0 -99
  582. package/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.behavior.js +0 -178
  583. package/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.test.js +0 -149
  584. package/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.behavior.js +0 -129
  585. package/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.test.js +0 -79
  586. 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
- // ASCII Art Banner
102
+ // Simple header
102
103
  function showBanner() {
103
104
  console.log(`
104
- ${c.cyan} ██████╗ █████╗ ██╗ ██╗ ██╗ ██████╗ ██████╗ ███████╗████████╗███████╗██████╗
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.bright}${c.cyan}═══════════════════════════════════════════════════════════${c.reset}`);
208
- console.log(`${c.bright} 🦞 Pay Lobster Setup Wizard${c.reset}`);
209
- console.log(`${c.bright}${c.cyan}═══════════════════════════════════════════════════════════${c.reset}\n`);
210
- console.log(`${c.dim}This wizard will help you configure Pay Lobster for your AI agent.${c.reset}`);
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(`${c.yellow}Step 1/4:${c.reset} ${c.bright}Agent Name${c.reset}`);
214
- console.log(`${c.dim}Give your agent a name for the registry.${c.reset}\n`);
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(`${c.green}✓${c.reset} Agent: ${c.bright}${config.agentName}${c.reset}\n`);
209
+ console.log(` ${c.green}✓${c.reset} ${config.agentName}\n`);
218
210
  // Step 2: Network Selection
219
- console.log(`${c.yellow}Step 2/4:${c.reset} ${c.bright}Network${c.reset}`);
220
- console.log(`${c.dim}Choose your network. Use testnet for development.${c.reset}\n`);
221
- console.log(` ${c.cyan}1)${c.reset} Base Mainnet ${c.dim}(production, real USDC)${c.reset}`);
222
- console.log(` ${c.cyan}2)${c.reset} Base Sepolia ${c.dim}(testnet, free test USDC)${c.reset}\n`);
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(`${c.green}✓${c.reset} Network: ${c.yellow}Base Sepolia (Testnet)${c.reset}\n`);
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(`${c.green}✓${c.reset} Network: ${c.bright}Base Mainnet${c.reset}\n`);
223
+ console.log(` ${c.green}✓${c.reset} Base Mainnet\n`);
233
224
  }
234
225
  // Step 3: Wallet Setup
235
- console.log(`${c.yellow}Step 3/4:${c.reset} ${c.bright}Wallet Setup${c.reset}`);
236
- console.log(`${c.dim}You need a wallet to send and receive USDC.${c.reset}\n`);
237
- console.log(` ${c.cyan}1)${c.reset} Generate new wallet ${c.dim}(recommended for new users)${c.reset}`);
238
- console.log(` ${c.cyan}2)${c.reset} Import existing private key ${c.dim}(for existing wallets)${c.reset}`);
239
- console.log(` ${c.cyan}3)${c.reset} Skip for now ${c.dim}(read-only mode)${c.reset}\n`);
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!\n`);
246
- console.log(`${c.bright}${c.cyan}┌─────────────────────────────────────────────────────────────┐${c.reset}`);
247
- console.log(`${c.bright}${c.cyan}│${c.reset} ${c.bright}⚠️ SAVE THIS INFORMATION SECURELY!${c.reset} ${c.cyan}│${c.reset}`);
248
- console.log(`${c.bright}${c.cyan}├─────────────────────────────────────────────────────────────┤${c.reset}`);
249
- console.log(`${c.cyan}│${c.reset} Address: ${c.green}${wallet.address}${c.reset} ${c.cyan}│${c.reset}`);
250
- console.log(`${c.cyan}│${c.reset} Private Key: ${c.yellow}${wallet.privateKey.slice(0, 20)}...${c.reset} ${c.cyan}│${c.reset}`);
251
- console.log(`${c.bright}${c.cyan}└─────────────────────────────────────────────────────────────┘${c.reset}`);
252
- console.log(`\n${c.red}${c.bright}IMPORTANT:${c.reset} ${c.dim}Write down your private key and store it safely.${c.reset}`);
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 your private key (input is hidden):${c.reset}\n`);
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, `${c.green}❯${c.reset} Private key: `);
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
- console.log(`${c.green}✓${c.reset} Wallet imported: ${c.bright}${address}${c.reset}\n`);
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(`${c.red}✗${c.reset} Invalid private key. Please try again.\n`);
259
+ console.log(` ${c.red}✗${c.reset} Invalid key\n`);
271
260
  }
272
261
  }
273
262
  }
274
263
  else {
275
- console.log(`${c.yellow}⚠${c.reset} Skipping wallet setup. You'll only be able to read data.\n`);
264
+ console.log(` ${c.dim}Skipped. Read-only mode.${c.reset}\n`);
276
265
  }
277
266
  // Step 4: Verify & Complete
278
- console.log(`${c.yellow}Step 4/4:${c.reset} ${c.bright}Verification${c.reset}\n`);
267
+ console.log(` ${c.dim}Step 4/4: Verification${c.reset}\n`);
279
268
  // Test RPC connection
280
- process.stdout.write(`${c.dim}Testing connection to ${config.network}...${c.reset} `);
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} Connected (block #${blockNumber})`);
273
+ console.log(`${c.green}✓${c.reset} Block #${blockNumber}`);
285
274
  }
286
275
  catch (e) {
287
- console.log(`${c.red}✗${c.reset} Failed to connect`);
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(`${c.dim}Checking USDC balance...${c.reset} `);
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} ${formatted} USDC`);
291
+ console.log(`${c.green}✓${c.reset} $${formatted} USDC`);
303
292
  }
304
293
  catch (e) {
305
- console.log(`${c.yellow}⚠${c.reset} Could not fetch balance`);
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} Configuration saved to ${c.dim}${CONFIG_FILE}${c.reset}\n`);
312
- // Success message
313
- console.log(`${c.bright}${c.green}═══════════════════════════════════════════════════════════${c.reset}`);
314
- console.log(`${c.bright}${c.green} 🦞 Setup Complete!${c.reset}`);
315
- console.log(`${c.bright}${c.green}═══════════════════════════════════════════════════════════${c.reset}\n`);
316
- console.log(`${c.bright}Quick Start:${c.reset}\n`);
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
- console.log(`${c.dim}Fund your wallet with USDC on Base:${c.reset}`);
325
- console.log(`${c.cyan}${address}${c.reset}\n`);
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.bright}Pay Lobster CLI${c.reset} - Payment infrastructure for AI agents
316
+ ${c.blue}🦞 Pay Lobster${c.reset} v3.1.0
335
317
 
336
- ${c.bright}USAGE${c.reset}
337
- paylobster <command> [options]
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}COMMANDS${c.reset}
340
- ${c.cyan}setup${c.reset} Run the setup wizard
341
- ${c.cyan}balance${c.reset} Check USDC balance
342
- ${c.cyan}send <amount> <to>${c.reset} Send USDC to address or agent
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}EXAMPLES${c.reset}
380
- ${c.dim}# Send 25 USDC to another agent${c.reset}
381
- paylobster send 25.00 agent:DataAnalyzer
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.dim}# Create escrow for a job${c.reset}
384
- paylobster escrow create 500 agent:WebDevBot --milestone "Landing page"
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.dim}# Check an agent's reputation${c.reset}
387
- paylobster trust agent:WebDevBot
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.bright}V3 CONTRACTS (Base Mainnet)${c.reset}
390
- Identity: ${c.dim}${V3_CONTRACTS.identity}${c.reset}
391
- Reputation: ${c.dim}${V3_CONTRACTS.reputation}${c.reset}
392
- Credit: ${c.dim}${V3_CONTRACTS.credit}${c.reset}
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}Documentation: https://paylobster.com/docs${c.reset}
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
- console.log(`\n${c.bright}Pay Lobster Configuration${c.reset}\n`);
402
- console.log(`${c.dim}Config file: ${CONFIG_FILE}${c.reset}\n`);
403
- console.log(` Agent Name: ${c.cyan}${config.agentName || 'Not set'}${c.reset}`);
404
- console.log(` Network: ${c.cyan}${config.network}${c.reset}`);
405
- console.log(` RPC URL: ${c.dim}${config.rpcUrl}${c.reset}`);
406
- if (config.privateKey) {
407
- const address = getAddress(config.privateKey);
408
- console.log(` Wallet: ${c.green}${address}${c.reset}`);
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(`${c.red}✗${c.reset} No wallet configured. Run ${c.cyan}paylobster setup${c.reset} first.`);
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(`${c.cyan}┌─────────────────────────────────────┐${c.reset}`);
439
- console.log(`${c.cyan}│${c.reset} ${c.bright}💰 Wallet Balance${c.reset} ${c.cyan}│${c.reset}`);
440
- console.log(`${c.cyan}├─────────────────────────────────────┤${c.reset}`);
441
- console.log(`${c.cyan}│${c.reset} USDC: ${c.green}${formatted.padStart(15)} USDC${c.reset} ${c.cyan}│${c.reset}`);
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(`${c.red}✗${c.reset} Error: ${e.message}`);
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(`${c.red}✗${c.reset} No wallet configured. Run ${c.cyan}paylobster setup${c.reset} first.`);
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.bright}Your Pay Lobster Wallet${c.reset}\n`);
460
- console.log(`${c.cyan}┌─────────────────────────────────────────────────┐${c.reset}`);
461
- console.log(`${c.cyan}│${c.reset} ${c.green}${address}${c.reset} ${c.cyan}│${c.reset}`);
462
- console.log(`${c.cyan}└─────────────────────────────────────────────────┘${c.reset}`);
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(`${c.red}✗${c.reset} No wallet configured. Run ${c.cyan}paylobster setup${c.reset} first.`);
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(`${c.dim}Examples:${c.reset}`);
478
- console.log(` ${c.cyan}paylobster swap 0.01 ETH to USDC${c.reset}`);
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(`${c.red}✗${c.reset} Invalid swap format. Use: swap <amount> <from> to <to>`);
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(`${c.dim}Getting quote for ${amount} ${fromToken} → ${toToken}...${c.reset}\n`);
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
- console.log(`${c.cyan}┌─────────────────────────────────────┐${c.reset}`);
499
- console.log(`${c.cyan}│${c.reset} ${c.bright}Swap Quote${c.reset} ${c.cyan}│${c.reset}`);
500
- console.log(`${c.cyan}├─────────────────────────────────────┤${c.reset}`);
501
- console.log(`${c.cyan}│${c.reset} Sell: ${c.yellow}${quote.sellAmount.padStart(15)} ${quote.sellToken}${c.reset} ${c.cyan}│${c.reset}`);
502
- console.log(`${c.cyan}│${c.reset} Buy: ${c.green}${parseFloat(quote.buyAmount).toFixed(6).padStart(15)} ${quote.buyToken}${c.reset} ${c.cyan}│${c.reset}`);
503
- console.log(`${c.cyan}│${c.reset} Rate: ${c.dim}1 ${quote.sellToken} = ${quote.price} ${quote.buyToken}${c.reset} ${c.cyan}│${c.reset}`);
504
- console.log(`${c.cyan}└─────────────────────────────────────┘${c.reset}`);
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(`\n${c.dim}Route: ${quote.sources.map(s => s.name).join(' → ')}${c.reset}`);
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(`\n${c.dim}Executing swap...${c.reset}`);
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
- console.log(`\n${c.green}✓ Swap Complete!${c.reset}\n`);
518
- console.log(` ${c.dim}TX:${c.reset} ${c.cyan}${result.hash}${c.reset}`);
519
- console.log(` ${c.dim}Sold:${c.reset} ${result.fromAmount} ${result.fromToken}`);
520
- console.log(` ${c.dim}Bought:${c.reset} ${c.green}${result.toAmount} ${result.toToken}${c.reset}`);
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} Swap failed: ${e.message}\n`);
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(`${c.dim}Examples:${c.reset}`);
532
- console.log(` ${c.cyan}paylobster quote ETH USDC${c.reset} ${c.dim}(quote for 1 ETH)${c.reset}`);
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
- console.log(`${c.cyan}┌─────────────────────────────────────┐${c.reset}`);
547
- console.log(`${c.cyan}│${c.reset} ${c.bright}💱 Swap Quote${c.reset} ${c.cyan}│${c.reset}`);
548
- console.log(`${c.cyan}├─────────────────────────────────────┤${c.reset}`);
549
- console.log(`${c.cyan}│${c.reset} Sell: ${c.yellow}${quote.sellAmount.padStart(15)} ${quote.sellToken}${c.reset} ${c.cyan}│${c.reset}`);
550
- console.log(`${c.cyan}│${c.reset} Buy: ${c.green}${parseFloat(quote.buyAmount).toFixed(6).padStart(15)} ${quote.buyToken}${c.reset} ${c.cyan}│${c.reset}`);
551
- console.log(`${c.cyan}├─────────────────────────────────────┤${c.reset}`);
552
- console.log(`${c.cyan}│${c.reset} Rate: ${c.bright}1 ${quote.sellToken} = ${quote.price} ${quote.buyToken}${c.reset} ${c.cyan}│${c.reset}`);
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(`\n${c.dim}Best route: ${quote.sources.map(s => s.name).join(' + ')}${c.reset}`);
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(`${c.red}✗${c.reset} Quote failed: ${e.message}\n`);
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.cyan}┌─────────────────────────────────────────────────┐${c.reset}
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
- ${c.dim}────────────────────────────────────────${c.reset}
579
-
580
- ${c.bright}📈 Today's Volume:${c.reset} ${c.green}$${formatNumber(todayVolume)} USDC${c.reset}
581
- ${c.bright}👥 Tracked Wallets:${c.reset} ${globalStats.trackedWallets.length}
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}Last Updated: ${new Date(globalStats.lastUpdated).toLocaleString()}${c.reset}
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(`${c.dim} No transactions recorded yet.${c.reset}`);
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(`${c.dim} Rank Address Volume Txs${c.reset}`);
601
- console.log(`${c.dim} ──── ────────────────────── ───────────── ───${c.reset}`);
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 = ('$' + formatNumber(entry.totalVolume)).padStart(12);
606
- console.log(` ${medal} #${entry.rank} ${addr} ${c.green}${vol}${c.reset} ${entry.transactions}`);
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(`${c.red}✗${c.reset} No wallet configured. Run ${c.cyan}paylobster setup${c.reset} first.`);
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.bright}Fund Your Wallet${c.reset} - Add USDC with a card via Coinbase Pay
630
-
631
- ${c.bright}USAGE${c.reset}
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
- console.log(`${c.cyan}┌─────────────────────────────────────────────────┐${c.reset}`);
659
- console.log(`${c.cyan}│${c.reset} 💳 ${c.bright}FUND YOUR WALLET${c.reset} ${c.cyan}│${c.reset}`);
660
- console.log(`${c.cyan}├─────────────────────────────────────────────────┤${c.reset}`);
661
- console.log(`${c.cyan}│${c.reset} Amount: ${c.green}$${amount} USD → USDC${c.reset} ${c.cyan}│${c.reset}`);
662
- console.log(`${c.cyan}│${c.reset} To: ${c.dim}${address.slice(0, 10)}...${address.slice(-6)}${c.reset} ${c.cyan}│${c.reset}`);
663
- console.log(`${c.cyan}├─────────────────────────────────────────────────┤${c.reset}`);
664
- console.log(`${c.cyan}│${c.reset} ${c.bright}Open this URL to complete purchase:${c.reset} ${c.cyan}│${c.reset}`);
665
- console.log(`${c.cyan}└─────────────────────────────────────────────────┘${c.reset}`);
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(`${c.red}✗${c.reset} Failed to generate URL: ${e.message}\n`);
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
- console.log(`\n${c.dim}Checking credit score for ${address}...${c.reset}\n`);
596
+ shortAddr = address.slice(0, 6) + '...' + address.slice(-4);
689
597
  }
690
598
  else {
691
599
  if (!config.privateKey) {
692
- console.log(`${c.red}✗${c.reset} No wallet configured. Run ${c.cyan}paylobster setup${c.reset} first.`);
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
- console.log(`\n${c.dim}Checking your credit score...${c.reset}\n`);
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(`${c.cyan}┌─────────────────────────────────────┐${c.reset}`);
704
- console.log(`${c.cyan}│${c.reset} ${c.bright}🎯 LOBSTER Credit Score${c.reset} ${c.cyan}│${c.reset}`);
705
- console.log(`${c.cyan}├─────────────────────────────────────┤${c.reset}`);
706
- console.log(`${c.cyan}│${c.reset} Score: ${c.green}${scoreNum} / 850${c.reset} ${starStr} ${c.cyan}│${c.reset}`);
707
- console.log(`${c.cyan}│${c.reset} Tier: ${c.bright}${tier}${c.reset}${''.padStart(24 - tier.length)}${c.cyan}│${c.reset}`);
708
- console.log(`${c.cyan}└─────────────────────────────────────┘${c.reset}`);
709
- if (args.length === 0) {
710
- console.log(`\n${c.dim}Use ${c.cyan}paylobster credit${c.reset}${c.dim} to see your credit limit${c.reset}\n`);
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(`${c.red}✗${c.reset} Error: ${e.message}\n`);
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(`${c.red}✗${c.reset} No wallet configured. Run ${c.cyan}paylobster setup${c.reset} first.`);
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 = Number(ethers_1.ethers.formatUnits(limit, 6));
732
- const availableNum = Number(ethers_1.ethers.formatUnits(available, 6));
733
- const inUseNum = Number(ethers_1.ethers.formatUnits(inUse, 6));
734
- const utilization = limitNum > 0 ? ((inUseNum / limitNum) * 100).toFixed(1) : '0.0';
735
- console.log(`${c.cyan}┌─────────────────────────────────────┐${c.reset}`);
736
- console.log(`${c.cyan}│${c.reset} ${c.bright}💳 Your Credit Status${c.reset} ${c.cyan}│${c.reset}`);
737
- console.log(`${c.cyan}├─────────────────────────────────────┤${c.reset}`);
738
- console.log(`${c.cyan}│${c.reset} Tier: ${c.bright}${tier}${c.reset}${''.padStart(17 - String(tier).length)}${c.cyan}│${c.reset}`);
739
- console.log(`${c.cyan}│${c.reset} Credit Limit: ${c.green}$${limitNum.toFixed(2).padStart(10)}${c.reset} ${c.cyan}│${c.reset}`);
740
- console.log(`${c.cyan}│${c.reset} Available: ${c.green}$${availableNum.toFixed(2).padStart(10)}${c.reset} ${c.cyan}│${c.reset}`);
741
- console.log(`${c.cyan}│${c.reset} In Use: ${c.yellow}$${inUseNum.toFixed(2).padStart(10)}${c.reset} ${c.cyan}│${c.reset}`);
742
- console.log(`${c.cyan}│${c.reset} Utilization: ${utilization}%${''.padStart(14 - String(utilization).length)}${c.cyan}│${c.reset}`);
743
- console.log(`${c.cyan}└─────────────────────────────────────┘${c.reset}`);
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(`${c.red}✗${c.reset} Error: ${e.message}\n`);
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(`${c.red}✗${c.reset} No wallet configured. Run ${c.cyan}paylobster setup${c.reset} first.`);
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(`${c.cyan}┌─────────────────────────────────────┐${c.reset}`);
777
- console.log(`${c.cyan}│${c.reset} ${c.bright}🏆 Credit Tier Status${c.reset} ${c.cyan}│${c.reset}`);
778
- console.log(`${c.cyan}├─────────────────────────────────────┤${c.reset}`);
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(`\n${c.dim}Progress to ${nextTier.name}:${c.reset}`);
788
- console.log(`[${c.green}${progressBar}${c.reset}] ${scoreNum}/${nextTier.min} (${progress.toFixed(0)}%)`);
789
- console.log(`${c.dim}Need: +${needed} points${c.reset}\n`);
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(`\n${c.green}✓${c.reset} ${c.bright}You've reached the highest tier!${c.reset}\n`);
694
+ console.log(` ${c.green}✓${c.reset} Highest tier!\n`);
793
695
  }
794
696
  }
795
697
  catch (e) {
796
- console.log(`${c.red}✗${c.reset} Error: ${e.message}\n`);
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(`${c.red}✗${c.reset} No wallet configured. Run ${c.cyan}paylobster setup${c.reset} first.`);
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 = Number(ethers_1.ethers.formatUnits(history.borrowed, 6));
813
- const repaid = Number(ethers_1.ethers.formatUnits(history.repaid, 6));
814
- const active = Number(ethers_1.ethers.formatUnits(history.active, 6));
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
- console.log(`${c.cyan}┌─────────────────────────────────────┐${c.reset}`);
817
- console.log(`${c.cyan}│${c.reset} ${c.bright}📊 Credit History${c.reset} ${c.cyan}│${c.reset}`);
818
- console.log(`${c.cyan}├─────────────────────────────────────┤${c.reset}`);
819
- console.log(`${c.cyan}│${c.reset} Total Borrowed: $${borrowed.toFixed(2).padStart(10)} ${c.cyan}│${c.reset}`);
820
- console.log(`${c.cyan}│${c.reset} Total Repaid: $${repaid.toFixed(2).padStart(10)} ${c.cyan}│${c.reset}`);
821
- console.log(`${c.cyan}│${c.reset} Active Loans: $${active.toFixed(2).padStart(10)} ${c.cyan}│${c.reset}`);
822
- console.log(`${c.cyan}│${c.reset} Repayment Rate: ${c.green}${repaymentRate.toFixed(1)}%${c.reset} ⭐${''.padStart(8 - String(repaymentRate.toFixed(1)).length)}${c.cyan}│${c.reset}`);
823
- console.log(`${c.cyan}└─────────────────────────────────────┘${c.reset}`);
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(`${c.red}✗${c.reset} Error: ${e.message}\n`);
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(`${c.red}✗${c.reset} No wallet configured. Run ${c.cyan}paylobster setup${c.reset} first.`);
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(`${c.dim}Example:${c.reset} ${c.cyan}paylobster repay 47${c.reset}\n`);
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 = Number(ethers_1.ethers.formatUnits(loan.remaining, 6));
748
+ const remaining = parseFloat(ethers_1.ethers.formatUnits(loan.remaining, 6));
850
749
  if (remaining === 0) {
851
- console.log(`${c.green}✓${c.reset} Loan #${loanId} is already fully repaid!\n`);
750
+ console.log(`\n ${c.green}✓${c.reset} Loan #${loanId} already repaid\n`);
852
751
  return;
853
752
  }
854
- console.log(`${c.cyan}┌─────────────────────────────────────┐${c.reset}`);
855
- console.log(`${c.cyan}│${c.reset} ${c.bright}💳 Repaying Loan #${loanId}${c.reset}${''.padStart(16 - String(loanId).length)}${c.cyan}│${c.reset}`);
856
- console.log(`${c.cyan}├─────────────────────────────────────┤${c.reset}`);
857
- console.log(`${c.cyan}│${c.reset} Amount Due: $${remaining.toFixed(2).padStart(12)} ${c.cyan}│${c.reset}`);
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(`${c.dim}Waiting for confirmation...${c.reset}`);
760
+ console.log(` ${c.dim}…${c.reset} Confirming`);
865
761
  await tx.wait();
866
- console.log(`\n${c.green}✓ Loan Repaid!${c.reset}`);
867
- console.log(` ${c.dim}TX:${c.reset} ${c.cyan}${tx.hash}${c.reset}`);
868
- console.log(` ${c.dim}Amount:${c.reset} $${remaining.toFixed(2)}`);
869
- console.log(`\n ${c.dim}View: https://basescan.org/tx/${tx.hash}${c.reset}\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(`${c.red}✗${c.reset} Repayment failed: ${e.message}\n`);
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(`${c.red}✗${c.reset} No wallet configured. Run ${c.cyan}paylobster setup${c.reset} first.`);
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(`${c.dim}No active loans found.${c.reset}`);
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(`${c.cyan}┌─────────────────────────────────────────────────┐${c.reset}`);
894
- console.log(`${c.cyan}│${c.reset} ${c.bright}💳 Active Credit Loans${c.reset} ${c.cyan}│${c.reset}`);
895
- console.log(`${c.cyan}└─────────────────────────────────────────────────┘${c.reset}\n`);
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 = Number(ethers_1.ethers.formatUnits(loan.remaining, 6));
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
- let status = ' On Track';
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 = '✗ Overdue';
803
+ status = '✗';
910
804
  statusColor = c.red;
805
+ dueText = 'overdue';
911
806
  }
912
807
  else if (daysUntil < 3) {
913
- status = '⚠ Due Soon';
808
+ status = '⚠';
914
809
  statusColor = c.yellow;
915
810
  }
916
- console.log(` #${id.toString().padEnd(6)}$${remaining.toFixed(2).padStart(10)} ${daysUntil} days ${statusColor}${status}${c.reset}`);
811
+ console.log(` #${id.toString().padEnd(7)}$${remainingFmt.padStart(12)} ${dueText.padEnd(8)} ${statusColor}${status}${c.reset}`);
917
812
  }
918
- console.log(`${c.dim} ──────────────────────────────────────────────${c.reset}`);
919
- console.log(` ${c.bright}Total: $${totalDue.toFixed(2)}${c.reset}\n`);
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(`${c.red}✗${c.reset} Error: ${e.message}\n`);
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(`${c.dim}Example:${c.reset} ${c.cyan}paylobster loan 47${c.reset}\n`);
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 = Number(ethers_1.ethers.formatUnits(loan.original, 6));
940
- const remaining = Number(ethers_1.ethers.formatUnits(loan.remaining, 6));
941
- const paid = Number(ethers_1.ethers.formatUnits(loan.paid, 6));
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
- let status = ' On Track';
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 Full';
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 = '⚠ Payment Due Soon';
853
+ status = '⚠ Due soon';
957
854
  statusColor = c.yellow;
958
855
  }
959
- console.log(`${c.cyan}┌─────────────────────────────────────┐${c.reset}`);
960
- console.log(`${c.cyan}│${c.reset} ${c.bright}💳 Loan Details #${loanId}${c.reset}${''.padStart(14 - String(loanId).length)}${c.cyan}│${c.reset}`);
961
- console.log(`${c.cyan}├─────────────────────────────────────┤${c.reset}`);
962
- console.log(`${c.cyan}│${c.reset} Original: $${original.toFixed(2).padStart(12)} ${c.cyan}│${c.reset}`);
963
- console.log(`${c.cyan}│${c.reset} Remaining: $${remaining.toFixed(2).padStart(12)} ${c.cyan}│${c.reset}`);
964
- console.log(`${c.cyan}│${c.reset} Paid: $${paid.toFixed(2).padStart(12)} ${c.cyan}│${c.reset}`);
965
- console.log(`${c.cyan}├─────────────────────────────────────┤${c.reset}`);
966
- console.log(`${c.cyan}│${c.reset} Due: ${dueDate.toLocaleDateString().padEnd(12)} ${c.cyan}│${c.reset}`);
967
- console.log(`${c.cyan}│${c.reset} Days Until: ${daysUntil.toString().padEnd(12)} ${c.cyan}│${c.reset}`);
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(`${c.dim}To repay: ${c.cyan}paylobster repay ${loanId}${c.reset}\n`);
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(`${c.red}✗${c.reset} Error: ${e.message}\n`);
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
- console.log(`\n${c.dim}Checking reputation for ${address}...${c.reset}\n`);
883
+ shortAddr = address.slice(0, 6) + '...' + address.slice(-4);
991
884
  }
992
885
  else {
993
886
  if (!config.privateKey) {
994
- console.log(`${c.red}✗${c.reset} No wallet configured. Run ${c.cyan}paylobster setup${c.reset} first.`);
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
- console.log(`\n${c.dim}Fetching your reputation...${c.reset}\n`);
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
- const makeBar = (val) => {
1010
- const bars = Math.floor(val / 5);
1011
- return '█'.repeat(bars) + '░'.repeat(20 - bars);
1012
- };
1013
- console.log(`${c.cyan}┌─────────────────────────────────────────────────┐${c.reset}`);
1014
- console.log(`${c.cyan}│${c.reset} ${c.bright}🏆 Reputation Profile${c.reset} ${c.cyan}│${c.reset}`);
1015
- console.log(`${c.cyan}├─────────────────────────────────────────────────┤${c.reset}`);
1016
- console.log(`${c.cyan}│${c.reset} Overall: ${c.green}${overall}/100${c.reset} ${starStr}${''.padStart(30 - String(overall).length - starStr.length)}${c.cyan}│${c.reset}`);
1017
- console.log(`${c.cyan}├─────────────────────────────────────────────────┤${c.reset}`);
1018
- console.log(`${c.cyan}│${c.reset} Delivery: ${delivery}/100 [${c.green}${makeBar(delivery)}${c.reset}] ${c.cyan}│${c.reset}`);
1019
- console.log(`${c.cyan}│${c.reset} Communication: ${communication}/100 [${c.green}${makeBar(communication)}${c.reset}] ${c.cyan}│${c.reset}`);
1020
- console.log(`${c.cyan}│${c.reset} Quality: ${quality}/100 [${c.green}${makeBar(quality)}${c.reset}] ${c.cyan}│${c.reset}`);
1021
- console.log(`${c.cyan}│${c.reset} Reliability: ${reliability}/100 [${c.green}${makeBar(reliability)}${c.reset}] ${c.cyan}│${c.reset}`);
1022
- console.log(`${c.cyan}├─────────────────────────────────────────────────┤${c.reset}`);
1023
- console.log(`${c.cyan}│${c.reset} Total Ratings: ${totalRatings}${''.padStart(30 - String(totalRatings).length)}${c.cyan}│${c.reset}`);
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(`${c.red}✗${c.reset} Error: ${e.message}\n`);
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(`${c.red}✗${c.reset} No wallet configured. Run ${c.cyan}paylobster setup${c.reset} first.`);
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(`${c.dim}No trust history found.${c.reset}`);
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(`${c.cyan}┌─────────────────────────────────────────────────┐${c.reset}`);
1050
- console.log(`${c.cyan}│${c.reset} ${c.bright}📈 Trust History (Last 90 Days)${c.reset} ${c.cyan}│${c.reset}`);
1051
- console.log(`${c.cyan}└─────────────────────────────────────────────────┘${c.reset}\n`);
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(13)} ${score.toString().padStart(3)}/100 ${c.dim}${event}${c.reset}`);
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(`${c.red}✗${c.reset} Error: ${e.message}\n`);
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
- console.log(`\n${c.dim}Fetching identity for ${address}...${c.reset}\n`);
963
+ shortAddr = address.slice(0, 10) + '...' + address.slice(-8);
1076
964
  }
1077
965
  else {
1078
966
  if (!config.privateKey) {
1079
- console.log(`${c.red}✗${c.reset} No wallet configured. Run ${c.cyan}paylobster setup${c.reset} first.`);
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
- console.log(`\n${c.dim}Fetching your identity...${c.reset}\n`);
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(`${c.cyan}┌─────────────────────────────────────────────────┐${c.reset}`);
1092
- console.log(`${c.cyan}│${c.reset} ${c.bright}🆔 Agent Identity${c.reset} ${c.cyan}│${c.reset}`);
1093
- console.log(`${c.cyan}├─────────────────────────────────────────────────┤${c.reset}`);
1094
- console.log(`${c.cyan}│${c.reset} Token ID: #${tokenId}${''.padStart(35 - String(tokenId).length)}${c.cyan}│${c.reset}`);
1095
- console.log(`${c.cyan}│${c.reset} Name: ${c.bright}${name}${c.reset}${''.padStart(35 - name.length)}${c.cyan}│${c.reset}`);
1096
- console.log(`${c.cyan}│${c.reset} Address: ${address.slice(0, 10)}...${''.padStart(20)}${c.cyan}│${c.reset}`);
1097
- console.log(`${c.cyan}│${c.reset} Registered: ${daysAgo} days ago${''.padStart(26 - String(daysAgo).length)}${c.cyan}│${c.reset}`);
1098
- console.log(`${c.cyan}├─────────────────────────────────────────────────┤${c.reset}`);
1099
- console.log(`${c.cyan}│${c.reset} Capabilities:${''.padStart(34)}${c.cyan}│${c.reset}`);
1100
- for (const cap of capabilities) {
1101
- console.log(`${c.cyan}│${c.reset} • ${c.green}${cap}${c.reset}${''.padStart(41 - cap.length)}${c.cyan}│${c.reset}`);
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(`${c.red}✗${c.reset} Error: ${e.message}\n`);
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(`${c.dim}No agents registered yet.${c.reset}`);
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(`${c.cyan}┌─────────────────────────────────────────────────┐${c.reset}`);
1123
- console.log(`${c.cyan}│${c.reset} ${c.bright}🤖 Registered Agents${c.reset} ${c.cyan}│${c.reset}`);
1124
- console.log(`${c.cyan}└─────────────────────────────────────────────────┘${c.reset}\n`);
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(`${c.red}✗${c.reset} Error: ${e.message}\n`);
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.cyan}┌─────────────────────────────────────────────────┐${c.reset}`);
1144
- console.log(`${c.cyan}│${c.reset} ${c.bright}🛡️ Trust Gate Configuration${c.reset} ${c.cyan}│${c.reset}`);
1145
- console.log(`${c.cyan}├─────────────────────────────────────────────────┤${c.reset}`);
1146
- console.log(`${c.cyan}│${c.reset} Enabled: ${tg.enabled ? c.green + '✓ Yes' : c.red + '✗ No'}${c.reset}${''.padStart(29 - (tg.enabled ? 5 : 4))}${c.cyan}│${c.reset}`);
1147
- console.log(`${c.cyan}│${c.reset} Min Score: ${tg.minScore}${''.padStart(33 - String(tg.minScore).length)}${c.cyan}│${c.reset}`);
1148
- console.log(`${c.cyan}│${c.reset} Min Tier: ${tg.minTier}${''.padStart(33 - tg.minTier.length)}${c.cyan}│${c.reset}`);
1149
- console.log(`${c.cyan}│${c.reset} Allow Unscored: ${tg.allowUnscored ? c.yellow + 'Yes' : 'No'}${c.reset}${''.padStart(32 - (tg.allowUnscored ? 3 : 2))}${c.cyan}│${c.reset}`);
1150
- console.log(`${c.cyan}├─────────────────────────────────────────────────┤${c.reset}`);
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(`${c.cyan}│${c.reset} • ${short}${''.padStart(40 - short.length)}${c.cyan}│${c.reset}`);
1036
+ console.log(` • ${c.dim}${short}${c.reset}`);
1159
1037
  }
1160
1038
  if (tg.exceptions.length > 5) {
1161
- console.log(`${c.cyan}│${c.reset} ${c.dim}...and ${tg.exceptions.length - 5} more${c.reset}${''.padStart(30 - String(tg.exceptions.length - 5).length)}${c.cyan}│${c.reset}`);
1039
+ console.log(` ${c.dim}...and ${tg.exceptions.length - 5} more${c.reset}`);
1162
1040
  }
1163
1041
  }
1164
- console.log(`${c.cyan}└─────────────────────────────────────────────────┘${c.reset}\n`);
1042
+ console.log();
1165
1043
  if (!tg.enabled) {
1166
- console.log(`${c.dim}To enable: ${c.cyan}paylobster trust-gate set --enable${c.reset}\n`);
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.cyan}┌─────────────────────────────────────────────────┐${c.reset}`);
1275
- console.log(`${c.cyan}│${c.reset} ${c.bright}💰 Spending Limits Configuration${c.reset} ${c.cyan}│${c.reset}`);
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
- console.log(`${c.cyan}│${c.reset} ${c.bright}Global Limits:${c.reset}${''.padStart(32)}${c.cyan}│${c.reset}`);
1282
- console.log(`${c.cyan}│${c.reset} Max Transaction: $${ethers_1.ethers.formatUnits(gl.maxTransaction, 6).padStart(12)} USDC ${c.cyan}│${c.reset}`);
1283
- console.log(`${c.cyan}│${c.reset} Daily Limit: $${ethers_1.ethers.formatUnits(gl.dailyLimit, 6).padStart(12)} USDC ${c.cyan}│${c.reset}`);
1284
- console.log(`${c.cyan}│${c.reset} Weekly Limit: $${ethers_1.ethers.formatUnits(gl.weeklyLimit, 6).padStart(12)} USDC ${c.cyan}│${c.reset}`);
1285
- console.log(`${c.cyan}│${c.reset} Monthly Limit: $${ethers_1.ethers.formatUnits(gl.monthlyLimit, 6).padStart(12)} USDC ${c.cyan}│${c.reset}`);
1286
- console.log(`${c.cyan}├─────────────────────────────────────────────────┤${c.reset}`);
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(`${c.cyan}│${c.reset} ${c.bright}Current Usage:${c.reset}${''.padStart(32)}${c.cyan}│${c.reset}`);
1293
- console.log(`${c.cyan}│${c.reset} Daily: $${ethers_1.ethers.formatUnits(summary.daily, 6).padStart(8)} (${dailyPct.toFixed(0)}%)${''.padStart(20 - dailyPct.toFixed(0).length)}${c.cyan}│${c.reset}`);
1294
- console.log(`${c.cyan}│${c.reset} Weekly: $${ethers_1.ethers.formatUnits(summary.weekly, 6).padStart(8)} (${weeklyPct.toFixed(0)}%)${''.padStart(20 - weeklyPct.toFixed(0).length)}${c.cyan}│${c.reset}`);
1295
- console.log(`${c.cyan}│${c.reset} Monthly: $${ethers_1.ethers.formatUnits(summary.monthly, 6).padStart(8)} (${monthlyPct.toFixed(0)}%)${''.padStart(20 - monthlyPct.toFixed(0).length)}${c.cyan}│${c.reset}`);
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
- console.log(`${c.cyan}│${c.reset} ${c.bright}Per-Agent Limits (${perAgentCount}):${c.reset}${''.padStart(24 - String(perAgentCount).length)}${c.cyan}│${c.reset}`);
1300
- if (perAgentCount === 0) {
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(`${c.cyan}│${c.reset} ${short}: $${max}${''.padStart(33 - short.length - max.length)}${c.cyan}│${c.reset}`);
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(`${c.cyan}│${c.reset} ${c.dim}...and ${perAgentCount - 5} more${c.reset}${''.padStart(32 - String(perAgentCount - 5).length)}${c.cyan}│${c.reset}`);
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(`${c.dim}To enable: ${c.cyan}paylobster limits set-global --enable${c.reset}\n`);
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} Pay Lobster is not configured yet.\n`);
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
- console.log(`\n${c.yellow}⚠${c.reset} Send command coming soon!`);
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
- console.log(`\n${c.yellow}⚠${c.reset} Escrow commands coming soon!`);
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
- console.log(`\n${c.yellow}⚠${c.reset} Trust command coming soon!`);
1592
- console.log(`${c.dim}Registry: 0x10BCa62Ce136A70F914c56D97e491a85d1e050E7${c.reset}\n`);
1744
+ await handleTrust(args.slice(1));
1593
1745
  break;
1594
1746
  case 'discover':
1595
- console.log(`\n${c.yellow}⚠${c.reset} Discover command coming soon!`);
1596
- console.log(`${c.dim}Registry: 0x10BCa62Ce136A70F914c56D97e491a85d1e050E7${c.reset}\n`);
1747
+ await handleDiscover(args.slice(1));
1597
1748
  break;
1598
1749
  case 'register':
1599
- console.log(`\n${c.yellow}⚠${c.reset} Register command coming soon!`);
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(`${c.dim}Commands:${c.reset}`);
1672
- console.log(` status Show current trust-gate configuration`);
1673
- console.log(` set [options] Configure trust-gate settings`);
1674
- console.log(` add-exception <address> Whitelist an address`);
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(`${c.dim}Commands:${c.reset}`);
1699
- console.log(` status Show current spending limits`);
1700
- console.log(` set-global [opts] Configure global limits`);
1701
- console.log(` set <addr> [opts] Set per-agent limits`);
1702
- console.log(` remove <address> Remove per-agent limits`);
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.cyan}paylobster help${c.reset} to see available commands.\n`);
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);