From 9323f10e4de2418b6fab32b7f757790c1a60093e Mon Sep 17 00:00:00 2001 From: stubbsta Date: Fri, 16 Jan 2026 09:28:11 +0200 Subject: [PATCH] Add token management interface --- tools/__init__.py | 1 + tools/token_management/README.md | 91 +++++++++ .../__pycache__/interactions.cpython-310.pyc | Bin 0 -> 3846 bytes tools/token_management/interactions.py | 175 ++++++++++++++++++ 4 files changed, 267 insertions(+) create mode 100644 tools/__init__.py create mode 100644 tools/token_management/README.md create mode 100644 tools/token_management/__pycache__/interactions.cpython-310.pyc create mode 100644 tools/token_management/interactions.py diff --git a/tools/__init__.py b/tools/__init__.py new file mode 100644 index 0000000..4155709 --- /dev/null +++ b/tools/__init__.py @@ -0,0 +1 @@ +# This file makes the tools directory a Python package diff --git a/tools/token_management/README.md b/tools/token_management/README.md new file mode 100644 index 0000000..7529b4b --- /dev/null +++ b/tools/token_management/README.md @@ -0,0 +1,91 @@ +# token-management + +Test utility for [TestStableToken](https://github.com/logos-messaging/logos-messaging-rlnv2-contract/blob/main/test/TestStableToken.sol) used in the Logos Messaging RLN v2 contract tests. + +Given the token contract address and an Ethereum JSON-RPC endpoint, it allows minting and transferring TestStableToken tokens. +Given the contract address, it can also query allowances. + +Details about the use of TestStableToken can be found in the [TST README](https://github.com/logos-messaging/logos-messaging-rlnv2-contract/blob/main/test/README.md) + +## Configuration + +Set the following environment variables (or use a `.env` file): + +- `TOKEN_CONTRACT_ADDRESS`: The token contract proxy address +- `RLN_CONTRACT_ADDRESS`: The RLN contract proxy address +- `RLN_RELAY_ETH_CLIENT_ADDRESS`: The Ethereum JSON-RPC endpoint +- `ETH_FROM`: The default user account address +- `PRIVATE_KEY`: Private key for write operations (transfer, mint) + +## Usage + +The `interactions.py` script provides a CLI interface for all token operations. + +### Read-Only Commands (no PRIVATE_KEY required) + +Get total supply: +```bash +python3 tools/token_management/interactions.py total-supply +``` + +Get max supply: +```bash +python3 tools/token_management/interactions.py max-supply +``` + +Get contract owner: +```bash +python3 tools/token_management/interactions.py owner +``` + +Get implementation address: +```bash +python3 tools/token_management/interactions.py implementation +``` + +Get balance (defaults to USER_ACCOUNT_ADDRESS from env): +```bash +python3 tools/token_management/interactions.py balance +python3 tools/token_management/interactions.py balance 0xYourAddress +``` + +Get allowance (defaults to USER_ACCOUNT_ADDRESS and RLN_CONTRACT_PROXY_ADDRESS): +```bash +python3 tools/token_management/interactions.py allowance +python3 tools/token_management/interactions.py allowance 0xOwner 0xSpender +``` + +Check if address is a minter (defaults to USER_ACCOUNT_ADDRESS): +```bash +python3 tools/token_management/interactions.py is-minter +python3 tools/token_management/interactions.py is-minter 0xAddress +``` + +### Write Commands (PRIVATE_KEY required) + +All write commands accept an optional `--private-key` flag to specify a custom private key. If not provided, the `PRIVATE_KEY` environment variable will be used. + +Transfer tokens: +```bash +python3 tools/token_management/interactions.py transfer 0xRecipient 100.5 +python3 tools/token_management/interactions.py transfer 0xRecipient 100.5 --private-key 0xYourPrivateKey +``` + +Mint tokens: +```bash +python3 tools/token_management/interactions.py mint 0xRecipient 1000 +python3 tools/token_management/interactions.py mint 0xRecipient 1000 --private-key 0xYourPrivateKey +``` + +Approve spender to use tokens: +```bash +python3 tools/token_management/interactions.py approve 0xSpender 500 +python3 tools/token_management/interactions.py approve 0xSpender 500 --private-key 0xYourPrivateKey +``` + +### Help + +View all available commands: +```bash +python3 tools/token_management/interactions.py --help +``` diff --git a/tools/token_management/__pycache__/interactions.cpython-310.pyc b/tools/token_management/__pycache__/interactions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..afccef3356b4984a49c8f5f879366b2a2328f105 GIT binary patch literal 3846 zcmb6bU2hx5@%HXW9w~~ZZCQzIS!LSB37uHt_lM#*rYNd$?MNymC$U}*NA6NOiR7_+ zM@u$nps3o%0)3B*l8=7t?^*P%PX_wtx1y*!v!p0ewhQzQH#<8!xAU{e=E}>R+V(0;s=y zhx+MzskeZ7QOD0lI(|OZF%G+)*?D{Hg)iXWY0Xjkm+$O|)H^^u^WJDDpe|pe?$7Rp znab4uEDH|EDcOs#$l;~KC{Qjl|A4SCUHOx`7o`cB{DZQ0g{Ej4#;Y_#7h#;ESsI7& z8qLu>jPtZWi!gpfSLs(UeoXJuuVGxE_vkk;UZ?kI3C0_2k**!7ey1XER!pUGIWbp#^nSUCWG-9C7fRV;rf#LO*>t*K z(T0_wnL;L0Y~+fmOsY~VY=}kNp;~!VdSapmcbSH-u(-4(RdJYId10JZ`n!25RJX>vhmb=rzY_f`Xk6cb)?y zAF5Iie)n0c20VV(<92(0D0;?oJgd3W?R1*Ygo+}pmeU0V^%ndD`_=1mYS`{~KtQEh z*2#$9H}p!xZgrZh#oC@F?NoUL?a-{6T_=E@JsKcB_{#9P2>_mQNcyU$_4S@IAOq6( z4U`u|QvCxcY%o)Mgp!_mRk@+;D6iDb*H}U00qIF_LfsR=Gyl5$GOTeZor<{XIcEKU z)sNh6%N!k=(Cgq&9>WbZsUpXMD+#X@o(240TPp`ni>-k z$RLOTi0k}I7$A;@F*jty73q*6$RWopS~3pEFMuR%SsL0>g!wzR1b~RPyul5Iw!pD! zc&u`!d%nIOkKPNM9rK)W3iiFwJfo+bLVX%q5}dFk273+lUqozdlh9-oM z*J1deaE=Y@}hbbPA! zVB*0AOx08Mh2oJzwXb=4-{(Oi07;=jC4{s%B~&|7`AtX=ohpA+7nHs+fLci5i~Bak zTH+*~OB9NkQZl_(N|w^8WFnW#mkX&vrkGk^D;CzvrF12g$mh!CbUvLe6;p{)x?IX8 zvg_$WYHh9j8n2z#F#z^I-@bht56Y+&>Tz0V%sUX$i!KyBC~~IdoyV70ywDkJSGRtA zGVTwwCTk1rfSurV={6ltXxuu!kOSfhI&S&~LBF|J=tJrp39C_}6TSn}sSLqnJu5Ko z?_lC7eYh*Aik|Bc9tMx0=c1lU^;7bD;%SHaAr>4cp>VG#{XkDWG?3a4A~qn@CwW5D z|567YD5?FKo(7mMxxzjDa294hFG2%7U;olT`APYUdP<1W^TBBtn|ucJ;GZA}19<-H zQVcF^o5m(OiWsz1Hh0>1U&1Q4ty+`CY&XW)Z@V^UG}drBZI5q*9&x`2cqb;_<&}6k`8Z}sKif