ETH Price: $3,006.90 (+0.47%)

Transaction Decoder

Block:
20796028 at Sep-21-2024 02:39:11 AM +UTC
Transaction Fee:
0.00316302627670656 ETH $9.51
Gas Used:
263,472 Gas / 12.00517048 Gwei

Emitted Events:

393 LayerZeroToken.Transfer( from=[Sender] 0xe71bf9d0e63fd3b82c96ed8bfdce4efff53bfdb7, to=0x0000000000000000000000000000000000000000, value=487943996000000000000 )
394 SendUln302.ExecutorFeePaid( executor=OptimizedTransparentUpgradeableProxy, fee=24373218058157 )
395 SendUln302.DVNFeePaid( requiredDVNs=[0x589dEDbD617e0CBcB916A9223F4d1300c294236b, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc], optionalDVNs=[], fees=[1662560235360, 1662560235360] )
396 EndpointV2.PacketSent( encodedPayload=0x01000000000000007B000075950000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CD0000759F0000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CDB3B60F85A05E1B34A2687A13E470B3CB231D0F659DC23AE49603AFFBBCC4000C000000000000000000000000E71BF9D0E63FD3B82C96ED8BFDCE4EFFF53BFDB7000000001D156F3C, options=0x00030100110100000000000000000000000000013880, sendLibrary=SendUln302 )
397 LayerZeroToken.OFTSent( guid=B3B60F85A05E1B34A2687A13E470B3CB231D0F659DC23AE49603AFFBBCC4000C, dstEid=30111, fromAddress=[Sender] 0xe71bf9d0e63fd3b82c96ed8bfdce4efff53bfdb7, amountSentLD=487943996000000000000, amountReceivedLD=487943996000000000000 )

Account State Difference:

  Address   Before After State Difference Code
0x1a440760...c50fE728c
(LayerZero: EndpointV2)
0x6985884C...7F13271cd
(beaverbuild)
7.13127706498323351 Eth7.13127731264691351 Eth0.00000024766368
0xbB2Ea70C...E1372dCe1 13.593139800339418078 Eth13.593167498677946955 Eth0.000027698338528877
0xe71BF9d0...FF53BFDb7
0.011298017570449468 Eth
Nonce: 155
0.008107292955214031 Eth
Nonce: 156
0.003190724615235437

Execution Trace

