@bananapus/suckers-v6 0.0.1

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.
Files changed (149) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +422 -0
  3. package/SECURITY.md +55 -0
  4. package/SKILLS.md +163 -0
  5. package/deployments/nana-suckers-v5/arbitrum/JBArbitrumSucker.json +1425 -0
  6. package/deployments/nana-suckers-v5/arbitrum/JBArbitrumSuckerDeployer.json +391 -0
  7. package/deployments/nana-suckers-v5/arbitrum/JBCCIPSucker.json +1479 -0
  8. package/deployments/nana-suckers-v5/arbitrum/JBCCIPSuckerDeployer.json +433 -0
  9. package/deployments/nana-suckers-v5/arbitrum/JBCCIPSuckerDeployer_1.json +433 -0
  10. package/deployments/nana-suckers-v5/arbitrum/JBCCIPSuckerDeployer_2.json +433 -0
  11. package/deployments/nana-suckers-v5/arbitrum/JBCCIPSucker_1.json +1479 -0
  12. package/deployments/nana-suckers-v5/arbitrum/JBCCIPSucker_2.json +1479 -0
  13. package/deployments/nana-suckers-v5/arbitrum/JBSuckerRegistry.json +690 -0
  14. package/deployments/nana-suckers-v5/arbitrum_sepolia/JBArbitrumSucker.json +1425 -0
  15. package/deployments/nana-suckers-v5/arbitrum_sepolia/JBArbitrumSuckerDeployer.json +391 -0
  16. package/deployments/nana-suckers-v5/arbitrum_sepolia/JBCCIPSucker.json +1479 -0
  17. package/deployments/nana-suckers-v5/arbitrum_sepolia/JBCCIPSuckerDeployer.json +433 -0
  18. package/deployments/nana-suckers-v5/arbitrum_sepolia/JBCCIPSuckerDeployer_1.json +433 -0
  19. package/deployments/nana-suckers-v5/arbitrum_sepolia/JBCCIPSuckerDeployer_2.json +433 -0
  20. package/deployments/nana-suckers-v5/arbitrum_sepolia/JBCCIPSucker_1.json +1479 -0
  21. package/deployments/nana-suckers-v5/arbitrum_sepolia/JBCCIPSucker_2.json +1479 -0
  22. package/deployments/nana-suckers-v5/arbitrum_sepolia/JBSuckerRegistry.json +690 -0
  23. package/deployments/nana-suckers-v5/base/JBBaseSucker.json +1389 -0
  24. package/deployments/nana-suckers-v5/base/JBBaseSuckerDeployer.json +376 -0
  25. package/deployments/nana-suckers-v5/base/JBCCIPSucker.json +1483 -0
  26. package/deployments/nana-suckers-v5/base/JBCCIPSuckerDeployer.json +436 -0
  27. package/deployments/nana-suckers-v5/base/JBCCIPSuckerDeployer_1.json +436 -0
  28. package/deployments/nana-suckers-v5/base/JBCCIPSuckerDeployer_2.json +436 -0
  29. package/deployments/nana-suckers-v5/base/JBCCIPSucker_1.json +1483 -0
  30. package/deployments/nana-suckers-v5/base/JBCCIPSucker_2.json +1483 -0
  31. package/deployments/nana-suckers-v5/base/JBSuckerRegistry.json +694 -0
  32. package/deployments/nana-suckers-v5/base_sepolia/JBBaseSucker.json +1389 -0
  33. package/deployments/nana-suckers-v5/base_sepolia/JBBaseSuckerDeployer.json +376 -0
  34. package/deployments/nana-suckers-v5/base_sepolia/JBCCIPSucker.json +1483 -0
  35. package/deployments/nana-suckers-v5/base_sepolia/JBCCIPSuckerDeployer.json +436 -0
  36. package/deployments/nana-suckers-v5/base_sepolia/JBCCIPSuckerDeployer_1.json +436 -0
  37. package/deployments/nana-suckers-v5/base_sepolia/JBCCIPSuckerDeployer_2.json +436 -0
  38. package/deployments/nana-suckers-v5/base_sepolia/JBCCIPSucker_1.json +1483 -0
  39. package/deployments/nana-suckers-v5/base_sepolia/JBCCIPSucker_2.json +1483 -0
  40. package/deployments/nana-suckers-v5/base_sepolia/JBSuckerRegistry.json +694 -0
  41. package/deployments/nana-suckers-v5/ethereum/JBArbitrumSucker.json +1429 -0
  42. package/deployments/nana-suckers-v5/ethereum/JBArbitrumSuckerDeployer.json +394 -0
  43. package/deployments/nana-suckers-v5/ethereum/JBBaseSucker.json +1389 -0
  44. package/deployments/nana-suckers-v5/ethereum/JBBaseSuckerDeployer.json +376 -0
  45. package/deployments/nana-suckers-v5/ethereum/JBCCIPSucker.json +1483 -0
  46. package/deployments/nana-suckers-v5/ethereum/JBCCIPSuckerDeployer.json +436 -0
  47. package/deployments/nana-suckers-v5/ethereum/JBCCIPSuckerDeployer_1.json +436 -0
  48. package/deployments/nana-suckers-v5/ethereum/JBCCIPSuckerDeployer_2.json +436 -0
  49. package/deployments/nana-suckers-v5/ethereum/JBCCIPSucker_1.json +1483 -0
  50. package/deployments/nana-suckers-v5/ethereum/JBCCIPSucker_2.json +1483 -0
  51. package/deployments/nana-suckers-v5/ethereum/JBOptimismSucker.json +1389 -0
  52. package/deployments/nana-suckers-v5/ethereum/JBOptimismSuckerDeployer.json +376 -0
  53. package/deployments/nana-suckers-v5/ethereum/JBSuckerRegistry.json +694 -0
  54. package/deployments/nana-suckers-v5/optimism/JBCCIPSucker.json +1479 -0
  55. package/deployments/nana-suckers-v5/optimism/JBCCIPSuckerDeployer.json +433 -0
  56. package/deployments/nana-suckers-v5/optimism/JBCCIPSuckerDeployer_1.json +433 -0
  57. package/deployments/nana-suckers-v5/optimism/JBCCIPSuckerDeployer_2.json +433 -0
  58. package/deployments/nana-suckers-v5/optimism/JBCCIPSucker_1.json +1479 -0
  59. package/deployments/nana-suckers-v5/optimism/JBCCIPSucker_2.json +1479 -0
  60. package/deployments/nana-suckers-v5/optimism/JBOptimismSucker.json +1385 -0
  61. package/deployments/nana-suckers-v5/optimism/JBOptimismSuckerDeployer.json +373 -0
  62. package/deployments/nana-suckers-v5/optimism/JBSuckerRegistry.json +690 -0
  63. package/deployments/nana-suckers-v5/optimism_sepolia/JBCCIPSucker.json +1483 -0
  64. package/deployments/nana-suckers-v5/optimism_sepolia/JBCCIPSuckerDeployer.json +436 -0
  65. package/deployments/nana-suckers-v5/optimism_sepolia/JBCCIPSuckerDeployer_1.json +436 -0
  66. package/deployments/nana-suckers-v5/optimism_sepolia/JBCCIPSuckerDeployer_2.json +436 -0
  67. package/deployments/nana-suckers-v5/optimism_sepolia/JBCCIPSucker_1.json +1483 -0
  68. package/deployments/nana-suckers-v5/optimism_sepolia/JBCCIPSucker_2.json +1483 -0
  69. package/deployments/nana-suckers-v5/optimism_sepolia/JBOptimismSucker.json +1389 -0
  70. package/deployments/nana-suckers-v5/optimism_sepolia/JBOptimismSuckerDeployer.json +376 -0
  71. package/deployments/nana-suckers-v5/optimism_sepolia/JBSuckerRegistry.json +694 -0
  72. package/deployments/nana-suckers-v5/sepolia/JBArbitrumSucker.json +1429 -0
  73. package/deployments/nana-suckers-v5/sepolia/JBArbitrumSuckerDeployer.json +394 -0
  74. package/deployments/nana-suckers-v5/sepolia/JBBaseSucker.json +1389 -0
  75. package/deployments/nana-suckers-v5/sepolia/JBBaseSuckerDeployer.json +376 -0
  76. package/deployments/nana-suckers-v5/sepolia/JBCCIPSucker.json +1483 -0
  77. package/deployments/nana-suckers-v5/sepolia/JBCCIPSuckerDeployer.json +436 -0
  78. package/deployments/nana-suckers-v5/sepolia/JBCCIPSuckerDeployer_1.json +436 -0
  79. package/deployments/nana-suckers-v5/sepolia/JBCCIPSuckerDeployer_2.json +436 -0
  80. package/deployments/nana-suckers-v5/sepolia/JBCCIPSucker_1.json +1483 -0
  81. package/deployments/nana-suckers-v5/sepolia/JBCCIPSucker_2.json +1483 -0
  82. package/deployments/nana-suckers-v5/sepolia/JBOptimismSucker.json +1389 -0
  83. package/deployments/nana-suckers-v5/sepolia/JBOptimismSuckerDeployer.json +376 -0
  84. package/deployments/nana-suckers-v5/sepolia/JBSuckerRegistry.json +694 -0
  85. package/foundry.lock +11 -0
  86. package/foundry.toml +22 -0
  87. package/package.json +33 -0
  88. package/remappings.txt +1 -0
  89. package/script/Deploy.s.sol +506 -0
  90. package/script/helpers/SuckerDeploymentLib.sol +97 -0
  91. package/slither-ci.config.json +10 -0
  92. package/sphinx.lock +476 -0
  93. package/src/JBArbitrumSucker.sol +311 -0
  94. package/src/JBBaseSucker.sol +41 -0
  95. package/src/JBCCIPSucker.sol +303 -0
  96. package/src/JBOptimismSucker.sol +143 -0
  97. package/src/JBSucker.sol +1159 -0
  98. package/src/JBSuckerRegistry.sol +262 -0
  99. package/src/deployers/JBArbitrumSuckerDeployer.sol +86 -0
  100. package/src/deployers/JBBaseSuckerDeployer.sol +26 -0
  101. package/src/deployers/JBCCIPSuckerDeployer.sol +88 -0
  102. package/src/deployers/JBOptimismSuckerDeployer.sol +82 -0
  103. package/src/deployers/JBSuckerDeployer.sol +147 -0
  104. package/src/enums/JBAddToBalanceMode.sol +11 -0
  105. package/src/enums/JBLayer.sol +8 -0
  106. package/src/enums/JBSuckerState.sol +14 -0
  107. package/src/interfaces/IArbGatewayRouter.sol +11 -0
  108. package/src/interfaces/IArbL1GatewayRouter.sol +17 -0
  109. package/src/interfaces/IArbL2GatewayRouter.sol +14 -0
  110. package/src/interfaces/ICCIPRouter.sol +11 -0
  111. package/src/interfaces/IJBArbitrumSucker.sol +13 -0
  112. package/src/interfaces/IJBArbitrumSuckerDeployer.sol +12 -0
  113. package/src/interfaces/IJBCCIPSuckerDeployer.sol +15 -0
  114. package/src/interfaces/IJBOpSuckerDeployer.sol +11 -0
  115. package/src/interfaces/IJBOptimismSucker.sol +10 -0
  116. package/src/interfaces/IJBSucker.sol +144 -0
  117. package/src/interfaces/IJBSuckerDeployer.sol +40 -0
  118. package/src/interfaces/IJBSuckerExtended.sol +22 -0
  119. package/src/interfaces/IJBSuckerRegistry.sol +75 -0
  120. package/src/interfaces/IOPMessenger.sol +18 -0
  121. package/src/interfaces/IOPStandardBridge.sol +29 -0
  122. package/src/interfaces/IWrappedNativeToken.sol +13 -0
  123. package/src/libraries/ARBAddresses.sol +17 -0
  124. package/src/libraries/ARBChains.sol +11 -0
  125. package/src/libraries/CCIPHelper.sol +136 -0
  126. package/src/structs/JBClaim.sol +13 -0
  127. package/src/structs/JBInboxTreeRoot.sol +12 -0
  128. package/src/structs/JBLeaf.sol +14 -0
  129. package/src/structs/JBMessageRoot.sol +16 -0
  130. package/src/structs/JBOutboxTree.sol +18 -0
  131. package/src/structs/JBRemoteToken.sol +17 -0
  132. package/src/structs/JBSuckerDeployerConfig.sol +12 -0
  133. package/src/structs/JBSuckersPair.sol +11 -0
  134. package/src/structs/JBTokenMapping.sol +13 -0
  135. package/src/utils/MerkleLib.sol +1020 -0
  136. package/test/Fork.t.sol +514 -0
  137. package/test/InteropCompat.t.sol +676 -0
  138. package/test/SuckerAttacks.t.sol +509 -0
  139. package/test/SuckerDeepAttacks.t.sol +1563 -0
  140. package/test/mocks/ERC20Mock.sol +36 -0
  141. package/test/mocks/MockMessenger.sol +42 -0
  142. package/test/unit/arb.t.sol +28 -0
  143. package/test/unit/ccip_native_interop.t.sol +719 -0
  144. package/test/unit/ccip_refund.t.sol +234 -0
  145. package/test/unit/deployer.t.sol +475 -0
  146. package/test/unit/emergency.t.sol +305 -0
  147. package/test/unit/merkle.t.sol +212 -0
  148. package/test/unit/multi_chain_evolution.t.sol +622 -0
  149. package/test/unit/registry.t.sol +26 -0
