@metamask-previews/transaction-pay-controller 26.3.0-preview-e81fe8853 → 26.3.0-preview-6b4bcdab3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -4
- package/dist/TransactionPayController-method-action-types.cjs.map +1 -1
- package/dist/TransactionPayController-method-action-types.d.cts +31 -1
- package/dist/TransactionPayController-method-action-types.d.cts.map +1 -1
- package/dist/TransactionPayController-method-action-types.d.mts +31 -1
- package/dist/TransactionPayController-method-action-types.d.mts.map +1 -1
- package/dist/TransactionPayController-method-action-types.mjs.map +1 -1
- package/dist/TransactionPayController.cjs +74 -2
- package/dist/TransactionPayController.cjs.map +1 -1
- package/dist/TransactionPayController.d.cts +29 -0
- package/dist/TransactionPayController.d.cts.map +1 -1
- package/dist/TransactionPayController.d.mts +29 -0
- package/dist/TransactionPayController.d.mts.map +1 -1
- package/dist/TransactionPayController.mjs +74 -2
- package/dist/TransactionPayController.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +4 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/strategy/fiat/FiatStrategy.cjs +3 -0
- package/dist/strategy/fiat/FiatStrategy.cjs.map +1 -1
- package/dist/strategy/fiat/FiatStrategy.d.cts.map +1 -1
- package/dist/strategy/fiat/FiatStrategy.d.mts.map +1 -1
- package/dist/strategy/fiat/FiatStrategy.mjs +3 -0
- package/dist/strategy/fiat/FiatStrategy.mjs.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.cjs.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.d.cts +2 -3
- package/dist/strategy/fiat/fiat-direct-musd.d.cts.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.d.mts +2 -3
- package/dist/strategy/fiat/fiat-direct-musd.d.mts.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.mjs.map +1 -1
- package/dist/strategy/fiat/fiat-submit.cjs +3 -0
- package/dist/strategy/fiat/fiat-submit.cjs.map +1 -1
- package/dist/strategy/fiat/fiat-submit.d.cts.map +1 -1
- package/dist/strategy/fiat/fiat-submit.d.mts.map +1 -1
- package/dist/strategy/fiat/fiat-submit.mjs +3 -0
- package/dist/strategy/fiat/fiat-submit.mjs.map +1 -1
- package/dist/tests/messenger-mock.cjs +3 -0
- package/dist/tests/messenger-mock.cjs.map +1 -1
- package/dist/tests/messenger-mock.d.cts +1 -0
- package/dist/tests/messenger-mock.d.cts.map +1 -1
- package/dist/tests/messenger-mock.d.mts +1 -0
- package/dist/tests/messenger-mock.d.mts.map +1 -1
- package/dist/tests/messenger-mock.mjs +3 -0
- package/dist/tests/messenger-mock.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +11 -1
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +11 -1
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/chomp.cjs +37 -5
- package/dist/utils/chomp.cjs.map +1 -1
- package/dist/utils/chomp.d.cts +15 -1
- package/dist/utils/chomp.d.cts.map +1 -1
- package/dist/utils/chomp.d.mts +15 -1
- package/dist/utils/chomp.d.mts.map +1 -1
- package/dist/utils/chomp.mjs +37 -5
- package/dist/utils/chomp.mjs.map +1 -1
- package/dist/utils/feature-flags.cjs +2 -2
- package/dist/utils/feature-flags.cjs.map +1 -1
- package/dist/utils/feature-flags.d.cts +1 -1
- package/dist/utils/feature-flags.d.mts +1 -1
- package/dist/utils/feature-flags.mjs +2 -2
- package/dist/utils/feature-flags.mjs.map +1 -1
- package/dist/utils/ma-vault-deposit.cjs +58 -16
- package/dist/utils/ma-vault-deposit.cjs.map +1 -1
- package/dist/utils/ma-vault-deposit.d.cts +33 -5
- package/dist/utils/ma-vault-deposit.d.cts.map +1 -1
- package/dist/utils/ma-vault-deposit.d.mts +33 -5
- package/dist/utils/ma-vault-deposit.d.mts.map +1 -1
- package/dist/utils/ma-vault-deposit.mjs +55 -14
- package/dist/utils/ma-vault-deposit.mjs.map +1 -1
- package/dist/utils/ma-vault-payout.cjs +57 -0
- package/dist/utils/ma-vault-payout.cjs.map +1 -0
- package/dist/utils/ma-vault-payout.d.cts +18 -0
- package/dist/utils/ma-vault-payout.d.cts.map +1 -0
- package/dist/utils/ma-vault-payout.d.mts +18 -0
- package/dist/utils/ma-vault-payout.d.mts.map +1 -0
- package/dist/utils/ma-vault-payout.mjs +53 -0
- package/dist/utils/ma-vault-payout.mjs.map +1 -0
- package/dist/utils/ma-vault-withdraw.cjs +80 -0
- package/dist/utils/ma-vault-withdraw.cjs.map +1 -0
- package/dist/utils/ma-vault-withdraw.d.cts +22 -0
- package/dist/utils/ma-vault-withdraw.d.cts.map +1 -0
- package/dist/utils/ma-vault-withdraw.d.mts +22 -0
- package/dist/utils/ma-vault-withdraw.d.mts.map +1 -0
- package/dist/utils/ma-vault-withdraw.mjs +76 -0
- package/dist/utils/ma-vault-withdraw.mjs.map +1 -0
- package/dist/utils/money-account-vault-config.cjs +62 -0
- package/dist/utils/money-account-vault-config.cjs.map +1 -0
- package/dist/utils/money-account-vault-config.d.cts +27 -0
- package/dist/utils/money-account-vault-config.d.cts.map +1 -0
- package/dist/utils/money-account-vault-config.d.mts +27 -0
- package/dist/utils/money-account-vault-config.d.mts.map +1 -0
- package/dist/utils/money-account-vault-config.mjs +57 -0
- package/dist/utils/money-account-vault-config.mjs.map +1 -0
- package/package.json +4 -3
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.submitMoneyAccountVaultDepositFromPayout = void 0;
|
|
4
|
+
const providers_1 = require("@ethersproject/providers");
|
|
5
|
+
const money_account_utils_1 = require("@metamask/money-account-utils");
|
|
6
|
+
const constants_js_1 = require("../constants.cjs");
|
|
7
|
+
const ma_vault_deposit_js_1 = require("./ma-vault-deposit.cjs");
|
|
8
|
+
const money_account_vault_config_js_1 = require("./money-account-vault-config.cjs");
|
|
9
|
+
const provider_js_1 = require("./provider.cjs");
|
|
10
|
+
const transaction_js_1 = require("./transaction.cjs");
|
|
11
|
+
/**
|
|
12
|
+
* Resolves an Iron payout transaction and vaults the received mUSD.
|
|
13
|
+
*
|
|
14
|
+
* @param request - Iron payout details.
|
|
15
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
16
|
+
* @returns Hash of the confirmed vault transaction, or `{ skipped: true }` when
|
|
17
|
+
* vaulting is disabled.
|
|
18
|
+
*/
|
|
19
|
+
async function submitMoneyAccountVaultDepositFromPayout(request, messenger) {
|
|
20
|
+
const { moneyAccountAddress, transactionHash, vaultDisabled = false, } = request;
|
|
21
|
+
if (vaultDisabled ||
|
|
22
|
+
!(0, money_account_vault_config_js_1.isMoneyAccountVaultActionEnabled)(messenger, 'deposit')) {
|
|
23
|
+
return { skipped: true };
|
|
24
|
+
}
|
|
25
|
+
const { amountRaw, blockNumber } = await (0, transaction_js_1.getTransferredAmountFromTxHash)({
|
|
26
|
+
chainId: constants_js_1.CHAIN_ID_MONAD,
|
|
27
|
+
messenger,
|
|
28
|
+
tokenAddress: constants_js_1.MUSD_MONAD_ADDRESS,
|
|
29
|
+
txHash: transactionHash,
|
|
30
|
+
walletAddress: moneyAccountAddress,
|
|
31
|
+
});
|
|
32
|
+
if (!amountRaw || BigInt(amountRaw) <= 0n) {
|
|
33
|
+
throw new Error('Payout transaction has no mUSD transfer');
|
|
34
|
+
}
|
|
35
|
+
const vaultConfig = (0, money_account_vault_config_js_1.getMoneyAccountVaultConfig)(messenger);
|
|
36
|
+
const networkClientId = (0, provider_js_1.getNetworkClientId)(messenger, constants_js_1.CHAIN_ID_MONAD);
|
|
37
|
+
const networkClient = messenger.call('NetworkController:getNetworkClientById', networkClientId);
|
|
38
|
+
const provider = new providers_1.Web3Provider(networkClient.provider);
|
|
39
|
+
const { approveTx, depositTx } = await (0, money_account_utils_1.buildMoneyAccountDepositBatch)({
|
|
40
|
+
amount: BigInt(amountRaw),
|
|
41
|
+
provider,
|
|
42
|
+
...vaultConfig,
|
|
43
|
+
});
|
|
44
|
+
return await (0, ma_vault_deposit_js_1.submitMoneyAccountVaultDepositBatch)({
|
|
45
|
+
depositCalls: [
|
|
46
|
+
{ ...approveTx.params, type: approveTx.type },
|
|
47
|
+
{ ...depositTx.params, type: depositTx.type },
|
|
48
|
+
],
|
|
49
|
+
fromBlock: blockNumber,
|
|
50
|
+
messenger,
|
|
51
|
+
moneyAccountAddress,
|
|
52
|
+
sourceAmountRaw: amountRaw,
|
|
53
|
+
vaultDisabled: false,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
exports.submitMoneyAccountVaultDepositFromPayout = submitMoneyAccountVaultDepositFromPayout;
|
|
57
|
+
//# sourceMappingURL=ma-vault-payout.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ma-vault-payout.cjs","sourceRoot":"","sources":["../../src/utils/ma-vault-payout.ts"],"names":[],"mappings":";;;AAAA,wDAAwD;AACxD,uEAA8E;AAG9E,mDAAqE;AAGrE,gEAA4E;AAC5E,oFAGyC;AACzC,gDAAmD;AACnD,sDAAkE;AAQlE;;;;;;;GAOG;AACI,KAAK,UAAU,wCAAwC,CAC5D,OAA8C,EAC9C,SAA4C;IAE5C,MAAM,EACJ,mBAAmB,EACnB,eAAe,EACf,aAAa,GAAG,KAAK,GACtB,GAAG,OAAO,CAAC;IAEZ,IACE,aAAa;QACb,CAAC,IAAA,gEAAgC,EAAC,SAAS,EAAE,SAAS,CAAC,EACvD,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,+CAA8B,EAAC;QACtE,OAAO,EAAE,6BAAc;QACvB,SAAS;QACT,YAAY,EAAE,iCAAkB;QAChC,MAAM,EAAE,eAAe;QACvB,aAAa,EAAE,mBAAmB;KACnC,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,0DAA0B,EAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,IAAA,gCAAkB,EAAC,SAAS,EAAE,6BAAc,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAClC,wCAAwC,EACxC,eAAe,CAChB,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,wBAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,IAAA,mDAA6B,EAAC;QACnE,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC;QACzB,QAAQ;QACR,GAAG,WAAW;KACf,CAAC,CAAC;IAEH,OAAO,MAAM,IAAA,yDAAmC,EAAC;QAC/C,YAAY,EAAE;YACZ,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE;YAC7C,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE;SAC9C;QACD,SAAS,EAAE,WAAW;QACtB,SAAS;QACT,mBAAmB;QACnB,eAAe,EAAE,SAAS;QAC1B,aAAa,EAAE,KAAK;KACrB,CAAC,CAAC;AACL,CAAC;AArDD,4FAqDC","sourcesContent":["import { Web3Provider } from '@ethersproject/providers';\nimport { buildMoneyAccountDepositBatch } from '@metamask/money-account-utils';\nimport type { Hex } from '@metamask/utils';\n\nimport { CHAIN_ID_MONAD, MUSD_MONAD_ADDRESS } from '../constants.js';\nimport type { TransactionPayControllerMessenger } from '../types.js';\nimport type { SubmitMoneyAccountVaultDepositResult } from './ma-vault-deposit.js';\nimport { submitMoneyAccountVaultDepositBatch } from './ma-vault-deposit.js';\nimport {\n getMoneyAccountVaultConfig,\n isMoneyAccountVaultActionEnabled,\n} from './money-account-vault-config.js';\nimport { getNetworkClientId } from './provider.js';\nimport { getTransferredAmountFromTxHash } from './transaction.js';\n\nexport type SubmitMoneyAccountVaultDepositRequest = {\n moneyAccountAddress: Hex;\n transactionHash: Hex;\n vaultDisabled?: boolean;\n};\n\n/**\n * Resolves an Iron payout transaction and vaults the received mUSD.\n *\n * @param request - Iron payout details.\n * @param messenger - Transaction Pay controller messenger.\n * @returns Hash of the confirmed vault transaction, or `{ skipped: true }` when\n * vaulting is disabled.\n */\nexport async function submitMoneyAccountVaultDepositFromPayout(\n request: SubmitMoneyAccountVaultDepositRequest,\n messenger: TransactionPayControllerMessenger,\n): Promise<SubmitMoneyAccountVaultDepositResult> {\n const {\n moneyAccountAddress,\n transactionHash,\n vaultDisabled = false,\n } = request;\n\n if (\n vaultDisabled ||\n !isMoneyAccountVaultActionEnabled(messenger, 'deposit')\n ) {\n return { skipped: true };\n }\n\n const { amountRaw, blockNumber } = await getTransferredAmountFromTxHash({\n chainId: CHAIN_ID_MONAD,\n messenger,\n tokenAddress: MUSD_MONAD_ADDRESS,\n txHash: transactionHash,\n walletAddress: moneyAccountAddress,\n });\n\n if (!amountRaw || BigInt(amountRaw) <= 0n) {\n throw new Error('Payout transaction has no mUSD transfer');\n }\n\n const vaultConfig = getMoneyAccountVaultConfig(messenger);\n const networkClientId = getNetworkClientId(messenger, CHAIN_ID_MONAD);\n const networkClient = messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n const provider = new Web3Provider(networkClient.provider);\n const { approveTx, depositTx } = await buildMoneyAccountDepositBatch({\n amount: BigInt(amountRaw),\n provider,\n ...vaultConfig,\n });\n\n return await submitMoneyAccountVaultDepositBatch({\n depositCalls: [\n { ...approveTx.params, type: approveTx.type },\n { ...depositTx.params, type: depositTx.type },\n ],\n fromBlock: blockNumber,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw: amountRaw,\n vaultDisabled: false,\n });\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Hex } from "@metamask/utils";
|
|
2
|
+
import type { TransactionPayControllerMessenger } from "../types.cjs";
|
|
3
|
+
import type { SubmitMoneyAccountVaultDepositResult } from "./ma-vault-deposit.cjs";
|
|
4
|
+
export type SubmitMoneyAccountVaultDepositRequest = {
|
|
5
|
+
moneyAccountAddress: Hex;
|
|
6
|
+
transactionHash: Hex;
|
|
7
|
+
vaultDisabled?: boolean;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Resolves an Iron payout transaction and vaults the received mUSD.
|
|
11
|
+
*
|
|
12
|
+
* @param request - Iron payout details.
|
|
13
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
14
|
+
* @returns Hash of the confirmed vault transaction, or `{ skipped: true }` when
|
|
15
|
+
* vaulting is disabled.
|
|
16
|
+
*/
|
|
17
|
+
export declare function submitMoneyAccountVaultDepositFromPayout(request: SubmitMoneyAccountVaultDepositRequest, messenger: TransactionPayControllerMessenger): Promise<SubmitMoneyAccountVaultDepositResult>;
|
|
18
|
+
//# sourceMappingURL=ma-vault-payout.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ma-vault-payout.d.cts","sourceRoot":"","sources":["../../src/utils/ma-vault-payout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAG3C,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAoB;AACrE,OAAO,KAAK,EAAE,oCAAoC,EAAE,+BAA8B;AASlF,MAAM,MAAM,qCAAqC,GAAG;IAClD,mBAAmB,EAAE,GAAG,CAAC;IACzB,eAAe,EAAE,GAAG,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAsB,wCAAwC,CAC5D,OAAO,EAAE,qCAAqC,EAC9C,SAAS,EAAE,iCAAiC,GAC3C,OAAO,CAAC,oCAAoC,CAAC,CAkD/C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Hex } from "@metamask/utils";
|
|
2
|
+
import type { TransactionPayControllerMessenger } from "../types.mjs";
|
|
3
|
+
import type { SubmitMoneyAccountVaultDepositResult } from "./ma-vault-deposit.mjs";
|
|
4
|
+
export type SubmitMoneyAccountVaultDepositRequest = {
|
|
5
|
+
moneyAccountAddress: Hex;
|
|
6
|
+
transactionHash: Hex;
|
|
7
|
+
vaultDisabled?: boolean;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Resolves an Iron payout transaction and vaults the received mUSD.
|
|
11
|
+
*
|
|
12
|
+
* @param request - Iron payout details.
|
|
13
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
14
|
+
* @returns Hash of the confirmed vault transaction, or `{ skipped: true }` when
|
|
15
|
+
* vaulting is disabled.
|
|
16
|
+
*/
|
|
17
|
+
export declare function submitMoneyAccountVaultDepositFromPayout(request: SubmitMoneyAccountVaultDepositRequest, messenger: TransactionPayControllerMessenger): Promise<SubmitMoneyAccountVaultDepositResult>;
|
|
18
|
+
//# sourceMappingURL=ma-vault-payout.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ma-vault-payout.d.mts","sourceRoot":"","sources":["../../src/utils/ma-vault-payout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAG3C,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAoB;AACrE,OAAO,KAAK,EAAE,oCAAoC,EAAE,+BAA8B;AASlF,MAAM,MAAM,qCAAqC,GAAG;IAClD,mBAAmB,EAAE,GAAG,CAAC;IACzB,eAAe,EAAE,GAAG,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAsB,wCAAwC,CAC5D,OAAO,EAAE,qCAAqC,EAC9C,SAAS,EAAE,iCAAiC,GAC3C,OAAO,CAAC,oCAAoC,CAAC,CAkD/C"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Web3Provider } from "@ethersproject/providers";
|
|
2
|
+
import { buildMoneyAccountDepositBatch } from "@metamask/money-account-utils";
|
|
3
|
+
import { CHAIN_ID_MONAD, MUSD_MONAD_ADDRESS } from "../constants.mjs";
|
|
4
|
+
import { submitMoneyAccountVaultDepositBatch } from "./ma-vault-deposit.mjs";
|
|
5
|
+
import { getMoneyAccountVaultConfig, isMoneyAccountVaultActionEnabled } from "./money-account-vault-config.mjs";
|
|
6
|
+
import { getNetworkClientId } from "./provider.mjs";
|
|
7
|
+
import { getTransferredAmountFromTxHash } from "./transaction.mjs";
|
|
8
|
+
/**
|
|
9
|
+
* Resolves an Iron payout transaction and vaults the received mUSD.
|
|
10
|
+
*
|
|
11
|
+
* @param request - Iron payout details.
|
|
12
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
13
|
+
* @returns Hash of the confirmed vault transaction, or `{ skipped: true }` when
|
|
14
|
+
* vaulting is disabled.
|
|
15
|
+
*/
|
|
16
|
+
export async function submitMoneyAccountVaultDepositFromPayout(request, messenger) {
|
|
17
|
+
const { moneyAccountAddress, transactionHash, vaultDisabled = false, } = request;
|
|
18
|
+
if (vaultDisabled ||
|
|
19
|
+
!isMoneyAccountVaultActionEnabled(messenger, 'deposit')) {
|
|
20
|
+
return { skipped: true };
|
|
21
|
+
}
|
|
22
|
+
const { amountRaw, blockNumber } = await getTransferredAmountFromTxHash({
|
|
23
|
+
chainId: CHAIN_ID_MONAD,
|
|
24
|
+
messenger,
|
|
25
|
+
tokenAddress: MUSD_MONAD_ADDRESS,
|
|
26
|
+
txHash: transactionHash,
|
|
27
|
+
walletAddress: moneyAccountAddress,
|
|
28
|
+
});
|
|
29
|
+
if (!amountRaw || BigInt(amountRaw) <= 0n) {
|
|
30
|
+
throw new Error('Payout transaction has no mUSD transfer');
|
|
31
|
+
}
|
|
32
|
+
const vaultConfig = getMoneyAccountVaultConfig(messenger);
|
|
33
|
+
const networkClientId = getNetworkClientId(messenger, CHAIN_ID_MONAD);
|
|
34
|
+
const networkClient = messenger.call('NetworkController:getNetworkClientById', networkClientId);
|
|
35
|
+
const provider = new Web3Provider(networkClient.provider);
|
|
36
|
+
const { approveTx, depositTx } = await buildMoneyAccountDepositBatch({
|
|
37
|
+
amount: BigInt(amountRaw),
|
|
38
|
+
provider,
|
|
39
|
+
...vaultConfig,
|
|
40
|
+
});
|
|
41
|
+
return await submitMoneyAccountVaultDepositBatch({
|
|
42
|
+
depositCalls: [
|
|
43
|
+
{ ...approveTx.params, type: approveTx.type },
|
|
44
|
+
{ ...depositTx.params, type: depositTx.type },
|
|
45
|
+
],
|
|
46
|
+
fromBlock: blockNumber,
|
|
47
|
+
messenger,
|
|
48
|
+
moneyAccountAddress,
|
|
49
|
+
sourceAmountRaw: amountRaw,
|
|
50
|
+
vaultDisabled: false,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=ma-vault-payout.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ma-vault-payout.mjs","sourceRoot":"","sources":["../../src/utils/ma-vault-payout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iCAAiC;AACxD,OAAO,EAAE,6BAA6B,EAAE,sCAAsC;AAG9E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,yBAAwB;AAGrE,OAAO,EAAE,mCAAmC,EAAE,+BAA8B;AAC5E,OAAO,EACL,0BAA0B,EAC1B,gCAAgC,EACjC,yCAAwC;AACzC,OAAO,EAAE,kBAAkB,EAAE,uBAAsB;AACnD,OAAO,EAAE,8BAA8B,EAAE,0BAAyB;AAQlE;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wCAAwC,CAC5D,OAA8C,EAC9C,SAA4C;IAE5C,MAAM,EACJ,mBAAmB,EACnB,eAAe,EACf,aAAa,GAAG,KAAK,GACtB,GAAG,OAAO,CAAC;IAEZ,IACE,aAAa;QACb,CAAC,gCAAgC,CAAC,SAAS,EAAE,SAAS,CAAC,EACvD,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,8BAA8B,CAAC;QACtE,OAAO,EAAE,cAAc;QACvB,SAAS;QACT,YAAY,EAAE,kBAAkB;QAChC,MAAM,EAAE,eAAe;QACvB,aAAa,EAAE,mBAAmB;KACnC,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,WAAW,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,kBAAkB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAClC,wCAAwC,EACxC,eAAe,CAChB,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,6BAA6B,CAAC;QACnE,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC;QACzB,QAAQ;QACR,GAAG,WAAW;KACf,CAAC,CAAC;IAEH,OAAO,MAAM,mCAAmC,CAAC;QAC/C,YAAY,EAAE;YACZ,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE;YAC7C,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE;SAC9C;QACD,SAAS,EAAE,WAAW;QACtB,SAAS;QACT,mBAAmB;QACnB,eAAe,EAAE,SAAS;QAC1B,aAAa,EAAE,KAAK;KACrB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { Web3Provider } from '@ethersproject/providers';\nimport { buildMoneyAccountDepositBatch } from '@metamask/money-account-utils';\nimport type { Hex } from '@metamask/utils';\n\nimport { CHAIN_ID_MONAD, MUSD_MONAD_ADDRESS } from '../constants.js';\nimport type { TransactionPayControllerMessenger } from '../types.js';\nimport type { SubmitMoneyAccountVaultDepositResult } from './ma-vault-deposit.js';\nimport { submitMoneyAccountVaultDepositBatch } from './ma-vault-deposit.js';\nimport {\n getMoneyAccountVaultConfig,\n isMoneyAccountVaultActionEnabled,\n} from './money-account-vault-config.js';\nimport { getNetworkClientId } from './provider.js';\nimport { getTransferredAmountFromTxHash } from './transaction.js';\n\nexport type SubmitMoneyAccountVaultDepositRequest = {\n moneyAccountAddress: Hex;\n transactionHash: Hex;\n vaultDisabled?: boolean;\n};\n\n/**\n * Resolves an Iron payout transaction and vaults the received mUSD.\n *\n * @param request - Iron payout details.\n * @param messenger - Transaction Pay controller messenger.\n * @returns Hash of the confirmed vault transaction, or `{ skipped: true }` when\n * vaulting is disabled.\n */\nexport async function submitMoneyAccountVaultDepositFromPayout(\n request: SubmitMoneyAccountVaultDepositRequest,\n messenger: TransactionPayControllerMessenger,\n): Promise<SubmitMoneyAccountVaultDepositResult> {\n const {\n moneyAccountAddress,\n transactionHash,\n vaultDisabled = false,\n } = request;\n\n if (\n vaultDisabled ||\n !isMoneyAccountVaultActionEnabled(messenger, 'deposit')\n ) {\n return { skipped: true };\n }\n\n const { amountRaw, blockNumber } = await getTransferredAmountFromTxHash({\n chainId: CHAIN_ID_MONAD,\n messenger,\n tokenAddress: MUSD_MONAD_ADDRESS,\n txHash: transactionHash,\n walletAddress: moneyAccountAddress,\n });\n\n if (!amountRaw || BigInt(amountRaw) <= 0n) {\n throw new Error('Payout transaction has no mUSD transfer');\n }\n\n const vaultConfig = getMoneyAccountVaultConfig(messenger);\n const networkClientId = getNetworkClientId(messenger, CHAIN_ID_MONAD);\n const networkClient = messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n const provider = new Web3Provider(networkClient.provider);\n const { approveTx, depositTx } = await buildMoneyAccountDepositBatch({\n amount: BigInt(amountRaw),\n provider,\n ...vaultConfig,\n });\n\n return await submitMoneyAccountVaultDepositBatch({\n depositCalls: [\n { ...approveTx.params, type: approveTx.type },\n { ...depositTx.params, type: depositTx.type },\n ],\n fromBlock: blockNumber,\n messenger,\n moneyAccountAddress,\n sourceAmountRaw: amountRaw,\n vaultDisabled: false,\n });\n}\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.submitMoneyAccountVaultWithdraw = void 0;
|
|
4
|
+
const providers_1 = require("@ethersproject/providers");
|
|
5
|
+
const controller_utils_1 = require("@metamask/controller-utils");
|
|
6
|
+
const money_account_utils_1 = require("@metamask/money-account-utils");
|
|
7
|
+
const utils_1 = require("@metamask/utils");
|
|
8
|
+
const constants_js_1 = require("../constants.cjs");
|
|
9
|
+
const money_account_vault_config_js_1 = require("./money-account-vault-config.cjs");
|
|
10
|
+
const provider_js_1 = require("./provider.cjs");
|
|
11
|
+
/**
|
|
12
|
+
* Creates a user-confirmed atomic vmUSD withdrawal and mUSD transfer to Iron.
|
|
13
|
+
*
|
|
14
|
+
* @param request - Exact-out withdraw intent.
|
|
15
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
16
|
+
* @returns The pending transaction batch ID.
|
|
17
|
+
*/
|
|
18
|
+
async function submitMoneyAccountVaultWithdraw(request, messenger) {
|
|
19
|
+
validateRequest(request);
|
|
20
|
+
if (!(0, money_account_vault_config_js_1.isMoneyAccountVaultActionEnabled)(messenger, 'withdraw')) {
|
|
21
|
+
throw new Error('Money Account vault withdrawal is disabled');
|
|
22
|
+
}
|
|
23
|
+
const amount = BigInt(request.amountInRaw);
|
|
24
|
+
const balance = await messenger.call('MoneyAccountBalanceService:getMoneyAccountBalance', request.moneyAccountAddress);
|
|
25
|
+
if (amount > BigInt(balance.vmusdValueInMusd)) {
|
|
26
|
+
throw new Error('Insufficient withdrawable vmUSD balance');
|
|
27
|
+
}
|
|
28
|
+
const vaultConfig = (0, money_account_vault_config_js_1.getMoneyAccountVaultConfig)(messenger);
|
|
29
|
+
const networkClientId = (0, provider_js_1.getNetworkClientId)(messenger, constants_js_1.CHAIN_ID_MONAD);
|
|
30
|
+
const networkClient = messenger.call('NetworkController:getNetworkClientById', networkClientId);
|
|
31
|
+
const provider = new providers_1.Web3Provider(networkClient.provider);
|
|
32
|
+
const { withdrawTx, transferTx } = await (0, money_account_utils_1.buildMoneyAccountWithdrawBatch)({
|
|
33
|
+
accountantAddress: vaultConfig.accountantAddress,
|
|
34
|
+
amount,
|
|
35
|
+
chainId: constants_js_1.CHAIN_ID_MONAD,
|
|
36
|
+
moneyAccountAddress: request.moneyAccountAddress,
|
|
37
|
+
provider,
|
|
38
|
+
recipient: request.recipient,
|
|
39
|
+
tellerAddress: vaultConfig.tellerAddress,
|
|
40
|
+
});
|
|
41
|
+
return await messenger.call('TransactionController:addTransactionBatch', {
|
|
42
|
+
atomic: true,
|
|
43
|
+
disableHook: true,
|
|
44
|
+
disableSequential: true,
|
|
45
|
+
disableUpgrade: true,
|
|
46
|
+
from: request.moneyAccountAddress,
|
|
47
|
+
isGasFeeSponsored: true,
|
|
48
|
+
isInternal: true,
|
|
49
|
+
networkClientId,
|
|
50
|
+
origin: controller_utils_1.ORIGIN_METAMASK,
|
|
51
|
+
requestId: request.requestId,
|
|
52
|
+
requireApproval: true,
|
|
53
|
+
skipInitialGasEstimate: true,
|
|
54
|
+
transactions: [withdrawTx, transferTx],
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
exports.submitMoneyAccountVaultWithdraw = submitMoneyAccountVaultWithdraw;
|
|
58
|
+
function validateRequest(request) {
|
|
59
|
+
if (!request.requestId) {
|
|
60
|
+
throw new Error('Missing withdraw request id');
|
|
61
|
+
}
|
|
62
|
+
let amount;
|
|
63
|
+
try {
|
|
64
|
+
amount = BigInt(request.amountInRaw);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
throw new Error('Withdrawal amount must be greater than zero');
|
|
68
|
+
}
|
|
69
|
+
if (amount <= 0n) {
|
|
70
|
+
throw new Error('Withdrawal amount must be greater than zero');
|
|
71
|
+
}
|
|
72
|
+
if (!(0, utils_1.isValidHexAddress)(request.recipient)) {
|
|
73
|
+
throw new Error('Iron recipient is invalid');
|
|
74
|
+
}
|
|
75
|
+
if (request.recipient.toLowerCase() ===
|
|
76
|
+
request.moneyAccountAddress.toLowerCase()) {
|
|
77
|
+
throw new Error('Iron recipient must differ from the Money Account');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=ma-vault-withdraw.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ma-vault-withdraw.cjs","sourceRoot":"","sources":["../../src/utils/ma-vault-withdraw.ts"],"names":[],"mappings":"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","sourcesContent":["import { Web3Provider } from '@ethersproject/providers';\nimport { ORIGIN_METAMASK } from '@metamask/controller-utils';\nimport { buildMoneyAccountWithdrawBatch } from '@metamask/money-account-utils';\nimport type { TransactionBatchResult } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { isValidHexAddress } from '@metamask/utils';\n\nimport { CHAIN_ID_MONAD } from '../constants.js';\nimport type { TransactionPayControllerMessenger } from '../types.js';\nimport {\n getMoneyAccountVaultConfig,\n isMoneyAccountVaultActionEnabled,\n} from './money-account-vault-config.js';\nimport { getNetworkClientId } from './provider.js';\n\n/**\n * On-chain withdraw intent. Quote / Pix / Iron identifiers stay outside Core;\n * Monad and mUSD are fixed by the Money Account vault config constants.\n */\nexport type SubmitMoneyAccountVaultWithdrawRequest = {\n amountInRaw: string;\n moneyAccountAddress: Hex;\n recipient: Hex;\n requestId: string;\n};\n\n/**\n * Creates a user-confirmed atomic vmUSD withdrawal and mUSD transfer to Iron.\n *\n * @param request - Exact-out withdraw intent.\n * @param messenger - Transaction Pay controller messenger.\n * @returns The pending transaction batch ID.\n */\nexport async function submitMoneyAccountVaultWithdraw(\n request: SubmitMoneyAccountVaultWithdrawRequest,\n messenger: TransactionPayControllerMessenger,\n): Promise<TransactionBatchResult> {\n validateRequest(request);\n\n if (!isMoneyAccountVaultActionEnabled(messenger, 'withdraw')) {\n throw new Error('Money Account vault withdrawal is disabled');\n }\n\n const amount = BigInt(request.amountInRaw);\n const balance = await messenger.call(\n 'MoneyAccountBalanceService:getMoneyAccountBalance',\n request.moneyAccountAddress,\n );\n\n if (amount > BigInt(balance.vmusdValueInMusd)) {\n throw new Error('Insufficient withdrawable vmUSD balance');\n }\n\n const vaultConfig = getMoneyAccountVaultConfig(messenger);\n const networkClientId = getNetworkClientId(messenger, CHAIN_ID_MONAD);\n const networkClient = messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n const provider = new Web3Provider(networkClient.provider);\n const { withdrawTx, transferTx } = await buildMoneyAccountWithdrawBatch({\n accountantAddress: vaultConfig.accountantAddress,\n amount,\n chainId: CHAIN_ID_MONAD,\n moneyAccountAddress: request.moneyAccountAddress,\n provider,\n recipient: request.recipient,\n tellerAddress: vaultConfig.tellerAddress,\n });\n\n return await messenger.call('TransactionController:addTransactionBatch', {\n atomic: true,\n disableHook: true,\n disableSequential: true,\n disableUpgrade: true,\n from: request.moneyAccountAddress,\n isGasFeeSponsored: true,\n isInternal: true,\n networkClientId,\n origin: ORIGIN_METAMASK,\n requestId: request.requestId,\n requireApproval: true,\n skipInitialGasEstimate: true,\n transactions: [withdrawTx, transferTx],\n });\n}\n\nfunction validateRequest(\n request: SubmitMoneyAccountVaultWithdrawRequest,\n): void {\n if (!request.requestId) {\n throw new Error('Missing withdraw request id');\n }\n\n let amount: bigint;\n try {\n amount = BigInt(request.amountInRaw);\n } catch {\n throw new Error('Withdrawal amount must be greater than zero');\n }\n\n if (amount <= 0n) {\n throw new Error('Withdrawal amount must be greater than zero');\n }\n\n if (!isValidHexAddress(request.recipient)) {\n throw new Error('Iron recipient is invalid');\n }\n if (\n request.recipient.toLowerCase() ===\n request.moneyAccountAddress.toLowerCase()\n ) {\n throw new Error('Iron recipient must differ from the Money Account');\n }\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { TransactionBatchResult } from "@metamask/transaction-controller";
|
|
2
|
+
import type { Hex } from "@metamask/utils";
|
|
3
|
+
import type { TransactionPayControllerMessenger } from "../types.cjs";
|
|
4
|
+
/**
|
|
5
|
+
* On-chain withdraw intent. Quote / Pix / Iron identifiers stay outside Core;
|
|
6
|
+
* Monad and mUSD are fixed by the Money Account vault config constants.
|
|
7
|
+
*/
|
|
8
|
+
export type SubmitMoneyAccountVaultWithdrawRequest = {
|
|
9
|
+
amountInRaw: string;
|
|
10
|
+
moneyAccountAddress: Hex;
|
|
11
|
+
recipient: Hex;
|
|
12
|
+
requestId: string;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Creates a user-confirmed atomic vmUSD withdrawal and mUSD transfer to Iron.
|
|
16
|
+
*
|
|
17
|
+
* @param request - Exact-out withdraw intent.
|
|
18
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
19
|
+
* @returns The pending transaction batch ID.
|
|
20
|
+
*/
|
|
21
|
+
export declare function submitMoneyAccountVaultWithdraw(request: SubmitMoneyAccountVaultWithdrawRequest, messenger: TransactionPayControllerMessenger): Promise<TransactionBatchResult>;
|
|
22
|
+
//# sourceMappingURL=ma-vault-withdraw.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ma-vault-withdraw.d.cts","sourceRoot":"","sources":["../../src/utils/ma-vault-withdraw.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,yCAAyC;AAC/E,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAoB;AAOrE;;;GAGG;AACH,MAAM,MAAM,sCAAsC,GAAG;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,GAAG,CAAC;IACzB,SAAS,EAAE,GAAG,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,sCAAsC,EAC/C,SAAS,EAAE,iCAAiC,GAC3C,OAAO,CAAC,sBAAsB,CAAC,CAiDjC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { TransactionBatchResult } from "@metamask/transaction-controller";
|
|
2
|
+
import type { Hex } from "@metamask/utils";
|
|
3
|
+
import type { TransactionPayControllerMessenger } from "../types.mjs";
|
|
4
|
+
/**
|
|
5
|
+
* On-chain withdraw intent. Quote / Pix / Iron identifiers stay outside Core;
|
|
6
|
+
* Monad and mUSD are fixed by the Money Account vault config constants.
|
|
7
|
+
*/
|
|
8
|
+
export type SubmitMoneyAccountVaultWithdrawRequest = {
|
|
9
|
+
amountInRaw: string;
|
|
10
|
+
moneyAccountAddress: Hex;
|
|
11
|
+
recipient: Hex;
|
|
12
|
+
requestId: string;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Creates a user-confirmed atomic vmUSD withdrawal and mUSD transfer to Iron.
|
|
16
|
+
*
|
|
17
|
+
* @param request - Exact-out withdraw intent.
|
|
18
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
19
|
+
* @returns The pending transaction batch ID.
|
|
20
|
+
*/
|
|
21
|
+
export declare function submitMoneyAccountVaultWithdraw(request: SubmitMoneyAccountVaultWithdrawRequest, messenger: TransactionPayControllerMessenger): Promise<TransactionBatchResult>;
|
|
22
|
+
//# sourceMappingURL=ma-vault-withdraw.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ma-vault-withdraw.d.mts","sourceRoot":"","sources":["../../src/utils/ma-vault-withdraw.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,yCAAyC;AAC/E,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAoB;AAOrE;;;GAGG;AACH,MAAM,MAAM,sCAAsC,GAAG;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,GAAG,CAAC;IACzB,SAAS,EAAE,GAAG,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,sCAAsC,EAC/C,SAAS,EAAE,iCAAiC,GAC3C,OAAO,CAAC,sBAAsB,CAAC,CAiDjC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Web3Provider } from "@ethersproject/providers";
|
|
2
|
+
import { ORIGIN_METAMASK } from "@metamask/controller-utils";
|
|
3
|
+
import { buildMoneyAccountWithdrawBatch } from "@metamask/money-account-utils";
|
|
4
|
+
import { isValidHexAddress } from "@metamask/utils";
|
|
5
|
+
import { CHAIN_ID_MONAD } from "../constants.mjs";
|
|
6
|
+
import { getMoneyAccountVaultConfig, isMoneyAccountVaultActionEnabled } from "./money-account-vault-config.mjs";
|
|
7
|
+
import { getNetworkClientId } from "./provider.mjs";
|
|
8
|
+
/**
|
|
9
|
+
* Creates a user-confirmed atomic vmUSD withdrawal and mUSD transfer to Iron.
|
|
10
|
+
*
|
|
11
|
+
* @param request - Exact-out withdraw intent.
|
|
12
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
13
|
+
* @returns The pending transaction batch ID.
|
|
14
|
+
*/
|
|
15
|
+
export async function submitMoneyAccountVaultWithdraw(request, messenger) {
|
|
16
|
+
validateRequest(request);
|
|
17
|
+
if (!isMoneyAccountVaultActionEnabled(messenger, 'withdraw')) {
|
|
18
|
+
throw new Error('Money Account vault withdrawal is disabled');
|
|
19
|
+
}
|
|
20
|
+
const amount = BigInt(request.amountInRaw);
|
|
21
|
+
const balance = await messenger.call('MoneyAccountBalanceService:getMoneyAccountBalance', request.moneyAccountAddress);
|
|
22
|
+
if (amount > BigInt(balance.vmusdValueInMusd)) {
|
|
23
|
+
throw new Error('Insufficient withdrawable vmUSD balance');
|
|
24
|
+
}
|
|
25
|
+
const vaultConfig = getMoneyAccountVaultConfig(messenger);
|
|
26
|
+
const networkClientId = getNetworkClientId(messenger, CHAIN_ID_MONAD);
|
|
27
|
+
const networkClient = messenger.call('NetworkController:getNetworkClientById', networkClientId);
|
|
28
|
+
const provider = new Web3Provider(networkClient.provider);
|
|
29
|
+
const { withdrawTx, transferTx } = await buildMoneyAccountWithdrawBatch({
|
|
30
|
+
accountantAddress: vaultConfig.accountantAddress,
|
|
31
|
+
amount,
|
|
32
|
+
chainId: CHAIN_ID_MONAD,
|
|
33
|
+
moneyAccountAddress: request.moneyAccountAddress,
|
|
34
|
+
provider,
|
|
35
|
+
recipient: request.recipient,
|
|
36
|
+
tellerAddress: vaultConfig.tellerAddress,
|
|
37
|
+
});
|
|
38
|
+
return await messenger.call('TransactionController:addTransactionBatch', {
|
|
39
|
+
atomic: true,
|
|
40
|
+
disableHook: true,
|
|
41
|
+
disableSequential: true,
|
|
42
|
+
disableUpgrade: true,
|
|
43
|
+
from: request.moneyAccountAddress,
|
|
44
|
+
isGasFeeSponsored: true,
|
|
45
|
+
isInternal: true,
|
|
46
|
+
networkClientId,
|
|
47
|
+
origin: ORIGIN_METAMASK,
|
|
48
|
+
requestId: request.requestId,
|
|
49
|
+
requireApproval: true,
|
|
50
|
+
skipInitialGasEstimate: true,
|
|
51
|
+
transactions: [withdrawTx, transferTx],
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function validateRequest(request) {
|
|
55
|
+
if (!request.requestId) {
|
|
56
|
+
throw new Error('Missing withdraw request id');
|
|
57
|
+
}
|
|
58
|
+
let amount;
|
|
59
|
+
try {
|
|
60
|
+
amount = BigInt(request.amountInRaw);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
throw new Error('Withdrawal amount must be greater than zero');
|
|
64
|
+
}
|
|
65
|
+
if (amount <= 0n) {
|
|
66
|
+
throw new Error('Withdrawal amount must be greater than zero');
|
|
67
|
+
}
|
|
68
|
+
if (!isValidHexAddress(request.recipient)) {
|
|
69
|
+
throw new Error('Iron recipient is invalid');
|
|
70
|
+
}
|
|
71
|
+
if (request.recipient.toLowerCase() ===
|
|
72
|
+
request.moneyAccountAddress.toLowerCase()) {
|
|
73
|
+
throw new Error('Iron recipient must differ from the Money Account');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=ma-vault-withdraw.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ma-vault-withdraw.mjs","sourceRoot":"","sources":["../../src/utils/ma-vault-withdraw.ts"],"names":[],"mappings":"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","sourcesContent":["import { Web3Provider } from '@ethersproject/providers';\nimport { ORIGIN_METAMASK } from '@metamask/controller-utils';\nimport { buildMoneyAccountWithdrawBatch } from '@metamask/money-account-utils';\nimport type { TransactionBatchResult } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { isValidHexAddress } from '@metamask/utils';\n\nimport { CHAIN_ID_MONAD } from '../constants.js';\nimport type { TransactionPayControllerMessenger } from '../types.js';\nimport {\n getMoneyAccountVaultConfig,\n isMoneyAccountVaultActionEnabled,\n} from './money-account-vault-config.js';\nimport { getNetworkClientId } from './provider.js';\n\n/**\n * On-chain withdraw intent. Quote / Pix / Iron identifiers stay outside Core;\n * Monad and mUSD are fixed by the Money Account vault config constants.\n */\nexport type SubmitMoneyAccountVaultWithdrawRequest = {\n amountInRaw: string;\n moneyAccountAddress: Hex;\n recipient: Hex;\n requestId: string;\n};\n\n/**\n * Creates a user-confirmed atomic vmUSD withdrawal and mUSD transfer to Iron.\n *\n * @param request - Exact-out withdraw intent.\n * @param messenger - Transaction Pay controller messenger.\n * @returns The pending transaction batch ID.\n */\nexport async function submitMoneyAccountVaultWithdraw(\n request: SubmitMoneyAccountVaultWithdrawRequest,\n messenger: TransactionPayControllerMessenger,\n): Promise<TransactionBatchResult> {\n validateRequest(request);\n\n if (!isMoneyAccountVaultActionEnabled(messenger, 'withdraw')) {\n throw new Error('Money Account vault withdrawal is disabled');\n }\n\n const amount = BigInt(request.amountInRaw);\n const balance = await messenger.call(\n 'MoneyAccountBalanceService:getMoneyAccountBalance',\n request.moneyAccountAddress,\n );\n\n if (amount > BigInt(balance.vmusdValueInMusd)) {\n throw new Error('Insufficient withdrawable vmUSD balance');\n }\n\n const vaultConfig = getMoneyAccountVaultConfig(messenger);\n const networkClientId = getNetworkClientId(messenger, CHAIN_ID_MONAD);\n const networkClient = messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n const provider = new Web3Provider(networkClient.provider);\n const { withdrawTx, transferTx } = await buildMoneyAccountWithdrawBatch({\n accountantAddress: vaultConfig.accountantAddress,\n amount,\n chainId: CHAIN_ID_MONAD,\n moneyAccountAddress: request.moneyAccountAddress,\n provider,\n recipient: request.recipient,\n tellerAddress: vaultConfig.tellerAddress,\n });\n\n return await messenger.call('TransactionController:addTransactionBatch', {\n atomic: true,\n disableHook: true,\n disableSequential: true,\n disableUpgrade: true,\n from: request.moneyAccountAddress,\n isGasFeeSponsored: true,\n isInternal: true,\n networkClientId,\n origin: ORIGIN_METAMASK,\n requestId: request.requestId,\n requireApproval: true,\n skipInitialGasEstimate: true,\n transactions: [withdrawTx, transferTx],\n });\n}\n\nfunction validateRequest(\n request: SubmitMoneyAccountVaultWithdrawRequest,\n): void {\n if (!request.requestId) {\n throw new Error('Missing withdraw request id');\n }\n\n let amount: bigint;\n try {\n amount = BigInt(request.amountInRaw);\n } catch {\n throw new Error('Withdrawal amount must be greater than zero');\n }\n\n if (amount <= 0n) {\n throw new Error('Withdrawal amount must be greater than zero');\n }\n\n if (!isValidHexAddress(request.recipient)) {\n throw new Error('Iron recipient is invalid');\n }\n if (\n request.recipient.toLowerCase() ===\n request.moneyAccountAddress.toLowerCase()\n ) {\n throw new Error('Iron recipient must differ from the Money Account');\n }\n}\n"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isMoneyAccountVaultActionEnabled = exports.getMoneyAccountVaultConfig = void 0;
|
|
4
|
+
const utils_1 = require("@metamask/utils");
|
|
5
|
+
const constants_js_1 = require("../constants.cjs");
|
|
6
|
+
const VAULT_CONFIG_FLAG = 'moneyAccountVaultConfig';
|
|
7
|
+
const REQUIRED_ADDRESS_KEYS = [
|
|
8
|
+
'boringVault',
|
|
9
|
+
'tellerAddress',
|
|
10
|
+
'accountantAddress',
|
|
11
|
+
'lensAddress',
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Reads and validates the Money Account vault configuration.
|
|
15
|
+
*
|
|
16
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
17
|
+
* @returns Validated Monad vault configuration.
|
|
18
|
+
*/
|
|
19
|
+
function getMoneyAccountVaultConfig(messenger) {
|
|
20
|
+
const state = messenger.call('RemoteFeatureFlagController:getState');
|
|
21
|
+
const value = state.remoteFeatureFlags?.[VAULT_CONFIG_FLAG];
|
|
22
|
+
if (value === undefined) {
|
|
23
|
+
throw new Error('Money Account vault config is unavailable');
|
|
24
|
+
}
|
|
25
|
+
if (!isVaultConfig(value)) {
|
|
26
|
+
throw new Error('Money Account vault config is invalid');
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
exports.getMoneyAccountVaultConfig = getMoneyAccountVaultConfig;
|
|
31
|
+
/**
|
|
32
|
+
* Returns whether the requested Money Account vault action is enabled.
|
|
33
|
+
*
|
|
34
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
35
|
+
* @param action - Vault action to inspect.
|
|
36
|
+
* @returns Whether the remote feature flag explicitly enables the action.
|
|
37
|
+
*/
|
|
38
|
+
function isMoneyAccountVaultActionEnabled(messenger, action) {
|
|
39
|
+
const state = messenger.call('RemoteFeatureFlagController:getState');
|
|
40
|
+
const value = state.remoteFeatureFlags?.moneyAccount;
|
|
41
|
+
if (!value || Array.isArray(value) || typeof value !== 'object') {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const key = action === 'deposit'
|
|
45
|
+
? 'moneyAccountDepositEnabled'
|
|
46
|
+
: 'moneyAccountWithdrawEnabled';
|
|
47
|
+
return value[key] === true;
|
|
48
|
+
}
|
|
49
|
+
exports.isMoneyAccountVaultActionEnabled = isMoneyAccountVaultActionEnabled;
|
|
50
|
+
function isVaultConfig(value) {
|
|
51
|
+
if (!value ||
|
|
52
|
+
Array.isArray(value) ||
|
|
53
|
+
typeof value !== 'object' ||
|
|
54
|
+
value.chainId !== constants_js_1.CHAIN_ID_MONAD) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return REQUIRED_ADDRESS_KEYS.every((key) => {
|
|
58
|
+
const address = value[key];
|
|
59
|
+
return typeof address === 'string' && (0, utils_1.isValidHexAddress)(address);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=money-account-vault-config.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"money-account-vault-config.cjs","sourceRoot":"","sources":["../../src/utils/money-account-vault-config.ts"],"names":[],"mappings":";;;AACA,2CAAoD;AAEpD,mDAAiD;AAGjD,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AACpD,MAAM,qBAAqB,GAAG;IAC5B,aAAa;IACb,eAAe;IACf,mBAAmB;IACnB,aAAa;CACL,CAAC;AAYX;;;;;GAKG;AACH,SAAgB,0BAA0B,CACxC,SAA4C;IAE5C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,kBAAkB,EAAE,CAAC,iBAAiB,CAAC,CAAC;IAE5D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAfD,gEAeC;AAED;;;;;;GAMG;AACH,SAAgB,gCAAgC,CAC9C,SAA4C,EAC5C,MAA+B;IAE/B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,kBAAkB,EAAE,YAAY,CAAC;IACrD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GACP,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,4BAA4B;QAC9B,CAAC,CAAC,6BAA6B,CAAC;IACpC,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AAC7B,CAAC;AAfD,4EAeC;AAED,SAAS,aAAa,CAAC,KAAW;IAChC,IACE,CAAC,KAAK;QACN,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACpB,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,OAAO,KAAK,6BAAc,EAChC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,IAAA,yBAAiB,EAAC,OAAc,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Hex, Json } from '@metamask/utils';\nimport { isValidHexAddress } from '@metamask/utils';\n\nimport { CHAIN_ID_MONAD } from '../constants.js';\nimport type { TransactionPayControllerMessenger } from '../types.js';\n\nconst VAULT_CONFIG_FLAG = 'moneyAccountVaultConfig';\nconst REQUIRED_ADDRESS_KEYS = [\n 'boringVault',\n 'tellerAddress',\n 'accountantAddress',\n 'lensAddress',\n] as const;\n\ntype MoneyAccountVaultAction = 'deposit' | 'withdraw';\n\nexport type MoneyAccountVaultConfig = {\n accountantAddress: Hex;\n boringVault: Hex;\n chainId: Hex;\n lensAddress: Hex;\n tellerAddress: Hex;\n};\n\n/**\n * Reads and validates the Money Account vault configuration.\n *\n * @param messenger - Transaction Pay controller messenger.\n * @returns Validated Monad vault configuration.\n */\nexport function getMoneyAccountVaultConfig(\n messenger: TransactionPayControllerMessenger,\n): MoneyAccountVaultConfig {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const value = state.remoteFeatureFlags?.[VAULT_CONFIG_FLAG];\n\n if (value === undefined) {\n throw new Error('Money Account vault config is unavailable');\n }\n\n if (!isVaultConfig(value)) {\n throw new Error('Money Account vault config is invalid');\n }\n\n return value;\n}\n\n/**\n * Returns whether the requested Money Account vault action is enabled.\n *\n * @param messenger - Transaction Pay controller messenger.\n * @param action - Vault action to inspect.\n * @returns Whether the remote feature flag explicitly enables the action.\n */\nexport function isMoneyAccountVaultActionEnabled(\n messenger: TransactionPayControllerMessenger,\n action: MoneyAccountVaultAction,\n): boolean {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const value = state.remoteFeatureFlags?.moneyAccount;\n if (!value || Array.isArray(value) || typeof value !== 'object') {\n return false;\n }\n\n const key =\n action === 'deposit'\n ? 'moneyAccountDepositEnabled'\n : 'moneyAccountWithdrawEnabled';\n return value[key] === true;\n}\n\nfunction isVaultConfig(value: Json): value is Json & MoneyAccountVaultConfig {\n if (\n !value ||\n Array.isArray(value) ||\n typeof value !== 'object' ||\n value.chainId !== CHAIN_ID_MONAD\n ) {\n return false;\n }\n\n return REQUIRED_ADDRESS_KEYS.every((key) => {\n const address = value[key];\n return typeof address === 'string' && isValidHexAddress(address as Hex);\n });\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Hex } from "@metamask/utils";
|
|
2
|
+
import type { TransactionPayControllerMessenger } from "../types.cjs";
|
|
3
|
+
type MoneyAccountVaultAction = 'deposit' | 'withdraw';
|
|
4
|
+
export type MoneyAccountVaultConfig = {
|
|
5
|
+
accountantAddress: Hex;
|
|
6
|
+
boringVault: Hex;
|
|
7
|
+
chainId: Hex;
|
|
8
|
+
lensAddress: Hex;
|
|
9
|
+
tellerAddress: Hex;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Reads and validates the Money Account vault configuration.
|
|
13
|
+
*
|
|
14
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
15
|
+
* @returns Validated Monad vault configuration.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getMoneyAccountVaultConfig(messenger: TransactionPayControllerMessenger): MoneyAccountVaultConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Returns whether the requested Money Account vault action is enabled.
|
|
20
|
+
*
|
|
21
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
22
|
+
* @param action - Vault action to inspect.
|
|
23
|
+
* @returns Whether the remote feature flag explicitly enables the action.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isMoneyAccountVaultActionEnabled(messenger: TransactionPayControllerMessenger, action: MoneyAccountVaultAction): boolean;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=money-account-vault-config.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"money-account-vault-config.d.cts","sourceRoot":"","sources":["../../src/utils/money-account-vault-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAQ,wBAAwB;AAIjD,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAoB;AAUrE,KAAK,uBAAuB,GAAG,SAAS,GAAG,UAAU,CAAC;AAEtD,MAAM,MAAM,uBAAuB,GAAG;IACpC,iBAAiB,EAAE,GAAG,CAAC;IACvB,WAAW,EAAE,GAAG,CAAC;IACjB,OAAO,EAAE,GAAG,CAAC;IACb,WAAW,EAAE,GAAG,CAAC;IACjB,aAAa,EAAE,GAAG,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,iCAAiC,GAC3C,uBAAuB,CAazB;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,iCAAiC,EAC5C,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAYT"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Hex } from "@metamask/utils";
|
|
2
|
+
import type { TransactionPayControllerMessenger } from "../types.mjs";
|
|
3
|
+
type MoneyAccountVaultAction = 'deposit' | 'withdraw';
|
|
4
|
+
export type MoneyAccountVaultConfig = {
|
|
5
|
+
accountantAddress: Hex;
|
|
6
|
+
boringVault: Hex;
|
|
7
|
+
chainId: Hex;
|
|
8
|
+
lensAddress: Hex;
|
|
9
|
+
tellerAddress: Hex;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Reads and validates the Money Account vault configuration.
|
|
13
|
+
*
|
|
14
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
15
|
+
* @returns Validated Monad vault configuration.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getMoneyAccountVaultConfig(messenger: TransactionPayControllerMessenger): MoneyAccountVaultConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Returns whether the requested Money Account vault action is enabled.
|
|
20
|
+
*
|
|
21
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
22
|
+
* @param action - Vault action to inspect.
|
|
23
|
+
* @returns Whether the remote feature flag explicitly enables the action.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isMoneyAccountVaultActionEnabled(messenger: TransactionPayControllerMessenger, action: MoneyAccountVaultAction): boolean;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=money-account-vault-config.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"money-account-vault-config.d.mts","sourceRoot":"","sources":["../../src/utils/money-account-vault-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAQ,wBAAwB;AAIjD,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAoB;AAUrE,KAAK,uBAAuB,GAAG,SAAS,GAAG,UAAU,CAAC;AAEtD,MAAM,MAAM,uBAAuB,GAAG;IACpC,iBAAiB,EAAE,GAAG,CAAC;IACvB,WAAW,EAAE,GAAG,CAAC;IACjB,OAAO,EAAE,GAAG,CAAC;IACb,WAAW,EAAE,GAAG,CAAC;IACjB,aAAa,EAAE,GAAG,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,iCAAiC,GAC3C,uBAAuB,CAazB;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,iCAAiC,EAC5C,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAYT"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { isValidHexAddress } from "@metamask/utils";
|
|
2
|
+
import { CHAIN_ID_MONAD } from "../constants.mjs";
|
|
3
|
+
const VAULT_CONFIG_FLAG = 'moneyAccountVaultConfig';
|
|
4
|
+
const REQUIRED_ADDRESS_KEYS = [
|
|
5
|
+
'boringVault',
|
|
6
|
+
'tellerAddress',
|
|
7
|
+
'accountantAddress',
|
|
8
|
+
'lensAddress',
|
|
9
|
+
];
|
|
10
|
+
/**
|
|
11
|
+
* Reads and validates the Money Account vault configuration.
|
|
12
|
+
*
|
|
13
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
14
|
+
* @returns Validated Monad vault configuration.
|
|
15
|
+
*/
|
|
16
|
+
export function getMoneyAccountVaultConfig(messenger) {
|
|
17
|
+
const state = messenger.call('RemoteFeatureFlagController:getState');
|
|
18
|
+
const value = state.remoteFeatureFlags?.[VAULT_CONFIG_FLAG];
|
|
19
|
+
if (value === undefined) {
|
|
20
|
+
throw new Error('Money Account vault config is unavailable');
|
|
21
|
+
}
|
|
22
|
+
if (!isVaultConfig(value)) {
|
|
23
|
+
throw new Error('Money Account vault config is invalid');
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Returns whether the requested Money Account vault action is enabled.
|
|
29
|
+
*
|
|
30
|
+
* @param messenger - Transaction Pay controller messenger.
|
|
31
|
+
* @param action - Vault action to inspect.
|
|
32
|
+
* @returns Whether the remote feature flag explicitly enables the action.
|
|
33
|
+
*/
|
|
34
|
+
export function isMoneyAccountVaultActionEnabled(messenger, action) {
|
|
35
|
+
const state = messenger.call('RemoteFeatureFlagController:getState');
|
|
36
|
+
const value = state.remoteFeatureFlags?.moneyAccount;
|
|
37
|
+
if (!value || Array.isArray(value) || typeof value !== 'object') {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
const key = action === 'deposit'
|
|
41
|
+
? 'moneyAccountDepositEnabled'
|
|
42
|
+
: 'moneyAccountWithdrawEnabled';
|
|
43
|
+
return value[key] === true;
|
|
44
|
+
}
|
|
45
|
+
function isVaultConfig(value) {
|
|
46
|
+
if (!value ||
|
|
47
|
+
Array.isArray(value) ||
|
|
48
|
+
typeof value !== 'object' ||
|
|
49
|
+
value.chainId !== CHAIN_ID_MONAD) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
return REQUIRED_ADDRESS_KEYS.every((key) => {
|
|
53
|
+
const address = value[key];
|
|
54
|
+
return typeof address === 'string' && isValidHexAddress(address);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=money-account-vault-config.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"money-account-vault-config.mjs","sourceRoot":"","sources":["../../src/utils/money-account-vault-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,wBAAwB;AAEpD,OAAO,EAAE,cAAc,EAAE,yBAAwB;AAGjD,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AACpD,MAAM,qBAAqB,GAAG;IAC5B,aAAa;IACb,eAAe;IACf,mBAAmB;IACnB,aAAa;CACL,CAAC;AAYX;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,SAA4C;IAE5C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,kBAAkB,EAAE,CAAC,iBAAiB,CAAC,CAAC;IAE5D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gCAAgC,CAC9C,SAA4C,EAC5C,MAA+B;IAE/B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,kBAAkB,EAAE,YAAY,CAAC;IACrD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GACP,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,4BAA4B;QAC9B,CAAC,CAAC,6BAA6B,CAAC;IACpC,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AAC7B,CAAC;AAED,SAAS,aAAa,CAAC,KAAW;IAChC,IACE,CAAC,KAAK;QACN,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACpB,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,OAAO,KAAK,cAAc,EAChC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,iBAAiB,CAAC,OAAc,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Hex, Json } from '@metamask/utils';\nimport { isValidHexAddress } from '@metamask/utils';\n\nimport { CHAIN_ID_MONAD } from '../constants.js';\nimport type { TransactionPayControllerMessenger } from '../types.js';\n\nconst VAULT_CONFIG_FLAG = 'moneyAccountVaultConfig';\nconst REQUIRED_ADDRESS_KEYS = [\n 'boringVault',\n 'tellerAddress',\n 'accountantAddress',\n 'lensAddress',\n] as const;\n\ntype MoneyAccountVaultAction = 'deposit' | 'withdraw';\n\nexport type MoneyAccountVaultConfig = {\n accountantAddress: Hex;\n boringVault: Hex;\n chainId: Hex;\n lensAddress: Hex;\n tellerAddress: Hex;\n};\n\n/**\n * Reads and validates the Money Account vault configuration.\n *\n * @param messenger - Transaction Pay controller messenger.\n * @returns Validated Monad vault configuration.\n */\nexport function getMoneyAccountVaultConfig(\n messenger: TransactionPayControllerMessenger,\n): MoneyAccountVaultConfig {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const value = state.remoteFeatureFlags?.[VAULT_CONFIG_FLAG];\n\n if (value === undefined) {\n throw new Error('Money Account vault config is unavailable');\n }\n\n if (!isVaultConfig(value)) {\n throw new Error('Money Account vault config is invalid');\n }\n\n return value;\n}\n\n/**\n * Returns whether the requested Money Account vault action is enabled.\n *\n * @param messenger - Transaction Pay controller messenger.\n * @param action - Vault action to inspect.\n * @returns Whether the remote feature flag explicitly enables the action.\n */\nexport function isMoneyAccountVaultActionEnabled(\n messenger: TransactionPayControllerMessenger,\n action: MoneyAccountVaultAction,\n): boolean {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const value = state.remoteFeatureFlags?.moneyAccount;\n if (!value || Array.isArray(value) || typeof value !== 'object') {\n return false;\n }\n\n const key =\n action === 'deposit'\n ? 'moneyAccountDepositEnabled'\n : 'moneyAccountWithdrawEnabled';\n return value[key] === true;\n}\n\nfunction isVaultConfig(value: Json): value is Json & MoneyAccountVaultConfig {\n if (\n !value ||\n Array.isArray(value) ||\n typeof value !== 'object' ||\n value.chainId !== CHAIN_ID_MONAD\n ) {\n return false;\n }\n\n return REQUIRED_ADDRESS_KEYS.every((key) => {\n const address = value[key];\n return typeof address === 'string' && isValidHexAddress(address as Hex);\n });\n}\n"]}
|