Replace the shareholder allowlist draft
curl --request PUT \
--url https://sandbox.groundtech.co/v2/microvaults/vaults/{vaultId}/shareholders/draft \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"addresses": [
"0x3333333333333333333333333333333333333333"
]
}
'import requests
url = "https://sandbox.groundtech.co/v2/microvaults/vaults/{vaultId}/shareholders/draft"
payload = { "addresses": ["0x3333333333333333333333333333333333333333"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({addresses: ['0x3333333333333333333333333333333333333333']})
};
fetch('https://sandbox.groundtech.co/v2/microvaults/vaults/{vaultId}/shareholders/draft', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.groundtech.co/v2/microvaults/vaults/{vaultId}/shareholders/draft",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'addresses' => [
'0x3333333333333333333333333333333333333333'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.groundtech.co/v2/microvaults/vaults/{vaultId}/shareholders/draft"
payload := strings.NewReader("{\n \"addresses\": [\n \"0x3333333333333333333333333333333333333333\"\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://sandbox.groundtech.co/v2/microvaults/vaults/{vaultId}/shareholders/draft")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"addresses\": [\n \"0x3333333333333333333333333333333333333333\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.groundtech.co/v2/microvaults/vaults/{vaultId}/shareholders/draft")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"addresses\": [\n \"0x3333333333333333333333333333333333333333\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"draft": {
"id": "6898bf67-48e1-4d97-af8a-4e371ce2b23d",
"version": "2",
"root": "0x2222222222222222222222222222222222222222222222222222222222222222",
"addresses": [
"0x3333333333333333333333333333333333333333"
]
}
}{
"error": "microvaults_not_enabled",
"message": "MicroVaults are not enabled for this organization"
}{
"error": "Unauthenticated request",
"message": "Missing or invalid bearer token"
}{
"error": "microvaults_not_enabled",
"message": "MicroVaults are not enabled for this organization"
}Shareholders
Replace shareholder draft
Computes a new draft root. Publish it separately with a set_shareholder_root authorization before wallets can use the new proofs.
PUT
/
v2
/
microvaults
/
vaults
/
{vaultId}
/
shareholders
/
draft
Replace the shareholder allowlist draft
curl --request PUT \
--url https://sandbox.groundtech.co/v2/microvaults/vaults/{vaultId}/shareholders/draft \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"addresses": [
"0x3333333333333333333333333333333333333333"
]
}
'import requests
url = "https://sandbox.groundtech.co/v2/microvaults/vaults/{vaultId}/shareholders/draft"
payload = { "addresses": ["0x3333333333333333333333333333333333333333"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({addresses: ['0x3333333333333333333333333333333333333333']})
};
fetch('https://sandbox.groundtech.co/v2/microvaults/vaults/{vaultId}/shareholders/draft', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.groundtech.co/v2/microvaults/vaults/{vaultId}/shareholders/draft",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'addresses' => [
'0x3333333333333333333333333333333333333333'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.groundtech.co/v2/microvaults/vaults/{vaultId}/shareholders/draft"
payload := strings.NewReader("{\n \"addresses\": [\n \"0x3333333333333333333333333333333333333333\"\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://sandbox.groundtech.co/v2/microvaults/vaults/{vaultId}/shareholders/draft")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"addresses\": [\n \"0x3333333333333333333333333333333333333333\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.groundtech.co/v2/microvaults/vaults/{vaultId}/shareholders/draft")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"addresses\": [\n \"0x3333333333333333333333333333333333333333\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"draft": {
"id": "6898bf67-48e1-4d97-af8a-4e371ce2b23d",
"version": "2",
"root": "0x2222222222222222222222222222222222222222222222222222222222222222",
"addresses": [
"0x3333333333333333333333333333333333333333"
]
}
}{
"error": "microvaults_not_enabled",
"message": "MicroVaults are not enabled for this organization"
}{
"error": "Unauthenticated request",
"message": "Missing or invalid bearer token"
}{
"error": "microvaults_not_enabled",
"message": "MicroVaults are not enabled for this organization"
}Replace the proposed shareholder set and compute its Merkle root before publishing it onchain.
MicroVaults are in private preview for enabled sandbox organizations on Ethereum Sepolia.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Pattern:
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89aAbB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$Example:
"8f4c52d7-62ab-4db9-a964-92f481f6b851"
Body
application/json
Valid nonzero EVM EOA or contract address. Mixed-case values must use a valid EIP-55 checksum.
Required string length:
42Pattern:
^0x(?!0{40}$)[0-9a-fA-F]{40}$Response
Replacement draft and computed root.
Show child attributes
Show child attributes