@coinbase/agentkit 0.0.0-nightly-20250808210408 → 0.0.0-nightly-20250815210416
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 +26 -0
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.d.ts +43 -0
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.js +151 -0
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.test.d.ts +1 -0
- package/dist/action-providers/cdp/cdpEvmWalletActionProvider.test.js +242 -0
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.d.ts +42 -0
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.js +132 -0
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.test.d.ts +1 -0
- package/dist/action-providers/cdp/cdpSmartWalletActionProvider.test.js +199 -0
- package/dist/action-providers/cdp/index.d.ts +3 -0
- package/dist/action-providers/cdp/index.js +3 -0
- package/dist/action-providers/cdp/schemas.d.ts +29 -0
- package/dist/action-providers/cdp/schemas.js +32 -1
- package/dist/action-providers/cdp/spendPermissionUtils.d.ts +24 -0
- package/dist/action-providers/cdp/spendPermissionUtils.js +66 -0
- package/dist/action-providers/flaunch/flaunchActionProvider.js +3 -11
- package/dist/action-providers/flaunch/flaunchActionProvider.test.js +5 -0
- package/dist/action-providers/truemarkets/truemarketsActionProvider.d.ts +4 -16
- package/dist/action-providers/truemarkets/truemarketsActionProvider.js +10 -31
- package/dist/action-providers/truemarkets/truemarketsActionProvider.test.js +11 -33
- package/dist/wallet-providers/cdpEvmWalletProvider.d.ts +7 -1
- package/dist/wallet-providers/cdpEvmWalletProvider.js +10 -1
- package/dist/wallet-providers/cdpShared.d.ts +5 -0
- package/dist/wallet-providers/cdpSmartWalletProvider.d.ts +9 -2
- package/dist/wallet-providers/cdpSmartWalletProvider.js +20 -12
- package/dist/wallet-providers/evmWalletProvider.d.ts +5 -1
- package/dist/wallet-providers/legacyCdpSmartWalletProvider.d.ts +8 -1
- package/dist/wallet-providers/legacyCdpSmartWalletProvider.js +11 -1
- package/dist/wallet-providers/legacyCdpWalletProvider.d.ts +11 -1
- package/dist/wallet-providers/legacyCdpWalletProvider.js +10 -1
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.d.ts +9 -1
- package/dist/wallet-providers/privyEvmDelegatedEmbeddedWalletProvider.js +10 -1
- package/dist/wallet-providers/privyEvmWalletProvider.d.ts +2 -0
- package/dist/wallet-providers/privyEvmWalletProvider.js +2 -1
- package/dist/wallet-providers/viemWalletProvider.d.ts +7 -1
- package/dist/wallet-providers/viemWalletProvider.js +8 -0
- package/dist/wallet-providers/zeroDevWalletProvider.d.ts +9 -1
- package/dist/wallet-providers/zeroDevWalletProvider.js +10 -1
- package/package.json +2 -2
|
@@ -0,0 +1,199 @@
|
|
|
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 () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const cdpSmartWalletActionProvider_1 = require("./cdpSmartWalletActionProvider");
|
|
37
|
+
const schemas_1 = require("./schemas");
|
|
38
|
+
const spendPermissionUtils = __importStar(require("./spendPermissionUtils"));
|
|
39
|
+
// Mock the CDP SDK and utility functions
|
|
40
|
+
jest.mock("@coinbase/cdp-sdk");
|
|
41
|
+
jest.mock("./spendPermissionUtils");
|
|
42
|
+
describe("CDP Smart Wallet Action Provider", () => {
|
|
43
|
+
let actionProvider;
|
|
44
|
+
let mockWalletProvider;
|
|
45
|
+
let mockCdpClient;
|
|
46
|
+
let mockSmartAccount;
|
|
47
|
+
beforeEach(() => {
|
|
48
|
+
jest.clearAllMocks();
|
|
49
|
+
mockSmartAccount = {
|
|
50
|
+
useSpendPermission: jest.fn(),
|
|
51
|
+
address: "0x1234567890123456789012345678901234567890",
|
|
52
|
+
};
|
|
53
|
+
mockCdpClient = {
|
|
54
|
+
evm: {
|
|
55
|
+
listSpendPermissions: jest.fn(),
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
mockWalletProvider = {
|
|
59
|
+
getNetwork: jest.fn(),
|
|
60
|
+
getAddress: jest.fn(),
|
|
61
|
+
getClient: jest.fn(),
|
|
62
|
+
smartAccount: mockSmartAccount,
|
|
63
|
+
};
|
|
64
|
+
actionProvider = new cdpSmartWalletActionProvider_1.CdpSmartWalletActionProvider();
|
|
65
|
+
});
|
|
66
|
+
describe("listSpendPermissions", () => {
|
|
67
|
+
const mockArgs = {
|
|
68
|
+
smartAccountAddress: "0xabcd1234567890123456789012345678901234567890",
|
|
69
|
+
};
|
|
70
|
+
beforeEach(() => {
|
|
71
|
+
mockWalletProvider.getNetwork.mockReturnValue({
|
|
72
|
+
protocolFamily: "evm",
|
|
73
|
+
networkId: "base-sepolia",
|
|
74
|
+
});
|
|
75
|
+
mockWalletProvider.getAddress.mockReturnValue("0x1234567890123456789012345678901234567890");
|
|
76
|
+
mockWalletProvider.getClient.mockReturnValue(mockCdpClient);
|
|
77
|
+
});
|
|
78
|
+
it("should successfully list spend permissions for EVM networks", async () => {
|
|
79
|
+
const expectedResult = "Found 1 spend permission(s):\n1. Token: ETH, Allowance: 1000, Period: 3600 seconds, Start: 123456, End: 234567";
|
|
80
|
+
spendPermissionUtils.listSpendPermissionsForSpender.mockResolvedValue(expectedResult);
|
|
81
|
+
const result = await actionProvider.listSpendPermissions(mockWalletProvider, mockArgs);
|
|
82
|
+
expect(spendPermissionUtils.listSpendPermissionsForSpender).toHaveBeenCalledWith(mockCdpClient, mockArgs.smartAccountAddress, "0x1234567890123456789012345678901234567890");
|
|
83
|
+
expect(result).toBe(expectedResult);
|
|
84
|
+
});
|
|
85
|
+
it("should return error message for non-EVM networks", async () => {
|
|
86
|
+
mockWalletProvider.getNetwork.mockReturnValue({
|
|
87
|
+
protocolFamily: "svm",
|
|
88
|
+
networkId: "solana-devnet",
|
|
89
|
+
});
|
|
90
|
+
const result = await actionProvider.listSpendPermissions(mockWalletProvider, mockArgs);
|
|
91
|
+
expect(result).toBe("Spend permissions are currently only supported on EVM networks.");
|
|
92
|
+
expect(spendPermissionUtils.listSpendPermissionsForSpender).not.toHaveBeenCalled();
|
|
93
|
+
});
|
|
94
|
+
it("should validate input schema", () => {
|
|
95
|
+
const validInput = { smartAccountAddress: "0xabcd1234567890123456789012345678901234567890" };
|
|
96
|
+
const invalidInput = { invalidField: "invalid" };
|
|
97
|
+
expect(() => schemas_1.ListSpendPermissionsSchema.parse(validInput)).not.toThrow();
|
|
98
|
+
expect(() => schemas_1.ListSpendPermissionsSchema.parse(invalidInput)).toThrow();
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe("useSpendPermission", () => {
|
|
102
|
+
const mockArgs = {
|
|
103
|
+
smartAccountAddress: "0xabcd1234567890123456789012345678901234567890",
|
|
104
|
+
value: "1000",
|
|
105
|
+
};
|
|
106
|
+
beforeEach(() => {
|
|
107
|
+
mockWalletProvider.getNetwork.mockReturnValue({
|
|
108
|
+
protocolFamily: "evm",
|
|
109
|
+
networkId: "base-sepolia",
|
|
110
|
+
});
|
|
111
|
+
mockWalletProvider.getAddress.mockReturnValue("0x1234567890123456789012345678901234567890");
|
|
112
|
+
mockWalletProvider.getClient.mockReturnValue(mockCdpClient);
|
|
113
|
+
});
|
|
114
|
+
it("should successfully use spend permission for EVM networks", async () => {
|
|
115
|
+
const mockPermission = {
|
|
116
|
+
spender: "0x1234567890123456789012345678901234567890",
|
|
117
|
+
token: "ETH",
|
|
118
|
+
allowance: "1000",
|
|
119
|
+
period: 3600,
|
|
120
|
+
start: 123456,
|
|
121
|
+
end: 234567,
|
|
122
|
+
};
|
|
123
|
+
const mockSpendResult = {
|
|
124
|
+
status: "completed",
|
|
125
|
+
transactionHash: "0xabcd1234",
|
|
126
|
+
};
|
|
127
|
+
spendPermissionUtils.findLatestSpendPermission.mockResolvedValue(mockPermission);
|
|
128
|
+
mockSmartAccount.useSpendPermission.mockResolvedValue(mockSpendResult);
|
|
129
|
+
const result = await actionProvider.useSpendPermission(mockWalletProvider, mockArgs);
|
|
130
|
+
expect(spendPermissionUtils.findLatestSpendPermission).toHaveBeenCalledWith(mockCdpClient, mockArgs.smartAccountAddress, "0x1234567890123456789012345678901234567890");
|
|
131
|
+
expect(mockSmartAccount.useSpendPermission).toHaveBeenCalledWith({
|
|
132
|
+
spendPermission: mockPermission,
|
|
133
|
+
value: BigInt(1000),
|
|
134
|
+
network: "base-sepolia",
|
|
135
|
+
});
|
|
136
|
+
expect(result).toBe("Successfully spent 1000 tokens using spend permission. Status: completed");
|
|
137
|
+
});
|
|
138
|
+
it("should handle base-mainnet network conversion", async () => {
|
|
139
|
+
mockWalletProvider.getNetwork.mockReturnValue({
|
|
140
|
+
protocolFamily: "evm",
|
|
141
|
+
networkId: "base-mainnet",
|
|
142
|
+
});
|
|
143
|
+
const mockPermission = { spender: "0x1234", token: "ETH" };
|
|
144
|
+
const mockSpendResult = { status: "completed" };
|
|
145
|
+
spendPermissionUtils.findLatestSpendPermission.mockResolvedValue(mockPermission);
|
|
146
|
+
mockSmartAccount.useSpendPermission.mockResolvedValue(mockSpendResult);
|
|
147
|
+
await actionProvider.useSpendPermission(mockWalletProvider, mockArgs);
|
|
148
|
+
expect(mockSmartAccount.useSpendPermission).toHaveBeenCalledWith({
|
|
149
|
+
spendPermission: mockPermission,
|
|
150
|
+
value: BigInt(1000),
|
|
151
|
+
network: "base",
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
it("should throw error for unsupported networks", async () => {
|
|
155
|
+
mockWalletProvider.getNetwork.mockReturnValue({
|
|
156
|
+
protocolFamily: "evm",
|
|
157
|
+
networkId: "ethereum-mainnet",
|
|
158
|
+
});
|
|
159
|
+
await expect(actionProvider.useSpendPermission(mockWalletProvider, mockArgs)).rejects.toThrow("Unsupported network for smart wallets: ethereum-mainnet");
|
|
160
|
+
});
|
|
161
|
+
it("should return error message for non-EVM networks", async () => {
|
|
162
|
+
mockWalletProvider.getNetwork.mockReturnValue({
|
|
163
|
+
protocolFamily: "svm",
|
|
164
|
+
networkId: "solana-devnet",
|
|
165
|
+
});
|
|
166
|
+
await expect(actionProvider.useSpendPermission(mockWalletProvider, mockArgs)).rejects.toThrow("Unsupported network for smart wallets: solana-devnet");
|
|
167
|
+
});
|
|
168
|
+
it("should handle spend permission not found error", async () => {
|
|
169
|
+
spendPermissionUtils.findLatestSpendPermission.mockRejectedValue(new Error("No spend permissions found"));
|
|
170
|
+
await expect(actionProvider.useSpendPermission(mockWalletProvider, mockArgs)).rejects.toThrow("Failed to use spend permission: Error: No spend permissions found");
|
|
171
|
+
});
|
|
172
|
+
it("should handle smart account use permission failure", async () => {
|
|
173
|
+
const mockPermission = { spender: "0x1234", token: "ETH" };
|
|
174
|
+
spendPermissionUtils.findLatestSpendPermission.mockResolvedValue(mockPermission);
|
|
175
|
+
mockSmartAccount.useSpendPermission.mockRejectedValue(new Error("Transaction failed"));
|
|
176
|
+
await expect(actionProvider.useSpendPermission(mockWalletProvider, mockArgs)).rejects.toThrow("Failed to use spend permission: Error: Transaction failed");
|
|
177
|
+
});
|
|
178
|
+
it("should validate input schema", () => {
|
|
179
|
+
const validInput = {
|
|
180
|
+
smartAccountAddress: "0xabcd1234567890123456789012345678901234567890",
|
|
181
|
+
value: "1000",
|
|
182
|
+
};
|
|
183
|
+
const invalidInput = {
|
|
184
|
+
wrongField: "0xabcd1234567890123456789012345678901234567890",
|
|
185
|
+
// Missing required fields
|
|
186
|
+
};
|
|
187
|
+
expect(() => schemas_1.UseSpendPermissionSchema.parse(validInput)).not.toThrow();
|
|
188
|
+
expect(() => schemas_1.UseSpendPermissionSchema.parse(invalidInput)).toThrow();
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
describe("supportsNetwork", () => {
|
|
192
|
+
it("should return true for any network", () => {
|
|
193
|
+
const evmNetwork = { protocolFamily: "evm", networkId: "base-sepolia" };
|
|
194
|
+
const svmNetwork = { protocolFamily: "svm", networkId: "solana-devnet" };
|
|
195
|
+
expect(actionProvider.supportsNetwork(evmNetwork)).toBe(true);
|
|
196
|
+
expect(actionProvider.supportsNetwork(svmNetwork)).toBe(true);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
});
|
|
@@ -16,3 +16,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./schemas"), exports);
|
|
18
18
|
__exportStar(require("./cdpApiActionProvider"), exports);
|
|
19
|
+
__exportStar(require("./cdpSmartWalletActionProvider"), exports);
|
|
20
|
+
__exportStar(require("./cdpEvmWalletActionProvider"), exports);
|
|
21
|
+
__exportStar(require("./spendPermissionUtils"), exports);
|
|
@@ -28,3 +28,32 @@ export declare const SwapSchema: z.ZodObject<{
|
|
|
28
28
|
toAssetId: string;
|
|
29
29
|
network?: string | undefined;
|
|
30
30
|
}>;
|
|
31
|
+
/**
|
|
32
|
+
* Input schema for listing spend permissions action.
|
|
33
|
+
*/
|
|
34
|
+
export declare const ListSpendPermissionsSchema: z.ZodObject<{
|
|
35
|
+
smartAccountAddress: z.ZodString;
|
|
36
|
+
network: z.ZodOptional<z.ZodString>;
|
|
37
|
+
}, "strip", z.ZodTypeAny, {
|
|
38
|
+
smartAccountAddress: string;
|
|
39
|
+
network?: string | undefined;
|
|
40
|
+
}, {
|
|
41
|
+
smartAccountAddress: string;
|
|
42
|
+
network?: string | undefined;
|
|
43
|
+
}>;
|
|
44
|
+
/**
|
|
45
|
+
* Input schema for using a spend permission action.
|
|
46
|
+
*/
|
|
47
|
+
export declare const UseSpendPermissionSchema: z.ZodObject<{
|
|
48
|
+
smartAccountAddress: z.ZodString;
|
|
49
|
+
value: z.ZodString;
|
|
50
|
+
network: z.ZodOptional<z.ZodString>;
|
|
51
|
+
}, "strip", z.ZodTypeAny, {
|
|
52
|
+
value: string;
|
|
53
|
+
smartAccountAddress: string;
|
|
54
|
+
network?: string | undefined;
|
|
55
|
+
}, {
|
|
56
|
+
value: string;
|
|
57
|
+
smartAccountAddress: string;
|
|
58
|
+
network?: string | undefined;
|
|
59
|
+
}>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SwapSchema = exports.RequestFaucetFundsV2Schema = void 0;
|
|
3
|
+
exports.UseSpendPermissionSchema = exports.ListSpendPermissionsSchema = exports.SwapSchema = exports.RequestFaucetFundsV2Schema = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
/**
|
|
6
6
|
* Input schema for request faucet funds action.
|
|
@@ -26,3 +26,34 @@ exports.SwapSchema = zod_1.z
|
|
|
26
26
|
})
|
|
27
27
|
.strip()
|
|
28
28
|
.describe("Instructions for swapping tokens");
|
|
29
|
+
/**
|
|
30
|
+
* Input schema for listing spend permissions action.
|
|
31
|
+
*/
|
|
32
|
+
exports.ListSpendPermissionsSchema = zod_1.z
|
|
33
|
+
.object({
|
|
34
|
+
smartAccountAddress: zod_1.z
|
|
35
|
+
.string()
|
|
36
|
+
.describe("The smart account address that has granted spend permissions"),
|
|
37
|
+
network: zod_1.z
|
|
38
|
+
.string()
|
|
39
|
+
.optional()
|
|
40
|
+
.describe("The network to list permissions on (defaults to wallet's network)"),
|
|
41
|
+
})
|
|
42
|
+
.strip()
|
|
43
|
+
.describe("Instructions for listing spend permissions for a smart account");
|
|
44
|
+
/**
|
|
45
|
+
* Input schema for using a spend permission action.
|
|
46
|
+
*/
|
|
47
|
+
exports.UseSpendPermissionSchema = zod_1.z
|
|
48
|
+
.object({
|
|
49
|
+
smartAccountAddress: zod_1.z
|
|
50
|
+
.string()
|
|
51
|
+
.describe("The smart account address that has granted the spend permission"),
|
|
52
|
+
value: zod_1.z.string().describe("The amount to spend (in the token's units)"),
|
|
53
|
+
network: zod_1.z
|
|
54
|
+
.string()
|
|
55
|
+
.optional()
|
|
56
|
+
.describe("The network to perform the spend on (defaults to wallet's network)"),
|
|
57
|
+
})
|
|
58
|
+
.strip()
|
|
59
|
+
.describe("Instructions for using a spend permission");
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { CdpClient, type SpendPermission } from "@coinbase/cdp-sdk";
|
|
2
|
+
import type { Address } from "viem";
|
|
3
|
+
/**
|
|
4
|
+
* Shared utility functions for spend permission operations.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Lists and formats spend permissions for a given smart account and spender.
|
|
8
|
+
*
|
|
9
|
+
* @param cdpClient - The CDP client to use for API calls
|
|
10
|
+
* @param smartAccountAddress - The smart account address to check permissions for
|
|
11
|
+
* @param spenderAddress - The spender address to filter permissions by
|
|
12
|
+
* @returns A formatted string containing the spend permissions or an error message
|
|
13
|
+
*/
|
|
14
|
+
export declare function listSpendPermissionsForSpender(cdpClient: CdpClient, smartAccountAddress: Address, spenderAddress: Address): Promise<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Finds and retrieves the latest valid spend permission for a given spender from a smart account.
|
|
17
|
+
*
|
|
18
|
+
* @param cdpClient - The CDP client to use for API calls
|
|
19
|
+
* @param smartAccountAddress - The smart account address to check permissions for
|
|
20
|
+
* @param spenderAddress - The spender address to find permissions for
|
|
21
|
+
* @returns The latest spend permission or throws an error if none found
|
|
22
|
+
* @throws Error if no permissions found or permission is invalid
|
|
23
|
+
*/
|
|
24
|
+
export declare function findLatestSpendPermission(cdpClient: CdpClient, smartAccountAddress: Address, spenderAddress: Address): Promise<SpendPermission>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listSpendPermissionsForSpender = listSpendPermissionsForSpender;
|
|
4
|
+
exports.findLatestSpendPermission = findLatestSpendPermission;
|
|
5
|
+
/**
|
|
6
|
+
* Shared utility functions for spend permission operations.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Lists and formats spend permissions for a given smart account and spender.
|
|
10
|
+
*
|
|
11
|
+
* @param cdpClient - The CDP client to use for API calls
|
|
12
|
+
* @param smartAccountAddress - The smart account address to check permissions for
|
|
13
|
+
* @param spenderAddress - The spender address to filter permissions by
|
|
14
|
+
* @returns A formatted string containing the spend permissions or an error message
|
|
15
|
+
*/
|
|
16
|
+
async function listSpendPermissionsForSpender(cdpClient, smartAccountAddress, spenderAddress) {
|
|
17
|
+
try {
|
|
18
|
+
// List all spend permissions for the smart account
|
|
19
|
+
const allPermissions = await cdpClient.evm.listSpendPermissions({
|
|
20
|
+
address: smartAccountAddress,
|
|
21
|
+
});
|
|
22
|
+
// Filter permissions where current wallet is the spender
|
|
23
|
+
const relevantPermissions = allPermissions.spendPermissions.filter(p => p.permission?.spender.toLowerCase() === spenderAddress.toLowerCase());
|
|
24
|
+
if (relevantPermissions.length === 0) {
|
|
25
|
+
return `No spend permissions found for spender ${spenderAddress} on smart account ${smartAccountAddress}`;
|
|
26
|
+
}
|
|
27
|
+
// Format the permissions for display
|
|
28
|
+
const formattedPermissions = relevantPermissions
|
|
29
|
+
.map((p, index) => {
|
|
30
|
+
const perm = p.permission;
|
|
31
|
+
if (!perm)
|
|
32
|
+
return `${index + 1}. Invalid permission`;
|
|
33
|
+
return `${index + 1}. Token: ${perm.token}, Allowance: ${perm.allowance}, Period: ${perm.period} seconds, Start: ${perm.start}, End: ${perm.end}`;
|
|
34
|
+
})
|
|
35
|
+
.join("\n");
|
|
36
|
+
return `Found ${relevantPermissions.length} spend permission(s):\n${formattedPermissions}`;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
return `Failed to list spend permissions: ${error}`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Finds and retrieves the latest valid spend permission for a given spender from a smart account.
|
|
44
|
+
*
|
|
45
|
+
* @param cdpClient - The CDP client to use for API calls
|
|
46
|
+
* @param smartAccountAddress - The smart account address to check permissions for
|
|
47
|
+
* @param spenderAddress - The spender address to find permissions for
|
|
48
|
+
* @returns The latest spend permission or throws an error if none found
|
|
49
|
+
* @throws Error if no permissions found or permission is invalid
|
|
50
|
+
*/
|
|
51
|
+
async function findLatestSpendPermission(cdpClient, smartAccountAddress, spenderAddress) {
|
|
52
|
+
const allPermissions = await cdpClient.evm.listSpendPermissions({
|
|
53
|
+
address: smartAccountAddress,
|
|
54
|
+
});
|
|
55
|
+
// Filter permissions where current wallet is the spender
|
|
56
|
+
const relevantPermissions = allPermissions.spendPermissions.filter(p => p.permission?.spender.toLowerCase() === spenderAddress.toLowerCase());
|
|
57
|
+
if (relevantPermissions.length === 0) {
|
|
58
|
+
throw new Error(`No spend permissions found for spender ${spenderAddress} on smart account ${smartAccountAddress}`);
|
|
59
|
+
}
|
|
60
|
+
// Use the latest permission (last in the array)
|
|
61
|
+
const latestPermissionWrapper = relevantPermissions.at(-1);
|
|
62
|
+
if (!latestPermissionWrapper?.permission) {
|
|
63
|
+
throw new Error("Invalid spend permission found");
|
|
64
|
+
}
|
|
65
|
+
return latestPermissionWrapper.permission;
|
|
66
|
+
}
|
|
@@ -209,11 +209,7 @@ class FlaunchActionProvider extends actionProvider_1.ActionProvider {
|
|
|
209
209
|
signature = await walletProvider.signTypedData(typedData);
|
|
210
210
|
permitSingle = message;
|
|
211
211
|
}
|
|
212
|
-
const
|
|
213
|
-
chain: network_1.NETWORK_ID_TO_VIEM_CHAIN[networkId],
|
|
214
|
-
transport: (0, viem_1.http)(),
|
|
215
|
-
});
|
|
216
|
-
const quoteResult = await viemPublicClient.simulateContract({
|
|
212
|
+
const quoteResult = await walletProvider.getPublicClient().simulateContract({
|
|
217
213
|
address: constants_1.QuoterAddress[chainId],
|
|
218
214
|
abi: constants_1.QUOTER_ABI,
|
|
219
215
|
functionName: "quoteExactInput",
|
|
@@ -308,17 +304,13 @@ class FlaunchActionProvider extends actionProvider_1.ActionProvider {
|
|
|
308
304
|
throw new Error("Chain ID is not set.");
|
|
309
305
|
}
|
|
310
306
|
try {
|
|
311
|
-
const viemPublicClient = (0, viem_1.createPublicClient)({
|
|
312
|
-
chain: network_1.NETWORK_ID_TO_VIEM_CHAIN[networkId],
|
|
313
|
-
transport: (0, viem_1.http)(),
|
|
314
|
-
});
|
|
315
307
|
let amountIn;
|
|
316
308
|
let amountOutMin;
|
|
317
309
|
let amountOut;
|
|
318
310
|
let amountInMax;
|
|
319
311
|
if (swapType === "EXACT_IN") {
|
|
320
312
|
amountIn = (0, viem_1.parseEther)(swapParams.amountIn);
|
|
321
|
-
const quoteResult = await
|
|
313
|
+
const quoteResult = await walletProvider.getPublicClient().simulateContract({
|
|
322
314
|
address: constants_1.QuoterAddress[chainId],
|
|
323
315
|
abi: constants_1.QUOTER_ABI,
|
|
324
316
|
functionName: "quoteExactInput",
|
|
@@ -351,7 +343,7 @@ class FlaunchActionProvider extends actionProvider_1.ActionProvider {
|
|
|
351
343
|
else {
|
|
352
344
|
// EXACT_OUT
|
|
353
345
|
amountOut = (0, viem_1.parseEther)(swapParams.amountOut);
|
|
354
|
-
const quoteResult = await
|
|
346
|
+
const quoteResult = await walletProvider.getPublicClient().simulateContract({
|
|
355
347
|
address: constants_1.QuoterAddress[chainId],
|
|
356
348
|
abi: constants_1.QUOTER_ABI,
|
|
357
349
|
functionName: "quoteExactOutput",
|
|
@@ -116,6 +116,11 @@ describe("FlaunchActionProvider", () => {
|
|
|
116
116
|
return undefined;
|
|
117
117
|
}),
|
|
118
118
|
signTypedData: jest.fn().mockResolvedValue("0xsignature"),
|
|
119
|
+
getPublicClient: jest.fn().mockReturnValue({
|
|
120
|
+
simulateContract: jest.fn().mockResolvedValue({
|
|
121
|
+
result: [BigInt(1000000000000000000)],
|
|
122
|
+
}),
|
|
123
|
+
}),
|
|
119
124
|
};
|
|
120
125
|
});
|
|
121
126
|
describe("network support", () => {
|
|
@@ -4,25 +4,13 @@ import { Network } from "../../network";
|
|
|
4
4
|
import { GetTruthMarketsSchema, GetTruthMarketDetailsSchema } from "./schemas";
|
|
5
5
|
import { EvmWalletProvider } from "../../wallet-providers";
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*/
|
|
9
|
-
export interface TrueMarketsActionProviderConfig {
|
|
10
|
-
/**
|
|
11
|
-
* RPC URL for creating the Viem public client
|
|
12
|
-
*/
|
|
13
|
-
RPC_URL?: string;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* TrueMarketsActionProvider provides actions to interact with TrueMarkets contracts.
|
|
7
|
+
* Action provider for TrueMarkets interactions.
|
|
17
8
|
*/
|
|
18
9
|
export declare class TrueMarketsActionProvider extends ActionProvider<EvmWalletProvider> {
|
|
19
|
-
#private;
|
|
20
10
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* @param config - The configuration options for the TrueMarketsActionProvider.
|
|
11
|
+
* Creates a new TrueMarkets action provider.
|
|
24
12
|
*/
|
|
25
|
-
constructor(
|
|
13
|
+
constructor();
|
|
26
14
|
/**
|
|
27
15
|
* Gets active markets from the TruthMarketManager contract.
|
|
28
16
|
*
|
|
@@ -48,4 +36,4 @@ export declare class TrueMarketsActionProvider extends ActionProvider<EvmWalletP
|
|
|
48
36
|
*/
|
|
49
37
|
supportsNetwork: (network: Network) => boolean;
|
|
50
38
|
}
|
|
51
|
-
export declare const truemarketsActionProvider: (
|
|
39
|
+
export declare const truemarketsActionProvider: () => TrueMarketsActionProvider;
|
|
@@ -8,18 +8,6 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
12
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
13
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
14
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
15
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
16
|
-
};
|
|
17
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
18
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
19
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
20
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
21
|
-
};
|
|
22
|
-
var _TrueMarketsActionProvider_publicClient;
|
|
23
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
12
|
exports.truemarketsActionProvider = exports.TrueMarketsActionProvider = void 0;
|
|
25
13
|
const zod_1 = require("zod");
|
|
@@ -30,19 +18,15 @@ const constants_1 = require("./constants");
|
|
|
30
18
|
const constants_2 = require("../erc20/constants");
|
|
31
19
|
const wallet_providers_1 = require("../../wallet-providers");
|
|
32
20
|
const viem_1 = require("viem");
|
|
33
|
-
const chains_1 = require("viem/chains");
|
|
34
21
|
/**
|
|
35
|
-
*
|
|
22
|
+
* Action provider for TrueMarkets interactions.
|
|
36
23
|
*/
|
|
37
24
|
class TrueMarketsActionProvider extends actionProvider_1.ActionProvider {
|
|
38
25
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* @param config - The configuration options for the TrueMarketsActionProvider.
|
|
26
|
+
* Creates a new TrueMarkets action provider.
|
|
42
27
|
*/
|
|
43
|
-
constructor(
|
|
28
|
+
constructor() {
|
|
44
29
|
super("truemarkets", []);
|
|
45
|
-
_TrueMarketsActionProvider_publicClient.set(this, void 0);
|
|
46
30
|
/**
|
|
47
31
|
* Checks if the TrueMarkets action provider supports the given network.
|
|
48
32
|
* Currently only supports Base mainnet.
|
|
@@ -51,10 +35,6 @@ class TrueMarketsActionProvider extends actionProvider_1.ActionProvider {
|
|
|
51
35
|
* @returns True if the TrueMarkets action provider supports the network, false otherwise.
|
|
52
36
|
*/
|
|
53
37
|
this.supportsNetwork = (network) => network.networkId === "base-mainnet";
|
|
54
|
-
__classPrivateFieldSet(this, _TrueMarketsActionProvider_publicClient, (0, viem_1.createPublicClient)({
|
|
55
|
-
chain: chains_1.base,
|
|
56
|
-
transport: config?.RPC_URL ? (0, viem_1.http)(config.RPC_URL) : (0, viem_1.http)(),
|
|
57
|
-
}), "f");
|
|
58
38
|
}
|
|
59
39
|
/**
|
|
60
40
|
* Gets active markets from the TruthMarketManager contract.
|
|
@@ -105,7 +85,7 @@ class TrueMarketsActionProvider extends actionProvider_1.ActionProvider {
|
|
|
105
85
|
functionName: "getActiveMarketAddress",
|
|
106
86
|
args: [BigInt(index)],
|
|
107
87
|
}));
|
|
108
|
-
const marketAddresses = await
|
|
88
|
+
const marketAddresses = await walletProvider.getPublicClient().multicall({
|
|
109
89
|
contracts: addressCalls,
|
|
110
90
|
});
|
|
111
91
|
// Filter out errors and extract results
|
|
@@ -124,7 +104,7 @@ class TrueMarketsActionProvider extends actionProvider_1.ActionProvider {
|
|
|
124
104
|
abi: constants_1.TruthMarketABI,
|
|
125
105
|
functionName: "marketQuestion",
|
|
126
106
|
}));
|
|
127
|
-
const marketQuestionsResult = await
|
|
107
|
+
const marketQuestionsResult = await walletProvider.getPublicClient().multicall({
|
|
128
108
|
contracts: questionCalls,
|
|
129
109
|
});
|
|
130
110
|
// Create market objects mapping indices to addresses and questions
|
|
@@ -175,7 +155,7 @@ class TrueMarketsActionProvider extends actionProvider_1.ActionProvider {
|
|
|
175
155
|
});
|
|
176
156
|
}
|
|
177
157
|
try {
|
|
178
|
-
marketAddress = (await
|
|
158
|
+
marketAddress = (await walletProvider.getPublicClient().readContract({
|
|
179
159
|
address: constants_1.TruthMarketManager_ADDRESS,
|
|
180
160
|
abi: constants_1.TruthMarketManagerABI,
|
|
181
161
|
functionName: "getActiveMarketAddress",
|
|
@@ -227,7 +207,7 @@ class TrueMarketsActionProvider extends actionProvider_1.ActionProvider {
|
|
|
227
207
|
functionName: "winningPosition",
|
|
228
208
|
},
|
|
229
209
|
];
|
|
230
|
-
const basicInfoResults = await
|
|
210
|
+
const basicInfoResults = await walletProvider.getPublicClient().multicall({
|
|
231
211
|
contracts: basicInfoCalls,
|
|
232
212
|
});
|
|
233
213
|
// Extract results, handling potential errors
|
|
@@ -279,7 +259,7 @@ class TrueMarketsActionProvider extends actionProvider_1.ActionProvider {
|
|
|
279
259
|
functionName: "slot0",
|
|
280
260
|
},
|
|
281
261
|
];
|
|
282
|
-
const poolInfoResults = await
|
|
262
|
+
const poolInfoResults = await walletProvider.getPublicClient().multicall({
|
|
283
263
|
contracts: poolInfoCalls,
|
|
284
264
|
});
|
|
285
265
|
if (poolInfoResults.some(result => result.status === "failure")) {
|
|
@@ -331,7 +311,7 @@ class TrueMarketsActionProvider extends actionProvider_1.ActionProvider {
|
|
|
331
311
|
args: [noPool],
|
|
332
312
|
},
|
|
333
313
|
];
|
|
334
|
-
const balanceResults = await
|
|
314
|
+
const balanceResults = await walletProvider.getPublicClient().multicall({
|
|
335
315
|
contracts: balanceCalls,
|
|
336
316
|
});
|
|
337
317
|
if (balanceResults.some(result => result.status === "failure")) {
|
|
@@ -430,7 +410,6 @@ class TrueMarketsActionProvider extends actionProvider_1.ActionProvider {
|
|
|
430
410
|
}
|
|
431
411
|
}
|
|
432
412
|
exports.TrueMarketsActionProvider = TrueMarketsActionProvider;
|
|
433
|
-
_TrueMarketsActionProvider_publicClient = new WeakMap();
|
|
434
413
|
__decorate([
|
|
435
414
|
(0, actionDecorator_1.CreateAction)({
|
|
436
415
|
name: "get_prediction_markets",
|
|
@@ -465,5 +444,5 @@ __decorate([
|
|
|
465
444
|
__metadata("design:paramtypes", [wallet_providers_1.EvmWalletProvider, void 0]),
|
|
466
445
|
__metadata("design:returntype", Promise)
|
|
467
446
|
], TrueMarketsActionProvider.prototype, "getPredictionMarketDetails", null);
|
|
468
|
-
const truemarketsActionProvider = (
|
|
447
|
+
const truemarketsActionProvider = () => new TrueMarketsActionProvider();
|
|
469
448
|
exports.truemarketsActionProvider = truemarketsActionProvider;
|