otomato-sdk 1.3.2 → 1.3.5
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 +2 -2
- package/dist/examples/create-action.js +6 -6
- package/dist/examples/create-trigger-list.js +5 -10
- package/dist/examples/create-trigger.js +21 -7
- package/dist/examples/create-workflow.js +33 -23
- package/dist/examples/load-workflow.js +1 -1
- package/dist/examples/login.js +32 -0
- package/dist/src/constants/Blocks.js +4 -4
- package/dist/src/constants/chains.js +1 -1
- package/dist/src/constants/tokens.js +13 -3
- package/dist/src/index.js +1 -0
- package/dist/src/models/Action.js +72 -0
- package/dist/src/models/Node.js +46 -57
- package/dist/src/models/Trigger.js +80 -4
- package/dist/src/models/Workflow.js +40 -9
- package/dist/src/services/ApiService.js +27 -5
- package/dist/src/utils/helpers.js +19 -0
- package/dist/src/utils/typeValidator.js +34 -8
- package/dist/test/action.spec.js +80 -11
- package/dist/test/automation.spec.js +9 -8
- package/dist/test/helpers.spec.js +23 -0
- package/dist/test/node.spec.js +13 -19
- package/dist/test/trigger.spec.js +92 -19
- package/dist/types/examples/login.d.ts +1 -0
- package/dist/types/src/constants/tokens.d.ts +2 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/models/Action.d.ts +6 -1
- package/dist/types/src/models/Node.d.ts +13 -2
- package/dist/types/src/models/Trigger.d.ts +8 -2
- package/dist/types/src/models/Workflow.d.ts +14 -1
- package/dist/types/src/services/ApiService.d.ts +6 -1
- package/dist/types/src/utils/helpers.d.ts +2 -0
- package/dist/types/src/utils/typeValidator.d.ts +1 -0
- package/dist/types/test/helpers.spec.d.ts +1 -0
- package/examples/create-action.ts +6 -6
- package/examples/create-trigger-list.ts +5 -10
- package/examples/create-trigger.ts +14 -7
- package/examples/create-workflow.ts +43 -25
- package/examples/load-workflow.ts +1 -1
- package/examples/login.ts +27 -0
- package/package.json +4 -2
- package/src/constants/Blocks.ts +4 -4
- package/src/constants/chains.ts +1 -1
- package/src/constants/tokens.ts +18 -4
- package/src/index.ts +1 -0
- package/src/models/Action.ts +77 -3
- package/src/models/Node.ts +54 -65
- package/src/models/Trigger.ts +84 -6
- package/src/models/Workflow.ts +37 -10
- package/src/services/ApiService.ts +24 -5
- package/src/utils/helpers.ts +9 -0
- package/src/utils/typeValidator.ts +28 -11
- package/test/action.spec.ts +75 -11
- package/test/automation.spec.ts +9 -8
- package/test/helpers.spec.ts +16 -0
- package/test/node.spec.ts +17 -23
- package/test/trigger.spec.ts +89 -19
|
@@ -1,13 +1,22 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
import { expect } from 'chai';
|
|
2
|
-
import { Trigger, TRIGGERS,
|
|
11
|
+
import { Trigger, TRIGGERS, getTokenFromSymbol, CHAINS } from '../src/index';
|
|
3
12
|
const DEFAULT_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
4
13
|
describe('Trigger Class', () => {
|
|
5
14
|
it('should create a transfer trigger without parameters', () => {
|
|
6
15
|
const transferTrigger = new Trigger(TRIGGERS.TOKENS.ERC20.TRANSFER);
|
|
7
16
|
const params = transferTrigger.getParameters();
|
|
8
17
|
expect(params.chainId).to.be.null;
|
|
9
|
-
expect(params
|
|
10
|
-
expect(params
|
|
18
|
+
expect(params.abi.parameters.value).to.equal(null);
|
|
19
|
+
expect(params.abi.parameters.to).to.equal(null);
|
|
11
20
|
expect(params.contractAddress).to.be.null;
|
|
12
21
|
});
|
|
13
22
|
it('should create a transfer trigger and set parameters correctly', () => {
|
|
@@ -15,31 +24,35 @@ describe('Trigger Class', () => {
|
|
|
15
24
|
transferTrigger.setChainId(CHAINS.ETHEREUM);
|
|
16
25
|
transferTrigger.setParams("value", 1000);
|
|
17
26
|
transferTrigger.setParams("to", DEFAULT_ADDRESS);
|
|
18
|
-
transferTrigger.setContractAddress(
|
|
27
|
+
transferTrigger.setContractAddress(getTokenFromSymbol(CHAINS.ETHEREUM, 'USDC').contractAddress);
|
|
19
28
|
const params = transferTrigger.getParameters();
|
|
20
29
|
expect(params.chainId).to.equal(CHAINS.ETHEREUM);
|
|
21
|
-
expect(params
|
|
22
|
-
expect(params
|
|
23
|
-
expect(params.contractAddress).to.equal(
|
|
30
|
+
expect(params.abi.parameters.value).to.equal(1000);
|
|
31
|
+
expect(params.abi.parameters.to).to.equal(DEFAULT_ADDRESS);
|
|
32
|
+
expect(params.contractAddress).to.equal(getTokenFromSymbol(CHAINS.ETHEREUM, 'USDC').contractAddress);
|
|
24
33
|
});
|
|
25
34
|
it('should be able to export a trigger as json', () => {
|
|
26
35
|
const transferTrigger = new Trigger(TRIGGERS.TOKENS.ERC20.TRANSFER);
|
|
27
36
|
transferTrigger.setChainId(CHAINS.ETHEREUM);
|
|
28
37
|
transferTrigger.setParams("value", 1000);
|
|
29
38
|
transferTrigger.setParams("to", DEFAULT_ADDRESS);
|
|
30
|
-
transferTrigger.setContractAddress(
|
|
39
|
+
transferTrigger.setContractAddress(getTokenFromSymbol(CHAINS.ETHEREUM, 'USDC').contractAddress);
|
|
31
40
|
const json = transferTrigger.toJSON();
|
|
32
|
-
console.log(json);
|
|
33
41
|
expect(json).to.deep.equal({
|
|
34
42
|
blockId: TRIGGERS.TOKENS.ERC20.TRANSFER.blockId,
|
|
35
43
|
ref: transferTrigger.getRef(),
|
|
44
|
+
id: null,
|
|
36
45
|
type: 'trigger',
|
|
37
46
|
parameters: {
|
|
38
47
|
chainId: CHAINS.ETHEREUM,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
48
|
+
abi: {
|
|
49
|
+
parameters: {
|
|
50
|
+
value: 1000,
|
|
51
|
+
to: DEFAULT_ADDRESS,
|
|
52
|
+
from: null
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
contractAddress: getTokenFromSymbol(CHAINS.ETHEREUM, 'USDC').contractAddress
|
|
43
56
|
}
|
|
44
57
|
});
|
|
45
58
|
});
|
|
@@ -47,15 +60,13 @@ describe('Trigger Class', () => {
|
|
|
47
60
|
const balanceTrigger = new Trigger(TRIGGERS.TOKENS.ERC20.BALANCE);
|
|
48
61
|
balanceTrigger.setChainId(CHAINS.ETHEREUM);
|
|
49
62
|
balanceTrigger.setParams("account", DEFAULT_ADDRESS);
|
|
50
|
-
balanceTrigger.setContractAddress(
|
|
63
|
+
balanceTrigger.setContractAddress(getTokenFromSymbol(CHAINS.ETHEREUM, 'USDC').contractAddress);
|
|
51
64
|
balanceTrigger.setCondition("gte");
|
|
52
65
|
balanceTrigger.setComparisonValue(45000);
|
|
53
|
-
balanceTrigger.setInterval(5000);
|
|
54
66
|
const params = balanceTrigger.getParameters();
|
|
55
67
|
expect(params.chainId).to.equal(CHAINS.ETHEREUM);
|
|
56
|
-
expect(params
|
|
57
|
-
expect(params.contractAddress).to.equal(
|
|
58
|
-
console.log(balanceTrigger.toJSON());
|
|
68
|
+
expect(params.abi.parameters.account).to.equal(DEFAULT_ADDRESS);
|
|
69
|
+
expect(params.contractAddress).to.equal(getTokenFromSymbol(CHAINS.ETHEREUM, 'USDC').contractAddress);
|
|
59
70
|
expect(balanceTrigger.toJSON().parameters.condition).to.equal("gte");
|
|
60
71
|
expect(balanceTrigger.toJSON().parameters.comparisonValue).to.equal(45000);
|
|
61
72
|
expect(balanceTrigger.toJSON().parameters.interval).to.equal(5000);
|
|
@@ -64,7 +75,6 @@ describe('Trigger Class', () => {
|
|
|
64
75
|
const transferTrigger = new Trigger(TRIGGERS.TOKENS.ERC20.TRANSFER);
|
|
65
76
|
expect(() => transferTrigger.setCondition(">")).to.throw('Condition setting is not applicable for subscription based triggers.');
|
|
66
77
|
expect(() => transferTrigger.setComparisonValue(45000)).to.throw('Comparison value setting is not applicable for subscription based triggers.');
|
|
67
|
-
expect(() => transferTrigger.setInterval(5000)).to.throw('Interval setting is not applicable for subscription based triggers.');
|
|
68
78
|
});
|
|
69
79
|
it('should throw an error for invalid parameter type', () => {
|
|
70
80
|
const transferTrigger = new Trigger(TRIGGERS.TOKENS.ERC20.TRANSFER);
|
|
@@ -74,4 +84,67 @@ describe('Trigger Class', () => {
|
|
|
74
84
|
const transferTrigger = new Trigger(TRIGGERS.TOKENS.ERC20.TRANSFER);
|
|
75
85
|
expect(() => transferTrigger.setParams("to", "invalid_address")).to.throw('Invalid type for parameter abiParams.to. Expected address.');
|
|
76
86
|
});
|
|
87
|
+
it('should create a trigger from JSON correctly', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
88
|
+
var _a;
|
|
89
|
+
const json = {
|
|
90
|
+
"id": "5c87bcd2-8771-417f-aab6-c23998caa9ae",
|
|
91
|
+
"ref": "n-1",
|
|
92
|
+
"blockId": 10,
|
|
93
|
+
"type": "trigger",
|
|
94
|
+
"position": {
|
|
95
|
+
"x": 0,
|
|
96
|
+
"y": 0
|
|
97
|
+
},
|
|
98
|
+
"parameters": {
|
|
99
|
+
"chainId": 34443,
|
|
100
|
+
"currency": "USD",
|
|
101
|
+
"interval": 5000,
|
|
102
|
+
"condition": "gte",
|
|
103
|
+
"comparisonValue": 3550,
|
|
104
|
+
"contractAddress": "0x4200000000000000000000000000000000000006"
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
const trigger = yield Trigger.fromJSON(json);
|
|
108
|
+
expect(trigger.id).to.equal("5c87bcd2-8771-417f-aab6-c23998caa9ae");
|
|
109
|
+
expect(trigger.getRef()).to.equal("n-1");
|
|
110
|
+
expect(trigger.blockId).to.equal(10);
|
|
111
|
+
expect(trigger.getParameters().chainId).to.equal(34443);
|
|
112
|
+
expect(trigger.getParameters().currency).to.equal("USD");
|
|
113
|
+
expect(trigger.getParameters().condition).to.equal("gte");
|
|
114
|
+
expect(trigger.getParameters().comparisonValue).to.equal(3550);
|
|
115
|
+
expect(trigger.getParameters().contractAddress).to.equal("0x4200000000000000000000000000000000000006");
|
|
116
|
+
expect((_a = trigger.getParentInfo()) === null || _a === void 0 ? void 0 : _a.name).to.equal("ON_CHAIN_PRICE_MOVEMENT");
|
|
117
|
+
expect(trigger.toJSON()).to.deep.equal(json);
|
|
118
|
+
}));
|
|
119
|
+
it('should create a trigger from JSON correctly - 2', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
120
|
+
var _b;
|
|
121
|
+
const json = {
|
|
122
|
+
"id": null,
|
|
123
|
+
"ref": "n-1",
|
|
124
|
+
"blockId": 1,
|
|
125
|
+
"type": "trigger",
|
|
126
|
+
"parameters": {
|
|
127
|
+
"chainId": 1,
|
|
128
|
+
"abi": {
|
|
129
|
+
"parameters": {
|
|
130
|
+
"from": null,
|
|
131
|
+
"value": "1000000n",
|
|
132
|
+
"to": "0xe1432599B51d9BE1b5A27E2A2FB8e5dF684749C6"
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"contractAddress": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
const trigger = yield Trigger.fromJSON(json);
|
|
139
|
+
expect(trigger.id).to.be.null;
|
|
140
|
+
expect(trigger.getRef()).to.equal("n-1");
|
|
141
|
+
expect(trigger.blockId).to.equal(1);
|
|
142
|
+
expect(trigger.getParameters().chainId).to.equal(1);
|
|
143
|
+
expect(trigger.getParameters().abi.parameters.from).to.be.null;
|
|
144
|
+
expect(trigger.getParameters().abi.parameters.value).to.equal(BigInt(1000000));
|
|
145
|
+
expect(trigger.getParameters().abi.parameters.to).to.equal("0xe1432599B51d9BE1b5A27E2A2FB8e5dF684749C6");
|
|
146
|
+
expect(trigger.getParameters().contractAddress).to.equal("0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48");
|
|
147
|
+
expect((_b = trigger.getParentInfo()) === null || _b === void 0 ? void 0 : _b.name).to.equal("ERC20");
|
|
148
|
+
expect(trigger.toJSON()).to.deep.equal(json);
|
|
149
|
+
}));
|
|
77
150
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -16,5 +16,6 @@ export interface NFTs {
|
|
|
16
16
|
[key: number]: NFT[];
|
|
17
17
|
}
|
|
18
18
|
export declare const NFTS: NFTs;
|
|
19
|
-
export declare function getToken(chain: number,
|
|
19
|
+
export declare function getToken(chain: number, contractAddress: string): Token;
|
|
20
|
+
export declare function getTokenFromSymbol(chain: number, symbol: string): Token;
|
|
20
21
|
export declare function getNFT(chain: number, name: string): NFT;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Parameter } from './Parameter.js';
|
|
2
|
-
import { Node, Position } from './Node.js';
|
|
2
|
+
import { Node, ParentInfo, Position } from './Node.js';
|
|
3
3
|
export declare class Action extends Node {
|
|
4
4
|
constructor(action: {
|
|
5
5
|
blockId: number;
|
|
@@ -9,5 +9,10 @@ export declare class Action extends Node {
|
|
|
9
9
|
image: string;
|
|
10
10
|
ref?: string;
|
|
11
11
|
position?: Position;
|
|
12
|
+
parentInfo?: ParentInfo;
|
|
12
13
|
});
|
|
14
|
+
getStaticParameters(): null;
|
|
15
|
+
static fromJSON(json: {
|
|
16
|
+
[key: string]: any;
|
|
17
|
+
}): Promise<Action>;
|
|
13
18
|
}
|
|
@@ -3,7 +3,12 @@ export interface Position {
|
|
|
3
3
|
x: number;
|
|
4
4
|
y: number;
|
|
5
5
|
}
|
|
6
|
-
export
|
|
6
|
+
export interface ParentInfo {
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
image: string;
|
|
10
|
+
}
|
|
11
|
+
export declare abstract class Node {
|
|
7
12
|
id: string | null;
|
|
8
13
|
blockId: number;
|
|
9
14
|
name: string;
|
|
@@ -18,6 +23,7 @@ export declare class Node {
|
|
|
18
23
|
ref: string;
|
|
19
24
|
class: string;
|
|
20
25
|
image: string;
|
|
26
|
+
parentInfo?: ParentInfo;
|
|
21
27
|
constructor(node: {
|
|
22
28
|
blockId: number;
|
|
23
29
|
name: string;
|
|
@@ -27,6 +33,7 @@ export declare class Node {
|
|
|
27
33
|
position?: Position;
|
|
28
34
|
class: string;
|
|
29
35
|
image: string;
|
|
36
|
+
parentInfo?: ParentInfo;
|
|
30
37
|
});
|
|
31
38
|
setId(id: string): void;
|
|
32
39
|
setChainId(value: number): void;
|
|
@@ -34,16 +41,20 @@ export declare class Node {
|
|
|
34
41
|
setParams(key: string, value: any): void;
|
|
35
42
|
setPosition(x: number, y: number): void;
|
|
36
43
|
getRef(): string;
|
|
44
|
+
getParentInfo(): ParentInfo | undefined;
|
|
37
45
|
protected setParameter(key: string, value: any): void;
|
|
38
46
|
getParameter(key: string): any;
|
|
39
47
|
getParameters(): {
|
|
40
48
|
[key: string]: any;
|
|
41
49
|
};
|
|
50
|
+
getStaticParameters(): {
|
|
51
|
+
[key: string]: any;
|
|
52
|
+
} | null;
|
|
42
53
|
toJSON(): {
|
|
43
54
|
[key: string]: any;
|
|
44
55
|
};
|
|
45
56
|
private getSimplifiedKey;
|
|
46
57
|
static fromJSON(json: {
|
|
47
58
|
[key: string]: any;
|
|
48
|
-
}): Node
|
|
59
|
+
}): Promise<Node>;
|
|
49
60
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { Node, ParentInfo, Position } from './Node.js';
|
|
1
2
|
import { Parameter } from './Parameter.js';
|
|
2
|
-
import { Node, Position } from './Node.js';
|
|
3
3
|
export declare class Trigger extends Node {
|
|
4
4
|
type: number;
|
|
5
5
|
constructor(trigger: {
|
|
@@ -11,9 +11,15 @@ export declare class Trigger extends Node {
|
|
|
11
11
|
image: string;
|
|
12
12
|
ref?: string;
|
|
13
13
|
position?: Position;
|
|
14
|
+
parentInfo?: ParentInfo;
|
|
14
15
|
});
|
|
15
16
|
private notAPollingTrigger;
|
|
16
17
|
setCondition(value: string): void;
|
|
17
18
|
setComparisonValue(value: number): void;
|
|
18
|
-
|
|
19
|
+
getStaticParameters(): {
|
|
20
|
+
interval: number;
|
|
21
|
+
} | null;
|
|
22
|
+
static fromJSON(json: {
|
|
23
|
+
[key: string]: any;
|
|
24
|
+
}): Promise<Trigger>;
|
|
19
25
|
}
|
|
@@ -21,6 +21,19 @@ export declare class Workflow {
|
|
|
21
21
|
[key: string]: any;
|
|
22
22
|
}[];
|
|
23
23
|
};
|
|
24
|
-
create(): Promise<
|
|
24
|
+
create(): Promise<{
|
|
25
|
+
success: boolean;
|
|
26
|
+
error?: undefined;
|
|
27
|
+
} | {
|
|
28
|
+
success: boolean;
|
|
29
|
+
error: any;
|
|
30
|
+
}>;
|
|
25
31
|
load(workflowId: string): Promise<Workflow>;
|
|
32
|
+
run(): Promise<{
|
|
33
|
+
success: boolean;
|
|
34
|
+
error?: undefined;
|
|
35
|
+
} | {
|
|
36
|
+
success: boolean;
|
|
37
|
+
error: any;
|
|
38
|
+
}>;
|
|
26
39
|
}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
declare class ApiServices {
|
|
2
2
|
private auth;
|
|
3
3
|
setAuth(auth: string): void;
|
|
4
|
-
post(url: string, data: any): Promise<any
|
|
4
|
+
post(url: string, data: any): Promise<import("axios").AxiosResponse<any, any>>;
|
|
5
5
|
get(url: string): Promise<any>;
|
|
6
|
+
generateLoginPayload(address: string, chainId: number): Promise<any>;
|
|
7
|
+
getToken(loginPayload: any, signature: string): Promise<{
|
|
8
|
+
token: any;
|
|
9
|
+
}>;
|
|
10
|
+
verifyToken(token: string): Promise<any>;
|
|
6
11
|
}
|
|
7
12
|
export declare const apiServices: ApiServices;
|
|
8
13
|
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare function validateType(expectedType: string, value: any): boolean;
|
|
2
|
+
export declare function typeIsNumber(type: string): boolean;
|
|
2
3
|
export declare function isAddress(value: string): boolean;
|
|
3
4
|
export declare function isValidUrl(value: string): boolean;
|
|
4
5
|
export declare function isValidPhoneNumber(value: string): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ACTIONS,
|
|
1
|
+
import { ACTIONS, getTokenFromSymbol, CHAINS, Action } from '../src/index.js';
|
|
2
2
|
|
|
3
3
|
const createAction = () => {
|
|
4
4
|
// Create an ERC20 transfer action
|
|
@@ -6,21 +6,21 @@ const createAction = () => {
|
|
|
6
6
|
transferAction.setChainId(CHAINS.ETHEREUM);
|
|
7
7
|
transferAction.setParams("value", 1000);
|
|
8
8
|
transferAction.setParams("to", "0xe1432599B51d9BE1b5A27E2A2FB8e5dF684749C6");
|
|
9
|
-
transferAction.setContractAddress(
|
|
9
|
+
transferAction.setContractAddress(getTokenFromSymbol(CHAINS.ETHEREUM, 'USDC').contractAddress);
|
|
10
10
|
|
|
11
|
-
console.log(transferAction.toJSON());
|
|
11
|
+
console.log(JSON.stringify(transferAction.toJSON()));
|
|
12
12
|
|
|
13
13
|
// Create an SMS notification action
|
|
14
14
|
const smsAction = new Action(ACTIONS.NOTIFICATIONS.DISCORD.SEND_MESSAGE);
|
|
15
|
-
smsAction.setParams("
|
|
16
|
-
smsAction.setParams("
|
|
15
|
+
smsAction.setParams("webhook", "https://url");
|
|
16
|
+
smsAction.setParams("message", "This is a test message");
|
|
17
17
|
|
|
18
18
|
console.log(smsAction.toJSON());
|
|
19
19
|
|
|
20
20
|
// Create a Slack notification action
|
|
21
21
|
const slackAction = new Action(ACTIONS.NOTIFICATIONS.SLACK.SEND_MESSAGE);
|
|
22
22
|
slackAction.setParams("webhook", "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX");
|
|
23
|
-
slackAction.setParams("
|
|
23
|
+
slackAction.setParams("message", "This is a test message");
|
|
24
24
|
|
|
25
25
|
console.log(slackAction.toJSON());
|
|
26
26
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TRIGGERS,
|
|
1
|
+
import { TRIGGERS, getTokenFromSymbol, TOKENS, CHAINS, Trigger } from '../src/index.js';
|
|
2
2
|
|
|
3
3
|
const generateDefaultTriggers = (): any[] => {
|
|
4
4
|
const triggersList: any[] = [];
|
|
@@ -11,7 +11,7 @@ const generateDefaultTriggers = (): any[] => {
|
|
|
11
11
|
triggerInstance.setChainId(CHAINS.ETHEREUM);
|
|
12
12
|
}
|
|
13
13
|
if (trigger.parameters.some((p: any) => p.key === "contractAddress")) {
|
|
14
|
-
triggerInstance.setContractAddress(
|
|
14
|
+
triggerInstance.setContractAddress(getTokenFromSymbol(CHAINS.ETHEREUM, 'USDC').contractAddress);
|
|
15
15
|
}
|
|
16
16
|
if (trigger.parameters.some((p: any) => p.key === "condition")) {
|
|
17
17
|
triggerInstance.setCondition('>');
|
|
@@ -19,9 +19,6 @@ const generateDefaultTriggers = (): any[] => {
|
|
|
19
19
|
if (trigger.parameters.some((p: any) => p.key === "comparisonValue")) {
|
|
20
20
|
triggerInstance.setComparisonValue(1000);
|
|
21
21
|
}
|
|
22
|
-
if (trigger.parameters.some((p: any) => p.key === "interval")) {
|
|
23
|
-
triggerInstance.setInterval(60000); // 1 minute interval
|
|
24
|
-
}
|
|
25
22
|
if (trigger.parameters.some((p: any) => p.key === "abiParams.account")) {
|
|
26
23
|
triggerInstance.setParams('account', '0xe1432599B51d9BE1b5A27E2A2FB8e5dF684749C6');
|
|
27
24
|
}
|
|
@@ -66,7 +63,6 @@ function generateTriggersForAllTokens(chain: number) {
|
|
|
66
63
|
balanceTrigger.setContractAddress(token.contractAddress);
|
|
67
64
|
balanceTrigger.setCondition(">");
|
|
68
65
|
balanceTrigger.setComparisonValue(10);
|
|
69
|
-
balanceTrigger.setInterval(5000);
|
|
70
66
|
triggersList.push(balanceTrigger);
|
|
71
67
|
});
|
|
72
68
|
|
|
@@ -79,15 +75,14 @@ const generateSpecificTriggers = (): any[] => {
|
|
|
79
75
|
transferTrigger.setChainId(CHAINS.ETHEREUM);
|
|
80
76
|
transferTrigger.setParams("value", 1000);
|
|
81
77
|
transferTrigger.setParams("to", "0xe1432599B51d9BE1b5A27E2A2FB8e5dF684749C6");
|
|
82
|
-
transferTrigger.setContractAddress(
|
|
78
|
+
transferTrigger.setContractAddress(getTokenFromSymbol(CHAINS.ETHEREUM, 'USDC').contractAddress);
|
|
83
79
|
|
|
84
80
|
const balanceTrigger = new Trigger(TRIGGERS.TOKENS.ERC20.BALANCE);
|
|
85
81
|
balanceTrigger.setChainId(CHAINS.ETHEREUM);
|
|
86
82
|
balanceTrigger.setParams("account", "0xe1432599B51d9BE1b5A27E2A2FB8e5dF684749C6");
|
|
87
|
-
balanceTrigger.setContractAddress(
|
|
83
|
+
balanceTrigger.setContractAddress(getTokenFromSymbol(CHAINS.ETHEREUM, 'USDC').contractAddress);
|
|
88
84
|
balanceTrigger.setCondition(">");
|
|
89
85
|
balanceTrigger.setComparisonValue(45000);
|
|
90
|
-
balanceTrigger.setInterval(5000);
|
|
91
86
|
|
|
92
87
|
const spliceFiSwapTrigger = new Trigger(TRIGGERS.YIELD.SPLICE_FI.SWAP);
|
|
93
88
|
spliceFiSwapTrigger.setParams("caller", "0xe1432599B51d9BE1b5A27E2A2FB8e5dF684749C6");
|
|
@@ -156,4 +151,4 @@ const triggersList = [
|
|
|
156
151
|
...generateSpecificTriggers()
|
|
157
152
|
];
|
|
158
153
|
|
|
159
|
-
console.log(
|
|
154
|
+
console.log(triggersList);
|
|
@@ -1,12 +1,19 @@
|
|
|
1
|
-
import { TRIGGERS, getToken, CHAINS, Trigger } from '../src/index.js';
|
|
1
|
+
import { TRIGGERS, getToken, CHAINS, Trigger, getTokenFromSymbol, convertToTokenUnits } from '../src/index.js';
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
const main = async () => {
|
|
4
5
|
|
|
5
|
-
const transferTrigger = new Trigger(TRIGGERS.TOKENS.ERC20.TRANSFER);
|
|
6
|
+
const transferTrigger = new Trigger(TRIGGERS.TOKENS.ERC20.TRANSFER);
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
transferTrigger.setParams("to", "0xe1432599B51d9BE1b5A27E2A2FB8e5dF684749C6");
|
|
10
|
-
transferTrigger.setContractAddress(getToken(CHAINS.ETHEREUM, 'USDC').contractAddress);
|
|
8
|
+
const contractAddr = getTokenFromSymbol(CHAINS.ETHEREUM, 'USDC').contractAddress;
|
|
9
|
+
console.log(contractAddr);
|
|
11
10
|
|
|
12
|
-
|
|
11
|
+
transferTrigger.setChainId(CHAINS.ETHEREUM);
|
|
12
|
+
transferTrigger.setParams("value", await convertToTokenUnits(1, CHAINS.ETHEREUM, contractAddr));
|
|
13
|
+
transferTrigger.setParams("to", "0xe1432599B51d9BE1b5A27E2A2FB8e5dF684749C6");
|
|
14
|
+
transferTrigger.setContractAddress(contractAddr);
|
|
15
|
+
|
|
16
|
+
console.log(JSON.stringify(transferTrigger.toJSON()));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
main();
|
|
@@ -1,41 +1,59 @@
|
|
|
1
|
-
import { ACTIONS, Action, TRIGGERS, Trigger, Workflow, CHAINS,
|
|
1
|
+
import { ACTIONS, Action, TRIGGERS, Trigger, Workflow, CHAINS, getTokenFromSymbol, Edge, apiServices, convertToTokenUnits } from '../src/index.js';
|
|
2
2
|
|
|
3
3
|
const main = async () => {
|
|
4
|
-
|
|
5
4
|
apiServices.setAuth("eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiIweDdjRUI4ZDgxNDdBYWE5ZEI4MUFjQkRGRTVjMzA1MERGQ2ZGMTg1MzciLCJzdWIiOiIweDg3RkU4YjRmMkZlODM3MGY2Y0M5YTk2MzQ0MmYwN0IwMmY0OTA5QTciLCJhdWQiOiJvdG9tYXRvLXRlc3QubmV0bGlmeS5hcHAiLCJleHAiOjE3MjMzODMxOTksIm5iZiI6MTcyMDc4OTM5OSwiaWF0IjoxNzIwNzkxMTk5LCJqdGkiOiIweDY4ZDkxOWEyMGZiYjIyNDUwZDZmOTFjMzM2ZTBmYjBjMmYyYTc3MmU3Zjg4NWU1ZjRmNzg1NTM2ZGIyYTY5YTAiLCJjdHgiOnt9fQ.MHgyOTM1NTM3MWYwOWM1YzllNWE3YjI4MjVkZTNjMDljZTkwMTQ3OTQwZmU1ZWRlMjM5YTk0MmFjYTQ5YTcwZWI0MGJlNmJiZDk2MDA4ZTIxMzJmNGM3ZTVlZGIzZDZiZjYyMDE4Mzc1MzUwMTRmNTc0ODM0ZDk4YWU3NDQwNDQzOTFi");
|
|
6
5
|
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
ref: 'n-1',
|
|
15
|
-
});
|
|
16
|
-
usdcTransferTrigger.setChainId(CHAINS.ETHEREUM);
|
|
17
|
-
usdcTransferTrigger.setContractAddress(getToken(CHAINS.ETHEREUM, 'USDC').contractAddress);
|
|
18
|
-
usdcTransferTrigger.setPosition(0, 0);
|
|
6
|
+
const trigger = new Trigger(TRIGGERS.PRICE_ACTION.ON_CHAIN_PRICE_MOVEMENT.PRICE_MOVEMENT_AGAINST_CURRENCY);
|
|
7
|
+
trigger.setChainId(CHAINS.MODE);
|
|
8
|
+
trigger.setComparisonValue(3000);
|
|
9
|
+
trigger.setCondition('gte');
|
|
10
|
+
trigger.setParams('currency', 'USD');
|
|
11
|
+
trigger.setContractAddress(getTokenFromSymbol(CHAINS.MODE, 'WETH').contractAddress);
|
|
12
|
+
trigger.setPosition(0, 0);
|
|
19
13
|
|
|
20
14
|
const slackAction = new Action(ACTIONS.NOTIFICATIONS.SLACK.SEND_MESSAGE);
|
|
21
|
-
slackAction.setParams("webhook", "https://hooks.slack.com/services/
|
|
22
|
-
slackAction.setParams("message", "
|
|
15
|
+
slackAction.setParams("webhook", "https://hooks.slack.com/services/REPLACE_WITH_YOUR_DATA");
|
|
16
|
+
slackAction.setParams("message", "Notification from the SDK");
|
|
23
17
|
slackAction.setPosition(0, -10);
|
|
24
18
|
|
|
25
|
-
const
|
|
19
|
+
const transferAction = new Action(ACTIONS.TOKENS.ERC20.TRANSFER);
|
|
20
|
+
transferAction.setChainId(CHAINS.ETHEREUM);
|
|
21
|
+
transferAction.setParams("value", 1000);
|
|
22
|
+
transferAction.setParams("to", "0xe1432599B51d9BE1b5A27E2A2FB8e5dF684749C6");
|
|
23
|
+
transferAction.setContractAddress(getTokenFromSymbol(CHAINS.ETHEREUM, 'USDC').contractAddress);
|
|
24
|
+
|
|
25
|
+
const workflow = new Workflow("test from SDK", [trigger, slackAction, transferAction]);
|
|
26
26
|
|
|
27
27
|
const edge = new Edge({
|
|
28
|
-
source:
|
|
28
|
+
source: trigger,
|
|
29
29
|
target: slackAction,
|
|
30
30
|
});
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
console.log(`Workflow ID: ${workflow.id}`); // This will print the ID of the created workflow
|
|
36
|
-
workflow.nodes.forEach(node => {
|
|
37
|
-
console.log(`Node ${node.getRef()} ID: ${node.id}`);
|
|
32
|
+
const edge2 = new Edge({
|
|
33
|
+
source: slackAction,
|
|
34
|
+
target: transferAction,
|
|
38
35
|
});
|
|
36
|
+
|
|
37
|
+
workflow.addEdge(edge);
|
|
38
|
+
workflow.addEdge(edge2);
|
|
39
|
+
|
|
40
|
+
console.log(JSON.stringify(workflow.toJSON()))
|
|
41
|
+
|
|
42
|
+
const creationResult = await workflow.create();
|
|
43
|
+
|
|
44
|
+
if (!creationResult.success) {
|
|
45
|
+
throw new Error("An error occurred when publishing the workflow")
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
console.log(workflow.id);
|
|
49
|
+
|
|
50
|
+
const runResult = await workflow.run();
|
|
51
|
+
|
|
52
|
+
if (!runResult.success) {
|
|
53
|
+
throw new Error("An error occurred when running the workflow")
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
console.log(`Workflow ${workflow.id} is running`);
|
|
39
57
|
}
|
|
40
58
|
|
|
41
|
-
main();
|
|
59
|
+
main();
|
|
@@ -4,7 +4,7 @@ const main = async () => {
|
|
|
4
4
|
|
|
5
5
|
apiServices.setAuth("eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiIweDdjRUI4ZDgxNDdBYWE5ZEI4MUFjQkRGRTVjMzA1MERGQ2ZGMTg1MzciLCJzdWIiOiIweDg3RkU4YjRmMkZlODM3MGY2Y0M5YTk2MzQ0MmYwN0IwMmY0OTA5QTciLCJhdWQiOiJvdG9tYXRvLXRlc3QubmV0bGlmeS5hcHAiLCJleHAiOjE3MjMzODMxOTksIm5iZiI6MTcyMDc4OTM5OSwiaWF0IjoxNzIwNzkxMTk5LCJqdGkiOiIweDY4ZDkxOWEyMGZiYjIyNDUwZDZmOTFjMzM2ZTBmYjBjMmYyYTc3MmU3Zjg4NWU1ZjRmNzg1NTM2ZGIyYTY5YTAiLCJjdHgiOnt9fQ.MHgyOTM1NTM3MWYwOWM1YzllNWE3YjI4MjVkZTNjMDljZTkwMTQ3OTQwZmU1ZWRlMjM5YTk0MmFjYTQ5YTcwZWI0MGJlNmJiZDk2MDA4ZTIxMzJmNGM3ZTVlZGIzZDZiZjYyMDE4Mzc1MzUwMTRmNTc0ODM0ZDk4YWU3NDQwNDQzOTFi");
|
|
6
6
|
const workflow = await new Workflow().load("0b9bd533-339c-42b5-9ed3-a6a40fcfa8d3");
|
|
7
|
-
console.log(workflow)
|
|
7
|
+
console.log(JSON.stringify(workflow.nodes[1]))
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
main();
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CHAINS, apiServices } from '../src/index.js';
|
|
2
|
+
|
|
3
|
+
const main = async () => {
|
|
4
|
+
const address = "0x9b1E25bBbee162A26B67B1fb00cf4d67157656F6"
|
|
5
|
+
let payload = await apiServices.generateLoginPayload(address, CHAINS.ETHEREUM);
|
|
6
|
+
|
|
7
|
+
// we replace the payload to fit the signature, don't do that in your implementation
|
|
8
|
+
const signature = '0x92a3b551ff2bc2eb9a3537a0b477af14c33e649c3479c204bb0a4da95bfee89e4ae966e5d555d34c5dfcf3899910c58e936375634f5b0f58978139d25b5b54761b';
|
|
9
|
+
payload = {
|
|
10
|
+
address: '0x9b1E25bBbee162A26B67B1fb00cf4d67157656F6',
|
|
11
|
+
chain_id: '1',
|
|
12
|
+
domain: 'otomato-test.netlify.app',
|
|
13
|
+
expiration_time: '2024-07-16T16:57:34.363Z',
|
|
14
|
+
invalid_before: '2024-07-16T15:57:34.363Z',
|
|
15
|
+
issued_at: '2024-07-16T16:27:34.363Z',
|
|
16
|
+
nonce: '0x4ed46b76a2ccb458bc84bfc3f8aeb43bbc6a2b2f1ae5ee9f10c13ba6bd05f832',
|
|
17
|
+
statement: 'Please ensure that the domain above matches the URL of the current website.',
|
|
18
|
+
version: '1'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const { token } = await apiServices.getToken(payload, signature);
|
|
22
|
+
const verify = await apiServices.verifyToken(token);
|
|
23
|
+
console.log(token)
|
|
24
|
+
console.log(verify)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
main();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "otomato-sdk",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.5",
|
|
4
4
|
"description": "An SDK for building and managing automations on Otomato",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"types": "dist/types/src/index.d.ts",
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@types/axios": "^0.14.0",
|
|
25
25
|
"@types/chai": "^4.3.16",
|
|
26
|
+
"@types/jsonwebtoken": "^9.0.6",
|
|
26
27
|
"@types/mocha": "^10.0.6",
|
|
27
28
|
"@types/node": "^20.14.2",
|
|
28
29
|
"chai": "^5.1.1",
|
|
@@ -32,6 +33,7 @@
|
|
|
32
33
|
},
|
|
33
34
|
"dependencies": {
|
|
34
35
|
"axios": "^1.7.2",
|
|
35
|
-
"ethers": "^6.13.
|
|
36
|
+
"ethers": "^6.13.1",
|
|
37
|
+
"jsonwebtoken": "^9.0.2"
|
|
36
38
|
}
|
|
37
39
|
}
|
package/src/constants/Blocks.ts
CHANGED
|
@@ -97,7 +97,7 @@ export const TRIGGERS = {
|
|
|
97
97
|
"SPLICE_FI": {
|
|
98
98
|
"description": "Split any yield-bearing asset into separate yield and principal components",
|
|
99
99
|
"chains": [
|
|
100
|
-
|
|
100
|
+
34443
|
|
101
101
|
],
|
|
102
102
|
"image": "https://otomato-sdk-images.s3.eu-west-1.amazonaws.com/splicefi.png",
|
|
103
103
|
"SWAP": {
|
|
@@ -248,7 +248,7 @@ export const TRIGGERS = {
|
|
|
248
248
|
"ASTARIA": {
|
|
249
249
|
"description": "Astaria is an oracle-less, intent-based, fixed-rate lending protocol supporting unlimited loan durations for any asset",
|
|
250
250
|
"chains": [
|
|
251
|
-
|
|
251
|
+
34443
|
|
252
252
|
],
|
|
253
253
|
"image": "https://otomato-sdk-images.s3.eu-west-1.amazonaws.com/astaria.png",
|
|
254
254
|
"LEND_RECALLED": {
|
|
@@ -282,7 +282,7 @@ export const TRIGGERS = {
|
|
|
282
282
|
"ODOS": {
|
|
283
283
|
"description": "Smart Order Routing across multiple blockchain protocols, 700+ Liquidity Sources and thousands of token pairs, delivering ultimate savings to users",
|
|
284
284
|
"chains": [
|
|
285
|
-
|
|
285
|
+
34443,
|
|
286
286
|
1
|
|
287
287
|
],
|
|
288
288
|
"image": "https://otomato-sdk-images.s3.eu-west-1.amazonaws.com/odos.jpg",
|
|
@@ -333,7 +333,7 @@ export const TRIGGERS = {
|
|
|
333
333
|
"MODE_NAME_SERVICE": {
|
|
334
334
|
"description": "Next generation of Mode Mainnet Domains",
|
|
335
335
|
"chains": [
|
|
336
|
-
|
|
336
|
+
34443
|
|
337
337
|
],
|
|
338
338
|
"image": "https://otomato-sdk-images.s3.eu-west-1.amazonaws.com/modens.png",
|
|
339
339
|
"NAME_REGISTERED": {
|
package/src/constants/chains.ts
CHANGED