# msg.value vs ERC-20 Solidity Examples
## Ethereum Example
This example uses msg.value the native token of a network
```solidity!=
/// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
contract Game {
function startGame() external payable {
(bool sent, bytes memory data) = payable(address(this)).call{value: msg.value}("");
require(sent, "Failed to send Ether");
}
}
```
## ERC-20 Example
This example uses an ERC-20 token which can vary network by network.
This example also uses Open Zeppelin for the ERC-20 standard.
```solidity!=
/// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import “@openzeppelin/contracts/token/ERC20/IERC20.sol”;
contract Game {
IERC20 token;
constructor(address token) {
token = IERC20(token);
}
function startGame() external {
(bool succes, ) = token.transferFrom(msg.sender, payable(address(this)), 1 ether);
require(success, "Failed To Transfer");
}
}
```
## SafeERC20 Utility
This is an extension on the above example that handles the error catching/throwing for you on failed transfers.
```solidity!=
/// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import “@openzeppelin/contracts/token/ERC20/IERC20.sol”;
contract Game {
using SafeERC20 for IERC20;
IERC20 token;
constructor(address token) {
token = IERC20(token);
}
/**
* SafeERC20 handles throwing an error for you
*/
function startGame() external {
token.safeTransferFrom(msg.sender, payable(address(this)), 1 ether);
}
}
```