Anchor Protocol Script that can save you from being liquidated!

Overview

Why

My day job requires a fairly good amount of automation from time to time. Besides, I do like computers to work on what I cannot while I'm sleeping!

AnchorHoDL is an implementation that auto-pay/auto-borrow based on whatever config you desire.

I've started this app due my own needs and to learn more about Terra's ecosystem.

How it works

  1. It will query Anchor smart contracts checking LTV (Loan-to-Value);
  2. If the LTV is grater than trigger_at_percent it will trigger a repay action.
  3. If the amount required to repay (target_percent) is in the wallet, it will be used and loan will repay back to target_percent mark.
  4. If not, it will withdraw from aUST (Anchor deposit).
  5. The script will NOT sell any asset to pay loan.
  6. If enabled_auto_borrow is enabled (by default) and current LTV is smaller than auto_borrow_at_percent, an auto borrow will be trigger moving LTV to target_percent.

How to use it

  1. git clone this repository.
  2. Rename config.py.sample to config.py.
  3. Change config.py as you desire and feed your seed (a dedicated wallet is recommended).
  4. Run pip3 install -r requirements.txt
  5. Run python3 webview.py and simply browsing to http://localhost:5000 for an auto-pay/borrow running every 30 seconds. OR Run python3 anchor_loan_repay.py once or use a while loop to run evey 30 seconds while true; do python3 anchor_loan_repay.py; sleep 30; done

installing

Persistence mode

  1. Install gunicorn: pip3 install gunicorn
  2. Run gunicorn -b 127.0.0.1:5000 webview:app --daemon

Done! gunicorn is running as daemon!

Docker mode

  1. If you don't have Docker installed, grab if from https://docs.docker.com/get-docker/.
  2. Once installed, clone this repository by git clone https://github.com/unl1k3ly/AnchorHODL
  3. Rename config.py.sample to config.py and provide details.
  4. Build the image with docker build -t AnchorHODL .
  5. Run the image with docker run -p 5000:5000 AnchorHODL:latest or add -d if you want to run it as a daemon.
  6. Check if its working by http://localhost:5000

Screenshots

  • You can run the script in your terminal in a tmux/screen session as per figure below: Webview

  • Or (recommended) you can spin a web service that does everything for you after you ran python3 webview.py Webview

Slack Notification

If you use more Slack on daily bases like me, it might be simpler to be notified in there using Slack Webhooks.

  1. Create a Slack APP.
  2. Add the APP to a channel and get a webhook URL to feed the config.py.

More information can be found via this link https://api.slack.com/incoming-webhooks

Telegram Notification

If you want to be notified via Telegram, you'd need to get access_token and your chat_id from your Telegram bot. If you are not familiarized creating a Telegram bot, please follow steps below:

  1. On Telegram, find @BotFather and open a DM.
  2. Use /newbot to create a new bot for yourself.
  3. Then, name the bot as you wish, ie: MyCoolBot
  4. Now, choose whatever username you desire for your bot, ie: MyCool_bot
  5. Done! You should see a "Congratulations" message from BotFather.
  6. To get your own chat_id, simply open a DM with your bot, send something up and run the following command below: curl -s https://api.telegram.org/ACCESSTOKEN/getUpdates (replace ACCESSTOKEN with an actual token you just got from item #5).
  7. With access_token and chat_id just feed the config.py file.

If these instructions are unclear, just Google "How to create a Telegram Bot and get your own chat_id"!

Considerations

  • It's recommended to run this code in a contained environment at maximum security. Dockerfile is also provided if you want to deploy it seamless somewhere.
  • If you are using the webview, ensure the access is restricted and not exposed to the entire Internet. You can use "CloudFare Argo Tunnel" for that.
  • Since a wallet seed is required, ensure you protect it and know what you're doing while using this automation ...
  • If you don't want to pass secrets into the config.py file, make sure you declare as a system variable.
  • Everything will be logged into the ./logs folder. Make sure you check those from time to time!

Conclusion

  • I have no intentions to actively develop new features or take issue requests. As mentioned, this automation was to address a self issue I had and consequently avoid liquidation! It works for my own needs.
  • I'm happy to fix bugs or take merge requests.
  • If you intend to modify the code yourself, please do a fork and start from it !

Similar projects

Support!

  • If you feel this project is the right one for you, please, donate to terra1uwkfuh6crvlttqsj2rv0tjpl8v0dy3d4swayg7 if you feel like doing so.

