Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
f8af913
chore(runway): cherry-pick feat(rewards): benefits preview uses Tag f…
runway-github[bot] May 15, 2026
fc4026a
chore(runway): cherry-pick fix: cp-7.78.0 add correct permissions to …
runway-github[bot] May 15, 2026
ec70592
[skip ci] Bump version number to 5004
metamaskbot May 15, 2026
b35b7f4
chore(runway): cherry-pick fix: cp-7.77.0 cp-7.78.0 missing metamask …
runway-github[bot] May 15, 2026
e6d22b9
[skip ci] Bump version number to 5006
metamaskbot May 15, 2026
619e4a4
chore(runway): cherry-pick chore: align carousel card heights for acc…
runway-github[bot] May 15, 2026
f0e88a8
[skip ci] Bump version number to 5007
metamaskbot May 15, 2026
c942f8a
chore(runway): cherry-pick feat: cp-7.78.0 support deposit-wallet pol…
runway-github[bot] May 15, 2026
c40f285
[skip ci] Bump version number to 5010
metamaskbot May 15, 2026
4277b3f
chore(runway): cherry-pick fix: cp-7.78.0 ensure perf e2e run on rele…
runway-github[bot] May 15, 2026
b7c0b57
[skip ci] Bump version number to 5011
metamaskbot May 15, 2026
a9021a5
chore(runway): cherry-pick fix(Rewards): Update theMiracle logo and m…
runway-github[bot] May 15, 2026
95c7fbe
[skip ci] Bump version number to 5021
metamaskbot May 15, 2026
89ef7b9
chore(runway): cherry-pick fix(predict): fix unregistered wallet issu…
runway-github[bot] May 16, 2026
eb5b96f
[skip ci] Bump version number to 5027
metamaskbot May 16, 2026
18938d3
chore(runway): cherry-pick chore: ohlcv reduce initial delay cp-7.78.…
runway-github[bot] May 18, 2026
6413f18
[skip ci] Bump version number to 5047
metamaskbot May 18, 2026
f2f4f4f
chore(runway): cherry-pick fix: release-blocker restore gas estimate …
runway-github[bot] May 18, 2026
abecb2c
[skip ci] Bump version number to 5048
metamaskbot May 18, 2026
35d75aa
chore(runway): cherry-pick chore: related assets pills with price cha…
runway-github[bot] May 18, 2026
bb50e5b
[skip ci] Bump version number to 5052
metamaskbot May 18, 2026
7b5bdee
chore(runway): cherry-pick chore: adds ab test for WH positioning in …
runway-github[bot] May 18, 2026
5e26731
[skip ci] Bump version number to 5053
metamaskbot May 18, 2026
dba98f8
chore: sync stable into release/7.78.0 (post 7.77.0)
chloeYue May 18, 2026
2b8ad76
chore: sync stable into release/7.78.0 (post 7.77.0) (#30345)
chloeYue May 19, 2026
5319709
chore(runway): cherry-pick feat: add AI disclaimer to whats happening…
runway-github[bot] May 19, 2026
91e12f4
[skip ci] Bump version number to 5071
metamaskbot May 19, 2026
fefc74e
chore: sync stable into release/7.78.0 (post 7.77.1)
chloeYue May 19, 2026
6196fda
chore: sync stable into release/7.78.0 (post 7.77.1) (#30397)
metamaskbotv2[bot] May 19, 2026
d2df18d
[skip ci] Bump version number to 5073
metamaskbot May 19, 2026
f53b2ba
chore(release): release-changelog/7.78.0 (#30210)
chloeYue May 19, 2026
c67bb33
[skip ci] Bump version number to 5074
metamaskbot May 19, 2026
fcaa215
chore(runway): cherry-pick chore: revert react-native-mmkv to v3.x cp…
runway-github[bot] May 20, 2026
f9bcde9
[skip ci] Bump version number to 5093
metamaskbot May 20, 2026
184d15d
chore(runway): cherry-pick feat(Rewards): Use correct source tokens f…
runway-github[bot] May 20, 2026
e4ea25e
[skip ci] Bump version number to 5094
metamaskbot May 20, 2026
dc8b7c9
chore: sync stable into release/7.78.0 (post 7.77.2) (#30459)
chloeYue May 20, 2026
ef1663a
chore: relink stable history into release/7.78.0 (post 7.77.2)
chloeYue May 20, 2026
b748c7d
chore: relink stable history into release/7.78.0 (post 7.77.2) (#30468)
chloeYue May 20, 2026
b6bad22
chore(runway): cherry-pick chore: bump @metamask/transaction-pay-cont…
runway-github[bot] May 20, 2026
b698181
chore(runway): cherry-pick fix: cp-7.78.0 add `isAtomicBatchSupported…
runway-github[bot] May 20, 2026
e5dc364
[skip ci] Bump version number to 5110
metamaskbot May 20, 2026
84e6991
chore(runway): cherry-pick fix: handle Perps withdraw batch initializ…
runway-github[bot] May 20, 2026
4b2f451
[skip ci] Bump version number to 5111
metamaskbot May 20, 2026
7e00e32
chore(runway): cherry-pick feat(predict): Bottom Sheet Keyboard Fix c…
runway-github[bot] May 21, 2026
9e04ba8
[skip ci] Bump version number to 5114
metamaskbot May 21, 2026
5f65e93
chore(runway): cherry-pick chore: track x/tweet card taps in Market I…
runway-github[bot] May 21, 2026
cc2c7d5
chore(runway): cherry-pick fix: football prediction markets not loadi…
runway-github[bot] May 21, 2026
d55933b
[skip ci] Bump version number to 5119
metamaskbot May 21, 2026
e5b845a
chore(runway): cherry-pick fix: handle BTC quote when BTC quote has m…
runway-github[bot] May 21, 2026
0fccfd3
[skip ci] Bump version number to 5120
metamaskbot May 21, 2026
b349be4
chore(runway): cherry-pick fix(analytics): normalise Segment proxy UR…
runway-github[bot] May 21, 2026
491e502
chore(runway): cherry-pick fix: Perps withdraw back-swipe toast cp-7.…
runway-github[bot] May 21, 2026
5ee3434
[skip ci] Bump version number to 5129
metamaskbot May 21, 2026
d74fbd9
chore(runway): cherry-pick fix(perps): apply safe area top inset dire…
runway-github[bot] May 21, 2026
7db0daa
[skip ci] Bump version number to 5130
metamaskbot May 21, 2026
242ade0
chore(runway): cherry-pick fix: add BTC swap reserve enforcement with…
runway-github[bot] May 21, 2026
72e27e9
[skip ci] Bump version number to 5131
metamaskbot May 21, 2026
e8b41b2
fix(rewards): copyable field container (#30471)
sophieqgu May 21, 2026
1d215f0
[skip ci] Bump version number to 5134
metamaskbot May 21, 2026
8f39d77
chore(runway): cherry-pick fix: show fallback token icons in confirma…
runway-github[bot] May 21, 2026
27f940d
[skip ci] Bump version number to 5137
metamaskbot May 21, 2026
f392344
chore(runway): cherry-pick feat(predict): Enable Bottom Sheet via Exp…
runway-github[bot] May 21, 2026
1035902
[skip ci] Bump version number to 5138
metamaskbot May 21, 2026
caf0bb8
chore(runway): cherry-pick chore: New Crowdin Translations by GitHub …
runway-github[bot] May 21, 2026
57b7bd6
[skip ci] Bump version number to 5142
metamaskbot May 21, 2026
e74790e
[skip ci] Bump version number to 5143
metamaskbot May 21, 2026
33f6c58
ci: re-trigger CI on release/7.78.0 (previous HEAD had [skip ci])
chloeYue May 21, 2026
23dfdbd
ci: trigger pull_request workflows after PR unlock
chloeYue May 21, 2026
1afb727
chore(runway): cherry-pick chore: update uuid to v14.0.0 (#30558)
runway-github[bot] May 22, 2026
dcae245
feat: adding money account methods to get transaction data array (#30…
jpuri May 22, 2026
6fa14b7
release: 7.78.0 (#30207)
chloeYue May 22, 2026
8d341ee
Merge origin/main into stable-main-7.78.0
metamaskbot May 22, 2026
6018bf7
chore(release): sync stable to main for version 7.78.0 (#30568)
metamaskbotv2[bot] May 22, 2026
65cbeec
feat(perps): decouple agentic cache fingerprint from project EAS fing…
abretonc7s May 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 49 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,53 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [7.78.0]

### Added

- Added a Braze-driven promotional banner to the wallet home screen. (#29301)
- Added a Money Account onboarding flow. (#30137)
- Added a postonboarding checklist on the wallet home shown when the balance is empty. (#28851)
- Added an optional onboarding interest questionnaire after metrics opt-in for eligible users. (#30056)
- Added a "Paid by MetaMask" treatment on the mUSD conversion confirmation screen when MetaMask fully sponsors the network, provider, and gas fees. (#30120)
- Added the Money Account withdrawal flow. (#29862)
- Added mUSD support on Monad. (#29897)
- Added Batch Sell token selection for selling up to five same-network tokens. (#29690)
- Added a sort control to a trader's Open and Closed positions on the Top Traders profile screen. (#30027)
- Added a World Cup promotional banner to the Predict feed. (#30070)
- Added websocket streaming integration for OHLCV data. (#29739)
- Added handling for on-ramp provider return deeplinks so users land directly on their order details after completing or cancelling a purchase with an external provider. (#29858)
- Added an AI disclaimer to the What's Happening section. (#30352)
- Added price-change pills on related assets. (#30259)
- Showed the bonus benefits menu for users with the VIP feature enabled. (#29888)
- Displayed the total benefits count on the Rewards benefits preview header. (#30063)

### Changed

- Updated the primary CTA on the Money Account onboarding stepper to read "Add funds". (#29909)
- Updated Predict buy previews to include market fees in totals and balance checks. (#29881)
- Updated Bridge navigation to use the native stack with in-screen headers for Bridge, token selection, and quote selection. (#29829)
- Updated the mUSD bonus calculator in Rewards with a fresh design. (#29758)
- Updated the Rewards "theMiracle" logo to be theme-aware. (#30213)
- Aligned previously base-enabled custom network logos (Stable, Flow, XDC, Fraxtal, Hemi, Plasma, Lukso, Rootstock, MSU, Lens, Plume) to a square format consistent with Popular networks. (#29943)
- Aligned carousel card heights for accessibility. (#30201)
- Improved the empty DeFi state navigation to point to Trending v2. (#29927)
- Improved retry behavior when QR hardware wallet signing scans fail. (#29741)
- Removed gas alerts from the confirmation modal in gasless flows and updated the 10 MON minimum-reserve alert copy. (#29835)

### Fixed

- Fixed a regression where gas estimate alerts had stopped showing in confirmations. (#30266)
- Fixed underline positioning in the React Native Scrollable Tab View. (#30133)
- Fixed a bug where failed builder fee approval was permanently cached, causing subsequent Perps orders to fail. (#30095)
- Fixed a bug that could repeatedly prompt hardware wallet users while Perps was idle. (#30114)
- Fixed iOS header inset for Perps order screens. (#30143)
- Fixed a bug where a trader's positions could appear stale on the Top Traders profile and position screens, and added pull-to-refresh on both screens. (#30039)
- Fixed limit order margin calculation to use the limit price instead of the market price, preventing "insufficient margin" errors. (#29800)
- Fixed a bug that could leave the swap quote area blank during slippage refresh. (#29975)
- Fixed the Account List opening too quickly. (#29859)
- Fixed an issue where EIP-7702 authorization signatures with leading zero bytes in `r` or `s` could be rejected by relays and public RPCs. (#29717)

## [7.77.2]

### Fixed
Expand Down Expand Up @@ -11510,7 +11557,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- [#957](https://github.com/MetaMask/metamask-mobile/pull/957): fix timeouts (#957)
- [#954](https://github.com/MetaMask/metamask-mobile/pull/954): Bugfix: onboarding navigation (#954)

[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.77.2...HEAD
[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.78.0...HEAD
[7.78.0]: https://github.com/MetaMask/metamask-mobile/compare/v7.77.2...v7.78.0
[7.77.2]: https://github.com/MetaMask/metamask-mobile/compare/v7.77.1...v7.77.2
[7.77.1]: https://github.com/MetaMask/metamask-mobile/compare/v7.77.0...v7.77.1
[7.77.0]: https://github.com/MetaMask/metamask-mobile/compare/v7.76.3...v7.77.0
Expand Down
163 changes: 163 additions & 0 deletions app/components/UI/Money/utils/moneyAccountTransactions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import {
buildMoneyAccountWithdrawBatch,
updateMoneyAccountDepositTokenAmount,
updateMoneyAccountWithdrawTokenAmount,
getMoneyAccountDepositTransactionsData,
getMoneyAccountWithdrawTransactionsData,
} from './moneyAccountTransactions';
import ReduxService from '../../../../core/redux/ReduxService';
import { selectPrimaryMoneyAccount } from '../../../../selectors/moneyAccountController';
Expand Down Expand Up @@ -528,4 +530,165 @@ describe('moneyAccountTransactions', () => {
);
});
});

describe('getMoneyAccountDepositTransactionsData', () => {
beforeEach(() => {
mockGetProviderByChainId.mockReturnValue(MOCK_PROVIDER as never);
mockSelectMoneyAccountVaultConfig.mockReturnValue(MOCK_VAULT_CONFIG);
(
jest.mocked(ReduxService) as unknown as {
store: { getState: jest.Mock };
}
).store = { getState: jest.fn().mockReturnValue({}) };
});

it('returns two hex calldata strings for a valid amount', async () => {
mockPreviewDeposit.mockResolvedValue(ethers.BigNumber.from('1000000'));

const result = await getMoneyAccountDepositTransactionsData(
MOCK_CHAIN_ID,
'1.0',
);

expect(result).toHaveLength(2);
expect(result[0]).toMatch(/^0x/);
expect(result[1]).toMatch(/^0x/);
});

it('returns [] when vault config is missing', async () => {
mockSelectMoneyAccountVaultConfig.mockReturnValue(undefined);

const result = await getMoneyAccountDepositTransactionsData(
MOCK_CHAIN_ID,
'1.0',
);

expect(result).toEqual([]);
expect(mockPreviewDeposit).not.toHaveBeenCalled();
});

it('returns [] when provider is missing', async () => {
mockGetProviderByChainId.mockReturnValue(undefined as never);

const result = await getMoneyAccountDepositTransactionsData(
MOCK_CHAIN_ID,
'1.0',
);

expect(result).toEqual([]);
expect(mockPreviewDeposit).not.toHaveBeenCalled();
});

it('calls previewDeposit with the converted token amount', async () => {
mockPreviewDeposit.mockResolvedValue(ethers.BigNumber.from('1000000'));

await getMoneyAccountDepositTransactionsData(MOCK_CHAIN_ID, '1.0');

// 1.0 with 6 decimals = 1_000_000
expect(mockPreviewDeposit).toHaveBeenCalledWith(
expect.any(String),
'1000000',
MOCK_VAULT_CONFIG.boringVault,
MOCK_VAULT_CONFIG.accountantAddress,
);
});

it('propagates RPC errors', async () => {
mockPreviewDeposit.mockRejectedValue(new Error('RPC timeout'));

await expect(
getMoneyAccountDepositTransactionsData(MOCK_CHAIN_ID, '1.0'),
).rejects.toThrow('RPC timeout');
});
});

describe('getMoneyAccountWithdrawTransactionsData', () => {
const mockGetState = jest.mocked(ReduxService).store.getState as jest.Mock;
const mockSelectVaultConfig = jest.mocked(selectMoneyAccountVaultConfig);
const mockSelectPrimaryMoneyAccount = jest.mocked(
selectPrimaryMoneyAccount,
);
const mockGetProvider = jest.mocked(getProviderByChainId);

const MOCK_MONEY_ACCOUNT_ADDRESS =
'0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef' as Hex;
const MOCK_RECIPIENT = '0xabcdefabcdefabcdefabcdefabcdefabcdefabcd' as Hex;

beforeEach(() => {
mockGetState.mockReturnValue({});
mockSelectVaultConfig.mockReturnValue(MOCK_VAULT_CONFIG);
mockSelectPrimaryMoneyAccount.mockReturnValue({
address: MOCK_MONEY_ACCOUNT_ADDRESS,
} as ReturnType<typeof selectPrimaryMoneyAccount>);
mockGetProvider.mockReturnValue(
MOCK_PROVIDER as ReturnType<typeof getProviderByChainId>,
);
mockGetRate.mockResolvedValue(ethers.BigNumber.from('1000000'));
});

it('returns two hex calldata strings for a valid amount', async () => {
const result = await getMoneyAccountWithdrawTransactionsData(
MOCK_CHAIN_ID,
'1.0',
MOCK_RECIPIENT,
);

expect(result).toHaveLength(2);
expect(result[0]).toMatch(/^0x/);
expect(result[1]).toMatch(/^0x/);
});

it('encodes the recipient address in the transfer calldata', async () => {
const result = await getMoneyAccountWithdrawTransactionsData(
MOCK_CHAIN_ID,
'1.0',
MOCK_RECIPIENT,
);

expect(result[1].toLowerCase()).toContain(
MOCK_RECIPIENT.toLowerCase().slice(2),
);
});

it('returns [] when vault config is missing', async () => {
mockSelectVaultConfig.mockReturnValue(undefined);

const result = await getMoneyAccountWithdrawTransactionsData(
MOCK_CHAIN_ID,
'1.0',
MOCK_RECIPIENT,
);

expect(result).toEqual([]);
expect(mockGetRate).not.toHaveBeenCalled();
});

it('returns [] when primary money account is missing', async () => {
mockSelectPrimaryMoneyAccount.mockReturnValue(undefined);

const result = await getMoneyAccountWithdrawTransactionsData(
MOCK_CHAIN_ID,
'1.0',
MOCK_RECIPIENT,
);

expect(result).toEqual([]);
expect(mockGetRate).not.toHaveBeenCalled();
});

it('returns [] when provider is missing', async () => {
mockGetProvider.mockReturnValue(
undefined as unknown as ReturnType<typeof getProviderByChainId>,
);

const result = await getMoneyAccountWithdrawTransactionsData(
MOCK_CHAIN_ID,
'1.0',
MOCK_RECIPIENT,
);

expect(result).toEqual([]);
expect(mockGetRate).not.toHaveBeenCalled();
});
});
});
94 changes: 94 additions & 0 deletions app/components/UI/Money/utils/moneyAccountTransactions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,100 @@ export async function updateMoneyAccountWithdrawTokenAmount(
];
}

/**
* Returns encoded calldata for the approve + deposit batch of a Money Account deposit.
*
* @param chainId - Chain ID in hex
* @param amountHuman - Human-readable deposit amount (e.g. "10.5")
* @returns `[approveData, depositData]`, or `[]` if vault config or provider is unavailable
*/
export async function getMoneyAccountDepositTransactionsData(
chainId: Hex,
amountHuman: string,
): Promise<Hex[]> {
const vaultConfig = selectMoneyAccountVaultConfig(
ReduxService.store.getState() as RootState,
);
if (!vaultConfig) return [];

const provider = getProviderByChainId(chainId);
if (!provider) return [];

const musdAddress = getMoneyAccountDepositAssetAddress(chainId);
const amount = BigInt(
calcTokenValue(amountHuman, MUSD_DECIMALS)
.decimalPlaces(0, BigNumber.ROUND_UP)
.toFixed(0),
);
const minimumMint =
amount === 0n
? 0n
: applySlippage(
await getExpectedDepositShares({
lensAddress: vaultConfig.lensAddress,
boringVault: vaultConfig.boringVault,
accountantAddress: vaultConfig.accountantAddress,
musdAddress,
amount,
provider,
}),
);

const approveData = buildApproveData(vaultConfig.boringVault, amount);
const depositData = buildDepositData(musdAddress, amount, minimumMint);

return [approveData, depositData];
}

/**
* Returns encoded calldata for the withdraw + transfer batch of a Money Account withdrawal.
*
* @param chainId - Chain ID in hex
* @param amountHuman - Human-readable withdrawal amount (e.g. "10.5")
* @param recipient - EVM address to receive the withdrawn USDC
* @returns `[withdrawData, transferData]`, or `[]` if vault config or provider is unavailable
*/
export async function getMoneyAccountWithdrawTransactionsData(
chainId: Hex,
amountHuman: string,
recipient: Hex,
): Promise<Hex[]> {
const state = ReduxService.store.getState() as RootState;
const vaultConfig = selectMoneyAccountVaultConfig(state);
const primaryMoneyAccount = selectPrimaryMoneyAccount(state);
if (!vaultConfig || !primaryMoneyAccount?.address) return [];

const provider = getProviderByChainId(chainId);
if (!provider) return [];

const musdAddress = getMoneyAccountDepositAssetAddress(chainId);
const amount = BigInt(
calcTokenValue(amountHuman, MUSD_DECIMALS)
.decimalPlaces(0, BigNumber.ROUND_UP)
.toFixed(0),
);
const shareAmount =
amount === 0n
? 0n
: getSharesForWithdrawal(
amount,
await getVaultRate({
accountantAddress: vaultConfig.accountantAddress,
provider,
}),
);

const withdrawData = buildWithdrawData(
musdAddress,
shareAmount,
amount,
primaryMoneyAccount.address,
);
const transferData = buildErc20TransferData(recipient, amount);

return [withdrawData, transferData];
}

// -- Withdrawal helpers ----------------------------------------------------

async function getVaultRate({
Expand Down
2 changes: 1 addition & 1 deletion scripts/perps/agentic/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ Compound: `{ all: [...] }`, `{ any: [...] }`, `{ none: [...] }`.
| `rebuild-native` | no | yes (no `--repo-update`) | yes | no |
| `clean` (legacy `--clean`) | yes | yes with `--repo-update` | yes | no (writes only) |

Cache lives in `$MM_BUILD_CACHE_DIR` (default `~/Library/Caches/mm-mobile-builds` on macOS, `~/.cache/mm-mobile-builds` on Linux), keyed by `@expo/fingerprint` hash. Parallel worktrees at the same fingerprint share one artifact through a per-fingerprint mutex: Linux uses `flock(1)` (auto-released by the kernel on process death); macOS, where `flock` is not in base, uses an atomic `mkdir <fp>.lock.d` fallback that is released by the script's `EXIT` trap. If a script is killed with `kill -9` between `mkdir` and the trap, the mutex dir can be left behind — delete it manually under `$MM_BUILD_CACHE_DIR/<plat>/`. Override retention with `BUILD_CACHE_RETAIN=N` (default 5 per platform).
Cache lives in `$MM_BUILD_CACHE_DIR` (default `~/Library/Caches/mm-mobile-builds` on macOS, `~/.cache/mm-mobile-builds` on Linux), keyed by an agentic `@expo/fingerprint` hash computed by `scripts/perps/agentic/lib/compute-cache-fp.js`. The agentic fingerprint *extends* the project-wide `fingerprint.config.js` (which EAS Build and OTA still consume unchanged) with additional `ignorePaths` for per-worktree build artifacts that don't influence binary semantics (`ios/build/`, `.gradle/`, Xcode `xcuserdata`, NDK `.cxx`, etc.). Binary-affecting inputs — env-populated `xcconfig`, `google-services.json`, and the bundled `InpageBridgeWeb3.js` — stay hashed, so the cache only converges across worktrees when those inputs match. Parallel worktrees at the same fingerprint share one artifact through a per-fingerprint mutex: Linux uses `flock(1)` (auto-released by the kernel on process death); macOS, where `flock` is not in base, uses an atomic `mkdir <fp>.lock.d` fallback that is released by the script's `EXIT` trap. If a script is killed with `kill -9` between `mkdir` and the trap, the mutex dir can be left behind — delete it manually under `$MM_BUILD_CACHE_DIR/<plat>/`. Override retention with `BUILD_CACHE_RETAIN=N` (default 5 per platform).

Invoke directly:

Expand Down
5 changes: 4 additions & 1 deletion scripts/perps/agentic/lib/build-cache.sh
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,10 @@ bc_fingerprint() {
fi
fi
local fp
fp=$(node scripts/generate-fingerprint.js 2>/dev/null || true)
# Use the agentic fingerprint. It extends the project's fingerprint.config.js
# (so EAS/OTA inputs still participate) with additional ignorePaths for
# per-worktree build outputs. See compute-cache-fp.js for the rationale.
fp=$(node scripts/perps/agentic/lib/compute-cache-fp.js 2>/dev/null || true)
if [ -z "$fp" ]; then
return 1
fi
Expand Down
Loading
Loading