Skip to content

Commit

Permalink
Support subaccount for transfer_sns_funds proposal (#4581)
Browse files Browse the repository at this point in the history
  • Loading branch information
megrogan authored Oct 13, 2023
1 parent f52f6a1 commit 3eebddb
Show file tree
Hide file tree
Showing 15 changed files with 106 additions and 46 deletions.
44 changes: 31 additions & 13 deletions frontend/app/src/components/home/MakeProposalModal.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import TextArea from "../TextArea.svelte";
import Select from "../Select.svelte";
import Radio from "../Radio.svelte";
import { isPrincipalValid } from "../../utils/sns";
import { isPrincipalValid, isSubAccountValid } from "../../utils/sns";
import PencilIcon from "svelte-material-icons/PencilOutline.svelte";
import EyeIcon from "svelte-material-icons/EyeOutline.svelte";
import Markdown from "./Markdown.svelte";
Expand All @@ -42,15 +42,15 @@
let summary = "";
let treasury: Treasury = "SNS";
let amountText = "";
let recipient = "";
let recipientOwner = "";
let recipientSubaccount = "";
let step = -1;
let actualWidth = 0;
let summaryPreview = false;
let busy = true;
let selectedProposalType: "motion" | "transfer_sns_funds" = "motion";
let message = "";
let error = true;
let recipientValid = false;
let summaryContainerHeight = 0;
let summaryHeight = 0;
let refreshingBalance = false;
Expand All @@ -73,13 +73,16 @@
$: summaryValid = summary.length >= MIN_SUMMARY_LENGTH && summary.length <= MAX_SUMMARY_LENGTH;
$: amount = Number(amountText) * Number(Math.pow(10, tokenDetails.decimals));
$: amountValid = amount >= transferFee;
$: recipientValid = isPrincipalValid(recipient);
$: recipientOwnerValid = isPrincipalValid(recipientOwner);
$: recipientSubaccountValid =
recipientSubaccount.length === 0 || isSubAccountValid(recipientSubaccount);
$: valid =
!insufficientFunds &&
titleValid &&
urlValid &&
summaryValid &&
(selectedProposalType === "motion" || (amountValid && recipientValid));
(selectedProposalType === "motion" ||
(amountValid && recipientOwnerValid && recipientSubaccountValid));
$: canSubmit = step === 2 || (step === 1 && selectedProposalType === "motion");
$: {
Expand Down Expand Up @@ -117,7 +120,13 @@
? { kind: selectedProposalType }
: {
kind: selectedProposalType,
toPrincipal: recipient,
recipient: {
owner: recipientOwner,
subaccount:
recipientSubaccount.length > 0
? recipientSubaccount.padStart(64, "0")
: undefined,
},
amount: BigInt(Math.floor(amount)),
treasury,
};
Expand Down Expand Up @@ -296,15 +305,24 @@
on:change={() => (treasury = "ICP")} />
</section>
<section>
<Legend label={$_("proposal.maker.toPrincipal")} required />
<Legend label={$_("proposal.maker.recipientOwner")} required />
<Input
disabled={busy}
invalid={recipient.length > 0 && !recipientValid}
bind:value={recipient}
minlength={MIN_TITLE_LENGTH}
maxlength={MAX_TITLE_LENGTH}
countdown
placeholder={$_("proposal.maker.enterToPrincipal")} />
invalid={recipientOwner.length > 0 && !recipientOwnerValid}
maxlength={63}
bind:value={recipientOwner}
placeholder={$_("proposal.maker.enterRecipientOwner")} />
</section>
<section>
<Legend
label={$_("proposal.maker.recipientSubaccount")}
rules={$_("proposal.maker.recipientSubaccountRules")} />
<Input
disabled={busy}
invalid={!recipientSubaccountValid}
maxlength={64}
bind:value={recipientSubaccount}
placeholder={$_("proposal.maker.enterRecipientSubaccount")} />
</section>
<section>
<Legend
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
const sectionLabels: SectionLabels = {
all: "",
unknown: "",
unknown: "proposal.unknownActionCategory",
builtIn: "proposal.builtInAction",
userIndex: "proposal.userIndexAction",
groupIndex: "proposal.groupIndexAction",
Expand Down
9 changes: 6 additions & 3 deletions frontend/app/src/i18n/cn.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,14 +607,17 @@
"summaryRules": "支持降价",
"urlRules": "补充详细信息的链接",
"unexpectedError": "提交提案时出现意外错误",
"toPrincipal": "收款人账户本金",
"enterToPrincipal": "输入收件人帐户主体",
"amount": "数量",
"amountRules": "至少 1 个 {token} 令牌",
"enterAmount": "输入 {token} 代币的数量",
"type": "提案类型",
"treasury": "从金库转账的代币",
"message": "提交提案需要缴纳 {cost} {token} 代币押金(包括两套转账费用),如果提案被采纳,押金将退还。"
"message": "提交提案需要缴纳 {cost} {token} 代币押金(包括两套转账费用),如果提案被采纳,押金将退还。",
"recipientOwner": "收款人账户本金",
"recipientSubaccount": "收款人子账户",
"recipientSubaccountRules": "必须是十六进制字符串",
"enterRecipientOwner": "输入收件人的账户主体",
"enterRecipientSubaccount": "输入可选的收件人子帐户"
}
},
"quoteReply": "引用",
Expand Down
9 changes: 6 additions & 3 deletions frontend/app/src/i18n/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -611,14 +611,17 @@
"summaryRules": "unterstützt Markdown",
"urlRules": "Link zu ergänzenden Details",
"unexpectedError": "Unerwarteter Fehler beim Senden des Angebots",
"toPrincipal": "Hauptkonto des Empfängers",
"enterToPrincipal": "Geben Sie einen Empfängerkontoprinzipal ein",
"amount": "Menge",
"amountRules": "mindestens 1 {token}-Token",
"enterAmount": "Geben Sie eine Menge von {token} Token ein",
"type": "Vorschlagstyp",
"treasury": "Token zur Übertragung aus der Schatzkammer",
"message": "Um einen Vorschlag einzureichen, ist eine Anzahlung von {cost} {token} Token (einschließlich zweier Transfergebühren) erforderlich, die zurückerstattet wird, wenn der Vorschlag angenommen wird."
"message": "Um einen Vorschlag einzureichen, ist eine Anzahlung von {cost} {token} Token (einschließlich zweier Transfergebühren) erforderlich, die zurückerstattet wird, wenn der Vorschlag angenommen wird.",
"recipientOwner": "Hauptkonto des Empfängers",
"recipientSubaccount": "Unterkonto des Empfängers",
"recipientSubaccountRules": "muss eine Hex-Zeichenfolge sein",
"enterRecipientOwner": "Geben Sie den Kontoinhaber des Empfängers ein",
"enterRecipientSubaccount": "Geben Sie optional ein Empfänger-Unterkonto ein"
}
},
"quoteReply": "Antwort zitieren",
Expand Down
7 changes: 5 additions & 2 deletions frontend/app/src/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -711,8 +711,11 @@
"summaryRules": "supports markdown",
"urlRules": "link to supplemental details",
"unexpectedError": "Unexpected error submitting proposal",
"toPrincipal": "Recipient account principal",
"enterToPrincipal": "Enter a recipient account principal",
"recipientOwner": "Recipient's account principal",
"recipientSubaccount": "Recipient's sub-account",
"recipientSubaccountRules": "must be a hex string",
"enterRecipientOwner": "Enter the recipient's account principal",
"enterRecipientSubaccount": "Enter an optional recipient sub-account",
"amount": "Amount",
"amountRules": "at least 1 {token} token",
"enterAmount": "Enter a quantity of {token} tokens",
Expand Down
9 changes: 6 additions & 3 deletions frontend/app/src/i18n/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -609,14 +609,17 @@
"summaryRules": "admite rebajas",
"urlRules": "enlace a detalles complementarios",
"unexpectedError": "Error inesperado al enviar la propuesta",
"toPrincipal": "Principal de la cuenta del destinatario",
"enterToPrincipal": "Introduzca el principal de la cuenta del destinatario",
"amount": "Cantidad",
"amountRules": "al menos 1 token {token}",
"enterAmount": "Ingrese una cantidad de tokens {token}",
"type": "Tipo de propuesta",
"treasury": "Token para transferir desde tesorería",
"message": "Se requiere un depósito de tokens {cost} {token} (incluye dos conjuntos de tarifas de transferencia) para enviar una propuesta, que se reembolsa si se adopta."
"message": "Se requiere un depósito de tokens {cost} {token} (incluye dos conjuntos de tarifas de transferencia) para enviar una propuesta, que se reembolsa si se adopta.",
"recipientOwner": "Principal de la cuenta del destinatario",
"recipientSubaccount": "Subcuenta del destinatario",
"recipientSubaccountRules": "debe ser una cadena hexadecimal",
"enterRecipientOwner": "Ingrese el principal de la cuenta del destinatario",
"enterRecipientSubaccount": "Ingrese una subcuenta de destinatario opcional"
}
},
"yes": "",
Expand Down
9 changes: 6 additions & 3 deletions frontend/app/src/i18n/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,14 +607,17 @@
"summaryRules": "prend en charge la démarque",
"urlRules": "lien vers des détails supplémentaires",
"unexpectedError": "Erreur inattendue lors de la soumission de la proposition",
"toPrincipal": "Responsable du compte du destinataire",
"enterToPrincipal": "Saisissez le principal du compte du destinataire",
"amount": "Montant",
"amountRules": "au moins 1 jeton {token}",
"enterAmount": "Entrez une quantité de jetons {token}",
"type": "Type de proposition",
"treasury": "Jeton à transférer du trésor",
"message": "Un dépôt de jetons {cost} {token} (comprend deux séries de frais de transfert) est requis pour soumettre une proposition qui est remboursée si la proposition est adoptée."
"message": "Un dépôt de jetons {cost} {token} (comprend deux séries de frais de transfert) est requis pour soumettre une proposition qui est remboursée si la proposition est adoptée.",
"recipientOwner": "Principal du compte du destinataire",
"recipientSubaccount": "Sous-compte du destinataire",
"recipientSubaccountRules": "doit être une chaîne hexadécimale",
"enterRecipientOwner": "Saisissez le principal du compte du destinataire",
"enterRecipientSubaccount": "Saisissez un sous-compte de destinataire facultatif"
}
},
"yes": "Oui",
Expand Down
9 changes: 6 additions & 3 deletions frontend/app/src/i18n/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,14 +607,17 @@
"summaryRules": "supporta il ribasso",
"urlRules": "collegamento a dettagli supplementari",
"unexpectedError": "Errore imprevisto durante l'invio della proposta",
"toPrincipal": "Entità dell'account del destinatario",
"enterToPrincipal": "Immettere un'entità account del destinatario",
"amount": "Quantità",
"amountRules": "almeno 1 token {token}",
"enterAmount": "Inserisci una quantità di token {token}",
"type": "Tipo di proposta",
"treasury": "Gettone da trasferire dal tesoro",
"message": "Per presentare una proposta è richiesto un deposito di token {cost} {token} (include due serie di commissioni di trasferimento) che verrà rimborsato se la proposta viene adottata."
"message": "Per presentare una proposta è richiesto un deposito di token {cost} {token} (include due serie di commissioni di trasferimento) che verrà rimborsato se la proposta viene adottata.",
"recipientOwner": "Entità del conto del destinatario",
"recipientSubaccount": "Sottoconto del destinatario",
"recipientSubaccountRules": "deve essere una stringa esadecimale",
"enterRecipientOwner": "Inserisci l'entità del conto del destinatario",
"enterRecipientSubaccount": "Inserisci un account secondario del destinatario facoltativo"
}
},
"yes": "",
Expand Down
9 changes: 6 additions & 3 deletions frontend/app/src/i18n/iw.json
Original file line number Diff line number Diff line change
Expand Up @@ -605,14 +605,17 @@
"summaryRules": "תומך ב-markdown",
"urlRules": "קישור לפרטים משלימים",
"unexpectedError": "שגיאה לא צפויה בהגשת ההצעה",
"toPrincipal": "מנהל חשבון הנמען",
"enterToPrincipal": "הזן מנהל חשבון נמען",
"amount": "כמות",
"amountRules": "לפחות אסימון {token} אחד",
"enterAmount": "הזן כמות של {token} אסימונים",
"type": "סוג ההצעה",
"treasury": "אסימון להעברה מאוצר",
"message": "נדרשת הפקדה של {cost} {token} אסימונים (כולל שתי קבוצות של עמלות העברה) כדי להגיש הצעה שתוחזר אם ההצעה תתקבל."
"message": "נדרשת הפקדה של {cost} {token} אסימונים (כולל שתי קבוצות של עמלות העברה) כדי להגיש הצעה שתוחזר אם ההצעה תתקבל.",
"recipientOwner": "מנהל החשבון של הנמען",
"recipientSubaccount": "חשבון המשנה של הנמען",
"recipientSubaccountRules": "חייב להיות מחרוזת משושה",
"enterRecipientOwner": "הזן את מנהל החשבון של הנמען",
"enterRecipientSubaccount": "הזן חשבון משנה אופציונלי של נמען"
}
},
"yes": "כן",
Expand Down
9 changes: 6 additions & 3 deletions frontend/app/src/i18n/jp.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,14 +607,17 @@
"summaryRules": "マークダウンをサポート",
"urlRules": "補足詳細へのリンク",
"unexpectedError": "プロポーザル送信時の予期しないエラー",
"toPrincipal": "受信者のアカウント本人",
"enterToPrincipal": "受信者のアカウント プリンシパルを入力します",
"amount": "",
"amountRules": "少なくとも 1 つの {token} トークン",
"enterAmount": "{token} トークンの数量を入力してください",
"type": "提案型",
"treasury": "財務省から送金するトークン",
"message": "提案を提出するには、{cost} {token} トークンのデポジット (2 セットの送金手数料を含む) が必要です。提案が採用された場合、デポジットは返金されます。"
"message": "提案を提出するには、{cost} {token} トークンのデポジット (2 セットの送金手数料を含む) が必要です。提案が採用された場合、デポジットは返金されます。",
"recipientOwner": "受信者のアカウント本人",
"recipientSubaccount": "受信者のサブアカウント",
"recipientSubaccountRules": "16 進文字列である必要があります",
"enterRecipientOwner": "受信者のアカウントプリンシパルを入力してください",
"enterRecipientSubaccount": "オプションの受信者のサブアカウントを入力します"
}
},
"yes": "はい",
Expand Down
9 changes: 6 additions & 3 deletions frontend/app/src/i18n/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -607,14 +607,17 @@
"summaryRules": "поддерживает уценку",
"urlRules": "ссылка на дополнительную информацию",
"unexpectedError": "Непредвиденная ошибка при отправке предложения.",
"toPrincipal": "Основная сумма счета получателя",
"enterToPrincipal": "Введите основную сумму счета получателя",
"amount": "Количество",
"amountRules": "хотя бы 1 токен {token}",
"enterAmount": "Введите количество токенов {token}",
"type": "Тип предложения",
"treasury": "Токен для перевода из казначейства",
"message": "Для подачи предложения требуется внести депозит в токенах {cost} {token} (включает два набора комиссий за перевод), который возвращается, если предложение будет принято."
"message": "Для подачи предложения требуется внести депозит в токенах {cost} {token} (включает два набора комиссий за перевод), который возвращается, если предложение будет принято.",
"recipientOwner": "Основная сумма счета получателя",
"recipientSubaccount": "Субсчет получателя",
"recipientSubaccountRules": "должна быть шестнадцатеричной строкой",
"enterRecipientOwner": "Введите основную сумму счета получателя",
"enterRecipientSubaccount": "Введите дополнительный дополнительный аккаунт получателя."
}
},
"yes": "Да",
Expand Down
9 changes: 6 additions & 3 deletions frontend/app/src/i18n/vi.json
Original file line number Diff line number Diff line change
Expand Up @@ -608,14 +608,17 @@
"summaryRules": "hỗ trợ đánh dấu",
"urlRules": "liên kết đến chi tiết bổ sung",
"unexpectedError": "Lỗi không mong đợi khi gửi đề xuất",
"toPrincipal": "Tiền gốc tài khoản người nhận",
"enterToPrincipal": "Nhập tiền gốc của tài khoản người nhận",
"amount": "Số lượng",
"amountRules": "ít nhất 1 mã thông báo {token}",
"enterAmount": "Nhập số lượng mã thông báo {token}",
"type": "Loại đề xuất",
"treasury": "Token để chuyển từ kho bạc",
"message": "Cần phải đặt cọc số token {cost} {token} (bao gồm hai bộ phí chuyển khoản) để gửi đề xuất và số tiền này sẽ được hoàn lại nếu đề xuất được thông qua."
"message": "Cần phải đặt cọc số token {cost} {token} (bao gồm hai bộ phí chuyển khoản) để gửi đề xuất và số tiền này sẽ được hoàn lại nếu đề xuất được thông qua.",
"recipientOwner": "Tiền gốc tài khoản của người nhận",
"recipientSubaccount": "Tài khoản phụ của người nhận",
"recipientSubaccountRules": "phải là một chuỗi hex",
"enterRecipientOwner": "Nhập số tiền gốc tài khoản của người nhận",
"enterRecipientSubaccount": "Nhập tài khoản phụ người nhận tùy chọn"
}
},
"yes": "Đúng",
Expand Down
5 changes: 5 additions & 0 deletions frontend/app/src/utils/sns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,8 @@ export function isPrincipalValid(text: string): boolean {
}
}

const SUB_ACCOUNT_REGEX = new RegExp("^[A-Fa-f0-9]+$");

export function isSubAccountValid(text: string): boolean {
return text.length <= 64 && SUB_ACCOUNT_REGEX.test(text);
}
Loading

0 comments on commit 3eebddb

Please sign in to comment.