pragmasolidity^0.8.0;interfaceITokenTransfer{// Event emitted when a transfer is initiated.
// 当发起转移时发出的事件。
eventTransfer(uint256txnId,addressindexedtoken,addressindexedfrom,addressindexedto,uint256amount,uint40unlockTime,bytes32referenceNo);// Event emitted when tokens are withdrawn.
// 当代币被提取时发出的事件。
eventWithdraw(uint256txnId,addressindexedtoken,addressindexedfrom,addressindexedto,uint256amount);// Function to initiate a token transfer.
// 用于发起代币转移的函数。
// Parameters:
// 参数:
// - _token: Address of the ERC20 token contract.
// _token:ERC20 代币合约的地址。
// - _from: Address of the sender.
// _from:发送者的地址。
// - _to: Address of the recipient.
// _to:接收者的地址。
// - _amount: Amount of tokens to be transferred.
// _amount:要转移的代币数量。
// - _unlockTime: Time after which the tokens can be withdrawn.
// _unlockTime:在此时间之后可以提取代币的时间。
// - _reference: Reference ID for the transaction.
// _reference:交易的参考 ID。
// Returns the transaction ID.
// 返回交易 ID。
functiontransferFrom(address_token,address_from,address_to,uint256_amount,uint40_unlockTime,bytes32_reference)externalreturns(uint256txnId);// Function to withdraw tokens from a transaction.
// 用于从交易中提取代币的函数。
// Parameters:
// 参数:
// - _txnId: ID of the transaction to withdraw from.
// _txnId:要从中提取的交易的 ID。
functionwithdraw(uint256_txnId)external;// Function to get transaction details.
// 用于获取交易详细信息的函数。
// Parameters:
// 参数:
// - _txnId: ID of the transaction.
// _txnId:交易的 ID。
// Returns the transaction details.
// 返回交易详细信息。
functiongetTransaction(uint256_txnId)externalviewreturns(addresstoken,addressfrom,addressto,uint256amount,uint40unlockTime,bytes32referenceNo,boolwithdrawn);}
pragmasolidity^0.8.0;import"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";contractTokenTransfer{usingSafeERC20forIERC20;structTransaction{addresstoken;// Address of the ERC20 token contract.
// ERC20 代币合约的地址。
addressfrom;// Address of the sender.
// 发送者的地址。
addressto;// Address of the recipient.
// 接收者的地址。
uint256amount;// Amount of tokens to be transferred.
// 要转移的代币数量。
uint40unlockTime;// Time after which the tokens can be withdrawn.
// 在此时间之后可以提取代币的时间。
bytes32referenceNo;// Reference ID for the transaction.
// 交易的参考 ID。
boolwithdrawn;// Flag indicating if the tokens have been withdrawn.
// 标志,指示代币是否已被提取。
}// Mapping from transaction ID to Transaction structure.
// 从交易 ID 到 Transaction 结构的映射。
mapping(uint256=>Transaction)publictransactions;// Variable to keep track of the next transaction ID.
// 用于跟踪下一个交易 ID 的变量。
uint256publiclastTxnId=0;// Event emitted when a transfer is initiated.
// 当发起转移时发出的事件。
eventTransfer(uint256txnId,addressindexedtoken,addressindexedfrom,addressindexedto,uint256amount,uint40unlockTime,bytes32referenceNo);// Event emitted when tokens are withdrawn.
// 当代币被提取时发出的事件。
eventWithdraw(uint256txnId,addressindexedtoken,addressindexedfrom,addressindexedto,uint256amount);constructor(){}// Function to initiate a token transfer.
// 用于发起代币转移的函数。
// Parameters:
// 参数:
// - _token: Address of the ERC20 token contract.
// _token:ERC20 代币合约的地址。
// - _from: Address of the sender.
// _from:发送者的地址。
// - _to: Address of the recipient.
// _to:接收者的地址。
// - _amount: Amount of tokens to be transferred.
// _amount:要转移的代币数量。
// - _unlockTime: Time after which the tokens can be withdrawn.
// _unlockTime:在此时间之后可以提取代币的时间。
// - _reference: Reference ID for the transaction.
// _reference:交易的参考 ID。
// Returns the transaction ID.
// 返回交易 ID。
functiontransferFrom(address_token,address_from,address_to,uint256_amount,uint40_unlockTime,bytes32_reference)externalreturns(uint256txnId){require(_amount>0,"Invalid transfer amount");// 需要(_amount > 0,“无效的转移金额”);
// Transfer tokens from sender to this contract.
// 将代币从发送者转移到此合约。
IERC20(_token).safeTransferFrom(_from,address(this),_amount);lastTxnId++;// Store the transaction details.
// 存储交易详细信息。
transactions[lastTxnId]=Transaction({token:_token,from:_from,to:_to,amount:_amount,unlockTime:_unlockTime,referenceNo:_reference,withdrawn:false});// Emit an event for the transaction creation.
// 为交易创建发出一个事件。
emitTransfer(lastTxnId,_token,_from,_to,_amount,_unlockTime,_reference);returnlastTxnId;}// Function to withdraw tokens from a transaction.
// 用于从交易中提取代币的函数。
// Parameters:
// 参数:
// - _txnId: ID of the transaction to withdraw from.
// _txnId:要从中提取的交易的 ID。
functionwithdraw(uint256_txnId)external{Transactionstoragetransaction=transactions[_txnId];require(transaction.amount>0,"Invalid transaction ID");// 需要(transaction.amount > 0,“无效的交易 ID”);
require(block.timestamp>=transaction.unlockTime,"Current time is before unlock time");// 需要(block.timestamp >= transaction.unlockTime,“当前时间在解锁时间之前”);
// require(transaction.to == msg.sender, "Only the recipient can withdraw the tokens");
require(!transaction.withdrawn,"Tokens already withdrawn");// 需要(!transaction.withdrawn,“代币已被提取”);
IERC20(transaction.token).safeTransfer(transaction.to,transaction.amount);transaction.withdrawn=true;// Emit an event for the token withdrawal.
// 为代币提取发出一个事件。
emitWithdraw(_txnId,transaction.token,transaction.from,transaction.to,transaction.amount);}// Function to get transaction details.
// 用于获取交易详细信息的函数。
// Parameters:
// 参数:
// - _txnId: ID of the transaction.
// _txnId:交易的 ID。
// Returns the transaction details.
// 返回交易详细信息。
functiongetTransaction(uint256_txnId)externalviewreturns(addresstoken,addressfrom,addressto,uint256amount,uint40unlockTime,bytes32referenceNo,boolwithdrawn){Transactionstoragetransaction=transactions[_txnId];require(transaction.amount>0,"Invalid transaction ID");// 需要(transaction.amount > 0,“无效的交易 ID”);
return(transaction.token,transaction.from,transaction.to,transaction.amount,transaction.unlockTime,transaction.referenceNo,transaction.withdrawn);}}