agentlaunch-templates 0.3.0 → 0.3.2
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"genesis.d.ts","sourceRoot":"","sources":["../../src/templates/genesis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAQpD,eAAO,MAAM,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"genesis.d.ts","sourceRoot":"","sources":["../../src/templates/genesis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAQpD,eAAO,MAAM,QAAQ,EAAE,aAiwCtB,CAAC"}
|
|
@@ -200,17 +200,23 @@ BUSINESS = {
|
|
|
200
200
|
"max_input_length": 5000,
|
|
201
201
|
}
|
|
202
202
|
|
|
203
|
-
#
|
|
204
|
-
|
|
203
|
+
# FETAgentCoin contract ABI — the token IS the bonding curve
|
|
204
|
+
TOKEN_ABI = [
|
|
205
205
|
{"name": "buyTokens", "type": "function",
|
|
206
|
-
"inputs": [{"name": "
|
|
207
|
-
{"name": "
|
|
208
|
-
|
|
206
|
+
"inputs": [{"name": "buyer", "type": "address"},
|
|
207
|
+
{"name": "slippageAmount", "type": "uint256"},
|
|
208
|
+
{"name": "_buyAmount", "type": "uint256"}],
|
|
209
|
+
"outputs": [], "stateMutability": "nonpayable"},
|
|
209
210
|
{"name": "sellTokens", "type": "function",
|
|
210
|
-
"inputs": [{"name": "
|
|
211
|
-
{"name": "tokenAmount", "type": "uint256"},
|
|
212
|
-
{"name": "minFetOut", "type": "uint256"}],
|
|
211
|
+
"inputs": [{"name": "tokenAmount", "type": "uint256"}],
|
|
213
212
|
"outputs": [], "stateMutability": "nonpayable"},
|
|
213
|
+
{"name": "FET_TOKEN", "type": "function",
|
|
214
|
+
"inputs": [], "outputs": [{"name": "", "type": "address"}],
|
|
215
|
+
"stateMutability": "view"},
|
|
216
|
+
{"name": "calculateTokensReceived", "type": "function",
|
|
217
|
+
"inputs": [{"name": "fetAmount", "type": "uint256"}],
|
|
218
|
+
"outputs": [{"name": "", "type": "uint256"}],
|
|
219
|
+
"stateMutability": "view"},
|
|
214
220
|
]
|
|
215
221
|
|
|
216
222
|
ERC20_ABI = [
|
|
@@ -218,6 +224,10 @@ ERC20_ABI = [
|
|
|
218
224
|
"inputs": [{"name": "spender", "type": "address"},
|
|
219
225
|
{"name": "amount", "type": "uint256"}],
|
|
220
226
|
"outputs": [{"name": "", "type": "bool"}], "stateMutability": "nonpayable"},
|
|
227
|
+
{"name": "allowance", "type": "function",
|
|
228
|
+
"inputs": [{"name": "owner", "type": "address"},
|
|
229
|
+
{"name": "spender", "type": "address"}],
|
|
230
|
+
"outputs": [{"name": "", "type": "uint256"}], "stateMutability": "view"},
|
|
221
231
|
{"name": "balanceOf", "type": "function",
|
|
222
232
|
"inputs": [{"name": "account", "type": "address"}],
|
|
223
233
|
"outputs": [{"name": "", "type": "uint256"}], "stateMutability": "view"},
|
|
@@ -230,6 +240,9 @@ ERC20_ABI = [
|
|
|
230
240
|
"outputs": [{"name": "", "type": "bool"}], "stateMutability": "nonpayable"},
|
|
231
241
|
]
|
|
232
242
|
|
|
243
|
+
# Default TFET address on BSC Testnet
|
|
244
|
+
TFET_ADDRESS = "0x304ddf3eE068c53514f782e2341B71A80c8aE3C7"
|
|
245
|
+
|
|
233
246
|
|
|
234
247
|
# ==========================================================================
|
|
235
248
|
# LAYER 1: LOGGER — structured logging with audit trail
|
|
@@ -691,8 +704,13 @@ class HoldingsManager:
|
|
|
691
704
|
|
|
692
705
|
def buy_via_web3(
|
|
693
706
|
self, ctx: Context, token_address: str, fet_amount_wei: int,
|
|
694
|
-
|
|
707
|
+
slippage_percent: int = 5,
|
|
695
708
|
) -> Tuple[bool, str]:
|
|
709
|
+
"""
|
|
710
|
+
Buy tokens on the bonding curve. The token IS the bonding curve.
|
|
711
|
+
|
|
712
|
+
Flow: approve FET -> call buyTokens(buyer, minTokens, fetAmount) on token.
|
|
713
|
+
"""
|
|
696
714
|
try:
|
|
697
715
|
from web3 import Web3
|
|
698
716
|
|
|
@@ -705,32 +723,76 @@ class HoldingsManager:
|
|
|
705
723
|
return False, "Cannot connect to BSC RPC."
|
|
706
724
|
|
|
707
725
|
account = w3.eth.account.from_key(private_key)
|
|
708
|
-
|
|
726
|
+
token_addr = Web3.to_checksum_address(token_address)
|
|
709
727
|
|
|
710
|
-
|
|
711
|
-
return False, self.generate_buy_link(token_address, fet_amount_wei)
|
|
728
|
+
token_contract = w3.eth.contract(address=token_addr, abi=TOKEN_ABI)
|
|
712
729
|
|
|
713
|
-
#
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
730
|
+
# 1. Resolve FET token address from contract (fallback to testnet TFET)
|
|
731
|
+
try:
|
|
732
|
+
fet_addr = token_contract.functions.FET_TOKEN().call()
|
|
733
|
+
except Exception:
|
|
734
|
+
fet_addr = TFET_ADDRESS
|
|
735
|
+
fet_contract = w3.eth.contract(
|
|
736
|
+
address=Web3.to_checksum_address(fet_addr), abi=ERC20_ABI,
|
|
718
737
|
)
|
|
719
|
-
|
|
720
|
-
|
|
738
|
+
|
|
739
|
+
# 2. Check FET balance
|
|
740
|
+
balance = fet_contract.functions.balanceOf(account.address).call()
|
|
741
|
+
if balance < fet_amount_wei:
|
|
742
|
+
return False, (
|
|
743
|
+
f"Insufficient FET. Have {balance}, need {fet_amount_wei}. "
|
|
744
|
+
f"Deficit: {fet_amount_wei - balance}"
|
|
745
|
+
)
|
|
746
|
+
|
|
747
|
+
nonce = w3.eth.get_transaction_count(account.address)
|
|
748
|
+
gas_price = w3.eth.gas_price
|
|
749
|
+
chain_id = w3.eth.chain_id
|
|
750
|
+
|
|
751
|
+
# 3. Approve FET spend on the token contract (if needed)
|
|
752
|
+
allowance = fet_contract.functions.allowance(
|
|
753
|
+
account.address, token_addr,
|
|
754
|
+
).call()
|
|
755
|
+
if allowance < fet_amount_wei:
|
|
756
|
+
approve_tx = fet_contract.functions.approve(
|
|
757
|
+
token_addr, fet_amount_wei,
|
|
758
|
+
).build_transaction({
|
|
759
|
+
"from": account.address, "nonce": nonce,
|
|
760
|
+
"gas": 100000, "gasPrice": gas_price, "chainId": chain_id,
|
|
761
|
+
})
|
|
762
|
+
signed_approve = w3.eth.account.sign_transaction(approve_tx, private_key)
|
|
763
|
+
approve_hash = w3.eth.send_raw_transaction(signed_approve.raw_transaction)
|
|
764
|
+
w3.eth.wait_for_transaction_receipt(approve_hash, timeout=60)
|
|
765
|
+
nonce += 1
|
|
766
|
+
Logger.info(ctx, "FET_APPROVED", {
|
|
767
|
+
"spender": token_address[:12], "amount": fet_amount_wei,
|
|
768
|
+
})
|
|
769
|
+
|
|
770
|
+
# 4. Calculate expected tokens and apply slippage
|
|
771
|
+
expected_tokens = token_contract.functions.calculateTokensReceived(
|
|
772
|
+
fet_amount_wei,
|
|
773
|
+
).call()
|
|
774
|
+
min_tokens = expected_tokens * (100 - slippage_percent) // 100
|
|
775
|
+
|
|
776
|
+
# 5. Buy: buyTokens(buyer, slippageAmount, _buyAmount)
|
|
777
|
+
buy_tx = token_contract.functions.buyTokens(
|
|
778
|
+
account.address, min_tokens, fet_amount_wei,
|
|
721
779
|
).build_transaction({
|
|
722
|
-
"from": account.address,
|
|
723
|
-
"
|
|
724
|
-
"nonce": nonce,
|
|
725
|
-
"gas": 300000,
|
|
726
|
-
"gasPrice": w3.eth.gas_price,
|
|
727
|
-
"chainId": w3.eth.chain_id,
|
|
780
|
+
"from": account.address, "nonce": nonce,
|
|
781
|
+
"gas": 300000, "gasPrice": gas_price, "chainId": chain_id,
|
|
728
782
|
})
|
|
729
|
-
|
|
730
|
-
tx_hash = w3.eth.send_raw_transaction(
|
|
783
|
+
signed_buy = w3.eth.account.sign_transaction(buy_tx, private_key)
|
|
784
|
+
tx_hash = w3.eth.send_raw_transaction(signed_buy.raw_transaction)
|
|
785
|
+
|
|
786
|
+
# 6. Wait for confirmation
|
|
787
|
+
receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=60)
|
|
788
|
+
if receipt.status != 1:
|
|
789
|
+
return False, f"Buy transaction reverted: {tx_hash.hex()}"
|
|
790
|
+
|
|
731
791
|
Logger.info(ctx, "BUY_VIA_WEB3", {
|
|
732
792
|
"token": token_address[:12],
|
|
733
|
-
"
|
|
793
|
+
"fet_spent": fet_amount_wei,
|
|
794
|
+
"expected_tokens": expected_tokens,
|
|
795
|
+
"min_tokens": min_tokens,
|
|
734
796
|
"tx": tx_hash.hex(),
|
|
735
797
|
})
|
|
736
798
|
return True, f"0x{tx_hash.hex()}"
|
|
@@ -738,12 +800,18 @@ class HoldingsManager:
|
|
|
738
800
|
except ImportError:
|
|
739
801
|
return False, self.generate_buy_link(token_address, fet_amount_wei)
|
|
740
802
|
except Exception as e:
|
|
803
|
+
Logger.error(ctx, "BUY_ERROR", str(e))
|
|
741
804
|
return False, str(e)
|
|
742
805
|
|
|
743
806
|
def sell_via_web3(
|
|
744
807
|
self, ctx: Context, token_address: str, token_amount: int,
|
|
745
|
-
bonding_curve_address: str = "",
|
|
746
808
|
) -> Tuple[bool, str]:
|
|
809
|
+
"""
|
|
810
|
+
Sell tokens back to the bonding curve. No approval needed — the token
|
|
811
|
+
contract burns from msg.sender directly.
|
|
812
|
+
|
|
813
|
+
Flow: call sellTokens(tokenAmount) on the token contract.
|
|
814
|
+
"""
|
|
747
815
|
try:
|
|
748
816
|
from web3 import Web3
|
|
749
817
|
|
|
@@ -756,44 +824,33 @@ class HoldingsManager:
|
|
|
756
824
|
return False, "Cannot connect to BSC RPC."
|
|
757
825
|
|
|
758
826
|
account = w3.eth.account.from_key(private_key)
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
if not bonding_curve_address:
|
|
762
|
-
return False, self.generate_sell_link(token_address, token_amount)
|
|
827
|
+
token_addr = Web3.to_checksum_address(token_address)
|
|
763
828
|
|
|
764
|
-
#
|
|
765
|
-
token_contract = w3.eth.contract(
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
).build_transaction({
|
|
772
|
-
"from": account.address,
|
|
773
|
-
"nonce": nonce,
|
|
774
|
-
"gas": 100000,
|
|
775
|
-
"gasPrice": w3.eth.gas_price,
|
|
776
|
-
"chainId": w3.eth.chain_id,
|
|
777
|
-
})
|
|
778
|
-
signed_approve = w3.eth.account.sign_transaction(approve_tx, private_key)
|
|
779
|
-
w3.eth.send_raw_transaction(signed_approve.raw_transaction)
|
|
829
|
+
# 1. Check token balance
|
|
830
|
+
token_contract = w3.eth.contract(address=token_addr, abi=TOKEN_ABI + ERC20_ABI)
|
|
831
|
+
balance = token_contract.functions.balanceOf(account.address).call()
|
|
832
|
+
if balance < token_amount:
|
|
833
|
+
return False, (
|
|
834
|
+
f"Insufficient tokens. Have {balance}, want to sell {token_amount}."
|
|
835
|
+
)
|
|
780
836
|
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
)
|
|
786
|
-
sell_tx = curve.functions.sellTokens(
|
|
787
|
-
Web3.to_checksum_address(token_address), token_amount, 0
|
|
837
|
+
# 2. Sell: sellTokens(tokenAmount) — no approval needed
|
|
838
|
+
nonce = w3.eth.get_transaction_count(account.address)
|
|
839
|
+
sell_tx = token_contract.functions.sellTokens(
|
|
840
|
+
token_amount,
|
|
788
841
|
).build_transaction({
|
|
789
|
-
"from": account.address,
|
|
790
|
-
"
|
|
791
|
-
"gas": 300000,
|
|
792
|
-
"gasPrice": w3.eth.gas_price,
|
|
842
|
+
"from": account.address, "nonce": nonce,
|
|
843
|
+
"gas": 300000, "gasPrice": w3.eth.gas_price,
|
|
793
844
|
"chainId": w3.eth.chain_id,
|
|
794
845
|
})
|
|
795
846
|
signed_sell = w3.eth.account.sign_transaction(sell_tx, private_key)
|
|
796
847
|
tx_hash = w3.eth.send_raw_transaction(signed_sell.raw_transaction)
|
|
848
|
+
|
|
849
|
+
# 3. Wait for confirmation
|
|
850
|
+
receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=60)
|
|
851
|
+
if receipt.status != 1:
|
|
852
|
+
return False, f"Sell transaction reverted: {tx_hash.hex()}"
|
|
853
|
+
|
|
797
854
|
Logger.info(ctx, "SELL_VIA_WEB3", {
|
|
798
855
|
"token": token_address[:12],
|
|
799
856
|
"amount": token_amount,
|
|
@@ -804,8 +861,63 @@ class HoldingsManager:
|
|
|
804
861
|
except ImportError:
|
|
805
862
|
return False, self.generate_sell_link(token_address, token_amount)
|
|
806
863
|
except Exception as e:
|
|
864
|
+
Logger.error(ctx, "SELL_ERROR", str(e))
|
|
807
865
|
return False, str(e)
|
|
808
866
|
|
|
867
|
+
def get_balances(
|
|
868
|
+
self, ctx: Context, token_address: str = "",
|
|
869
|
+
) -> Dict[str, Any]:
|
|
870
|
+
"""Check wallet BNB, FET, and (optionally) token balances."""
|
|
871
|
+
result: Dict[str, Any] = {"bnb": 0, "fet": 0, "token": 0, "wallet": ""}
|
|
872
|
+
try:
|
|
873
|
+
from web3 import Web3
|
|
874
|
+
|
|
875
|
+
private_key = os.environ.get("BSC_PRIVATE_KEY", "")
|
|
876
|
+
if not private_key:
|
|
877
|
+
return result
|
|
878
|
+
|
|
879
|
+
w3 = Web3(Web3.HTTPProvider(self.BSC_RPC))
|
|
880
|
+
if not w3.is_connected():
|
|
881
|
+
return result
|
|
882
|
+
|
|
883
|
+
account = w3.eth.account.from_key(private_key)
|
|
884
|
+
result["wallet"] = account.address
|
|
885
|
+
|
|
886
|
+
# BNB balance
|
|
887
|
+
result["bnb"] = w3.eth.get_balance(account.address)
|
|
888
|
+
|
|
889
|
+
# FET balance
|
|
890
|
+
try:
|
|
891
|
+
if token_address:
|
|
892
|
+
tc = w3.eth.contract(
|
|
893
|
+
address=Web3.to_checksum_address(token_address), abi=TOKEN_ABI,
|
|
894
|
+
)
|
|
895
|
+
fet_addr = tc.functions.FET_TOKEN().call()
|
|
896
|
+
else:
|
|
897
|
+
fet_addr = TFET_ADDRESS
|
|
898
|
+
fet_contract = w3.eth.contract(
|
|
899
|
+
address=Web3.to_checksum_address(fet_addr), abi=ERC20_ABI,
|
|
900
|
+
)
|
|
901
|
+
result["fet"] = fet_contract.functions.balanceOf(account.address).call()
|
|
902
|
+
except Exception:
|
|
903
|
+
pass
|
|
904
|
+
|
|
905
|
+
# Token balance (if address provided)
|
|
906
|
+
if token_address:
|
|
907
|
+
try:
|
|
908
|
+
token_contract = w3.eth.contract(
|
|
909
|
+
address=Web3.to_checksum_address(token_address), abi=ERC20_ABI,
|
|
910
|
+
)
|
|
911
|
+
result["token"] = token_contract.functions.balanceOf(account.address).call()
|
|
912
|
+
except Exception:
|
|
913
|
+
pass
|
|
914
|
+
|
|
915
|
+
except ImportError:
|
|
916
|
+
pass
|
|
917
|
+
except Exception:
|
|
918
|
+
pass
|
|
919
|
+
return result
|
|
920
|
+
|
|
809
921
|
def get_holdings_summary(self, ctx: Context, token_addresses: List[str]) -> List[Dict]:
|
|
810
922
|
results = []
|
|
811
923
|
for addr in token_addresses:
|
|
@@ -934,7 +1046,7 @@ async def handle_business(
|
|
|
934
1046
|
wallet — WalletManager: get_balance(), get_address(), fund_check()
|
|
935
1047
|
revenue — RevenueTracker: record_income/expense(), get_summary()
|
|
936
1048
|
self_aware — SelfAwareMixin: update(), get_effort_mode(), get_token_summary()
|
|
937
|
-
holdings — HoldingsManager: buy_via_web3(), sell_via_web3(), get_holdings_summary()
|
|
1049
|
+
holdings — HoldingsManager: buy_via_web3(), sell_via_web3(), get_balances(), get_holdings_summary()
|
|
938
1050
|
cache — Cache: get(), set()
|
|
939
1051
|
|
|
940
1052
|
Args:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"genesis.js","sourceRoot":"","sources":["../../src/templates/genesis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,6FAA6F;AAC7F,MAAM,YAAY,GAAG,6BAA6B,CAAC;AACnD,MAAM,WAAW,GAAG,iEAAiE,CAAC;AACtF,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB;IACvD,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,QAAQ,GAAkB;IACrC,IAAI,EAAE,SAAS;IACf,WAAW,EACT,iGAAiG;IACnG,QAAQ,EAAE,iBAAiB;IAC3B,SAAS,EAAE;QACT,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE;QACxE;YACE,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,yBAAyB;YAClC,WAAW,EAAE,2CAA2C;SACzD;QACD;YACE,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,QAAQ;YACjB,WAAW,EACT,uFAAuF;SAC1F;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,kBAAkB;YAC3B,WAAW,EAAE,wDAAwD;SACtE;QACD;YACE,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,qCAAqC;SACnD;QACD;YACE,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,kEAAkE;SAChF;QACD;YACE,IAAI,EAAE,yBAAyB;YAC/B,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,uCAAuC;SACrD;QACD;YACE,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,QAAQ;YACjB,WAAW,EAAE,iDAAiD;SAC/D;QACD;YACE,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,kCAAkC;SAChD;QACD;YACE,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,+BAA+B;SAC7C;KACF;IACD,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;IAClC,OAAO,EAAE;QACP,oBAAoB;QACpB,qBAAqB;QACrB,eAAe;QACf,qBAAqB;QACrB,iBAAiB;KAClB;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uDAgG+C,gBAAgB
|
|
1
|
+
{"version":3,"file":"genesis.js","sourceRoot":"","sources":["../../src/templates/genesis.ts"],"names":[],"mappings":"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"}
|