Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
47 changes: 33 additions & 14 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ permissions:
id-token: write

jobs:
# Load config
# Load config
prepare:
runs-on: ubuntu-latest
outputs:
Expand Down Expand Up @@ -80,9 +80,6 @@ jobs:
# Android: Cirrus lg (large) runner for 8GB Gradle heap; iOS: GitHub-hosted macOS
runs-on: ${{ matrix.platform == 'ios' && 'ghcr.io/cirruslabs/macos-runner:sequoia-xl' || 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-lg' }}
environment: ${{ needs.prepare.outputs.github_environment }}
env:
# So bundle exec (in yarn pod:install) finds ios/Gemfile when running from repo root
BUNDLE_GEMFILE: ios/Gemfile
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
Expand Down Expand Up @@ -174,6 +171,17 @@ jobs:
aws-secret-name: ${{ needs.prepare.outputs.signing_aws_secret }}
android-keystore-path: ${{ needs.prepare.outputs.signing_android_keystore_path }}

# iOS: install Ruby, Bundler, and CocoaPods so setup:github-ci has a working Ruby (fixes self-hosted runners)
- name: Installing iOS Environment Setup
if: matrix.platform == 'ios'
timeout-minutes: 15
uses: MetaMask/github-tools/.github/actions/setup-e2e-env@v1
with:
platform: ios
configure-keystores: false
setup-simulator: false
ruby-version: '3.1.6'

- name: Setup project dependencies with retry
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 #v3.0.2
with:
Expand All @@ -188,11 +196,6 @@ jobs:
yarn setup:github-ci --no-build-ios
fi

# Android: use CI Gradle settings (8GB heap, OOM handling) to avoid daemon OOM
- name: Use CI Gradle properties (Android)
if: matrix.platform == 'android'
run: cp android/gradle.properties.github android/gradle.properties

- name: Build ${{ matrix.platform }}
timeout-minutes: 115
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 #v3.0.2
Expand All @@ -207,10 +210,26 @@ jobs:
SCRIPT_NAME="build:${{ matrix.platform }}:${BUILD_NAME//-/:}"
yarn "$SCRIPT_NAME"

# Expo development builds: upload iOS .app for simulator (Runway-style artifact)
- name: Upload iOS Expo development build
if: matrix.platform == 'ios' && (inputs.build_name == 'main-dev' || inputs.build_name == 'flask-dev' || inputs.build_name == 'qa-dev')
# Rename build artifacts
- name: Rename ${{ matrix.platform }} artifacts
run: node scripts/rename-artifacts.js ${{ matrix.platform }}

# Upload build artifacts (only if build succeeded)
- name: Upload iOS artifacts
if: matrix.platform == 'ios'
uses: actions/upload-artifact@v4
with:
name: ios-${{ inputs.build_name }}
path: |
ios/build/Build/Products/
ios/build/output/
ios/build/*.xcarchive
if-no-files-found: error

- name: Upload Android artifacts
if: matrix.platform == 'android' && success()
uses: actions/upload-artifact@v4
with:
name: expo-dev-ios-${{ inputs.build_name }}
path: ios/build/Build/Products/Debug-iphonesimulator/
name: android-${{ inputs.build_name }}
path: android/app/build/outputs/
if-no-files-found: error

This file was deleted.

58 changes: 9 additions & 49 deletions app/components/Nav/Main/RootRPCMethodsUI.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@ import React, { useEffect, useCallback } from 'react';
import { Alert } from 'react-native';
import PropTypes from 'prop-types';

import NotificationManager from '../../../core/NotificationManager';
import Engine from '../../../core/Engine';
import { strings } from '../../../../locales/i18n';
import { getIsSwapApproveOrSwapTransaction } from '../../../util/transactions';
import { onUnapprovedTransaction } from './onUnapprovedTransaction';
import Logger from '../../../util/Logger';
import TransactionTypes from '../../../core/TransactionTypes';
import { KEYSTONE_TX_CANCELED } from '../../../constants/error';
import { MetaMetricsEvents } from '../../../core/Analytics';
import { isHardwareAccount } from '../../../util/address';
Expand All @@ -25,44 +23,21 @@ import ExtendedKeyringTypes from '../../../constants/keyringTypes';
import { ConfirmRoot } from '../../../components/Views/confirmations/components/confirm';
import { useMetrics } from '../../../components/hooks/useMetrics';
import { STX_NO_HASH_ERROR } from '../../../util/smart-transactions/smart-publish-hook';
import { cloneDeep } from 'lodash';

///: BEGIN:ONLY_INCLUDE_IF(preinstalled-snaps,external-snaps)
import InstallSnapApproval from '../../Approvals/InstallSnapApproval';
import SnapDialogApproval from '../../Snaps/SnapDialogApproval/SnapDialogApproval';
///: END:ONLY_INCLUDE_IF
///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps)
import SnapAccountCustomNameApproval from '../../Approvals/SnapAccountCustomNameApproval';
import { getIsBridgeTransaction } from '../../UI/Bridge/utils/transaction';
///: END:ONLY_INCLUDE_IF

const RootRPCMethodsUI = (props) => {
const { trackEvent, createEventBuilder } = useMetrics();

const autoSign = useCallback(
async (transactionMeta) => {
const { id: transactionId } = transactionMeta;

try {
Engine.controllerMessenger.subscribeOnceIf(
'TransactionController:transactionFinished',
(transactionMeta) => {
try {
if (transactionMeta.status === 'submitted') {
NotificationManager.watchSubmittedTransaction({
...transactionMeta,
assetType: transactionMeta.txParams.assetType,
});
} else {
throw transactionMeta.error;
}
} catch (error) {
console.error(error, 'error while trying to send transaction');
}
},
(transactionMeta) => transactionMeta.id === transactionId,
);

const isLedgerAccount = isHardwareAccount(
transactionMeta.txParams.from,
[ExtendedKeyringTypes.ledger],
Expand Down Expand Up @@ -127,26 +102,11 @@ const RootRPCMethodsUI = (props) => {
[props.navigation, trackEvent, createEventBuilder],
);

const onUnapprovedTransaction = useCallback(
async (transactionMetaOriginal) => {
const transactionMeta = cloneDeep(transactionMetaOriginal);

if (transactionMeta.origin === TransactionTypes.MMM) return;

const to = transactionMeta.txParams.to?.toLowerCase();
const { data } = transactionMeta.txParams;

if (
getIsSwapApproveOrSwapTransaction(
data,
transactionMeta.origin,
to,
transactionMeta.chainId,
) ||
getIsBridgeTransaction(transactionMeta)
) {
autoSign(transactionMeta);
}
const handleUnapprovedTransaction = useCallback(
(transactionMeta) => {
onUnapprovedTransaction(transactionMeta, {
autoSign,
});
},
[autoSign],
);
Expand All @@ -155,15 +115,15 @@ const RootRPCMethodsUI = (props) => {
useEffect(() => {
Engine.controllerMessenger.subscribe(
'TransactionController:unapprovedTransactionAdded',
onUnapprovedTransaction,
handleUnapprovedTransaction,
);
return () => {
Engine.controllerMessenger.unsubscribe(
'TransactionController:unapprovedTransactionAdded',
onUnapprovedTransaction,
handleUnapprovedTransaction,
);
};
}, [onUnapprovedTransaction]);
}, [handleUnapprovedTransaction]);

useEffect(
() =>
Expand Down
Loading
Loading