diff --git a/Cargo.lock b/Cargo.lock index 0339d04ca..4323849d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1937,7 +1937,7 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "helium-entity-manager" -version = "0.2.1" +version = "0.2.2" dependencies = [ "account-compression-cpi", "anchor-lang", @@ -1957,7 +1957,7 @@ dependencies = [ [[package]] name = "helium-sub-daos" -version = "0.1.0" +version = "0.1.1" dependencies = [ "anchor-lang", "anchor-spl", diff --git a/packages/helium-admin-cli/src/temp-claim-failed-claims.ts b/packages/helium-admin-cli/src/temp-claim-failed-claims.ts deleted file mode 100644 index f9a5cf022..000000000 --- a/packages/helium-admin-cli/src/temp-claim-failed-claims.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { - currentEpoch, - daoEpochInfoKey, - daoKey, - EPOCH_LENGTH, - init as initDao, - subDaoEpochInfoKey, - subDaoKey, -} from "@helium/helium-sub-daos-sdk"; -import * as anchor from "@coral-xyz/anchor"; -import { - ComputeBudgetProgram, - ConfirmedSignatureInfo, - Connection, - PublicKey, -} from "@solana/web3.js"; -import { BN } from "bn.js"; -import b58 from "bs58"; -import os from "os"; -import yargs from "yargs/yargs"; -import { IOT_MINT, MOBILE_MINT } from "@helium/spl-utils"; - -export async function run(args: any = process.argv) { - const yarg = yargs(args).options({ - wallet: { - alias: "k", - describe: "Anchor wallet keypair", - default: `${os.homedir()}/.config/solana/id.json`, - }, - url: { - alias: "u", - default: "http://127.0.0.1:8899", - describe: "The solana url", - }, - }); - - const argv = await yarg.argv; - process.env.ANCHOR_WALLET = argv.wallet; - process.env.ANCHOR_PROVIDER_URL = argv.url; - anchor.setProvider(anchor.AnchorProvider.local(argv.url)); - const epoch = 19624; - - const provider = anchor.getProvider() as anchor.AnchorProvider; - const heliumSubDaosProgram = await initDao(provider); - const connection = new Connection( - provider.connection.rpcEndpoint, - "confirmed" - ); - const subDaoEpochInfos = [ - subDaoEpochInfoKey( - subDaoKey(IOT_MINT)[0], - new BN(epoch).mul(new BN(EPOCH_LENGTH)) - )[0], - subDaoEpochInfoKey( - subDaoKey(MOBILE_MINT)[0], - new BN(epoch).mul(new BN(EPOCH_LENGTH)) - )[0], - ]; - console.log(subDaoEpochInfos); - const coder = new anchor.BorshCoder(heliumSubDaosProgram.idl); - for (const subDaoEpochInfo of subDaoEpochInfos) { - const sigs: ConfirmedSignatureInfo[] = []; - let before: string | undefined = undefined; - while (true) { - const newSigs = await connection.getSignaturesForAddress( - subDaoEpochInfo, - { - limit: 1000, - before, - } - ); - sigs.push(...newSigs); - if (newSigs.length < 1000) { - break; - } - before = newSigs[newSigs.length - 1].signature; - } - - let foundIssue = false; - for (const sig of sigs) { - const tx = await connection.getTransaction(sig.signature); - if (tx?.meta?.err || !tx) { - continue; - } - // Should have been before this - if (tx.blockTime && tx.blockTime > 1695652196) { - continue; - } - for (const instruction of ( - tx?.transaction.message.instructions || [] - ).filter((ix) => - tx.transaction.message.accountKeys[ix.programIdIndex].equals( - heliumSubDaosProgram.programId - ) - )) { - const accountMetas = instruction.accounts.map((idx) => ({ - pubkey: tx.transaction.message.accountKeys[idx], - isSigner: tx.transaction.message.isAccountSigner(idx), - isWritable: tx.transaction.message.isAccountWritable(idx), - })); - const ix = coder.instruction.decode(instruction.data, "base58"); - if (!ix) { - continue; - } - const formatted = coder.instruction.format(ix, accountMetas); - if (ix.name === "issueRewardsV0") { - foundIssue = true; - } - if (!foundIssue) { - continue; - } - - if (ix.name !== "claimRewardsV0") { - continue; - } - - // @ts-ignore - if ((ix.data.args.epoch as anchor.BN).eq(new anchor.BN())) { - continue; - } - const position = formatted?.accounts.find( - (a) => a.name === "Position" - )?.pubkey; - const subDao = formatted?.accounts.find( - (a) => a.name === "Sub Dao" - )?.pubkey; - if (!subDao || !position) { - throw new Error("Subdao or position missing"); - } - const method = heliumSubDaosProgram.methods - .tempClaimFailedClaims() - .accounts({ - authority: provider.wallet.publicKey, - position, - subDao, - subDaoEpochInfo, - }); - const { block } = await method.pubkeys(); - if (!(await connection.getAccountInfo(block!))) { - console.log("Repairing", position.toBase58()); - await method.rpc({ - skipPreflight: true, - }); - } - } - } - } -} diff --git a/packages/helium-admin-cli/src/temp-repair-marker-sizes.ts b/packages/helium-admin-cli/src/temp-repair-marker-sizes.ts deleted file mode 100644 index 642ecae84..000000000 --- a/packages/helium-admin-cli/src/temp-repair-marker-sizes.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { - currentEpoch, - daoEpochInfoKey, - daoKey, - EPOCH_LENGTH, - init as initDao, - subDaoEpochInfoKey, - subDaoKey, -} from "@helium/helium-sub-daos-sdk"; -import * as anchor from "@coral-xyz/anchor"; -import { - ComputeBudgetProgram, - ConfirmedSignatureInfo, - Connection, - PublicKey, -} from "@solana/web3.js"; -import { BN } from "bn.js"; -import b58 from "bs58"; -import os from "os"; -import yargs from "yargs/yargs"; -import { IOT_MINT, MOBILE_MINT } from "@helium/spl-utils"; -import { init } from "@helium/voter-stake-registry-sdk"; - -export async function run(args: any = process.argv) { - const yarg = yargs(args).options({ - wallet: { - alias: "k", - describe: "Anchor wallet keypair", - default: `${os.homedir()}/.config/solana/id.json`, - }, - url: { - alias: "u", - default: "http://127.0.0.1:8899", - describe: "The solana url", - }, - }); - - const argv = await yarg.argv; - process.env.ANCHOR_WALLET = argv.wallet; - process.env.ANCHOR_PROVIDER_URL = argv.url; - anchor.setProvider(anchor.AnchorProvider.local(argv.url)); - - const provider = anchor.getProvider() as anchor.AnchorProvider; - const voterStakeRegistryProgram = await init(provider); - const markers = await voterStakeRegistryProgram.account.voteMarkerV0.all(); - - console.log(`${markers.length} total`) - let i = 0; - for (const marker of markers) { - i++ - await voterStakeRegistryProgram.methods - .repairVoteMarkerSizes() - .accounts({ - marker: marker.publicKey, - voter: marker.account.voter, - payer: provider.wallet.publicKey, - }) - .rpc({ skipPreflight: true }); - console.log(`Closed ${i}/${markers.length}`); - } - console.log("Done") -} diff --git a/programs/helium-entity-manager/Cargo.toml b/programs/helium-entity-manager/Cargo.toml index 2171fc5c1..c609bb436 100644 --- a/programs/helium-entity-manager/Cargo.toml +++ b/programs/helium-entity-manager/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "helium-entity-manager" -version = "0.2.1" +version = "0.2.2" description = "Created with Anchor" edition = "2021" diff --git a/programs/helium-entity-manager/src/instructions/mod.rs b/programs/helium-entity-manager/src/instructions/mod.rs index 87f0eaf5c..42847afaa 100644 --- a/programs/helium-entity-manager/src/instructions/mod.rs +++ b/programs/helium-entity-manager/src/instructions/mod.rs @@ -15,8 +15,6 @@ pub mod revoke_maker_v0; pub mod revoke_program_v0; pub mod set_entity_active_v0; pub mod set_maker_tree_v0; -pub mod temp_backfill_mobile_info_data_v0; -pub mod temp_backfill_onboarding_fees_v0; pub mod temp_pay_mobile_onboarding_fee_v0; pub mod update_data_only_tree_v0; pub mod update_iot_info_v0; @@ -42,8 +40,6 @@ pub use revoke_maker_v0::*; pub use revoke_program_v0::*; pub use set_entity_active_v0::*; pub use set_maker_tree_v0::*; -pub use temp_backfill_mobile_info_data_v0::*; -pub use temp_backfill_onboarding_fees_v0::*; pub use temp_pay_mobile_onboarding_fee_v0::*; pub use update_data_only_tree_v0::*; pub use update_iot_info_v0::*; diff --git a/programs/helium-entity-manager/src/instructions/temp_backfill_mobile_info_data_v0.rs b/programs/helium-entity-manager/src/instructions/temp_backfill_mobile_info_data_v0.rs deleted file mode 100644 index 931679253..000000000 --- a/programs/helium-entity-manager/src/instructions/temp_backfill_mobile_info_data_v0.rs +++ /dev/null @@ -1,62 +0,0 @@ -use crate::{rewardable_entity_config_seeds, state::*, TESTING}; -use anchor_lang::{prelude::*, solana_program::hash::hash}; -use helium_sub_daos::{ - cpi::{accounts::TrackDcOnboardingFeesV0, track_dc_onboarding_fees_v0}, - program::HeliumSubDaos, - DaoV0, SubDaoV0, TrackDcOnboardingFeesArgsV0, -}; - -#[derive(Accounts)] -pub struct TempBackfillMobileInfoDataV0<'info> { - pub authority: Signer<'info>, - #[account( - has_one = sub_dao, - constraint = rewardable_entity_config.settings.is_mobile() && (rewardable_entity_config.symbol == "MOBILE" || TESTING), - )] - pub rewardable_entity_config: Box>, - #[account( - mut, - has_one = authority, - )] - pub sub_dao: Box>, - pub dao: Box>, - #[account( - has_one = dao, - )] - pub key_to_asset: Box>, - #[account(mut, - seeds = [ - "mobile_info".as_bytes(), - rewardable_entity_config.key().as_ref(), - &hash(&key_to_asset.entity_key[..]).to_bytes() - ], - bump - )] - pub mobile_info: Box>, - pub helium_sub_daos_program: Program<'info, HeliumSubDaos>, -} - -pub fn handler(ctx: Context) -> Result<()> { - let dc_fee = ctx.accounts.sub_dao.onboarding_dc_fee; - ctx.accounts.mobile_info.dc_onboarding_fee_paid = dc_fee; - - track_dc_onboarding_fees_v0( - CpiContext::new_with_signer( - ctx.accounts.helium_sub_daos_program.to_account_info(), - TrackDcOnboardingFeesV0 { - hem_auth: ctx.accounts.rewardable_entity_config.to_account_info(), - sub_dao: ctx.accounts.sub_dao.to_account_info(), - }, - &[rewardable_entity_config_seeds!( - ctx.accounts.rewardable_entity_config - )], - ), - TrackDcOnboardingFeesArgsV0 { - amount: dc_fee, - add: true, - symbol: ctx.accounts.rewardable_entity_config.symbol.clone(), - }, - )?; - - Ok(()) -} diff --git a/programs/helium-entity-manager/src/instructions/temp_backfill_onboarding_fees_v0.rs b/programs/helium-entity-manager/src/instructions/temp_backfill_onboarding_fees_v0.rs deleted file mode 100644 index 0af4ad9e7..000000000 --- a/programs/helium-entity-manager/src/instructions/temp_backfill_onboarding_fees_v0.rs +++ /dev/null @@ -1,44 +0,0 @@ -use crate::{state::*, TESTING}; -use anchor_lang::prelude::*; -use anchor_lang::solana_program::hash::hash; -use helium_sub_daos::{DaoV0, SubDaoV0}; - -#[derive(Accounts)] -pub struct TempBackfillOnboardingFeesV0<'info> { - pub active_device_authority: Signer<'info>, - #[account( - has_one = sub_dao, - constraint = rewardable_entity_config.settings.is_iot() && (rewardable_entity_config.symbol == "IOT" || TESTING), - )] - pub rewardable_entity_config: Box>, - #[account( - mut, - has_one = active_device_authority, - has_one = dao, - )] - pub sub_dao: Box>, - pub dao: Box>, - #[account( - has_one = dao, - )] - pub key_to_asset: Box>, - #[account(mut, - seeds = [ - "iot_info".as_bytes(), - rewardable_entity_config.key().as_ref(), - &hash(&key_to_asset.entity_key[..]).to_bytes() - ], - bump - )] - pub iot_info: Box>, -} - -pub fn handler(ctx: Context) -> Result<()> { - let onboarding_fee = if ctx.accounts.iot_info.is_full_hotspot { - 4000000 - } else { - 1000000 - }; - ctx.accounts.iot_info.dc_onboarding_fee_paid = onboarding_fee; - Ok(()) -} diff --git a/programs/helium-entity-manager/src/lib.rs b/programs/helium-entity-manager/src/lib.rs index 9caa51f5e..8445a4526 100644 --- a/programs/helium-entity-manager/src/lib.rs +++ b/programs/helium-entity-manager/src/lib.rs @@ -168,18 +168,6 @@ pub mod helium_entity_manager { set_entity_active_v0::handler(ctx, args) } - pub fn temp_backfill_onboarding_fees_v0( - ctx: Context, - ) -> Result<()> { - temp_backfill_onboarding_fees_v0::handler(ctx) - } - - pub fn temp_backfill_mobile_info_data_v0( - ctx: Context, - ) -> Result<()> { - temp_backfill_mobile_info_data_v0::handler(ctx) - } - pub fn temp_pay_mobile_onboarding_fee_v0( ctx: Context, ) -> Result<()> { diff --git a/programs/helium-sub-daos/Cargo.toml b/programs/helium-sub-daos/Cargo.toml index 038b03984..31bd7a648 100644 --- a/programs/helium-sub-daos/Cargo.toml +++ b/programs/helium-sub-daos/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "helium-sub-daos" -version = "0.1.0" +version = "0.1.1" description = "Created with Anchor" edition = "2021" diff --git a/programs/helium-sub-daos/src/instructions/delegation/mod.rs b/programs/helium-sub-daos/src/instructions/delegation/mod.rs index dacec8f0e..ff4ca1044 100644 --- a/programs/helium-sub-daos/src/instructions/delegation/mod.rs +++ b/programs/helium-sub-daos/src/instructions/delegation/mod.rs @@ -2,12 +2,10 @@ pub mod claim_rewards_v0; pub mod close_delegation_v0; pub mod delegate_v0; pub mod reset_lockup_v0; -pub mod temp_claim_failed_claims; pub mod transfer_v0; pub use claim_rewards_v0::*; pub use close_delegation_v0::*; pub use delegate_v0::*; pub use reset_lockup_v0::*; -pub use temp_claim_failed_claims::*; pub use transfer_v0::*; diff --git a/programs/helium-sub-daos/src/instructions/delegation/temp_claim_failed_claims.rs b/programs/helium-sub-daos/src/instructions/delegation/temp_claim_failed_claims.rs deleted file mode 100644 index 1e4d0f9b2..000000000 --- a/programs/helium-sub-daos/src/instructions/delegation/temp_claim_failed_claims.rs +++ /dev/null @@ -1,162 +0,0 @@ -use std::str::FromStr; - -use crate::state::*; -use anchor_lang::prelude::*; -use anchor_spl::{ - associated_token::AssociatedToken, - token::{Mint, Token, TokenAccount}, -}; -use circuit_breaker::{ - cpi::{accounts::TransferV0, transfer_v0}, - CircuitBreaker, TransferArgsV0, -}; -use voter_stake_registry::{ - state::{PositionV0, Registrar}, - VoterStakeRegistry, -}; - -#[account] -pub struct Block {} - -#[derive(Accounts)] -pub struct TempClaimFailedClaims<'info> { - #[account( - mut, - address = Pubkey::from_str("hprdnjkbziK8NqhThmAn5Gu4XqrBbctX8du4PfJdgvW").unwrap() - )] - pub authority: Signer<'info>, - // Ensure this is run once per wallet - #[account( - init, - payer = authority, - seeds = [b"block".as_ref(), sub_dao_epoch_info.key().as_ref(), position.key().as_ref()], - bump, - space = 8 - )] - pub block: Account<'info, Block>, - #[account( - seeds = [b"position".as_ref(), mint.key().as_ref()], - seeds::program = vsr_program.key(), - bump = position.bump_seed, - has_one = mint, - has_one = registrar, - )] - pub position: Box>, - pub mint: Box>, - #[account( - token::mint = mint, - token::authority = position_authority, - constraint = position_token_account.amount > 0 - )] - pub position_token_account: Box>, - /// CHECK: Not the signer since this is a backfill - pub position_authority: AccountInfo<'info>, - pub registrar: Box>, - #[account( - has_one = registrar - )] - pub dao: Box>, - - #[account( - has_one = delegator_pool, - has_one = dnt_mint, - has_one = dao, - )] - pub sub_dao: Account<'info, SubDaoV0>, - #[account( - has_one = sub_dao, - seeds = ["delegated_position".as_bytes(), position.key().as_ref()], - bump, - )] - pub delegated_position: Account<'info, DelegatedPositionV0>, - - pub dnt_mint: Box>, - - #[account( - seeds = ["sub_dao_epoch_info".as_bytes(), sub_dao.key().as_ref(), &19624_u64.to_le_bytes()], - bump = sub_dao_epoch_info.bump_seed, - )] - pub sub_dao_epoch_info: Box>, - #[account(mut)] - pub delegator_pool: Box>, - #[account( - init_if_needed, - payer = authority, - associated_token::mint = dnt_mint, - associated_token::authority = position_authority, - )] - pub delegator_ata: Box>, - - /// CHECK: checked via cpi - #[account( - mut, - seeds = ["account_windowed_breaker".as_bytes(), delegator_pool.key().as_ref()], - seeds::program = circuit_breaker_program.key(), - bump - )] - pub delegator_pool_circuit_breaker: AccountInfo<'info>, - - pub vsr_program: Program<'info, VoterStakeRegistry>, - pub system_program: Program<'info, System>, - pub circuit_breaker_program: Program<'info, CircuitBreaker>, - pub associated_token_program: Program<'info, AssociatedToken>, - pub token_program: Program<'info, Token>, -} - -impl<'info> TempClaimFailedClaims<'info> { - fn transfer_ctx(&self) -> CpiContext<'_, '_, '_, 'info, TransferV0<'info>> { - let cpi_accounts = TransferV0 { - from: self.delegator_pool.to_account_info(), - to: self.delegator_ata.to_account_info(), - owner: self.sub_dao.to_account_info(), - circuit_breaker: self.delegator_pool_circuit_breaker.to_account_info(), - token_program: self.token_program.to_account_info(), - }; - - CpiContext::new(self.circuit_breaker_program.to_account_info(), cpi_accounts) - } -} - -pub fn handler(ctx: Context) -> Result<()> { - // load the vehnt information - let position = &ctx.accounts.position; - let registrar = &ctx.accounts.registrar; - let voting_mint_config = ®istrar.voting_mints[position.voting_mint_config_idx as usize]; - - let delegated_vehnt_at_epoch = position.voting_power( - voting_mint_config, - ctx.accounts.sub_dao_epoch_info.start_ts(), - )?; - - msg!("Staked {} veHNT at start of epoch with {} total veHNT delegated to subdao and {} total rewards to subdao", - delegated_vehnt_at_epoch, - ctx.accounts.sub_dao_epoch_info.vehnt_at_epoch_start, - ctx.accounts.sub_dao_epoch_info.delegation_rewards_issued - ); - - // calculate the position's share of that epoch's rewards - // rewards = staking_rewards_issued * staked_vehnt_at_epoch / total_vehnt - let rewards = u64::try_from( - (delegated_vehnt_at_epoch as u128) - .checked_mul(ctx.accounts.sub_dao_epoch_info.delegation_rewards_issued as u128) - .unwrap() - .checked_div(ctx.accounts.sub_dao_epoch_info.vehnt_at_epoch_start as u128) - .unwrap(), - ) - .unwrap(); - - let amount_left = ctx.accounts.delegator_pool.amount; - transfer_v0( - ctx.accounts.transfer_ctx().with_signer(&[&[ - b"sub_dao", - ctx.accounts.sub_dao.dnt_mint.as_ref(), - &[ctx.accounts.sub_dao.bump_seed], - ]]), - // Due to rounding down of vehnt fall rates it's possible the vehnt on the dao does not exactly match the - // vehnt remaining. It could be off by a little bit of dust. - TransferArgsV0 { - amount: std::cmp::min(rewards, amount_left), - }, - )?; - Ok(()) -} diff --git a/programs/helium-sub-daos/src/lib.rs b/programs/helium-sub-daos/src/lib.rs index 6edddda13..bf84c4f1f 100644 --- a/programs/helium-sub-daos/src/lib.rs +++ b/programs/helium-sub-daos/src/lib.rs @@ -105,8 +105,4 @@ pub mod helium_sub_daos { ) -> Result<()> { track_dc_onboarding_fees_v0::handler(ctx, args) } - - pub fn temp_claim_failed_claims(ctx: Context) -> Result<()> { - temp_claim_failed_claims::handler(ctx) - } } diff --git a/programs/voter-stake-registry/src/instructions/mod.rs b/programs/voter-stake-registry/src/instructions/mod.rs index f864504d7..ae7112f53 100644 --- a/programs/voter-stake-registry/src/instructions/mod.rs +++ b/programs/voter-stake-registry/src/instructions/mod.rs @@ -8,7 +8,6 @@ pub use ledger_transfer_position_v0::*; pub use relinquish_expired_vote_v0::*; pub use relinquish_vote_v0::*; pub use relinquish_vote_v1::*; -pub use repair_vote_marker_sizes::*; pub use reset_lockup_v0::*; pub use set_time_offset_v0::*; pub use transfer_v0::*; @@ -28,7 +27,6 @@ pub mod ledger_transfer_position_v0; pub mod relinquish_expired_vote_v0; pub mod relinquish_vote_v0; pub mod relinquish_vote_v1; -pub mod repair_vote_marker_sizes; pub mod reset_lockup_v0; pub mod set_time_offset_v0; pub mod transfer_v0; diff --git a/programs/voter-stake-registry/src/instructions/repair_vote_marker_sizes.rs b/programs/voter-stake-registry/src/instructions/repair_vote_marker_sizes.rs deleted file mode 100644 index 63566af6b..000000000 --- a/programs/voter-stake-registry/src/instructions/repair_vote_marker_sizes.rs +++ /dev/null @@ -1,41 +0,0 @@ -use proposal::ProposalV0; -use std::str::FromStr; - -use anchor_lang::prelude::*; - -use crate::state::*; - -#[derive(Accounts)] -pub struct RepairVoteMarkerSizes<'info> { - #[account( - mut, - address = Pubkey::from_str( - "hprdnjkbziK8NqhThmAn5Gu4XqrBbctX8du4PfJdgvW" - ).unwrap() - )] - pub payer: Signer<'info>, - #[account( - mut, - has_one = voter, - has_one = proposal, - )] - pub marker: Box>, - pub proposal: Box>, - /// CHECK: Just refunding - #[account(mut)] - pub voter: AccountInfo<'info>, - pub system_program: Program<'info, System>, -} - -pub fn handler(ctx: Context) -> Result<()> { - let new_size = - 8 + 32 + std::mem::size_of::() + 1 + 2 * ctx.accounts.proposal.choices.len(); - - ctx - .accounts - .marker - .to_account_info() - .realloc(new_size, false)?; - - Ok(()) -} diff --git a/programs/voter-stake-registry/src/lib.rs b/programs/voter-stake-registry/src/lib.rs index b7145032b..2a6b70cc2 100644 --- a/programs/voter-stake-registry/src/lib.rs +++ b/programs/voter-stake-registry/src/lib.rs @@ -130,10 +130,6 @@ pub mod voter_stake_registry { instructions::relinquish_vote_v1::handler(ctx, args) } - pub fn repair_vote_marker_sizes(ctx: Context) -> Result<()> { - instructions::repair_vote_marker_sizes::handler(ctx) - } - pub fn relinquish_expired_vote_v0(ctx: Context) -> Result<()> { instructions::relinquish_expired_vote_v0::handler(ctx) }