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,71 @@
1
+ const SOLIDITY_SYSTEM_PROMPT = `You are a Solidity smart contract developer specializing in BNB Smart Chain and opBNB.
2
+ Follow these rules strictly:
3
+ - Use Solidity ^0.8.20
4
+ - Contracts must be fully self-contained with NO import statements
5
+ - Ensure compatibility with BSC and opBNB (EVM-compatible)
6
+ - Always include an SPDX license identifier comment at the top (e.g., // SPDX-License-Identifier: MIT)
7
+ - Return ONLY the Solidity source code, no markdown fences, no explanations`;
8
+ const OPENROUTER_MODEL = process.env.OPENROUTER_MODEL || "anthropic/claude-sonnet-4-20250514";
9
+ const MAX_TOKENS = 4096;
10
+ function stripMarkdownFences(text) {
11
+ return text.replace(/^```(?:solidity)?\n?/m, "").replace(/\n?```\s*$/m, "").trim();
12
+ }
13
+ async function openRouterChat(apiKey, userMessage) {
14
+ const response = await fetch("https://openrouter.ai/api/v1/chat/completions", {
15
+ method: "POST",
16
+ headers: {
17
+ "Authorization": `Bearer ${apiKey}`,
18
+ "Content-Type": "application/json",
19
+ "HTTP-Referer": "https://github.com/clawcontract",
20
+ "X-Title": "ClawContract",
21
+ },
22
+ body: JSON.stringify({
23
+ model: OPENROUTER_MODEL,
24
+ max_tokens: MAX_TOKENS,
25
+ messages: [
26
+ { role: "system", content: SOLIDITY_SYSTEM_PROMPT },
27
+ { role: "user", content: userMessage },
28
+ ],
29
+ }),
30
+ });
31
+ if (!response.ok) {
32
+ const errorText = await response.text();
33
+ throw new Error(`OpenRouter API error (${response.status}): ${errorText.slice(0, 200)}`);
34
+ }
35
+ const data = (await response.json());
36
+ if (data.error?.message) {
37
+ throw new Error(`OpenRouter error: ${data.error.message}`);
38
+ }
39
+ const content = data.choices?.[0]?.message?.content;
40
+ if (!content) {
41
+ throw new Error("No text response from OpenRouter");
42
+ }
43
+ return stripMarkdownFences(content.trim());
44
+ }
45
+ function createOpenRouterClient(apiKey) {
46
+ return {
47
+ isAvailable: () => true,
48
+ provider: () => "openrouter",
49
+ customizeContract: (template, description) => openRouterChat(apiKey, `I have the following Solidity contract template:\n\n${template}\n\nUser request: "${description}"\n\nCustomize this template based on the user's request. Fill in all placeholder values (anything in {{DOUBLE_BRACES}}) with appropriate values extracted from the description. Add any additional features the user requested. Keep the contract self-contained with no imports. Return ONLY the complete Solidity source code.`),
50
+ generateContract: (description) => openRouterChat(apiKey, `Generate a complete Solidity smart contract based on this description:\n\n"${description}"\n\nThe contract must be:\n- Fully self-contained (no imports)\n- Compatible with BSC/opBNB\n- Using Solidity ^0.8.20\n- Well-structured with appropriate access control\n- Including relevant events and error handling\n\nReturn ONLY the Solidity source code.`),
51
+ suggestFixes: (code, issues) => {
52
+ const issueList = issues.map((i, idx) => `${idx + 1}. ${i}`).join("\n");
53
+ return openRouterChat(apiKey, `The following Solidity contract has security issues found by Slither:\n\nContract:\n${code}\n\nIssues:\n${issueList}\n\nFix all the listed issues and return the corrected Solidity source code. Keep the contract self-contained with no imports. Return ONLY the complete fixed Solidity source code.`);
54
+ },
55
+ };
56
+ }
57
+ const NULL_CLIENT = {
58
+ isAvailable: () => false,
59
+ provider: () => null,
60
+ customizeContract: () => { throw new Error("No LLM API key configured. Set OPENROUTER_API_KEY."); },
61
+ generateContract: () => { throw new Error("No LLM API key configured. Set OPENROUTER_API_KEY."); },
62
+ suggestFixes: () => { throw new Error("No LLM API key configured. Set OPENROUTER_API_KEY."); },
63
+ };
64
+ export function createLLMClient() {
65
+ const openrouterKey = process.env.OPENROUTER_API_KEY;
66
+ if (openrouterKey) {
67
+ return createOpenRouterClient(openrouterKey);
68
+ }
69
+ return NULL_CLIENT;
70
+ }
71
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/generator/llm.ts"],"names":[],"mappings":"AAUA,MAAM,sBAAsB,GAAG;;;;;;4EAM6C,CAAC;AAE7E,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,oCAAoC,CAAC;AAC9F,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACrF,CAAC;AASD,KAAK,UAAU,cAAc,CAAC,MAAc,EAAE,WAAmB;IAC/D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,+CAA+C,EAAE;QAC5E,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,MAAM,EAAE;YACnC,cAAc,EAAE,kBAAkB;YAClC,cAAc,EAAE,iCAAiC;YACjD,SAAS,EAAE,cAAc;SAC1B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,gBAAgB;YACvB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,sBAAsB,EAAE;gBACnD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;aACvC;SACF,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;IAE3D,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;IACpD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,mBAAmB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAc;IAC5C,OAAO;QACL,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI;QACvB,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY;QAC5B,iBAAiB,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAC3C,cAAc,CAAC,MAAM,EAAE,uDAAuD,QAAQ,sBAAsB,WAAW,mUAAmU,CAAC;QAC7b,gBAAgB,EAAE,CAAC,WAAW,EAAE,EAAE,CAChC,cAAc,CAAC,MAAM,EAAE,8EAA8E,WAAW,oQAAoQ,CAAC;QACvX,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxE,OAAO,cAAc,CAAC,MAAM,EAAE,uFAAuF,IAAI,gBAAgB,SAAS,qLAAqL,CAAC,CAAC;QAC3U,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAc;IAC7B,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;IACxB,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI;IACpB,iBAAiB,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC,CAAC;IACnG,gBAAgB,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC,CAAC;IAClG,YAAY,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC,CAAC;CAC/F,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAErD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const ERC20_TEMPLATE = "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ncontract {{TOKEN_NAME}} {\n string public name;\n string public symbol;\n uint8 public decimals;\n uint256 public totalSupply;\n address public owner;\n bool public paused;\n\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Transfer(address indexed from, address indexed to, uint256 value);\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Paused(address account);\n event Unpaused(address account);\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n modifier onlyOwner() {\n require(msg.sender == owner, \"Not owner\");\n _;\n }\n\n modifier whenNotPaused() {\n require(!paused, \"Paused\");\n _;\n }\n\n constructor() {\n name = \"{{TOKEN_NAME}}\";\n symbol = \"{{TOKEN_SYMBOL}}\";\n decimals = {{DECIMALS}};\n owner = {{OWNER_ADDRESS}};\n paused = false;\n uint256 initialSupply = {{INITIAL_SUPPLY}} * (10 ** uint256(decimals));\n totalSupply = initialSupply;\n balanceOf[owner] = initialSupply;\n emit Transfer(address(0), owner, initialSupply);\n }\n\n function transfer(address to, uint256 value) external whenNotPaused returns (bool) {\n require(to != address(0), \"Transfer to zero address\");\n require(balanceOf[msg.sender] >= value, \"Insufficient balance\");\n balanceOf[msg.sender] -= value;\n balanceOf[to] += value;\n emit Transfer(msg.sender, to, value);\n return true;\n }\n\n function approve(address spender, uint256 value) external whenNotPaused returns (bool) {\n require(spender != address(0), \"Approve to zero address\");\n allowance[msg.sender][spender] = value;\n emit Approval(msg.sender, spender, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external whenNotPaused returns (bool) {\n require(to != address(0), \"Transfer to zero address\");\n require(balanceOf[from] >= value, \"Insufficient balance\");\n require(allowance[from][msg.sender] >= value, \"Insufficient allowance\");\n balanceOf[from] -= value;\n balanceOf[to] += value;\n allowance[from][msg.sender] -= value;\n emit Transfer(from, to, value);\n return true;\n }\n\n function mint(address to, uint256 value) external onlyOwner whenNotPaused {\n require(to != address(0), \"Mint to zero address\");\n totalSupply += value;\n balanceOf[to] += value;\n emit Transfer(address(0), to, value);\n }\n\n function burn(uint256 value) external whenNotPaused {\n require(balanceOf[msg.sender] >= value, \"Insufficient balance\");\n balanceOf[msg.sender] -= value;\n totalSupply -= value;\n emit Transfer(msg.sender, address(0), value);\n }\n\n function pause() external onlyOwner {\n paused = true;\n emit Paused(msg.sender);\n }\n\n function unpause() external onlyOwner {\n paused = false;\n emit Unpaused(msg.sender);\n }\n\n function transferOwnership(address newOwner) external onlyOwner {\n require(newOwner != address(0), \"New owner is zero address\");\n emit OwnershipTransferred(owner, newOwner);\n owner = newOwner;\n }\n\n function renounceOwnership() external onlyOwner {\n emit OwnershipTransferred(owner, address(0));\n owner = address(0);\n }\n}\n";
2
+ //# sourceMappingURL=erc20.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erc20.d.ts","sourceRoot":"","sources":["../../../src/generator/templates/erc20.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,glHAwG1B,CAAC"}
@@ -0,0 +1,106 @@
1
+ export const ERC20_TEMPLATE = `// SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.20;
3
+
4
+ contract {{TOKEN_NAME}} {
5
+ string public name;
6
+ string public symbol;
7
+ uint8 public decimals;
8
+ uint256 public totalSupply;
9
+ address public owner;
10
+ bool public paused;
11
+
12
+ mapping(address => uint256) public balanceOf;
13
+ mapping(address => mapping(address => uint256)) public allowance;
14
+
15
+ event Transfer(address indexed from, address indexed to, uint256 value);
16
+ event Approval(address indexed owner, address indexed spender, uint256 value);
17
+ event Paused(address account);
18
+ event Unpaused(address account);
19
+ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
20
+
21
+ modifier onlyOwner() {
22
+ require(msg.sender == owner, "Not owner");
23
+ _;
24
+ }
25
+
26
+ modifier whenNotPaused() {
27
+ require(!paused, "Paused");
28
+ _;
29
+ }
30
+
31
+ constructor() {
32
+ name = "{{TOKEN_NAME}}";
33
+ symbol = "{{TOKEN_SYMBOL}}";
34
+ decimals = {{DECIMALS}};
35
+ owner = {{OWNER_ADDRESS}};
36
+ paused = false;
37
+ uint256 initialSupply = {{INITIAL_SUPPLY}} * (10 ** uint256(decimals));
38
+ totalSupply = initialSupply;
39
+ balanceOf[owner] = initialSupply;
40
+ emit Transfer(address(0), owner, initialSupply);
41
+ }
42
+
43
+ function transfer(address to, uint256 value) external whenNotPaused returns (bool) {
44
+ require(to != address(0), "Transfer to zero address");
45
+ require(balanceOf[msg.sender] >= value, "Insufficient balance");
46
+ balanceOf[msg.sender] -= value;
47
+ balanceOf[to] += value;
48
+ emit Transfer(msg.sender, to, value);
49
+ return true;
50
+ }
51
+
52
+ function approve(address spender, uint256 value) external whenNotPaused returns (bool) {
53
+ require(spender != address(0), "Approve to zero address");
54
+ allowance[msg.sender][spender] = value;
55
+ emit Approval(msg.sender, spender, value);
56
+ return true;
57
+ }
58
+
59
+ function transferFrom(address from, address to, uint256 value) external whenNotPaused returns (bool) {
60
+ require(to != address(0), "Transfer to zero address");
61
+ require(balanceOf[from] >= value, "Insufficient balance");
62
+ require(allowance[from][msg.sender] >= value, "Insufficient allowance");
63
+ balanceOf[from] -= value;
64
+ balanceOf[to] += value;
65
+ allowance[from][msg.sender] -= value;
66
+ emit Transfer(from, to, value);
67
+ return true;
68
+ }
69
+
70
+ function mint(address to, uint256 value) external onlyOwner whenNotPaused {
71
+ require(to != address(0), "Mint to zero address");
72
+ totalSupply += value;
73
+ balanceOf[to] += value;
74
+ emit Transfer(address(0), to, value);
75
+ }
76
+
77
+ function burn(uint256 value) external whenNotPaused {
78
+ require(balanceOf[msg.sender] >= value, "Insufficient balance");
79
+ balanceOf[msg.sender] -= value;
80
+ totalSupply -= value;
81
+ emit Transfer(msg.sender, address(0), value);
82
+ }
83
+
84
+ function pause() external onlyOwner {
85
+ paused = true;
86
+ emit Paused(msg.sender);
87
+ }
88
+
89
+ function unpause() external onlyOwner {
90
+ paused = false;
91
+ emit Unpaused(msg.sender);
92
+ }
93
+
94
+ function transferOwnership(address newOwner) external onlyOwner {
95
+ require(newOwner != address(0), "New owner is zero address");
96
+ emit OwnershipTransferred(owner, newOwner);
97
+ owner = newOwner;
98
+ }
99
+
100
+ function renounceOwnership() external onlyOwner {
101
+ emit OwnershipTransferred(owner, address(0));
102
+ owner = address(0);
103
+ }
104
+ }
105
+ `;
106
+ //# sourceMappingURL=erc20.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erc20.js","sourceRoot":"","sources":["../../../src/generator/templates/erc20.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwG7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const ERC20_TEMPLATE = "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ncontract {{TOKEN_NAME}} {\n string public name;\n string public symbol;\n uint8 public decimals;\n uint256 public totalSupply;\n address public owner;\n bool public paused;\n\n mapping(address => uint256) public balanceOf;\n mapping(address => mapping(address => uint256)) public allowance;\n\n event Transfer(address indexed from, address indexed to, uint256 value);\n event Approval(address indexed owner, address indexed spender, uint256 value);\n event Paused(address account);\n event Unpaused(address account);\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n modifier onlyOwner() {\n require(msg.sender == owner, \"Not owner\");\n _;\n }\n\n modifier whenNotPaused() {\n require(!paused, \"Paused\");\n _;\n }\n\n constructor() {\n name = \"{{TOKEN_NAME}}\";\n symbol = \"{{TOKEN_SYMBOL}}\";\n decimals = {{DECIMALS}};\n owner = {{OWNER_ADDRESS}};\n paused = false;\n uint256 initialSupply = {{INITIAL_SUPPLY}} * (10 ** uint256(decimals));\n totalSupply = initialSupply;\n balanceOf[owner] = initialSupply;\n emit Transfer(address(0), owner, initialSupply);\n }\n\n function transfer(address to, uint256 value) external whenNotPaused returns (bool) {\n require(to != address(0), \"Transfer to zero address\");\n require(balanceOf[msg.sender] >= value, \"Insufficient balance\");\n balanceOf[msg.sender] -= value;\n balanceOf[to] += value;\n emit Transfer(msg.sender, to, value);\n return true;\n }\n\n function approve(address spender, uint256 value) external whenNotPaused returns (bool) {\n require(spender != address(0), \"Approve to zero address\");\n allowance[msg.sender][spender] = value;\n emit Approval(msg.sender, spender, value);\n return true;\n }\n\n function transferFrom(address from, address to, uint256 value) external whenNotPaused returns (bool) {\n require(to != address(0), \"Transfer to zero address\");\n require(balanceOf[from] >= value, \"Insufficient balance\");\n require(allowance[from][msg.sender] >= value, \"Insufficient allowance\");\n balanceOf[from] -= value;\n balanceOf[to] += value;\n allowance[from][msg.sender] -= value;\n emit Transfer(from, to, value);\n return true;\n }\n\n function mint(address to, uint256 value) external onlyOwner whenNotPaused {\n require(to != address(0), \"Mint to zero address\");\n totalSupply += value;\n balanceOf[to] += value;\n emit Transfer(address(0), to, value);\n }\n\n function burn(uint256 value) external whenNotPaused {\n require(balanceOf[msg.sender] >= value, \"Insufficient balance\");\n balanceOf[msg.sender] -= value;\n totalSupply -= value;\n emit Transfer(msg.sender, address(0), value);\n }\n\n function pause() external onlyOwner {\n paused = true;\n emit Paused(msg.sender);\n }\n\n function unpause() external onlyOwner {\n paused = false;\n emit Unpaused(msg.sender);\n }\n\n function transferOwnership(address newOwner) external onlyOwner {\n require(newOwner != address(0), \"New owner is zero address\");\n emit OwnershipTransferred(owner, newOwner);\n owner = newOwner;\n }\n\n function renounceOwnership() external onlyOwner {\n emit OwnershipTransferred(owner, address(0));\n owner = address(0);\n }\n}\n";
2
+ //# sourceMappingURL=erc20.sol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erc20.sol.d.ts","sourceRoot":"","sources":["../../../src/generator/templates/erc20.sol.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,glHAwG1B,CAAC"}
@@ -0,0 +1,106 @@
1
+ export const ERC20_TEMPLATE = `// SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.20;
3
+
4
+ contract {{TOKEN_NAME}} {
5
+ string public name;
6
+ string public symbol;
7
+ uint8 public decimals;
8
+ uint256 public totalSupply;
9
+ address public owner;
10
+ bool public paused;
11
+
12
+ mapping(address => uint256) public balanceOf;
13
+ mapping(address => mapping(address => uint256)) public allowance;
14
+
15
+ event Transfer(address indexed from, address indexed to, uint256 value);
16
+ event Approval(address indexed owner, address indexed spender, uint256 value);
17
+ event Paused(address account);
18
+ event Unpaused(address account);
19
+ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
20
+
21
+ modifier onlyOwner() {
22
+ require(msg.sender == owner, "Not owner");
23
+ _;
24
+ }
25
+
26
+ modifier whenNotPaused() {
27
+ require(!paused, "Paused");
28
+ _;
29
+ }
30
+
31
+ constructor() {
32
+ name = "{{TOKEN_NAME}}";
33
+ symbol = "{{TOKEN_SYMBOL}}";
34
+ decimals = {{DECIMALS}};
35
+ owner = {{OWNER_ADDRESS}};
36
+ paused = false;
37
+ uint256 initialSupply = {{INITIAL_SUPPLY}} * (10 ** uint256(decimals));
38
+ totalSupply = initialSupply;
39
+ balanceOf[owner] = initialSupply;
40
+ emit Transfer(address(0), owner, initialSupply);
41
+ }
42
+
43
+ function transfer(address to, uint256 value) external whenNotPaused returns (bool) {
44
+ require(to != address(0), "Transfer to zero address");
45
+ require(balanceOf[msg.sender] >= value, "Insufficient balance");
46
+ balanceOf[msg.sender] -= value;
47
+ balanceOf[to] += value;
48
+ emit Transfer(msg.sender, to, value);
49
+ return true;
50
+ }
51
+
52
+ function approve(address spender, uint256 value) external whenNotPaused returns (bool) {
53
+ require(spender != address(0), "Approve to zero address");
54
+ allowance[msg.sender][spender] = value;
55
+ emit Approval(msg.sender, spender, value);
56
+ return true;
57
+ }
58
+
59
+ function transferFrom(address from, address to, uint256 value) external whenNotPaused returns (bool) {
60
+ require(to != address(0), "Transfer to zero address");
61
+ require(balanceOf[from] >= value, "Insufficient balance");
62
+ require(allowance[from][msg.sender] >= value, "Insufficient allowance");
63
+ balanceOf[from] -= value;
64
+ balanceOf[to] += value;
65
+ allowance[from][msg.sender] -= value;
66
+ emit Transfer(from, to, value);
67
+ return true;
68
+ }
69
+
70
+ function mint(address to, uint256 value) external onlyOwner whenNotPaused {
71
+ require(to != address(0), "Mint to zero address");
72
+ totalSupply += value;
73
+ balanceOf[to] += value;
74
+ emit Transfer(address(0), to, value);
75
+ }
76
+
77
+ function burn(uint256 value) external whenNotPaused {
78
+ require(balanceOf[msg.sender] >= value, "Insufficient balance");
79
+ balanceOf[msg.sender] -= value;
80
+ totalSupply -= value;
81
+ emit Transfer(msg.sender, address(0), value);
82
+ }
83
+
84
+ function pause() external onlyOwner {
85
+ paused = true;
86
+ emit Paused(msg.sender);
87
+ }
88
+
89
+ function unpause() external onlyOwner {
90
+ paused = false;
91
+ emit Unpaused(msg.sender);
92
+ }
93
+
94
+ function transferOwnership(address newOwner) external onlyOwner {
95
+ require(newOwner != address(0), "New owner is zero address");
96
+ emit OwnershipTransferred(owner, newOwner);
97
+ owner = newOwner;
98
+ }
99
+
100
+ function renounceOwnership() external onlyOwner {
101
+ emit OwnershipTransferred(owner, address(0));
102
+ owner = address(0);
103
+ }
104
+ }
105
+ `;
106
+ //# sourceMappingURL=erc20.sol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erc20.sol.js","sourceRoot":"","sources":["../../../src/generator/templates/erc20.sol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwG7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const ERC721_TEMPLATE = "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IERC721Receiver {\n function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\n}\n\ncontract {{NFT_NAME}} {\n string public name;\n string public symbol;\n string public baseURI;\n address public owner;\n uint256 public totalSupply;\n uint256 public maxSupply;\n\n mapping(uint256 => address) private _owners;\n mapping(address => uint256) private _balances;\n mapping(uint256 => address) private _tokenApprovals;\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n mapping(uint256 => string) private _tokenURIs;\n\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n modifier onlyOwner() {\n require(msg.sender == owner, \"Not owner\");\n _;\n }\n\n constructor() {\n name = \"{{NFT_NAME}}\";\n symbol = \"{{NFT_SYMBOL}}\";\n baseURI = \"{{BASE_URI}}\";\n maxSupply = {{MAX_SUPPLY}};\n owner = msg.sender;\n }\n\n function balanceOf(address _owner) external view returns (uint256) {\n require(_owner != address(0), \"Zero address\");\n return _balances[_owner];\n }\n\n function ownerOf(uint256 tokenId) public view returns (address) {\n address tokenOwner = _owners[tokenId];\n require(tokenOwner != address(0), \"Token does not exist\");\n return tokenOwner;\n }\n\n function tokenURI(uint256 tokenId) external view returns (string memory) {\n require(_owners[tokenId] != address(0), \"Token does not exist\");\n string memory _tokenURI = _tokenURIs[tokenId];\n if (bytes(_tokenURI).length > 0) {\n return _tokenURI;\n }\n return string(abi.encodePacked(baseURI, _toString(tokenId)));\n }\n\n function approve(address to, uint256 tokenId) external {\n address tokenOwner = ownerOf(tokenId);\n require(msg.sender == tokenOwner || _operatorApprovals[tokenOwner][msg.sender], \"Not authorized\");\n _tokenApprovals[tokenId] = to;\n emit Approval(tokenOwner, to, tokenId);\n }\n\n function getApproved(uint256 tokenId) public view returns (address) {\n require(_owners[tokenId] != address(0), \"Token does not exist\");\n return _tokenApprovals[tokenId];\n }\n\n function setApprovalForAll(address operator, bool approved) external {\n require(operator != msg.sender, \"Approve to caller\");\n _operatorApprovals[msg.sender][operator] = approved;\n emit ApprovalForAll(msg.sender, operator, approved);\n }\n\n function isApprovedForAll(address _owner, address operator) public view returns (bool) {\n return _operatorApprovals[_owner][operator];\n }\n\n function transferFrom(address from, address to, uint256 tokenId) public {\n require(_isApprovedOrOwner(msg.sender, tokenId), \"Not authorized\");\n _transfer(from, to, tokenId);\n }\n\n function safeTransferFrom(address from, address to, uint256 tokenId) external {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public {\n transferFrom(from, to, tokenId);\n require(_checkOnERC721Received(from, to, tokenId, data), \"Non-ERC721Receiver\");\n }\n\n function mint(address to) external onlyOwner returns (uint256) {\n require(to != address(0), \"Mint to zero address\");\n uint256 tokenId = totalSupply + 1;\n require(tokenId <= maxSupply, \"Max supply reached\");\n totalSupply = tokenId;\n _balances[to] += 1;\n _owners[tokenId] = to;\n emit Transfer(address(0), to, tokenId);\n return tokenId;\n }\n\n function mintWithURI(address to, string calldata uri) external onlyOwner returns (uint256) {\n require(to != address(0), \"Mint to zero address\");\n uint256 tokenId = totalSupply + 1;\n require(tokenId <= maxSupply, \"Max supply reached\");\n totalSupply = tokenId;\n _balances[to] += 1;\n _owners[tokenId] = to;\n _tokenURIs[tokenId] = uri;\n emit Transfer(address(0), to, tokenId);\n return tokenId;\n }\n\n function setBaseURI(string calldata newBaseURI) external onlyOwner {\n baseURI = newBaseURI;\n }\n\n function transferOwnership(address newOwner) external onlyOwner {\n require(newOwner != address(0), \"New owner is zero address\");\n owner = newOwner;\n }\n\n function supportsInterface(bytes4 interfaceId) external pure returns (bool) {\n return interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f || interfaceId == 0x01ffc9a7;\n }\n\n function _transfer(address from, address to, uint256 tokenId) internal {\n require(ownerOf(tokenId) == from, \"Not token owner\");\n require(to != address(0), \"Transfer to zero address\");\n _tokenApprovals[tokenId] = address(0);\n _balances[from] -= 1;\n _balances[to] += 1;\n _owners[tokenId] = to;\n emit Transfer(from, to, tokenId);\n }\n\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {\n address tokenOwner = ownerOf(tokenId);\n return (spender == tokenOwner || getApproved(tokenId) == spender || isApprovedForAll(tokenOwner, spender));\n }\n\n function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private returns (bool) {\n if (to.code.length > 0) {\n try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data) returns (bytes4 retval) {\n return retval == IERC721Receiver.onERC721Received.selector;\n } catch {\n return false;\n }\n }\n return true;\n }\n\n function _toString(uint256 value) internal pure returns (string memory) {\n if (value == 0) return \"0\";\n uint256 temp = value;\n uint256 digits;\n while (temp != 0) { digits++; temp /= 10; }\n bytes memory buffer = new bytes(digits);\n while (value != 0) { digits--; buffer[digits] = bytes1(uint8(48 + (value % 10))); value /= 10; }\n return string(buffer);\n }\n}\n";
2
+ //# sourceMappingURL=erc721.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erc721.d.ts","sourceRoot":"","sources":["../../../src/generator/templates/erc721.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,06MAsK3B,CAAC"}
@@ -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.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erc721.js","sourceRoot":"","sources":["../../../src/generator/templates/erc721.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsK9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const ERC721_TEMPLATE = "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ninterface IERC721Receiver {\n function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\n}\n\ncontract {{NFT_NAME}} {\n string public name;\n string public symbol;\n string public baseURI;\n address public owner;\n uint256 public totalSupply;\n uint256 public maxSupply;\n\n mapping(uint256 => address) private _owners;\n mapping(address => uint256) private _balances;\n mapping(uint256 => address) private _tokenApprovals;\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n mapping(uint256 => string) private _tokenURIs;\n\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n modifier onlyOwner() {\n require(msg.sender == owner, \"Not owner\");\n _;\n }\n\n constructor() {\n name = \"{{NFT_NAME}}\";\n symbol = \"{{NFT_SYMBOL}}\";\n baseURI = \"{{BASE_URI}}\";\n maxSupply = {{MAX_SUPPLY}};\n owner = msg.sender;\n }\n\n function balanceOf(address _owner) external view returns (uint256) {\n require(_owner != address(0), \"Zero address\");\n return _balances[_owner];\n }\n\n function ownerOf(uint256 tokenId) public view returns (address) {\n address tokenOwner = _owners[tokenId];\n require(tokenOwner != address(0), \"Token does not exist\");\n return tokenOwner;\n }\n\n function tokenURI(uint256 tokenId) external view returns (string memory) {\n require(_owners[tokenId] != address(0), \"Token does not exist\");\n string memory _tokenURI = _tokenURIs[tokenId];\n if (bytes(_tokenURI).length > 0) {\n return _tokenURI;\n }\n return string(abi.encodePacked(baseURI, _toString(tokenId)));\n }\n\n function approve(address to, uint256 tokenId) external {\n address tokenOwner = ownerOf(tokenId);\n require(msg.sender == tokenOwner || _operatorApprovals[tokenOwner][msg.sender], \"Not authorized\");\n _tokenApprovals[tokenId] = to;\n emit Approval(tokenOwner, to, tokenId);\n }\n\n function getApproved(uint256 tokenId) public view returns (address) {\n require(_owners[tokenId] != address(0), \"Token does not exist\");\n return _tokenApprovals[tokenId];\n }\n\n function setApprovalForAll(address operator, bool approved) external {\n require(operator != msg.sender, \"Approve to caller\");\n _operatorApprovals[msg.sender][operator] = approved;\n emit ApprovalForAll(msg.sender, operator, approved);\n }\n\n function isApprovedForAll(address _owner, address operator) public view returns (bool) {\n return _operatorApprovals[_owner][operator];\n }\n\n function transferFrom(address from, address to, uint256 tokenId) public {\n require(_isApprovedOrOwner(msg.sender, tokenId), \"Not authorized\");\n _transfer(from, to, tokenId);\n }\n\n function safeTransferFrom(address from, address to, uint256 tokenId) external {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public {\n transferFrom(from, to, tokenId);\n require(_checkOnERC721Received(from, to, tokenId, data), \"Non-ERC721Receiver\");\n }\n\n function mint(address to) external onlyOwner returns (uint256) {\n require(to != address(0), \"Mint to zero address\");\n uint256 tokenId = totalSupply + 1;\n require(tokenId <= maxSupply, \"Max supply reached\");\n totalSupply = tokenId;\n _balances[to] += 1;\n _owners[tokenId] = to;\n emit Transfer(address(0), to, tokenId);\n return tokenId;\n }\n\n function mintWithURI(address to, string calldata uri) external onlyOwner returns (uint256) {\n require(to != address(0), \"Mint to zero address\");\n uint256 tokenId = totalSupply + 1;\n require(tokenId <= maxSupply, \"Max supply reached\");\n totalSupply = tokenId;\n _balances[to] += 1;\n _owners[tokenId] = to;\n _tokenURIs[tokenId] = uri;\n emit Transfer(address(0), to, tokenId);\n return tokenId;\n }\n\n function setBaseURI(string calldata newBaseURI) external onlyOwner {\n baseURI = newBaseURI;\n }\n\n function transferOwnership(address newOwner) external onlyOwner {\n require(newOwner != address(0), \"New owner is zero address\");\n owner = newOwner;\n }\n\n function supportsInterface(bytes4 interfaceId) external pure returns (bool) {\n return interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f || interfaceId == 0x01ffc9a7;\n }\n\n function _transfer(address from, address to, uint256 tokenId) internal {\n require(ownerOf(tokenId) == from, \"Not token owner\");\n require(to != address(0), \"Transfer to zero address\");\n _tokenApprovals[tokenId] = address(0);\n _balances[from] -= 1;\n _balances[to] += 1;\n _owners[tokenId] = to;\n emit Transfer(from, to, tokenId);\n }\n\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {\n address tokenOwner = ownerOf(tokenId);\n return (spender == tokenOwner || getApproved(tokenId) == spender || isApprovedForAll(tokenOwner, spender));\n }\n\n function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private returns (bool) {\n if (to.code.length > 0) {\n try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data) returns (bytes4 retval) {\n return retval == IERC721Receiver.onERC721Received.selector;\n } catch {\n return false;\n }\n }\n return true;\n }\n\n function _toString(uint256 value) internal pure returns (string memory) {\n if (value == 0) return \"0\";\n uint256 temp = value;\n uint256 digits;\n while (temp != 0) { digits++; temp /= 10; }\n bytes memory buffer = new bytes(digits);\n while (value != 0) { digits--; buffer[digits] = bytes1(uint8(48 + (value % 10))); value /= 10; }\n return string(buffer);\n }\n}\n";
2
+ //# sourceMappingURL=erc721.sol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erc721.sol.d.ts","sourceRoot":"","sources":["../../../src/generator/templates/erc721.sol.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,06MAsK3B,CAAC"}