n8n-nodes-coinbase-cdp-agentkit 0.1.0
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 +703 -0
- package/dist/credentials/CoinbaseCdpApi.credentials.d.ts +8 -0
- package/dist/credentials/CoinbaseCdpApi.credentials.d.ts.map +1 -0
- package/dist/credentials/CoinbaseCdpApi.credentials.js +37 -0
- package/dist/credentials/CoinbaseCdpApi.credentials.js.map +1 -0
- package/dist/icons/coinbase.svg +4 -0
- package/dist/nodes/CoinbaseAgentTool/CoinbaseAgentTool.node.d.ts +6 -0
- package/dist/nodes/CoinbaseAgentTool/CoinbaseAgentTool.node.d.ts.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/CoinbaseAgentTool.node.js +110 -0
- package/dist/nodes/CoinbaseAgentTool/CoinbaseAgentTool.node.js.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/CoinbaseAgentTool.node.json +17 -0
- package/dist/nodes/CoinbaseAgentTool/actions/erc20Balance.d.ts +3 -0
- package/dist/nodes/CoinbaseAgentTool/actions/erc20Balance.d.ts.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/actions/erc20Balance.js +46 -0
- package/dist/nodes/CoinbaseAgentTool/actions/erc20Balance.js.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/actions/erc20Transfer.d.ts +3 -0
- package/dist/nodes/CoinbaseAgentTool/actions/erc20Transfer.d.ts.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/actions/erc20Transfer.js +44 -0
- package/dist/nodes/CoinbaseAgentTool/actions/erc20Transfer.js.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/actions/getSwapPrice.d.ts +3 -0
- package/dist/nodes/CoinbaseAgentTool/actions/getSwapPrice.d.ts.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/actions/getSwapPrice.js +57 -0
- package/dist/nodes/CoinbaseAgentTool/actions/getSwapPrice.js.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/actions/nativeTransfer.d.ts +3 -0
- package/dist/nodes/CoinbaseAgentTool/actions/nativeTransfer.d.ts.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/actions/nativeTransfer.js +41 -0
- package/dist/nodes/CoinbaseAgentTool/actions/nativeTransfer.js.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/actions/requestFaucet.d.ts +3 -0
- package/dist/nodes/CoinbaseAgentTool/actions/requestFaucet.d.ts.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/actions/requestFaucet.js +50 -0
- package/dist/nodes/CoinbaseAgentTool/actions/requestFaucet.js.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/actions/swap.d.ts +3 -0
- package/dist/nodes/CoinbaseAgentTool/actions/swap.d.ts.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/actions/swap.js +49 -0
- package/dist/nodes/CoinbaseAgentTool/actions/swap.js.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/actions/walletDetails.d.ts +3 -0
- package/dist/nodes/CoinbaseAgentTool/actions/walletDetails.d.ts.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/actions/walletDetails.js +25 -0
- package/dist/nodes/CoinbaseAgentTool/actions/walletDetails.js.map +1 -0
- package/dist/nodes/CoinbaseAgentTool/coinbase.svg +4 -0
- package/dist/nodes/CoinbaseCdp/CoinbaseCdp.node.d.ts +6 -0
- package/dist/nodes/CoinbaseCdp/CoinbaseCdp.node.d.ts.map +1 -0
- package/dist/nodes/CoinbaseCdp/CoinbaseCdp.node.js +97 -0
- package/dist/nodes/CoinbaseCdp/CoinbaseCdp.node.js.map +1 -0
- package/dist/nodes/CoinbaseCdp/CoinbaseCdp.node.json +17 -0
- package/dist/nodes/CoinbaseCdp/coinbase.svg +4 -0
- package/dist/nodes/CoinbaseCdp/resources/account.d.ts +29 -0
- package/dist/nodes/CoinbaseCdp/resources/account.d.ts.map +1 -0
- package/dist/nodes/CoinbaseCdp/resources/account.js +119 -0
- package/dist/nodes/CoinbaseCdp/resources/account.js.map +1 -0
- package/dist/nodes/CoinbaseCdp/resources/balance.d.ts +12 -0
- package/dist/nodes/CoinbaseCdp/resources/balance.d.ts.map +1 -0
- package/dist/nodes/CoinbaseCdp/resources/balance.js +60 -0
- package/dist/nodes/CoinbaseCdp/resources/balance.js.map +1 -0
- package/dist/nodes/CoinbaseCdp/resources/policy.d.ts +13 -0
- package/dist/nodes/CoinbaseCdp/resources/policy.d.ts.map +1 -0
- package/dist/nodes/CoinbaseCdp/resources/policy.js +95 -0
- package/dist/nodes/CoinbaseCdp/resources/policy.js.map +1 -0
- package/dist/nodes/CoinbaseCdp/resources/smartAccount.d.ts +10 -0
- package/dist/nodes/CoinbaseCdp/resources/smartAccount.d.ts.map +1 -0
- package/dist/nodes/CoinbaseCdp/resources/smartAccount.js +56 -0
- package/dist/nodes/CoinbaseCdp/resources/smartAccount.js.map +1 -0
- package/dist/nodes/CoinbaseCdp/resources/solanaAccount.d.ts +17 -0
- package/dist/nodes/CoinbaseCdp/resources/solanaAccount.d.ts.map +1 -0
- package/dist/nodes/CoinbaseCdp/resources/solanaAccount.js +75 -0
- package/dist/nodes/CoinbaseCdp/resources/solanaAccount.js.map +1 -0
- package/dist/nodes/CoinbaseCdp/resources/swap.d.ts +32 -0
- package/dist/nodes/CoinbaseCdp/resources/swap.d.ts.map +1 -0
- package/dist/nodes/CoinbaseCdp/resources/swap.js +124 -0
- package/dist/nodes/CoinbaseCdp/resources/swap.js.map +1 -0
- package/dist/nodes/CoinbaseCdp/resources/transfer.d.ts +12 -0
- package/dist/nodes/CoinbaseCdp/resources/transfer.d.ts.map +1 -0
- package/dist/nodes/CoinbaseCdp/resources/transfer.js +116 -0
- package/dist/nodes/CoinbaseCdp/resources/transfer.js.map +1 -0
- package/dist/nodes/CoinbaseTrigger/CoinbaseTrigger.node.d.ts +6 -0
- package/dist/nodes/CoinbaseTrigger/CoinbaseTrigger.node.d.ts.map +1 -0
- package/dist/nodes/CoinbaseTrigger/CoinbaseTrigger.node.js +106 -0
- package/dist/nodes/CoinbaseTrigger/CoinbaseTrigger.node.js.map +1 -0
- package/dist/nodes/CoinbaseTrigger/CoinbaseTrigger.node.json +17 -0
- package/dist/nodes/CoinbaseTrigger/coinbase.svg +4 -0
- package/dist/shared/cdpClientFactory.d.ts +6 -0
- package/dist/shared/cdpClientFactory.d.ts.map +1 -0
- package/dist/shared/cdpClientFactory.js +13 -0
- package/dist/shared/cdpClientFactory.js.map +1 -0
- package/dist/shared/networkOptions.d.ts +7 -0
- package/dist/shared/networkOptions.d.ts.map +1 -0
- package/dist/shared/networkOptions.js +36 -0
- package/dist/shared/networkOptions.js.map +1 -0
- package/dist/shared/toolFactory.d.ts +10 -0
- package/dist/shared/toolFactory.d.ts.map +1 -0
- package/dist/shared/toolFactory.js +21 -0
- package/dist/shared/toolFactory.js.map +1 -0
- package/dist/shared/types.d.ts +34 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +3 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/src/icons/coinbase.svg +4 -0
- package/package.json +78 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.solanaAccountOperations = void 0;
|
|
4
|
+
exports.executeSolanaAccountOperation = executeSolanaAccountOperation;
|
|
5
|
+
exports.solanaAccountOperations = [
|
|
6
|
+
{
|
|
7
|
+
displayName: 'Operation',
|
|
8
|
+
name: 'operation',
|
|
9
|
+
type: 'options',
|
|
10
|
+
noDataExpression: true,
|
|
11
|
+
displayOptions: { show: { resource: ['solanaAccount'] } },
|
|
12
|
+
default: 'getOrCreate',
|
|
13
|
+
options: [
|
|
14
|
+
{
|
|
15
|
+
name: 'Get or Create',
|
|
16
|
+
value: 'getOrCreate',
|
|
17
|
+
description: 'Get an existing Solana account by name, or create one',
|
|
18
|
+
action: 'Get or create a Solana account',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'Request Faucet',
|
|
22
|
+
value: 'requestFaucet',
|
|
23
|
+
description: 'Request Solana devnet tokens from faucet',
|
|
24
|
+
action: 'Request Solana devnet tokens',
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
displayName: 'Account Name',
|
|
30
|
+
name: 'accountName',
|
|
31
|
+
type: 'string',
|
|
32
|
+
default: '',
|
|
33
|
+
required: true,
|
|
34
|
+
displayOptions: { show: { resource: ['solanaAccount'], operation: ['getOrCreate'] } },
|
|
35
|
+
description: 'Unique name for the Solana account',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
displayName: 'Address',
|
|
39
|
+
name: 'address',
|
|
40
|
+
type: 'string',
|
|
41
|
+
default: '',
|
|
42
|
+
required: true,
|
|
43
|
+
displayOptions: { show: { resource: ['solanaAccount'], operation: ['requestFaucet'] } },
|
|
44
|
+
description: 'The Solana wallet address',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
displayName: 'Token',
|
|
48
|
+
name: 'faucetToken',
|
|
49
|
+
type: 'options',
|
|
50
|
+
default: 'sol',
|
|
51
|
+
displayOptions: { show: { resource: ['solanaAccount'], operation: ['requestFaucet'] } },
|
|
52
|
+
options: [
|
|
53
|
+
{ name: 'SOL', value: 'sol' },
|
|
54
|
+
{ name: 'USDC', value: 'usdc' },
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
async function executeSolanaAccountOperation(context, cdp, operation, i) {
|
|
59
|
+
if (operation === 'getOrCreate') {
|
|
60
|
+
const name = context.getNodeParameter('accountName', i);
|
|
61
|
+
const account = await cdp.solana.getOrCreateAccount({ name });
|
|
62
|
+
return { address: account.address, name };
|
|
63
|
+
}
|
|
64
|
+
if (operation === 'requestFaucet') {
|
|
65
|
+
const address = context.getNodeParameter('address', i);
|
|
66
|
+
const token = context.getNodeParameter('faucetToken', i);
|
|
67
|
+
const result = await cdp.solana.requestFaucet({
|
|
68
|
+
address,
|
|
69
|
+
token: token,
|
|
70
|
+
});
|
|
71
|
+
return { signature: result.signature, address, token, network: 'solana-devnet' };
|
|
72
|
+
}
|
|
73
|
+
throw new Error(`Unknown solanaAccount operation: ${operation}`);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=solanaAccount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solanaAccount.js","sourceRoot":"","sources":["../../../../src/nodes/CoinbaseCdp/resources/solanaAccount.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { INodeProperties, IExecuteFunctions } from 'n8n-workflow';
|
|
2
|
+
import type { CdpClient } from '@coinbase/cdp-sdk';
|
|
3
|
+
export declare const swapOperations: INodeProperties[];
|
|
4
|
+
export declare function executeSwapOperation(context: IExecuteFunctions, cdp: CdpClient, operation: string, i: number): Promise<{
|
|
5
|
+
transactionHash: `0x${string}`;
|
|
6
|
+
from: `0x${string}`;
|
|
7
|
+
fromToken: string;
|
|
8
|
+
toToken: string;
|
|
9
|
+
fromAmount: string;
|
|
10
|
+
network: string;
|
|
11
|
+
liquidityAvailable?: undefined;
|
|
12
|
+
toAmount?: undefined;
|
|
13
|
+
} | {
|
|
14
|
+
liquidityAvailable: boolean;
|
|
15
|
+
fromToken: string;
|
|
16
|
+
toToken: string;
|
|
17
|
+
fromAmount: string;
|
|
18
|
+
network: string;
|
|
19
|
+
transactionHash?: undefined;
|
|
20
|
+
from?: undefined;
|
|
21
|
+
toAmount?: undefined;
|
|
22
|
+
} | {
|
|
23
|
+
liquidityAvailable: boolean;
|
|
24
|
+
toAmount: bigint;
|
|
25
|
+
fromToken: string;
|
|
26
|
+
toToken: string;
|
|
27
|
+
fromAmount: string;
|
|
28
|
+
network: string;
|
|
29
|
+
transactionHash?: undefined;
|
|
30
|
+
from?: undefined;
|
|
31
|
+
}>;
|
|
32
|
+
//# sourceMappingURL=swap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../../../src/nodes/CoinbaseCdp/resources/swap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,eAAO,MAAM,cAAc,EAAE,eAAe,EAmE3C,CAAC;AAEF,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,iBAAiB,EAC1B,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDT"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.swapOperations = void 0;
|
|
4
|
+
exports.executeSwapOperation = executeSwapOperation;
|
|
5
|
+
const networkOptions_1 = require("../../../shared/networkOptions");
|
|
6
|
+
exports.swapOperations = [
|
|
7
|
+
{
|
|
8
|
+
displayName: 'Operation',
|
|
9
|
+
name: 'operation',
|
|
10
|
+
type: 'options',
|
|
11
|
+
noDataExpression: true,
|
|
12
|
+
displayOptions: { show: { resource: ['swap'] } },
|
|
13
|
+
default: 'execute',
|
|
14
|
+
options: [
|
|
15
|
+
{
|
|
16
|
+
name: 'Execute Swap',
|
|
17
|
+
value: 'execute',
|
|
18
|
+
description: 'Swap one token for another',
|
|
19
|
+
action: 'Execute a token swap',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'Get Quote',
|
|
23
|
+
value: 'quote',
|
|
24
|
+
description: 'Get a swap quote without executing',
|
|
25
|
+
action: 'Get swap quote',
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
displayName: 'Account Name',
|
|
31
|
+
name: 'accountName',
|
|
32
|
+
type: 'string',
|
|
33
|
+
default: '',
|
|
34
|
+
required: true,
|
|
35
|
+
displayOptions: { show: { resource: ['swap'] } },
|
|
36
|
+
description: 'Name of the account performing the swap',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
displayName: 'From Token',
|
|
40
|
+
name: 'fromToken',
|
|
41
|
+
type: 'string',
|
|
42
|
+
default: '',
|
|
43
|
+
required: true,
|
|
44
|
+
displayOptions: { show: { resource: ['swap'] } },
|
|
45
|
+
description: 'Token to swap from - symbol (e.g. "eth") or contract address (0x...)',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
displayName: 'To Token',
|
|
49
|
+
name: 'toToken',
|
|
50
|
+
type: 'string',
|
|
51
|
+
default: '',
|
|
52
|
+
required: true,
|
|
53
|
+
displayOptions: { show: { resource: ['swap'] } },
|
|
54
|
+
description: 'Token to swap to - symbol (e.g. "usdc") or contract address (0x...)',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
displayName: 'Amount',
|
|
58
|
+
name: 'fromAmount',
|
|
59
|
+
type: 'string',
|
|
60
|
+
default: '',
|
|
61
|
+
required: true,
|
|
62
|
+
displayOptions: { show: { resource: ['swap'] } },
|
|
63
|
+
description: 'Amount of source token in human-readable units',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
displayName: 'Network',
|
|
67
|
+
name: 'network',
|
|
68
|
+
type: 'options',
|
|
69
|
+
default: 'base-sepolia',
|
|
70
|
+
displayOptions: { show: { resource: ['swap'] } },
|
|
71
|
+
options: networkOptions_1.swapNetworkOptions,
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
async function executeSwapOperation(context, cdp, operation, i) {
|
|
75
|
+
const accountName = context.getNodeParameter('accountName', i);
|
|
76
|
+
const fromToken = context.getNodeParameter('fromToken', i);
|
|
77
|
+
const toToken = context.getNodeParameter('toToken', i);
|
|
78
|
+
const fromAmount = context.getNodeParameter('fromAmount', i);
|
|
79
|
+
const network = context.getNodeParameter('network', i);
|
|
80
|
+
const account = await cdp.evm.getOrCreateAccount({ name: accountName });
|
|
81
|
+
if (operation === 'execute') {
|
|
82
|
+
const result = await account.swap({
|
|
83
|
+
fromToken: fromToken,
|
|
84
|
+
toToken: toToken,
|
|
85
|
+
fromAmount: fromAmount,
|
|
86
|
+
network: network,
|
|
87
|
+
});
|
|
88
|
+
return {
|
|
89
|
+
transactionHash: result.transactionHash,
|
|
90
|
+
from: account.address,
|
|
91
|
+
fromToken,
|
|
92
|
+
toToken,
|
|
93
|
+
fromAmount,
|
|
94
|
+
network,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (operation === 'quote') {
|
|
98
|
+
const quote = await account.quoteSwap({
|
|
99
|
+
fromToken: fromToken,
|
|
100
|
+
toToken: toToken,
|
|
101
|
+
fromAmount: fromAmount,
|
|
102
|
+
network: network,
|
|
103
|
+
});
|
|
104
|
+
if (!quote.liquidityAvailable) {
|
|
105
|
+
return {
|
|
106
|
+
liquidityAvailable: false,
|
|
107
|
+
fromToken,
|
|
108
|
+
toToken,
|
|
109
|
+
fromAmount,
|
|
110
|
+
network,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
liquidityAvailable: true,
|
|
115
|
+
toAmount: quote.toAmount,
|
|
116
|
+
fromToken,
|
|
117
|
+
toToken,
|
|
118
|
+
fromAmount,
|
|
119
|
+
network,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
throw new Error(`Unknown swap operation: ${operation}`);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=swap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.js","sourceRoot":"","sources":["../../../../src/nodes/CoinbaseCdp/resources/swap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { INodeProperties, IExecuteFunctions } from 'n8n-workflow';
|
|
2
|
+
import type { CdpClient } from '@coinbase/cdp-sdk';
|
|
3
|
+
export declare const transferOperations: INodeProperties[];
|
|
4
|
+
export declare function executeTransferOperation(context: IExecuteFunctions, cdp: CdpClient, operation: string, i: number): Promise<{
|
|
5
|
+
transactionHash: `0x${string}`;
|
|
6
|
+
from: `0x${string}`;
|
|
7
|
+
to: string;
|
|
8
|
+
amount: string;
|
|
9
|
+
token: string;
|
|
10
|
+
network: string;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=transfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../../../src/nodes/CoinbaseCdp/resources/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAInD,eAAO,MAAM,kBAAkB,EAAE,eAAe,EAmE/C,CAAC;AAEF,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,iBAAiB,EAC1B,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,CAAC,EAAE,MAAM;;;;;;;GA6CT"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.transferOperations = void 0;
|
|
4
|
+
exports.executeTransferOperation = executeTransferOperation;
|
|
5
|
+
const cdp_sdk_1 = require("@coinbase/cdp-sdk");
|
|
6
|
+
const networkOptions_1 = require("../../../shared/networkOptions");
|
|
7
|
+
exports.transferOperations = [
|
|
8
|
+
{
|
|
9
|
+
displayName: 'Operation',
|
|
10
|
+
name: 'operation',
|
|
11
|
+
type: 'options',
|
|
12
|
+
noDataExpression: true,
|
|
13
|
+
displayOptions: { show: { resource: ['transfer'] } },
|
|
14
|
+
default: 'sendNative',
|
|
15
|
+
options: [
|
|
16
|
+
{
|
|
17
|
+
name: 'Send Native Token',
|
|
18
|
+
value: 'sendNative',
|
|
19
|
+
description: 'Transfer native cryptocurrency (ETH, etc.)',
|
|
20
|
+
action: 'Send native token',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'Send ERC-20 Token',
|
|
24
|
+
value: 'sendErc20',
|
|
25
|
+
description: 'Transfer an ERC-20 token (USDC, DAI, etc.)',
|
|
26
|
+
action: 'Send ERC-20 token',
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
displayName: 'Sender Account Name',
|
|
32
|
+
name: 'accountName',
|
|
33
|
+
type: 'string',
|
|
34
|
+
default: '',
|
|
35
|
+
required: true,
|
|
36
|
+
displayOptions: { show: { resource: ['transfer'] } },
|
|
37
|
+
description: 'Name of the sending account',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
displayName: 'Recipient Address',
|
|
41
|
+
name: 'to',
|
|
42
|
+
type: 'string',
|
|
43
|
+
default: '',
|
|
44
|
+
required: true,
|
|
45
|
+
displayOptions: { show: { resource: ['transfer'] } },
|
|
46
|
+
description: 'Destination wallet address (0x...)',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
displayName: 'Amount',
|
|
50
|
+
name: 'amount',
|
|
51
|
+
type: 'string',
|
|
52
|
+
default: '',
|
|
53
|
+
required: true,
|
|
54
|
+
displayOptions: { show: { resource: ['transfer'] } },
|
|
55
|
+
description: 'Amount to send in human-readable units (e.g. "0.01")',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
displayName: 'Token',
|
|
59
|
+
name: 'token',
|
|
60
|
+
type: 'string',
|
|
61
|
+
default: 'usdc',
|
|
62
|
+
required: true,
|
|
63
|
+
displayOptions: { show: { resource: ['transfer'], operation: ['sendErc20'] } },
|
|
64
|
+
description: 'Token symbol (e.g. "usdc") or contract address (0x...)',
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
displayName: 'Network',
|
|
68
|
+
name: 'network',
|
|
69
|
+
type: 'options',
|
|
70
|
+
default: 'base-sepolia',
|
|
71
|
+
displayOptions: { show: { resource: ['transfer'] } },
|
|
72
|
+
options: networkOptions_1.evmNetworkOptions,
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
async function executeTransferOperation(context, cdp, operation, i) {
|
|
76
|
+
const accountName = context.getNodeParameter('accountName', i);
|
|
77
|
+
const to = context.getNodeParameter('to', i);
|
|
78
|
+
const amount = context.getNodeParameter('amount', i);
|
|
79
|
+
const network = context.getNodeParameter('network', i);
|
|
80
|
+
const account = await cdp.evm.getOrCreateAccount({ name: accountName });
|
|
81
|
+
if (operation === 'sendNative') {
|
|
82
|
+
const result = await account.transfer({
|
|
83
|
+
to: to,
|
|
84
|
+
amount: (0, cdp_sdk_1.parseEther)(amount),
|
|
85
|
+
token: 'eth',
|
|
86
|
+
network: network,
|
|
87
|
+
});
|
|
88
|
+
return {
|
|
89
|
+
transactionHash: result.transactionHash,
|
|
90
|
+
from: account.address,
|
|
91
|
+
to,
|
|
92
|
+
amount,
|
|
93
|
+
token: 'eth',
|
|
94
|
+
network,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (operation === 'sendErc20') {
|
|
98
|
+
const token = context.getNodeParameter('token', i);
|
|
99
|
+
const result = await account.transfer({
|
|
100
|
+
to: to,
|
|
101
|
+
amount: amount,
|
|
102
|
+
token: token,
|
|
103
|
+
network: network,
|
|
104
|
+
});
|
|
105
|
+
return {
|
|
106
|
+
transactionHash: result.transactionHash,
|
|
107
|
+
from: account.address,
|
|
108
|
+
to,
|
|
109
|
+
amount,
|
|
110
|
+
token,
|
|
111
|
+
network,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
throw new Error(`Unknown transfer operation: ${operation}`);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../../../src/nodes/CoinbaseCdp/resources/transfer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { IPollFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
|
|
2
|
+
export declare class CoinbaseTrigger implements INodeType {
|
|
3
|
+
description: INodeTypeDescription;
|
|
4
|
+
poll(this: IPollFunctions): Promise<INodeExecutionData[][] | null>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=CoinbaseTrigger.node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CoinbaseTrigger.node.d.ts","sourceRoot":"","sources":["../../../src/nodes/CoinbaseTrigger/CoinbaseTrigger.node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,cAAc,EACd,kBAAkB,EAClB,SAAS,EACT,oBAAoB,EACpB,MAAM,cAAc,CAAC;AAItB,qBAAa,eAAgB,YAAW,SAAS;IAChD,WAAW,EAAE,oBAAoB,CAkD/B;IAEI,IAAI,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,EAAE,EAAE,GAAG,IAAI,CAAC;CAuDxE"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CoinbaseTrigger = void 0;
|
|
4
|
+
const cdpClientFactory_1 = require("../../shared/cdpClientFactory");
|
|
5
|
+
const networkOptions_1 = require("../../shared/networkOptions");
|
|
6
|
+
class CoinbaseTrigger {
|
|
7
|
+
description = {
|
|
8
|
+
displayName: 'Coinbase CDP Trigger',
|
|
9
|
+
name: 'coinbaseTrigger',
|
|
10
|
+
icon: 'file:coinbase.svg',
|
|
11
|
+
group: ['trigger'],
|
|
12
|
+
version: 1,
|
|
13
|
+
subtitle: '={{$parameter["event"]}}',
|
|
14
|
+
description: 'Triggers workflow on Coinbase CDP balance changes',
|
|
15
|
+
defaults: {
|
|
16
|
+
name: 'Coinbase CDP Trigger',
|
|
17
|
+
},
|
|
18
|
+
polling: true,
|
|
19
|
+
inputs: [],
|
|
20
|
+
outputs: ['main'],
|
|
21
|
+
credentials: [
|
|
22
|
+
{
|
|
23
|
+
name: 'coinbaseCdpApi',
|
|
24
|
+
required: true,
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
properties: [
|
|
28
|
+
{
|
|
29
|
+
displayName: 'Event',
|
|
30
|
+
name: 'event',
|
|
31
|
+
type: 'options',
|
|
32
|
+
default: 'balanceChanged',
|
|
33
|
+
options: [
|
|
34
|
+
{
|
|
35
|
+
name: 'Balance Changed',
|
|
36
|
+
value: 'balanceChanged',
|
|
37
|
+
description: 'Trigger when any token balance changes for the address',
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
displayName: 'Address',
|
|
43
|
+
name: 'address',
|
|
44
|
+
type: 'string',
|
|
45
|
+
default: '',
|
|
46
|
+
required: true,
|
|
47
|
+
description: 'The EVM wallet address to monitor (0x...)',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
displayName: 'Network',
|
|
51
|
+
name: 'network',
|
|
52
|
+
type: 'options',
|
|
53
|
+
default: 'base-sepolia',
|
|
54
|
+
options: networkOptions_1.evmNetworkOptions,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
async poll() {
|
|
59
|
+
const address = this.getNodeParameter('address');
|
|
60
|
+
const network = this.getNodeParameter('network');
|
|
61
|
+
const cdp = await (0, cdpClientFactory_1.getCdpClient)(this);
|
|
62
|
+
const result = await cdp.evm.listTokenBalances({
|
|
63
|
+
address: address,
|
|
64
|
+
network: network,
|
|
65
|
+
});
|
|
66
|
+
const currentBalances = {};
|
|
67
|
+
for (const b of result.balances) {
|
|
68
|
+
const key = b.token.symbol || b.token.contractAddress || 'unknown';
|
|
69
|
+
currentBalances[key] = String(b.amount);
|
|
70
|
+
}
|
|
71
|
+
const lastBalances = this.getWorkflowStaticData('node')
|
|
72
|
+
.lastBalances;
|
|
73
|
+
// Store current state for next poll
|
|
74
|
+
this.getWorkflowStaticData('node').lastBalances =
|
|
75
|
+
currentBalances;
|
|
76
|
+
// First run - store baseline, don't trigger
|
|
77
|
+
if (!lastBalances) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
// Compare balances
|
|
81
|
+
const changes = [];
|
|
82
|
+
const allTokens = new Set([...Object.keys(lastBalances), ...Object.keys(currentBalances)]);
|
|
83
|
+
for (const token of allTokens) {
|
|
84
|
+
const prev = lastBalances[token] || '0';
|
|
85
|
+
const curr = currentBalances[token] || '0';
|
|
86
|
+
if (prev !== curr) {
|
|
87
|
+
changes.push({ token, previousBalance: prev, currentBalance: curr });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (changes.length === 0) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
return [
|
|
94
|
+
changes.map((change) => ({
|
|
95
|
+
json: {
|
|
96
|
+
address,
|
|
97
|
+
network,
|
|
98
|
+
...change,
|
|
99
|
+
timestamp: new Date().toISOString(),
|
|
100
|
+
},
|
|
101
|
+
})),
|
|
102
|
+
];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.CoinbaseTrigger = CoinbaseTrigger;
|
|
106
|
+
//# sourceMappingURL=CoinbaseTrigger.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CoinbaseTrigger.node.js","sourceRoot":"","sources":["../../../src/nodes/CoinbaseTrigger/CoinbaseTrigger.node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"node": "n8n-nodes-coinbase-cdp.coinbaseTrigger",
|
|
3
|
+
"nodeVersion": "1.0",
|
|
4
|
+
"codexVersion": "1.0",
|
|
5
|
+
"categories": ["Finance & Accounting"],
|
|
6
|
+
"subcategories": {
|
|
7
|
+
"Finance & Accounting": ["Cryptocurrency"]
|
|
8
|
+
},
|
|
9
|
+
"resources": {
|
|
10
|
+
"primaryDocumentation": [
|
|
11
|
+
{
|
|
12
|
+
"url": "https://docs.cdp.coinbase.com/"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"alias": ["coinbase", "cdp", "blockchain", "wallet", "crypto", "monitor", "balance"]
|
|
17
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 56" fill="none">
|
|
2
|
+
<path d="M28 56C43.464 56 56 43.464 56 28C56 12.536 43.464 0 28 0C12.536 0 0 12.536 0 28C0 43.464 12.536 56 28 56Z" fill="#0052FF"/>
|
|
3
|
+
<path d="M28 10C18.059 10 10 18.059 10 28C10 37.941 18.059 46 28 46C37.941 46 46 37.941 46 28C46 18.059 37.941 10 28 10ZM23.5 33.5C22.672 33.5 22 32.828 22 32V24C22 23.172 22.672 22.5 23.5 22.5H32.5C33.328 22.5 34 23.172 34 24V32C34 32.828 33.328 33.5 32.5 33.5H23.5Z" fill="white"/>
|
|
4
|
+
</svg>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { CdpClient } from '@coinbase/cdp-sdk';
|
|
2
|
+
import type { IExecuteFunctions, ISupplyDataFunctions, IPollFunctions } from 'n8n-workflow';
|
|
3
|
+
type CredentialContext = IExecuteFunctions | ISupplyDataFunctions | IPollFunctions;
|
|
4
|
+
export declare function getCdpClient(context: CredentialContext): Promise<CdpClient>;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=cdpClientFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdpClientFactory.d.ts","sourceRoot":"","sources":["../../src/shared/cdpClientFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE5F,KAAK,iBAAiB,GAAG,iBAAiB,GAAG,oBAAoB,GAAG,cAAc,CAAC;AAEnF,wBAAsB,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,CAQjF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCdpClient = getCdpClient;
|
|
4
|
+
const cdp_sdk_1 = require("@coinbase/cdp-sdk");
|
|
5
|
+
async function getCdpClient(context) {
|
|
6
|
+
const credentials = await context.getCredentials('coinbaseCdpApi');
|
|
7
|
+
return new cdp_sdk_1.CdpClient({
|
|
8
|
+
apiKeyId: credentials.apiKeyId,
|
|
9
|
+
apiKeySecret: credentials.apiKeySecret,
|
|
10
|
+
walletSecret: credentials.walletSecret || undefined,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=cdpClientFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdpClientFactory.js","sourceRoot":"","sources":["../../src/shared/cdpClientFactory.ts"],"names":[],"mappings":";;AAKA,oCAQC;AAbD,+CAA8C;AAKvC,KAAK,UAAU,YAAY,CAAC,OAA0B;IAC5D,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAEnE,OAAO,IAAI,mBAAS,CAAC;QACpB,QAAQ,EAAE,WAAW,CAAC,QAAkB;QACxC,YAAY,EAAE,WAAW,CAAC,YAAsB;QAChD,YAAY,EAAG,WAAW,CAAC,YAAuB,IAAI,SAAS;KAC/D,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { INodePropertyOptions } from 'n8n-workflow';
|
|
2
|
+
export declare const evmNetworkOptions: INodePropertyOptions[];
|
|
3
|
+
export declare const solanaNetworkOptions: INodePropertyOptions[];
|
|
4
|
+
export declare const swapNetworkOptions: INodePropertyOptions[];
|
|
5
|
+
export declare const faucetNetworkOptions: INodePropertyOptions[];
|
|
6
|
+
export declare const faucetTokenOptions: INodePropertyOptions[];
|
|
7
|
+
//# sourceMappingURL=networkOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"networkOptions.d.ts","sourceRoot":"","sources":["../../src/shared/networkOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,eAAO,MAAM,iBAAiB,EAAE,oBAAoB,EAWnD,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,oBAAoB,EAGtD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,oBAAoB,EAKpD,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,oBAAoB,EAItD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,oBAAoB,EAIpD,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.faucetTokenOptions = exports.faucetNetworkOptions = exports.swapNetworkOptions = exports.solanaNetworkOptions = exports.evmNetworkOptions = void 0;
|
|
4
|
+
exports.evmNetworkOptions = [
|
|
5
|
+
{ name: 'Base', value: 'base' },
|
|
6
|
+
{ name: 'Base Sepolia (Testnet)', value: 'base-sepolia' },
|
|
7
|
+
{ name: 'Ethereum', value: 'ethereum' },
|
|
8
|
+
{ name: 'Ethereum Sepolia (Testnet)', value: 'ethereum-sepolia' },
|
|
9
|
+
{ name: 'Arbitrum', value: 'arbitrum' },
|
|
10
|
+
{ name: 'Optimism', value: 'optimism' },
|
|
11
|
+
{ name: 'Polygon', value: 'polygon' },
|
|
12
|
+
{ name: 'BNB Chain', value: 'bnb' },
|
|
13
|
+
{ name: 'Avalanche', value: 'avalanche' },
|
|
14
|
+
{ name: 'Zora', value: 'zora' },
|
|
15
|
+
];
|
|
16
|
+
exports.solanaNetworkOptions = [
|
|
17
|
+
{ name: 'Solana Mainnet', value: 'solana-mainnet' },
|
|
18
|
+
{ name: 'Solana Devnet (Testnet)', value: 'solana-devnet' },
|
|
19
|
+
];
|
|
20
|
+
exports.swapNetworkOptions = [
|
|
21
|
+
{ name: 'Base', value: 'base' },
|
|
22
|
+
{ name: 'Base Sepolia (Testnet)', value: 'base-sepolia' },
|
|
23
|
+
{ name: 'Ethereum', value: 'ethereum' },
|
|
24
|
+
{ name: 'Ethereum Sepolia (Testnet)', value: 'ethereum-sepolia' },
|
|
25
|
+
];
|
|
26
|
+
exports.faucetNetworkOptions = [
|
|
27
|
+
{ name: 'Base Sepolia', value: 'base-sepolia' },
|
|
28
|
+
{ name: 'Ethereum Sepolia', value: 'ethereum-sepolia' },
|
|
29
|
+
{ name: 'Solana Devnet', value: 'solana-devnet' },
|
|
30
|
+
];
|
|
31
|
+
exports.faucetTokenOptions = [
|
|
32
|
+
{ name: 'ETH', value: 'eth' },
|
|
33
|
+
{ name: 'USDC', value: 'usdc' },
|
|
34
|
+
{ name: 'SOL', value: 'sol' },
|
|
35
|
+
];
|
|
36
|
+
//# sourceMappingURL=networkOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"networkOptions.js","sourceRoot":"","sources":["../../src/shared/networkOptions.ts"],"names":[],"mappings":";;;AAEa,QAAA,iBAAiB,GAA2B;IACxD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IAC/B,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,cAAc,EAAE;IACzD,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACvC,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,kBAAkB,EAAE;IACjE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACvC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACvC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;IACrC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE;IACnC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;IACzC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;CAC/B,CAAC;AAEW,QAAA,oBAAoB,GAA2B;IAC3D,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAE;IACnD,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,eAAe,EAAE;CAC3D,CAAC;AAEW,QAAA,kBAAkB,GAA2B;IACzD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IAC/B,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,cAAc,EAAE;IACzD,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACvC,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,kBAAkB,EAAE;CACjE,CAAC;AAEW,QAAA,oBAAoB,GAA2B;IAC3D,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE;IAC/C,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE;IACvD,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE;CACjD,CAAC;AAEW,QAAA,kBAAkB,GAA2B;IACzD,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IAC/B,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;CAC7B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DynamicStructuredTool } from '@langchain/core/tools';
|
|
2
|
+
interface ToolDefinition {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
schema: any;
|
|
6
|
+
func: (input: Record<string, unknown>) => Promise<string>;
|
|
7
|
+
}
|
|
8
|
+
export declare function createAgentTool(definition: ToolDefinition): DynamicStructuredTool;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=toolFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolFactory.d.ts","sourceRoot":"","sources":["../../src/shared/toolFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,UAAU,cAAc;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IAEpB,MAAM,EAAE,GAAG,CAAC;IACZ,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1D;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,cAAc,GAAG,qBAAqB,CAcjF"}
|