@coinbase/agentkit 0.0.0-nightly-20250807210405 → 0.0.0-nightly-20250808210408
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 +80 -54
- package/dist/action-providers/index.d.ts +1 -0
- package/dist/action-providers/index.js +1 -0
- package/dist/action-providers/zerion/constants.d.ts +1 -0
- package/dist/action-providers/zerion/constants.js +4 -0
- package/dist/action-providers/zerion/index.d.ts +2 -0
- package/dist/action-providers/zerion/index.js +18 -0
- package/dist/action-providers/zerion/schemas.d.ts +11 -0
- package/dist/action-providers/zerion/schemas.js +15 -0
- package/dist/action-providers/zerion/types.d.ts +125 -0
- package/dist/action-providers/zerion/types.js +16 -0
- package/dist/action-providers/zerion/utils.d.ts +3 -0
- package/dist/action-providers/zerion/utils.js +45 -0
- package/dist/action-providers/zerion/zerionActionProvider.d.ts +57 -0
- package/dist/action-providers/zerion/zerionActionProvider.js +159 -0
- package/dist/action-providers/zerion/zerionActionProvider.test.d.ts +1 -0
- package/dist/action-providers/zerion/zerionActionProvider.test.js +213 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,60 +5,73 @@ AgentKit is a framework for easily enabling AI agents to take actions onchain. I
|
|
|
5
5
|
## Table of Contents
|
|
6
6
|
|
|
7
7
|
- [Agentkit](#agentkit)
|
|
8
|
-
- [
|
|
9
|
-
- [
|
|
10
|
-
- [
|
|
11
|
-
- [
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
- [
|
|
16
|
-
- [
|
|
17
|
-
- [
|
|
18
|
-
- [
|
|
19
|
-
|
|
20
|
-
- [
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
- [
|
|
24
|
-
|
|
25
|
-
- [
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
- [
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
- [
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
- [
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
- [
|
|
52
|
-
- [
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
- [
|
|
56
|
-
- [
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
- [
|
|
8
|
+
- [Table of Contents](#table-of-contents)
|
|
9
|
+
- [Getting Started](#getting-started)
|
|
10
|
+
- [Installation](#installation)
|
|
11
|
+
- [Usage](#usage)
|
|
12
|
+
- [Create an AgentKit instance. If no wallet or action providers are specified, the agent will use the `CdpWalletProvider` and `WalletProvider` action provider.](#create-an-agentkit-instance-if-no-wallet-or-action-providers-are-specified-the-agent-will-use-the-cdpwalletprovider-and-walletprovider-action-provider)
|
|
13
|
+
- [Create an AgentKit instance](#create-an-agentkit-instance)
|
|
14
|
+
- [Create an AgentKit instance with a specified wallet provider.](#create-an-agentkit-instance-with-a-specified-wallet-provider)
|
|
15
|
+
- [Create an AgentKit instance with a specified action providers.](#create-an-agentkit-instance-with-a-specified-action-providers)
|
|
16
|
+
- [Use the agent's actions with a framework extension. For example, using LangChain + OpenAI.](#use-the-agents-actions-with-a-framework-extension-for-example-using-langchain--openai)
|
|
17
|
+
- [Action Providers](#action-providers)
|
|
18
|
+
- [Creating an Action Provider](#creating-an-action-provider)
|
|
19
|
+
- [Adding Actions to your Action Provider](#adding-actions-to-your-action-provider)
|
|
20
|
+
- [Required Typescript Compiler Options](#required-typescript-compiler-options)
|
|
21
|
+
- [Steps to create an action](#steps-to-create-an-action)
|
|
22
|
+
- [Adding Actions to your Action Provider that use a Wallet Provider](#adding-actions-to-your-action-provider-that-use-a-wallet-provider)
|
|
23
|
+
- [Adding an Action Provider to your AgentKit instance.](#adding-an-action-provider-to-your-agentkit-instance)
|
|
24
|
+
- [EVM Wallet Providers](#evm-wallet-providers)
|
|
25
|
+
- [CdpEvmWalletProvider](#cdpevmwalletprovider)
|
|
26
|
+
- [Basic Configuration](#basic-configuration)
|
|
27
|
+
- [Using an Existing Wallet](#using-an-existing-wallet)
|
|
28
|
+
- [Creating a New Wallet](#creating-a-new-wallet)
|
|
29
|
+
- [Environment Variables](#environment-variables)
|
|
30
|
+
- [Exporting a wallet](#exporting-a-wallet)
|
|
31
|
+
- [CdpSmartWalletProvider](#cdpsmartwalletprovider)
|
|
32
|
+
- [Basic Configuration](#basic-configuration-1)
|
|
33
|
+
- [Using an Existing Smart Wallet](#using-an-existing-smart-wallet)
|
|
34
|
+
- [Specifying an Owner Account](#specifying-an-owner-account)
|
|
35
|
+
- [Creating a New Smart Wallet](#creating-a-new-smart-wallet)
|
|
36
|
+
- [Environment Variables](#environment-variables-1)
|
|
37
|
+
- [Exporting Smart Wallet Information](#exporting-smart-wallet-information)
|
|
38
|
+
- [Key Differences from Regular Wallets](#key-differences-from-regular-wallets)
|
|
39
|
+
- [LegacyCdpWalletProvider](#legacycdpwalletprovider)
|
|
40
|
+
- [Network Configuration](#network-configuration)
|
|
41
|
+
- [Configuring from an existing CDP API Wallet](#configuring-from-an-existing-cdp-api-wallet)
|
|
42
|
+
- [Configuring from a mnemonic phrase](#configuring-from-a-mnemonic-phrase)
|
|
43
|
+
- [Exporting a wallet](#exporting-a-wallet-1)
|
|
44
|
+
- [Importing a wallet from `WalletData` JSON string](#importing-a-wallet-from-walletdata-json-string)
|
|
45
|
+
- [Configuring LegacyCdpWalletProvider gas parameters](#configuring-legacycdpwalletprovider-gas-parameters)
|
|
46
|
+
- [ViemWalletProvider](#viemwalletprovider)
|
|
47
|
+
- [Configuring ViemWalletProvider gas parameters](#configuring-viemwalletprovider-gas-parameters)
|
|
48
|
+
- [PrivyWalletProvider](#privywalletprovider)
|
|
49
|
+
- [Server Wallet Configuration](#server-wallet-configuration)
|
|
50
|
+
- [Delegated Embedded Wallet Configuration](#delegated-embedded-wallet-configuration)
|
|
51
|
+
- [Prerequisites](#prerequisites)
|
|
52
|
+
- [Supported Operations](#supported-operations)
|
|
53
|
+
- [Authorization Keys](#authorization-keys)
|
|
54
|
+
- [Exporting Privy Wallet information](#exporting-privy-wallet-information)
|
|
55
|
+
- [SmartWalletProvider](#smartwalletprovider)
|
|
56
|
+
- [ZeroDevWalletProvider](#zerodevwalletprovider)
|
|
57
|
+
- [Configuring from CdpWalletProvider](#configuring-from-cdpwalletprovider)
|
|
58
|
+
- [Configuring from PrivyWalletProvider](#configuring-from-privywalletprovider)
|
|
59
|
+
- [Configuring from ViemWalletProvider](#configuring-from-viemwalletprovider)
|
|
60
|
+
- [SVM Wallet Providers](#svm-wallet-providers)
|
|
61
|
+
- [CdpV2SolanaWalletProvider](#cdpv2solanawalletprovider)
|
|
62
|
+
- [Basic Configuration](#basic-configuration-2)
|
|
63
|
+
- [Using an Existing Wallet](#using-an-existing-wallet-1)
|
|
64
|
+
- [Creating a New Wallet](#creating-a-new-wallet-1)
|
|
65
|
+
- [Environment Variables](#environment-variables-2)
|
|
66
|
+
- [Supported Networks](#supported-networks)
|
|
67
|
+
- [SolanaKeypairWalletProvider](#solanakeypairwalletprovider)
|
|
68
|
+
- [Solana Network Configuration](#solana-network-configuration)
|
|
69
|
+
- [RPC URL Configuration](#rpc-url-configuration)
|
|
70
|
+
- [PrivyWalletProvider (Solana)](#privywalletprovider-solana)
|
|
71
|
+
- [Connection Configuration](#connection-configuration)
|
|
72
|
+
- [Authorization Keys](#authorization-keys-1)
|
|
73
|
+
- [Exporting Privy Wallet information](#exporting-privy-wallet-information-1)
|
|
74
|
+
- [Contributing](#contributing)
|
|
62
75
|
|
|
63
76
|
## Getting Started
|
|
64
77
|
|
|
@@ -452,6 +465,19 @@ it will return payment details that can be used on retry.</td>
|
|
|
452
465
|
</table>
|
|
453
466
|
</details>
|
|
454
467
|
<details>
|
|
468
|
+
<summary><strong>Zerion</strong></summary>
|
|
469
|
+
<table width="100%">
|
|
470
|
+
<tr>
|
|
471
|
+
<td width="200"><code>getPortfolioOverview</code></td>
|
|
472
|
+
<td width="768">Fetches and summarizes a crypto wallet's portfolio in USD.</td>
|
|
473
|
+
</tr>
|
|
474
|
+
<tr>
|
|
475
|
+
<td width="200"><code>getFungiblePositions</code></td>
|
|
476
|
+
<td width="768">Retrieves and summarizes a wallet's fungible token holdings (including DeFi positions)</td>
|
|
477
|
+
</tr>
|
|
478
|
+
</table>
|
|
479
|
+
</details>
|
|
480
|
+
<details>
|
|
455
481
|
<summary><strong>ZeroDev Wallet</strong></summary>
|
|
456
482
|
<table width="100%">
|
|
457
483
|
<tr>
|
|
@@ -44,5 +44,6 @@ __exportStar(require("./flaunch"), exports);
|
|
|
44
44
|
__exportStar(require("./onramp"), exports);
|
|
45
45
|
__exportStar(require("./vaultsfyi"), exports);
|
|
46
46
|
__exportStar(require("./x402"), exports);
|
|
47
|
+
__exportStar(require("./zerion"), exports);
|
|
47
48
|
__exportStar(require("./zerodev"), exports);
|
|
48
49
|
__exportStar(require("./zora"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const ZERION_V1_BASE_URL = "https://api.zerion.io/v1";
|
|
@@ -0,0 +1,18 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./zerionActionProvider"), exports);
|
|
18
|
+
__exportStar(require("./schemas"), exports);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Input schema for getting wallet portfolio.
|
|
4
|
+
*/
|
|
5
|
+
export declare const GetWalletPortfolioSchema: z.ZodObject<{
|
|
6
|
+
walletAddress: z.ZodString;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
walletAddress: string;
|
|
9
|
+
}, {
|
|
10
|
+
walletAddress: string;
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GetWalletPortfolioSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
/**
|
|
6
|
+
* Input schema for getting wallet portfolio.
|
|
7
|
+
*/
|
|
8
|
+
exports.GetWalletPortfolioSchema = zod_1.z
|
|
9
|
+
.object({
|
|
10
|
+
walletAddress: zod_1.z
|
|
11
|
+
.string()
|
|
12
|
+
.describe("The wallet address to fetch portfolio for. Defaults is empty string, which will raise an error later if not provided."),
|
|
13
|
+
})
|
|
14
|
+
.strip()
|
|
15
|
+
.describe("Input schema for fetching wallet portfolio");
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
export interface ZerionFungiblePositionsResponse {
|
|
2
|
+
links: {
|
|
3
|
+
self: string;
|
|
4
|
+
};
|
|
5
|
+
data: ZerionFungiblePosition[];
|
|
6
|
+
}
|
|
7
|
+
export interface ZerionPortfolioResponse {
|
|
8
|
+
links: {
|
|
9
|
+
self: string;
|
|
10
|
+
};
|
|
11
|
+
data: ZerionPortfolio;
|
|
12
|
+
}
|
|
13
|
+
export interface ZerionPortfolio {
|
|
14
|
+
type: string;
|
|
15
|
+
id: string;
|
|
16
|
+
attributes: PortfolioAttributes;
|
|
17
|
+
}
|
|
18
|
+
export interface PortfolioAttributes {
|
|
19
|
+
positions_distribution_by_type: {
|
|
20
|
+
wallet: number;
|
|
21
|
+
deposited: number;
|
|
22
|
+
borrowed: number;
|
|
23
|
+
locked: number;
|
|
24
|
+
staked: number;
|
|
25
|
+
};
|
|
26
|
+
positions_distribution_by_chain: {
|
|
27
|
+
[key: string]: number;
|
|
28
|
+
};
|
|
29
|
+
total: {
|
|
30
|
+
positions: number;
|
|
31
|
+
};
|
|
32
|
+
changes: {
|
|
33
|
+
absolute_1d: number;
|
|
34
|
+
percent_1d: number;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export interface ZerionFungiblePosition {
|
|
38
|
+
type: string;
|
|
39
|
+
id: string;
|
|
40
|
+
attributes: FungibleAttributes;
|
|
41
|
+
relationships: Relationships;
|
|
42
|
+
}
|
|
43
|
+
export interface FungibleAttributes {
|
|
44
|
+
parent: null | string;
|
|
45
|
+
protocol: null | string;
|
|
46
|
+
pool_address?: string;
|
|
47
|
+
group_id?: string;
|
|
48
|
+
name: string;
|
|
49
|
+
position_type: PositionType;
|
|
50
|
+
quantity: Quantity;
|
|
51
|
+
value: number | null;
|
|
52
|
+
price: number;
|
|
53
|
+
changes: Changes | null;
|
|
54
|
+
fungible_info: FungibleInfo;
|
|
55
|
+
flags: AttributesFlags;
|
|
56
|
+
updated_at: Date;
|
|
57
|
+
updated_at_block: number | null;
|
|
58
|
+
application_metadata?: ApplicationMetadata;
|
|
59
|
+
}
|
|
60
|
+
export interface ApplicationMetadata {
|
|
61
|
+
name: string;
|
|
62
|
+
icon: Icon;
|
|
63
|
+
url: string;
|
|
64
|
+
}
|
|
65
|
+
export interface Icon {
|
|
66
|
+
url: string;
|
|
67
|
+
}
|
|
68
|
+
export interface Changes {
|
|
69
|
+
absolute_1d: number;
|
|
70
|
+
percent_1d: number;
|
|
71
|
+
}
|
|
72
|
+
export interface AttributesFlags {
|
|
73
|
+
displayable: boolean;
|
|
74
|
+
is_trash: boolean;
|
|
75
|
+
}
|
|
76
|
+
export interface FungibleInfo {
|
|
77
|
+
name: string;
|
|
78
|
+
symbol: string;
|
|
79
|
+
icon: Icon | null;
|
|
80
|
+
flags: FungibleInfoFlags;
|
|
81
|
+
implementations: Implementation[];
|
|
82
|
+
}
|
|
83
|
+
export interface FungibleInfoFlags {
|
|
84
|
+
verified: boolean;
|
|
85
|
+
}
|
|
86
|
+
export interface Implementation {
|
|
87
|
+
chain_id: string;
|
|
88
|
+
address: null | string;
|
|
89
|
+
decimals: number;
|
|
90
|
+
}
|
|
91
|
+
export declare enum PositionType {
|
|
92
|
+
Deposit = "deposit",
|
|
93
|
+
Reward = "reward",
|
|
94
|
+
Staked = "staked",
|
|
95
|
+
Wallet = "wallet"
|
|
96
|
+
}
|
|
97
|
+
export interface Quantity {
|
|
98
|
+
int: string;
|
|
99
|
+
decimals: number;
|
|
100
|
+
float: number;
|
|
101
|
+
numeric: string;
|
|
102
|
+
}
|
|
103
|
+
export interface Relationships {
|
|
104
|
+
chain: Chain;
|
|
105
|
+
dapp?: Dapp;
|
|
106
|
+
fungible: Chain;
|
|
107
|
+
}
|
|
108
|
+
export interface Dapp {
|
|
109
|
+
data: Data;
|
|
110
|
+
}
|
|
111
|
+
export interface Chain {
|
|
112
|
+
links: {
|
|
113
|
+
related: string;
|
|
114
|
+
};
|
|
115
|
+
data: Data;
|
|
116
|
+
}
|
|
117
|
+
export interface Data {
|
|
118
|
+
type: DataType;
|
|
119
|
+
id: string;
|
|
120
|
+
}
|
|
121
|
+
export declare enum DataType {
|
|
122
|
+
Chains = "chains",
|
|
123
|
+
Dapps = "dapps",
|
|
124
|
+
Fungibles = "fungibles"
|
|
125
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DataType = exports.PositionType = void 0;
|
|
4
|
+
var PositionType;
|
|
5
|
+
(function (PositionType) {
|
|
6
|
+
PositionType["Deposit"] = "deposit";
|
|
7
|
+
PositionType["Reward"] = "reward";
|
|
8
|
+
PositionType["Staked"] = "staked";
|
|
9
|
+
PositionType["Wallet"] = "wallet";
|
|
10
|
+
})(PositionType || (exports.PositionType = PositionType = {}));
|
|
11
|
+
var DataType;
|
|
12
|
+
(function (DataType) {
|
|
13
|
+
DataType["Chains"] = "chains";
|
|
14
|
+
DataType["Dapps"] = "dapps";
|
|
15
|
+
DataType["Fungibles"] = "fungibles";
|
|
16
|
+
})(DataType || (exports.DataType = DataType = {}));
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatPositionsData = exports.formatPortfolioData = void 0;
|
|
4
|
+
const formatPortfolioData = (data) => {
|
|
5
|
+
// Total value
|
|
6
|
+
const totalValue = data.attributes.total.positions;
|
|
7
|
+
const totalValueStr = `$${totalValue.toFixed(2)}`;
|
|
8
|
+
// 24h change
|
|
9
|
+
const changePercent = data.attributes.changes.percent_1d;
|
|
10
|
+
const changeStr = `${changePercent.toFixed(2)}%`;
|
|
11
|
+
// Positions by type (filter out 0)
|
|
12
|
+
const types = Object.entries(data.attributes.positions_distribution_by_type)
|
|
13
|
+
.filter(([_, v]) => v > 0)
|
|
14
|
+
.map(([type, value]) => `${type}: $${value.toFixed(2)}`)
|
|
15
|
+
.join(", ");
|
|
16
|
+
// Positions by chain (top 5 by value)
|
|
17
|
+
const topChains = Object.entries(data.attributes.positions_distribution_by_chain)
|
|
18
|
+
.sort(([, a], [, b]) => b - a)
|
|
19
|
+
.slice(0, 5)
|
|
20
|
+
.map(([chain, value]) => `${chain}: $${value.toFixed(2)}`)
|
|
21
|
+
.join(", ");
|
|
22
|
+
// Final summary string
|
|
23
|
+
return `Wallet Portfolio Overview:
|
|
24
|
+
- Total Value: ${totalValueStr}
|
|
25
|
+
- 24h Change: ${changeStr}
|
|
26
|
+
- Position Types: ${types}
|
|
27
|
+
- Top Chains: ${topChains}`;
|
|
28
|
+
};
|
|
29
|
+
exports.formatPortfolioData = formatPortfolioData;
|
|
30
|
+
const formatPositionsData = (data) => {
|
|
31
|
+
const filtered = data.filter(pos => pos.attributes.value !== null);
|
|
32
|
+
// Sort by value (descending)
|
|
33
|
+
const sorted = filtered.sort((a, b) => b.attributes.value - a.attributes.value);
|
|
34
|
+
const lines = [];
|
|
35
|
+
let totalValue = 0;
|
|
36
|
+
for (const pos of sorted) {
|
|
37
|
+
const { value, position_type, fungible_info, application_metadata } = pos.attributes;
|
|
38
|
+
const chain = pos.relationships.chain.data.id;
|
|
39
|
+
const protocolLine = application_metadata?.name ? `via ${application_metadata.name}` : "";
|
|
40
|
+
lines.push(`- ${fungible_info.symbol} (${fungible_info.name}) on ${chain} — $${value.toFixed(2)} [${position_type}${protocolLine ? " " + protocolLine : ""}]`);
|
|
41
|
+
totalValue += value;
|
|
42
|
+
}
|
|
43
|
+
return `Total Value: $${totalValue.toFixed(2)}\n\nToken Positions (>$1):\n${lines.join("\n")}`;
|
|
44
|
+
};
|
|
45
|
+
exports.formatPositionsData = formatPositionsData;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Network } from "../../network";
|
|
3
|
+
import { ActionProvider } from "../actionProvider";
|
|
4
|
+
import { GetWalletPortfolioSchema } from "./schemas";
|
|
5
|
+
/**
|
|
6
|
+
* Configuration options for the ZerionActionProvider.
|
|
7
|
+
*/
|
|
8
|
+
export interface ZerionActionProviderConfig {
|
|
9
|
+
/**
|
|
10
|
+
* Zerion API Key. Request new at https://zerion.io/api
|
|
11
|
+
*/
|
|
12
|
+
apiKey?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* ZerionActionProvider provides actions for zerion operations.
|
|
16
|
+
*
|
|
17
|
+
* @description
|
|
18
|
+
* This provider is designed to provide EVM-based operations.
|
|
19
|
+
* It supports all EVM-based networks.
|
|
20
|
+
*/
|
|
21
|
+
export declare class ZerionActionProvider extends ActionProvider {
|
|
22
|
+
private readonly apiKey;
|
|
23
|
+
/**
|
|
24
|
+
* Constructor for the ZerionActionProvider.
|
|
25
|
+
*
|
|
26
|
+
* @param config - The configuration options for the ZerionActionProvider.
|
|
27
|
+
*/
|
|
28
|
+
constructor(config?: ZerionActionProviderConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Fetches and summarizes a crypto wallet's portfolio in USD.
|
|
31
|
+
*
|
|
32
|
+
* @param args - Arguments defined by GetWalletPortfolioSchema
|
|
33
|
+
* @returns A promise that resolves to a string describing the action result
|
|
34
|
+
*/
|
|
35
|
+
getPortfolioOverview(args: z.infer<typeof GetWalletPortfolioSchema>): Promise<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Retrieves and summarizes a wallet's fungible token holdings.
|
|
38
|
+
*
|
|
39
|
+
* @param args - Arguments defined by GetWalletPortfolioSchema
|
|
40
|
+
* @returns A promise that resolves to a string describing the action result
|
|
41
|
+
*/
|
|
42
|
+
getFungiblePositions(args: z.infer<typeof GetWalletPortfolioSchema>): Promise<string>;
|
|
43
|
+
/**
|
|
44
|
+
* Checks if this provider supports the given network.
|
|
45
|
+
*
|
|
46
|
+
* @param network - The network to check support for
|
|
47
|
+
* @returns True if the network is supported
|
|
48
|
+
*/
|
|
49
|
+
supportsNetwork(network: Network): boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Factory function to create a new ZerionActionProvider instance.
|
|
53
|
+
*
|
|
54
|
+
* @param config - The configuration options for the ZerionActionProvider.
|
|
55
|
+
* @returns A new ZerionActionProvider instance
|
|
56
|
+
*/
|
|
57
|
+
export declare const zerionActionProvider: (config?: ZerionActionProviderConfig) => ZerionActionProvider;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.zerionActionProvider = exports.ZerionActionProvider = void 0;
|
|
13
|
+
const viem_1 = require("viem");
|
|
14
|
+
const zod_1 = require("zod");
|
|
15
|
+
const actionDecorator_1 = require("../actionDecorator");
|
|
16
|
+
const actionProvider_1 = require("../actionProvider");
|
|
17
|
+
const constants_1 = require("./constants");
|
|
18
|
+
const schemas_1 = require("./schemas");
|
|
19
|
+
const utils_1 = require("./utils");
|
|
20
|
+
/**
|
|
21
|
+
* ZerionActionProvider provides actions for zerion operations.
|
|
22
|
+
*
|
|
23
|
+
* @description
|
|
24
|
+
* This provider is designed to provide EVM-based operations.
|
|
25
|
+
* It supports all EVM-based networks.
|
|
26
|
+
*/
|
|
27
|
+
class ZerionActionProvider extends actionProvider_1.ActionProvider {
|
|
28
|
+
/**
|
|
29
|
+
* Constructor for the ZerionActionProvider.
|
|
30
|
+
*
|
|
31
|
+
* @param config - The configuration options for the ZerionActionProvider.
|
|
32
|
+
*/
|
|
33
|
+
constructor(config = {}) {
|
|
34
|
+
super("zerion", []);
|
|
35
|
+
const apiKey = config.apiKey || process.env.ZERION_API_KEY;
|
|
36
|
+
if (!apiKey) {
|
|
37
|
+
throw new Error("ZERION_API_KEY is not configured.");
|
|
38
|
+
}
|
|
39
|
+
const encodedKey = Buffer.from(`${apiKey}:`).toString("base64");
|
|
40
|
+
this.apiKey = encodedKey;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Fetches and summarizes a crypto wallet's portfolio in USD.
|
|
44
|
+
*
|
|
45
|
+
* @param args - Arguments defined by GetWalletPortfolioSchema
|
|
46
|
+
* @returns A promise that resolves to a string describing the action result
|
|
47
|
+
*/
|
|
48
|
+
async getPortfolioOverview(args) {
|
|
49
|
+
try {
|
|
50
|
+
const address = args.walletAddress || "";
|
|
51
|
+
if (!(0, viem_1.isAddress)(address)) {
|
|
52
|
+
return `Invalid wallet address: ${address}`;
|
|
53
|
+
}
|
|
54
|
+
const options = {
|
|
55
|
+
method: "GET",
|
|
56
|
+
headers: {
|
|
57
|
+
accept: "application/json",
|
|
58
|
+
authorization: `Basic ${this.apiKey}`,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
const url = `${constants_1.ZERION_V1_BASE_URL}/wallets/${args.walletAddress}/portfolio?filter[positions]=no_filter¤cy=usd`;
|
|
62
|
+
const response = await fetch(url, options);
|
|
63
|
+
const { data } = await response.json();
|
|
64
|
+
return (0, utils_1.formatPortfolioData)(data);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return `Error fetching portfolio overview for wallet ${args.walletAddress}: ${error}`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Retrieves and summarizes a wallet's fungible token holdings.
|
|
72
|
+
*
|
|
73
|
+
* @param args - Arguments defined by GetWalletPortfolioSchema
|
|
74
|
+
* @returns A promise that resolves to a string describing the action result
|
|
75
|
+
*/
|
|
76
|
+
async getFungiblePositions(args) {
|
|
77
|
+
try {
|
|
78
|
+
const address = args.walletAddress || "";
|
|
79
|
+
if (!(0, viem_1.isAddress)(address)) {
|
|
80
|
+
return `Invalid wallet address: ${address}`;
|
|
81
|
+
}
|
|
82
|
+
const options = {
|
|
83
|
+
method: "GET",
|
|
84
|
+
headers: {
|
|
85
|
+
accept: "application/json",
|
|
86
|
+
authorization: `Basic ${this.apiKey}`,
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
const url = `${constants_1.ZERION_V1_BASE_URL}/wallets/${args.walletAddress}/positions?filter[positions]=no_filter¤cy=usd&filter[trash]=only_non_trash&sort=value`;
|
|
90
|
+
const response = await fetch(url, options);
|
|
91
|
+
const { data } = await response.json();
|
|
92
|
+
return (0, utils_1.formatPositionsData)(data);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
return `Error fetching fungible positions for wallet ${args.walletAddress}: ${error}`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Checks if this provider supports the given network.
|
|
100
|
+
*
|
|
101
|
+
* @param network - The network to check support for
|
|
102
|
+
* @returns True if the network is supported
|
|
103
|
+
*/
|
|
104
|
+
supportsNetwork(network) {
|
|
105
|
+
// all protocol networks
|
|
106
|
+
return network.protocolFamily === "evm";
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.ZerionActionProvider = ZerionActionProvider;
|
|
110
|
+
__decorate([
|
|
111
|
+
(0, actionDecorator_1.CreateAction)({
|
|
112
|
+
name: "get_portfolio_overview",
|
|
113
|
+
description: `
|
|
114
|
+
Fetches and summarizes a crypto wallet's portfolio in USD.
|
|
115
|
+
The tool returns a human-readable overview of the wallet's total value, value distribution across blockchains, position types (e.g., staked, deposited), and 24-hour performance change.
|
|
116
|
+
Useful for providing quick insights into a wallet's DeFi and cross-chain holdings.
|
|
117
|
+
Input:
|
|
118
|
+
- walletAddress: The wallet address to fetch portfolio overview for.
|
|
119
|
+
Output a structured text summary with:
|
|
120
|
+
- Total portfolio value in USD
|
|
121
|
+
- 24h percentage change in value
|
|
122
|
+
- Breakdown of value by position types (e.g., wallet, deposited, staked, locked, borrowed)
|
|
123
|
+
- Top 5 chains by value distribution
|
|
124
|
+
`,
|
|
125
|
+
schema: schemas_1.GetWalletPortfolioSchema,
|
|
126
|
+
}),
|
|
127
|
+
__metadata("design:type", Function),
|
|
128
|
+
__metadata("design:paramtypes", [void 0]),
|
|
129
|
+
__metadata("design:returntype", Promise)
|
|
130
|
+
], ZerionActionProvider.prototype, "getPortfolioOverview", null);
|
|
131
|
+
__decorate([
|
|
132
|
+
(0, actionDecorator_1.CreateAction)({
|
|
133
|
+
name: "get_fungible_positions",
|
|
134
|
+
description: `
|
|
135
|
+
Retrieves and summarizes a wallet's fungible token holdings.
|
|
136
|
+
For each token, it includes metadata such as symbol, name, holding value, associated protocol (if applicable), and the type of position (e.g., deposit, wallet, reward).
|
|
137
|
+
The summary also reports the total USD value of all qualifying token positions.
|
|
138
|
+
Input:
|
|
139
|
+
- walletAddress: The wallet address to fetch fungible positions for.
|
|
140
|
+
Output a readable text summary including:
|
|
141
|
+
- All token positions
|
|
142
|
+
- For each: token name, symbol, USD value, chain, position type
|
|
143
|
+
- If applicable: protocol used and type of action (e.g. staked, deposited via protocol)
|
|
144
|
+
- A final total value in USD across all included positions
|
|
145
|
+
`,
|
|
146
|
+
schema: schemas_1.GetWalletPortfolioSchema,
|
|
147
|
+
}),
|
|
148
|
+
__metadata("design:type", Function),
|
|
149
|
+
__metadata("design:paramtypes", [void 0]),
|
|
150
|
+
__metadata("design:returntype", Promise)
|
|
151
|
+
], ZerionActionProvider.prototype, "getFungiblePositions", null);
|
|
152
|
+
/**
|
|
153
|
+
* Factory function to create a new ZerionActionProvider instance.
|
|
154
|
+
*
|
|
155
|
+
* @param config - The configuration options for the ZerionActionProvider.
|
|
156
|
+
* @returns A new ZerionActionProvider instance
|
|
157
|
+
*/
|
|
158
|
+
const zerionActionProvider = (config) => new ZerionActionProvider(config);
|
|
159
|
+
exports.zerionActionProvider = zerionActionProvider;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const zerionActionProvider_1 = require("./zerionActionProvider");
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
// Mocks for fetch and utils
|
|
6
|
+
global.fetch = jest.fn();
|
|
7
|
+
jest.mock("./utils", () => ({
|
|
8
|
+
formatPortfolioData: jest.fn(() => "formatted portfolio"),
|
|
9
|
+
formatPositionsData: jest.fn(() => "formatted positions"),
|
|
10
|
+
}));
|
|
11
|
+
describe("ZerionActionProvider", () => {
|
|
12
|
+
const mockApiKey = "test-api-key";
|
|
13
|
+
const originalEnv = process.env.ZERION_API_KEY;
|
|
14
|
+
const mockFungiblePositionResponse = {
|
|
15
|
+
links: {
|
|
16
|
+
self: "https://api.zerion.io/v1/wallets/0x42b9df65b219b3dd36ff330a4dd8f327a6ada990/positions/",
|
|
17
|
+
},
|
|
18
|
+
data: [
|
|
19
|
+
{
|
|
20
|
+
type: "positions",
|
|
21
|
+
id: "0x111c47865ade3b172a928df8f990bc7f2a3b9aaa-polygon-asset-none-",
|
|
22
|
+
attributes: {
|
|
23
|
+
parent: "0x111c47865ade3b172a928df8f990bc7f2a3b9aaa-polygon-asset-none-",
|
|
24
|
+
protocol: null,
|
|
25
|
+
pool_address: "0x109830a1aaad605bbf02a9dfa7b0b92ec2fb7daa",
|
|
26
|
+
name: "Asset",
|
|
27
|
+
group_id: "0a771a0064dad468045899032c7fb01a971f973f7dff0a5cdc3ce199f45e94d7",
|
|
28
|
+
position_type: "deposit",
|
|
29
|
+
quantity: {
|
|
30
|
+
int: "12345678",
|
|
31
|
+
decimals: 5,
|
|
32
|
+
float: 123.45678,
|
|
33
|
+
numeric: "123.45678",
|
|
34
|
+
},
|
|
35
|
+
value: 5.384656557642683,
|
|
36
|
+
price: 0.043615722,
|
|
37
|
+
changes: {
|
|
38
|
+
absolute_1d: 0.272309794,
|
|
39
|
+
percent_1d: 5.326512552079021,
|
|
40
|
+
},
|
|
41
|
+
fungible_info: {
|
|
42
|
+
name: "Bankless BED Index",
|
|
43
|
+
symbol: "BED",
|
|
44
|
+
description: "The BED index is meant to track crypto’s top 3 investab...",
|
|
45
|
+
icon: {
|
|
46
|
+
url: "https://token-icons.s3.amazonaws.com/0x0391d2021f89dc339f60fff84546ea23e337750f.png",
|
|
47
|
+
},
|
|
48
|
+
flags: {
|
|
49
|
+
verified: true,
|
|
50
|
+
},
|
|
51
|
+
implementations: [
|
|
52
|
+
{
|
|
53
|
+
chain_id: "ethereum",
|
|
54
|
+
address: "0x2af1df3ab0ab157e1e2ad8f88a7d04fbea0c7dc6",
|
|
55
|
+
decimals: 18,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
flags: {
|
|
60
|
+
displayable: true,
|
|
61
|
+
is_trash: true,
|
|
62
|
+
},
|
|
63
|
+
updated_at: "2023-11-10T23:00:00Z",
|
|
64
|
+
updated_at_block: 0,
|
|
65
|
+
application_metadata: {
|
|
66
|
+
name: "AAVE",
|
|
67
|
+
icon: {
|
|
68
|
+
url: "https://token-icons.s3.amazonaws.com/0x0391d2021f89dc339f60fff84546ea23e337750f.png",
|
|
69
|
+
},
|
|
70
|
+
url: "https://app.aave.com/",
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
relationships: {
|
|
74
|
+
chain: {
|
|
75
|
+
links: {
|
|
76
|
+
related: "https://api.zerion.io/v1/chains/polygon",
|
|
77
|
+
},
|
|
78
|
+
data: {
|
|
79
|
+
type: "chains",
|
|
80
|
+
id: "polygon",
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
fungible: {
|
|
84
|
+
links: {
|
|
85
|
+
related: "https://api.zerion.io/v1/fungibles/0x111c47865ade3b172a928df8f990bc7f2a3b9aaa",
|
|
86
|
+
},
|
|
87
|
+
data: {
|
|
88
|
+
type: "fungibles",
|
|
89
|
+
id: "0x111c47865ade3b172a928df8f990bc7f2a3b9aaa",
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
dapp: {
|
|
93
|
+
data: {
|
|
94
|
+
type: "dapps",
|
|
95
|
+
id: "aave-v3",
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
};
|
|
102
|
+
const mockPortfolioResponse = {
|
|
103
|
+
links: {
|
|
104
|
+
self: "https://api.zerion.io/v1/wallets/0x42b9df65b219b3dd36ff330a4dd8f327a6ada990/portfolio",
|
|
105
|
+
},
|
|
106
|
+
data: {
|
|
107
|
+
type: "portfolio",
|
|
108
|
+
id: "0x42b9df65b219b3dd36ff330a4dd8f327a6ada990",
|
|
109
|
+
attributes: {
|
|
110
|
+
positions_distribution_by_type: {
|
|
111
|
+
wallet: 1864.774102420957,
|
|
112
|
+
deposited: 78.04192492782934,
|
|
113
|
+
borrowed: 0.9751475798305564,
|
|
114
|
+
locked: 5.780032725068765,
|
|
115
|
+
staked: 66.13183205505294,
|
|
116
|
+
},
|
|
117
|
+
positions_distribution_by_chain: {
|
|
118
|
+
arbitrum: 458.3555051522226,
|
|
119
|
+
aurora: 72.01031337463428,
|
|
120
|
+
avalanche: 17.128850607339444,
|
|
121
|
+
base: 55.01550749900544,
|
|
122
|
+
"binance-smart-chain": 5.561075880033699,
|
|
123
|
+
celo: 31.293849330045006,
|
|
124
|
+
ethereum: 1214.009900354964,
|
|
125
|
+
fantom: 84.58514074264951,
|
|
126
|
+
linea: 8.258227109505139,
|
|
127
|
+
optimism: 573.032664994399,
|
|
128
|
+
polygon: 64.31407562634853,
|
|
129
|
+
xdai: 113.1679493137936,
|
|
130
|
+
"zksync-era": 9.451002156306377,
|
|
131
|
+
},
|
|
132
|
+
total: {
|
|
133
|
+
positions: 2017.4858230069574,
|
|
134
|
+
},
|
|
135
|
+
changes: {
|
|
136
|
+
absolute_1d: 102.0271468171374,
|
|
137
|
+
percent_1d: 5.326512552079021,
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
beforeEach(() => {
|
|
143
|
+
jest.clearAllMocks();
|
|
144
|
+
process.env.ZERION_API_KEY = mockApiKey;
|
|
145
|
+
});
|
|
146
|
+
afterAll(() => {
|
|
147
|
+
process.env.ZERION_API_KEY = originalEnv;
|
|
148
|
+
});
|
|
149
|
+
it("should throw if no API key is provided", () => {
|
|
150
|
+
delete process.env.ZERION_API_KEY;
|
|
151
|
+
expect(() => new zerionActionProvider_1.ZerionActionProvider()).toThrow("ZERION_API_KEY is not configured.");
|
|
152
|
+
});
|
|
153
|
+
it("should use provided API key from config", () => {
|
|
154
|
+
const provider = new zerionActionProvider_1.ZerionActionProvider({ apiKey: "foo" });
|
|
155
|
+
expect(provider).toBeDefined();
|
|
156
|
+
});
|
|
157
|
+
// supportsNetwork tests
|
|
158
|
+
const provider = new zerionActionProvider_1.ZerionActionProvider({ apiKey: mockApiKey });
|
|
159
|
+
it("should support the protocol family", () => {
|
|
160
|
+
expect(provider.supportsNetwork({ protocolFamily: "evm" })).toBe(true);
|
|
161
|
+
});
|
|
162
|
+
it("should not support other protocol families", () => {
|
|
163
|
+
expect(provider.supportsNetwork({ protocolFamily: "other-protocol-family" })).toBe(false);
|
|
164
|
+
});
|
|
165
|
+
it("should handle invalid network objects", () => {
|
|
166
|
+
expect(provider.supportsNetwork({ protocolFamily: "invalid-protocol" })).toBe(false);
|
|
167
|
+
expect(provider.supportsNetwork({})).toBe(false);
|
|
168
|
+
});
|
|
169
|
+
describe("getPortfolioOverview", () => {
|
|
170
|
+
const validAddress = "0x42b9df65b219b3dd36ff330a4dd8f327a6ada990";
|
|
171
|
+
const invalidAddress = "invalid-address";
|
|
172
|
+
const provider = new zerionActionProvider_1.ZerionActionProvider({ apiKey: mockApiKey });
|
|
173
|
+
it("returns error for invalid address", async () => {
|
|
174
|
+
const result = await provider.getPortfolioOverview({ walletAddress: invalidAddress });
|
|
175
|
+
expect(result).toMatch(/Invalid wallet address/);
|
|
176
|
+
});
|
|
177
|
+
it("returns formatted data for valid address", async () => {
|
|
178
|
+
global.fetch.mockResolvedValueOnce({
|
|
179
|
+
json: jest.fn().mockResolvedValue(mockPortfolioResponse),
|
|
180
|
+
});
|
|
181
|
+
const result = await provider.getPortfolioOverview({ walletAddress: validAddress });
|
|
182
|
+
expect(utils_1.formatPortfolioData).toHaveBeenCalledWith(mockPortfolioResponse.data);
|
|
183
|
+
expect(result).toBe("formatted portfolio");
|
|
184
|
+
});
|
|
185
|
+
it("returns error on fetch failure", async () => {
|
|
186
|
+
global.fetch.mockRejectedValueOnce(new Error("fail"));
|
|
187
|
+
const result = await provider.getPortfolioOverview({ walletAddress: validAddress });
|
|
188
|
+
expect(result).toMatch(/Error fetching portfolio overview/);
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
describe("getFungiblePositions", () => {
|
|
192
|
+
const validAddress = "0x42b9df65b219b3dd36ff330a4dd8f327a6ada990";
|
|
193
|
+
const invalidAddress = "invalid-address";
|
|
194
|
+
const provider = new zerionActionProvider_1.ZerionActionProvider({ apiKey: mockApiKey });
|
|
195
|
+
it("returns error for invalid address", async () => {
|
|
196
|
+
const result = await provider.getFungiblePositions({ walletAddress: invalidAddress });
|
|
197
|
+
expect(result).toMatch(/Invalid wallet address/);
|
|
198
|
+
});
|
|
199
|
+
it("returns formatted data for valid address", async () => {
|
|
200
|
+
global.fetch.mockResolvedValueOnce({
|
|
201
|
+
json: jest.fn().mockResolvedValue(mockFungiblePositionResponse),
|
|
202
|
+
});
|
|
203
|
+
const result = await provider.getFungiblePositions({ walletAddress: validAddress });
|
|
204
|
+
expect(utils_1.formatPositionsData).toHaveBeenCalledWith(mockFungiblePositionResponse.data);
|
|
205
|
+
expect(result).toBe("formatted positions");
|
|
206
|
+
});
|
|
207
|
+
it("returns error on fetch failure", async () => {
|
|
208
|
+
global.fetch.mockRejectedValueOnce(new Error("fail"));
|
|
209
|
+
const result = await provider.getFungiblePositions({ walletAddress: validAddress });
|
|
210
|
+
expect(result).toMatch(/Error fetching fungible positions/);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
});
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@coinbase/agentkit",
|
|
3
3
|
"description": "Coinbase AgentKit core primitives",
|
|
4
4
|
"repository": "https://github.com/coinbase/agentkit",
|
|
5
|
-
"version": "0.0.0-nightly-
|
|
5
|
+
"version": "0.0.0-nightly-20250808210408",
|
|
6
6
|
"author": "Coinbase Inc.",
|
|
7
7
|
"license": "Apache-2.0",
|
|
8
8
|
"main": "dist/index.js",
|