@sentio/sdk 1.16.4 → 1.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/aptos-processor.d.ts +21 -0
- package/lib/aptos-processor.js +65 -0
- package/lib/aptos-processor.js.map +1 -0
- package/lib/bind-options.d.ts +2 -0
- package/lib/bind-options.js +4 -1
- package/lib/bind-options.js.map +1 -1
- package/lib/builtin/eacaggregatorproxy/index.d.ts +2 -0
- package/lib/builtin/eacaggregatorproxy/index.js +22 -0
- package/lib/builtin/eacaggregatorproxy/index.js.map +1 -0
- package/lib/builtin/eacaggregatorproxy/test-utils.d.ts +6 -0
- package/lib/builtin/eacaggregatorproxy/test-utils.js +57 -0
- package/lib/builtin/eacaggregatorproxy/test-utils.js.map +1 -0
- package/lib/builtin/internal/EACAggregatorProxy.d.ts +460 -0
- package/lib/builtin/internal/EACAggregatorProxy.js +3 -0
- package/lib/builtin/internal/EACAggregatorProxy.js.map +1 -0
- package/lib/builtin/internal/eacaggregatorproxy_processor.d.ts +317 -0
- package/lib/builtin/internal/eacaggregatorproxy_processor.js +813 -0
- package/lib/builtin/internal/eacaggregatorproxy_processor.js.map +1 -0
- package/lib/builtin/internal/factories/EACAggregatorProxy__factory.d.ts +46 -0
- package/lib/builtin/internal/factories/EACAggregatorProxy__factory.js +527 -0
- package/lib/builtin/internal/factories/EACAggregatorProxy__factory.js.map +1 -0
- package/lib/builtin/internal/factories/index.d.ts +1 -0
- package/lib/builtin/internal/factories/index.js +3 -1
- package/lib/builtin/internal/factories/index.js.map +1 -1
- package/lib/builtin/internal/index.d.ts +2 -0
- package/lib/builtin/internal/index.js +3 -1
- package/lib/builtin/internal/index.js.map +1 -1
- package/lib/context.d.ts +5 -0
- package/lib/context.js +15 -3
- package/lib/context.js.map +1 -1
- package/lib/gen/processor/protos/processor.d.ts +2 -0
- package/lib/gen/processor/protos/processor.js +19 -0
- package/lib/gen/processor/protos/processor.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js +4 -1
- package/lib/index.js.map +1 -1
- package/lib/meter.js +17 -0
- package/lib/meter.js.map +1 -1
- package/lib/processor-state.d.ts +2 -0
- package/lib/processor-state.js +1 -0
- package/lib/processor-state.js.map +1 -1
- package/lib/service.js +47 -0
- package/lib/service.js.map +1 -1
- package/lib/solana/builtin/spl-token-processor.d.ts +16 -1
- package/lib/solana/builtin/spl-token-processor.js +120 -0
- package/lib/solana/builtin/spl-token-processor.js.map +1 -1
- package/lib/solana/builtin/types.d.ts +97 -0
- package/lib/solana/builtin/types.js.map +1 -1
- package/lib/test/{mirrorworld.d.ts → aptos.test.d.ts} +0 -0
- package/lib/test/aptos.test.js +142 -0
- package/lib/test/aptos.test.js.map +1 -0
- package/lib/test/erc20.js.map +1 -1
- package/lib/test/erc20.test.js.map +1 -1
- package/lib/test/solana.test.js +1 -17
- package/lib/test/solana.test.js.map +1 -1
- package/lib/test/souffl3.d.ts +1 -0
- package/lib/test/souffl3.js +24 -0
- package/lib/test/souffl3.js.map +1 -0
- package/lib/test/test-provider.d.ts +1 -1
- package/lib/test/test-provider.js +11 -5
- package/lib/test/test-provider.js.map +1 -1
- package/lib/test/types/{game_wallet.d.ts → basic_1.d.ts} +2 -21
- package/lib/test/types/basic_1.js +66 -0
- package/lib/test/types/basic_1.js.map +1 -0
- package/lib/test/types/basic_1_processor.d.ts +13 -0
- package/lib/test/types/basic_1_processor.js +41 -0
- package/lib/test/types/basic_1_processor.js.map +1 -0
- package/lib/utils/chainlink-oracles-goerli.csv +8 -0
- package/lib/utils/chainlink-oracles.csv +217 -0
- package/lib/utils/dex-price.d.ts +22 -0
- package/lib/utils/dex-price.js +114 -0
- package/lib/utils/dex-price.js.map +1 -0
- package/lib/utils/dex-price.test.d.ts +1 -0
- package/lib/utils/dex-price.test.js +22 -0
- package/lib/utils/dex-price.test.js.map +1 -0
- package/lib/utils/erc20.d.ts +1 -0
- package/lib/utils/erc20.js +7 -3
- package/lib/utils/erc20.js.map +1 -1
- package/lib/utils/index.d.ts +3 -1
- package/lib/utils/index.js +6 -1
- package/lib/utils/index.js.map +1 -1
- package/package.json +3 -3
- package/src/abis/EACAggregatorProxy.json +227 -0
- package/src/aptos-processor.ts +75 -0
- package/src/bind-options.ts +1 -0
- package/src/builtin/eacaggregatorproxy/index.ts +6 -0
- package/src/builtin/eacaggregatorproxy/test-utils.ts +89 -0
- package/src/builtin/internal/EACAggregatorProxy.ts +861 -0
- package/src/builtin/internal/eacaggregatorproxy_processor.ts +1417 -0
- package/src/builtin/internal/factories/EACAggregatorProxy__factory.ts +533 -0
- package/src/builtin/internal/factories/index.ts +1 -0
- package/src/builtin/internal/index.ts +2 -0
- package/src/context.ts +15 -2
- package/src/gen/processor/protos/processor.ts +20 -0
- package/src/index.ts +2 -1
- package/src/meter.ts +18 -2
- package/src/processor-state.ts +3 -0
- package/src/service.ts +51 -0
- package/src/solana/builtin/spl-token-processor.ts +137 -1
- package/src/solana/builtin/types.ts +11 -0
- package/src/test/abis/solana/basic_1.json +62 -0
- package/src/test/aptos.test.ts +148 -0
- package/src/test/erc20.test.ts +1 -1
- package/src/test/erc20.ts +0 -1
- package/src/test/solana.test.ts +1 -18
- package/src/test/souffl3.ts +24 -0
- package/src/test/test-provider.ts +11 -5
- package/src/test/types/basic_1.ts +62 -0
- package/src/test/types/basic_1_processor.ts +41 -0
- package/src/utils/chainlink-oracles-goerli.csv +8 -0
- package/src/utils/chainlink-oracles.csv +217 -0
- package/src/utils/dex-price.test.ts +24 -0
- package/src/utils/dex-price.ts +136 -0
- package/src/utils/erc20.ts +5 -1
- package/src/utils/index.ts +3 -1
- package/lib/test/mirrorworld.js +0 -42
- package/lib/test/mirrorworld.js.map +0 -1
- package/lib/test/types/game_wallet.js +0 -1396
- package/lib/test/types/game_wallet.js.map +0 -1
- package/lib/test/types/game_wallet_processor.d.ts +0 -107
- package/lib/test/types/game_wallet_processor.js +0 -105
- package/lib/test/types/game_wallet_processor.js.map +0 -1
- package/src/test/abis/solana/mirrorworld.json +0 -1392
- package/src/test/mirrorworld.ts +0 -40
- package/src/test/types/game_wallet.ts +0 -1392
- package/src/test/types/game_wallet_processor.ts +0 -113
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-provider.js","sourceRoot":"","sources":["../../src/test/test-provider.ts"],"names":[],"mappings":";;;AACA,qCAAyC;
|
|
1
|
+
{"version":3,"file":"test-provider.js","sourceRoot":"","sources":["../../src/test/test-provider.ts"],"names":[],"mappings":";;;AACA,qCAAyC;AACzC,gDAA6C;AAE7C,SAAgB,wBAAwB,CAAC,gBAAmC;IAC1E,MAAM,WAAW,GAAgC,EAAE,CAAA;IAEnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;QACpC,gBAAgB,GAAG,CAAC,gBAAgB,CAAC,CAAA;KACtC;IAED,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,oBAAS,CAAC,EAAE;QACtC,MAAM,MAAM,GAAG,gBAAgB,GAAG,CAAC,CAAA;QACnC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAChC,IAAI,CAAC,IAAI,EAAE;YACT,SAAQ;SACT;QACD,WAAW,CAAC,CAAC,CAAC,GAAG;YACf,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,CAAC,IAAI,CAAC;SACd,CAAA;KACF;IAED,IAAA,iBAAW,EAAC,WAAW,CAAC,CAAA;IACxB,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE;QACjC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YAClC,OAAO,KAAK,CAAA;SACb;KACF;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AA1BD,4DA0BC","sourcesContent":["import { ChainConfig } from '../chain-config'\nimport { setProvider } from '@sentio/sdk'\nimport { CHAIN_MAP } from '../utils/chainmap'\n\nexport function loadTestProvidersFromEnv(requiredChainIds: string[] | string): boolean {\n const dummyConfig: Record<string, ChainConfig> = {}\n\n if (!Array.isArray(requiredChainIds)) {\n requiredChainIds = [requiredChainIds]\n }\n\n for (const k of Object.keys(CHAIN_MAP)) {\n const envKey = 'TEST_ENDPOINT_' + k\n const http = process.env[envKey]\n if (!http) {\n continue\n }\n dummyConfig[k] = {\n ChainID: k,\n Https: [http],\n }\n }\n\n setProvider(dummyConfig)\n for (const id of requiredChainIds) {\n if (!requiredChainIds.includes(id)) {\n return false\n }\n }\n return true\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const
|
|
1
|
+
export declare const basic_1_idl: {
|
|
2
2
|
version: string;
|
|
3
3
|
name: string;
|
|
4
4
|
instructions: {
|
|
@@ -17,29 +17,10 @@ export declare const game_wallet_idl: {
|
|
|
17
17
|
name: string;
|
|
18
18
|
type: {
|
|
19
19
|
kind: string;
|
|
20
|
-
fields:
|
|
20
|
+
fields: {
|
|
21
21
|
name: string;
|
|
22
22
|
type: string;
|
|
23
|
-
} | {
|
|
24
|
-
name: string;
|
|
25
|
-
type: {
|
|
26
|
-
defined: string;
|
|
27
|
-
};
|
|
28
|
-
})[];
|
|
29
|
-
};
|
|
30
|
-
}[];
|
|
31
|
-
types: {
|
|
32
|
-
name: string;
|
|
33
|
-
type: {
|
|
34
|
-
kind: string;
|
|
35
|
-
variants: {
|
|
36
|
-
name: string;
|
|
37
23
|
}[];
|
|
38
24
|
};
|
|
39
25
|
}[];
|
|
40
|
-
errors: {
|
|
41
|
-
code: number;
|
|
42
|
-
name: string;
|
|
43
|
-
msg: string;
|
|
44
|
-
}[];
|
|
45
26
|
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.basic_1_idl = void 0;
|
|
4
|
+
exports.basic_1_idl = {
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"name": "basic_1",
|
|
7
|
+
"instructions": [
|
|
8
|
+
{
|
|
9
|
+
"name": "initialize",
|
|
10
|
+
"accounts": [
|
|
11
|
+
{
|
|
12
|
+
"name": "myAccount",
|
|
13
|
+
"isMut": true,
|
|
14
|
+
"isSigner": true
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "user",
|
|
18
|
+
"isMut": true,
|
|
19
|
+
"isSigner": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"name": "systemProgram",
|
|
23
|
+
"isMut": false,
|
|
24
|
+
"isSigner": false
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"args": [
|
|
28
|
+
{
|
|
29
|
+
"name": "data",
|
|
30
|
+
"type": "u64"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "update",
|
|
36
|
+
"accounts": [
|
|
37
|
+
{
|
|
38
|
+
"name": "myAccount",
|
|
39
|
+
"isMut": true,
|
|
40
|
+
"isSigner": false
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"args": [
|
|
44
|
+
{
|
|
45
|
+
"name": "data",
|
|
46
|
+
"type": "u64"
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
],
|
|
51
|
+
"accounts": [
|
|
52
|
+
{
|
|
53
|
+
"name": "MyAccount",
|
|
54
|
+
"type": {
|
|
55
|
+
"kind": "struct",
|
|
56
|
+
"fields": [
|
|
57
|
+
{
|
|
58
|
+
"name": "data",
|
|
59
|
+
"type": "u64"
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=basic_1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basic_1.js","sourceRoot":"","sources":["../../../src/test/types/basic_1.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG;IACzB,SAAS,EAAE,OAAO;IAClB,MAAM,EAAE,SAAS;IACjB,cAAc,EAAE;QACd;YACE,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE;gBACV;oBACE,MAAM,EAAE,WAAW;oBACnB,OAAO,EAAE,IAAI;oBACb,UAAU,EAAE,IAAI;iBACjB;gBACD;oBACE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,IAAI;oBACb,UAAU,EAAE,IAAI;iBACjB;gBACD;oBACE,MAAM,EAAE,eAAe;oBACvB,OAAO,EAAE,KAAK;oBACd,UAAU,EAAE,KAAK;iBAClB;aACF;YACD,MAAM,EAAE;gBACN;oBACE,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,KAAK;iBACd;aACF;SACF;QACD;YACE,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE;gBACV;oBACE,MAAM,EAAE,WAAW;oBACnB,OAAO,EAAE,IAAI;oBACb,UAAU,EAAE,KAAK;iBAClB;aACF;YACD,MAAM,EAAE;gBACN;oBACE,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,KAAK;iBACd;aACF;SACF;KACF;IACD,UAAU,EAAE;QACV;YACE,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE;gBACN,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE;oBACR;wBACE,MAAM,EAAE,MAAM;wBACd,MAAM,EAAE,KAAK;qBACd;iBACF;aACF;SACF;KACF;CACF,CAAA","sourcesContent":["export const basic_1_idl = {\n \"version\": \"0.1.0\",\n \"name\": \"basic_1\",\n \"instructions\": [\n {\n \"name\": \"initialize\",\n \"accounts\": [\n {\n \"name\": \"myAccount\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"user\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"data\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"update\",\n \"accounts\": [\n {\n \"name\": \"myAccount\",\n \"isMut\": true,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"data\",\n \"type\": \"u64\"\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"MyAccount\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"data\",\n \"type\": \"u64\"\n }\n ]\n }\n }\n ]\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/// <reference types="bn.js" />
|
|
2
|
+
import { Instruction, BN } from '@project-serum/anchor';
|
|
3
|
+
import { SolanaBaseProcessor, SolanaContext, SolanaBindOptions } from "@sentio/sdk";
|
|
4
|
+
export declare class Basic1Processor extends SolanaBaseProcessor {
|
|
5
|
+
static bind(options: SolanaBindOptions): Basic1Processor;
|
|
6
|
+
decodeInstruction: (rawInstruction: string) => Instruction | null;
|
|
7
|
+
onInitialize(handler: (args: {
|
|
8
|
+
data: BN;
|
|
9
|
+
}, ctx: SolanaContext) => void): Basic1Processor;
|
|
10
|
+
onUpdate(handler: (args: {
|
|
11
|
+
data: BN;
|
|
12
|
+
}, ctx: SolanaContext) => void): Basic1Processor;
|
|
13
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Basic1Processor = void 0;
|
|
7
|
+
const anchor_1 = require("@project-serum/anchor");
|
|
8
|
+
const sdk_1 = require("@sentio/sdk");
|
|
9
|
+
const basic_1_1 = require("./basic_1");
|
|
10
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
11
|
+
class Basic1Processor extends sdk_1.SolanaBaseProcessor {
|
|
12
|
+
static bind(options) {
|
|
13
|
+
if (options && !options.name) {
|
|
14
|
+
options.name = 'Basic1';
|
|
15
|
+
}
|
|
16
|
+
return new Basic1Processor(options);
|
|
17
|
+
}
|
|
18
|
+
decodeInstruction = (rawInstruction) => {
|
|
19
|
+
const instructionCoder = new anchor_1.BorshInstructionCoder(basic_1_1.basic_1_idl);
|
|
20
|
+
const decodedIns = instructionCoder.decode(Buffer.from(bs58_1.default.decode(rawInstruction)));
|
|
21
|
+
return decodedIns;
|
|
22
|
+
};
|
|
23
|
+
onInitialize(handler) {
|
|
24
|
+
this.onInstruction('initialize', (ins, ctx) => {
|
|
25
|
+
if (ins) {
|
|
26
|
+
handler(ins.data, ctx);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
onUpdate(handler) {
|
|
32
|
+
this.onInstruction('update', (ins, ctx) => {
|
|
33
|
+
if (ins) {
|
|
34
|
+
handler(ins.data, ctx);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.Basic1Processor = Basic1Processor;
|
|
41
|
+
//# sourceMappingURL=basic_1_processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basic_1_processor.js","sourceRoot":"","sources":["../../../src/test/types/basic_1_processor.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAmF;AACnF,qCAAmF;AACnF,uCAAuC;AACvC,gDAAuB;AAGvB,MAAa,eAAgB,SAAQ,yBAAmB;IACtD,MAAM,CAAC,IAAI,CAAC,OAA0B;QACpC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAC5B,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAA;SACxB;QACD,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;IACrC,CAAC;IAED,iBAAiB,GAAmD,CAAC,cAAc,EAAE,EAAE;QACrF,MAAM,gBAAgB,GAAG,IAAI,8BAAqB,CAAC,qBAAkB,CAAC,CAAA;QACtE,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;QACpF,OAAO,UAAU,CAAA;IACnB,CAAC,CAAA;IAGD,YAAY,CAAC,OAAyD;QACpE,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;YACzD,IAAI,GAAG,EAAE;gBACP,OAAO,CAAC,GAAG,CAAC,IAAoB,EAAE,GAAG,CAAC,CAAA;aACvC;QACH,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,QAAQ,CAAC,OAAyD;QAChE,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;YACrD,IAAI,GAAG,EAAE;gBACP,OAAO,CAAC,GAAG,CAAC,IAAoB,EAAE,GAAG,CAAC,CAAA;aACvC;QACH,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;CAEF;AAjCD,0CAiCC","sourcesContent":["import { BorshInstructionCoder, Instruction, Idl, BN } from '@project-serum/anchor'\nimport { SolanaBaseProcessor, SolanaContext, SolanaBindOptions } from \"@sentio/sdk\"\nimport { basic_1_idl } from \"./basic_1\"\nimport bs58 from 'bs58'\nimport { PublicKey } from '@solana/web3.js'\n\nexport class Basic1Processor extends SolanaBaseProcessor {\n static bind(options: SolanaBindOptions): Basic1Processor {\n if (options && !options.name) {\n options.name = 'Basic1'\n }\n return new Basic1Processor(options)\n }\n\n decodeInstruction: (rawInstruction: string) => Instruction | null = (rawInstruction) => {\n const instructionCoder = new BorshInstructionCoder(basic_1_idl as Idl)\n const decodedIns = instructionCoder.decode(Buffer.from(bs58.decode(rawInstruction)))\n return decodedIns\n }\n\n \n onInitialize(handler: (args: { data: BN }, ctx: SolanaContext) => void): Basic1Processor {\n this.onInstruction('initialize', (ins: Instruction, ctx) => {\n if (ins) {\n handler(ins.data as { data: BN }, ctx)\n }\n })\n return this\n }\n \n onUpdate(handler: (args: { data: BN }, ctx: SolanaContext) => void): Basic1Processor {\n this.onInstruction('update', (ins: Instruction, ctx) => {\n if (ins) {\n handler(ins.data as { data: BN }, ctx)\n }\n })\n return this\n }\n \n}\n "]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
BTC / ETH,,,0x779877A7B0D9E8603169DdbD7836e478b4624789
|
|
2
|
+
BTC / USD,,,0xA39434A63A52E749F02807ae27335515BA4b07F7
|
|
3
|
+
DAI / USD,,,0x0d79df66BE487753B02D015Fb622DED7f0E9798d
|
|
4
|
+
ETH / USD,,,0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e
|
|
5
|
+
FORTH / USD,,,0x7A65Cf6C2ACE993f09231EC1Ea7363fb29C13f2F
|
|
6
|
+
LINK / ETH,,,0xb4c4a493AB6356497713A78FFA6c60FB53517c63
|
|
7
|
+
LINK / USD,,,0x48731cF7e84dc94C5f84577882c14Be11a5B7456
|
|
8
|
+
USDC / USD,,,0xAb5c49580294Aff77670F839ea425f5b78ab3Ae7
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
1INCH / ETH,1inch,Crypto,0x72AFAECF99C9d9C8215fF44C77B94B99C28741e8
|
|
2
|
+
1INCH / USD,1inch,Crypto,0xc929ad75B72593967DE83E7F7Cda0493458261D9
|
|
3
|
+
AAPL / USD,Apple,Equities,0x139C8512Cde1778e9b9a8e721ce1aEbd4dD43587
|
|
4
|
+
AAVE / ETH,Aave,Crypto,0x6Df09E975c830ECae5bd4eD9d90f3A95a4f88012
|
|
5
|
+
AAVE / USD,Aave,Crypto,0x547a514d5e3769680Ce22B2361c10Ea13619e8a9
|
|
6
|
+
ADA / USD,Cardano,Crypto,0xAE48c91dF1fE419994FFDa27da09D5aC69c30f55
|
|
7
|
+
ADX / USD,Adex,Crypto,0x231e764B44b2C1b7Ca171fa8021A24ed520Cde10
|
|
8
|
+
ALBT / USD,Aliiance Block,Crypto,0x057e52Fb830318E096CD96F369f0DB4B196fBfa7
|
|
9
|
+
ALCX / ETH,Alchemix,Crypto,0x194a9AaF2e0b67c35915cD01101585A33Fe25CAa
|
|
10
|
+
ALCX / USD,Alchemix,Crypto,0xc355e4C0B3ff4Ed0B49EaACD55FE29B311f42976
|
|
11
|
+
ALGO / USD,Algorand,Crypto,0xC33c0400dBD8043c5bE09512501Ce59253D499cE
|
|
12
|
+
ALPHA / ETH,Alpha Finance,Crypto,0x89c7926c7c15fD5BFDB1edcFf7E7fC8283B578F6
|
|
13
|
+
AMP / USD,Amp,Crypto,0x8797ABc4641dE76342b8acE9C63e3301DC35e3d8
|
|
14
|
+
AMPL / ETH,Ampleforth,Crypto,0x492575FDD11a0fCf2C6C719867890a7648d526eB
|
|
15
|
+
AMPL / USD,Ampleforth,Crypto,0xe20CA8D7546932360e37E9D72c1a47334af57706
|
|
16
|
+
AMZN / USD,Amazon,Equities,0x8994115d287207144236c13Be5E2bDbf6357D9Fd
|
|
17
|
+
ANKR / USD,Ankr,Crypto,0x7eed379bf00005CfeD29feD4009669dE9Bcc21ce
|
|
18
|
+
ANT / ETH,Aragon,Crypto,0x8f83670260F8f7708143b836a2a6F11eF0aBac01
|
|
19
|
+
APE / ETH,APECoin,Crypto,0xc7de7f4d4C9c991fF62a07D18b3E31e349833A18
|
|
20
|
+
APE / USD,APECoin,Crypto,0xD10aBbC76679a20055E167BB80A24ac851b37056
|
|
21
|
+
ARPA / USD,ARPA Chain,Crypto,0xc40ec815A2f8eb9912BD688d3bdE6B6D50A37ff2
|
|
22
|
+
ATOM / ETH,Cosmos,Crypto,0x15c8eA24Ba2d36671Fa22aD4Cff0a8eafe144352
|
|
23
|
+
ATOM / USD,Cosmos,Crypto,0xDC4BDB458C6361093069Ca2aD30D74cc152EdC75
|
|
24
|
+
AUD / USD,Australian Dollar,Forex,0x77F9710E7d0A19669A13c055F62cd80d313dF022
|
|
25
|
+
AVAX / USD,Avalanche,Crypto,0xFF3EEb22B5E3dE6e705b44749C2559d704923FD7
|
|
26
|
+
AXS / ETH,Axie Infinity,Crypto,0x8B4fC5b68cD50eAc1dD33f695901624a4a1A0A8b
|
|
27
|
+
BADGER / ETH,Badger DAO,Crypto,0x58921Ac140522867bf50b9E009599Da0CA4A2379
|
|
28
|
+
BADGER / USD,Badger DAO,Crypto,0x66a47b7206130e6FF64854EF0E1EDfa237E65339
|
|
29
|
+
BAL / ETH,Balancer,Crypto,0xC1438AA3823A6Ba0C159CfA8D98dF5A994bA120b
|
|
30
|
+
BAL / USD,Balancer,Crypto,0xdF2917806E30300537aEB49A7663062F4d1F2b5F
|
|
31
|
+
BAND / ETH,Band Protocol,Crypto,0x0BDb051e10c9718d1C29efbad442E88D38958274
|
|
32
|
+
BAND / USD,Band Protocol,Crypto,0x919C77ACc7373D000b329c1276C76586ed2Dd19F
|
|
33
|
+
BAT / ETH,Basic Attention Token,Crypto,0x0d16d4528239e9ee52fa531af613AcdB23D88c94
|
|
34
|
+
BAT / USD,Basic Attention Token,Crypto,0x9441D7556e7820B5ca42082cfa99487D56AcA958
|
|
35
|
+
BCH / USD,Bitcoin Cash,Crypto,0x9F0F69428F923D6c95B781F89E165C9b2df9789D
|
|
36
|
+
BETA / ETH,Beta Finance,Crypto,0x8eb7bAe1eCd3dcf87159Eb5BACe78209722F795B
|
|
37
|
+
BIT / USD,BitDAO,Crypto,0x7b33EbfA52F215a30FaD5a71b3FeE57a4831f1F0
|
|
38
|
+
BNB / ETH,BNB,Crypto,0xc546d2d06144F9DD42815b8bA46Ee7B8FcAFa4a2
|
|
39
|
+
BNB / USD,BNB,Crypto,0x14e613AC84a31f709eadbdF89C6CC390fDc9540A
|
|
40
|
+
BNT / ETH,Bancor,Crypto,0xCf61d1841B178fe82C8895fe60c2EDDa08314416
|
|
41
|
+
BNT / USD,Bancor,Crypto,0x1E6cF0D433de4FE882A437ABC654F58E1e78548c
|
|
42
|
+
BOND / ETH,Barnbridge,Crypto,0xdd22A54e05410D8d1007c38b5c7A3eD74b855281
|
|
43
|
+
BRL / USD,Brazilian Real,Forex,0x971E8F1B779A5F1C36e1cd7ef44Ba1Cc2F5EeE0f
|
|
44
|
+
BTC / ETH,Bitcoin,Crypto,0xdeb288F737066589598e9214E782fa5A8eD689e8
|
|
45
|
+
BTC / USD,Bitcoin,Crypto,0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c
|
|
46
|
+
BUSD / ETH,Binance USD,Crypto,0x614715d2Af89E6EC99A233818275142cE88d1Cfd
|
|
47
|
+
BUSD / USD,Binance USD,Crypto,0x833D8Eb16D306ed1FbB5D7A2E019e106B960965A
|
|
48
|
+
C98 / USD,C98,Crypto,0xE95CDc33E1F5BfE7eB26f45E29C6C9032B97db7F
|
|
49
|
+
CAD / USD,Canadian Dollar,Forex,0xa34317DB73e77d453b1B8d04550c44D10e981C8e
|
|
50
|
+
CAKE / USD,Pancakeswap,Crypto,0xEb0adf5C06861d6c07174288ce4D0a8128164003
|
|
51
|
+
CEL / ETH,Celsius,Crypto,0x75FbD83b4bd51dEe765b2a01e8D3aa1B020F9d33
|
|
52
|
+
CELO / ETH,Celo,Crypto,0x9ae96129ed8FE0C707D6eeBa7b90bB1e139e543e
|
|
53
|
+
CHF / USD,Swiss Franc,Forex,0x449d117117838fFA61263B61dA6301AA2a88B13A
|
|
54
|
+
CNY / USD,Chinese Yuan,Forex,0xeF8A4aF35cd47424672E3C590aBD37FBB7A7759a
|
|
55
|
+
COMP / ETH,Compound,Crypto,0x1B39Ee86Ec5979ba5C322b826B3ECb8C79991699
|
|
56
|
+
COMP / USD,Compound,Crypto,0xdbd020CAeF83eFd542f4De03e3cF0C28A4428bd5
|
|
57
|
+
CREAM / ETH,CREAM Finance,Crypto,0x82597CFE6af8baad7c0d441AA82cbC3b51759607
|
|
58
|
+
CRO / ETH,Cronos,Crypto,0xcA696a9Eb93b81ADFE6435759A29aB4cf2991A96
|
|
59
|
+
CRO / USD,Cronos,Crypto,0x00Cb80Cf097D9aA9A3779ad8EE7cF98437eaE050
|
|
60
|
+
CRV / ETH,Curve DAO,Crypto,0x8a12Be339B0cD1829b91Adc01977caa5E9ac121e
|
|
61
|
+
CRV / USD,Curve DAO,Crypto,0xCd627aA160A6fA45Eb793D19Ef54f5062F20f33f
|
|
62
|
+
CSPR / USD,Casper Network,Crypto,0x9e37a8Ee3bFa8eD6783Db031Dc458d200b226074
|
|
63
|
+
CTSI / ETH,Cartesi,Crypto,0x0a1d1b9847d602e789be38B802246161FFA24930
|
|
64
|
+
CVX / ETH,Convex Finance,Crypto,0xC9CbF687f43176B302F03f5e58470b77D07c61c6
|
|
65
|
+
CVX / USD,Convex Finance,Crypto,0xd962fC30A72A84cE50161031391756Bf2876Af5D
|
|
66
|
+
DAI / ETH,DAI,Crypto,0x773616E4d11A78F511299002da57A0a94577F1f4
|
|
67
|
+
DAI / USD,DAI,Crypto,0xAed0c38402a5d19df6E4c03F4E2DceD6e29c1ee9
|
|
68
|
+
DASH / USD,Dash,Crypto,0xFb0cADFEa136E9E343cfb55B863a6Df8348ab912
|
|
69
|
+
DIA / USD,DIA,Equities,0xeE636E1f7A0A846EEc2385E729CeA7D1b339D40D
|
|
70
|
+
DODO / USD,Dodo,Crypto,0x9613A51Ad59EE375e6D8fa12eeef0281f1448739
|
|
71
|
+
DOGE / USD,Dogecoin,Crypto,0x2465CefD3b488BE410b941b1d4b2767088e2A028
|
|
72
|
+
DOT / USD,Polkadot,Crypto,0x1C07AFb8E2B827c5A4739C6d59Ae3A5035f28734
|
|
73
|
+
DPI / USD,DefiPulse Index,Crypto,0xD2A593BF7594aCE1faD597adb697b5645d5edDB2
|
|
74
|
+
DYDX / USD,dYdX,Crypto,0x478909D4D798f3a1F11fFB25E4920C959B4aDe0b
|
|
75
|
+
ENJ / ETH,Enjin Coin,Crypto,0x24D9aB51950F3d62E9144fdC2f3135DAA6Ce8D1B
|
|
76
|
+
ENJ / USD,Enjin Coin,Crypto,0x23905C55dC11D609D5d11Dc604905779545De9a7
|
|
77
|
+
ENS / USD,Ethereum Name Service,Crypto,0x5C00128d4d1c2F4f652C267d7bcdD7aC99C16E16
|
|
78
|
+
EOS / USD,EOS,Crypto,0x10a43289895eAff840E8d45995BBa89f9115ECEe
|
|
79
|
+
ERN / USD,Ethernity Chain,Crypto,0x0a87e12689374A4EF49729582B474a1013cceBf8
|
|
80
|
+
ETC / USD,Ethereum Classic,Crypto,0xaEA2808407B7319A31A383B6F8B60f04BCa23cE2
|
|
81
|
+
ETH / BTC,Ethereum,Crypto,0xAc559F25B1619171CbC396a50854A3240b6A4e99
|
|
82
|
+
ETH / USD,Ethereum,Crypto,0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
|
|
83
|
+
EUR / USD,Euro,Forex,0xb49f677943BC038e9857d61E7d053CaA2C1734C1
|
|
84
|
+
EURT / USD,Tether Euro,Crypto,0x01D391A48f4F7339aC64CA2c83a07C22F95F587a
|
|
85
|
+
FARM / ETH,Harvest Finance,Crypto,0x611E0d2709416E002A3f38085e4e1cf77c015921
|
|
86
|
+
FB / USD,Meta,Equities,0xCe1051646393087e706288C1B57Fd26446657A7f
|
|
87
|
+
FEI / ETH,FEI Protocol,Crypto,0x7F0D2c2838c6AC24443d13e23d99490017bDe370
|
|
88
|
+
FEI / USD,FEI Protocol,Crypto,0x31e0a88fecB6eC0a411DBe0e9E76391498296EE9
|
|
89
|
+
FIL / ETH,Filecoin,Crypto,0x0606Be69451B1C9861Ac6b3626b99093b713E801
|
|
90
|
+
FLOW / USD,Flow,Crypto,0xD9BdD9f5ffa7d89c846A5E3231a093AE4b3469D2
|
|
91
|
+
FOR / USD,ForTube,Crypto,0x456834f736094Fb0AAD40a9BBc9D4a0f37818A54
|
|
92
|
+
FORTH / USD,Ampleforth Governance,Crypto,0x7D77Fd73E468baECe26852776BeaF073CDc55fA0
|
|
93
|
+
FOX / USD,Shapeshift FOX,Crypto,0xccA02FFEFAcE21325befD6616cB4Ba5fCB047480
|
|
94
|
+
FRAX / ETH,FRAX,Crypto,0x14d04Fff8D21bd62987a5cE9ce543d2F1edF5D3E
|
|
95
|
+
FRAX / USD,FRAX,Crypto,0xB9E1E3A9feFf48998E45Fa90847ed4D467E8BcfD
|
|
96
|
+
FTM / ETH,Fantom,Crypto,0x2DE7E4a9488488e0058B95854CC2f7955B35dC9b
|
|
97
|
+
FTT / ETH,FTX Token,Crypto,0xF0985f7E2CaBFf22CecC5a71282a89582c382EFE
|
|
98
|
+
FTT / USD,FTX Token,Crypto,0x84e3946C6df27b453315a1B38e4dECEF23d9F16F
|
|
99
|
+
FXS / USD,Frax Share,Crypto,0x6Ebc52C8C1089be9eB3945C4350B68B8E4C2233f
|
|
100
|
+
GBP / USD,Pound Sterling,Forex,0x5c0Ab2d9b5a7ed9f470386e82BB36A3613cDd4b5
|
|
101
|
+
GHST / ETH,Aavegotchi,Crypto,0x5877385f9F51B46Bbd93F24AD278D681E1Fd2A93
|
|
102
|
+
GLM / USD,Golen,Crypto,0x83441C3A10F4D05de6e0f2E849A850Ccf27E6fa7
|
|
103
|
+
GNO / ETH,Gnosis,Crypto,0xA614953dF476577E90dcf4e3428960e221EA4727
|
|
104
|
+
GOOGL / USD,Alphabet,Equities,0x36D39936BeA501755921beB5A382a88179070219
|
|
105
|
+
GRT / ETH,The Graph,Crypto,0x17D054eCac33D91F7340645341eFB5DE9009F1C1
|
|
106
|
+
GRT / USD,The Graph,Crypto,0x86cF33a451dE9dc61a2862FD94FF4ad4Bd65A5d2
|
|
107
|
+
GTC / ETH,GitCoin,Crypto,0x0e773A17a01E2c92F5d4c53435397E2bd48e215F
|
|
108
|
+
GUSD / ETH,Gemini Dollar,Crypto,0x96d15851CBac05aEe4EFD9eA3a3DD9BDEeC9fC28
|
|
109
|
+
GUSD / USD,Gemini Dollar,Crypto,0xa89f5d2365ce98B3cD68012b6f503ab1416245Fc
|
|
110
|
+
HBAR / USD,Hedera Hashgraph,Crypto,0x38C5ae3ee324ee027D88c5117ee58d07c9b4699b
|
|
111
|
+
HIGH / USD,Highstreet,Crypto,0xe2F95bC12FE8a3C35684Be7586C39fD7c0E5b403
|
|
112
|
+
HT / USD,Huobi Token,Crypto,0xE1329B3f6513912CAf589659777b66011AEE5880
|
|
113
|
+
HUSD / ETH,HUSD,Crypto,0x1B61BAD1495161bCb6C03DDB0E41622c0270bB1A
|
|
114
|
+
ILV / ETH,Illuvium,Crypto,0xf600984CCa37cd562E74E3EE514289e3613ce8E4
|
|
115
|
+
IMX / USD,Immutable X,Crypto,0xBAEbEFc1D023c0feCcc047Bff42E75F15Ff213E6
|
|
116
|
+
INJ / USD,Injective Protocol,Crypto,0xaE2EbE3c4D20cE13cE47cbb49b6d7ee631Cd816e
|
|
117
|
+
INR / USD,Indian Rupee,Forex,0x605D5c2fBCeDb217D7987FC0951B5753069bC360
|
|
118
|
+
IOST / USD,IOST,Crypto,0xd0935838935349401c73a06FCde9d63f719e84E5
|
|
119
|
+
IOTX / USD,IoTeX,Crypto,0x96c45535d235148Dc3ABA1E48A6E3cFB3510f4E2
|
|
120
|
+
JPY / USD,Japanese Yen,Forex,0xBcE206caE7f0ec07b545EddE332A47C2F75bbeb3
|
|
121
|
+
KNC / ETH,Kyber Network Crystal,Crypto,0x656c0544eF4C98A6a98491833A89204Abb045d6b
|
|
122
|
+
KNC / USD,Kyber Network,Crypto,0xf8fF43E991A81e6eC886a3D281A2C6cC19aE70Fc
|
|
123
|
+
KP3R / ETH,Keep3r v1,Crypto,0xe7015CCb7E5F788B8c1010FC22343473EaaC3741
|
|
124
|
+
KRW / USD,Korean Won,Forex,0x01435677FB11763550905594A16B645847C1d0F3
|
|
125
|
+
KSM / USD,Kusama,Crypto,0x06E4164E24E72B879D93360D1B9fA05838A62EB5
|
|
126
|
+
LDO / ETH,Lido DAO,Crypto,0x4e844125952D32AcdF339BE976c98E22F6F318dB
|
|
127
|
+
LINK / ETH,Chainlink,Crypto,0xDC530D9457755926550b59e8ECcdaE7624181557
|
|
128
|
+
LINK / USD,Chainlink,Crypto,0x2c1d072e956AFFC0D435Cb7AC38EF18d24d9127c
|
|
129
|
+
LON / ETH,Tokenlon,Crypto,0x13A8F2cC27ccC2761ca1b21d2F3E762445f201CE
|
|
130
|
+
LRC / ETH,Loopring,Crypto,0x160AC928A16C93eD4895C2De6f81ECcE9a7eB7b4
|
|
131
|
+
LTC / USD,Litecoin,Crypto,0x6AF09DF7563C363B5763b9102712EbeD3b9e859B
|
|
132
|
+
LUSD / USD,Liquity USD,Crypto,0x3D7aE7E594f2f2091Ad8798313450130d0Aba3a0
|
|
133
|
+
MANA / ETH,Decentraland,Crypto,0x82A44D92D6c329826dc557c5E1Be6ebeC5D5FeB9
|
|
134
|
+
MANA / USD,Decentraland,Crypto,0x56a4857acbcfe3a66965c251628B1c9f1c408C19
|
|
135
|
+
MATIC / USD,Polygon (MATIC),Crypto,0x7bAC85A8a13A4BcD8abb3eB7d6b4d632c5a57676
|
|
136
|
+
MIM / USD,Magic Internet Money,Crypto,0x7A364e8770418566e3eb2001A96116E6138Eb32F
|
|
137
|
+
MKR / ETH,Maker,Crypto,0x24551a8Fb2A7211A25a17B1481f043A8a8adC7f2
|
|
138
|
+
MKR / USD,Maker,Crypto,0xec1D1B3b0443256cc3860e24a46F108e699484Aa
|
|
139
|
+
MLN / ETH,Melon,Crypto,0xDaeA8386611A157B08829ED4997A8A62B557014C
|
|
140
|
+
MSFT / USD,Microsoft,Equities,0x021Fb44bfeafA0999C7b07C4791cf4B859C3b431
|
|
141
|
+
NEAR / USD,NEAR Protocol,Crypto,0xC12A6d1D827e23318266Ef16Ba6F397F2F91dA9b
|
|
142
|
+
NFLX / USD,Netflix,Equities,0x67C2e69c5272B94AF3C90683a9947C39Dc605ddE
|
|
143
|
+
NMR / ETH,Numeraire,Crypto,0x9cB2A01A7E64992d32A34db7cEea4c919C391f6A
|
|
144
|
+
NMR / USD,Numeraire,Crypto,0xcC445B35b3636bC7cC7051f4769D8982ED0d449A
|
|
145
|
+
NZD / USD,New Zealand Dollar,Forex,0x3977CFc9e4f29C184D4675f4EB8e0013236e5f3e
|
|
146
|
+
OCEAN / ETH,Ocean Protocol,Crypto,0x9b0FC4bb9981e5333689d69BdBF66351B9861E62
|
|
147
|
+
OGN / ETH,Origin Protocol,Crypto,0x2c881B6f3f6B5ff6C975813F87A4dad0b241C15b
|
|
148
|
+
OHMv2 / ETH,Olympus v2,Crypto,0x9a72298ae3886221820B1c878d12D872087D3a23
|
|
149
|
+
OKB / USD,OKB,Crypto,0x22134617Ae0f6CA8D89451e5Ae091c94f7D743DC
|
|
150
|
+
OM / USD,Mantra DAO,Crypto,0xb9583cfBdEeacd2705546F392E43F8E03eB92216
|
|
151
|
+
OMG / ETH,Omisego,Crypto,0x57C9aB3e56EE4a83752c181f241120a3DBba06a1
|
|
152
|
+
OMG / USD,Omisego,Crypto,0x7D476f061F8212A8C9317D5784e72B4212436E93
|
|
153
|
+
ONT / USD,Ontology,Crypto,0xcDa3708C5c2907FCca52BB3f9d3e4c2028b89319
|
|
154
|
+
ORN / ETH,Orion Protocol,Crypto,0xbA9B2a360eb8aBdb677d6d7f27E12De11AA052ef
|
|
155
|
+
OXT / USD,Orchid Protocol,Crypto,0xd75AAaE4AF0c398ca13e2667Be57AF2ccA8B5de6
|
|
156
|
+
PAXG / ETH,Pax Gold,Crypto,0x9B97304EA12EFed0FAd976FBeCAad46016bf269e
|
|
157
|
+
PERP / ETH,Perpetual Protocol,Crypto,0x3b41D5571468904D4e53b6a8d93A6BaC43f02dC9
|
|
158
|
+
PERP / USD,Perpetual Protocol,Crypto,0x01cE1210Fe8153500F60f7131d63239373D7E26C
|
|
159
|
+
PHA / USD,Phala Network,Crypto,0x2B1248028fe48864c4f1c305E524e2e6702eAFDF
|
|
160
|
+
PHP / USD,Philippines Peso,Forex,0x9481e7ad8BE6BbB22A8B9F7B9fB7588d1df65DF6
|
|
161
|
+
PLA / USD,Playdapp,Crypto,0xbc535B134DdF81fc83254a3D0Ed2C0C60144405E
|
|
162
|
+
RAI / ETH,RAI Reflex Index,Crypto,0x4ad7B025127e89263242aB68F0f9c4E5C033B489
|
|
163
|
+
RARI / ETH,Rarible,Crypto,0x2a784368b1D492f458Bf919389F42c18315765F5
|
|
164
|
+
REN / ETH,Ren,Crypto,0x3147D7203354Dc06D9fd350c7a2437bcA92387a4
|
|
165
|
+
REN / USD,Ren,Crypto,0x0f59666EDE214281e956cb3b2D0d69415AfF4A01
|
|
166
|
+
REP / ETH,Augur,Crypto,0xD4CE430C3b67b3E2F7026D86E7128588629e2455
|
|
167
|
+
REQ / USD,Request Network,Crypto,0x2F05888D185970f178f40610306a0Cc305e52bBF
|
|
168
|
+
RLC / ETH,iExec RLC,Crypto,0x4cba1e1fdc738D0fe8DB3ee07728E2Bc4DA676c6
|
|
169
|
+
RUNE / ETH,THORChain,Crypto,0x875D60C44cfbC38BaA4Eb2dDB76A767dEB91b97e
|
|
170
|
+
SAND / USD,The Sandbox,Crypto,0x35E3f7E558C04cE7eEE1629258EcbbA03B36Ec56
|
|
171
|
+
SGD / USD,Singapore Dollar,Forex,0xe25277fF4bbF9081C75Ab0EB13B4A13a721f3E13
|
|
172
|
+
SHIB / ETH,Shiba Inu,Crypto,0x8dD1CD88F43aF196ae478e91b9F5E4Ac69A97C61
|
|
173
|
+
SNX / ETH,Synthetix Network,Crypto,0x79291A9d692Df95334B1a0B3B4AE6bC606782f8c
|
|
174
|
+
SNX / USD,Synthetix Network,Crypto,0xDC3EA94CD0AC27d9A86C180091e7f78C683d3699
|
|
175
|
+
SOL / USD,Solana,Crypto,0x4ffC43a60e009B551865A93d232E33Fce9f01507
|
|
176
|
+
SPELL / USD,Spell Token,Crypto,0x8c110B94C5f1d347fAcF5E1E938AB2db60E3c9a8
|
|
177
|
+
SRM / ETH,Serum,Crypto,0x050c048c9a0CD0e76f166E2539F87ef2acCEC58f
|
|
178
|
+
STETH / ETH,Lido Staked ETH,Crypto,0x86392dC19c0b719886221c78AB11eb8Cf5c52812
|
|
179
|
+
SUSD / ETH,sUSD (Synthetix),Crypto,0x8e0b7e6062272B5eF4524250bFFF8e5Bd3497757
|
|
180
|
+
SUSHI / ETH,Sushi,Crypto,0xe572CeF69f43c2E488b33924AF04BDacE19079cf
|
|
181
|
+
SUSHI / USD,Sushi,Crypto,0xCc70F09A6CC17553b2E31954cD36E4A2d89501f7
|
|
182
|
+
SXP / USD,Swipe,Crypto,0xFb0CfD6c19e25DB4a08D8a204a387cEa48Cc138f
|
|
183
|
+
TOKE / USD,Tokemak,Crypto,0x104cD02b2f22972E8d8542867a36bDeDA4f104d8
|
|
184
|
+
TOMO / USD,Tomochain,Crypto,0x3d44925a8E9F9DFd90390E58e92Ec16c996A331b
|
|
185
|
+
TRIBE / ETH,Tribe,Crypto,0x84a24deCA415Acc0c395872a9e6a63E27D6225c8
|
|
186
|
+
TRU / USD,Truefi,Crypto,0x26929b85fE284EeAB939831002e1928183a10fb1
|
|
187
|
+
TRY / USD,Turkish Lira,Forex,0xB09fC5fD3f11Cf9eb5E1C5Dba43114e3C9f477b5
|
|
188
|
+
TSLA / USD,Tesla,Equities,0x1ceDaaB50936881B3e449e47e40A2cDAF5576A4a
|
|
189
|
+
TUSD / ETH,TrueUSD,Crypto,0x3886BA987236181D98F2401c507Fb8BeA7871dF2
|
|
190
|
+
TUSD / USD,True USD,Crypto,0xec746eCF986E2927Abd291a2A1716c940100f8Ba
|
|
191
|
+
UMA / ETH,Uma,Crypto,0xf817B69EA583CAFF291E287CaE00Ea329d22765C
|
|
192
|
+
UMEE / ETH,Umee,Crypto,0xa554F3a8D05f22aC7e105311211AAbAf727e1CcB
|
|
193
|
+
UNI / ETH,Uniswap,Crypto,0xD6aA3D25116d8dA79Ea0246c4826EB951872e02e
|
|
194
|
+
UNI / USD,Uniswap,Crypto,0x553303d460EE0afB37EdFf9bE42922D8FF63220e
|
|
195
|
+
USDC / ETH,Circle USD,Crypto,0x986b5E1e1755e3C2440e960477f25201B0a8bbD4
|
|
196
|
+
USDC / USD,Circle USD,Crypto,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6
|
|
197
|
+
USDK / USD,USDK,Crypto,0xfAC81Ea9Dd29D8E9b212acd6edBEb6dE38Cb43Af
|
|
198
|
+
USDN / USD,Neutrino USD,Crypto,0x7a8544894F7FD0C69cFcBE2b4b2E277B0b9a4355
|
|
199
|
+
USDP / USD,Pax Dollar,Crypto,0x09023c0DA49Aaf8fc3fA3ADF34C6A7016D38D5e3
|
|
200
|
+
USDT / ETH,Tether,Crypto,0xEe9F2375b4bdF6387aa8265dD4FB8F16512A1d46
|
|
201
|
+
USDT / USD,Tether USD,Crypto,0x3E7d1eAB13ad0104d2750B8863b489D65364e32D
|
|
202
|
+
WBTC / BTC,Wrapped Bitcoin,Crypto,0xfdFD9C85aD200c506Cf9e21F1FD8dd01932FBB23
|
|
203
|
+
WING / USD,Wing Finance,Crypto,0x134fE0a225Fb8e6683617C13cEB6B3319fB4fb82
|
|
204
|
+
WNXM / ETH,Wrapped NXM,Crypto,0xe5Dc0A609Ab8bCF15d3f35cFaa1Ff40f521173Ea
|
|
205
|
+
WTI / USD,WTI Crude,Commodities,0xf3584F4dd3b467e73C2339EfD008665a70A4185c
|
|
206
|
+
XAG / USD,Silver,Commodities,0x379589227b15F1a12195D3f2d90bBc9F31f95235
|
|
207
|
+
XAU / USD,Gold,Commodities,0x214eD9Da11D2fbe465a6fc601a91E62EbEc1a0D6
|
|
208
|
+
XCN / USD,Chain,Crypto,0xeb988B77b94C186053282BfcD8B7ED55142D3cAB
|
|
209
|
+
XLM / USD,Stellar,Crypto,0x64168007BAcbB5fF3f52639db22C6300827f5036
|
|
210
|
+
XMR / USD,Monero,Crypto,0xFA66458Cce7Dd15D8650015c4fce4D278271618F
|
|
211
|
+
XRP / USD,Ripple,Crypto,0xCed2660c6Dd1Ffd856A5A82C67f3482d88C50b12
|
|
212
|
+
YFI / ETH,Yearn Finance,Crypto,0x7c5d4F8345e66f68099581Db340cd65B078C41f4
|
|
213
|
+
YFI / USD,Yearn Finance,Crypto,0xA027702dbb89fbd58938e4324ac03B58d812b0E1
|
|
214
|
+
YFII / ETH,YFII Finance,Crypto,0xaaB2f6b45B28E962B3aCd1ee4fC88aEdDf557756
|
|
215
|
+
ZRX / ETH,0x,Crypto,0x2Da4983a622a8498bb1a21FaE9D8F6C664939962
|
|
216
|
+
ZRX / USD,0x,Crypto,0x2885d15b8Af22648b98B122b22FDF4D2a56c6023
|
|
217
|
+
sUSD / USD,sUSD (Synthetix),Crypto,0xad35Bd71b9aFE6e4bDc266B345c198eaDEf9Ad94
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BlockTag } from '@ethersproject/providers';
|
|
2
|
+
export declare enum PriceUnit {
|
|
3
|
+
USD = 0,
|
|
4
|
+
ETH = 1,
|
|
5
|
+
BTC = 2
|
|
6
|
+
}
|
|
7
|
+
export interface DexPriceResult {
|
|
8
|
+
price?: number;
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
declare class DexPrice {
|
|
12
|
+
private USD_ORACLE_MAP;
|
|
13
|
+
private ETH_ORACLE_MAP;
|
|
14
|
+
private BTC_ORACLE_MAP;
|
|
15
|
+
private ASSETS_INFOS;
|
|
16
|
+
private readonly chainId;
|
|
17
|
+
constructor(csvFileName: string, chainId: number);
|
|
18
|
+
getPrice(asset: string, blockTag?: BlockTag, unit?: PriceUnit): Promise<DexPriceResult>;
|
|
19
|
+
}
|
|
20
|
+
export declare const EthereumDexPrice: DexPrice;
|
|
21
|
+
export declare const GoerliDexPrice: DexPrice;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GoerliDexPrice = exports.EthereumDexPrice = exports.PriceUnit = void 0;
|
|
7
|
+
const eacaggregatorproxy_processor_1 = require("../builtin/internal/eacaggregatorproxy_processor");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const sync_1 = require("csv-parse/sync");
|
|
11
|
+
const erc20_1 = require("./erc20");
|
|
12
|
+
var PriceUnit;
|
|
13
|
+
(function (PriceUnit) {
|
|
14
|
+
PriceUnit[PriceUnit["USD"] = 0] = "USD";
|
|
15
|
+
PriceUnit[PriceUnit["ETH"] = 1] = "ETH";
|
|
16
|
+
PriceUnit[PriceUnit["BTC"] = 2] = "BTC";
|
|
17
|
+
})(PriceUnit = exports.PriceUnit || (exports.PriceUnit = {}));
|
|
18
|
+
// Load price feed from https://docs.chain.link/docs/data-feeds/price-feeds/addresses/?network=ethereum
|
|
19
|
+
// and then use EACAggregatorProxy contract to get price
|
|
20
|
+
class DexPrice {
|
|
21
|
+
USD_ORACLE_MAP = new Map();
|
|
22
|
+
ETH_ORACLE_MAP = new Map();
|
|
23
|
+
BTC_ORACLE_MAP = new Map();
|
|
24
|
+
ASSETS_INFOS = new Map();
|
|
25
|
+
chainId;
|
|
26
|
+
constructor(csvFileName, chainId) {
|
|
27
|
+
this.chainId = chainId;
|
|
28
|
+
const csvFilePath = path_1.default.resolve(__dirname, csvFileName);
|
|
29
|
+
const fileContent = fs_1.default.readFileSync(csvFilePath, { encoding: 'utf-8' });
|
|
30
|
+
const headers = ['Pair', 'Asset', 'Type', 'Address'];
|
|
31
|
+
const records = (0, sync_1.parse)(fileContent, {
|
|
32
|
+
delimiter: ',',
|
|
33
|
+
columns: headers,
|
|
34
|
+
skip_empty_lines: true,
|
|
35
|
+
});
|
|
36
|
+
for (const record of records) {
|
|
37
|
+
const pair = record.Pair.split('/');
|
|
38
|
+
const asset = pair[0].trim().toLowerCase();
|
|
39
|
+
const target = pair[1].trim().toLowerCase();
|
|
40
|
+
const address = record.Address.toLowerCase();
|
|
41
|
+
if (target === 'usd') {
|
|
42
|
+
this.USD_ORACLE_MAP.set(asset, address);
|
|
43
|
+
}
|
|
44
|
+
else if (target === 'eth') {
|
|
45
|
+
this.ETH_ORACLE_MAP.set(asset, address);
|
|
46
|
+
}
|
|
47
|
+
else if (target == 'btc') {
|
|
48
|
+
this.BTC_ORACLE_MAP.set(asset, address);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.error('wrong asset record:' + JSON.stringify(record));
|
|
52
|
+
}
|
|
53
|
+
// console.log(asset, target, address)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// asset: symbol of the asset
|
|
57
|
+
// unit: usd, eth or btc
|
|
58
|
+
// blockTag: blockNumber of block symbol like "latest"
|
|
59
|
+
// returns the asset price,
|
|
60
|
+
// throw exception if calling to price feed failed, e.g. due to a invalid block number
|
|
61
|
+
async getPrice(asset, blockTag = 'latest', unit = PriceUnit.USD) {
|
|
62
|
+
// if (chainId !== 1 && chainId !== 5) {
|
|
63
|
+
// return {
|
|
64
|
+
// error: "current dex price only support chain 1 (mainnet) or 5 (goerli)"
|
|
65
|
+
// }
|
|
66
|
+
// }
|
|
67
|
+
let oracleMap = this.USD_ORACLE_MAP;
|
|
68
|
+
switch (unit) {
|
|
69
|
+
case PriceUnit.ETH:
|
|
70
|
+
oracleMap = this.ETH_ORACLE_MAP;
|
|
71
|
+
break;
|
|
72
|
+
case PriceUnit.BTC:
|
|
73
|
+
oracleMap = this.BTC_ORACLE_MAP;
|
|
74
|
+
break;
|
|
75
|
+
default:
|
|
76
|
+
}
|
|
77
|
+
asset = asset.trim().toLowerCase();
|
|
78
|
+
const addr = oracleMap.get(asset);
|
|
79
|
+
if (!addr) {
|
|
80
|
+
return {
|
|
81
|
+
error: 'No price feed found for asset',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
const contract = (0, eacaggregatorproxy_processor_1.getEACAggregatorProxyContract)(addr, this.chainId);
|
|
85
|
+
try {
|
|
86
|
+
const price = await contract.latestAnswer({
|
|
87
|
+
blockTag: blockTag,
|
|
88
|
+
});
|
|
89
|
+
let decimal = this.ASSETS_INFOS.get(asset);
|
|
90
|
+
if (!decimal) {
|
|
91
|
+
decimal = await contract.decimals();
|
|
92
|
+
this.ASSETS_INFOS.set(asset, decimal);
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
price: (0, erc20_1.scaleDown)(price, decimal).toNumber(),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
return {
|
|
100
|
+
error: 'Price query error for ' +
|
|
101
|
+
asset +
|
|
102
|
+
' failed at ' +
|
|
103
|
+
addr +
|
|
104
|
+
' at chain ' +
|
|
105
|
+
this.chainId +
|
|
106
|
+
'. Details: ' +
|
|
107
|
+
e.toString(),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.EthereumDexPrice = new DexPrice('chainlink-oracles.csv', 1);
|
|
113
|
+
exports.GoerliDexPrice = new DexPrice('chainlink-oracles-goerli.csv', 5);
|
|
114
|
+
//# sourceMappingURL=dex-price.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dex-price.js","sourceRoot":"","sources":["../../src/utils/dex-price.ts"],"names":[],"mappings":"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","sourcesContent":["import { getEACAggregatorProxyContract } from '../builtin/internal/eacaggregatorproxy_processor'\nimport path from 'path'\nimport fs from 'fs'\n\nimport { parse } from 'csv-parse/sync'\nimport { BlockTag } from '@ethersproject/providers'\nimport { scaleDown } from './erc20'\n\ntype OralceRecord = {\n Pair: string\n Asset: string\n Type: string\n Address: string\n}\n\nexport enum PriceUnit {\n USD = 0,\n ETH = 1,\n BTC = 2,\n}\n\nexport interface DexPriceResult {\n price?: number\n error?: string\n}\n\n// Load price feed from https://docs.chain.link/docs/data-feeds/price-feeds/addresses/?network=ethereum\n// and then use EACAggregatorProxy contract to get price\nclass DexPrice {\n private USD_ORACLE_MAP = new Map<string, string>()\n private ETH_ORACLE_MAP = new Map<string, string>()\n private BTC_ORACLE_MAP = new Map<string, string>()\n private ASSETS_INFOS = new Map<string, number>()\n\n private readonly chainId: number\n\n constructor(csvFileName: string, chainId: number) {\n this.chainId = chainId\n const csvFilePath = path.resolve(__dirname, csvFileName)\n const fileContent = fs.readFileSync(csvFilePath, { encoding: 'utf-8' })\n const headers = ['Pair', 'Asset', 'Type', 'Address']\n\n const records: OralceRecord[] = parse(fileContent, {\n delimiter: ',',\n columns: headers,\n skip_empty_lines: true,\n })\n\n for (const record of records) {\n const pair = record.Pair.split('/')\n const asset = pair[0].trim().toLowerCase()\n const target = pair[1].trim().toLowerCase()\n const address = record.Address.toLowerCase()\n if (target === 'usd') {\n this.USD_ORACLE_MAP.set(asset, address)\n } else if (target === 'eth') {\n this.ETH_ORACLE_MAP.set(asset, address)\n } else if (target == 'btc') {\n this.BTC_ORACLE_MAP.set(asset, address)\n } else {\n console.error('wrong asset record:' + JSON.stringify(record))\n }\n\n // console.log(asset, target, address)\n }\n }\n\n // asset: symbol of the asset\n // unit: usd, eth or btc\n // blockTag: blockNumber of block symbol like \"latest\"\n // returns the asset price,\n // throw exception if calling to price feed failed, e.g. due to a invalid block number\n async getPrice(\n asset: string,\n blockTag: BlockTag = 'latest',\n unit: PriceUnit = PriceUnit.USD\n ): Promise<DexPriceResult> {\n // if (chainId !== 1 && chainId !== 5) {\n // return {\n // error: \"current dex price only support chain 1 (mainnet) or 5 (goerli)\"\n // }\n // }\n\n let oracleMap = this.USD_ORACLE_MAP\n switch (unit) {\n case PriceUnit.ETH:\n oracleMap = this.ETH_ORACLE_MAP\n break\n case PriceUnit.BTC:\n oracleMap = this.BTC_ORACLE_MAP\n break\n default:\n }\n\n asset = asset.trim().toLowerCase()\n\n const addr = oracleMap.get(asset)\n if (!addr) {\n return {\n error: 'No price feed found for asset',\n }\n }\n\n const contract = getEACAggregatorProxyContract(addr, this.chainId)\n try {\n const price = await contract.latestAnswer({\n blockTag: blockTag,\n })\n\n let decimal = this.ASSETS_INFOS.get(asset)\n if (!decimal) {\n decimal = await contract.decimals()\n this.ASSETS_INFOS.set(asset, decimal)\n }\n\n return {\n price: scaleDown(price, decimal).toNumber(),\n }\n } catch (e) {\n return {\n error:\n 'Price query error for ' +\n asset +\n ' failed at ' +\n addr +\n ' at chain ' +\n this.chainId +\n '. Details: ' +\n e.toString(),\n }\n }\n }\n}\n\nexport const EthereumDexPrice = new DexPrice('chainlink-oracles.csv', 1)\nexport const GoerliDexPrice = new DexPrice('chainlink-oracles-goerli.csv', 5)\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const dex_price_1 = require("./dex-price");
|
|
4
|
+
const sdk_1 = require("@sentio/sdk");
|
|
5
|
+
const test_1 = require("../test");
|
|
6
|
+
const chai_1 = require("chai");
|
|
7
|
+
describe('dex price tests', () => {
|
|
8
|
+
global.PROCESSOR_STATE = new sdk_1.ProcessorState();
|
|
9
|
+
const haveProviders = (0, test_1.loadTestProvidersFromEnv)(['1', '5']);
|
|
10
|
+
const testIf = haveProviders ? test : test.skip;
|
|
11
|
+
testIf('get price at mainnet', async () => {
|
|
12
|
+
const usdc = await dex_price_1.EthereumDexPrice.getPrice('usdc', 15677823);
|
|
13
|
+
(0, chai_1.expect)(usdc.price).eq(0.99991649);
|
|
14
|
+
const compound = await dex_price_1.EthereumDexPrice.getPrice('COMP', 15677823);
|
|
15
|
+
(0, chai_1.expect)(compound.price).eq(60.27);
|
|
16
|
+
});
|
|
17
|
+
testIf('get price at goerli', async () => {
|
|
18
|
+
const dai = await dex_price_1.GoerliDexPrice.getPrice('DAI', 7712734);
|
|
19
|
+
(0, chai_1.expect)(dai.price).eq(0.99971281);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=dex-price.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dex-price.test.js","sourceRoot":"","sources":["../../src/utils/dex-price.test.ts"],"names":[],"mappings":";;AAAA,2CAA8D;AAC9D,qCAA4C;AAC5C,kCAAkD;AAClD,+BAA6B;AAE7B,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,CAAC,eAAe,GAAG,IAAI,oBAAc,EAAE,CAAA;IAC7C,MAAM,aAAa,GAAG,IAAA,+BAAwB,EAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IAE1D,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;IAE/C,MAAM,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,IAAI,GAAG,MAAM,4BAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC9D,IAAA,aAAM,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;QAEjC,MAAM,QAAQ,GAAG,MAAM,4BAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAClE,IAAA,aAAM,EAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,GAAG,GAAG,MAAM,0BAAc,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACzD,IAAA,aAAM,EAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import { EthereumDexPrice, GoerliDexPrice } from './dex-price'\nimport { ProcessorState } from '@sentio/sdk'\nimport { loadTestProvidersFromEnv } from '../test'\nimport { expect } from 'chai'\n\ndescribe('dex price tests', () => {\n global.PROCESSOR_STATE = new ProcessorState()\n const haveProviders = loadTestProvidersFromEnv(['1', '5'])\n\n const testIf = haveProviders ? test : test.skip\n\n testIf('get price at mainnet', async () => {\n const usdc = await EthereumDexPrice.getPrice('usdc', 15677823)\n expect(usdc.price).eq(0.99991649)\n\n const compound = await EthereumDexPrice.getPrice('COMP', 15677823)\n expect(compound.price).eq(60.27)\n })\n\n testIf('get price at goerli', async () => {\n const dai = await GoerliDexPrice.getPrice('DAI', 7712734)\n expect(dai.price).eq(0.99971281)\n })\n})\n"]}
|
package/lib/utils/erc20.d.ts
CHANGED
|
@@ -12,3 +12,4 @@ export declare const NATIVE_ETH: {
|
|
|
12
12
|
};
|
|
13
13
|
export declare function getERC20TokenInfo(tokenAddress: string, chainId?: number): Promise<TokenInfo>;
|
|
14
14
|
export declare function getER20NormalizedAmount(tokenAddress: string, amount: BigNumber, chainId: number): Promise<BigDecimal>;
|
|
15
|
+
export declare function scaleDown(amount: BigNumber, decimal: number): BigDecimal;
|
package/lib/utils/erc20.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getER20NormalizedAmount = exports.getERC20TokenInfo = exports.NATIVE_ETH = exports.TokenInfo = void 0;
|
|
3
|
+
exports.scaleDown = exports.getER20NormalizedAmount = exports.getERC20TokenInfo = exports.NATIVE_ETH = exports.TokenInfo = void 0;
|
|
4
4
|
const error_1 = require("../error");
|
|
5
5
|
const erc20_1 = require("../builtin/erc20");
|
|
6
6
|
const erc20bytes_processor_1 = require("../builtin/internal/erc20bytes_processor");
|
|
@@ -55,8 +55,12 @@ async function getERC20TokenInfo(tokenAddress, chainId = 1) {
|
|
|
55
55
|
exports.getERC20TokenInfo = getERC20TokenInfo;
|
|
56
56
|
async function getER20NormalizedAmount(tokenAddress, amount, chainId) {
|
|
57
57
|
const tokenInfo = await getERC20TokenInfo(tokenAddress, chainId);
|
|
58
|
-
|
|
59
|
-
return (0, convert_1.toBigDecimal)(amount).dividedBy(divider);
|
|
58
|
+
return scaleDown(amount, tokenInfo.decimal);
|
|
60
59
|
}
|
|
61
60
|
exports.getER20NormalizedAmount = getER20NormalizedAmount;
|
|
61
|
+
function scaleDown(amount, decimal) {
|
|
62
|
+
const divider = new sdk_1.BigDecimal(10).pow(decimal);
|
|
63
|
+
return (0, convert_1.toBigDecimal)(amount).dividedBy(divider);
|
|
64
|
+
}
|
|
65
|
+
exports.scaleDown = scaleDown;
|
|
62
66
|
//# sourceMappingURL=erc20.js.map
|