ETH Price: $2,519.48 (-0.74%)

Transaction Decoder

Block:
21050615 at Oct-26-2024 03:13:23 PM +UTC
Transaction Fee:
0.002451335334084576 ETH $6.18
Gas Used:
361,188 Gas / 6.786868152 Gwei

Account State Difference:

  Address   Before After State Difference Code
(beaverbuild)
8.470341271233446963 Eth8.470691623593446963 Eth0.00035035236
0xCB0eC27E...1F5863FFB
0.080545143940103402 Eth
Nonce: 1186
0.078093808606018826 Eth
Nonce: 1187
0.002451335334084576

Execution Trace

ETH 0.00009 UTB.swapAndExecute( instructions=[{name:swapInstructions, type:tuple, order:1, indexed:false, value:[{name:swapperId, type:uint8, order:1, indexed:false, value:0, valueString:0}, {name:swapParams, type:tuple, order:2, indexed:false, value:[{name:amountIn, type:uint256, order:1, indexed:false, value:500000000000000000000, valueString:500000000000000000000}, {name:amountOut, type:uint256, order:2, indexed:false, value:205270959995949462, valueString:205270959995949462}, {name:dustOut, type:uint256, order:3, indexed:false, value:0, valueString:0}, {name:tokenIn, type:address, order:4, indexed:false, value:0x4d224452801ACEd8B2F0aebE155379bb5D594381, valueString:0x4d224452801ACEd8B2F0aebE155379bb5D594381}, {name:tokenOut, type:address, order:5, indexed:false, value:0x0000000000000000000000000000000000000000, valueString:0x0000000000000000000000000000000000000000}, {name:direction, type:uint8, order:6, indexed:false, value:0, valueString:0}, {name:refund, type:address, order:7, indexed:false, value:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB, valueString:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB}, {name:additionalArgs, type:bytes, order:8, indexed:false, value:0x4D224452801ACED8B2F0AEBE155379BB5D594381000BB8C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2, valueString:0x4D224452801ACED8B2F0AEBE155379BB5D594381000BB8C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2}], valueString:[{name:amountIn, type:uint256, order:1, indexed:false, value:500000000000000000000, valueString:500000000000000000000}, {name:amountOut, type:uint256, order:2, indexed:false, value:205270959995949462, valueString:205270959995949462}, {name:dustOut, type:uint256, order:3, indexed:false, value:0, valueString:0}, {name:tokenIn, type:address, order:4, indexed:false, value:0x4d224452801ACEd8B2F0aebE155379bb5D594381, valueString:0x4d224452801ACEd8B2F0aebE155379bb5D594381}, {name:tokenOut, type:address, order:5, indexed:false, value:0x0000000000000000000000000000000000000000, valueString:0x0000000000000000000000000000000000000000}, {name:direction, type:uint8, order:6, indexed:false, value:0, valueString:0}, {name:refund, type:address, order:7, indexed:false, value:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB, valueString:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB}, {name:additionalArgs, type:bytes, order:8, indexed:false, value:0x4D224452801ACED8B2F0AEBE155379BB5D594381000BB8C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2, valueString:0x4D224452801ACED8B2F0AEBE155379BB5D594381000BB8C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2}]}], valueString:[{name:swapperId, type:uint8, order:1, indexed:false, value:0, valueString:0}, {name:swapParams, type:tuple, order:2, indexed:false, value:[{name:amountIn, type:uint256, order:1, indexed:false, value:500000000000000000000, valueString:500000000000000000000}, {name:amountOut, type:uint256, order:2, indexed:false, value:205270959995949462, valueString:205270959995949462}, {name:dustOut, type:uint256, order:3, indexed:false, value:0, valueString:0}, {name:tokenIn, type:address, order:4, indexed:false, value:0x4d224452801ACEd8B2F0aebE155379bb5D594381, valueString:0x4d224452801ACEd8B2F0aebE155379bb5D594381}, {name:tokenOut, type:address, order:5, indexed:false, value:0x0000000000000000000000000000000000000000, valueString:0x0000000000000000000000000000000000000000}, {name:direction, type:uint8, order:6, indexed:false, value:0, valueString:0}, {name:refund, type:address, order:7, indexed:false, value:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB, valueString:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB}, {name:additionalArgs, type:bytes, order:8, indexed:false, value:0x4D224452801ACED8B2F0AEBE155379BB5D594381000BB8C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2, valueString:0x4D224452801ACED8B2F0AEBE155379BB5D594381000BB8C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2}], valueString:[{name:amountIn, type:uint256, order:1, indexed:false, value:500000000000000000000, valueString:500000000000000000000}, {name:amountOut, type:uint256, order:2, indexed:false, value:205270959995949462, valueString:205270959995949462}, {name:dustOut, type:uint256, order:3, indexed:false, value:0, valueString:0}, {name:tokenIn, type:address, order:4, indexed:false, value:0x4d224452801ACEd8B2F0aebE155379bb5D594381, valueString:0x4d224452801ACEd8B2F0aebE155379bb5D594381}, {name:tokenOut, type:address, order:5, indexed:false, value:0x0000000000000000000000000000000000000000, valueString:0x0000000000000000000000000000000000000000}, {name:direction, type:uint8, order:6, indexed:false, value:0, valueString:0}, {name:refund, type:address, order:7, indexed:false, value:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB, valueString:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB}, {name:additionalArgs, type:bytes, order:8, indexed:false, value:0x4D224452801ACED8B2F0AEBE155379BB5D594381000BB8C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2, valueString:0x4D224452801ACED8B2F0AEBE155379BB5D594381000BB8C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2}]}]}, {name:target, type:address, order:2, indexed:false, value:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB, valueString:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB}, {name:paymentOperator, type:address, order:3, indexed:false, value:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB, valueString:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB}, {name:refund, type:address, order:4, indexed:false, value:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB, valueString:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB}, {name:executionFee, type:uint256, order:5, indexed:false, value:0, valueString:0}, {name:payload, type:bytes, order:6, indexed:false, value:0x, valueString:0x}, {name:txId, type:bytes32, order:7, indexed:false, value:66DEB981D467685B036FD0CFBFA6D3D519C00A29CFF4E5FBF8B07C7C2CF9AABB, valueString:66DEB981D467685B036FD0CFBFA6D3D519C00A29CFF4E5FBF8B07C7C2CF9AABB}], feeData=[{name:appId, type:bytes4, order:1, indexed:false, value:+ae5eA==, valueString:System.Byte[]}, {name:affiliateId, type:bytes4, order:2, indexed:false, value:AAAAAA==, valueString:System.Byte[]}, {name:bridgeFee, type:uint256, order:3, indexed:false, value:0, valueString:0}, {name:deadline, type:uint256, order:4, indexed:false, value:1730041941, valueString:1730041941}, {name:chainId, type:uint256, order:5, indexed:false, value:1, valueString:1}, {name:appFees, type:tuple[], order:6, indexed:false}], signature=0x4F2F2FE0B89FFAC21A03A87FA2862E5040C1362272506A0F02127218E5C14F9E14406941342EA9A79471F77CB6207E32AC870EC784DF3A5AB5498A3784C10E2D1B )
  • UTBFeeManager.verifySignature( packedInfo=0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002E000000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000CB0EC27E86A2A51C981B9E3EE28FF861F5863FFB000000000000000000000000CB0EC27E86A2A51C981B9E3EE28FF861F5863FFB000000000000000000000000CB0EC27E86A2A51C981B9E3EE28FF861F5863FFB0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028066DEB981D467685B036FD0CFBFA6D3D519C00A29CFF4E5FBF8B07C7C2CF9AABB0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000001B1AE4D6E2EF50000000000000000000000000000000000000000000000000000002D944D9BD43119600000000000000000000000000000000000000000000000000000000000000000000000000000000000000004D224452801ACED8B2F0AEBE155379BB5D59438100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CB0EC27E86A2A51C981B9E3EE28FF861F5863FFB0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002B4D224452801ACED8B2F0AEBE155379BB5D594381000BB8C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F9A7B978000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000671E5855000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000C0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000006DD843B78E6CC34744473176D8A61743EEFAA9A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, signature=0x4F2F2FE0B89FFAC21A03A87FA2862E5040C1362272506A0F02127218E5C14F9E14406941342EA9A79471F77CB6207E32AC870EC784DF3A5AB5498A3784C10E2D1B )
    • Null: 0x000...001.2c38c004( )
    • GnosisSafeProxy.CALL( )
      • GnosisSafeL2.DELEGATECALL( )
      • SimpleToken.transferFrom( sender=0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB, recipient=0x14036De12aC0C96d4d5eD03e150d6558A43bBeE5, amount=500000000000000000000 ) => ( True )
      • SimpleToken.approve( spender=0x2EeC08Fb9C0FcCCF64780c329cec64Ae12D7a28E, amount=500000000000000000000 ) => ( True )
      • UniSwapper.swap( swapParams=[{name:amountIn, type:uint256, order:1, indexed:false, value:500000000000000000000, valueString:500000000000000000000}, {name:amountOut, type:uint256, order:2, indexed:false, value:205270959995949462, valueString:205270959995949462}, {name:dustOut, type:uint256, order:3, indexed:false, value:0, valueString:0}, {name:tokenIn, type:address, order:4, indexed:false, value:0x4d224452801ACEd8B2F0aebE155379bb5D594381, valueString:0x4d224452801ACEd8B2F0aebE155379bb5D594381}, {name:tokenOut, type:address, order:5, indexed:false, value:0x0000000000000000000000000000000000000000, valueString:0x0000000000000000000000000000000000000000}, {name:direction, type:uint8, order:6, indexed:false, value:0, valueString:0}, {name:refund, type:address, order:7, indexed:false, value:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB, valueString:0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB}, {name:additionalArgs, type:bytes, order:8, indexed:false, value:0x4D224452801ACED8B2F0AEBE155379BB5D594381000BB8C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2, valueString:0x4D224452801ACED8B2F0AEBE155379BB5D594381000BB8C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2}] ) => ( tokenOut=0x0000000000000000000000000000000000000000, amountOut=207450441577476849 )
        • SimpleToken.transferFrom( sender=0x14036De12aC0C96d4d5eD03e150d6558A43bBeE5, recipient=0x2EeC08Fb9C0FcCCF64780c329cec64Ae12D7a28E, amount=500000000000000000000 ) => ( True )
        • SimpleToken.approve( spender=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45, amount=500000000000000000000 ) => ( True )
        • SwapRouter02.exactInput( params=[{name:path, type:bytes, order:1, indexed:false, value:0x4D224452801ACED8B2F0AEBE155379BB5D594381000BB8C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2, valueString:0x4D224452801ACED8B2F0AEBE155379BB5D594381000BB8C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2}, {name:recipient, type:address, order:2, indexed:false, value:0x2EeC08Fb9C0FcCCF64780c329cec64Ae12D7a28E, valueString:0x2EeC08Fb9C0FcCCF64780c329cec64Ae12D7a28E}, {name:amountIn, type:uint256, order:3, indexed:false, value:500000000000000000000, valueString:500000000000000000000}, {name:amountOutMinimum, type:uint256, order:4, indexed:false, value:205270959995949462, valueString:205270959995949462}] ) => ( amountOut=207450441577476849 )
          • Uniswap V3: APE 7.128acb08( )
            • WETH9.transfer( dst=0x2EeC08Fb9C0FcCCF64780c329cec64Ae12D7a28E, wad=207450441577476849 ) => ( True )
            • SimpleToken.balanceOf( account=0xAc4b3DacB91461209Ae9d41EC517c2B9Cb1B7DAF ) => ( 830956816468787807894545 )
            • SwapRouter02.uniswapV3SwapCallback( amount0Delta=500000000000000000000, amount1Delta=-207450441577476849, _data=0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000002EEC08FB9C0FCCCF64780C329CEC64AE12D7A28E000000000000000000000000000000000000000000000000000000000000002B4D224452801ACED8B2F0AEBE155379BB5D594381000BB8C02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2000000000000000000000000000000000000000000 )
              • SimpleToken.transferFrom( sender=0x2EeC08Fb9C0FcCCF64780c329cec64Ae12D7a28E, recipient=0xAc4b3DacB91461209Ae9d41EC517c2B9Cb1B7DAF, amount=500000000000000000000 ) => ( True )
              • SimpleToken.balanceOf( account=0xAc4b3DacB91461209Ae9d41EC517c2B9Cb1B7DAF ) => ( 831456816468787807894545 )
              • WETH9.transfer( dst=0x14036De12aC0C96d4d5eD03e150d6558A43bBeE5, wad=207450441577476849 ) => ( True )
              • WETH9.withdraw( wad=207450441577476849 )
                • ETH 0.207450441577476849 UTB.CALL( )
                • ETH 0.207450441577476849 UTBExecutor.execute( target=0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB, paymentOperator=0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB, payload=0x, token=0x0000000000000000000000000000000000000000, amount=207450441577476849, refund=0xCB0eC27E86a2a51c981b9e3ee28fF861F5863FFB, executionFee=0 )
                  • ETH 0.207450441577476849 0xcb0ec27e86a2a51c981b9e3ee28ff861f5863ffb.CALL( )
                    File 1 of 9: UTB
                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9
                    10
                    11
                    12
                    13
                    14
                    15
                    16
                    // SPDX-License-Identifier: GPL-3.0
                    pragma solidity 0.8.24;
                    import {Roles} from "./utils/Roles.sol";
                    import {IUTB} from "./interfaces/IUTB.sol";
                    import {IUTBExecutor} from "./interfaces/IUTBExecutor.sol";
                    import {IERC20} from "@openzeppelin/contracts/interfaces/IERC20.sol";
                    import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
                    import {IWETH} from "./interfaces/IWETH.sol";
                    import {IUTBFeeManager} from "./interfaces/IUTBFeeManager.sol";
                    import {IBridgeAdapter} from "./interfaces/IBridgeAdapter.sol";
                    import {ISwapper} from "./interfaces/ISwapper.sol";
                    import {SwapInstructions, SwapParams, FeeData, Fee, BridgeInstructions, SwapAndExecuteInstructions} from "./CommonTypes.sol";
                    contract UTB is IUTB, Roles {
                    constructor() Roles(msg.sender) {}
                    IUTBExecutor public executor;
                    IUTBFeeManager public feeManager;
                    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                    File 2 of 9: UTBFeeManager
                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9
                    10
                    11
                    12
                    13
                    14
                    15
                    16
                    // SPDX-License-Identifier: GPL-3.0
                    pragma solidity 0.8.24;
                    import {IUTBFeeManager} from "./interfaces/IUTBFeeManager.sol";
                    import {Roles} from "./utils/Roles.sol";
                    contract UTBFeeManager is IUTBFeeManager, Roles {
                    address public signer;
                    string constant BANNER = "\\x19Ethereum Signed Message:\
                    32";
                    constructor(address _signer) Roles(msg.sender) {
                    signer = _signer;
                    }
                    /// @inheritdoc IUTBFeeManager
                    function setSigner(address _signer) public onlyAdmin {
                    signer = _signer;
                    emit SetSigner(_signer);
                    }
                    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                    File 3 of 9: GnosisSafeProxy
                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9
                    10
                    11
                    12
                    13
                    14
                    15
                    16
                    // SPDX-License-Identifier: LGPL-3.0-only
                    pragma solidity >=0.7.0 <0.9.0;
                    /// @title IProxy - Helper interface to access masterCopy of the Proxy on-chain
                    /// @author Richard Meissner - <richard@gnosis.io>
                    interface IProxy {
                    function masterCopy() external view returns (address);
                    }
                    /// @title GnosisSafeProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.
                    /// @author Stefan George - <stefan@gnosis.io>
                    /// @author Richard Meissner - <richard@gnosis.io>
                    contract GnosisSafeProxy {
                    // singleton always needs to be first declared variable, to ensure that it is at the same location in the contracts to which calls are delegated.
                    // To reduce deployment costs this variable is internal and needs to be retrieved via `getStorageAt`
                    address internal singleton;
                    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                    File 4 of 9: GnosisSafeL2
                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9
                    10
                    11
                    12
                    13
                    14
                    15
                    16
                    // SPDX-License-Identifier: LGPL-3.0-only
                    pragma solidity >=0.7.0 <0.9.0;
                    import "./base/ModuleManager.sol";
                    import "./base/OwnerManager.sol";
                    import "./base/FallbackManager.sol";
                    import "./base/GuardManager.sol";
                    import "./common/EtherPaymentFallback.sol";
                    import "./common/Singleton.sol";
                    import "./common/SignatureDecoder.sol";
                    import "./common/SecuredTokenTransfer.sol";
                    import "./common/StorageAccessible.sol";
                    import "./interfaces/ISignatureValidator.sol";
                    import "./external/GnosisSafeMath.sol";
                    /// @title Gnosis Safe - A multisignature wallet with support for confirmations using signed messages based on ERC191.
                    /// @author Stefan George - <stefan@gnosis.io>
                    /// @author Richard Meissner - <richard@gnosis.io>
                    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                    File 5 of 9: SimpleToken
                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9
                    10
                    11
                    12
                    13
                    14
                    15
                    16
                    // SPDX-License-Identifier: MIT
                    pragma solidity ^0.8.10;
                    import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
                    contract SimpleToken is ERC20 {
                    constructor(
                    string memory name,
                    string memory symbol,
                    uint256 totalSupply_
                    ) ERC20(name, symbol) {
                    _mint(msg.sender, totalSupply_);
                    }
                    }
                    // SPDX-License-Identifier: MIT
                    // OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
                    pragma solidity ^0.8.0;
                    /**
                    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                    File 6 of 9: UniSwapper
                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9
                    10
                    11
                    12
                    13
                    14
                    15
                    16
                    // SPDX-License-Identifier: GPL-3.0
                    pragma solidity 0.8.24;
                    import {SwapParams, SwapDirection} from "../CommonTypes.sol";
                    import {IERC20} from "@openzeppelin/contracts/interfaces/IERC20.sol";
                    import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
                    import {IWETH} from "../interfaces/IWETH.sol";
                    import {Swapper} from "../../src/swappers/Swapper.sol";
                    import {IV3SwapRouter} from "@uniswap/swap-router-contracts/contracts/interfaces/IV3SwapRouter.sol";
                    contract UniSwapper is Swapper {
                    uint8 public constant ID = 0;
                    address public uniswap_router;
                    function setRouter(address _router) public onlyAdmin {
                    uniswap_router = _router;
                    }
                    function swap(
                    SwapParams memory swapParams
                    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                    File 7 of 9: SwapRouter02
                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9
                    10
                    11
                    12
                    13
                    14
                    15
                    16
                    // SPDX-License-Identifier: GPL-2.0-or-later
                    pragma solidity =0.7.6;
                    pragma abicoder v2;
                    import '@uniswap/v3-periphery/contracts/base/SelfPermit.sol';
                    import '@uniswap/v3-periphery/contracts/base/PeripheryImmutableState.sol';
                    import './interfaces/ISwapRouter02.sol';
                    import './V2SwapRouter.sol';
                    import './V3SwapRouter.sol';
                    import './base/ApproveAndCall.sol';
                    import './base/MulticallExtended.sol';
                    /// @title Uniswap V2 and V3 Swap Router
                    contract SwapRouter02 is ISwapRouter02, V2SwapRouter, V3SwapRouter, ApproveAndCall, MulticallExtended, SelfPermit {
                    constructor(
                    address _factoryV2,
                    address factoryV3,
                    address _positionManager,
                    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                    File 8 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 9 of 9: UTBExecutor
                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9
                    10
                    11
                    12
                    13
                    14
                    15
                    16
                    // SPDX-License-Identifier: GPL-3.0
                    pragma solidity 0.8.24;
                    import {IUTBExecutor} from "./interfaces/IUTBExecutor.sol";
                    import {IERC20} from "@openzeppelin/contracts/interfaces/IERC20.sol";
                    import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
                    import {Operable} from "./utils/Operable.sol";
                    import {Allowable} from "./utils/Allowable.sol";
                    import {Roles} from "./utils/Roles.sol";
                    contract UTBExecutor is IUTBExecutor, Operable, Allowable {
                    constructor() Roles(msg.sender) {}
                    /// @inheritdoc IUTBExecutor
                    function execute(
                    address target,
                    address paymentOperator,
                    bytes memory payload,
                    address token,
                    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX