From 7bba94b2874eb2d090dd82e57e38e540d2185402 Mon Sep 17 00:00:00 2001 From: Gerhard Steenkamp <51655063+gsteenkamp89@users.noreply.github.com> Date: Fri, 12 Apr 2024 13:39:41 +0200 Subject: [PATCH] feat: add support to osnap plugin for importing transactions from Safe builder (#4649) * feat: allow safe json upload into osnap tx builder Signed-off-by: david * parse batchfile & populate input fields with values * show value & to fields * improve input * improve file input error handling and styling * refactor * refactor * minor bug fix * allow quick fix for short bytes32 * align icon better * make file input own component * import file once and initialize multiple safeImport transactions * check if safe address & chainId match * small fixes * clean up comments * better border sie for file input * clear input element value to allow recurring upload * fix quick fix * handle multiple files * better error message * emit from watcher * fix: use upstream state only * clean up * do byteslike check last * fixes * add default label * fix: remove component level tx state * Merge branch 'master' into uma-add-safe-transaction-file-import-to-osnap-plugin * validate address input on blur * clean up input css * improve bytes32 error message * replace readOnly with hidden, casing change --------- Signed-off-by: david Co-authored-by: david Co-authored-by: Chaitanya --- src/components/Ui/UiInput.vue | 8 +- src/helpers/utils.ts | 4 + src/plugins/oSnap/Create.vue | 3 - .../oSnap/components/Input/Address.vue | 9 +- .../components/Input/FileInput/FileInput.vue | 126 ++++++++++++++++++ .../oSnap/components/Input/FileInput/utils.ts | 17 +++ .../components/Input/MethodParameter.vue | 71 ++++++++-- .../components/Input/TransactionType.vue | 8 ++ .../ModalTransactionType.vue | 25 ++-- .../TransactionBuilder/RawTransaction.vue | 4 +- .../TransactionBuilder/SafeImport.vue | 107 +++++++++++++++ .../TransactionBuilder/Transaction.vue | 51 +++---- .../TransactionBuilder/TransactionBuilder.vue | 11 ++ .../TransactionBuilder/TransactionImport.vue | 76 +++++++++++ .../TransactionBuilder/TransferFunds.vue | 1 - src/plugins/oSnap/constants.ts | 3 +- src/plugins/oSnap/types.ts | 87 +++++++++++- src/plugins/oSnap/utils/abi.ts | 53 ++++++++ src/plugins/oSnap/utils/safeImport.ts | 47 +++++++ src/plugins/oSnap/utils/transactions.ts | 80 ++++++++++- src/plugins/oSnap/utils/validators.ts | 86 +++++++++++- 21 files changed, 817 insertions(+), 60 deletions(-) create mode 100644 src/plugins/oSnap/components/Input/FileInput/FileInput.vue create mode 100644 src/plugins/oSnap/components/Input/FileInput/utils.ts create mode 100644 src/plugins/oSnap/components/TransactionBuilder/SafeImport.vue create mode 100644 src/plugins/oSnap/components/TransactionBuilder/TransactionImport.vue create mode 100644 src/plugins/oSnap/utils/safeImport.ts diff --git a/src/components/Ui/UiInput.vue b/src/components/Ui/UiInput.vue index 538f3ffc7..b5c2973d2 100644 --- a/src/components/Ui/UiInput.vue +++ b/src/components/Ui/UiInput.vue @@ -9,6 +9,7 @@ const props = defineProps<{ additionalInputClass?: string; focusOnMount?: boolean; readonly?: boolean; + quickFix?(): void; }>(); const emit = defineEmits(['update:modelValue', 'blur']); @@ -69,8 +70,13 @@ onMounted(() => { ]" > - {{ error || '' }} + {{ error || '' }} + + diff --git a/src/helpers/utils.ts b/src/helpers/utils.ts index 1b5b75d05..c9e1829a5 100644 --- a/src/helpers/utils.ts +++ b/src/helpers/utils.ts @@ -200,3 +200,7 @@ export function toChecksumAddress(address: string) { return address; } } + +export function addressEqual(address1: string, address2: string) { + return address1.toLowerCase() === address2.toLowerCase(); +} diff --git a/src/plugins/oSnap/Create.vue b/src/plugins/oSnap/Create.vue index f4cc6fcc3..d4942df81 100644 --- a/src/plugins/oSnap/Create.vue +++ b/src/plugins/oSnap/Create.vue @@ -49,19 +49,16 @@ const collectables = ref([]); function addTransaction(transaction: Transaction) { if (newPluginData.value.safe === null) return; newPluginData.value.safe.transactions.push(transaction); - update(newPluginData.value); } function removeTransaction(transactionIndex: number) { if (!newPluginData.value.safe) return; newPluginData.value.safe.transactions.splice(transactionIndex, 1); - update(newPluginData.value); } function updateTransaction(transaction: Transaction, transactionIndex: number) { if (!newPluginData.value.safe) return; newPluginData.value.safe.transactions[transactionIndex] = transaction; - update(newPluginData.value); } async function fetchTokens(url: string): Promise { diff --git a/src/plugins/oSnap/components/Input/Address.vue b/src/plugins/oSnap/components/Input/Address.vue index 00895563c..eddd5636c 100644 --- a/src/plugins/oSnap/components/Input/Address.vue +++ b/src/plugins/oSnap/components/Input/Address.vue @@ -7,6 +7,7 @@ const props = defineProps<{ error?: string; disabled?: boolean; }>(); + const emit = defineEmits<{ 'update:modelValue': [value: string]; }>(); @@ -24,6 +25,7 @@ const validate = () => { error.value = 'Address is required'; return; } + if (!mustBeEthereumAddress(input.value)) { error.value = 'Invalid address'; return; @@ -49,6 +51,11 @@ onMounted(() => { const handleInput = () => { emit('update:modelValue', input.value); }; + +const handleBlur = () => { + dirty.value = true; + validate(); +}; diff --git a/src/plugins/oSnap/components/TransactionBuilder/RawTransaction.vue b/src/plugins/oSnap/components/TransactionBuilder/RawTransaction.vue index 357f8783c..19d58d5f3 100644 --- a/src/plugins/oSnap/components/TransactionBuilder/RawTransaction.vue +++ b/src/plugins/oSnap/components/TransactionBuilder/RawTransaction.vue @@ -1,7 +1,5 @@ + + diff --git a/src/plugins/oSnap/components/TransactionBuilder/Transaction.vue b/src/plugins/oSnap/components/TransactionBuilder/Transaction.vue index e5251c025..a61856079 100644 --- a/src/plugins/oSnap/components/TransactionBuilder/Transaction.vue +++ b/src/plugins/oSnap/components/TransactionBuilder/Transaction.vue @@ -1,5 +1,4 @@