Skip to content

Commit

Permalink
Merge pull request #166 from Bananapus/types/crunch-structs
Browse files Browse the repository at this point in the history
Types/crunch structs
  • Loading branch information
mejango authored Jul 18, 2024
2 parents 292fadc + 41b49a6 commit 8486c3c
Show file tree
Hide file tree
Showing 77 changed files with 724 additions and 1,013 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
submodules: recursive
- uses: actions/setup-node@v4
with:
node-version: latest
node-version: 22.4.x
- name: Install npm dependencies
run: npm ci --production
- name: Install Foundry
Expand Down
2 changes: 1 addition & 1 deletion lib/sphinx
Submodule sphinx updated 94 files
+4 −1 .circleci/config.yml
+7 −24 .github/workflows/docker-image.yml
+12 −20 README.md
+57 −0 docs/breaking/registration.md
+38 −31 docs/cli-existing-project.md
+19 −15 docs/cli-quickstart.md
+8 −107 ops/ci-builder/Dockerfile
+0 −8 ops/ci-builder/check-changed.sh
+1 −1 package.json
+51 −0 packages/contracts/CHANGELOG.md
+1 −0 packages/contracts/contract-artifacts/sphinx/PermissionlessRelay.sol/PermissionlessRelay.json
+764,220 −0 packages/contracts/contract-artifacts/sphinx/permissionless-relay-build-info.json
+61 −0 packages/contracts/contracts/core/PermissionlessRelay.sol
+10 −11 packages/contracts/contracts/foundry/Sphinx.sol
+62 −8 packages/contracts/contracts/foundry/SphinxConstants.sol
+34 −3 packages/contracts/contracts/foundry/SphinxPluginTypes.sol
+93 −99 packages/contracts/contracts/foundry/SphinxUtils.sol
+2 −7 packages/contracts/package.json
+3 −3 packages/contracts/scripts/write-constants.ts
+30 −0 packages/contracts/sphinx.lock
+151 −14 packages/contracts/src/addresses.ts
+7 −15 packages/contracts/src/contract-info.ts
+4 −3 packages/contracts/src/ifaces.ts
+334 −14 packages/contracts/src/networks.ts
+0 −22 packages/contracts/src/utils.ts
+1 −1 packages/contracts/src/version.ts
+1 −1 packages/contracts/test/ManagedService.t.sol
+9 −15 packages/contracts/test/ScriptConfiguration.t.sol
+7 −13 packages/contracts/test/Sphinx.t.sol
+3 −4 packages/contracts/test/SphinxInitCode.sol
+8 −7 packages/contracts/test/SphinxTestUtils.sol
+5 −51 packages/contracts/test/SphinxUtils.t.sol
+0 −21 packages/contracts/test/issues/CHU572.s.sol
+1 −4 packages/contracts/test/issues/CHU663.s.sol
+0 −23 packages/contracts/test/issues/CHU663/CHU663.s.sol
+38 −0 packages/contracts/test/mocha/address.spec.ts
+0 −35 packages/contracts/test/mocha/utils.spec.ts
+85 −0 packages/core/CHANGELOG.md
+0 −7 packages/core/config/local.ts
+0 −14 packages/core/config/standard.ts
+67 −44 packages/core/hardhat.config.ts
+3 −3 packages/core/package.json
+19 −18 packages/core/src/actions/execute.ts
+3 −9 packages/core/src/actions/types.ts
+6 −7 packages/core/src/artifacts.ts
+8 −5 packages/core/src/config/types.ts
+0 −4 packages/core/src/constants.ts
+11 −1 packages/core/src/etherscan.ts
+2 −174 packages/core/src/languages/solidity/predeploys.ts
+2 −1 packages/core/src/languages/solidity/types.ts
+25 −0 packages/core/src/networks.ts
+18 −0 packages/core/src/types.ts
+60 −96 packages/core/src/utils.ts
+17 −7 packages/core/test/convert.spec.ts
+22 −0 packages/demo/CHANGELOG.md
+5 −5 packages/demo/package.json
+18 −0 packages/demo/sphinx.lock
+2 −2 packages/demo/test/Solc.spec.ts
+22 −16 packages/demo/test/init.spec.ts
+111 −0 packages/plugins/CHANGELOG.md
+1 −5 packages/plugins/contracts/test/script/Cases.s.sol
+0 −4 packages/plugins/contracts/test/script/Empty.s.sol
+1 −5 packages/plugins/contracts/test/script/Large.s.sol
+1 −5 packages/plugins/contracts/test/script/PartiallyEmpty.s.sol
+1 −5 packages/plugins/contracts/test/script/RevertDuringSimulation.s.sol
+3 −15 packages/plugins/contracts/test/script/Simple.s.sol
+1 −4 packages/plugins/contracts/test/script/issues/CHU676.s.sol
+4 −0 packages/plugins/foundry.toml
+7 −7 packages/plugins/package.json
+3 −7 packages/plugins/script/Sample.s.sol
+12 −0 packages/plugins/script/write-version.ts
+18 −0 packages/plugins/sphinx.lock
+0 −4 packages/plugins/src/cli/context.ts
+0 −3 packages/plugins/src/cli/deploy.ts
+11 −20 packages/plugins/src/cli/propose/index.ts
+30 −5 packages/plugins/src/cli/setup.ts
+0 −8 packages/plugins/src/cli/types.ts
+1 −0 packages/plugins/src/cli/version.ts
+1 −4 packages/plugins/src/foundry/decode.ts
+37 −149 packages/plugins/src/foundry/utils/index.ts
+0 −48 packages/plugins/src/hardhat.config.js
+0 −71 packages/plugins/src/hardhat/hardhatRunner.ts
+0 −618 packages/plugins/src/hardhat/simulate.ts
+0 −1 packages/plugins/src/index.ts
+6 −8 packages/plugins/src/sample-project/index.ts
+4 −11 packages/plugins/src/sample-project/sample-contracts.ts
+2 −1 packages/plugins/src/sample-project/sample-foundry-config.ts
+5 −2 packages/plugins/test/mocha/artifacts.spec.ts
+2 −52 packages/plugins/test/mocha/cli/deploy.spec.ts
+12 −335 packages/plugins/test/mocha/cli/propose.spec.ts
+4 −135 packages/plugins/test/mocha/common.ts
+42 −152 packages/plugins/test/mocha/foundry/utils.spec.ts
+0 −11 packages/plugins/test/mocha/mock.ts
+0 −437 packages/plugins/test/mocha/simulate.spec.ts
216 changes: 111 additions & 105 deletions package-lock.json

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@bananapus/core",
"version": "0.0.20",
"version": "0.0.21",
"license": "MIT",
"repository": {
"type": "git",
Expand All @@ -25,6 +25,6 @@
"@uniswap/permit2": "github:Uniswap/permit2"
},
"devDependencies": {
"@sphinx-labs/plugins": "^0.32.2"
"@sphinx-labs/plugins": "^0.33.0"
}
}
147 changes: 86 additions & 61 deletions src/JBController.sol

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions src/JBFundAccessLimits.sol
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,8 @@ contract JBFundAccessLimits is JBControlled, IJBFundAccessLimits {

// The limit amount is in bits 0-231. The currency is in bits 224-255.
payoutLimits[i] = JBCurrencyAmount({
currency: packedPayoutLimitData >> 224,
amount: uint256(uint224(packedPayoutLimitData))
currency: uint32(packedPayoutLimitData >> 224),
amount: uint224(packedPayoutLimitData)
});
}
}
Expand Down Expand Up @@ -185,8 +185,8 @@ contract JBFundAccessLimits is JBControlled, IJBFundAccessLimits {

// The limit is in bits 0-223. The currency is in bits 224-255.
surplusAllowances[i] = JBCurrencyAmount({
currency: packedSurplusAllowanceData >> 224,
amount: uint256(uint224(packedSurplusAllowanceData))
currency: uint32(packedSurplusAllowanceData >> 224),
amount: uint224(packedSurplusAllowanceData)
});
}
}
Expand Down Expand Up @@ -304,7 +304,7 @@ contract JBFundAccessLimits is JBControlled, IJBFundAccessLimits {
// Set the payout limit if there is one.
if (payoutLimit.amount > 0) {
_packedPayoutLimitsDataOf[projectId][rulesetId][fundAccessLimitGroup[i].terminal][fundAccessLimitGroup[i]
.token].push(payoutLimit.amount | (payoutLimit.currency << 224));
.token].push(uint256(payoutLimit.amount) | (uint256(payoutLimit.currency) << 224));
}
}

