Migrating Solana from v1 to v2

What's New in Version 2

See the comparison between v1 and v2 in the table below.

Key Points v1 v2
Network Mainnet, Testnet Mainnet, Testnet
Stake Intent Supported Supported
Deactivation Intent Supported Supported
Withdrawal Intent Supported Supported
Split Intent Not Officially Supported Supported
Allows us to split stake accounts ahead of deactivating.

Let's delve into the details for each key point:

1. Stake Intent

To create a stake intent to delegate funds to a validator.

Request

curl --request POST \
     --url https://svc.blockdaemon.com/boss/v1/solana/mainnet/stake-intents \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'X-API-Key: YOUR_KEY' \
     --data '
{
  "validator_address": "CcaHc2L43ZWjwCHART3oZoJvHLAe9hzT2DJNUpBzoTN1",
  "delegator_address": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj",
  "amount": "1943000000000"
}
'

This would return a response below.

Response

{
  "stake_intent_id": "stake_intent_Wgx98Rbi8nQuL9ddn3mTk1",
  "customer_id": "SatoshiNakamoto-xUYJbPw9hw",
  "plan_id": "plan_Wgx98Rbi8nQuL9ddn3mTk1",
  "protocol": "solana",
  "network": "mainnet",
  "solana": {
    "stake_id": "stake_Wgx98Rbi8nQuL9ddn3mTk1",
    "amount": "100",
    "validator_public_key": "0xa1d1ad0714035353258038e964ae9675dc0252ee22cea896825c01458e1807bfad2f9969338798548d9858a571f7425c",
    "staking_authority": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj",
    "withdrawal_authority": "0xa1d1ad0714035353258038e964ae9675dc0252ee22cea896825c01458e1807bfad2f9969338798548d9858a571f7425c",
    "stake_account_public_key": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj",
    "unsigned_transaction": "0x22895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120087fed394b43849eebef1e88873cd9efdbe33136656e5148e659b8b2f33625d40000000000000000000000000000000000000000000000000000000000000030b81748644e23c4d950f9dd709f3eb73d5eacd9657997e1d9dde7c4ebd8a6519ecb9d0a7fb603d3b68e023278f9650122000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020010000000000000000000000c509bb854c526af4cee5e037089f7aa8e091d8870000000000000000000000000000000000000000000000000000000000000060b36b79b4b206c0310472c117fa40c05342b5dc3e89f98f42c9da3ce6450d4c603cad55248017fd4eca3ab277cca64569193e4d487f5b2ea78a2bcdc81926c313c05842a3af318967a775783bba22519e8b8886587efa99aa7dab5784f792b187\n",
    "expiration_time": 1689939023
  }
}

To achieve similar functionality in v2, you would need to change the validator_address to validator_vote_pubkey and updated url.

Request

curl --request POST \
     --url https://svc.blockdaemon.com/sia/v2/solana/mainnet/stake-intent \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'X-API-Key: YOUR_KEY' \
     --data '
{
  "amount": 10000000000,
  "validator_vote_pubkey": "CcaHc2L43ZWjwCHART3oZoJvHLAe9hzT2DJNUpBzoTN1",
  "delegator_address": "75q6kcecNQhawj1dCmPWhfootfQBnZh7iWnNjoXTJv79"
}
'

This would return a response below.

Response

{
  "estimated_fee": 1000000000,
  "instruction_count": 4,
  "metadata": {
    "minimum_rent_exemption": 500,
    "total_cost": 1500
  },
  "network": "mainnet",
  "stake_account_pubkey": "75q6kcecNQhawj1dCmPWhfootfQBnZh7iWnNjoXTJv79",
  "unsigned_transaction": "0x22895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120087fed394b43849eebef1e88873cd9efdbe33136656e5148e659b8b2f33625d40000000000000000000000000000000000000000000000000000000000000030b81748644e23c4d950f9dd709f3eb73d5eacd9657997e1d9dde7c4ebd8a6519ecb9d0a7fb603d3b68e023278f9650122000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020010000000000000000000000c509bb854c526af4cee5e037089f7aa8e091d8870000000000000000000000000000000000000000000000000000000000000060b36b79b4b206c0310472c117fa40c05342b5dc3e89f98f42c9da3ce6450d4c603cad55248017fd4eca3ab277cca64569193e4d487f5b2ea78a2bcdc81926c313c05842a3af318967a775783bba22519e8b8886587efa99aa7dab5784f792b187",
  "validator_vote_pubkey": "CcaHc2L43ZWjwCHART3oZoJvHLAe9hzT2DJNUpBzoTN1"
}

2. Deactivate Intent

To start the deactivation process for v1. We would calculate the amount a user is requesting and then build one or more transactions to satisfy that request. It would involving deactivation stake accounts and then splitting others.

Request

curl --request POST \
     --url https://svc.blockdaemon.com/boss/v1/solana/mainnet/deactivation-intents \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'X-API-Key: YOUR_KEY' \
     --data '
{
  "amount": "10000000",
  "delegator_address": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj"
}
'

