@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.
@@ -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 __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (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
- borsh.u32('nonce'),
53
- borsh.u64('amount'),
54
- borsh.u64('fee'),
55
- borsh.array(borsh.u8(undefined), 32, 'target_address'),
56
- borsh.u16('target_chain')
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
- borsh.u32('nonce'),
61
- borsh.u64('amount'),
62
- borsh.array(borsh.u8(undefined), 32, 'target_address'),
63
- borsh.u16('target_chain'),
64
- borsh.vecU8('payload'),
65
- borsh.option(borsh.publicKey(undefined), 'cpi_program_id')
66
- ];
67
- attestTokenValues = [
68
- borsh.u32('nonce')
69
- ];
70
- initializeDataValues = [
71
- borsh.publicKey('bridge')
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 = borsh.struct(this.transferDataWithPayloadValues, 'TransferNativeWithPayloadData').decode(Buffer.from(u8Arr.slice(1)));
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 = borsh.struct(this.transferDataWithPayloadValues, 'TransferWrappedWithPayloadData').decode(Buffer.from(u8Arr.slice(1)));
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 = borsh.struct(this.initializeDataValues, 'InitializeData').decode(Buffer.from(u8Arr.slice(1)));
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 = borsh.struct(this.attestTokenValues, 'AttestTokenData').decode(Buffer.from(u8Arr.slice(1)));
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"]}
@@ -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;
@@ -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 (anchor_1.BN.isBN(value)) {
43
+ if (typeof value === 'string') {
45
44
  return protos_1.MetricValue.fromPartial({
46
- bigInteger: bnToBigInteger(value),
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":"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","sourcesContent":["import { BigNumber } from 'ethers'\nimport { BigInteger, MetricValue } from '@sentio/protos'\nimport { BigDecimal } from '.'\nimport { BN } from '@project-serum/anchor'\nimport { BlockTag } from '@ethersproject/providers'\n\nexport type Numberish = number | BigNumber | bigint | BigDecimal\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 (BN.isBN(value)) {\n return MetricValue.fromPartial({\n bigInteger: bnToBigInteger(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 bnToBigInteger(a: BN): BigInteger {\n const negative = a.isNeg()\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 if (a instanceof BN) {\n return bnToBigInteger(a)\n }\n if (a instanceof BigNumber) {\n return intToBigInteger(a.toBigInt())\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"]}
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, BN } from '@project-serum/anchor'
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: ${argsTypeString}, accounts: string[], ctx: SolanaContext) => void): ${idlName}Processor {
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(ins.data as ${argsTypeString}, accounts, ctx)
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 'BN';
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":"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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, BN } 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 const argsTypeString = codeGenInstructionArgs(ins.args)\n return `\n on${\n instructionName.charAt(0).toUpperCase() + instructionName.slice(1)\n }(handler: (args: ${argsTypeString}, accounts: string[], ctx: SolanaContext) => void): ${idlName}Processor {\n this.onInstruction('${instructionName}', (ins: Instruction, ctx, accounts: string[]) => {\n if (ins) {\n handler(ins.data as ${argsTypeString}, accounts, ctx)\n }\n })\n return this\n }\n `\n}\n\nfunction codeGenInstructionArgs(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 'BN'\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"]}
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.1",
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.1",
26
+ "@sentio/base": "^1.37.0-rc.2",
26
27
  "@sentio/cli": "^1.0.0",
27
- "@sentio/protos": "^1.37.0-rc.1",
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": "f5035604b83d4ef3b79d091a0c674b1e0546050b"
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
- borsh.u32('nonce'),
27
- borsh.u64('amount'),
28
- borsh.u64('fee'),
29
- borsh.array(borsh.u8(undefined), 32, 'target_address'),
30
- borsh.u16('target_chain')
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
- borsh.u32('nonce'),
35
- borsh.u64('amount'),
36
- borsh.array(borsh.u8(undefined), 32, 'target_address'),
37
- borsh.u16('target_chain'),
38
- borsh.vecU8('payload'),
39
- borsh.option(borsh.publicKey(undefined), 'cpi_program_id')
40
- ]
41
- private readonly attestTokenValues = [
42
- borsh.u32('nonce')
43
- ]
44
- private readonly initializeDataValues = [
45
- borsh.publicKey('bridge')
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 = borsh.struct(this.transferDataWithPayloadValues, 'TransferNativeWithPayloadData').decode(Buffer.from(u8Arr.slice(1)))
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 = borsh.struct(this.transferDataWithPayloadValues, 'TransferWrappedWithPayloadData').decode(Buffer.from(u8Arr.slice(1)))
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 = borsh.struct(this.initializeDataValues, 'InitializeData').decode(Buffer.from(u8Arr.slice(1)))
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 = borsh.struct(this.attestTokenValues, 'AttestTokenData').decode(Buffer.from(u8Arr.slice(1)))
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]
@@ -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 (BN.isBN(value)) {
43
+ if (typeof value === 'string') {
45
44
  return MetricValue.fromPartial({
46
- bigInteger: bnToBigInteger(value),
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
- if (a instanceof BN) {
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, BN } from '@project-serum/anchor'
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
- instructionName.charAt(0).toUpperCase() + instructionName.slice(1)
66
- }(handler: (args: ${argsTypeString}, accounts: string[], ctx: SolanaContext) => void): ${idlName}Processor {
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(ins.data as ${argsTypeString}, accounts, ctx)
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 'BN'
116
+ return 'bigint'
104
117
  default:
105
118
  return 'any'
106
119
  }