Smart Contract

AgentManager3

A.79f5b5b0f95a160b.AgentManager3

Valid From

128,903,601

Deployed

1w ago
Feb 20, 2026, 09:01:22 AM UTC

Dependents

1 imports
1import FungibleToken from 0xf233dcee88fe0abe
2import FlowToken from 0x1654653399040a61
3import stFlowToken from 0xd6f80565193ad727
4import EVM from 0xe467b9dd11fa00df
5import VaultCore from 0x79f5b5b0f95a160b
6
7/// AgentManager3 - Simplified version without nested strategy resources
8access(all) contract AgentManager3 {
9    
10    access(all) let AgentStoragePath: StoragePath
11    access(all) let AgentPublicPath: PublicPath
12    
13    access(all) event StrategyExecuted(strategy: String, amount: UFix64, result: String)
14    access(all) event FundsBridgedToEVM(amount: UFix64, evmAddress: String)
15    access(all) event FundsBridgedFromEVM(amount: UFix64)
16    
17    access(self) var totalBridgedToEVM: UFix64
18    access(self) var totalBridgedFromEVM: UFix64
19    
20    /// Simplified Agent - only manages vault and COA, strategies are stateless
21    access(all) resource Agent {
22        access(self) let vaultRef: &VaultCore.Vault
23        access(self) let coa: auth(EVM.Call, EVM.Withdraw) &EVM.CadenceOwnedAccount
24        
25        init(vaultRef: &VaultCore.Vault, coa: auth(EVM.Call, EVM.Withdraw) &EVM.CadenceOwnedAccount) {
26            self.vaultRef = vaultRef
27            self.coa = coa
28        }
29        
30        // Bridge functions work directly with vault and COA
31        access(all) fun bridgeToEVM(amount: UFix64): Bool {
32            let flowVault <- self.vaultRef.withdrawForEVMBridge(assetType: VaultCore.AssetType.flow, amount: amount) as! @FlowToken.Vault
33            self.coa.deposit(from: <-flowVault)
34            AgentManager3.totalBridgedToEVM = AgentManager3.totalBridgedToEVM + amount
35            emit FundsBridgedToEVM(amount: amount, evmAddress: self.coa.address().toString())
36            return true
37        }
38        
39        access(all) fun bridgeFromEVM(amount: UFix64): Bool {
40            let scaledAmount = amount * 1000000000.0
41            let amountUInt = UInt(scaledAmount) * 1000000000
42            let balance = EVM.Balance(attoflow: amountUInt)
43            let flowVault <- self.coa.withdraw(balance: balance) as! @FlowToken.Vault
44            let actualAmount = flowVault.balance
45            self.vaultRef.depositFromEVMBridge(from: <-flowVault)
46            AgentManager3.totalBridgedFromEVM = AgentManager3.totalBridgedFromEVM + actualAmount
47            emit FundsBridgedFromEVM(amount: actualAmount)
48            return true
49        }
50        
51        access(all) fun executeEVMStrategy(contractAddress: String, calldata: [UInt8], value: UFix64): EVM.Result {
52            let scaledValue = value * 1000000000.0
53            let amountUInt = UInt(scaledValue) * 1000000000
54            let balance = EVM.Balance(attoflow: amountUInt)
55            let addressBytes = contractAddress.decodeHex()
56            assert(addressBytes.length == 20, message: "Invalid EVM address")
57            let fixedBytes: [UInt8; 20] = [addressBytes[0], addressBytes[1], addressBytes[2], addressBytes[3], addressBytes[4], addressBytes[5], addressBytes[6], addressBytes[7], addressBytes[8], addressBytes[9], addressBytes[10], addressBytes[11], addressBytes[12], addressBytes[13], addressBytes[14], addressBytes[15], addressBytes[16], addressBytes[17], addressBytes[18], addressBytes[19]]
58            let evmAddress = EVM.EVMAddress(bytes: fixedBytes)
59            return self.coa.call(to: evmAddress, data: calldata, gasLimit: 10_000_000, value: balance)
60        }
61        
62        access(all) fun getCOAAddress(): String {
63            return self.coa.address().toString()
64        }
65        
66        access(all) fun getCOABalance(): UFix64 {
67            let balanceAttoflow = self.coa.balance().attoflow
68            let scaledDown = UFix64(balanceAttoflow / 1000000000)
69            return scaledDown / 1000000000.0
70        }
71        
72        access(all) fun getVaultAddress(): Address {
73            return self.vaultRef.owner!.address
74        }
75    }
76    
77    access(all) fun createAgent(vaultRef: &VaultCore.Vault, coa: auth(EVM.Call, EVM.Withdraw) &EVM.CadenceOwnedAccount): @Agent {
78        return <- create Agent(vaultRef: vaultRef, coa: coa)
79    }
80    
81    access(all) fun getMetrics(): {String: UFix64} {
82        return {"totalBridgedToEVM": self.totalBridgedToEVM, "totalBridgedFromEVM": self.totalBridgedFromEVM}
83    }
84    
85    init() {
86        self.AgentStoragePath = /storage/AgentManager3
87        self.AgentPublicPath = /public/AgentManager3
88        self.totalBridgedToEVM = 0.0
89        self.totalBridgedFromEVM = 0.0
90    }
91}