// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.8.0;
interface ISafe {
enum Operation {
Call,
DelegateCall
}
function execTransactionFromModule(
address to,
uint256 value,
bytes calldata data,
Operation operation
) external returns (bool success);
}
contract SimpleUSDCTransferModule {
// Arbitrum USDC address (checksummed)
address public constant USDC = 0xaf88d065e77c8cC2239327C5EDb3A432268e5831;
// Safe contract address
address public constant SAFE = 0x34A5207FCD54458fD7e3790246730e191C60fe07;
// Authorized delegate who can execute transfers
address public constant DELEGATE = 0x4986dE761b18cfc7ccCfA143e21D6A99063397b9;
// Destination address
address public constant DESTINATION = 0x5e71A68881ee7923E4E6D40950720B0ce63CB9af;
event UsdcTransferred(uint256 value);
function executeTransfer(uint256 amount) external {
require(msg.sender == DELEGATE, "Not authorized");
require(
ISafe(SAFE).execTransactionFromModule(
USDC,
0,
abi.encodeWithSelector(0xa9059cbb, DESTINATION, amount), // USDC transfer selector
ISafe.Operation.Call
),
"Transfer failed"
);
emit UsdcTransferred(amount);
}
}
{
"compilationTarget": {
"SimpleUSDCTransferModule.sol": "SimpleUSDCTransferModule"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"UsdcTransferred","type":"event"},{"inputs":[],"name":"DELEGATE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DESTINATION","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SAFE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"executeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"}]