beamable-network-depin
Version:
Beamable DePIN SDK for Solana blockchain interactions
50 lines (49 loc) • 2.14 kB
JavaScript
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;
}
}