@sentio/sdk 1.37.0-rc.1 → 1.37.0-rc.2
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/builtin/solana/wormhole-processor.d.ts +0 -4
- package/lib/builtin/solana/wormhole-processor.js +123 -50
- package/lib/builtin/solana/wormhole-processor.js.map +1 -1
- package/lib/core/numberish.d.ts +1 -1
- package/lib/core/numberish.js +5 -13
- package/lib/core/numberish.js.map +1 -1
- package/lib/solana-codegen/codegen.js +16 -5
- package/lib/solana-codegen/codegen.js.map +1 -1
- package/package.json +5 -4
- package/src/builtin/solana/wormhole-processor.ts +119 -28
- package/src/core/numberish.ts +8 -15
- package/src/solana-codegen/codegen.ts +20 -7
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { SolanaBaseProcessor, SolanaContext, SolanaBindOptions } from '@sentio/sdk';
|
|
2
2
|
import { Instruction } from '@project-serum/anchor';
|
|
3
3
|
export declare class TokenBridgeProcessor extends SolanaBaseProcessor {
|
|
4
|
-
private readonly transferDataValues;
|
|
5
|
-
private readonly transferDataWithPayloadValues;
|
|
6
|
-
private readonly attestTokenValues;
|
|
7
|
-
private readonly initializeDataValues;
|
|
8
4
|
static bind(options: SolanaBindOptions): TokenBridgeProcessor;
|
|
9
5
|
decodeInstruction: (rawInstruction: string) => Instruction | null;
|
|
10
6
|
onInitialize(handler: (args: any, accounts: string[], ctx: SolanaContext) => void): TokenBridgeProcessor;
|
|
@@ -1,26 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
if (
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
24
7
|
};
|
|
25
8
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
9
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -28,8 +11,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
28
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
12
|
exports.TokenBridgeProcessor = void 0;
|
|
30
13
|
const sdk_1 = require("@sentio/sdk");
|
|
31
|
-
const borsh = __importStar(require("@coral-xyz/borsh"));
|
|
32
14
|
const bs58_1 = __importDefault(require("bs58"));
|
|
15
|
+
const borsh_1 = require("@dao-xyz/borsh");
|
|
33
16
|
// https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/lib.rs#L100
|
|
34
17
|
var TokenBridgeInstruction;
|
|
35
18
|
(function (TokenBridgeInstruction) {
|
|
@@ -47,29 +30,113 @@ var TokenBridgeInstruction;
|
|
|
47
30
|
TokenBridgeInstruction[TokenBridgeInstruction["TransferWrappedWithPayload"] = 11] = "TransferWrappedWithPayload";
|
|
48
31
|
TokenBridgeInstruction[TokenBridgeInstruction["TransferNativeWithPayload"] = 12] = "TransferNativeWithPayload";
|
|
49
32
|
})(TokenBridgeInstruction || (TokenBridgeInstruction = {}));
|
|
33
|
+
class TransferDataValues {
|
|
34
|
+
nonce;
|
|
35
|
+
amount;
|
|
36
|
+
fee;
|
|
37
|
+
target_address;
|
|
38
|
+
target_chain;
|
|
39
|
+
constructor(data) {
|
|
40
|
+
if (data) {
|
|
41
|
+
Object.assign(this, data);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
__decorate([
|
|
46
|
+
(0, borsh_1.field)({ type: 'u32' })
|
|
47
|
+
], TransferDataValues.prototype, "nonce", void 0);
|
|
48
|
+
__decorate([
|
|
49
|
+
(0, borsh_1.field)({ type: 'u64' })
|
|
50
|
+
], TransferDataValues.prototype, "amount", void 0);
|
|
51
|
+
__decorate([
|
|
52
|
+
(0, borsh_1.field)({ type: 'u64' })
|
|
53
|
+
], TransferDataValues.prototype, "fee", void 0);
|
|
54
|
+
__decorate([
|
|
55
|
+
(0, borsh_1.field)({ type: (0, borsh_1.fixedArray)('u8', 32) })
|
|
56
|
+
], TransferDataValues.prototype, "target_address", void 0);
|
|
57
|
+
__decorate([
|
|
58
|
+
(0, borsh_1.field)({ type: 'u16' })
|
|
59
|
+
], TransferDataValues.prototype, "target_chain", void 0);
|
|
60
|
+
class TransferNativeWithPayloadData {
|
|
61
|
+
nonce;
|
|
62
|
+
amount;
|
|
63
|
+
fee;
|
|
64
|
+
target_address;
|
|
65
|
+
target_chain;
|
|
66
|
+
payload;
|
|
67
|
+
cpi_program_id;
|
|
68
|
+
constructor(data) {
|
|
69
|
+
if (data) {
|
|
70
|
+
Object.assign(this, data);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
__decorate([
|
|
75
|
+
(0, borsh_1.field)({ type: 'u32' })
|
|
76
|
+
], TransferNativeWithPayloadData.prototype, "nonce", void 0);
|
|
77
|
+
__decorate([
|
|
78
|
+
(0, borsh_1.field)({ type: 'u64' })
|
|
79
|
+
], TransferNativeWithPayloadData.prototype, "amount", void 0);
|
|
80
|
+
__decorate([
|
|
81
|
+
(0, borsh_1.field)({ type: 'u64' })
|
|
82
|
+
], TransferNativeWithPayloadData.prototype, "fee", void 0);
|
|
83
|
+
__decorate([
|
|
84
|
+
(0, borsh_1.field)({ type: (0, borsh_1.fixedArray)('u8', 32) })
|
|
85
|
+
], TransferNativeWithPayloadData.prototype, "target_address", void 0);
|
|
86
|
+
__decorate([
|
|
87
|
+
(0, borsh_1.field)({ type: 'u16' })
|
|
88
|
+
], TransferNativeWithPayloadData.prototype, "target_chain", void 0);
|
|
89
|
+
__decorate([
|
|
90
|
+
(0, borsh_1.field)({ type: (0, borsh_1.vec)('u8') })
|
|
91
|
+
], TransferNativeWithPayloadData.prototype, "payload", void 0);
|
|
92
|
+
__decorate([
|
|
93
|
+
(0, borsh_1.field)({ type: (0, borsh_1.option)((0, borsh_1.fixedArray)('u8', 32)) })
|
|
94
|
+
], TransferNativeWithPayloadData.prototype, "cpi_program_id", void 0);
|
|
95
|
+
class AttestTokenValues {
|
|
96
|
+
nonce;
|
|
97
|
+
constructor(data) {
|
|
98
|
+
if (data) {
|
|
99
|
+
Object.assign(this, data);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
__decorate([
|
|
104
|
+
(0, borsh_1.field)({ type: 'u32' })
|
|
105
|
+
], AttestTokenValues.prototype, "nonce", void 0);
|
|
106
|
+
class InitializeDataValues {
|
|
107
|
+
bridge;
|
|
108
|
+
constructor(data) {
|
|
109
|
+
if (data) {
|
|
110
|
+
Object.assign(this, data);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
__decorate([
|
|
115
|
+
(0, borsh_1.field)({ type: (0, borsh_1.fixedArray)('u8', 32) })
|
|
116
|
+
], InitializeDataValues.prototype, "bridge", void 0);
|
|
50
117
|
class TokenBridgeProcessor extends sdk_1.SolanaBaseProcessor {
|
|
51
|
-
transferDataValues = [
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
]
|
|
118
|
+
// private readonly transferDataValues = [
|
|
119
|
+
// borsh.u32('nonce'),
|
|
120
|
+
// borsh.u64('amount'),
|
|
121
|
+
// borsh.u64('fee'),
|
|
122
|
+
// borsh.array(borsh.u8(undefined), 32, 'target_address'),
|
|
123
|
+
// borsh.u16('target_chain')
|
|
124
|
+
// ]
|
|
58
125
|
// https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/api/transfer_payload.rs#L170
|
|
59
|
-
transferDataWithPayloadValues = [
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
]
|
|
67
|
-
attestTokenValues = [
|
|
68
|
-
|
|
69
|
-
]
|
|
70
|
-
initializeDataValues = [
|
|
71
|
-
|
|
72
|
-
]
|
|
126
|
+
// private readonly transferDataWithPayloadValues = [
|
|
127
|
+
// borsh.u32('nonce'),
|
|
128
|
+
// borsh.u64('amount'),
|
|
129
|
+
// borsh.array(borsh.u8(undefined), 32, 'target_address'),
|
|
130
|
+
// borsh.u16('target_chain'),
|
|
131
|
+
// borsh.vecU8('payload'),
|
|
132
|
+
// borsh.option(borsh.publicKey(undefined), 'cpi_program_id')
|
|
133
|
+
// ]
|
|
134
|
+
// private readonly attestTokenValues = [
|
|
135
|
+
// borsh.u32('nonce')
|
|
136
|
+
// ]
|
|
137
|
+
// private readonly initializeDataValues = [
|
|
138
|
+
// borsh.publicKey('bridge')
|
|
139
|
+
// ]
|
|
73
140
|
static bind(options) {
|
|
74
141
|
if (options && !options.name) {
|
|
75
142
|
options.name = 'WormholeTokenBridge';
|
|
@@ -90,39 +157,45 @@ class TokenBridgeProcessor extends sdk_1.SolanaBaseProcessor {
|
|
|
90
157
|
name: TokenBridgeInstruction[TokenBridgeInstruction.Initialize]
|
|
91
158
|
};
|
|
92
159
|
case TokenBridgeInstruction.TransferNative:
|
|
160
|
+
data = (0, borsh_1.deserialize)(Buffer.from(u8Arr.slice(1)), TransferDataValues);
|
|
93
161
|
// struct is defined at: https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/api/transfer.rs#L295
|
|
94
|
-
data = borsh.struct(this.transferDataValues, 'TransferNativeData').decode(Buffer.from(u8Arr.slice(1)))
|
|
162
|
+
// data = borsh.struct(this.transferDataValues, 'TransferNativeData').decode(Buffer.from(u8Arr.slice(1)))
|
|
95
163
|
return {
|
|
96
164
|
data,
|
|
97
165
|
name: TokenBridgeInstruction[TokenBridgeInstruction.TransferNative]
|
|
98
166
|
};
|
|
99
167
|
case TokenBridgeInstruction.TransferWrapped:
|
|
168
|
+
data = (0, borsh_1.deserialize)(Buffer.from(u8Arr.slice(1)), TransferDataValues);
|
|
100
169
|
// stuct is defined at: https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/api/transfer.rs#L295
|
|
101
|
-
data = borsh.struct(this.transferDataValues, 'TransferWrappedData').decode(Buffer.from(u8Arr.slice(1)))
|
|
170
|
+
// data = borsh.struct(this.transferDataValues, 'TransferWrappedData').decode(Buffer.from(u8Arr.slice(1)))
|
|
102
171
|
return {
|
|
103
172
|
data,
|
|
104
173
|
name: TokenBridgeInstruction[TokenBridgeInstruction.TransferWrapped]
|
|
105
174
|
};
|
|
106
175
|
case TokenBridgeInstruction.TransferNativeWithPayload:
|
|
107
|
-
data =
|
|
176
|
+
data = (0, borsh_1.deserialize)(Buffer.from(u8Arr.slice(1)), TransferNativeWithPayloadData);
|
|
177
|
+
// data = borsh.struct(this.transferDataWithPayloadValues, 'TransferNativeWithPayloadData').decode(Buffer.from(u8Arr.slice(1)))
|
|
108
178
|
return {
|
|
109
179
|
data,
|
|
110
180
|
name: TokenBridgeInstruction[TokenBridgeInstruction.TransferNativeWithPayload]
|
|
111
181
|
};
|
|
112
182
|
case TokenBridgeInstruction.TransferWrappedWithPayload:
|
|
113
|
-
data =
|
|
183
|
+
data = (0, borsh_1.deserialize)(Buffer.from(u8Arr.slice(1)), TransferNativeWithPayloadData);
|
|
184
|
+
// data = borsh.struct(this.transferDataWithPayloadValues, 'TransferWrappedWithPayloadData').decode(Buffer.from(u8Arr.slice(1)))
|
|
114
185
|
return {
|
|
115
186
|
data,
|
|
116
187
|
name: TokenBridgeInstruction[TokenBridgeInstruction.TransferWrappedWithPayload]
|
|
117
188
|
};
|
|
118
189
|
case TokenBridgeInstruction.Initialize:
|
|
119
|
-
data =
|
|
190
|
+
data = (0, borsh_1.deserialize)(Buffer.from(u8Arr.slice(1)), InitializeDataValues);
|
|
191
|
+
// data = borsh.struct(this.initializeDataValues, 'InitializeData').decode(Buffer.from(u8Arr.slice(1)))
|
|
120
192
|
return {
|
|
121
193
|
data,
|
|
122
194
|
name: TokenBridgeInstruction[TokenBridgeInstruction.Initialize]
|
|
123
195
|
};
|
|
124
196
|
case TokenBridgeInstruction.AttestToken:
|
|
125
|
-
data =
|
|
197
|
+
data = (0, borsh_1.deserialize)(Buffer.from(u8Arr.slice(1)), AttestTokenValues);
|
|
198
|
+
// data = borsh.struct(this.attestTokenValues, 'AttestTokenData').decode(Buffer.from(u8Arr.slice(1)))
|
|
126
199
|
return {
|
|
127
200
|
data,
|
|
128
201
|
name: TokenBridgeInstruction[TokenBridgeInstruction.AttestToken]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wormhole-processor.js","sourceRoot":"","sources":["../../../src/builtin/solana/wormhole-processor.ts"],"names":[],"mappings":"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","sourcesContent":["import { SolanaBaseProcessor, SolanaContext, SolanaBindOptions } from '@sentio/sdk'\nimport { Instruction } from '@project-serum/anchor'\nimport * as borsh from \"@coral-xyz/borsh\";\nimport bs58 from 'bs58'\n\n// https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/lib.rs#L100\nenum TokenBridgeInstruction {\n Initialize = 0,\n AttestToken,\n CompleteNative, // no args\n CompleteWrapped, // no args\n TransferWrapped,\n TransferNative,\n RegisterChain, // no args\n CreateWrapped, // no args\n UpgradeContract, // no args\n CompleteNativeWithPayload, // no args\n CompleteWrappedWithPayload, // no args\n TransferWrappedWithPayload,\n TransferNativeWithPayload,\n}\n\nexport class TokenBridgeProcessor extends SolanaBaseProcessor {\n\n private readonly transferDataValues = [\n borsh.u32('nonce'),\n borsh.u64('amount'),\n borsh.u64('fee'),\n borsh.array(borsh.u8(undefined), 32, 'target_address'),\n borsh.u16('target_chain')\n ]\n // https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/api/transfer_payload.rs#L170\n private readonly transferDataWithPayloadValues = [\n borsh.u32('nonce'),\n borsh.u64('amount'),\n borsh.array(borsh.u8(undefined), 32, 'target_address'),\n borsh.u16('target_chain'),\n borsh.vecU8('payload'),\n borsh.option(borsh.publicKey(undefined), 'cpi_program_id')\n ]\n private readonly attestTokenValues = [\n borsh.u32('nonce')\n ]\n private readonly initializeDataValues = [\n borsh.publicKey('bridge')\n ]\n\n static bind(options: SolanaBindOptions): TokenBridgeProcessor {\n if (options && !options.name) {\n options.name = 'WormholeTokenBridge'\n }\n return new TokenBridgeProcessor(options)\n }\n\n decodeInstruction: (rawInstruction: string) => Instruction | null = (ins) => {\n const u8Arr = bs58.decode(ins)\n if (u8Arr.length === 0) {\n return null\n }\n\n let data: any\n // wormhole pass intruction's enum value as its first instrcution data\n switch (u8Arr[0]) {\n case TokenBridgeInstruction.Initialize:\n return {\n data: '',\n name: TokenBridgeInstruction[TokenBridgeInstruction.Initialize]\n }\n case TokenBridgeInstruction.TransferNative:\n // struct is defined at: https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/api/transfer.rs#L295\n data = borsh.struct(this.transferDataValues, 'TransferNativeData').decode(Buffer.from(u8Arr.slice(1)))\n return {\n data,\n name: TokenBridgeInstruction[TokenBridgeInstruction.TransferNative]\n }\n case TokenBridgeInstruction.TransferWrapped:\n // stuct is defined at: https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/api/transfer.rs#L295\n data = borsh.struct(this.transferDataValues, 'TransferWrappedData').decode(Buffer.from(u8Arr.slice(1)))\n return {\n data,\n name: TokenBridgeInstruction[TokenBridgeInstruction.TransferWrapped]\n }\n case TokenBridgeInstruction.TransferNativeWithPayload:\n data = borsh.struct(this.transferDataWithPayloadValues, 'TransferNativeWithPayloadData').decode(Buffer.from(u8Arr.slice(1)))\n return {\n data,\n name: TokenBridgeInstruction[TokenBridgeInstruction.TransferNativeWithPayload]\n }\n case TokenBridgeInstruction.TransferWrappedWithPayload:\n data = borsh.struct(this.transferDataWithPayloadValues, 'TransferWrappedWithPayloadData').decode(Buffer.from(u8Arr.slice(1)))\n return {\n data,\n name: TokenBridgeInstruction[TokenBridgeInstruction.TransferWrappedWithPayload]\n }\n case TokenBridgeInstruction.Initialize:\n data = borsh.struct(this.initializeDataValues, 'InitializeData').decode(Buffer.from(u8Arr.slice(1)))\n return {\n data,\n name: TokenBridgeInstruction[TokenBridgeInstruction.Initialize]\n }\n case TokenBridgeInstruction.AttestToken:\n data = borsh.struct(this.attestTokenValues, 'AttestTokenData').decode(Buffer.from(u8Arr.slice(1)))\n return {\n data,\n name: TokenBridgeInstruction[TokenBridgeInstruction.AttestToken]\n }\n case TokenBridgeInstruction.CompleteNative:\n case TokenBridgeInstruction.CompleteNativeWithPayload:\n case TokenBridgeInstruction.CompleteWrapped:\n case TokenBridgeInstruction.CompleteWrappedWithPayload:\n case TokenBridgeInstruction.CreateWrapped:\n case TokenBridgeInstruction.UpgradeContract:\n case TokenBridgeInstruction.RegisterChain:\n return {\n data: '',\n name: TokenBridgeInstruction[u8Arr[0]]\n }\n\n default:\n return null\n }\n }\n\n onInitialize(handler: (args: any, accounts: string[], ctx: SolanaContext) => void): TokenBridgeProcessor {\n this.onInstruction('Initialize', (ins: Instruction, ctx, accounts: string[]) => {\n if (ins) {\n handler(ins.data, accounts, ctx)\n }\n })\n return this\n }\n\n onAttestToken(handler: (args: any, accounts: string[], ctx: SolanaContext) => void): TokenBridgeProcessor {\n this.onInstruction('AttestToken', (ins: Instruction, ctx, accounts: string[]) => {\n if (ins) {\n handler(ins.data, accounts, ctx)\n }\n })\n return this\n }\n\n\n onTransferWrapped(handler: (args: any, accounts: string[], ctx: SolanaContext) => void): TokenBridgeProcessor {\n this.onInstruction('TransferWrapped', (ins: Instruction, ctx, accounts: string[]) => {\n if (ins) {\n handler(ins.data, accounts, ctx)\n }\n })\n return this\n }\n\n onTransferNativeWithPayload(handler: (args: any, accounts: string[], ctx: SolanaContext) => void): TokenBridgeProcessor {\n this.onInstruction('TransferNativeWithPayload', (ins: Instruction, ctx, accounts: string[]) => {\n if (ins) {\n handler(ins.data, accounts, ctx)\n }\n })\n return this\n }\n\n onTransferWrappedWithPaylod(handler: (args: any, accounts: string[], ctx: SolanaContext) => void): TokenBridgeProcessor {\n this.onInstruction('TransferWrappedWithPaylod', (ins: Instruction, ctx, accounts: string[]) => {\n if (ins) {\n handler(ins.data, accounts, ctx)\n }\n })\n return this\n }\n\n onTransferNative(handler: (args: any, accounts: string[], ctx: SolanaContext) => void): TokenBridgeProcessor {\n this.onInstruction('TransferNative', (ins: Instruction, ctx, accounts: string[]) => {\n if (ins) {\n handler(ins.data, accounts, ctx)\n }\n })\n return this\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"wormhole-processor.js","sourceRoot":"","sources":["../../../src/builtin/solana/wormhole-processor.ts"],"names":[],"mappings":"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","sourcesContent":["import { SolanaBaseProcessor, SolanaContext, SolanaBindOptions } from '@sentio/sdk'\nimport { Instruction } from '@project-serum/anchor'\nimport bs58 from 'bs58'\n\nimport {\n deserialize,\n field,\n vec, fixedArray, option,\n} from \"@dao-xyz/borsh\";\n\n// https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/lib.rs#L100\nenum TokenBridgeInstruction {\n Initialize = 0,\n AttestToken,\n CompleteNative, // no args\n CompleteWrapped, // no args\n TransferWrapped,\n TransferNative,\n RegisterChain, // no args\n CreateWrapped, // no args\n UpgradeContract, // no args\n CompleteNativeWithPayload, // no args\n CompleteWrappedWithPayload, // no args\n TransferWrappedWithPayload,\n TransferNativeWithPayload,\n}\n\nclass TransferDataValues {\n @field({ type: 'u32' })\n nonce: number\n\n @field({type: 'u64'})\n amount: bigint\n\n @field({type: 'u64'})\n fee: bigint\n\n @field({ type: fixedArray('u8', 32) })\n target_address: number[];\n\n @field({ type: 'u16' })\n target_chain: number\n\n constructor(data?: TransferDataValues) {\n if(data){\n Object.assign(this,data)\n }\n }\n}\n\nclass TransferNativeWithPayloadData {\n @field({ type: 'u32' })\n nonce: number\n\n @field({type: 'u64'})\n amount: bigint\n\n @field({type: 'u64'})\n fee: bigint\n\n @field({ type: fixedArray('u8', 32) })\n target_address: number[];\n\n @field({ type: 'u16' })\n target_chain: number\n\n @field({ type: vec('u8') })\n payload: number[];\n\n @field({type: option(fixedArray('u8', 32) )})\n cpi_program_id?: number[]\n\n constructor(data?: TransferNativeWithPayloadData) {\n if(data){\n Object.assign(this,data)\n }\n }\n}\n\nclass AttestTokenValues {\n @field({ type: 'u32' })\n nonce: number\n\n constructor(data?: AttestTokenValues) {\n if(data){\n Object.assign(this,data)\n }\n }\n}\n\nclass InitializeDataValues {\n @field({type: fixedArray('u8', 32) })\n bridge: number[]\n\n constructor(data?: InitializeDataValues) {\n if(data){\n Object.assign(this,data)\n }\n }\n}\n\nexport class TokenBridgeProcessor extends SolanaBaseProcessor {\n\n // private readonly transferDataValues = [\n // borsh.u32('nonce'),\n // borsh.u64('amount'),\n // borsh.u64('fee'),\n // borsh.array(borsh.u8(undefined), 32, 'target_address'),\n // borsh.u16('target_chain')\n // ]\n // https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/api/transfer_payload.rs#L170\n // private readonly transferDataWithPayloadValues = [\n // borsh.u32('nonce'),\n // borsh.u64('amount'),\n // borsh.array(borsh.u8(undefined), 32, 'target_address'),\n // borsh.u16('target_chain'),\n // borsh.vecU8('payload'),\n // borsh.option(borsh.publicKey(undefined), 'cpi_program_id')\n // ]\n // private readonly attestTokenValues = [\n // borsh.u32('nonce')\n // ]\n // private readonly initializeDataValues = [\n // borsh.publicKey('bridge')\n // ]\n\n static bind(options: SolanaBindOptions): TokenBridgeProcessor {\n if (options && !options.name) {\n options.name = 'WormholeTokenBridge'\n }\n return new TokenBridgeProcessor(options)\n }\n\n decodeInstruction: (rawInstruction: string) => Instruction | null = (ins) => {\n const u8Arr = bs58.decode(ins)\n if (u8Arr.length === 0) {\n return null\n }\n\n let data: any\n // wormhole pass intruction's enum value as its first instrcution data\n switch (u8Arr[0]) {\n case TokenBridgeInstruction.Initialize:\n return {\n data: '',\n name: TokenBridgeInstruction[TokenBridgeInstruction.Initialize]\n }\n case TokenBridgeInstruction.TransferNative:\n data = deserialize(Buffer.from(u8Arr.slice(1)), TransferDataValues)\n\n // struct is defined at: https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/api/transfer.rs#L295\n // data = borsh.struct(this.transferDataValues, 'TransferNativeData').decode(Buffer.from(u8Arr.slice(1)))\n return {\n data,\n name: TokenBridgeInstruction[TokenBridgeInstruction.TransferNative]\n }\n case TokenBridgeInstruction.TransferWrapped:\n data = deserialize(Buffer.from(u8Arr.slice(1)), TransferDataValues)\n\n // stuct is defined at: https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/api/transfer.rs#L295\n // data = borsh.struct(this.transferDataValues, 'TransferWrappedData').decode(Buffer.from(u8Arr.slice(1)))\n return {\n data,\n name: TokenBridgeInstruction[TokenBridgeInstruction.TransferWrapped]\n }\n case TokenBridgeInstruction.TransferNativeWithPayload:\n data = deserialize(Buffer.from(u8Arr.slice(1)), TransferNativeWithPayloadData)\n\n // data = borsh.struct(this.transferDataWithPayloadValues, 'TransferNativeWithPayloadData').decode(Buffer.from(u8Arr.slice(1)))\n return {\n data,\n name: TokenBridgeInstruction[TokenBridgeInstruction.TransferNativeWithPayload]\n }\n case TokenBridgeInstruction.TransferWrappedWithPayload:\n data = deserialize(Buffer.from(u8Arr.slice(1)), TransferNativeWithPayloadData)\n\n // data = borsh.struct(this.transferDataWithPayloadValues, 'TransferWrappedWithPayloadData').decode(Buffer.from(u8Arr.slice(1)))\n return {\n data,\n name: TokenBridgeInstruction[TokenBridgeInstruction.TransferWrappedWithPayload]\n }\n case TokenBridgeInstruction.Initialize:\n data = deserialize(Buffer.from(u8Arr.slice(1)), InitializeDataValues)\n\n // data = borsh.struct(this.initializeDataValues, 'InitializeData').decode(Buffer.from(u8Arr.slice(1)))\n return {\n data,\n name: TokenBridgeInstruction[TokenBridgeInstruction.Initialize]\n }\n case TokenBridgeInstruction.AttestToken:\n data = deserialize(Buffer.from(u8Arr.slice(1)), AttestTokenValues)\n\n // data = borsh.struct(this.attestTokenValues, 'AttestTokenData').decode(Buffer.from(u8Arr.slice(1)))\n return {\n data,\n name: TokenBridgeInstruction[TokenBridgeInstruction.AttestToken]\n }\n case TokenBridgeInstruction.CompleteNative:\n case TokenBridgeInstruction.CompleteNativeWithPayload:\n case TokenBridgeInstruction.CompleteWrapped:\n case TokenBridgeInstruction.CompleteWrappedWithPayload:\n case TokenBridgeInstruction.CreateWrapped:\n case TokenBridgeInstruction.UpgradeContract:\n case TokenBridgeInstruction.RegisterChain:\n return {\n data: '',\n name: TokenBridgeInstruction[u8Arr[0]]\n }\n\n default:\n return null\n }\n }\n\n onInitialize(handler: (args: any, accounts: string[], ctx: SolanaContext) => void): TokenBridgeProcessor {\n this.onInstruction('Initialize', (ins: Instruction, ctx, accounts: string[]) => {\n if (ins) {\n handler(ins.data, accounts, ctx)\n }\n })\n return this\n }\n\n onAttestToken(handler: (args: any, accounts: string[], ctx: SolanaContext) => void): TokenBridgeProcessor {\n this.onInstruction('AttestToken', (ins: Instruction, ctx, accounts: string[]) => {\n if (ins) {\n handler(ins.data, accounts, ctx)\n }\n })\n return this\n }\n\n\n onTransferWrapped(handler: (args: any, accounts: string[], ctx: SolanaContext) => void): TokenBridgeProcessor {\n this.onInstruction('TransferWrapped', (ins: Instruction, ctx, accounts: string[]) => {\n if (ins) {\n handler(ins.data, accounts, ctx)\n }\n })\n return this\n }\n\n onTransferNativeWithPayload(handler: (args: any, accounts: string[], ctx: SolanaContext) => void): TokenBridgeProcessor {\n this.onInstruction('TransferNativeWithPayload', (ins: Instruction, ctx, accounts: string[]) => {\n if (ins) {\n handler(ins.data, accounts, ctx)\n }\n })\n return this\n }\n\n onTransferWrappedWithPaylod(handler: (args: any, accounts: string[], ctx: SolanaContext) => void): TokenBridgeProcessor {\n this.onInstruction('TransferWrappedWithPaylod', (ins: Instruction, ctx, accounts: string[]) => {\n if (ins) {\n handler(ins.data, accounts, ctx)\n }\n })\n return this\n }\n\n onTransferNative(handler: (args: any, accounts: string[], ctx: SolanaContext) => void): TokenBridgeProcessor {\n this.onInstruction('TransferNative', (ins: Instruction, ctx, accounts: string[]) => {\n if (ins) {\n handler(ins.data, accounts, ctx)\n }\n })\n return this\n }\n}\n"]}
|
package/lib/core/numberish.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { BigNumber } from 'ethers';
|
|
|
2
2
|
import { BigInteger, MetricValue } from '@sentio/protos';
|
|
3
3
|
import { BigDecimal } from '.';
|
|
4
4
|
import { BlockTag } from '@ethersproject/providers';
|
|
5
|
-
export declare type Numberish = number | BigNumber | bigint | BigDecimal;
|
|
5
|
+
export declare type Numberish = number | BigNumber | bigint | BigDecimal | string;
|
|
6
6
|
export declare function toBlockTag(a: number | bigint): BlockTag;
|
|
7
7
|
export declare function toMetricValue(value: Numberish): MetricValue;
|
|
8
8
|
export declare function toBigInteger(a: Numberish): BigInteger;
|
package/lib/core/numberish.js
CHANGED
|
@@ -4,7 +4,6 @@ exports.toBigInteger = exports.toMetricValue = exports.toBlockTag = void 0;
|
|
|
4
4
|
const ethers_1 = require("ethers");
|
|
5
5
|
const protos_1 = require("@sentio/protos");
|
|
6
6
|
const _1 = require(".");
|
|
7
|
-
const anchor_1 = require("@project-serum/anchor");
|
|
8
7
|
function toBlockTag(a) {
|
|
9
8
|
if (typeof a === 'number') {
|
|
10
9
|
return a;
|
|
@@ -41,9 +40,9 @@ function toMetricValue(value) {
|
|
|
41
40
|
});
|
|
42
41
|
}
|
|
43
42
|
}
|
|
44
|
-
if (
|
|
43
|
+
if (typeof value === 'string') {
|
|
45
44
|
return protos_1.MetricValue.fromPartial({
|
|
46
|
-
|
|
45
|
+
bigDecimal: value,
|
|
47
46
|
});
|
|
48
47
|
}
|
|
49
48
|
if (typeof value === 'bigint' || Number.isInteger(value)) {
|
|
@@ -71,13 +70,6 @@ function bigDecimalToBigInteger(a) {
|
|
|
71
70
|
}
|
|
72
71
|
return hexToBigInteger(a.toString(16), negative);
|
|
73
72
|
}
|
|
74
|
-
function bnToBigInteger(a) {
|
|
75
|
-
const negative = a.isNeg();
|
|
76
|
-
if (negative) {
|
|
77
|
-
a = a.abs();
|
|
78
|
-
}
|
|
79
|
-
return hexToBigInteger(a.toString(16), negative);
|
|
80
|
-
}
|
|
81
73
|
function intToBigInteger(a) {
|
|
82
74
|
const negative = a < 0;
|
|
83
75
|
if (negative) {
|
|
@@ -89,12 +81,12 @@ function toBigInteger(a) {
|
|
|
89
81
|
if (a instanceof _1.BigDecimal) {
|
|
90
82
|
return bigDecimalToBigInteger(a);
|
|
91
83
|
}
|
|
92
|
-
if (a instanceof anchor_1.BN) {
|
|
93
|
-
return bnToBigInteger(a);
|
|
94
|
-
}
|
|
95
84
|
if (a instanceof ethers_1.BigNumber) {
|
|
96
85
|
return intToBigInteger(a.toBigInt());
|
|
97
86
|
}
|
|
87
|
+
if (typeof a === 'string') {
|
|
88
|
+
return intToBigInteger(BigInt(a));
|
|
89
|
+
}
|
|
98
90
|
return intToBigInteger(a);
|
|
99
91
|
// Following code is actually very slow
|
|
100
92
|
// while (a > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"numberish.js","sourceRoot":"","sources":["../../src/core/numberish.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAClC,2CAAwD;AACxD,wBAA8B;
|
|
1
|
+
{"version":3,"file":"numberish.js","sourceRoot":"","sources":["../../src/core/numberish.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from 'ethers'\nimport { BigInteger, MetricValue } from '@sentio/protos'\nimport { BigDecimal } from '.'\nimport { BlockTag } from '@ethersproject/providers'\n\nexport type Numberish = number | BigNumber | bigint | BigDecimal | string\n\nexport function toBlockTag(a: number | bigint): BlockTag {\n if (typeof a === 'number') {\n return a\n }\n if (a > Number.MAX_SAFE_INTEGER) {\n return '0x' + a.toString(16)\n }\n return Number(a)\n}\n\nexport function toMetricValue(value: Numberish): MetricValue {\n if (value instanceof BigNumber) {\n return MetricValue.fromPartial({\n bigInteger: toBigInteger(value.toBigInt()),\n })\n }\n if (value instanceof BigDecimal) {\n // Carefully consider the use case here\n if (value.isInteger()) {\n return MetricValue.fromPartial({\n bigInteger: bigDecimalToBigInteger(value),\n })\n } else {\n if (value.isNaN()) {\n throw new Error('Cannot record NaN value')\n }\n if (!value.isFinite()) {\n // NaN also not finite\n throw new Error('Cannot record infinite value')\n }\n return MetricValue.fromPartial({\n bigDecimal: value.toString(), // e.g. -7.350918e-428\n })\n }\n }\n if (typeof value === 'string') {\n return MetricValue.fromPartial({\n bigDecimal: value,\n })\n }\n if (typeof value === 'bigint' || Number.isInteger(value)) {\n return MetricValue.fromPartial({\n bigInteger: toBigInteger(value),\n })\n }\n\n if (typeof value === 'number') {\n if (Number.isNaN(value)) {\n throw new Error('Cannot record NaN value')\n }\n if (!Number.isFinite(value)) {\n throw new Error('Cannot record infinite value')\n }\n }\n\n return MetricValue.fromPartial({\n doubleValue: Number(value),\n })\n}\n\nfunction bigDecimalToBigInteger(a: BigDecimal): BigInteger {\n const negative = a.isNegative()\n if (negative) {\n a = a.abs()\n }\n return hexToBigInteger(a.toString(16), negative)\n}\n\nfunction intToBigInteger(a: bigint | number): BigInteger {\n const negative = a < 0\n if (negative) {\n a = -a\n }\n return hexToBigInteger(a.toString(16), negative)\n}\n\nexport function toBigInteger(a: Numberish): BigInteger {\n if (a instanceof BigDecimal) {\n return bigDecimalToBigInteger(a)\n }\n\n if (a instanceof BigNumber) {\n return intToBigInteger(a.toBigInt())\n }\n if (typeof a === 'string') {\n return intToBigInteger(BigInt(a))\n }\n\n return intToBigInteger(a)\n\n // Following code is actually very slow\n // while (a > 0) {\n // const d = a & 0xffn\n // a >>= 8n\n // value.push(Number(d))\n // }\n //\n // return {\n // negative, value: new Uint8Array(value.reverse()),\n // }\n}\n\nfunction hexToBigInteger(hex: string, negative: boolean): BigInteger {\n if (hex.length % 2 === 1) {\n hex = '0' + hex\n }\n const buffer = Buffer.from(hex, 'hex')\n\n return {\n negative: negative,\n data: new Uint8Array(buffer),\n }\n}\n"]}
|
|
@@ -34,7 +34,7 @@ function codeGenSolanaIdlProcessor(idlObj) {
|
|
|
34
34
|
const idlName = idlObj.name;
|
|
35
35
|
const idlNamePascalCase = toPascalCase(idlName);
|
|
36
36
|
const instructions = idlObj.instructions;
|
|
37
|
-
return `import { BorshInstructionCoder, Instruction, Idl
|
|
37
|
+
return `import { BorshInstructionCoder, Instruction, Idl } from '@project-serum/anchor'
|
|
38
38
|
import { SolanaBaseProcessor, SolanaContext, SolanaBindOptions } from "@sentio/sdk"
|
|
39
39
|
import { ${idlName}_idl } from "./${idlName}"
|
|
40
40
|
import bs58 from 'bs58'
|
|
@@ -60,12 +60,13 @@ export class ${idlNamePascalCase}Processor extends SolanaBaseProcessor {
|
|
|
60
60
|
}
|
|
61
61
|
function codeGenSolanaInstruction(idlName, ins) {
|
|
62
62
|
const instructionName = ins.name;
|
|
63
|
-
const argsTypeString = codeGenInstructionArgs(ins.args);
|
|
64
63
|
return `
|
|
65
|
-
on${instructionName.charAt(0).toUpperCase() + instructionName.slice(1)}(handler: (args: ${
|
|
64
|
+
on${instructionName.charAt(0).toUpperCase() + instructionName.slice(1)}(handler: (args: ${codeGenInstructionArgsType(ins.args)}, accounts: string[], ctx: SolanaContext) => void): ${idlName}Processor {
|
|
66
65
|
this.onInstruction('${instructionName}', (ins: Instruction, ctx, accounts: string[]) => {
|
|
66
|
+
const origin = ins.data as any
|
|
67
|
+
const data = ${codeGenInstructionArgs(ins.args)}
|
|
67
68
|
if (ins) {
|
|
68
|
-
handler(
|
|
69
|
+
handler(data, accounts, ctx)
|
|
69
70
|
}
|
|
70
71
|
})
|
|
71
72
|
return this
|
|
@@ -73,6 +74,16 @@ function codeGenSolanaInstruction(idlName, ins) {
|
|
|
73
74
|
`;
|
|
74
75
|
}
|
|
75
76
|
function codeGenInstructionArgs(args) {
|
|
77
|
+
return `{ ${args.map((arg) => codeGenInstructionArg(arg.name, arg.type)).join(', ')} }`;
|
|
78
|
+
}
|
|
79
|
+
function codeGenInstructionArg(name, type) {
|
|
80
|
+
const mType = mapType(type);
|
|
81
|
+
if (mType === 'bigint') {
|
|
82
|
+
return `${name}: BigInt(origin.${name}.toString())`;
|
|
83
|
+
}
|
|
84
|
+
return `${name}: origin.${name} as ${mType}`;
|
|
85
|
+
}
|
|
86
|
+
function codeGenInstructionArgsType(args) {
|
|
76
87
|
return `{ ${args.map((arg) => arg.name + ': ' + mapType(arg.type)).join(', ')} }`;
|
|
77
88
|
}
|
|
78
89
|
// Reference: https://github.com/coral-xyz/anchor/blob/93332766f13e86efbe77c9986722731742317ede/ts/src/program/namespace/types.ts#L104
|
|
@@ -97,7 +108,7 @@ function mapType(tpe) {
|
|
|
97
108
|
case 'i64':
|
|
98
109
|
case 'u128':
|
|
99
110
|
case 'i128':
|
|
100
|
-
return '
|
|
111
|
+
return 'bigint';
|
|
101
112
|
default:
|
|
102
113
|
return 'any';
|
|
103
114
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../src/solana-codegen/codegen.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AACvB,4CAAmB;AACnB,kDAAyB;AAEzB,SAAgB,sBAAsB,CAAC,OAAe,EAAE,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC;IACtG,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAM;KACP;IAED,MAAM,SAAS,GAAG,YAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IAEzC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAA;KACvD;IAED,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE;QAC5B,IAAI,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE;YAClC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;gBAC9B,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;aAC9C;YACD,MAAM,UAAU,GAAG,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YACrC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAA;YAC3B,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,KAAK,CAAC,CAAA;YACtD,YAAE,CAAC,aAAa,CAAC,OAAO,EAAE,gBAAgB,OAAO,UAAU,UAAU,EAAE,CAAC,CAAA;YACxE,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,OAAO,eAAe,CAAC,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAA;SACtG;KACF;AACH,CAAC;AAxBD,wDAwBC;AAED,SAAS,yBAAyB,CAAC,MAAW;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAA;IAC3B,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IAC/C,MAAM,YAAY,GAAU,MAAM,CAAC,YAAY,CAAA;IAC/C,OAAO;;WAEE,OAAO,kBAAkB,OAAO;;;;eAI5B,iBAAiB;6CACa,iBAAiB;;wBAEtC,iBAAiB;;iBAExB,iBAAiB;;;;yDAIuB,OAAO;;;;;IAK5D,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,wBAAwB,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;GAErF,CAAA;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe,EAAE,GAAQ;IACzD,MAAM,eAAe,GAAG,GAAG,CAAC,IAAI,CAAA;IAChC,MAAM,
|
|
1
|
+
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../src/solana-codegen/codegen.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path'\nimport fs from 'fs'\nimport chalk from 'chalk'\n\nexport function codeGenSolanaProcessor(abisDir: string, targetPath = path.join('src', 'types', 'solana')) {\n if (!fs.existsSync(abisDir)) {\n return\n }\n\n const abisFiles = fs.readdirSync(abisDir)\n\n if (abisFiles.length > 0) {\n console.log(chalk.green('Generated Types for Solana'))\n }\n\n for (const file of abisFiles) {\n if (path.extname(file) === '.json') {\n if (!fs.existsSync(targetPath)) {\n fs.mkdirSync(targetPath, { recursive: true })\n }\n const idlContent = fs.readFileSync(path.join(abisDir, file), 'utf-8')\n const idlObj = JSON.parse(idlContent)\n const idlName = idlObj.name\n const idlFile = path.join(targetPath, idlName + '.ts')\n fs.writeFileSync(idlFile, `export const ${idlName}_idl = ${idlContent}`)\n fs.writeFileSync(path.join(targetPath, `${idlName}_processor.ts`), codeGenSolanaIdlProcessor(idlObj))\n }\n }\n}\n\nfunction codeGenSolanaIdlProcessor(idlObj: any): string {\n const idlName = idlObj.name\n const idlNamePascalCase = toPascalCase(idlName)\n const instructions: any[] = idlObj.instructions\n return `import { BorshInstructionCoder, Instruction, Idl } from '@project-serum/anchor'\nimport { SolanaBaseProcessor, SolanaContext, SolanaBindOptions } from \"@sentio/sdk\"\nimport { ${idlName}_idl } from \"./${idlName}\"\nimport bs58 from 'bs58'\nimport { PublicKey } from '@solana/web3.js'\n\nexport class ${idlNamePascalCase}Processor extends SolanaBaseProcessor {\n static bind(options: SolanaBindOptions): ${idlNamePascalCase}Processor {\n if (options && !options.name) {\n options.name = '${idlNamePascalCase}'\n }\n return new ${idlNamePascalCase}Processor(options)\n }\n\n decodeInstruction: (rawInstruction: string) => Instruction | null = (rawInstruction) => {\n const instructionCoder = new BorshInstructionCoder(${idlName}_idl as Idl)\n const decodedIns = instructionCoder.decode(Buffer.from(bs58.decode(rawInstruction)))\n return decodedIns\n }\n\n ${instructions.map((ins) => codeGenSolanaInstruction(idlNamePascalCase, ins)).join('')}\n}\n `\n}\n\nfunction codeGenSolanaInstruction(idlName: string, ins: any): string {\n const instructionName = ins.name\n return `\n on${instructionName.charAt(0).toUpperCase() + instructionName.slice(1)}(handler: (args: ${codeGenInstructionArgsType(\n ins.args\n )}, accounts: string[], ctx: SolanaContext) => void): ${idlName}Processor {\n this.onInstruction('${instructionName}', (ins: Instruction, ctx, accounts: string[]) => {\n const origin = ins.data as any\n const data = ${codeGenInstructionArgs(ins.args)}\n if (ins) {\n handler(data, accounts, ctx)\n }\n })\n return this\n }\n `\n}\n\nfunction codeGenInstructionArgs(args: { name: string; type: string }[]): string {\n return `{ ${args.map((arg) => codeGenInstructionArg(arg.name, arg.type)).join(', ')} }`\n}\n\nfunction codeGenInstructionArg(name: string, type: string): string {\n const mType = mapType(type)\n if (mType === 'bigint') {\n return `${name}: BigInt(origin.${name}.toString())`\n }\n return `${name}: origin.${name} as ${mType}`\n}\n\nfunction codeGenInstructionArgsType(args: { name: string; type: string }[]): string {\n return `{ ${args.map((arg) => arg.name + ': ' + mapType(arg.type)).join(', ')} }`\n}\n\n// Reference: https://github.com/coral-xyz/anchor/blob/93332766f13e86efbe77c9986722731742317ede/ts/src/program/namespace/types.ts#L104\nfunction mapType(tpe: string): string {\n switch (tpe) {\n case 'publicKey':\n return 'PublicKey'\n case 'bool':\n return 'boolean'\n case 'string':\n return 'string'\n case 'u8':\n case 'i8':\n case 'u16':\n case 'i16':\n case 'u32':\n case 'i32':\n case 'f32':\n case 'f64':\n return 'number'\n case 'u64':\n case 'i64':\n case 'u128':\n case 'i128':\n return 'bigint'\n default:\n return 'any'\n }\n}\n\nfunction toPascalCase(str: string) {\n return `${str}`\n .toLowerCase()\n .replace(new RegExp(/[-_]+/, 'g'), ' ')\n .replace(new RegExp(/[^\\w\\s]/, 'g'), '')\n .replace(new RegExp(/\\s+(.)(\\w*)/, 'g'), ($1, $2, $3) => `${$2.toUpperCase() + $3}`)\n .replace(new RegExp(/\\w/), (s) => s.toUpperCase())\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentio/sdk",
|
|
3
3
|
"license": "Apache-2.0",
|
|
4
|
-
"version": "1.37.0-rc.
|
|
4
|
+
"version": "1.37.0-rc.2",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"compile_target": "yarn tsc -b src/target-ethers-sentio/tsconfig.json",
|
|
7
7
|
"compile": "tsc -p . && cp src/utils/*.csv lib/utils",
|
|
@@ -20,11 +20,12 @@
|
|
|
20
20
|
"docs": "typedoc --options typedoc.json"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
+
"@dao-xyz/borsh": "^4.0.7",
|
|
23
24
|
"@ethersproject/providers": "~5.7.0",
|
|
24
25
|
"@project-serum/anchor": "^0.26.0",
|
|
25
|
-
"@sentio/base": "^1.37.0-rc.
|
|
26
|
+
"@sentio/base": "^1.37.0-rc.2",
|
|
26
27
|
"@sentio/cli": "^1.0.0",
|
|
27
|
-
"@sentio/protos": "^1.37.0-rc.
|
|
28
|
+
"@sentio/protos": "^1.37.0-rc.2",
|
|
28
29
|
"@solana/web3.js": "^1.47.3",
|
|
29
30
|
"@typechain/ethers-v5": "^10.0.0",
|
|
30
31
|
"@types/bn.js": "^5.1.0",
|
|
@@ -75,5 +76,5 @@
|
|
|
75
76
|
"engines": {
|
|
76
77
|
"node": ">=16"
|
|
77
78
|
},
|
|
78
|
-
"gitHead": "
|
|
79
|
+
"gitHead": "e7a7edd814d7afe33acd279e7770e9533827e1d7"
|
|
79
80
|
}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { SolanaBaseProcessor, SolanaContext, SolanaBindOptions } from '@sentio/sdk'
|
|
2
2
|
import { Instruction } from '@project-serum/anchor'
|
|
3
|
-
import * as borsh from "@coral-xyz/borsh";
|
|
4
3
|
import bs58 from 'bs58'
|
|
5
4
|
|
|
5
|
+
import {
|
|
6
|
+
deserialize,
|
|
7
|
+
field,
|
|
8
|
+
vec, fixedArray, option,
|
|
9
|
+
} from "@dao-xyz/borsh";
|
|
10
|
+
|
|
6
11
|
// https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/lib.rs#L100
|
|
7
12
|
enum TokenBridgeInstruction {
|
|
8
13
|
Initialize = 0,
|
|
@@ -20,30 +25,104 @@ enum TokenBridgeInstruction {
|
|
|
20
25
|
TransferNativeWithPayload,
|
|
21
26
|
}
|
|
22
27
|
|
|
28
|
+
class TransferDataValues {
|
|
29
|
+
@field({ type: 'u32' })
|
|
30
|
+
nonce: number
|
|
31
|
+
|
|
32
|
+
@field({type: 'u64'})
|
|
33
|
+
amount: bigint
|
|
34
|
+
|
|
35
|
+
@field({type: 'u64'})
|
|
36
|
+
fee: bigint
|
|
37
|
+
|
|
38
|
+
@field({ type: fixedArray('u8', 32) })
|
|
39
|
+
target_address: number[];
|
|
40
|
+
|
|
41
|
+
@field({ type: 'u16' })
|
|
42
|
+
target_chain: number
|
|
43
|
+
|
|
44
|
+
constructor(data?: TransferDataValues) {
|
|
45
|
+
if(data){
|
|
46
|
+
Object.assign(this,data)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
class TransferNativeWithPayloadData {
|
|
52
|
+
@field({ type: 'u32' })
|
|
53
|
+
nonce: number
|
|
54
|
+
|
|
55
|
+
@field({type: 'u64'})
|
|
56
|
+
amount: bigint
|
|
57
|
+
|
|
58
|
+
@field({type: 'u64'})
|
|
59
|
+
fee: bigint
|
|
60
|
+
|
|
61
|
+
@field({ type: fixedArray('u8', 32) })
|
|
62
|
+
target_address: number[];
|
|
63
|
+
|
|
64
|
+
@field({ type: 'u16' })
|
|
65
|
+
target_chain: number
|
|
66
|
+
|
|
67
|
+
@field({ type: vec('u8') })
|
|
68
|
+
payload: number[];
|
|
69
|
+
|
|
70
|
+
@field({type: option(fixedArray('u8', 32) )})
|
|
71
|
+
cpi_program_id?: number[]
|
|
72
|
+
|
|
73
|
+
constructor(data?: TransferNativeWithPayloadData) {
|
|
74
|
+
if(data){
|
|
75
|
+
Object.assign(this,data)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
class AttestTokenValues {
|
|
81
|
+
@field({ type: 'u32' })
|
|
82
|
+
nonce: number
|
|
83
|
+
|
|
84
|
+
constructor(data?: AttestTokenValues) {
|
|
85
|
+
if(data){
|
|
86
|
+
Object.assign(this,data)
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
class InitializeDataValues {
|
|
92
|
+
@field({type: fixedArray('u8', 32) })
|
|
93
|
+
bridge: number[]
|
|
94
|
+
|
|
95
|
+
constructor(data?: InitializeDataValues) {
|
|
96
|
+
if(data){
|
|
97
|
+
Object.assign(this,data)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
23
102
|
export class TokenBridgeProcessor extends SolanaBaseProcessor {
|
|
24
103
|
|
|
25
|
-
private readonly transferDataValues = [
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
]
|
|
104
|
+
// private readonly transferDataValues = [
|
|
105
|
+
// borsh.u32('nonce'),
|
|
106
|
+
// borsh.u64('amount'),
|
|
107
|
+
// borsh.u64('fee'),
|
|
108
|
+
// borsh.array(borsh.u8(undefined), 32, 'target_address'),
|
|
109
|
+
// borsh.u16('target_chain')
|
|
110
|
+
// ]
|
|
32
111
|
// https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/api/transfer_payload.rs#L170
|
|
33
|
-
private readonly transferDataWithPayloadValues = [
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
]
|
|
41
|
-
private readonly attestTokenValues = [
|
|
42
|
-
|
|
43
|
-
]
|
|
44
|
-
private readonly initializeDataValues = [
|
|
45
|
-
|
|
46
|
-
]
|
|
112
|
+
// private readonly transferDataWithPayloadValues = [
|
|
113
|
+
// borsh.u32('nonce'),
|
|
114
|
+
// borsh.u64('amount'),
|
|
115
|
+
// borsh.array(borsh.u8(undefined), 32, 'target_address'),
|
|
116
|
+
// borsh.u16('target_chain'),
|
|
117
|
+
// borsh.vecU8('payload'),
|
|
118
|
+
// borsh.option(borsh.publicKey(undefined), 'cpi_program_id')
|
|
119
|
+
// ]
|
|
120
|
+
// private readonly attestTokenValues = [
|
|
121
|
+
// borsh.u32('nonce')
|
|
122
|
+
// ]
|
|
123
|
+
// private readonly initializeDataValues = [
|
|
124
|
+
// borsh.publicKey('bridge')
|
|
125
|
+
// ]
|
|
47
126
|
|
|
48
127
|
static bind(options: SolanaBindOptions): TokenBridgeProcessor {
|
|
49
128
|
if (options && !options.name) {
|
|
@@ -67,39 +146,51 @@ export class TokenBridgeProcessor extends SolanaBaseProcessor {
|
|
|
67
146
|
name: TokenBridgeInstruction[TokenBridgeInstruction.Initialize]
|
|
68
147
|
}
|
|
69
148
|
case TokenBridgeInstruction.TransferNative:
|
|
149
|
+
data = deserialize(Buffer.from(u8Arr.slice(1)), TransferDataValues)
|
|
150
|
+
|
|
70
151
|
// struct is defined at: https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/api/transfer.rs#L295
|
|
71
|
-
data = borsh.struct(this.transferDataValues, 'TransferNativeData').decode(Buffer.from(u8Arr.slice(1)))
|
|
152
|
+
// data = borsh.struct(this.transferDataValues, 'TransferNativeData').decode(Buffer.from(u8Arr.slice(1)))
|
|
72
153
|
return {
|
|
73
154
|
data,
|
|
74
155
|
name: TokenBridgeInstruction[TokenBridgeInstruction.TransferNative]
|
|
75
156
|
}
|
|
76
157
|
case TokenBridgeInstruction.TransferWrapped:
|
|
158
|
+
data = deserialize(Buffer.from(u8Arr.slice(1)), TransferDataValues)
|
|
159
|
+
|
|
77
160
|
// stuct is defined at: https://github.com/certusone/wormhole/blob/8818d4b8f0471095dd48fa6f5da9c315cbfc9b52/solana/modules/token_bridge/program/src/api/transfer.rs#L295
|
|
78
|
-
data = borsh.struct(this.transferDataValues, 'TransferWrappedData').decode(Buffer.from(u8Arr.slice(1)))
|
|
161
|
+
// data = borsh.struct(this.transferDataValues, 'TransferWrappedData').decode(Buffer.from(u8Arr.slice(1)))
|
|
79
162
|
return {
|
|
80
163
|
data,
|
|
81
164
|
name: TokenBridgeInstruction[TokenBridgeInstruction.TransferWrapped]
|
|
82
165
|
}
|
|
83
166
|
case TokenBridgeInstruction.TransferNativeWithPayload:
|
|
84
|
-
data =
|
|
167
|
+
data = deserialize(Buffer.from(u8Arr.slice(1)), TransferNativeWithPayloadData)
|
|
168
|
+
|
|
169
|
+
// data = borsh.struct(this.transferDataWithPayloadValues, 'TransferNativeWithPayloadData').decode(Buffer.from(u8Arr.slice(1)))
|
|
85
170
|
return {
|
|
86
171
|
data,
|
|
87
172
|
name: TokenBridgeInstruction[TokenBridgeInstruction.TransferNativeWithPayload]
|
|
88
173
|
}
|
|
89
174
|
case TokenBridgeInstruction.TransferWrappedWithPayload:
|
|
90
|
-
data =
|
|
175
|
+
data = deserialize(Buffer.from(u8Arr.slice(1)), TransferNativeWithPayloadData)
|
|
176
|
+
|
|
177
|
+
// data = borsh.struct(this.transferDataWithPayloadValues, 'TransferWrappedWithPayloadData').decode(Buffer.from(u8Arr.slice(1)))
|
|
91
178
|
return {
|
|
92
179
|
data,
|
|
93
180
|
name: TokenBridgeInstruction[TokenBridgeInstruction.TransferWrappedWithPayload]
|
|
94
181
|
}
|
|
95
182
|
case TokenBridgeInstruction.Initialize:
|
|
96
|
-
data =
|
|
183
|
+
data = deserialize(Buffer.from(u8Arr.slice(1)), InitializeDataValues)
|
|
184
|
+
|
|
185
|
+
// data = borsh.struct(this.initializeDataValues, 'InitializeData').decode(Buffer.from(u8Arr.slice(1)))
|
|
97
186
|
return {
|
|
98
187
|
data,
|
|
99
188
|
name: TokenBridgeInstruction[TokenBridgeInstruction.Initialize]
|
|
100
189
|
}
|
|
101
190
|
case TokenBridgeInstruction.AttestToken:
|
|
102
|
-
data =
|
|
191
|
+
data = deserialize(Buffer.from(u8Arr.slice(1)), AttestTokenValues)
|
|
192
|
+
|
|
193
|
+
// data = borsh.struct(this.attestTokenValues, 'AttestTokenData').decode(Buffer.from(u8Arr.slice(1)))
|
|
103
194
|
return {
|
|
104
195
|
data,
|
|
105
196
|
name: TokenBridgeInstruction[TokenBridgeInstruction.AttestToken]
|
package/src/core/numberish.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { BigNumber } from 'ethers'
|
|
2
2
|
import { BigInteger, MetricValue } from '@sentio/protos'
|
|
3
3
|
import { BigDecimal } from '.'
|
|
4
|
-
import { BN } from '@project-serum/anchor'
|
|
5
4
|
import { BlockTag } from '@ethersproject/providers'
|
|
6
5
|
|
|
7
|
-
export type Numberish = number | BigNumber | bigint | BigDecimal
|
|
6
|
+
export type Numberish = number | BigNumber | bigint | BigDecimal | string
|
|
8
7
|
|
|
9
8
|
export function toBlockTag(a: number | bigint): BlockTag {
|
|
10
9
|
if (typeof a === 'number') {
|
|
@@ -41,9 +40,9 @@ export function toMetricValue(value: Numberish): MetricValue {
|
|
|
41
40
|
})
|
|
42
41
|
}
|
|
43
42
|
}
|
|
44
|
-
if (
|
|
43
|
+
if (typeof value === 'string') {
|
|
45
44
|
return MetricValue.fromPartial({
|
|
46
|
-
|
|
45
|
+
bigDecimal: value,
|
|
47
46
|
})
|
|
48
47
|
}
|
|
49
48
|
if (typeof value === 'bigint' || Number.isInteger(value)) {
|
|
@@ -74,14 +73,6 @@ function bigDecimalToBigInteger(a: BigDecimal): BigInteger {
|
|
|
74
73
|
return hexToBigInteger(a.toString(16), negative)
|
|
75
74
|
}
|
|
76
75
|
|
|
77
|
-
function bnToBigInteger(a: BN): BigInteger {
|
|
78
|
-
const negative = a.isNeg()
|
|
79
|
-
if (negative) {
|
|
80
|
-
a = a.abs()
|
|
81
|
-
}
|
|
82
|
-
return hexToBigInteger(a.toString(16), negative)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
76
|
function intToBigInteger(a: bigint | number): BigInteger {
|
|
86
77
|
const negative = a < 0
|
|
87
78
|
if (negative) {
|
|
@@ -94,12 +85,14 @@ export function toBigInteger(a: Numberish): BigInteger {
|
|
|
94
85
|
if (a instanceof BigDecimal) {
|
|
95
86
|
return bigDecimalToBigInteger(a)
|
|
96
87
|
}
|
|
97
|
-
|
|
98
|
-
return bnToBigInteger(a)
|
|
99
|
-
}
|
|
88
|
+
|
|
100
89
|
if (a instanceof BigNumber) {
|
|
101
90
|
return intToBigInteger(a.toBigInt())
|
|
102
91
|
}
|
|
92
|
+
if (typeof a === 'string') {
|
|
93
|
+
return intToBigInteger(BigInt(a))
|
|
94
|
+
}
|
|
95
|
+
|
|
103
96
|
return intToBigInteger(a)
|
|
104
97
|
|
|
105
98
|
// Following code is actually very slow
|
|
@@ -32,7 +32,7 @@ function codeGenSolanaIdlProcessor(idlObj: any): string {
|
|
|
32
32
|
const idlName = idlObj.name
|
|
33
33
|
const idlNamePascalCase = toPascalCase(idlName)
|
|
34
34
|
const instructions: any[] = idlObj.instructions
|
|
35
|
-
return `import { BorshInstructionCoder, Instruction, Idl
|
|
35
|
+
return `import { BorshInstructionCoder, Instruction, Idl } from '@project-serum/anchor'
|
|
36
36
|
import { SolanaBaseProcessor, SolanaContext, SolanaBindOptions } from "@sentio/sdk"
|
|
37
37
|
import { ${idlName}_idl } from "./${idlName}"
|
|
38
38
|
import bs58 from 'bs58'
|
|
@@ -59,14 +59,15 @@ export class ${idlNamePascalCase}Processor extends SolanaBaseProcessor {
|
|
|
59
59
|
|
|
60
60
|
function codeGenSolanaInstruction(idlName: string, ins: any): string {
|
|
61
61
|
const instructionName = ins.name
|
|
62
|
-
const argsTypeString = codeGenInstructionArgs(ins.args)
|
|
63
62
|
return `
|
|
64
|
-
on${
|
|
65
|
-
|
|
66
|
-
}
|
|
63
|
+
on${instructionName.charAt(0).toUpperCase() + instructionName.slice(1)}(handler: (args: ${codeGenInstructionArgsType(
|
|
64
|
+
ins.args
|
|
65
|
+
)}, accounts: string[], ctx: SolanaContext) => void): ${idlName}Processor {
|
|
67
66
|
this.onInstruction('${instructionName}', (ins: Instruction, ctx, accounts: string[]) => {
|
|
67
|
+
const origin = ins.data as any
|
|
68
|
+
const data = ${codeGenInstructionArgs(ins.args)}
|
|
68
69
|
if (ins) {
|
|
69
|
-
handler(
|
|
70
|
+
handler(data, accounts, ctx)
|
|
70
71
|
}
|
|
71
72
|
})
|
|
72
73
|
return this
|
|
@@ -75,6 +76,18 @@ function codeGenSolanaInstruction(idlName: string, ins: any): string {
|
|
|
75
76
|
}
|
|
76
77
|
|
|
77
78
|
function codeGenInstructionArgs(args: { name: string; type: string }[]): string {
|
|
79
|
+
return `{ ${args.map((arg) => codeGenInstructionArg(arg.name, arg.type)).join(', ')} }`
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function codeGenInstructionArg(name: string, type: string): string {
|
|
83
|
+
const mType = mapType(type)
|
|
84
|
+
if (mType === 'bigint') {
|
|
85
|
+
return `${name}: BigInt(origin.${name}.toString())`
|
|
86
|
+
}
|
|
87
|
+
return `${name}: origin.${name} as ${mType}`
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function codeGenInstructionArgsType(args: { name: string; type: string }[]): string {
|
|
78
91
|
return `{ ${args.map((arg) => arg.name + ': ' + mapType(arg.type)).join(', ')} }`
|
|
79
92
|
}
|
|
80
93
|
|
|
@@ -100,7 +113,7 @@ function mapType(tpe: string): string {
|
|
|
100
113
|
case 'i64':
|
|
101
114
|
case 'u128':
|
|
102
115
|
case 'i128':
|
|
103
|
-
return '
|
|
116
|
+
return 'bigint'
|
|
104
117
|
default:
|
|
105
118
|
return 'any'
|
|
106
119
|
}
|