ETH Price: $2,750.12 (+5.79%)

Transaction Decoder

Block:
21973348 at Mar-04-2025 11:52:35 AM +UTC
Transaction Fee:
0.000199448828198235 ETH $0.55
Gas Used:
276,535 Gas / 0.721242621 Gwei

Emitted Events:

390 GaspToken.Approval( owner=[Sender] 0xc05ca9bf1833507bb61c3c5bfde2b7e0e14a9f4f, spender=[Receiver] ApprovalProxy, value=0 )
391 GaspToken.Transfer( from=[Sender] 0xc05ca9bf1833507bb61c3c5bfde2b7e0e14a9f4f, to=ERC20Router, value=212657604325624308027 )
392 GaspToken.Approval( owner=ERC20Router, spender=0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71, value=212657604325624308027 )
393 GaspToken.Approval( owner=ERC20Router, spender=0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71, value=0 )
394 GaspToken.Transfer( from=ERC20Router, to=0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71, value=212657604325624308027 )
395 TetherToken.Transfer( from=UniswapV3Pool, to=PancakePair, value=11601075 )
396 GaspToken.Transfer( from=0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71, to=UniswapV3Pool, value=212657604325624308027 )
397 UniswapV3Pool.Swap( sender=0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71, recipient=PancakePair, amount0=212657604325624308027, amount1=-11601075, sqrtPriceX96=18532432175576470376275, liquidity=1305302514919040344, tick=-305382 )
398 WETH9.Transfer( src=PancakePair, dst=0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71, wad=5490812233696505 )
399 PancakePair.Sync( reserve0=63171559463097082973, reserve1=133147797158 )
400 PancakePair.Swap( sender=0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71, amount0In=0, amount1In=11601075, amount0Out=5490812233696505, amount1Out=0, to=0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71 )
401 WETH9.Withdrawal( src=0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71, wad=5490812233696505 )
402 0x85cd07ea01423b1e937929b44e4ad8c40bbb5e71.0x1bf1122521093cffed0b7f29833cd231d885bae58dceb074e411a1fbd94824bd( 0x1bf1122521093cffed0b7f29833cd231d885bae58dceb074e411a1fbd94824bd, 0x000000000000000000000000a1bea5fe917450041748dbbbe7e9ac57a4bbebab, 0x000000000000000000000000736ecc5237b31edec6f1ab9a396fae2416b1d96e, 0x0000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000a1bea5fe917450041748dbbbe7e9ac57a4bbebab, 000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee, 00000000000000000000000000000000000000000000000b8737946d0668e13b, 00000000000000000000000000000000000000000000000000119d6d47ee411d, 0000000000000000000000000000000000000000000000000011f974bc5661cb, 000000000000000000000000000000000000000000000000000188689c61632e )

Account State Difference:

  Address   Before After State Difference Code
0x17C1Ae82...e4539aba5
0x2c21D8Fe...a9b816128
(Uniswap V3: GASP-USDT)
(Titan Builder)
7.355705028316171501 Eth7.355705288259071501 Eth0.0000002599429
0x736ECc52...416b1d96E
0x85CD07Ea...40BbB5E71 0.000000000000000001 Eth0.000000000000000002 Eth0.000000000000000001
0x8f7BCcCc...E37e40F2C 0.602354245485088297 Eth0.60278570334340335 Eth0.000431457858315053
0xC02aaA39...83C756Cc2 2,859,677.220962008572461783 Eth2,859,677.215471196338765278 Eth0.005490812233696505
0xC05CA9bf...0e14A9f4f
0.000836972442875393 Eth
Nonce: 1
0.000637523614677158 Eth
Nonce: 2
0.000199448828198235
0xdAC17F95...13D831ec7
0xf70da978...8dfA3dbEF
(Relay: Solver)
405.593875483851813278 Eth405.598934838227194729 Eth0.005059354375381451

Execution Trace

