@helium/helium-admin-cli 0.10.6 → 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.run = void 0;
39
+ const anchor = __importStar(require("@coral-xyz/anchor"));
40
+ const web3_js_1 = require("@solana/web3.js");
41
+ const mpl_token_metadata_1 = require("@metaplex-foundation/mpl-token-metadata");
42
+ const sdk_1 = __importDefault(require("@sqds/sdk"));
43
+ const os_1 = __importDefault(require("os"));
44
+ const yargs_1 = __importDefault(require("yargs/yargs"));
45
+ const utils_1 = require("./utils");
46
+ function run(args = process.argv) {
47
+ return __awaiter(this, void 0, void 0, function* () {
48
+ const yarg = (0, yargs_1.default)(args).options({
49
+ wallet: {
50
+ alias: 'k',
51
+ describe: 'Anchor wallet keypair',
52
+ default: `${os_1.default.homedir()}/.config/solana/id.json`,
53
+ },
54
+ url: {
55
+ alias: 'u',
56
+ default: 'http://127.0.0.1:8899',
57
+ describe: 'The solana url',
58
+ },
59
+ token: {
60
+ required: true,
61
+ type: 'string',
62
+ describe: 'Token address to update metadata for',
63
+ },
64
+ uri: {
65
+ required: true,
66
+ type: 'string',
67
+ describe: 'The new metadata URI',
68
+ },
69
+ executeTransaction: {
70
+ type: 'boolean',
71
+ },
72
+ multisig: {
73
+ type: 'string',
74
+ describe: 'Address of the squads multisig to be authority. If not provided, your wallet will be the authority',
75
+ },
76
+ authorityIndex: {
77
+ type: 'number',
78
+ describe: 'Authority index for squads. Defaults to 1',
79
+ default: 1,
80
+ },
81
+ });
82
+ const argv = yield yarg.argv;
83
+ process.env.ANCHOR_WALLET = argv.wallet;
84
+ process.env.ANCHOR_PROVIDER_URL = argv.url;
85
+ anchor.setProvider(anchor.AnchorProvider.local(argv.url));
86
+ const provider = anchor.getProvider();
87
+ const walletKP = (0, utils_1.loadKeypair)(argv.wallet);
88
+ const wallet = new anchor.Wallet(walletKP);
89
+ const squads = sdk_1.default.endpoint(process.env.ANCHOR_PROVIDER_URL, wallet, {
90
+ commitmentOrConfig: 'finalized',
91
+ });
92
+ let authority = wallet.publicKey;
93
+ let multisig = argv.multisig ? new web3_js_1.PublicKey(argv.multisig) : null;
94
+ if (multisig) {
95
+ authority = squads.getAuthorityPDA(multisig, argv.authorityIndex);
96
+ }
97
+ try {
98
+ const tokenAddress = new web3_js_1.PublicKey(argv.token);
99
+ // Find the metadata PDA for the token
100
+ const [metadataAddress] = web3_js_1.PublicKey.findProgramAddressSync([
101
+ Buffer.from("metadata", "utf-8"),
102
+ mpl_token_metadata_1.PROGRAM_ID.toBuffer(),
103
+ tokenAddress.toBuffer(),
104
+ ], mpl_token_metadata_1.PROGRAM_ID);
105
+ // Fetch the existing metadata account
106
+ const metadataAccount = yield mpl_token_metadata_1.Metadata.fromAccountAddress(provider.connection, metadataAddress);
107
+ // Create the update instruction
108
+ const updateInstructions = [
109
+ (0, mpl_token_metadata_1.createUpdateMetadataAccountV2Instruction)({
110
+ metadata: metadataAddress,
111
+ updateAuthority: authority,
112
+ }, {
113
+ updateMetadataAccountArgsV2: {
114
+ data: {
115
+ name: metadataAccount.data.name,
116
+ symbol: metadataAccount.data.symbol,
117
+ uri: argv.uri,
118
+ sellerFeeBasisPoints: metadataAccount.data.sellerFeeBasisPoints,
119
+ creators: metadataAccount.data.creators || null,
120
+ collection: null,
121
+ uses: null
122
+ },
123
+ updateAuthority: metadataAccount.updateAuthority,
124
+ primarySaleHappened: metadataAccount.primarySaleHappened,
125
+ isMutable: metadataAccount.isMutable
126
+ }
127
+ })
128
+ ];
129
+ yield (0, utils_1.sendInstructionsOrSquads)({
130
+ provider,
131
+ instructions: updateInstructions,
132
+ executeTransaction: argv.executeTransaction,
133
+ squads,
134
+ multisig: argv.multisig ? new web3_js_1.PublicKey(argv.multisig) : undefined,
135
+ authorityIndex: argv.authorityIndex,
136
+ signers: [],
137
+ });
138
+ console.log(`Successfully created transaction to update metadata URI for token ${argv.token} to ${argv.uri}`);
139
+ }
140
+ catch (err) {
141
+ console.error('Failed to update token metadata:', err);
142
+ process.exit(1);
143
+ }
144
+ });
145
+ }
146
+ exports.run = run;
147
+ //# sourceMappingURL=update-token-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-token-metadata.js","sourceRoot":"","sources":["../../src/update-token-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import * as anchor from '@coral-xyz/anchor';
2
+ import { PublicKey } from '@solana/web3.js';
3
+ import { createUpdateMetadataAccountV2Instruction, Metadata, PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from '@metaplex-foundation/mpl-token-metadata';
4
+ import Squads from '@sqds/sdk';
5
+ import os from 'os';
6
+ import yargs from 'yargs/yargs';
7
+ import { loadKeypair, sendInstructionsOrSquads } from './utils';
8
+ export async function run(args = process.argv) {
9
+ const yarg = yargs(args).options({
10
+ wallet: {
11
+ alias: 'k',
12
+ describe: 'Anchor wallet keypair',
13
+ default: `${os.homedir()}/.config/solana/id.json`,
14
+ },
15
+ url: {
16
+ alias: 'u',
17
+ default: 'http://127.0.0.1:8899',
18
+ describe: 'The solana url',
19
+ },
20
+ token: {
21
+ required: true,
22
+ type: 'string',
23
+ describe: 'Token address to update metadata for',
24
+ },
25
+ uri: {
26
+ required: true,
27
+ type: 'string',
28
+ describe: 'The new metadata URI',
29
+ },
30
+ executeTransaction: {
31
+ type: 'boolean',
32
+ },
33
+ multisig: {
34
+ type: 'string',
35
+ describe: 'Address of the squads multisig to be authority. If not provided, your wallet will be the authority',
36
+ },
37
+ authorityIndex: {
38
+ type: 'number',
39
+ describe: 'Authority index for squads. Defaults to 1',
40
+ default: 1,
41
+ },
42
+ });
43
+ const argv = await yarg.argv;
44
+ process.env.ANCHOR_WALLET = argv.wallet;
45
+ process.env.ANCHOR_PROVIDER_URL = argv.url;
46
+ anchor.setProvider(anchor.AnchorProvider.local(argv.url));
47
+ const provider = anchor.getProvider();
48
+ const walletKP = loadKeypair(argv.wallet);
49
+ const wallet = new anchor.Wallet(walletKP);
50
+ const squads = Squads.endpoint(process.env.ANCHOR_PROVIDER_URL, wallet, {
51
+ commitmentOrConfig: 'finalized',
52
+ });
53
+ let authority = wallet.publicKey;
54
+ let multisig = argv.multisig ? new PublicKey(argv.multisig) : null;
55
+ if (multisig) {
56
+ authority = squads.getAuthorityPDA(multisig, argv.authorityIndex);
57
+ }
58
+ try {
59
+ const tokenAddress = new PublicKey(argv.token);
60
+ // Find the metadata PDA for the token
61
+ const [metadataAddress] = PublicKey.findProgramAddressSync([
62
+ Buffer.from("metadata", "utf-8"),
63
+ TOKEN_METADATA_PROGRAM_ID.toBuffer(),
64
+ tokenAddress.toBuffer(),
65
+ ], TOKEN_METADATA_PROGRAM_ID);
66
+ // Fetch the existing metadata account
67
+ const metadataAccount = await Metadata.fromAccountAddress(provider.connection, metadataAddress);
68
+ // Create the update instruction
69
+ const updateInstructions = [
70
+ createUpdateMetadataAccountV2Instruction({
71
+ metadata: metadataAddress,
72
+ updateAuthority: authority,
73
+ }, {
74
+ updateMetadataAccountArgsV2: {
75
+ data: {
76
+ name: metadataAccount.data.name,
77
+ symbol: metadataAccount.data.symbol,
78
+ uri: argv.uri,
79
+ sellerFeeBasisPoints: metadataAccount.data.sellerFeeBasisPoints,
80
+ creators: metadataAccount.data.creators || null,
81
+ collection: null,
82
+ uses: null
83
+ },
84
+ updateAuthority: metadataAccount.updateAuthority,
85
+ primarySaleHappened: metadataAccount.primarySaleHappened,
86
+ isMutable: metadataAccount.isMutable
87
+ }
88
+ })
89
+ ];
90
+ await sendInstructionsOrSquads({
91
+ provider,
92
+ instructions: updateInstructions,
93
+ executeTransaction: argv.executeTransaction,
94
+ squads,
95
+ multisig: argv.multisig ? new PublicKey(argv.multisig) : undefined,
96
+ authorityIndex: argv.authorityIndex,
97
+ signers: [],
98
+ });
99
+ console.log(`Successfully created transaction to update metadata URI for token ${argv.token} to ${argv.uri}`);
100
+ }
101
+ catch (err) {
102
+ console.error('Failed to update token metadata:', err);
103
+ process.exit(1);
104
+ }
105
+ }
106
+ //# sourceMappingURL=update-token-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-token-metadata.js","sourceRoot":"","sources":["../../../src/update-token-metadata.ts"],"names":[],"mappings":"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"}