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.
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) to transfer (should 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 confirmation from multiple custodians is required,
use the function submitTransaction:
Parameters
dest— the transfer target address;value— the amount of funds (VMSHELL) to transfer (should 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:
In order for the recipient's contract to be deployed, its constructor must include a function for exchange SHELL tokens for VMSHELL
Last updated