Block Accounts
Prerequisites
1
Set Up Your Accounts
import * as KeetaNet from "@keetanetwork/keetanet-client";
async function main() {
const seed = KeetaNet.lib.Account.generateRandomSeed({ asString: true });
// Create accounts
const tokenOwner = KeetaNet.lib.Account.fromSeed(seed, 0);
const addressA = KeetaNet.lib.Account.fromSeed(seed, 1);
const addressB = KeetaNet.lib.Account.fromSeed(seed, 2);
const tokenOwnerClient = KeetaNet.UserClient.fromNetwork("test", tokenOwner);
console.log("Token Owner:", tokenOwner.publicKeyString.toString());
console.log("Address A:", addressA.publicKeyString.toString());
console.log("Address B:", addressB.publicKeyString.toString());
}2
Create Your Token
console.log("\n=== Creating Token ===");
const builder = tokenOwnerClient.initBuilder();
const pendingToken = builder.generateIdentifier(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN);
await builder.computeBlocks();
const tokenAccount = pendingToken.account;
builder.setInfo({
name: '',
description: '',
metadata: '',
defaultPermission: new KeetaNet.lib.Permissions(['ACCESS'])
}, { account: tokenAccount });
builder.modifyTokenSupply(10000n, { account: tokenAccount });
await tokenOwnerClient.publishBuilder(builder);
console.log("✅ Token created with public ACCESS");3
Grant Access to Specific Addresses
await tokenOwnerClient.updatePermissions(
addressA,
new KeetaNet.lib.Permissions(['ACCESS']),
tokenAccount,
KeetaNet.lib.Block.AdjustMethod.SET,
{ account: tokenAccount }
);
await tokenOwnerClient.updatePermissions(
addressB,
new KeetaNet.lib.Permissions(['ACCESS']),
tokenAccount,
KeetaNet.lib.Block.AdjustMethod.SET,
{ account: tokenAccount }
);4
Verify Initial Access
console.log("\n=== Checking Initial Access ===");
const initialACLs = await tokenOwnerClient.listACLsByEntity({ account: tokenAccount });
const addressA_ACL = initialACLs.find(acl => acl.principal.comparePublicKey(addressA));
const addressB_ACL = initialACLs.find(acl => acl.principal.comparePublicKey(addressB));
const addressA_HasAccess = addressA_ACL && addressA_ACL.permissions.has(['ACCESS']);
const addressB_HasAccess = addressB_ACL && addressB_ACL.permissions.has(['ACCESS']);
console.log("Address A has access:", addressA_HasAccess);
console.log("Address B has access:", addressB_HasAccess);5
6
Verify the Block Worked
console.log("\n=== Verifying Block ===");
const finalACLs = await tokenOwnerClient.listACLsByEntity({ account: tokenAccount });
const final_addressA_ACL = finalACLs.find(acl => acl.principal.comparePublicKey(addressA));
const final_addressB_ACL = finalACLs.find(acl => acl.principal.comparePublicKey(addressB));
const final_addressA_HasAccess = final_addressA_ACL && final_addressA_ACL.permissions.has(['ACCESS']);
const final_addressB_HasAccess = final_addressB_ACL && final_addressB_ACL.permissions.has(['ACCESS']);
console.log("Address A has access after blocking:", final_addressA_HasAccess);
console.log("Address B has access after blocking:", final_addressB_HasAccess);
console.log("\n=== Summary ===");
console.log("Address A blocked successfully:", addressA_HasAccess && !final_addressA_HasAccess);
console.log("Address B still has access:", addressB_HasAccess && final_addressB_HasAccess);Full Code Example
import * as KeetaNet from "@keetanetwork/keetanet-client";
async function main() {
const seed = KeetaNet.lib.Account.generateRandomSeed({ asString: true });
// Create accounts
const tokenOwner = KeetaNet.lib.Account.fromSeed(seed, 0);
const addressA = KeetaNet.lib.Account.fromSeed(seed, 1);
const addressB = KeetaNet.lib.Account.fromSeed(seed, 2);
const tokenOwnerClient = KeetaNet.UserClient.fromNetwork("test", tokenOwner);
console.log("Token Owner:", tokenOwner.publicKeyString.toString());
console.log("Address A:", addressA.publicKeyString.toString());
console.log("Address B:", addressB.publicKeyString.toString());
// 1. Create token with public access
console.log("\n=== Creating Token ===");
const builder = tokenOwnerClient.initBuilder();
const pendingToken = builder.generateIdentifier(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN);
await builder.computeBlocks();
const tokenAccount = pendingToken.account;
builder.setInfo({
name: '',
description: '',
metadata: '',
defaultPermission: new KeetaNet.lib.Permissions(['ACCESS'])
}, { account: tokenAccount });
builder.modifyTokenSupply(10000n, { account: tokenAccount });
await tokenOwnerClient.publishBuilder(builder);
console.log("✅ Token created with public ACCESS");
// 2. Grant explicit access to both addresses
await tokenOwnerClient.updatePermissions(
addressA,
new KeetaNet.lib.Permissions(['ACCESS']),
tokenAccount,
KeetaNet.lib.Block.AdjustMethod.SET,
{ account: tokenAccount }
);
await tokenOwnerClient.updatePermissions(
addressB,
new KeetaNet.lib.Permissions(['ACCESS']),
tokenAccount,
KeetaNet.lib.Block.AdjustMethod.SET,
{ account: tokenAccount }
);
// 3. Verify both addresses have access
console.log("\n=== Checking Initial Access ===");
const initialACLs = await tokenOwnerClient.listACLsByEntity({ account: tokenAccount });
const addressA_ACL = initialACLs.find(acl => acl.principal.comparePublicKey(addressA));
const addressB_ACL = initialACLs.find(acl => acl.principal.comparePublicKey(addressB));
const addressA_HasAccess = addressA_ACL && addressA_ACL.permissions.has(['ACCESS']);
const addressB_HasAccess = addressB_ACL && addressB_ACL.permissions.has(['ACCESS']);
console.log("Address A has access:", addressA_HasAccess);
console.log("Address B has access:", addressB_HasAccess);
// 4. Block Address A
console.log("\n=== Blocking Address A ===");
await tokenOwnerClient.updatePermissions(
addressA,
new KeetaNet.lib.Permissions(['ACCESS']),
tokenAccount,
KeetaNet.lib.Block.AdjustMethod.SUBTRACT,
{ account: tokenAccount }
);
console.log("✅ Address A blocked");
// 5. Verify blocking worked - A is blocked, B still has access
console.log("\n=== Verifying Block ===");
const finalACLs = await tokenOwnerClient.listACLsByEntity({ account: tokenAccount });
const final_addressA_ACL = finalACLs.find(acl => acl.principal.comparePublicKey(addressA));
const final_addressB_ACL = finalACLs.find(acl => acl.principal.comparePublicKey(addressB));
const final_addressA_HasAccess = final_addressA_ACL && final_addressA_ACL.permissions.has(['ACCESS']);
const final_addressB_HasAccess = final_addressB_ACL && final_addressB_ACL.permissions.has(['ACCESS']);
console.log("Address A has access after blocking:", final_addressA_HasAccess);
console.log("Address B has access after blocking:", final_addressB_HasAccess);
console.log("\n=== Summary ===");
console.log("Address A blocked successfully:", addressA_HasAccess && !final_addressA_HasAccess);
console.log("Address B still has access:", addressB_HasAccess && final_addressB_HasAccess);
}
main().catch(console.error);
Last updated