From eb3115d841cf5546b21eb3d3e84499d70954f1b2 Mon Sep 17 00:00:00 2001 From: OWK50GA Date: Fri, 29 Aug 2025 02:39:00 +0100 Subject: [PATCH 1/3] feat: added script for registerToken --- contracts/L1/package-lock.json | 515 +++++++++++++++++++++++++- contracts/L1/package.json | 2 + contracts/L1/scripts/registerToken.ts | 218 +++++++++++ 3 files changed, 730 insertions(+), 5 deletions(-) create mode 100644 contracts/L1/scripts/registerToken.ts diff --git a/contracts/L1/package-lock.json b/contracts/L1/package-lock.json index 722388b..8394e03 100644 --- a/contracts/L1/package-lock.json +++ b/contracts/L1/package-lock.json @@ -9,8 +9,10 @@ "version": "1.0.0", "dependencies": { "@types/node": "^22.15.21", + "chalk": "^5.6.0", "dotenv": "^16.5.0", "ethers": "^6.14.1", + "inquirer": "^12.9.4", "starknet": "^6.24.1", "ts-node": "^10.9.2" }, @@ -40,6 +42,386 @@ "node": ">=12" } }, + "node_modules/@inquirer/checkbox": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.2.tgz", + "integrity": "sha512-E+KExNurKcUJJdxmjglTl141EwxWyAHplvsYJQgSwXf8qiNWkTxTuCCqmhFEmbIXd4zLaGMfQFJ6WrZ7fSeV3g==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.16", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.16.tgz", + "integrity": "sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.0.tgz", + "integrity": "sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==", + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.18", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.18.tgz", + "integrity": "sha512-yeQN3AXjCm7+Hmq5L6Dm2wEDeBRdAZuyZ4I7tWSSanbxDzqM0KqzoDbKM7p4ebllAYdoQuPJS6N71/3L281i6w==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/external-editor": "^1.0.1", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.18.tgz", + "integrity": "sha512-xUjteYtavH7HwDMzq4Cn2X4Qsh5NozoDHCJTdoXg9HfZ4w3R6mxV1B9tL7DGJX2eq/zqtsFjhm0/RJIMGlh3ag==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.1.tgz", + "integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==", + "license": "MIT", + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.6.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", + "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.2.tgz", + "integrity": "sha512-hqOvBZj/MhQCpHUuD3MVq18SSoDNHy7wEnQ8mtvs71K8OPZVXJinOzcvQna33dNYLYE4LkA9BlhAhK6MJcsVbw==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.18.tgz", + "integrity": "sha512-7exgBm52WXZRczsydCVftozFTrrwbG5ySE0GqUd2zLNSBXyIucs2Wnm7ZKLe/aUu6NUg9dg7Q80QIHCdZJiY4A==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.18.tgz", + "integrity": "sha512-zXvzAGxPQTNk/SbT3carAD4Iqi6A2JS2qtcqQjsL22uvD+JfQzUrDEtPjLL7PLn8zlSNyPdY02IiQjzoL9TStA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/type": "^3.0.8", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.4.tgz", + "integrity": "sha512-MuxVZ1en1g5oGamXV3DWP89GEkdD54alcfhHd7InUW5BifAdKQEK9SLFa/5hlWbvuhMPlobF0WAx7Okq988Jxg==", + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.2.2", + "@inquirer/confirm": "^5.1.16", + "@inquirer/editor": "^4.2.18", + "@inquirer/expand": "^4.0.18", + "@inquirer/input": "^4.2.2", + "@inquirer/number": "^3.0.18", + "@inquirer/password": "^4.0.18", + "@inquirer/rawlist": "^4.1.6", + "@inquirer/search": "^3.1.1", + "@inquirer/select": "^4.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.6.tgz", + "integrity": "sha512-KOZqa3QNr3f0pMnufzL7K+nweFFCCBs6LCXZzXDrVGTyssjLeudn5ySktZYv1XiSqobyHRYYK0c6QsOxJEhXKA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.1.tgz", + "integrity": "sha512-TkMUY+A2p2EYVY3GCTItYGvqT6LiLzHBnqsU1rJbrpXUijFfM6zvUx0R4civofVwFCmJZcKqOVwwWAjplKkhxA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.2.tgz", + "integrity": "sha512-nwous24r31M+WyDEHV+qckXkepvihxhnyIaod2MG7eCE6G0Zm/HUF6jgN8GXgf4U7AU6SLseKdanY195cwvU6w==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", + "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -228,6 +610,21 @@ "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "license": "MIT" }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", @@ -282,10 +679,9 @@ } }, "node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", + "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -294,6 +690,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chardet": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", + "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", + "license": "MIT" + }, "node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", @@ -323,6 +725,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -558,6 +969,44 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer": { + "version": "12.9.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.9.4.tgz", + "integrity": "sha512-5bV3LOgLtMAiJq1QpaUddfRrvaX59wiMYppS7z2jNRSQ64acI0yqx7WMxWhgymenSXOyD657g9tlsTjqGYM8sg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/prompts": "^7.8.4", + "@inquirer/type": "^3.0.8", + "ansi-escapes": "^4.3.2", + "mute-stream": "^2.0.0", + "run-async": "^4.0.5", + "rxjs": "^7.8.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -670,6 +1119,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -804,6 +1262,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/run-async": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz", + "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, "node_modules/set-cookie-parser": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", @@ -814,7 +1296,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -1008,6 +1489,18 @@ "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", @@ -1238,6 +1731,18 @@ "engines": { "node": ">=6" } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/contracts/L1/package.json b/contracts/L1/package.json index bb5bbe6..eaecc1b 100644 --- a/contracts/L1/package.json +++ b/contracts/L1/package.json @@ -11,8 +11,10 @@ }, "dependencies": { "@types/node": "^22.15.21", + "chalk": "^5.6.0", "dotenv": "^16.5.0", "ethers": "^6.14.1", + "inquirer": "^12.9.4", "starknet": "^6.24.1", "ts-node": "^10.9.2" }, diff --git a/contracts/L1/scripts/registerToken.ts b/contracts/L1/scripts/registerToken.ts new file mode 100644 index 0000000..3e4e5c3 --- /dev/null +++ b/contracts/L1/scripts/registerToken.ts @@ -0,0 +1,218 @@ +import { ethers } from 'ethers'; +import { configDotenv } from 'dotenv' +import chalk from 'chalk' +import inquirer from 'inquirer'; + +configDotenv(); + +// === MINIMAL BRIDGE ABI ================================================================================== + +const BRIDGE_ABI = [ + { + "inputs": [ + { + "internalType": "enum AssetType", + "name": "assetType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "priceFeed", + "type": "address" + }, + { + "internalType": "uint8", + "name": "decimals", + "type": "uint8" + } + ], + "name": "registerToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +]; + +// === Types (or objects, depending on how you see it) ================================================================================== + +enum AssetType { + ETH, + ERC20 +} + +enum CHAINLINK_SEPOLIA_PRICEFEEDS { + AUD_USD='0xB0C712f98daE15264c8E26132BCC91C40aD4d5F9', + BTC_ETH='0x5fb1616F78dA7aFC9FF79e0371741a747D2a7F22', + BTC_USD='0x38c8b98A2Cb36a55234323D7eCCD36ad3bFC5954', + CASH_NAV='0xd988B5d6E40A38D87d85491Da1110D2de904E245', + CSPX_USD='0x4b531A318B0e44B549F3b2f824721b3D0d51930A', + CZK_USD='0xC32f0A9D70A34B9E7377C10FDAd88512596f61EA', + DAI_USD='0x14866185B1962B63C3Ea9E03Bc1da838bab34C19', + ETH_USD='0x694AA1769357215DE4FAC081bf1f309aDC325306', +} + +// === Main function ================================================================================== + +async function main() { + + /** + * Check environment variables + */ + + if (!process.env.SEPOLIA_RPC_URL) { + chalk.red('RPC URL not found in environment variables'); + process.exit(1); + } + + if (!process.env.ZEROXBRIDGE_CONTRACT_ADDRESS) { + chalk.red('ZeroXBridge Contract Address not found in environment variables'); + process.exit(1); + } + + if (!process.env.PRIVATE_KEY) { + chalk.red('Admin Private key not found in environment variables'); + process.exit(1); + } + + console.log("Env good, starting now") + + /** + * Build three variables with ether.js + */ + + const provider = new ethers.JsonRpcProvider(process.env.SEPOLIA_RPC_URL); + const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider); + const contract = new ethers.Contract(process.env.ZEROXBRIDGE_CONTRACT_ADDRESS, BRIDGE_ABI, wallet); + + console.log(chalk.green(`Connected at ${process.env.ZEROXBRIDGE_CONTRACT_ADDRESS}`)); + console.log(chalk.green(`Using Account: ${wallet.address}\n`)) + + /** + * Interact with user using inquirer + */ + + const answers = await inquirer.prompt([ + { + type: 'list', + name: 'assetType', + message: 'select asset type', + choices: [ + { name: 'ETH', value: AssetType.ETH }, + { name: 'ERC20', value: AssetType.ERC20 } + ] + }, + { + type: 'input', + name: 'tokenAddress', + message: 'Token Address (leave empty for ETH):', + when: (answers) => answers.assetType === AssetType.ERC20, + validate: (input) => { + if (!input) return true //Empty is OK for ETH + if (!ethers.isAddress(input)) { + return 'Invalid Ethereum address format' + } + return true + }, + filter: (input) => { + if (!input || input === '0x0') return ethers.ZeroAddress; + return ethers.getAddress(input); + } + }, + { + type: 'select', + name: 'priceFeed', + message: 'Price Feed Address', + choices: [ + { name: 'BTC/ETH', value: CHAINLINK_SEPOLIA_PRICEFEEDS.BTC_ETH }, + { name: 'BTC/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.BTC_USD }, + { name: 'CASH NAV', value: CHAINLINK_SEPOLIA_PRICEFEEDS.CASH_NAV }, + { name: 'CSPX/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.CSPX_USD }, + { name: 'CZK/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.CZK_USD }, + { name: 'DAI/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.DAI_USD }, + { name: 'ETH/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.ETH_USD } + ] + }, + { + type: 'number', + name: 'decimals', + message: 'Token Decimals', + default: 18, + validate: (input) => { + if (!input) return false; + if (input < 0 || input > 255 || !Number.isInteger(input)) { + return 'Decimals must integers be between 0 and 255' + } + return true; + } + }, + ]) + + if (answers.assetType === AssetType.ETH) { + answers.tokenAddress = ethers.ZeroAddress; + } + + console.log('Ok, I will start now'); + console.log(`\n` + chalk.yellow(`Transaction Preview: `)); + console.log(`Asset type: ${AssetType[answers.assetType]}`); + console.log(`TOken Address: ${answers.tokenAddress}`); + console.log(`Price Feed: ${answers.priceFeed}`); + console.log(`Decimals: ${answers.decimals}`); + console.log(`From: ${wallet.address}`); + console.log(`Contract: ${process.env.ZEROXBRIDGE_CONTRACT_ADDRESS}`); + + const { confirm } = await inquirer.prompt([ + { + type: 'confirm', + name: 'confirm', + message: 'Review and confirm transaction', + default: false + } + ]) + + if (!confirm) { + console.log(chalk.yellow('Transaction cancelled by user')); + process.exit(0); + } + + /** + * Main action in try-catch block + */ + + try { + console.log(chalk.blue('Sending Transaction...')); + + const tx = await contract.registerToken( + answers.assetType, answers.tokenAddress, answers.priceFeed, answers.decimals + ); + + console.log(chalk.green(`Transaction sent: ${tx.hash}`)); + + const receipt = await tx.wait(); + if (receipt.status === 0) { + console.log(chalk.red('Transaction failed')); + process.exit(1); + } + + console.log('\n' + chalk.green('TRANSACTION SUCCESSFUL')); + console.log(chalk.cyan('Transaction Hash: ') + receipt.hash); + console.log(chalk.cyan('Block Number: ') + receipt.blockNumber); + console.log(chalk.cyan('Gas Used: ') + receipt.gasUsed.toString()); + console.log(chalk.green('Token registered successfully!')); + process.exit(0); + } catch (err) { + console.error(chalk.red('Transaction failed:')); + console.error(chalk.red((err as Error).message)); + + process.exit(1); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}) \ No newline at end of file From 8bd0bbedbb2de935405886f45f6dcade91731168 Mon Sep 17 00:00:00 2001 From: OWK50GA Date: Fri, 29 Aug 2025 06:07:47 +0100 Subject: [PATCH 2/3] created .env.example --- .tool-versions | 2 ++ contracts/L1/.env.example | 3 +++ contracts/L1/scripts/registerToken.ts | 26 +++++++++++++++++--------- 3 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 .tool-versions create mode 100644 contracts/L1/.env.example diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..f3c4ddf --- /dev/null +++ b/.tool-versions @@ -0,0 +1,2 @@ +scarb 2.9.2 +starknet-foundry 0.36.0 diff --git a/contracts/L1/.env.example b/contracts/L1/.env.example new file mode 100644 index 0000000..2db0b42 --- /dev/null +++ b/contracts/L1/.env.example @@ -0,0 +1,3 @@ +SEPOLIA_RPC_URL=https://eth-sepolia.public.blastapi.io +ZEROXBRIDGE_CONTRACT_ADDRESS=0x8F25bFe32269632dfd8D223D51FF145414d8107b +PRIVATE_KEY= \ No newline at end of file diff --git a/contracts/L1/scripts/registerToken.ts b/contracts/L1/scripts/registerToken.ts index 3e4e5c3..7b479c8 100644 --- a/contracts/L1/scripts/registerToken.ts +++ b/contracts/L1/scripts/registerToken.ts @@ -56,6 +56,8 @@ enum CHAINLINK_SEPOLIA_PRICEFEEDS { ETH_USD='0x694AA1769357215DE4FAC081bf1f309aDC325306', } +const priceFeedKeys = Object.keys(CHAINLINK_SEPOLIA_PRICEFEEDS) as (keyof typeof CHAINLINK_SEPOLIA_PRICEFEEDS)[]; + // === Main function ================================================================================== async function main() { @@ -127,15 +129,21 @@ async function main() { type: 'select', name: 'priceFeed', message: 'Price Feed Address', - choices: [ - { name: 'BTC/ETH', value: CHAINLINK_SEPOLIA_PRICEFEEDS.BTC_ETH }, - { name: 'BTC/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.BTC_USD }, - { name: 'CASH NAV', value: CHAINLINK_SEPOLIA_PRICEFEEDS.CASH_NAV }, - { name: 'CSPX/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.CSPX_USD }, - { name: 'CZK/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.CZK_USD }, - { name: 'DAI/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.DAI_USD }, - { name: 'ETH/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.ETH_USD } - ] + // choices: [ + // { name: 'BTC/ETH', value: CHAINLINK_SEPOLIA_PRICEFEEDS.BTC_ETH }, + // { name: 'BTC/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.BTC_USD }, + // { name: 'CASH NAV', value: CHAINLINK_SEPOLIA_PRICEFEEDS.CASH_NAV }, + // { name: 'CSPX/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.CSPX_USD }, + // { name: 'CZK/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.CZK_USD }, + // { name: 'DAI/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.DAI_USD }, + // { name: 'ETH/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.ETH_USD } + // ] + choices: priceFeedKeys.map((key) => { + return { + name: key, + value: CHAINLINK_SEPOLIA_PRICEFEEDS[key] + } + }), }, { type: 'number', From 2250a3aff4aa1ba6017d42c04c49364f17ee3438 Mon Sep 17 00:00:00 2001 From: OWK50GA Date: Fri, 29 Aug 2025 06:37:04 +0100 Subject: [PATCH 3/3] slight adjustments --- contracts/L1/.env.example | 4 +- .../{registerToken.ts => registertoken.ts} | 52 ++++++++----------- 2 files changed, 24 insertions(+), 32 deletions(-) rename contracts/L1/scripts/{registerToken.ts => registertoken.ts} (74%) diff --git a/contracts/L1/.env.example b/contracts/L1/.env.example index 2db0b42..a6de22c 100644 --- a/contracts/L1/.env.example +++ b/contracts/L1/.env.example @@ -1,3 +1,3 @@ -SEPOLIA_RPC_URL=https://eth-sepolia.public.blastapi.io -ZEROXBRIDGE_CONTRACT_ADDRESS=0x8F25bFe32269632dfd8D223D51FF145414d8107b +RPC_URL=https://eth-sepolia.public.blastapi.io +CONTRACT_ADDRESS=0x8F25bFe32269632dfd8D223D51FF145414d8107b PRIVATE_KEY= \ No newline at end of file diff --git a/contracts/L1/scripts/registerToken.ts b/contracts/L1/scripts/registertoken.ts similarity index 74% rename from contracts/L1/scripts/registerToken.ts rename to contracts/L1/scripts/registertoken.ts index 7b479c8..4c7bd2d 100644 --- a/contracts/L1/scripts/registerToken.ts +++ b/contracts/L1/scripts/registertoken.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers'; import { configDotenv } from 'dotenv' -import chalk from 'chalk' +import chalk, { Chalk } from 'chalk' import inquirer from 'inquirer'; configDotenv(); @@ -66,18 +66,22 @@ async function main() { * Check environment variables */ - if (!process.env.SEPOLIA_RPC_URL) { - chalk.red('RPC URL not found in environment variables'); + if (!process.env.RPC_URL) { + chalk.red('RPC URL not found'); process.exit(1); } - if (!process.env.ZEROXBRIDGE_CONTRACT_ADDRESS) { - chalk.red('ZeroXBridge Contract Address not found in environment variables'); + if (!process.env.CONTRACT_ADDRESS) { + chalk.red('Contract Address not set'); process.exit(1); } + if (!ethers.isAddress(process.env.CONTRACT_ADDRESS)) { + chalk.red(`Contract address is not a valid address`); + } + if (!process.env.PRIVATE_KEY) { - chalk.red('Admin Private key not found in environment variables'); + chalk.red('Admin Private key not set'); process.exit(1); } @@ -87,11 +91,11 @@ async function main() { * Build three variables with ether.js */ - const provider = new ethers.JsonRpcProvider(process.env.SEPOLIA_RPC_URL); + const provider = new ethers.JsonRpcProvider(process.env.RPC_URL); const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider); - const contract = new ethers.Contract(process.env.ZEROXBRIDGE_CONTRACT_ADDRESS, BRIDGE_ABI, wallet); + const contract = new ethers.Contract(process.env.CONTRACT_ADDRESS, BRIDGE_ABI, wallet); - console.log(chalk.green(`Connected at ${process.env.ZEROXBRIDGE_CONTRACT_ADDRESS}`)); + console.log(chalk.green(`Connected at ${process.env.CONTRACT_ADDRESS}`)); console.log(chalk.green(`Using Account: ${wallet.address}\n`)) /** @@ -111,33 +115,20 @@ async function main() { { type: 'input', name: 'tokenAddress', - message: 'Token Address (leave empty for ETH):', + message: 'Token Address', when: (answers) => answers.assetType === AssetType.ERC20, validate: (input) => { - if (!input) return true //Empty is OK for ETH - if (!ethers.isAddress(input)) { - return 'Invalid Ethereum address format' - } + if (!input) return 'Token adddress is required for ERC20'; + if (!ethers.isAddress(input)) return 'Invalid Ethereum address format'; + if (input = ethers.ZeroAddress) return 'Zero address is not allowed for ERC20'; return true }, - filter: (input) => { - if (!input || input === '0x0') return ethers.ZeroAddress; - return ethers.getAddress(input); - } + filter: (input) => ethers.getAddress(input.trim()) }, { - type: 'select', + type: 'list', name: 'priceFeed', - message: 'Price Feed Address', - // choices: [ - // { name: 'BTC/ETH', value: CHAINLINK_SEPOLIA_PRICEFEEDS.BTC_ETH }, - // { name: 'BTC/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.BTC_USD }, - // { name: 'CASH NAV', value: CHAINLINK_SEPOLIA_PRICEFEEDS.CASH_NAV }, - // { name: 'CSPX/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.CSPX_USD }, - // { name: 'CZK/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.CZK_USD }, - // { name: 'DAI/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.DAI_USD }, - // { name: 'ETH/USD', value: CHAINLINK_SEPOLIA_PRICEFEEDS.ETH_USD } - // ] + message: 'Price Feed Address (Chainlink Sepolia)', choices: priceFeedKeys.map((key) => { return { name: key, @@ -162,6 +153,7 @@ async function main() { if (answers.assetType === AssetType.ETH) { answers.tokenAddress = ethers.ZeroAddress; + answers.decimals = 18; } console.log('Ok, I will start now'); @@ -171,7 +163,7 @@ async function main() { console.log(`Price Feed: ${answers.priceFeed}`); console.log(`Decimals: ${answers.decimals}`); console.log(`From: ${wallet.address}`); - console.log(`Contract: ${process.env.ZEROXBRIDGE_CONTRACT_ADDRESS}`); + console.log(`Contract: ${process.env.CONTRACT_ADDRESS}`); const { confirm } = await inquirer.prompt([ {