diff --git a/examples/constants.ts b/examples/constants.ts index 2cd3bd4b..f8c56008 100644 --- a/examples/constants.ts +++ b/examples/constants.ts @@ -6,6 +6,9 @@ export const UPGRADE_CAP_OBJECT_ID = "0xae8c80532528977c531c7ee477d55d9e8618320e export const POOL_CREATION_CONFIG_OBJECT_ID = "0xa5e401f7311aa3a58bf0de4a893ef5684e9f994d2400d02eb0ea74c8cd88504c"; export const TRADING_FEE_CONFIG_OBJECT_ID = ""; export const LOYALTY_PROGRAM_OBJECT_ID = ""; +export const LOYALTY_ADMIN_CAP_OBJECT_ID = ""; +export const MULTISIG_CONFIG_OBJECT_ID = ""; +export const MULTISIG_ADMIN_CAP_OBJECT_ID = ""; // Coin types export const DEEP_COIN_TYPE = "0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP"; diff --git a/examples/fee-manager/claim-protocol-unsettled-fee-storage-rebate.ts b/examples/fee-manager/claim-protocol-unsettled-fee-storage-rebate.ts index 5f5b7d7b..cc8509d7 100644 --- a/examples/fee-manager/claim-protocol-unsettled-fee-storage-rebate.ts +++ b/examples/fee-manager/claim-protocol-unsettled-fee-storage-rebate.ts @@ -1,7 +1,11 @@ import { Transaction } from "@mysten/sui/transactions"; -import { ADMIN_CAP_OBJECT_ID, DEEPTRADE_CORE_PACKAGE_ID, TREASURY_OBJECT_ID } from "../constants"; +import { + ADMIN_CAP_OBJECT_ID, + DEEPTRADE_CORE_PACKAGE_ID, + MULTISIG_CONFIG_OBJECT_ID, + TREASURY_OBJECT_ID, +} from "../constants"; import { buildAndLogMultisigTransaction } from "../multisig/buildAndLogMultisigTransaction"; -import { MULTISIG_CONFIG } from "../multisig/multisig"; const FEE_MANAGER_ID = "0x4cef4ff8a75cc0e926fa57c99a3477d92b829b3a26b21cde5ea8b64041b75fba"; const FEE_COIN_TYPE = "0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC"; @@ -13,11 +17,10 @@ const FEE_COIN_TYPE = "0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb84 tx.moveCall({ target: `${DEEPTRADE_CORE_PACKAGE_ID}::fee_manager::claim_protocol_unsettled_fee_storage_rebate_admin`, arguments: [ + tx.object(TREASURY_OBJECT_ID), tx.object(FEE_MANAGER_ID), + tx.object(MULTISIG_CONFIG_OBJECT_ID), tx.object(ADMIN_CAP_OBJECT_ID), - tx.pure.vector("vector", MULTISIG_CONFIG.publicKeysSuiBytes), - tx.pure.vector("u8", MULTISIG_CONFIG.weights), - tx.pure.u16(MULTISIG_CONFIG.threshold), ], typeArguments: [FEE_COIN_TYPE], }); diff --git a/examples/fee-manager/claim-user-unsettled-fee-storage-rebate.ts b/examples/fee-manager/claim-user-unsettled-fee-storage-rebate.ts index d288a780..932aef69 100644 --- a/examples/fee-manager/claim-user-unsettled-fee-storage-rebate.ts +++ b/examples/fee-manager/claim-user-unsettled-fee-storage-rebate.ts @@ -1,7 +1,11 @@ import { Transaction } from "@mysten/sui/transactions"; -import { ADMIN_CAP_OBJECT_ID, DEEPTRADE_CORE_PACKAGE_ID, TREASURY_OBJECT_ID } from "../constants"; +import { + ADMIN_CAP_OBJECT_ID, + DEEPTRADE_CORE_PACKAGE_ID, + MULTISIG_CONFIG_OBJECT_ID, + TREASURY_OBJECT_ID, +} from "../constants"; import { buildAndLogMultisigTransaction } from "../multisig/buildAndLogMultisigTransaction"; -import { MULTISIG_CONFIG } from "../multisig/multisig"; const FEE_MANAGER_ID = "0x4cef4ff8a75cc0e926fa57c99a3477d92b829b3a26b21cde5ea8b64041b75fba"; const POOL_ID = "0xfacee57bc356dae0d9958c653253893dfb24e24e8871f53e69b7dccb3ffbf945"; @@ -18,16 +22,13 @@ const FEE_COIN_TYPE = "0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb84 tx.moveCall({ target: `${DEEPTRADE_CORE_PACKAGE_ID}::fee_manager::claim_user_unsettled_fee_storage_rebate_admin`, arguments: [ - // TODO: Uncomment, when upgraded to new version of contract - // tx.object(TREASURY_OBJECT_ID), + tx.object(TREASURY_OBJECT_ID), tx.object(FEE_MANAGER_ID), tx.object(POOL_ID), tx.object(BALANCE_MANAGER_ID), + tx.object(MULTISIG_CONFIG_OBJECT_ID), tx.object(ADMIN_CAP_OBJECT_ID), tx.pure.u128(ORDER_ID), - tx.pure.vector("vector", MULTISIG_CONFIG.publicKeysSuiBytes), - tx.pure.vector("u8", MULTISIG_CONFIG.weights), - tx.pure.u16(MULTISIG_CONFIG.threshold), ], typeArguments: [BASE_COIN_TYPE, QUOTE_COIN_TYPE, FEE_COIN_TYPE], }); diff --git a/examples/loyalty/add-loyalty-level.ts b/examples/loyalty/add-loyalty-level.ts index 1e932cf9..7743df8d 100644 --- a/examples/loyalty/add-loyalty-level.ts +++ b/examples/loyalty/add-loyalty-level.ts @@ -1,7 +1,11 @@ import { Transaction } from "@mysten/sui/transactions"; -import { ADMIN_CAP_OBJECT_ID, LOYALTY_PROGRAM_OBJECT_ID, DEEPTRADE_CORE_PACKAGE_ID } from "../constants"; +import { + ADMIN_CAP_OBJECT_ID, + DEEPTRADE_CORE_PACKAGE_ID, + LOYALTY_PROGRAM_OBJECT_ID, + MULTISIG_CONFIG_OBJECT_ID, +} from "../constants"; import { buildAndLogMultisigTransaction } from "../multisig/buildAndLogMultisigTransaction"; -import { MULTISIG_CONFIG } from "../multisig/multisig"; import { percentageInBillionths } from "../utils"; const LEVEL = 1; // Level ID to create @@ -16,12 +20,10 @@ const FEE_DISCOUNT_RATE = percentageInBillionths(FEE_DISCOUNT_PERCENTAGE); target: `${DEEPTRADE_CORE_PACKAGE_ID}::loyalty::add_loyalty_level`, arguments: [ tx.object(LOYALTY_PROGRAM_OBJECT_ID), + tx.object(MULTISIG_CONFIG_OBJECT_ID), tx.object(ADMIN_CAP_OBJECT_ID), tx.pure.u8(LEVEL), tx.pure.u64(FEE_DISCOUNT_RATE), - tx.pure.vector("vector", MULTISIG_CONFIG.publicKeysSuiBytes), - tx.pure.vector("u8", MULTISIG_CONFIG.weights), - tx.pure.u16(MULTISIG_CONFIG.threshold), ], }); diff --git a/examples/loyalty/grant-multiple-users-level.ts b/examples/loyalty/grant-multiple-users-level.ts index fbb100f0..5375d4b1 100644 --- a/examples/loyalty/grant-multiple-users-level.ts +++ b/examples/loyalty/grant-multiple-users-level.ts @@ -1,5 +1,5 @@ import { Transaction } from "@mysten/sui/transactions"; -import { buildAndLogMultisigTransaction } from "../multisig/buildAndLogMultisigTransaction"; +import { keypair, provider } from "../common"; import { grantUserLevelTx } from "./utils"; const USER_ADDRESSES: string[] = []; // Addresses of the users to grant the level to @@ -13,7 +13,10 @@ const LEVEL = 1; // Level to grant to the users grantUserLevelTx(userAddress, LEVEL, tx); }); - console.warn(`Building transaction to grant users ${USER_ADDRESSES} loyalty level ${LEVEL}`); + console.warn(`Executing transaction to grant users ${USER_ADDRESSES} loyalty level ${LEVEL}`); - await buildAndLogMultisigTransaction(tx); + // const res = await provider.devInspectTransactionBlock({ transactionBlock: tx, sender: user }); + const res = await provider.signAndExecuteTransaction({ transaction: tx, signer: keypair }); + + console.log("res:", JSON.stringify(res, null, 2)); })(); diff --git a/examples/loyalty/grant-user-level.ts b/examples/loyalty/grant-user-level.ts index 39ecb78f..d48ece2e 100644 --- a/examples/loyalty/grant-user-level.ts +++ b/examples/loyalty/grant-user-level.ts @@ -1,5 +1,5 @@ import { Transaction } from "@mysten/sui/transactions"; -import { buildAndLogMultisigTransaction } from "../multisig/buildAndLogMultisigTransaction"; +import { keypair, provider } from "../common"; import { grantUserLevelTx } from "./utils"; const USER_ADDRESS = ""; // Address of the user to grant the level to @@ -11,7 +11,10 @@ const LEVEL = 1; // Level to grant to the user grantUserLevelTx(USER_ADDRESS, LEVEL, tx); - console.warn(`Building transaction to grant user ${USER_ADDRESS} loyalty level ${LEVEL}`); + console.warn(`Executing transaction to grant user ${USER_ADDRESS} loyalty level ${LEVEL}`); - await buildAndLogMultisigTransaction(tx); + // const res = await provider.devInspectTransactionBlock({ transactionBlock: tx, sender: user }); + const res = await provider.signAndExecuteTransaction({ transaction: tx, signer: keypair }); + + console.log("res:", JSON.stringify(res, null, 2)); })(); diff --git a/examples/loyalty/remove-loyalty-level.ts b/examples/loyalty/remove-loyalty-level.ts index 57514414..95a54c9e 100644 --- a/examples/loyalty/remove-loyalty-level.ts +++ b/examples/loyalty/remove-loyalty-level.ts @@ -1,7 +1,11 @@ import { Transaction } from "@mysten/sui/transactions"; -import { ADMIN_CAP_OBJECT_ID, DEEPTRADE_CORE_PACKAGE_ID, LOYALTY_PROGRAM_OBJECT_ID } from "../constants"; +import { + ADMIN_CAP_OBJECT_ID, + DEEPTRADE_CORE_PACKAGE_ID, + LOYALTY_PROGRAM_OBJECT_ID, + MULTISIG_CONFIG_OBJECT_ID, +} from "../constants"; import { buildAndLogMultisigTransaction } from "../multisig/buildAndLogMultisigTransaction"; -import { MULTISIG_CONFIG } from "../multisig/multisig"; const LEVEL = 2; // Level ID to remove (must have no members) @@ -13,11 +17,9 @@ const LEVEL = 2; // Level ID to remove (must have no members) target: `${DEEPTRADE_CORE_PACKAGE_ID}::loyalty::remove_loyalty_level`, arguments: [ tx.object(LOYALTY_PROGRAM_OBJECT_ID), + tx.object(MULTISIG_CONFIG_OBJECT_ID), tx.object(ADMIN_CAP_OBJECT_ID), tx.pure.u8(LEVEL), - tx.pure.vector("vector", MULTISIG_CONFIG.publicKeysSuiBytes), - tx.pure.vector("u8", MULTISIG_CONFIG.weights), - tx.pure.u16(MULTISIG_CONFIG.threshold), ], }); diff --git a/examples/loyalty/revoke-user-level.ts b/examples/loyalty/revoke-user-level.ts index 3bf8111a..6a8c7fff 100644 --- a/examples/loyalty/revoke-user-level.ts +++ b/examples/loyalty/revoke-user-level.ts @@ -1,7 +1,6 @@ import { Transaction } from "@mysten/sui/transactions"; -import { ADMIN_CAP_OBJECT_ID, DEEPTRADE_CORE_PACKAGE_ID, LOYALTY_PROGRAM_OBJECT_ID } from "../constants"; -import { buildAndLogMultisigTransaction } from "../multisig/buildAndLogMultisigTransaction"; -import { MULTISIG_CONFIG } from "../multisig/multisig"; +import { keypair, provider } from "../common"; +import { DEEPTRADE_CORE_PACKAGE_ID, LOYALTY_ADMIN_CAP_OBJECT_ID, LOYALTY_PROGRAM_OBJECT_ID } from "../constants"; const USER_ADDRESS = ""; // Address of the user to revoke the level from @@ -13,15 +12,15 @@ const USER_ADDRESS = ""; // Address of the user to revoke the level from target: `${DEEPTRADE_CORE_PACKAGE_ID}::loyalty::revoke_user_level`, arguments: [ tx.object(LOYALTY_PROGRAM_OBJECT_ID), - tx.object(ADMIN_CAP_OBJECT_ID), + tx.object(LOYALTY_ADMIN_CAP_OBJECT_ID), tx.pure.address(USER_ADDRESS), - tx.pure.vector("vector", MULTISIG_CONFIG.publicKeysSuiBytes), - tx.pure.vector("u8", MULTISIG_CONFIG.weights), - tx.pure.u16(MULTISIG_CONFIG.threshold), ], }); - console.warn(`Building transaction to revoke loyalty level from user ${USER_ADDRESS}`); + console.warn(`Executing transaction to revoke loyalty level from user ${USER_ADDRESS}`); - await buildAndLogMultisigTransaction(tx); + // const res = await provider.devInspectTransactionBlock({ transactionBlock: tx, sender: user }); + const res = await provider.signAndExecuteTransaction({ transaction: tx, signer: keypair }); + + console.log("res:", JSON.stringify(res, null, 2)); })(); diff --git a/examples/loyalty/update-loyalty-admin-cap-owner.ts b/examples/loyalty/update-loyalty-admin-cap-owner.ts new file mode 100644 index 00000000..999ce607 --- /dev/null +++ b/examples/loyalty/update-loyalty-admin-cap-owner.ts @@ -0,0 +1,29 @@ +import { Transaction } from "@mysten/sui/transactions"; +import { + ADMIN_CAP_OBJECT_ID, + DEEPTRADE_CORE_PACKAGE_ID, + LOYALTY_ADMIN_CAP_OBJECT_ID, + MULTISIG_CONFIG_OBJECT_ID, +} from "../constants"; +import { buildAndLogMultisigTransaction } from "../multisig/buildAndLogMultisigTransaction"; + +const NEW_OWNER = ""; // New owner of the loyalty admin cap + +// Usage: yarn ts-node examples/loyalty/update-loyalty-admin-cap-owner.ts > update-loyalty-admin-cap-owner.log 2>&1 +(async () => { + const tx = new Transaction(); + + tx.moveCall({ + target: `${DEEPTRADE_CORE_PACKAGE_ID}::loyalty::update_loyalty_admin_cap_owner`, + arguments: [ + tx.object(LOYALTY_ADMIN_CAP_OBJECT_ID), + tx.object(MULTISIG_CONFIG_OBJECT_ID), + tx.object(ADMIN_CAP_OBJECT_ID), + tx.pure.address(NEW_OWNER), + ], + }); + + console.warn(`Building transaction to update loyalty admin cap owner to ${NEW_OWNER}`); + + await buildAndLogMultisigTransaction(tx); +})(); diff --git a/examples/loyalty/utils.ts b/examples/loyalty/utils.ts index 6a68e5cc..43c53730 100644 --- a/examples/loyalty/utils.ts +++ b/examples/loyalty/utils.ts @@ -1,6 +1,5 @@ import { Transaction } from "@mysten/sui/transactions"; -import { DEEPTRADE_CORE_PACKAGE_ID, LOYALTY_PROGRAM_OBJECT_ID, ADMIN_CAP_OBJECT_ID } from "../constants"; -import { MULTISIG_CONFIG } from "../multisig/multisig"; +import { DEEPTRADE_CORE_PACKAGE_ID, LOYALTY_ADMIN_CAP_OBJECT_ID, LOYALTY_PROGRAM_OBJECT_ID } from "../constants"; export function grantUserLevelTx(userAddress: string, level: number, transaction?: Transaction) { const tx = transaction ?? new Transaction(); @@ -9,12 +8,9 @@ export function grantUserLevelTx(userAddress: string, level: number, transaction target: `${DEEPTRADE_CORE_PACKAGE_ID}::loyalty::grant_user_level`, arguments: [ tx.object(LOYALTY_PROGRAM_OBJECT_ID), - tx.object(ADMIN_CAP_OBJECT_ID), + tx.object(LOYALTY_ADMIN_CAP_OBJECT_ID), tx.pure.address(userAddress), tx.pure.u8(level), - tx.pure.vector("vector", MULTISIG_CONFIG.publicKeysSuiBytes), - tx.pure.vector("u8", MULTISIG_CONFIG.weights), - tx.pure.u16(MULTISIG_CONFIG.threshold), ], }); diff --git a/examples/multisig-config/initialize-multisig-config.ts b/examples/multisig-config/initialize-multisig-config.ts new file mode 100644 index 00000000..f033661b --- /dev/null +++ b/examples/multisig-config/initialize-multisig-config.ts @@ -0,0 +1,31 @@ +import { Transaction } from "@mysten/sui/transactions"; +import { keypair, provider } from "../common"; +import { DEEPTRADE_CORE_PACKAGE_ID, MULTISIG_ADMIN_CAP_OBJECT_ID, MULTISIG_CONFIG_OBJECT_ID } from "../constants"; +import { MultisigConfig } from "../multisig/types"; + +const NEW_PUBLIC_KEYS: MultisigConfig["publicKeysSuiBytes"] = []; +const NEW_WEIGHTS: MultisigConfig["weights"] = []; +const NEW_THRESHOLD: MultisigConfig["threshold"] = 0; + +// yarn ts-node examples/multisig-config/initialize-multisig-config.ts > initialize-multisig-config.log 2>&1 +(async () => { + const tx = new Transaction(); + + tx.moveCall({ + target: `${DEEPTRADE_CORE_PACKAGE_ID}::multisig_config::initialize_multisig_config`, + arguments: [ + tx.object(MULTISIG_CONFIG_OBJECT_ID), + tx.object(MULTISIG_ADMIN_CAP_OBJECT_ID), + tx.pure.vector("vector", NEW_PUBLIC_KEYS), + tx.pure.vector("u8", NEW_WEIGHTS), + tx.pure.u16(NEW_THRESHOLD), + ], + }); + + console.warn(`Executing transaction to initialize multisig config`); + + // const res = await provider.devInspectTransactionBlock({ transactionBlock: tx, sender: user }); + const res = await provider.signAndExecuteTransaction({ transaction: tx, signer: keypair }); + + console.log("res:", JSON.stringify(res, null, 2)); +})(); diff --git a/examples/multisig-config/update-multisig-config.ts b/examples/multisig-config/update-multisig-config.ts new file mode 100644 index 00000000..28f87a57 --- /dev/null +++ b/examples/multisig-config/update-multisig-config.ts @@ -0,0 +1,31 @@ +import { Transaction } from "@mysten/sui/transactions"; +import { keypair, provider } from "../common"; +import { DEEPTRADE_CORE_PACKAGE_ID, MULTISIG_ADMIN_CAP_OBJECT_ID, MULTISIG_CONFIG_OBJECT_ID } from "../constants"; +import { MultisigConfig } from "../multisig/types"; + +const NEW_PUBLIC_KEYS: MultisigConfig["publicKeysSuiBytes"] = []; +const NEW_WEIGHTS: MultisigConfig["weights"] = []; +const NEW_THRESHOLD: MultisigConfig["threshold"] = 0; + +// yarn ts-node examples/multisig-config/update-multisig-config.ts > update-multisig-config.log 2>&1 +(async () => { + const tx = new Transaction(); + + tx.moveCall({ + target: `${DEEPTRADE_CORE_PACKAGE_ID}::multisig_config::update_multisig_config`, + arguments: [ + tx.object(MULTISIG_CONFIG_OBJECT_ID), + tx.object(MULTISIG_ADMIN_CAP_OBJECT_ID), + tx.pure.vector("vector", NEW_PUBLIC_KEYS), + tx.pure.vector("u8", NEW_WEIGHTS), + tx.pure.u16(NEW_THRESHOLD), + ], + }); + + console.warn(`Executing transaction to update multisig config`); + + // const res = await provider.devInspectTransactionBlock({ transactionBlock: tx, sender: user }); + const res = await provider.signAndExecuteTransaction({ transaction: tx, signer: keypair }); + + console.log("res:", JSON.stringify(res, null, 2)); +})(); diff --git a/examples/ticket/create-multiple-tickets-withdraw-protocol-fees.ts b/examples/ticket/create-multiple-tickets-withdraw-protocol-fees.ts index 79a7c791..4c99f354 100644 --- a/examples/ticket/create-multiple-tickets-withdraw-protocol-fees.ts +++ b/examples/ticket/create-multiple-tickets-withdraw-protocol-fees.ts @@ -1,10 +1,9 @@ import { Transaction } from "@mysten/sui/transactions"; -import { ADMIN_CAP_OBJECT_ID } from "../constants"; +import { ADMIN_CAP_OBJECT_ID, MULTISIG_CONFIG_OBJECT_ID } from "../constants"; import { buildAndLogMultisigTransaction } from "../multisig/buildAndLogMultisigTransaction"; -import { MULTISIG_CONFIG } from "../multisig/multisig"; -import { createTicketTx, TicketType } from "./utils/createTicketTx"; import { getTreasuryBags } from "../treasury/utils/getTreasuryBags"; import { processFeesBag } from "../treasury/utils/processFeeBag"; +import { createTicketTx, TicketType } from "./utils/createTicketTx"; // yarn ts-node examples/ticket/create-multiple-tickets-withdraw-protocol-fees.ts > create-multiple-tickets-withdraw-protocol-fees.log 2>&1 (async () => { @@ -25,9 +24,7 @@ import { processFeesBag } from "../treasury/utils/processFeeBag"; transaction: tx, ticketType, adminCapId: ADMIN_CAP_OBJECT_ID, - pks: MULTISIG_CONFIG.publicKeysSuiBytes, - weights: MULTISIG_CONFIG.weights, - threshold: MULTISIG_CONFIG.threshold, + multisigConfigId: MULTISIG_CONFIG_OBJECT_ID, }); } diff --git a/examples/ticket/create-multiple-tickets.ts b/examples/ticket/create-multiple-tickets.ts index 29c9b495..944ce78a 100644 --- a/examples/ticket/create-multiple-tickets.ts +++ b/examples/ticket/create-multiple-tickets.ts @@ -1,7 +1,6 @@ import { Transaction } from "@mysten/sui/transactions"; -import { ADMIN_CAP_OBJECT_ID } from "../constants"; +import { ADMIN_CAP_OBJECT_ID, MULTISIG_CONFIG_OBJECT_ID } from "../constants"; import { buildAndLogMultisigTransaction } from "../multisig/buildAndLogMultisigTransaction"; -import { MULTISIG_CONFIG } from "../multisig/multisig"; import { createTicketTx, TicketType } from "./utils/createTicketTx"; // yarn ts-node examples/ticket/create-multiple-tickets.ts > create-multiple-tickets.log 2>&1 @@ -24,9 +23,7 @@ import { createTicketTx, TicketType } from "./utils/createTicketTx"; transaction: tx, ticketType, adminCapId: ADMIN_CAP_OBJECT_ID, - pks: MULTISIG_CONFIG.publicKeysSuiBytes, - weights: MULTISIG_CONFIG.weights, - threshold: MULTISIG_CONFIG.threshold, + multisigConfigId: MULTISIG_CONFIG_OBJECT_ID, }); } diff --git a/examples/ticket/create-ticket.ts b/examples/ticket/create-ticket.ts index 76495034..70a45df1 100644 --- a/examples/ticket/create-ticket.ts +++ b/examples/ticket/create-ticket.ts @@ -1,6 +1,5 @@ -import { ADMIN_CAP_OBJECT_ID } from "../constants"; +import { ADMIN_CAP_OBJECT_ID, MULTISIG_CONFIG_OBJECT_ID } from "../constants"; import { buildAndLogMultisigTransaction } from "../multisig/buildAndLogMultisigTransaction"; -import { MULTISIG_CONFIG } from "../multisig/multisig"; import { createTicketTx, TicketType } from "./utils/createTicketTx"; // yarn ts-node examples/ticket/create-ticket.ts > create-ticket.log 2>&1 @@ -12,9 +11,7 @@ import { createTicketTx, TicketType } from "./utils/createTicketTx"; const { tx, ticket } = createTicketTx({ ticketType, adminCapId: ADMIN_CAP_OBJECT_ID, - pks: MULTISIG_CONFIG.publicKeysSuiBytes, - weights: MULTISIG_CONFIG.weights, - threshold: MULTISIG_CONFIG.threshold, + multisigConfigId: MULTISIG_CONFIG_OBJECT_ID, }); await buildAndLogMultisigTransaction(tx); diff --git a/examples/ticket/utils/createTicketTx.ts b/examples/ticket/utils/createTicketTx.ts index 2ca55779..e33082b4 100644 --- a/examples/ticket/utils/createTicketTx.ts +++ b/examples/ticket/utils/createTicketTx.ts @@ -1,6 +1,6 @@ import { Transaction } from "@mysten/sui/transactions"; -import { DEEPTRADE_CORE_PACKAGE_ID } from "../../constants"; import { SUI_CLOCK_OBJECT_ID } from "@mysten/sui/utils"; +import { DEEPTRADE_CORE_PACKAGE_ID, MULTISIG_CONFIG_OBJECT_ID } from "../../constants"; export enum TicketType { WithdrawDeepReserves = "WithdrawDeepReserves", @@ -14,13 +14,11 @@ export enum TicketType { export interface CreateTicketParams { ticketType: TicketType; adminCapId: string; - pks: number[][]; - weights: number[]; - threshold: number; + multisigConfigId: string; transaction?: Transaction; } -export function createTicketTx({ ticketType, adminCapId, pks, weights, threshold, transaction }: CreateTicketParams): { +export function createTicketTx({ ticketType, adminCapId, multisigConfigId, transaction }: CreateTicketParams): { tx: Transaction; ticket: any; } { @@ -34,14 +32,7 @@ export function createTicketTx({ ticketType, adminCapId, pks, weights, threshold const ticket = tx.moveCall({ target: `${DEEPTRADE_CORE_PACKAGE_ID}::ticket::create_ticket`, - arguments: [ - tx.object(adminCapId), - ticketTypeArg, - tx.pure.vector("vector", pks), - tx.pure.vector("u8", weights), - tx.pure.u16(threshold), - tx.object(SUI_CLOCK_OBJECT_ID), - ], + arguments: [tx.object(multisigConfigId), tx.object(adminCapId), ticketTypeArg, tx.object(SUI_CLOCK_OBJECT_ID)], }); return { tx, ticket }; diff --git a/examples/treasury/versions/disable-version.ts b/examples/treasury/versions/disable-version.ts index cd0b16e9..cbfa37ef 100644 --- a/examples/treasury/versions/disable-version.ts +++ b/examples/treasury/versions/disable-version.ts @@ -1,6 +1,10 @@ import { Transaction } from "@mysten/sui/transactions"; -import { ADMIN_CAP_OBJECT_ID, TREASURY_OBJECT_ID, DEEPTRADE_CORE_PACKAGE_ID } from "../../constants"; -import { MULTISIG_CONFIG } from "../../multisig/multisig"; +import { + ADMIN_CAP_OBJECT_ID, + DEEPTRADE_CORE_PACKAGE_ID, + MULTISIG_CONFIG_OBJECT_ID, + TREASURY_OBJECT_ID, +} from "../../constants"; import { buildAndLogMultisigTransaction } from "../../multisig/buildAndLogMultisigTransaction"; // Set the version to disable here @@ -14,11 +18,9 @@ const VERSION = 1; target: `${DEEPTRADE_CORE_PACKAGE_ID}::treasury::disable_version`, arguments: [ tx.object(TREASURY_OBJECT_ID), + tx.object(MULTISIG_CONFIG_OBJECT_ID), tx.object(ADMIN_CAP_OBJECT_ID), tx.pure.u16(VERSION), - tx.pure.vector("vector", MULTISIG_CONFIG.publicKeysSuiBytes), - tx.pure.vector("u8", MULTISIG_CONFIG.weights), - tx.pure.u16(MULTISIG_CONFIG.threshold), ], }); diff --git a/examples/treasury/versions/enable-version.ts b/examples/treasury/versions/enable-version.ts index 5eb61b80..ffbc45fa 100644 --- a/examples/treasury/versions/enable-version.ts +++ b/examples/treasury/versions/enable-version.ts @@ -1,6 +1,10 @@ import { Transaction } from "@mysten/sui/transactions"; -import { ADMIN_CAP_OBJECT_ID, TREASURY_OBJECT_ID, DEEPTRADE_CORE_PACKAGE_ID } from "../../constants"; -import { MULTISIG_CONFIG } from "../../multisig/multisig"; +import { + ADMIN_CAP_OBJECT_ID, + DEEPTRADE_CORE_PACKAGE_ID, + MULTISIG_CONFIG_OBJECT_ID, + TREASURY_OBJECT_ID, +} from "../../constants"; import { buildAndLogMultisigTransaction } from "../../multisig/buildAndLogMultisigTransaction"; // Set the version to enable here @@ -14,11 +18,9 @@ const VERSION = 2; target: `${DEEPTRADE_CORE_PACKAGE_ID}::treasury::enable_version`, arguments: [ tx.object(TREASURY_OBJECT_ID), + tx.object(MULTISIG_CONFIG_OBJECT_ID), tx.object(ADMIN_CAP_OBJECT_ID), tx.pure.u16(VERSION), - tx.pure.vector("vector", MULTISIG_CONFIG.publicKeysSuiBytes), - tx.pure.vector("u8", MULTISIG_CONFIG.weights), - tx.pure.u16(MULTISIG_CONFIG.threshold), ], }); diff --git a/packages/deeptrade-core/sources/fee_manager.move b/packages/deeptrade-core/sources/fee_manager.move index 2a6bd9fa..ffa16d63 100644 --- a/packages/deeptrade-core/sources/fee_manager.move +++ b/packages/deeptrade-core/sources/fee_manager.move @@ -6,8 +6,8 @@ use deepbook::order_info::OrderInfo; use deepbook::pool::Pool; use deeptrade_core::admin::AdminCap; use deeptrade_core::math; +use deeptrade_core::multisig_config::MultisigConfig; use deeptrade_core::treasury::{Treasury, join_protocol_fee}; -use multisig::multisig; use sui::bag::{Self, Bag}; use sui::balance::Balance; use sui::coin::{Self, Coin}; @@ -29,8 +29,7 @@ const EFilledQuantityGreaterThanOrderQuantity: u64 = 7; /// Error when the user unsettled fee is not empty to be destroyed const EUserUnsettledFeeNotEmpty: u64 = 8; const EProtocolUnsettledFeeNotEmpty: u64 = 9; -const ESenderIsNotMultisig: u64 = 10; -const EInvalidFeeManagerShareTicket: u64 = 11; +const EInvalidFeeManagerShareTicket: u64 = 10; // === Structs === /// A shared object that manages a user's fee-related operations. Required for trading @@ -282,17 +281,12 @@ public fun claim_user_unsettled_fee_storage_rebate_admin, balance_manager: &BalanceManager, + multisig_config: &MultisigConfig, _admin: &AdminCap, order_id: u128, - pks: vector>, - weights: vector, - threshold: u16, ctx: &mut TxContext, ) { - assert!( - multisig::check_if_sender_is_multisig_address(pks, weights, threshold, ctx), - ESenderIsNotMultisig, - ); + multisig_config.validate_sender_is_admin_multisig(ctx); treasury.verify_version(); claim_user_unsettled_fee_rebate_core( @@ -325,16 +319,11 @@ public fun claim_protocol_unsettled_fee_storage_rebate( public fun claim_protocol_unsettled_fee_storage_rebate_admin( treasury: &Treasury, fee_manager: &mut FeeManager, + multisig_config: &MultisigConfig, _admin: &AdminCap, - pks: vector>, - weights: vector, - threshold: u16, ctx: &mut TxContext, ) { - assert!( - multisig::check_if_sender_is_multisig_address(pks, weights, threshold, ctx), - ESenderIsNotMultisig, - ); + multisig_config.validate_sender_is_admin_multisig(ctx); treasury.verify_version(); claim_protocol_unsettled_fee_rebate_core(fee_manager); diff --git a/packages/deeptrade-core/sources/loyalty.move b/packages/deeptrade-core/sources/loyalty.move index c6e3364e..825c9aa5 100644 --- a/packages/deeptrade-core/sources/loyalty.move +++ b/packages/deeptrade-core/sources/loyalty.move @@ -8,7 +8,7 @@ module deeptrade_core::loyalty; use deeptrade_core::admin::AdminCap; -use multisig::multisig; +use deeptrade_core::multisig_config::MultisigConfig; use sui::event; use sui::table::{Self, Table}; @@ -19,8 +19,7 @@ const ELoyaltyLevelHasUsers: u64 = 3; const EUserAlreadyHasLoyaltyLevel: u64 = 4; const EUserHasNoLoyaltyLevel: u64 = 5; const EInvalidFeeDiscountRate: u64 = 6; -const ESenderIsNotMultisig: u64 = 7; -const ESenderIsNotLoyaltyAdmin: u64 = 8; +const ESenderIsNotLoyaltyAdmin: u64 = 7; // === Constants === const MAX_FEE_DISCOUNT_RATE: u64 = 1_000_000_000; // 100% in billionths @@ -100,17 +99,12 @@ fun init(ctx: &mut TxContext) { /// A protocol admin operation. public fun update_loyalty_admin_cap_owner( loyalty_admin_cap: &mut LoyaltyAdminCap, + multisig_config: &MultisigConfig, _admin_cap: &AdminCap, new_owner: address, - pks: vector>, - weights: vector, - threshold: u16, ctx: &mut TxContext, ) { - assert!( - multisig::check_if_sender_is_multisig_address(pks, weights, threshold, ctx), - ESenderIsNotMultisig, - ); + multisig_config.validate_sender_is_admin_multisig(ctx); let old_owner = loyalty_admin_cap.owner; loyalty_admin_cap.owner = new_owner; @@ -191,19 +185,14 @@ public fun revoke_user_level( /// Add a new loyalty level with fee discount rate public fun add_loyalty_level( loyalty_program: &mut LoyaltyProgram, + multisig_config: &MultisigConfig, _admin: &AdminCap, level: u8, fee_discount_rate: u64, - pks: vector>, - weights: vector, - threshold: u16, ctx: &mut TxContext, ) { // Validate multisig - assert!( - multisig::check_if_sender_is_multisig_address(pks, weights, threshold, ctx), - ESenderIsNotMultisig, - ); + multisig_config.validate_sender_is_admin_multisig(ctx); // Validate fee discount rate assert!( @@ -228,18 +217,13 @@ public fun add_loyalty_level( /// Remove a loyalty level (only if no users have this level) public fun remove_loyalty_level( loyalty_program: &mut LoyaltyProgram, + multisig_config: &MultisigConfig, _admin: &AdminCap, level: u8, - pks: vector>, - weights: vector, - threshold: u16, ctx: &mut TxContext, ) { // Validate multisig - assert!( - multisig::check_if_sender_is_multisig_address(pks, weights, threshold, ctx), - ESenderIsNotMultisig, - ); + multisig_config.validate_sender_is_admin_multisig(ctx); // Validate level exists assert!(loyalty_program.levels.contains(level), ELoyaltyLevelNotFound); diff --git a/packages/deeptrade-core/sources/multisig_config.move b/packages/deeptrade-core/sources/multisig_config.move new file mode 100644 index 00000000..9c87642b --- /dev/null +++ b/packages/deeptrade-core/sources/multisig_config.move @@ -0,0 +1,214 @@ +module deeptrade_core::multisig_config; + +use multisig::multisig; +use sui::event; + +// === Errors === +const ENewAddressIsOldAddress: u64 = 1; +const ESenderIsNotValidMultisig: u64 = 2; +const EMultisigConfigAlreadyInitialized: u64 = 3; +const EMultisigConfigNotInitialized: u64 = 4; +const ETooFewSigners: u64 = 5; + +// === Constants === +const MIN_SIGNERS: u64 = 2; + +// === Structs === +/// Configuration of the protocol's administrator multisig. Only a multisig account matching these +/// parameters can perform administrative actions requiring `AdminCap` +public struct MultisigConfig has key { + id: UID, + public_keys: vector>, + weights: vector, + threshold: u16, + initialized: bool, +} + +/// Capability to update the multisig config +public struct MultisigAdminCap has key, store { + id: UID, +} + +// === Events === +public struct MultisigConfigInitialized has copy, drop { + config_id: ID, + public_keys: vector>, + weights: vector, + threshold: u16, + multisig_address: address, +} + +public struct MultisigConfigUpdated has copy, drop { + config_id: ID, + old_public_keys: vector>, + new_public_keys: vector>, + old_weights: vector, + new_weights: vector, + old_threshold: u16, + new_threshold: u16, + old_address: address, + new_address: address, +} + +// Share multisig config object and transfer multisig admin cap to publisher +fun init(ctx: &mut TxContext) { + let multisig_config = MultisigConfig { + id: object::new(ctx), + public_keys: vector::empty(), + weights: vector::empty(), + threshold: 0, + initialized: false, + }; + let multisig_admin_cap = MultisigAdminCap { + id: object::new(ctx), + }; + + transfer::share_object(multisig_config); + transfer::transfer(multisig_admin_cap, ctx.sender()); +} + +// === Public-Mutative Functions === +/// Multisig config can be initialized only once. `update_multisig_config` should be used for subsequent updates +public fun initialize_multisig_config( + config: &mut MultisigConfig, + _admin_cap: &MultisigAdminCap, + public_keys: vector>, + weights: vector, + threshold: u16, +) { + assert!(!config.initialized, EMultisigConfigAlreadyInitialized); + assert!(public_keys.length() >= MIN_SIGNERS, ETooFewSigners); + + // Validates passed multisig parameters, aborting if they are invalid + let multisig_address = multisig::derive_multisig_address_quiet( + public_keys, + weights, + threshold, + ); + + config.public_keys = public_keys; + config.weights = weights; + config.threshold = threshold; + config.initialized = true; + + event::emit(MultisigConfigInitialized { + config_id: config.id.to_inner(), + public_keys, + weights, + threshold, + multisig_address, + }); +} + +/// Multisig config can be updated only after it has been initialized by `initialize_multisig_config` +public fun update_multisig_config( + config: &mut MultisigConfig, + _admin: &MultisigAdminCap, + new_public_keys: vector>, + new_weights: vector, + new_threshold: u16, +) { + assert!(config.initialized, EMultisigConfigNotInitialized); + assert!(new_public_keys.length() >= MIN_SIGNERS, ETooFewSigners); + + let old_public_keys = config.public_keys; + let old_weights = config.weights; + let old_threshold = config.threshold; + + let old_address = multisig::derive_multisig_address_quiet( + old_public_keys, + old_weights, + old_threshold, + ); + // Validates passed multisig parameters, aborting if they are invalid + let new_address = multisig::derive_multisig_address_quiet( + new_public_keys, + new_weights, + new_threshold, + ); + + assert!(old_address != new_address, ENewAddressIsOldAddress); + + config.public_keys = new_public_keys; + config.weights = new_weights; + config.threshold = new_threshold; + + event::emit(MultisigConfigUpdated { + config_id: config.id.to_inner(), + old_public_keys, + new_public_keys, + old_weights, + new_weights, + old_threshold, + new_threshold, + old_address, + new_address, + }); +} + +// === Public-Package Functions === +public(package) fun validate_sender_is_admin_multisig( + config: &MultisigConfig, + ctx: &mut TxContext, +) { + assert!(config.initialized, EMultisigConfigNotInitialized); + assert!( + multisig::check_if_sender_is_multisig_address( + config.public_keys, + config.weights, + config.threshold, + ctx, + ), + ESenderIsNotValidMultisig, + ); +} + +// === Test Functions === +#[test_only] +public fun init_for_testing(ctx: &mut TxContext) { init(ctx); } + +#[test_only] +public fun get_multisig_admin_cap_for_testing(ctx: &mut TxContext): MultisigAdminCap { + MultisigAdminCap { id: object::new(ctx) } +} + +#[test_only] +public fun get_multisig_config_params( + config: &MultisigConfig, +): (vector>, vector, u16) { + (config.public_keys, config.weights, config.threshold) +} + +#[test_only] +public fun unwrap_multisig_config_updated_event( + event: &MultisigConfigUpdated, +): ( + ID, + vector>, + vector>, + vector, + vector, + u16, + u16, + address, + address, +) { + ( + event.config_id, + event.old_public_keys, + event.new_public_keys, + event.old_weights, + event.new_weights, + event.old_threshold, + event.new_threshold, + event.old_address, + event.new_address, + ) +} + +#[test_only] +public fun unwrap_multisig_config_initialized_event( + event: &MultisigConfigInitialized, +): (ID, vector>, vector, u16, address) { + (event.config_id, event.public_keys, event.weights, event.threshold, event.multisig_address) +} diff --git a/packages/deeptrade-core/sources/ticket.move b/packages/deeptrade-core/sources/ticket.move index 96a4d1c4..75fefe53 100644 --- a/packages/deeptrade-core/sources/ticket.move +++ b/packages/deeptrade-core/sources/ticket.move @@ -1,7 +1,7 @@ module deeptrade_core::ticket; use deeptrade_core::admin::AdminCap; -use multisig::multisig; +use deeptrade_core::multisig_config::MultisigConfig; use sui::clock::Clock; use sui::event; @@ -10,8 +10,7 @@ const ETicketOwnerMismatch: u64 = 1; const ETicketTypeMismatch: u64 = 2; const ETicketExpired: u64 = 3; const ETicketNotReady: u64 = 4; -const ESenderIsNotMultisig: u64 = 5; -const ETicketNotExpired: u64 = 6; +const ETicketNotExpired: u64 = 5; // === Constants === const MILLISECONDS_PER_DAY: u64 = 86_400_000; @@ -52,14 +51,12 @@ public struct TicketDestroyed has copy, drop { // === Public Functions === /// Create an admin ticket for timelock mechanism with multi-signature verification -/// Verifies sender matches the multi-sig address, then creates a ticket for future execution +/// Verifies sender matches the admin multi-sig address, then creates a ticket for future execution /// /// Parameters: +/// - multisig_config: Protocol's admin multisig config /// - _admin: Admin capability /// - ticket_type: Type of operation this ticket authorizes -/// - pks: Vector of public keys of the multi-sig signers -/// - weights: Vector of weights for each corresponding signer (must match pks length) -/// - threshold: Minimum sum of weights required to authorize transactions (must be > 0 and <= sum of weights) /// - clock: Clock for timestamp recording /// - ctx: Mutable transaction context for ticket creation and sender verification /// @@ -67,21 +64,15 @@ public struct TicketDestroyed has copy, drop { /// - AdminTicket: The created ticket bound to the sender address /// /// Aborts: -/// - With ESenderIsNotMultisig if the transaction sender is not the expected multi-signature address -/// derived from the provided pks, weights, and threshold parameters +/// - With ESenderIsNotValidMultisig if the transaction sender is not the protocol's admin multisig public fun create_ticket( + multisig_config: &MultisigConfig, _admin: &AdminCap, ticket_type: u8, - pks: vector>, - weights: vector, - threshold: u16, clock: &Clock, ctx: &mut TxContext, ) { - assert!( - multisig::check_if_sender_is_multisig_address(pks, weights, threshold, ctx), - ESenderIsNotMultisig, - ); + multisig_config.validate_sender_is_admin_multisig(ctx); let created_at = clock.timestamp_ms(); diff --git a/packages/deeptrade-core/sources/treasury.move b/packages/deeptrade-core/sources/treasury.move index 8f7b5bf6..4c9eed6b 100644 --- a/packages/deeptrade-core/sources/treasury.move +++ b/packages/deeptrade-core/sources/treasury.move @@ -2,6 +2,7 @@ module deeptrade_core::treasury; use deeptrade_core::admin::AdminCap; use deeptrade_core::helper::current_version; +use deeptrade_core::multisig_config::MultisigConfig; use deeptrade_core::ticket::{ AdminTicket, validate_ticket, @@ -10,7 +11,6 @@ use deeptrade_core::ticket::{ withdraw_protocol_fee_ticket_type, withdraw_deep_reserves_ticket_type }; -use multisig::multisig; use sui::bag::{Self, Bag}; use sui::balance::{Self, Balance}; use sui::clock::Clock; @@ -28,10 +28,9 @@ const ECannotDisableNewerVersion: u64 = 3; const EVersionNotEnabled: u64 = 4; /// Error when trying to use shared object in a package whose version is not enabled const EPackageVersionNotEnabled: u64 = 5; -const ESenderIsNotMultisig: u64 = 6; /// Error when trying to enable a version that has been permanently disabled -const EVersionPermanentlyDisabled: u64 = 7; +const EVersionPermanentlyDisabled: u64 = 6; // === Structs === public struct Treasury has key, store { @@ -237,30 +236,22 @@ public fun withdraw_deep_reserves( /// /// Parameters: /// - treasury: Treasury object +/// - multisig_config: Protocol's admin multisig config /// - _admin: Admin capability /// - version: Package version to enable -/// - pks: Vector of public keys of the multi-sig signers -/// - weights: Vector of weights for each corresponding signer (must match pks length) -/// - threshold: Minimum sum of weights required to authorize transactions /// - ctx: Mutable transaction context for sender verification /// /// Aborts: -/// - With ESenderIsNotMultisig if the transaction sender is not the expected multi-signature address -/// derived from the provided pks, weights, and threshold parameters +/// - With ESenderIsNotValidMultisig if the transaction sender is not the protocol's admin multisig /// - With EVersionAlreadyEnabled if the version is already enabled public fun enable_version( treasury: &mut Treasury, + multisig_config: &MultisigConfig, _admin: &AdminCap, version: u16, - pks: vector>, - weights: vector, - threshold: u16, ctx: &mut TxContext, ) { - assert!( - multisig::check_if_sender_is_multisig_address(pks, weights, threshold, ctx), - ESenderIsNotMultisig, - ); + multisig_config.validate_sender_is_admin_multisig(ctx); // Check if the version has been permanently disabled assert!(!treasury.disabled_versions.contains(&version), EVersionPermanentlyDisabled); @@ -280,31 +271,23 @@ public fun enable_version( /// /// Parameters: /// - treasury: Treasury object +/// - multisig_config: Protocol's admin multisig config /// - _admin: Admin capability /// - version: Package version to disable -/// - pks: Vector of public keys of the multi-sig signers -/// - weights: Vector of weights for each corresponding signer (must match pks length) -/// - threshold: Minimum sum of weights required to authorize transactions /// - ctx: Mutable transaction context for sender verification /// /// Aborts: -/// - With ESenderIsNotMultisig if the transaction sender is not the expected multi-signature address -/// derived from the provided pks, weights, and threshold parameters +/// - With ESenderIsNotValidMultisig if the transaction sender is not the protocol's admin multisig /// - With ECannotDisableNewerVersion if trying to disable a newer version /// - With EVersionNotEnabled if the version is not currently enabled public fun disable_version( treasury: &mut Treasury, + multisig_config: &MultisigConfig, _admin: &AdminCap, version: u16, - pks: vector>, - weights: vector, - threshold: u16, ctx: &mut TxContext, ) { - assert!( - multisig::check_if_sender_is_multisig_address(pks, weights, threshold, ctx), - ESenderIsNotMultisig, - ); + multisig_config.validate_sender_is_admin_multisig(ctx); assert!(version <= current_version(), ECannotDisableNewerVersion); assert!(treasury.allowed_versions.contains(&version), EVersionNotEnabled); diff --git a/packages/deeptrade-core/tests/admin/admin_init_tests.move b/packages/deeptrade-core/tests/admin/admin_init_tests.move index 5d3b0458..10f5eb41 100644 --- a/packages/deeptrade-core/tests/admin/admin_init_tests.move +++ b/packages/deeptrade-core/tests/admin/admin_init_tests.move @@ -2,6 +2,7 @@ module deeptrade_core::admin_init_tests; use deeptrade_core::admin::{Self, AdminCap}; +use deeptrade_core::update_multisig_config_tests::setup_with_initialized_config; use std::unit_test::assert_eq; use sui::test_scenario; @@ -33,7 +34,8 @@ fun init_logic_creates_and_transfers_admin_cap_to_publisher() { /// Initializes admin and gives the AdminCap to the OWNER. #[test_only] public fun setup_with_admin_cap(owner: address): test_scenario::Scenario { - let mut scenario = test_scenario::begin(owner); + let mut scenario = setup_with_initialized_config(); + scenario.next_tx(owner); { admin::init_for_testing(scenario.ctx()); }; diff --git a/packages/deeptrade-core/tests/fee/estimate_full_fee_market_tests.move b/packages/deeptrade-core/tests/fee/estimate_full_fee_market_tests.move index 033897cd..ae42295b 100644 --- a/packages/deeptrade-core/tests/fee/estimate_full_fee_market_tests.move +++ b/packages/deeptrade-core/tests/fee/estimate_full_fee_market_tests.move @@ -20,13 +20,10 @@ use deeptrade_core::get_sui_per_deep_from_oracle_tests::{ new_sui_price_object }; use deeptrade_core::loyalty::{Self, LoyaltyAdminCap, LoyaltyProgram}; +use deeptrade_core::multisig_config::MultisigConfig; use deeptrade_core::treasury; -use multisig::multisig_test_utils::{ - get_test_multisig_address, - get_test_multisig_pks, - get_test_multisig_weights, - get_test_multisig_threshold -}; +use deeptrade_core::update_multisig_config_tests::setup_with_initialized_config; +use multisig::multisig_test_utils::get_test_multisig_address; use pyth::price_info::{Self, PriceInfoObject}; use sui::clock; use sui::coin; @@ -183,7 +180,7 @@ public(package) fun setup_test_environment(): ( PriceInfoObject, ID, ) { - let mut scenario = begin(OWNER); + let mut scenario = setup_with_initialized_config(); // Setup treasury scenario.next_tx(OWNER); @@ -294,44 +291,40 @@ public(package) fun setup_test_environment(): ( let loyalty_program_id = { let mut loyalty_program = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); + let config = scenario.take_shared(); // Add test loyalty levels loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_BRONZE, BRONZE_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_SILVER, SILVER_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_GOLD, GOLD_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); let loyalty_program_id = object::id(&loyalty_program); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); loyalty_program_id }; diff --git a/packages/deeptrade-core/tests/helpers/calculate_market_order_params_tests.move b/packages/deeptrade-core/tests/helpers/calculate_market_order_params_tests.move index 1b2298b0..854ab75e 100644 --- a/packages/deeptrade-core/tests/helpers/calculate_market_order_params_tests.move +++ b/packages/deeptrade-core/tests/helpers/calculate_market_order_params_tests.move @@ -21,19 +21,16 @@ use deeptrade_core::get_sui_per_deep_from_oracle_tests::{ }; use deeptrade_core::helper; use deeptrade_core::loyalty::{Self, LoyaltyProgram}; +use deeptrade_core::multisig_config::MultisigConfig; use deeptrade_core::treasury; -use multisig::multisig_test_utils::{ - get_test_multisig_address, - get_test_multisig_pks, - get_test_multisig_weights, - get_test_multisig_threshold -}; +use deeptrade_core::update_multisig_config_tests::setup_with_initialized_config; +use multisig::multisig_test_utils::get_test_multisig_address; use pyth::price_info::{Self, PriceInfoObject}; use std::unit_test::assert_eq; use sui::clock; use sui::coin; use sui::sui::SUI; -use sui::test_scenario::{Self, Scenario, begin, end, return_shared}; +use sui::test_scenario::{Self, Scenario, end, return_shared}; use sui::test_utils::destroy; use token::deep::DEEP; @@ -60,7 +57,7 @@ public(package) fun setup_test_environment(): ( PriceInfoObject, ID, ) { - let mut scenario = begin(OWNER); + let mut scenario = setup_with_initialized_config(); // Setup treasury scenario.next_tx(OWNER); @@ -171,44 +168,40 @@ public(package) fun setup_test_environment(): ( let loyalty_program_id = { let mut loyalty_program = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); + let config = scenario.take_shared(); // Add test loyalty levels loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_BRONZE, BRONZE_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_SILVER, SILVER_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_GOLD, GOLD_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); let loyalty_program_id = object::id(&loyalty_program); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); loyalty_program_id }; diff --git a/packages/deeptrade-core/tests/loyalty/add_loyalty_level.move b/packages/deeptrade-core/tests/loyalty/add_loyalty_level.move index 48cee985..23e097c1 100644 --- a/packages/deeptrade-core/tests/loyalty/add_loyalty_level.move +++ b/packages/deeptrade-core/tests/loyalty/add_loyalty_level.move @@ -6,17 +6,13 @@ use deeptrade_core::loyalty::{ LoyaltyAdminCap, LoyaltyProgram, ELoyaltyLevelAlreadyExists, - EInvalidFeeDiscountRate, - ESenderIsNotMultisig -}; -use multisig::multisig_test_utils::{ - get_test_multisig_address, - get_test_multisig_pks, - get_test_multisig_weights, - get_test_multisig_threshold + EInvalidFeeDiscountRate }; +use deeptrade_core::multisig_config::{MultisigConfig, ESenderIsNotValidMultisig}; +use deeptrade_core::update_multisig_config_tests::setup_with_initialized_config; +use multisig::multisig_test_utils::get_test_multisig_address; use std::unit_test::assert_eq; -use sui::test_scenario::{Scenario, begin, end, return_shared}; +use sui::test_scenario::{Scenario, end, return_shared}; use sui::test_utils::destroy; // === Constants === @@ -49,16 +45,15 @@ fun successful_add_loyalty_level() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, PLATINUM_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -76,6 +71,7 @@ fun successful_add_loyalty_level() { destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -89,39 +85,34 @@ fun add_multiple_loyalty_levels() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Add multiple levels loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_BRONZE, BRONZE_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_SILVER, SILVER_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_GOLD, GOLD_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -153,6 +144,7 @@ fun add_multiple_loyalty_levels() { destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -166,16 +158,15 @@ fun add_level_with_max_discount_rate() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, MAX_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -189,6 +180,7 @@ fun add_level_with_max_discount_rate() { destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -202,22 +194,22 @@ fun add_level_with_zero_discount_rate_fails() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Try to add level with zero discount rate (should fail) loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_BRONZE, ZERO_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -231,29 +223,26 @@ fun add_level_with_different_level_ids() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Add level with ID 0 loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_ZERO, BRONZE_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); // Add level with max u8 value loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_MAX, GOLD_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -274,6 +263,7 @@ fun add_level_with_different_level_ids() { destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -287,34 +277,32 @@ fun add_duplicate_level_fails() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Add level first time loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_SILVER, SILVER_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); // Try to add the same level again loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_SILVER, GOLD_DISCOUNT, // Different discount rate, but same level ID - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -328,50 +316,50 @@ fun add_level_with_invalid_discount_rate_fails() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Try to add level with discount rate > 100% loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, INVALID_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); } -#[test, expected_failure(abort_code = ESenderIsNotMultisig)] +#[test, expected_failure(abort_code = ESenderIsNotValidMultisig)] fun non_multisig_sender_fails() { let mut scenario = setup_test_environment(); scenario.next_tx(OWNER); { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Use invalid multisig parameters to trigger failure loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_GOLD, GOLD_DISCOUNT, - vector[vector[1u8, 2u8, 3u8]], // Invalid public key - vector[1u8], // Invalid weight - 1u16, // Invalid threshold scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -387,57 +375,56 @@ fun add_then_remove_then_add_again() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, PLATINUM_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; // Remove level scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; // Add level again scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, GOLD_DISCOUNT, // Different discount rate this time - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -451,6 +438,7 @@ fun add_then_remove_then_add_again() { destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -466,21 +454,21 @@ fun add_level_then_grant_to_user() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, PLATINUM_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; // Grant the new level to a user @@ -519,7 +507,7 @@ fun add_level_then_grant_to_user() { /// Returns (scenario) ready for testing. #[test_only] public(package) fun setup_test_environment(): Scenario { - let mut scenario = begin(OWNER); + let mut scenario = setup_with_initialized_config(); // Initialize loyalty program scenario.next_tx(OWNER); diff --git a/packages/deeptrade-core/tests/loyalty/get_user_discount_rate.move b/packages/deeptrade-core/tests/loyalty/get_user_discount_rate.move index 4773c92f..05f298aa 100644 --- a/packages/deeptrade-core/tests/loyalty/get_user_discount_rate.move +++ b/packages/deeptrade-core/tests/loyalty/get_user_discount_rate.move @@ -3,12 +3,8 @@ module deeptrade_core::get_user_discount_rate_tests; use deeptrade_core::grant_user_level_tests::setup_test_environment; use deeptrade_core::loyalty::{Self, LoyaltyAdminCap, LoyaltyProgram}; -use multisig::multisig_test_utils::{ - get_test_multisig_address, - get_test_multisig_pks, - get_test_multisig_weights, - get_test_multisig_threshold -}; +use deeptrade_core::multisig_config::MultisigConfig; +use multisig::multisig_test_utils::get_test_multisig_address; use std::unit_test::assert_eq; use sui::test_scenario::{end, return_shared}; use sui::test_utils::destroy; @@ -227,22 +223,22 @@ fun get_discount_rate_for_nonexistent_level_edge_case() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Add a new level loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, PLATINUM_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; // Grant the new level to ALICE @@ -293,20 +289,20 @@ fun get_discount_rate_for_nonexistent_level_edge_case() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; // Verify discount rate is now 0 (user has no level) diff --git a/packages/deeptrade-core/tests/loyalty/grant_user_level.move b/packages/deeptrade-core/tests/loyalty/grant_user_level.move index 946923c3..3c94f0ab 100644 --- a/packages/deeptrade-core/tests/loyalty/grant_user_level.move +++ b/packages/deeptrade-core/tests/loyalty/grant_user_level.move @@ -1,6 +1,7 @@ #[test_only] module deeptrade_core::grant_user_level_tests; +use deeptrade_core::initialize_multisig_config_tests::setup; use deeptrade_core::loyalty::{ Self, LoyaltyProgram, @@ -9,14 +10,11 @@ use deeptrade_core::loyalty::{ EUserAlreadyHasLoyaltyLevel, ESenderIsNotLoyaltyAdmin }; -use multisig::multisig_test_utils::{ - get_test_multisig_address, - get_test_multisig_pks, - get_test_multisig_weights, - get_test_multisig_threshold -}; +use deeptrade_core::multisig_config::{MultisigConfig, EMultisigConfigNotInitialized}; +use deeptrade_core::update_multisig_config_tests::setup_with_initialized_config; +use multisig::multisig_test_utils::get_test_multisig_address; use std::unit_test::assert_eq; -use sui::test_scenario::{Scenario, begin, end, return_shared}; +use sui::test_scenario::{Scenario, end, return_shared}; use sui::test_utils::destroy; // === Constants === @@ -317,13 +315,48 @@ fun grant_to_zero_address_succeeds() { end(scenario); } +#[test, expected_failure(abort_code = EMultisigConfigNotInitialized)] +fun add_loyalty_level_fails_uninitialized_config() { + let mut scenario = setup(); + let multisig_address = get_test_multisig_address(); + + // Initialize loyalty program + scenario.next_tx(OWNER); + { + loyalty::init_for_testing(scenario.ctx()); + }; + + scenario.next_tx(multisig_address); + { + let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); + let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); + + // This should fail because the config is not initialized + loyalty::add_loyalty_level( + &mut loyalty_program, + &config, + &admin_cap, + LEVEL_BRONZE, + BRONZE_DISCOUNT, + scenario.ctx(), + ); + + destroy(admin_cap); + return_shared(loyalty_program); + return_shared(config); + }; + + end(scenario); +} + // === Helper Functions === /// Sets up a complete test environment with loyalty program. /// Returns (scenario, loyalty_program_id) ready for testing. #[test_only] public(package) fun setup_test_environment(): (Scenario, ID) { - let mut scenario = begin(OWNER); + let mut scenario = setup_with_initialized_config(); // Initialize loyalty program scenario.next_tx(OWNER); @@ -336,45 +369,41 @@ public(package) fun setup_test_environment(): (Scenario, ID) { scenario.next_tx(multisig_address); let loyalty_program_id = { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Add test loyalty levels loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_BRONZE, BRONZE_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_SILVER, SILVER_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_GOLD, GOLD_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); let loyalty_program_id = object::id(&loyalty_program); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); loyalty_program_id }; diff --git a/packages/deeptrade-core/tests/loyalty/remove_loyalty_level.move b/packages/deeptrade-core/tests/loyalty/remove_loyalty_level.move index c752654b..b1d3e534 100644 --- a/packages/deeptrade-core/tests/loyalty/remove_loyalty_level.move +++ b/packages/deeptrade-core/tests/loyalty/remove_loyalty_level.move @@ -7,15 +7,10 @@ use deeptrade_core::loyalty::{ LoyaltyAdminCap, LoyaltyProgram, ELoyaltyLevelNotFound, - ELoyaltyLevelHasUsers, - ESenderIsNotMultisig -}; -use multisig::multisig_test_utils::{ - get_test_multisig_address, - get_test_multisig_pks, - get_test_multisig_weights, - get_test_multisig_threshold + ELoyaltyLevelHasUsers }; +use deeptrade_core::multisig_config::{MultisigConfig, ESenderIsNotValidMultisig}; +use multisig::multisig_test_utils::get_test_multisig_address; use std::unit_test::assert_eq; use sui::test_scenario::{end, return_shared}; use sui::test_utils::destroy; @@ -49,37 +44,36 @@ fun successful_remove_loyalty_level() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Add a new level first loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, PLATINUM_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; // Now remove the level scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -96,6 +90,7 @@ fun successful_remove_loyalty_level() { destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -109,79 +104,70 @@ fun remove_multiple_empty_levels() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Add multiple new levels loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, PLATINUM_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, 10u8, SILVER_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, 20u8, GOLD_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; // Remove all the new levels scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, 10u8, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, 20u8, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -217,6 +203,7 @@ fun remove_multiple_empty_levels() { destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -230,58 +217,53 @@ fun remove_level_with_different_ids() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Add levels with different IDs loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_ZERO, BRONZE_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_MAX, GOLD_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; // Remove the levels scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_ZERO, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_MAX, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -300,6 +282,7 @@ fun remove_level_with_different_ids() { destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -313,21 +296,21 @@ fun remove_nonexistent_level_fails() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Try to remove a level that doesn't exist loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, 99u8, // Non-existent level - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -360,47 +343,47 @@ fun remove_level_with_members_fails() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_BRONZE, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); } -#[test, expected_failure(abort_code = ESenderIsNotMultisig)] +#[test, expected_failure(abort_code = ESenderIsNotValidMultisig)] fun non_multisig_sender_fails() { let (mut scenario, loyalty_program_id) = setup_test_environment(); scenario.next_tx(OWNER); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Use invalid multisig parameters to trigger failure loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_BRONZE, - vector[vector[1u8, 2u8, 3u8]], // Invalid public key - vector[1u8], // Invalid weight - 1u16, // Invalid threshold scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -466,15 +449,14 @@ fun remove_level_after_revoking_all_users() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_BRONZE, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -487,6 +469,7 @@ fun remove_level_after_revoking_all_users() { destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -502,36 +485,31 @@ fun remove_last_level() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Remove all levels (they start with 0 members) loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_BRONZE, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_SILVER, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_GOLD, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -555,6 +533,7 @@ fun remove_last_level() { destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); @@ -568,48 +547,49 @@ fun remove_level_then_verify_state() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Add a new level loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, PLATINUM_DISCOUNT, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; // Remove the level scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::remove_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; // Verify level is completely removed and can't be accessed scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared_by_id(loyalty_program_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); // Verify level doesn't exist @@ -626,12 +606,10 @@ fun remove_level_then_verify_state() { // Verify we can add the same level again (proving it was completely removed) loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_PLATINUM, GOLD_DISCOUNT, // Different discount rate - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -645,6 +623,7 @@ fun remove_level_then_verify_state() { destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; end(scenario); diff --git a/packages/deeptrade-core/tests/loyalty/update_loyalty_admin_cap_owner.move b/packages/deeptrade-core/tests/loyalty/update_loyalty_admin_cap_owner.move index 41ebff72..b36ac3b6 100644 --- a/packages/deeptrade-core/tests/loyalty/update_loyalty_admin_cap_owner.move +++ b/packages/deeptrade-core/tests/loyalty/update_loyalty_admin_cap_owner.move @@ -4,12 +4,8 @@ module deeptrade_core::update_loyalty_admin_cap_owner_tests; use deeptrade_core::add_loyalty_level_tests::setup_test_environment; use deeptrade_core::admin; use deeptrade_core::loyalty::{Self, LoyaltyAdminCap, LoyaltyProgram, ESenderIsNotLoyaltyAdmin}; -use multisig::multisig_test_utils::{ - get_test_multisig_address, - get_test_multisig_pks, - get_test_multisig_weights, - get_test_multisig_threshold -}; +use deeptrade_core::multisig_config::{MultisigConfig, ESenderIsNotValidMultisig}; +use multisig::multisig_test_utils::get_test_multisig_address; use std::unit_test::assert_eq; use sui::test_scenario::{end, return_shared}; use sui::test_utils::destroy; @@ -28,15 +24,14 @@ fun successful_owner_update() { scenario.next_tx(multisig_address); { let mut loyalty_admin_cap = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::update_loyalty_admin_cap_owner( &mut loyalty_admin_cap, + &config, &admin_cap, ALICE, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -44,6 +39,7 @@ fun successful_owner_update() { destroy(admin_cap); return_shared(loyalty_admin_cap); + return_shared(config); }; // 2. Verify new owner (ALICE) can grant levels @@ -51,19 +47,19 @@ fun successful_owner_update() { scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, 1, 100_000_000, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; scenario.next_tx(ALICE); @@ -91,39 +87,39 @@ fun old_owner_cannot_grant_level() { scenario.next_tx(multisig_address); { let mut loyalty_admin_cap = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::update_loyalty_admin_cap_owner( &mut loyalty_admin_cap, + &config, &admin_cap, ALICE, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_admin_cap); + return_shared(config); }; // 2. Add a dummy level scenario.next_tx(multisig_address); { let mut loyalty_program = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, 1, 100_000_000, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; // 3. Verify old owner (OWNER) fails to grant level @@ -141,27 +137,27 @@ fun old_owner_cannot_grant_level() { end(scenario); } -#[test, expected_failure(abort_code = loyalty::ESenderIsNotMultisig)] +#[test, expected_failure(abort_code = ESenderIsNotValidMultisig)] fun non_multisig_sender_fails() { let mut scenario = setup_test_environment(); scenario.next_tx(OWNER); { let mut loyalty_admin_cap = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::update_loyalty_admin_cap_owner( &mut loyalty_admin_cap, + &config, &admin_cap, ALICE, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_admin_cap); + return_shared(config); }; end(scenario); @@ -175,15 +171,14 @@ fun update_to_same_owner() { scenario.next_tx(multisig_address); { let mut loyalty_admin_cap = scenario.take_shared(); + let config = scenario.take_shared(); let admin_cap = admin::get_admin_cap_for_testing(scenario.ctx()); loyalty::update_loyalty_admin_cap_owner( &mut loyalty_admin_cap, + &config, &admin_cap, OWNER, // Update to the same owner - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -191,6 +186,7 @@ fun update_to_same_owner() { destroy(admin_cap); return_shared(loyalty_admin_cap); + return_shared(config); }; end(scenario); diff --git a/packages/deeptrade-core/tests/multisig_config/initialize_multisig_config.move b/packages/deeptrade-core/tests/multisig_config/initialize_multisig_config.move new file mode 100644 index 00000000..5b0dcda9 --- /dev/null +++ b/packages/deeptrade-core/tests/multisig_config/initialize_multisig_config.move @@ -0,0 +1,280 @@ +#[test_only] +module deeptrade_core::initialize_multisig_config_tests; + +use deeptrade_core::multisig_config::{ + Self, + MultisigConfig, + MultisigConfigInitialized, + EMultisigConfigAlreadyInitialized, + ETooFewSigners +}; +use multisig::multisig::{ + Self, + ELengthsOfPksAndWeightsAreNotEqual, + EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights +}; +use multisig::multisig_test_utils::{ + get_test_multisig_pks, + get_test_multisig_weights, + get_test_multisig_threshold, + get_test_multisig_address +}; +use std::unit_test::assert_eq; +use sui::event; +use sui::test_scenario::{Self, Scenario, end, return_shared}; +use sui::test_utils; + +const OWNER: address = @0x1; + +// === Tests === + +#[test] +fun success() { + let mut scenario = setup(); + + let pks = get_test_multisig_pks(); + let weights = get_test_multisig_weights(); + let threshold = get_test_multisig_threshold(); + let multisig_address = get_test_multisig_address(); + + let config_id; + + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + config_id = object::id(&config); + + multisig_config::initialize_multisig_config( + &mut config, + &admin_cap, + pks, + weights, + threshold, + ); + + let ( + updated_pks, + updated_weights, + updated_threshold, + ) = multisig_config::get_multisig_config_params(&config); + + let new_address_derived = multisig::derive_multisig_address_quiet( + updated_pks, + updated_weights, + updated_threshold, + ); + + assert_eq!(updated_pks, pks); + assert_eq!(updated_weights, weights); + assert_eq!(updated_threshold, threshold); + assert_eq!(new_address_derived, multisig_address); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + let events = event::events_by_type(); + assert_eq!(events.length(), 1); + let event = events[0]; + + let ( + event_config_id, + event_pks, + event_weights, + event_threshold, + event_address, + ) = multisig_config::unwrap_multisig_config_initialized_event(&event); + + assert_eq!(config_id, event_config_id); + assert_eq!(pks, event_pks); + assert_eq!(weights, event_weights); + assert_eq!(threshold, event_threshold); + assert_eq!(multisig_address, event_address); + + end(scenario); +} + +#[test, expected_failure(abort_code = EMultisigConfigAlreadyInitialized)] +fun already_initialized_fails() { + let mut scenario = setup(); + + let pks = get_test_multisig_pks(); + let weights = get_test_multisig_weights(); + let threshold = get_test_multisig_threshold(); + + // First call, successful initialization + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + + multisig_config::initialize_multisig_config( + &mut config, + &admin_cap, + pks, + weights, + threshold, + ); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + // Second call, should fail + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + + multisig_config::initialize_multisig_config( + &mut config, + &admin_cap, + pks, + weights, + threshold, + ); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + end(scenario); +} + +#[test, expected_failure(abort_code = ELengthsOfPksAndWeightsAreNotEqual)] +fun mismatched_pks_and_weights_fails() { + let mut scenario = setup(); + + let pks = get_test_multisig_pks(); + let mut weights = get_test_multisig_weights(); + let threshold = get_test_multisig_threshold(); + + // Remove one weight to create a mismatch + weights.pop_back(); + + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + + multisig_config::initialize_multisig_config( + &mut config, + &admin_cap, + pks, + weights, + threshold, + ); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + end(scenario); +} + +#[test, expected_failure(abort_code = EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights)] +fun zero_threshold_fails() { + let mut scenario = setup(); + + let pks = get_test_multisig_pks(); + let weights = get_test_multisig_weights(); + let threshold = 0; + + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + + multisig_config::initialize_multisig_config( + &mut config, + &admin_cap, + pks, + weights, + threshold, + ); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + end(scenario); +} + +#[test, expected_failure(abort_code = EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights)] +fun unachievable_threshold_fails() { + let mut scenario = setup(); + + let pks = get_test_multisig_pks(); + let weights = get_test_multisig_weights(); + // Sum of weights is 3, so 4 is unachievable + let threshold = 4; + + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + + multisig_config::initialize_multisig_config( + &mut config, + &admin_cap, + pks, + weights, + threshold, + ); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + end(scenario); +} + +#[test, expected_failure(abort_code = ETooFewSigners)] +fun too_few_signers_fails() { + let mut scenario = setup(); + + let mut pks = get_test_multisig_pks(); + let mut weights = get_test_multisig_weights(); + // With one signer, threshold must be 1 + let threshold = 1; + + // Remove two signers to have only one + pks.pop_back(); + pks.pop_back(); + weights.pop_back(); + weights.pop_back(); + + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + + multisig_config::initialize_multisig_config( + &mut config, + &admin_cap, + pks, + weights, + threshold, + ); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + end(scenario); +} + +// === Helpers === + +#[test_only] +public(package) fun setup(): Scenario { + let mut scenario = test_scenario::begin(OWNER); + + scenario.next_tx(OWNER); + { + multisig_config::init_for_testing(scenario.ctx()); + }; + + scenario +} diff --git a/packages/deeptrade-core/tests/multisig_config/update_multisig_config.move b/packages/deeptrade-core/tests/multisig_config/update_multisig_config.move new file mode 100644 index 00000000..bab775bc --- /dev/null +++ b/packages/deeptrade-core/tests/multisig_config/update_multisig_config.move @@ -0,0 +1,321 @@ +#[test_only] +module deeptrade_core::update_multisig_config_tests; + +use deeptrade_core::initialize_multisig_config_tests::setup; +use deeptrade_core::multisig_config::{ + Self, + MultisigConfig, + MultisigConfigUpdated, + ENewAddressIsOldAddress, + EMultisigConfigNotInitialized, + ETooFewSigners +}; +use multisig::multisig::{ + Self, + ELengthsOfPksAndWeightsAreNotEqual, + EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights +}; +use multisig::multisig_test_utils::{ + get_test_multisig_pks, + get_test_multisig_weights, + get_test_multisig_threshold, + get_test_multisig_address +}; +use std::unit_test::assert_eq; +use sui::event; +use sui::test_scenario::{Scenario, return_shared, end}; +use sui::test_utils; + +const OWNER: address = @0x1; + +// === Tests === + +#[test] +fun success() { + let mut scenario = setup_with_initialized_config(); + + let old_pks = get_test_multisig_pks(); + let old_weights = get_test_multisig_weights(); + let old_threshold = get_test_multisig_threshold(); + let old_address = get_test_multisig_address(); + + // Create a new valid config + let new_pks = vector[b"pk1_new", b"pk2_new", b"pk3_new"]; + let new_weights = vector[1, 1, 1]; + let new_threshold = 2; + let new_address = multisig::derive_multisig_address_quiet( + new_pks, + new_weights, + new_threshold, + ); + let config_id: ID; + + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + config_id = object::id(&config); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + + multisig_config::update_multisig_config( + &mut config, + &admin_cap, + new_pks, + new_weights, + new_threshold, + ); + + let ( + updated_pks, + updated_weights, + updated_threshold, + ) = multisig_config::get_multisig_config_params(&config); + + let new_address_derived = multisig::derive_multisig_address_quiet( + updated_pks, + updated_weights, + updated_threshold, + ); + + assert_eq!(updated_pks, new_pks); + assert_eq!(updated_weights, new_weights); + assert_eq!(updated_threshold, new_threshold); + assert_eq!(new_address_derived, new_address); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + let events = event::events_by_type(); + assert_eq!(events.length(), 1); + let event = events[0]; + + let ( + event_config_id, + event_old_pks, + event_new_pks, + event_old_weights, + event_new_weights, + event_old_threshold, + event_new_threshold, + event_old_address, + event_new_address, + ) = multisig_config::unwrap_multisig_config_updated_event(&event); + + assert_eq!(config_id, event_config_id); + assert_eq!(old_pks, event_old_pks); + assert_eq!(new_pks, event_new_pks); + assert_eq!(old_weights, event_old_weights); + assert_eq!(new_weights, event_new_weights); + assert_eq!(old_threshold, event_old_threshold); + assert_eq!(new_threshold, event_new_threshold); + assert_eq!(old_address, event_old_address); + assert_eq!(new_address, event_new_address); + + end(scenario); +} + +#[test, expected_failure(abort_code = EMultisigConfigNotInitialized)] +fun not_initialized_fails() { + let mut scenario = setup(); + + let new_pks = get_test_multisig_pks(); + let new_weights = get_test_multisig_weights(); + let new_threshold = get_test_multisig_threshold(); + + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + + multisig_config::update_multisig_config( + &mut config, + &admin_cap, + new_pks, + new_weights, + new_threshold, + ); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + end(scenario); +} + +#[test, expected_failure(abort_code = ENewAddressIsOldAddress)] +fun new_address_is_old_address_fails() { + let mut scenario = setup_with_initialized_config(); + + // Attempt to update with the same parameters used for initialization + let pks = get_test_multisig_pks(); + let weights = get_test_multisig_weights(); + let threshold = get_test_multisig_threshold(); + + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + + multisig_config::update_multisig_config( + &mut config, + &admin_cap, + pks, + weights, + threshold, + ); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + end(scenario); +} + +#[test, expected_failure(abort_code = ELengthsOfPksAndWeightsAreNotEqual)] +fun mismatched_pks_and_weights_fails() { + let mut scenario = setup_with_initialized_config(); + + let new_pks = get_test_multisig_pks(); + let mut new_weights = get_test_multisig_weights(); + let new_threshold = get_test_multisig_threshold(); + + // Create a mismatch + new_weights.pop_back(); + + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + + multisig_config::update_multisig_config( + &mut config, + &admin_cap, + new_pks, + new_weights, + new_threshold, + ); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + end(scenario); +} + +#[test, expected_failure(abort_code = EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights)] +fun zero_threshold_fails() { + let mut scenario = setup_with_initialized_config(); + + let new_pks = get_test_multisig_pks(); + let new_weights = get_test_multisig_weights(); + let new_threshold = 0; + + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + + multisig_config::update_multisig_config( + &mut config, + &admin_cap, + new_pks, + new_weights, + new_threshold, + ); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + end(scenario); +} + +#[test, expected_failure(abort_code = EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights)] +fun unachievable_threshold_fails() { + let mut scenario = setup_with_initialized_config(); + + let new_pks = get_test_multisig_pks(); + let new_weights = get_test_multisig_weights(); + // Sum of weights is 3, so 4 is unachievable + let new_threshold = 4; + + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + + multisig_config::update_multisig_config( + &mut config, + &admin_cap, + new_pks, + new_weights, + new_threshold, + ); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + end(scenario); +} + +#[test, expected_failure(abort_code = ETooFewSigners)] +fun too_few_signers_fails() { + let mut scenario = setup_with_initialized_config(); + + let mut new_pks = get_test_multisig_pks(); + let mut new_weights = get_test_multisig_weights(); + // With one signer, threshold must be 1 + let new_threshold = 1; + + // Remove two signers to have only one + new_pks.pop_back(); + new_pks.pop_back(); + new_weights.pop_back(); + new_weights.pop_back(); + + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + + multisig_config::update_multisig_config( + &mut config, + &admin_cap, + new_pks, + new_weights, + new_threshold, + ); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + end(scenario); +} + +// === Helpers === +#[test_only] +public(package) fun setup_with_initialized_config(): Scenario { + let mut scenario = setup(); + + // Initialize it + scenario.next_tx(OWNER); + { + let mut config = scenario.take_shared(); + let admin_cap = multisig_config::get_multisig_admin_cap_for_testing(scenario.ctx()); + + multisig_config::initialize_multisig_config( + &mut config, + &admin_cap, + get_test_multisig_pks(), + get_test_multisig_weights(), + get_test_multisig_threshold(), + ); + + test_utils::destroy(admin_cap); + return_shared(config); + }; + + scenario +} diff --git a/packages/deeptrade-core/tests/swap/get_quantity_out_input_fee_tests.move b/packages/deeptrade-core/tests/swap/get_quantity_out_input_fee_tests.move index ec13e6a2..605952a7 100644 --- a/packages/deeptrade-core/tests/swap/get_quantity_out_input_fee_tests.move +++ b/packages/deeptrade-core/tests/swap/get_quantity_out_input_fee_tests.move @@ -12,18 +12,15 @@ use deepbook::pool_tests::{ use deeptrade_core::fee::{Self, TradingFeeConfig}; use deeptrade_core::fee_manager::{Self, FeeManager}; use deeptrade_core::loyalty::{Self, LoyaltyAdminCap, LoyaltyProgram}; +use deeptrade_core::multisig_config::MultisigConfig; use deeptrade_core::swap::get_quantity_out_input_fee; use deeptrade_core::treasury; -use multisig::multisig_test_utils::{ - get_test_multisig_address, - get_test_multisig_pks, - get_test_multisig_weights, - get_test_multisig_threshold -}; +use deeptrade_core::update_multisig_config_tests::setup_with_initialized_config; +use multisig::multisig_test_utils::get_test_multisig_address; use std::unit_test::assert_eq; use sui::clock::Clock; use sui::sui::SUI; -use sui::test_scenario::{Self, Scenario, begin, end, return_shared}; +use sui::test_scenario::{Self, Scenario, end, return_shared}; use sui::test_utils::destroy; use token::deep::DEEP; @@ -333,7 +330,7 @@ fun no_loyalty_level() { /// Returns (scenario, pool_id, balance_manager_id, fee_manager_id) ready for testing. #[test_only] public(package) fun setup_test_environment(): (Scenario, ID, ID, ID) { - let mut scenario = begin(OWNER); + let mut scenario = setup_with_initialized_config(); // Setup treasury scenario.next_tx(OWNER); @@ -379,43 +376,39 @@ public(package) fun setup_test_environment(): (Scenario, ID, ID, ID) { { let mut loyalty_program = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); + let config = scenario.take_shared(); // Add test loyalty levels loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_BRONZE, 100_000_000, // 10% discount - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_SILVER, 250_000_000, // 25% discount - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); loyalty::add_loyalty_level( &mut loyalty_program, + &config, &admin_cap, LEVEL_GOLD, 500_000_000, // 50% discount - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(loyalty_program); + return_shared(config); }; // Add liquidity to the pool diff --git a/packages/deeptrade-core/tests/ticket/create_ticket_tests.move b/packages/deeptrade-core/tests/ticket/create_ticket_tests.move index 844b1cc4..9e8bd55c 100644 --- a/packages/deeptrade-core/tests/ticket/create_ticket_tests.move +++ b/packages/deeptrade-core/tests/ticket/create_ticket_tests.move @@ -3,19 +3,9 @@ module deeptrade_core::create_ticket_tests; use deeptrade_core::admin::AdminCap; use deeptrade_core::admin_init_tests::setup_with_admin_cap; -use deeptrade_core::ticket::{ - Self, - AdminTicket, - ESenderIsNotMultisig, - TicketCreated, - ticket_delay_duration -}; -use multisig::multisig_test_utils::{ - get_test_multisig_address, - get_test_multisig_pks, - get_test_multisig_weights, - get_test_multisig_threshold -}; +use deeptrade_core::multisig_config::{MultisigConfig, ESenderIsNotValidMultisig}; +use deeptrade_core::ticket::{Self, AdminTicket, TicketCreated, ticket_delay_duration}; +use multisig::multisig_test_utils::get_test_multisig_address; use std::unit_test::assert_eq; use sui::clock::{Self, Clock}; use sui::event; @@ -39,13 +29,12 @@ fun create_ticket_success_with_multisig() { let mut clock = clock::create_for_testing(scenario.ctx()); clock.set_for_testing(CLOCK_TIMESTAMP_MS); let admin_cap = scenario.take_from_sender(); + let config = scenario.take_shared(); ticket::create_ticket( + &config, &admin_cap, TICKET_TYPE, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), &clock, scenario.ctx(), ); @@ -60,6 +49,7 @@ fun create_ticket_success_with_multisig() { clock::destroy_for_testing(clock); scenario.return_to_sender(admin_cap); + return_shared(config); }; scenario.next_tx(multisig_address); @@ -78,7 +68,7 @@ fun create_ticket_success_with_multisig() { scenario.end(); } -#[test, expected_failure(abort_code = ESenderIsNotMultisig)] +#[test, expected_failure(abort_code = ESenderIsNotValidMultisig)] /// Test that ticket creation fails if the sender is not the derived multisig address. fun create_ticket_fails_if_sender_not_multisig() { let owner = @0xDEED; @@ -90,20 +80,20 @@ fun create_ticket_fails_if_sender_not_multisig() { { let clock = clock::create_for_testing(scenario.ctx()); let admin_cap = scenario.take_from_sender(); + let config = scenario.take_shared(); // This should abort ticket::create_ticket( + &config, &admin_cap, TICKET_TYPE, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), &clock, scenario.ctx(), ); clock::destroy_for_testing(clock); scenario.return_to_sender(admin_cap); + return_shared(config); }; scenario.end(); @@ -117,19 +107,19 @@ public fun create_ticket_with_multisig(scenario: &mut Scenario, ticket_type: u8) let clock = clock::create_for_testing(scenario.ctx()); let admin_cap = scenario.take_from_sender(); + let config = scenario.take_shared(); ticket::create_ticket( + &config, &admin_cap, ticket_type, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), &clock, scenario.ctx(), ); clock::destroy_for_testing(clock); scenario.return_to_sender(admin_cap); + return_shared(config); // We keep it here to make sure the ticket is available from Global Inventory in the next test scenario.next_tx(multisig_address); diff --git a/packages/deeptrade-core/tests/treasury/version_management_tests.move b/packages/deeptrade-core/tests/treasury/version_management_tests.move index b8ed46f4..118c87ab 100644 --- a/packages/deeptrade-core/tests/treasury/version_management_tests.move +++ b/packages/deeptrade-core/tests/treasury/version_management_tests.move @@ -4,6 +4,7 @@ module deeptrade_core::version_management_tests; use deeptrade_core::admin::AdminCap; use deeptrade_core::admin_init_tests::setup_with_admin_cap; use deeptrade_core::helper::current_version; +use deeptrade_core::multisig_config::{MultisigConfig, ESenderIsNotValidMultisig}; use deeptrade_core::treasury::{ Self, Treasury, @@ -15,15 +16,9 @@ use deeptrade_core::treasury::{ EVersionPermanentlyDisabled, EVersionAlreadyEnabled, EVersionNotEnabled, - ECannotDisableNewerVersion, - ESenderIsNotMultisig -}; -use multisig::multisig_test_utils::{ - get_test_multisig_address, - get_test_multisig_pks, - get_test_multisig_weights, - get_test_multisig_threshold + ECannotDisableNewerVersion }; +use multisig::multisig_test_utils::get_test_multisig_address; use sui::event; use sui::test_scenario::{Self, Scenario}; @@ -38,14 +33,13 @@ fun test_enable_new_version_success() { { let new_version = NEW_VERSION; assert!(!treasury.allowed_versions().contains(&new_version), 1); + let config = scenario.take_shared(); treasury::enable_version( &mut treasury, + &config, &admin_cap, NEW_VERSION, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -59,6 +53,7 @@ fun test_enable_new_version_success() { ); assert!(event_treasury_id == treasury_id, 4); assert!(event_version == NEW_VERSION, 5); + test_scenario::return_shared(config); }; test_scenario::return_shared(treasury); @@ -74,17 +69,16 @@ fun test_disable_current_version_success() { scenario.next_tx(multisig_address); { let version_to_disable = current_version(); + let config = scenario.take_shared(); assert!(treasury.allowed_versions().contains(&version_to_disable), 1); assert!(!treasury.disabled_versions().contains(&version_to_disable), 2); treasury::disable_version( &mut treasury, + &config, &admin_cap, version_to_disable, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -99,6 +93,7 @@ fun test_disable_current_version_success() { ); assert!(event_treasury_id == treasury_id, 6); assert!(event_version == version_to_disable, 7); + test_scenario::return_shared(config); }; test_scenario::return_shared(treasury); @@ -116,15 +111,15 @@ fun test_action_fails_on_disabled_version() { // Disable the current version scenario.next_tx(multisig_address); { + let config = scenario.take_shared(); treasury::disable_version( &mut treasury, + &config, &admin_cap, version_to_disable, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); + test_scenario::return_shared(config); }; // Attempt to perform a version-checked action @@ -151,30 +146,30 @@ fun test_reenable_disabled_version_fails() { // Disable the current version scenario.next_tx(multisig_address); { + let config = scenario.take_shared(); treasury::disable_version( &mut treasury, + &config, &admin_cap, version_to_disable, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); + test_scenario::return_shared(config); }; // Attempt to re-enable the disabled version scenario.next_tx(multisig_address); { + let config = scenario.take_shared(); // This should fail treasury::enable_version( &mut treasury, + &config, &admin_cap, version_to_disable, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); + test_scenario::return_shared(config); }; scenario.return_to_sender(admin_cap); @@ -190,16 +185,16 @@ fun test_enable_version_fails_already_enabled() { scenario.next_tx(multisig_address); { + let config = scenario.take_shared(); // Attempt to enable the current version, which is already enabled by default treasury::enable_version( &mut treasury, + &config, &admin_cap, current_version(), - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); + test_scenario::return_shared(config); }; scenario.return_to_sender(admin_cap); @@ -214,27 +209,25 @@ fun test_disable_version_fails_not_enabled() { scenario.next_tx(multisig_address); { + let config = scenario.take_shared(); // Disable the current version treasury::disable_version( &mut treasury, + &config, &admin_cap, current_version(), - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); // Disable the version that is not enabled (we already disabled the current version) treasury::disable_version( &mut treasury, + &config, &admin_cap, current_version(), - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); + test_scenario::return_shared(config); }; scenario.return_to_sender(admin_cap); @@ -249,16 +242,16 @@ fun test_disable_version_fails_newer_version() { scenario.next_tx(multisig_address); { + let config = scenario.take_shared(); // Attempt to disable a future version treasury::disable_version( &mut treasury, + &config, &admin_cap, current_version() + 1, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); + test_scenario::return_shared(config); }; scenario.return_to_sender(admin_cap); @@ -267,23 +260,23 @@ fun test_disable_version_fails_newer_version() { } #[test] -#[expected_failure(abort_code = ESenderIsNotMultisig)] +#[expected_failure(abort_code = ESenderIsNotValidMultisig)] fun test_version_management_fails_not_multisig() { let (mut scenario, _, admin_cap, mut treasury, _) = setup(); // Switch to a non-multisig user scenario.next_tx(FAKE_USER); { + let config = scenario.take_shared(); // Attempt to enable a version from an unauthorized address treasury::enable_version( &mut treasury, + &config, &admin_cap, NEW_VERSION, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); + test_scenario::return_shared(config); }; scenario.return_to_sender(admin_cap); @@ -292,23 +285,23 @@ fun test_version_management_fails_not_multisig() { } #[test] -#[expected_failure(abort_code = ESenderIsNotMultisig)] +#[expected_failure(abort_code = ESenderIsNotValidMultisig)] fun test_version_management_fails_not_multisig_disable() { let (mut scenario, _, admin_cap, mut treasury, _) = setup(); // Switch to a non-multisig user scenario.next_tx(FAKE_USER); { + let config = scenario.take_shared(); // Attempt to enable a version from an unauthorized address treasury::disable_version( &mut treasury, + &config, &admin_cap, current_version(), - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); + test_scenario::return_shared(config); }; scenario.return_to_sender(admin_cap); diff --git a/packages/deeptrade-core/tests/unsettled-fees/claim_protocol_unsettled_fee_storage_rebate.move b/packages/deeptrade-core/tests/unsettled-fees/claim_protocol_unsettled_fee_storage_rebate.move index 0d66790e..7ba898da 100644 --- a/packages/deeptrade-core/tests/unsettled-fees/claim_protocol_unsettled_fee_storage_rebate.move +++ b/packages/deeptrade-core/tests/unsettled-fees/claim_protocol_unsettled_fee_storage_rebate.move @@ -9,17 +9,12 @@ use deeptrade_core::fee_manager::{ settle_protocol_fee_and_record, start_protocol_fee_settlement, EInvalidOwner, - EProtocolUnsettledFeeNotEmpty, - ESenderIsNotMultisig + EProtocolUnsettledFeeNotEmpty }; +use deeptrade_core::multisig_config::{MultisigConfig, ESenderIsNotValidMultisig}; use deeptrade_core::settle_user_fees_tests::setup_test_environment; use deeptrade_core::treasury::Treasury; -use multisig::multisig_test_utils::{ - get_test_multisig_address, - get_test_multisig_pks, - get_test_multisig_weights, - get_test_multisig_threshold -}; +use multisig::multisig_test_utils::get_test_multisig_address; use std::unit_test::assert_eq; use sui::balance; use sui::sui::SUI; @@ -153,15 +148,14 @@ fun admin_claims_rebate_successfully() { { let treasury = scenario.take_shared(); let mut fee_manager = scenario.take_shared_by_id(fee_manager_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); claim_protocol_unsettled_fee_storage_rebate_admin( &treasury, &mut fee_manager, + &config, &admin_cap, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -171,12 +165,13 @@ fun admin_claims_rebate_successfully() { destroy(admin_cap); return_shared(treasury); return_shared(fee_manager); + return_shared(config); }; end(scenario); } -#[test, expected_failure(abort_code = ESenderIsNotMultisig)] +#[test, expected_failure(abort_code = ESenderIsNotValidMultisig)] /// Test that a non-multisig sender cannot claim a rebate via the admin function. fun non_multisig_admin_claim_fails() { let (mut scenario, fee_manager_id) = setup_protocol_fee_for_rebate(); @@ -186,21 +181,21 @@ fun non_multisig_admin_claim_fails() { { let treasury = scenario.take_shared(); let mut fee_manager = scenario.take_shared_by_id(fee_manager_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); claim_protocol_unsettled_fee_storage_rebate_admin( &treasury, &mut fee_manager, + &config, &admin_cap, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); destroy(admin_cap); return_shared(treasury); return_shared(fee_manager); + return_shared(config); }; end(scenario); diff --git a/packages/deeptrade-core/tests/unsettled-fees/claim_user_unsettled_fee_storage_rebate.move b/packages/deeptrade-core/tests/unsettled-fees/claim_user_unsettled_fee_storage_rebate.move index 64908501..24be1424 100644 --- a/packages/deeptrade-core/tests/unsettled-fees/claim_user_unsettled_fee_storage_rebate.move +++ b/packages/deeptrade-core/tests/unsettled-fees/claim_user_unsettled_fee_storage_rebate.move @@ -8,17 +8,12 @@ use deeptrade_core::fee_manager::{ claim_user_unsettled_fee_storage_rebate, claim_user_unsettled_fee_storage_rebate_admin, settle_filled_order_fee_and_record, - start_protocol_fee_settlement, - ESenderIsNotMultisig + start_protocol_fee_settlement }; +use deeptrade_core::multisig_config::{MultisigConfig, ESenderIsNotValidMultisig}; use deeptrade_core::settle_user_fees_tests::setup_test_environment; use deeptrade_core::treasury::Treasury; -use multisig::multisig_test_utils::{ - get_test_multisig_address, - get_test_multisig_pks, - get_test_multisig_weights, - get_test_multisig_threshold -}; +use multisig::multisig_test_utils::get_test_multisig_address; use std::unit_test::assert_eq; use sui::balance; use sui::sui::SUI; @@ -225,6 +220,7 @@ fun admin_claims_rebate_successfully() { let mut fee_manager = scenario.take_shared_by_id(fee_manager_id); let pool = scenario.take_shared_by_id(pool_id); let balance_manager = scenario.take_shared_by_id(balance_manager_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); claim_user_unsettled_fee_storage_rebate_admin( @@ -232,11 +228,9 @@ fun admin_claims_rebate_successfully() { &mut fee_manager, &pool, &balance_manager, + &config, &admin_cap, order_id, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -251,12 +245,13 @@ fun admin_claims_rebate_successfully() { return_shared(fee_manager); return_shared(pool); return_shared(balance_manager); + return_shared(config); }; end(scenario); } -#[test, expected_failure(abort_code = ESenderIsNotMultisig)] +#[test, expected_failure(abort_code = ESenderIsNotValidMultisig)] /// Test that a non-multisig sender cannot claim a rebate via the admin function. fun non_multisig_admin_claim_fails() { let ( @@ -274,6 +269,7 @@ fun non_multisig_admin_claim_fails() { let mut fee_manager = scenario.take_shared_by_id(fee_manager_id); let pool = scenario.take_shared_by_id(pool_id); let balance_manager = scenario.take_shared_by_id(balance_manager_id); + let config = scenario.take_shared(); let admin_cap = deeptrade_core::admin::get_admin_cap_for_testing(scenario.ctx()); claim_user_unsettled_fee_storage_rebate_admin( @@ -281,11 +277,9 @@ fun non_multisig_admin_claim_fails() { &mut fee_manager, &pool, &balance_manager, + &config, &admin_cap, order_id, - get_test_multisig_pks(), - get_test_multisig_weights(), - get_test_multisig_threshold(), scenario.ctx(), ); @@ -294,6 +288,7 @@ fun non_multisig_admin_claim_fails() { return_shared(fee_manager); return_shared(pool); return_shared(balance_manager); + return_shared(config); }; end(scenario); diff --git a/packages/deeptrade-core/tests/unsettled-fees/settle_user_fees.move b/packages/deeptrade-core/tests/unsettled-fees/settle_user_fees.move index 69662ecb..b8dce152 100644 --- a/packages/deeptrade-core/tests/unsettled-fees/settle_user_fees.move +++ b/packages/deeptrade-core/tests/unsettled-fees/settle_user_fees.move @@ -12,11 +12,12 @@ use deepbook::pool_tests::{ }; use deeptrade_core::fee_manager::{Self, FeeManager, settle_user_fees}; use deeptrade_core::treasury; +use deeptrade_core::update_multisig_config_tests::setup_with_initialized_config; use std::unit_test::assert_eq; use sui::balance; use sui::clock::Clock; use sui::sui::SUI; -use sui::test_scenario::{Self, Scenario, begin, end, return_shared}; +use sui::test_scenario::{Self, Scenario, end, return_shared}; use sui::test_utils::destroy; use token::deep::DEEP; @@ -1607,7 +1608,7 @@ fun settlement_with_maximum_precision_amounts() { /// - Creates FeeManager for ALICE #[test_only] public(package) fun setup_test_environment(): (Scenario, ID, ID, ID) { - let mut scenario = begin(OWNER); + let mut scenario = setup_with_initialized_config(); // Setup treasury scenario.next_tx(OWNER);