linkup-stacks-sdk 1.0.1
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.
- package/README.md +55 -0
- package/dist/custody.d.ts +9 -0
- package/dist/custody.js +39 -0
- package/dist/factory.d.ts +15 -0
- package/dist/factory.js +77 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +29 -0
- package/dist/posts.d.ts +11 -0
- package/dist/posts.js +76 -0
- package/dist/types.d.ts +21 -0
- package/dist/types.js +9 -0
- package/package.json +26 -0
package/README.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# @linkup/stacks-sdk
|
|
2
|
+
|
|
3
|
+
> SDK for interacting with LinkUp smart contracts on Stacks/Bitcoin
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/linkup-stacks-sdk)
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install linkup-stacks-sdk
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Contracts (Stacks Mainnet)
|
|
14
|
+
|
|
15
|
+
| Contract | Address |
|
|
16
|
+
|---|---|
|
|
17
|
+
| `linkup-factory` | `SP2F5Q3JWH4P5YV2S056W4PHZN2CWN00TDQRBX4J7.linkup-factory` |
|
|
18
|
+
| `linkup-custody` | `SP2F5Q3JWH4P5YV2S056W4PHZN2CWN00TDQRBX4J7.linkup-custody` |
|
|
19
|
+
| `linkup-posts` | `SP2F5Q3JWH4P5YV2S056W4PHZN2CWN00TDQRBX4J7.linkup-posts` |
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { getStats, isRegistered, remainingAllowance, getPost } from '@linkup/stacks-sdk';
|
|
25
|
+
|
|
26
|
+
// Read global stats (no key needed)
|
|
27
|
+
const stats = await getStats();
|
|
28
|
+
console.log(stats); // { totalUsers, totalPosts, totalTips }
|
|
29
|
+
|
|
30
|
+
// Check if address is registered
|
|
31
|
+
const registered = await isRegistered('SP...');
|
|
32
|
+
|
|
33
|
+
// Check remaining daily STX allowance
|
|
34
|
+
const allowance = await remainingAllowance('SP...');
|
|
35
|
+
|
|
36
|
+
// Get a post
|
|
37
|
+
const post = await getPost(1);
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Write operations (requires private key)
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { register, sendStx, createPost, toUstx } from '@linkup/stacks-sdk';
|
|
44
|
+
|
|
45
|
+
const config = { network: 'mainnet', privateKey: 'your-private-key-hex' };
|
|
46
|
+
|
|
47
|
+
// Register user
|
|
48
|
+
await register('username', 'https://hub.hiro.so/read/SP.../linkup/profile.json', config);
|
|
49
|
+
|
|
50
|
+
// Send STX (enforces 1000 STX/day limit)
|
|
51
|
+
await sendStx('SP_RECIPIENT', toUstx(1.5), config); // send 1.5 STX
|
|
52
|
+
|
|
53
|
+
// Create post
|
|
54
|
+
await createPost(contentHashBuffer, 'https://hub.hiro.so/...', config);
|
|
55
|
+
```
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type LinkUpConfig } from './types';
|
|
2
|
+
/** Send STX via the linkup-custody contract (enforces daily 1000 STX limit) */
|
|
3
|
+
export declare function sendStx(recipient: string, amountUstx: bigint, config: Required<LinkUpConfig>): Promise<string>;
|
|
4
|
+
/** Get remaining daily STX allowance for an address (in micro-STX) */
|
|
5
|
+
export declare function remainingAllowance(address: string, config?: LinkUpConfig): Promise<bigint>;
|
|
6
|
+
/** Convert STX to micro-STX */
|
|
7
|
+
export declare const toUstx: (stx: number) => bigint;
|
|
8
|
+
/** Convert micro-STX to STX */
|
|
9
|
+
export declare const fromUstx: (ustx: bigint | number) => number;
|
package/dist/custody.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fromUstx = exports.toUstx = void 0;
|
|
4
|
+
exports.sendStx = sendStx;
|
|
5
|
+
exports.remainingAllowance = remainingAllowance;
|
|
6
|
+
const transactions_1 = require("@stacks/transactions");
|
|
7
|
+
const types_1 = require("./types");
|
|
8
|
+
/** Send STX via the linkup-custody contract (enforces daily 1000 STX limit) */
|
|
9
|
+
async function sendStx(recipient, amountUstx, config) {
|
|
10
|
+
const tx = await (0, transactions_1.makeContractCall)({
|
|
11
|
+
...types_1.CONTRACTS.custody,
|
|
12
|
+
functionName: 'send-stx',
|
|
13
|
+
functionArgs: [(0, transactions_1.standardPrincipalCV)(recipient), (0, transactions_1.uintCV)(amountUstx)],
|
|
14
|
+
senderKey: config.privateKey,
|
|
15
|
+
network: config.network,
|
|
16
|
+
anchorMode: transactions_1.AnchorMode.Any,
|
|
17
|
+
});
|
|
18
|
+
const result = await (0, transactions_1.broadcastTransaction)(tx, config.network);
|
|
19
|
+
if ('error' in result)
|
|
20
|
+
throw new Error(result.error);
|
|
21
|
+
return result.txid;
|
|
22
|
+
}
|
|
23
|
+
/** Get remaining daily STX allowance for an address (in micro-STX) */
|
|
24
|
+
async function remainingAllowance(address, config = {}) {
|
|
25
|
+
const result = await (0, transactions_1.callReadOnlyFunction)({
|
|
26
|
+
...types_1.CONTRACTS.custody,
|
|
27
|
+
functionName: 'remaining-allowance',
|
|
28
|
+
functionArgs: [(0, transactions_1.standardPrincipalCV)(address)],
|
|
29
|
+
network: config.network ?? 'mainnet',
|
|
30
|
+
senderAddress: address,
|
|
31
|
+
});
|
|
32
|
+
return BigInt((0, transactions_1.cvToValue)(result)?.value ?? 0);
|
|
33
|
+
}
|
|
34
|
+
/** Convert STX to micro-STX */
|
|
35
|
+
const toUstx = (stx) => BigInt(Math.round(stx * 1000000));
|
|
36
|
+
exports.toUstx = toUstx;
|
|
37
|
+
/** Convert micro-STX to STX */
|
|
38
|
+
const fromUstx = (ustx) => Number(ustx) / 1000000;
|
|
39
|
+
exports.fromUstx = fromUstx;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type LinkUpConfig } from './types';
|
|
2
|
+
/** Register a new user on LinkUp */
|
|
3
|
+
export declare function register(username: string, gaiaUrl: string, config: Required<LinkUpConfig>): Promise<string>;
|
|
4
|
+
/** Update a user's Gaia profile URL */
|
|
5
|
+
export declare function updateProfile(gaiaUrl: string, config: Required<LinkUpConfig>): Promise<string>;
|
|
6
|
+
/** Check if an address is registered */
|
|
7
|
+
export declare function isRegistered(address: string, config?: LinkUpConfig): Promise<boolean>;
|
|
8
|
+
/** Get a user's profile */
|
|
9
|
+
export declare function getUser(address: string, config?: LinkUpConfig): Promise<any>;
|
|
10
|
+
/** Get global LinkUp stats */
|
|
11
|
+
export declare function getStats(config?: LinkUpConfig): Promise<{
|
|
12
|
+
totalUsers: number;
|
|
13
|
+
totalPosts: number;
|
|
14
|
+
totalTips: number;
|
|
15
|
+
}>;
|
package/dist/factory.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.register = register;
|
|
4
|
+
exports.updateProfile = updateProfile;
|
|
5
|
+
exports.isRegistered = isRegistered;
|
|
6
|
+
exports.getUser = getUser;
|
|
7
|
+
exports.getStats = getStats;
|
|
8
|
+
const transactions_1 = require("@stacks/transactions");
|
|
9
|
+
const types_1 = require("./types");
|
|
10
|
+
/** Register a new user on LinkUp */
|
|
11
|
+
async function register(username, gaiaUrl, config) {
|
|
12
|
+
const tx = await (0, transactions_1.makeContractCall)({
|
|
13
|
+
...types_1.CONTRACTS.factory,
|
|
14
|
+
functionName: 'register',
|
|
15
|
+
functionArgs: [(0, transactions_1.stringUtf8CV)(username), (0, transactions_1.stringUtf8CV)(gaiaUrl)],
|
|
16
|
+
senderKey: config.privateKey,
|
|
17
|
+
network: config.network,
|
|
18
|
+
anchorMode: transactions_1.AnchorMode.Any,
|
|
19
|
+
});
|
|
20
|
+
const result = await (0, transactions_1.broadcastTransaction)(tx, config.network);
|
|
21
|
+
if ('error' in result)
|
|
22
|
+
throw new Error(result.error);
|
|
23
|
+
return result.txid;
|
|
24
|
+
}
|
|
25
|
+
/** Update a user's Gaia profile URL */
|
|
26
|
+
async function updateProfile(gaiaUrl, config) {
|
|
27
|
+
const tx = await (0, transactions_1.makeContractCall)({
|
|
28
|
+
...types_1.CONTRACTS.factory,
|
|
29
|
+
functionName: 'update-profile',
|
|
30
|
+
functionArgs: [(0, transactions_1.stringUtf8CV)(gaiaUrl)],
|
|
31
|
+
senderKey: config.privateKey,
|
|
32
|
+
network: config.network,
|
|
33
|
+
anchorMode: transactions_1.AnchorMode.Any,
|
|
34
|
+
});
|
|
35
|
+
const result = await (0, transactions_1.broadcastTransaction)(tx, config.network);
|
|
36
|
+
if ('error' in result)
|
|
37
|
+
throw new Error(result.error);
|
|
38
|
+
return result.txid;
|
|
39
|
+
}
|
|
40
|
+
/** Check if an address is registered */
|
|
41
|
+
async function isRegistered(address, config = {}) {
|
|
42
|
+
const result = await (0, transactions_1.callReadOnlyFunction)({
|
|
43
|
+
...types_1.CONTRACTS.factory,
|
|
44
|
+
functionName: 'is-registered',
|
|
45
|
+
functionArgs: [(0, transactions_1.standardPrincipalCV)(address)],
|
|
46
|
+
network: config.network ?? 'mainnet',
|
|
47
|
+
senderAddress: address,
|
|
48
|
+
});
|
|
49
|
+
return (0, transactions_1.cvToValue)(result);
|
|
50
|
+
}
|
|
51
|
+
/** Get a user's profile */
|
|
52
|
+
async function getUser(address, config = {}) {
|
|
53
|
+
const result = await (0, transactions_1.callReadOnlyFunction)({
|
|
54
|
+
...types_1.CONTRACTS.factory,
|
|
55
|
+
functionName: 'get-user',
|
|
56
|
+
functionArgs: [(0, transactions_1.standardPrincipalCV)(address)],
|
|
57
|
+
network: config.network ?? 'mainnet',
|
|
58
|
+
senderAddress: address,
|
|
59
|
+
});
|
|
60
|
+
return (0, transactions_1.cvToValue)(result);
|
|
61
|
+
}
|
|
62
|
+
/** Get global LinkUp stats */
|
|
63
|
+
async function getStats(config = {}) {
|
|
64
|
+
const result = await (0, transactions_1.callReadOnlyFunction)({
|
|
65
|
+
...types_1.CONTRACTS.factory,
|
|
66
|
+
functionName: 'get-stats',
|
|
67
|
+
functionArgs: [],
|
|
68
|
+
network: config.network ?? 'mainnet',
|
|
69
|
+
senderAddress: types_1.CONTRACTS.factory.contractAddress,
|
|
70
|
+
});
|
|
71
|
+
const val = (0, transactions_1.cvToValue)(result);
|
|
72
|
+
return {
|
|
73
|
+
totalUsers: Number(val['total-users']?.value ?? 0),
|
|
74
|
+
totalPosts: Number(val['total-posts']?.value ?? 0),
|
|
75
|
+
totalTips: Number(val['total-tips']?.value ?? 0),
|
|
76
|
+
};
|
|
77
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @linkup/stacks-sdk
|
|
3
|
+
* SDK for interacting with LinkUp smart contracts on Stacks/Bitcoin mainnet.
|
|
4
|
+
*
|
|
5
|
+
* Contracts deployed at: SP2F5Q3JWH4P5YV2S056W4PHZN2CWN00TDQRBX4J7
|
|
6
|
+
* - linkup-factory (user registry)
|
|
7
|
+
* - linkup-custody (STX transfers with daily limit)
|
|
8
|
+
* - linkup-posts (on-chain posts, likes, tips)
|
|
9
|
+
*/
|
|
10
|
+
export * from './factory';
|
|
11
|
+
export * from './custody';
|
|
12
|
+
export * from './posts';
|
|
13
|
+
export * from './types';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @linkup/stacks-sdk
|
|
4
|
+
* SDK for interacting with LinkUp smart contracts on Stacks/Bitcoin mainnet.
|
|
5
|
+
*
|
|
6
|
+
* Contracts deployed at: SP2F5Q3JWH4P5YV2S056W4PHZN2CWN00TDQRBX4J7
|
|
7
|
+
* - linkup-factory (user registry)
|
|
8
|
+
* - linkup-custody (STX transfers with daily limit)
|
|
9
|
+
* - linkup-posts (on-chain posts, likes, tips)
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
23
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
__exportStar(require("./factory"), exports);
|
|
27
|
+
__exportStar(require("./custody"), exports);
|
|
28
|
+
__exportStar(require("./posts"), exports);
|
|
29
|
+
__exportStar(require("./types"), exports);
|
package/dist/posts.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type LinkUpConfig } from './types';
|
|
2
|
+
/** Create a post on-chain. contentHash = SHA-256 of post JSON; full content in Gaia. */
|
|
3
|
+
export declare function createPost(contentHash: Buffer, gaiaUrl: string, config: Required<LinkUpConfig>): Promise<string>;
|
|
4
|
+
/** Like a post */
|
|
5
|
+
export declare function likePost(postId: number, config: Required<LinkUpConfig>): Promise<string>;
|
|
6
|
+
/** Tip a post with STX */
|
|
7
|
+
export declare function tipPost(postId: number, amountUstx: bigint, config: Required<LinkUpConfig>): Promise<string>;
|
|
8
|
+
/** Get post metadata from chain */
|
|
9
|
+
export declare function getPost(postId: number, config?: LinkUpConfig): Promise<any>;
|
|
10
|
+
/** Check if an address has liked a post */
|
|
11
|
+
export declare function hasLiked(postId: number, address: string, config?: LinkUpConfig): Promise<boolean>;
|
package/dist/posts.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createPost = createPost;
|
|
4
|
+
exports.likePost = likePost;
|
|
5
|
+
exports.tipPost = tipPost;
|
|
6
|
+
exports.getPost = getPost;
|
|
7
|
+
exports.hasLiked = hasLiked;
|
|
8
|
+
const transactions_1 = require("@stacks/transactions");
|
|
9
|
+
const types_1 = require("./types");
|
|
10
|
+
/** Create a post on-chain. contentHash = SHA-256 of post JSON; full content in Gaia. */
|
|
11
|
+
async function createPost(contentHash, gaiaUrl, config) {
|
|
12
|
+
const tx = await (0, transactions_1.makeContractCall)({
|
|
13
|
+
...types_1.CONTRACTS.posts,
|
|
14
|
+
functionName: 'create-post',
|
|
15
|
+
functionArgs: [(0, transactions_1.bufferCV)(contentHash), (0, transactions_1.stringUtf8CV)(gaiaUrl)],
|
|
16
|
+
senderKey: config.privateKey,
|
|
17
|
+
network: config.network,
|
|
18
|
+
anchorMode: transactions_1.AnchorMode.Any,
|
|
19
|
+
});
|
|
20
|
+
const result = await (0, transactions_1.broadcastTransaction)(tx, config.network);
|
|
21
|
+
if ('error' in result)
|
|
22
|
+
throw new Error(result.error);
|
|
23
|
+
return result.txid;
|
|
24
|
+
}
|
|
25
|
+
/** Like a post */
|
|
26
|
+
async function likePost(postId, config) {
|
|
27
|
+
const tx = await (0, transactions_1.makeContractCall)({
|
|
28
|
+
...types_1.CONTRACTS.posts,
|
|
29
|
+
functionName: 'like-post',
|
|
30
|
+
functionArgs: [(0, transactions_1.uintCV)(postId)],
|
|
31
|
+
senderKey: config.privateKey,
|
|
32
|
+
network: config.network,
|
|
33
|
+
anchorMode: transactions_1.AnchorMode.Any,
|
|
34
|
+
});
|
|
35
|
+
const result = await (0, transactions_1.broadcastTransaction)(tx, config.network);
|
|
36
|
+
if ('error' in result)
|
|
37
|
+
throw new Error(result.error);
|
|
38
|
+
return result.txid;
|
|
39
|
+
}
|
|
40
|
+
/** Tip a post with STX */
|
|
41
|
+
async function tipPost(postId, amountUstx, config) {
|
|
42
|
+
const tx = await (0, transactions_1.makeContractCall)({
|
|
43
|
+
...types_1.CONTRACTS.posts,
|
|
44
|
+
functionName: 'tip-post',
|
|
45
|
+
functionArgs: [(0, transactions_1.uintCV)(postId), (0, transactions_1.uintCV)(amountUstx)],
|
|
46
|
+
senderKey: config.privateKey,
|
|
47
|
+
network: config.network,
|
|
48
|
+
anchorMode: transactions_1.AnchorMode.Any,
|
|
49
|
+
});
|
|
50
|
+
const result = await (0, transactions_1.broadcastTransaction)(tx, config.network);
|
|
51
|
+
if ('error' in result)
|
|
52
|
+
throw new Error(result.error);
|
|
53
|
+
return result.txid;
|
|
54
|
+
}
|
|
55
|
+
/** Get post metadata from chain */
|
|
56
|
+
async function getPost(postId, config = {}) {
|
|
57
|
+
const result = await (0, transactions_1.callReadOnlyFunction)({
|
|
58
|
+
...types_1.CONTRACTS.posts,
|
|
59
|
+
functionName: 'get-post',
|
|
60
|
+
functionArgs: [(0, transactions_1.uintCV)(postId)],
|
|
61
|
+
network: config.network ?? 'mainnet',
|
|
62
|
+
senderAddress: types_1.CONTRACTS.posts.contractAddress,
|
|
63
|
+
});
|
|
64
|
+
return (0, transactions_1.cvToValue)(result);
|
|
65
|
+
}
|
|
66
|
+
/** Check if an address has liked a post */
|
|
67
|
+
async function hasLiked(postId, address, config = {}) {
|
|
68
|
+
const result = await (0, transactions_1.callReadOnlyFunction)({
|
|
69
|
+
...types_1.CONTRACTS.posts,
|
|
70
|
+
functionName: 'has-liked',
|
|
71
|
+
functionArgs: [(0, transactions_1.uintCV)(postId), (0, transactions_1.standardPrincipalCV)(address)],
|
|
72
|
+
network: config.network ?? 'mainnet',
|
|
73
|
+
senderAddress: address,
|
|
74
|
+
});
|
|
75
|
+
return (0, transactions_1.cvToValue)(result);
|
|
76
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const DEPLOYER = "SP2F5Q3JWH4P5YV2S056W4PHZN2CWN00TDQRBX4J7";
|
|
2
|
+
export declare const CONTRACTS: {
|
|
3
|
+
readonly factory: {
|
|
4
|
+
readonly contractAddress: "SP2F5Q3JWH4P5YV2S056W4PHZN2CWN00TDQRBX4J7";
|
|
5
|
+
readonly contractName: "linkup-factory";
|
|
6
|
+
};
|
|
7
|
+
readonly custody: {
|
|
8
|
+
readonly contractAddress: "SP2F5Q3JWH4P5YV2S056W4PHZN2CWN00TDQRBX4J7";
|
|
9
|
+
readonly contractName: "linkup-custody";
|
|
10
|
+
};
|
|
11
|
+
readonly posts: {
|
|
12
|
+
readonly contractAddress: "SP2F5Q3JWH4P5YV2S056W4PHZN2CWN00TDQRBX4J7";
|
|
13
|
+
readonly contractName: "linkup-posts";
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export type Network = 'mainnet' | 'testnet';
|
|
17
|
+
export interface LinkUpConfig {
|
|
18
|
+
network?: Network;
|
|
19
|
+
/** Private key hex (for write operations) */
|
|
20
|
+
privateKey?: string;
|
|
21
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CONTRACTS = exports.DEPLOYER = void 0;
|
|
4
|
+
exports.DEPLOYER = 'SP2F5Q3JWH4P5YV2S056W4PHZN2CWN00TDQRBX4J7';
|
|
5
|
+
exports.CONTRACTS = {
|
|
6
|
+
factory: { contractAddress: exports.DEPLOYER, contractName: 'linkup-factory' },
|
|
7
|
+
custody: { contractAddress: exports.DEPLOYER, contractName: 'linkup-custody' },
|
|
8
|
+
posts: { contractAddress: exports.DEPLOYER, contractName: 'linkup-posts' },
|
|
9
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "linkup-stacks-sdk",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "LinkUp SDK — interact with LinkUp smart contracts on Stacks/Bitcoin",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": ["dist"],
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "tsc",
|
|
10
|
+
"prepublishOnly": "npm run build"
|
|
11
|
+
},
|
|
12
|
+
"keywords": ["stacks", "bitcoin", "clarity", "social", "payments", "linkup", "web3"],
|
|
13
|
+
"author": "LinkUp",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "https://github.com/jajafwangshak86-ops/LinkUp.git"
|
|
18
|
+
},
|
|
19
|
+
"homepage": "https://github.com/jajafwangshak86-ops/LinkUp#readme",
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@stacks/transactions": "^6.17.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"typescript": "~5.9.2"
|
|
25
|
+
}
|
|
26
|
+
}
|