ETH 0.000027698338528877 LayerZeroToken.send( _sendParam=[{name:dstEid, type:uint32, order:1, indexed:false, value:30111, valueString:30111}, {name:to, type:bytes32, order:2, indexed:false, value:000000000000000000000000E71BF9D0E63FD3B82C96ED8BFDCE4EFFF53BFDB7, valueString:000000000000000000000000E71BF9D0E63FD3B82C96ED8BFDCE4EFFF53BFDB7}, {name:amountLD, type:uint256, order:3, indexed:false, value:487943996000000000000, valueString:487943996000000000000}, {name:minAmountLD, type:uint256, order:4, indexed:false, value:485504276020000000000, valueString:485504276020000000000}, {name:extraOptions, type:bytes, order:5, indexed:false, value:0x0003, valueString:0x0003}, {name:composeMsg, type:bytes, order:6, indexed:false, value:0x, valueString:0x}, {name:oftCmd, type:bytes, order:7, indexed:false, value:0x, valueString:0x}], _fee=[{name:nativeFee, type:uint256, order:1, indexed:false, value:27698338528877, valueString:27698338528877}, {name:lzTokenFee, type:uint256, order:2, indexed:false, value:0, valueString:0}], _refundAddress=0xe71BF9d0E63FD3B82C96Ed8bFdCE4EfFF53BFDb7 ) => ( msgReceipt=[{name:guid, type:bytes32, order:1, indexed:false, value:B3B60F85A05E1B34A2687A13E470B3CB231D0F659DC23AE49603AFFBBCC4000C, valueString:B3B60F85A05E1B34A2687A13E470B3CB231D0F659DC23AE49603AFFBBCC4000C}, {name:nonce, type:uint64, order:2, indexed:false, value:123, valueString:123}, {name:fee, type:tuple, order:3, indexed:false, value:[{name:nativeFee, type:uint256, order:1, indexed:false, value:27698338528877, valueString:27698338528877}, {name:lzTokenFee, type:uint256, order:2, indexed:false, value:0, valueString:0}], valueString:[{name:nativeFee, type:uint256, order:1, indexed:false, value:27698338528877, valueString:27698338528877}, {name:lzTokenFee, type:uint256, order:2, indexed:false, value:0, valueString:0}]}], oftReceipt=[{name:amountSentLD, type:uint256, order:1, indexed:false, value:487943996000000000000, valueString:487943996000000000000}, {name:amountReceivedLD, type:uint256, order:2, indexed:false, value:487943996000000000000, valueString:487943996000000000000}] )
  • ETH 0.000027698338528877 EndpointV2.send( _params=[{name:dstEid, type:uint32, order:1, indexed:false, value:30111, valueString:30111}, {name:receiver, type:bytes32, order:2, indexed:false, value:0000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CD, valueString:0000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CD}, {name:message, type:bytes, order:3, indexed:false, value:0x000000000000000000000000E71BF9D0E63FD3B82C96ED8BFDCE4EFFF53BFDB7000000001D156F3C, valueString:0x000000000000000000000000E71BF9D0E63FD3B82C96ED8BFDCE4EFFF53BFDB7000000001D156F3C}, {name:options, type:bytes, order:4, indexed:false, value:0x00030100110100000000000000000000000000013880, valueString:0x00030100110100000000000000000000000000013880}, {name:payInLzToken, type:bool, order:5, indexed:false, value:false, valueString:False}], _refundAddress=0xe71BF9d0E63FD3B82C96Ed8bFdCE4EfFF53BFDb7 ) => ( [{name:guid, type:bytes32, order:1, indexed:false, value:B3B60F85A05E1B34A2687A13E470B3CB231D0F659DC23AE49603AFFBBCC4000C, valueString:B3B60F85A05E1B34A2687A13E470B3CB231D0F659DC23AE49603AFFBBCC4000C}, {name:nonce, type:uint64, order:2, indexed:false, value:123, valueString:123}, {name:fee, type:tuple, order:3, indexed:false, value:[{name:nativeFee, type:uint256, order:1, indexed:false, value:27698338528877, valueString:27698338528877}, {name:lzTokenFee, type:uint256, order:2, indexed:false, value:0, valueString:0}], valueString:[{name:nativeFee, type:uint256, order:1, indexed:false, value:27698338528877, valueString:27698338528877}, {name:lzTokenFee, type:uint256, order:2, indexed:false, value:0, valueString:0}]}] )
    • SendUln302.send( _packet=[{name:nonce, type:uint64, order:1, indexed:false, value:123, valueString:123}, {name:srcEid, type:uint32, order:2, indexed:false, value:30101, valueString:30101}, {name:sender, type:address, order:3, indexed:false, value:0x6985884C4392D348587B19cb9eAAf157F13271cd, valueString:0x6985884C4392D348587B19cb9eAAf157F13271cd}, {name:dstEid, type:uint32, order:4, indexed:false, value:30111, valueString:30111}, {name:receiver, type:bytes32, order:5, indexed:false, value:0000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CD, valueString:0000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CD}, {name:guid, type:bytes32, order:6, indexed:false, value:B3B60F85A05E1B34A2687A13E470B3CB231D0F659DC23AE49603AFFBBCC4000C, valueString:B3B60F85A05E1B34A2687A13E470B3CB231D0F659DC23AE49603AFFBBCC4000C}, {name:message, type:bytes, order:7, indexed:false, value:0x000000000000000000000000E71BF9D0E63FD3B82C96ED8BFDCE4EFFF53BFDB7000000001D156F3C, valueString:0x000000000000000000000000E71BF9D0E63FD3B82C96ED8BFDCE4EFFF53BFDB7000000001D156F3C}], _options=0x00030100110100000000000000000000000000013880, _payInLzToken=False ) => ( [{name:nativeFee, type:uint256, order:1, indexed:false, value:27698338528877, valueString:27698338528877}, {name:lzTokenFee, type:uint256, order:2, indexed:false, value:0, valueString:0}], 0x01000000000000007B000075950000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CD0000759F0000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CDB3B60F85A05E1B34A2687A13E470B3CB231D0F659DC23AE49603AFFBBCC4000C000000000000000000000000E71BF9D0E63FD3B82C96ED8BFDCE4EFFF53BFDB7000000001D156F3C )
      • OptimizedTransparentUpgradeableProxy.717e8a42( )
        • 0xdac2d26317c42ae3cb21357b73404120e1da4232.717e8a42( )
          • 0x0f04f5d8bb631197845dae519d03d7997f7d20ba.566ef762( )
            • OptimizedTransparentUpgradeableProxy.c1723a1d( )
            • DVN.assignJob( _param=[{name:dstEid, type:uint32, order:1, indexed:false, value:30111, valueString:30111}, {name:packetHeader, type:bytes, order:2, indexed:false, value:0x01000000000000007B000075950000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CD0000759F0000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CD, valueString:0x01000000000000007B000075950000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CD0000759F0000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CD}, {name:payloadHash, type:bytes32, order:3, indexed:false, value:141D1B4EE220F10F3CC42ADAC6D93550D6F7EFB5E80ED1D242A8E74AF7C6745F, valueString:141D1B4EE220F10F3CC42ADAC6D93550D6F7EFB5E80ED1D242A8E74AF7C6745F}, {name:confirmations, type:uint64, order:4, indexed:false, value:15, valueString:15}, {name:sender, type:address, order:5, indexed:false, value:0x6985884C4392D348587B19cb9eAAf157F13271cd, valueString:0x6985884C4392D348587B19cb9eAAf157F13271cd}], _options=0x ) => ( totalFee=1662560235360 )
              • DVNFeeLib.getFeeOnSend( _params=[{name:priceFeed, type:address, order:1, indexed:false, value:0xC03f31fD86a9077785b7bCf6598Ce3598Fa91113, valueString:0xC03f31fD86a9077785b7bCf6598Ce3598Fa91113}, {name:dstEid, type:uint32, order:2, indexed:false, value:30111, valueString:30111}, {name:confirmations, type:uint64, order:3, indexed:false, value:15, valueString:15}, {name:sender, type:address, order:4, indexed:false, value:0x6985884C4392D348587B19cb9eAAf157F13271cd, valueString:0x6985884C4392D348587B19cb9eAAf157F13271cd}, {name:quorum, type:uint64, order:5, indexed:false, value:2, valueString:2}, {name:defaultMultiplierBps, type:uint16, order:6, indexed:false, value:12200, valueString:12200}], _dstConfig=[{name:gas, type:uint64, order:1, indexed:false, value:30000, valueString:30000}, {name:multiplierBps, type:uint16, order:2, indexed:false, value:12000, valueString:12000}, {name:floorMarginUSD, type:uint128, order:3, indexed:false, value:0, valueString:0}], _options=0x ) => ( 1662560235360 )
                • OptimizedTransparentUpgradeableProxy.c1723a1d( )
                  • 0x319ae539b5ba554b09a46791cdb88b10e4d8f627.c1723a1d( )
                  • VerifierNetwork.assignJob( _param=[{name:dstEid, type:uint32, order:1, indexed:false, value:30111, valueString:30111}, {name:packetHeader, type:bytes, order:2, indexed:false, value:0x01000000000000007B000075950000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CD0000759F0000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CD, valueString:0x01000000000000007B000075950000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CD0000759F0000000000000000000000006985884C4392D348587B19CB9EAAF157F13271CD}, {name:payloadHash, type:bytes32, order:3, indexed:false, value:141D1B4EE220F10F3CC42ADAC6D93550D6F7EFB5E80ED1D242A8E74AF7C6745F, valueString:141D1B4EE220F10F3CC42ADAC6D93550D6F7EFB5E80ED1D242A8E74AF7C6745F}, {name:confirmations, type:uint64, order:4, indexed:false, value:15, valueString:15}, {name:sender, type:address, order:5, indexed:false, value:0x6985884C4392D348587B19cb9eAAf157F13271cd, valueString:0x6985884C4392D348587B19cb9eAAf157F13271cd}], _options=0x ) => ( totalFee=1662560235360 )
                    • VerifierFeeLib.getFeeOnSend( _params=[{name:priceFeed, type:address, order:1, indexed:false, value:0xC03f31fD86a9077785b7bCf6598Ce3598Fa91113, valueString:0xC03f31fD86a9077785b7bCf6598Ce3598Fa91113}, {name:dstEid, type:uint32, order:2, indexed:false, value:30111, valueString:30111}, {name:confirmations, type:uint64, order:3, indexed:false, value:15, valueString:15}, {name:sender, type:address, order:4, indexed:false, value:0x6985884C4392D348587B19cb9eAAf157F13271cd, valueString:0x6985884C4392D348587B19cb9eAAf157F13271cd}, {name:quorum, type:uint64, order:5, indexed:false, value:2, valueString:2}, {name:defaultMultiplierBps, type:uint16, order:6, indexed:false, value:12100, valueString:12100}], _dstConfig=[{name:gas, type:uint64, order:1, indexed:false, value:30000, valueString:30000}, {name:multiplierBps, type:uint16, order:2, indexed:false, value:12000, valueString:12000}, {name:floorMarginUSD, type:uint128, order:3, indexed:false, value:0, valueString:0}], 0x ) => ( 1662560235360 )
                      • OptimizedTransparentUpgradeableProxy.c1723a1d( )
                        • 0x319ae539b5ba554b09a46791cdb88b10e4d8f627.c1723a1d( )
                        • Treasury.payFee( 0x6985884C4392D348587B19cb9eAAf157F13271cd, 30111, _totalFee=27698338528877, _payInLzToken=False ) => ( 0 )
                        • ETH 0.000027698338528877 SendUln302.CALL( )
                          File 1 of 10: LayerZeroToken
                          1
                          2
                          3
                          4
                          5
                          6
                          7
                          8
                          9
                          10
                          11
                          12
                          13
                          14
                          15
                          16
                          // SPDX-License-Identifier: MIT
                          pragma solidity ^0.8.20;
                          // @dev Import the 'MessagingFee' and 'MessagingReceipt' so it's exposed to OApp implementers
                          // solhint-disable-next-line no-unused-import
                          import { OAppSender, MessagingFee, MessagingReceipt } from "./OAppSender.sol";
                          // @dev Import the 'Origin' so it's exposed to OApp implementers
                          // solhint-disable-next-line no-unused-import
                          import { OAppReceiver, Origin } from "./OAppReceiver.sol";
                          import { OAppCore } from "./OAppCore.sol";
                          /**
                          * @title OApp
                          * @dev Abstract contract serving as the base for OApp implementation, combining OAppSender and OAppReceiver functionality.
                          */
                          abstract contract OApp is OAppSender, OAppReceiver {
                          /**
                          * @dev Constructor to initialize the OApp with the provided endpoint and owner.
                          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                          File 2 of 10: SendUln302
                          1
                          2
                          3
                          4
                          5
                          6
                          7
                          8
                          9
                          10
                          11
                          12
                          13
                          14
                          15
                          16
                          // SPDX-License-Identifier: MIT
                          pragma solidity >=0.8.0;
                          import { IMessageLibManager } from "./IMessageLibManager.sol";
                          import { IMessagingComposer } from "./IMessagingComposer.sol";
                          import { IMessagingChannel } from "./IMessagingChannel.sol";
                          import { IMessagingContext } from "./IMessagingContext.sol";
                          struct MessagingParams {
                          uint32 dstEid;
                          bytes32 receiver;
                          bytes message;
                          bytes options;
                          bool payInLzToken;
                          }
                          struct MessagingReceipt {
                          bytes32 guid;
                          uint64 nonce;
                          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                          File 3 of 10: EndpointV2
                          1
                          2
                          3
                          4
                          5
                          6
                          7
                          8
                          9
                          10
                          11
                          12
                          13
                          14
                          15
                          16
                          // SPDX-License-Identifier: MIT
                          // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
                          pragma solidity ^0.8.0;
                          import "../utils/Context.sol";
                          /**
                          * @dev Contract module which provides a basic access control mechanism, where
                          * there is an account (an owner) that can be granted exclusive access to
                          * specific functions.
                          *
                          * By default, the owner account will be the one that deploys the contract. This
                          * can later be changed with {transferOwnership}.
                          *
                          * This module is used through inheritance. It will make available the modifier
                          * `onlyOwner`, which can be applied to your functions to restrict their use to
                          * the owner.
                          */
                          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                          File 4 of 10: OptimizedTransparentUpgradeableProxy
                          1
                          2
                          3
                          4
                          5
                          6
                          7
                          8
                          9
                          10
                          11
                          12
                          13
                          14
                          15
                          16
                          // SPDX-License-Identifier: MIT
                          // OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)
                          pragma solidity ^0.8.0;
                          /**
                          * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
                          * proxy whose upgrades are fully controlled by the current implementation.
                          */
                          interface IERC1822Proxiable {
                          /**
                          * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
                          * address.
                          *
                          * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
                          * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
                          * function revert if invoked through a proxy.
                          */
                          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                          File 5 of 10: OptimizedTransparentUpgradeableProxy
                          1
                          2
                          3
                          4
                          5
                          6
                          7
                          8
                          9
                          10
                          11
                          12
                          13
                          14
                          15
                          16
                          // SPDX-License-Identifier: MIT
                          // OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)
                          pragma solidity ^0.8.0;
                          /**
                          * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
                          * proxy whose upgrades are fully controlled by the current implementation.
                          */
                          interface IERC1822Proxiable {
                          /**
                          * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
                          * address.
                          *
                          * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
                          * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
                          * function revert if invoked through a proxy.
                          */
                          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                          File 6 of 10: DVN
                          1
                          2
                          3
                          4
                          5
                          6
                          7
                          8
                          9
                          10
                          11
                          12
                          13
                          14
                          15
                          16
                          // SPDX-License-Identifier: MIT
                          pragma solidity >=0.8.0;
                          import { IMessageLibManager } from "./IMessageLibManager.sol";
                          import { IMessagingComposer } from "./IMessagingComposer.sol";
                          import { IMessagingChannel } from "./IMessagingChannel.sol";
                          import { IMessagingContext } from "./IMessagingContext.sol";
                          struct MessagingParams {
                          uint32 dstEid;
                          bytes32 receiver;
                          bytes message;
                          bytes options;
                          bool payInLzToken;
                          }
                          struct MessagingReceipt {
                          bytes32 guid;
                          uint64 nonce;
                          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                          File 7 of 10: DVNFeeLib
                          1
                          2
                          3
                          4
                          5
                          6
                          7
                          8
                          9
                          10
                          11
                          12
                          13
                          14
                          15
                          16
                          // SPDX-License-Identifier: LZBL-1.2
                          pragma solidity ^0.8.20;
                          library CalldataBytesLib {
                          function toU8(bytes calldata _bytes, uint256 _start) internal pure returns (uint8) {
                          return uint8(_bytes[_start]);
                          }
                          function toU16(bytes calldata _bytes, uint256 _start) internal pure returns (uint16) {
                          unchecked {
                          uint256 end = _start + 2;
                          return uint16(bytes2(_bytes[_start:end]));
                          }
                          }
                          function toU32(bytes calldata _bytes, uint256 _start) internal pure returns (uint32) {
                          unchecked {
                          uint256 end = _start + 4;
                          return uint32(bytes4(_bytes[_start:end]));
                          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                          File 8 of 10: VerifierNetwork
                          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.0;
                          struct PacketForQuote {
                          address sender;
                          uint32 dstEid;
                          bytes message;
                          }
                          struct Packet {
                          uint64 nonce;
                          uint32 srcEid;
                          address sender;
                          uint32 dstEid;
                          bytes32 receiver;
                          bytes32 guid;
                          bytes message;
                          }
                          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                          File 9 of 10: VerifierFeeLib
                          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.0;
                          library CalldataBytesLib {
                          function toU8(bytes calldata _bytes, uint _start) internal pure returns (uint8) {
                          return uint8(_bytes[_start]);
                          }
                          function toU16(bytes calldata _bytes, uint _start) internal pure returns (uint16) {
                          unchecked {
                          uint end = _start + 2;
                          return uint16(bytes2(_bytes[_start:end]));
                          }
                          }
                          function toU32(bytes calldata _bytes, uint _start) internal pure returns (uint32) {
                          unchecked {
                          uint end = _start + 4;
                          return uint32(bytes4(_bytes[_start:end]));
                          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                          File 10 of 10: Treasury
                          1
                          2
                          3
                          4
                          5
                          6
                          7
                          8
                          9
                          10
                          11
                          12
                          13
                          14
                          15
                          16
                          // SPDX-License-Identifier: MIT
                          pragma solidity >=0.8.0;
                          import { IMessageLibManager } from "./IMessageLibManager.sol";
                          import { IMessagingComposer } from "./IMessagingComposer.sol";
                          import { IMessagingChannel } from "./IMessagingChannel.sol";
                          import { IMessagingContext } from "./IMessagingContext.sol";
                          struct MessagingParams {
                          uint32 dstEid;
                          bytes32 receiver;
                          bytes message;
                          bytes options;
                          bool payInLzToken;
                          }
                          struct MessagingReceipt {
                          bytes32 guid;
                          uint64 nonce;
                          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX