@across-protocol/contracts 5.0.10-alpha.3 → 5.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/contracts/chain-adapters/ZkStack_Adapter.sol +1 -1
- package/contracts/handlers/MulticallHandler.sol +7 -1
- package/contracts/libraries/SafeTransferERC20.sol +21 -0
- package/contracts/libraries/TronTransferLib.sol +42 -0
- package/contracts/periphery/SpokePoolPeriphery.sol +4 -0
- package/contracts/periphery/counterfactual/CounterfactualDepositSpokePool.sol +7 -3
- package/contracts/periphery/counterfactual/CounterfactualDepositSpokePoolTr.sol +36 -0
- package/contracts/periphery/counterfactual/WithdrawImplementation.sol +3 -6
- package/contracts/periphery/counterfactual/WithdrawImplementationTron.sol +22 -0
- package/contracts/sp1-helios/SP1AutoVerifier.sol +1 -1
- package/contracts/spoke-pools/SpokePool.sol +11 -6
- package/contracts/spoke-pools/Tron_SpokePool.sol +65 -0
- package/contracts/test/MockTronUSDT.sol +36 -0
- package/contracts/tron/TronCounterfactualImports.sol +4 -3
- package/contracts/tron/TronImports.sol +2 -2
- package/contracts/tron/TronPeripheryImports.sol +1 -1
- package/dist/broadcast/deployed-addresses.json +43 -73
- package/dist/evm/artifacts/AcrossMessageHandlerMock.sol/AcrossMessageHandlerMock.json +1 -1
- package/dist/evm/artifacts/AdminWithdrawManager.sol/AdminWithdrawManager.json +1 -1
- package/dist/evm/artifacts/Arbitrum_SpokePool.sol/Arbitrum_SpokePool.json +1 -1
- package/dist/evm/artifacts/Blast_SpokePool.sol/Blast_SpokePool.json +1 -1
- package/dist/evm/artifacts/Boba_SpokePool.sol/Boba_SpokePool.json +1 -1
- package/dist/evm/artifacts/Cher_SpokePool.sol/Cher_SpokePool.json +1 -1
- package/dist/evm/artifacts/CounterfactualDepositSpokePool.sol/CounterfactualDepositSpokePool.json +1 -1
- package/dist/evm/artifacts/CounterfactualDepositSpokePoolTr.sol/CounterfactualDepositSpokePoolTr.json +1 -0
- package/dist/evm/artifacts/DstOFTHandler.sol/DstOFTHandler.json +1 -1
- package/dist/evm/artifacts/Ethereum_SpokePool.sol/Ethereum_SpokePool.json +1 -1
- package/dist/evm/artifacts/HubPoolTestBase.sol/MockAddressWhitelist.json +1 -1
- package/dist/evm/artifacts/HubPoolTestBase.sol/MockFinder.json +1 -1
- package/dist/evm/artifacts/HubPoolTestBase.sol/MockIdentifierWhitelist.json +1 -1
- package/dist/evm/artifacts/HubPoolTestBase.sol/MockLpTokenFactory.json +1 -1
- package/dist/evm/artifacts/HubPoolTestBase.sol/MockOptimisticOracle.json +1 -1
- package/dist/evm/artifacts/HubPoolTestBase.sol/MockStore.json +1 -1
- package/dist/evm/artifacts/Ink_SpokePool.sol/Ink_SpokePool.json +1 -1
- package/dist/evm/artifacts/Lens_SpokePool.sol/Lens_SpokePool.json +1 -1
- package/dist/evm/artifacts/Linea_SpokePool.sol/Linea_SpokePool.json +1 -1
- package/dist/evm/artifacts/Lisk_SpokePool.sol/Lisk_SpokePool.json +1 -1
- package/dist/evm/artifacts/MockBedrockStandardBridge.sol/MockBedrockCrossDomainMessenger.json +1 -1
- package/dist/evm/artifacts/MockBedrockStandardBridge.sol/MockBedrockL1StandardBridge.json +1 -1
- package/dist/evm/artifacts/MockBedrockStandardBridge.sol/MockBedrockL2StandardBridge.json +1 -1
- package/dist/evm/artifacts/MockOptimism_SpokePool.sol/MockOptimism_SpokePool.json +1 -1
- package/dist/evm/artifacts/MockSpokePool.sol/MockSpokePool.json +1 -1
- package/dist/evm/artifacts/MockSpokePoolV2.sol/MockSpokePoolV2.json +1 -1
- package/dist/evm/artifacts/MockTronUSDT.sol/MockTronUSDT.json +1 -0
- package/dist/evm/artifacts/MulticallHandler.sol/MulticallHandler.json +1 -1
- package/dist/evm/artifacts/OP_SpokePool.sol/OP_SpokePool.json +1 -1
- package/dist/evm/artifacts/Optimism_SpokePool.sol/Optimism_SpokePool.json +1 -1
- package/dist/evm/artifacts/Ovm_SpokePool.sol/Ovm_SpokePool.json +1 -1
- package/dist/evm/artifacts/Ovm_WithdrawalHelper.sol/Ovm_WithdrawalHelper.json +1 -1
- package/dist/evm/artifacts/PermissionedMulticallHandler.sol/PermissionedMulticallHandler.json +1 -1
- package/dist/evm/artifacts/PolygonZkEVM_SpokePool.sol/PolygonZkEVM_SpokePool.json +1 -1
- package/dist/evm/artifacts/Polygon_SpokePool.sol/Polygon_SpokePool.json +1 -1
- package/dist/evm/artifacts/SP1AutoVerifier.sol/SP1AutoVerifier.json +1 -1
- package/dist/evm/artifacts/Scroll_SpokePool.sol/Scroll_SpokePool.json +1 -1
- package/dist/evm/artifacts/SpokePool.sol/SpokePool.json +1 -1
- package/dist/evm/artifacts/SpokePoolPeriphery.sol/SpokePoolPeriphery.json +1 -1
- package/dist/evm/artifacts/SpokePoolPeriphery.sol/SwapProxy.json +1 -1
- package/dist/evm/artifacts/SponsoredCCTPDstPeriphery.sol/SponsoredCCTPDstPeriphery.json +1 -1
- package/dist/evm/artifacts/SponsoredCCTPSrcPeriphery.sol/SponsoredCCTPSrcPeriphery.json +1 -1
- package/dist/evm/artifacts/SponsoredOFTSrcPeriphery.sol/SponsoredOFTSrcPeriphery.json +1 -1
- package/dist/evm/artifacts/TronTransferLib.sol/TronTransferLib.json +1 -0
- package/dist/evm/artifacts/Tron_SpokePool.sol/Tron_SpokePool.json +1 -0
- package/dist/evm/artifacts/Universal_SpokePool.sol/Universal_SpokePool.json +1 -1
- package/dist/evm/artifacts/WithdrawImplementation.sol/WithdrawImplementation.json +1 -1
- package/dist/evm/artifacts/WithdrawImplementationTron.sol/WithdrawImplementationTron.json +1 -0
- package/dist/evm/artifacts/WorldChain_SpokePool.sol/WorldChain_SpokePool.json +1 -1
- package/dist/evm/artifacts/ZkStack_Adapter.sol/ZkStack_Adapter.json +1 -1
- package/dist/evm/artifacts/ZkSync_SpokePool.sol/ZkSync_SpokePool.json +1 -1
- package/dist/evm/artifacts/eraVM_EIP7702.sol/SimpleContract.json +1 -1
- package/dist/evm/artifacts/eraVM_EIP7702.sol/SpokePoolEIP7702Test.json +1 -1
- package/dist/evm/artifacts/eraVM_EIP7702.sol/TestableMockSpokePool.json +1 -1
- package/package.json +5 -5
|
@@ -182,7 +182,7 @@ contract ZkStack_Adapter is AdapterInterface, CircleCCTPAdapter {
|
|
|
182
182
|
_transferUsdc(to, amount);
|
|
183
183
|
} else {
|
|
184
184
|
IERC20(l1Token).forceApprove(USDC_SHARED_BRIDGE, amount);
|
|
185
|
-
txHash = BRIDGE_HUB.requestL2TransactionTwoBridges(
|
|
185
|
+
txHash = BRIDGE_HUB.requestL2TransactionTwoBridges{ value: txBaseCost }(
|
|
186
186
|
BridgeHubInterface.L2TransactionRequestTwoBridgesOuter({
|
|
187
187
|
chainId: CHAIN_ID,
|
|
188
188
|
mintValue: txBaseCost,
|
|
@@ -10,7 +10,13 @@ import "@openzeppelin/contracts-v4/security/ReentrancyGuard.sol";
|
|
|
10
10
|
/**
|
|
11
11
|
* @title Across Multicall contract that allows a user to specify a series of calls that should be made by the handler
|
|
12
12
|
* via the message field in the deposit.
|
|
13
|
-
* @dev This contract makes the calls blindly. The
|
|
13
|
+
* @dev This contract makes the calls blindly. The caller should ensure that the tokens received by the handler are
|
|
14
|
+
* completely consumed; otherwise leftover balances will be sent to the fallbackRecipient (when one is provided)
|
|
15
|
+
* or remain on this contract.
|
|
16
|
+
*
|
|
17
|
+
* @dev This contract is a stateless utility with no per-user accounting or admin rescue. Tokens delivered to it
|
|
18
|
+
* are expected to be consumed in the same transaction; any balances left on the contract can be claimed by any
|
|
19
|
+
* caller.
|
|
14
20
|
*/
|
|
15
21
|
contract MulticallHandler is AcrossMessageHandler, ReentrancyGuard {
|
|
16
22
|
using SafeERC20 for IERC20;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
5
|
+
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @notice Mixin exposing a virtual `_safeTransfer` hook. Default implementation uses
|
|
9
|
+
* OZ `SafeERC20.safeTransfer`. Inheritors may override to swap in alternative
|
|
10
|
+
* ERC20 transfer semantics.
|
|
11
|
+
*/
|
|
12
|
+
abstract contract SafeTransferERC20 {
|
|
13
|
+
// This mixin is the only place in the codebase permitted to call `IERC20.safeTransfer`
|
|
14
|
+
// directly. Inheriting contracts restrict their own `using` directives to exclude
|
|
15
|
+
// `safeTransfer` so all transfer call sites are forced through this overridable hook.
|
|
16
|
+
using { SafeERC20.safeTransfer } for IERC20;
|
|
17
|
+
|
|
18
|
+
function _safeTransfer(address token, address to, uint256 amount) internal virtual {
|
|
19
|
+
IERC20(token).safeTransfer(to, amount);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @notice Balance-delta ERC20 transfer for tokens whose `transfer` returns non-standard
|
|
8
|
+
* values. Specifically targets Tron USDT, which returns false even on success.
|
|
9
|
+
* @dev Two-error model: `_safeTransferBalanceCheck` reverts with `TronTransferCallReverted`
|
|
10
|
+
* if the underlying call reverts, or `TronTransferBalanceMismatch` if the call returns
|
|
11
|
+
* but the recipient's balance does not increase by exactly `amount`. `_balanceDeltaTransfer`
|
|
12
|
+
* is the bool-pair primitive both wrappers (revert / no-revert) share — callers needing a
|
|
13
|
+
* collapsed bool can AND the two flags. Assumes no fee-on-transfer.
|
|
14
|
+
*
|
|
15
|
+
* IERC20 and IERC20Upgradeable produce bytewise-identical calldata for
|
|
16
|
+
* `transfer(address,uint256)` and `balanceOf(address)`, so this library is safe to call
|
|
17
|
+
* from contracts using either OZ variant.
|
|
18
|
+
*/
|
|
19
|
+
library TronTransferLib {
|
|
20
|
+
error TronTransferCallReverted();
|
|
21
|
+
error TronTransferBalanceMismatch();
|
|
22
|
+
|
|
23
|
+
/// @dev Returns (callOk, balanceOk). callOk=false means the low-level call reverted;
|
|
24
|
+
/// balanceOk=false means the call returned but balance did not change by exactly `amount`.
|
|
25
|
+
/// When callOk=false, balanceOk is also false (no balance check performed).
|
|
26
|
+
function _balanceDeltaTransfer(
|
|
27
|
+
address token,
|
|
28
|
+
address to,
|
|
29
|
+
uint256 amount
|
|
30
|
+
) internal returns (bool callOk, bool balanceOk) {
|
|
31
|
+
uint256 pre = IERC20(token).balanceOf(to);
|
|
32
|
+
(callOk, ) = token.call(abi.encodeCall(IERC20.transfer, (to, amount)));
|
|
33
|
+
if (!callOk) return (false, false);
|
|
34
|
+
balanceOk = IERC20(token).balanceOf(to) == pre + amount;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function _safeTransferBalanceCheck(address token, address to, uint256 amount) internal {
|
|
38
|
+
(bool callOk, bool balanceOk) = _balanceDeltaTransfer(token, to, amount);
|
|
39
|
+
if (!callOk) revert TronTransferCallReverted();
|
|
40
|
+
if (!balanceOk) revert TronTransferBalanceMismatch();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -21,6 +21,10 @@ import { AddressToBytes32 } from "../libraries/AddressConverters.sol";
|
|
|
21
21
|
* @title SwapProxy
|
|
22
22
|
* @notice A dedicated proxy contract that isolates swap execution to mitigate frontrunning vulnerabilities.
|
|
23
23
|
* The SpokePoolPeriphery transfers tokens to this contract, which performs the swap and returns tokens back to the periphery.
|
|
24
|
+
*
|
|
25
|
+
* @dev This contract is a stateless utility with no per-user accounting or admin rescue. Tokens delivered to it
|
|
26
|
+
* are expected to be consumed in the same transaction; any balances left on the contract can be claimed by any
|
|
27
|
+
* caller.
|
|
24
28
|
* @custom:security-contact bugs@across.to
|
|
25
29
|
*/
|
|
26
30
|
contract SwapProxy is ReentrancyGuard {
|
|
@@ -8,6 +8,7 @@ import { EIP712 } from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";
|
|
|
8
8
|
import { V3SpokePoolInterface } from "../../interfaces/V3SpokePoolInterface.sol";
|
|
9
9
|
import { ICounterfactualImplementation } from "../../interfaces/ICounterfactualImplementation.sol";
|
|
10
10
|
import { NATIVE_ASSET, BPS_SCALAR } from "./CounterfactualConstants.sol";
|
|
11
|
+
import { SafeTransferERC20 } from "../../libraries/SafeTransferERC20.sol";
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* @notice Route parameters committed to in the merkle leaf.
|
|
@@ -51,8 +52,11 @@ struct SpokePoolSubmitterData {
|
|
|
51
52
|
* cannot sign `speedUpV3Deposit` messages.
|
|
52
53
|
* @custom:security-contact bugs@across.to
|
|
53
54
|
*/
|
|
54
|
-
contract CounterfactualDepositSpokePool is ICounterfactualImplementation, EIP712 {
|
|
55
|
-
using
|
|
55
|
+
contract CounterfactualDepositSpokePool is ICounterfactualImplementation, EIP712, SafeTransferERC20 {
|
|
56
|
+
// Restrict the `using` attachment to `forceApprove` only. All `safeTransfer` calls must go
|
|
57
|
+
// through the `_safeTransfer` hook (inherited from `SafeTransferERC20`) so chain-specific
|
|
58
|
+
// variants can override transfer semantics in one place.
|
|
59
|
+
using { SafeERC20.forceApprove } for IERC20;
|
|
56
60
|
|
|
57
61
|
uint256 internal constant EXCHANGE_RATE_SCALAR = 1e18;
|
|
58
62
|
|
|
@@ -152,7 +156,7 @@ contract CounterfactualDepositSpokePool is ICounterfactualImplementation, EIP712
|
|
|
152
156
|
(bool success, ) = sd.executionFeeRecipient.call{ value: dp.executionFee }("");
|
|
153
157
|
if (!success) revert NativeTransferFailed();
|
|
154
158
|
} else {
|
|
155
|
-
|
|
159
|
+
_safeTransfer(inputToken, sd.executionFeeRecipient, dp.executionFee);
|
|
156
160
|
}
|
|
157
161
|
}
|
|
158
162
|
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
import { CounterfactualDepositSpokePool } from "./CounterfactualDepositSpokePool.sol";
|
|
5
|
+
import { TronTransferLib } from "../../libraries/TronTransferLib.sol";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @title CounterfactualDepositSpokePoolTr
|
|
9
|
+
* @notice Tron-specific variant of `CounterfactualDepositSpokePool` for chains where the
|
|
10
|
+
* input token may be Tron USDT (whose `transfer` returns false on success).
|
|
11
|
+
* @dev Inherits everything from the mainline implementation and overrides the
|
|
12
|
+
* `_safeTransfer` hook to use a balance-delta success check that tolerates
|
|
13
|
+
* Tron USDT's non-standard return value. `forceApprove` is unaffected — `approve`
|
|
14
|
+
* returns true correctly on Tron USDT.
|
|
15
|
+
*
|
|
16
|
+
* The EIP-712 domain name is inherited from the parent (`CounterfactualDepositSpokePool`).
|
|
17
|
+
* Cross-implementation signature replay is already prevented by the `verifyingContract`
|
|
18
|
+
* field of the EIP-712 domain: each clone's address is derived via CREATE2 from its
|
|
19
|
+
* implementation address, so a signature for a mainline clone does not verify against
|
|
20
|
+
* a Tron-variant clone.
|
|
21
|
+
* @custom:security-contact bugs@across.to
|
|
22
|
+
*/
|
|
23
|
+
contract CounterfactualDepositSpokePoolTr is CounterfactualDepositSpokePool {
|
|
24
|
+
constructor(
|
|
25
|
+
address _spokePool,
|
|
26
|
+
address _signer,
|
|
27
|
+
address _wrappedNativeToken
|
|
28
|
+
) CounterfactualDepositSpokePool(_spokePool, _signer, _wrappedNativeToken) {} // solhint-disable-line no-empty-blocks
|
|
29
|
+
|
|
30
|
+
/// @dev TRON OVERRIDE: was `IERC20(token).safeTransfer(to, amount)` in the parent.
|
|
31
|
+
/// `TronTransferLib._safeTransferBalanceCheck` uses a balance-delta success check so it
|
|
32
|
+
/// tolerates Tron USDT's non-standard `transfer` return value.
|
|
33
|
+
function _safeTransfer(address token, address to, uint256 amount) internal override {
|
|
34
|
+
TronTransferLib._safeTransferBalanceCheck(token, to, amount);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
// SPDX-License-Identifier: BUSL-1.1
|
|
2
2
|
pragma solidity ^0.8.0;
|
|
3
3
|
|
|
4
|
-
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
5
|
-
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
|
|
6
4
|
import { ICounterfactualImplementation } from "../../interfaces/ICounterfactualImplementation.sol";
|
|
7
5
|
import { NATIVE_ASSET } from "./CounterfactualConstants.sol";
|
|
6
|
+
import { SafeTransferERC20 } from "../../libraries/SafeTransferERC20.sol";
|
|
8
7
|
|
|
9
8
|
/**
|
|
10
9
|
* @notice Withdrawal parameters committed to in the merkle leaf.
|
|
@@ -22,9 +21,7 @@ struct WithdrawParams {
|
|
|
22
21
|
* @dev Called via delegatecall from the CounterfactualDeposit dispatcher. `address(this)` is the clone
|
|
23
22
|
* and `msg.sender` is the original caller.
|
|
24
23
|
*/
|
|
25
|
-
contract WithdrawImplementation is ICounterfactualImplementation {
|
|
26
|
-
using SafeERC20 for IERC20;
|
|
27
|
-
|
|
24
|
+
contract WithdrawImplementation is ICounterfactualImplementation, SafeTransferERC20 {
|
|
28
25
|
event Withdraw(address indexed token, address indexed to, uint256 amount);
|
|
29
26
|
|
|
30
27
|
error Unauthorized();
|
|
@@ -46,7 +43,7 @@ contract WithdrawImplementation is ICounterfactualImplementation {
|
|
|
46
43
|
(bool success, ) = to.call{ value: amount }("");
|
|
47
44
|
if (!success) revert NativeTransferFailed();
|
|
48
45
|
} else {
|
|
49
|
-
|
|
46
|
+
_safeTransfer(token, to, amount);
|
|
50
47
|
}
|
|
51
48
|
|
|
52
49
|
emit Withdraw(token, to, amount);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
import { WithdrawImplementation } from "./WithdrawImplementation.sol";
|
|
5
|
+
import { TronTransferLib } from "../../libraries/TronTransferLib.sol";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @title WithdrawImplementationTron
|
|
9
|
+
* @notice Tron-specific variant of `WithdrawImplementation`. Inherits from the mainline
|
|
10
|
+
* contract and overrides the `_safeTransfer` hook to use a balance-delta
|
|
11
|
+
* success check that tolerates Tron USDT's non-standard `transfer` return value.
|
|
12
|
+
* Native-asset withdrawals are unchanged.
|
|
13
|
+
* @custom:security-contact bugs@across.to
|
|
14
|
+
*/
|
|
15
|
+
contract WithdrawImplementationTron is WithdrawImplementation {
|
|
16
|
+
/// @dev TRON OVERRIDE: was `IERC20(token).safeTransfer(to, amount)` in the parent.
|
|
17
|
+
/// `TronTransferLib._safeTransferBalanceCheck` uses a balance-delta success check so it
|
|
18
|
+
/// tolerates Tron USDT's non-standard `transfer` return value.
|
|
19
|
+
function _safeTransfer(address token, address to, uint256 amount) internal override {
|
|
20
|
+
TronTransferLib._safeTransferBalanceCheck(token, to, amount);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -4,7 +4,7 @@ pragma solidity ^0.8.25;
|
|
|
4
4
|
import { ISP1Verifier } from "@sp1-contracts/src/ISP1Verifier.sol";
|
|
5
5
|
|
|
6
6
|
/// @title SP1 Auto Verifier
|
|
7
|
-
/// @notice A no-op verifier that accepts any proof.
|
|
7
|
+
/// @notice A no-op verifier that accepts any proof.
|
|
8
8
|
contract SP1AutoVerifier is ISP1Verifier {
|
|
9
9
|
// pure is intentionally stricter than the interface's view; Solidity allows this and it's correct for a no-op.
|
|
10
10
|
function verifyProof(bytes32, bytes calldata, bytes calldata) external pure {}
|
|
@@ -11,6 +11,7 @@ import "../upgradeable/MultiCallerUpgradeable.sol";
|
|
|
11
11
|
import "../upgradeable/EIP712CrossChainUpgradeable.sol";
|
|
12
12
|
import "../upgradeable/AddressLibUpgradeable.sol";
|
|
13
13
|
import "../libraries/AddressConverters.sol";
|
|
14
|
+
import { SafeTransferERC20 } from "../libraries/SafeTransferERC20.sol";
|
|
14
15
|
import { IOFT, SendParam, MessagingFee } from "../interfaces/IOFT.sol";
|
|
15
16
|
import { OFTTransportAdapter } from "../libraries/OFTTransportAdapter.sol";
|
|
16
17
|
|
|
@@ -39,9 +40,13 @@ abstract contract SpokePool is
|
|
|
39
40
|
MultiCallerUpgradeable,
|
|
40
41
|
EIP712CrossChainUpgradeable,
|
|
41
42
|
IDestinationSettler,
|
|
42
|
-
OFTTransportAdapter
|
|
43
|
+
OFTTransportAdapter,
|
|
44
|
+
SafeTransferERC20
|
|
43
45
|
{
|
|
44
|
-
using
|
|
46
|
+
// Restrict the `using` attachment to `safeTransferFrom` only. All `safeTransfer` calls must go
|
|
47
|
+
// through the `_safeTransfer` hook (inherited from `SafeTransferERC20`) so chain-specific
|
|
48
|
+
// variants can override transfer semantics in one place.
|
|
49
|
+
using { SafeERC20Upgradeable.safeTransferFrom } for IERC20Upgradeable;
|
|
45
50
|
using AddressLibUpgradeable for address;
|
|
46
51
|
using Bytes32ToAddress for bytes32;
|
|
47
52
|
using AddressToBytes32 for address;
|
|
@@ -1241,7 +1246,7 @@ abstract contract SpokePool is
|
|
|
1241
1246
|
uint256 refund = relayerRefund[l2TokenAddress.toAddress()][msg.sender];
|
|
1242
1247
|
if (refund == 0) revert NoRelayerRefundToClaim();
|
|
1243
1248
|
relayerRefund[l2TokenAddress.toAddress()][msg.sender] = 0;
|
|
1244
|
-
|
|
1249
|
+
_safeTransfer(l2TokenAddress.toAddress(), refundAddress.toAddress(), refund);
|
|
1245
1250
|
|
|
1246
1251
|
emit ClaimedRelayerRefund(l2TokenAddress, refundAddress, refund, msg.sender);
|
|
1247
1252
|
}
|
|
@@ -1429,7 +1434,7 @@ abstract contract SpokePool is
|
|
|
1429
1434
|
// Re-implementation of OZ _callOptionalReturnBool to use private logic. Function executes a transfer and returns a
|
|
1430
1435
|
// bool indicating if the external call was successful, rather than reverting. Original method:
|
|
1431
1436
|
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/28aed34dc5e025e61ea0390c18cac875bfde1a78/contracts/token/ERC20/utils/SafeERC20.sol#L188
|
|
1432
|
-
function _noRevertTransfer(address token, address to, uint256 amount) internal returns (bool) {
|
|
1437
|
+
function _noRevertTransfer(address token, address to, uint256 amount) internal virtual returns (bool) {
|
|
1433
1438
|
bool success;
|
|
1434
1439
|
uint256 returnSize;
|
|
1435
1440
|
uint256 returnValue;
|
|
@@ -1548,7 +1553,7 @@ abstract contract SpokePool is
|
|
|
1548
1553
|
wrappedNativeToken.withdraw(amount);
|
|
1549
1554
|
AddressLibUpgradeable.sendValue(to, amount);
|
|
1550
1555
|
} else {
|
|
1551
|
-
|
|
1556
|
+
_safeTransfer(address(wrappedNativeToken), to, amount);
|
|
1552
1557
|
}
|
|
1553
1558
|
}
|
|
1554
1559
|
|
|
@@ -1662,7 +1667,7 @@ abstract contract SpokePool is
|
|
|
1662
1667
|
} else {
|
|
1663
1668
|
// Note: Similar to note above, send token directly from the contract to the user in the slow relay case.
|
|
1664
1669
|
if (!isSlowFill) IERC20Upgradeable(outputToken).safeTransferFrom(msg.sender, recipientToSend, amountToSend);
|
|
1665
|
-
else
|
|
1670
|
+
else _safeTransfer(outputToken, recipientToSend, amountToSend);
|
|
1666
1671
|
}
|
|
1667
1672
|
|
|
1668
1673
|
bytes memory updatedMessage = relayExecution.updatedMessage;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
import { IERC20 } from "@openzeppelin/contracts-v4/token/ERC20/IERC20.sol";
|
|
5
|
+
|
|
6
|
+
import { Universal_SpokePool } from "./Universal_SpokePool.sol";
|
|
7
|
+
import { ITokenMessenger } from "../external/interfaces/CCTPInterfaces.sol";
|
|
8
|
+
import { TronTransferLib } from "../libraries/TronTransferLib.sol";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @notice Tron-specific SpokePool variant that handles non-standard ERC20 implementations.
|
|
12
|
+
* @dev Tron USDT's `transfer` always returns false on success, which breaks the return-value
|
|
13
|
+
* checks in `SafeERC20.safeTransfer` and `SpokePool._noRevertTransfer`. This variant
|
|
14
|
+
* overrides both base hooks (`_noRevertTransfer` and `_safeTransfer`) to delegate to
|
|
15
|
+
* `TronTransferLib`, which performs a balance-delta success check. `transferFrom` is
|
|
16
|
+
* correct on Tron USDT, so paths using `safeTransferFrom` are unchanged.
|
|
17
|
+
*
|
|
18
|
+
* Assumes Tether's `basisPointsRate` fee-on-transfer mechanism stays at zero. If it
|
|
19
|
+
* is ever activated, balance-delta will report failure on successful transfers and
|
|
20
|
+
* USDT routes on this contract will wedge until disabled operationally.
|
|
21
|
+
* @custom:security-contact bugs@across.to
|
|
22
|
+
*/
|
|
23
|
+
contract Tron_SpokePool is Universal_SpokePool {
|
|
24
|
+
/// @custom:oz-upgrades-unsafe-allow constructor
|
|
25
|
+
constructor(
|
|
26
|
+
uint256 _adminUpdateBufferSeconds,
|
|
27
|
+
address _helios,
|
|
28
|
+
address _hubPoolStore,
|
|
29
|
+
address _wrappedNativeTokenAddress,
|
|
30
|
+
uint32 _depositQuoteTimeBuffer,
|
|
31
|
+
uint32 _fillDeadlineBuffer,
|
|
32
|
+
IERC20 _l2Usdc,
|
|
33
|
+
ITokenMessenger _cctpTokenMessenger,
|
|
34
|
+
uint32 _oftDstEid,
|
|
35
|
+
uint256 _oftFeeCap
|
|
36
|
+
)
|
|
37
|
+
Universal_SpokePool(
|
|
38
|
+
_adminUpdateBufferSeconds,
|
|
39
|
+
_helios,
|
|
40
|
+
_hubPoolStore,
|
|
41
|
+
_wrappedNativeTokenAddress,
|
|
42
|
+
_depositQuoteTimeBuffer,
|
|
43
|
+
_fillDeadlineBuffer,
|
|
44
|
+
_l2Usdc,
|
|
45
|
+
_cctpTokenMessenger,
|
|
46
|
+
_oftDstEid,
|
|
47
|
+
_oftFeeCap
|
|
48
|
+
)
|
|
49
|
+
{} // solhint-disable-line no-empty-blocks
|
|
50
|
+
|
|
51
|
+
/// @dev Replaces base implementation's return-value-based success detection with a
|
|
52
|
+
/// balance-delta check. Required because Tron USDT's `transfer` returns false
|
|
53
|
+
/// even on successful transfers.
|
|
54
|
+
function _noRevertTransfer(address token, address to, uint256 amount) internal override returns (bool) {
|
|
55
|
+
(bool callOk, bool balanceOk) = TronTransferLib._balanceDeltaTransfer(token, to, amount);
|
|
56
|
+
return callOk && balanceOk;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/// @dev Revert-on-failure variant; reverts with `TronTransferCallReverted` or
|
|
60
|
+
/// `TronTransferBalanceMismatch` so callers can distinguish failure modes.
|
|
61
|
+
/// Replaces the base `safeTransfer` call sites (claimRelayerRefund, slow-fill ERC20 path).
|
|
62
|
+
function _safeTransfer(address token, address to, uint256 amount) internal override {
|
|
63
|
+
TronTransferLib._safeTransferBalanceCheck(token, to, amount);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Unlicense
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
import { ERC20 } from "@openzeppelin/contracts-v4/token/ERC20/ERC20.sol";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @title MockTronUSDT
|
|
8
|
+
* @notice Test mock that mirrors the Tron USDT bug: `transfer` moves balances correctly
|
|
9
|
+
* but always returns `false` on success. `transferFrom` and `approve` return
|
|
10
|
+
* `true` correctly per the standard.
|
|
11
|
+
* @dev Set `blacklisted[addr]` to make transfers involving that address revert, simulating
|
|
12
|
+
* Tether's `notBlacklisted` modifier and the "actual failure" scenario.
|
|
13
|
+
*/
|
|
14
|
+
contract MockTronUSDT is ERC20 {
|
|
15
|
+
mapping(address => bool) public blacklisted;
|
|
16
|
+
|
|
17
|
+
constructor() ERC20("Tron USDT", "USDT") {}
|
|
18
|
+
|
|
19
|
+
function mint(address to, uint256 amount) external {
|
|
20
|
+
_mint(to, amount);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function setBlacklisted(address account, bool isBlacklisted) external {
|
|
24
|
+
blacklisted[account] = isBlacklisted;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function decimals() public pure override returns (uint8) {
|
|
28
|
+
return 6;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function transfer(address to, uint256 amount) public override returns (bool) {
|
|
32
|
+
require(!blacklisted[msg.sender] && !blacklisted[to], "blacklisted");
|
|
33
|
+
_transfer(msg.sender, to, amount);
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
pragma solidity ^0.8.0;
|
|
3
3
|
|
|
4
4
|
// Entry point for counterfactual contracts in the tron Foundry profile. These use OZ v4 and must
|
|
5
|
-
// be in a separate file from SP1Helios/
|
|
5
|
+
// be in a separate file from SP1Helios/Tron_SpokePool (OZ v5) to avoid name collisions.
|
|
6
6
|
import "../periphery/counterfactual/AdminWithdrawManager.sol";
|
|
7
7
|
import "../periphery/counterfactual/CounterfactualConstants.sol";
|
|
8
8
|
import "../periphery/counterfactual/CounterfactualDeposit.sol";
|
|
9
9
|
import "../periphery/counterfactual/CounterfactualDepositCCTP.sol";
|
|
10
10
|
import "../periphery/counterfactual/CounterfactualDepositFactoryTron.sol";
|
|
11
11
|
import "../periphery/counterfactual/CounterfactualDepositOFT.sol";
|
|
12
|
-
import "../periphery/counterfactual/
|
|
13
|
-
import "../
|
|
12
|
+
import "../periphery/counterfactual/CounterfactualDepositSpokePoolTr.sol";
|
|
13
|
+
import "../libraries/TronTransferLib.sol";
|
|
14
|
+
import "../periphery/counterfactual/WithdrawImplementationTron.sol";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// SPDX-License-Identifier: BUSL-1.1
|
|
2
2
|
pragma solidity ^0.8.0;
|
|
3
3
|
|
|
4
|
-
// Entry point for SP1Helios and
|
|
4
|
+
// Entry point for SP1Helios and Tron_SpokePool in the tron Foundry profile. These use OZ v5
|
|
5
5
|
// and must be in a separate file from counterfactual contracts (OZ v4) to avoid name collisions.
|
|
6
6
|
import "../sp1-helios/SP1Helios.sol";
|
|
7
7
|
import "../sp1-helios/SP1AutoVerifier.sol";
|
|
8
8
|
import "@openzeppelin/contracts-v4/proxy/ERC1967/ERC1967Proxy.sol";
|
|
9
|
-
import "../spoke-pools/
|
|
9
|
+
import "../spoke-pools/Tron_SpokePool.sol";
|
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
pragma solidity ^0.8.0;
|
|
3
3
|
|
|
4
4
|
// Entry point for SpokePoolPeriphery and SwapProxy in the tron Foundry profile. These use OZ v4
|
|
5
|
-
// and are kept in a separate file from SP1Helios/
|
|
5
|
+
// and are kept in a separate file from SP1Helios/Tron_SpokePool (OZ v5) to avoid name collisions.
|
|
6
6
|
import "../periphery/SpokePoolPeriphery.sol";
|
|
@@ -215,20 +215,15 @@
|
|
|
215
215
|
"block_number": 24021499,
|
|
216
216
|
"transaction_hash": "0x70b3edf99db66aac34338c3686cd708ddfc2b503c2f707f51ced67dc50e5022f"
|
|
217
217
|
},
|
|
218
|
-
"
|
|
219
|
-
"address": "
|
|
220
|
-
"block_number":
|
|
221
|
-
"transaction_hash": "
|
|
218
|
+
"DonationBox_CCTP": {
|
|
219
|
+
"address": "0xc1A2465c0913438A51d0b6339169f8b944f00cD1",
|
|
220
|
+
"block_number": 24451558,
|
|
221
|
+
"transaction_hash": "0x2571a14def62200935cd4c90356b1f1415e6977e60380c7dbdd4b0f4915d12fa"
|
|
222
222
|
},
|
|
223
|
-
"
|
|
224
|
-
"address": "
|
|
225
|
-
"block_number":
|
|
226
|
-
"transaction_hash": "
|
|
227
|
-
},
|
|
228
|
-
"SponsoredCCTPDstPeriphery_CCTP_USDC": {
|
|
229
|
-
"address": "0x545cd9145A7B783328e9f0B9f489c962464F82e0",
|
|
230
|
-
"block_number": 24923038,
|
|
231
|
-
"transaction_hash": "0xd96182e721a33c860d4296d20d86e439bf423026841c8433e3d1ce5fe0321f82"
|
|
223
|
+
"SponsoredCCTPDstPeriphery": {
|
|
224
|
+
"address": "0xDe589398a3FE1DCca80C12053A14811f3E4033f4",
|
|
225
|
+
"block_number": 24451558,
|
|
226
|
+
"transaction_hash": "0x60497293901970b1fc224cc51f134a171e5430ef6f30ff9a9084b7a0c852718a"
|
|
232
227
|
},
|
|
233
228
|
"SponsoredCCTPSrcPeriphery": {
|
|
234
229
|
"address": "0x6769155b16F25D317819eFef011E0A50A48e83c5",
|
|
@@ -854,12 +849,12 @@
|
|
|
854
849
|
"block_number": 31071129,
|
|
855
850
|
"transaction_hash": "0xd78f71ca11de6d28fe02006adf91b55f05efe0ffb1e0b2f51cb450cdf5ade5c0"
|
|
856
851
|
},
|
|
857
|
-
"
|
|
852
|
+
"DonationBox_OFT": {
|
|
858
853
|
"address": "0xf9a0c1C775f1B6e156ad3f1DB784520461DDb19e",
|
|
859
854
|
"block_number": 27226495,
|
|
860
855
|
"transaction_hash": "0x79d57ee428509b8a739a619580ef0154d3618f782d5cab1bfad01c0d542d2e3e"
|
|
861
856
|
},
|
|
862
|
-
"
|
|
857
|
+
"DstOFTHandler": {
|
|
863
858
|
"address": "0x0Ca8316a6fcc15C833A220c40D84550B08339438",
|
|
864
859
|
"block_number": 27226495,
|
|
865
860
|
"transaction_hash": "0x11abc3566704b51ee63255b70eddb4e3f127c7e6c9dad6bdfbf547b684bcaf2c"
|
|
@@ -874,40 +869,20 @@
|
|
|
874
869
|
"block_number": 32382094,
|
|
875
870
|
"transaction_hash": "0x188d49f786ebe99a6dbeb7c845d525064431a1eb615d0bea275d8da8a32953b1"
|
|
876
871
|
},
|
|
877
|
-
"
|
|
878
|
-
"address": "
|
|
879
|
-
"block_number":
|
|
880
|
-
"transaction_hash": "
|
|
881
|
-
},
|
|
882
|
-
"DonationBox_CCTP_USDC": {
|
|
883
|
-
"address": "0xe3D0D1B6d3571EDC9657dB5076AC1Be5f0bBfE60",
|
|
884
|
-
"block_number": 33686717,
|
|
885
|
-
"transaction_hash": "0x38305e431db9c74a6f9fa2f6209c2086cc4b79f10ca3bfae773e4313914eaf28"
|
|
886
|
-
},
|
|
887
|
-
"SponsoredCCTPDstPeriphery_CCTP_USDC": {
|
|
888
|
-
"address": "0x1CFE31eD57c2d2b4CB69c0298A1b586965b882d5",
|
|
889
|
-
"block_number": 33686717,
|
|
890
|
-
"transaction_hash": "0x5730f65ea3507b2daea9a0a143b3da717d7f2194e428993fb04fddfb714eb66e"
|
|
891
|
-
},
|
|
892
|
-
"PermissionedMulticallHandler_CCTP_USDH": {
|
|
893
|
-
"address": "0x9EE4300b6af03392bE493fa769DE33bb07242bfb",
|
|
894
|
-
"block_number": 33792552,
|
|
895
|
-
"transaction_hash": "0x2608d5b2b75ef17422b375b1a2d0e80e7f338b92b55f8fdbccf8ae71ef7710ef"
|
|
872
|
+
"DonationBox_CCTP": {
|
|
873
|
+
"address": "0xEd7422d44045781f4492Fa4b569063e5a1EB185b",
|
|
874
|
+
"block_number": 27222774,
|
|
875
|
+
"transaction_hash": "0x4eab452b9de97795c5d6644791e824359af36006ec521a7d1fb4c4283d247ff3"
|
|
896
876
|
},
|
|
897
|
-
"
|
|
898
|
-
"address": "
|
|
899
|
-
"block_number":
|
|
900
|
-
"transaction_hash": "
|
|
901
|
-
},
|
|
902
|
-
"SponsoredCCTPDstPeriphery_CCTP_USDH": {
|
|
903
|
-
"address": "0x74dfB6Ab65419Fd2022614Fa8BA45e9f50a3aE59",
|
|
904
|
-
"block_number": 33792552,
|
|
905
|
-
"transaction_hash": "0xb6d72530b3ca9ed94868b38c5477c83d69d575a7fe175e4c6cb649aeb9724acd"
|
|
877
|
+
"SponsoredCCTPDstPeriphery": {
|
|
878
|
+
"address": "0x478D451e101bE484880a14cf3cCC293CD48E6140",
|
|
879
|
+
"block_number": 27222774,
|
|
880
|
+
"transaction_hash": "0x2b293a55b216b63afc96c148a0043b7522c4f6a847b9bc73112d03da3f1d2c6e"
|
|
906
881
|
},
|
|
907
882
|
"SponsoredCCTPSrcPeriphery": {
|
|
908
|
-
"address": "
|
|
909
|
-
"block_number":
|
|
910
|
-
"transaction_hash": "
|
|
883
|
+
"address": "0xc611D7c33d1C7915F13ef35f488EAee9D9DC3555",
|
|
884
|
+
"block_number": 27219602,
|
|
885
|
+
"transaction_hash": "0x13b2a5eee6960ab615fe83eaac7203a16878d039fa4a91cb9e1dfafc1bc56298"
|
|
911
886
|
},
|
|
912
887
|
"TransferProxy": {
|
|
913
888
|
"address": "0x8b2C0BFaBD6DaD8cc700dde3F168D3c81CF0eEfF",
|
|
@@ -1217,20 +1192,15 @@
|
|
|
1217
1192
|
"block_number": 43894633,
|
|
1218
1193
|
"transaction_hash": "0x28b429aae286cfb5f09ce924514384b64203a62def3fbb61296a93e1bb3636eb"
|
|
1219
1194
|
},
|
|
1220
|
-
"
|
|
1221
|
-
"address": "
|
|
1222
|
-
"block_number":
|
|
1223
|
-
"transaction_hash": "
|
|
1224
|
-
},
|
|
1225
|
-
"DonationBox_CCTP_USDC": {
|
|
1226
|
-
"address": "0x3ff139d8d5519555aA13b0eBd357B0Ba810f06Df",
|
|
1227
|
-
"block_number": 44959758,
|
|
1228
|
-
"transaction_hash": "0x019b8a736e60768ec4410e4e38c8ae4385e23e72c0cdcc9f305269d1208948c5"
|
|
1195
|
+
"DonationBox_CCTP": {
|
|
1196
|
+
"address": "0xC1d6B848553602BED3524B05B7EB68c20899d861",
|
|
1197
|
+
"block_number": 42941026,
|
|
1198
|
+
"transaction_hash": "0xe8250326847544f47a63a3b799e07e127d21dc62a1901722293ef1335bee17e4"
|
|
1229
1199
|
},
|
|
1230
|
-
"
|
|
1231
|
-
"address": "
|
|
1232
|
-
"block_number":
|
|
1233
|
-
"transaction_hash": "
|
|
1200
|
+
"SponsoredCCTPDstPeriphery": {
|
|
1201
|
+
"address": "0xd9DC78B969E9Efb1e54B625c33A21Aaf2509e6a1",
|
|
1202
|
+
"block_number": 42941286,
|
|
1203
|
+
"transaction_hash": "0x75e0619a67afe82f14b279e9b1896882a0b64513161f4d49cc80fd771e019df6"
|
|
1234
1204
|
},
|
|
1235
1205
|
"SponsoredCCTPSrcPeriphery": {
|
|
1236
1206
|
"address": "0xa30968D3468316D957B9115EAad3C1c8E450116d",
|
|
@@ -1890,10 +1860,10 @@
|
|
|
1890
1860
|
"block_number": 81269910,
|
|
1891
1861
|
"transaction_hash": "ac7736e4912d3bd8e02b9dc26bd0ba6c0486b488b091141a8dde7f0c96be13f5"
|
|
1892
1862
|
},
|
|
1893
|
-
"
|
|
1894
|
-
"address": "
|
|
1895
|
-
"block_number":
|
|
1896
|
-
"transaction_hash": "
|
|
1863
|
+
"CounterfactualDepositSpokePoolTr": {
|
|
1864
|
+
"address": "TF3BzhGswEw4kEWnR5dzjCsZEj4cVzVtsG",
|
|
1865
|
+
"block_number": 82681402,
|
|
1866
|
+
"transaction_hash": "7c4a10b23d583e9290d43a3b2b8dca02cccf47b53b2f5932e6fa92ab72b6ba47"
|
|
1897
1867
|
},
|
|
1898
1868
|
"SP1AutoVerifier": {
|
|
1899
1869
|
"address": "TUsGvWXwp8fhFfJD2Qj3qGUWUFqH4sjm84",
|
|
@@ -1901,24 +1871,24 @@
|
|
|
1901
1871
|
"transaction_hash": "6bb786350fb65c85df414085b65caa22e5de47d59a241ec4b213aae2b41a9738"
|
|
1902
1872
|
},
|
|
1903
1873
|
"SP1Helios": {
|
|
1904
|
-
"address": "
|
|
1905
|
-
"block_number":
|
|
1906
|
-
"transaction_hash": "
|
|
1874
|
+
"address": "TBQff32XdcRpknUY6iJVz2GkQe4aeB9eSm",
|
|
1875
|
+
"block_number": 82679886,
|
|
1876
|
+
"transaction_hash": "78ee3e484f44da394b990adcd3b43d422a343246ab7c7141b3385ee3aeac2f71"
|
|
1907
1877
|
},
|
|
1908
1878
|
"SpokePool": {
|
|
1909
|
-
"address": "
|
|
1910
|
-
"block_number":
|
|
1911
|
-
"transaction_hash": "
|
|
1879
|
+
"address": "TTbCVPfUZmPhrB9sYC8GKgGBQQEdZovkmS",
|
|
1880
|
+
"block_number": 82680434,
|
|
1881
|
+
"transaction_hash": "74051a48b3f5f7b3bae081adab862e63689b93ee4e221473221f2a4206f5216c"
|
|
1912
1882
|
},
|
|
1913
1883
|
"SpokePoolPeriphery": {
|
|
1914
1884
|
"address": "TN88jHbhTpRcKwS6f7fNmXFbGbeqJR1trZ",
|
|
1915
1885
|
"block_number": 81812685,
|
|
1916
1886
|
"transaction_hash": "9a708fb56c6b0bba4e87599f8b1309b479f144badc7a2130d4cd3554836e4481"
|
|
1917
1887
|
},
|
|
1918
|
-
"
|
|
1919
|
-
"address": "
|
|
1920
|
-
"block_number":
|
|
1921
|
-
"transaction_hash": "
|
|
1888
|
+
"WithdrawImplementationTron": {
|
|
1889
|
+
"address": "THPA5L2jxGE84FHMieds212WH3sRX5Hi9t",
|
|
1890
|
+
"block_number": 82681537,
|
|
1891
|
+
"transaction_hash": "5afe38b1baa3538f6692da873b1480b99dc30af81400948daf38fce8ac336d1d"
|
|
1922
1892
|
}
|
|
1923
1893
|
}
|
|
1924
1894
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"abi":[{"type":"function","name":"handleV3AcrossMessage","inputs":[{"name":"tokenSent","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"relayer","type":"address","internalType":"address"},{"name":"message","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"}],"bytecode":"
|
|
1
|
+
{"abi":[{"type":"function","name":"handleV3AcrossMessage","inputs":[{"name":"tokenSent","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"relayer","type":"address","internalType":"address"},{"name":"message","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"}],"bytecode":"0x60808060405234601557610154908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c633a5be8cb14610025575f80fd5b346100c05760803660031901126100c05761003e6100d8565b506100476100fb565b5060643567ffffffffffffffff81116100c057366023820112156100c057806004013567ffffffffffffffff81116100c457601f8101601f19908116603f0116830167ffffffffffffffff8111848210176100c45760405280835236602482840101116100c0575f928160246020940184830137010152005b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100c057565b6044359073ffffffffffffffffffffffffffffffffffffffff821682036100c05756fea2646970667358221220ef8049b741ca8fdac486ace45efd7ddfebc0ae9d8ebd87ed9ddd5035543ecd1464736f6c634300081e0033"}
|