DeploySEALED
█#□?%◆#■^●◆▪~◆╱░!▫$□^░^~╱%╱╱*@╳▒◆●□%░○◆╱╲■●○?▓╳╲◆█▒█!░◆╱!╳◆&@╳▫^
Transaction ID
Execution Fee
0.00000924 FLOWTransaction Summary
DeployContract deployment
Contract deployment
Script Arguments
0nameString
AgentManager3
1codeString
import FungibleToken from 0xf233dcee88fe0abe
import FlowToken from 0x1654653399040a61
import stFlowToken from 0xd6f80565193ad727
import EVM from 0xe467b9dd11fa00df
import VaultCore from 0x79f5b5b0f95a160b
/// AgentManager3 - Simplified version without nested strategy resources
access(all) contract AgentManager3 {
access(all) let AgentStoragePath: StoragePath
access(all) let AgentPublicPath: PublicPath
access(all) event StrategyExecuted(strategy: String, amount: UFix64, result: String)
access(all) event FundsBridgedToEVM(amount: UFix64, evmAddress: String)
access(all) event FundsBridgedFromEVM(amount: UFix64)
access(self) var totalBridgedToEVM: UFix64
access(self) var totalBridgedFromEVM: UFix64
/// Simplified Agent - only manages vault and COA, strategies are stateless
access(all) resource Agent {
access(self) let vaultRef: &VaultCore.Vault
access(self) let coa: auth(EVM.Call, EVM.Withdraw) &EVM.CadenceOwnedAccount
init(vaultRef: &VaultCore.Vault, coa: auth(EVM.Call, EVM.Withdraw) &EVM.CadenceOwnedAccount) {
self.vaultRef = vaultRef
self.coa = coa
}
// Bridge functions work directly with vault and COA
access(all) fun bridgeToEVM(amount: UFix64): Bool {
let flowVault <- self.vaultRef.withdrawForEVMBridge(assetType: VaultCore.AssetType.flow, amount: amount) as! @FlowToken.Vault
self.coa.deposit(from: <-flowVault)
AgentManager3.totalBridgedToEVM = AgentManager3.totalBridgedToEVM + amount
emit FundsBridgedToEVM(amount: amount, evmAddress: self.coa.address().toString())
return true
}
access(all) fun bridgeFromEVM(amount: UFix64): Bool {
let scaledAmount = amount * 1000000000.0
let amountUInt = UInt(scaledAmount) * 1000000000
let balance = EVM.Balance(attoflow: amountUInt)
let flowVault <- self.coa.withdraw(balance: balance) as! @FlowToken.Vault
let actualAmount = flowVault.balance
self.vaultRef.depositFromEVMBridge(from: <-flowVault)
AgentManager3.totalBridgedFromEVM = AgentManager3.totalBridgedFromEVM + actualAmount
emit FundsBridgedFromEVM(amount: actualAmount)
return true
}
access(all) fun executeEVMStrategy(contractAddress: String, calldata: [UInt8], value: UFix64): EVM.Result {
let scaledValue = value * 1000000000.0
let amountUInt = UInt(scaledValue) * 1000000000
let balance = EVM.Balance(attoflow: amountUInt)
let addressBytes = contractAddress.decodeHex()
assert(addressBytes.length == 20, message: "Invalid EVM address")
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]]
let evmAddress = EVM.EVMAddress(bytes: fixedBytes)
return self.coa.call(to: evmAddress, data: calldata, gasLimit: 10_000_000, value: balance)
}
access(all) fun getCOAAddress(): String {
return self.coa.address().toString()
}
access(all) fun getCOABalance(): UFix64 {
let balanceAttoflow = self.coa.balance().attoflow
let scaledDown = UFix64(balanceAttoflow / 1000000000)
return scaledDown / 1000000000.0
}
access(all) fun getVaultAddress(): Address {
return self.vaultRef.owner!.address
}
}
access(all) fun createAgent(vaultRef: &VaultCore.Vault, coa: auth(EVM.Call, EVM.Withdraw) &EVM.CadenceOwnedAccount): @Agent {
return <- create Agent(vaultRef: vaultRef, coa: coa)
}
access(all) fun getMetrics(): {String: UFix64} {
return {"totalBridgedToEVM": self.totalBridgedToEVM, "totalBridgedFromEVM": self.totalBridgedFromEVM}
}
init() {
self.AgentStoragePath = /storage/AgentManager3
self.AgentPublicPath = /public/AgentManager3
self.totalBridgedToEVM = 0.0
self.totalBridgedFromEVM = 0.0
}
}
Cadence Script
1transaction(name: String, code: String ) {
2 prepare(signer: auth(AddContract) &Account) {
3 signer.contracts.add(name: name, code: code.utf8 )
4 }
5 }