const { ethers } = require("ethers");
const USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";
const ESCROW = "0x086e8aA17b03De99b5E7825d57900E2311Cfd5d0";
const ABI = ["function contribute(uint256 amount) external"];
const provider = new ethers.JsonRpcProvider(RPC_URL);
const signer = new ethers.Wallet(PRIVATE_KEY, provider);
// Approve USDC
const usdc = new ethers.Contract(USDC, [
"function approve(address,uint256) returns (bool)"
], signer);
await usdc.approve(ESCROW, 1_000_000); // 1 USDC
// Contribute
const escrow = new ethers.Contract(ESCROW, ABI, signer);
await escrow.contribute(1_000_000);
from web3 import Web3
w3 = Web3(Web3.HTTPProvider(RPC_URL))
usdc = w3.eth.contract(address=USDC_ADDR, abi=ERC20_ABI)
escrow = w3.eth.contract(address=ESCROW_ADDR, abi=ESCROW_ABI)
# Approve
usdc.functions.approve(ESCROW_ADDR, 1_000_000).transact()
# Contribute
escrow.functions.contribute(1_000_000).transact()
# Direct USDC transfer (ERC-20 approve + contribute)
# Use cast (Foundry) for direct contract interaction.
# Or send USDC directly to the contract via your wallet.
# Approve USDC
cast send 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 \
"approve(address,uint256)" \
0x086e8aA17b03De99b5E7825d57900E2311Cfd5d0 1000000 \
--rpc-url $RPC_URL --private-key $PK
# Contribute
cast send 0x086e8aA17b03De99b5E7825d57900E2311Cfd5d0 \
"contribute(uint256)" 1000000 \
--rpc-url $RPC_URL --private-key $PK