clawcontract-cli 0.1.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 (146) hide show
  1. package/README.md +229 -0
  2. package/dist/analyzer/fallback.d.ts +28 -0
  3. package/dist/analyzer/fallback.d.ts.map +1 -0
  4. package/dist/analyzer/fallback.js +142 -0
  5. package/dist/analyzer/fallback.js.map +1 -0
  6. package/dist/analyzer/index.d.ts +24 -0
  7. package/dist/analyzer/index.d.ts.map +1 -0
  8. package/dist/analyzer/index.js +73 -0
  9. package/dist/analyzer/index.js.map +1 -0
  10. package/dist/analyzer/slither.d.ts +36 -0
  11. package/dist/analyzer/slither.d.ts.map +1 -0
  12. package/dist/analyzer/slither.js +92 -0
  13. package/dist/analyzer/slither.js.map +1 -0
  14. package/dist/cli/commands/analyze.d.ts +7 -0
  15. package/dist/cli/commands/analyze.d.ts.map +1 -0
  16. package/dist/cli/commands/analyze.js +74 -0
  17. package/dist/cli/commands/analyze.js.map +1 -0
  18. package/dist/cli/commands/create.d.ts +8 -0
  19. package/dist/cli/commands/create.d.ts.map +1 -0
  20. package/dist/cli/commands/create.js +44 -0
  21. package/dist/cli/commands/create.js.map +1 -0
  22. package/dist/cli/commands/delete.d.ts +5 -0
  23. package/dist/cli/commands/delete.d.ts.map +1 -0
  24. package/dist/cli/commands/delete.js +48 -0
  25. package/dist/cli/commands/delete.js.map +1 -0
  26. package/dist/cli/commands/deploy.d.ts +7 -0
  27. package/dist/cli/commands/deploy.d.ts.map +1 -0
  28. package/dist/cli/commands/deploy.js +130 -0
  29. package/dist/cli/commands/deploy.js.map +1 -0
  30. package/dist/cli/commands/featured.d.ts +4 -0
  31. package/dist/cli/commands/featured.d.ts.map +1 -0
  32. package/dist/cli/commands/featured.js +47 -0
  33. package/dist/cli/commands/featured.js.map +1 -0
  34. package/dist/cli/commands/full.d.ts +14 -0
  35. package/dist/cli/commands/full.d.ts.map +1 -0
  36. package/dist/cli/commands/full.js +72 -0
  37. package/dist/cli/commands/full.js.map +1 -0
  38. package/dist/cli/commands/generate.d.ts +10 -0
  39. package/dist/cli/commands/generate.d.ts.map +1 -0
  40. package/dist/cli/commands/generate.js +71 -0
  41. package/dist/cli/commands/generate.js.map +1 -0
  42. package/dist/cli/commands/info.d.ts +4 -0
  43. package/dist/cli/commands/info.d.ts.map +1 -0
  44. package/dist/cli/commands/info.js +76 -0
  45. package/dist/cli/commands/info.js.map +1 -0
  46. package/dist/cli/commands/interact.d.ts +7 -0
  47. package/dist/cli/commands/interact.d.ts.map +1 -0
  48. package/dist/cli/commands/interact.js +173 -0
  49. package/dist/cli/commands/interact.js.map +1 -0
  50. package/dist/cli/commands/list.d.ts +6 -0
  51. package/dist/cli/commands/list.d.ts.map +1 -0
  52. package/dist/cli/commands/list.js +37 -0
  53. package/dist/cli/commands/list.js.map +1 -0
  54. package/dist/cli/commands/register.d.ts +4 -0
  55. package/dist/cli/commands/register.d.ts.map +1 -0
  56. package/dist/cli/commands/register.js +54 -0
  57. package/dist/cli/commands/register.js.map +1 -0
  58. package/dist/cli/commands/verified.d.ts +9 -0
  59. package/dist/cli/commands/verified.d.ts.map +1 -0
  60. package/dist/cli/commands/verified.js +61 -0
  61. package/dist/cli/commands/verified.js.map +1 -0
  62. package/dist/cli/commands/verify.d.ts +9 -0
  63. package/dist/cli/commands/verify.d.ts.map +1 -0
  64. package/dist/cli/commands/verify.js +87 -0
  65. package/dist/cli/commands/verify.js.map +1 -0
  66. package/dist/cli/index.d.ts +3 -0
  67. package/dist/cli/index.d.ts.map +1 -0
  68. package/dist/cli/index.js +160 -0
  69. package/dist/cli/index.js.map +1 -0
  70. package/dist/cli/utils.d.ts +8 -0
  71. package/dist/cli/utils.d.ts.map +1 -0
  72. package/dist/cli/utils.js +36 -0
  73. package/dist/cli/utils.js.map +1 -0
  74. package/dist/config/chains.d.ts +18 -0
  75. package/dist/config/chains.d.ts.map +1 -0
  76. package/dist/config/chains.js +52 -0
  77. package/dist/config/chains.js.map +1 -0
  78. package/dist/config/clawcontractbook.d.ts +3 -0
  79. package/dist/config/clawcontractbook.d.ts.map +1 -0
  80. package/dist/config/clawcontractbook.js +3 -0
  81. package/dist/config/clawcontractbook.js.map +1 -0
  82. package/dist/config/index.d.ts +4 -0
  83. package/dist/config/index.d.ts.map +1 -0
  84. package/dist/config/index.js +3 -0
  85. package/dist/config/index.js.map +1 -0
  86. package/dist/constants/index.d.ts +3 -0
  87. package/dist/constants/index.d.ts.map +1 -0
  88. package/dist/constants/index.js +3 -0
  89. package/dist/constants/index.js.map +1 -0
  90. package/dist/deployer/compiler.d.ts +10 -0
  91. package/dist/deployer/compiler.d.ts.map +1 -0
  92. package/dist/deployer/compiler.js +93 -0
  93. package/dist/deployer/compiler.js.map +1 -0
  94. package/dist/deployer/deploy.d.ts +28 -0
  95. package/dist/deployer/deploy.d.ts.map +1 -0
  96. package/dist/deployer/deploy.js +60 -0
  97. package/dist/deployer/deploy.js.map +1 -0
  98. package/dist/deployer/hardhat-config-template.d.ts +2 -0
  99. package/dist/deployer/hardhat-config-template.d.ts.map +1 -0
  100. package/dist/deployer/hardhat-config-template.js +21 -0
  101. package/dist/deployer/hardhat-config-template.js.map +1 -0
  102. package/dist/deployer/index.d.ts +7 -0
  103. package/dist/deployer/index.d.ts.map +1 -0
  104. package/dist/deployer/index.js +4 -0
  105. package/dist/deployer/index.js.map +1 -0
  106. package/dist/deployer/metadata.d.ts +17 -0
  107. package/dist/deployer/metadata.d.ts.map +1 -0
  108. package/dist/deployer/metadata.js +317 -0
  109. package/dist/deployer/metadata.js.map +1 -0
  110. package/dist/deployer/wallet.d.ts +6 -0
  111. package/dist/deployer/wallet.d.ts.map +1 -0
  112. package/dist/deployer/wallet.js +15 -0
  113. package/dist/deployer/wallet.js.map +1 -0
  114. package/dist/generator/index.d.ts +2 -0
  115. package/dist/generator/index.d.ts.map +1 -0
  116. package/dist/generator/index.js +2 -0
  117. package/dist/generator/index.js.map +1 -0
  118. package/dist/generator/llm.d.ts +15 -0
  119. package/dist/generator/llm.d.ts.map +1 -0
  120. package/dist/generator/llm.js +128 -0
  121. package/dist/generator/llm.js.map +1 -0
  122. package/dist/generator/utils.d.ts +5 -0
  123. package/dist/generator/utils.d.ts.map +1 -0
  124. package/dist/generator/utils.js +49 -0
  125. package/dist/generator/utils.js.map +1 -0
  126. package/dist/index.d.ts +2 -0
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +2 -0
  129. package/dist/index.js.map +1 -0
  130. package/dist/lib/clawcontractbook.d.ts +65 -0
  131. package/dist/lib/clawcontractbook.d.ts.map +1 -0
  132. package/dist/lib/clawcontractbook.js +158 -0
  133. package/dist/lib/clawcontractbook.js.map +1 -0
  134. package/dist/lib/credentials.d.ts +28 -0
  135. package/dist/lib/credentials.d.ts.map +1 -0
  136. package/dist/lib/credentials.js +73 -0
  137. package/dist/lib/credentials.js.map +1 -0
  138. package/dist/verifier/explorer-api.d.ts +21 -0
  139. package/dist/verifier/explorer-api.d.ts.map +1 -0
  140. package/dist/verifier/explorer-api.js +92 -0
  141. package/dist/verifier/explorer-api.js.map +1 -0
  142. package/dist/verifier/index.d.ts +20 -0
  143. package/dist/verifier/index.d.ts.map +1 -0
  144. package/dist/verifier/index.js +31 -0
  145. package/dist/verifier/index.js.map +1 -0
  146. package/package.json +54 -0
