How to deploy a Multisig Wallet
Create a Multisig wallet with TVM CLI
Prerequisites
Prepare wallet binary and ABI
Create a folder:
cd ~
mkdir wallet
cd walletDownload the UpdateCustodianMultisigWallet.abi.json and UpdateCustodianMultisigWallet.tvc files for your wallet from the updatecustodianmultisigwallet repository and place them in this folder.
The contract code can be downloaded from here
At the moment this wallet is undergoing formal verification. Wallet code may be updated during this process. However, the API of the wallet will remain the same.
Configure CLI tool
In this guide, we will use the test network at shellnet.ackinacki.org.
We need to specify the blockchain endpoint for deployment:
tvm-cli config -g --url shellnet.ackinacki.orgGenerate seed phrase, keys and address
In Acki Nacki blockchain, the Multisig wallet address depends on its binary code and initial data, which includes the owner's public key.
You can generate everything with one command:
Write down your seed phrase and store it in a secure location. Never share it with anyone. Avoid storing it in plain text, screenshots, or any other insecure method. If you lose it, you lose access to your assets. Anyone who obtains it will have full access to your assets.
Additionally, ensure the file containing the key pair is saved in a safe place.
After this step, the .tvc file will be overwritten with the specified keys.
The Raw address is the future Multisig wallet address. Keys are saved to updateCustodianMultisigWallet.keys.
Be sure to copy your seed phrase if you need it.

Request Test tokens
VMSHELL tokens are used to pay network fees and are derived from SHELL tokens. On the Mainnet, SHELL tokens are purchased via a special pool and then converted into VMSHELL tokens.
On the test network, you can request test tokens to be sent to your address. Please contact us on Telegram to receive them.
If you plan to test your smart contract systems, you can use the provided Multisig wallet to top up contract balances in order to cover gas fees.
Deploy your Multisig wallet
Once you receive the test tokens, check the state of the pre-deployed contract. It should be Uninit:
The received VMSHELL tokens will be displayed in the balance field.
VMSHELL tokens are transferred and stored in (in nanotokens) units.
The received SHELL tokens will be displayed in the ecc field under index 2

Now you are ready to deploy your Multisig wallet using the following command:
The arguments for the constructor must be enclosed in curly brackets: {<constructor arguments>}
owners_pubkey— an array of custodians’ public keys. Each key must include the0xprefixowners_address— an array of custodian contract addresses.reqConfirms— the number of signatures required to approve a transaction.reqConfirmsData— the number of confirmations required to approve a change of custodians.value— the amount (in nanotokens) of SHELL tokens you want to exchange for VMSHELL. If the exchange is not required, set the parametervalueto 0.
In our example, the command will be as follows:

Check the contract state again. This time, it should be Active
The contract deployment fee was deducted from the VMSHELL balance.

During contract deployment, 10 SHELL tokens were converted into 10 VMSHELL (values are specified in nanotokens).
Multisig Wallet API
In the examples below:
<MSIG_ADDR>— Multisig Wallet address (e.g.0:7a55...dd45)ABI file:
UpdateCustodianMultisigWallet.abi.jsonSigner keys (one of the custodians):
UpdateCustodianMultisigWallet.keys.json, generated in the previous step
The transaction expiration time is 1 hour.
VMSHELLs attached to the message will be credited to the recipient’s balance minus fees, provided the message is sent between contracts with the same DAPP ID.
If the DAPP IDs are different, the VMSHELLs will be burned
How to Send Tokens From Multisig Wallet
If the required number of confirmations for transactions is 1, tokens can be sent using the function
sendTransaction:
Parameters
dest- the transfer target address;value- the amount of funds (VMSHELL) used to pay fees (it must not be0);cc- a mapping of ECC token types to the token amounts to be transferred;bounce- bounce flag: (should befalse);flags- send message flags (should be1);payload- tree of cells used as the body of the outbound internal message (should be an empty string).
In this case, the transaction is executed immediately, without creating a request or requiring additional confirmations.
Example command:
If you need to fund an account that has not yet been deployed, you should use the
sendTransactionmethod with flag 16.In this case, you transfer SHELL tokens, which are automatically converted into VMSHELL tokens and credited to the balance of the account you intend to deploy. Example command:
As a result, the account balance will be credited with 5 VMSHELL After the transaction is confirmed, you can safely run the deploy command again.
If confirmation from multiple custodians is required, use the function
submitTransaction:
Parameters
dest— the transfer target address;value— the amount of funds (VMSHELL) used to pay fees (it must not be0);cc— a mapping of ECC token types to the token amounts to be transferred;bounce— bounce flag: (should befalse);flags— send message flags (usually1);payload— tree of cells used as the body of the outbound internal message (usually an empty string).
Return value
transactionId— identifier of the created multisig transaction. This id is later used inconfirmTransaction.
The transaction will be executed only after the required number of confirmations is collected.
Example command:
If the required number of confirmations for transactions is 1, submitTransaction behaves like sendTransaction and executes immediately.
How to Confirm a Transaction
To do this, use the function confirmTransaction
Parameters
transactionId— identifier of the transaction to confirm. You receive it as a result of callingsubmitTransaction
If the transaction has already expired, it will be deleted.
Example command:
How to create a request to update Multisig data
To change the list of custodians and the required number of confirmations, use the function submitDataUpdate
Parameters
owners_pubkey— array of custodian public keys;owners_address— array of custodian addresses;reqConfirms— required confirmations for regular transactions;reqConfirmsData— required confirmations for data update operations;
Return value
dataUpdateId— identifier of the created multisig transaction. This id is later used in confirmDataUpdate
Example command:
How to confirm a request to update the Multisig data
To do this, use the function confirmDataUpdate
Parameters
dataUpdateId— identifier of the data update request. You receive it as a result of callingsubmitDataUpdate
If the request is expired, it will be removed
Example command:
Last updated