Thanks Terra and Anchor team!

Cheers all!

Comments
  • ERROR float division by zero

    ERROR float division by zero

    The script fails with the following error ERROR float division by zero. Not sure where this zero comes from.

    config.py

    target_percent = 80 trigger_at_percent = 95

    enabled_auto_borrow = True auto_borrow_at_percent = 66 NETWORK = 'MAINNET'

    opened by Philipp-Sc 17
  • seeing weird calculation in current_percent intermittently

    seeing weird calculation in current_percent intermittently

    ex: current_percent will be humming along fine at 85%, then randomly will be calculated as 8.5%, trigger an auto borrow, but be beyond the borrow limit.

    It is like the oracle is giving a number one decimal off and the current_percent is getting discounted by a factor of 10...

    Logging isn't going on since the c5 update so difficult to see more here. Will try to find more.

    opened by conradjohnson 6
  • Query for loan_amount is not the outstanding loan, interest missing

    Query for loan_amount is not the outstanding loan, interest missing

    There is a bug in the query from Terra. If you query for

    query_msg_loan = {
            "borrower_info": {
                "borrower": account_address
            },
        }
    

    you will get the loan_amount from the initial borrowing. This does NOT incl. the interest, hence the LTV is calculated "too save" / loo low. To fix this just query for any block_height.

    query_msg_loan = {
            "borrower_info": {
                "borrower": account_address,
                "block_height": 1
            },
        }
    
    opened by realkibou 3
  • Wallet will be exhausted in certain conditions

    Wallet will be exhausted in certain conditions

    Thanks for the script unl1k3ly! Hope it will get even better.

    I believe this is what may have happened with @conradjohnson (https://github.com/unl1k3ly/AnchorHODL/issues/2) (maybe not).

    On June 21st with the market volatility my loan triggered a buy. but the repay transaction for some reason didn't went through (insufficient funds: insufficient account funds; 11862968uusd < 33429895uusd: failed to execute message; message index: 0) although it was created by the script:

    Looking into the logs:

    21-06-2021 21:18:50  Left until trigger: 0.05%, Current at: 84.95%, Triggering at: 85%, Borrow Limit target 80%.
    21-06-2021 21:19:19  REPAYING ... Left until trigger: -0.1%, Current at: 85.10%, Triggering at: 85%, Borrow Limit target: 80%.
    21-06-2021 21:19:19  Paying loan from 32 UST leftover in the wallet
    21-06-2021 21:19:50  REPAYING ... Left until trigger: -0.1%, Current at: 85.10%, Triggering at: 85%, Borrow Limit target: 80%.
    21-06-2021 21:19:50  Paying loan from 32 UST leftover in the wallet
    21-06-2021 21:20:19  REPAYING ... Left until trigger: -0.08%, Current at: 85.08%, Triggering at: 85%, Borrow Limit target: 80%.
    21-06-2021 21:20:19  Paying loan from 32 UST leftover in the wallet
    21-06-2021 21:20:50  Left until trigger: 0.21%, Current at: 84.79%, Triggering at: 85%, Borrow Limit target 80%.
    .......
    21-06-2021 21:34:50  REPAYING ... Left until trigger: -0.02%, Current at: 85.02%, Triggering at: 85%, Borrow Limit target: 80%.
    21-06-2021 21:34:50  Paying loan from 32 UST leftover in the wallet
    

    Since the script runs each 30 seconds, 3 repay transactions were generated, but none was completed (due to insufficient funds which is weird because 1) I remember having funds on the wallet ~50 usd and 2) the logs says that is repaying from the wallet).

    This went like that creating transactions during some time, until it drained all my wallet funds :P Becaus each of these transactions created by the script had a tx fee of 1.679895 UST

    After 21:49:49 (UTC) it started to show logs like this, since the wallet had no more funds and there was no sufficient funds to create the txs:

    21-06-2021 21:49:49  REPAYING ... Left until trigger: -0.03%, Current at: 85.03%, Triggering at: 85%, Borrow Limit target: 80%.
    21-06-2021 21:49:49  Paying loan from 32 UST leftover in the wallet
    21-06-2021 21:49:51  Status 404 - Tx: RPC error -32603 - Internal error: tx (95.........E1) not found
    21-06-2021 21:49:51  check_tx_info(95.......E1) was not found ... Maybe something went wrong ?
    

    Looking into the repay logs it gives the impression that the txs were getting through but looking to each of them they failed.

    21-06-2021 21:19:25  Loan Repaid!!! Repay Amount: $32.00, triggered at: 85.10% (85% trigger limit). TX: https://finder.terra.money/columbus-4/tx/03........9D
    21-06-2021 21:19:58  Loan Repaid!!! Repay Amount: $32.00, triggered at: 85.10% (85% trigger limit). TX: https://finder.terra.money/columbus-4/tx/22........D0
    21-06-2021 21:20:25  Loan Repaid!!! Repay Amount: $32.00, triggered at: 85.08% (85% trigger limit). TX: https://finder.terra.money/columbus-4/tx/05........20
    21-06-2021 21:34:57  Loan Repaid!!! Repay Amount: $32.00, triggered at: 85.02% (85% trigger limit). TX: https://finder.terra.money/columbus-4/tx/6C........6E
    21-06-2021 21:47:57  Loan Repaid!!! Repay Amount: $32.00, triggered at: 85.18% (85% trigger limit). TX: https://finder.terra.money/columbus-4/tx/B8........FB
    21-06-2021 21:48:31  Loan Repaid!!! Repay Amount: $33.00, triggered at: 85.20% (85% trigger limit). TX: https://finder.terra.money/columbus-4/tx/AC........0B
    21-06-2021 21:48:57  Loan Repaid!!! Repay Amount: $33.00, triggered at: 85.22% (85% trigger limit). TX: https://finder.terra.money/columbus-4/tx/28........6A
    21-06-2021 21:49:30  Loan Repaid!!! Repay Amount: $33.00, triggered at: 85.23% (85% trigger limit). TX: https://finder.terra.money/columbus-4/tx/05........28
    21-06-2021 21:49:51  TX 404 ... Loan Repaid!!! Repay Amount: $32.00, triggered at: 85.03% (85% trigger limit). TX: https://finder.terra.money/columbus-4/tx/95........E1
    21-06-2021 21:50:22  TX 404 ... Loan Repaid!!! Repay Amount: $32.00, triggered at: 85.03% (85% trigger limit). TX: https://finder.terra.money/columbus-4/tx/95........E1
    21-06-2021 21:50:52  TX 404 ... Loan Repaid!!! Repay Amount: $32.00, triggered at: 85.10% (85% trigger limit). TX: https://finder.terra.money/columbus-4/tx/95........E1
    ....
    

    I'm not quite sure why or how this happened, but it happened solely by the script orders, since I was asleep :P

    Creating multiple txs will eventually drain the wallet, even if they are all failing.

    In my case it wasn't that bad since my wallet had little money, but it can be dangerous :P

    Not sure if you can understand what really happened here, since your are more knowledgeable of the code.

    opened by rlapao 3
  • Amount taken out of Anchor deposit missmatches the required repay amount due to missing aUST conversion

    Amount taken out of Anchor deposit missmatches the required repay amount due to missing aUST conversion

    To fix this, add this to the anchor_loan_repay.py

    def get_aUST_rate():
        query_msg_aUST_rate = {
            "epoch_state": {},
        }
        aUST_rate_result = terra.wasm.contract_query(mmMarket, query_msg_aUST_rate)
        aUST_rate = float(aUST_rate_result['exchange_rate'])
        return aUST_rate
    

    and change the following within "def execute_withdraw_ust_from_anchor(amount):"

    fee_estimation = get_fee_estimation()
        # Convert amount UST into aUST for withdrawl
        aUST_rate = get_aUST_rate()
        amount = int(amount / aUST_rate)
        base_logger.info(f"Withdrawing ${amount:,.2f} UST + ${int(fee_estimation) / 1000000:,.2f} fees from Anchor ...")
        amount = (amount * 1000000) + int(fee_estimation)
    
    opened by realkibou 2
  • getting 403 on the service.  heads up to others to check.

    getting 403 on the service. heads up to others to check.

    Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/terra_sdk/client/lcd/lcdclient.py", line 91, in _get result = await response.json(content_type=None) File "/usr/local/lib/python3.9/site-packages/aiohttp/client_reqrep.py", line 1113, in json return loads(stripped.decode(encoding)) File "/usr/local/Cellar/[email protected]/3.9.2/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/init.py", line 346, in loads return _default_decoder.decode(s) File "/usr/local/Cellar/[email protected]/3.9.2/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 337, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/local/Cellar/[email protected]/3.9.2/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 355, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last): File "/Users/uu/code/AnchorHODL/anchor_loan_repay.py", line 56, in balance = terra.bank.balance(address=account_address) File "/usr/local/lib/python3.9/site-packages/terra_sdk/client/lcd/api/_base.py", line 29, in decorator return instance._run_sync(async_call(instance, *args, **kwargs)) File "/usr/local/lib/python3.9/site-packages/terra_sdk/client/lcd/api/_base.py", line 13, in _run_sync return self._c.loop.run_until_complete(coroutine) File "/usr/local/lib/python3.9/site-packages/nest_asyncio.py", line 70, in run_until_complete return f.result() File "/usr/local/Cellar/[email protected]/3.9.2/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/futures.py", line 201, in result raise self._exception File "/usr/local/Cellar/[email protected]/3.9.2/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/tasks.py", line 256, in __step result = coro.send(None) File "/usr/local/lib/python3.9/site-packages/terra_sdk/client/lcd/api/bank.py", line 18, in balance res = await self._c._get(f"/bank/balances/{address}") File "/usr/local/lib/python3.9/site-packages/terra_sdk/client/lcd/lcdclient.py", line 243, in _get result = await super()._get(*args, **kwargs) File "/usr/local/lib/python3.9/site-packages/terra_sdk/client/lcd/lcdclient.py", line 93, in _get raise LCDResponseError(message=str(response.reason), response=response) terra_sdk.exceptions.LCDResponseError: Status 403 - Forbidden

    opened by conradjohnson 2
  • getting error on repay - could lead to liquidation.

    getting error on repay - could lead to liquidation.

    will withdraw from UST deposited, but getting error just this AM on repaying -

    Traceback (most recent call last): File "/Users/jj/code/AnchorHODL/anchor_loan_repay.py", line 299, in keep_loan_safe = keep_loan_safe() File "/Users/jj/code/AnchorHODL/anchor_loan_repay.py", line 265, in keep_loan_safe loan_repay_tx = execute_loan_repay(repay_amount) File "/Users/jj/code/AnchorHODL/anchor_loan_repay.py", line 163, in execute_loan_repay result = terra.tx.broadcast(sendtx) File "/usr/local/lib/python3.9/site-packages/terra_sdk/client/lcd/api/_base.py", line 29, in decorator return instance._run_sync(async_call(instance, *args, **kwargs)) File "/usr/local/lib/python3.9/site-packages/terra_sdk/client/lcd/api/_base.py", line 13, in _run_sync return self._c.loop.run_until_complete(coroutine) File "/usr/local/lib/python3.9/site-packages/nest_asyncio.py", line 70, in run_until_complete return f.result() File "/usr/local/Cellar/[email protected]/3.9.2/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/futures.py", line 201, in result raise self._exception File "/usr/local/Cellar/[email protected]/3.9.2/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/tasks.py", line 256, in __step result = coro.send(None) File "/usr/local/lib/python3.9/site-packages/terra_sdk/client/lcd/api/tx.py", line 201, in broadcast res = await self._broadcast(tx, "block") File "/usr/local/lib/python3.9/site-packages/terra_sdk/client/lcd/api/tx.py", line 157, in _broadcast return await self._c._post("/txs", data, raw=True) File "/usr/local/lib/python3.9/site-packages/terra_sdk/client/lcd/lcdclient.py", line 255, in _post result = await super()._post(*args, **kwargs) File "/usr/local/lib/python3.9/site-packages/terra_sdk/client/lcd/lcdclient.py", line 110, in _post raise LCDResponseError(message=result.get("error"), response=response) terra_sdk.exceptions.LCDResponseError: Status 500 - broadcast_tx_commit: error unmarshalling: invalid character '<' looking fo

    opened by conradjohnson 2
  • Repay transaction cost

    Repay transaction cost

    Hi. Auto repay transaction fee is 5 times higher than manual repay. Why?

    Auto repay transaction: https://finder.terra.money/columbus-4/tx/E5FE126057AE6CF4973E7C19481B29E8C80AF0A948E5C6C9C0AEBB6A46F59C2C

    Manual repay transaction (I've made it with same sum for proof): https://finder.terra.money/columbus-4/tx/BCA3C18CDEABFCADCA95AD52478DB9B2D2371D5454363270EAD9CB54583F645E

    opened by StayHomeThereIsNoFrance 2
  • loan repay amounts may leave UST below 0.25 threshold for repay.

    loan repay amounts may leave UST below 0.25 threshold for repay.

    Requesting a static buffer in wallet when repaying loans in order to ensure continuation of payments and not get frozen with zero balance in wallet, but still deposits in anchor to repay loan.

    Current behavior: if wallet is below threshold to repay, withdrawals from anchor deposit and repays loan. A last transaction in a series of transactions might leave the wallet below the 0.25 threshold for the next transaction.

    Requested behavior: if wallet is below threshold to repay, withdrawals from anchor deposit to repay loan and ensure a buffer of UST in wallet for future (possibly burst rapid) transactions. $1.51 should be enough buffer for 6 rapid txs and it's funny because: liquor.

    opened by conradjohnson 2
  • ERROR keep_loan_safe

    ERROR keep_loan_safe

    Hi, sorry newbie here. Keep getting this error. Any idea how to resolve this?

    image

    tried git reset --hard & git pull then pip3 install --upgrade --force-reinstall -r requirements.txt but got the following instead

    image

    opened by yoikoh 1
  • Note on the Readme

    Note on the Readme

    • The command shown in the download.gif is outdated
    • Consider changing the Docker run command to docker run -d -p 127.0.0.1:5000:5000 anchorhodl:latest

    Docker opens the port to the world if 127.0.0.1: is not added as prefix. (Additionally it would be great to protect the webpage by a password, so than not everybody can access it)

    Best regards, Philipp-Sc

    opened by Philipp-Sc 1
  • Do not specify a fee to allow the API to calculate the required fee

    Do not specify a fee to allow the API to calculate the required fee

    Is there a reason you are specifying the fee instead of allowing the API to calculate it for you? on the contract executor you can specify the fee_denoms for uusd and leave out fee and it will automatically be calculated so you do not have to always use $2.5 for fees for everything. This should cut back the fees being used a good amount.

    If you are not opposed to the idea I can implement it and validate that it still works over an extended amount of time just to be sure we dont run into any gas issues.

    opened by luigi311 0
  • Add anchor earn deposit support.

    Add anchor earn deposit support.

    Heres what the output looks like

    10-12-2021 12:25:53 [INFO] Deposited! Total Amount: $128.00, TX: https://finder.terra.money/bombay-12/tx/E79B569A99FE52CDA2210E822D98FF96F09F7EF51B53FF2FAEB3304FD2A0A3EF
    10-12-2021 12:25:47 [INFO] Borrowed! Total Amount: $138.00, triggered at: 81.45 (90% trigger limit). TX: https://finder.terra.money/bombay-12/tx/D3505C3996B0012BF0F723D06D73D9F732BDC18CB656E84052D5BC5478AE855E
    

    This will deposit the borrowed amount - 10 UST to guarantee there is some money in the wallet. Over time this will probably accumulate but it will allow users keep UST in their wallet without worrying about all of it going into anchor earn in case they are going to use it for something.

    opened by luigi311 1
  • repay_with_max_fee setting

    repay_with_max_fee setting

    • Added repay_with_max_fee setting for loan repay. If set to False loan repay uses auto transaction fee estimation
    • Set auto transaction fee estimation for auto borrow
    opened by StayHomeThereIsNoFrance 0
Owner
how do i do bio
null
A simple script that loads and hot-reloads cogs when you save any changes

DiscordBot-HotReload A simple script that loads and hot-reloads cogs when you save any changes Usage @bot.event async def on_ready(): from HotRelo

null 2 Jan 14, 2022
Telegram Bot to save Posts or Files that can be Accessed via Special Links

OKAERI-FILE Bot Telegram untuk menyimpan Posting atau File yang dapat Diakses melalui Link Khusus. Jika Anda memerlukan tambahan module lagi dalam rep

Wahyusaputra 5 Aug 4, 2022
A bot can play all variants, but standard are abit weak, so if you need strongest you can change fsf instead of stockfish_14_Dev

MAINTAINERS Drdisrespect1 and drrespectable lichess-bot Engine communication code taken from https://github.com/ShailChoksi/lichess-bot by ShailChoksi

RPNS Nimsilu 1 Dec 12, 2021
Example code for interacting with solana anchor programs - candymachine

candypy example code for interacting with solana anchor programs - candymachine THIS IS PURELY SAMPLE CODE TO FORK, MODIFY, UNDERSTAND AND INTERACT WI

dubbelosix 3 Sep 18, 2022
A custom Discord Rich Presence to display when you're studying so you're stupid friends won't disturb you when you're studying.

Studying RPC Description A custom Discord Rich Presence to display when you're studying so you're stupid friends won't disturb you when you're studyin

John Edmerson Pizarra 4 Nov 19, 2022
A Telegram UserBot to Play Radio in Voice Chats. This is also the source code of the userbot which is being used for playing Radio in @AsmSafone Channel.

Telegram Radio Player UserBot A Telegram UserBot to Play Radio in Channel or Group Voice Chats. This is also the source code of the userbot which is b

SAF ONE 44 Nov 12, 2022
An Telegram Bot By @AsmSafone To Stream Videos in Telegram Voice Chat. This is Also The Source Code of The Bot Which is Being Used In @SafoTheBot Group! ❤️

Telegram Video Player Bot (Beta) An Telegram Bot By @AsmSafone To Stream Videos in Telegram Voice Chat. Special Features Supports Live Streaming From

SAF ONE 206 Jan 3, 2023
An Advanced Telegram Bot to Play Radio & Music in Voice Chat. This is Also The Source Code of The Bot Which is Being Used For Playing Radio in @AsmSafone Channel ❤️

Telegram Radio Player V3 An Advanced Telegram Bot to Play Nonstop Radio/Music/YouTube Live in Channel or Group Voice Chats. This is also the source co

SAF ONE 421 Jan 5, 2023
A replacement for Reddit /r/copypasta CummyBot2000 with extra measures to avoid it being banned.

CummyBot1984 A replacement for Reddit /r/copypasta's CummyBot2000 with extra measures to respect Reddit's API rules. Features Copies and replies to ev

null 2 Feb 21, 2022
YouTube bot, this is just my introduction to api and requests, this isn't intended on being an actual view bot.

YouTube bot, this is just my introduction to api and requests, this isn't intended on being an actual view bot.

Aran 2 Jul 25, 2022
Due to changes to the discord API and discord.py being discontinued

Talia Due to changes to the discord API and discord.py being discontinued, Talia development has been halted permanently A customizable economy discor

null 2 Mar 8, 2022
Save data from Instagram takeout to a SQLite database

instagram-to-sqlite Save data from a Instagram takeout to a SQLite database. Mise En Place git clone https://github.com/gavindsouza/instagram-to-sqlit

gavin 8 Dec 13, 2022
Fortnite Dumper for anyone's Save the World profiles.

Anyone's Fortnite Save the World Profile Dumper This program allows you to dump anyone's Fortnite Save the World Profiles. How to use it? After starti

PRO100KatYT 6 Apr 13, 2022
A Discord bot that may save your day by predicting it.

Sage A Discord bot that may save your day by predicting it.

null 1 Nov 17, 2022
A simple telegram bot to save restricted content with custom thumbmail support by Mahesh Chauhan

Save Restricted Content Bot A simple telegram bot to save restricted content with custom thumbmail support by Mahesh Chauhan. Variables API_ID API_HAS

Mahesh Chauhan 532 Jan 2, 2023
Savecontentbot - Telegram Save Content Bot With Same more Features

Save Restricted Content Bot A simple telegram bot to save restricted content wit

Group Dc Bots 3 Jan 26, 2022
A decentralized messaging daemon built on top of the Kademlia routing protocol.

parakeet-message A decentralized messaging daemon built on top of the Kademlia routing protocol. Now that you are done laughing... pictures what is it

Jonathan Abbott 3 Apr 23, 2022
Algofi Python SDK is useful for developers who want to programatically interact with the Algofi lending protocol

algofi-py-sdk Algofi Python SDK Documentation https://algofi-py-sdk.readthedocs.

Algofi 41 Dec 15, 2022
Pancakeswap Sniper BOT - TORNADO CASH Proxy (MAC WINDOWS ANDROID LINUX) A fully decentralized protocol for private transactions

TORNADO CASH Proxy Pancakeswap Sniper BOT 2022-V1 (MAC WINDOWS ANDROID LINUX) ⭐️ A fully decentralized protocol for private transactions ⭐️ AUTO DOWNL

Crypto Trader 1 Jan 5, 2022