@@ -0,0 +1,2 @@
1
+ export * from './config/index.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './config/index.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,65 @@
1
+ export interface PublishOptions {
2
+ contractAddress: string;
3
+ chainKey: string;
4
+ chainId: number;
5
+ contractName: string;
6
+ description?: string;
7
+ abi: unknown[];
8
+ sourceCode?: string;
9
+ deployerAddress: string;
10
+ transactionHash: string;
11
+ blockNumber: number;
12
+ gasUsed: string;
13
+ constructorArgs?: unknown[];
14
+ apiKeyId: string;
15
+ apiSecret: string;
16
+ endpoint?: string;
17
+ }
18
+ export interface PublishResult {
19
+ success: boolean;
20
+ deploymentId?: string;
21
+ url?: string;
22
+ error?: string;
23
+ }
24
+ export declare function publishDeployment(options: PublishOptions): Promise<PublishResult>;
25
+ export interface RegisterAgentOptions {
26
+ name: string;
27
+ endpoint?: string;
28
+ }
29
+ export interface RegisterAgentResult {
30
+ success: boolean;
31
+ agentId?: string;
32
+ name?: string;
33
+ apiKeyId?: string;
34
+ apiSecret?: string;
35
+ error?: string;
36
+ }
37
+ export declare function registerAgent(options: RegisterAgentOptions): Promise<RegisterAgentResult>;
38
+ export interface IncrementInteractionOptions {
39
+ deploymentId: string;
40
+ apiKeyId: string;
41
+ apiSecret: string;
42
+ endpoint?: string;
43
+ }
44
+ export interface IncrementInteractionResult {
45
+ success: boolean;
46
+ error?: string;
47
+ }
48
+ export interface GetAgentOptions {
49
+ agentId: string;
50
+ endpoint?: string;
51
+ }
52
+ export interface GetAgentResult {
53
+ success: boolean;
54
+ agent?: {
55
+ id: string;
56
+ name: string;
57
+ isVerified: boolean;
58
+ deploymentCount: number;
59
+ createdAt: string;
60
+ };
61
+ error?: string;
62
+ }
63
+ export declare function getAgent(options: GetAgentOptions): Promise<GetAgentResult>;
64
+ export declare function incrementInteraction(options: IncrementInteractionOptions): Promise<IncrementInteractionResult>;
65
+ //# sourceMappingURL=clawcontractbook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clawcontractbook.d.ts","sourceRoot":"","sources":["../../src/lib/clawcontractbook.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,OAAO,EAAE,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqCD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAqDxB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAqC9B;AAED,MAAM,WAAW,2BAA2B;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,OAAO,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CAkCzB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,CA+BrC"}
@@ -0,0 +1,158 @@
1
+ import { createHmac, createHash, randomUUID } from "crypto";
2
+ import { CLAWCONTRACT_BOOK_DEFAULT_ENDPOINT } from "../config/index.js";
3
+ function signRequest(method, path, body, apiKeyId, apiSecret) {
4
+ const timestamp = Date.now().toString();
5
+ const nonce = randomUUID();
6
+ const bodyString = body ? JSON.stringify(body) : "";
7
+ const bodyHash = createHash("sha256").update(bodyString).digest("hex");
8
+ const signatureInput = [
9
+ method.toUpperCase(),
10
+ path,
11
+ bodyHash,
12
+ timestamp,
13
+ nonce,
14
+ ].join("\n");
15
+ const signature = createHmac("sha256", apiSecret)
16
+ .update(signatureInput)
17
+ .digest("hex");
18
+ return {
19
+ headers: {
20
+ Authorization: `CCB-V1 ${apiKeyId}:${signature}`,
21
+ "X-CCB-Timestamp": timestamp,
22
+ "X-CCB-Nonce": nonce,
23
+ "Content-Type": "application/json",
24
+ },
25
+ };
26
+ }
27
+ export async function publishDeployment(options) {
28
+ const endpoint = options.endpoint || CLAWCONTRACT_BOOK_DEFAULT_ENDPOINT;
29
+ const payload = {
30
+ contractAddress: options.contractAddress,
31
+ chainKey: options.chainKey,
32
+ chainId: options.chainId,
33
+ contractName: options.contractName,
34
+ description: options.description,
35
+ abi: options.abi,
36
+ sourceCode: options.sourceCode,
37
+ deployerAddress: options.deployerAddress,
38
+ transactionHash: options.transactionHash,
39
+ blockNumber: options.blockNumber,
40
+ gasUsed: options.gasUsed,
41
+ constructorArgs: options.constructorArgs || [],
42
+ };
43
+ const { headers } = signRequest("POST", "/api/v1/deployments", payload, options.apiKeyId, options.apiSecret);
44
+ try {
45
+ const response = await fetch(`${endpoint}/api/v1/deployments`, {
46
+ method: "POST",
47
+ headers,
48
+ body: JSON.stringify(payload),
49
+ });
50
+ const data = await response.json();
51
+ if (!response.ok) {
52
+ return {
53
+ success: false,
54
+ error: data.error?.message || `HTTP ${response.status}`,
55
+ };
56
+ }
57
+ return {
58
+ success: true,
59
+ deploymentId: data.data?.deployment?.id,
60
+ url: data.data?.deployment?.url,
61
+ };
62
+ }
63
+ catch (error) {
64
+ return {
65
+ success: false,
66
+ error: error instanceof Error ? error.message : "Network error",
67
+ };
68
+ }
69
+ }
70
+ export async function registerAgent(options) {
71
+ const endpoint = options.endpoint || CLAWCONTRACT_BOOK_DEFAULT_ENDPOINT;
72
+ const body = { name: options.name };
73
+ try {
74
+ const response = await fetch(`${endpoint}/api/v1/agents/register`, {
75
+ method: "POST",
76
+ headers: { "Content-Type": "application/json" },
77
+ body: JSON.stringify(body),
78
+ });
79
+ const data = await response.json();
80
+ if (!response.ok) {
81
+ return {
82
+ success: false,
83
+ error: data.error?.message || `HTTP ${response.status}`,
84
+ };
85
+ }
86
+ const agent = data.data?.agent;
87
+ const creds = data.data?.credentials;
88
+ return {
89
+ success: true,
90
+ agentId: agent?.id,
91
+ name: agent?.name,
92
+ apiKeyId: creds?.apiKeyId,
93
+ apiSecret: creds?.apiSecret,
94
+ };
95
+ }
96
+ catch (error) {
97
+ return {
98
+ success: false,
99
+ error: error instanceof Error ? error.message : "Network error",
100
+ };
101
+ }
102
+ }
103
+ export async function getAgent(options) {
104
+ const endpoint = options.endpoint || CLAWCONTRACT_BOOK_DEFAULT_ENDPOINT;
105
+ try {
106
+ const response = await fetch(`${endpoint}/api/v1/agents/${options.agentId}`);
107
+ const data = await response.json();
108
+ if (!response.ok) {
109
+ return {
110
+ success: false,
111
+ error: data.error?.message || `HTTP ${response.status}`,
112
+ };
113
+ }
114
+ const agent = data.data?.agent;
115
+ return {
116
+ success: true,
117
+ agent: agent
118
+ ? {
119
+ id: agent.id,
120
+ name: agent.name,
121
+ isVerified: agent.isVerified ?? false,
122
+ deploymentCount: agent.deploymentCount ?? 0,
123
+ createdAt: agent.createdAt ?? "",
124
+ }
125
+ : undefined,
126
+ };
127
+ }
128
+ catch (error) {
129
+ return {
130
+ success: false,
131
+ error: error instanceof Error ? error.message : "Network error",
132
+ };
133
+ }
134
+ }
135
+ export async function incrementInteraction(options) {
136
+ const endpoint = options.endpoint || CLAWCONTRACT_BOOK_DEFAULT_ENDPOINT;
137
+ const { headers } = signRequest("POST", `/api/v1/deployments/${options.deploymentId}/interact`, null, options.apiKeyId, options.apiSecret);
138
+ try {
139
+ const response = await fetch(`${endpoint}/api/v1/deployments/${options.deploymentId}/interact`, {
140
+ method: "POST",
141
+ headers,
142
+ });
143
+ if (!response.ok) {
144
+ return {
145
+ success: false,
146
+ error: `HTTP ${response.status}`,
147
+ };
148
+ }
149
+ return { success: true };
150
+ }
151
+ catch (error) {
152
+ return {
153
+ success: false,
154
+ error: error instanceof Error ? error.message : "Network error",
155
+ };
156
+ }
157
+ }
158
+ //# sourceMappingURL=clawcontractbook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clawcontractbook.js","sourceRoot":"","sources":["../../src/lib/clawcontractbook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface ClawContractBookCredentials {
2
+ apiKeyId: string;
3
+ apiSecret: string;
4
+ endpoint?: string;
5
+ agentId?: string;
6
+ name?: string;
7
+ /** Wallet private key for deployment (created by `clawcontract register`) */
8
+ privateKey?: string;
9
+ }
10
+ /** Default path: <cwd>/clawcontractbook/credentials.json */
11
+ export declare function defaultCredentialsPath(): string;
12
+ /**
13
+ * Load credentials from the conventional locations.
14
+ * Checks: 1) .clawcontractbook.json in cwd, 2) clawcontractbook/credentials.json in cwd
15
+ */
16
+ export declare function loadCredentials(): ClawContractBookCredentials | null;
17
+ /**
18
+ * Save credentials to the given path. Creates parent directories if needed.
19
+ */
20
+ export declare function saveCredentials(credentials: ClawContractBookCredentials, filePath: string): void;
21
+ /**
22
+ * Resolve credentials: use flags if both provided, otherwise load from file.
23
+ */
24
+ export declare function resolveCredentials(flags: {
25
+ apiKeyId?: string;
26
+ apiSecret?: string;
27
+ }): ClawContractBookCredentials | null;
28
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAMD;;;GAGG;AACH,wBAAgB,eAAe,IAAI,2BAA2B,GAAG,IAAI,CA0BpE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,2BAA2B,EACxC,QAAQ,EAAE,MAAM,GACf,IAAI,CAgBN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,2BAA2B,GAAG,IAAI,CAQrC"}
@@ -0,0 +1,73 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { CLAWCONTRACT_BOOK_DEFAULT_ENDPOINT } from "../config/index.js";
4
+ const CREDENTIALS_FILENAME = ".clawcontractbook.json";
5
+ const DEFAULT_CREDENTIALS_DIR = "clawcontractbook";
6
+ const DEFAULT_CREDENTIALS_FILE = "credentials.json";
7
+ /** Default path: <cwd>/clawcontractbook/credentials.json */
8
+ export function defaultCredentialsPath() {
9
+ return path.resolve(process.cwd(), DEFAULT_CREDENTIALS_DIR, DEFAULT_CREDENTIALS_FILE);
10
+ }
11
+ function projectCredentialsPath() {
12
+ return path.resolve(process.cwd(), CREDENTIALS_FILENAME);
13
+ }
14
+ /**
15
+ * Load credentials from the conventional locations.
16
+ * Checks: 1) .clawcontractbook.json in cwd, 2) clawcontractbook/credentials.json in cwd
17
+ */
18
+ export function loadCredentials() {
19
+ const projectPath = projectCredentialsPath();
20
+ if (fs.existsSync(projectPath)) {
21
+ try {
22
+ const raw = JSON.parse(fs.readFileSync(projectPath, "utf-8"));
23
+ if (raw?.apiKeyId && raw?.apiSecret) {
24
+ return raw;
25
+ }
26
+ }
27
+ catch {
28
+ // invalid file, try default
29
+ }
30
+ }
31
+ const defaultPath = defaultCredentialsPath();
32
+ if (fs.existsSync(defaultPath)) {
33
+ try {
34
+ const raw = JSON.parse(fs.readFileSync(defaultPath, "utf-8"));
35
+ if (raw?.apiKeyId && raw?.apiSecret) {
36
+ return raw;
37
+ }
38
+ }
39
+ catch {
40
+ // invalid
41
+ }
42
+ }
43
+ return null;
44
+ }
45
+ /**
46
+ * Save credentials to the given path. Creates parent directories if needed.
47
+ */
48
+ export function saveCredentials(credentials, filePath) {
49
+ const dir = path.dirname(filePath);
50
+ fs.mkdirSync(dir, { recursive: true });
51
+ const content = JSON.stringify({
52
+ apiKeyId: credentials.apiKeyId,
53
+ apiSecret: credentials.apiSecret,
54
+ endpoint: credentials.endpoint ?? CLAWCONTRACT_BOOK_DEFAULT_ENDPOINT,
55
+ ...(credentials.agentId && { agentId: credentials.agentId }),
56
+ ...(credentials.name && { name: credentials.name }),
57
+ ...(credentials.privateKey && { privateKey: credentials.privateKey }),
58
+ }, null, 2);
59
+ fs.writeFileSync(filePath, content, "utf-8");
60
+ }
61
+ /**
62
+ * Resolve credentials: use flags if both provided, otherwise load from file.
63
+ */
64
+ export function resolveCredentials(flags) {
65
+ if (flags.apiKeyId && flags.apiSecret) {
66
+ return {
67
+ apiKeyId: flags.apiKeyId,
68
+ apiSecret: flags.apiSecret,
69
+ };
70
+ }
71
+ return loadCredentials();
72
+ }
73
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface SubmitVerificationOptions {
2
+ contractAddress: string;
3
+ sourceCode: string;
4
+ contractName: string;
5
+ chainKey: string;
6
+ constructorArgs?: string;
7
+ compilerVersion?: string;
8
+ optimizationUsed?: boolean;
9
+ runs?: number;
10
+ codeFormat?: string;
11
+ }
12
+ export declare function submitVerification(options: SubmitVerificationOptions): Promise<string>;
13
+ export declare function checkVerificationStatus(guid: string, chainKey: string): Promise<{
14
+ success: boolean;
15
+ message: string;
16
+ }>;
17
+ export declare function pollVerificationStatus(guid: string, chainKey: string): Promise<{
18
+ success: boolean;
19
+ message: string;
20
+ }>;
21
+ //# sourceMappingURL=explorer-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explorer-api.d.ts","sourceRoot":"","sources":["../../src/verifier/explorer-api.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,yBAAyB;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiBD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAsDjB;AAED,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BhD;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAehD"}
@@ -0,0 +1,92 @@
1
+ import { getChain } from '../config/chains.js';
2
+ const ETHERSCAN_V2_BASE = 'https://api.etherscan.io/v2/api';
3
+ const DEFAULT_COMPILER_VERSION = 'v0.8.20+commit.a1b79de6';
4
+ const DEFAULT_RUNS = 200;
5
+ const MAX_RETRIES = 5;
6
+ const INITIAL_POLL_INTERVAL_MS = 5_000;
7
+ const SUBMIT_MAX_RETRIES = 5;
8
+ const SUBMIT_INITIAL_DELAY_MS = 5_000;
9
+ export async function submitVerification(options) {
10
+ const chain = getChain(options.chainKey);
11
+ const apiKey = process.env['CLAWCONTRACT_BSCSCAN_API_KEY'];
12
+ if (!apiKey) {
13
+ throw new Error('CLAWCONTRACT_BSCSCAN_API_KEY environment variable is not set');
14
+ }
15
+ const params = new URLSearchParams({
16
+ module: 'contract',
17
+ action: 'verifysourcecode',
18
+ contractaddress: options.contractAddress,
19
+ sourceCode: options.sourceCode,
20
+ codeformat: options.codeFormat ?? 'solidity-single-file',
21
+ contractname: options.contractName,
22
+ compilerversion: options.compilerVersion ?? DEFAULT_COMPILER_VERSION,
23
+ optimizationUsed: options.optimizationUsed === false ? '0' : '1',
24
+ runs: String(options.runs ?? DEFAULT_RUNS),
25
+ apikey: apiKey,
26
+ });
27
+ if (options.constructorArgs) {
28
+ params.set('constructorArguements', options.constructorArgs);
29
+ }
30
+ const url = `${ETHERSCAN_V2_BASE}?chainid=${chain.chainId}`;
31
+ let delay = SUBMIT_INITIAL_DELAY_MS;
32
+ for (let attempt = 0; attempt <= SUBMIT_MAX_RETRIES; attempt++) {
33
+ if (attempt > 0) {
34
+ await sleep(delay);
35
+ delay = Math.min(delay * 2, 30_000);
36
+ }
37
+ const response = await fetch(url, {
38
+ method: 'POST',
39
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
40
+ body: params.toString(),
41
+ });
42
+ const data = (await response.json());
43
+ if (data.status === '1') {
44
+ return data.result;
45
+ }
46
+ const isNotIndexed = data.result?.includes('Unable to locate ContractCode');
47
+ if (isNotIndexed && attempt < SUBMIT_MAX_RETRIES) {
48
+ continue;
49
+ }
50
+ throw new Error(`Verification submission failed: ${data.result}`);
51
+ }
52
+ throw new Error('Verification submission failed after maximum retries');
53
+ }
54
+ export async function checkVerificationStatus(guid, chainKey) {
55
+ const chain = getChain(chainKey);
56
+ const apiKey = process.env['CLAWCONTRACT_BSCSCAN_API_KEY'];
57
+ if (!apiKey) {
58
+ throw new Error('CLAWCONTRACT_BSCSCAN_API_KEY environment variable is not set');
59
+ }
60
+ const params = new URLSearchParams({
61
+ module: 'contract',
62
+ action: 'checkverifystatus',
63
+ guid,
64
+ apikey: apiKey,
65
+ });
66
+ const url = `${ETHERSCAN_V2_BASE}?chainid=${chain.chainId}&${params.toString()}`;
67
+ const response = await fetch(url);
68
+ const data = (await response.json());
69
+ if (data.result === 'Pending in queue') {
70
+ return { success: false, message: data.result };
71
+ }
72
+ if (data.status === '1') {
73
+ return { success: true, message: data.result };
74
+ }
75
+ return { success: false, message: data.result };
76
+ }
77
+ export async function pollVerificationStatus(guid, chainKey) {
78
+ let delay = INITIAL_POLL_INTERVAL_MS;
79
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
80
+ await sleep(delay);
81
+ const result = await checkVerificationStatus(guid, chainKey);
82
+ if (result.success || (result.message !== 'Pending in queue')) {
83
+ return result;
84
+ }
85
+ delay = Math.min(delay * 2, 30_000);
86
+ }
87
+ return { success: false, message: 'Verification timed out after maximum retries' };
88
+ }
89
+ function sleep(ms) {
90
+ return new Promise((resolve) => setTimeout(resolve, ms));
91
+ }
92
+ //# sourceMappingURL=explorer-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explorer-api.js","sourceRoot":"","sources":["../../src/verifier/explorer-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface VerifyOptions {
2
+ contractAddress: string;
3
+ chainKey: string;
4
+ constructorArgs?: string;
5
+ sourceCode?: string;
6
+ contractName?: string;
7
+ compilerVersion?: string;
8
+ optimizationUsed?: boolean;
9
+ runs?: number;
10
+ standardJsonInput?: unknown;
11
+ solcLongVersion?: string;
12
+ fullyQualifiedName?: string;
13
+ }
14
+ export interface VerifyResult {
15
+ success: boolean;
16
+ message: string;
17
+ explorerUrl: string;
18
+ }
19
+ export declare function verifyContract(options: VerifyOptions): Promise<VerifyResult>;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/verifier/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAgClF"}
@@ -0,0 +1,31 @@
1
+ import { getChain } from '../config/chains.js';
2
+ import { submitVerification, pollVerificationStatus } from './explorer-api.js';
3
+ export async function verifyContract(options) {
4
+ const chain = getChain(options.chainKey);
5
+ const useStandardJson = !!options.standardJsonInput;
6
+ const guid = await submitVerification({
7
+ contractAddress: options.contractAddress,
8
+ sourceCode: useStandardJson
9
+ ? JSON.stringify(options.standardJsonInput)
10
+ : options.sourceCode ?? '',
11
+ contractName: useStandardJson
12
+ ? (options.fullyQualifiedName ?? options.contractName ?? '')
13
+ : (options.contractName ?? ''),
14
+ chainKey: options.chainKey,
15
+ constructorArgs: options.constructorArgs,
16
+ compilerVersion: useStandardJson
17
+ ? (options.solcLongVersion ? `v${options.solcLongVersion}` : options.compilerVersion)
18
+ : options.compilerVersion,
19
+ optimizationUsed: options.optimizationUsed,
20
+ runs: options.runs,
21
+ codeFormat: useStandardJson ? 'solidity-standard-json-input' : 'solidity-single-file',
22
+ });
23
+ const result = await pollVerificationStatus(guid, options.chainKey);
24
+ const explorerUrl = `${chain.explorerUrl}/address/${options.contractAddress}#code`;
25
+ return {
26
+ success: result.success,
27
+ message: result.message,
28
+ explorerUrl,
29
+ };
30
+ }
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/verifier/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAsB/E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAsB;IACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEzC,MAAM,eAAe,GAAG,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;IAEpD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC;QACpC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,UAAU,EAAE,eAAe;YACzB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC;YAC3C,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE;QAC5B,YAAY,EAAE,eAAe;YAC3B,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,IAAI,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;YAC5D,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,eAAe,EAAE,eAAe;YAC9B,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;YACrF,CAAC,CAAC,OAAO,CAAC,eAAe;QAC3B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,sBAAsB;KACtF,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEpE,MAAM,WAAW,GAAG,GAAG,KAAK,CAAC,WAAW,YAAY,OAAO,CAAC,eAAe,OAAO,CAAC;IAEnF,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW;KACZ,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "clawcontract-cli",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Smart ocntract analyzer and deployer for BNB Chain",
6
+ "main": "./dist/index.js",
7
+ "bin": {
8
+ "clawcontract-cli": "./dist/cli/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx src/cli/index.ts",
13
+ "start": "node dist/cli/index.js"
14
+ },
15
+ "license": "MIT",
16
+ "engines": {
17
+ "node": ">=20.0.0"
18
+ },
19
+ "dependencies": {
20
+ "@clawcontractbook/shared": "workspace:*",
21
+ "@nomicfoundation/hardhat-toolbox": "^5.0.0",
22
+ "chalk": "^5.6.2",
23
+ "commander": "^14.0.3",
24
+ "dotenv": "^17.2.4",
25
+ "ethers": "^6.16.0",
26
+ "hardhat": "2.28.0",
27
+ "ora": "^9.3.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^25.2.2",
31
+ "tsx": "^4.21.0",
32
+ "typescript": "^5.9.3"
33
+ },
34
+ "files": [
35
+ "dist/",
36
+ "README.md",
37
+ "LICENSE"
38
+ ],
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "https://github.com/cvpfus/clawcontract.git"
42
+ },
43
+ "keywords": [
44
+ "smart-contract",
45
+ "bnb-chain",
46
+ "bsc",
47
+ "solidity",
48
+ "ai",
49
+ "web3",
50
+ "opbnb"
51
+ ],
52
+ "author": "cvpfus",
53
+ "homepage": "https://github.com/cvpfus/clawcontract#readme"
54
+ }