clawcontract 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 (158) hide show
  1. package/README.md +222 -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/delete.d.ts +5 -0
  19. package/dist/cli/commands/delete.d.ts.map +1 -0
  20. package/dist/cli/commands/delete.js +48 -0
  21. package/dist/cli/commands/delete.js.map +1 -0
  22. package/dist/cli/commands/deploy.d.ts +5 -0
  23. package/dist/cli/commands/deploy.d.ts.map +1 -0
  24. package/dist/cli/commands/deploy.js +88 -0
  25. package/dist/cli/commands/deploy.js.map +1 -0
  26. package/dist/cli/commands/full.d.ts +5 -0
  27. package/dist/cli/commands/full.d.ts.map +1 -0
  28. package/dist/cli/commands/full.js +83 -0
  29. package/dist/cli/commands/full.js.map +1 -0
  30. package/dist/cli/commands/generate.d.ts +5 -0
  31. package/dist/cli/commands/generate.d.ts.map +1 -0
  32. package/dist/cli/commands/generate.js +35 -0
  33. package/dist/cli/commands/generate.js.map +1 -0
  34. package/dist/cli/commands/interact.d.ts +6 -0
  35. package/dist/cli/commands/interact.d.ts.map +1 -0
  36. package/dist/cli/commands/interact.js +136 -0
  37. package/dist/cli/commands/interact.js.map +1 -0
  38. package/dist/cli/commands/list.d.ts +6 -0
  39. package/dist/cli/commands/list.d.ts.map +1 -0
  40. package/dist/cli/commands/list.js +37 -0
  41. package/dist/cli/commands/list.js.map +1 -0
  42. package/dist/cli/commands/setup.d.ts +8 -0
  43. package/dist/cli/commands/setup.d.ts.map +1 -0
  44. package/dist/cli/commands/setup.js +36 -0
  45. package/dist/cli/commands/setup.js.map +1 -0
  46. package/dist/cli/commands/verify.d.ts +9 -0
  47. package/dist/cli/commands/verify.d.ts.map +1 -0
  48. package/dist/cli/commands/verify.js +87 -0
  49. package/dist/cli/commands/verify.js.map +1 -0
  50. package/dist/cli/index.d.ts +3 -0
  51. package/dist/cli/index.d.ts.map +1 -0
  52. package/dist/cli/index.js +104 -0
  53. package/dist/cli/index.js.map +1 -0
  54. package/dist/cli/utils.d.ts +6 -0
  55. package/dist/cli/utils.d.ts.map +1 -0
  56. package/dist/cli/utils.js +29 -0
  57. package/dist/cli/utils.js.map +1 -0
  58. package/dist/config/chains.d.ts +18 -0
  59. package/dist/config/chains.d.ts.map +1 -0
  60. package/dist/config/chains.js +52 -0
  61. package/dist/config/chains.js.map +1 -0
  62. package/dist/config/index.d.ts +2 -0
  63. package/dist/config/index.d.ts.map +1 -0
  64. package/dist/config/index.js +2 -0
  65. package/dist/config/index.js.map +1 -0
  66. package/dist/deployer/compiler.d.ts +10 -0
  67. package/dist/deployer/compiler.d.ts.map +1 -0
  68. package/dist/deployer/compiler.js +93 -0
  69. package/dist/deployer/compiler.js.map +1 -0
  70. package/dist/deployer/deploy.d.ts +28 -0
  71. package/dist/deployer/deploy.d.ts.map +1 -0
  72. package/dist/deployer/deploy.js +60 -0
  73. package/dist/deployer/deploy.js.map +1 -0
  74. package/dist/deployer/hardhat-config-template.d.ts +2 -0
  75. package/dist/deployer/hardhat-config-template.d.ts.map +1 -0
  76. package/dist/deployer/hardhat-config-template.js +20 -0
  77. package/dist/deployer/hardhat-config-template.js.map +1 -0
  78. package/dist/deployer/index.d.ts +7 -0
  79. package/dist/deployer/index.d.ts.map +1 -0
  80. package/dist/deployer/index.js +4 -0
  81. package/dist/deployer/index.js.map +1 -0
  82. package/dist/deployer/metadata.d.ts +16 -0
  83. package/dist/deployer/metadata.d.ts.map +1 -0
  84. package/dist/deployer/metadata.js +315 -0
  85. package/dist/deployer/metadata.js.map +1 -0
  86. package/dist/deployer/wallet.d.ts +6 -0
  87. package/dist/deployer/wallet.d.ts.map +1 -0
  88. package/dist/deployer/wallet.js +21 -0
  89. package/dist/deployer/wallet.js.map +1 -0
  90. package/dist/generator/index.d.ts +19 -0
  91. package/dist/generator/index.d.ts.map +1 -0
  92. package/dist/generator/index.js +33 -0
  93. package/dist/generator/index.js.map +1 -0
  94. package/dist/generator/llm.d.ts +10 -0
  95. package/dist/generator/llm.d.ts.map +1 -0
  96. package/dist/generator/llm.js +71 -0
  97. package/dist/generator/llm.js.map +1 -0
  98. package/dist/generator/templates/erc20.d.ts +2 -0
  99. package/dist/generator/templates/erc20.d.ts.map +1 -0
  100. package/dist/generator/templates/erc20.js +106 -0
  101. package/dist/generator/templates/erc20.js.map +1 -0
  102. package/dist/generator/templates/erc20.sol.d.ts +2 -0
  103. package/dist/generator/templates/erc20.sol.d.ts.map +1 -0
  104. package/dist/generator/templates/erc20.sol.js +106 -0
  105. package/dist/generator/templates/erc20.sol.js.map +1 -0
  106. package/dist/generator/templates/erc721.d.ts +2 -0
  107. package/dist/generator/templates/erc721.d.ts.map +1 -0
  108. package/dist/generator/templates/erc721.js +168 -0
  109. package/dist/generator/templates/erc721.js.map +1 -0
  110. package/dist/generator/templates/erc721.sol.d.ts +2 -0
  111. package/dist/generator/templates/erc721.sol.d.ts.map +1 -0
  112. package/dist/generator/templates/erc721.sol.js +168 -0
  113. package/dist/generator/templates/erc721.sol.js.map +1 -0
  114. package/dist/generator/templates/index.d.ts +21 -0
  115. package/dist/generator/templates/index.d.ts.map +1 -0
  116. package/dist/generator/templates/index.js +157 -0
  117. package/dist/generator/templates/index.js.map +1 -0
  118. package/dist/generator/templates/multisig.d.ts +2 -0
  119. package/dist/generator/templates/multisig.d.ts.map +1 -0
  120. package/dist/generator/templates/multisig.js +136 -0
  121. package/dist/generator/templates/multisig.js.map +1 -0
  122. package/dist/generator/templates/multisig.sol.d.ts +2 -0
  123. package/dist/generator/templates/multisig.sol.d.ts.map +1 -0
  124. package/dist/generator/templates/multisig.sol.js +136 -0
  125. package/dist/generator/templates/multisig.sol.js.map +1 -0
  126. package/dist/generator/templates/staking.d.ts +2 -0
  127. package/dist/generator/templates/staking.d.ts.map +1 -0
  128. package/dist/generator/templates/staking.js +119 -0
  129. package/dist/generator/templates/staking.js.map +1 -0
  130. package/dist/generator/templates/staking.sol.d.ts +2 -0
  131. package/dist/generator/templates/staking.sol.d.ts.map +1 -0
  132. package/dist/generator/templates/staking.sol.js +119 -0
  133. package/dist/generator/templates/staking.sol.js.map +1 -0
  134. package/dist/generator/templates/vesting.d.ts +2 -0
  135. package/dist/generator/templates/vesting.d.ts.map +1 -0
  136. package/dist/generator/templates/vesting.js +133 -0
  137. package/dist/generator/templates/vesting.js.map +1 -0
  138. package/dist/generator/templates/vesting.sol.d.ts +2 -0
  139. package/dist/generator/templates/vesting.sol.d.ts.map +1 -0
  140. package/dist/generator/templates/vesting.sol.js +133 -0
  141. package/dist/generator/templates/vesting.sol.js.map +1 -0
  142. package/dist/generator/utils.d.ts +5 -0
  143. package/dist/generator/utils.d.ts.map +1 -0
  144. package/dist/generator/utils.js +49 -0
  145. package/dist/generator/utils.js.map +1 -0
  146. package/dist/index.d.ts +2 -0
  147. package/dist/index.d.ts.map +1 -0
  148. package/dist/index.js +2 -0
  149. package/dist/index.js.map +1 -0
  150. package/dist/verifier/explorer-api.d.ts +21 -0
  151. package/dist/verifier/explorer-api.d.ts.map +1 -0
  152. package/dist/verifier/explorer-api.js +92 -0
  153. package/dist/verifier/explorer-api.js.map +1 -0
  154. package/dist/verifier/index.d.ts +20 -0
  155. package/dist/verifier/index.d.ts.map +1 -0
  156. package/dist/verifier/index.js +31 -0
  157. package/dist/verifier/index.js.map +1 -0
  158. package/package.json +53 -0
