From 7c61b6021ee294b4c99da9648b62a7adebf7d706 Mon Sep 17 00:00:00 2001 From: bucurdavid Date: Thu, 24 Oct 2024 09:17:13 +0300 Subject: [PATCH 1/4] chore: security text --- programs/core-sol-bond-stake-sc/src/lib.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/programs/core-sol-bond-stake-sc/src/lib.rs b/programs/core-sol-bond-stake-sc/src/lib.rs index 7922c9f..0bf85c8 100644 --- a/programs/core-sol-bond-stake-sc/src/lib.rs +++ b/programs/core-sol-bond-stake-sc/src/lib.rs @@ -13,6 +13,17 @@ use constants::*; mod errors; use errors::*; +#[cfg(not(feature = "no-entrypoint"))] +solana_security_txt::security_txt! { + name: "itheum-bonding-staking-program", + project_url: "https://www.itheum.io/", + contacts: "https://itheum.io/bug-bounty", + policy: "https://itheum.io/bug-bounty", + source_code: "https://github.com/Itheum/core-sol-bonding-staking-sc", + preferred_languages: "en", + auditors: "https://itheum.io/audits" +} + declare_id!("4nvez1kVuTbeeMBzXkuUfDvFNLuSraAqbxK5NypRMvtM"); #[program] From b03cdf448af5321600c819422aeae3a77c989ee1 Mon Sep 17 00:00:00 2001 From: bucurdavid Date: Thu, 24 Oct 2024 11:57:00 +0300 Subject: [PATCH 2/4] feat: interaction snippets --- interactions/index.ts | 223 ++++++++++++++++++++++++++---------------- 1 file changed, 140 insertions(+), 83 deletions(-) diff --git a/interactions/index.ts b/interactions/index.ts index 2881b4e..6d1acf2 100644 --- a/interactions/index.ts +++ b/interactions/index.ts @@ -7,34 +7,31 @@ import { Transaction, clusterApiUrl, sendAndConfirmTransaction, -} from "@solana/web3.js"; -import * as anchor from "@coral-xyz/anchor"; -import { - CoreSolBondStakeSc, - IDL, -} from "../target/types/core_sol_bond_stake_sc"; +} from '@solana/web3.js' +import * as anchor from '@coral-xyz/anchor' +import {CoreSolBondStakeSc, IDL} from '../target/types/core_sol_bond_stake_sc' import { ASSOCIATED_TOKEN_PROGRAM_ID, createAssociatedTokenAccountInstruction, getAssociatedTokenAddress, getOrCreateAssociatedTokenAccount, TOKEN_PROGRAM_ID, -} from "@solana/spl-token"; -import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; -import { SPL_ACCOUNT_COMPRESSION_PROGRAM_ID } from "@metaplex-foundation/mpl-bubblegum"; +} from '@solana/spl-token' +import {bs58} from '@coral-xyz/anchor/dist/cjs/utils/bytes' +import {SPL_ACCOUNT_COMPRESSION_PROGRAM_ID} from '@metaplex-foundation/mpl-bubblegum' -require("dotenv").config(); +require('dotenv').config() function decode(stuff: string) { - return bufferToArray(bs58.decode(stuff)); + return bufferToArray(bs58.decode(stuff)) } function bufferToArray(buffer: Buffer): number[] { - const nums: number[] = []; + const nums: number[] = [] for (let i = 0; i < buffer.length; i++) { - nums.push(buffer[i]); + nums.push(buffer[i]) } - return nums; + return nums } const mapProof = (proof: string[]): AccountMeta[] => { @@ -42,39 +39,39 @@ const mapProof = (proof: string[]): AccountMeta[] => { pubkey: new PublicKey(node), isSigner: false, isWritable: false, - })); -}; + })) +} -const ITHEUM_TOKEN = process.env.ITHEUM_TOKEN; -const programId = new PublicKey("4nvez1kVuTbeeMBzXkuUfDvFNLuSraAqbxK5NypRMvtM"); +const ITHEUM_TOKEN = process.env.ITHEUM_TOKEN +const programId = new PublicKey('4nvez1kVuTbeeMBzXkuUfDvFNLuSraAqbxK5NypRMvtM') const connection = new Connection( clusterApiUrl(process.env.CLUSTER_URL as Cluster), - "confirmed" -); + 'confirmed' +) const program = new anchor.Program(IDL, programId, { connection, -}); +}) const bondConfigPda1 = PublicKey.findProgramAddressSync( - [Buffer.from("bond_config"), Buffer.from([1])], + [Buffer.from('bond_config'), Buffer.from([1])], programId -)[0]; +)[0] const rewardsConfigPda = PublicKey.findProgramAddressSync( - [Buffer.from("rewards_config")], + [Buffer.from('rewards_config')], programId -)[0]; +)[0] const vaultConfig = PublicKey.findProgramAddressSync( - [Buffer.from("vault_config")], + [Buffer.from('vault_config')], programId -)[0]; +)[0] // Extract the private key from the environment variable -const PRIVATE_KEY_STR = process.env.PROGRAM_ADMIN_WALLET; -const privateKeys = PRIVATE_KEY_STR.split(",").map(Number); -const admin = Keypair.fromSecretKey(Uint8Array.from(privateKeys)); +const PRIVATE_KEY_STR = process.env.PROGRAM_ADMIN_WALLET +const privateKeys = PRIVATE_KEY_STR.split(',').map(Number) +const admin = Keypair.fromSecretKey(Uint8Array.from(privateKeys)) // Create the transaction using Anchor's methods API const initializeContract = async () => { @@ -91,17 +88,17 @@ const initializeContract = async () => { .accounts({ bondConfig: bondConfigPda1, rewardsConfig: rewardsConfigPda, - merkleTree: new PublicKey("GpseMQCGcVHt2QxhieSGiEsuS6G5sKpEHeAWYwUx5z5c"), // Replace with your actual merkle tree address + merkleTree: new PublicKey('GpseMQCGcVHt2QxhieSGiEsuS6G5sKpEHeAWYwUx5z5c'), // Replace with your actual merkle tree address authority: admin.publicKey, // The admin will act as the authority }) - .transaction(); + .transaction() const transactionSignature = await connection.sendTransaction(transaction, [ admin, - ]); + ]) - console.log(transactionSignature); -}; + console.log(transactionSignature) +} // initializeContract(); @@ -112,11 +109,11 @@ const initializeVault = async () => { new PublicKey(ITHEUM_TOKEN), vaultConfig, true, - "finalized" - ); + 'finalized' + ) // we delay so the ATA is ready or we may get a TokenAccountNotFoundError not found error - await new Promise((resolve) => setTimeout(resolve, 5000)); + await new Promise((resolve) => setTimeout(resolve, 5000)) const tx = await program.methods .initializeVault() @@ -127,12 +124,12 @@ const initializeVault = async () => { mintOfToken: new PublicKey(ITHEUM_TOKEN), authority: admin.publicKey, }) - .transaction(); + .transaction() - const transactionSignature = await connection.sendTransaction(tx, [admin]); + const transactionSignature = await connection.sendTransaction(tx, [admin]) - console.log(transactionSignature); -}; + console.log(transactionSignature) +} // initializeVault(); @@ -144,12 +141,12 @@ const setBondStateActive = async () => { bondConfig: bondConfigPda1, authority: admin.publicKey, }) - .transaction(); + .transaction() - const transactionSignature = await connection.sendTransaction(tx, [admin]); + const transactionSignature = await connection.sendTransaction(tx, [admin]) - console.log(transactionSignature); -}; + console.log(transactionSignature) +} // setBondStateActive(); @@ -161,12 +158,12 @@ const setBondStateInactive = async () => { bondConfig: bondConfigPda1, authority: admin.publicKey, }) - .transaction(); + .transaction() - const transactionSignature = await connection.sendTransaction(tx, [admin]); + const transactionSignature = await connection.sendTransaction(tx, [admin]) - console.log(transactionSignature); -}; + console.log(transactionSignature) +} // setBondStateInactive(); @@ -175,13 +172,13 @@ const addRewards = async (amount: anchor.BN) => { new PublicKey(ITHEUM_TOKEN), vaultConfig, true - ); + ) const admin_ata = await getAssociatedTokenAddress( new PublicKey(ITHEUM_TOKEN), admin.publicKey, true - ); + ) const tx = await program.methods .addRewards(amount) @@ -194,12 +191,12 @@ const addRewards = async (amount: anchor.BN) => { authority: admin.publicKey, authorityTokenAccount: admin_ata, }) - .transaction(); + .transaction() - const transactionSignature = await connection.sendTransaction(tx, [admin]); + const transactionSignature = await connection.sendTransaction(tx, [admin]) - console.log(transactionSignature); -}; + console.log(transactionSignature) +} // addRewards(new anchor.BN(1000000e9)); // 1000000e9 is 1M @@ -211,12 +208,12 @@ const updateRewardsPerSlot = async (rewards: number) => { rewardsConfig: rewardsConfigPda, authority: admin.publicKey, }) - .transaction(); + .transaction() - const transactionSignature = await connection.sendTransaction(tx, [admin]); + const transactionSignature = await connection.sendTransaction(tx, [admin]) - console.log(transactionSignature); -}; + console.log(transactionSignature) +} // updateRewardsPerSlot(1000000) @@ -228,12 +225,12 @@ const updateMaxPercentage = async (percentage: number) => { rewardsConfig: rewardsConfigPda, authority: admin.publicKey, }) - .transaction(); + .transaction() - const transactionSignature = await connection.sendTransaction(tx, [admin]); + const transactionSignature = await connection.sendTransaction(tx, [admin]) - console.log(transactionSignature); -}; + console.log(transactionSignature) +} // updateMaxPercentage(8000) @@ -245,12 +242,12 @@ const setRewardsStateActive = async () => { rewardsConfig: rewardsConfigPda, authority: admin.publicKey, }) - .transaction(); + .transaction() - const transactionSignature = await connection.sendTransaction(tx, [admin]); + const transactionSignature = await connection.sendTransaction(tx, [admin]) - console.log(transactionSignature); -}; + console.log(transactionSignature) +} // setRewardsStateActive(); @@ -262,34 +259,94 @@ const setRewardsStateInactive = async () => { rewardsConfig: rewardsConfigPda, authority: admin.publicKey, }) - .transaction(); + .transaction() - const transactionSignature = await connection.sendTransaction(tx, [admin]); + const transactionSignature = await connection.sendTransaction(tx, [admin]) - console.log(transactionSignature); -}; + console.log(transactionSignature) +} // setRewardsStateInactive(); +const changeLockPeriod = async (index: number, lockPeriod: number) => { + const tx = await program.methods + .updateLockPeriod(index, new anchor.BN(lockPeriod)) + .signers([admin]) + .accounts({ + bondConfig: bondConfigPda1, + authority: admin.publicKey, + }) + .transaction() + + const transactionSignature = await connection.sendTransaction(tx, [admin]) + + console.log(transactionSignature) +} + +const changeMerkleTree = async (index: number, merkleTree: string) => { + const tx = await program.methods + .updateMerkleTree(index, new PublicKey(merkleTree)) + .signers([admin]) + .accounts({ + bondConfig: bondConfigPda1, + authority: admin.publicKey, + }) + .transaction() + + const transactionSignature = await connection.sendTransaction(tx, [admin]) + + console.log(transactionSignature) +} + +const changeBondAmount = async (index: number, bondAmount: number) => { + const tx = await program.methods + .updateBondAmount(index, new anchor.BN(bondAmount)) + .signers([admin]) + .accounts({ + bondConfig: bondConfigPda1, + authority: admin.publicKey, + }) + .transaction() + + const transactionSignature = await connection.sendTransaction(tx, [admin]) + + console.log(transactionSignature) +} + +const changeWithdrawPenalty = async (index: number, penalty: number) => { + const tx = await program.methods + .updateWithdrawPenalty(index, new anchor.BN(penalty)) + .signers([admin]) + .accounts({ + bondConfig: bondConfigPda1, + authority: admin.publicKey, + }) + .transaction() + + const transactionSignature = await connection.sendTransaction(tx, [admin]) + + console.log(transactionSignature) +} + // Below are some manual testing scripts. const object_response = - '{"assetId":"F1h2kBVpb3bPeNYiMAQxUBrURxNXtjV25B6He9S63Xre","leafSchema":{"__kind":"V1","id":"F1h2kBVpb3bPeNYiMAQxUBrURxNXtjV25B6He9S63Xre","owner":"7jwJ1V27b91GoeWNuNcjVVZy2kv4PUab6MyZoKcwZy5o","delegate":"7jwJ1V27b91GoeWNuNcjVVZy2kv4PUab6MyZoKcwZy5o","nonce":28,"dataHash":{"0":69,"1":204,"2":218,"3":52,"4":77,"5":10,"6":199,"7":233,"8":245,"9":87,"10":127,"11":45,"12":212,"13":64,"14":124,"15":209,"16":147,"17":64,"18":243,"19":252,"20":90,"21":115,"22":189,"23":33,"24":9,"25":156,"26":190,"27":136,"28":242,"29":182,"30":253,"31":37},"creatorHash":{"0":77,"1":213,"2":154,"3":225,"4":97,"5":203,"6":74,"7":63,"8":198,"9":140,"10":244,"11":87,"12":144,"13":15,"14":74,"15":46,"16":161,"17":9,"18":203,"19":202,"20":242,"21":175,"22":172,"23":151,"24":43,"25":195,"26":151,"27":143,"28":107,"29":138,"30":102,"31":27}},"index":28,"root":[153,5,27,166,131,202,163,237,254,166,244,131,17,183,239,54,26,192,126,177,64,187,189,26,220,44,163,70,99,162,241,134],"proof":{"root":"BJKtvp9MjxNT7M5cpJ5vsEwP9i6qupkThTUWZHEk8ni1","proof":["11111111111111111111111111111111","Cf5tmmFZ4D31tviuJezHdFLf5WF7yFvzfxNyftKsqTwr","DJ1kkERH23xtXVC5w4JM8VuLaGBFMSzjnEhu8ds6BiWR","7kieKvZEkYzsP2KFniw1R94R5xLtxiQEfn1jJY9qrb6a","CX6YjLNphY2mUgDCt2MSWGUWmDB8aoJEoRiabxFgjQDb","zLUDhASAn7WA1Aqc724azRpZjKCjMQNATApe74JMg8C","ABnEXHmveD6iuMwfw2po7t6TPjn5kYMVwYJMi3fa9K91","JDh7eiWiUWtiWn623iybHqjQ6AQ6c2Czz8m6ZxwSCkta","BFvmeiEuzAYcMR8YxcuCMGYPDpjcmP5hsNbcswgQ8pMc","EvxphsdRErrDMs9nhFfF4nzq8i1C2KSogA7uB96TPpPR","HpMJWAzQv9HFgHBqY1o8V1B27sCYPFHJdGivDA658jEL","HjnrJn5vBUUzpCxzjjM9ZnCPuXei2cXKJjX468B9yWD7","4YCF1CSyTXm1Yi9W9JeYevawupkomdgy2dLxEBHL9euq","E3oMtCuPEauftdZLX8EZ8YX7BbFzpBCVRYEiLxwPJLY2"],"node_index":16412,"leaf":"BTVmcRPBuutDxfGhxcCXGHdgHCEhZrvdxj36CFG7arzt","tree_id":"GpseMQCGcVHt2QxhieSGiEsuS6G5sKpEHeAWYwUx5z5c"}}'; + '{"assetId":"F1h2kBVpb3bPeNYiMAQxUBrURxNXtjV25B6He9S63Xre","leafSchema":{"__kind":"V1","id":"F1h2kBVpb3bPeNYiMAQxUBrURxNXtjV25B6He9S63Xre","owner":"7jwJ1V27b91GoeWNuNcjVVZy2kv4PUab6MyZoKcwZy5o","delegate":"7jwJ1V27b91GoeWNuNcjVVZy2kv4PUab6MyZoKcwZy5o","nonce":28,"dataHash":{"0":69,"1":204,"2":218,"3":52,"4":77,"5":10,"6":199,"7":233,"8":245,"9":87,"10":127,"11":45,"12":212,"13":64,"14":124,"15":209,"16":147,"17":64,"18":243,"19":252,"20":90,"21":115,"22":189,"23":33,"24":9,"25":156,"26":190,"27":136,"28":242,"29":182,"30":253,"31":37},"creatorHash":{"0":77,"1":213,"2":154,"3":225,"4":97,"5":203,"6":74,"7":63,"8":198,"9":140,"10":244,"11":87,"12":144,"13":15,"14":74,"15":46,"16":161,"17":9,"18":203,"19":202,"20":242,"21":175,"22":172,"23":151,"24":43,"25":195,"26":151,"27":143,"28":107,"29":138,"30":102,"31":27}},"index":28,"root":[153,5,27,166,131,202,163,237,254,166,244,131,17,183,239,54,26,192,126,177,64,187,189,26,220,44,163,70,99,162,241,134],"proof":{"root":"BJKtvp9MjxNT7M5cpJ5vsEwP9i6qupkThTUWZHEk8ni1","proof":["11111111111111111111111111111111","Cf5tmmFZ4D31tviuJezHdFLf5WF7yFvzfxNyftKsqTwr","DJ1kkERH23xtXVC5w4JM8VuLaGBFMSzjnEhu8ds6BiWR","7kieKvZEkYzsP2KFniw1R94R5xLtxiQEfn1jJY9qrb6a","CX6YjLNphY2mUgDCt2MSWGUWmDB8aoJEoRiabxFgjQDb","zLUDhASAn7WA1Aqc724azRpZjKCjMQNATApe74JMg8C","ABnEXHmveD6iuMwfw2po7t6TPjn5kYMVwYJMi3fa9K91","JDh7eiWiUWtiWn623iybHqjQ6AQ6c2Czz8m6ZxwSCkta","BFvmeiEuzAYcMR8YxcuCMGYPDpjcmP5hsNbcswgQ8pMc","EvxphsdRErrDMs9nhFfF4nzq8i1C2KSogA7uB96TPpPR","HpMJWAzQv9HFgHBqY1o8V1B27sCYPFHJdGivDA658jEL","HjnrJn5vBUUzpCxzjjM9ZnCPuXei2cXKJjX468B9yWD7","4YCF1CSyTXm1Yi9W9JeYevawupkomdgy2dLxEBHL9euq","E3oMtCuPEauftdZLX8EZ8YX7BbFzpBCVRYEiLxwPJLY2"],"node_index":16412,"leaf":"BTVmcRPBuutDxfGhxcCXGHdgHCEhZrvdxj36CFG7arzt","tree_id":"GpseMQCGcVHt2QxhieSGiEsuS6G5sKpEHeAWYwUx5z5c"}}' const object2_response = - '{"assetId":"AEdTGc4kWLco9vkWQrAUKbtzzPva9QmWYJMxHeBvjJtq","leafSchema":{"__kind":"V1","id":"AEdTGc4kWLco9vkWQrAUKbtzzPva9QmWYJMxHeBvjJtq","owner":"BAC786427LZg4iK2TaLaHVStYhcwHxWingCUGqzMatei","delegate":"BAC786427LZg4iK2TaLaHVStYhcwHxWingCUGqzMatei","nonce":32,"dataHash":{"0":69,"1":204,"2":218,"3":52,"4":77,"5":10,"6":199,"7":233,"8":245,"9":87,"10":127,"11":45,"12":212,"13":64,"14":124,"15":209,"16":147,"17":64,"18":243,"19":252,"20":90,"21":115,"22":189,"23":33,"24":9,"25":156,"26":190,"27":136,"28":242,"29":182,"30":253,"31":37},"creatorHash":{"0":77,"1":213,"2":154,"3":225,"4":97,"5":203,"6":74,"7":63,"8":198,"9":140,"10":244,"11":87,"12":144,"13":15,"14":74,"15":46,"16":161,"17":9,"18":203,"19":202,"20":242,"21":175,"22":172,"23":151,"24":43,"25":195,"26":151,"27":143,"28":107,"29":138,"30":102,"31":27}},"index":32,"root":[95,115,57,29,46,187,206,174,111,140,123,137,116,223,51,146,251,0,162,65,128,1,165,7,4,218,168,48,18,247,192,201],"proof":{"root":"7RbdqkiSF4QmMr65we9QPgPA5i49CeiDhoMHBphaFm84","proof":["11111111111111111111111111111111","Cf5tmmFZ4D31tviuJezHdFLf5WF7yFvzfxNyftKsqTwr","DAbAU9srHpEUogXWuhy5VZ7g8UX9STymELtndcx1xgP1","3HCYqQRcQSChEuAw1ybNYHibrTNNjzbYzm56cmEmivB6","GSz87YKd3YoZWcEKhnjSsYJwv8o5aWGdBdGGYUphRfTh","4K6tKnbfNar36yQDrWvb2KSjm4y6C8aUAAcXq94BoxkG","ABnEXHmveD6iuMwfw2po7t6TPjn5kYMVwYJMi3fa9K91","JDh7eiWiUWtiWn623iybHqjQ6AQ6c2Czz8m6ZxwSCkta","BFvmeiEuzAYcMR8YxcuCMGYPDpjcmP5hsNbcswgQ8pMc","EvxphsdRErrDMs9nhFfF4nzq8i1C2KSogA7uB96TPpPR","HpMJWAzQv9HFgHBqY1o8V1B27sCYPFHJdGivDA658jEL","HjnrJn5vBUUzpCxzjjM9ZnCPuXei2cXKJjX468B9yWD7","4YCF1CSyTXm1Yi9W9JeYevawupkomdgy2dLxEBHL9euq","E3oMtCuPEauftdZLX8EZ8YX7BbFzpBCVRYEiLxwPJLY2"],"node_index":16416,"leaf":"BJ4wXh1HvjmJV8cCuQn5PuFxcL7TyJHnPCKRZwGHVV7A","tree_id":"GpseMQCGcVHt2QxhieSGiEsuS6G5sKpEHeAWYwUx5z5c"}}'; + '{"assetId":"AEdTGc4kWLco9vkWQrAUKbtzzPva9QmWYJMxHeBvjJtq","leafSchema":{"__kind":"V1","id":"AEdTGc4kWLco9vkWQrAUKbtzzPva9QmWYJMxHeBvjJtq","owner":"BAC786427LZg4iK2TaLaHVStYhcwHxWingCUGqzMatei","delegate":"BAC786427LZg4iK2TaLaHVStYhcwHxWingCUGqzMatei","nonce":32,"dataHash":{"0":69,"1":204,"2":218,"3":52,"4":77,"5":10,"6":199,"7":233,"8":245,"9":87,"10":127,"11":45,"12":212,"13":64,"14":124,"15":209,"16":147,"17":64,"18":243,"19":252,"20":90,"21":115,"22":189,"23":33,"24":9,"25":156,"26":190,"27":136,"28":242,"29":182,"30":253,"31":37},"creatorHash":{"0":77,"1":213,"2":154,"3":225,"4":97,"5":203,"6":74,"7":63,"8":198,"9":140,"10":244,"11":87,"12":144,"13":15,"14":74,"15":46,"16":161,"17":9,"18":203,"19":202,"20":242,"21":175,"22":172,"23":151,"24":43,"25":195,"26":151,"27":143,"28":107,"29":138,"30":102,"31":27}},"index":32,"root":[95,115,57,29,46,187,206,174,111,140,123,137,116,223,51,146,251,0,162,65,128,1,165,7,4,218,168,48,18,247,192,201],"proof":{"root":"7RbdqkiSF4QmMr65we9QPgPA5i49CeiDhoMHBphaFm84","proof":["11111111111111111111111111111111","Cf5tmmFZ4D31tviuJezHdFLf5WF7yFvzfxNyftKsqTwr","DAbAU9srHpEUogXWuhy5VZ7g8UX9STymELtndcx1xgP1","3HCYqQRcQSChEuAw1ybNYHibrTNNjzbYzm56cmEmivB6","GSz87YKd3YoZWcEKhnjSsYJwv8o5aWGdBdGGYUphRfTh","4K6tKnbfNar36yQDrWvb2KSjm4y6C8aUAAcXq94BoxkG","ABnEXHmveD6iuMwfw2po7t6TPjn5kYMVwYJMi3fa9K91","JDh7eiWiUWtiWn623iybHqjQ6AQ6c2Czz8m6ZxwSCkta","BFvmeiEuzAYcMR8YxcuCMGYPDpjcmP5hsNbcswgQ8pMc","EvxphsdRErrDMs9nhFfF4nzq8i1C2KSogA7uB96TPpPR","HpMJWAzQv9HFgHBqY1o8V1B27sCYPFHJdGivDA658jEL","HjnrJn5vBUUzpCxzjjM9ZnCPuXei2cXKJjX468B9yWD7","4YCF1CSyTXm1Yi9W9JeYevawupkomdgy2dLxEBHL9euq","E3oMtCuPEauftdZLX8EZ8YX7BbFzpBCVRYEiLxwPJLY2"],"node_index":16416,"leaf":"BJ4wXh1HvjmJV8cCuQn5PuFxcL7TyJHnPCKRZwGHVV7A","tree_id":"GpseMQCGcVHt2QxhieSGiEsuS6G5sKpEHeAWYwUx5z5c"}}' -const cnft_data = JSON.parse(object2_response); +const cnft_data = JSON.parse(object2_response) const initializeAddress = async () => { const pk = - "rDQ9vxwjaqrXQZk6Y6CXTAsoVMd2C33VLejE8p1Gd3Xgobyk5RKrGWXZ9H6CsZsNCVxStBMVXV9nKByKTcEKCUD"; + 'rDQ9vxwjaqrXQZk6Y6CXTAsoVMd2C33VLejE8p1Gd3Xgobyk5RKrGWXZ9H6CsZsNCVxStBMVXV9nKByKTcEKCUD' - const user = Keypair.fromSecretKey(Uint8Array.from(bs58.decode(pk))); + const user = Keypair.fromSecretKey(Uint8Array.from(bs58.decode(pk))) const addressBondsRewards = PublicKey.findProgramAddressSync( - [Buffer.from("address_bonds_rewards"), user.publicKey.toBuffer()], + [Buffer.from('address_bonds_rewards'), user.publicKey.toBuffer()], program.programId - )[0]; + )[0] const transaction = await program.methods .initializeAddress() @@ -299,14 +356,14 @@ const initializeAddress = async () => { rewardsConfig: rewardsConfigPda, authority: user.publicKey, }) - .transaction(); + .transaction() const transactionSignature = await connection.sendTransaction(transaction, [ user, - ]); + ]) - console.log(transactionSignature); -}; + console.log(transactionSignature) +} // initializeAddress() From 9fec73e58d702758ace35f567068744dd66edcef Mon Sep 17 00:00:00 2001 From: bucurdavid Date: Fri, 25 Oct 2024 09:42:30 +0300 Subject: [PATCH 3/4] fix: weighted liveliness score --- .../core-sol-bond-stake-sc/src/constants.rs | 2 +- .../src/instructions/bond.rs | 46 +++++++++---------- .../src/instructions/claim_rewards.rs | 17 ++++--- .../src/instructions/renew.rs | 9 ++-- .../src/instructions/stake_rewards.rs | 7 +-- .../src/instructions/topup.rs | 12 ++--- .../src/instructions/withdraw.rs | 14 ++---- programs/core-sol-bond-stake-sc/src/lib.rs | 2 +- .../src/libraries/rewards.rs | 9 ++-- tests/core-sol-bond-stake-sc.ts | 2 +- 10 files changed, 54 insertions(+), 66 deletions(-) diff --git a/programs/core-sol-bond-stake-sc/src/constants.rs b/programs/core-sol-bond-stake-sc/src/constants.rs index a75b637..5044a2d 100644 --- a/programs/core-sol-bond-stake-sc/src/constants.rs +++ b/programs/core-sol-bond-stake-sc/src/constants.rs @@ -11,4 +11,4 @@ pub const MAX_PERCENT: u64 = 10_000; pub const SLOTS_IN_YEAR: u64 = 78_840_000u64; pub const DIVISION_SAFETY_CONST: u64 = 1_000_000_000; -pub const ADMIN_PUBKEY: Pubkey = pubkey!("5RFetgyZyFCAVCZpYWvdJt7JqgtFmm82vz24nGANSbw7"); +pub const ADMIN_PUBKEY: Pubkey = pubkey!("FuMzWZ2bi7QmquTzCrjvsEbmyCt1tF78idxGJQhjTiWu"); diff --git a/programs/core-sol-bond-stake-sc/src/instructions/bond.rs b/programs/core-sol-bond-stake-sc/src/instructions/bond.rs index 63168d8..18bce33 100644 --- a/programs/core-sol-bond-stake-sc/src/instructions/bond.rs +++ b/programs/core-sol-bond-stake-sc/src/instructions/bond.rs @@ -126,7 +126,6 @@ pub fn bond<'a, 'b, 'c: 'info, 'info>( let current_timestamp = get_current_timestamp()?; let weight_to_be_added = amount * MAX_PERCENT; - let bond_to_be_added = amount; let decay = compute_decay( ctx.accounts.address_bonds_rewards.last_update_timestamp, @@ -145,40 +144,40 @@ pub fn bond<'a, 'b, 'c: 'info, 'info>( &mut ctx.accounts.address_bonds_rewards, )?; + let address_bonds_rewards = &mut ctx.accounts.address_bonds_rewards; + let weighted_liveliness_score_new = compute_weighted_liveliness_new( weighted_liveliness_score_decayed, - ctx.accounts.address_bonds_rewards.address_total_bond_amount, + address_bonds_rewards.address_total_bond_amount, + address_bonds_rewards.address_total_bond_amount + amount, weight_to_be_added, 0, - bond_to_be_added, - 0, ); - let address_bonds_rewards = &mut ctx.accounts.address_bonds_rewards; - address_bonds_rewards.weighted_liveliness_score = weighted_liveliness_score_new; address_bonds_rewards.last_update_timestamp = current_timestamp; + address_bonds_rewards.address_total_bond_amount += amount; // check leaf owner here let asset_id = get_asset_id(&ctx.accounts.merkle_tree.key(), nonce); - let leaf = LeafSchema::V1 { - id: asset_id, - owner: ctx.accounts.authority.key(), - delegate: ctx.accounts.authority.key(), - nonce, - data_hash, - creator_hash, - }; - let cpi_ctx = CpiContext::new( - ctx.accounts.compression_program.to_account_info(), - spl_account_compression::cpi::accounts::VerifyLeaf { - merkle_tree: ctx.accounts.merkle_tree.to_account_info(), - }, - ) - .with_remaining_accounts(ctx.remaining_accounts.to_vec()); - - spl_account_compression::cpi::verify_leaf(cpi_ctx, root, leaf.hash(), nonce as u32)?; + // let leaf = LeafSchema::V1 { + // id: asset_id, + // owner: ctx.accounts.authority.key(), + // delegate: ctx.accounts.authority.key(), + // nonce, + // data_hash, + // creator_hash, + // }; + // let cpi_ctx = CpiContext::new( + // ctx.accounts.compression_program.to_account_info(), + // spl_account_compression::cpi::accounts::VerifyLeaf { + // merkle_tree: ctx.accounts.merkle_tree.to_account_info(), + // }, + // ) + // .with_remaining_accounts(ctx.remaining_accounts.to_vec()); + + // spl_account_compression::cpi::verify_leaf(cpi_ctx, root, leaf.hash(), nonce as u32)?; let current_timestamp = get_current_timestamp()?; @@ -205,7 +204,6 @@ pub fn bond<'a, 'b, 'c: 'info, 'info>( ctx.accounts.mint_of_token_sent.decimals, )?; - address_bonds_rewards.address_total_bond_amount += amount; address_bonds_rewards.current_index = bond_id; ctx.accounts.vault_config.total_bond_amount += amount; diff --git a/programs/core-sol-bond-stake-sc/src/instructions/claim_rewards.rs b/programs/core-sol-bond-stake-sc/src/instructions/claim_rewards.rs index 51c2f56..b9dcc62 100644 --- a/programs/core-sol-bond-stake-sc/src/instructions/claim_rewards.rs +++ b/programs/core-sol-bond-stake-sc/src/instructions/claim_rewards.rs @@ -95,15 +95,6 @@ pub fn claim_rewards<'a, 'b, 'c: 'info, 'info>( decay, ); - let weighted_liveliness_score_new = compute_weighted_liveliness_new( - weighted_liveliness_score_decayed, - ctx.accounts.address_bonds_rewards.address_total_bond_amount, - 0, - 0, - 0, - 0, - ); - update_address_claimable_rewards( &mut ctx.accounts.rewards_config, &ctx.accounts.vault_config, @@ -128,6 +119,14 @@ pub fn claim_rewards<'a, 'b, 'c: 'info, 'info>( .unwrap(); } + let weighted_liveliness_score_new = compute_weighted_liveliness_new( + weighted_liveliness_score_decayed, + address_bonds_rewards.address_total_bond_amount, + address_bonds_rewards.address_total_bond_amount, + 0, + 0, + ); + address_bonds_rewards.weighted_liveliness_score = weighted_liveliness_score_new; address_bonds_rewards.last_update_timestamp = current_timestamp; diff --git a/programs/core-sol-bond-stake-sc/src/instructions/renew.rs b/programs/core-sol-bond-stake-sc/src/instructions/renew.rs index 02ae1ce..ea5cacc 100644 --- a/programs/core-sol-bond-stake-sc/src/instructions/renew.rs +++ b/programs/core-sol-bond-stake-sc/src/instructions/renew.rs @@ -99,17 +99,16 @@ pub fn renew(ctx: Context) -> Result<()> { &mut ctx.accounts.address_bonds_rewards, )?; + let address_bonds_rewards = &mut ctx.accounts.address_bonds_rewards; + let weighted_liveliness_score_new = compute_weighted_liveliness_new( weighted_liveliness_score_decayed, - ctx.accounts.address_bonds_rewards.address_total_bond_amount, + address_bonds_rewards.address_total_bond_amount, + address_bonds_rewards.address_total_bond_amount, weight_to_be_added, weight_to_be_subtracted, - 0, - 0, ); - let address_bonds_rewards = &mut ctx.accounts.address_bonds_rewards; - address_bonds_rewards.weighted_liveliness_score = weighted_liveliness_score_new; address_bonds_rewards.last_update_timestamp = current_timestamp; diff --git a/programs/core-sol-bond-stake-sc/src/instructions/stake_rewards.rs b/programs/core-sol-bond-stake-sc/src/instructions/stake_rewards.rs index 35e6055..f98d31d 100644 --- a/programs/core-sol-bond-stake-sc/src/instructions/stake_rewards.rs +++ b/programs/core-sol-bond-stake-sc/src/instructions/stake_rewards.rs @@ -106,7 +106,6 @@ pub fn stake_rewards<'a, 'b, 'c: 'info, 'info>( } else { 0 }; - let bond_to_be_subtracted = bond.bond_amount; let actual_claimable_amount; @@ -123,23 +122,21 @@ pub fn stake_rewards<'a, 'b, 'c: 'info, 'info>( bond.bond_timestamp = current_timestamp; bond.bond_amount += &actual_claimable_amount; - address_bonds_rewards.address_total_bond_amount += actual_claimable_amount; vault_config.total_bond_amount += &actual_claimable_amount; address_bonds_rewards.claimable_amount = 0; let weight_to_be_added = bond.bond_amount * MAX_PERCENT; - let bond_to_be_added: u64 = bond.bond_amount; let weighted_liveliness_score_new = compute_weighted_liveliness_new( weighted_liveliness_score_decayed, address_bonds_rewards.address_total_bond_amount, + address_bonds_rewards.address_total_bond_amount + actual_claimable_amount, weight_to_be_added, weight_to_be_subtracted, - bond_to_be_added, - bond_to_be_subtracted, ); + address_bonds_rewards.address_total_bond_amount += actual_claimable_amount; address_bonds_rewards.weighted_liveliness_score = weighted_liveliness_score_new; address_bonds_rewards.last_update_timestamp = current_timestamp; diff --git a/programs/core-sol-bond-stake-sc/src/instructions/topup.rs b/programs/core-sol-bond-stake-sc/src/instructions/topup.rs index 8062019..86d64a4 100644 --- a/programs/core-sol-bond-stake-sc/src/instructions/topup.rs +++ b/programs/core-sol-bond-stake-sc/src/instructions/topup.rs @@ -104,7 +104,7 @@ pub fn top_up<'a, 'b, 'c: 'info, 'info>( let current_timestamp = get_current_timestamp()?; let weight_to_be_added = (bond.bond_amount + amount) * MAX_PERCENT; - let bond_to_be_added = amount; + let weight_to_be_subtracted = if current_timestamp < bond.unbond_timestamp { bond.bond_amount .mul_div_floor( @@ -134,20 +134,20 @@ pub fn top_up<'a, 'b, 'c: 'info, 'info>( &mut ctx.accounts.address_bonds_rewards, )?; + let address_bonds_rewards = &mut ctx.accounts.address_bonds_rewards; + let weighted_liveliness_score_new = compute_weighted_liveliness_new( weighted_liveliness_score_decayed, - ctx.accounts.address_bonds_rewards.address_total_bond_amount, + address_bonds_rewards.address_total_bond_amount, + address_bonds_rewards.address_total_bond_amount + amount, weight_to_be_added, weight_to_be_subtracted, - bond_to_be_added, - 0, ); - let address_bonds_rewards = &mut ctx.accounts.address_bonds_rewards; + address_bonds_rewards.address_total_bond_amount += amount; address_bonds_rewards.weighted_liveliness_score = weighted_liveliness_score_new; address_bonds_rewards.last_update_timestamp = current_timestamp; - address_bonds_rewards.address_total_bond_amount += amount; let vault_config = &mut ctx.accounts.vault_config; vault_config.total_bond_amount += amount; diff --git a/programs/core-sol-bond-stake-sc/src/instructions/withdraw.rs b/programs/core-sol-bond-stake-sc/src/instructions/withdraw.rs index 504a6c1..2dd95f4 100644 --- a/programs/core-sol-bond-stake-sc/src/instructions/withdraw.rs +++ b/programs/core-sol-bond-stake-sc/src/instructions/withdraw.rs @@ -119,8 +119,6 @@ pub fn withdraw<'a, 'b, 'c: 'info, 'info>( 0 }; - let bond_amount_to_be_subtracted = bond.bond_amount; - let decay = compute_decay( ctx.accounts.address_bonds_rewards.last_update_timestamp, current_timestamp, @@ -138,17 +136,17 @@ pub fn withdraw<'a, 'b, 'c: 'info, 'info>( &mut ctx.accounts.address_bonds_rewards, )?; + let address_bonds_rewards = &mut ctx.accounts.address_bonds_rewards; + let weighted_liveliness_score_new = compute_weighted_liveliness_new( weighted_liveliness_score_decayed, - ctx.accounts.address_bonds_rewards.address_total_bond_amount, + address_bonds_rewards.address_total_bond_amount, + address_bonds_rewards.address_total_bond_amount - bond.bond_amount, 0, weight_to_be_subtracted, - 0, - bond_amount_to_be_subtracted, ); - let address_bonds_rewards = &mut ctx.accounts.address_bonds_rewards; - + address_bonds_rewards.address_total_bond_amount -= bond.bond_amount; address_bonds_rewards.weighted_liveliness_score = weighted_liveliness_score_new; address_bonds_rewards.last_update_timestamp = current_timestamp; @@ -179,8 +177,6 @@ pub fn withdraw<'a, 'b, 'c: 'info, 'info>( ctx.accounts.mint_of_token_to_receive.decimals, )?; - address_bonds_rewards.address_total_bond_amount -= bond.bond_amount; - bond.state = State::Inactive.to_code(); bond.unbond_timestamp = current_timestamp; bond.bond_amount = 0; diff --git a/programs/core-sol-bond-stake-sc/src/lib.rs b/programs/core-sol-bond-stake-sc/src/lib.rs index 0bf85c8..4187428 100644 --- a/programs/core-sol-bond-stake-sc/src/lib.rs +++ b/programs/core-sol-bond-stake-sc/src/lib.rs @@ -24,7 +24,7 @@ solana_security_txt::security_txt! { auditors: "https://itheum.io/audits" } -declare_id!("4nvez1kVuTbeeMBzXkuUfDvFNLuSraAqbxK5NypRMvtM"); +declare_id!("4zAKaiW68x31n7mRbYQBUgTC9BWL3q4uATjuBc5txYSN"); #[program] pub mod core_sol_bond_stake_sc { diff --git a/programs/core-sol-bond-stake-sc/src/libraries/rewards.rs b/programs/core-sol-bond-stake-sc/src/libraries/rewards.rs index 8024405..780fe51 100644 --- a/programs/core-sol-bond-stake-sc/src/libraries/rewards.rs +++ b/programs/core-sol-bond-stake-sc/src/libraries/rewards.rs @@ -131,17 +131,16 @@ pub fn compute_weighted_liveliness_decay(weighted_liveliness_score: u64, decay: pub fn compute_weighted_liveliness_new( weighted_liveliness_score_decayed: u64, - address_total_bond_amount: u64, + address_total_bond_amount_before: u64, + address_totaal_bond_amount_after: u64, weight_to_be_added: u64, weight_to_be_subtracted: u64, - bond_to_be_added: u64, - bond_to_be_subtracted: u64, ) -> u64 { let new = (weighted_liveliness_score_decayed - .saturating_mul(address_total_bond_amount) + .saturating_mul(address_total_bond_amount_before) .saturating_sub(weight_to_be_subtracted) .saturating_add(weight_to_be_added)) - .saturating_div(address_total_bond_amount + bond_to_be_added - bond_to_be_subtracted); + .saturating_div(address_totaal_bond_amount_after); new } diff --git a/tests/core-sol-bond-stake-sc.ts b/tests/core-sol-bond-stake-sc.ts index 2622e63..ab36dc3 100644 --- a/tests/core-sol-bond-stake-sc.ts +++ b/tests/core-sol-bond-stake-sc.ts @@ -1924,7 +1924,7 @@ describe('core-sol-bond-stake-sc', () => { authority: user.publicKey, authorityTokenAccount: itheum_token_user_ata, }) - .rpc({skipPreflight: true}) + .rpc() const normalWeighted = await calculateWeightedLivelinessScore( x, From 731d75ed0fa489fc63d622be6904a26f0ab93844 Mon Sep 17 00:00:00 2001 From: bucurdavid Date: Fri, 25 Oct 2024 09:45:34 +0300 Subject: [PATCH 4/4] refactor: keep admin pubkey --- programs/core-sol-bond-stake-sc/src/constants.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/core-sol-bond-stake-sc/src/constants.rs b/programs/core-sol-bond-stake-sc/src/constants.rs index 5044a2d..a75b637 100644 --- a/programs/core-sol-bond-stake-sc/src/constants.rs +++ b/programs/core-sol-bond-stake-sc/src/constants.rs @@ -11,4 +11,4 @@ pub const MAX_PERCENT: u64 = 10_000; pub const SLOTS_IN_YEAR: u64 = 78_840_000u64; pub const DIVISION_SAFETY_CONST: u64 = 1_000_000_000; -pub const ADMIN_PUBKEY: Pubkey = pubkey!("FuMzWZ2bi7QmquTzCrjvsEbmyCt1tF78idxGJQhjTiWu"); +pub const ADMIN_PUBKEY: Pubkey = pubkey!("5RFetgyZyFCAVCZpYWvdJt7JqgtFmm82vz24nGANSbw7");