This would return a response below.

Response

{
  "deactivate_intent_id": "4ba06e89-8c29-483e-ac36-318de5aa7364",
  "customer_id": "SatoshiNakamoto-xUYJbPw9hw",
  "protocol": "solana",
  "network": "mainnet",
  "solana": {
    "deactivates": [
      {
        "unsigned_transaction": "0x22895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120087fed394b43849eebef1e88873cd9efdbe33136656e5148e659b8b2f33625d40000000000000000000000000000000000000000000000000000000000000030b81748644e23c4d950f9dd709f3eb73d5eacd9657997e1d9dde7c4ebd8a6519ecb9d0a7fb603d3b68e023278f9650122000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020010000000000000000000000c509bb854c526af4cee5e037089f7aa8e091d8870000000000000000000000000000000000000000000000000000000000000060b36b79b4b206c0310472c117fa40c05342b5dc3e89f98f42c9da3ce6450d4c603cad55248017fd4eca3ab277cca64569193e4d487f5b2ea78a2bcdc81926c313c05842a3af318967a775783bba22519e8b8886587efa99aa7dab5784f792b187",
        "stake_account_authority": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj",
        "stake_account_address": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj",
        "withdrawal_authority": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj",
        "stake_id": "stake_Wgx98Rbi8nQuL9ddn3mTk1",
        "amount": "100",
        "expiration_time": 1689939023
      }
    ],
    "splits": [
      {
        "unsigned_transaction": "0x22895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120087fed394b43849eebef1e88873cd9efdbe33136656e5148e659b8b2f33625d40000000000000000000000000000000000000000000000000000000000000030b81748644e23c4d950f9dd709f3eb73d5eacd9657997e1d9dde7c4ebd8a6519ecb9d0a7fb603d3b68e023278f9650122000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020010000000000000000000000c509bb854c526af4cee5e037089f7aa8e091d8870000000000000000000000000000000000000000000000000000000000000060b36b79b4b206c0310472c117fa40c05342b5dc3e89f98f42c9da3ce6450d4c603cad55248017fd4eca3ab277cca64569193e4d487f5b2ea78a2bcdc81926c313c05842a3af318967a775783bba22519e8b8886587efa99aa7dab5784f792b187",
        "stake_account_authority": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj",
        "new_stake_account_address": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj",
        "new_stake_id": "stake_Wgx98Rbi8nQuL9ddn3mTk1",
        "splitted_stake_account_address": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj",
        "splitted_stake_id": "stake_Wgx98Rbi8nQuL9ddn3mTk1",
        "amount": "100"
      }
    ],
    "total_deactivated_amount": "100"
  }
}

To start the deactivation process for a particular stake account only.

Request

This would return a response below.

Response

{
  "estimated_fee": 5000,
  "instruction_count": 3,
  "metadata": {
    "current_epoch": 620,
    "deactivation_epoch": 621,
    "was_active": true
  },
  "network": "mainnet",
  "stake_account_pubkey": "75q6kcecNQhawj1dCmPWhfootfQBnZh7iWnNjoXTJv79",
  "stake_authority_pubkey": "75q6kcecNQhawj1dCmPWhfootfQBnZh7iWnNjoXTJv79",
  "unsigned_transaction": "0x22895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120087fed394b43849eebef1e88873cd9efdbe33136656e5148e659b8b2f33625d40000000000000000000000000000000000000000000000000000000000000030b81748644e23c4d950f9dd709f3eb73d5eacd9657997e1d9dde7c4ebd8a6519ecb9d0a7fb603d3b68e023278f9650122000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020010000000000000000000000c509bb854c526af4cee5e037089f7aa8e091d8870000000000000000000000000000000000000000000000000000000000000060b36b79b4b206c0310472c117fa40c05342b5dc3e89f98f42c9da3ce6450d4c603cad55248017fd4eca3ab277cca64569193e4d487f5b2ea78a2bcdc81926c313c05842a3af318967a775783bba22519e8b8886587efa99aa7dab5784f792b187"
}

3. Withdrawal Intent

To start the withdrawal process for v1 it will automatically identify recently deactivated accounts and use them.

Request

curl --request POST \
     --url https://svc.blockdaemon.com/boss/v1/solana/mainnet/withdrawal-intents \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'X-API-Key: YOUR_KEY' \
     --data '
{
  "amount": "100000000",
  "withdrawal_address": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj",
  "delegator_address": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj",
  "withdrawal_authority": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj"
}
'

This would return a response below.

Response

