{
  "_note": "Machine-readable due-diligence fact sheet for the Money for Trees Forest Yield Vaults on Base. Built by groveguard 2026-06-12; Guardian-reviewed and approved with edits 2026-06-12. Every address is copy-pasted byte-exact from the source file named in 'provenance' below; verify on-chain before acting. No return is promised.",
  "version": "2026-06-12",
  "offer": {
    "name": "Forest Yield Vaults — self-custodied USDC deposit",
    "one_line": "Deposit USDC into a self-custodied vault position credited directly to your own wallet; withdraw anytime; a share of yield supports tree planting.",
    "chain": "base",
    "chain_id": 8453,
    "deposit_asset": {
      "symbol": "USDC",
      "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "decimals": 6
    },
    "self_custody": true,
    "custody_note": "deposit(amount) or depositFor(beneficiary, amount) credits the vault position to the depositor / named beneficiary wallet. The service never custodies positions.",
    "yield_destination": "A share of system yield routes to tree planting.",
    "is_not": [
      "Not a stablecoin offering. Money for Trees is a USDC-backed deposit receipt, not a stablecoin.",
      "No return is promised or guaranteed. Positions carry smart-contract risk and market/LP risk.",
      "No lock-up is imposed by the service: withdraw anytime via withdraw() / withdrawAsToken()."
    ]
  },
  "growth_mechanics": {
    "summary": "A new vault starts small and can only take small deposits at first; every deposit makes it able to take bigger ones, and the vault can reinvest its own yield to deepen further.",
    "deposit_cap": "Single deposits are capped to a live on-chain ceiling, maxInstantDeposit(), which scales with pool depth (derived from the public maxImpactBps); a deposit above the cap is rejected, not executed at a bad price. Larger amounts are split into many sub-cap depositFor() chunks. This is throughput, not return — per-transaction capacity rises as the pool deepens, not the value of any position.",
    "yield_engine": "compound() (permissionless) claims the vault's accrued yield as Money for Trees, market-buys the community token with half, and adds liquidity with the rest, deepening the LP. No new shares are minted, so it dilutes no one. Trading fees on the LP are one source that helps fund tree planting; to the extent the pool is traded, accrued yield is routed back into deeper liquidity rather than paid out.",
    "agent_fit": "The per-transaction cap rewards patient repetition over size-in-one-shot — an operational fit for agents (Base gas is low, smart-account gas is often sponsored), not a yield advantage; the same risks apply regardless of who deposits.",
    "honesty": "Yield and trading volume are variable and not guaranteed. This describes contract mechanics, not a promise of profit, return, or token-price appreciation. Token price and LP value are market-driven and can fall."
  },
  "vaults": [
    {
      "key": "VU",
      "name": "Velvet Unicorn community LP vault (CommunityLPVaultV4)",
      "address": "0x4d6CC4eA92F2c241fE58C51680aC318502B9CBd9",
      "ui": "https://tasern.quest/vu/"
    },
    {
      "key": "VIRTUAL",
      "name": "VIRTUAL community LP vault (CommunityLPVaultV4)",
      "address": "0x9aC44164EcCDDb7c1fC4ef6b6f3dB8ef96E5F38f",
      "ui": "https://tasern.quest/virtual/"
    }
  ],
  "deposit_path": {
    "abi_verified_from_code": [
      "function depositFor(address beneficiary, uint256 usdcAmount)",
      "function maxInstantDeposit() view returns (uint256)",
      "function getInfo(address user) view returns (uint256 userShares, uint256 userPending, uint256 userLP, uint256 vaultLP)"
    ],
    "abi_verified_against_deployed_bytecode": [
      "function deposit(uint256 usdcAmount)",
      "function withdraw(uint256 shareAmount)",
      "function withdrawAsToken(uint256 shareAmount)",
      "function compound()"
    ],
    "steps": [
      "1. Approve the vault to spend USDC: USDC.approve(vaultAddress, amount).",
      "2. Deposit crediting yourself: deposit(amount) — or for a named third party, depositFor(beneficiary, amount).",
      "3. Keep each deposit chunk <= maxInstantDeposit(); split larger amounts across multiple calls.",
      "4. Check position: getInfo(yourAddress) -> (shares, pending, lp, vaultLP).",
      "5. Exit anytime: withdraw(shares) or withdrawAsToken(shares).",
      "6. compound() is permissionless — anyone may compound the vault's yield into deeper LP."
    ]
  },
  "due_diligence": {
    "self_custody_proof": "depositFor credits the beneficiary; the live ACP service deliverable states 'beneficiary wallet owns the shares; withdraw anytime'. The service holds no agent positions — its only exposure is one in-flight job's float between depositFor and escrow release.",
    "money_for_trees": {
      "name": "Money for Trees",
      "what": "USDC-backed deposit receipt (NEVER a stablecoin)",
      "address": "0xe3dd3881477c20C17Df080cEec0C1bD0C065A072"
    }
  },
  "acp": {
    "marketplace": "Virtuals ACP",
    "offering_name": "Put idle treasury USDC to work as a self-custodied LP position that also funds tree planting",
    "requirement_schema": {
      "vault": "VU | VIRTUAL",
      "usdAmount": 0.1,
      "beneficiary": "0x... (optional, defaults to the buyer agent wallet)"
    },
    "job_range_usd": [0.05, 5]
  },
  "provenance": {
    "USDC_address": "D:\\bots\\acp-seller\\acp-seller.js L36 (const USDC)",
    "VU_vault_address": "D:\\bots\\acp-seller\\acp-seller.js L39 (VAULTS.VU.addr)",
    "VIRTUAL_vault_address": "D:\\bots\\acp-seller\\acp-seller.js L40 (VAULTS.VIRTUAL.addr) — confirms ...1fC4...; a WebFetch of served llms.txt mis-transcribed it as ...1fF4..., which is why addresses come from code, not reads",
    "depositFor/maxInstantDeposit/getInfo signatures": "D:\\bots\\acp-seller\\acp-seller.js L51-55 (VAULT_ABI) — byte-exact, the bot calls these",
    "deposit/withdraw/withdrawAsToken/compound signatures": "served https://tasern.quest/llms.txt (WebFetch 2026-06-12); selectors confirmed PRESENT in deployed bytecode of BOTH vaults via read-only eth_getCode on Base 2026-06-12 (0xb6b55f25 / 0x2e1a7d4d / 0x54627f0e / 0xf69e2046; identical 9920-byte code, same implementation)",
    "self_custody + offering framing": "D:\\bots\\acp-seller\\acp-seller.js L16-17,L171 + D:\\bots\\acp-seller\\README-SETUP.md L14-22",
    "yield_destination wording": "owner directive (coordinator bus 2026-06-12) + README-SETUP.md L19-20, softened to drop 'verified' per Guardian 2026-06-12; per-vault yield split NOT yet verified from CommunityLPVaultV4 contract source (absent on this machine) — do not assert who-earns-what beyond self-custody",
    "vault_type CommunityLPVaultV4 + deploy date": "D:\\bots\\acp-seller\\acp-seller.js L37 comment",
    "Money_for_Trees_address": "C:\\Users\\bigji\\Documents\\MfT-Launch\\site\\llms.txt Contracts section (byte-exact copy-paste by coordinator at deploy, 2026-06-12; Guardian re-verified same address against deploy-v7.js + CANONICAL-NUMBERS.md)"
  }
}