Expand Down Expand Up @@ -338,7 +338,7 @@ contract JBFundAccessLimits is JBControlled, IJBFundAccessLimits {
// Set the surplus allowance if there is one.
if (surplusAllowance.amount > 0) {
_packedSurplusAllowancesDataOf[projectId][rulesetId][fundAccessLimitGroup[i].terminal][fundAccessLimitGroup[i]
.token].push(surplusAllowance.amount | (surplusAllowance.currency << 224));
.token].push(uint256(surplusAllowance.amount) | (uint256(surplusAllowance.currency) << 224));
}
}

Expand Down
40 changes: 20 additions & 20 deletions src/JBMultiTerminal.sol
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ import {JBFee} from "./structs/JBFee.sol";
import {JBPayHookSpecification} from "./structs/JBPayHookSpecification.sol";
import {JBRedeemHookSpecification} from "./structs/JBRedeemHookSpecification.sol";
import {JBRuleset} from "./structs/JBRuleset.sol";
import {JBSingleAllowanceContext} from "./structs/JBSingleAllowanceContext.sol";
import {JBSingleAllowance} from "./structs/JBSingleAllowance.sol";
import {JBSplit} from "./structs/JBSplit.sol";
import {JBSplitHookContext} from "./structs/JBSplitHookContext.sol";
import {JBTokenAmount} from "./structs/JBTokenAmount.sol";
Expand All @@ -61,6 +61,7 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {

error ACCOUNTING_CONTEXT_ALREADY_SET();
error ADDING_ACCOUNTING_CONTEXT_NOT_ALLOWED();
error FEE_TERMINAL_NOT_FOUND();
error INVALID_ACCOUNTING_CONTEXT_DECIMALS();
error INVALID_ACCOUNTING_CONTEXT_CURRENCY();
error UNDER_MIN_TOKENS_PAID_OUT();
Expand All @@ -69,6 +70,8 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
error NO_MSG_VALUE_ALLOWED();
error OVERFLOW_ALERT();
error PERMIT_ALLOWANCE_NOT_ENOUGH();
error RECIPIENT_PROJECT_TERMINAL_NOT_FOUND();
error SPLIT_HOOK_INVALID();
error TERMINAL_TOKENS_INCOMPATIBLE();
error TOKEN_NOT_ACCEPTED();

Expand Down Expand Up @@ -179,7 +182,6 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
)
external
view
virtual
override
returns (uint256)
{
Expand All @@ -203,7 +205,7 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
/// @dev See {IERC165-supportsInterface}.
/// @param interfaceId The ID of the interface to check for adherence to.
/// @return A flag indicating if the provided interface ID is supported.
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
function supportsInterface(bytes4 interfaceId) public pure override returns (bool) {
return interfaceId == type(IJBMultiTerminal).interfaceId || interfaceId == type(IJBPermissioned).interfaceId
|| interfaceId == type(IJBTerminal).interfaceId || interfaceId == type(IJBRedeemTerminal).interfaceId
|| interfaceId == type(IJBPayoutTerminal).interfaceId || interfaceId == type(IJBPermitTerminal).interfaceId
Expand Down Expand Up @@ -309,7 +311,6 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
)
external
payable
virtual
override
returns (uint256 beneficiaryTokenCount)
{
Expand Down Expand Up @@ -349,7 +350,6 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
)
external
payable
virtual
override
{
// Add to balance.
Expand Down Expand Up @@ -390,7 +390,6 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
bytes calldata metadata
)
external
virtual
override
returns (uint256 reclaimAmount)
{
Expand Down Expand Up @@ -430,7 +429,6 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
uint256 minTokensPaidOut
)
external
virtual
override
returns (uint256 amountPaidOut)
{
Expand Down Expand Up @@ -467,7 +465,6 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
string calldata memo
)
external
virtual
override
returns (uint256 amountPaidOut)
{
Expand Down Expand Up @@ -498,7 +495,6 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
IJBTerminal to
)
external
virtual
override
returns (uint256 balance)
{
Expand Down Expand Up @@ -545,7 +541,7 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
/// @notice Process any fees that are being held for the project.
/// @param projectId The ID of the project to process held fees for.
/// @param token The token to process held fees for.
function processHeldFeesOf(uint256 projectId, address token) external virtual override {
function processHeldFeesOf(uint256 projectId, address token) external override {
_processHeldFeesOf({projectId: projectId, token: token, forced: false});
}

Expand Down Expand Up @@ -652,7 +648,7 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
require(msg.sender == address(this));

if (address(feeTerminal) == address(0)) {
revert("FEE_TERMINAL_NOT_FOUND");
revert FEE_TERMINAL_NOT_FOUND();
}

// Trigger any inherited pre-transfer logic if funds will be transferred.
Expand Down Expand Up @@ -701,7 +697,7 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
if (split.hook != IJBSplitHook(address(0))) {
// Make sure that the address supports the split hook interface.
if (!split.hook.supportsInterface(type(IJBSplitHook).interfaceId)) {
revert("SPLIT_HOOK_INVALID");
revert SPLIT_HOOK_INVALID();
}

// This payout is eligible for a fee since the funds are leaving this contract and the split hook isn't a
Expand Down Expand Up @@ -735,7 +731,7 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
IJBTerminal terminal = DIRECTORY.primaryTerminalOf(split.projectId, token);

// The project must have a terminal to send funds to.
if (terminal == IJBTerminal(address(0))) revert("RECIPIENT_PROJECT_TERMINAL_NOT_FOUND");
if (terminal == IJBTerminal(address(0))) revert RECIPIENT_PROJECT_TERMINAL_NOT_FOUND();

// This payout is eligible for a fee if the funds are leaving this contract and the receiving terminal isn't
// a feelss address.
Expand Down Expand Up @@ -806,7 +802,7 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
}

/// @dev `ERC-2771` specifies the context as being a single address (20 bytes).
function _contextSuffixLength() internal view virtual override(ERC2771Context, Context) returns (uint256) {
function _contextSuffixLength() internal view override(ERC2771Context, Context) returns (uint256) {
return super._contextSuffixLength();
}

Expand Down Expand Up @@ -847,7 +843,7 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
// Check if the metadata contains permit data.
if (exists) {
// Keep a reference to the allowance context parsed from the metadata.
(JBSingleAllowanceContext memory allowance) = abi.decode(parsedMetadata, (JBSingleAllowanceContext));
(JBSingleAllowance memory allowance) = abi.decode(parsedMetadata, (JBSingleAllowance));

// Make sure the permit allowance is enough for this payment. If not we revert early.
if (allowance.amount < amount) {
Expand Down Expand Up @@ -915,7 +911,8 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
JBAccountingContext memory context = _accountingContextForTokenOf[projectId][token];

// Bundle the amount info into a `JBTokenAmount` struct.
tokenAmount = JBTokenAmount(token, amount, context.decimals, context.currency);
tokenAmount =
JBTokenAmount({token: token, decimals: context.decimals, currency: context.currency, value: amount});
}

// Record the payment.
Expand Down Expand Up @@ -1084,9 +1081,12 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
ruleset: ruleset,
redemptionRate: redemptionRate,
beneficiary: beneficiary,
beneficiaryReclaimAmount: JBTokenAmount(
tokenToReclaim, reclaimAmount, accountingContext.decimals, accountingContext.currency
),
beneficiaryReclaimAmount: JBTokenAmount({
token: tokenToReclaim,
decimals: accountingContext.decimals,
currency: accountingContext.currency,
value: reclaimAmount
}),
specifications: hookSpecifications,
metadata: metadata
});
Expand Down Expand Up @@ -1556,7 +1556,7 @@ contract JBMultiTerminal is JBPermissioned, ERC2771Context, IJBMultiTerminal {
JBFee({
amount: amount,
beneficiary: beneficiary,
unlockTimestamp: block.timestamp + _FEE_HOLDING_SECONDS
unlockTimestamp: uint48(block.timestamp + _FEE_HOLDING_SECONDS)
})
);

Expand Down
4 changes: 1 addition & 3 deletions src/JBPermissions.sol
Original file line number Diff line number Diff line change
Expand Up @@ -224,16 +224,14 @@ contract JBPermissions is IJBPermissions {
/// @notice Converts an array of permission IDs to a packed `uint256`.
/// @param permissionIds The IDs of the permissions to pack.
/// @return packed The packed value.
function _packedPermissions(uint256[] calldata permissionIds) internal pure returns (uint256 packed) {
function _packedPermissions(uint8[] calldata permissionIds) internal pure returns (uint256 packed) {
// Keep a reference to the permission being iterated on.
uint256 permissionId;

for (uint256 i; i < permissionIds.length; i++) {
// Set the permission being iterated on.
permissionId = permissionIds[i];

if (permissionId > 255) revert PERMISSION_ID_OUT_OF_BOUNDS();

// Turn on the bit at the ID.
packed |= 1 << permissionId;
}
Expand Down
57 changes: 29 additions & 28 deletions src/JBRulesets.sol
Original file line number Diff line number Diff line change
Expand Up @@ -388,17 +388,17 @@ contract JBRulesets is JBControlled, IJBRulesets {
revert INVALID_DECAY_RATE();
}

// Weight must fit into a uint88.
if (weight > type(uint88).max) revert INVALID_WEIGHT();
// Weight must fit into a uint112.
if (weight > type(uint112).max) revert INVALID_WEIGHT();

// If the start date is not set, set it to be the current timestamp.
if (mustStartAtOrAfter == 0) {
mustStartAtOrAfter = block.timestamp;
}

// Make sure the min start date fits in a uint56, and that the start date of the following ruleset will also fit
// Make sure the min start date fits in a uint48, and that the start date of the following ruleset will also fit
// within the max.
if (mustStartAtOrAfter + duration > type(uint56).max) {
if (mustStartAtOrAfter + duration > type(uint48).max) {
revert INVALID_RULESET_END_TIME();
}

Expand Down Expand Up @@ -478,13 +478,14 @@ contract JBRulesets is JBControlled, IJBRulesets {
uint256 startDistance = start - latestQueuedRuleset.start;

// Calculate the decay multiple.
uint256 decayMultiple;
uint168 decayMultiple;
unchecked {
decayMultiple = startDistance / latestQueuedRuleset.duration;
decayMultiple = uint168(startDistance / latestQueuedRuleset.duration);
}

// Store the new values.
cache.weight = _deriveWeightFrom({projectId: projectId, baseRuleset: latestQueuedRuleset, start: start});
cache.weight =
uint112(_deriveWeightFrom({projectId: projectId, baseRuleset: latestQueuedRuleset, start: start}));
cache.decayMultiple = decayMultiple;
}

Expand Down Expand Up @@ -641,17 +642,17 @@ contract JBRulesets is JBControlled, IJBRulesets {
)
internal
{
// `weight` in bits 0-87.
// `weight` in bits 0-111.
uint256 packed = weight;

// `basedOnId` in bits 88-143.
packed |= basedOnId << 88;
// `basedOnId` in bits 112-159.
packed |= basedOnId << 112;

// `start` in bits 144-199.
packed |= start << 144;
// `start` in bits 160-207.
packed |= start << 160;

// cycle number in bits 200-255.
packed |= rulesetCycleNumber << 200;
// cycle number in bits 208-255.
packed |= rulesetCycleNumber << 208;

// Store the packed value.
_packedIntrinsicPropertiesOf[projectId][rulesetId] = packed;
Expand Down Expand Up @@ -769,12 +770,12 @@ contract JBRulesets is JBControlled, IJBRulesets {
uint256 rulesetCycleNumber = _deriveCycleNumberFrom(baseRuleset, start);

return JBRuleset({
cycleNumber: rulesetCycleNumber,
cycleNumber: uint48(rulesetCycleNumber),
id: baseRuleset.id,
basedOnId: baseRuleset.basedOnId,
start: start,
start: uint48(start),
duration: baseRuleset.duration,
weight: _deriveWeightFrom(projectId, baseRuleset, start),
weight: uint112(_deriveWeightFrom(projectId, baseRuleset, start)),
decayRate: baseRuleset.decayRate,
approvalHook: baseRuleset.approvalHook,
metadata: baseRuleset.metadata
Expand Down Expand Up @@ -952,27 +953,27 @@ contract JBRulesets is JBControlled, IJBRulesets {
// slither-disable-next-line incorrect-equality
if (rulesetId == 0) return ruleset;

ruleset.id = rulesetId;
ruleset.id = uint48(rulesetId);

uint256 packedIntrinsicProperties = _packedIntrinsicPropertiesOf[projectId][rulesetId];

// `weight` in bits 0-87 bits.
ruleset.weight = uint256(uint88(packedIntrinsicProperties));
// `basedOnId` in bits 88-143 bits.
ruleset.basedOnId = uint256(uint56(packedIntrinsicProperties >> 88));
// `start` in bits 144-199 bits.
ruleset.start = uint256(uint56(packedIntrinsicProperties >> 144));
// `cycleNumber` in bits 200-255 bits.
ruleset.cycleNumber = uint256(uint56(packedIntrinsicProperties >> 200));
// `weight` in bits 0-111 bits.
ruleset.weight = uint112(packedIntrinsicProperties);
// `basedOnId` in bits 112-159 bits.
ruleset.basedOnId = uint48(packedIntrinsicProperties >> 112);
// `start` in bits 160-207 bits.
ruleset.start = uint48(packedIntrinsicProperties >> 160);
// `cycleNumber` in bits 208-255 bits.
ruleset.cycleNumber = uint48(packedIntrinsicProperties >> 208);

uint256 packedUserProperties = _packedUserPropertiesOf[projectId][rulesetId];

// approval hook in bits 0-159 bits.
ruleset.approvalHook = IJBRulesetApprovalHook(address(uint160(packedUserProperties)));
// `duration` in bits 160-191 bits.
ruleset.duration = uint256(uint32(packedUserProperties >> 160));
ruleset.duration = uint32(packedUserProperties >> 160);
// decay rate in bits 192-223 bits.
ruleset.decayRate = uint256(uint32(packedUserProperties >> 192));
ruleset.decayRate = uint32(packedUserProperties >> 192);

ruleset.metadata = _metadataOf[projectId][rulesetId];
}
Expand Down
Loading

0 comments on commit 8486c3c

Please sign in to comment.