@@ -0,0 +1,168 @@
1
+ export const ERC721_TEMPLATE = `// SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.20;
3
+
4
+ interface IERC721Receiver {
5
+ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
6
+ }
7
+
8
+ contract {{NFT_NAME}} {
9
+ string public name;
10
+ string public symbol;
11
+ string public baseURI;
12
+ address public owner;
13
+ uint256 public totalSupply;
14
+ uint256 public maxSupply;
15
+
16
+ mapping(uint256 => address) private _owners;
17
+ mapping(address => uint256) private _balances;
18
+ mapping(uint256 => address) private _tokenApprovals;
19
+ mapping(address => mapping(address => bool)) private _operatorApprovals;
20
+ mapping(uint256 => string) private _tokenURIs;
21
+
22
+ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
23
+ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
24
+ event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
25
+
26
+ modifier onlyOwner() {
27
+ require(msg.sender == owner, "Not owner");
28
+ _;
29
+ }
30
+
31
+ constructor() {
32
+ name = "{{NFT_NAME}}";
33
+ symbol = "{{NFT_SYMBOL}}";
34
+ baseURI = "{{BASE_URI}}";
35
+ maxSupply = {{MAX_SUPPLY}};
36
+ owner = msg.sender;
37
+ }
38
+
39
+ function balanceOf(address _owner) external view returns (uint256) {
40
+ require(_owner != address(0), "Zero address");
41
+ return _balances[_owner];
42
+ }
43
+
44
+ function ownerOf(uint256 tokenId) public view returns (address) {
45
+ address tokenOwner = _owners[tokenId];
46
+ require(tokenOwner != address(0), "Token does not exist");
47
+ return tokenOwner;
48
+ }
49
+
50
+ function tokenURI(uint256 tokenId) external view returns (string memory) {
51
+ require(_owners[tokenId] != address(0), "Token does not exist");
52
+ string memory _tokenURI = _tokenURIs[tokenId];
53
+ if (bytes(_tokenURI).length > 0) {
54
+ return _tokenURI;
55
+ }
56
+ return string(abi.encodePacked(baseURI, _toString(tokenId)));
57
+ }
58
+
59
+ function approve(address to, uint256 tokenId) external {
60
+ address tokenOwner = ownerOf(tokenId);
61
+ require(msg.sender == tokenOwner || _operatorApprovals[tokenOwner][msg.sender], "Not authorized");
62
+ _tokenApprovals[tokenId] = to;
63
+ emit Approval(tokenOwner, to, tokenId);
64
+ }
65
+
66
+ function getApproved(uint256 tokenId) public view returns (address) {
67
+ require(_owners[tokenId] != address(0), "Token does not exist");
68
+ return _tokenApprovals[tokenId];
69
+ }
70
+
71
+ function setApprovalForAll(address operator, bool approved) external {
72
+ require(operator != msg.sender, "Approve to caller");
73
+ _operatorApprovals[msg.sender][operator] = approved;
74
+ emit ApprovalForAll(msg.sender, operator, approved);
75
+ }
76
+
77
+ function isApprovedForAll(address _owner, address operator) public view returns (bool) {
78
+ return _operatorApprovals[_owner][operator];
79
+ }
80
+
81
+ function transferFrom(address from, address to, uint256 tokenId) public {
82
+ require(_isApprovedOrOwner(msg.sender, tokenId), "Not authorized");
83
+ _transfer(from, to, tokenId);
84
+ }
85
+
86
+ function safeTransferFrom(address from, address to, uint256 tokenId) external {
87
+ safeTransferFrom(from, to, tokenId, "");
88
+ }
89
+
90
+ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public {
91
+ transferFrom(from, to, tokenId);
92
+ require(_checkOnERC721Received(from, to, tokenId, data), "Non-ERC721Receiver");
93
+ }
94
+
95
+ function mint(address to) external onlyOwner returns (uint256) {
96
+ require(to != address(0), "Mint to zero address");
97
+ uint256 tokenId = totalSupply + 1;
98
+ require(tokenId <= maxSupply, "Max supply reached");
99
+ totalSupply = tokenId;
100
+ _balances[to] += 1;
101
+ _owners[tokenId] = to;
102
+ emit Transfer(address(0), to, tokenId);
103
+ return tokenId;
104
+ }
105
+
106
+ function mintWithURI(address to, string calldata uri) external onlyOwner returns (uint256) {
107
+ require(to != address(0), "Mint to zero address");
108
+ uint256 tokenId = totalSupply + 1;
109
+ require(tokenId <= maxSupply, "Max supply reached");
110
+ totalSupply = tokenId;
111
+ _balances[to] += 1;
112
+ _owners[tokenId] = to;
113
+ _tokenURIs[tokenId] = uri;
114
+ emit Transfer(address(0), to, tokenId);
115
+ return tokenId;
116
+ }
117
+
118
+ function setBaseURI(string calldata newBaseURI) external onlyOwner {
119
+ baseURI = newBaseURI;
120
+ }
121
+
122
+ function transferOwnership(address newOwner) external onlyOwner {
123
+ require(newOwner != address(0), "New owner is zero address");
124
+ owner = newOwner;
125
+ }
126
+
127
+ function supportsInterface(bytes4 interfaceId) external pure returns (bool) {
128
+ return interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f || interfaceId == 0x01ffc9a7;
129
+ }
130
+
131
+ function _transfer(address from, address to, uint256 tokenId) internal {
132
+ require(ownerOf(tokenId) == from, "Not token owner");
133
+ require(to != address(0), "Transfer to zero address");
134
+ _tokenApprovals[tokenId] = address(0);
135
+ _balances[from] -= 1;
136
+ _balances[to] += 1;
137
+ _owners[tokenId] = to;
138
+ emit Transfer(from, to, tokenId);
139
+ }
140
+
141
+ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
142
+ address tokenOwner = ownerOf(tokenId);
143
+ return (spender == tokenOwner || getApproved(tokenId) == spender || isApprovedForAll(tokenOwner, spender));
144
+ }
145
+
146
+ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private returns (bool) {
147
+ if (to.code.length > 0) {
148
+ try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data) returns (bytes4 retval) {
149
+ return retval == IERC721Receiver.onERC721Received.selector;
150
+ } catch {
151
+ return false;
152
+ }
153
+ }
154
+ return true;
155
+ }
156
+
157
+ function _toString(uint256 value) internal pure returns (string memory) {
158
+ if (value == 0) return "0";
159
+ uint256 temp = value;
160
+ uint256 digits;
161
+ while (temp != 0) { digits++; temp /= 10; }
162
+ bytes memory buffer = new bytes(digits);
163
+ while (value != 0) { digits--; buffer[digits] = bytes1(uint8(48 + (value % 10))); value /= 10; }
164
+ return string(buffer);
165
+ }
166
+ }
167
+ `;
168
+ //# sourceMappingURL=erc721.sol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erc721.sol.js","sourceRoot":"","sources":["../../../src/generator/templates/erc721.sol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsK9B,CAAC"}
@@ -0,0 +1,21 @@
1
+ export { ERC20_TEMPLATE } from "./erc20.js";
2
+ export { ERC721_TEMPLATE } from "./erc721.js";
3
+ export { STAKING_TEMPLATE } from "./staking.js";
4
+ export { VESTING_TEMPLATE } from "./vesting.js";
5
+ export { MULTISIG_TEMPLATE } from "./multisig.js";
6
+ export interface ContractTemplate {
7
+ name: string;
8
+ description: string;
9
+ template: string;
10
+ placeholders: string[];
11
+ keywords: string[];
12
+ }
13
+ export declare const TEMPLATES: ContractTemplate[];
14
+ export interface TemplateMatch {
15
+ template: ContractTemplate;
16
+ score: number;
17
+ confidence: "high" | "low";
18
+ }
19
+ export declare function findTemplateByKeyword(query: string): TemplateMatch | null;
20
+ export declare function fillTemplate(template: string, values: Record<string, string>): string;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/generator/templates/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,EAAE,gBAAgB,EAsHvC,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC;CAC5B;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA0BzE;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,MAAM,CAOR"}
@@ -0,0 +1,157 @@
1
+ import { ERC20_TEMPLATE } from "./erc20.js";
2
+ import { ERC721_TEMPLATE } from "./erc721.js";
3
+ import { STAKING_TEMPLATE } from "./staking.js";
4
+ import { VESTING_TEMPLATE } from "./vesting.js";
5
+ import { MULTISIG_TEMPLATE } from "./multisig.js";
6
+ export { ERC20_TEMPLATE } from "./erc20.js";
7
+ export { ERC721_TEMPLATE } from "./erc721.js";
8
+ export { STAKING_TEMPLATE } from "./staking.js";
9
+ export { VESTING_TEMPLATE } from "./vesting.js";
10
+ export { MULTISIG_TEMPLATE } from "./multisig.js";
11
+ export const TEMPLATES = [
12
+ {
13
+ name: "ERC-20 Token",
14
+ description: "A standard fungible token with mint, burn, and pause functionality. Suitable for creating custom tokens on BSC.",
15
+ template: ERC20_TEMPLATE,
16
+ placeholders: [
17
+ "{{TOKEN_NAME}}",
18
+ "{{TOKEN_SYMBOL}}",
19
+ "{{DECIMALS}}",
20
+ "{{INITIAL_SUPPLY}}",
21
+ "{{OWNER_ADDRESS}}",
22
+ ],
23
+ keywords: [
24
+ "token",
25
+ "coin",
26
+ "fungible",
27
+ "erc20",
28
+ "bep20",
29
+ "currency",
30
+ "mint",
31
+ "mintable",
32
+ "burnable",
33
+ "pausable",
34
+ "supply",
35
+ ],
36
+ },
37
+ {
38
+ name: "ERC-721 NFT",
39
+ description: "A non-fungible token contract with auto-incrementing IDs, token URI storage, and owner-only minting.",
40
+ template: ERC721_TEMPLATE,
41
+ placeholders: [
42
+ "{{NFT_NAME}}",
43
+ "{{NFT_SYMBOL}}",
44
+ "{{MAX_SUPPLY}}",
45
+ "{{BASE_URI}}",
46
+ ],
47
+ keywords: [
48
+ "nft",
49
+ "collectible",
50
+ "non-fungible",
51
+ "erc721",
52
+ "artwork",
53
+ "digital art",
54
+ "collection",
55
+ "mint nft",
56
+ "pfp",
57
+ "metadata",
58
+ ],
59
+ },
60
+ {
61
+ name: "BNB Staking",
62
+ description: "A staking contract for native BNB with configurable reward rates and time-based reward calculation.",
63
+ template: STAKING_TEMPLATE,
64
+ placeholders: ["{{REWARD_RATE}}", "{{MIN_STAKE}}"],
65
+ keywords: [
66
+ "stake",
67
+ "staking",
68
+ "yield",
69
+ "farm",
70
+ "farming",
71
+ "rewards",
72
+ "apy",
73
+ "apr",
74
+ "earn",
75
+ "deposit",
76
+ "bnb staking",
77
+ "passive income",
78
+ ],
79
+ },
80
+ {
81
+ name: "Token Vesting",
82
+ description: "A linear token vesting contract with cliff period, revocable by owner. Suitable for team token distribution.",
83
+ template: VESTING_TEMPLATE,
84
+ placeholders: [
85
+ "{{TOKEN_ADDRESS}}",
86
+ "{{BENEFICIARY}}",
87
+ "{{CLIFF_DURATION}}",
88
+ "{{VESTING_DURATION}}",
89
+ ],
90
+ keywords: [
91
+ "vesting",
92
+ "vest",
93
+ "cliff",
94
+ "lock",
95
+ "token lock",
96
+ "distribution",
97
+ "team tokens",
98
+ "schedule",
99
+ "unlock",
100
+ "linear vesting",
101
+ "release",
102
+ ],
103
+ },
104
+ {
105
+ name: "Multisig Wallet",
106
+ description: "A multi-signature wallet requiring multiple owner confirmations to execute transactions.",
107
+ template: MULTISIG_TEMPLATE,
108
+ placeholders: ["{{REQUIRED_CONFIRMATIONS}}"],
109
+ keywords: [
110
+ "multisig",
111
+ "multi-sig",
112
+ "multi signature",
113
+ "wallet",
114
+ "safe",
115
+ "gnosis",
116
+ "treasury",
117
+ "shared wallet",
118
+ "governance",
119
+ "approval",
120
+ "confirm",
121
+ "multi-owner",
122
+ ],
123
+ },
124
+ ];
125
+ export function findTemplateByKeyword(query) {
126
+ const lower = query.toLowerCase();
127
+ let bestMatch = null;
128
+ let bestScore = 0;
129
+ for (const template of TEMPLATES) {
130
+ let score = 0;
131
+ let matchedKeywords = 0;
132
+ for (const keyword of template.keywords) {
133
+ if (lower.includes(keyword)) {
134
+ score += keyword.length;
135
+ matchedKeywords++;
136
+ }
137
+ }
138
+ if (score > bestScore) {
139
+ bestScore = score;
140
+ bestMatch = template;
141
+ }
142
+ }
143
+ if (!bestMatch || bestScore === 0) {
144
+ return null;
145
+ }
146
+ const confidence = bestScore >= 8 ? "high" : "low";
147
+ return { template: bestMatch, score: bestScore, confidence };
148
+ }
149
+ export function fillTemplate(template, values) {
150
+ let result = template;
151
+ for (const [placeholder, value] of Object.entries(values)) {
152
+ const key = placeholder.startsWith("{{") ? placeholder : `{{${placeholder}}}`;
153
+ result = result.split(key).join(value);
154
+ }
155
+ return result;
156
+ }
157
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/generator/templates/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const MULTISIG_TEMPLATE = "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ncontract MultisigWallet {\n address[] public owners;\n uint256 public required;\n uint256 public transactionCount;\n\n struct Transaction {\n address to;\n uint256 value;\n bytes data;\n bool executed;\n uint256 confirmations;\n }\n\n mapping(uint256 => Transaction) public transactions;\n mapping(address => bool) public isOwner;\n mapping(uint256 => mapping(address => bool)) public confirmations;\n\n event Submitted(uint256 indexed txId, address indexed submitter, address indexed to, uint256 value);\n event Confirmed(uint256 indexed txId, address indexed confirmer);\n event Revoked(uint256 indexed txId, address indexed revoker);\n event Executed(uint256 indexed txId);\n event ExecutionFailed(uint256 indexed txId);\n event Deposited(address indexed sender, uint256 value);\n\n modifier onlyOwner() {\n require(isOwner[msg.sender], \"Not owner\");\n _;\n }\n\n modifier txExists(uint256 txId) {\n require(txId < transactionCount, \"Tx does not exist\");\n _;\n }\n\n modifier notExecuted(uint256 txId) {\n require(!transactions[txId].executed, \"Already executed\");\n _;\n }\n\n modifier notConfirmed(uint256 txId) {\n require(!confirmations[txId][msg.sender], \"Already confirmed\");\n _;\n }\n\n constructor(address[] memory _owners) {\n require(_owners.length > 0, \"Owners required\");\n uint256 _required = {{REQUIRED_CONFIRMATIONS}};\n require(_required > 0 && _required <= _owners.length, \"Invalid required count\");\n for (uint256 i = 0; i < _owners.length; i++) {\n address o = _owners[i];\n require(o != address(0), \"Invalid owner\");\n require(!isOwner[o], \"Duplicate owner\");\n isOwner[o] = true;\n owners.push(o);\n }\n required = _required;\n }\n\n function submit(address to, uint256 value, bytes calldata data) external onlyOwner returns (uint256) {\n uint256 txId = transactionCount;\n transactions[txId] = Transaction({\n to: to,\n value: value,\n data: data,\n executed: false,\n confirmations: 0\n });\n transactionCount++;\n emit Submitted(txId, msg.sender, to, value);\n return txId;\n }\n\n function confirm(uint256 txId) external onlyOwner txExists(txId) notExecuted(txId) notConfirmed(txId) {\n Transaction storage t = transactions[txId];\n t.confirmations++;\n confirmations[txId][msg.sender] = true;\n emit Confirmed(txId, msg.sender);\n }\n\n function execute(uint256 txId) external onlyOwner txExists(txId) notExecuted(txId) {\n Transaction storage t = transactions[txId];\n require(t.confirmations >= required, \"Not enough confirmations\");\n t.executed = true;\n (bool success, ) = t.to.call{value: t.value}(t.data);\n if (success) {\n emit Executed(txId);\n } else {\n t.executed = false;\n emit ExecutionFailed(txId);\n }\n }\n\n function revoke(uint256 txId) external onlyOwner txExists(txId) notExecuted(txId) {\n require(confirmations[txId][msg.sender], \"Not confirmed\");\n Transaction storage t = transactions[txId];\n t.confirmations--;\n confirmations[txId][msg.sender] = false;\n emit Revoked(txId, msg.sender);\n }\n\n function getOwners() external view returns (address[] memory) {\n return owners;\n }\n\n function getTransaction(uint256 txId) external view txExists(txId) returns (\n address to,\n uint256 value,\n bytes memory data,\n bool executed,\n uint256 numConfirmations\n ) {\n Transaction storage t = transactions[txId];\n return (t.to, t.value, t.data, t.executed, t.confirmations);\n }\n\n function getTransactionCount(bool pending, bool executed) external view returns (uint256 count) {\n for (uint256 i = 0; i < transactionCount; i++) {\n if ((pending && !transactions[i].executed) || (executed && transactions[i].executed)) {\n count++;\n }\n }\n }\n\n function isConfirmed(uint256 txId) external view returns (bool) {\n return transactions[txId].confirmations >= required;\n }\n\n receive() external payable {\n emit Deposited(msg.sender, msg.value);\n }\n}\n";
2
+ //# sourceMappingURL=multisig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multisig.d.ts","sourceRoot":"","sources":["../../../src/generator/templates/multisig.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,o+IAsI7B,CAAC"}
@@ -0,0 +1,136 @@
1
+ export const MULTISIG_TEMPLATE = `// SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.20;
3
+
4
+ contract MultisigWallet {
5
+ address[] public owners;
6
+ uint256 public required;
7
+ uint256 public transactionCount;
8
+
9
+ struct Transaction {
10
+ address to;
11
+ uint256 value;
12
+ bytes data;
13
+ bool executed;
14
+ uint256 confirmations;
15
+ }
16
+
17
+ mapping(uint256 => Transaction) public transactions;
18
+ mapping(address => bool) public isOwner;
19
+ mapping(uint256 => mapping(address => bool)) public confirmations;
20
+
21
+ event Submitted(uint256 indexed txId, address indexed submitter, address indexed to, uint256 value);
22
+ event Confirmed(uint256 indexed txId, address indexed confirmer);
23
+ event Revoked(uint256 indexed txId, address indexed revoker);
24
+ event Executed(uint256 indexed txId);
25
+ event ExecutionFailed(uint256 indexed txId);
26
+ event Deposited(address indexed sender, uint256 value);
27
+
28
+ modifier onlyOwner() {
29
+ require(isOwner[msg.sender], "Not owner");
30
+ _;
31
+ }
32
+
33
+ modifier txExists(uint256 txId) {
34
+ require(txId < transactionCount, "Tx does not exist");
35
+ _;
36
+ }
37
+
38
+ modifier notExecuted(uint256 txId) {
39
+ require(!transactions[txId].executed, "Already executed");
40
+ _;
41
+ }
42
+
43
+ modifier notConfirmed(uint256 txId) {
44
+ require(!confirmations[txId][msg.sender], "Already confirmed");
45
+ _;
46
+ }
47
+
48
+ constructor(address[] memory _owners) {
49
+ require(_owners.length > 0, "Owners required");
50
+ uint256 _required = {{REQUIRED_CONFIRMATIONS}};
51
+ require(_required > 0 && _required <= _owners.length, "Invalid required count");
52
+ for (uint256 i = 0; i < _owners.length; i++) {
53
+ address o = _owners[i];
54
+ require(o != address(0), "Invalid owner");
55
+ require(!isOwner[o], "Duplicate owner");
56
+ isOwner[o] = true;
57
+ owners.push(o);
58
+ }
59
+ required = _required;
60
+ }
61
+
62
+ function submit(address to, uint256 value, bytes calldata data) external onlyOwner returns (uint256) {
63
+ uint256 txId = transactionCount;
64
+ transactions[txId] = Transaction({
65
+ to: to,
66
+ value: value,
67
+ data: data,
68
+ executed: false,
69
+ confirmations: 0
70
+ });
71
+ transactionCount++;
72
+ emit Submitted(txId, msg.sender, to, value);
73
+ return txId;
74
+ }
75
+
76
+ function confirm(uint256 txId) external onlyOwner txExists(txId) notExecuted(txId) notConfirmed(txId) {
77
+ Transaction storage t = transactions[txId];
78
+ t.confirmations++;
79
+ confirmations[txId][msg.sender] = true;
80
+ emit Confirmed(txId, msg.sender);
81
+ }
82
+
83
+ function execute(uint256 txId) external onlyOwner txExists(txId) notExecuted(txId) {
84
+ Transaction storage t = transactions[txId];
85
+ require(t.confirmations >= required, "Not enough confirmations");
86
+ t.executed = true;
87
+ (bool success, ) = t.to.call{value: t.value}(t.data);
88
+ if (success) {
89
+ emit Executed(txId);
90
+ } else {
91
+ t.executed = false;
92
+ emit ExecutionFailed(txId);
93
+ }
94
+ }
95
+
96
+ function revoke(uint256 txId) external onlyOwner txExists(txId) notExecuted(txId) {
97
+ require(confirmations[txId][msg.sender], "Not confirmed");
98
+ Transaction storage t = transactions[txId];
99
+ t.confirmations--;
100
+ confirmations[txId][msg.sender] = false;
101
+ emit Revoked(txId, msg.sender);
102
+ }
103
+
104
+ function getOwners() external view returns (address[] memory) {
105
+ return owners;
106
+ }
107
+
108
+ function getTransaction(uint256 txId) external view txExists(txId) returns (
109
+ address to,
110
+ uint256 value,
111
+ bytes memory data,
112
+ bool executed,
113
+ uint256 numConfirmations
114
+ ) {
115
+ Transaction storage t = transactions[txId];
116
+ return (t.to, t.value, t.data, t.executed, t.confirmations);
117
+ }
118
+
119
+ function getTransactionCount(bool pending, bool executed) external view returns (uint256 count) {
120
+ for (uint256 i = 0; i < transactionCount; i++) {
121
+ if ((pending && !transactions[i].executed) || (executed && transactions[i].executed)) {
122
+ count++;
123
+ }
124
+ }
125
+ }
126
+
127
+ function isConfirmed(uint256 txId) external view returns (bool) {
128
+ return transactions[txId].confirmations >= required;
129
+ }
130
+
131
+ receive() external payable {
132
+ emit Deposited(msg.sender, msg.value);
133
+ }
134
+ }
135
+ `;
136
+ //# sourceMappingURL=multisig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multisig.js","sourceRoot":"","sources":["../../../src/generator/templates/multisig.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsIhC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const MULTISIG_TEMPLATE = "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ncontract MultisigWallet {\n address[] public owners;\n uint256 public required;\n uint256 public transactionCount;\n\n struct Transaction {\n address to;\n uint256 value;\n bytes data;\n bool executed;\n uint256 confirmations;\n }\n\n mapping(uint256 => Transaction) public transactions;\n mapping(address => bool) public isOwner;\n mapping(uint256 => mapping(address => bool)) public confirmations;\n\n event Submitted(uint256 indexed txId, address indexed submitter, address indexed to, uint256 value);\n event Confirmed(uint256 indexed txId, address indexed confirmer);\n event Revoked(uint256 indexed txId, address indexed revoker);\n event Executed(uint256 indexed txId);\n event ExecutionFailed(uint256 indexed txId);\n event Deposited(address indexed sender, uint256 value);\n\n modifier onlyOwner() {\n require(isOwner[msg.sender], \"Not owner\");\n _;\n }\n\n modifier txExists(uint256 txId) {\n require(txId < transactionCount, \"Tx does not exist\");\n _;\n }\n\n modifier notExecuted(uint256 txId) {\n require(!transactions[txId].executed, \"Already executed\");\n _;\n }\n\n modifier notConfirmed(uint256 txId) {\n require(!confirmations[txId][msg.sender], \"Already confirmed\");\n _;\n }\n\n constructor(address[] memory _owners) {\n require(_owners.length > 0, \"Owners required\");\n uint256 _required = {{REQUIRED_CONFIRMATIONS}};\n require(_required > 0 && _required <= _owners.length, \"Invalid required count\");\n for (uint256 i = 0; i < _owners.length; i++) {\n address o = _owners[i];\n require(o != address(0), \"Invalid owner\");\n require(!isOwner[o], \"Duplicate owner\");\n isOwner[o] = true;\n owners.push(o);\n }\n required = _required;\n }\n\n function submit(address to, uint256 value, bytes calldata data) external onlyOwner returns (uint256) {\n uint256 txId = transactionCount;\n transactions[txId] = Transaction({\n to: to,\n value: value,\n data: data,\n executed: false,\n confirmations: 0\n });\n transactionCount++;\n emit Submitted(txId, msg.sender, to, value);\n return txId;\n }\n\n function confirm(uint256 txId) external onlyOwner txExists(txId) notExecuted(txId) notConfirmed(txId) {\n Transaction storage t = transactions[txId];\n t.confirmations++;\n confirmations[txId][msg.sender] = true;\n emit Confirmed(txId, msg.sender);\n }\n\n function execute(uint256 txId) external onlyOwner txExists(txId) notExecuted(txId) {\n Transaction storage t = transactions[txId];\n require(t.confirmations >= required, \"Not enough confirmations\");\n t.executed = true;\n (bool success, ) = t.to.call{value: t.value}(t.data);\n if (success) {\n emit Executed(txId);\n } else {\n t.executed = false;\n emit ExecutionFailed(txId);\n }\n }\n\n function revoke(uint256 txId) external onlyOwner txExists(txId) notExecuted(txId) {\n require(confirmations[txId][msg.sender], \"Not confirmed\");\n Transaction storage t = transactions[txId];\n t.confirmations--;\n confirmations[txId][msg.sender] = false;\n emit Revoked(txId, msg.sender);\n }\n\n function getOwners() external view returns (address[] memory) {\n return owners;\n }\n\n function getTransaction(uint256 txId) external view txExists(txId) returns (\n address to,\n uint256 value,\n bytes memory data,\n bool executed,\n uint256 numConfirmations\n ) {\n Transaction storage t = transactions[txId];\n return (t.to, t.value, t.data, t.executed, t.confirmations);\n }\n\n function getTransactionCount(bool pending, bool executed) external view returns (uint256 count) {\n for (uint256 i = 0; i < transactionCount; i++) {\n if ((pending && !transactions[i].executed) || (executed && transactions[i].executed)) {\n count++;\n }\n }\n }\n\n function isConfirmed(uint256 txId) external view returns (bool) {\n return transactions[txId].confirmations >= required;\n }\n\n receive() external payable {\n emit Deposited(msg.sender, msg.value);\n }\n}\n";
2
+ //# sourceMappingURL=multisig.sol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multisig.sol.d.ts","sourceRoot":"","sources":["../../../src/generator/templates/multisig.sol.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,o+IAsI7B,CAAC"}
@@ -0,0 +1,136 @@
1
+ export const MULTISIG_TEMPLATE = `// SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.20;
3
+
4
+ contract MultisigWallet {
5
+ address[] public owners;
6
+ uint256 public required;
7
+ uint256 public transactionCount;
8
+
9
+ struct Transaction {
10
+ address to;
11
+ uint256 value;
12
+ bytes data;
13
+ bool executed;
14
+ uint256 confirmations;
15
+ }
16
+
17
+ mapping(uint256 => Transaction) public transactions;
18
+ mapping(address => bool) public isOwner;
19
+ mapping(uint256 => mapping(address => bool)) public confirmations;
20
+
21
+ event Submitted(uint256 indexed txId, address indexed submitter, address indexed to, uint256 value);
22
+ event Confirmed(uint256 indexed txId, address indexed confirmer);
23
+ event Revoked(uint256 indexed txId, address indexed revoker);
24
+ event Executed(uint256 indexed txId);
25
+ event ExecutionFailed(uint256 indexed txId);
26
+ event Deposited(address indexed sender, uint256 value);
27
+
28
+ modifier onlyOwner() {
29
+ require(isOwner[msg.sender], "Not owner");
30
+ _;
31
+ }
32
+
33
+ modifier txExists(uint256 txId) {
34
+ require(txId < transactionCount, "Tx does not exist");
35
+ _;
36
+ }
37
+
38
+ modifier notExecuted(uint256 txId) {
39
+ require(!transactions[txId].executed, "Already executed");
40
+ _;
41
+ }
42
+
43
+ modifier notConfirmed(uint256 txId) {
44
+ require(!confirmations[txId][msg.sender], "Already confirmed");
45
+ _;
46
+ }
47
+
48
+ constructor(address[] memory _owners) {
49
+ require(_owners.length > 0, "Owners required");
50
+ uint256 _required = {{REQUIRED_CONFIRMATIONS}};
51
+ require(_required > 0 && _required <= _owners.length, "Invalid required count");
52
+ for (uint256 i = 0; i < _owners.length; i++) {
53
+ address o = _owners[i];
54
+ require(o != address(0), "Invalid owner");
55
+ require(!isOwner[o], "Duplicate owner");
56
+ isOwner[o] = true;
57
+ owners.push(o);
58
+ }
59
+ required = _required;
60
+ }
61
+
62
+ function submit(address to, uint256 value, bytes calldata data) external onlyOwner returns (uint256) {
63
+ uint256 txId = transactionCount;
64
+ transactions[txId] = Transaction({
65
+ to: to,
66
+ value: value,
67
+ data: data,
68
+ executed: false,
69
+ confirmations: 0
70
+ });
71
+ transactionCount++;
72
+ emit Submitted(txId, msg.sender, to, value);
73
+ return txId;
74
+ }
75
+
76
+ function confirm(uint256 txId) external onlyOwner txExists(txId) notExecuted(txId) notConfirmed(txId) {
77
+ Transaction storage t = transactions[txId];
78
+ t.confirmations++;
79
+ confirmations[txId][msg.sender] = true;
80
+ emit Confirmed(txId, msg.sender);
81
+ }
82
+
83
+ function execute(uint256 txId) external onlyOwner txExists(txId) notExecuted(txId) {
84
+ Transaction storage t = transactions[txId];
85
+ require(t.confirmations >= required, "Not enough confirmations");
86
+ t.executed = true;
87
+ (bool success, ) = t.to.call{value: t.value}(t.data);
88
+ if (success) {
89
+ emit Executed(txId);
90
+ } else {
91
+ t.executed = false;
92
+ emit ExecutionFailed(txId);
93
+ }
94
+ }
95
+
96
+ function revoke(uint256 txId) external onlyOwner txExists(txId) notExecuted(txId) {
97
+ require(confirmations[txId][msg.sender], "Not confirmed");
98
+ Transaction storage t = transactions[txId];
99
+ t.confirmations--;
100
+ confirmations[txId][msg.sender] = false;
101
+ emit Revoked(txId, msg.sender);
102
+ }
103
+
104
+ function getOwners() external view returns (address[] memory) {
105
+ return owners;
106
+ }
107
+
108
+ function getTransaction(uint256 txId) external view txExists(txId) returns (
109
+ address to,
110
+ uint256 value,
111
+ bytes memory data,
112
+ bool executed,
113
+ uint256 numConfirmations
114
+ ) {
115
+ Transaction storage t = transactions[txId];
116
+ return (t.to, t.value, t.data, t.executed, t.confirmations);
117
+ }
118
+
119
+ function getTransactionCount(bool pending, bool executed) external view returns (uint256 count) {
120
+ for (uint256 i = 0; i < transactionCount; i++) {
121
+ if ((pending && !transactions[i].executed) || (executed && transactions[i].executed)) {
122
+ count++;
123
+ }
124
+ }
125
+ }
126
+
127
+ function isConfirmed(uint256 txId) external view returns (bool) {
128
+ return transactions[txId].confirmations >= required;
129
+ }
130
+
131
+ receive() external payable {
132
+ emit Deposited(msg.sender, msg.value);
133
+ }
134
+ }
135
+ `;
136
+ //# sourceMappingURL=multisig.sol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multisig.sol.js","sourceRoot":"","sources":["../../../src/generator/templates/multisig.sol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsIhC,CAAC"}