@@ -0,0 +1,17 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @notice Global constants used across Juicebox contracts.
5
+ library ARBAddresses {
6
+ /// @notice The respective Inbox used by L1 or Testnet L1
7
+ address public constant L1_ETH_INBOX = 0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f;
8
+ address public constant L1_SEP_INBOX = 0xaAe29B0366299461418F5324a79Afc425BE5ae21;
9
+
10
+ /// @notice The gateway router used to bridge tokens between the local and remote chain.
11
+ address public constant L1_GATEWAY_ROUTER = 0x72Ce9c846789fdB6fC1f34aC4AD25Dd9ef7031ef;
12
+ address public constant L2_GATEWAY_ROUTER = 0x5288c571Fd7aD117beA99bF60FE0846C4E84F933;
13
+
14
+ /// @notice The testnet gateway routers used for bridging tokens.
15
+ address public constant L1_SEP_GATEWAY_ROUTER = 0xcE18836b233C83325Cc8848CA4487e94C6288264;
16
+ address public constant L2_SEP_GATEWAY_ROUTER = 0x9fDD1C4E4AA24EEc1d913FABea925594a20d43C7;
17
+ }
@@ -0,0 +1,11 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @notice Global constants used across Juicebox contracts.
5
+ library ARBChains {
6
+ /// @notice Arbitrum relevant chains and their respective ids.
7
+ uint256 public constant ETH_CHAINID = 1;
8
+ uint256 public constant ETH_SEP_CHAINID = 11_155_111;
9
+ uint256 public constant ARB_CHAINID = 42_161;
10
+ uint256 public constant ARB_SEP_CHAINID = 421_614;
11
+ }
@@ -0,0 +1,136 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ /// @notice CCIP chain-specific constants used across Juicebox sucker contracts.
5
+ library CCIPHelper {
6
+ error CCIPHelper_UnsupportedChain(uint256 chainId);
7
+ /// @notice The respective CCIP router used by the chain
8
+ address public constant ETH_ROUTER = 0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D;
9
+ address public constant ETH_SEP_ROUTER = 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59;
10
+ address public constant OP_ROUTER = 0x3206695CaE29952f4b0c22a169725a865bc8Ce0f;
11
+ address public constant OP_SEP_ROUTER = 0x114A20A10b43D4115e5aeef7345a1A71d2a60C57;
12
+ address public constant ARB_ROUTER = 0x141fa059441E0ca23ce184B6A78bafD2A517DdE8;
13
+ address public constant ARB_SEP_ROUTER = 0x2a9C5afB0d0e4BAb2BCdaE109EC4b0c4Be15a165;
14
+ address public constant POLY_ROUTER = 0x849c5ED5a80F5B408Dd4969b78c2C8fdf0565Bfe;
15
+ address public constant AVA_ROUTER = 0xF4c7E640EdA248ef95972845a62bdC74237805dB;
16
+ address public constant BNB_ROUTER = 0x34B03Cb9086d7D758AC55af71584F81A598759FE;
17
+ address public constant BASE_ROUTER = 0x881e3A65B4d4a04dD529061dd0071cf975F58bCD;
18
+ address public constant BASE_SEP_ROUTER = 0xD3b06cEbF099CE7DA4AcCf578aaebFDBd6e88a93;
19
+
20
+ /// @notice The respective chain ids per network
21
+ uint256 public constant ETH_ID = 1;
22
+ uint256 public constant ETH_SEP_ID = 11_155_111;
23
+ uint256 public constant OP_ID = 10;
24
+ uint256 public constant OP_SEP_ID = 11_155_420;
25
+ uint256 public constant ARB_ID = 42_161;
26
+ uint256 public constant ARB_SEP_ID = 421_614;
27
+ uint256 public constant POLY_ID = 137;
28
+ uint256 public constant AVA_ID = 43_114;
29
+ uint256 public constant BNB_ID = 56;
30
+ uint256 public constant BASE_ID = 8453;
31
+ uint256 public constant BASE_SEP_ID = 84_532;
32
+
33
+ /// @notice The chain selector per network
34
+ uint64 public constant ETH_SEL = 5_009_297_550_715_157_269;
35
+ uint64 public constant ETH_SEP_SEL = 16_015_286_601_757_825_753;
36
+ uint64 public constant OP_SEL = 3_734_403_246_176_062_136;
37
+ uint64 public constant OP_SEP_SEL = 5_224_473_277_236_331_295;
38
+ uint64 public constant ARB_SEL = 4_949_039_107_694_359_620;
39
+ uint64 public constant ARB_SEP_SEL = 3_478_487_238_524_512_106;
40
+ uint64 public constant POLY_SEL = 4_051_577_828_743_386_545;
41
+ uint64 public constant AVA_SEL = 6_433_500_567_565_415_381;
42
+ uint64 public constant BNB_SEL = 11_344_663_589_394_136_015;
43
+ uint64 public constant BASE_SEL = 15_971_525_489_660_198_786;
44
+ uint64 public constant BASE_SEP_SEL = 10_344_971_235_874_465_080;
45
+
46
+ /// @notice The WETH address of each chain
47
+ address public constant ETH_WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
48
+ address public constant ETH_SEP_WETH = 0x097D90c9d3E0B50Ca60e1ae45F6A81010f9FB534;
49
+ address public constant OP_WETH = 0x4200000000000000000000000000000000000006;
50
+ address public constant ARB_WETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1;
51
+ address public constant ARB_SEP_WETH = 0xE591bf0A0CF924A0674d7792db046B23CEbF5f34;
52
+ address public constant POLY_WETH = 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270;
53
+ address public constant AVA_WETH = 0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7;
54
+ address public constant BNB_WETH = 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c;
55
+ address public constant BASE_WETH = 0x4200000000000000000000000000000000000006;
56
+
57
+ function routerOfChain(uint256 _chainId) internal pure returns (address router) {
58
+ if (_chainId == ETH_ID) {
59
+ return ETH_ROUTER;
60
+ } else if (_chainId == OP_ID) {
61
+ return OP_ROUTER;
62
+ } else if (_chainId == ARB_ID) {
63
+ return ARB_ROUTER;
64
+ } else if (_chainId == POLY_ID) {
65
+ return POLY_ROUTER;
66
+ } else if (_chainId == AVA_ID) {
67
+ return AVA_ROUTER;
68
+ } else if (_chainId == BNB_ID) {
69
+ return BNB_ROUTER;
70
+ } else if (_chainId == BASE_ID) {
71
+ return BASE_ROUTER;
72
+ } else if (_chainId == ETH_SEP_ID) {
73
+ return ETH_SEP_ROUTER;
74
+ } else if (_chainId == ARB_SEP_ID) {
75
+ return ARB_SEP_ROUTER;
76
+ } else if (_chainId == OP_SEP_ID) {
77
+ return OP_SEP_ROUTER;
78
+ } else if (_chainId == BASE_SEP_ID) {
79
+ return BASE_SEP_ROUTER;
80
+ } else {
81
+ revert CCIPHelper_UnsupportedChain(_chainId);
82
+ }
83
+ }
84
+
85
+ function selectorOfChain(uint256 _chainId) internal pure returns (uint64 selectorId) {
86
+ if (_chainId == ETH_ID) {
87
+ return ETH_SEL;
88
+ } else if (_chainId == OP_ID) {
89
+ return OP_SEL;
90
+ } else if (_chainId == ARB_ID) {
91
+ return ARB_SEL;
92
+ } else if (_chainId == POLY_ID) {
93
+ return POLY_SEL;
94
+ } else if (_chainId == AVA_ID) {
95
+ return AVA_SEL;
96
+ } else if (_chainId == BNB_ID) {
97
+ return BNB_SEL;
98
+ } else if (_chainId == BASE_ID) {
99
+ return BASE_SEL;
100
+ } else if (_chainId == ETH_SEP_ID) {
101
+ return ETH_SEP_SEL;
102
+ } else if (_chainId == ARB_SEP_ID) {
103
+ return ARB_SEP_SEL;
104
+ } else if (_chainId == OP_SEP_ID) {
105
+ return OP_SEP_SEL;
106
+ } else if (_chainId == BASE_SEP_ID) {
107
+ return BASE_SEP_SEL;
108
+ } else {
109
+ revert CCIPHelper_UnsupportedChain(_chainId);
110
+ }
111
+ }
112
+
113
+ function wethOfChain(uint256 _chainId) public pure returns (address weth) {
114
+ if (_chainId == ETH_ID) {
115
+ return ETH_WETH;
116
+ } else if (_chainId == OP_ID) {
117
+ return OP_WETH;
118
+ } else if (_chainId == ARB_ID) {
119
+ return ARB_WETH;
120
+ } else if (_chainId == POLY_ID) {
121
+ return POLY_WETH;
122
+ } else if (_chainId == AVA_ID) {
123
+ return AVA_WETH;
124
+ } else if (_chainId == BNB_ID) {
125
+ return BNB_WETH;
126
+ } else if (_chainId == BASE_ID) {
127
+ return BASE_WETH;
128
+ } else if (_chainId == ETH_SEP_ID) {
129
+ return ETH_SEP_WETH;
130
+ } else if (_chainId == ARB_SEP_ID) {
131
+ return ARB_SEP_WETH;
132
+ } else {
133
+ revert CCIPHelper_UnsupportedChain(_chainId);
134
+ }
135
+ }
136
+ }
@@ -0,0 +1,13 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ import {JBLeaf} from "./JBLeaf.sol";
5
+
6
+ /// @custom:member token The token to claim.
7
+ /// @custom:member leaf The leaf to claim from.
8
+ /// @custom:member proof The proof to claim with. Must be of length `JBSucker._TREE_DEPTH`.
9
+ struct JBClaim {
10
+ address token;
11
+ JBLeaf leaf;
12
+ bytes32[32] proof;
13
+ }
@@ -0,0 +1,12 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @notice The root of an inbox tree for a given token in a `JBSucker`.
5
+ /// @dev Inbox trees are used to receive from the remote chain to the local chain. Tokens can be `claim`ed from the
6
+ /// inbox tree.
7
+ /// @custom:member nonce Tracks the nonce of the tree. The nonce cannot decrease.
8
+ /// @custom:member root The root of the tree.
9
+ struct JBInboxTreeRoot {
10
+ uint64 nonce;
11
+ bytes32 root;
12
+ }
@@ -0,0 +1,14 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @notice A leaf in the inbox or outbox tree of a `JBSucker`. Used to `claim` tokens from the inbox tree.
5
+ /// @custom:member index The index of the leaf.
6
+ /// @custom:member beneficiary The beneficiary of the leaf.
7
+ /// @custom:member projectTokenCount The number of project tokens to claim.
8
+ /// @custom:member terminalTokenAmount The amount of terminal tokens to claim.
9
+ struct JBLeaf {
10
+ uint256 index;
11
+ bytes32 beneficiary;
12
+ uint256 projectTokenCount;
13
+ uint256 terminalTokenAmount;
14
+ }
@@ -0,0 +1,16 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ import {JBInboxTreeRoot} from "./JBInboxTreeRoot.sol";
5
+
6
+ /// @notice Information about the remote (inbox) tree's root, passed in a message from the remote chain.
7
+ /// @custom:member version The message format version. Used to reject incompatible messages.
8
+ /// @custom:member token The remote token address (bytes32 for cross-VM compatibility with SVM).
9
+ /// @custom:member amount The amount of tokens being sent.
10
+ /// @custom:member remoteRoot The root of the merkle tree.
11
+ struct JBMessageRoot {
12
+ uint8 version;
13
+ bytes32 token;
14
+ uint256 amount;
15
+ JBInboxTreeRoot remoteRoot;
16
+ }
@@ -0,0 +1,18 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ import {MerkleLib} from "../utils/MerkleLib.sol";
5
+
6
+ /// @notice A merkle tree used to track the outbox for a given token in a `JBSucker`.
7
+ /// @dev The outbox is used to send from the local chain to the remote chain.
8
+ /// @custom:member nonce The nonce of the outbox.
9
+ /// @custom:member balance The balance of the outbox.
10
+ /// @custom:member tree The merkle tree.
11
+ /// @custom:member numberOfClaimsSent the number of claims that have been sent to the peer. Used to determine which
12
+ /// claims have been sent.
13
+ struct JBOutboxTree {
14
+ uint64 nonce;
15
+ uint256 balance;
16
+ MerkleLib.Tree tree;
17
+ uint256 numberOfClaimsSent;
18
+ }
@@ -0,0 +1,17 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @notice A struct that represents a token on the remote chain.
5
+ /// @dev Invariant: If the `emergencyHatch` is true then the `enabled` is always false.
6
+ /// @custom:member enabled Whether the token is enabled.
7
+ /// @custom:member emergencyHatchOpened Whether the emergency hatch is opened.
8
+ /// @custom:member minGas The minimum gas to use when bridging.
9
+ /// @custom:member addr The address of the token on the remote chain.
10
+ /// @custom:member minBridgeAmount The minimum amount to bridge.
11
+ struct JBRemoteToken {
12
+ bool enabled;
13
+ bool emergencyHatch;
14
+ uint32 minGas;
15
+ bytes32 addr;
16
+ uint256 minBridgeAmount;
17
+ }
@@ -0,0 +1,12 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ import {IJBSuckerDeployer} from "../interfaces/IJBSuckerDeployer.sol";
5
+ import {JBTokenMapping} from "./JBTokenMapping.sol";
6
+
7
+ /// @custom:member deployer The deployer to use.
8
+ /// @custom:member mappings The token mappings to use.
9
+ struct JBSuckerDeployerConfig {
10
+ IJBSuckerDeployer deployer;
11
+ JBTokenMapping[] mappings;
12
+ }
@@ -0,0 +1,11 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @custom:member local The local address.
5
+ /// @custom:member remote The remote address.
6
+ /// @custom:member remoteChainId The chain ID of the remote address.
7
+ struct JBSuckersPair {
8
+ address local;
9
+ bytes32 remote;
10
+ uint256 remoteChainId;
11
+ }
@@ -0,0 +1,13 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @custom:member localToken The local token address.
5
+ /// @custom:member minGas The minimum gas amount to bridge.
6
+ /// @custom:member remoteToken The remote token address.
7
+ /// @custom:member minBridgeAmount The minimum bridge amount.
8
+ struct JBTokenMapping {
9
+ address localToken;
10
+ uint32 minGas;
11
+ bytes32 remoteToken;
12
+ uint256 minBridgeAmount;
13
+ }