ApprovalProxy.transferAndMulticall( tokens=[0x736ECc5237B31eDec6f1aB9a396FaE2416b1d96E], amounts=[212657604325624308027], targets=[0x736ECc5237B31eDec6f1aB9a396FaE2416b1d96E, 0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71], datas=[CV6nswAAAAAAAAAAAAAAAIXNB+oBQjsek3kptE5K2MQLu15xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhzeUbQZo4Ts=, 3ZxflgAAAAAAAAAAAAAAAHNuzFI3sx7exvGrmjlvriQWsdluAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhzeUbQZo4TsAAAAAAAAAAAAAAADu7u7u7u7u7u7u7u7u7u7u7u7u7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR+XS8VmHLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGdbUfuQR0AAAAAAAAAAAAAAAChvqX+kXRQBBdI27vn6axXpLvrqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAswJzbsxSN7Me3sbxq5o5b64kFrHZbgH//wEsIdj+Kc2/bJj/Y4rFC1Ham4FhKAEXwa6C2ZN5JABZlACTdixeRTmrpQAE2sF/lY0u5SOiIGIGmUWXwT2DHscAF8GugtmTeSQAWZQAk3YsXkU5q6UAhc0H6gFCOx6TeSm0TkrYxAu7XnEACcQBwCqqObIj/o0KDlxPJ+rZCDx1bMIB//8CAIXNB+oBQjsek3kptE5K2MQLu15xAAAAAAAAAAAAAAAAAA==], values=[0, 0], refundTo=0xf70da97812CB96acDF810712Aa562db8dfA3dbEF ) => ( 0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000011F974BC5661CB )
  • GaspToken.transferFrom( owner=0xC05CA9bf1833507bB61C3C5BFde2b7e0e14A9f4f, recipient=0xA1BEa5fe917450041748Dbbbe7E9AC57A4bBEBaB, amount=212657604325624308027 ) => ( True )
  • ERC20Router.delegatecallMulticall( targets=[0x736ECc5237B31eDec6f1aB9a396FaE2416b1d96E, 0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71], datas=[CV6nswAAAAAAAAAAAAAAAIXNB+oBQjsek3kptE5K2MQLu15xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhzeUbQZo4Ts=, 3ZxflgAAAAAAAAAAAAAAAHNuzFI3sx7exvGrmjlvriQWsdluAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhzeUbQZo4TsAAAAAAAAAAAAAAADu7u7u7u7u7u7u7u7u7u7u7u7u7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR+XS8VmHLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGdbUfuQR0AAAAAAAAAAAAAAAChvqX+kXRQBBdI27vn6axXpLvrqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAswJzbsxSN7Me3sbxq5o5b64kFrHZbgH//wEsIdj+Kc2/bJj/Y4rFC1Ham4FhKAEXwa6C2ZN5JABZlACTdixeRTmrpQAE2sF/lY0u5SOiIGIGmUWXwT2DHscAF8GugtmTeSQAWZQAk3YsXkU5q6UAhc0H6gFCOx6TeSm0TkrYxAu7XnEACcQBwCqqObIj/o0KDlxPJ+rZCDx1bMIB//8CAIXNB+oBQjsek3kptE5K2MQLu15xAAAAAAAAAAAAAAAAAA==], values=[0, 0], refundTo=0xf70da97812CB96acDF810712Aa562db8dfA3dbEF ) => ( 0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000011F974BC5661CB )
    • Multicaller.aggregate( targets=[0x736ECc5237B31eDec6f1aB9a396FaE2416b1d96E, 0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71], data=[CV6nswAAAAAAAAAAAAAAAIXNB+oBQjsek3kptE5K2MQLu15xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhzeUbQZo4Ts=, 3ZxflgAAAAAAAAAAAAAAAHNuzFI3sx7exvGrmjlvriQWsdluAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhzeUbQZo4TsAAAAAAAAAAAAAAADu7u7u7u7u7u7u7u7u7u7u7u7u7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR+XS8VmHLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGdbUfuQR0AAAAAAAAAAAAAAAChvqX+kXRQBBdI27vn6axXpLvrqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAswJzbsxSN7Me3sbxq5o5b64kFrHZbgH//wEsIdj+Kc2/bJj/Y4rFC1Ham4FhKAEXwa6C2ZN5JABZlACTdixeRTmrpQAE2sF/lY0u5SOiIGIGmUWXwT2DHscAF8GugtmTeSQAWZQAk3YsXkU5q6UAhc0H6gFCOx6TeSm0TkrYxAu7XnEACcQBwCqqObIj/o0KDlxPJ+rZCDx1bMIB//8CAIXNB+oBQjsek3kptE5K2MQLu15xAAAAAAAAAAAAAAAAAA==], values=[0, 0], refundTo=0xf70da97812CB96acDF810712Aa562db8dfA3dbEF ) => ( [AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=, AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH5dLxWYcs=] )
      • GaspToken.approve( spender=0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71, amount=212657604325624308027 ) => ( True )
      • 0x85cd07ea01423b1e937929b44e4ad8c40bbb5e71.dd9c5f96( )
        • GaspToken.balanceOf( account=0xA1BEa5fe917450041748Dbbbe7E9AC57A4bBEBaB ) => ( 212657604325624308027 )
        • GaspToken.transferFrom( owner=0xA1BEa5fe917450041748Dbbbe7E9AC57A4bBEBaB, recipient=0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71, amount=212657604325624308027 ) => ( True )
        • UniswapV3Pool.swap( recipient=0x17C1Ae82D99379240059940093762c5e4539aba5, zeroForOne=True, amountSpecified=212657604325624308027, sqrtPriceLimitX96=4295128740, data=0x000000000000000000000000736ECC5237B31EDEC6F1AB9A396FAE2416B1D96E0000000000000000000000000000000000000000000000000000000000000000 ) => ( amount0=212657604325624308027, amount1=-11601075 )
          • TetherToken.transfer( _to=0x17C1Ae82D99379240059940093762c5e4539aba5, _value=11601075 )
          • GaspToken.balanceOf( account=0x2c21D8Fe29cdbf6C98Ff638Ac50b51Da9b816128 ) => ( 6318133525858447388917236 )
          • 0x85cd07ea01423b1e937929b44e4ad8c40bbb5e71.fa461e33( )
            • GaspToken.transfer( recipient=0x2c21D8Fe29cdbf6C98Ff638Ac50b51Da9b816128, amount=212657604325624308027 ) => ( True )
            • GaspToken.balanceOf( account=0x2c21D8Fe29cdbf6C98Ff638Ac50b51Da9b816128 ) => ( 6318346183462773013225263 )
            • PancakePair.STATICCALL( )
            • TetherToken.balanceOf( who=0x17C1Ae82D99379240059940093762c5e4539aba5 ) => ( 133147797158 )
            • PancakePair.swap( amount0Out=5490812233696505, amount1Out=0, to=0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71, data=0x )
              • WETH9.transfer( dst=0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71, wad=5490812233696505 ) => ( True )
              • WETH9.balanceOf( 0x17C1Ae82D99379240059940093762c5e4539aba5 ) => ( 63171559463097082973 )
              • TetherToken.balanceOf( who=0x17C1Ae82D99379240059940093762c5e4539aba5 ) => ( 133147797158 )
              • WETH9.balanceOf( 0x85CD07Ea01423b1E937929B44E4Ad8c40BbB5E71 ) => ( 5490812233696506 )
              • WETH9.withdraw( wad=5490812233696505 )
                • ETH 0.005490812233696505 0x85cd07ea01423b1e937929b44e4ad8c40bbb5e71.CALL( )
                • ETH 0.005490812233696505 0x85cd07ea01423b1e937929b44e4ad8c40bbb5e71.CALL( )
                • GaspToken.balanceOf( account=0xA1BEa5fe917450041748Dbbbe7E9AC57A4bBEBaB ) => ( 0 )
                • ETH 0.000431457858315053 TokenChomper.CALL( )
                • ETH 0.005059354375381451 ERC20Router.CALL( )
                • ETH 0.005059354375381451 Relay: Solver.CALL( )
                  transferAndMulticall[ApprovalProxy (ln:37)]
                  File 1 of 9: ApprovalProxy
                  1
                  2
                  3
                  4
                  5
                  6
                  7
                  8
                  9
                  10
                  11
                  12
                  13
                  14
                  15
                  16
                  // SPDX-License-Identifier: MIT
                  pragma solidity ^0.8.23;
                  import {Ownable} from "solady/src/auth/Ownable.sol";
                  import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
                  import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
                  import {IERC20Router} from "../src/types/interfaces/IERC20Router.sol";
                  contract ApprovalProxy is Ownable {
                  using SafeERC20 for IERC20;
                  error ArrayLengthsMismatch();
                  error ERC20TransferFromFailed();
                  error NativeTransferFailed();
                  event RouterUpdated(address newRouter);
                  address public router;
                  receive() external payable {}
                  constructor(address _owner, address _router) {
                  _initializeOwner(_owner);
                  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                  File 2 of 9: GaspToken
                  1
                  2
                  3
                  4
                  5
                  6
                  7
                  8
                  9
                  10
                  11
                  12
                  13
                  14
                  15
                  16
                  // SPDX-License-Identifier: BUSL-1.1
                  pragma solidity 0.8.13;
                  import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
                  import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
                  import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
                  import {Context} from "@openzeppelin/contracts/utils/Context.sol";
                  import {IGaspToken} from "./interfaces/IGaspToken.sol";
                  contract GaspToken is Context, Ownable, ERC20, IGaspToken {
                  uint256 private constant _TOTAL_SUPPLY = 1_000_000_000 * 10 ** 18;
                  string private constant _NAME = "GASP";
                  string private constant _SYMBOL = "GASP";
                  mapping(address => bool) public override senderWhitelist;
                  mapping(address => bool) public override recipientWhitelist;
                  bool public override allowTransfers;
                  modifier isWhitelisted(address sender, address recipient, bytes4 selector) {
                  if (!allowTransfers && !senderWhitelist[sender] && !recipientWhitelist[recipient]) {
                  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                  File 3 of 9: ERC20Router
                  1
                  2
                  3
                  4
                  5
                  6
                  7
                  8
                  9
                  10
                  11
                  12
                  13
                  14
                  15
                  16
                  // SPDX-License-Identifier: MIT
                  pragma solidity ^0.8.25;
                  import {Ownable} from "solady/src/auth/Ownable.sol";
                  import {Tstorish} from "tstorish/src/Tstorish.sol";
                  import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
                  import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
                  import {IERC1155} from "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
                  import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
                  import {IAllowanceTransfer} from "permit2-relay/src/interfaces/IAllowanceTransfer.sol";
                  import {ISignatureTransfer} from "permit2-relay/src/interfaces/ISignatureTransfer.sol";
                  import {IPermit2} from "permit2-relay/src/interfaces/IPermit2.sol";
                  import {RelayerWitness} from "./types/lib/RelayStructs.sol";
                  import {IMulticaller} from "./types/interfaces/IMulticaller.sol";
                  contract ERC20Router is Ownable, Tstorish {
                  using SafeERC20 for IERC20;
                  // --- Errors --- //
                  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                  File 4 of 9: UniswapV3Pool
                  1
                  2
                  3
                  4
                  5
                  6
                  7
                  8
                  9
                  10
                  11
                  12
                  13
                  14
                  15
                  16
                  // SPDX-License-Identifier: BUSL-1.1
                  pragma solidity =0.7.6;
                  import './interfaces/IUniswapV3Pool.sol';
                  import './NoDelegateCall.sol';
                  import './libraries/LowGasSafeMath.sol';
                  import './libraries/SafeCast.sol';
                  import './libraries/Tick.sol';
                  import './libraries/TickBitmap.sol';
                  import './libraries/Position.sol';
                  import './libraries/Oracle.sol';
                  import './libraries/FullMath.sol';
                  import './libraries/FixedPoint128.sol';
                  import './libraries/TransferHelper.sol';
                  import './libraries/TickMath.sol';
                  import './libraries/LiquidityMath.sol';
                  import './libraries/SqrtPriceMath.sol';
                  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                  File 5 of 9: PancakePair
                  1
                  2
                  3
                  4
                  5
                  6
                  7
                  8
                  9
                  10
                  11
                  12
                  13
                  14
                  15
                  16
                  /**
                  *Submitted for verification at BscScan.com on 2021-04-23
                  */
                  /**
                  *Submitted for verification at BscScan.com on 2021-04-22
                  */
                  /**
                  *Submitted for verification at BscScan.com on 2021-04-22
                  */
                  /**
                  *Submitted for verification at BscScan.com on 2020-09-19
                  */
                  pragma solidity =0.5.16;
                  interface IPancakeFactory {
                  event PairCreated(address indexed token0, address indexed token1, address pair, uint);
                  function feeTo() external view returns (address);
                  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                  File 6 of 9: TetherToken
                  1
                  2
                  3
                  4
                  5
                  6
                  7
                  8
                  9
                  10
                  11
                  12
                  13
                  14
                  15
                  16
                  pragma solidity ^0.4.17;
                  /**
                  * @title SafeMath
                  * @dev Math operations with safety checks that throw on error
                  */
                  library SafeMath {
                  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
                  if (a == 0) {
                  return 0;
                  }
                  uint256 c = a * b;
                  assert(c / a == b);
                  return c;
                  }
                  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                  File 7 of 9: WETH9
                  1
                  2
                  3
                  4
                  5
                  6
                  7
                  8
                  9
                  10
                  11
                  12
                  13
                  14
                  15
                  16
                  // Copyright (C) 2015, 2016, 2017 Dapphub
                  // This program is free software: you can redistribute it and/or modify
                  // it under the terms of the GNU General Public License as published by
                  // the Free Software Foundation, either version 3 of the License, or
                  // (at your option) any later version.
                  // This program is distributed in the hope that it will be useful,
                  // but WITHOUT ANY WARRANTY; without even the implied warranty of
                  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
                  // GNU General Public License for more details.
                  // You should have received a copy of the GNU General Public License
                  // along with this program. If not, see <http://www.gnu.org/licenses/>.
                  pragma solidity ^0.4.18;
                  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                  File 8 of 9: Multicaller
                  1
                  2
                  3
                  4
                  5
                  6
                  7
                  8
                  9
                  10
                  11
                  12
                  13
                  14
                  15
                  16
                  // SPDX-License-Identifier: MIT
                  pragma solidity ^0.8.4;
                  /**
                  * @title Multicaller
                  * @author vectorized.eth
                  * @notice Contract that allows for efficient aggregation
                  * of multiple calls in a single transaction.
                  */
                  contract Multicaller {
                  // =============================================================
                  // ERRORS
                  // =============================================================
                  /**
                  * @dev The lengths of the input arrays are not the same.
                  */
                  error ArrayLengthsMismatch();
                  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                  File 9 of 9: TokenChomper
                  1
                  2
                  3
                  4
                  5
                  6
                  7
                  8
                  9
                  10
                  11
                  12
                  13
                  14
                  15
                  16
                  // SPDX-License-Identifier: GPL-3.0-or-later
                  pragma solidity >=0.8.0 ^0.8.0;
                  // lib/openzeppelin-contracts/contracts/utils/Context.sol
                  // OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
                  /**
                  * @dev Provides information about the current execution context, including the
                  * sender of the transaction and its data. While these are generally available
                  * via msg.sender and msg.data, they should not be accessed in such a direct
                  * manner, since when dealing with meta-transactions the account sending and
                  * paying for execution may not be the actual sender (as far as an application
                  * is concerned).
                  *
                  * This contract is only required for intermediate, library-like contracts.
                  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX