UNPKG

beamable-network-depin

Version:

Beamable DePIN SDK for Solana blockchain interactions

50 lines (49 loc) 2.14 kB
import { addCodecSizePrefix, getAddressCodec, getAddressEncoder, getBase58Codec, getOptionCodec, getProgramDerivedAddress, getStructCodec, getU32Codec, getU64Codec, getUtf8Codec } from "gill"; import { DEPIN_PROGRAM, METADATA_SEED, WORKER_SEED } from "../../constants.js"; import { DepinAccountType } from "../../enums.js"; const addressEncoder = getAddressEncoder(); export class WorkerMetadataAccount { suspendedAt; delegatedTo; discoveryUri; constructor(fields) { this.suspendedAt = fields.suspendedAt; this.delegatedTo = fields.delegatedTo; this.discoveryUri = fields.discoveryUri; } static calculateAccountSize(discoveryUriLength) { return BigInt(1 + // discriminator 1 + 8 + // suspendedAt (Option<u64>) 32 + // delegatedTo (address) 4 + discoveryUriLength // discoveryUri (String with length prefix) ); } static DataCodecV1 = getStructCodec([ ["suspendedAt", getOptionCodec(getU64Codec())], ["delegatedTo", getAddressCodec()], ["discoveryUri", addCodecSizePrefix(getUtf8Codec(), getU32Codec())], ]); static deserializeFrom(accountData) { let accountDataBuffer; if (typeof accountData === 'string') { accountDataBuffer = getBase58Codec().encode(accountData); } else { accountDataBuffer = accountData; } const accountDiscriminator = accountDataBuffer[0]; if (accountDiscriminator !== DepinAccountType.WorkerMetadata) { throw new Error(`Invalid discriminator: ${accountDiscriminator}`); } const data = Buffer.from(accountDataBuffer).subarray(1); // Skip the first byte (discriminator) const result = this.DataCodecV1.decode(data); return result; } static async findWorkerMetadataPDA(workerLicense, worker) { const pda = await getProgramDerivedAddress({ programAddress: DEPIN_PROGRAM, seeds: [WORKER_SEED, METADATA_SEED, addressEncoder.encode(workerLicense), addressEncoder.encode(worker)] }); return pda; } }