From bb7e6c247e733272b975533f2f925b74b4f5a1ba Mon Sep 17 00:00:00 2001 From: mmackz Date: Sat, 10 May 2025 18:44:02 -0700 Subject: [PATCH 1/3] test: add tests for deploying with 4-byte selector in criteria --- ...0PeggedVariableCriteriaIncentiveV2.test.ts | 30 +++++++++++++++++++ .../ERC20VariableCriteriaIncentiveV2.test.ts | 28 +++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/packages/sdk/src/Incentives/ERC20PeggedVariableCriteriaIncentiveV2.test.ts b/packages/sdk/src/Incentives/ERC20PeggedVariableCriteriaIncentiveV2.test.ts index c53938e13..b087e4b87 100644 --- a/packages/sdk/src/Incentives/ERC20PeggedVariableCriteriaIncentiveV2.test.ts +++ b/packages/sdk/src/Incentives/ERC20PeggedVariableCriteriaIncentiveV2.test.ts @@ -358,4 +358,34 @@ describe("ERC20PeggedVariableCriteriaIncentive", () => { expect(balanceAfterClaim - balanceBeforeClaim).toBe(signedAmount); }) + + test("should deploy with a 4-byte function selector", async () => { + const fourByteSignature = "0xa9059cbb" as Hex; // transfer(address,uint256) + + const incentiveWithFourByteSelector = fixtures.core.ERC20PeggedVariableCriteriaIncentiveV2({ + asset: budgets.erc20.assertValidAddress(), + peg: zeroAddress, + limit: 1000000n, + reward: 1000000n, + maxReward: 1000000n, + criteria: { + criteriaType: SignatureType.FUNC, + signature: fourByteSignature, + fieldIndex: 1, + targetContract: budgets.erc20.assertValidAddress(), + valueType: ValueType.WAD, + }, + }); + + const newBoost = await freshBoost(fixtures, { + budget: budgets.budget, + incentives: [incentiveWithFourByteSelector], + }); + const incentive = newBoost.incentives[0] as ERC20PeggedVariableCriteriaIncentiveV2; + const deployedCriteria = await incentive.getIncentiveCriteria(); + + expect(isAddress(newBoost.incentives[0]!.assertValidAddress())).toBe(true); + expect(deployedCriteria.signature.length).toBe(66); + expect(deployedCriteria.signature.endsWith(fourByteSignature.slice(2))).toBe(true); + }); }); diff --git a/packages/sdk/src/Incentives/ERC20VariableCriteriaIncentiveV2.test.ts b/packages/sdk/src/Incentives/ERC20VariableCriteriaIncentiveV2.test.ts index c45074861..652faecb7 100644 --- a/packages/sdk/src/Incentives/ERC20VariableCriteriaIncentiveV2.test.ts +++ b/packages/sdk/src/Incentives/ERC20VariableCriteriaIncentiveV2.test.ts @@ -272,4 +272,32 @@ describe("ERC20VariableCriteriaIncentiveV2", () => { true, ); }); + + test("should deploy with a 4-byte function selector", async () => { + const fourByteSignature = "0xa9059cbb" as Hex; // transfer(address,uint256) + + const incentiveWithFourByteSelector = fixtures.core.ERC20VariableCriteriaIncentiveV2({ + asset: budgets.erc20.assertValidAddress(), + limit: 1000000n, + reward: 1000000n, + criteria: { + criteriaType: SignatureType.FUNC, + signature: fourByteSignature, + fieldIndex: 1, + targetContract: budgets.erc20.assertValidAddress(), + valueType: ValueType.WAD, + }, + }); + + const newBoost = await freshBoost(fixtures, { + budget: budgets.budget, + incentives: [incentiveWithFourByteSelector], + }); + const incentive = newBoost.incentives[0] as ERC20VariableCriteriaIncentiveV2; + const deployedCriteria = await incentive.getIncentiveCriteria(); + + expect(isAddress(newBoost.incentives[0]!.assertValidAddress())).toBe(true); + expect(deployedCriteria.signature.length).toBe(66); + expect(deployedCriteria.signature.endsWith(fourByteSignature.slice(2))).toBe(true); + }); }); From 52e07b2eb41302c96c789eb565410298a180253b Mon Sep 17 00:00:00 2001 From: mmackz Date: Sat, 10 May 2025 18:44:18 -0700 Subject: [PATCH 2/3] refactor: pad signature in variable criteria incentives --- .../sdk/src/Incentives/ERC20PeggedVariableCriteriaIncentive.ts | 3 ++- .../src/Incentives/ERC20PeggedVariableCriteriaIncentiveV2.ts | 3 ++- packages/sdk/src/Incentives/ERC20VariableCriteriaIncentive.ts | 3 ++- .../sdk/src/Incentives/ERC20VariableCriteriaIncentiveV2.ts | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/sdk/src/Incentives/ERC20PeggedVariableCriteriaIncentive.ts b/packages/sdk/src/Incentives/ERC20PeggedVariableCriteriaIncentive.ts index 2e2366678..b3095f155 100644 --- a/packages/sdk/src/Incentives/ERC20PeggedVariableCriteriaIncentive.ts +++ b/packages/sdk/src/Incentives/ERC20PeggedVariableCriteriaIncentive.ts @@ -29,6 +29,7 @@ import { decodeAbiParameters, decodeFunctionData, encodeAbiParameters, + pad, parseEther, parseEventLogs, zeroAddress, @@ -842,7 +843,7 @@ export function prepareERC20PeggedVariableCriteriaIncentivePayload({ maxReward, criteria: { criteriaType: criteria.criteriaType, - signature: criteria.signature, + signature: pad(criteria.signature), fieldIndex: criteria.fieldIndex, targetContract: criteria.targetContract, }, diff --git a/packages/sdk/src/Incentives/ERC20PeggedVariableCriteriaIncentiveV2.ts b/packages/sdk/src/Incentives/ERC20PeggedVariableCriteriaIncentiveV2.ts index 474e4102f..726d8795b 100644 --- a/packages/sdk/src/Incentives/ERC20PeggedVariableCriteriaIncentiveV2.ts +++ b/packages/sdk/src/Incentives/ERC20PeggedVariableCriteriaIncentiveV2.ts @@ -29,6 +29,7 @@ import { decodeAbiParameters, decodeFunctionData, encodeAbiParameters, + pad, parseEther, parseEventLogs, zeroAddress, @@ -880,7 +881,7 @@ export function prepareERC20PeggedVariableCriteriaIncentiveV2Payload({ maxReward, criteria: { criteriaType: criteria.criteriaType, - signature: criteria.signature, + signature: pad(criteria.signature), fieldIndex: criteria.fieldIndex, targetContract: criteria.targetContract, valueType: criteria.valueType, diff --git a/packages/sdk/src/Incentives/ERC20VariableCriteriaIncentive.ts b/packages/sdk/src/Incentives/ERC20VariableCriteriaIncentive.ts index 5fb164612..4e5846283 100644 --- a/packages/sdk/src/Incentives/ERC20VariableCriteriaIncentive.ts +++ b/packages/sdk/src/Incentives/ERC20VariableCriteriaIncentive.ts @@ -13,6 +13,7 @@ import { decodeAbiParameters, decodeFunctionData, encodeAbiParameters, + pad, parseEther, parseEventLogs, zeroAddress, @@ -427,7 +428,7 @@ export function prepareERC20VariableCriteriaIncentivePayload({ maxReward: maxReward, criteria: { criteriaType: criteria.criteriaType, - signature: criteria.signature, + signature: pad(criteria.signature), fieldIndex: criteria.fieldIndex, targetContract: criteria.targetContract, }, diff --git a/packages/sdk/src/Incentives/ERC20VariableCriteriaIncentiveV2.ts b/packages/sdk/src/Incentives/ERC20VariableCriteriaIncentiveV2.ts index cee79a241..fba18a363 100644 --- a/packages/sdk/src/Incentives/ERC20VariableCriteriaIncentiveV2.ts +++ b/packages/sdk/src/Incentives/ERC20VariableCriteriaIncentiveV2.ts @@ -13,6 +13,7 @@ import { decodeAbiParameters, decodeFunctionData, encodeAbiParameters, + pad, parseEther, parseEventLogs, zeroAddress, @@ -456,7 +457,7 @@ export function prepareERC20VariableCriteriaIncentiveV2Payload({ maxReward: maxReward, criteria: { criteriaType: criteria.criteriaType, - signature: criteria.signature, + signature: pad(criteria.signature), fieldIndex: criteria.fieldIndex, targetContract: criteria.targetContract, valueType: criteria.valueType, From 9766016df916372fef0622b5364cf9034de1ae51 Mon Sep 17 00:00:00 2001 From: mmackz Date: Sat, 10 May 2025 19:09:10 -0700 Subject: [PATCH 3/3] chore: generate changeset --- .changeset/chilly-buses-itch.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/chilly-buses-itch.md diff --git a/.changeset/chilly-buses-itch.md b/.changeset/chilly-buses-itch.md new file mode 100644 index 000000000..a5c5bfadb --- /dev/null +++ b/.changeset/chilly-buses-itch.md @@ -0,0 +1,5 @@ +--- +"@boostxyz/sdk": patch +--- + +allow 4-byte function selectors in incentive criteria