beamable-network-depin
Version:
Beamable DePIN SDK for Solana blockchain interactions
46 lines (45 loc) • 2.06 kB
JavaScript
import { AccountRole, addCodecSizePrefix, address, getStructCodec, getU32Codec, getUtf8Codec } from "gill";
import { DEPIN_PROGRAM, MPL_ACCOUNT_COMPRESSION_PROGRAM, SYSTEM_PROGRAM_ADDRESS } from "../../constants.js";
import { DepinInstruction } from "../../enums.js";
import { assetToCNftContext, CNftContextCodec } from "../../utils/bubblegum.js";
import { WorkerMetadataAccount } from "./worker-metadata-account.js";
export const UpdateWorkerUriParamsCodec = getStructCodec([
["license_context", CNftContextCodec],
["discovery_uri", addCodecSizePrefix(getUtf8Codec(), getU32Codec())],
]);
export class UpdateWorkerUri {
signer;
worker_license;
params;
constructor(input) {
this.params = {
license_context: assetToCNftContext(input.worker_license),
discovery_uri: input.discovery_uri,
};
this.worker_license = input.worker_license;
this.signer = input.signer;
}
serialize() {
const inner = UpdateWorkerUriParamsCodec.encode(this.params);
return Uint8Array.of(DepinInstruction.UpdateWorkerUri, ...inner);
}
async getInstruction() {
const workerMetadataPda = await WorkerMetadataAccount.findWorkerMetadataPDA(address(this.worker_license.rpcAsset.id), address(this.params.license_context.owner));
let accounts = [
{ address: this.signer, role: AccountRole.READONLY_SIGNER },
{ address: workerMetadataPda[0], role: AccountRole.WRITABLE },
{ address: MPL_ACCOUNT_COMPRESSION_PROGRAM, role: AccountRole.READONLY },
{ address: address(this.worker_license.merkleTree), role: AccountRole.READONLY },
{ address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY },
...this.worker_license.proof.map(proof => ({
address: address(proof),
role: AccountRole.READONLY
}))
];
return {
programAddress: DEPIN_PROGRAM,
accounts: accounts,
data: this.serialize(),
};
}
}