{
  "withdraw_intent_id": "4ba06e89-8c29-483e-ac36-318de5aa7364",
  "customer_id": "SatoshiNakamoto-xUYJbPw9hw",
  "protocol": "solana",
  "network": "mainnet",
  "solana": {
    "withdraws": [
      {
        "unsigned_transaction": "0x22895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120087fed394b43849eebef1e88873cd9efdbe33136656e5148e659b8b2f33625d40000000000000000000000000000000000000000000000000000000000000030b81748644e23c4d950f9dd709f3eb73d5eacd9657997e1d9dde7c4ebd8a6519ecb9d0a7fb603d3b68e023278f9650122000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020010000000000000000000000c509bb854c526af4cee5e037089f7aa8e091d8870000000000000000000000000000000000000000000000000000000000000060b36b79b4b206c0310472c117fa40c05342b5dc3e89f98f42c9da3ce6450d4c603cad55248017fd4eca3ab277cca64569193e4d487f5b2ea78a2bcdc81926c313c05842a3af318967a775783bba22519e8b8886587efa99aa7dab5784f792b187",
        "withdrawal_authority_public_key": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj",
        "stake_account_address": "5xot9PVkphiX2adznghwrAuxGs2zeWisNSxMW6hU6Hkj",
        "stake_id": "stake_Wgx98Rbi8nQuL9ddn3mTk1",
        "amount": "100000000",
        "expiration_time": 1689939023
      }
    ],
    "total_withdraw_amount": "100000000"
  }
}

To start the withdrawal process for a particular stake account only.

Request

curl --request POST \
     --url https://svc.blockdaemon.com/sia/v2/solana/network/withdrawal-intent \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'X-API-Key: YOUR_KEY' \
     --data '
{
  "delegator_address": "75q6kcecNQhawj1dCmPWhfootfQBnZh7iWnNjoXTJv79",
  "stake_account_pubkey": "S1a6ZBwdPmAZ23W3CNR81X9HJiDAgf2Ki3H3LcP4bVv",
  "amount": 1000000
}
'

This would return a response below.

Response

{
  "estimated_fee": 1000000000,
  "instruction_count": 4,
  "metadata": {
    "available_withdraw_amount": 621,
    "remaining_balance": 0,
    "will_close_account": true
  },
  "network": "mainnet",
  "stake_account_pubkey": "75q6kcecNQhawj1dCmPWhfootfQBnZh7iWnNjoXTJv79",
  "unsigned_transaction": "0x22895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120087fed394b43849eebef1e88873cd9efdbe33136656e5148e659b8b2f33625d40000000000000000000000000000000000000000000000000000000000000030b81748644e23c4d950f9dd709f3eb73d5eacd9657997e1d9dde7c4ebd8a6519ecb9d0a7fb603d3b68e023278f9650122000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020010000000000000000000000c509bb854c526af4cee5e037089f7aa8e091d8870000000000000000000000000000000000000000000000000000000000000060b36b79b4b206c0310472c117fa40c05342b5dc3e89f98f42c9da3ce6450d4c603cad55248017fd4eca3ab277cca64569193e4d487f5b2ea78a2bcdc81926c313c05842a3af318967a775783bba22519e8b8886587efa99aa7dab5784f792b187",
  "withdraw_authority_pubkey": "75q6kcecNQhawj1dCmPWhfootfQBnZh7iWnNjoXTJv79"
}

4. Split Intent

New to v2, we have a specific endpoint to split stake accounts. This is if you want to deactivate a smaller subset of an existing stake account. You would first perform a split and then have a new stake account you would deactivate.

Request

curl --request POST \
     --url https://svc.blockdaemon.com/sia/v2/solana/network/split-intent \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'X-API-Key: YOUR_KEY' \
     --data '
{
  "amount": 10000000,
  "stake_account_pubkey": "75q6kcecNQhawj1dCmPWhfootfQBnZh7iWnNjoXTJv79"
}
'

This would return a response below.

Response

{
  "estimated_fee": 1000000000,
  "instruction_count": 3,
  "metadata": {
    "minimum_rent_exemption": 500
  },
  "network": "mainnet",
  "new_stake_account_pubkey": "75q6kcecNQhawj1dCmPWhfootfQBnZh7iWnNjoXTJv79",
  "stake_account_pubkey": "75q6kcecNQhawj1dCmPWhfootfQBnZh7iWnNjoXTJv79",
  "stake_authority_pubkey": "75q6kcecNQhawj1dCmPWhfootfQBnZh7iWnNjoXTJv79",
  "unsigned_transaction": "0x22895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120087fed394b43849eebef1e88873cd9efdbe33136656e5148e659b8b2f33625d40000000000000000000000000000000000000000000000000000000000000030b81748644e23c4d950f9dd709f3eb73d5eacd9657997e1d9dde7c4ebd8a6519ecb9d0a7fb603d3b68e023278f9650122000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020010000000000000000000000c509bb854c526af4cee5e037089f7aa8e091d8870000000000000000000000000000000000000000000000000000000000000060b36b79b4b206c0310472c117fa40c05342b5dc3e89f98f42c9da3ce6450d4c603cad55248017fd4eca3ab277cca64569193e4d487f5b2ea78a2bcdc81926c313c05842a3af318967a775783bba22519e8b8886587efa99aa7dab5784f792b187"
}